第1回名古屋Android勉強会 でインターンについて発表してきた

2009年10月25日

10月24日土曜日、名古屋市立大学で第1回の名古屋Android勉強会が開催されました。
そこで「Androidニコニコプレーヤ開発の経緯と概要」として30分ほどお話させていただきました。

意外と名古屋でAndroidに興味がある方が多く、それに驚いたとともに、
世間って結構狭いもんだなぁと思ったりしました。

とりあえずjava-jaについては、@yamashiroから託されてきたらしいです。
eclipseのショートカットのお話をたくさん聞きました。

ハンズオンについては、あれだけの人数の中、導入からインテントまで進めたのは奇跡だと思ってますw

あとはLT。
@androidzaurus の人がNetWalkerにAndroid突っ込んでニヤニヤしてたり、
山本さんが自作でAndroid端末作ってニヤニヤしてたり、
名古屋って変態さん(ほめ言葉)がおおいなぁと改めて感じました。

懇親会も結構な刺激を受けたので、はやく今やってる事を終わらせて、
俺もAndroidでニヤニヤしたいなーと思う勉強会でした。

ドワンゴインターンで作ったもの

2009年10月25日

■作ったもの

Android版ニコニコ動画プレーヤです。

■実装した機能

  • ログイン(初回はアカウント設定へ)
  • ランキング
  • 動画検索
  • マイリスト
  • アカウント設定
  • 動画再生

■実装するためには?

  • AndroidはH.264動画が再生可能、ニコ動はflv
    • →変換サーバが必要
  • ランキング取得には裏でしか使えないAPIを叩かなければならない
    • →API中継が必要
  • マイリスト取得にはuser_idが必要だが、クライアントには保存されてない
    • →独自のセッション管理が必要

■バックエンド

●サーバ構成

サーバは以下の4台構成としました。
これはiPhone版ニコニコプレーヤの仕組みを参考にしています。

  • infoサーバ:裏APIとの中継サーバ、ログイン管理
  • manageサーバ:ログイン情報、動画キュー情報管理DB
  • frontサーバ:動画エンコード情報取得、エンコードされた動画のキャッシュ
  • convサーバ:キュー処理による動画のエンコード
  • 以下、各サーバの解説をしていきます。

    ●infoサーバ

    動画以外の情報を入出力するためのサーバです。
    ログイン情報はニコニコ動画本家のログイン管理加え、
    マイリスト等取得用に独自でセッション管理しています(Memcache使用)。
    それ以外の、たとえばランキングや、動画情報の取得については、
    内側でのみ使えるAPIをそのまま中継して使用しています。

    ●manageサーバ

    ログイン情報用のMemcache、動画エンコード管理用のキューDBを
    ストアしておくためのサーバです。実運用においては、セキュリティを確保するために
    LAN内からのみアクセス可能としておきます。
    本来、ログイン情報、キュー情報を管理するためのコンソールが必要ですが、
    今回は開発時間が足りなかったため実装できませんでした。

    ●frontサーバ

    エンコード済みの動画をAndroid本体に送信するためのサーバです。
    動画リクエストを受けた際に、動画のエンコード状態をチェックし、
    既にキャッシュ済みであれば、その動画のurlを返しダウンロードさせます。
    未エンコードで、かつキューがない場合は、キューを作成して、クライアントにWAIT命令を出します。
    エンコード済みであれば、convサーバからhttpで動画をロードして、
    自urlをクライアントに返します。

    ●convサーバ

    キューにたまっている動画をエンコードするサーバです。
    処理は単純で、延々とキューを読み出し、愚直にエンコードしてゆくだけです。
    エンコードが完了したらhtdocsに保存し、DBにエンコード完了フラグをセットします。

    ■バックエンド動作構造


    ※発表資料まんまなんで、気が向いたら修正しますw

    ■Androidソフトウェア部分の実装

    ●実装すべきもの

    • 各画面UI
    • http通信、xmlパース
    • 設定保存
    • 動画描画
    • コメント描画

    ●動作フロー

    1. ログイン(未ログインの場合は設定画面へ)
    2. 各種動画一覧/設定
      • ランキング
      • 動画検索
      • マイリスト
      • 設定
    3. 動画選択
    4. エンコード状態取得
      • WAIT→一定周期ごとに再アクセス
      • READY→付随URLを元に動画再生スタート
    5. 動画再生
      • コメント情報取得
      • 動画のストリーミングはAndroidが勝手にやってくれる(VideoView)
      • コメント描画

    ●ログイン

    • 愚直に設定からアカウントを読み出し、httpsで投げるだけ
    • アカウントはPreferenceに保存(Windowsでいうレジストリ)、自ソフトのみ読み出し可
    • アカウントが保存されてないorログイン失敗なら設定画面へ飛ばす

    ●各種動画一覧取得(ランキング/検索/マイリスト)

    • 中継サーバを使ってxmlで動画リストを取得
    • サムネ取得&描画が遅いので、ハンドラを使って遅延描画
    • マイリストは、セッションを渡して取得

    ●動画状態取得

    • イライラさせないために「エンコーディングなう」の画像を真っ先に表示
    • あとはStatus=READYの返答がくるまで、ひたすら繰り返し定期アクセス

    ●動画再生

    • コメントのxmlをコメントサーバから取得(中継なし)
    • 動画はVideoViewにURLを渡すだけで、勝手にストリーミングしてくれる。便利。
    • タイマーを使って定期的に動画の再生位置を取得し、そこにあるべくコメントを表示
    • コメントオブジェクトは使いまわし(当初はガベコレ)
    • 衝突判定とかいろいろめんどくさい処理があるが、俺は担当してなかったのでわかんない。ふじこお疲れ。

    ■Androidソフトウェア開発のキモ

    • 1ページ単位にActivityを作る
    • ページ間をまたぐデータを送受信しあうためにIntentを使う
    • UIはレイヤーのように重ねることができる
      • (ニコ動プレーヤでは、下から動画、コメント、透明ボタン、制御ボタンの順にレイヤーを重ねた)
    • VideoViewは便利、ストリーミングを扱うならこれだけでいい。
    • データのストア方法は、1.Preferenceか2.ファイルか3.SQLite。用途によって使い分ける。
    • 処理が重くなる作業は、全て「Task」を使う
      • (画面描画→タスク開始→タスク実行中でもUI触れる→完了後反映)
    • TaskなりHandlerなりを使わないと、フリーズしたように見えてかっこ悪い

    ■反省点

    • エンコード時間が遅い。めっちゃ遅い。動画時間と同じくらいかかって使い物にならない。
      • →動画エンコード中に、すでにストリーミングで配信することができないだろうか?
      • →現状構成では使用的にムリ(エンコード後に丸投げする構成)なため、仕組みを考え直す必要がある
    • 動画のダウンロードの際、認証するのを忘れた。
      • →最終発表の際に指摘されたが、このままでは動画がぶっこぬけてしまう。
      • →DLキーを付加するなどの対処が必要。
    • XMLパースの効率が悪すぎ
      • →軽いXMLパーサを使おうとするとfor文でぶん回すナンセンスなコードになってしまうし、高度なXMLパーサを使うと、メモリ不足になってしまう。
      • →XMLを使わない構成が必要。JSONを使うといいらしい。

    ■感想

    Androidのソフトウェア開発はとてもしやすく、技術者に優しいなと思いました。
    というか、作っていて楽しかったので、機会があればリベンジしたいです。

    その他リンク

    ドワンゴインターンシップに行ってきた!

    2009年10月12日

    8月17日~9月11日までドワンゴのインターンシップに行ってきました!

    ・・・書くこと多すぎてマトマンネ(‘A`)
    というわけで、帰ってきて一ヶ月も経ってしまったので、
    いいところでまとめておきます。。

    とりあえず社内について中心にまとめてみました。
    製作物については、10/24日の「第1回日本Androidの会名古屋支部勉強会」で
    発表する予定なので、その資料の作成時にまとめて、ブログに流します。

    ■メニューてきなもの


    ○応募~面談


    応募は希望理由+技術アピールでした。
    希望理由はすぐにかけましたが、技術アピールの提出に悩みました。
    たいていの方は自作ソフトとかあったんだと思いますが、私は中学以来作っていないので、
    とりあえず最近作ったWebサービスの思いのたけを綴った文章を送りつけてみました。

    ・・・するとなぜか書類通過w
    今年は特に応募者が多かったので通知も遅れましたが、
    その連絡が来た時点で「もうムリだな」と思ってたので、意外でした。

    その2日後に面談。新幹線で東京へ。
    一人では初めての東京&大きい会社という事で、すげードキドキしました。
    面談前に事務手続きがあったんですが、その時点でもう緊張MAX。

    ・・・が、いざ面談に入ると、自分の好きな世界なので、夢中で話しました。
    それだけじゃなく面談自体が楽しくて、去年のインターンの話題からダーツバーの話題に行ったりして
    「受かったらダーツ行きましょう!」なんてゆってましたw
    あんな楽しい面接なら何度受けてもいいと思いました。


    ○面談通過~インターン開始


    面談に受かってからは結構大変でした。
    インターン開始まで2週間ほどしかなく、しかもお盆を挟む為、
    めちゃめちゃ早く下宿する部屋を決める必要がありました。
    友達の@hypersonicsの手伝いも受け、なんとか安い物件を確保。
    マンスリーでコミコミ月10万はすげー安いなと思いました。

    今になって振り返ると、安さだけでなく場所も選ぶべきでした。
    自分が住んだところはめちゃめちゃ治安が悪く、その辺を歩いただけで薬を売られたりと中々カオスな場所でした。
    まぁ、それもそれで楽しかったんですがw

    東京に住むんだとしたら、もうちょい治安のいいところがいいです。


    ○インターン初日!


    早め早めに東京へ行き、下宿先へ荷物を置いたらいざドワンゴへ!
    先にもう一人のインターン生、@ssashir06がいたので話しかけてみる・・・と!
    なんと、俺がネットで尊敬していた@binzumeさんの後輩らしく!
    さらに@binzumeさんはここに勤めてるとのことで驚きの出会いでした。

    その後事務手続きのため会議室で書類を書いたんですが、
    そこで出会ったのが@mimitannでした。
    パッと見まじめな雰囲気で、そのときは強力なキャラクターとも知らず・・w


    ○デスク広い!


    その後社内を一通り見学、自分のデスクへ。広い!
    机が広々としてて、デュアルディスプレイ、さらにかなりスペックのいいパソコンが用意されてました。

    開発者がこれだけ優遇されているのはここぐらい、と後に聞かされました。
    某社にインターンに行った人のお話では、スペックが低すぎて仕事にならないとか。。。


    ○社内LT!


    社内で初めに目がキラキラしたのは、社内LTがあることでした。
    毎週お昼ごろにやってるらしく、丁度初日がLTの日でした。

    毎週LTって刺激的ですよね!
    発表する出番は定期的に周ってくるし、毎週刺激的な話が聞けるし!
    これは色んなところでどんどん広まるべき、と思いました。

    初回、LTの時間が余ったので、急遽LTを任されました!
    テーマはStyleShareについて。元々バイト先のTOYOSYSTEMでやってた事だったんですが、
    開発がほぼ自分だったので、さりげなく技術アピールに入れてたモノ。

    マゾな俺はここぞとばかりにチャンスだと思い、サイトを見せながらやれる限りやってみました。
    質問が結構来て、レスポンスも結構あったのですごく嬉しかったです。

    合計4回LTを見に行きましたが、ちょいちょいネタを織り交ぜる人たちがいてカオスでしたw
    ネタで一番印象に残ってたのはコーヒーメーカー、
    技術的に一番印象に残ってたのは「力技」でした。

    そのネタっぷりを見て「俺もカオスになりたい!」と思い、
    次週のLTでインターンについて発表したんですが、あえなく撃沈。。。
    やっぱ慣れないとやるもんじゃないですねw


    ○開発したもの:Androidニコニコプレーヤ


    インターンの4週間で開発したものは、Androidのニコニコプレーヤでした。
    とはいってもプロトタイプみたいなもので実用化はされないんですが。。。

    ドワンゴ社内の開発は、SVN+Trac+wikiで行われていました。
    各開発部門ごとにwikiがあって、そこに技術情報を書き込んでいく、という形です。

    全てのwikiにアクセスできるので、たとえば他サービスと組み合わせたい!なんてときに
    とても役に立ちそうな構成でした。

    また、Androidのプレーヤを開発する際に、
    かなりニコモバとiPhone版プレーヤの中身を参考にしましたw

    今回開発したもので、技術的なお話はまたどこか別のエントリで。


    ○社内irc!


    社内ircも印象的でした。
    開発部門ごとに部屋が設けられているのはもちろんのこと、
    「うんこ部屋」なるゆるい感じのお部屋もあり、毎日カオスな話題が繰り広げられていましたw
    あのゆるさがたまらんです。

    ちなみにうんこ部屋以外のirc部屋は、しっかり会話がログに残るので、
    下手な事がしゃべれなかったり、休んだときに何を話してたか確認する事ができます。


    ○リフレッシュルームカオスw


    社内にはリフレッシュルームなるお部屋がありました。
    その名の通り、休憩する場所なんですが、なぜかPCダーツがおいてあったり、
    いろんな人が持ち込んだであろうゲームや本たちが所狭しと置いてあったのが印象的でした。
    インターン期間中もたまに来て、ダーツやったり、ドラクエやったりしてました。

    去年まではビリヤード台もあったらしいですが、撤去されたみたいです。
    id:itkzさんが嘆いてるらしいです。


    ○おやつ神社


    おやつ神社なるものもありました。
    各部屋におやつ広場を展開する事で、お茶の間的に社内コミュニケーションが円滑になるらしいです。

    よし体感してみよう!ということで、自分の席から近いおやつ神社に潜入!
    そこは支店らしいんですが、神社型の貯金箱にゆっくりが奉ってありましたw
    おやつは一括で購入するらしく、おやつを持ってくときにお金を入れてね!という感じです。

    でも中々黒字にならないらしい。。。w
    ・・・っていう話をしていたら、周りの人たちとも話してて、気が付けばかなりおやつ神社に居座っていました。
    恐るべし、おやつ神社。


    ○なかのひとたち


    ホントいろんな人たちがいました。破滅的な人もいれば、普通の人もいたり。
    しかしながら中々絡む事が出来なかったのが残念!
    せっかくの機会なんだからもっとガシガシ行かんとなーと、終わってから感じました。

    今回インターンの担当だったmatsuoaさんと、人事の方(名前出していいのかわかんない><)が
    お二方ともとてもいい人で、とても素敵なインターンを過ごす事ができました。
    matsuoaさんには内外関わらずいろいろなところに連れて行っていただき、
    人事の方にはインターン中の励ましはもとより、インターンの最後の最後までお世話になり、
    本当に感謝です!

    なんか惚れる人たちで、あんな大人たちになりたいなぁと思いました。


    ○去年のインターン生


    matsuoaさんの粋な計らいで、去年のインターン生の人たちにも会う事ができました。
    正直去年のインターン生、レベルタカスクリニック状態です。話しててビビリました。

    でも、「インターンでダーツがうまくなった」とブログに書いてあったのに、
    自分がダーツに勝ってしまったのも驚きましたw
    来年再戦しましょうw


    ○まとめ


    ・なんでもやってみるのが一番。
    ・短期間とはいえ住む所の治安は大事。
    ・仕事環境も大事。
    ・ドワンゴはのびのび開発ができる!
    ・LTとか刺激を受けるのも大事。
    ・チーム開発は妥協も必要。
    ・できなかった悔しさを次につなげよう!

    ・そもそも、「社内のふいんき(ryが知りたいぞー!」って事で参加してみたインターンでしたが、
    それ以上に、大切なものを得ました。

    笑いの要素って大事ですね!!!
    お笑いセンスを磨いて、次は採用面接に行きます!!!

    cakephp1.2流のエレメントキャッシュ

    2009年5月2日

    サイドメニューなど、エレメントの部分だけキャッシュしたかったので、
    マニュアルの3.9.3.2 エレメントをキャッシュするを見て、実装したのですが、
    コントローラ側からCache::read();としても反応なし。
    ・・・?と思いながらview.phpを眺めていると、以下の記述が。。。

    [php]
    if ($expires) {
    $cacheFile = ‘element_’ . $key . ‘_’ . $plugin . Inflector::slug($name);
    $cache = cache(‘views’ . DS . $cacheFile, null, $expires);
    if (is_string($cache)) {
    return $cache;
    }
    }
    [/php]

    あれ、cache();って1.1のやつだから非推奨のはずじゃぁ。。。
    ってことで、cakephp1.2流のelementキャッシュを考えてみた。

    ●view側
    [php]
    echo $this->;element(‘left_menu’);
    ?>;
    [/php]
    の代わりに以下を挿入
    [php]
    if(($element = Cache::read('left_menu', 'element')) === false){
    $element = $this->element('left_menu');
    Cache::write('left_menu', $element, 'element');
    }
    echo $element;
    ?>
    [/php]

    ●コントローラ側
    beforeFilterなどでエレメントキャッシュを定義し、
    キャッシュが存在しない場合に限り、クエリを発行する。
    [php]
    $config = array(
    ‘engine’ => ‘File’,
    ‘duration’=> ‘+5 min’,
    ‘path’ => CACHE . ‘views’ . DS,
    ‘prefix’ => ‘element_’
    );
    Cache::config(‘element’, $config);

    if( Cache::read('left_menu', 'element') === false ){
    $areas = $this->Area->find('menu'));
    $categories = $this->Category->find('menu'));
    $this->set(compact('areas', 'categories'));
    }
    [/php]

    これで劇早&1.2流のキャッシュができましたー!

    CentOSでmod_rails(Passenger)のインストール

    2009年1月23日

    仕事先でmod_railsを使う機会があったのでインストールしてみました。
    mod_railsは何かというと、ruby on railsをapacheのモジュールとして起動する事により
    効率を大幅に上げよう、というものです。
    また、特定数秒(デフォでは120秒)アクセスがないと、自動的にプロセスが終了したり、
    アクセスが多いと増加するので、単純にmongrelをたくさん起動しておくよりも効率的です。
    以前はApache+mongrel_railsでしたが、明らかにレスポンスが向上しました。
    では早速インストールの記録を。


    1.passengerのインストール
    gemを使ってpassengerをインストールします。
    なんか下にwarning出たけど問題ありませんでした。

    [root@rails-dev ~]# gem install passenger
    Building native extensions. This could take a while…
    Successfully installed rack-0.9.1
    Successfully installed passenger-2.0.6
    2 gems installed
    Installing ri documentation for rack-0.9.1…
    Installing ri documentation for passenger-2.0.6…
    Installing RDoc documentation for rack-0.9.1…
    Installing RDoc documentation for passenger-2.0.6…
    ./doc/template/horo.rb:17: warning: already initialized constant FONTS
    ./doc/template/horo.rb:19: warning: already initialized constant STYLE
    ./doc/template/horo.rb:213: warning: already initialized constant XHTML_PREAMBLE
    ./doc/template/horo.rb:221: warning: already initialized constant HEADER
    ./doc/template/horo.rb:272: warning: already initialized constant FILE_PAGE
    ./doc/template/horo.rb:300: warning: already initialized constant CLASS_PAGE
    ./doc/template/horo.rb:338: warning: already initialized constant METHOD_LIST
    ./doc/template/horo.rb:486: warning: already initialized constant FOOTER
    ./doc/template/horo.rb:491: warning: already initialized constant BODY
    ./doc/template/horo.rb:503: warning: already initialized constant SRC_PAGE
    ./doc/template/horo.rb:531: warning: already initialized constant FR_INDEX_BODY
    ./doc/template/horo.rb:535: warning: already initialized constant FILE_INDEX
    ./doc/template/horo.rb:583: warning: already initialized constant CLASS_INDEX
    ./doc/template/horo.rb:584: warning: already initialized constant METHOD_INDEX
    ./doc/template/horo.rb:586: warning: already initialized constant INDEX

    2.http-develのインストール
    mod_railsを生成するにはapacheモジュールとしてのコンパイルが必要です。
    事前にyumで開発キットをインストールしておきます。
    (その前にgcc,gppなどをあらかじめインストールしておいてください。)

    [root@rails-dev ~]# yum -y install httpd-devel
    base 100% |=========================| 1.1 kB 00:00
    updates 100% |=========================| 951 B 00:00
    primary.xml.gz 100% |=========================| 369 kB 00:00
    updates : ################################################## 796/796
    addons 100% |=========================| 951 B 00:00
    extras 100% |=========================| 1.1 kB 00:00
    Setting up Install Process



    Installed: httpd-devel.i386 0:2.2.3-11.el5_2.centos.4
    Dependency Installed: apr-devel.i386 0:1.2.7-11 apr-util-devel.i386 0:1.2.7-7.el
    5
    Updated: httpd.i386 0:2.2.3-11.el5_2.centos.4
    Dependency Updated: httpd-manual.i386 0:2.2.3-11.el5_2.centos.4 mod_ssl.i386 1:2
    .2.3-11.el5_2.centos.4
    Complete!

    3.passengerの設定
    passengerを設定し、モジュールを作成します。

    [root@rails-dev insoshi]# passenger-install-apache2-module
    Welcome to the Phusion Passenger Apache 2 module installer, v2.0.6.
    This installer will guide you through the entire installation process. It
    shouldn’t take more than 3 minutes in total.
    Here’s what you can expect from the installation process:
    1. The Apache 2 module will be installed for you.
    2. You’ll learn how to configure Apache.
    3. You’ll learn how to deploy a Ruby on Rails application.
    Don’t worry if anything goes wrong. This installer will advise you on how to
    solve any problems.
    Press Enter to continue, or Ctrl-C to abort.
    1
    Checking for required software…
    * GNU C++ compiler… found at /usr/bin/g++
    * Ruby development headers… found
    * OpenSSL support for Ruby… found
    * RubyGems… found
    * Rake… found at /usr/bin/rake
    * Apache 2… found at /usr/sbin/httpd
    * Apache 2 development headers… found at /usr/sbin/apxs
    * Apache Portable Runtime (APR) development headers… found at /usr/bin/apr-1-
    config
    * Apache Portable Runtime Utility (APR) development headers… found at /usr/bi
    n/apu-1-config
    * fastthread… found
    * rack… found
    ——————————————–
    ——————————————–
    Compiling and installing Apache 2 module…
    cd /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6
    /usr/bin/ruby -S rake clean apache2
    (in /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6)
    ・・・コンパイルが始まる・・・
    ——————————————–
    The Apache 2 module was successfully installed.
    Please edit your Apache configuration file, and add these lines:
    LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/apache2/mod_passenger.so
    PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6
    PassengerRuby /usr/bin/ruby

    ↑以上がapacheの設定に書き込む部分になるので、コピーしておきます。
    After you restart Apache, you are ready to deploy any number of Ruby on Rails
    applications on Apache, without any further Ruby on Rails-specific
    configuration!
    Press ENTER to continue.
    エンターを押す
    ——————————————–
    Deploying a Ruby on Rails application: an example
    Suppose you have a Ruby on Rails application in /somewhere. Add a virtual host
    to your Apache configuration file, and set its DocumentRoot to
    /somewhere/public, like this:

    ServerName www.yourhost.com
    DocumentRoot /somewhere/public

    And that’s it! You may also want to check the Users Guide for security and
    optimization tips and other useful information:
    /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/doc/Users guide.html
    Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)

    http://www.modrails.com/

    Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.

    4.apacheの設定をする
    先ほどコピーした内容を貼り付け、さらに具体的に使用するrailsアプリケーションの指定をします。
    今回はinsoshiというrailsアプリケーションを使いました。

    [root@rails-dev ~]# vi /etc/httpd/conf.d/mod_rails.conf
    LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/apache2/mod_passenger.so
    PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6
    PassengerRuby /usr/bin/ruby
    ↑先ほどコピーした部分をそのまま貼り付け

    DocumentRoot /var/shared/insoshi/public

    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all

    ↑DocumentRootにはpublicを指定

    5.apacheのリロード
    apacheの設定をリロードさせて、設定を適用します。

    [root@rails-dev ~]#service httpd reload

    これで対象のサーバにアクセスすると、無事起動する事ができました。
    *参考サイト
    Passenger (mod_rails for Apache) を使ってRedmineを動かしてみたよ! – RX-7乗りの適当な日々
    Passenger (mod_rails for apache)での色んな設定値について調べてみた
    Apache上でRuby on Railsアプリケーションを動かす/Passenger(mod_rails for Apache)の利用

    データベースが文字化けしたら…

    2008年10月26日

    CakePHPで開発している際に、phpmyadminなどでデータベースの中身を表示させようとすると、
    文字化けする事があります。
    これは、CakePHP内のdatabase.phpに記述が足りない事が原因の模様。。。
    [php]
    var $default = array( ‘driver’ => ‘mysql’,
    ‘connect’ => ‘mysql_connect’,
    ‘host’ => ‘localhost’,
    ‘login’ => ‘root’,
    ‘password’ => ”,
    ‘database’ => ‘encodetest’,
    ‘encoding’ => ‘utf8′, ←この部分を追加
    ‘prefix’ => ”);
    [/php]
    (前のデータは化けてしまいますが、)これで新規データ分については文字化けが起こらないようになりました。
    参考:続・CakePHPと文字化け (PHP学習日記)

    拡張子がmp3のファイルを強制ダウンロードさせる

    2008年10月21日

    通常、単にmp3ファイルをweb上に置いただけでは、
    mimeタイプがaudio/mp3となってしまい、ブラウザによってプレーヤが起動したり、ダウンロードしたり、と挙動が異なってしまいます。
    そこで、拡張子がmp3のファイルは、mimeタイプを変えて強制ダウンロードさせることにしました。
    <方法>
    対象のディレクトリに.htaccessファイルを作り、以下の内容を記入します。
    [code]
    AddType application/octet-stream .mp3
    [/code]
    ※最終行の改行をお忘れなく。
    これで、ファイルのクリックをした場合、ダウンロード画面が表示されるようになりました。

    右クリック一発でコマンドプロンプトを開く の レジストリ

    2008年8月7日

    開発者の方にはとっても便利な機能。
    アイコンを右クリックしてコマンドプロンプトが選択できるようになります。
    ●方法
    以下の内容をmigi_cmd.regで保存し、実行するだけ。
    [code]
    Windows Registry Editor Version 5.00
    [HKEY_CLASSES_ROOT\Directory\shell\cmd]
    @="コマンドプロンプト"
    [HKEY_CLASSES_ROOT\Directory\shell\cmd\command]
    @="cmd.exe /k \"cd %l\""
    [/code]
    migi_cmd.regのダウンロード
    ●結果
    下記のように表示されるようになりました。
    右クリック一発でコマンドプロンプトを開く のSS
    参考:選んだフォルダをカレントフォルダにしてコマンドプロンプトを開く

    gemをアップデートするとうまく動作しない問題のまとめ

    2008年8月6日

    gemを最新版にアップデートすると仕様変更からさまざまなエラーが発生するため、
    そのままではうまく動作しません。この問題にはまり、2時間も消費した。。。
    エラーと共に、状況をまとめてみます。
    環境:vmware, debian etch, gemなどはパッケージにてインストール
    1.まず、gemをアップデートする

    gem update –system
    gem pristine –all

    ただし、アップデート後にgemコマンド (gem pristine –all)を実行した段階で以下のエラーが発生します。

    uninitialized constant Gem::GemRunner (NameError)

    または

    ERROR: While executing gem … (Gem::Exception)
    Failed to find gem rails >= 0

    このエラーの対処のため、/usr/bin/gemの8行目辺り、require ‘rubygems’の下に以下を追加します。

    require ‘rubygems/gem_runner’

    再度gem pristine –allを試してみる。

    testsrv01:~# gem pristine –all
    Restoring gem(s) to pristine condition…
    Restored rails-2.1.0
    Restored activeresource-2.1.0
    Restored actionpack-2.1.0
    Restored actionmailer-2.1.0
    Restored activerecord-2.1.0
    Restored rake-0.8.1

    これで一応動作するようになります。
    —参考サイト
    undefined method `require_gem' for main:Object – 夜の Discovery
    “Warning: require_gem is obsolete.”を解決 – Rails2.0.1バージョンアップ格闘記
    Kazu-の気ままにOSS: ApacheとRuby on Railsの連携
    railsにやられ気味 – ニッキ

    学校・企業でフィルタ突破!

    2008年7月10日

    最近どこの学校、企業でもそうですが、エッチぃサイト見れないようにフィルタリングされてたり、
    余計なポートが塞いであって、VNCつなげなかったり、掲示板見れなかったりします。
    そんなこんなで見つけてきた対応策をメモしときます。
    >>方法1 – webproxyを使う
    はい、一番手っ取り早いですねw
    「webproxy cgiproxy phpproxy」のいずれかでググればこの手のサイトは山ほど手に入ります。
    ここではたくさんリストがされているサイトを紹介しときます。
    ウェブプロキシ(WebProxy)の概要と設置サイト
    cgiproxy – Google検索
    webproxy – Google検索
    phpproxy – Google検索
    >>方法2 – httpトンネルを使う
    たとえば、フィルタリングされてて、それがproxy経由である場合、httpトンネルが使える場合があります。
    目的のサイトへSSLで暗号化してつなげるから、フィルタリングをスルー、っていうもの。
    一番簡単なのが「HTTPort」というソフト。
    これを起動して、適当に設定して、proxyの設定をlocalhostに向けるだけで、フィルタリングをスルーできてしまいます。
    以下のページに、日本語の分かりやすい解説ページがあります。
    HTTPortでファイアーウォール(プロキシ)を超えよう
    HTTPort
    >>方法3 – SSHトンネルを使う
    VPNやらリモートデスクトップを使いたい際には、この手段が一番です。
    まず、SSHで接続できるサーバを確保します。自宅サーバでもOKです。
    次に、PUTTYやらTeraTermで接続ポートを設定すれば、完了です。
    *詳細は後日書きます。
    まぁ、こんなところで。