刑事さんが訪ねてきた

今日の午前、自分の部屋に、神奈川の○○署の刑事さんが訪ねてきました。警察手帳を開いてみせて、名乗って。おお、これってドラマで観るやつじゃん!

でも、現実味がなかったので「本当に刑事さんですか?」と聞きました。そうしたら、もう一回警察手帳を開いて見せてくれる。それでも怪しいので「これ本物ですか?」と聞くと、「うーん、困ったな、どうすれば信じてもらえるかな。。」と嘆くので、まずは話だけでも聞く事にしました。

すると聞き覚えのある固有名詞が。どうやら僕が半年ほど前に関わった三国間の国際取引の一つがトラブっているようです。僕のクライアントがヨーロッパにいて、そのクライアントのさらにクライアントが東南アジアにいて、そこが日本の別の業者と取引をしていています。この最後の2業者間で問題が起きている、と。

詐欺の可能性を視野にいれて捜査しているらしいのですが、金額が数万円と小額なのに相手が海外なので、刑事さんもあまり身が入らない様子でした。とりあえず僕の方は、伝票やメールのコピーなど、すぐに出せるものを出しておきました。

決済手段として Paypal を利用していました。しかし刑事さんは、Paypalが相手にしてくれない、情報を出してくれないと不満を述べていました。電話をすると日本語の怪しいスタッフが出て話が通じず、上司を出してくれと言うと上司も外国人で、日本の警察への対応が冷たい、と。

小額の犯罪って、国をまたぐとなかなか捕まらないものなんだなあと思いました。インターネットの発展と国際的な法整備のギャップのように、スキマを見つける能力を磨きたいです。いえ、犯罪はやらないけど。

iScroll 4 で左右にスクロールさせつつ、上下にはネイティブでスクロールさせる方法

スマホで独自のスクロールエリアといえば iScroll 4 は定番ですが、画面の大部分を覆うような横スクロールエリアを持つレイアウトの場合、縦に長いページを上下にネイティブスクロールできなくなります。

そういうときは、onBeforeScrollStart() をオーバーライドして iScroll 4 の e.preventDefault() を無効にした上で、onBeforeScrollMove() で横スクロールのみ e.preventDefault() すれば、意図が実現できます。e.preventDefault() の実装位置は、iScroll 4 のバージョンによって違うらしいので、注意!

var myScroll = new iScroll( 'wrapper', { hScroll: true, vScroll: false, hScrollbar: false, onBeforeScrollStart: function(e) { // cancel e.preventDefault() }, onBeforeScrollMove: function(e) { if (this.absDistX > (this.absDistY + 5)) { e.preventDefault(); } } } );

Drupal で記事にランダムなURLをつける

Drupal で、記事にランダムな URL をつけるモジュールを作成しました。 http://example.com/o8Uyswfi みたいな、英数文字のランダム文字列URLです。YouTube でも使われている形式です。

Drupal 6.x では、tokenモジュールに tokenSTRTER という、改造用のソースが付いていて、それを書き換えるだけで実現できていました。

<?php

// $Id: tokenSTARTER.module,v 1.1.2.2 2009/05/14 16:06:47 greggles Exp $

/**

  • @file
  • The Token API module. *
  • The Token module provides an API for providing tokens to other modules.
  • Tokens are small bits of text that can be placed into larger documents
  • via simple placeholders, like %site-name or [user]. *
  • @ingroup token */

/**

  • Implementation of hook_token_list(). */ function tokenSTARTER_token_list($type = ‘all’) { if ($type == ‘global’ || $type == ‘all’) { $tokens[‘global’][‘random-alphanum-11’] = t(‘A randomly generated 11-digit alpha numeric letters.’); $tokens[‘global’][‘random-sha1’] = t(“A randomly generated SHA1 hash.”); $tokens[‘global’][‘site-date-timestamp’] = t(‘The current timestamp in seconds past January 1, 1970.’); $tokens[‘global’][‘random-num-1’] = t(‘A randomly generated single-digit number.’); $tokens[‘global’][‘random-num-3’] = t(‘A randomly generated three-digit number.’); $tokens[‘global’][‘random-num-10’] = t(‘A randomly generated ten-digit number.’); $tokens[‘global’][‘random-alpha-1’] = t(‘Randomly generated single-digit letter.’); $tokens[‘global’][‘random-alpha-3’] = t(‘Randomly generated three-digit letters.’); $tokens[‘global’][‘random-alpha-10’] = t(‘Randomly generated ten-digit letters.’); } if ($type == ‘node’ || $type == ‘all’) { // Node tokens here. }

return $tokens; }

/**

  • Implementation of hook_token_values(). */ function tokenSTARTER_token_values($type, $object = NULL) { $values = array(); switch ($type) { case ‘global’: $alpha_num_letters = str_split(‘23456789abcdefghkmnopqrstuvwxyz’); shuffle($alpha_num_letters); $values[‘random-alphanum-11’] = implode(‘’, array_slice($alpha_num_letters, 0, 11)); $values[‘random-sha1’] = sha1(rand()); // Create random numbers. $values[‘random-num-1’] = mt_rand(0, 9); $values[‘random-num-3’] = mt_rand(100, 999); $values[‘random-num-10’] = mt_rand(10000, 99999) . mt_rand(10000, 99999); // Create random letters. $letters = range(‘a’, ‘z’); $values[‘random-alpha-1’] = $letters[array_rand($letters, 1)]; shuffle($letters); $values[‘random-alpha-3’] = implode(‘’, array_slice($letters, 0, 3)); shuffle($letters); $values[‘random-alpha-10’] = implode(‘’, array_slice($letters, 0, 10)); // Create a UNIX timestamp token. $time = time(); $tz = variable_get(‘date_default_timezone’, 0); $values[‘site-date-timestamp’] = format_date($time, ‘custom’, ‘Y’, $tz);

    break; case ‘node’: // Node tokens here. break; } return $values; } </code>

Drupal 7.x では、人様に公開可能なモジュールにしようと、少しまじめに作りました。

random_alpha_numeric_token.info name = Random alpha numeric token description = Provides random alpha numeric token such as 'qIyr73xl.' dependencies[] = token core = 7.x

random_alpha_numeric_token.module <?php /**

  • @file
  • Random alpha numeric tokens. *
  • @ingroup token */

/**

  • Implements hook_token_info(). */ function random_alpha_numeric_token_token_info() {

$info[‘tokens’][‘random’][‘alphanum’] = array( ‘name’ => t(‘Alpha numeric’), ‘description’ => t(‘A random alpha numeric string. [random:alphanum:8] means random alpha numeric string of length 8. The possible lengths are 4-32 characters.’), ‘dynamic’ => TRUE, );

return $info; }

/**

  • Implements hook_tokens(). */ function random_alpha_numeric_token_tokens($type, $tokens, array $data = array(), array $options = array()) {

$replacements = array();

if ($type == ‘random’) { // [custom:alphanum:*] dynamic token. if ($hash_tokens = token_find_with_prefix($tokens, ‘alphanum’)) { $alpha_num_letters = str_split(‘1234567890abcdefghijklmnopqrstuvwxyz’); foreach ($hash_tokens as $length => $original) { shuffle($alpha_num_letters); if ($length < 4 || $length > 36) { $length = 8; } $replacements[$original] = implode(‘’, array_slice($alpha_num_letters, 0, $length)); } } }

return $replacements; } </code>

autopath の設定で、node に [random:alphanum:8] とか設定すると、記事を新規に書くたびにランダムな URL が割り当てられます。

WordPress の dbDelta() でテーブルが作成されない

WordPress のプラグインで、独自のDBテーブルを使いたいとき、dbDelta という便利な関数がある。プラグインのバージョンアップの際に、DDL の違いを見分けて、自動的に DBスキーマを更新してくれるという、Rails のマイグレーションみたいなやつだ。

DDL の違いを自動的に見て対応してくれるために、その SQL はルールに従って書く必要がある。 http://codex.wordpress.org/Creating_Tables_with_Plugins によれば、以下の決まりがある。

  • それぞれのフィールドはSQLの別々の行に書くこと
  • PRIMARY KEY という文字列と、主キーの定義の間はスペース2つ分空けること
  • キーワードKEYを使うこと。同義語のINDEXは使えない。少なくとも1つのキーを含めること
  • アポストロフィーやバックティック('や`)でフィールド名を囲まないこと

それだけではない。上記に加えて、SQL のキーワードは大文字で書かなくてはいけない。

ダメだった例 create table wp_xxx ( id bigint not null auto_increment, token varchar(32), payer_id varchar(32), amount int, primary key (id) ) ENGINE=InnoDB DEFAULT CHARSET = utf8;

成功した例 CREATE TABLE xxx ( id bigint NOT NULL AUTO_INCREMENT, token varchar(32), payer_id varchar(32), amount int, UNIQUE KEY id (id) ) ENGINE=InnoDB DEFAULT CHARSET = utf8;

wp-admin/includes/upgrade.php を見ると、大文字しか見ていなかった。SQLは大文字で書くのが標準とはいえ、個人的には小文字で書く方が好きなので、ちょっとはまった。

// Create a tablename index for an array ($cqueries) of queries foreach($queries as $qry) { if (preg_match("|CREATE TABLE ([^ ]*)|", $qry, $matches)) { $cqueries[ trim( $matches[1], '`' ) ] = $qry; $for_update[$matches[1]] = 'Created table '.$matches[1]; } else if (preg_match("|CREATE DATABASE ([^ ]*)|", $qry, $matcs)) { array_unshift($cqueries, $qry); } else if (preg_match("|INSERT INTO ([^ ]*)|", $qry, $matches)) { $iqueries[] = $qry; } else if (preg_match("|UPDATE ([^ ]*)|", $qry, $matches)) { $iqueries[] = $qry; } else { // Unrecognized query type } }

Mac の ssh で Broken Pipe と言われるとき

Mac から AU iPhoneのテザリングを使っていた、よく ssh のセッションが切断されて Broken Pipe とか言われていたのだけど、なんとか我慢できていた。今日、スタバの Wi-Fi を使ったら、めちゃくちゃ短時間で切断されて、作業がはかどらない。

/etc/ssh_config に ServerAliveInterval 30 をつけたら、快適になった。

 Host *
   SendEnv LANG LC_*
# 略
   ServerAliveInterval 30