tcpdf + PDFI + PHP によるPDFの出力

PDFで請求書を出力したかったのでやってみた

** Illsutratorを使用してPDFのテンプレートを作成する

Illustratorを使用して帳票のテンプレートを作成する。
保存するときに保存のオプションで、「互換性のある形式」を「Acrobat 5(PDF1.4)」にして保存する。

** tcpdf のインストール

https://github.com/tecnickcom/tcpdf

から zip をダウンロードするか clone して展開する。

** フォントのインストール

http://coliss.com/articles/freebies/best-of-free-japanese-fonts-for-2016.html

好きなフォントをダウンロードしてきて、.tff のフォントファイルを、tcpdf を展開したところに出来る fonts フォルダにコピーする。


fonts フォルダにフォントキャッシュが書き込まれるので、ウェブサーバプログラムのアカウントで読み書きできるようにする。


** FPDI のインストール

https://www.setasign.com/products/fpdi/downloads/

から FPDI のパッケージをダウンロードして、tcpdf とおなじところに展開しておく


** ライブラリの使用

>|
<?php
include 'tcpdf.php';
include 'fpdi.php';

$pdf = new FPDI(); // FPDI の呼出

$pdf->SetMargins(0,0,0); // 上左右マージンの設定
$pdf->SetCellPadding(0); // セルパディングの設定
$pdf->SetAutoPageBreak(false); // 自動改ページを無効
$pdf->setPrintHeader(false); // ページヘッダ無効
$pdf->setPrintFooter(false); // ページフッタ無効

$font_m = new TCPDF_FONTS(); // フォントクラスの呼出
$fontPathMintyo = './fonts/mintyo.ttf'; // 明朝フォントの設定
$MintyoFont = $font_m->addTTFfont($fontPathMintyo, '', '', 32);

$font_g = new TCPDF_FONTS(); // フォントクラスの呼出
$fontPathGothic = './fonts/gothic.ttf'; // ゴシックフォントの設定
$GothicFont = $font_g->addTTFfont($fontPathGothic, '', '', 32);

$pdf->AddPage(); // ページを追加

$pdf->setSourceFile('./template.pdf'); // テンプレートを読み込み
$tplIdx = $pdf->importPage(1); // 読み込んだPDFの1ページ目のインデックスを取得
$pdf->useTemplate($tplIdx, null, null, null, null, true); // 読み込んだPDFの1ページ目をテンプレートとして使用

$pdf->SetFont($MintyoFont, '', 12); // 書き込む文字列のフォント,サイズを指定
$pdf->SetTextColor(0, 0, 0); // 書き込む文字列の文字色をRGB指定

$pdf->SetXY(150, 20); // 左上から150mm右、20mm下の位置に
$pdf->Write(0, "ほげほげ" ); // 文字列を書き込む

$pdf->Output('testt.pdf', 'I'); // PDFとして表示

|<


以下を参考にした
http://qiita.com/emegane/items/486975a79ebb267c2b8e

http://cmf.ohtanz.com/blog/archives/2463

自分の ipfw.rule

なんだかんだで長年使い続けてる ipfw.rule 

 

#!/bin/sh

fw_cmd="/sbin/ipfw -q"
fw_add="${fw_cmd} add"
IIF="re0"
OIF="ng0"
my_net="192.168.0.0/24"


# flush old rules
${fw_cmd} -f flush

# Established、フラグメント化パケットは通過
${fw_add} 100 check-state
${fw_add} 110 allow tcp from any to any established
${fw_add} 120 allow all from any to any frag


# lo0用の設定
${fw_add} 200 allow all from any to any via lo0
${fw_add} 210 deny all from any to 127.0.0.0/8 via ${OIF}
${fw_add} 220 deny all from 127.0.0.0/8 to any via ${OIF}
${fw_add} 230 allow all from any to any via ${IIF}


# 外部からのPIP宛を拒否
${fw_add} 300 deny all from any to 10.0.0.0/8 via ${OIF}
${fw_add} 310 deny log all from any to 172.16.0/12 via ${OIF}
${fw_add} 320 deny log all from any to 192.168.0.0/16 via ${OIF}

# RESERVED-1, DHCP auto-config, NET-TEST, MULTICAST(Class D), Class E アドレスへのアクセス拒否
${fw_add} 330 deny all from any to 0.0.0.0/8 via ${OIF}
${fw_add} 340 deny all from any to 169.254.0.0/16 via ${OIF}
${fw_add} 350 deny all from any to 192.0.2.0/24 via ${OIF}
${fw_add} 360 deny all from any to 240.0.0.0/4 via ${OIF}

 

# deny rules
 ${fw_add} deny log tcp from any 137-139,445 to any via ${OIF}
 ${fw_add} deny log tcp from any to any 137-139,445 via ${OIF}
 ${fw_add} deny log udp from any 137-139,445 to any via ${OIF}
 ${fw_add} deny log udp from any to any 137-139,445 via ${OIF}

 

# my network
${fw_add} allow udp from ${my_net} to me 53 keep-state
${fw_add} allow udp from ${my_net} to me 123 keep-state
${fw_add} allow tcp from ${my_net} to me 137-139,445 keep-state
${fw_add} allow tcp from ${my_net} to me via setup
${fw_add} allow all from ${my_net} to me keep-state
${fw_add} allow all from me to ${my_net} keep-state

# outer network
${fw_add} allow tcp from any to me 20 keep-state
${fw_add} allow tcp from any to me 21 keep-state
${fw_add} allow tcp from any to me 22 keep-state
${fw_add} allow tcp from any to me 25 keep-state
${fw_add} allow tcp from any to me 53 keep-state
${fw_add} allow udp from any to me 53 keep-state
${fw_add} allow udp from me to any 53 keep-state
${fw_add} allow tcp from any to me 80 keep-state
${fw_add} allow tcp from any to me 110 keep-state
${fw_add} allow tcp from any to me 443 keep-state
${fw_add} allow tcp from any to me 587 keep-state
${fw_add} allow tcp from any to me 6667 keep-state

# icmp from/to outer network
${fw_add} allow icmp from any to any in icmptypes 0,3,4,8,11,12
${fw_add} allow icmp from any to any out icmptypes 0,3,4,8,11,12

 

# ntp
${fw_add} allow udp from ${my_net} to any 123 keep-state
${fw_add} allow tcp from ${my_net} to any 123 keep-state

# steam
${fw_add} allow tcp from ${my_net} to any 27015-27030 setup
${fw_add} allow udp from ${my_net} to any 27000-27037 keep-state
${fw_add} allow udp from ${my_net} to any 27014-27050 keep-state
${fw_add} allow udp from ${my_net} to any 4380 keep-state

# 許可されている以外の外部からの接続はログ撮って拒否
${fw_add} deny log all from any to any in via ${OIF} setup
# 上記以外の内部から外部へのTCPアクセスの許可
${fw_add} allow tcp from any to any out via ${OIF}
# それ以外は拒否
${fw_add} deny log udp from any to any

sshのブルートフォースをsshguardで阻止する

SSHのブルートフォースアタック対応でipfw+SSHGuardを使う - 日々雑文

1年ちょっと前にsshへのブルートフォースアタックがひどいので、ipfw+SSHGuardを使用するという記事を書いたが、状況が変わっていたので修正

 

以前はipfwのルールを書き換えて追加したが、/etc/hosts.allow にブロックするIPアドレスが追記される形になっている(もとから?)

 

###sshguard###

ALL :  xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy  : DENY

###sshguard###

 

どんどん追加されるので適時削除が必要 

生き物を飼うということ

クラゲをポリプからストロビレーションさせて、エフィラにしたが、自分のミスなどから10月と11月の2回エフィラを全滅させてしまった。


3回目の挑戦になるが、やり直すたびにエフィラの数が増えて、1回目は20匹程度だったのが、2回目は50匹前後、3回目はおそらく150から200近くのエフィラを発生させて、飼育していたのだが、10cm前後の小さい瓶で飼っているとクラゲが大きくなるに伴って徐々に過密になってきて、水が汚れやすくなるようになってきた。


水替えの時にクラゲを移すのも手間と時間がかかるようになってきたことも有り、ざっくりと100匹ほど処分した。

 

ミズクラゲは最終的には15cmから30cmほどになるし、現状それほど大きくなるのであれば、2,3匹を飼う水槽を置くのが精一杯なので、どこかの時点で処分しなければならないことは覚悟していたが、やはりいろいろと思ってしまう。


生き物を飼う上で、その生き物の生死に対する責任を持つというのは飼い主の義務だというが、たかがクラゲでも結構しんどい物だな。

 

PHPでメールのテンプレートを読み込んで送信

smartyとか使うといいらしいが、それほどじゃないときに。

mb_language("ja");
mb_internal_encoding("UTF-8");

$toaddr = "$email";  // 宛先
$fromaddr = "From: " . mb_encode_mimeheader ('"送信者の名前"') .  "";
$subject = "メールの件名";

// テンプレートからメール本文の読み込み
ob_start();
require_once 'mailbody.tpl';
$mailbody = ob_get_contents();
ob_end_clean();

// 本文の文字列置き換え
$mailbody = str_replace ("%name%", $name, $mailbody);
$mailbody = str_replace ("%email%", $email, $mailbody);

$mailbody = mb_convert_encoding ($mailbody, "iso-2022-jp", "UTF-8");
mb_send_mail ($toaddr, $subject, $mailbody, $fromaddr);


メールの本文(mailbody.tpl)

%name% さま

%email% へ返信を送ります。


str_replace は array でもいいので、

$target = array("%name%", "%email%" );
$replace = array($name, $email);
$mailbody = str_replace ( $target, $replace, $mailbody );

も可。

ヘッダを設定によるブラウザキャッシュ制御

サーバから送信されるHTMLヘッダを用いて、ブラウザがコンテンツをどのようにキャッシュするのか設定することができる。


Expires ヘッダー、もしくは Cache-Control ヘッダーのいずれか、Etag ヘッダー、Last-Modify のいずれかを設定するのがよい。*1

ヘッダー

Expires ヘッダー

HTTP 1.0 から存在し、キャッシュの期限切れを設定する。設定するときにはHTTP-date形式(IMF-fixdate, rfc850-date, asctime-date)で指定する。


例) Expires: Thu, 01 Dec 1994 16:00:00 GMT


HTTP-date 以外の指定がされると "already expired" とみなされて、キャッシュされない。
キャッシュされないために「-1」とかを指定することもある


指定できるのは1年以内の日付。

Cache-Controlヘッダー*2

HTTP/1.1 で追加されたヘッダー、Expire ヘッダーよりも優先する。

must-revalidate キャッシュが有効かどうか必ずサーバに問い合わせた上で利用する。問合せに成功しなければキャッシュは使用してなはならい
no-cache 一度キャッシュされたデータは有効であるかどうかをサーバに問合せをした上で利用する
no-store キャッシュをしない
public キャッシュ可能な全ての場合においてキャッシュに保存することができる
private 単一の利用者のために意図されているもので、共有キャッシュには格納されない。私用キャッシュには格納されて、使用される
max-age=n nは秒数で指定、n秒後キャッシュを更新する

上記の条件は複数指定することもできる

Cache-Control: private, no-store, no-cache, must-revalidate
Etagヘッダー

サーバでリソースに対する検証トークンを生成し、クライアントからのリクエストに返信する。

クライアントはキャッシュのEtagと比較し、変更がなければキャッシュのデータを利用する。

Last-Modifedヘッダー

HTML-date 形式の日付を使用して、リソースが最後に変更された日付を返す。 クライアントはキャッシュの日付と比較して変更を判断する。

設定方法

Apache+Expires

mdo_expires を有効にして、httpd.conf などに以下の様に記述する。

ExpiresActive On
ExpiresByType image/png "access plus 6 months"
ExpiresByType image/jpg "access plus 6 months"
ExpiresByType image/gif "access plus 6 months"
Cache-Control

同じようにhttpd.confで設定する


	Header set Cache-Control "public, max-age=86400"  #one day

もしくは mod_rewrite 使用する*3

RewriteEngine on

RewriteRule \.php$ - [L,E=X_CACHE_PATTERN1:]
RewriteRule \.html$ - [L,E=X_CACHE_PATTERN2:]
RewriteRule \.(css|js)$ - [L,E=X_CACHE_PATTERN3:]
RewriteRule \.(gif|jpe?g|png)$ - [L,E=X_CACHE_PATTERN4:]

# For dynamic contents
Header set Cache-Control "no-cache" env=X_CACHE_PATTERN1
Header unset Last-Modified env=X_CACHE_PATTERN1

# For HTML files
Header set Cache-Control "max-age=0" env=X_CACHE_PATTERN2

# For CSS,JavaScript files
Header set Cache-Control "max-age=600" env=X_CACHE_PATTERN3

# For Image files
Header set Cache-Control "max-age=86400" env=X_CACHE_PATTERN4
HTTP-dateについて*4
  • 曜日は英語の先頭3文字で必須、先頭のみ大文字
  • 日付は2桁
  • 月名は英語の先頭3文字で必須、先頭のみ大文字
  • 年は4桁
  • 秒の省略は不可
  • 時間帯はGMTのみ

全滅、からの再開

10月10日からの連休で2日家を空けたら、その間にエアーが止まって、クラゲが底に沈んだまま泳げなくなって全滅した。 


泳ぎだしてから一月の命でした。



クラゲのメテフィラ(泳いでるクラゲの小さいやつ)はだめになったけど、そのメデューサを出したポリプは生きてるので再度インドメタシンの含まれるインペタン水溶液を使ってストロビレーションさせてみることにした。


ポリプは温度変化でストロビレーションを起こし、その切っ掛けは15度以下の水温にすることと言われている。 

自然状態なら秋から冬にかけてストロビレーションを起こし、通常年に1回程度ストロビレーションするはずだが、1月前にストロビレーションしたポリプに強制的にストロビレーションを誘発させてみるとどうなるかと思い、一月前と同じポリプにインペタン水溶液を与えてみたが、同じようにストロビレーションをした。


ある程度ホルモンとかが蓄積されないとダメかと思ったがそんなことなかった。 ストロビレーションしてからエサを与えて、通常通りの2,3mm程度の大きさになれば、インドメタシンなどの誘発物質ですぐストロビレーションはする様子。


自然状態で飼育していれば冬場にストロビレーションするだけで、そこからの育成に失敗すればまた1年まつ必要があるが、インドメタシンが含有されたインペタン水溶液を使えばなんどでもチャレンジできる。


まぁそれがいいかどうかは個人の判断。



https://twitter.com/nao550/status/655205155193778176:twitter