アーカイブ » 2012 » 4月

mPDF5.xでTTFフォント使用時に一部の文字が四角で出力

Written in 2012年04月23日 by | コメントする( 2件 )

mPDF5.4を使って、PDFのレポートを出力していたが、TTFフォントで日本語を出す際に一部の文字が四角の形で出力されてしまう原因不明の不具合がでた。フォントのサブセットを埋め込む際の問題らしいが、散々検証してようやく解決できた。。。結構みんな困ってるんじゃなかろうか。。。

その四角をコピーして、秀丸とかに貼ると、復元される。間違いなく、文字コードの埋め込みではなく、フォント自体の埋め込みの問題です。

これはTTFフォントのサブセットをPDFに埋め込む際に、
Supplemental Ideographic Plane (SIP i.e. U+20000 to U+2FFFF)を扱うメソッドの方が動作してしまうかららしい。

http://mpdf.bpm1.com/forum/comments.php?DiscussionID=470&page=1#Item_11

が参考となりました。

mPDFがフォントのサブセットを埋め込む際に、そのフォントファイルを調べ、そのフォントにSIP(またはSMP U+10000+1FFFF)が含まれている場合、問題の原因となっているその第二のメソッドが使われるのである。それはドキュメント内でそれらの文字が使われているか否かに関わりません。(mPDFが水面下で融通をきかせてしまうのです。) しかしながら、該当フォントをconfig_fonts.phpの$this->BMPonly配列にくわえることによって、この挙動を上書きできます。こうすることでmPDFに第一のメソッドを使うように強制することができます。ただし、SIPの文字は表示されなくなります。

この設定をするとUnicode Basic Multilingual Plane (BMP i.e. U+0000 to U+FFFF)内の文字だけが利用可能な状態となります。

/mpdf54/config_fonts.phpの307行の
$this->BMPonly に、使用したいフォント名を追加してやる。(”mspgothic”など。)

例)

$this->BMPonly = array(
    "mspgothic",
    "msgothic",
    "mspmincho",
    "msmincho",
    "ipagothicp",
    "ipagothic",
    "ipaminchop",
    "ipamincho",
    "dejavusanscondensed",
    "dejavusans",
    "dejavuserifcondensed",
    "dejavuserif",
    "dejavusansmono",
);

MySQLで「Host ‘hogehoge.com’ is blocked because of many connection errors」が発生

Written in 2012年04月21日 by | コメントする( 0件 )

たとえばPHPなどでは以下のようなエラーメッセージが出力される。

Warning: mysql_connect() [function.mysql-connect]: Host 'hogehoge.com' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' in /home/hoge/public_html/somedir/somescript.php on line 50

■原因

MySQLがそのホスト(hogehoge.com)から多くの接続エラーを受けた場合に発生します。接続エラーの大量発生後、MySQLサーバは何か問題(クラッカーからの攻撃など)が発生したと判断し、このホストからの接続を拒否するようにします。

デフォルトでは、接続エラーが 10 回発生すると、mysqld はそのホストを拒否します。この数はMySQLのmax_connect_errors変数によって変更できます。

参照URL: http://dev.mysql.com/doc//refman/4.1/ja/blocked-host.html

 

■対処

①シェルで以下のコマンドを実行する

# mysqladmin flush-hosts

②以下のSQLを実行する

FLUSH HOSTS;

 

■事象発生の確認

上記エラーメッセージが出力されることが事象発生を知らせるものであるが、MySQLサーバ側でその状態を確認することはできないのか。ある程度はできる。

接続エラーが発生するとそれはホストキャッシュ(host cache)に記憶される。このホストキャッシュとは、MySQLがDNSからIP、ホスト名を正引き、逆引きした結果をキャッシュしておくもので、同時に、この接続エラーの状況を記憶しておくものでもあります。それでこのキャッシュを上記のコマンドでフラッシュしてやれば解決するのである。ホストが拒否された場合、これが唯一の解消方法です。

さて、このホストキャッシュを閲覧できるなら状況を把握できるのだが、閲覧するためのコマンドは存在しません。確認できるSQLコマンドを追加するパッチを開発した方もおられるようだが。

しかし、いくつか得られる情報はある。

①error log と general query log

–log-warningsオプションをつけてサーバを起動すると、error logに以下のようなエラーメッセージが記録される。

010301 14:38:23  Aborted connection 854 to db:
'users' user: 'josh'

また、general query logが有効にされていると、問題の原因の種類が書き込まれる。

②ステータス変数「Aborted_clients」「Aborted_connects」

以下のSQLを実行するとこのステータス変数を取得できる。

SHOW GLOBAL STATUS WHERE `Variable_name` IN ( 'Aborted_clients', 'Aborted_connects' );

ホスト拒否の根拠とされるのは、どちらのステータス変数なのか、あるいは両方なのかはわからないが、それぞれの変数の意味は以下の通りです。

Aborted_clients

クライアントが接続できたものの後で不適切に切断されたり終了されたりした場合、MySQLはこのステータス変数を増加させます。また、error logにAborted connectionメッセージが書き込まれます。このステータスになる原因は以下の通りです。

  • クライアントプログラムがmysql_close()をコールせずに終了した
  • クライアントが何のリクエストもしないままwait_timeoutまたはinteractive_timeoutの秒数を経過してスリープしている場合
  • クライアントプログラムがデータ転送中に突然に終了した場合

Aborted_connects

クライアントがコネクトすらできなかった場合にサーバはこのステータス変数を増加させます。コネクション試行の失敗は以下の理由で発生します。

  • クライアントがデータベースへの接続権限を持っていない
  • クライアントが正しくないパスワードを使用している
  • コネクションのパケットに正しい情報が含まれていない
  • コネクションのパケットの取得にconnect_timeout秒以上を要した

これらの種類の問題が起きている場合、誰かがサーバに侵入しようとしていることを意味しているかもしれません。これらのタイプの問題に関するメッセージは(有効にさていれば)genral query logに記録されます。

そのほかにもAborted_clientsやAborted_connectionsになる理由はあるが詳細は以下のURLを参照してください。

参照URL: http://dev.mysql.com/doc/refman/5.0/en/communication-errors.html