明滅するプログラマの思索

WEBエンジニアとして勤務している一介の男が、日々気づいたことをまとめるブログです

data属性で JSON データを管理する

Javascript では JSON データを簡単に扱うことができます。
今回の記事では、ページ内の一時的な情報を JSON オブジェクトとしてキャッシュし、それを HTML5 の data 属性で管理してみます。

実装条件

ソフトウェア バージョン
jQuery 2.2.4
Browser Chrome
続きを読む

qmail で特定のメール送信に失敗する問題

古いネタです。

メールサーバとして qmail を利用している環境において、特定のメール送信に失敗することがあります。
そのとき、クライアント側に帰ってくるエラーに451 See http://pobox.com/~djb/docs/smtplf.html.が含まれている場合、Bare LFs 問題と呼ばれる qmail のバグである可能性が高いです。

現象

Bare LFs 問題の特徴として以下が挙げられます。

  • 特定のメールの送信に失敗する
  • ほかのメールは送信に成功する
  • MTA が qmail
  • maillog にログが残らない
  • 送信エラーに以下の文言が含まれている
    • 451 See http://pobox.com/~djb/docs/smtplf.html.
続きを読む

PHP でウィザード形式のページ遷移を実現する trait

Wizard とは

ウィザードとは、対話形式で遷移を踏みつつ処理を進めさせるためのユーザインターフェイスのことです。
ウェブでは、複数ページにまたがるフォームなどで実装されています。

ウィザードを実装するためには、遷移途中の入力データや今どのページを参照しているのかのステップ情報を保持しておいて、最終的にデータベースなどにコミットするような仕組みを用意する必要があります。
今回はウィザードを簡単に実装するために PHP の trait で実装してみました。

実装条件

ソフトウェア バージョン
PHP 5.6.30

入力データの保持に SESSION を利用しています。
また、サンプルコードで HTML テンプレートを扱うため、Smarty を利用しています。

続きを読む

背景色に対する文字色を明度の差で動的に決定する

背景色を動的に変更したい、そのうえで、文字も見えづらくならないように動的に変更したい、という場合があるとします。
たとえば、とある表があって、各セルの背景色を任意に指定できる場合、文字色も併せて変更しないと、文字がつぶれて見えなくなってしまったりします。
こういった場合に、背景色を基に文字色を決定できれば良いと考えます。

明度

W3C草案には、読みやすいHTMLを作成する指針として、背景色と文字色の明度の差は125以上あるのが望ましいと記載されています。
参考:Techniques For Accessibility Evaluation And Repair Tools

明度とは、字のごとく明るさのこと。
明度が低ければ暗い色であり、高ければ明るい色です。

参考のURLには、計算式についても記載があります。

計算式(RGB):
明度 = ((Red value X 299) + (Green value X 587) + (Blue value X 114)) / 1000
続きを読む

PC と Smartphone で共有のクリック時イベントを実装する

jQuery を使って、ある要素をクリックしたときのイベントを実装する場合、PC と Smartphone で同じ挙動を実装しようとすると、ちょっとした問題にぶつかります。
それは、イベントハンドラを何にすればよいか?という問題です。
PC 向けであれば click イベントを使用すれば問題ないでしょう。
Smartphone 向けの場合 click はダブルクリックの検出を行うため、平たく言えば画面から指を離した後に発火します。非常にもっさりとした動作となるため、それを避ける意味で touchstart をイベントハンドラとして実装すると良い感じに動きます。
では、PC と Smartphone のどちらでも同じようにイベントを発火させたい場合、どのようにイベントハンドラを設定してあげればよいでしょう。

続きを読む

Client aborts on SNI unrecognized_name warning の サーバ側での対処

1つの Web サーバで複数の SSL サイトを運用する際、SNI(Server Name Indication)という拡張仕様を利用することが一般的になっています。
名前ベースで SSL のバーチャルホストを管理するということなのですが Apache では2.2.12以降において設定が可能となりました。
現在ではほとんどのクライアントが SNI 対応済みとなっています。

Java1.7 以降で実装したクライアントにおいて、SNI の設定にミスがある Web サーバへリクエストを行った際、タイトルのエラーが出力されることがあります。
今回は上記エラーが Apache の設定ミスにより発生した場合の対処を記載します。

続きを読む

ジェネレータを利用した MySQL データの抽出

DBテーブル上にレコードが大量にあり、これをプログラムでループさせながら処理したい、というケースは非常に多くあります。
この場合、大量にあるレコードを配列に格納することで、よく問題になるのが使用メモリの肥大化です。
PHP5.5以降で実装されたジェネレータを使えば、メモリを節約しつつ大きなレコードのDBテーブルに対し SELECT できるようになります。

ジェネレータとは

ジェネレータは、ループ処理に必要なデータを配列で持たなくても済むように実装できるようにするものです。
一般的なループ処理を行う場合、その回数分のデータを配列に格納してそれを foreach 構文に引き渡すことで行いますが、非常に大きな回数を行う場合メモリを圧迫してしまいます。
ジェネレータを使うと、ループ処理1回ずつに対して必要なデータを生成して渡すことでメモリを節約することができます。
これを実装するためには、必要なデータを1回ずつ生成するためのジェネレータ関数を用意することになります。
ジェネレータ関数では、データの返却に return は使いません。代わりに yield (産出)を使用します。

本記事では、ジェネレータによってMySQLサーバよりデータを1行ずつ抽出し、処理を行うためのクラスを実装してみます。

実装環境

ソフトウェア バージョン
PHP 5.6.30
続きを読む