CakeEmailでメール本文が文字化けする

とっても悩んで解決したのでメモを残しておく。

CakePHPのCakeEmailを初めて使ってみたら、送信したメールの本文が文字化けする。今までQdmailを使っていたので、そんな現象には合わなかった。

Googleさんに聞いてみると

CakeEmailを使っていて本文が文字化けたらとりあえずcharsetを疑ってみる

なんて書いてあるけど、charsetにISO-2022-JPを設定しても現象は変わらない。今度はメールヘッダがも文字化けする。

しかたないので、CakeEmailをNetBeansのデバッガで追ってみる。CakeEmailの_encodeString()メソッド辺りに見当をつけてブレークポイントを設定する。デバッグしてみると何とmb_convert_encoding()を処理する前にreturnしていた。

原因はmb_convert_encoding()関数が存在しないことだった。つまり、mbstringモジュールをインストールしていないことが、そもそもの原因である。

php.iniにmbstringモジュールを読み込んであげて、mbstringモジュールの設定を適当にしてphpinfo()でmbstringがサポートされていることを確認する。

今度は文字化けせずにメールを送れた。

WindowsのローカルPCに開発環境にPHPをインストールしたままで動かしたのが原因かもしれない。

Windows 10 Anniversary Updateにアップデートしたら #SourceTree がクラッシュ

何気にWindowsアップデートしたらWindows 10 Anniversary Update (バージョン1607)が始まった。全く心の準備をしていなかったので焦った。

しかし、まあアップデートしても大丈夫だろうと楽観的に考えて進める。一晩放っておくと無事にアップデートされていた。Windows10の起動も大丈夫みたい。

しかし、SourceTreeが起動できなくなっていた。起動するとクラッシュメッセージが出てくる。これは困った。仕方ないのでGitの作業はTortoiseGitに戻した。コマンドのGitは非常用として以外は使っていない。

SourceTreeは便利すぎるので何とか使えないものかと再インストールしてみる。AtlassianのSourceTreeのサイトには何故かバージョン1.8.3という古いバージョンが上がっている。こちらをダウンロードしてインストールする。Source Treeがインストールしたままだと怒られるので一旦アンインストールしておく。

無事に起動できるようになった。新しく1.9.5があるのでアップデートするか聞いてくるので、アップデートしてみる。1.9.5にアップデートすると起動できない。クラッシュする。また1.8.3に戻して、自動でアップデートしないように設定しておく。

クラッシュレポートも送ったので、おそらくAtlassianで対応してくれることを期待する。

通知をメールからSlackにする。

いろいろと通知がメールで来ます。例えば、今使っているバグトラッキングシステムのCandyCaneは、チケットを更新するたびにたくさんメールが飛んできます。

メールを受けているGmailでフィルターで自動振り分けしていますが、やはり受信トレイに入ると煩雑です。アーカイブしてしまうと見過ごしてしまいます。そこでチャットサービスのSlackに流してしまいます。

CandyCaneから直接Slackにメッセージを流せればいいのですが、新たにプラグインを作るのも面倒なので、簡単に既存のメールからSlackに流してしまいます。

使ってたのはIFTTTです。IFTTTはメッセージの加工はできないので、CandyCaneでSlackでわかるようにメールのメッセージを加工してしまいます。CandyCaneのチケットに飛べるようにリンクを流すようにします。

CandyCaneからGmailにメールを送信します。そのときGmailの自動振り分けでCandyCaneから受信したとラベルを付けます。プロジェクトごとに振り分けるならば、「プロジェクト名/candycane」のように階層でラベルを付けます。

IFTTTのレシピで、GmailのIFでラベルで取得して、THENでSlackのチャンネルに送ってしまいます。

このときCandyCaneから送信されるメールで、——–で区切られるとその以降はSlackで無視されるので、メールの送信のViewを修正しておきます。単純にメールテンプレートから——を削除するだけでよかったです。CandyCaneでテキストメールのみで送信するように設定すれば、後はIFTTTがSlackに送り込んでくれます。

以上でCandyCaneの通知をSlackに流し込めます。

考えてみれば、CandyCaneではなくてredmineのようなメジャーなバグトラッキングシステムを使ったほうが、もっと自由に連携できるかもしれません。

WordPressの固定ページの中に投稿最新一覧を表示する

お客さんのWordPressサイトでカテゴリごとに投稿の最新一覧を表示している固定ページがあります。いい加減手作業で更新するのも面倒になってきましたので、プログラムで対応します。

Googleさんに聞いてみるとショートコードを登録して呼び出すようなことをみなさん書いています。何と皆さん出しているPHPのコードはすべて同じです。所謂コピペ記事です。何か気持ち悪い状態になっています。さて、誰がオリジナルなんでしょうか?

しかしながら、WordPressって固定ページ内にPHPのプログラムを書けないのでしたね。今ごろ気が付きました。

そのコードをコピペしてもいいのですが、2つのカテゴリの記事一覧を表示したいので、2つコピペしなければいけませんし、第一コピペコピペで気持ち悪いです。パラメーターを渡して切り替えなんて改造すればいいのですが、それも面倒ということで、何か別の方法を探します。

What’s New Generator というよさげなプラグインが見つかりました。早速インストールして試してみます。しかし、カテゴリのフィルターが1つで固定されてしまうので、2つのカテゴリの最新一覧を並べることができません。惜しいですがこれでありません。

次に当たったのは、Shortcodes Ultimateです。基本的にショートコードでWordPressのいろいろな部分にアクセスできるのですが、今回は投稿のカテゴリ別にタイトルだけを最新3件の記事を一覧に表示します。具体的には、

[su_posts template="templates/teaser-loop.php" posts_per_page="3" tax_term="8"]

なんて書いてしまいます。出力されるタイトルがHTMLのコードのh2タグで吐き出してしまいますので、この辺りは本当なら修正しないといけないのでしょう。CSSで指定してデザインを合わせて作業完了です。

 

WordPressの編集でテーブル内にうまく入力できない

お客さんのサイトでトラブル。Wordpressで作っているサイトです。

テーブルで行を追加して、セルのなかに漢字を入力するとうまく入力できなくなりました。たとえば、

12月号

と入力すると、

12gあtうgおう

となってしまいます。

使っている漢字変換がMS-IME 2007でとても古かったので、最初これが原因かと思って疑っていました。しかし、MS-IME 2010にバージョンアップしても症状は変わりません。

そこで、TinyMCEのプラグインを無効にしたところ、今度は正しく入力できます。原因はTinyMCEのようです。しかし、テーブルの行の追加はTinyMCEのメニューからできるので、TinyMCEの代わりを探さなければいけません。

試してものは、CKEditor For WordPressといプラグインです。こちらは正常に入力できます。行の追加の方法が変わってきましたが、HTMLのタグを入力するよりもいい、ということで、CKEditor For WordPressをこれから使ってもらうことになりました。

しかしながら、どうしてTinyMCEでうまく文字が入力できなかったかわかりません。

TinyMCE Advanced (?)の不具合発生のメモ

お客さんのサイトがWordpressを使って更新しているのだけど、そこで発生したトラブルのメモ。おそらく何かの組み合わせで発生しているのかな?

トラブルはWordpressの編集画面でTinyMCE Advancedプラグインの入力項目で日本語を入力すると発生する。例えば「つき」と入力すると「tうkい」となってしまう。しかし、TinyMCE Advanced 以外のタイトルなどの通常のフォームは正常に入力できる。

自分のPCでは正常に入力できる。違いは MS-IMEかATOKで入力しているかの違い。お客さんの障害が発生しているPCでは、古いWindowsなのでMS-IMEも古いバージョン。したがって完全にはバージョンが合わせていない。自分のPCでMS-IMEを使ってもトラブルはない。うまく入力できないのはお客さんのPCだけ。

TinyMCE Advancedプラグイン以外のGUIの編集プラグインを探すくらいしか解決はないかな。せっかく覚えてもらった入力方法を、お客さんにまた教えるのは大変。

最近はWordpressのプラグインのちょっとしたトラブルに悩まされているな。

redirectionプラグインのせいで

お客さんから「トップページにアクセスすると、違うページが表示されるよ。」と言われた。そんなバカな、と思ったら、本当にそうだった。

そのサイトは、Wordpressで作成されたものを引き継いだもの。マルチサイトで作られている。

WordPressの設定もおかしなところもないし、リダイレクトの.htaccessのRewriteの設定も別に大丈夫。さて、わからない。

Googleさんに「wordpress リダイレクトプラグイン 勝手に」で聞いてみた。すると、Worpressのredirectionプラグインが悪さしているかも、と出てきた。

よく設定を見てみたら、redirectionプラグインを使っていた。ログを見ているとしっかりとリダイレクトしていた。データベースから直接redirectionプラグインの設定を削除したら、おかしな遷移をしなくなった。

何でそんな遷移をするようになったのだろう? WordPress恐るべし。

redirectionプラグインを使わずに、最初からRewriteで設定すればいいのに・・・。

#baserCMS で管理者ページにログインできないときの対応メモ

今のお客さんのIRサイトをリニューアルをしたいという案件で、以前テストで作成したbaserCMSのテストサイトを復活させます。テストサイトはvagrant+VirtualBoxでローカルのPCに作成しています。

久しぶりにvagrant upでサーバーを起動してきます。Vagrantで起動したらberkshelfでのmysqlのChefのクックブックの仕様が変わって動かないというトラブルがありましたが、これは自分でレシピを作って対応します。後はMySQLのバックアップを投入すれば、今まで作成したサイトにはアクセスできます。しかし、baserCMSの管理者ページにはログインできません。

ここでNetBeansのデバッガを使ってログインの処理を追っていきます。ログインが成功した後のリダイレクトの処理以降がうまくいっていないようです。管理者ページのトップにリダイレクトしようとして、どういう訳か遷移しません。

調べてみるとCakePHPのエラーログを見ろとあります。ログには

2015-08-18 11:16:43 Warning: Warning (2): Unknown: Failed to write session data
(files). Please verify that the current setting of session.save_path is correct
(/vagrant/app/tmp/sessions) in [Unknown, line 0]

なんて書かれています。セッションデータをうまく書き込まれていないようです。

Googleさんにセッションデータがなぜ書き込めないかを聞いてみると、Vagrantの同期フォルダの権限の設定が間違っているとのこと。こちらのページのsynced_folderの設定を行うとうまく行きました。オーナーとグループをapacheにすればよさそうです。

baserCMSのGitHubにVagarantFileのサンプルがありますが、こちらのsynced_folderの設定のままだと、私のところではうまくセッションの書き込みができませんでした。今までうまくいっていましたがどうしてなのだろうか?

以上、2日位悩んだ結果のメモです。まずはCakePHPで何かあったらログを読めということでしょうか。いつも基本を忘れます。

SourceTreeのカスタム操作でコミットしたファイルリストを取り出す

今やっているプロジェクトでは、本番サーバーにアップするときに、どのファイルをアップするかを報告している。理由は、共同作業しているのでお互いにファイルの上書きをしないようにするため。だって、自分以外はgitみたいなバージョン管理システムを使っていないという大きな理由。

どのファイルを修正したかなんて、手作業で拾っていったらとても大変。考えただけでもゾッとする。自分だけファイルはgitを使って乗り切っている。

他の人たちもgitを使ってもらえばいいじゃない、と思うけど、長年開発してきたプロジェクトに最近ポッと入ったので、皆さんにgitを使ってよ、なんて言えないし、第一バージョン管理って何かしら、といったところなので、仕方ないから何とか自分だけ楽をしようと考える。

今までは、コミットしたファイルの一覧を出すのにこんな感じでコマンドを打っていた。

git diff --stat --name-only commit1 commit2

16進のコミットIDを拾って打ち込むのはとても面倒。もっと楽をしようと考えた。

今使っているgitのクライアントはWindowsのSourceTree。このSourceTreeの機能にカスタム操作なる機能があることを初めて知った。選択したコミットのIDを取得してバッチファイルに流せるのだ。

SourceTreeのカスタム操作でGoogleさんに聞くと、SourceTreeでコミット間の差分ファイルを抽出しよう (カスタム操作を使う方法)」、なんて差分のファイルをアーカイブしてZIPファイルにするサンプルばかり出てくる。みなさん、同じバッチファイルのソースを載せているけど、さてどれがオリジナルなんでしょうか?

今回書いたのは、こんな感じのバッチファイル。

@echo off

if "%2" EQU "" (
set PARAM1=%1
set PARAM2=%1~1
) else (
set PARAM1=%1
for %%a in ( %* ) do set PARAM2=%%a~1
)

rem echo %PARAM1%
rem echo %PARAM2%

git --no-pager diff --stat --name-only %PARAM1% %PARAM2%

最初のパラメータのチェックだけ、前述のサンプルから使わせてもらった。SourceTreeのカスタム操作では、選択されたコミットはすべてパラメータで取ってくるので、最初と最後のパラメータが必要なので、取得する処理を書いている。でも、何十年ぶりにDOSのバッチファイルなんて書いたのだろう。

これはWindowsだけしか動かないから、Macの場合は同じようなシェルを書く必要がある。結局はパラメータの処理だけだから簡単かも。

これをgit-diff-stat.bat とか名前を付けて保存する。後は、SourceTreeのカスタム操作の設定。こちらはこんな感じで設定してしまう。

git-diff

使い方はSourceTreeでコミット一覧からコミットを選択して、右クリックからカスタム操作を選びだけ。うまく行けばコミットされたファイルがリストになって出てくるはず。

これで16進の8桁の数字を入れなくて60倍楽になったよ。って、書いたら既に誰かが作っているのだろうな。

LibreOffice Calcで「名前を付けて保存」でハングアップ

LibreOffice Calcで「名前を付けて保存」でハングアップする。これは致命的。

復帰するのにCalcを閉じることができないので、Ctrl+Alt+Deleteでサインアウトして強制的に終了させなくてはならなかった。

この現象は、以前のLibreOfficeのバージョンから発生していたが、修正されるのを期待して4.4にしても変わらなかった。

再度「名前を付けて保存」をやってみると2回続けてこの現象になるが、どういう訳か3回目の今では正常に保存のダイアログが出てくる。これは不思議。今使っているWindowsシステムとの関係か?

これは、そろそろMicrosoft Officeにしろということなのか?