TCPDF の writeHTML() で background-image

具体的に言うと

  • 請求書PDF等をPHPから出力したい
  • PHPでゴニョゴニョ書くのは面倒なので、レイアウトはHTMLで管理したい
  • 角印の背景画像を入れたい

今回は、TCPDFのwriteHTML()で背景画像をなんとかする方法です。

background-image: ⇒ ダメ
margin-top: ⇒ ダメ
position: ⇒ ダメ

...そして、 stack overflow : TCPDF not render all CSS properties を見たりして、あきらめかけている方に朗報です。

なぜか唯一 table タグ の padding だけサポートされています。

 

こんな感じで解決です。
<img src=”stamp.jpg” />
<table style=”padding-top:-100px;”><tr><td>
    株式会社日本ユニバース<br />
    http://nusoft.jp/
</td></tr></table>

Classic ASP + SQL Server 2012 verchar(MAX) probrem, no text displayed ?!

varchar(MAX) や nvarchar(MAX) 便利ですね。

今回は、varchar(8000) の列を varchar(MAX)に変更したことで、Classic ASP のWEBシステムで、データが表示されない、、困った、、という事件。

一般的には、WEBサーバーに、SQL Server Native Client をインストールし、SQLサーバーへの接続ドライバの指定を変更すれば解決します。

SQL Server Native Clientのインストール
https://www.microsoft.com/ja-jp/download/details.aspx?id=43339

JPN\x86\sqlncli.msi をインストールし接続文字列を変更。

Driver={SQL Server}; ⇒ PROVIDER=SQLNCLI11;  または、SQLNCLI11.1;

と変更。

例: ”PROVIDER=SQLNCLI11;USER ID=xxx;PASSWORD=xxx;INITIAL CATALOG=xxxxxxx;Server=xxxxxxx;DataTypeCompatibility=80″

で、めでたしめでたしのところが、別のページで。。。。

 

現在の_Recordset_はブックマークをサポートしてません。プロバイダーか、選択されたカーソルタイプの限界の可能性があります。 

直せばいいのだがテストの範囲も広範囲過ぎて。。

そこで… 解決策

ドライバは古いままで、何とかします。

例: tableA
col1 int
col2 varchar(MAX)
col3 datetime

の場合。

改修前: SELECT * FROM tableA

改修後: SELECT col1, col3, col2 FROM tableA

ポイントは、varchar(MAX) を最後にもってくることです。

理由は知りません。ピンときてやってみたら何とかなったという、理解しようとしてはいけないアレです。

Zend_DB Fatal error: Uncaught exception ‘Zend_Db_Table_Exception’ with message ‘A table must have a primary key

Fatal error: Uncaught exception ‘Zend_Db_Table_Exception’ with message ‘A table must have a primary key …

MySQLのViewを Zend_DB_Tableを使用して読み込んだ場合のエラーです。
主キーがない!って。そりゃそうさ、Viewだよ…じゃなくて、教えてあげましょう。

class thisIsView extends Zend_Db_Table_Abstract
{
    protected $_name = 'this_is_view';
    protected $_primary = 'id';
    protected $_sequence = false;
}

 

PHPTAL用にHTMLをXHTMLに変換する

メリットだらけの PHPTAL ですが、数少ないデメリットの一つに、構文にウルサイというのがあります。HTMLを理解してコンテンツや属性を置換してくれるのですから、当然といえば当然です。

誤 <input type=”text” name=”name”>
正 <input type=”text” name=”name” />

誤 <img src=”logo.png”>
正 <img src=”logo.png” />

ただ、世の中の流れは、HTMLの次にXHTMLが流行ることなく、結局HTML5の流れです。
なので、Dreamweaver のHTMLコードも当然XHTMLではありません。

XHTMLを強要するPHPTALはもう・・・という懸念はさておき、便利なのでまだしばらくはPHPTAL使い続けます。

ということで、DreamweaverでHTMLをXHTMLに置換します。

置換方法

検索対象 現在のローカルサイト全体
検索 ソースコード
検索 <(base|br|hr|img|input|link|meta|param)([^>]*[^/])>
置換 <$1$2 />
オプション 正規表現を使用

※ jquery のファイルがヒットしたりするので、読み取り専用にしておくとイイかも。
※ 置換対象のファイル名を指定できるエディタで置換するとイイかも。秀丸とか。秀丸の場合は <\1\2 /> ですね。

sp_OACreate ‘BASP21’ がエラー 「-2147221164」

EXEC @hr = sp_OACreate ‘BASP21’, @object OUT;

print @hr

-2147221164

なぜ?権限とか?

ヒント

print CONVERT(binary(4), @hr) してみて。

0x80040154

この値だと、Google先生も答えてくれますよ。

さらに

EXEC sp_OAGetErrorInfo ; してみて。

エラーメッセージ出ましたよね?

0x80040154 ODSOLE Extended Procedure クラスが登録されていません

??インストールしたけど??

原因の推測

BASP21が32ビット版だから

対策

SSISへの移行や、VBSへの移行を検討しましょう。

ちなみに、64-bit版Windowsにも、32-bit版のCScript、WScriptは用意されています。

例: C:\Windows\SysWOW64\CScript.exe C:\vbs\job.vbs

BASP21 Sendmailは送信できるけど、SendmailExだけ送信できない

※IIS7 、IIS8 等のレガシーASPでBASP21を動作させるための設定は、Google先生に聞いてみてください。親切な同士がたくさんいますよ。

症状

Windows Server 2012 (IIS8.5) でレガシーASP実行時のエラーです。
BASP21を使用して、Sendmailは送信できるけど、SendmailExだけ送信できない。

ログ

送信エラー Cant connect Server 11001 …

Google先生によると、どうやらWinSockのエラーコードらしいです。
WinSock Error 11001:そのようなホストは不明です。

推測・・・SMTPサーバーの名前解決ができていないのではないか?

SMTP指定をIPアドレスに変更してみる → 送信完了 (ビンゴ!)

原因

SendmailExはASPとは別プロセスです。別プロセスの起動アカウントに名前解決のための権限がなかったようです。

解決策

IISマネージャーを開きます。

アプリケーションプール → 対象のアプリケーションプールを選択
→ 詳細設定 → プロセスモデル → ID

ApplicationPoolIdentity になっていると思います。
NetworkService や LocalSystem に変更するか、
この ApplicationPoolIdentity で動作できるように権限を付与していきます。

シャットダウンできない! “Operations are in progress, please wait. The machine will be turned off automatically after the operations are complete.”

いやぁ~久しぶりに困りました。

Operations are in progress, please wait. The machine will be turned off automatically after the operations are complete.

operationswin7

シャットダウンできない。電源ボタン長押しOFF後も、電源入れるとまたこの画面。

Google先生曰く、原因はAcronis。しばらく時間が経てば元に戻るよと。→ 1日放置しても変わりません。。
Acronis社 に電話するも、自動メッセージで相手にしてくれません。。

いろいろやった結果の解決策です。同じ状況の方の助けになれば。

解決策

多分それはノートパソコンですね?次の方法で解決です。

  1. まず電源ボタンを長押しして電源OFFにします。
  2. 電池を取り外し、電源ケーブルのみ接続します。
  3. 電源ボタンを押して、電源ONにします。もはや見慣れてしまったこの憎き(!)画面が表示されます。
  4. 電源ケーブルを抜きます。強制的に電源OFFになります。
  5. 電池を取り付けます。必要なら電源ケーブルも接続します。
  6. 電源ボタンを押して、電源ONにします。→ Windows起動画面(^o^)丿
  7. コントロールパネル → プログラムと機能 → 「Acronis  True Image ・・・」 をアンインストール!!!

以上です。

バックアップソフトウェアが原因で、リカバリしないといけないハメになるところでした。
しかも・・・ バックアップする前に! 危ない危ない・・・

 

この状況になったあなたもきっと、Acronisを使いこなしていないはず。迷わずアンインストールして別のバックアッププランを検討してください。

[WordPress]本番移行・ドメイン移行 さぁ一括置換

/test/  にWordpressを設置して、新しいサイトが完成しました。クライアントOKもいただいたし、さあ公開!・・・で、つまづくアレです。
phpMyAdminを使ってSQLを一括置換!ではダメです。

DBのデータをよく見てみると、

a:5:{s:5:"width";i:450;s:6:"height";i:630;s:4:"file";s:22:"2015/02/1-image-20.jpg";s:5:"sizes";a:6:{s:9:"thumbnail";a:4:{s:4:"file"; ...

serialize  されています。この文字列には、元の配列やオブジェクトの中のデータ形式や、格納されているテキストの長さなども保持されていて、単純にテキストを置換してしまうと、データが復元できなくなってしまいます。

で、こちら ・・・ DATABASE SEARCH AND REPLACE SCRIPT IN PHP

使い方は、親切な方が丁寧に説明してくださっているので検索してみてください。

[Android] TimePicker のテキスト入力が反映されない

標準 TimePicker は、テキスト入力もできるようになっていますが、テキスト入力は反映されないじゃないか!という件。

Focus が移動してTextEditの入力値が確定したときには、時すでに遅し… という状況。

解 ・・・

.getCurrentHour() とかする前に、.clearFocus() して、値を確定してあげます。

PHP5.4 からの upload_progress と Zend_Session

PHP5.4からsession.upload_progressが使用できるようになりました。詳しくは検索!もしくはこちら
けっこう簡単に素敵なアップロード画面を作ることができるようになりました。

ただ…
Zend_Sessionと併用はできないようです。 (↓訂正)

名前が session.upload_progress.name の値を持つPOSTを受け取った時点で、どうも session_start しているようです。

Zend_Sessionを使う場合は php_value session.auto_start 0 にして勝手にsession_startを呼ばないでねっていうZend_Sessionとの約束は守れません。

なので、Zend_Auth を認証に使ってたら new Zend_Auth_Storage_Session() で怒られます。
「session has already been started by session.auto-start or session_start() 」

ドハマリ数時間の結論は、併用不可。アップロード画面はZend_Session、Zend_Authを使用せず、別の方法で認証してupload_progressを優先することにします。(↓訂正)

— 訂正 —
なんということでしょう。結構簡単に実装できちゃいました。Zendの設計者スバラシイ。
Zend_File_Transfer_Adapter_Http  あたりが答えです。
情報は少なくなりますが、このあたり(stackoverflow)が参考になります。