Tag Archives: php

Gunma.web #7 で喋ってきました『エダカリン!』

 先日のGunma.web #7で発表してきました。
 今回はLTでなく10分程度の発表です。LTじゃないのは初めて。

 テーマはツリーデータの枝刈りで、かなり昔に作成したWebアプリ 実用 R アナグラミング を題材にしてローマ字アナグラミングのデータ構造をいじくりまわすという趣旨です。

 実用 R アナグラミング は、ANIを(アニ|アンイ)の複数読みができないというバグを抱えたまま数年放置していたアプリなのですが、今回Gunma.webの発表機会もあって取り組んでみました。
 今回作成したライブラリは、まだアプリに取り込んでないのでバグは抱えたままです(というか元の作りが悪くて単純なI/Fの差し替えで対応できない)。そのうち差し替えます。

 今回のソースコードはgithubに置いてあります。disってください。

romaji-anagram
https://github.com/ivoryworks/romaji-anagram

 発表後、具体的な処理について質問がいくつかあって、お茶を濁すような形で説明してしまったのですが、詳しくははコード見てください。ごめんなさい。

 それと、これは個人的なポリシーなのですが、今回のスライドにソースコード載せてません。今後も私のスライドにソースコードが載ることはありませんし、(たぶん)これまでも無かったと思います。
 理由はいくつかありますが、一番大きいのはGunma.webが言語に特化した勉強会でないからです。
 今回の題材はPHPで書いていますが、PHPerのプログラマーの方にも非PHPerのプログラマーの方にも非プログラマーの方にも同じくらいのInputになるように心がけています。
 LTだったら1枚のスライドに長くて十数秒しか割けないとか、スライドなのであまり小さな文字は書けないとか、そもそもコードがダメとか小さな理由はいくつもあるのですが、まあそういった事なので今後ともよろしく。

ThinkPadと昔書いたもの

ThinkPad X201来ました(写真手前)。
画面がワイドタイプで、X31と比べてベゼルが幅広なので、箱から出したときに画面小さいなと思ったけど、電源入れてみたら広く感じられるようになりました(実際X31と比べれば解像度高い)。

2003年09月06日のブログ(現存しない、が探したらInternet Archiveにあった)に、プライベートで初めて購入したThinkPad X31の事を書いているので、8年の付き合いというか、職場でもずっとThinkPadなのでThinkPad一筋。

当時も、

Thinkpadはそのストイックな雰囲気がイイ。

と言ってた。
大丈夫、今でもブレてない。

私はトラックポイントがないと死んでしまうので、デスクトップ向けにIBM Space Saver II Keyboard(写真左端)を使用してます。
マウス持ってません。数年前にFPSやるためにワイヤレスマウス買ったのだけど、ゲーム止めたのと同時になくした。

トラックポイントは、作業中にホームポジションを外さずに済むので楽なのです。完全に依存しています。

そう言えば、このキーボードについても記事(これもInternet Archiveにある)を書いていて、日付を見たら2002年08月11日だった。X31買うより後かと思ってたけど前でした。懐かしいなあ。

ThinkPadシリーズと同様に、トラックポイントが付いています。とは言え、普段はマウスを用いているので、トラックポイントの使用率は低いです。

ブレてる!
「トラックポイントいらねえ」みたいな事言ってる。いるよ馬鹿野郎!

それにしても、自分が書いた昔の文章というのは恥ずかしい。なんかドヤ顔だし、憤りを感じる。
(最初はリンク張るのためらったけど、結局懐かしくなって張りました)

ちなみに、このブログのようなものは、私が初めてフルスクラッチで書いたWebプログラムです。試し打ちの初投稿が1999年09月28日でした。ソースコードは残ってないけど見たくないです。日本語より恥ずかしいと思う。

PHP3 + PosgreSQLで組みました。

画像貼れるようにするのに頑張った気がする。

デザインは今は亡きAlt-Rをリスペクトしたような感じというか、要するにパクりましたごめんなさい。たしかあちらはPerlだったと思う。

楽しかったな。

『コトバパレット』リリースのおしらせ

 おまたせしました。できました。『コトバパレット』リリースします。できました。

コトバパレット

 『コトバパレット』は、言葉に応じてカラーパレットを生成するWebアプリです。
 言葉によってはイメージ通りの色になったり、予想外でかつ納得の色になったり、完全にありえない色が出たりしますが、それもこれもご愛嬌ということで。

 このWebアプリは、先日行われたGunma.web #4のLTで紹介したもので、その日の内にリリースする計画だったのですが、サーバで動作しない事がLTの準備段階で発覚し今日の今日までリリース出来ずじまいでいました。

 リリースが遅れた顛末等は別エントリにします。

 まずは遊んでやってください。

『数字混じり文字列ソート』投稿

どう書く?.org』に投稿。

 お題はこちら
 自然順アルゴリズムで配列をソートしてくださいというものです。

 例えば、1.txt, 10.txt, 2.txtであれば、1.txt, 10.txt, 2.txt ではなく、1.txt, 2.txt, 10.txt というように。

 PHPではnatcasesort()という要求そのままの関数が存在するのですが(大文字小文字を区別するならnatsort()です)、この関数はキーの関係を保持してソートするため、キーを持たない配列をソートした場合に期待した結果になりません。

 例えば、

$a = array( ’1.txt’, ’10.txt’, ’2.txt’ );

この配列をnatcasesortすると、

1
2
3
4
5
6
Array
(
    [0] => 1.txt
    [2] => 2.txt
    [1] => 10.txt
)

こうなる。
 foreachで回すならこれで良いのですが、forで回す場合にはソートされていないように見えてしまいます。

 このため、お題の回答は以下にしました。
 第2パラメータを省略またはFALSEを渡せばnatcasesort()と同等、TRUEでキーの関係を保持しない結果となります。

1
2
3
4
5
6
7
8
9
10
function NaturalSort( &$target, $sw = FALSE )
{
  natcasesort( $target );
  if ( $sw ) {
    foreach ( $target as $value ) {
      $buf[] = $value;
    }
    $target = $buf;
  }
}

投稿:
http://ja.doukaku.org/comment/21159/
PHP Rank:10(74.6%)

『文字列で+を表示する』投稿

 『どう書く?.org』連投。
 お題はこちら
 与えられた文字列で十字を描けというもの。

 PHPで書(描)きました。
 ブラウザで出力するなら<pre>タグで括ると良い。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$str = 'abracadabra';

$slen = strlen( $str );
$bar = $str.$str[0];

echo sprintf( "% ".strval($slen*2+1)."s\n", $bar );
for ( $i = 0; $i < $slen-1; $i++ ) {
  echo sprintf( "% ".strval($slen+1)."s% ".strval($slen)."s\n",
          $str[$slen-$i-1], $str[$i+1] );
}
echo sprintf( "%s% ".strval($slen*2)."s\n", $bar, $bar );
for ( $i = 0; $i < $slen-1; $i++ ) {
  echo sprintf( "%s% ".strval($slen*3)."s\n",
          $str[$slen-$i-1], $str[$i+1] );
}
echo sprintf( "%s% ".strval($slen*2)."s\n", $bar, $bar );
for ( $i = 0; $i < $slen-1; $i++ ) {
  echo sprintf( "% ".strval($slen+1)."s% ".strval($slen)."s\n",
          $str[$slen-$i-1], $str[$i+1] );
}
echo sprintf( "% ".strval($slen*2+1)."s\n", $bar);

 $strに任意の文字列を設定すれば、それに応じた十字が描かれる。
 関数化できる箇所があるけど、わかりやすさ優先でわざと同じものを書いている。
 仕様として、文字列は半角英数字2文字以上とする。ガードは入れてない。

 文字列’abc’の場合以下の結果となる。

1
2
3
4
5
6
7
8
9
10
   abca
   c  b
   b  c
abca  abca
c        b
b        c
abca  abca
   c  b
   b  c
   abca

投稿:
http://ja.doukaku.org/comment/11244/
PHP Rank:16(61.6%)

 どう書く.orgへのスパム何とかしてほしい。

『階層的なキーの連想配列化』投稿

 『どう書く?.org』への投稿ひさびさ。

 お題はこちら
 今回は与えられたテーブルを元に階層的な連送配列を作りなさいというもの。
 配列を&で渡しているのがポイント。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$tokyo = array(
    array('東京都', '区部', '千代田区', 'object1')
    ,array('東京都', '区部', '中央区', 'object2')
    ,array('東京都', '区部', '港区', 'object3')
    ,array('東京都', '多摩地域', '支部', '昭島市', 'object4')
    ,array('東京都', '多摩地域', '支部', 'あきる野市', 'object5')
    ,array('東京都', '多摩地域', '西多摩郡', '奥多摩町', 'object6')
    ,array('東京都', '島嶼部', '大島支庁', '大島町', 'object7')
    ,array('東京都', '島嶼部', '三宅支庁', '三宅村', 'object8')
    );

$tokyo_tree = array();

foreach ( $tokyo as $obs ) {
  $w = &$tokyo_tree;
  $cnt = count( $obs );
  for ( $i = 0; $i < $cnt; $i++ ) {
    if ( $i == $cnt-1 ) {
      $w = $obs[$i];
    }
    else {
      $w = &$w[$obs[$i]];
    }
  }
}

print_r( $tokyo_tree );

結果はこんなかんじ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Array
(
  [東京都] => Array
    (
      [区部] => Array
        (
          [千代田区] => object1
          [中央区] => object2
          [港区] => object3
        )
 
      [多摩地域] => Array
        (
          [支部] => Array
            (
              [昭島市] => object4
              [あきる野市] => object5
            )
 
          [西多摩郡] => Array
            (
              [奥多摩町] => object6
            )
 
        )
 
      [島嶼部] => Array
        (
          [大島支庁] => Array
            (
              [大島町] => object7
            )
 
          [三宅支庁] => Array
            (
              [三宅村] => object8
            )
 
        )
 
    )
 
)

投稿:
http://ja.doukaku.org/comment/10876/
PHP Rank:17(61.1%)

スタパクラウドとアナグラミングが早くなったはず

 先日からちょっとずつコンテンツを新しいサーバに移行しています。

スタパクラウド

実用 R アナグラミング

以前から、早く動くようにスクリプト組みなおしたいなと考えていたけど、ハードで早くなりました。

 

『clipamz』Amazonの新APIに(やっと)対応

 やっと対応した。

Amazon アソシエイト Web サービスの名称変更および署名認証についてのお知らせ
http://developer.amazonwebservices.com/connect/ann.jspa?annID=442
 だいぶ昔、
「そのうちAPIの仕様が変わるよ。署名必要になるよ。対応しておいてよね」
とアナウンスあったのだが完全に忘れていて、先日clipamzのブックマークレット使ったとき商品情報が取れなくて気づいた。
 いっそのこと、もっと高機能で有名なサービスに乗り換えるかと思ったが、せっかく作ったのでメンテして使っていこうと思い直した。
 新APIの対応は以下サイトが再考になった。
 非常に簡潔に書かれていて短時間で作業は完了した。感謝。
Amazon Product Advertising API への対応(PHP版)
http://d.hatena.ne.jp/p4life/20090510/1241954889
 clipamz、公開しようかと思っていたけどプライベートツールとして収まる雰囲気。
 もし公開するなら吐き出されるリンクスタイルなどをもう一度考え直したいが、今、その意気込みがない。
clipamz.jpg
篠原 稔和/ウェブ・ユーザビリティ研究会
オライリー・ジャパン (2004/04/24)

『IPv4アドレスのマスクの変換』投稿

どう書く?.org』への投稿

お題:IPv4アドレスのマスクの変換
http://ja.doukaku.org/253/
 ようするに、「255.255.255.128」を「25」にしたり、「24」を「255.255.255.0」にしてくださいという問題。
 特に面白い事はしていない。

function mask2bits($ddn_str)
{
    $bits = 0;
    $decs = explode(‘.’, $ddn_str);
    foreach ( $decs as $dec ) {
        $bits += substr_count(decbin($dec), ’1′);
    }
    return $bits;
}

function bits2mask($bits)
{
    $bits_str = strrev(sprintf(‘%032s’, str_repeat(“1″, $bits)));
    $bins = str_split($bits_str, 8);
    foreach ($bins as $bin) {
        $decs[] = bindec($bin);
    }
    return implode(‘.’, $decs);
}

投稿:
PHP rank:17(63.0%)

Zaurus SL-C760でPHP

 いまさら感満点のエントリだけど。

 Zaurus SL-C760。
 「もうしばらく使うことはないだろう」といつも思うのだけど、出張の度に(なんとなく)持ち出しているのでかなり息の長いハードウェア。
 しばらく前にpdaXromなど入れて遊んだが、再びQt環境に戻している。
 今回は、PHPの開発環境を作ろうとして、ApacheとPHP5のインストールを行った。
 特に作業内容は書かない。リンクだけ(MySQLについては今回まだ導入していないのだが参考になりそうなコンテンツリンクを記述しておく)。
■Apache 1.3.33
LinuxZaurus向けビルド/Apache+mod_perl
http://tbox.jpn.org/wiki/linuzau/wiki.cgi?LinuxZaurus%b8%fe%a4%b1%a5%d3%a5%eb%a5%c9%2fApache%2bmod_perl
Linuxザウルス/Apache
http://digit.que.ne.jp/visit/index.cgi?Linux%A5%B6%A5%A6%A5%EB%A5%B9%2FApache
■PHP
ほとんど他人の褌 ~開発環境いろいろ~
http://www.geocities.jp/zautale/DevelopTool/
PHP Documentation (* html版マニュアル)
http://www.php.net/docs.php
■MySQL
ZaurusSL-C3000/初期設定/ハードの設定と初期インストールその5 – apache+PHP+MySQLでデータベースを動かす
http://hpcgi1.nifty.com/spen/index.cgi?ZaurusSL%2dC3000%2f%bd%e9%b4%fc%c0%df%c4%ea%2f%a5%cf%a1%bc%a5%c9%a4%ce%c0%df%c4%ea%a4%c8%bd%e9%b4%fc%a5%a4%a5%f3%a5%b9%a5%c8%a1%bc%a5%eb%a4%bd%a4%ce5
■term (qpe-embeddedkonsole-ja)
いとしのliza
http://kimux.org/liza/
■Opera 7.25
SL-Zaurusで動作するOpera(日本語入力可)のダウンロード先
http://zaufan.net/modules/bwiki/index.php?%CC%F2%CE%A9%A4%C1%A4%BD%A4%A6%A4%CAZaurus%B4%D8%CF%A2%A4%CE%BB%F1%CE%C1%A5%EA%A5%F3%A5%AF%BD%B8#x1c839e1