スケルトン・エピ

letsspeakのブログです。

イデアについて

酔っぱらいながら書いているという言い訳をしつつ。

 

イデアという概念と出会ったのは高校の世界史だったのだけれども、僕の中の解釈としては、イデアは「想像における者の概念」という風に理解して、わりとすんなり受け入れることができました。

 

たとえば、バナナが現実にあったとして、バナナを見ずに(あるいは見ていてもいいのだけれども)頭の中に想像されるバナナと、現実のバナナとは違うわけです。頭のなかで自分の想像として現れる概念としての「バナナ」がイデアなのかなーという風に解釈しました。

 

時は流れ、今は一応プログラマーとして働かせて貰っていますが、最近プログラムを書くにあたって、このイデアという概念が非常に重要なのではないかと思う事が本当に多いのです。

 

ゲーム、業務用?を問わず、プログラムを書く流れとしてまず、何を満たす為のものなのかを定義して、それから、プログラムがどういう動作ならばそれが満たされるか、そしてプログラムを実際に書いていきます。

 

このプロセスの中で、僕が一番重要だと思うのが、「プログラムがどういう動作ならばそれが満たされるのか」という点で、これはまさに頭のなかに完成系のイデアを思い浮かべるタイミングとなります。

 

このイデアさえしっかり抱けていれば、後の実際にプログラムを書くプロセスは単に作業でしかなく、経験さえあれば、解決できない壁はないレベルになってしまいます。

そうなると、プログラムを書く上で一番重要なのは、イデアをより確実に抱くことなのではないかと思っています。

 

また、逆にこのイデアが抱けない場合、とりあえずのものを書いても未完成な者ができたり、後から書き直す可能性があるなーとか思いつつ書いて、やっぱり書き直すはめになった。という事が本当に頻繁に発生します。

 

プログラムを書くにあたっていは、イデアが最も重要。

これは僕の中ではほぼ確信になりつつあります。

 

また、このことはプログラム以外でも遭難じゃないかという仮説があります。

例えば、勉強会やライブなどのイベントを立ち上げる際にも、より強固なイデアを抱けた人から順にこれらの催しを実際に行動に移す事ができたり、ものをつくるだけでなく、会社などの組織をつくるにあたっても非常に重要な役割を果たしているのではないかなーと思っていたりします。

 

さて、話をプログラムに戻します。

上記の前提を経て、これからの未来の話に移ろうと思います。

 

30年もすれば、恐らく脳みそと電子機器が接続されて、脳みそで想像したものが簡単にプログラムになって出てくる未来になるのではないかと考えています。

 

僕の好きな攻殻機動隊の世界です。

 

そうなると、本当にプログラムを書く事自体はただの「作業」でしかなく、しかもそれは、ほぼ自動化されることになるでしょう。そんな時に一番重要視されるのは、まさにここまで述べてきた「イデア」の力。これだけがプログラマーに求められるものになるのではないかと感じています。

 

さらに次の話をします。

 

イデアさえあればプログラムが書ける。そんな環境になったならば、プログラム自身が自我を持ち、ターミネーターのようなプログラムが支配する世界が訪れるのではないか、そのような疑問を抱いたことがある方は少なくないと思います。

 

僕の考えでは、それはすぐには訪れないと思っています。

 

プログラムを作成するということは、少なくとも現実世界をイデアに変換する作業が根本にあって、それをコーディングするということで、コーディングの部分は自動化することは可能だと思います。

 

しかしながら、プログラム自身はイデア世界出身の存在なので、現実世界については一切知らないのです。

 

現実世界を知るためには、人間が普段感じている五感を満たしながら、同時に自身を成長させて、変化させていくことが必要になります。これは少なくとも脳みそが電子ネットワークと接続された瞬間では難しいのではないかと思います。

 

人間はイデアに指示されながら、現実世界の情報について補完する役割を果たす時期というのが少しの間続句事になるかと思います。それは、実際に機械が進化して、人間の五感の役割を果たすよりもずっと効率が良いのです。

 

その後、機械の進化とともに人間は淘汰されるのかも知れませんが、少なくとも僕が生きているうちは人間はまだ機械よりも優れた知覚機関となるのではないかなーと感じています。

 

酔っぱらった状態で15分くらいで書いてみた感じでは、そんな感じです。

 

CentOS 6.3 にRedmine をインストールしてみた

さくらのVPSを借りたものは良いけど、中々趣味プロジェクトが前に進まないので、マイルストーンを切るべくRedmine 2.1を導入してみました。

今回は既にmysqlやrbenv、Rails、nginx、git等がインストールされている環境下への導入で、nginxを通しつつホストを分ける形でのアプローチになっています。

すべてを一からインストールしようとしている方にとってはあまり参考にならないかもしれないですが、下記に手順を残しておきます。

 

なお、今回のインストールで作成/変更した設定ファイルはgistにまとめて置いておきました。どこかからのコピペばかりで、もしかすると凄まじい脆弱性が潜んでいるかもしれません。参考にされる方は自己責任でお願いします。

(あわせてツッコミなどあればよろしくお願いします。)

 

【設定ファイルのgist】

 gist:Redmine on unicorn on nginx with mysql, my configuration files. 

【環境】

 ・CentOS 6.3

 ・rbenv インストール済み

 ・Rails 3.2.8 インストール済み

 ・nginx 1.0.15 インストール済み

 ・mysql 5.1.61 インストール済み

 ・git  1.7.1 インストール済み

【参考にしたサイト等】

 rbenv+ruby-buildとunicornでもっとさくっとRedmine入れてみる

 Installing Redmine(Redmine公式Wiki)

 

1.Redmineのダウンロード 

redmineをgithubからcloneします。

$ cd /home/www/rails
$ git clone https://github.com/redmine/redmine.git
Initialized empty Git repository in /home/www/rails/redmine/.git/
remote: Counting objects: 90421, done.
remote: Compressing objects: 100% (17498/17498), done.
remote: Total 90421 (delta 71963), reused 89815 (delta 71466)
Receiving objects: 100% (90421/90421), 20.11 MiB | 1.79 MiB/s, done.
Resolving deltas: 100% (71963/71963), done.

 

2.1-stable ブランチに切り替えます。

$ cd redmine
$ git branch -a
* master
  remotes/origin/0.6-stable
  remotes/origin/0.7-stable
  remotes/origin/0.8-stable
  remotes/origin/0.9-stable
  remotes/origin/1.0-stable
  remotes/origin/1.1-stable
  remotes/origin/1.2-stable
  remotes/origin/1.3-stable
  remotes/origin/1.4-stable
  remotes/origin/2.0-stable
  remotes/origin/2.1-stable
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git checkout -b 2.1-stable remotes/origin/2.1-stable
Branch 2.1-stable set up to track remote branch 2.1-stable from origin.
Switched to a new branch '2.1-stable'

$ git branch
* 2.1-stable
  master  

 

2.Redmineのインストールと起動テスト 

いつも通りbundle installを実行します。

$ bundle install --path vendor/bundle --without development test rmagick postgresql sqlite

 

mysqlredmine用のデータベースとユーザーを作成します。(passwordは独自に設定)

$ mysql -u root -p
mysql> create database redmine character set utf8;
mysql> create user 'redmine'@'localhost' identified by 'password';
mysql> grant all privileges on redmine.* to 'redmine'@'localhost';
mysql> exit

 

database.ymlをmysql用に書き換えます。

$ cp config/database.yml.example config/database.yml
$ vim config/database.yml

gist:database.yml

 

Redmineのデータベースを構築します。

$ RAILS_ENV=production rake db:migrate
$ RAILS_ENV=production rake redmine:load_default_data

Select language: ar, bg, bs, ca, cs, da, de, el, en, en-GB, es, et, eu, fa, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, lv, mk, mn, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sq, sr, sr-YU, sv, th, tr, uk, vi, zh, zh-TW [en] ja

 

webrickでの起動実験を行います。ポート3000にアクセスしてRedmineが開けば成功。

$ ruby script/rails server webrick -e production

 

3.unicornの導入と設定 

デフォルトではunicornが入っていないので、Gemfile.localを生成してインストールします。

$ echo 'gem "unicorn"' > Gemfile.local
$ bundle install

 

おもむろにunicornの設定ファイルを持ってきて起動実験します。ポート5001にアクセスしてRedmineが開けば成功。

$ vim config/unicorn.rb 
$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D -p 5001

gist:unicorn.rb

 

4.nginxの設定 

今回はnginx側でBASIC認証を行うため.htpasswdを生成します。username、passwordはそれぞれ独自に設定。

$ su
$ printf "username:$(openssl passwd -1 password)\n" >> .htpasswd

 

nginxの設定でRedmine用のホストを追加して再起動します。

$ vim /etc/nginx/nginx.conf
$ service nginx restart

gist:nginx.conf

きちんと3000番と5001番のポートを閉じてから、 redmine.charag.jpにアクセスしてRedmineが開けたら成功です!

 

まとめ 

nginxの設定にもっとも時間を取られました。

当初 hoge.jp/redmine/ で繋がるようにしたかったのですが、rewriteやproxy_passの設定が分からず、リダイレクトループが発生。なんとか解決したものの、今度はRedmine側が/redmine運用を想定されていなくて面倒な事になり、ホスト運用に切り替えました。

ホスト運用となってしまえば、アプリ自体の導入もとてつもなく簡単で、nginxもすんなり設定できました。Railsは一度導入さえしてしまえば色んなアプリの導入が楽ちんですね!!病み付きになりそうです。次回はアクセスログの統計アプリなどを入れようと思っています。

ニコニコ動画は何故日本一の動画サイトになったのか

 ニコニコ動画は何故日本一の動画サイトになったのでしょうか。当然ながらアイデア力や、開発力、資本の力、受け取り側の問題など、様々な理由が複雑に絡み合ってこその成功だとは思いますが、僕が出した結論は「感情のもっとも高い点を共有できる場を提供したこと」にあると考えています。

 

 時代はインターネットの発明まで遡ります。人々は遠くの情報をすぐに得られるツールとしてインターネットを利用し始めましたが、ほぼ同時にメールや掲示板、ホームページの文章を使っての、「人と人とのコミュニケーションツール」としても利用され始めました。人々は自身の想いを文章に書き連ねる事によって、お互いにその想いや感情を共有することを求めていたのです。

 

 当時のメールや掲示板等を通してのやり取りというのは、1週間〜数日間待って初めて返事がくるのが当然で、そうなると相手に贈るメッセージを考える時間も十分にあります。「こんな言葉を返そう」と思った事を何度も何度も練ってから「送信」ボタンを押すのです。いわば「理性を共有できる場」に近くなってしまう訳です。

 

 それに対して、ニコニコ動画では流れる動画に対してその時限りのコメントを残すので「こんな言葉を返そう」等と考えている暇などありません。今思った気持ちをすぐにコメントする必要があるのです。面白いシーンが終了して、数秒経ってから「wwwwww」等というコメントが流れてきても興ざめするだけです。

 

 

 さて、ここまで敢えて名前を出していませんでしたが、Youtubeではそうも行きません。動画の提供者に対する感情をコメントとして書いた時には、殆どの人が一度読み返してから、修正などを施して送信します。これでは理性が干渉してしまうのです。

 

 Twitterニコニコ動画にかなり近いツールです。思った事をすぐにツイートという形で発現することができるので、ニコニコ動画と同じく「感情のもっとも高い点を共有できる」と言えると思います。もし既にTwitterを利用した事があるなら、3日前のツイートを見直してみてください、改めてそのツイート読み直して、今同じ事を世の中に対して発表する必要があると感じるでしょうか。

 

 ここで必要があると感じる方は、もしかするとTwitterの「感情のもっとも高い点を共有できる」という利点を享受出来ていないのかも知れません。一般的なユーザーは「腹減った」とか「おやすみ」とか本当にどうでも良い事をつぶやいています。これらは全く理性が伴わないけれども、発動した瞬間の生の感情そのものです。これがYoutubeTwitterニコニコ動画の決定的な違いと考えています。

 

 

 次に「場の提供」という側面を見てみます。先ほど書いた通りTwitterでも感情のもっとも高い点を共有することは可能ですが、場という側面があまりにも広すぎると考えています。(最近は場を制限するハッシュタグという機能もかなり使われていますが...。)インターネットの発明当初も 各所でチャットというリアルタイムに近いコミュニケーションツールが存在しましたが、これも同様です。ニコニコ動画では、特定の「動画」という共通のお題を用意することで、「同じ場」の中でその時に感じた想いを共有する事ができるツールなのです。

 

 2chにおける実況でもニコニコ動画とほぼ同じ体験を味わうことができますし、ニコニコ動画よりも2chの実況の方が歴史も古いのですが、「多くの人が容易に体験できる場」と考えれば2chはその候補から外れてしまうのはお分かり頂けると思います。(僕も個人的にはニコ生よりはなん実の方が好きでした。)

 

 

 さて最後になりますが、受け取り側の問題にも言及したいと思います。ニコニコ動画のユーザー層は10代〜20代と言われていますが、日本の不景気の影響をもろに受けてる層と言えます。不景気で仕事がなくて、人生の余裕も無く、人と人同士のリアルコミュニケーションが失われつつあります。

 

 そんな中、掲示板等よりももっと高い、リアルタイムに近い、熱い感情を共有できて、ユーザーごとに自分の時間のなかで楽しめる場を用意したのがニコニコ動画でした。逆にこれが流行らない理由があれば、是非教えて欲しい所です。

 

 

 以上が僕が考える理由です。

動画サイトでニコニコ動画を超える感情共有をする為には、ビデオチャット以外に思いつかないほど、ニコニコ動画は突き抜けているのではないかと思っていますが、最近はポータルサイト化するなど、逆走している気配も感じるところであります。ニコニコ動画さんには今後も日本のウェブ業界の先頭を走っていって欲しいですね!!

初心者が土日でrailsに鞍替えしてみた

色々思うところありFuelPHPからRuby on Railsに鞍替えし、土日の半分の時間をbootstrap + Ruby on Railsに使ってみました。主な理由は下記の通りです。

 

・普段Objective-Cに触っているので型のゆるい?PHPよりも馴染みやすいと思った

twitterrailsを使っていたと知ってパフォーマンス面で安心した

・2週間ほど前にGitLabを導入しようとした時にrailsを入れていた

・職には困っていなかったが彼女と身長(主に彼女)が欲しかった

(参考:twitter bootstrap railsを使ったら職が見つかり彼女も出来て背も3センチ伸びました。

 

今回作ったモノ

・作品とキャラクターとグッズの登録と閲覧

・タグで各ページを紐付ける(作成中)

 

f:id:letsspeak:20120709012537p:plain 

f:id:letsspeak:20120709012607p:plain

 

 

今回はとにかくモノが出来る事を最優先として、細かい所は敢えて詰めずに進めてみました。0からのスタートでしたが、予想以上に簡単に形になっていき、初見でもかなり効率的に進められることを改めて実感しました。

しかしながら、ぶっとばした結果といってはなんですが、ActiveRecordの実体や、どのタイミングでクエリが発行されるのか、generateしたmodel同士から新たなresultを得た時にどうやってViewに渡せば良いのか、など未解決の問題が山積みな状態でもあります。

 railsは簡単と言われる割には学習コストが高いという話もありますが、まだ触っていない方も挑戦してみる価値は十分あると思います!!

OpenSSHの鍵のメモ

・サーバー側OpenSSHの設定はサイトの通りで問題なし

・鍵作成とログインまでの手順は下記の通り

 【共通】rsaの公開鍵ペアを作成

   ssh-keygen -t rsa

   ※サーバー側で作成実験したがクライアント側でもいけるはず。

   ※鍵の転送にはftpやscpなどを使う。

   

 <サーバー側>

 【1】サーバー側でログインしたいユーザーのホームディレクトリに移動

 【2】~/.ssh/authorized_keys に公開鍵を追加する

   cat hoge.pub >> ~/.ssh/authorized_keys

 【3】authorized_keysの初回生成時はパーミッションを600に設定する

 

 <クライアント側(MacOSXで確認)>

 【1】秘密鍵をクライアント側の任意の場所に保存しておく

 【2】鍵を指定してssh接続する

   ssh -i hoge.key hoge@192.168.XXX.XXX

 【3】rsa公開鍵ペア作成時のパスワードを入力する

 

その他

MacOSXの場合は鍵が自動でキーチェーンに追加されるためクライアント側【1】で保存した鍵を消してもログインできてしまう仕様。

・クライアント側【2】で秘密鍵のパーミッションが744になっていたら怒られた。600にしたらうまくいった。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0744 for 'hoge.key' are too open.
It is recommended that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: hoge.key
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

追記

・クライアント側【2】で秘密鍵のファイル名に.keyが付いていなかった場合、無反応になった。(Control-Cで中断)

 

まとめ

サーバー側に公開鍵、クライアント側に秘密鍵が必要で、パーミッションの設定に厳しい。万が一接続できなくなった時のことは考えておいた方が良い。
 

初心者がFuelPHPでValidationを使ってみた

本来の順序通り行けばここでFormクラスを紹介するのが順当なのですが、Formクラスにあまりハマりどころが無くスムーズに進んでしまったので、今回はValidationクラスとView::set_globalの話を書きます。

Validationクラスとは、読んで字の如くFormから送信されたPOSTデータの正当性を確認するクラスで、フォームデータが空欄になっていないか、文字数制限をオーバーしていないか、といった条件をadd_rule()で簡単に指定でき、それぞれのエラーをはいてくれるとても便利なクラスです!

が、私のような初心者ともなれば、吐かれたエラーをどのようにすれば画面に表示できるのかですら右往左往してしまいました。エラーを表示するまでの流れで分かった事を簡単にまとめていきます。

 

Validationの実行部分

実行はわりと簡単で、下記サンプルコードのようにValidation::forge()を呼び出し、条件を追加したうえで、Validation::run()を実行するだけで終わります。

public function validate_addstory()
{
  $validation = Validation::forge();
  $validation->add('storytitle', '作品名')
      ->add_rule('required')
      ->add_rule('max_length', 32);
  $validation->add('kanatitle', '作品名(かな)')
      ->add_rule('required');
      
  $validation->run();
    
  return $validation;
}

 

エラー時の分岐処理

Validation::run()の後にValidation::error()を呼び出してエラーを配列に格納した上で、配列が空かどうかを調べれば良いようです。

$validation = $this->validate_addstory();
$errors = $validation->error();
      
if(empty($errors)){ // 正常時の処理 }else{ // エラー時の処理 }

 

エラー時の出力処理で右往左往

ここで私は右往左往しました。
Validation::show_errors()という素晴らしいメソッドが用意されており、初期状態で、

<ul><li>The field 作品名 is required and must contain a value.</li><li>The field 作品名(かな) is required and must contain a value.</li></ul>

 という風にリスト表示されるようになっているのですが、当初これをそのまま

$result_validate = $validation->show_errors();
$view->set_global('result_validate', $result_validate);

としてしまい、タグがエスケープされてしまっていました。

また別の表示方法としてcore/class/validation.phpを参考に、

$errors = $validation->error();
$view->set_global('errors', $errors);

 とした上でにviewから

<?php foreach ($errors as $err):?>
<p><?=$err->get_message()?></p>
<?php endforeach;?>

という風に呼び出した際には

ErrorException [ Error ]: Call to a member function get_message() on a non-object

とのエラーが発生してしまい、表示さえもままならない状態になってしまいました。

 

エラーを正しく表示する

さて、ここまで来ると初心者の私といえども薄々勘づいてきます。

View::set_global()が怪しい!怪しすぎる!というか黒だ!

公式ドキュメントを見直すと3つ目の引数 $encode に答えがありました。

$encode null set to true or false to encoding, defaults to main auto encoding setting

 訳:引数を省略した場合、trueにした場合はエンコードします。

上記の例ではいずれも省略していたので、タグをエンコードしてくれたり、Validation_Errorオブジェクトを他の何かに変更してくれたりしたみたいです。

それぞれ下記の修正で正常に動きました。

$view->set_global('errors', $errors, false);
$view->set_global('result_validate', $result_validate, false);

 

おまけ

ValidationクラスのConfigrationを設定しておくと、Validation::show_errors() から出力されるエラーの記法を変えられるようですので、<ul>などが邪魔な場合はこれを取っ払ってしまうというのも一つの手かもしれません。(Validation Class 公式ドキュメント参照)

が!ソースを見た限りエラーごとの改行がまったくされておらず汚いです・・・。
上記のように$errorsに格納してValidation_Errorオブジェクトの配列を丸ごと投げるのが、実は最も良いのかもしれないなーと思いました。