2011年08月29日

[jQuery] IE8で$(’<タグ/>’)の閉じスラッシュを省略して不具合

jQueryで謎挙動が出たのでメモっときます。

ずっと、律儀に '<div />' の閉じスラッシュを付けて宣言していたのですが
$('<div />').text('てきすとてきすと')
直近プロジェクトで以下のように省略するようにしてから
$('<div>').text('テキストテキスト')
IE8 で後のtextメソッドが反映されないという現象に遭遇しました

再現せず

最新版である同バージョンのjQuery-1.6.2で別に環境を作って試してみましたが、再現しませんでした、無念
プロジェクト環境だと再現しているのですが・・・

結論

とりあえずは、$('<div />') の書き方に戻すことにして終了しました

原因? DOM関係は追っても不毛なので追いません! ・・・という言い訳

2011年08月14日

[Shell] $(cd $(dirname $0) && pwd) を理解する

CURRENT=$(cd $(dirname $0) && pwd) とは

これは CURRENT変数へスクリプトファイルのカレントディレクトリを格納する
シェルスクリプトのお便利ワンライナーです
#!/bin/sh
CURRENT=$(cd $(dirname $0) && pwd)
 
echo $CURRENT # -> どこから実行してもファイルの場所を返す

しかし、意味不明

最近これを知って便利に使っているんですが、自分のShellScrpit力の低さから理解不能でした
ということで、勉強することにしました

各要素の解説

特殊変数や記法などの整理です
$0 = スクリプトファイル名が入る
dirname 引数 = 引数文字列のディレクトリ部分だけを返す
&& = 左辺のコマンドがステータス0の正常終了なら右辺も実行する
$() = プログラミングの (式) と同じように式の分離や実行順序を明示するものみたい
pwd = カレントディレクトリを返す、説明不要だと思いますが

実行順序

こうみたいです
「cd でスクリプト設置場所へ移動した後に pwd でその場所を返している」というロジック
dirname $0
 ↓
cd $(dirname $0)
 ↓
cd $(dirname $0) && pwd
 ↓
CURRENT=$(cd $(dirname $0) && pwd)

疑問点

なんで cd をしているのにディレクトリが移動しないのでしょうか?

$( ~ ) 書式によるものっぽいのですが、これがわからないです。
解説サイトを絶賛募集中!

追記:$() は `(バッククォート)と同じでした

@paselaさんにご教授賜りました
以下、コメントの抜粋、詳細はコメント欄を参照願います
$(〜)はコマンド置換の構文。`〜`(バッククォート)と同じ。
バッククォートはエスケープとか入れ子がややこしくなるので普通は使わない。
コマンド置換はサブシェルで実行されるので、元の環境には影響を与えない。

2011年08月07日

[Python] 再帰的にdictをwalkする関数

「自分の子リストを持つdictデータ」を再帰的に評価したかった

例えば以下のようなデータを
adict = {
    'name': u'波平',
    'children': [
        {
            'name': u'サザエ',
            'children':[{'name':u'タラオ', 'children':[]}],
        },
        {'name': u'カツオ', 'children':[]},
        {'name': u'ワカメ', 'children':[]},
    ]
}
こんな風に操作したいなと思いました
for child in 関数(adict):
    print child['name'] # -> u'波平' から順次表示 

walk_dict関数を作ったけど

というわけで、walk_dict(adict, children_key) という関数を作りました
http://kjirou.net/main/public/py/beginning_scripts/snippets/walk_dict.py

・・・と、要件は満たせたんですが、何か変
for i in walk_dict(child, children_key):
    yield i
のところを、generatorを解除するのに1回しか回らんループをしてるのが特に変?

ということで

「○○モジュール使えばいいんじゃないの?お馬鹿なの?」
という、身も蓋もない意見を絶賛募集中です!

後、ついでにも程がありますが、JavaScriptでも同じような関数を募集中です!!

別解を貰った

@kenji4569 さんから別解を貰ったので、元解答と両方さらしておきます
# 自分
def walk_dict(adict, children_key):
    yield adict
    for child in adict[children_key]:
        for i in walk_dict(child, children_key):
            yield i
 
# @kenji4569 さん
def walk_dict(adict, children_key):
    from itertools import chain
    return chain([adict], *[walk_dict(child, children_key) for child in adict[children_key]])

JavaScript版

アルゴリズムは一緒です、JSに書き起こしただけ
イテレーターにはなってません
function walkObject(obj, childrenKey) {
    var sequence = [];
    sequence.push(obj);
    var children = obj[childrenKey];
    for (var i = 0; i < children.length; i++) {
        var child = children[i];
        sequence = sequence.concat(arguments.callee(child, childrenKey));
    };
    return sequence;
};

2011年07月10日

[Python] Decimal型とfloat型は比較出来ない

Decimalとint型の比較は成立しますが
>>> from decimal import Decimal
>>> Decimal('1.0') > 2
False
>>> Decimal('1.0') > 0
True
Decimalと浮動小数点型の比較は成立しませんでした
>>> from decimal import Decimal
>>> Decimal('1.0') > 2.0
True # ありゃりゃ
>>> Decimal('1.0') > 0.0
True
>>> float(Decimal('1.0')) > 2.0
False # キャストすれば比較可能
何でこうなのかは調べませんが
挙動はとりあえずこうでした

マニュアル: 10.4. decimal — 10進固定及び浮動小数点数の算術演算
http://www.python.jp/doc/release/library/decimal.html#module-decimal

追記: 2.7と3.2では改善されているようです

http://docs.python.org/whatsnew/2.7.html#new-and-improved-modules
http://docs.python.org/py3k/whatsnew/3.2.html#decimal-and-fractions

なお、自分の環境は Python-2.5.2 でした
コメント下さった方、ありがとうございました!

2011年06月19日

findコマンドの論理演算子を復習

findコマンドは、-type f や -name 'hoge' などの様々な条件を使うことが出来ますが
加えて AND や OR や NOT の論理演算子も使うことができます

今までテキトーに使ってたので復習しました

AND文

AND文は評価式を -and または -a で結合します

まず、動作確認用に以下のようにファイルを配置します
$ tree
.
|-- dark-chaos
|-- dark-neutral
|-- dark-row
|-- light-chaos
|-- light-neutral
|-- light-row
|-- neutral-chaos
|-- neutral-neutral
`-- neutral-row

動作確認してみましょう
$ find . -name '*light*' -and -name '*row*'
./light-row
ファイル名に 'light' が含まれており、かつ、'row' が含まれている 'lignt-row' ファイルがヒットしました

書式は以下のように
$ find <検索基底ディレクトリパス> <評価式1> <論理演算子1> <評価式2> [<論理演算子2> <評価式3> ... ]
いわゆるプログラミング言語のif文と同じような書き方です

ただし
$find . -name '*light*' -name '*row*'
./light-row
上記のように、ANDの場合は論理演算子を省略して書くことも出来ます
ググって出てくるサンプルなどは大抵こちらの記法で書いてあるので注意が必要です

OR文

OR文は -or または -o で評価式を結合します
$find . -name '*light*' -or -name '*row*'
./dark-row
./light-row
./neutral-row
./light-chaos
'lignt' または 'row' を含むファイルがヒットします

NOT文

NOT文は -not または ! (半角エクスクラメーション) を評価式の前に挿入します
$find . -not -name '*light*'
.
./neutral-chaos
./dark-row
./dark-chaos
./neutral-neutral
./neutral-row
./dark-neutral
'light' を含まないファイルがヒットします

細かい動作確認

NOT文をつなげる場合を一応書いてみます
まぁ「評価式の前に置く」という基本ルール通りでした

$find . -name '*row*' -and -not -name '*neutral*'
./dark-row
./light-row

今度は、ANDとORの優先順位の確認をしてみます
$find . -name '*light*' -or -name '*dark*' -and -name '*neutral*'
./light-row
./light-neutral
./light-chaos
./dark-neutral
'a OR b AND c' と OR を AND の前に書きましたが、
ちゃんとAND文が優先されて 'a OR (b AND c)' という評価順序になっています

.svnを除くディレクトリ全てを権限変更するサンプル

ということで、実践編
.svnディレクトリ以外の権限を変更するコマンドです
$ find /path/to/dir -type d -and -not -path '*.svn*' | xargs chmod 0777
※評価式 -type d は、ディレクトリのみをマッチします
※評価式 -path '*.svn*' は、'.svn' 文字列を含むパスを持つファイルのみをマッチします
 なお、-name の場合はファイル*名*のみ検索対象にします

'*' はzshの補完のそれと違う意味

find の場合は '*abc*' は「'abc' が含まれていること」を意味します
zsh の補完は '*abc*' は「'abc' とその前後に1文字以上の何かが含まれていること」を意味します
例えば、zshで
$ ls row*
で先のディレクトリを補完しても何もでませんが、以下なら出ます
$ls *row                        
dark-row  light-row  neutral-row
これは * が「1文字以上」を意味するもので「0文字以上」ではないためです

参考リンク

UNIXの部屋 コマンド検索: find ファイルを検索する。
http://x68000.q-e-d.net/~68user/unix/pickup?find

指定DIR以下の'.svn'以下を全部削除するコマンド
http://kjirou.sakura.ne.jp/mt/2008/01/dirsvn.html

2011年06月08日

Titanium MobileでiPhoneアプリをリリースした

Titanium Mobile で開発したiPhoneアプリを公開しました。

就職活動生向けの

学歴早見表!ES・履歴書簡単作成!「会社なび/就職活動」の就活シリーズ!

という、学歴早見表アプリです。

10日間で申請まで完了

今回、Xcode4がインストールされてるだけのMacを渡されてから
10日間でiPhoneアプリ申請までを完了することが出来ました

工数の内訳は以下です。
  • 1日 = Macの操作がわからない、慣れない(Macで作業するのが初めて)
  • 1日 = Titanium Developerインストールと開発環境構築(zsh/vim/screen程度)
  • 1日 = アプリ設計、プログラム設計
  • 4.5日 = 実装(大半はAPIの調査)
  • 0.5日 = iPhone実機へテストアプリをインストール(若干ハマった・・・)
  • 1日 = 公開申請関連(アイコン・詳細文などのコンテンツを揃えて申請作業)
  • 1日 = 引継ぎのために手順や成果物についてのドキュメント作成
※objective-Cは全くわからん
※JavaScriptについては、ある程度は熟練している
※iPhoneアプリのディレクション経験は有る
※Android版は・・・設計時には組み込んでましたが、時間切れでした・・・。

内訳からわかるように、(超簡単なアプリだからですが)実装にはほとんど時間は掛かっていません。
かつ、実装時間の内の大半は調査時間なので、次はほぼ必要なくなるものです。

Titanium Mobile を選択する場合に気を付ける点

プログラマ向けではなく、ディレクター・PM・営業さんなどへ向けた話です。
(実装する人向けには、もっと良い記事が沢山ありますので!)

第1に、iPhoneアプリとして自然なUIにならないこともあります。
いや、ハッキリ言うと、3日以上実装に掛かるようなアプリだとどこかしら不自然になります。
技術的な話ですが、今回のようなミニマムアプリでも Stand Alone な Window に NavBar を付けられなくて諦めたり(後でブログで発見したけど)、TabBar は不要なんだけどそれが無いと使えない機能があったりするので無理矢理付ける形にしたり、Date Picker が日本語対応してないので諦めたり、など、UIで妥協した点が何点か出てきました。

第2に、Titanium Mobile の開発体制が不安です。
これも技術的な話ですが、デバッグプリントが動かなかったり、ビルドが何故か失敗したり(大抵もう一回ボタンを押すと直る)、クリーンビルドが必要になったり、シミュレーターが終了しなくなったりなど、今のところは影響は少ないですが、とにかく不安です。
「Xcodeを更新したらTitanium Developerも更新しないといけなくなって、そうしたら今のソースがビルドできなくなった」は充分に考えられます。

第3に、Android側も対応工数が必要です。
「iPhone側が出来たらAndroid側もボタン押せば出来ますよ」とかエンジニアが言ってても信じてはいけません。絶対無理です。だって、マーケットへのリンクを張るだけでも条件分岐が必要になりますよ。
テスト工数についても、実機検証が必要になるため、単純にx2 する以上はコストが必要になるはずです。

ということで、現状は過信は禁物で、受託案件で使うなら、少なくともUIにはうるさくないクライアントの場合に使うことをオススメします。
ここをおろそかにすると、「Titanium Mobile で頑張ったけど結局要望は実現できず、objective-C で作り直し」という最悪のシナリオになってしまうかもしれません。

じゃあ使えないの?

いいええ、JavaScriptでこの短期間にiPhoneアプリが作れたってだけでも充分利用価値はあります。
一般人に理解できるUIでちゃんと動きますしね、ショボいけど。

出来に不満な人は多いと思いますが、「UI勝負のアプリ」って特殊なアプリ(Twitterクライアントとかサービス自体の勝負じゃなくなってるモノとか)なので、大抵のアプリは上手く回避すれば問題無いんじゃないすかねー。

少なくとも、自分がiPhoneアプリを作る場合は、まずは Titanium Mobile から検討します。

ドキュメント

引継ぎ用に作った資料ですが、外部公開しているのでリンクを置いておきます。

Titanium Mobile 全般
iPhoneアプリ申請について

これから申請方法を含めて学びたい って人には調度いいかも!

2011年06月04日

退職のご挨拶

2011年6月3日を最終出社日として、株式会社エスキュービズムを退職いたします。

今後は、フリーランス、というよりは、
WebサービスやWebに限らないサービスの企画開発運営を主業務として、
食っていける道を模索します。
まずは、サービスで月収100万円を稼ぐ体勢を作ることが目標です。

「Webサービスを一人で作れるようになりたい!」と
社員数一桁台の小さな会社を探して入社しましたが、
予想に反して、会社が10人20人50人100人と、どんどん大きくなる中で、
他では得られないであろう、貴重な経験を数多く得ました。
いやもう本当に、お金稼ぐのって難しいなー、って何度も思いました
「経費を使わないと損だから使っちゃえ」とか、絶対に考えられなくなりましたヨ

当初予定していた、サービスを 0 から 1 にする力は勿論のこと、
おそらくは 1 から 3 にする力も得ることができ、自分にとっては大成功プロジェクトと言えます。
(・・・10にする力には今一歩、いや今二歩及びませんでしたがっ!)

正直、3年半も居る予定では無かったのですが、
みんな仲良くしてくれるので、居心地が良くてつい長居してしまいました。
最近は女性も増えたしなぁ・・・

まぁでも、武器は揃ったので、そろそろ世間様と勝負ですね!

ということで、改めて

Hello, world !

2011年06月02日

JavaScriptで西暦の年号変換と満年齢計算

西暦の年号変換 = 西暦1999年 を 平成11年 へ変換する
参考) 和暦西暦対応表(明治以降)

満年齢計算 = ある日に生まれた人はある日に満何歳か
参考) 満年齢 - Wikipedia

・・・という話を、JSで関数化して ↓ へ置きました。
西暦の年号変換や年齢計算
※関数はソースを見て下さい

宜しければ参考にして下さい。
西暦年号変換なんか、単にマッピングしてるだけですが・・・。

2011年05月26日

JavaScriptのDateで気をつけるべき2点

1. date.getDayは曜日を返す

getDay は曜日を 0(日曜)-6(土曜) の数値で返します。
日付を取得したい場合は getDate を使います。
new Date(2011, 4, 26).getDay(); // -> 4 (木曜)
new Date(2011, 4, 26).getDate(); // -> 26 (26日)

2. 月は 0(1月)-11(12月) で表現

new Date(year, month, day) の時や getMonth で取得できる値ですが
1スタートではなく、0スタートです。
new Date(2011, 1, 1); // -> 2011/02/01 です

以上

お気をつけを!

2011年04月25日

[PR] JSゲームをmixiアプリ化しました

先日プロモーション用に作成しました、
就活生をターゲットにしたJSゲームを mixiアプリ化 しました。

あんまり変わってないですけど、
良かったらインスコして見て下さい。

にょろしくっす。

Ref)
JavaScriptでゲーム作った
会社なび/就職活動

それにしても

このサイトが就活生の目に止まる可能性はあるんだろうか・・・。

追記: オススメられた!

ひゃっほう!

ma-ms-osusume
ma-ms-osusume posted by (C)kjirou

・・・インストール数少ないけど、ひゃっほぉぉぉう!!

※既にインストール済みの心暖かい方へは表示されません。

あわせて読みたい

あわせて読みたい