ページ

2012/07/29

ReverseAuthとサーバサイドのOAuth ~ そして勉強会へ

iOS5から搭載されたiOS Twitter frameworkでは
端末に紐付けたTwitterアカウントを簡単に取ってこれるので
サーバサイドのようにOAuthしなくてもいい。
しかし、iOSだけでなくサーバ側でもTwitterのAPIを叩きたい時に
サーバ側でも認証させなくてはならない。

iOS Twitter frameworkでは通常、AccessTokenが取れないらしいのだが、
iOS Twitter frameworkからReverse AuthすればAccessTokenが取れるらしい。

Using Reverse Auth | Twitter Developers
ReverseAuthするには申請メール送って何やら色々やったりする必要がある。
申請には20日程かかるらしい。ReverseAuthの申請について - Google グループ

また、iOSだけでなくマルチプラットフォーム化するならAccessTokenを取るのは一回に済ませたい。

ということでこの発表がやりたいことに近いようなので発表に期待。

8月1日(水) - Twitter 勉強会 #twtr_hack @デジタルハリウッド東京本校(@dh_tokyo) 【社会人枠】 on Zusaar
8月1日(水) - Twitter 勉強会 #twtr_hack @デジタルハリウッド東京本校(@dh_tokyo) 【学生枠】 on Zusaar

MacBookAirも、持ち運べるカバンも買ったから俺は勉強会に(初)参加するぞー!

2012/07/24

[競技プログラミング][PHP][AtCoder]宝くじ

A - 宝くじ

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

高橋君は夏の宝くじをこっそり買っていました。今日はその宝くじの当選発表日です。
購入者は、0 から 9 までの 10 個の数字から重複せずに 6 つの数字を選び購入します。
発表日には 6 つの本数字と 1 つのボーナス数字が発表され、
購入した宝くじとその数字がいくつ一致しているかで以下のように当選の等級が決まります。
  • 1 等 : 6 つ数字が一致
  • 2 等 : 5 つ数字が一致し、残りの 1 つの数字がボーナス数字と一致
  • 3 等 : 5 つ数字が一致
  • 4 等 : 4 つ数字が一致
  • 5 等 : 3 つ数字が一致
上記のどれにも当てはまらない場合ははずれになります。
また、複数の等級を満たす場合は上位の等級(数字が小さい等級)が適用されます。

高橋君が購入した宝くじの等級を求めなさい。
なお、与えられる当選番号とボーナス数字の 7 つの数字は互いに異なります。

入力

入力は以下の形式で標準入力から与えられる。
E0E1E2E3E4E5
B
L0L1L2L3L4L5
入力は 3 行ある。
1 行目には、当選番号を表す 6 つの整数 Ei(0≦i≦5, 0≦Ei≦9) が与えられる。
Ei は昇順に並んでいる。
2 行目には、ボーナス数字を表す整数 B(0≦B≦9) が与えられる。
3 行目には、高橋君が購入した宝くじの 6 つの数字を表す整数 Lj(0≦j≦5, 0≦Lj≦9) が与えられる。
Li は昇順に並んでいる。
Li の 6 つの数字は互いに異なります。
Ei と B を合わせた 7 つの数字は互いに異なります。

出力

高橋君が購入した宝くじの等級数 (1 等の場合は 1、2 等の場合は 2、のように) を標準出力に 1 行で出力せよ。
また、はずれの場合は 0 を出力せよ。
なお、最後には改行を出力せよ。

出典

A: 宝くじ - AtCoder Regular Contest #006 | AtCoder

回答

AtCoder/arc006_1.php at master · wada811/AtCoder · GitHub
<?php
$winning = rtrim(fgets(STDIN));
fscanf(STDIN, "%d", $lucky_number);
$bought = rtrim(fgets(STDIN));

$winning_numbers = explode(' ', $winning);
$bought_numbers = explode(' ', $bought);

$intersects = array_intersect($winning_numbers, $bought_numbers);
$count = count($intersects);
一行取得はfgetsで良いのだけれどそのままだと改行コードを含んで面倒なので
rtrimで改行コードを除去するのが良いようだ。
でないと空白で分割した後に、array_intersectで比較された時に
異なる文字列と判断されてしまう。

2012/07/23

[書評]達人プログラマー システム開発の職人から名匠への道

達人プログラマー―システム開発の職人から名匠への道
アンドリュー・ハント
ピアソンエデュケーション
発売日:2000-11
ブクログでレビューを見る»
様々なところで語られるプログラマがやるべきことの原典。
まだ「こうあるべきだよな!」と共感するほど
システム開発に携わっていないが「こうあるべきなんだ」と思って
本書に書かれていることを実践していきたい。
プログラマかくあるべし!みたいな本。
なんとなく情熱プログラマーとかの心得本みたいな印象があったけど違った。
より実際のプログラミング、システム開発に近いところでのプログラマがどうあるべきかを説かれている。

巻末に達人プログラマーになるためのヒントがまとまっているので
定期的に達成度をチェックすると面白いと思う。
いろいろできるようになりたいことはあるけどとりあえずユニットテストをするようにしたい。
ひよっこプログラマなので半人前なのだけれども、テストができないと半人前感が半端無い。

また折を見て達成度をチェックしようと思う。

2012/07/22

[競技プログラミング][PHP][AtCoder]P-CASカードと高橋君

B - P-CASカードと高橋君 ( This story is a fiction )

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

高橋君は来る 7 月 27 日の土用の丑の日に備えて、高級なうなぎを通販で買うことにしました。
支払いはネット銀行を通して行います。
高橋君が利用しているネット銀行のカードの裏には、
下図(※省略)のような縦 9 文字 ×横 9 文字の数字から成る乱数表がついています。
支払う時は、この乱数表の指定された位置から縦横斜めの中で指定された向きに 4 文字連続で抜き出して入力し、
それが正しいかによって本人確認を行います。

(※省略)

入力

入力は以下の形式で標準入力から与えられる。
x y W
c11c12…c19
c21c22…c29
:
:
c91c92…c99
入力は 10 行ある。
1 行目には、抜き出す最初の数字が左から何文字目かを表す整数 x(1≦x≦9)、
抜き出す最初の数字が上から何文字目かを表す整数 y(1≦y≦9)、
抜き出す方向を表す W が空白で区切られて与えられる。
抜き出す方向 W は R、L、U、D、RU、RD、LU、LD のいずれかで与えられ、
抜き出す方向が以下であることを表す。
R : 右方向
L : 左方向
U : 上方向
D : 下方向
RU : 右上に斜め方向
RD : 右下に斜め方向
LU : 左上に斜め方向
LD : 左下に斜め方向
2 行目からの 9 行は、乱数表の数字を表す整数 cij(1≦i,j≦9) が与えられる。
i 行目 j 番目の数字は、乱数表の上から i 番目、左から j 番目の数字が cij であることを表す。
cij は 0-9のいずれかである。

出力

指定された位置から指定された方向に数字を 4 文字抜き出し、それらの数字を標準出力に 1 行で出力せよ。
なお、最後には改行を出力せよ。

出典

B: P-CASカードと高橋君 ( This story is a fiction ) - AtCoder Regular Contest #005 | AtCoder


回答

Submission #35127 - AtCoder Regular Contest #005 | AtCoder
AtCoder/arc005_2.php at master · wada811/AtCoder · GitHub

シンプルな解法で解いたのに何故か通らないケースがあってACにならず諦めた…。
ダメなところがわかったらコメントして教えて下さい…m(_ _)m


追記(2012/07/29)

コメントを頂いて境界上で始まった時に先に移動させるから判定漏れを起こすためだとわかりました。
境界判定は動かす前にやらなきゃいけませんね…。
前にも境界判定でミスってたから弱いんだね。気をつけなきゃダメだ…。
ということで境界判定してから移動したのがコチラ↓
Submission #35542 - AtCoder Regular Contest #005 | AtCoder
長い!めんどくさかった!コレ移動は$wが決まれば統一的な記述ができるよなぁとfunctionにまとめたのがコチラ↓
Submission #35546 - AtCoder Regular Contest #005 | AtCoder
関数の引数に&をつけると参照渡しになってCのポインタみたいに使える。
値を返さなくても関数内で直接大元の値を変更できる。複数の値を変化させたい関数とかで便利。
そして境界判定ももっと簡単にできるだろうということで更に改造。
Submission #35549 - AtCoder Regular Contest #005 | AtCoder
これも参照渡しで方向を変更している。コレは別に参照渡しでなくても良かった。あとswicth文にする必要はなかった。
AtCoder/arc005_2.php at master · wada811/AtCoder
コメントありがとうございました。これですっきりです。

どんな環境でも入れておきたいChrome拡張機能12個

関連:MacBook Air (Mid 2012)を買った! | DevAchieve
関連:MacBookAir(Mid 2012)を買った後にやった事まとめ | DevAchieve

MacBookAirを買って設定などを移行せずに位置から環境を作りなおしてます。
GoogleChromeも拡張機能を見なおしてみてMBAのChromeに入れてみました。
これはその絶対必要な拡張機能を重要度順にリストアップしたものです。

1.Tabs to the front!

ダウンロード:Chrome ウェブストア - Tabs to the front!
新規に開いたタブを最前面にしてくれるだけの拡張機能。開いてタブ移動とか面倒ですからね。

2.Linkclump

ダウンロード:Chrome ウェブストア - Linkclump
タブを最前面にすると複数開いて後で1つずつ見るという人には面倒に思われるのですが
複数開くならLinkclumpで範囲指定して一気に開きましょう。
マウスなら中ボタンでドラッグ、トラックパッドならShift押しながらクリックしてドラッグで範囲指定できます。

3.Highlight to Search

ダウンロード:Chrome ウェブストア - Highlight to Search
すぐにググるクセのある人にはHighlight to Searchがお勧めです。
調べたい単語をハイライト(選択)するとSearchBoxが出て検索できます。

4.英辞郎 on the WEB 拡張機能

ダウンロード:Chrome ウェブストア - 英辞郎 on the WEB 拡張機能
同じくすぐに調べるクセのある人にお勧めな拡張機能です。
英語を調べるときにはググるより意味や例文を表示してくれる英辞郎が便利です。

5.Chrome Reader

ダウンロード:Chrome ウェブストア - Chrome Reader
そのページがRSSを配信しているかどうかが一発でわかり、
アイコンをクリックでその場でGoogle Readerで購読できる便利な拡張機能です。

6.AutoPagerize

ダウンロード:Chrome ウェブストア - AutoPagerize
クリックなしで自動で次のページを読みこんでくれる優れモノ。ないと面倒で読むのやめがちになるくらい。

7.Go Extensions

ダウンロード:Chrome ウェブストア - Go Extensions
拡張機能が多くなってきたらワンクリックで拡張機能の管理画面が開けるこの拡張機能がおすすめ。

8.Create Link

ダウンロード:Chrome ウェブストア - Create Link
ブロガーは必携の拡張機能。ページタイトルとURLでリンクを生成したりできる。
これがないとブログ書くのがすごく面倒になる。

9.Twitter Extender

ダウンロード:Chrome ウェブストア - Twitter Extender
Web版Twitterにお気に入りのリンクや非公式RTをできるようにしてくれる。

10.ブクログ

ダウンロード:Chrome ウェブストア - ブクログ
Web本棚サービスのブクログに商品を追加することができる。

11.MeasureIt!

ダウンロード:Chrome ウェブストア - MeasureIt!
Webサイト上の何かのサイズを計りたい時に便利。あんまり使わないけど使いたい時にあると地味に便利。

12.Google Checkout Archiver

ダウンロード:vvakame/google-checkout-archiver · GitHub
Androidアプリ開発者向け。Androidアプリが売れた時に履歴を自動でアーカイブしてくれる。
GoogleCheckoutArchiver.crxをクリックしてView Rawをクリックすればダウンロードできる。

完全に俺得です。本当にありがとうございました。

2012/07/21

MacBookAir(Mid 2012)を買った後にやった事まとめ

関連:MacBook Air (Mid 2012)を買った! | DevAchieve
買い換えた時などに困らないようにやった事などのまとめ。

1.ソフトウエアアップデート

とりあえず基本。

2.システム環境設定 > Dock

下や右にDockがあるとウインドウリサイズ時に邪魔になりやすいので画面上の位置を左に。
Dockを自動的に隠す/表示にチェック

3.システム環境設定 > 言語とテキスト > 入力ソース

Google 日本語入力をダウンロードしてひらがなと半角英数字を有効にする。ことえりは無効化。
環境設定で¥で入力する文字をバックスラッシュにする。
<, >, &をから&lt;, &gt;, &amp;が変換できるように単語登録。

4.システム環境設定 > セキュリティとプライバシー > ファイアーウォール

入にする。

5.システム環境設定 > キーボード > キーボード

F1, F2などのすべてのキーを標準のファンクションキーとして使用にチェック。
これでF6-F10までを変換でWinと同じように使える。ついでにF11でデスクトップを表示できる。
修飾キーからCapsをCtrlに変更する。

6.システム環境設定 > キーボード > キーボードショートカット

キーボードと文字入力のTab〜のチェックを外す。フルキーボードアクセスをすべてのコントロールに変更する。

7.システム環境設定 > トラックパッド > ポイントとクリック

全てチェック。

8.システム環境設定 > トラックパッド > スクロールとズーム

スクロールの方向のみチェックを外す。

9.システム環境設定 > メール/連絡先/カレンダー

アカウントの設定。

10.システム環境設定 > ネットワーク

無線に接続。

11.システム環境設定 > Bluetooth

入のチェックを外す。Bluetoothの状況をメニューバーに表示のチェックも外す。詳細設定のチェックも外す。

12.システム環境設定 > 共有

コンピュータ名を変更。ローカルホスト名も変更。

13.システム環境設定 > ユーザとグループ

画像をいつもの「丸に違い矢」に変更。フルネームも変更。AppleIDを設定。

14.システム環境設定 > 日付と時刻 > 時計

24時間デジタル表示の日付と曜日を表示させる。

15.メニューバー > 電源 > 表示 > 割合(%)

16.Google Chromeのインストール

Google Chromeの設定や拡張機能についてはまた後で。

17.Dropboxのインストール

SSD256GなのでデータはDropboxに丸投げ。

18.Finder環境設定

一般のデスクトップに表示する項目の全てにチェック。サイドバーと詳細も全てにチェック。

19.Finder > 表示

パスバーとステータスバーを表示させる。ちなみに表示形式の切替は⌘+1,2,3,4でできる。
表示オプションを表示から表示順序をグリッドに沿うに設定。

環境設定はリアルタイムで進行している!

追記変更はいつでもありうるということだ…!

MacBook Air (Mid 2012)を買った!

購入まで


持ち運び出来るノートPC欲しい。iPhoneアプリ開発したい。

俺…MacBookAir買ったら勉強会行くんだ…。

WWDC 2012で MacBook Air(Mid 2012)とか色々発表。

やばい。MBPR特盛欲しい。30万超えるとかアホみたいに高い。

そして2kgとか重い。持ち運ぶために筋トレ始めるレベル。

1.7kgのノートPCが持ち運ぶのが億劫になったから流石にやめた。

MBAを買うつもりだったのにMBPRに目移りして購入意欲が萎え。

すっかり買うタイミングを逃してしまって買う買う詐欺…。

しかし、気持ちに再び火をつけるものがタイムラインに流れてきた!

8月1日(水) - Twitter 勉強会 #twtr_hack @デジタルハリウッド東京本校(@dh_tokyo) 【社会人枠】
iOS Twitter framework 関連の話が聞けるらしい!
ちょうど開発していて今度そのあたりを触るかもしれないのでぜひ聞いておきたい!
平日はiOS Twitter frameworkを利用したアプリの開発に忙しかったので週末まで購入に至らず。

購入!

先週末ようやくWeb上で購入!
そして今日!長旅を終えたMacBookAirが我が家に!(上記写真)
これで勉強会も行き放題だ!

2012/07/15

[Android]twiccaプラグインを作ってみた ツイート編集編

関連:[Android]twiccaプラグインを作ってみた ツイート表示アクション編 | DevAchieve
関連:[Android]twiccaプラグインを作ってみた 設定アクション編 | DevAchieve

入力中のツイートのテキストを受け取って編集して twicca に返すことができる。
<intent-filter>
    <action android:name="jp.r246.twicca.ACTION_EDIT_TWEET" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
いい加減書くこともないので抜粋。
if(action.equals("jp.r246.twicca.ACTION_EDIT_TWEET")){
    String text = intent.getStringExtra(Intent.EXTRA_TEXT);
    intent.removeExtra("prefix");
    intent.removeExtra("suffix");
    intent.removeExtra("user_input");
    intent.putExtra(Intent.EXTRA_TEXT, edit(text));
    setResult(RESULT_OK, intent);
    finish();
}
受け取った Intent と返す Intent で Extras に共通しているところがある。
受け取ってセットし直すのもアホらしいので調べたら remove できた。コレは知らなかった。

[Android]twiccaプラグインを作ってみた 設定アクション編

せっかくなので設定も追加してみた。
関連:[Android]twiccaプラグインを作ってみた ツイート表示アクション編 | DevAchieve

設定用に PreferenceActivity を追加する。
PreferenceActivity は Android 3.0 以上からは Prefarence Fragment に置き換えられるらしい。
そして Android 3.0 未満は Compatibility Package というのを使って対応するらしい。
Support Library | Android Developersにある。
でもtwiccaプラグインの一つの項目しか無い設定画面1ページにそこまでするのが面倒大げさな気がする。
いや、はい。Xperia Arc(Android 2.3以上にアップデート出来ない宿命を背負った端末)から変えたら対応するよ…。

ということで Androidmanifest.xml に Intent を受け取れるように記述する。
設定アクション | Developers | twicca - Yet another Twitter client for Android.
<activity
    android:name=".QuoteTweetSettings"
    android:label="@string/app_name"
    >
    <intent-filter>
        <action android:name="jp.r246.twicca.ACTION_PLUGIN_SETTINGS" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
QuoteTweetSettings.java で設定画面用XMLを onCreate() で読み込んで onStart() で色々する。
@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.pref);
}

@Override
protected void onStart(){
    super.onStart();

    final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    CheckBoxPreference check = (CheckBoxPreference)getPreferenceScreen().findPreference(getString(R.string.key));
    check.setChecked(sp.getBoolean(check.getKey(), false));
    check.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue){
            if(preference.getClass() == CheckBoxPreference.class){
                if(preference.getKey().equals(getString(R.string.key))){
                    sp.edit().putBoolean(preference.getKey(), (Boolean)newValue).commit();
                    return true;
                }
            }
            return false;
        }
    });
}
sp を final にしておくと OnPreferenceChangeListener() 内で使えるから便利。
設定項目が多かったら無名インナークラスで書くのはやめたほうがよさそう。
クラスの比較はなんかできたのでやってみただけ。意味は無い。と思う。
複数の CheckBoxPreference の onPreferenceChange() を一回の記述で済ませられそう。
そのためにはキーを string.xml で string-array で保存すればいけるのかもしれない。

addPreferencesFromResource(R.xml.pref);で読み込んだやつ。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
 android:key="@string/key"
 android:title="@string/title"
 android:summaryOn="@string/on"
 android:summaryOff="@string/off"
 android:defaultValue="false"
 />
</PreferenceScreen>
ハードコーディングすると変更時に死ねるので全部 string.xml にぶち込む。
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">QuoteTweet プラグイン for twicca</string>
    <string name="key">reply</string>
    <string name="title">リプライを入れる</string>
    <string name="on">QT @screen_name https://twitter.com/</string>
    <string name="off">QT https://twitter.com/</string>
</resources>

2012/07/14

[Android]twiccaプラグインを作ってみた ツイート表示アクション編

twiccaを使っているのでせっかくだからtwiccaプラグイン作りたいなぁ、ということで作ってみました。

ツイート表示アクション | Developers | twicca - Yet another Twitter client for Android.
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
コイツを消して、
<intent-filter>
    <action android:name="jp.r246.twicca.ACTION_SHOW_TWEET" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
これに書き換える。

ついでにActivityを開いて何をするでもないので非表示にしといた。[Android]Activityを非表示にする | DevAchieve

@Override
protected void onStart(){
    super.onStart();

    final Intent intent = getIntent();
    if(intent == null){
        setResult(Activity.RESULT_CANCELED);
        finish();
    }
    final String action = intent.getAction();
    if(action.equals("jp.r246.twicca.ACTION_SHOW_TWEET")){
        final String statusId = intent.getStringExtra("id");
        final String screenName = intent.getStringExtra("user_screen_name");
        final String tweet = " QT https://twitter.com/" + screenName + "/status/" + statusId;
        tweet(this, tweet);
        setResult(RESULT_OK);
        finish();
    }else{
        setResult(RESULT_CANCELED);
        finish();
    }
}
忘れたけどgetIntent()はonStart()でやるべきって話を聞いたような気がする。詳しい話は忘れた。
後はコイツに投げてやるだけ↓
ツイート画面をアプリ/プラグインから呼び出す | Developers | twicca - Yet another Twitter client for Android.

GitHubにあげたー
wada811/QuoteTweetPlugin4twicca · GitHub
GitHubでTwicca Pluginで検索すると結構出てくるから参考になるよ。

[Android]Activityを非表示にする

アプリを起動するけども表示はさせない場合はコード中の setContentView の記述を削除すればいい。
しかし、これだけでは初回起動時に一瞬だけ起動アニメーションが見えてしまう。

表示させないようにするにはAndroidManifest.xmlの<application>タグか<activity>タグで以下のどちらかを記述する。
android:theme="@android:style/Theme.Translucent" // タイトルバーの表示あり
android:theme="@android:style/Theme.Translucent.NoTitleBar" // タイトルバーの表示なし
改訂2版 Android SDK逆引きハンドブック
改訂2版 Android SDK逆引きハンドブック

2012/07/08

私がプログラマとしてブログを書く事をオススメする8つの理由

だって人間は忘れる生き物だから

一回やってしまえば終わりな環境構築とか滅多に書かないコードとか全部覚えてられますか?私は無理です。
だいたいのことは検索すれば出てくるので、その都度検索すれば良いと思うでしょうが私はそうは思いませんでした。
私は面倒な事が嫌いです。同じ事を何度も検索するのが嫌いです。

その姿は毎度のようにお道具箱をひっくり返す小学生に似ていた

ネットは他人のお道具箱です。
ゴミのようにグシャグシャになったプリント混じりのお道具箱の中から
必要な道具を時間掛けて探すなんて苦行に何故耐えられるのですか?
私は面倒な事が嫌いなんです。
道具を他人のお道具箱に入れてる限り、その道具は自分の道具のようにすぐに取り出すことは出来ないのです。
頭の容量が無限大にあって、どんなに時間がたっても劣化せずに
素早く読み出せるのなら全部覚えてるのでもいいのでしょうけど…。

ブログは私のお道具箱

残念ながら少なくともわたしの脳はそのようにはできていないので全てを覚えておくことは不可能です。
かと言って忘れたら再び他人のお道具箱を漁るのは嫌です。
私は面倒な事が大嫌いなので。
じゃあどうするかと言ったら自分のお道具箱に綺麗に整理整頓して入れておくしか無いわけです。
勝手知ったる自分のお道具箱なら必要な道具を取り出すことは容易に行うことができます。

どんなに便利な道具も他人のお道具箱に入れてあったら他人の物だ

道具を借りている以上、それ以上のものはそこから得られません。
複数集めれば十分な知識を得られるかもしれませんが、忘れたら全て調べ直しです。
面倒な事が嫌いな私はそんなことを許せるはずもありません。
Googleの気分次第で見つからなくなったり、情報自体が消え去ってしまうかもしれないのですよ。
ブログに書いて自分の物にしてしまえば全て自分の知識になるのです。

勉強するのにノートを書かないなんて

そういうことでプログラマの方には是非ブログを書くことをオススメしたいのですが、
「他の人がもう書いてるから書く必要がない」とか「拙い知識で書いてもしょうがない」とか返されることがあります。
でもそんなことはないと声を大にして言いたい。
前者は是非他人の道具を自分の物にして欲しい。複数ページを参照しているのならまとめることで体系化した知識にできる。
後者は自分のために書いた方がいい。コードを見て、そう書いた理由が、関連知識が全て思い出せますか?
両者とも何かを学んだならブログに書こう。

書けば覚える、少なくとも書いたという事は

やはり人間、ブログを書いても時が経てばどうしても忘れてしまいます。
でも不思議とブログに書いたという事は覚えていたりするものです。
その際にちゃんとブログに書いてあれば読み返すだけで思い出せます。

書くなら詳しくわかりやすく

忘れてしまった未来の自分のために詳しくわかりやすく書いた方が良いのはもちろん現在の自分にもメリットがあります。
詳しくわかりやすく書くためにはそれ相応の知識が必要になるので必然的に調べることになるので理解度が上がります。
調べることで勉強にもなるし、より良い方法を見つけることもあるので「詳しくわかりやすく」を心がけましょう。

調べるときには必ず原典にあたる

2次ソース、3次ソースを参考に書かないほうがいいです。間違っていたり、古くなっていたりすることがあります。
必要なことしか書かれていないことが多いのでそれが知識の上限にならないようにするためにも必ず原典にあたりましょう。
これができている人はやはり凄いです。


さいごに

本当は[企画]なんでブログ書こうと思ったのさ!『あなたのブログ始めたキッカケ教えてください』 #myblogstart
企画に乗った記事を書こうと思ったんだけこの記事をキッカケにして欲しいという気持ちが強かったのでシフトしてしまった。

一緒に読んでほしい:「師匠になる」 - 情熱プログラマー ソフトウェア開発者の幸せな生き方
情熱プログラマー ソフトウェア開発者の幸せな生き方

日経ソフトウエアをまとめ買いしてやったぜぇ~ワイルドだろぅ?

毎月のように読みたいトピックがあって、そんなのが半年くらい続いたので
もう買ってしまえ!ということで今年の分を一気にまとめ買いしてやりました。
情報収集にも時間的限界が来たので雑誌で効率良く学びたいです。

最初はAmazonで買おうかと思ったけど定価より高かったり、
安いものは付録がついてなかったりしたので
日経BP書店で買いました!
ちゃんと付録がついてて定価で買えるのでオススメです。
日経BP書店|日経ソフトウエア

8月号はまだAmazonで定価で買えるので良いですよ!
(※僕に紹介料が手に入る的な意味で)
日経ソフトウエア 2012年 08月号 [雑誌]
日経ソフトウエア 2012年 08月号 [雑誌]

2012/07/07

このプログラミング問題が解けたら書類選考無し&高級うなぎGET!

タイトルは軽く釣りです。
本当は僕じゃなくてコッチ→このプログラミング問題が解けたら書類選考無し&高級うなぎGET! | Technology-Gym

エイトクイーンじゃなくてセブンクイーンだったので前に書いたコード少し書き換えた。
それっぽい答えも出て、メールを送ってもダエモンさんから返信がないので正解だったと思う。
採用に関わるものらしいので回答は載せられないけど
このブログの熱心な読者ならアレを書き換えたとわかるかもしれない。

採用にこういうのでやるのって良いね!FizzBuzzはもう使い古された感があるから
こういうアルゴリズムの典型問題でフィルタリングするのよさそう。
次回も期待しています。

2012/07/04

[競技プログラミング][PHP][AtCoder]大好き高橋君 ( Love me do )

A - 大好き高橋君 ( Love me do )

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

 高橋君は自分が大好きなので、自分の評判を調べるために自分の名前が入っているツイートを調べたいと考えました。
しかし彼のフォロー数は多いので、タイムラインを 1 つずつ確認して自分に関係あるつぶやきを探すのは面倒です。

 そこで高橋くんを手伝うために、与えられる文から高橋君を表す単語が現れる回数を数えてください。
 ただし、単語の一部に高橋君を表す単語を含んでいた場合も、
高橋君を表す単語と完全に一致しない限り、その単語を高橋君を表す単語として数えないでください。

 以下の3単語が高橋君を表す単語です。
TAKAHASHIKUN(高橋君をヘボン式ローマ字にして、全て大文字にしたもの)
Takahashikun(高橋君をヘボン式ローマ字にして、先頭の 1 文字のみ大文字、残りは小文字にしたもの)
takahashikun(高橋君をヘボン式ローマ字にして、全て小文字にしたもの)

入力

入力は以下の形式で標準入力から与えられる。
N
w0 w1 … wN−1.
入力は 2 行ある。
1 行目には、2 行目に与えられる文に含まれる単語数を表す整数 N(1≦N≦50) が与えられる。
2 行目には 2 文字以上 100 文字以下の 1 文が与えられる。
文は単語 wi(0≦i≦N−1)から成り、各単語は空白で区切られている。
最後の単語 wN−1 の後には空白を挟まず . がある。
単語 wi(0≦i≦N−1) は英字(A-Z, a-z)で成り立っている。

出力

与えられた文の中で高橋君を表す単語が現れる回数を標準出力に 1 行で出力せよ。
なお、最後には改行を出力せよ。

出典

A: 大好き高橋君 ( Love me do ) - AtCoder Regular Contest #005 | AtCoder

回答

AtCoder/arc005_1.php at master · wada811/AtCoder · GitHub

<?php
fscanf(STDIN, "%d", $n);
$sentence = fgets(STDIN);
$words = explode(' ', str_replace(".", "", $sentence));
$count = 0;
foreach($words as $word){
    $count += preg_match('/^(TAKAHASHIKUN|Takahashikun|takahashikun)$/', $word, $match);
}
echo $count . PHP_EOL;
?>
PHPで標準入力から一行取得するには3行目のようにする。
4行目でピリオドを消し飛ばして半角スペースで分割する。
単語ごとにマッチするかチェックしつつpreg_matchでマッチした回数をカウントする。
後は出力するだけ。
本当はpreg_match_allでやりたかったけど正規表現パワーが足りなかった…。