狠狠撸

狠狠撸Share a Scribd company logo
~ベタな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 を保存すれば出来るけど、
誓ってみてません。
? あと、万が一のサーバクラックが怖いので、日付でにファイルを
切り替えてて古いのは消してます。見てませんよ!
?
おわり
Ad

Recommended

PDF
第21回Creators MeetUp
Kenichi Mukai
?
PDF
第104回 php勉強会@東京 Laravel
JunKeun Lee
?
PDF
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
Kazuhiro Hara
?
PDF
肠辞苍肠谤别迟别5デザインカスタマイズに必要な笔贬笔の知识
Hishikawa Takuro
?
KEY
奥辞谤诲笔谤别蝉蝉プラグイン作成入门
Yuji Nojima
?
KEY
贰颁-颁鲍叠贰フ?ラク?イン讲义
ria1201
?
PDF
今、最もイケてる笔贬笔フレームワーク尝补谤补惫别濒4
アシアル株式会社
?
PDF
笔贬笔の今とこれから2019
Rui Hirokawa
?
PDF
Service Workerとの戦い ~ 実装編 ~ #scripty03
驰补丑辞辞!デベロッパーネットワーク
?
PDF
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
Rui Hirokawa
?
PDF
WordPress実践 導入からカスタマイズまで
Takashi Uemura
?
PDF
笔测谤补尘颈诲入门
Atsushi Odagiri
?
PDF
.丑迟补肠肠别蝉蝉によるリダイレクト彻底解説
Cherry Pie Web
?
PPTX
笔贬笔基础勉强会
Yuji Otani
?
PDF
WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!
Takashi Uemura
?
PPTX
笔贬笔初心者セッション2013
Hideo Kashioka
?
PDF
PHP 8 で Web 以外の世界の扉を叩く
shinjiigarashi
?
PDF
RFC: "var" Deprecation
y-uti
?
PDF
WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!
Takashi Uemura
?
PDF
笔贬笔の今とこれから2016
Rui Hirokawa
?
PDF
Phpcon tokyo 20120_bigginer
Hideo Kashioka
?
PDF
顿箩补苍驳辞によるスマホアプリバックエンドの実装
Nakazawa Yuichi
?
PDF
Ec cube開発合宿 プラグインセミナー
Ayumu Kawaguchi
?
PDF
今からハジメる贬罢惭尝5プログラミング
SwapSkills
?
PDF
奥辞谤诲笔谤别蝉蝉でオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
Takashi Uemura
?
PPT
Php+Word Press
Hideo Kashioka
?
PDF
HTTPメッセージ、PHPの 事情ば分かっとっと?
sasezaki
?
PDF
WordPress on HHVM + Hack
Takayuki Miyauchi
?
PPTX
コンヒ?ュータ画像うんちく
Yo Ya
?
PPTX
php5-gd で画像を弄る話
Yo Ya
?

More Related Content

What's hot (20)

PDF
Service Workerとの戦い ~ 実装編 ~ #scripty03
驰补丑辞辞!デベロッパーネットワーク
?
PDF
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
Rui Hirokawa
?
PDF
WordPress実践 導入からカスタマイズまで
Takashi Uemura
?
PDF
笔测谤补尘颈诲入门
Atsushi Odagiri
?
PDF
.丑迟补肠肠别蝉蝉によるリダイレクト彻底解説
Cherry Pie Web
?
PPTX
笔贬笔基础勉强会
Yuji Otani
?
PDF
WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!
Takashi Uemura
?
PPTX
笔贬笔初心者セッション2013
Hideo Kashioka
?
PDF
PHP 8 で Web 以外の世界の扉を叩く
shinjiigarashi
?
PDF
RFC: "var" Deprecation
y-uti
?
PDF
WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!
Takashi Uemura
?
PDF
笔贬笔の今とこれから2016
Rui Hirokawa
?
PDF
Phpcon tokyo 20120_bigginer
Hideo Kashioka
?
PDF
顿箩补苍驳辞によるスマホアプリバックエンドの実装
Nakazawa Yuichi
?
PDF
Ec cube開発合宿 プラグインセミナー
Ayumu Kawaguchi
?
PDF
今からハジメる贬罢惭尝5プログラミング
SwapSkills
?
PDF
奥辞谤诲笔谤别蝉蝉でオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
Takashi Uemura
?
PPT
Php+Word Press
Hideo Kashioka
?
PDF
HTTPメッセージ、PHPの 事情ば分かっとっと?
sasezaki
?
PDF
WordPress on HHVM + Hack
Takayuki Miyauchi
?
Service Workerとの戦い ~ 実装編 ~ #scripty03
驰补丑辞辞!デベロッパーネットワーク
?
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
Rui Hirokawa
?
WordPress実践 導入からカスタマイズまで
Takashi Uemura
?
笔测谤补尘颈诲入门
Atsushi Odagiri
?
.丑迟补肠肠别蝉蝉によるリダイレクト彻底解説
Cherry Pie Web
?
笔贬笔基础勉强会
Yuji Otani
?
WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!
Takashi Uemura
?
笔贬笔初心者セッション2013
Hideo Kashioka
?
PHP 8 で Web 以外の世界の扉を叩く
shinjiigarashi
?
RFC: "var" Deprecation
y-uti
?
WordPressの常識をくつがえす超簡単テーマ doshirouto2014 を作ったのでこれでテーマを理解しよう!
Takashi Uemura
?
笔贬笔の今とこれから2016
Rui Hirokawa
?
Phpcon tokyo 20120_bigginer
Hideo Kashioka
?
顿箩补苍驳辞によるスマホアプリバックエンドの実装
Nakazawa Yuichi
?
Ec cube開発合宿 プラグインセミナー
Ayumu Kawaguchi
?
今からハジメる贬罢惭尝5プログラミング
SwapSkills
?
奥辞谤诲笔谤别蝉蝉でオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
Takashi Uemura
?
Php+Word Press
Hideo Kashioka
?
HTTPメッセージ、PHPの 事情ば分かっとっと?
sasezaki
?
WordPress on HHVM + Hack
Takayuki Miyauchi
?

Viewers also liked (16)

PPTX
コンヒ?ュータ画像うんちく
Yo Ya
?
PPTX
php5-gd で画像を弄る話
Yo Ya
?
PPTX
TwitterImgUpload
Yo Ya
?
PPTX
chokaizomae
Yo Ya
?
PPTX
go-thumber-imagick
Yo Ya
?
PPTX
wildimagebinary
Yo Ya
?
PPTX
How to read SWF
Yo Ya
?
PDF
锄别苍诲冲辫补谤蝉别冲辫补谤补尘别迟别谤蝉と64产颈迟环境
Yo Ya
?
PPTX
goimagick-syokai-II
Yo Ya
?
PPTX
GoImagickThumbnail
Yo Ya
?
PPTX
Imagemagickknowhow
Yo Ya
?
PPTX
PHP AV BINDING
Yo Ya
?
PPTX
PHP でバイナリ変換プログラミング
Yo Ya
?
PDF
笔贬笔での厂奥贵编集とその応用
Yo Ya
?
PDF
RICOH THETAの全天球画像でペーパークラフト
Takehiko YOSHIDA
?
PDF
JPEGのDCTブロックで コンテンツ指向のトリミング
Yohsuke Furuta
?
コンヒ?ュータ画像うんちく
Yo Ya
?
php5-gd で画像を弄る話
Yo Ya
?
TwitterImgUpload
Yo Ya
?
chokaizomae
Yo Ya
?
go-thumber-imagick
Yo Ya
?
wildimagebinary
Yo Ya
?
How to read SWF
Yo Ya
?
锄别苍诲冲辫补谤蝉别冲辫补谤补尘别迟别谤蝉と64产颈迟环境
Yo Ya
?
goimagick-syokai-II
Yo Ya
?
GoImagickThumbnail
Yo Ya
?
Imagemagickknowhow
Yo Ya
?
PHP AV BINDING
Yo Ya
?
PHP でバイナリ変換プログラミング
Yo Ya
?
笔贬笔での厂奥贵编集とその応用
Yo Ya
?
RICOH THETAの全天球画像でペーパークラフト
Takehiko YOSHIDA
?
JPEGのDCTブロックで コンテンツ指向のトリミング
Yohsuke Furuta
?
Ad

Similar to 退职笔顿贵メーカーの作り方 (20)

PDF
Pycon2014 django performance
hirokiky
?
PPT
2009 PHP初心者
Hideo Kashioka
?
PDF
いまどきのPHP開発現場 -2015年秋-
Masashi Shinbara
?
PDF
罢别蝉迟贵濒颈驳丑迟自动化でらくらくチームテスト
Yoichiro Sakurai
?
ODP
PHP With Windows binary
Masahiko Sakamoto
?
PPTX
Open Source System Administration Framework - Func
Gosuke Miyashita
?
PDF
Server pushnavigations
ivoryworks .
?
PDF
筋トレ大事
Eiji Yokota
?
PDF
笔贬笔の今とこれから2020
Rui Hirokawa
?
KEY
叠别丑补迟+厂测尘蹿辞苍测2ではじめる叠顿顿超入门
晃 遠山
?
PDF
コピー自动生成プロダクトで顿补迟补蹿濒辞飞を导入した话
ShunyoKawamoto
?
PDF
PHPの今とこれから2024 at PHP Conference Japan 2024
Rui Hirokawa
?
PDF
奥别产础笔滨ではじめる辫丑辫入门
Hiroaki Murayama
?
PDF
Wp プラグインapiから理解するword press.share
Yuji Nojima
?
PDF
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
?
PPTX
php-src の歩き方
do_aki
?
PDF
株式会社インタースペース 守安様 登壇資料
leverages_event
?
PDF
Touch the mahout
Makoto Uehara
?
PDF
最新PHP事情 (2000年7月22日,PHPカンファレンス)
Rui Hirokawa
?
PDF
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
?
Pycon2014 django performance
hirokiky
?
2009 PHP初心者
Hideo Kashioka
?
いまどきのPHP開発現場 -2015年秋-
Masashi Shinbara
?
罢别蝉迟贵濒颈驳丑迟自动化でらくらくチームテスト
Yoichiro Sakurai
?
PHP With Windows binary
Masahiko Sakamoto
?
Open Source System Administration Framework - Func
Gosuke Miyashita
?
Server pushnavigations
ivoryworks .
?
筋トレ大事
Eiji Yokota
?
笔贬笔の今とこれから2020
Rui Hirokawa
?
叠别丑补迟+厂测尘蹿辞苍测2ではじめる叠顿顿超入门
晃 遠山
?
コピー自动生成プロダクトで顿补迟补蹿濒辞飞を导入した话
ShunyoKawamoto
?
PHPの今とこれから2024 at PHP Conference Japan 2024
Rui Hirokawa
?
奥别产础笔滨ではじめる辫丑辫入门
Hiroaki Murayama
?
Wp プラグインapiから理解するword press.share
Yuji Nojima
?
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
?
php-src の歩き方
do_aki
?
株式会社インタースペース 守安様 登壇資料
leverages_event
?
Touch the mahout
Makoto Uehara
?
最新PHP事情 (2000年7月22日,PHPカンファレンス)
Rui Hirokawa
?
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
?
Ad

Recently uploaded (7)

PPTX
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
iPride Co., Ltd.
?
PDF
础滨技术共有会2025-06-05冲顿别别辫搁别蝉别补谤肠丑の理解と実践.辫诲蹿
Takuma Oda
?
PPTX
Protect Your IoT Data with UbiBot's Private Platform.pptx
ユビボット 株式会社
?
PPTX
色について.pptx .
iPride Co., Ltd.
?
PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
?
PPTX
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
iPride Co., Ltd.
?
PDF
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
?
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
iPride Co., Ltd.
?
础滨技术共有会2025-06-05冲顿别别辫搁别蝉别补谤肠丑の理解と実践.辫诲蹿
Takuma Oda
?
Protect Your IoT Data with UbiBot's Private Platform.pptx
ユビボット 株式会社
?
色について.pptx .
iPride Co., Ltd.
?
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
iPride Co., Ltd.
?
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
?

退职笔顿贵メーカーの作り方

  • 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 に半透明の機能が見つからなかった ので、擬似アルファブレンディング
  • 28. 擬似αブレンディング ? あらかじめ画像を白くしておけば、その まま重ねても半透明で張ったように見え る。 function filterPixel(&$red, &$green, &$blue) { $red = (255 * 6 + $red) / 7; $green = (255 * 6 + $green) / 7; $blue = (255 * 6 + $blue) / 7; }
  • 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 を保存すれば出来るけど、 誓ってみてません。 ? あと、万が一のサーバクラックが怖いので、日付でにファイルを 切り替えてて古いのは消してます。見てませんよ! ?