2012年10月4日木曜日

Nexus7の人柱に、俺はなる!!


ついに買いましたNexus7!!
初期設定すげぇ簡単すぎて怖くなるレベルでした。
だって、クレカ登録してGoogleアカウント同期するだけなんだもの。
個人情報を掌握した企業の強さ。。。
クレカ登録したら2000円分のGooglePlayで使えるマネーが貰えちゃうのでかなり得した気分。
ネット上のコンテンツに金を払うっていうのにはまだ抵抗があったけど、
この2000円で勢いづいて電子書籍とか買ってしまうかも。

電子書籍で思い出したがLPICがLINUX教科書をフリーダウンロード始めたとのことで、ダウンロードしてみた。
EPUB形式とPDFで配布してます。
→ http://www.lpi.or.jp/linuxtext/text.shtml

ここで落としたEPUBはUSB経由で電子書籍としてNexus7に入れました。
明日の通勤時にでも読んでみよー。

さらに適当にいじくってみた。
無線屋さんの私は、NFCだBluetoothだって機能を弄りたくなるわけで。。。

Bluetooth機能使ってこんな使い方もできちゃうんです。




いわゆるキーボード付きタブレット端末を想起させる使い方。
ちなみにこのキーボード、結構話題になってる奴なんです。
http://getnews.jp/archives/247873
http://weekly.ascii.jp/elem/000/000/095/95683/


このキーボード、安い、軽い、電池もちいい、堅牢。
子供向けのDSソフトに付属する品なので、かなり堅牢に作られてます。
タッチできる液晶って意外と便利かも、マウス要らんし。
MSのSurfaceはこれよりスタイリッシュになると思うし更に期待してしまう。。。



ついでにWiiリモコンともペアリングしてみた!!
WiimoteControllerっていうandroidアプリであっさりペアリングできます。
WiiリモコンとGalaxy S2とはペアリングできなかったけど、Nexus7はできた。




このアプリの開発者は、Wiimote for AndroidみたいなSDKとして配布して欲しい。
Wiiリモコンとタブレット端末の可能性を世界中の開発者に広めていただきたい!
なんか夢広がるー

2012年9月30日日曜日

英会話学校の価格破壊


Skype英会話が流行っている。
昔の人は従来型の、部屋を構えて正社員の講師が一対一で教えるスタイルを想起するかもしれないが、今はSkype一つで家から英会話ができてしまう時代。


これはもう一過性のものではなく、今後のスタンダードになると思われる。
最大の要因は価格差。


私は、マンツーマンを謳った従来型の英会話学校を2社ほど回った。
プランとして提示されたのはどちらも1回(50分)あたり8000円程度。
一方でSkype英会話の方は1回(25分)200円程度。

分単位で比較して、20倍も価格差がある。
Skype英会話が出せるこの価格競争力は人件費と固定費が劇的に低いということがある。
明らかなことではあるが以下の3点は明確な差になっていると思う。

- 店舗を構える必要がない
- フィリピン人のアルバイト講師は給与が安くて済む
- 予約システムが使いやすい(Web上ですべて済む)

また、受講者側にもメリットがある。
- 時間がフレキシブル(24:30まで講義がある)
- 圧倒的安さ


まだまだサービスの悪さがあったり、講師の当たり外れがあるところがあるが、
低価格で、夜遅くに英会話をしたいニーズを完全に掴んでいると思う。

Androidのソースコードを落としてくる作業


低レイヤーのドライバ等を実装する身としては、Androidのソースコードから学ぶものが多いはず!
そんなきっかけで今日はAndroidのソースコード落とす方法の備忘録。
殆どここ↓みればわかるんだけど
http://greety.sakura.ne.jp/redo/2012/02/windowsandroid.html

とりあえずまとめてみる。


うちのPC環境はWindows7 + Cygwinな環境です。
gitインストールしたあと、以下のコマンドを実行して超待つだけ!超!

$ mkdir android_source
$ cd android_source
$ git init
$ git clone https://github.com/OESF/OHA-Android-4.0.3_r1.0.git

ツリーまるごと落とすのでかなり時間かかります。

2012年9月29日土曜日

第2回関西ソーシャルゲーム勉強会

関西ソーシャルゲーム勉強会なるものがあったので参加してきました.
以下そのまとめ&備忘録


■日本マイクロソフト 砂金信一郎 様
ソーシャルゲームにおけるAzureデザインパターン

- クラウドガールのプロデュース
 クラウディアさんは知らなかった...

- Windows Azureの概略
 マイクロソフトが提供する安心・安全なクラウドサービス
 ベンチマーク先がAWSで,あとだしジャンケンでより良い物を提供
 Azureデータセンター基盤への投資
 Azureは国内でも様々な会社で採用されている
 エンタープライズ系だけでなくエンタメ系の利用が目立つ
 クレカがあれば90日間は無料でできる.
 本人の承諾なしに課金がスタートすることはないので安心
 VMがGUIで簡単に立ち上げられる
 開発言語を選ばないよう,SDKすべて提供されている

- ソーシャルゲーム向けの応用
 システムの運営だけがしたくて運用は任せたい小規模な会社でも便利
 キャンペーンもので一時的に必要な場合も効率的
 例)FFXⅢのキャンペーン,カプコンのドラゴンズドグマ
 mixiクリスマスの運用は前年度と変わらないユーザー数(250万ユーザー)

- Windows Azureの変革
 - PotterMore:RPG仕立てになったオープン後数日で100万ユーザー,1.1億PV/日
 - BigData Hadoopにも近日対応


■サイバーエージェント 山田元基 様
 ソーシャルゲーム開発パッケージ化とネイティブアプリ開発

- 開発したゲームの紹介
 東京ガールズスナップ:ガラケー向けゲーム,3ヶ月で実装,MongoDBを利用
 天空のクリスタリア :スマホ向けゲーム,2012年6月リリース,Ajax多様

- ソーシャルゲーム開発のパッケージ化
 現状:スマートフォン特化,カードゲーム増加,標準搭載機能の増加
 →パッケージ化に向けて,ゲームノウハウの共有->ライブラリ/APIの開発を行う
  ・ライブラリAPI一覧
   ガチャ,ショップ,ランキング,招待機能,トレード,掲示板 . . . 
   (サイバーでは開発は全部Java)

 - HTML5でのWebアプリケーション開発
  ・WebViewを利用したネイティブアプリ開発
   PhoneGap : クロスプラットフォーム用の開発フレームワークを利用

■KLab 黒井春人 様
- Jenkinsの導入
 -> 既知の話.サーバー構築が面倒らしい.

- 組織の変化を許容する
 急成長するソーシャルゲーム開発会社は人の移動が激しい
 人の出入りに柔軟に対応したい

■LTで引っかかったキーワード列挙
- Googleトレンド:話とほぼ関係ないけどこんなのあったのか面白い.
- iOS,iPadアプリ開発,Objective C:開発やったことないけどアプリを実装しよかな.







2012年9月25日火曜日

GAE for python の環境設定をしたときの備忘録


GAE for python はDjangoっていうフレームワークを使って簡単にウェブサイトが作れるお!
って情報を、今日本屋で立ち読みしてた。
とりあえずローカルで動かして確認して、デプロイするところまでをやってみました。
以下その備忘録!



まず、そもそもPython2.7とGoogleAppEngineは入れてたので以下の2点のみで環境設定が済んだ。


1.EclipseにPyDevを入れよう

 ※Eclipseは日本語化しておりませんのであしからず

・Help -> Install New Softwareを選択
・Work with の欄に ”http://pydev.org/updates”を入れて”Add”を選択し、インストール


2.PythonのインタプリタをEclipseで設定しよう

PyDevインストール後に、GAEのプロジェクトを作成しようとすると、
「Project interpreter not specified」
と怒られるので、インタプリタのパス設定が必要。

設定は、、
メニューバー -> Window -> Preferences -> PyDev -> Interpreter - Pythonを選択肢、Pythonのインタプリタ(python.exe)を選択しApplyを押下!

以後は新規のプロジェクトを作成してRun

・メニューバー -> File -> New -> Otherを選択
・ PyDev Google App Engine Projectを選択し Next
・GAEのディレクトリを入力
Run As -> PyDev: Google App Run

でローカルで動きます。
確認方法は、ブラウザから http://localhost:8080 にアクセスするだけ。


3.デプロイで公開しよう

・GAEでApplicationを作成
・Eclipseで先ほど作成した名前と同じプロジェクトを右クリックして
 PyDev:GoogleAppEngine -> Uploadを選択。
・Googleのメールアドレスとパスワードを求められるのでそれを入力すればデプロイ完了。
確認方法は、、
http://アプリ名.appspot.comにアクセスする。


2012年9月23日日曜日

Developers Summit 2012 Kansaiにいったときのまとめ


名称Developers Summit 2012 Kansai (通称:デブサミ関西)
会期2012年9月14日(金)
会場神戸国際会議場 5F(兵庫・神戸) アクセス5Fレイアウト
主催株式会社 翔泳社
お勧めする方技術者、ソフトウェア開発者、システム開発者、ネットワーク管理・運用者、IT教育担当者、 ITマーケティング・セールス担当者、IT関連部署マネージャ、プロジェクト関連マネージャ
参加費無料


完全にミーハー精神で及川さんの話を聞きに行きました!
以下それのまとめ。


Google及川さん:

■chromeのプロジェクトに学ぶAgileでScaleするソフトウェア開発  // 及川卓也 @Google

- クラウド時代のソフトウェア開発

大規模ソフトウェア開発
 大規模ソフトウェアって?
  -> みどりの窓口,発電所,社会インフラを支えるシステム
 
  ウォーターフォールモデル
  plan design implementation stabilization release


- 大人数開発で必要になってくることが工程管理(ガントチャート)

 大規模なものを小さい単位に分ける
  Googleではチームが小さい(5人程度)
  不必要なドキュメントの生成やコミュニケーションを減らすため.
  できるだけ少人数にして権限を移譲する
  小さいチームではテーマを共有することが大切

 Branch管理,
 Test: Priorityが低いものについては修正するか否かをしっかり検討する
 Release: 回収はありえない

- クラウド
 クラウドにおいてはデバイス側のソフトウェア更新が要らない
 低いデプロイメントコスト
 Release後も,ダウンしないかどうかが懸念事項
 ユーザーのトラフィックに対応できるか

- クラウドの開発サイクル
 Launch & Iterate : 何回も反復する.はじめから完璧を求めない
 完成度が許容出来るレベルのものを作成し,
 反応を見て改良を加えることで完成度を高めていく
 仮説と実証を繰り返していく
 VersionLess: 利用者はバージョンを意識することがない
 リニアな形で進化を遂げていく

- Chromeのプロジェクトの歴史
 ブラウザは情報の受発信.静的な情報のやり取り html
 chrometimemachine
 バージョンアップという概念を無くしたい

- オープンソースプロジェクトの紹介サイト
 ohloh
 ChromeのS:Simplicity, Security
 Reviewerにレビューしてもらわない限りコミットされない
 chromium-dev@googlegroups.com  
 irc.freenode.net/#chromium
 chromium.org -> for developer

- 徹底した自動化
 Buildbot: Continuous Build
  Test: Patchをsubmitする人がtest作成も行う
 TryServer: パッチをすべてのプラットフォームでBuildし,
       それをパスしてからレビュー

- オープンソースプロジェクト
 徹底した自動化+優良な市民



■ 関西から世界に通用するスマートフォンサービスの開発 // 川端雄補 @Cyber Agent

- スマートフォンサービスの開発
  http://goo.gl/nnShl
  JS: node.js
  DB: MySQL, NoSQリ HTML5 -> 速度が必要な部分はnative.

  流通を考えるとマーケットに載せるのは大切
  開発サポート:Jenkins,Redmine,新しめの部分はsubversion,Githubのエンタープライズ版

  アクセスログ解析: Hadoop, GoogleAnalytics

  9/29 ソーシャルゲーム勉強会

- スキルセットの最新化
  その時々で求められる価値を学び続ける


「実はユーザ評価下がってる!スマフォアプリ開発の罠」 ~組込みの観点からの解決方法、省電力、UIX~ // 杉本礼彦@ブリリアントサービス

- NFC Lab Farm Box
 NFC QUEST: ブースでカード配布して参加者が魔王を倒すゲーム.3人でないと倒せない
 街コン: NFC街コンツクール
 変わった商店街:六角橋
 ARO android -> AT&T univ

 都心部の基地局は繋がらない
  → アプリが頻繁に制御信号を送信している
  → 制御信号送信回数を減らす
  → 消費電力が下がり,アプリの評価が下がらない



京大情報学OBが京大フェス2012にいってきたときのまとめ


京大フェス2012に行ってきました。
想像以上に良かった!俺の3000円は無駄じゃなかった!
最後のほうは意識飛んでしまったけど。。。


京大フェスは4構成で、
Session1: 新しい挑戦だけが、世の中を変える
-> ベンチャー社長の人生振り返り、どんな挑戦をしてきたか。なにが自分を変えたのかについて話されてました。

Session2: 次はこうなる!時代を見通すヒント
-> 岡田斗司夫さんのお話しか聴いてなかったけど、大衆の視点とは違った鋭い視点でのおもろい話してた。このセッションのテーマと内容が合ってるのかは謎。

Session3: OBプレゼンテーション
-> 京大を出て、様々な業界で活躍されてるOBの話。

Session4: 受けてみたい、京大白熱授業
-> 瀧本哲史さんと、北川智子さんのお話。



以下、講演中にとったメモ。


Session1: 新しい挑戦だけが、世の中を変える


孫泰蔵@MOVIDA JAPAN CEO:

- 人生を変えたきっかけ
 Yahoo創業者との出会い
 若くして必要な情報を必要な人に提供する使命を持って、世の中に新しい価値を提供しているのに刺激を受ける

→ 早期にロールモデルとなる人に出会うことが成長につながる


- アントレプレヌールとは
 技術革新や規制緩和によって起きる変化に気づき,社会を変えること
 新しい価値を創るにあたり,変化はチャンスである.

- これからWebサービスを作るなら
 英語で作れ。なぜなら世界中がマーケットとなる。不得意な英語だと言葉数は減り、ビジュアルにサービスが構築される点が良い。なぜなら言葉に頼った説明はユーザビリティを低下させるからだ。
 「知ってるから通じる」がガラパゴス化に繋がる

- Think Big
 物事は大きく捉える
ex) サグラダファミリア:一代ではできない大きな仕事




クリストファー・テイト@ コネクトフリー CEO:

- コネクトフリー株式会社の事業(ex:ジュンク堂書店の事例)
  書店内に無線LANを提供し、店内の書籍を検索できる仕組みを構築。
 地元に密着したローカルな広告を打つことでペイするビジネスモデル。

- be the first person to solve the problem
いい環境で,失敗を早くすること


徳谷智史 @ Egg FORWARD 代表:

- なんか就活セミナーっぽい内容
 時間を忘れて取り組めるものは何か?
 その理由は何か?
 これらの答えに「モノ」がないはず.モノに充実を感じることはないから.

- 身の回りで親しい人は誰か?
 人は周囲の人に似てくるもの
 新しいチャレンジをしたいならチャレンジしてる人の回りにいるべき




Session2: 次はこうなる!時代を見通すヒント



岡田斗司夫 @ 評論家:

 成功には理由がない.理由があるのであれば皆成功している
 失敗には理由がある.失敗した人は理由がすぐに言える
→失敗の理由を遠ざけて成功の法則を求めていくと結局平凡になる


---------------------------------------------

ごめんなさいこの辺から集中力途切れました。。。


Session3: OBプレゼンテーション

小野邦彦 @ 坂ノ途中 CEO:


Session4: 受けてみたい、京大白熱授業




Callback関数を知らん人がまず理解すべきことのまとめ。

未だにへっぽこプログラマーの私が、「Callback関数なにそれ美味しいの?」状態から、
Callback関数、「それはとっかえひっかえされる関数だお(キリッ」ってなるまでにとった行動のまとめ。
ちなみに私、C言語とPythonくらいしか喋れませんので、今回はC言語に特化した内容でお送りします。

※Webから漁ってきた情報から手っ取り早くまとめたものなので間違いもあると思われます。間違った点はゴリゴリ指摘していただけるとマンモスウレピーです。


Callback関数とは?

■プログラム中で、呼び出し先の関数の実行中に実行されるようにあらかじめ指定しておく関数(IT用語辞典より引用)

初心者が読んでもわけわかめだと思います。いきなり定義が頭に入る奴なんていません。
これはまだマシな方でWikipediaの解説なんてクソイミフです。
アホだと自覚してる私は読む気さえ起きません。

完全理解は無理で、ある程度の理解水準に素早く到達して、
「とりあえず実装できる」状態になりましょう。
その後、徐々に理解を深めていく方が学習は早いです。
ここでは3段階で解説して、「とりあえず実装できる」状態になりましょう。

Callback関数を理解するためには、
1:ポインタの理解、2:関数ポインタの理解、3:callback関数のメリットと実装方法
を学ぶ必要があります。


1:ポインタとは?

C言語入門者を悩ませるポインタです。
まずは軽くポインタって何?ってところから。

ポインタ⇔指す人ってわけで、C言語の入門書では以下の様なコメントが書かれてます。

int *p;    // int型を変数を指すポインタ
int data; // int型の変数
p = &data; // pはdataを指す

1行目:
いつも「指す」って何やねんってなります。
私は、ポインタはアドレスを格納する変数だと思ってます。
だからpはアドレスを格納するための変数です。
指すとか意味分かんないからアドレスを格納するただの変数だと思うのです。

2行目:
int data; って書いた瞬間に、メモリ上でプログラムが使える領域に対して「sizeof(int)分の領域をdataが使います!」って宣言したことになります。
イメージは、「空いてる席を見つけて、これ俺の席!」って宣言した感じ。

3行目:
&dataはその領域の先頭を表します。
&は実体の前にくっつけてアドレスに変換し、 *はアドレスの前にくっつけて実体に変換します。
つまり、ここでは pと&dataはアドレス、*pは実体となります。
ポインタに躓いたときはよくコンパイルエラー吐いたんですが、
簡単な話、代入時に両辺がアドレスか、両辺が実体かをチェックすればいいだけなのです。


2:関数ポインタとは?

次に、本題の関数ポインタに移ります。
先ほどint *p;ってかくと「pさんはint型のアドレスを格納する変数だお!」宣言だって言いました。

そこで私のようなアホはこう考えます。
「関数ポインタ」って、読んで字の如く解釈すると関数のアドレスを格納する変数だろ?
じゃぁそれの真似して、
kansuu *p;って書いたら「pさんはkansuu型のアドレスを格納するお!」ってなるんじゃないかって。
でも残念ながらコンパイラさんはkansuu型?なにそれ?しらんわクソが!ってなります。
そもそも関数って返り値、引数、お名前って要素がありますやん?
なんで名前しか教えてくれへんの?あほちゃう?
コンパイラさんはこんな気持ちになることでしょう。
じゃぁそれら3つを定義したkansuu型を定義してあげよう!

架空の関数kansuuさんが以下のように実装されてたとして~、、、
int kansuu(double hoge){
  return 1;
}
C言語では以下のように定義します。
 int (* p)(double); // 返り値 (* ポインタ変数名)(引数の型)
これ覚えるとこです!とりあえず、ここだけは覚えるとこです!
重要なことだから二回言いました。

で、世間ではこういった仰々しい書き方がうざいからtypedefを先っちょにくっつけて、
typedef int (* FUNC_POINTER)(double);
しちゃってから
FUNC_POINTER p; //
とか書きます。
これで、関数kansuuを指すポインタpが定義されました。
ポインタっつーのはアドレスを格納する変数だから、
p = kansuu; は許されます!

これは以下の理由によります。
Cで定義された関数って、プログラムを実行するとメモリ上のどこかに関数の実装部分を確保します。例えば、 void hogehoge(void)って関数を定義すると、その関数の実装部分のアドレスは hogehogeでアクセスできます。
とりあえず、引数・返り値とか関係なく、関数名が実装部分へのアドレスだと思ってください!

てなわけで、p = kansuu;って書くと、
pはkansuu型のアドレスを格納する変数ポインタで、kansuuはkansuuへのポインタ。
両辺はアドレスを意味するからこの式は正しい。
pにkansuuへのアドレスが格納されたんだな!って解釈になります。
まとめると、関数ポインタは、関数の実装部分へのアドレスを格納するための変数なのです。





3:callback関数のメリットと実装方法

とりあえずサンプルプログラム。





後にくっそ重要なこと3つ。

1.引数、返り値が同じ関数のアドレスだったら関数ポインタはなんでも格納できる
2.関数ポインタが指してる関数は、”ポインタ(引数)”で呼び出せる
3.1、2から関数ポインタに格納されてる関数のアドレスによって関数を呼び分けられる

ってことです。
func1,func2は「とっかえひっかえできる関数」だけどそれだとカッコ悪いから我々はそれを
「コールバック関数」と呼ぶのです。
main関数部ではpが格納してる関数アドレスによってfuncは、関数を呼び分けております。
同じように呼ぶだけで処理を変えられるのはメリットだし、
汎用性という観点でも使える技術です。

※ 当ブログは以下のサイトに移転しました。

ここまで読んで参考になったという方は、ローベル本をおすすめします。
良質かつ簡潔にコールバック関数についてまとまっていました!


例えば、アプリ側の開発者に対して、Aボタン押下時に好きな処理を記述させられるようなSDKを設計したい!!とか言う要望にはもってこいですよね。


2012年8月26日日曜日

Pythonセットアップ @ cygwin


UNIXコマンド使いつつpythonしたい@Windows
そんな時のセットアップ手順の覚書

1. cygwinをインストール←よくわかんないのでフルインストール(あんま良くない習慣)

2. cygwinのパスを通す
t
3. pipのインストール
 3-1  $ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
 3-2  $ python get-pip.py
macだとwgetは無くてcurlでいいみたい.

pipとはPyPI(Python Package Index)と呼ばれるPythonパッケージを共有するリポジトリからモジュールをインストールする際に用いるコマンド。
新たにモジュールインストールしたいときに便利なのでここでインストールしておく。

4. emacsをpython向けに改良
ここを参考にして.emacsを変更する

5. モジュールインストール
 基本的に "$ pip install ライブラリ名" で行ける。
入れたのは
feedparser, numpy, PIL, ipython, matplotlib

6. 散布図の作成
ここに記載されてるコードを実行してインストールされてるかどうか確認





[ついでにシンタックスハイライトの入れかたの覚書]
1.Syntax Highlighter Scripts Generatorにアクセスしてコード生成
2.生成したコードをbloggerのテンプレートの</head>直前にコピペする
3.記事で使いたいコードを

<pre class="brush: プログラミング言語名" title="タイトル"> 
 色づけしたいコードを記述
</pre>

ではさめばOK

2012年8月19日日曜日

ゲームハード開発エンジニアが作業効率化のためPythonを勉強してみた

Python最速学習方法 → サンプルコードから学ぶ!
参考にしたサイト:http://www.python-izm.com/


内容
1: インタプリタ設定
2: ソースコードが書かれるencodeを設定
4-6: 関数定義
10: __main__ (よくある構文)
15-19: 複数行に渡る文字列
24: 数値->文字列変換
28: 文字列->数値変換
36: タプル
44-46: コマンドライン引数の取得
49-52: リスト
53-54: for文
56-64: while文
66-68: ファイル書き込み
70-73: ファイル読み込み
76-80: HTML解析


コード
     
    
    
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-

  3. # function
  4. def test():
  5. print "call test function"


  6. # インタプリタからimportされたときに実行されない構文
  7. if __name__ == "__main__":
  8. test()

  9. test_str = """
  10. hoge
  11. hogege
  12. hogegege
  13. """
  14. print test_str

  15. int_data = 100
  16. str_data = "yen"
  17. print str(int_data) + str_data
  18. print str_data.replace("yen","dollar")

  19. test_str = "100"
  20. print int(test_str)*100

  21. import datetime
  22. today        =    datetime.date.today()
  23. print today


  24. def getToday(today):
  25. value = (today.year, today.month, today.day)
  26. return value

  27. tuple_data = getToday(today)
  28. print tuple_data
  29. print tuple_data[0]


  30. import sys
  31. param = sys.argv
  32. print param


  33. for_data = [] # list
  34. for_data.append("python")
  35. for_data.append("PHP")
  36. for_data.append("Java")
  37. for value in for_data:
  38. print value

  39. counter = 0
  40. while counter < 10:
  41. counter += 1
  42. if counter == 1:
  43. print"one"
  44. elif counter == 8:
  45. print "eight"
  46. else:
  47. print counter

  48. file = open("write.txt", "w")
  49. file.write("Python file")
  50. file.close()

  51. read = open("write.txt","r")
  52. for row in read:
  53. print row
  54. read.close()


  55. import urllib2
  56. url = "http://www.python-izm.com/"
  57. html = urllib2.urlopen(url)
  58. print unicode(html.read(),"utf-8")
  59. html.close()

以上の文法を一気にかけるようにしておく。



2012年7月24日火曜日

GoogleAppEngine for Java

【開発環境設定メモ】

1. JDKのインストール
 各OSに合わせたものをOracleのサイトからダウンロード
 私の環境は64ビットWindowsなので jdk-7u5-windows-x64.exeを選択

2. Eclipse 4.2をここからインストール
 私はEclipse IDE for Java EE Developersを選択

3. GoogleAppEngineのプラグインをインストール
 (i) Help > Install New Software を選択
 (ii) http://dl.google.com/eclipse/plugin/4.2 をLocationにセットしてPluginをチェック
 (iii) ダウンロード開始(結構時間かかる)


これからJavaでウェブサイト作ってみる。




参考サイト:
http://blog.livedoor.jp/morituri/archives/53251828.html

2012年7月8日日曜日

Emacsにおけるlispファイル


Emacsの設定をするにあたり、大切なことは2つ。

 1. $HOMEディレクトリに.emacsファイルを置く(前回述べた)
 2. load-pathを通す  

今回は2について述べる。
まず、ロードパスとは様々なLispプログラムを読み込む場所のことである。
そこにパスを通すと便利な機能を付け加えてくれるLispプログラムを読み込める。
その結果幸せになるわけです。
http://d.hatena.ne.jp/tomoya/20090121/1232536106


パスを通すには?

- .emacs.d以下にelispディレクトリを作成
- .emacsファイルに以下を記述

(setq load-path (cons "~/.emacs.d/elisp" load-path))



Lispプログラムを読み込めるようにするには?

- .emacsに以下を追記
;; まず、install-elisp のコマンドを使える様にします。
(require 'install-elisp)
;; 次に、Elisp ファイルをインストールする場所を指定します。
(setq install-elisp-repository-directory "~/.emacs.d/elisp/")


auto-complete-modeのインストール
インストールの例 : http://d.hatena.ne.jp/tomoya/20090124/1232822594

.emacsの設定

次は.emacsの設定!
.emacsとはemacsの設定ファイルで、emacs起動時に読み込まれて好みの環境を提供してくれる。

そこで今回はemacsを半透明にする設定をしてみる。

1. パスを通す
スタート>コンピューターで右クリックし、プロパティを選択。
システムの詳細設定>環境変数>ユーザー環境変数の画面で、
"HOME"を"C:\home"に設定。

2. .emacsを作成
Cygwinを立ちあげて
$ emacs .emacs
を実行し、以下を記述


(setq default-frame-alist
      (append
       (list
        '(alpha . (85 40))
        ) default-frame-alist))


次回以降emacsを立ち上げると半透明emacsの出来上がり。

Cygwin + NTEmacs

PCを変えたので開発環境構築をすることになった。


Windows7上でlinuxライクな開発環境を作るための第一歩として、
CygwinのフルインストールとCygwinのシェルからNTEmacsを起動させるための設定
について解説する。



・Cygwinのインストール
以下のページにアクセスして、setup.exeをダウンロード。
パッケージを選ぶのが面倒なのですべてインストール。
ミラーサイトは日本のサイトからのほうが断然早い&HTTPよりはFTPということで
jaistのftpを利用すると早い気がする。


・NTEmacsの設定
以下のページにアクセスしてemacs-23.3.zipをダウンロードして "/usr/local"に展開。
Cygwinシェルで、 /usr/local/bin に移動したあと
$ ln -s ../emacs/bin/runemacs.exe emacs
を実行。



これでCygwinからNTEmacsを立ち上げることができるようになりました。

2012年7月1日日曜日

Bluetooth(1)


新しい技術を学ぶ時は開発された理由と目的を正しく理解する.
どのような製品やサービスに応用すべきかの判断がつくようになる.


・通信エリアに応じたワイヤレスネットワークの分類


2012年6月23日土曜日

Pythonによるソーシャルデータ分析入門


■あらすじ


Facebookやtwitter.
いまや無くてはならないツールとなった.
いろんな人のつぶやきを見ていて,やってみたいことが出来た.
それは,つぶやきを利用して,いろんな会社の勤務時間帯を調べることだ.


twitter上にはリスト機能があったり,Facebookではプロフィールに勤務先があったりする.
例えば,twitter上にある「トヨタ2012」みたいなリストとFacebookにいるToyota勤務の人のつぶやきを収集して,そのアップデート時刻をヒストグラム表示してみれば大まかな勤務時間帯が可視化出来る気がしてならない.

勤務時間帯だけでなく生活リズムとかもわかるかも.
デスノートで,キラを特定するのにエルが使ってた方法だ.

いろいろと面白げなので,まずは,「入門ソーシャルデータ」という本を購入.
自身初のオライリー本ということもあって読破できるかは微妙だけど...



■Python環境設定とtwitterパッケージのサンプルプログラム


とりあえず今日やったこと.
Mac OS X 10.7 でpython開発環境のセットアップ.

1. python 2.7のインストール


2. MacPortsのインストール
 ここから MacPorts-2.1.1-10.7-Lion.pkg をダウンロードして実行.


3. easy_installのインストール
ここで書いてあるように以下のコマンドを実行.

   $ curl -O http://peak.telecommunity.com/dist/ez_setup.py
   $ python ez_setup.py



つぎにパッケージのインストール.
ここでは,networkx,numpy,twitter.
 $ easy_install networkx
 $ easy_install numpy
 $ easy_install twitter


twitterのトレンド取得について試してみる.
API側の仕様変更があり,書籍通りのコードでは実行できない.
このサイトの通りに実行すると取得できる.



■ついでにGAEへデプロイ
せっかくプログラム作るのだからウェブ上に上げたい!
てなわけでレンタルサーバーとしてGAEを利用してpythonアプリケーションのデプロイ設定.
ここを参照!

2012年6月19日火曜日

シェルスクリプト入門

会社の環境で仕事を進めるにあたり、シェルスクリプトの必要性に気づき少し勉強してみる。


■シェルスクリプトとは?
複数のコマンドをまとめて行う簡易プログラムのこと。

■サンプルプログラム
#!/bin/sh
echo "Hello World"

・"#!"以降に書かれたプログラムでスクリプトを実行する
・シェルの実行にあたり実行権限が必要になる場合があるので chmod u+x bashfile
・環境変数に「.」を記述していない場合はファイルの前に./を入れる必要がある


■シェル変数
変数名="値"  # =前後にスペースをいれてはいけない

$# : 与えられた引数の個数
$* : 全引数リスト
$number : シェルに与えられた引数名
$? : 最後に実行したコマンドの終了ステータス

■算術演算子
exprコマンドを使う。

(例) `expr 10 + 30`  # 40と表示される

■コメント
コメント部分の行頭に#をつける

■条件分岐
"["と"]"の前後に半角スペースを入れる(最後に";"をつけた場合は最後の半角スペースは必要無し)


if [ 条件 ];
then
else
fi

■参考文献

2012年6月17日日曜日

Javascript

公式サイト: https://developer.mozilla.org/ja/JavaScript
コンソール出力:  console.log(i);
コンソール表示(Chrome): ctrl+shift+j

■関数定義
 function func1(a,b){
  return (a+b);
}

■配列
var array = [1,2,3];
console.log(array[2]); // 3が表示される

■連想配列

var array2 = { 'year1000':1,'year2000':2,'year3000':3  };

■Javascriptのオブジェクト
 オブジェクト = プロパティ(属性)とメソッド(処理)

 var v =  new String("sample"); //new オブジェクトの種類();
 console.log(v.length); //文字列の長さを表示

一定時間後に何かする
setTimeout(処理の内容 , 処理までの時間をミリセカンドで)

一定周期ごとに何かする
setInterval(処理の内容 , 処理までの時間をミリセカンドで)


// 学習ソースファイル1 ☆★☆★☆★☆★☆★☆★☆★


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>JavaScriptの勉強</title>
</head>
<body>
    <h1>JavaScriptの勉強</h1>
    <script>
        // ループ(while)

function sum(a,b){
return (a+b);
}
       

var array = [1,2,3];
var array2 = {'year2000':100,'year2001':200,'year2002':300,};

var obj1 = new String("this is a pen.");
console.log(obj1.substr(2,2));

console.log(obj1.replace("pen","pencil"));

var obj2 = new Array(12,33,44,55);
console.log(obj2.join("|"));
console.log(obj2.reverse());
       
var obj3 = new Date(); // 月:0~11
console.log(obj3.getMonth());


console.log(Math.PI); // プロパティ
var x = 5.332;
console.log(Math.floor(x)); // メソッド
console.log(Math.random(x)); // メソッド

// Browser Object Model(BOM)
// JavaScriptではブラウザのウィンドウ自体もオブジェクトとして扱うことができます
console.log(window.innerHeight);
//window.location.href = "http://google.com";

// Document Object Model (DOM)
// ブラウザ内の文書を操作するためのDOM
console.log(document.width);
document.body.bgColor = 'red';


    </script>
</body>
</html>




// 学習ソースファイル2 ☆★☆★☆★☆★☆★☆★☆★
<!DOCTYPE html>
<html lang="ja">
<head>
   
    <title>JavaScriptの勉強</title>
</head>
<body>
    <h1>JavaScriptの勉強</h1>
    <p>僕の名前は<span id="myName">@taguchi</span>です!</p>
    <p>価格: <input type="text" id="price">円</p>
    <p><input type="button" value="クリック!" id="myButton"></p>


    <script>
        // DOM
        var e = document.getElementById('myName');
        e.innerHTML = 'たぐち';
       
        var n = document.getElementById('price');
        n.value = 500;


// イベント処理
        var e = document.getElementById('myButton');
        e.onclick = function () {
            alert("クリックされました!");
        }
       

        // タイマー処理
        // setTimeout: 一定時間後になにかする
        setTimeout(function () {
            console.log("2秒たちました!");
        }, 2000);
       
        // setInterval: 一定周期ごとに何かする
        var i = 0;
        setInterval(function () {
            console.log(i);
            i++;
        }, 1000);
    </script>


</body>
</html>




2012年6月16日土曜日

ドットインストール(3)



■ファイルの作成削除コピー移動
作成: vi filename
削除: rm filename
コピー:cp file file2(fileをコピーしたfile2の作成)
移動: mv test.txt path(pathの位置にファイルを移動,名前変更にも使える)


■ファイルの中身をみる
cat : 中身を見る
less / more : コマンド実行結果を少しづつ見る
head / tail : 最初/最後の10行を表示

■ワイルドカード
* : 任意の文字いくつでも
? : 任意の一文字

■ディレクトリやファイルの検索 find
find [] -name "" -type [d|f]

例) find . -name "test_*" : カレントディレクトリ内の"test_"ではじまるファイルとディレクトリを探す
ファイルだけ見たい時は "-type f",ディレクトリだけ見たい時は "-type d"をオプションで付ける.



■ファイルの中身を検索
grep -[] [] []

grep 111 * : 今いるディレクトリ内のファイルで文字列111を含むファイルを表示
オプションで -c をつけると出てきた回数も表示する
ディレクトリ内も再帰的に検索してほしい時は -rをつける.


■コマンドラインの便利な使いかた
Tabキー : 補完(2回押すと候補を表示)
矢印キー : 過去のコマンドを表示
history : 過去に行ったコマンドを表示

!222 : 222に実行したコマンドを実行
!! :直前のコマンドを実行
!gr : grepではじまる一番最後のコマンドを実行
!gr:p : grepではじまる一番最後のコマンドを表示


■便利な小技
man : マニュアルを調べる(スペースで下へ)
tree : ディレクトリの構造
date : 時間を表示
cal : カレンダー表示
wc filename : ファイルの行数等を表示(-lで行数)


2012年6月12日火曜日

ドットインストール(2)


Unixコマンドの基礎のメモ

■Unixコマンドを覚えると...

- レンタルサーバーのうちSSH接続
- CentOSにMacターミナルから一般ユーザーでログインする

■ログイン,ログアウト
ログイン:ssh username servername
ログアウト:exit

■パスワード変更 passwd

■ディレクトリの移動
現在地:pwd
ディレクトリの移動:cd hoge
ホームディレクトリに戻るときはcdのみ
.は自分自身
..は一つ上のディレクトリ

■ディレクトリの中身を見る
ls : ディレクトリの中身を表示
オプション: 
-l : より詳しい情報
-a : 隠しファイルを見る
ディレクトリかどうか,
所有者,グループ,その他の人
r: read, w:write, x:実行
ファイルの所有者 属しているグループ
サイズ
最終更新日
名前

■パーミッションの変更
4r 2w 1x
rwx = 4+2+1

chmod _ _ _ ディレクトリorファイル

(ex) chmod 755 dir
755⇔ rwx r-x r-x

■ディレクトリの作成削除
mkdir dir : dirを作成
rmdir dir:dirを削除
■■■■■■■■■■■■

2012年6月10日日曜日

ドットインストール(1)

プログラムの基礎を手軽に学ぶためにドットインストールというサイトで勉強を始めた。

ここでは、初心者向けに3分以内の短い動画でプログラムの基礎を説明しているようです。

ウェブ系のプログラム言語だけでなく環境構築等のことも充実しており、かなり勉強になりそう!

てなわけで、まずはMacOS上の仮想端末でCentOSを使えるように設定。
インストールに時間がかかるので同時並行でエディタに慣れる目的でVimの学習をする。



■CentOSをVirtualBox上で動作させる
CentOS、VirtualBox、Hosterのダウンロードとインストール。
細かい設定等は動画を参照。
CentOSにhttpdパッケージをインストールしてWebサーバーが構築される。
Apache,PHP,MySQLのインストール。
セキュリティの設定(selinux,iptablesの無効化)。
Cyberduckの設定
html,phpファイルをブラウザ上で動作確認


■Vimの学習
insert,select,コピペ、カーソルの移動についてのコマンドを覚えた(つもり)。




-- 覚書
VirtualBox上でCentOSを立ち上げる
HosterでIPアドレス解決
コマンドライン上でsshでログイン
Cyberduckでファイル作成
ブラウザ上で確認 (http://***.dev/hoge.html ) 

2012年5月13日日曜日

内向的で無口な人向けの会話術


社会人生活をしていて,初対面の人と付き合う機会が増えてきた.
年の離れた人と飲み会で同席することもあった.
そこで気づいたこと....


ほんっっっっとうに話す話題がない!沈黙だらけ!超気まずい!


どうしたら良いかわからんので,書店でコミュニケーション関連の本を立ち読みしてきた.
以下参考になった点について述べる.
数冊パラパラと読んでみて,「相手に喋らせる」とか「うなづく」とか細かいことが色々書かれていた.
人間っていうのは自分のことを話したがる生き物で,聞いてあげることで相手が気持ちよく喋れるとのこと.


質問の種類は大きく分けて二種類で,一つは「タテに掘り下げる質問」
ある人が「○○が好きなんだ」とか言った場合は,
「いつから好きなの?」 「何で好きになったの?」とか5W1Hの切り口で一つの話題を掘り下げて会話を広げる方法.

もう一つは「ヨコの質問で話題を広げる質問」
これは,会話の最中に出てきたワードについて広げていく方法.


上記2つの方法を使って社会人生活をどうにか乗り切ろう!

2012年5月7日月曜日

構文エラー : ';' が '型' の前にありません


ずっとC++言語の勉強してたけど,久しぶりにC言語をいじってみた.
構造体周りの復習のためにVisual Studio 2010つかってプログラムを書いたところ,
ど忘れしてた箇所があったので記載.


こんなプログラム書いた.


#include <stdio.h>


struct Kozotai{
int num;
float height;
};


int main(){

struct Kozotai aaa = {10,10.22f};



printf("aaa.num : %d",aaa.num);


//出力結果確認用
int tmp;
scanf("%d",&tmp);

return 0;
}



そしたら

構文エラー : ';' が '型' の前にありません。

って怒られ続ける.
出力結果確認のためにプログラムを一旦止める処理を加えたくてtmpとか宣言してるんだけど,これがダメらしい.

C言語では変数宣言が途中にあるとエラーを吐くんです.
てなわけで宣言部を上にもってったらコンパイルエラー消えました.


2012年4月26日木曜日

メーカーで働くということ


社会人になって3週間が過ぎようとしている.
某メーカーに就職した俺が今思うことを述べる.


1.成長の遅さ

企業文化に馴染ませるためか,研修を長々やっている.
会社に馴染むという意味では成功しているが,客観的に見て成長しているかは実感が無い.
若いうちは目に見えるスキルを身につけたいが,全くそんなことはやっていない.
自分で食っていけるエンジニアの階段は確実に登れていない.


2.大企業であるということ

たくさんいる社員の中の一人になろうとしている.
会社が凄いから付き合ってくれる人はいっぱいいそうだが,自分自身は何も凄くない.
自称優秀な肩書きで就職した大企業.
福利厚生も手厚く収入面では何の苦労も無いだろうが,将来の自分の市場価値には自信がない.


GREE田中社長の言葉を思い出す.
「これから成長する市場で,会社とともに成長することが幸せである」


自分で学ぶ姿勢が必要だと最近は強く思う.

2012年4月13日金曜日

信号処理のフレームワーク

ロジカルシンキングというスキルが巷で話題になっている.
私の中では,複雑に入り組んだ問題を頂点に置き,漏れなくダブりのない(MECE,Mutually Exclusive and Collectively Exhaustive)ような切り口(フレームワーク)で複数の要素に切り分ける作業を繰り返し行い,物事の問題点を追及するものであると捉えている.


聞きなれないフレームワークという言葉についてふと思ったことがある.
私は数理科学関連の研究,特に信号処理関連の研究を大学院まで続けていた.
研究テーマは複数種類やってきたが,根底は信号処理ということで考え方や研究の進め方は共通していた.

3年間の研究経験を元に,信号処理の研究の流れを私なりに簡潔に述べると,


考える対象の数理モデルを考え,
何らかの評価基準を立て,
解析可能な最適化問題を導出し,
最適化手法を適用し解を得る.


といった内容であると考えている.
私の中では,「信号処理のフレームワーク」として定着している.
作業を効率化する上でも,定着した考え方を自分の中に持っているというのは強みであると思った.

今後の仕事においても,単純作業や繰り返し行う必要のある業務等に関して言えば,こういったフレームワークを自分なりに考えて構築していくのは有益であると思われるので,頭の片隅にでもおいておこうと思う.

デザイン系の衝撃

新入社員研修で,様々な経歴を持つ人たちと触れ合って思ったこと.
デザイン系はなんでもグラフィカルに考えようとする.
図にして理解しようとする.
逆に,図に出来ない場合は理解が困難であったりもする.
図解は共有が容易で,万人に対して有効であることを知った.

文系の人たちは人の感情を汲み取り,意見を組み込むことに優れている.
あいまいな議論に関して思ったことを雑多に言う傾向はあるものの,議論を活性化する役割をすると言う点でいい働きをしていると思う.

理系は発言数は少ないものの,話の交通整理や,論理の一貫性についてのチェックを怠らないと思われる.


私は理系というカテゴリに属し,典型的な理系人間なのであるが,デザイン系から受けた衝撃は大きい.
考えた内容を図で表現する.
例としては,物流に関しては,モノの流れのフローを時系列で図示したりする.
時系列で切れなければ,要素をカテゴライズし,抽象度に応じて並べたりする.
こうしたことは頭の中ではできているが,それを図に表現するというフェーズにおいてはクリエイティブな要素が絡むと思う.
図にできない時点で,頭の中は混乱しているのかもしれないが.

とにかく,「なんでも図にして考える」というデザイン系から受けた衝撃は今後何らかのカタチで以下していこうと思った.

2012年4月11日水曜日

社会人になって

大学院を修了し、先週会社に入った。
会社の同期を見ていて、優秀だなと思う人がたくさんいる。

会話を広げるのが得意で、欲しい情報をいとも簡単に聞き出せる人。
学生時代からプログラマとして実績をあげている人。
終業後も自己啓発等に熱心に取り組んでいる人。

いろんな面で学ぶものは多く会社に入ったというより、まだ学校にいる感じ。
学びながらお金をもらえるということはかなり恵まれていると思う。
入社後数年間は、ウェブまわり(サーバー保守やアプリ開発)のスキルを身につけたい。
仕事で得た力を、週末等の空いた時間を使ってアウトプットしていければさらにいいと思う。

給料は数年間はあまりもらえないとのことなので、起業とまではいかないが、アフィリエイト・投資・輸入とかに興味を持っている。
会社に頼るんじゃなく自分でお金を稼げる人間になりたい。

2012年3月27日火曜日

Emacsコマンド

Emacsのコマンドを少しずつ覚えていくことにする。
まずはコマンドラインから
$ emacs & // emacsの立ち上げ(バックグラウンドで動かす為に"&"つける)
立ち上がった後は、Emacsコマンド集を参考にして必要最低限のコマンドを使いながら覚える。

C-x C-f
ファイルを開く
C-x C-s
ファイルのセーブ
C-g
コマンドのキャンセル
C-x u
最後の操作の取り消し
C-x C-c
Emacsの終了
C-w
指定範囲のカット
M-w
指定範囲のコピー
C-y
切り取りorコピーした内容を貼り付け

C-x C-w
別名のファイルにセーブ
C-x k
ファイルを閉じる
M-x goto-line
特定の行へ移動

C-x 
全選択

C-s
文字列の検索


2012年3月25日日曜日

Linux入門 / Emacs,コンパイラ

作業効率をあげたい!
Windows上でGUIベースで作業してると待ち時間が生じてあんまり快適じゃない!

そんな気持ちが芽生えたのでエディタを探してみることにした。
既にあの有名なeclipseと呼ばれるIDE(統合開発環境)を使ったことがある俺は、CDTのプラグインをインストールする気満々だった。

学生時代に周囲にいた情強たちはeclipseを経由してから結局Emacsやvimを使っている様子。
調べてみたらエディタ界には 「Emacs VS vim」 みたいな構図があるらしいことがわかった。
拡張性という面でemacsに可能性を感じた俺はEmacs軍につくことにした。
http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%88%A6%E4%BA%89



ここからはCentOS上でEmacsのインストール手順の覚書。
スーパーユーザーになって yum を唱えるだけ。
yumって何の略なのか気になったんだけど、

Yellowdog Updater Modified

なんだってさ。
語源から抑えたかったけど意味フですわ。
以下コマンド。

# yum install emacs // emacsのインストール
# yum install anthy-el // 日本語入力を可能にする

ついでにCコンパイラもインストールしたった!
# yum install gcc*

Linux入門 / ツールのインストール

2年前に5万で買った低スペックPC。
Linuxの知識が皆無で、かつ会社に入ってから苦労しそうなので仮想化かデュアルブートを検討した。

仮想化はOSの上にOSが乗る。
再起動を伴わずにOSの切り替えができる点はメリット。
マシンのスペックが高くないと使える速度では動かないのがデメリット。
試しにVMWARE入れてUbuntuぶち込もうとしたけど端末起動するだけで耐えられないくらい遅い。。。

デュアルブートはその逆で、OSは再起動しないと変更できない。
パーティションを分けたりするのは面倒だけど、ググりながらやったら難なくできた。
Cドライブ内の空き領域を増やせばいいんだろーと思っていろいろファイル消した。
DVD経由でCentOSインストールしようとしたけど空き領域が無いとのこと。
Cドライブあいてるのに。。。

結局「空き領域」の捉えかたが違って、Cドライブ内の領域ではなくて、Cドライブ外の空き領域が必要だったみたい。
そこでパーティションいじる方法を見つけるためにググる!
http://pasofaq.jp/windows/mycomputer/makedrive.htm
これに書いてあるとおりにwindows7上で操作していったら「空き領域」ってやつができた。
あとは下記の書籍に書いてあるインストール方法どおりにCentOSをインストールしたらデュアルブート完了。

2012年3月23日金曜日

通信の歴史

TCP/IPの勉強をしている.
通信の歴史についての記述がわかりやすくて面白いのでまとめる.


主に軍事目的で発展してきた通信技術.
通信の始まりは狼煙(のろし)からきている.
敵の侵攻を遠くにいる人に伝えるために煙をあげた.
煙が見えないほど遠くにいる人に伝えるためには,中継地点を設けて遠距離通信を可能にしていた.
この方式には2つのデメリットがある.
1つは単位時間あたりに送れる情報は極めて小さいこと.(伝送効率)
もうひとつは,各地点に人を配置するため人的リソースが必要であること(コスト)
中国の万里の長城では,煙に替わって灯火を用いて同様の通信を行なっていたと言われている.

次に出てきたのはモールス信号
ここでは,情報と二種類の信号(トン/ツー)の対応関係を定めるアイディア(符号化)が採用された.
また,信号の開始の合図,理解したかの確認,信号の終了の合図といった規則(プロトコル)も使っている.


上記の内容は独習TCP/IPを読んで内容を再編集したものである.
この後の内容としては,電信,文字コードといったものが解説されていた.
通信の歴史を導入としてTCP/IPの説明をわかりやすく解説している点で本書は秀逸であると思う.


わからないものは歴史的経緯から理解していくと,記憶に残るし理解しやすい.
技術の仕様における「なぜ?」を解決する方法として「歴史を学ぶこと」の重要さが身にしみてわかった.

Google App Engine for Java (1)

Java入門のためにGoogleのクラウドサービス"Google App Engine for Java(以下GAE/J)"を初めてみた.
Eclipseという統合開発環境(IDE)で開発することを想定した環境構築を説明します.
やることは以下の4つです.

1. JDK(Java Development Kit)のインストール
Javaの開発をするので当然JDKは必要です.GAE/JではJava5,6に対応しています.

2. GAE/J SDKのインストール
Googleのサイトを参照

3.Eclipse for Java EE Developersのインストール
このパッケージは,web開発向けツールがまとまってるのでこれをダウンロードする.
デフォルトでは英語なので,日本語化したいひとはPleiadesをつかうべし.
MacOSへのインストールの仕方はここ(http://macphp.sblo.jp/article/43286453.html)がわかりやすい.

4.GAEに登録
http://code.google.com/intl/ja/appengine/

2012年2月21日火曜日

テルマエ・ロマエに見る法則

いま話題の「テルマエ・ロマエ」をコンビニで立ち読みしてきた.
Wikipediaにある概要は以下のとおり.

古代ローマ時代の浴場と、現代日本風呂をテーマとしたコメディである。入浴文化という共通のキーワードを軸に、現代日本にタイムスリップした古代ローマ人の浴場設計技師が、日本の風呂文化にカルチャーショックを覚え、大真面目なリアクションを返すことによる笑い[2]を描く。

面白い部分は,まさにここに書かれている通り「古代ローマの大真面目なリアクション」にある.
異なる時代の異なる人種からみた日本の風呂の面白さと,表現の秀逸さ.
 - 書店員の選ぶマンガ大賞2010[4]
 - 第14回手塚治虫文化賞短編賞[2]受賞
 - 「このマンガがすごい!」2011年版オトコ編2位
 - 全国書店員が選んだおすすめコミック2011、3位入選。
これらの実績からも,万人受けする名作であることは間違いない.


テルマエ・ロマエは,古代ローマ時代と現代日本を行き来する古代ローマ人の物語.

互いに重なり合わない2つの時代を主人公が行き来するパターン
これは最近の勝ちパターンのような気がする.

TBSで高視聴率だったドラマ,「JIN - 仁-」.
これは,主人公である南方仁が現代から江戸時代にタイムスリップする話.

売れっ子作家の中には,【いま売れる物語の公式】が暗黙知として宿っているのではないだろうか.

2012年2月9日木曜日

問題解決プロフェッショナル 「思考と技術」

問題解決プロフェッショナル 「思考と技術」 を2章まで読んだ.
2章の技術編では有用な知見が多かったのでここにまとめておく.



【はじめに】


問題の原因や解決策を考える際に,思いついた順に箇条書きにする人はいないだろうか?
はい,私です.
苦労して列挙したリストが増えれば増えるほど混乱して最終的に考えたことが無駄になったり...
次元の異なる要素が同じカテゴリーの中に列挙されていたり...
(例 : アメリカ,中国,オーストラリア,京都...)


箇条書きの問題点は3つ.
1つは漏れ
「これ以外にも要素は無いですか?」
という問いに胸を張ってNOと言い切れるだろうか.

2つ目はダブり
一見異なるもののようでも,実は本質的に同じことを言っていたりする.
本来同じものは極力排除したい.

最後は次元の違い
分析結果をプレゼンテーションする際に,次元の異なるものを一緒くたにすると聴衆に伝わらない.
他人から見ても分かりづらいし,時間が経てばそのうち思い出せなくなる.

こういった問題を無くすために,システマティックに思考の整理を行うツールとしてMECEとロジックツリーがある.



【MECE】

MECE (Mutually Exclusive and Collectively Exhaustive)とは,もれなくダブりのない状態のこと.
簡単な例としてはジャンケンにおける手.
「グー・チョキ・パー」,これでMECE.



フレームワークと呼ばれる決まった切り口を使って,MECEな状態に問題を切り分けることで思考の整理を行う.

・代表的なフレームワーク
  3C+1C : 顧客(Customer),競合(Competitor),自社(Company) + 流通チャネル(Channel)
  ビジネスシステム : 製品が開発されてから市場に出るまでの流れを時間軸で整理したもの
  4P : 製品(Product)、価格(Price)、流通(Place)、プロモーション(Promotion)
  事業ポートフォリオ : 相対マーケットシェア × 市場成長率





【ロジックツリー】


問題の原因を深堀りして,解決策を具体化し,因果関係を可視化する技術のこと.
思いついた順の箇条書き,即ち根拠のないアイディア出しからの脱却のためには必須なツール.
やり方は,課題の問題や解決策をMECEに分解し続けるだけ.
これ以上やっても意味が無いくらいに掘り下げられたら,枝にある要素を優先順位付けする.




ロジックツリーの例として痩せる方法のロジックツリーと箇条書きの差異を説明するサイトがあった.
かなり参考になる.




【最後に】


今回は,問題解決プロフェッショナル 「思考と技術」における2章の思考ツールのみをまとめた.
この本はコンサルティングファーム等で配られる程の名著のようだ.
実際に読んでみても読みやすく,得られるものも多い.
一般的にMECEやロジックツリーが浸透すれば,社内会議等も効率的に行えると思う.
もっと幼少期にこの本に出会って,雑然とした思考を一刻も早く追い出したかった.
これからはこの技術を体得するために日常生活等でも応用していこうと思う.





2012年2月5日日曜日

C++プログラミング入門(5) // 配列とnew,ポインタと参照

配列とnew

【int array[5];】と【int *array = new int[5];】の違い

・配列には「必要なメモリの大きさがコンパイル時にわかっている」「関数が終わるときに必ず解放する」制限がある

・newは上記の制限がない分,メモリの空き場所を探すのに時間がかかる

参照とポインタ

・参照は必ず初期化する必要があり,指すものを変えられない.(安全)
・ポインタは上記の成約がない.(気をつけるべし)

データ量の大きいクラスTを引数とする関数func (例えばこんなの void func(T t){} )
を呼び出した時,コピーが生成される.
このムダを省くために,
「書き換えるときはポインタ渡し,書き換えないなら参照」
を徹底するべし.
(ポインタでも 書き換えたくない場合はconstをつければ参照と同様な効果が得られるが,呼び出し側のコードを見ただけでは判断できなくなるので使い分けること)

C++プログラミング入門(4) // C++文法について

【テンプレート】


#include
using namespace std;

// Type型のメンバ変数をもつクラスA
template  class A{

private:
 const Type data;

public:

 A(){
  cout << "default constructor\n";
 }


 A(Type d):data(d){ // 初期設定なので代入
  cout << "constructor\n";
 }

 /*
 A(Type d){
  data = d; // constなメンバに代入はできない
  cout << "constructor\n";
 }
 */

 ~A(){
  cout << "destructor\n";
 }

 Type getData(){
  return data;
 }
};

int main(){

 A  hoge_float(1);
 A  hoge_int(3.3);
 A  hoge_double(3.3);

 cout << "hoge_float:" << hoge_float.getData() << endl;
 cout << "hoge_int:" << hoge_int.getData() << endl;
 cout << "hoge_double:" << hoge_double.getData() << endl;

 return 0;
}

C++プログラミング入門(3) // File入出力

ステージデータの読み込み機能をつけて任意の名前のファイルを読み込める構成にしたい.
エラー処理等は全く考慮せず,ステージの幅と高さについては固定長のものしか扱えない点は改善すべき.

void readFunc(char *fileImage,const char *filename){

 ifstream inputFile(filename,ifstream::binary);
 inputFile.seekg(0,ifstream::end);

 int fileSize = static_cast<int>(inputFile.tellg());
 inputFile.seekg(0,ifstream::beg);
 inputFile.read(fileImage,fileSize);

}

int main(){

 char filename[100];
 char *gStage;
 gStage = new char[gHeight*gWidth];

    // 読み込み開始--------------

 cout << "Please input a file name:";
 cin >> filename;
 readFunc(gStage,filename);

    // 読み込み完了--------------


 return 0;
}



【備考】
2次元のように見せるクラスの定義では,非公開メンバとしてポインタ・縦・横をもたせ,参照用の公開メンバ関数を用意する.
メンバ変数には先頭にmを付ける.

C++プログラミング入門(2) // 前回のまとめと条件分岐の考察

【前回のまとめ】

ゲームとは入力を受け取って,それを反映させ,結果を表示する処理の繰り返しである.
イメージは, while(1){ 入力; 反映; 表示; if(クリア){ break; } }

(チェック)
・文字列定数の途中での改行
⇒行末に"\"を付ける

・グローバル変数の命名規則
⇒接頭辞としてgをつける+キャメル記法で読みやすく

・constの使い方
⇒変更する予定のないものには極力付ける

・列挙型のメリット
⇒未定義の値を許容しない,デバッグ時列挙型の名前で見られる.
なお,列挙型の名前は大文字で.

・メモリの解放
⇒delete と ポインタに0代入

・1次元配列を2次元的に扱う
⇒ state[y*width + x] : 幅widthの2次元配列における(x,y)成分にアクセス.

・移動は差分で
⇒ 現在地 + 移動幅 で記述するとプログラムが簡潔に書ける.

・計算で求まる情報は極力保存しない.矛盾が出ると厄介だから

・キャラの移動時にはステージ内かどうかを先に確認

・三項演算子
⇒ a = b ? c : d (bがtrueならa=c; bがfalseならa=d;)


【条件分岐における思考過程】
キャラクターが動作するときのupdate関数では,定義されない動作が無いように,MECEになるように網羅的に条件分岐を考える.

今回は,列挙型のObjで定義された
SPACE,WALL,GOAL,MAN,MAN_ON_GOAL,BLOCK,BLOCK_ON_GOAL,UNKNOWN,
という8パターンの状態と,現在地,移動先,移動先の奥における組み合わせを網羅的に考える.
単純に考えると8×8×8通りあるように見えるが,あり得ない組み合わせ(動作が許容されない,そもそもありえない)を省いて考えるとさほど考える状況は少ない.
動作が許容されないケースの例としては移動先が壁である場合などがある.
そもそもあり得ない場合としては,現在地にMAN,MAN_ON_GOAL以外が入るケース.

現在地は2通り,移動先は4通りに絞られる.
コードとして定義が必要な場合は,6通りのケース(【参照:概念図】)のみ.
簡単のため,今回は愚直にswitch構文でこれらを実装した.
同じようなコードが多々あり冗長性があるためまたコードは簡素化出来る.
今回は漏れを無くすための思考訓練として安定的に動くプログラムを実装したつもりである.


【概念図】


Blogger上にプログラムソースをきれいに表示する方法

Blogger上にプログラムソースをきれいに表示する方法として,ここ( http://toldalie.blogspot.com/2012/01/blogger_31.html )
が参考になりました.


まとめると,
(i) HTMLコードをここ( http://www.way2blogging.org/widget-generators/syntax-highlighter-scripts-generator )で生成してコピー.

(ii) Bloggerの ”デザイン>HTMLの編集>” でテンプレートのソースを表示し(i)でコピーしたコードを</head>の直前にペーストする.

(iii) 投稿記事をHTML編集モードで開いて以下のタグを挿入.
<pre class="brush: c++; tab-size: 2">
// コードを記述</pre>
上記ソースはC++プログラムを貼り付ける場合の例.



実際に使ってみたら,
作成された HTML ファイルは承認できません: タグが破損しています:
とか怒られる.
無視して記事を投稿すると,ソースが変わってたりする.
いろいろ調べたら,”<”とか”>”はHTMLにおけるタグと勘違いしちゃうよ!ってのに気付いて.
"<" ⇒ "&lt;"
">" ⇒"&gt;"
に置き換えたら怒られなくなった.
SQLインジェクションとかサニタイジング周りを昔浅く勉強してたのですぐトラブルシュート出来た.
参考サイト: http://www.imymode.com/lab/keiji03.htm

2012年2月4日土曜日

C++プログラミング入門(1) // 倉庫番プログラムの実装

うまく修論が通れば大学院を卒業して,晴れて社会人になる.
入社試験でC++のプログラミングを課されるくらいなので,きっと仕事でC++を使うんだろう.
そこで,軽く文法等を覚えるために入社前に勉強することにした.

【現状】
研究ではもっぱら数値計算用ソフト(MATLAB)のみを使っており,メモリ等を意識してプログラムを組むことは無い.
変数の宣言やメモリの確保のような行儀の良いプログラムを書くのは3年前くらいにCでかじった程度.

純粋に文法を勉強するのもあほらしいので,


ゲームプログラマになる前に覚えておきたい技術



っていう分厚い本を買って読むことにした.

第一章ではいわゆる倉庫番のプログラムのお勉強.
読みすすめていくと,プログラムから醸しだされる著者の優秀さを感じ取った.
優秀なプログラマの書くプログラムは読んでて感動する.


本を読んでみて重要だと思った点をコメントアウトで追記しつつプログラムを組んだ.
以下はコンソール上で倉庫番を楽しむプログラム.
コピペしてコンパイルすれば動くはず.


#include<iostream>
using namespace std;


// ステージのオブジェクトの定義
// 列挙型に出来るときはなるべく使う.
// 利点は2つ.変な値が入らない+デバッグの際に列挙型の名前で確認できる.
// 区別のために要素は大文字.
enum Obj{
// 列挙型は単なるint型
SPACE, // 0
WALL, // 1
GOAL,
MAN,
MAN_ON_GOAL,
BLOCK,
BLOCK_ON_GOAL,

UNKNOWN,
};


// ステージ
// グローバル変数はどこからも見えるので接頭辞をつけて区別する.
// いじらない変数にはconstをつける.
// キャメル記法推奨.
// 文字列定数の途中で改行する場合は文末に\が必要.
const char gStage[] = "\
##########\n\
#    p   #\n\
#  .o  0 #\n\
#        #\n\
##########";

// 幅と高さ
const int gHeight = 5,gWidth = 10;

void initialize(Obj *state,const int height,const int width,const char *stage){
const char *p = stage;
int x=0,y=0;

while(*p){
 Obj t;
 switch(*p){
  case ' ': t = SPACE; break;
  case '#': t = WALL; break;
  case '.': t = GOAL; break;
  case 'p': t = MAN; break;
  case 'P': t = MAN_ON_GOAL; break;
  case 'o': t = BLOCK; break;
  case '0': t = BLOCK_ON_GOAL; break;
  case '\n': t = UNKNOWN; y++; x=0; break;
  default : t = UNKNOWN; break;
 }

 if(t!=UNKNOWN){
  state[y*width+x] = t; // 縦height,横widthをもつ二次元配列における(x,y)にアクセス.
  x++;
 }

 p++;
}
}

void draw(const Obj *state,const int height,const int width){
const char c[] = {' ','#','.','p','P','o','0'}; // 列挙型は単なるint型
for(int h=0;h<height;h++){
 for(int w=0;w<width;w++){
  cout << c[state[h*width+w]];
 }
 cout << "\n";
}
}

void update(Obj *state,const char input,const int height,const int width){

int x,y,tx,ty,dx=0,dy=0;
int p,tp,tp2;

// 移動方向の定義
// 位置 + 差分
switch(input){
 case 'a': dx = -1; break;
 case 's': dx = 1; break;
 case 'w': dy = -1; break;
 case 'z': dy = 1; break;
 case 'q': cout << "Bye"; break;
 default : cout << "undefined input\n please input \"a,s,w,z\""; break;
}

// プレイヤー位置の探索
for(int i=0;i<height*width;i++){
 if(state[i]==MAN || state[i]==MAN_ON_GOAL){
  x = i%width; // 現在地のx座標
  y = i/width; // 現在地のy座標
  // 計算で求まる情報はなるべく保存しないほうがいい...
  p = i; // 現在地
 }
}

// 移動できるか判定
tx = x + dx; ty = y + dy;
if(tx < 0 || width <= tx || ty < 0 || height <= ty){
 cout << "can't move";
 return;
}

// 移動先の計算
tp = ty*width + tx;
tp2 = (ty+dy)*width + (tx+dx);

// 移動
switch(state[tp]){
 case SPACE:
  state[p] = (state[p]==MAN) ? SPACE : GOAL;
  state[tp] = MAN;
  break;

 case GOAL:
  state[p] = (state[p]==MAN) ? SPACE : GOAL;
  state[tp] = MAN_ON_GOAL;
  break;

 case BLOCK:

  switch(state[tp2]){
   case SPACE:
    state[tp2] = BLOCK;
    state[tp] = MAN;
    state[p] = (state[p]==MAN) ? SPACE : GOAL;
    break;

   case GOAL:
    state[tp2] = BLOCK_ON_GOAL;
    state[tp] = MAN;
    state[p] = (state[p]==MAN) ? SPACE : GOAL;
    break;

   default:
    break;
  }
  break;

 case BLOCK_ON_GOAL:

  switch(state[tp2]){
   case SPACE:
    state[tp2] = BLOCK;
    state[tp] = MAN_ON_GOAL;
    state[p] = (state[p]==MAN) ? SPACE : GOAL;
    break;

   case GOAL:
    state[tp2] = BLOCK_ON_GOAL;
    state[tp] = MAN_ON_GOAL;
    state[p] = (state[p]==MAN) ? SPACE : GOAL;
    break;

   default:
    break;
  }
  break;

 default:
  break;
}


}

bool isClear(const Obj *state,const int height,int width){

for(int i=0;i<height*width;i++){
 if(state[i]==BLOCK){
  return false;
 }
}

cout << "Congratulations!!";
return true;
}

int main(){
char input;
Obj *state = new Obj[gHeight*gWidth];

initialize(state,gHeight,gWidth,gStage);
draw(state,gHeight,gWidth);

do{
 cout << "Input:";
 cin >> input;

 update(state,input,gHeight,gWidth);
 draw(state,gHeight,gWidth);
}while(input!='q' && !isClear(state,gHeight,gWidth));


delete[] state; // メモリの解放
state = 0; // 使い終わったポインタには0を代入


return 0;
}







【実行画面】