2年生になった

なんだかんだで1年働いて、エンジニアとしては2年生になった。

ので、今までのこととか、今後についてちょっと考えてみる。
ピカピカの1年生の参考になったらいいな。

1年前の自分
  • とにかく技術力が足りてないからいっぱい勉強しよう
  • やらなくていい理由を考える前にやろう
  • 家に帰ったらとりあえずなんか動くもの作ろう
1年経った今の自分
  • とりあえず知識は増えたから、わからないことでも知ってる知識でなんとかしよう
  • いろんなことがめんどくさい
  • 23時くらいに帰って、すぐ寝るようになった


というわけで、精神面では見事にクズ野郎に進化してしまった!
でもここで諦めないで、いわばマスクっちから究極進化しておやじっちへの道をがんばって歩みたい。

1年でできるようになったこと

  • Emacsの基本的なキーバインドを使えるようになってタイピングが爆速に進化した
  • RailsAPIが書けるようになった
  • Railsのテストコードが(怪しいながらなんとか)書けるようになった
  • 実際のサービスをデプロイしたりバッチ書いて動かしたりできるようになった
  • Flashで、FlexとPureMVCのフレームワークを使って処理をいろいろ書けるようになった
  • Gitでコミットから始まってリポジトリとかブランチ作ったりマージとかリバートとかいろいろ覚えた
  • fayeを使ったリアルタイムチャットを実装できるようになった
  • さくらのレンタルサーバでサーバ借りて若干だけどCentOSいじれるようになった
  • PythonSkypebot作れるようになった
  • Google Apps Script で Google Spread Sheet をいじり倒せるようになった
  • Railsでファイルをサーバにアップロードする仕組みを作れるようになった <- NEW!!


挙げてみたらけっこうあった。いろんなことができるようになったんだなぁ、自分。

思えば、できることが多くなってからはスコープが狭くなったというか、前にも増してアンテナが低くなった気がする。

「納期」とか「コスト」とかいう単語が頭から離れなくなってからは、「今はちょっと時間かかるけど、今後のために最大効率のやり方を探す」っていうことができなくなってしまった。「とにかく今知ってる知識をつなぎ合わせてやったほうが時間かからなくね?」となって、結局もっといい方法を調べる前に思いついた方法で実装するようになってしまった。

今はちょっと前の忙しかった頃よりは時間ができてきてるから、また意識的に新しいことを学ぼうとしてるところ。
1年働いてみて、「時間はどうにかして作るもの」だと悟った。


つい最近だと、Railsでファイルアップロードする仕組み作るのに1日かかったし、RubyとかRailsとかの根本的なところの理解があんまりできてないことに気づいた。Rubyでファイル作ったり読んだりするコード書いてないんだよなぁ。

あと、エディタにEmacsを選んだのは本当に正解だった。
こいつのキーバインドのおかげで文字を打つ速度は爆速になった。KeySnail入れてFirefoxEmacsになったし、Mac付属のテキストエディタも簡易Emacsみたいなもんだ。

Emacsが最強だと言うつもりはないけど、やっぱりC-hでバックスペース打てるのとそうでないのとでは今後のコーディングに費やす時間は相当違うと思う。その時間の分だけ設計とかアルゴリズム考えられるわけだし。

Emacsを何かに例えるなら、「MP消費の少なくて済むいい杖」って感じだ。

できるようになりたい、ならなきゃいけないこと

  1. 複数のAPサーバが絡むことを想定したコード(データの不整合が起こらないようなコード)を書く
  2. DBに対するアクセスが最小で済むようなコード(メモリを意識して高速に実行されるコード)を書く
  3. MXMLじゃなくて生ASでUIを作って画面をコントロールする
  4. 基本情報の資格を取る
  5. DBの理解を深める
  6. gem作る
  7. Webサービス作る
  8. iPhoneアプリ作る


とりあえず、目の前の目標としては一番近いところで4,1,2で、自分で時間を作って家でアプリとか作るって感じかぁー。
複数のAPサーバが絡む場合のRailsコードの書き方でいい書籍があったら知りたいな。


いろいろ精神的に堕落しつつあるけど、今日からもっかい立て直していきたい。

これからっしょ!!

ゲームを作ろうと思う。コンプガチャはダメなんだろ?

いやいやみなさんお久しぶりです。su10です。
最近は「生JSが至高」とか言っておきながら、jQuery触ったらその強力さに悔い改めざるを得ない状況に陥っており、反省しきりでございます。

いやいや、だってセレクタって超強力じゃん!for文いらないから長たらしいJSコード書かなくていいじゃん!
すげーじゃん!!!

ゲームを作ろうと思う

それとは全然関係ないけど、ゲームを作ろうと思いました!
おっしゃーいっちょおもしれーゲーム作っか!!!

そもそも「ゲーム」ってなに?

でも、ちょっと待ってほしい。闇雲に作ってクソゲーを連発してもしょうがない。
自分が作ろうとしてるものについて、もう一度深く考えてみよう。

「ゲーム」ってなんだ?

ゲームは娯楽の一つだ!

とりあえず、「ゲーム」というもののひとつの側面として、「娯楽」であることが挙げられる。
娯楽ってのはたくさんあって、ゲームはその中の一つ。
とりあえずたくさん娯楽を出してみて、それらと比較することで多元論的立場で「ゲーム」の本質に迫ろう。

娯楽をたくさん挙げてみる

とりあえず思いつく限りの娯楽を挙げよう。
まだまだゲーム作りの最初の段階だから、発想はできるだけ自由なほうがいいよね。
書きだしたアイディアは、無駄は多いかもしれないけど、全部は無駄にならないはず。

というわけで、とにかく娯楽をたくさん挙げてみる。
ブレインストーミング開始ー

・・・


20分くらいでうんうん唸って出てきたのが約20個。
本来のブレストとしてはまだまだ足りてない個数だけど、本筋じゃないのと眠いからとりあえずこのへんで。
これらの中で、ゲームをゲームたらしめている要素は何かを考える。

一方通行か、そうでないか

映画やテレビは一方的に情報を発信して、それを受け取る。
対するゲームはそうじゃなくて、まず操作があって、それに対するレスポンスがある。

ゲームはその要素として、「インタラクティブ(相互)性を備えている」。

嬉しい、楽しい気持ちになることが期待される

娯楽全般に共通することとして、「嬉しい」だったり「楽しい」気持ち、心がプラスの方向に動くことを期待して、それを行うという点がある。
仕事のない自由な時間を過ごせる土日祝日に、わざわざ時間を割いてまで嫌な気持ちになることはしないよね。

ということで、

ゲームはその要素として、「プラス方向に気持ちが動いた状態になることが期待される」。
当然、それをやった結果は保証されてない(期待して買ったのにクソゲーだったとか)けど、少なくともはじめはそうであることが期待される。

明確な勝ち負け、もしくは成功・失敗がある

気持よくなることを期待して始めるのに、負ける場合もあるし、失敗もある。
だからこそ、気持ちいい状態であり続けるために、勝ち続けようと努力するし、負けたときに余計に悔しくなる。

ゲームはその要素として、「勝ち負けもしくは成功・失敗がある」。


眠いから続きはまた明日!

JavaScriptの知らなかったあんなこと・こんなこと

好きだけど、あんまりよくわかってなかった

JavaScriptが好き」「JSが最強の言語(ドヤァァァァァ」と会社で偉そうに言ってたけど、よく考えたらあんまり理解できてないことが多いことに気づいた。

改めてJavaScriptを勉強してみた

調子こいて散財して本を買うお金がなくなったので、Google先生に聞きながら勉強した。
いろいろ勉強して賢くなったけど、全部まとめると時間かかっちゃうので、とりあえず知らなかったこととか、忘れがちなこととかを以下にまとめる。

オブジェクトは連想配列(ハッシュ)である

以下のコードは参考サイトの引用。1〜5まで全部等価。

// 1
var obj = { hoge: 'hoge' };

// 2
var obj = { 'hoge': 'hoge' };

// 3
var obj = {};
obj.hoge = 'hoge';

// 4
var obj = {};
obj['hoge'] = 'hoge';

// 5
var obj = new Object();
obj.hoge = 'hoge';

1,2はたしかオブジェクトリテラルとかいう書き方で、キーはクォーテーションで囲んでも囲まなくても一緒(1,2の比較)。
3,4の違いは、3はキーが数字のときは値を取り出せない。4は取り出せる。

// 3と4の補足説明
var obj = { 0: "hoge" };
alert(obj.0);  //エラー
alert(obj[0]); //hogeが出力される

また、4の書き方は[]内の文字列を動的に作ることでオブジェクトのプロパティを動的に取り出せる。

window["ale" + "rt"]("hello!");  // alertが実行される

関数の参照に()をつけると関数が実行されることと、先に挙げた例を理解できてれば、上記の例は理解できるはず。自分はこのコードにびっくりしました。

なんか書いてて「プロパティ」「メンバ」「キー」とかよくわからなくなってきた・・・
詳しい人いたら単語の正しい使い方を教えてください。

関数もオブジェクト

関数もオブジェクトなので、いつでもプロパティやメソッドを追加できる。超動的!

function a(){}
a.hoge = "fuga";
a.foo = function(){
  alert("bar");
}
alert(a.hoge); // fugaが出力される
a.foo();       // alert("bar")が実行される

aがオブジェクトなら自然な動作に見えるけど、a()って呼び出せるのにさらにa.foo()って呼び出せるって、よく考えたら相当キモイなこれ。ガッチガチのオブジェクト志向の人だと頭が破裂してまうでこれ。

関数の定義方法は3種類

以下の例は参考サイト引用。

  • 関数宣言(function文)

function a() {
alert('hoge');
}

var a = function() {
alert('hoge');
}

  • Functionコンストラク

var a = new Function("alert('hoge');");

関数宣言で書かれたものは、それが宣言される前に使えちゃう!

a();  // alert('a')が実行される
b();  // エラー
function a() {
  alert('a');
}
var b = function() {
  alert('b');
}

arguments.calleeとthisの違い

argumentsはその関数に渡された引数が入った配列Argumentsオブジェクト?。その中でもarguments.calleeにはその関数自身への参照が入ってる。

function a(x, y) {
  alert(this);  // [object Window]
  alert(typeof arguments);  // [object Arguments]
  alert(arguments.length);  // 2
  alert(arguments[0]);  // hoge
  alert(arguments[1]);  // fuga
  alert(arguments.callee);  // 関数aの内容(つまり、aの参照が入ってる)
  alert(arguments.join());  // エラー(Arrayじゃないから。でもlengthは持ってる不思議!)
}
a('hoge','fuga');

arguments.calleeはaddEventListenerで無名関数を登録したときに、無名関数自身をremoveするためによく使いますね。

//buttonAというidのボタンがあるものとする
var buttonA = document.getElementById("buttonA");
buttonA.addEventListener("click", function(){  // clickイベントに無名関数を登録
  alert(this);  // [object HTMLInputElement]
  this.removeEventListener("click", arguments.callee);  // clickイベントに登録された無名関数を削除
  alert("1回だけ表示されるよ!2回目以降のクリックでは出ないよ!");
});

で、thisってなんなのよと。


・・・続く。

Dropbox使うと無料でGitのプライベートリポジトリ作れるじゃないですか!

GitHubというものがある

Git使ってる人なら知ってるだろうけど、GitHubというサービスがある。これはWikipediaによると

GitHub(ギットハブ)はソフトウェア開発プロジェクトのための共有ウェブサービスであり、Gitバージョン管理システムを使用する。 Ruby on RailsおよびErlangで記述されており、GitHub社によって保守されている。 主な開発者はChris Wanstrath、PJ Hyett、Tom Preston-Wernerである。 GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供している。 2009年のユーザー調査によると、GitHubは最もポピュラーなGitホスティングサイトとなった[3]。

というサービス。まぁいわば無料でリポジトリを作れるサービスですね。


無料なんですが、無料で利用する分にはリポジトリがすべてパブリック、つまり誰でもソースを覗いたりフォークできてしまうわけです。で、「仲間内だけのリポジトリ作りたい!」とか「自分だけのリポジトリ作りたい!!」ってなるとプライベートなリポジトリがほしくなるわけなのですが、プライベートなリポジトリは有料サービスでのご提供となっているのですね。便利な無料サービスをもうちょっと便利に使おうと思ったら、金、金、金…世知辛い世の中です。


で、別に個人で開発する分にはGitのリポジトリなんてローカルのマシンにだけあればいいのですが、「やっぱりリモートリポジトリがないと不安だよ!」っていうこともありますよね。僕のマシンはもうかれこれ10回はくだらないくらいぶっ壊れているので、ローカルだけじゃ不安です。

Dropbox使えばよくね?!

そこで閃いたのが、「Dropboxリポジトリ作ればどっからでも同期できるじゃん!」ということ。Dropboxsshで繋ぐとかそんなサービスはないので直接pushとかはできないのですが、Dropboxに預けてるファイルを常にローカルと同期することができます。つまり、ローカルのDropboxフォルダにリポジトリ作ってそこにpushすれば、Dropboxに同じアカウントでログインしてるすべてのマシンでリポジトリの中身が同期されて、結局Dropboxにリモートリポジトリがあるのと一緒じゃないですか!!やったーーーーーーーーーーーーー!!!!

で、どうやるの?

というわけでちょっとググッて3つくらい拾い読み。(※4つでした)

個人でプライベートリポジトリとして使う分には先に書いたようにローカルのDropboxフォルダにリポジトリを作るだけなのですが、複数人で共有したいリポジトリであれば、

Dropboxには指定したディレクトリをユーザー同士で共有する機能があります。
上記の例ならば「Repos」もしくは「Repos/myapp.git」を共有することで、リポジトリの複数人による利用が可能となります。
便利ですね!

という感じで使うそうです。これで他の人に自分のDropboxアカウントでログインさせるとかアホなことしなくて済みますね。

一人で使うプライベートリポジトリだとこんな感じ。

今までDropbox + gitといえば、Dropboxにbareリポジトリを置いてそこからcloneするというsvn時代の伝統を引きずったスタイルが主流でしたが、--separate-git-dirオプションのおかげでもっとモダンかつ手軽に実現できます。

この一文によると、今まで見てきたやり方はなんだか古臭い前時代的なやり方だそうです。僕自身gitあんまりよくわかってないので、何のことかよくわかりません。すいません。


とまぁこんな感じで「Dropbox使えば無料でプライベートリポジトリが作れるよ!」というお話でした。

おまけ

Gitのキレイなブランチの切り方
見えないチカラ: A successful Git branching model を翻訳しました

あんまり読んでないけど、なかなかためになります。その前にGitの本読んで理解しよう…
よく「$ git reset --hard HEAD^」して死にかけるので、gitの基本的なコマンドとかも自分の理解のためにまとめようと思います。そのうち。

さくらのレンタルサーバーのCentOS6.2初期設定

サーバ借りた!

もう一ヶ月くらい前からさくらのVPSでサーバ借りてCentOSをいじくり回してます。Skypeのボット作って遊んだりとか。でも、「あれ?なんか変なことしたかな?」と思うたびにOS再インストールしてました。かれこれ7〜8回は初期化してます。初期化のたびにいろんなこと覚えていい勉強になってるとは思うのですが、さすがにやりすぎに感じてきました。

なので、せめてCentOS6.2を再インストールしてからの初期設定の手順を残しておくことで次の初期化に備えることとします。VirtualBoxみたいにスナップショットというかその時の状態を保存してロールバックとかできないのかなー誰か知ってたら教えてください。

続きを読む

Ubuntu11.10でRuby on Railsを動かすまでの奮闘記

前回(Ubuntu11.10にRVMをインストール - エンジニア3年生のお勉強ノート)はRVMをインストールしました。今回はRubyRailsMySQLをインストールして、アプリケーション開発の一歩手前くらいまで行きましょう!

追記しまくって長くなってしまったので、次回は短くまとめた記事も書こうと思います。

続きを読む