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

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

確率による重みづけをしてn個のものを取り出す

X種類のフルーツ中からランダムにn種類取り出す場合、PHPなら mt_rand() などの関数を使えばすぐに実装可能です。 実装条件 ソフトウェア バージョン PHP 5.6.30

親ウィンドウのhtml要素・関数を操作する

Javascript の window.open() 関数を利用して開いた子ウィンドウ上で、親ウィンドウ上の html要素を操作する方法です。 Javascript での記述 Javascript では次のように記述すれば可能です。 <script> // 親ウィンドウの id=hoge 要素の value 属性を変更する obj = </script>…

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 問題と呼…

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

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

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

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

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

jQuery を使って、ある要素をクリックしたときのイベントを実装する場合、PC と Smartphone で同じ挙動を実装しようとすると、ちょっとした問題にぶつかります。 それは、イベントハンドラを何にすればよいか?という問題です。 PC 向けであれば click イベ…

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

1つの Web サーバで複数の SSL サイトを運用する際、SNI(Server Name Indication)という拡張仕様を利用することが一般的になっています。 名前ベースで SSL のバーチャルホストを管理するということなのですが Apache では2.2.12以降において設定が可能とな…

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

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

MySQL で既存テーブルに JSON 型カラムを追加すると、デフォルトで null が入る

MySQL5.7以降で追加された JSON 型ですが、仕様を把握していないとハマるポイントがあります。 たとえば、テーブルに NOT NULL でJSON型のカラムを追加をすると、既存レコードには null が入ります。 この null は MySQL の NULL ではなく(NOT NULL で追加し…

HTTPレスポンスを返した後も処理を続ける方法

PHP

HTTPリクエストを受け取ったWEBサーバは、そのプロセスで処理をすべて実行した後にレスポンスを返却します。 この処理に時間がかかることが予想されるとき(たとえば30秒でタイムアウトするリクエストで40秒かかるとか)、プロセス内で別のプロセスを起動し…

クラスにメソッドを動的に追加する trait

PHP

実装済みのクラスに、あとからメソッドを動的に追加することができるようにします。 実装環境 ソフトウェア バージョン PHP 5.6.30 ※ ただし trait 自体は PHP5.4 以降で利用可能