<< Prev Page Next Page >>

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


楽に書きたくて難しくなる

もうね、早く仕事終わらせたいんです。
書くプログラムを少しでも少なくしたいんです。

だから、

var books = [];
books.push(new Book('姑獲鳥の夏'));
books.push(new Book('すべてがFになる'));
books.push(new Book('クビキリサイクル'));
books.push(new Book('六枚のとんかつ'));
books.push(new Book('QED 百人一首の呪'));

みたいなことをしなきゃいけないとき、
var books = $.map(['姑獲鳥の夏',
'すべてがFになる',
'クビキリサイクル',
'六枚のとんかつ',
'QED 百人一首の呪'],
function(n) {
return new Book(n);
});

って書くんです。ほら、メンテナンスも配列の中身を変えるだけだから楽チンだよ。

でもこういうの嫌われる。わかってるんです。

いつも自分で「ソースコードに独創性とかいらないから。没個性に、普通に、だいたい世の中で一般的とされる書き方をしてください」って言ってるくせにこれはなんだ、と。

でもこれぐらいもう今となっては普通じゃない?"世の中の一般"のほうが進んでいってるんだからこの程度当たり前に通じたってよくない?

独創性とか自己満足のオナニーのためにしてるんじゃないんだよ、こっちのほうが書くのもあとで変更するのも楽だからこうしてるんだよ、みんなもっと楽をしようよ。

いにしえの時代のperlの呪文とかとは全然違うよ(増やさなくてもいい敵を増やす)。

問題:仲間はずれはどれでしょう。


強い精神力が無いため強い精神力を持つコンピュータに頼る

我こそは「強い精神力」を持っているというみなさん、ぜひこの問題に挑戦して頂きたい。 「強い精神力」を持っている人なら解読できる暗号問題 | ロケットニュース24
暗号文は以下。
7H15 M3554G3 53RV35 7O PR0V3 H0W 0UR M1ND5 C4N D0 4M4Z1NG 7H1NG5! 1MPR3551V3 7H1NG5! 1N 7H3 B3G1NN1NG 17 WA5 H4RD BU7 N0W, 0N 7H15 LIN3 Y0UR M1ND 1S R34D1NG 17 4U70M471C4LLY W17H0U7 3V3N 7H1NK1NG 4B0U7 17, B3 PROUD! 0NLY C3R741N P30PL3 C4N R3AD 7H15. R3 P057 1F U C4N R34D 7H15.
読み方はわかったが、精神力が弱いためこれをすらすら読むことができない!という僕のために、精神力無限大のコンピュータさんにやってもらうようにした。


dankogaiさんにやられる前にな。


はてブボタンのオプトアウト対策をしました

最近話題のはてブボタンのトラッキング問題で、オプトアウト対策しました。一応プログラミングとかのことを載せてるブログとしては。流行に乗る感じで。

はてなブックマークボタンは2011年9月1日より行動情報の取得をしている - ARTIFACT@ハテナ系

はてブのトラッキング問題で、はてなはアドバンテージを失った - 萌え理論Blog

はてなブックマークボタンのトラッキング問題で高木浩光先生が決別ツイートをするに至った経緯まとめ - NAVER まとめ

はてなブックマークボタン(この記事の上下にも表示されてるB!マーク)は表示するだけでマイクロアドにトラッキングデータを提供しちゃってるぞ許せねえ!という話題です。

そしてこのNAVERまとめも表示しただけでマイクロアドにがんがんデータ送信されちゃってるというこれは皮肉?

広告の仕組み

マイクロアドって会社はユーザの行動追跡データを元に効率よく広告を表示するサービスをやっている。その仕組みはこう:

  1. パートナーサイトでマイクロアドのjsファイルを読み込んでもらう
  2. マイクロアドはCookieごとにIDを発行して、jsファイルが読み込まれるたびにそのIDと表示したサイトを関連づける
  3. これを続けていくと各個人ごとに「にちゃんまとめと日経BPと○○さんのはてダをよく見ている人」とか「○○系のエロサイトと××系のエロサイトを毎日巡回している特殊性癖の人」というふうにWeb閲覧傾向を収集することができる
  4. マイクロアドで広告を表示するサイトでは、その人のWeb閲覧傾向に沿った広告を選択的に表示できるためクリック率が上がってアフィサイトも広告主も嬉しい

マイクロアドは広告屋さんなので、収集した情報から個人を特定するような使い方は(たとえばはてダの管理画面とかはURLにユーザ名が入ってたりするので技術的には可能だけど)多分していないでしょう。(法律違反が怖いから)

なにがいけないのか

このマイクロアドの仕組み自体が悪いってわけじゃないんです。各大手パートナーサイトはちゃーんと「プライバシーポリシー」っていう誰も読まない文書を公開して、閲覧履歴を広告に使うことをちっちゃく明記しているから合法です。

それでもなんか気持ち悪いという人のためにオプトアウトの方法も目立たないように公開されています。
MicroAdの広告をご覧のお客様へ←ここへ行って「オプトアウト」ボタンをクリックすると収集されなくなるそうです。とりあえず僕はクリックしました。

でもこの「とっくりばー」は?そんなプライバシーポリシーの文書なんてありませんよ?ほとんどのブログにはそんなものないでしょう。

僕がしたことははてなブックマークボタンを設置しただけです。マイクロアドのパートナーサイトになった覚えはありません。

また、はてなブックマークボタンのプライバシーポリシーに同意したのは僕です。実際に行動追跡データを送信されてしまうこのブログの読者ではありません。

しかも以前ははてブボタンを表示しただけでマイクロアドに行動追跡データを送信されるなんてこと、はてブボタンの文書には一言も書いてなかったそうです。そんな機能ついてなかったから。(まあ僕は知らなかったけど!)後出しなのがひどい。

当然、はてブボタン経由でマイクロアドへ行動追跡データが送られて、なにがしかの利益(直接お金でなくても)がマイクロアドからはてなに支払われるんでしょうが、そんなのおかしいよ!だって僕のブログの閲覧履歴を提供してるのになんではてなが儲かるの。いや、このブログのPV数がどうのという話じゃなく。そらまあすんごく少ないわけだけど。

というわけでオプトアウト

といったわけで、ちゃんとこちらのサイトの案内にしたがって、オプトアウト版のはてブボタンを設置しました。マイクロアドへのアクセスが行ってないことも確認しました。
はてなブックマークボタンの作成・設置について

追記

はてなが対応してくれたようです。結局マイクロアドへの送信を全部やめる、と(つまり僕の作業が無駄になりました)。近藤社長名義での平謝りの文章です。はてならしいフランクさです。

ブックマークボタン本来の目的は、「ブックマーク数が分かる」ことと、「簡単にブックマークできる」ことです。このボタンの表示から得た訪問者の行動情報を第三者に提供することは、ボタン本来の目的から考えて間違った情報の使い方でした。
はてなブックマークボタンから収集した行動情報の第三者提供をやめます

それにしてもかさにかかってさらに叩く人の多いこと多いこと。落ちたものをさらに叩くのはマスゴミにかぎったことじゃないようです。


PHPでコンストラクタが何度でも呼べる件

あ…ありのまま 今 起こった事を話すぜ!
「PHPでコンストラクタ何回も呼べた」
な… 何を言ってるのか わからねーと思うが おれも何をされたのかわからなかった

新しく入ってきた子に教えてたんですよ。で、
「このコンストラクタってなんのためにあるんですか。普通の関数と何が違うんですか」
と聞かれたんで(なかなか賢い有望な子です)、たぶんいろんな理由でこの仕様が生まれたんだろうけど、僕が思うに一番便利というかこれがないと困るっていうのは、やっぱりコンストラクタ引数を利用してImmutableなオブジェクトを作れるっていうことかな。たとえば、


class MyClass {
private $name;
function __construct($name) {
$this->name = $name;
}

function getName() {
return $this->name;
}
}
こういうクラスを作ると、このクラスは生成-初期化時にname変数が設定された後は二度とnameを変えられないので、Immutable(変更できない)って呼ばれるんだよ。こういうクラスは他のソースコードから取り扱いが簡単になるので設計の複雑さを多少軽減する効果があるんだ。

と、教えていたのです。で、「じゃあ実演してみるね」と軽快に実行コードを作って

$a = new MyClass("Alice");
echo $a->getName(), "\n";
$a->__construct("Bob2");
echo $a->getName(), "\n";
「まさかこんな書き方はできないわけでさ」と言いながらッターン!とF5(実行)キーをタイプしたんです。

Alice
Bob

は?エラーじゃないの?

頭がどうにかなりそうだった…

おそろしいなPHP!まさかそういうことになってるとはな!PHPには色々驚かされてきたけれど、これもかなりの大ネタだったな!

コンストラクタってただの関数みたい。ただちょっとnewのときに自動で呼ばれるってだけで、あとは他の関数と何も変わらないよ。

っていうのは嘘で、こういう呼び方できるけど、うちの社内では絶対やっちゃダメだからね。絶対だよ!と教えましたとさ。


じわじわと

タグの閉じ忘れをチェックするブックマークレットが便利。 - バニデザノート
タグの閉じ忘れチェックブックマークレットのはてブ数が増えていっているようで、便利なものつくっとくと放っておいても誰かが見つけるらしいという知見が得られています。

どうもご紹介ありがとうございます。
ブラウザのバージョンが上がっていくなかでどこで使えなくなるかヒヤヒヤしながらも、将来使えなくなっても直す気はあまりないという放置状態ですが、ユーザが多ければソースコードを勝手に変更して公開してくれる人も現れるはずと期待している他人本願。がんばれインターネッツ!

(追記2011/12/9)いまごろ気がついたChrome拡張機能としてリメイクされている、すごいぞインターネッツ。
HTMLタグの閉じ忘れをチェックするChrome拡張機能を作ってみた


jQueryイディオム:テーブルの行クリックでチェックボックスにチェック入れる

行ごとクリッカブルにするというのをもう少し改善?してみました。全然知らない人にツッコミいれてすみません。はてブで新着に出てたのでつい。

jQueryでテーブルの行ごとクリックして チェックボックスにチェック出来るよう にするTipsです。ユーザーがデータを 見ながらフォームを送信する際に、分か りやすくしてあげよう、という目的です。 行ごとクリッカブルにする、みたいな感じ。 jQueryでテーブルの行ごとクリックしてチェックボックスにチェックを入れられるようにする - かちびと. net
Chrome Google提供の高速ブラウザ。エクステンション豊富。 ★★★★★
Firefox 人気の火狐。アドオンが魅力的過ぎ ★★★★★
Safari Mac標準。iPhoneの登場でシェアは伸びるのか? ★★★★☆
Opera 目立たないけど実は高性能。もうちょい人気出てもいい ★★★★☆

改善点は以下です。

  • 「find()」メソッドと「:checkbox」セレクタ便利
  • 「hover(over,out)」メソッド便利
  • チェックボックスをクリックしてもちゃんと選択できるよ
  • どうせなので選択状態を行全体の色で表現

こういうスクリプトと

$(function() {
  $('.data tr').hover(function() {
    $(this).addClass('hover_tr');
  }, function() {
    $(this).removeClass('hover_tr');
  }).click(function(evt) {
    var $t = $(this);
    var chk = $t.find(':checkbox')[0];
    if (evt.target != chk) {
      chk.checked = !chk.checked;
    }
    if (chk.checked) {
      $t.addClass('checked_tr');
    } else {
      $t.removeClass('checked_tr');
    }
  });
});

こういうスタイルシートで実現しています。

.main_txt .data {
  border-collapse: collapse;
}
.main_txt .data td {
  border:1px solid black;
  padding: 4px 10px;
}
.main_txt .data .hover_tr td {
  background-color: #f0f0f0;
  color: #333;
}
.main_txt .data .checked_tr td {
  background-color: #0033aa;
  color: white;
  border:1px solid white;
}

いじょ!


プログラマとしてマシになるのに大事なこと

プログラマとしてやっていく(やっていかせる)ことについて、いつも考えてるけど難しいんだよね。

ただ、その中で、ひとつ変わらない大事なことがあります。

プログラマにとって大事なことは「プログラムが組めること」です。

言語を含めて、ツールが使えることが大事というわけではないということです。ライブラリのありかや使い方などを知っていることは大事ではありません。

もちろん、少なくともひとつの言語がちゃんと使えることは大前提です。
プログラマになるための勉強をしている人の前で話をしてきた - きしだのはてな
プログラマとしてやっていくのに大切なことってなんだろう。

逆に、何がないとプログラマとしてやっていけないんだろうと考えてみる。

ていうか、プログラマとしてやっていくってどういう状態を指すことにしようかと戻ってみる。

面倒になって終了…いやそうじゃなくって。


プログラマとしてやっていく、じゃなくて、もうちっとマシなプログラマになるにはどうしたらいいのか。何がないとマシになれないのか。という事を書いてみよう。

やっぱり勉強だよね。それも学ぶ技術が超必要。

学ぶ技術、とは、「学びたいのです。先生、教えてください。」とするのも本質的なところではそうなんだろうけど、もっと小手先の所でいくと、どこかからパクった技術を再構築して自分の知識体系の中に矛盾なく取り込むことだと思う。

プログラマの仕事は毎日毎日、知らないことやったことないことを調べたり考えたりしてどうにかこうにか解決したりしなかったりパクったり諦めたりの繰り返し。問題はそのパクりでもなんでもいいんだけど、解決を「学び」に直結できるか。

解決=学びにできるなら、解決のスピードが速くなればたくさんの問題を解決できてたくさん学べてもっとマシになる。たくさん知ればよりたくさんの問題を発見できてより深く学べるから知識は雪だるま式に増えていく。

そして、一つの問題を解決する途中で付随する小さな問題たちを面倒くさがらずに一つ一つきちんと解決して知識体系に組み込むことで、雪だるまの成長はもっともっと加速する。

さらにそれをブログやTwitterでアウトプットすることでより加速する可能性もある。(しない場合もある。ソース俺)



以前からずっと、「小さな問題は小さく解決するんだ」って言い続けている。

たとえば大きなアプリを作ってるときに、HTTPS通信でパスワード付きのSOCKSプロキシを通さなきゃいけなくなって、そのやり方は調べなきゃわからないってときに、そのアプリの通信部分をいじってパスワード入力ダイアログ出すように作って全体をビルドするとかサーバーにデプロイするとかして、ログイン画面からたどって2,3クリックしてその場面にたどり着いて、なんていうアホな開発はやめようって言い続けている。

そんなん、小さな1ファイルのコマンドラインツールかなにか、つくるでしょ。それでパスワードなんかソースコードにベタ書きしていろいろパラメータ変えたりして、何度も何度も実行したりして、一番効率よくて一番行儀良い方法を探ってから実際のアプリにコピペするでしょ。それで、あとでその辺の問題が起こったらその小さなコマンドラインツールが問題の切り分けに役立ったりしてハラショーでしょ。

もっと小さな例でいうなら、たとえばPHPの比較演算子がどう動くか調べるとか、SciTEとかでさくっと動かして調べればそれでいいのに実際のアプリ上で起こってることから類推するとか意味がわからんでしょ。


…(泣)


「もっとプログラミングの勉強してくださいお願い」って言うとき、必ずしも本を買えとかセミナー受けろとかそういうことだけとは限らないんだけどなあ(もちろんそういう体系的に学ぶこともとても良いことなんだけど)。プログラミングの仕事が忙しくて勉強ができないって思っちゃってる人がいたりして、そうじゃないんだけどなあ。それじゃいつまでたっても上手くならなくて簡単なことに時間かかりすぎてずっと忙しいままなんだけどなあ。


自発的に学べない人はやっていけないんだと思う。さらに、経験から学べない人はやってけないんだと思う。
最近年齢とともに学ぶ力が少し減退しているのを感じる。いつまでやっていけるんだろうかね。


allocしてinitしてautoreleaseするメソッド

Objective-Cで任意のクラスに好きなメソッド生やせるってわかってから一気に気持ちが軽くなってCocoaでの開発が嫌じゃなくなってきた。いいよねiPad。いいよねiPhone。

View操作とか文字列操作のメソッド名が単に長いってだけのことにこんなに影響受けてたのかと驚く。考える内容が考えるのに近いスピードで打てない苦痛にこんなに弱いと思わなかった。人間やってみるといろんなことがわかるもんだ。なんかこう、重い足かせ手かせがついてるみたいな気持ちでいっぱいだったんだもの。

Objective-Cで無名カテゴリでprivateなプロパティを実現する方法 | Eudyptes Chrysocomeとかを利用して、retainとかreleaseとか自分でできるだけ書かないんだって決めて、でもそうすると今度はautoreleaseとか書くのが長くてちょっとウザ、となってくる。

self.label = [[[UILabel alloc]init]autorelease];
label.text = @"foobar";

そこでまたオレオレメソッド登場ですよ。(やりすぎ注意)

NSObject_Util.h

@interface NSObject(Util)
//allocしてinitしてautoreleaseして返す
+(id)uNew;
@end

オレオレメソッドは決まったプレフィックスつけてちょっと変な名前にしておこうオレルール。

NSObject_Util.m

#import "NSObject_Util.h"
@implementation NSObject(Util)
//allocしてinitしてautoreleaseして返す
+(id)uNew {
return [[[self alloc]init]autorelease];
}
@end

Objective-Cのselfはクラスとか実装オブジェクトではなくレシーバなので、これでちゃんと使えちゃうのが他の言語とちょっと違って面白い。
self.label = [UILabel uNew];
label.text = @"foobar";
self.button = [UIButton uNew];
self.myobj = [MyClass uNew];


cocoaの長ったらしいメソッドにつきあわない

Objective-Cは既存のクラスに勝手にメソッド生やせるようになっているのを利用して、よく使う長ったらしい記述を短くすることにしてみた。

NSString


isEqualToString -> eq
stringByAppendingString -> plus
stringByAppendingPathComponent -> plusPath
lastPathComponent -> filename
lastPathComponent + stringByDeletingPathExtension -> basename
stringByDeletingLastPathComponent -> dirname
正規表現に最初にマッチした部分文字列を配列で返す -> match:pattern
正規表現にマッチした文字列の配列の配列を返す -> matches:pattern
これは。快適なんじゃね?もうね、Objective-Cの正規表現がウザすぎて死ぬので。
あとおまけ
NSLocalizedString(name, comment) -> res(name)
すごいしょっちゅう使うのに補完候補の先頭に出てこなくてたくさんタイプするのが面倒なので。

UIView、CALayer


frame.origin.x -> left
frame.origin.x + frame.size.width -> right
frame.origin.y -> top
frame.origin.y + frame.size.height -> bottom
frame.size.width -> width
frame.size.height -> height
サイズを変えずに移動 -> eMove:x :y
相対移動 -> eOffset:x :y
サイズだけ変更 -> eSize:width :height
他のViewと同じサイズにする -> eSameSize:view
親View一杯に広げる -> eFitToSuperview
左に寄せる -> eFitLeft
右に寄せる -> eFitRight
上に寄せる -> eFitTop
下に寄せる -> eFitBottom
フェードイン -> eFadein
フェードアウト -> eFadeout
他のViewと一緒にスライド -> eSlideWith:view :x :y
あら便利。あらあら。これは気持ちいい。

実際にどうやるかは、【コラム】ダイナミックObjective-C (8) カテゴリ - 動的なメソッドの追加によるクラスの拡張 | エンタープライズ | マイコミジャーナル参照。


XCode4のプロジェクトテンプレートが作れない!

XCode3では、自分がよく使うframeworkとか、よく使うマクロを予め定義したヘッダファイルとか、自分が整理しやすいディレクトリ構成とかをもったプロジェクトテンプレートをXCode上で作り込むことができて、それをプロジェクトの新規作成をするときに選択することが出来た。
仕組みはとても単純で、テンプレート中のファイル名とディレクトリ名とテキストファイルの内容を一切合切、
___PROJECTNAME___→プロジェクト名
___PROJECTNAMEASIDENTIFIER___→プロジェクト名のスペースをアンダースコアに置換した文字列
に置換するというものだった。

XCode4で、自分が作ったプロジェクトテンプレートが選べなくなっていたので、くそっと思って同じようにプロジェクトテンプレートを作ろうと思った。

調べた。

なるほど、XCode上ではテンプレートの編集はできない、と
TemplateInfo.plistファイルをごりごりいじって、と
TemplateInfo.plistが階層構造になって親を継承してるから、それを変更しようと思ったら親の定義を全部持ってきて・・・
AppDelegateクラスにメンバー変数を加えるには・・・
QwartsCore frameworkを加えるには・・・


ぷちっ。

できるかっ!こんな面倒なもんできるかっ!

そんなわけで、XCode3形式のテンプレートをXCode3のときみたいに一切合切文字列置換するrubyスクリプトを作った。プロジェクト新規作成画面で選択できないけど、これを使ってプロジェクト新規作成すればいいんだ。


# XCode3タイプのプロジェクトテンプレートを文字列置換して新しいプロジェクトを作成する
class Replacer
@srcDir
@dstDir
@projectName
@projectNameIdent

# エントリポイント
def main(templateDir, projectDir)
if !templateDir || !projectDir then
p "USAGE: ruby replacetemplate.rb (template dir) (project dir)"
return
end

if File.exist?(projectDir) then
p projectDir + " is already exists."
return
end

@srcDir = templateDir
@dstDir = projectDir
@projectName = File.basename(projectDir)
@projectNameIdent = @projectName.gsub(" ", "_")

p "processing " + @projectNameIdent + " ..."
Dir.mkdir(@dstDir)
processDir(@srcDir, @dstDir)
end

# 文字列置換
def tr(str)
return str.gsub("___PROJECTNAMEASIDENTIFIER___", @projectNameIdent).gsub("___PROJECTNAME___", @projectName)
end

# ディレクトリ処理
def processDir(src, dst)
puts "dir : " + src + "->" + dst
Dir.foreach(src){|item|
if item != "." && item != ".." then
srcPath = src + "/" + item
dstPath = dst + "/" + tr(item)
if File.directory?(srcPath) then
Dir.mkdir(dstPath)
processDir(srcPath, dstPath)
elsif File.file?(srcPath) then
processFile(srcPath, dstPath)
end
puts item
end

}
end

# ファイル処理
def processFile(src, dst)
puts "file : " + src + "->" + dst
of = open(dst, "w")
begin
File.foreach(src) {|line|
of.print(tr(line))
}
ensure
of.close
end
end

end

r = Replacer.new
r.main ARGV[0], ARGV[1]



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。