Twigの小技まとめ

文字列省略(Twig1.6以降)

 

HTML参照文字エスケープ

 

リプレース

 

改行文字をbrに

 

ループ

 

ループの中で使える便利なやつ

 

正規表現マッチング

 

その他は随時更新。

 

参考URL)

  •  https://hrroct.hatenablog.com/entry/2017/04/28/184032
  • https://qiita.com/assa/items/4fef2f3abd95248ed626
  • https://twig.symfony.com/doc/2.x/filters/replace.html
  • https://tetra-themes.com/eccube3-dump-498/
  • http://www.tomcky.net/entry/2018/02/08/010639
  • http://mononofu.hatenablog.com/entry/20111209/1323431291

Postfixのメールログで特定のキューIDを抽出する

あるメール配信で配信エラーになった場合に、相手先からどのようなエラーコードとバナーが返却されているかを調べるときに便利。

ちなみに、postfixのログは、一行ごとに、

といった構造で書かれる。同じキューIDのログを調べれば、一通のメールの一連の動きを追うことが出来る。

直近の”to@hoge.com”宛てのメールのキューIDを取得するシェルスクリプト

結果

ちなみに上記は「said: 550 Invalid recipient: <to@hoge.com>」と返ってきているので、メールを送ったこのユーザ(to@hoge.com>)は存在しなかったということになる。

ちなみに理想としては、エンベロープFROMに、宛て先と送信するたびの履歴番号など、特定の情報を仕込んでおくと、時系列で探しやすい。

sendmail使うなら、

とかしておくとよい。(この場合「to=hoge.com-001@fuga.com」がエンベロープFROM)

そうしておけば、何回も同じ宛先に送っている場合でも、下記のように目的のキューIDを探しやすくなる。

なおヘッダーFROMをいくらいじっても、基本的にはメールログには記録されない。(ログレベルを上げればできるかも。この辺は調べてない。)

参考サイト)

 

エクセルを利用してUnicode(Unicode Code Point)からUTF-8に変換する

このような目的場合、無償サイトだとこちらの「文字番号を入力して調べる」のツールが便利。1つ2つの変換であればこのサイトを利用したほうが早いです。

変換するコードが大量にある場合は、いろいろ方法はあるかと思いますが、あくまでユーティリティなので、エクセルでちゃちゃっと変換する方法を紹介します。

まず、変換したいUnicode(Unicode Code Point)を確認します。ここでは例として「(U+)3042」を変換します。これは、ひらがなの「あ」に相当します。

まず、このUnicodeは16進数ですので、2進数に変換します。この16進数は「30」と「42」に分けられますので、エクセルの関数ですと、

=HEX2BIN(LEFT(セル番号,2),8)&HEX2BIN(RIGHT(セル番号,2),8) 

と書くことが出来ます。

2進数への変換後は、「0011000001000010」となります。

次にこの「(U+)3042」が、こちらのサイトの「表3-9 UnicodeとUTF-8の関係」のどの範囲に該当するか調べます。

今回の場合ですと、3042なので、表の3行目(00000800~0000ffff)の範囲に該当します。(16進数の大小関係が分からない方は、他サイトでお調べください)

(出典: Hitachi, Ltd. 文字コード変換後の値の求め方)

そして、1バイト目から3バイト目を、表に倣って変換します。表の「v」の数だけ、2進数をわけて考えるとわかりやすいです。

今回の場合だと、1バイト目がv4つ、2バイト目がv6つ、3バイト目がv6つですので、0011000001000010は、「0011」と「000001」と「000010」に分けられます。

これらの先頭に、表のように2進数を付け加えます。

1バイト目:「0011」の先頭に「1110」を加えて、「11100011」

2バイト目:「000001」の先頭に「10」を付け加えて「10000001」

3バイト目:「000010」の先頭に「10」を付け加えて「10000010」

これを全部繋げると、「111000111000000110000010」になります。(8bit×3=3byte文字)

ここで行った作業をエクセルの関数で書くと、

=”1110″&LEFT(セル番号,4)&”10″&MID(セル番号,5,6)&”10″&RIGHT(セル番号,6) 

となります。

最後に、この2進数を、再度16進数に戻します。エクセルの関数で書くと、

=BIN2HEX(LEFT(セル番号,8))&BIN2HEX(MID(セル番号,9,8))&BIN2HEX(RIGHT(セル番号,8)) 

となります。

最後に導き出された16進数文字「E38182」が、UTF-8変換後の文字コードとなります。

イメージとしては下記のような感じです。上記の①~③の関数が、以下の図の①~③に対応しています。

あとはオートフィルを使うなり、いろいろと出力を加工して大量の変換ができると思います。

 

EC-CUBEでhreflangタグを設置する

Googleが推奨するhreflangタグ。SEO効果はほとんどないみたいだが、サーチコンソールに出るのが嫌な場合は対策が必要。

タグを設置するのは簡単だが、このタグはサイトごとではなくページ単位で有効なタグなので、ページ毎に設置する必要がある。その為、下層のページにはその下層のページのURLで設置する必要がある。

EC-CUBEの場合は、site_frame.tplに下記のように書くことで、下層を含む全ページに対応可能。(例では言語は’ja’のみ)

/data/Smarty/templates/default(またはsphoneなど)/site_frame.tpl

 

参考URL)

 

WHERE句でキーとなるカラムに値が無ければ別のカラムの値を採用する

SELECTするとき、WHERE句で特定の日付の値を条件として使いたいが、その値が存在しなかったり期待するものと違ったりした時、別の日付をキーにする。

例えば以下は、base_dateカラムの日付をキーにしたいが、base_dateの値がNULLだったりMySQLのデフォルト値(0000-00-00)だったりすると、結果がおかしくなってしまう。

なので、このbase_dateの値が期待するものと違えば、代替として、entryの値を使用したい。

CASEを使って対応。

 

NULLだけを回避するのであれば、COALESCEを使えばいいっぽい。試してないが書くならこんな感じかしら。

 

参考サイト)

 

Smartyでループ内のindexを得る

Smartyのループの中で、現在何番目の処理かを知りたいときなどは、「index」プロパティを使用します。

 

例)リスト10件おきに広告を表示したいとき

 

参考URL)

GROUP BYしたカラム以外のカラムで優先順位を決める方法

GROUP BY で指定したカラムの値が、同じ値の行はグループ化されるが、GROUP BY で指定していないカラムの値は、どの行の値を優先させるか、通常は決めることができない。

例えば、下記のようなSQLだと、得られるidの優先順位は指定できない。(実際、昇順で最初のものがくる場合が多いが、保証はされない)

 

この場合は、副問い合わせで対応するのが一般的なやり方らしい。

 

ちなみにWHERE句で絞る場合も、副問い合わせの中で絞らないとダメ。なので、下記の場合は失敗する。

 

参考サイト)

ブラウザで拡大表示したときの画像が右側に寄ってしまう現象の修正

比較的横幅の広い、中央寄せしている画像をサイトに掲載している場合、ホイールスクロールなどでサイトを拡大していくと、画像の幅が画面からはみだしたところで、画像が左端が画面の左端に合った状態で拡大されてしまう。

したがって、PCモニタの解像度によっては、デフォルト縮尺の状態でも、画像が中央から右にずれたような表示となってしまう。

この場合は、leftプロパティとネガティブマージンで対応する。

(imgがブロック要素であればimgの方に指定してもよろしいかと思う。)

 

動作確認ブラウザ

  • chrome 61.0.3163.100
  • Firefox 56.0.1(64bit) 他

 

参考サイト)

 

特定の名前のファイルを再帰的に削除する

ファイル検索でよく使われるfindと併用するといいらしい。

 

WindowsのローカルからLinuxのリモートにSCPしたときに、余計な「desktop.ini」が一緒にアップされちゃったときとか。