SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
~ベタなPHP開発手法~
2013/01/22 “よや” <yoya@awm.jp>

退職届PDFメーカーの作り方
自己紹介
 昨年まで PHP + C言語、たまに JavaScript

でお仕事してました。
 趣味で公開してるライブラリ
(Flashバイナリ操作)
 http://sourceforge.jp/projects/swfed
 http://openpear.org/package/IO_SWF

 ImageMagick のストーカーやってます。
 http://d.hatena.ne.jp/yoya/searchdiary?word=Ima

geMagick
発表内容
 退職届PDFメーカーについて

 普通のPHPプログラミング
 普通じゃない(?)PHPプログラミング
 PDF 出力について
 iframe を使った PDF 表示
 壁紙機能 (ストレージ、擬似α透過)

 QR コード対応
退職届PDFメーカーとは
 参考) http://gigazine.net/news/20140105-

resignation-letter-generator/

 http://app.awm.jp/resign/ 退職届PDFメーカー
利用者様の喜びの声!?
普通のPHPプログラミング
 SSI (server side include) 風

 CGI (common gateway interface) 風
 テンプレートエンジン(Smarty)
 フレームワーク?
普通の PHP プログラミング(1/4)
 SSI(server side include) 的な使い方
<html>
<head><title> 1 </title> </head>
<body>
<?php echo date("Y/m/d H:i:s"); ?>
</body> </html>

 http://awm.jp/~yoya/study/php/sagami/1/1.php
普通の PHP プログラミング(2/4)
 CGI (common gateway interface) 的な使い方
<?php
echo "<html>¥n";
echo "<head><title> 2 </title> </head>¥n";
echo "<body>¥n";
echo date("Y/m/d H:i:s");
echo "</body> </html>¥n";
?>

 http://awm.jp/~yoya/study/php/sagami/1/2.php
普通の PHP プログラミング(3/4)
 テンプレートエンジン(Smarty) で
http://awm.jp/~yoya/study/php/sagami/1/3.tpl
<html>
<head><title> 3 </title> </head>
<body> {$now} </body>
</html>
<?php
require_once('Smarty.class.php');
$smarty = new Smarty();
$smarty->assign('now', date("Y/m/d
H:i:s"));
$smarty->display('3.tpl');

 http://awm.jp/~yoya/study/php/sagami/1/3.php
普通の PHP プログラミング(4/4)
PHPフレームワーク
CakePHP ? ZendFramework ?
Symphony ? CodeIgniter ?
↑省略!!!
こういったページでも見て下さい >
http://antenasites.com/2013/07/php-framework/
いずれにしても HTML 出力の話ばかり
\今回もはそういう話はしません/
そもそも、僕は普通の発表した事ないです。
普通じゃないPHPプログラミング

\HTML 以外を出力してみよう/

 PHP は HTML 以外にも色々出力出来ます。
PHP で HTML じゃないモノ出力
 JPEG/PNG画像出力

 PDF 出力
 Excel 出力 (要望があれば次回に解説)
 Spreadsheet/Excel/Writer はそのままだと

PHP5.4 で動かないんですよね…
PNG画像出力 (1/2)
<?php
header ('Content-type: image/png');
$im = imagecreate(240, 240);
$red = imagecolorallocate($im, 255, 0, 0);
$green = imagecolorallocate($im, 0, 255, 0);
$blue = imagecolorallocate($im, 0, 0, 255);

imageline($im, 0, 0, 200, 200, $green);
imageline($im, 0, 100, 200, 100, $blue);
imagepng($im);

 http://awm.jp/~yoya/study/php/sagami/1/line.php
PNG画像出力 (2/2)
<?php
header ('Content-type: image/png');
$im = imagecreate(240, 240);
$palette = array();
for ($i = 0 ; $i < 256 ; $i++) {
$palette []= imagecolorallocate(
$im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)
);
}
for ($y = 0 ; $y < 240 ; $y++) {
for ($x = 0 ; $x < 240 ; $x++) {
imagesetpixel($im, $x, $y, $palette[mt_rand(0, 255)]);
}
}
imagepng($im);

 http://awm.jp/~yoya/study/php/sagami/1/png.php
JPEG画像出力
<?php
header ('Content-type: image/jpeg');
$im = imagecreate(240, 240);
$palette = array();
for ($i = 0 ; $i < 256 ; $i++) {
$palette []= imagecolorallocate(
$im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)
);
}
for ($y = 0 ; $y < 240 ; $y++) {
for ($x = 0 ; $x < 240 ; $x++) {
imagesetpixel($im, $x, $y, $palette[mt_rand(0, 255)]);
}
}
imagejpeg($im);

 http://awm.jp/~yoya/study/php/sagami/1/jpeg.php
PDF 出力
 FPDF と PHPlib が有名
 とりあえず FPDF を試す
 インストール (Debian6)
$ apt-cache search fpdf
php-fpdf - PHP class to generate PDF files
$ sudo apt-get install php-fpdf

 日本語対応
 http://www.fpdf.org/phorum/read.php?f=1&i=7977&t=79
77
 japanese.zip と mbfpdf10b.zip があって後者の方が評
判が良いが、導入が楽なので前者を使ってみた
 (実際に何が困るのか知りたかったのもある)
 でも今の所、困る事がないので困ってる。
PDF 出力 (日本語対応)
 japanese.php は SJIS(cP932) 前提
 今時の PHP は日本語を UTF-8

 変換する

function Text($x,$y,$txt) {
$txt = mb_convert_encoding($txt, "CP932", "UTF-8"); // ☆
parent::Text($x,$y,$txt);
}

require('japanese.php');
header('Content-Type: application/pdf;');
$pdf=new PDF_Japanese();
$pdf->AddSJISFont();
$pdf->AddPage();
$pdf->SetFont('SJIS','',18);
$pdf->Text(100,60,'こんにちわ!');
$pdf->Output();

 http://awm.jp/~yoya/study/php/sagami/1/fpdfj.php
PDF 出力 (縦書き対応)
 rotation.php で回転出来るけど日本語未対応
 継承で合体させてみた

 書き換え

require('japanese.php');
// class PDF_Rotate extends PDF // オリジナル
class PDF_Rotate extends PDF_Japanese // ☆ {

require('japanese.php');
header('Content-Type: application/pdf;');
$pdf=new PDF_Japanese();
$pdf->AddSJISFont();
$pdf->AddPage();
$pdf->SetFont('SJIS','',18);
$pdf->Rotate(45 ,100, 60);
$pdf->Text(100,60,'こんにちわ!');
$pdf->Output();

 http://awm.jp/~yoya/study/php/sagami/1/fpdfr.php
日本語対応 (縦書きレイアウト)
 単純に1文字ずつ縦にしても駄目
 90度倒さないと駄目なもの > ー (長音)
 横がズレルもの > 」 (かぎ括弧)

 縦書き用フォントならカーニングに情報

が入ってそうだけど、悲しいけどデバイ
スフォントなのよね。。
 デバイスフォントでPDF の容量を減らして、

さくさく操作感を重視している。
日本語対応 (縦書きレイアウト)
 失敗例を元に、対処前と対処後

バグってました
後で治します
日本語対応 (縦書き無理やり対
応)
switch ($c) {
case 'ー':
case '-':
case '―':
case '‐':
case '~':
$this->Rotate(90, $x+$fontSize*1.1, $y-$fontSize*1.1);
$this->Text($x, $y, $c);
$this->Rotate(0);
break;
case '、':
case '。':
case ',':
case '.':
$this->Text($x + $fontSize*1.5, $y - $fontSize*2, $c);
break;
case '」':
case '”':
$this->Text($x + $fontSize*1.5, $y, $c);
break;
default:
$this->Text($x, $y, $c);
break;
日本語対応 (漢数字)
 パターン
 1 => 一
 10 => 十
 20 => 二十

 21 => 二十一
日本語対応 (漢数字 \力づく/)
function date2japanize($date) { // range: 0 - 99
$from = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
$to = array('〇', '一', '二', '三', '四', '五', '六', '七', '八', '九');
$dates = split('-', $date);
$dates[0] -= 1988;
foreach (range(0, 2) as $idx) {
$d = $dates[$idx];
if ($d < 10) {
$d = mb_substr($d, 1);
} elseif ($d == 10) {
$d = '十';
} elseif ($d < 20) {
$d = '十'.mb_substr($d, 1);
} elseif (($d % 10) === 0) {
$d = mb_substr($d, 0, 1).'十';
} else {
$d = mb_substr($d, 0, 1).'十'.mb_substr($d, 1);
}
$dates[$idx] = str_replace($from, $to, $d);
}
return '平成'.$dates[0].'年'.$dates[1].'月'.$dates[2].'日';
}
iFrame を使った即時反映
 http://app.awm.jp/resign/resign.php (トップ)
 GET パラメータを読んで入力 フォームを埋め

る
 それと同時に iframe で pdf.php を表示する

 http://app.awm.jp/resign/pdf.php
 GET パラメータを読んで入力 FORM を埋める

\それだけ/
壁紙
 普通のファイル送信フォーム
<form enctype="multipart/form-data" action="?"
method="POST">
<input type="hidden" name="MAX_FILE_SIZE"
value="100000000" />
壁紙用の画像ファイルをアップロード: <input
name="image_file" type="file" class="btn btn-success" />
<input type="submit" value="画像ファイル送信"
class="btn btn-primary" />

 ファイルに一意な ID を付けて保存する
 擬似αブレンディング処理をする
壁紙 (ファイルに一意なIDを)
 sha1 を使ってデータを数値に変換する
 40文字は長いので12文字に減らす (衝突御免)
function image_data2id($data, $ext) { // 16 chars digest
$sha1 = sha1($data, true);
$base64 = base64_encode(substr($sha1, 0, 12));
return strtr($base64, '+/', '-_').'.'.$ext;
}

 フォルダを分割して保存
 1フォルダに大量のファイル置くの怖いので
yoya@app.awm.jp:/<秘密>/app/resign/img$ ls
0H 1j 3g 6u 9L AP Cg Eu JY PB Ur XV ZC cx iI jm nL qP sN ve
0N 2D 3w 6z 9O AW DA F_ Kg S5 VG Xq _A dK iP kL oE rl sO xa
0x 2j 6k 8M A0 CH DN GR MU SE VR YM ao g0 ip lF oQ ry sn xs
17 33 6s 8p AA Ca Ed Hh Ni Un Wb Yj bM i1 ja lX pa sM tz z9
壁紙 (αブレンディング)
 元画像と白っぽく変換した画像を保存
yoya@app.awm.jp:/<秘密>/app/resign/img$ ls 17/
17Pe9qdjx8OtTz4h.jpg _17Pe9qdjx8OtTz4h.jpg

 (PNG は大丈夫だけど) JPEG 画像に対して

PDF に半透明の機能が見つからなかった
ので、擬似アルファブレンディング
擬似αブレンディング
 あらかじめ画像を白くしておけば、その

まま重ねても半透明で張ったように見え
る。

function filterPixel(&$red, &$green, &$blue) {
$red = (255 * 6 + $red) / 7;
$green = (255 * 6 + $green) / 7;
$blue = (255 * 6 + $blue) / 7;
}
QRコード対応
 PHP QR Code encoder を使ってます
 http://phpqrcode.sourceforge.net/

 処理が重たいので大規模サイトではお勧

め出来ませんが、趣味では十分です。
require('phpqrcode.php');
$url = (empty($_SERVER["HTTPS"]) ? "http://" : "https://") .
$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
$url = substr($url, 0, strlen($url) - strlen('&ext=.pdf'));
$tmpfile = tempnam('tmp', 'qr');
QRcode::png($url, $tmpfile, 'L', 4, 0);
$pdf->Image($tmpfile, 25, 220, 40, 40, 'png');
unlink($tmpfile);
Github で公開中
 https://github.com/yoya/resign
 簡単な説明も
 http://pwiki.awm.jp/~yoya/?resign
質問コーナー
 Q) sha1 の第二引数 false にすれば base64_encode 要らない?


気付きませんでした!でも互換性怖いのでこのままで。

 Q) jpeg も png で保存すれば半透明対応できない?



Jpeg と png でリサイズのレンダリングが違う可能性があるので。
あと、容量増えるの嫌だったので。(後付け理由)

 Q) 反響はどうですか



おかげ様で400を超えるブクマを頂いてます。
利用者の方から直接ありがとうメールを貰ったりもします。

 Q) 生成された PDF を手元にこっそり保存してません?
URL で完全に再現できるので access_log を保存すれば出来るけど、
誓ってみてません。
 あと、万が一のサーバクラックが怖いので、日付でにファイルを
切り替えてて古いのは消してます。見てませんよ!

おわり

Contenu connexe

Tendances

Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
Ayumu Kawaguchi
 

Tendances (20)

Service Workerとの戦い ~ 実装編 ~ #scripty03
Service Workerとの戦い ~ 実装編 ~ #scripty03Service Workerとの戦い ~ 実装編 ~ #scripty03
Service Workerとの戦い ~ 実装編 ~ #scripty03
 
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
 
WordPress実践 導入からカスタマイズまで
WordPress実践 導入からカスタマイズまでWordPress実践 導入からカスタマイズまで
WordPress実践 導入からカスタマイズまで
 
Pyramid入門
Pyramid入門Pyramid入門
Pyramid入門
 
.htaccessによるリダイレクト徹底解説
.htaccessによるリダイレクト徹底解説.htaccessによるリダイレクト徹底解説
.htaccessによるリダイレクト徹底解説
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会
 
WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!
WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!
WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!
 
PHP初心者セッション2013
PHP初心者セッション2013PHP初心者セッション2013
PHP初心者セッション2013
 
PHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩くPHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩く
 
RFC: "var" Deprecation
RFC: "var" DeprecationRFC: "var" Deprecation
RFC: "var" Deprecation
 
WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!
WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!
WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!
 
PHPの今とこれから2016
PHPの今とこれから2016PHPの今とこれから2016
PHPの今とこれから2016
 
Phpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginerPhpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginer
 
Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
今からハジメるHTML5プログラミング
今からハジメるHTML5プログラミング今からハジメるHTML5プログラミング
今からハジメるHTML5プログラミング
 
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニックWordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
 
Php+Word Press
Php+Word PressPhp+Word Press
Php+Word Press
 
HTTPメッセージ、PHPの 事情ば分かっとっと?
HTTPメッセージ、PHPの 事情ば分かっとっと?HTTPメッセージ、PHPの 事情ば分かっとっと?
HTTPメッセージ、PHPの 事情ば分かっとっと?
 
WordPress on HHVM + Hack
WordPress on HHVM + HackWordPress on HHVM + Hack
WordPress on HHVM + Hack
 

En vedette

En vedette (16)

コンピュータ画像うんちく
コンピュータ画像うんちくコンピュータ画像うんちく
コンピュータ画像うんちく
 
php5-gd で画像を弄る話
php5-gd で画像を弄る話php5-gd で画像を弄る話
php5-gd で画像を弄る話
 
TwitterImgUpload
TwitterImgUploadTwitterImgUpload
TwitterImgUpload
 
chokaizomae
chokaizomaechokaizomae
chokaizomae
 
go-thumber-imagick
go-thumber-imagickgo-thumber-imagick
go-thumber-imagick
 
wildimagebinary
wildimagebinarywildimagebinary
wildimagebinary
 
How to read SWF
How to read SWFHow to read SWF
How to read SWF
 
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境
 
goimagick-syokai-II
goimagick-syokai-IIgoimagick-syokai-II
goimagick-syokai-II
 
GoImagickThumbnail
GoImagickThumbnailGoImagickThumbnail
GoImagickThumbnail
 
Imagemagickknowhow
ImagemagickknowhowImagemagickknowhow
Imagemagickknowhow
 
PHP AV BINDING
PHP AV BINDINGPHP AV BINDING
PHP AV BINDING
 
PHP でバイナリ変換プログラミング
PHP でバイナリ変換プログラミングPHP でバイナリ変換プログラミング
PHP でバイナリ変換プログラミング
 
PHPでのSWF編集とその応用
PHPでのSWF編集とその応用PHPでのSWF編集とその応用
PHPでのSWF編集とその応用
 
RICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフトRICOH THETAの全天球画像でペーパークラフト
RICOH THETAの全天球画像でペーパークラフト
 
JPEGのDCTブロックで コンテンツ指向のトリミング
JPEGのDCTブロックで コンテンツ指向のトリミングJPEGのDCTブロックで コンテンツ指向のトリミング
JPEGのDCTブロックで コンテンツ指向のトリミング
 

Similaire à 退職PDFメーカーの作り方

TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテスト
Yoichiro Sakurai
 
Open Source System Administration Framework - Func
Open Source System Administration Framework - FuncOpen Source System Administration Framework - Func
Open Source System Administration Framework - Func
Gosuke Miyashita
 
Server pushnavigations
Server pushnavigationsServer pushnavigations
Server pushnavigations
ivoryworks .
 
WebAPIではじめるphp入門
WebAPIではじめるphp入門WebAPIではじめるphp入門
WebAPIではじめるphp入門
Hiroaki Murayama
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
 

Similaire à 退職PDFメーカーの作り方 (20)

Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performance
 
2009 PHP初心者
2009 PHP初心者2009 PHP初心者
2009 PHP初心者
 
いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテスト
 
PHP With Windows binary
PHP With Windows binaryPHP With Windows binary
PHP With Windows binary
 
Open Source System Administration Framework - Func
Open Source System Administration Framework - FuncOpen Source System Administration Framework - Func
Open Source System Administration Framework - Func
 
Server pushnavigations
Server pushnavigationsServer pushnavigations
Server pushnavigations
 
筋トレ大事
筋トレ大事筋トレ大事
筋トレ大事
 
PHPの今とこれから2020
PHPの今とこれから2020PHPの今とこれから2020
PHPの今とこれから2020
 
Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門
 
コピー自動生成プロダクトでDataflowを導入した話
コピー自動生成プロダクトでDataflowを導入した話コピー自動生成プロダクトでDataflowを導入した話
コピー自動生成プロダクトでDataflowを導入した話
 
WebAPIではじめるphp入門
WebAPIではじめるphp入門WebAPIではじめるphp入門
WebAPIではじめるphp入門
 
Wp プラグインapiから理解するword press.share
Wp プラグインapiから理解するword press.shareWp プラグインapiから理解するword press.share
Wp プラグインapiから理解するword press.share
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
株式会社インタースペース 守安様 登壇資料
株式会社インタースペース 守安様 登壇資料株式会社インタースペース 守安様 登壇資料
株式会社インタースペース 守安様 登壇資料
 
Touch the mahout
Touch the mahoutTouch the mahout
Touch the mahout
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 

Dernier

Dernier (11)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 

退職PDFメーカーの作り方

  • 2. 自己紹介  昨年まで PHP + C言語、たまに JavaScript でお仕事してました。  趣味で公開してるライブラリ (Flashバイナリ操作)  http://sourceforge.jp/projects/swfed  http://openpear.org/package/IO_SWF  ImageMagick のストーカーやってます。  http://d.hatena.ne.jp/yoya/searchdiary?word=Ima geMagick
  • 3. 発表内容  退職届PDFメーカーについて  普通のPHPプログラミング  普通じゃない(?)PHPプログラミング  PDF 出力について  iframe を使った PDF 表示  壁紙機能 (ストレージ、擬似α透過)  QR コード対応
  • 6. 普通のPHPプログラミング  SSI (server side include) 風  CGI (common gateway interface) 風  テンプレートエンジン(Smarty)  フレームワーク?
  • 7. 普通の PHP プログラミング(1/4)  SSI(server side include) 的な使い方 <html> <head><title> 1 </title> </head> <body> <?php echo date("Y/m/d H:i:s"); ?> </body> </html>  http://awm.jp/~yoya/study/php/sagami/1/1.php
  • 8. 普通の PHP プログラミング(2/4)  CGI (common gateway interface) 的な使い方 <?php echo "<html>¥n"; echo "<head><title> 2 </title> </head>¥n"; echo "<body>¥n"; echo date("Y/m/d H:i:s"); echo "</body> </html>¥n"; ?>  http://awm.jp/~yoya/study/php/sagami/1/2.php
  • 9. 普通の PHP プログラミング(3/4)  テンプレートエンジン(Smarty) で http://awm.jp/~yoya/study/php/sagami/1/3.tpl <html> <head><title> 3 </title> </head> <body> {$now} </body> </html> <?php require_once('Smarty.class.php'); $smarty = new Smarty(); $smarty->assign('now', date("Y/m/d H:i:s")); $smarty->display('3.tpl');  http://awm.jp/~yoya/study/php/sagami/1/3.php
  • 10. 普通の PHP プログラミング(4/4) PHPフレームワーク CakePHP ? ZendFramework ? Symphony ? CodeIgniter ? ↑省略!!! こういったページでも見て下さい > http://antenasites.com/2013/07/php-framework/ いずれにしても HTML 出力の話ばかり \今回もはそういう話はしません/ そもそも、僕は普通の発表した事ないです。
  • 12. PHP で HTML じゃないモノ出力  JPEG/PNG画像出力  PDF 出力  Excel 出力 (要望があれば次回に解説)  Spreadsheet/Excel/Writer はそのままだと PHP5.4 で動かないんですよね…
  • 13. PNG画像出力 (1/2) <?php header ('Content-type: image/png'); $im = imagecreate(240, 240); $red = imagecolorallocate($im, 255, 0, 0); $green = imagecolorallocate($im, 0, 255, 0); $blue = imagecolorallocate($im, 0, 0, 255); imageline($im, 0, 0, 200, 200, $green); imageline($im, 0, 100, 200, 100, $blue); imagepng($im);  http://awm.jp/~yoya/study/php/sagami/1/line.php
  • 14. PNG画像出力 (2/2) <?php header ('Content-type: image/png'); $im = imagecreate(240, 240); $palette = array(); for ($i = 0 ; $i < 256 ; $i++) { $palette []= imagecolorallocate( $im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255) ); } for ($y = 0 ; $y < 240 ; $y++) { for ($x = 0 ; $x < 240 ; $x++) { imagesetpixel($im, $x, $y, $palette[mt_rand(0, 255)]); } } imagepng($im);  http://awm.jp/~yoya/study/php/sagami/1/png.php
  • 15. JPEG画像出力 <?php header ('Content-type: image/jpeg'); $im = imagecreate(240, 240); $palette = array(); for ($i = 0 ; $i < 256 ; $i++) { $palette []= imagecolorallocate( $im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255) ); } for ($y = 0 ; $y < 240 ; $y++) { for ($x = 0 ; $x < 240 ; $x++) { imagesetpixel($im, $x, $y, $palette[mt_rand(0, 255)]); } } imagejpeg($im);  http://awm.jp/~yoya/study/php/sagami/1/jpeg.php
  • 16. PDF 出力  FPDF と PHPlib が有名  とりあえず FPDF を試す  インストール (Debian6) $ apt-cache search fpdf php-fpdf - PHP class to generate PDF files $ sudo apt-get install php-fpdf  日本語対応  http://www.fpdf.org/phorum/read.php?f=1&i=7977&t=79 77  japanese.zip と mbfpdf10b.zip があって後者の方が評 判が良いが、導入が楽なので前者を使ってみた  (実際に何が困るのか知りたかったのもある)  でも今の所、困る事がないので困ってる。
  • 17. PDF 出力 (日本語対応)  japanese.php は SJIS(cP932) 前提  今時の PHP は日本語を UTF-8  変換する function Text($x,$y,$txt) { $txt = mb_convert_encoding($txt, "CP932", "UTF-8"); // ☆ parent::Text($x,$y,$txt); } require('japanese.php'); header('Content-Type: application/pdf;'); $pdf=new PDF_Japanese(); $pdf->AddSJISFont(); $pdf->AddPage(); $pdf->SetFont('SJIS','',18); $pdf->Text(100,60,'こんにちわ!'); $pdf->Output();  http://awm.jp/~yoya/study/php/sagami/1/fpdfj.php
  • 18. PDF 出力 (縦書き対応)  rotation.php で回転出来るけど日本語未対応  継承で合体させてみた  書き換え require('japanese.php'); // class PDF_Rotate extends PDF // オリジナル class PDF_Rotate extends PDF_Japanese // ☆ { require('japanese.php'); header('Content-Type: application/pdf;'); $pdf=new PDF_Japanese(); $pdf->AddSJISFont(); $pdf->AddPage(); $pdf->SetFont('SJIS','',18); $pdf->Rotate(45 ,100, 60); $pdf->Text(100,60,'こんにちわ!'); $pdf->Output();  http://awm.jp/~yoya/study/php/sagami/1/fpdfr.php
  • 19. 日本語対応 (縦書きレイアウト)  単純に1文字ずつ縦にしても駄目  90度倒さないと駄目なもの > ー (長音)  横がズレルもの > 」 (かぎ括弧)  縦書き用フォントならカーニングに情報 が入ってそうだけど、悲しいけどデバイ スフォントなのよね。。  デバイスフォントでPDF の容量を減らして、 さくさく操作感を重視している。
  • 21. 日本語対応 (縦書き無理やり対 応) switch ($c) { case 'ー': case '-': case '―': case '‐': case '~': $this->Rotate(90, $x+$fontSize*1.1, $y-$fontSize*1.1); $this->Text($x, $y, $c); $this->Rotate(0); break; case '、': case '。': case ',': case '.': $this->Text($x + $fontSize*1.5, $y - $fontSize*2, $c); break; case '」': case '”': $this->Text($x + $fontSize*1.5, $y, $c); break; default: $this->Text($x, $y, $c); break;
  • 22. 日本語対応 (漢数字)  パターン  1 => 一  10 => 十  20 => 二十  21 => 二十一
  • 23. 日本語対応 (漢数字 \力づく/) function date2japanize($date) { // range: 0 - 99 $from = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'); $to = array('〇', '一', '二', '三', '四', '五', '六', '七', '八', '九'); $dates = split('-', $date); $dates[0] -= 1988; foreach (range(0, 2) as $idx) { $d = $dates[$idx]; if ($d < 10) { $d = mb_substr($d, 1); } elseif ($d == 10) { $d = '十'; } elseif ($d < 20) { $d = '十'.mb_substr($d, 1); } elseif (($d % 10) === 0) { $d = mb_substr($d, 0, 1).'十'; } else { $d = mb_substr($d, 0, 1).'十'.mb_substr($d, 1); } $dates[$idx] = str_replace($from, $to, $d); } return '平成'.$dates[0].'年'.$dates[1].'月'.$dates[2].'日'; }
  • 24. iFrame を使った即時反映  http://app.awm.jp/resign/resign.php (トップ)  GET パラメータを読んで入力 フォームを埋め る  それと同時に iframe で pdf.php を表示する  http://app.awm.jp/resign/pdf.php  GET パラメータを読んで入力 FORM を埋める \それだけ/
  • 25. 壁紙  普通のファイル送信フォーム <form enctype="multipart/form-data" action="?" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="100000000" /> 壁紙用の画像ファイルをアップロード: <input name="image_file" type="file" class="btn btn-success" /> <input type="submit" value="画像ファイル送信" class="btn btn-primary" />  ファイルに一意な ID を付けて保存する  擬似αブレンディング処理をする
  • 26. 壁紙 (ファイルに一意なIDを)  sha1 を使ってデータを数値に変換する  40文字は長いので12文字に減らす (衝突御免) function image_data2id($data, $ext) { // 16 chars digest $sha1 = sha1($data, true); $base64 = base64_encode(substr($sha1, 0, 12)); return strtr($base64, '+/', '-_').'.'.$ext; }  フォルダを分割して保存  1フォルダに大量のファイル置くの怖いので yoya@app.awm.jp:/<秘密>/app/resign/img$ ls 0H 1j 3g 6u 9L AP Cg Eu JY PB Ur XV ZC cx iI jm nL qP sN ve 0N 2D 3w 6z 9O AW DA F_ Kg S5 VG Xq _A dK iP kL oE rl sO xa 0x 2j 6k 8M A0 CH DN GR MU SE VR YM ao g0 ip lF oQ ry sn xs 17 33 6s 8p AA Ca Ed Hh Ni Un Wb Yj bM i1 ja lX pa sM tz z9
  • 27. 壁紙 (αブレンディング)  元画像と白っぽく変換した画像を保存 yoya@app.awm.jp:/<秘密>/app/resign/img$ ls 17/ 17Pe9qdjx8OtTz4h.jpg _17Pe9qdjx8OtTz4h.jpg  (PNG は大丈夫だけど) JPEG 画像に対して PDF に半透明の機能が見つからなかった ので、擬似アルファブレンディング
  • 29. QRコード対応  PHP QR Code encoder を使ってます  http://phpqrcode.sourceforge.net/  処理が重たいので大規模サイトではお勧 め出来ませんが、趣味では十分です。 require('phpqrcode.php'); $url = (empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; $url = substr($url, 0, strlen($url) - strlen('&ext=.pdf')); $tmpfile = tempnam('tmp', 'qr'); QRcode::png($url, $tmpfile, 'L', 4, 0); $pdf->Image($tmpfile, 25, 220, 40, 40, 'png'); unlink($tmpfile);
  • 30. Github で公開中  https://github.com/yoya/resign  簡単な説明も  http://pwiki.awm.jp/~yoya/?resign
  • 31. 質問コーナー  Q) sha1 の第二引数 false にすれば base64_encode 要らない?  気付きませんでした!でも互換性怖いのでこのままで。  Q) jpeg も png で保存すれば半透明対応できない?   Jpeg と png でリサイズのレンダリングが違う可能性があるので。 あと、容量増えるの嫌だったので。(後付け理由)  Q) 反響はどうですか   おかげ様で400を超えるブクマを頂いてます。 利用者の方から直接ありがとうメールを貰ったりもします。  Q) 生成された PDF を手元にこっそり保存してません? URL で完全に再現できるので access_log を保存すれば出来るけど、 誓ってみてません。  あと、万が一のサーバクラックが怖いので、日付でにファイルを 切り替えてて古いのは消してます。見てませんよ! 