2011-12-21

Redmineバージョンアップ記録

Redmine Advent Calendar jp 2011 の21日目の記事になります。

前回のPOSTで、「(バージョンアップ)移行の顛末は、何かで発表したいなあと思います」と書いておきましたが、今回話題が思いつかなかったことと、本当は勉強会でお話しできるといいのですが、参加自体が難しいので、アドベントカレンダーに便乗して書かせていただきます。

長めになってしまい申し訳ないのですが、こんな流れになっています。

  1. 移行前後の実行環境
  2. 移行の準備 / 動作確認
  3. nginx + unicornについて
  4. ログのローテーション
  5. 移行後のフォロー
  6. まとめ

1. 移行前後の実行環境

移行前は、Redmine 0.9.xを利用していました。

1系が出てからだいぶ経つので、バージョンアップはしたいなあ~と思っていたものの、本体ソースにカスタマイズ分が入っていたり、ユーザが増加していたため、なかなか移行に切り出せませんでした。(管理は別の方の担当だったので)

大きな問題はなかったので、そのまま利用していたのですが、PDF出力の利用が増えるに伴い、ある特定のチケットのPDFを出力しようとするとCPUが回りっぱなしで、あげくにタイムアウトしてしまうという状況が発生するようになりました。

さすがにこれでは困る、ということで、リソースの見直しも含めてバージョンアップの検討に入りました。

2. 移行の準備 / 動作確認

今回はRailsの実行環境も大幅に違います。本番サーバには不足しているライブラリがたくさんありましたが、インターネットからのダウンロードは使えない状況。OSも32bitだったので、別サーバで環境を用意し、DNS切り替えで新環境への移行という方法を取りました。

まずはRedmine0.9に対してカスタマイズした部分の洗い出し、新バージョンでのプラグインの互換性のチェックを行いました。
Redmine本体のバージョンが上がったため機能が向上し、プラグインでカバーする必要が無くなったものもあるので、利用しなくて良さそうなプラグインは削除。管理に役立ちそうなプラグインは追加で導入しました。

また、カスタマイズしていた部分は、出来るだけ自作プラグインや自作テーマという形で置き換えるようにしました。このあたりは、r-labsの記載や既存のソースを参考にさせていただきました。

その上で、どうしても本体をカスタマイズしないといけない部分は、Redmine本家に取り込んでもらえるようにお願いをしたりしました。

問題なくバージョンアップが出来るか、もちろん、テスト環境で本番のデータをコピーして検証をし、ユーザさんにもお願いして不具合の洗い出しを行っています。不具合や要望はRedmineのフォーラムに届け出てもらうようにしました。

最低限の本体へのカスタマイズ(1行だけ)で、あとはプラグインでの対応が可能との目処がついたので、いよいよ本番切り替えの準備。

データの同期とDNSキャッシュのクリアの時間を鑑み、ユーザさんには一定時間Redmineが使えませんよ、とのお知らせをしています。

その上で、移行日までは、正常にマイグレーションや起動ができるか、本番サーバと同じネットワーク上で切り替え予定のサーバを待機させて、定期的にファイル・DBの同期とRedmineのMigration、メッセージの書き換えを行い、読み取り専用で稼働させて、直近のデータを搭載しても問題ないかのチェックを行いました。

redmine

2011-12-15

SSHでスレーブを起動する時の注意

Jenkinsで、master / slave構成にし、SSHでログインしてスレーブのアカウントでジョブを実行しようとしても、なんだか環境変数がうまく引き継がれないとき…。

非対話モードでのログインになるので、~/.bash_profile (/etc/bash_profile)  じゃなくて、~/.bashrc  (/etc/bashrc) の方を見に行きます。

通常ログインして操作できてるのに、Jenkinsからだとうまくいかない、環境変数が引き継がれないなあ、なんて時は、ご注意を。

#私はJenkinsのスレーブのログで気が付きました。( /etc/bashrc を参照していたので)

2011-12-09

Translation Assistance Pluginの効果がイケてるらしい

先月、Translation Assistance Pluginについて書いたのですが、川口さんがその件についてコメントを下さいました。ありがとうございます!

川口さんの教えて下さった記事を見てみました..。

『このプラグインを導入して3か月が立ち、フィードバックを取り込む機会が来ました。結果はとっても目を見張るものがありました』、とのことです。

凄いですねー!

以下、ざっくりですが内容を書いてみました。(そもそも川口さんが書かれたものなので、わたしが勝手な解釈も含みつつ取り上げるのも、おこがましいのですが..)

* * *

それまでは、26か国語に対応をしつつも、それなりに充実度はバラつきがありました。(フランス、日本、ドイツに関してはかなり充実していますが)

プラグイン導入後は、17か国語が新たに加わり、40か国語に関してアップデートを行い、トータル43か国語へ対応することになりました。

新たに加わった言語はアラビア語(ただし、まだJenkinsは右から左への表記には対応していません)、エスペラント語、ヘブライ語、中国語(繁体字&簡体字どちらも)、韓国語などです。

この作業を通して、ヘブライ語やインドネシア語、イディッシュ語、ヘブライ語についてはJenkinsの表示がきちんとされなくなってしまうという課題を見つけました。

これらの変更は1.443以降に適用されます。また、今後、もっと頻度を上げて早めに取り込めるようにしていく予定です。

ローカライズにご協力下さったみなさん。本当にありがとう!そして、まだまだよろしくおねがいします!

ローカライズを通しての(Jenkinsへの)貢献は、非常に簡単です!
ローカライズ作業について、さらにもっとご興味があれば、こちらのWikiページを見て、プロジェクトのコミッタの皆さんにリクエストをしてみて下さい。

コードを書かなくても、みなさんはローカライズを通して、OSSの活動に貢献することができます。

* * *

そういえば、Hudson勉強会の時に、プラグインのローカライズについて先駆けてLTされていた、@itouakihiro (akihirox) さんのお話しも思い出しました。

コードを書いたり、ローカライズのお手伝いをしたり、Donationでの貢献など、いろいろな形で参加できるんですね。

機械的に翻訳するのではなく、動作がちゃんとわかったうえでの翻訳はとても有難いです。意味がよく分からず、「これどういうことなんだろう」と思いながら試すのも、また楽しいものではありますが:)

    2011-12-08

    外部ジョブの監視も使ってみよう!

    Jenkins Advent Calender 2011 8日目担当の、@akiko_pusuです。よろしくお願いします!

    私の場合は、Jenkinsを正統派CIツールとして使っているのではなくて、雑多なCronジョブや定型化できる作業(バックアップやリストア、リカバリなど)の管理 / 実行 / 記録のために使っています。

    作成するジョブはフリースタイルのプロジェクトで、かつ、Shell ScriptやDOSコマンドを使って処置するものがほとんど。

    ただし、「外部ジョブの監視」というタイプでのCronジョブのチェックも行っています。今回はこのタイプについてのお話しを書いてみようと思います。

    内容は、下記の通りです。
    1. 機能の説明
    2. どうやってPOSTしているの?
    3. javaを使わずにShell + curlでPOSTしてみる
    * * *


    1.機能の説明


    地味な機能?だとは思いますが、『Cronジョブのメールが届き過ぎて、全然チェックしないままになっている。そういうことが積み重なって、実際のところエラーがあったのに見落としてしまった…』というようなパターンには、有効だと思います。

    作り方は簡単で、「外部ジョブの監視」を選んで、タイトルと説明、記録をどれだけ残すかを設定するだけです。

    external-job

    JenkinsのWikiを参考にかいつまんで言うと、Jenkinsのマスタノードをトリガにせず、マスタ / スレーブの設定も行わずに、任意のホスト上でジョブを実行し、JenkinsのプロジェクトのURLに結果をPOSTし、記録のみを行う、ということになります。

    jenkins

    Jenkinsはジョブの結果を受け取る場所だけを用意し、XMLの形式でPOSTが届いたら、せっせとその記録を蓄積するだけです。

    ステータスコードによるジョブの失敗/成功の判定と、実行記録を蓄積するのみなので、結果を受けてJenkinsマスタノードが次のステップを呼び出したり、プラグインによる色々な操作につなげる…といったことは出来ません。

    ですが、少なくとも、自分のメールボックスをCronの通知でいっぱいにさせることもなくなるし、自分以外の管理者との情報共有も可能になります。通知のMAILTOの設定もaliasを使ったりすると面倒なのですが、それもしなくて良くなります。

    また、RSS、最新の成功/失敗ジョブの記録は、フリースタイルやMavenプロジェクトタイプと同じように固定URLで取得できるので、このURLを定期的にチェックして、次のアクションを起こせるように、Jenkins自身で別のジョブを作ればいいのかもしれませんね。

    2.どうやってPOSTしているの?


    JenkinsのWikiを参考にすると、こんなかんじです。


    1. jenkinsのjenkins-core.jar を使って、実行したいスクリプト (Shellや*.bat) を引数に指定してあげて、javaからラップして実行する。
    2. スクリプトの結果(出力とステータスコード)をjavaのプログラムが受け取り、XMLのフォーマットに変換する
    3. XMLをJenkinsの指定のジョブにPOSTする。
    4. Jenkins側がXMLを受け取って、ビルドの記録として蓄積。結果は<result/>を参照して判断。(ただし、結果をhexBinaryで変換する必要がある

    要は、所定のフォーマットのXMLで結果をPOSTすればいい、ということになります。

    シェルの結果からXMLに変換しJenkinsにPOSTする部分をjenkins-core.jarが担っているのですが、このケースだとjavaを使う必要がありますし、jenkins-core.jarも実行環境に配置しておかないといけません。

    サーバ、マシンの環境によってはjavaを入れていない、使えないケースもあるかと思いますが、とにかくXMLをPOSTすればいいので、javaとjenkins-core.jarを必ずしも使う必要は無かったりします。

    3. javaを使わずにShell + curlでPOSTしてみる



    JenkinsのPOST用のXMLはそんなに複雑なフォーマットではありません。
    XML生成専用のライブラリを使ってGenerate…なんてことはせずに、単純に文字列を連結するだけでも大丈夫。

    また、httpでのPOSTも、Unixの環境ならwgetやcurlが利用できます。

    下記に、Jenkins側にローカルホスト内のジョブやスクリプトの実行結果を通知するための、ラッパースクリプトを作って置いてみました。(と言っても、hudsonのラッパーを作成して下さっていたBlogエントリがあったので、そちらを利用したものですが…)

    ソース: https://github.com/akiko-pusu/misc/blob/master/misc/jenkins_wrapper.sh
    参考にしたサイト: http://blog.markfeeney.com/2010/01/hudson-external-jobs-wrapper-script.html 

    実行例は下記の通りです。
    jenkins_wrapper <jenkins_url> <job名> <script>

    % jenkins_wrapper http://jenkins.myco.com:8080 \ testjob /path/to/script.sh
    
    
    ※ tempファイルを作成するため、実行ユーザに /tmp の書き込み権限があるかをチェックして下さい。また、既存のシェルスクリプトを指定してうまく動かない場合は、フルパスで指定してみて下さい。もし、すでに、こんなCronがあったとしたら、ラッパースクリプトを使って置き換えるだけでOKです。

    #00 02 * * * /pasth_to/myscript.sh
    00 02 * * * jenkins_wrapper.sh jenkinsのURL job名 /pasth_to/myscript.sh


    TODO:

    Jenkinsのバージョンが上がって、XMLにもう少し説明を追加できるようになっているので、このラッパースクリプトもちょっと修正が必要です。また、認証付きのジョブになっている場合は、username & passwordも付加しないといけないので、こちらも対応できるようにしたいなと思っています :)

    また、ぜひ、Windows環境下に適応したラッパー書いてくださる方を募集します!(PowerShell大歓迎!そこまでの技量がなくて申し訳ないです...)

    * * *

    おわりに


    マスタ/スレーブの形が利用できない環境では、最初はわたしも jenkins-core.jar を使ってjavaでラップしていたのですが、Shellのみに置き換えたところ、cronの調整も楽になりました。(Blogを書いてくださった Markさんのおかげです!)

    Hudson時代も含め、Jenkinsさんにはとてもお世話になっていて、川口さんのおっしゃっている、『人間の貴重な時間』を、有効に使えるようになりました。

    #子どもたち、家族との時間も、急な対応に邪魔されずにすむようになりました。

    before

    みなさんも、ビルドだけでなく、どんどん定型ジョブや定型化できそうな作業を、Jenkinsに置き換えてみて下さい。また、記録もJenkinsさんにお任せしてみて下さい。
    なんでもないと思っていたcronの結果からも、記録し続けることで何かもっと改善できるヒントが見つかるかもしれません。

    @kiy0takaさんのX’masプラグインにめげずに、みなさんが良い年末年始を過ごせますように…。

    * * *

    次は@leather_soleさんになります。どうぞよろしくお願いいたします!

    2011-12-06

    チケットが消えちゃう??

    Redmine Advent Calendar jp 2011 の6日目を担当させていただきます、宜しくおねがいします!

    それまで使っていたRedmine0.9.xから、なんとか1.2.1までバージョンを上げて半月ほど。
    Apache + Passengerという環境から、nginx + unicornに実行環境を変えたため、リソース面でのtry & errorはあったものの、なんとか大きな不具合もなく動いてくれているようです。(移行の顛末は、何かで発表したいなあと思います

    今回は、そんなバージョンアップ作業中に遭遇した出来事について書かせていただきます。

    * * *

    ユーザさんにお願いして、切替え予定機上で、1.2.1での動作確認や機能の違いをチェックしてもらっていた時のこと。

    「たかのさん、チケットが消えちゃうんです!」※akiko_pusuのことです。

    バージョンアップの予定は明後日に迫っています。

    プラグインやカスタマイズした部分の動作確認が済んで、データのインポートとMigrationの工程もJenkinsを使って準備OKになっていた時期です。しかも、退社直前だったので、『あー、お迎えに送れちゃう!!』と思いながら、届け出てくれたユーザさんと一緒に現象を確認すると…。

    チケットが削除されちゃう、という不具合ではないのですが、「IE8でチケット一覧からチケットのリンクを選択したら、チケットが表示されなくなってしまう」という症状。

    私はIE9を利用していたんですが、言われたとおりにしてみると、確かに再現します。

    1. どんな状況で起こるの?

    • IE (8 and 9) を利用している。
    • チケット一覧やロードマップなど、リンク付きのチケット一覧+コンテキストメニュー(右クリック)が利用できる箇所。
    • CSSの .hascontextmenu { cursor: context-menu; } が指定されている範囲にあるセル (<td></tyd>)

    2. 再現方法は?

    • チケット一覧 or ロードマップ一覧を表示。
    • チケットの列のうちのどれか一項目を、Drag&Dropで選択する。(文字列のコピーを行う時のように、Drag&Dropで選択します)
    • 選択した後、いったんマウスのボタンを離して選択解除する。
    • 選択した部分の文字列が消えてしまう。
    • HTML的なソースは変わらないが、画面からは見えなくなってしまう & 文字があった場所はブランクになって選択できない。

    チケット一覧では<td></td>に挟まれたセル単位で消えてしまいますが、ロードマップの場合はチケットの行そのものを「選択 –> 選択解除」すると、1行分丸ごと見えなくなってしまいます。
    下記は、ロードマップでの例です。(Redmine本家です)

    context

    CSSの、.hascontextmenu { cursor: context-menu; } のスタイルが適用されている箇所では、右側に小さいコンテキストメニューを示すアイコンがくっついたカーソルが表示されます。
    次に、Copy&Pasteの要領で、コンテキストメニューが有効な範囲にある項目を選択します。

    context-2

    選択して、すぐに解除すると、選択した範囲の文字が消えてしまいます!

    context-3

    ロードマップの場合は、列ごと消せました。
    地道に遊んでみると、全部消せちゃったりします…。

    context-4

    Redmineはずーっと使っているし、IE中心の生活だったのですが、これには全く気が付いていませんでした。発見した方、凄い~と思ってしまいました!(もしかして、もうみなさんご存じだったかな…)

    「インストールしたプラグインや、表示のテーマ、あるいはカスタマイズした部分のせい?」と思い、素のRedmineや、Redmine.org(本家)、お世話になっている r-labs さまのところでも試してみたのですが、やっぱり再現。

    実際にチケットが削除されるわけではなく、表示されなくなってしまうというもののため、不具合というよりは、IEの問題だろうということで、ひとまず発見した方、関係者の間で閉じておきました(^^;

    私はCSSには詳しくないので、理由が判る方がいらしたら、ぜひフィードバックをお願いいたします!

    さすがにこんな内容ではTipsにならずに申し訳ないので、Redmineのパスワードのリセット方法を紹介します。

    * * *

    Adminのパスワードが分からなくてログインできない!

    adminアカウントでログインしたいんだけど、パスワード何だったかなあ…。
    移行の際にこんなトラブル?にも遭いました。

    で、困っていたら、redmine.jpにリセット方法が書いてありました

    こちらは、script/consoleを利用する方法です。データベースを直接Updateしなくても大丈夫。
    (この時点で、自分だけが知っているTips、にはならないかもしれませんが…)

    # ruby script/console production
    Loading production environment (Rails 2.3.11)
    >> admin = User.find_by_login(‘admin’)
    => #<User id: 1, login: "admin", hashed_password: "xxxxxxxxxxxxxxxxxxx", firstname: "Redmine", lastname: "Admin", mail: "admin@somenet.foo", admin: true, status: 1, last_login_on: "2010-02-19 13:14:19", language: "ja", auth_source_id: nil, created_on: "2008-09-29 11:51:33", updated_on: "2010-02-19 13:14:19", type: "User", identity_url: nil, mail_notification: "only_my_events", salt: "">
    >> admin.password = ‘xxxxx’
    => "admin"
    >> admin.save! #saveをお忘れなく。=> true
    >> quit

    RAILS_ENV=productionとしても同じく操作できるようです。

    実は、パスワードリセットの羽目になるまで、script/console って、使ったことがありませんでした。
    わざわざWebのUIからアクセスしなくとも & MySQLのSQL文を使わなくとも、モデルの値の操作とか出来てしまうんですね、便利!(今頃言うのは恥ずかしいけど…)

    LDAPなどの認証方式を変える場合は、こちら。(LDAP接続から内部認証方式に切り替えています)

    >> user1 = User.find_by_login(‘user1@test.xxxx’)

    >> user1.auth_source_id = nil
    => nil
    みんなのパスワードと認証方式を変えちゃう場合は、こんなかんじです。
    >> @users = User.all
    >> for user in @users
    >>   user.password = “……”
    >>   user.auth_source_id = nil
    >>   user.save!
    >> end

    ユーザさん毎にできる動作や表示される内容が違うので、検証する際にはこの方法を使ったりしています。 こんなくらいですが、なにかのお役に立てれば幸いです…。

    * * *

    次は@naitohさんです。(@naitohさんのご尽力で、PDF出力に関しては幸せになっております!)
    どうぞよろしくお願いいたします!

    2011-12-01

    RedmineのREST APIを使ってみる。

    いまごろではありますが、主に使っているRedmineのバージョンが上がったので、やっとREST APIが使える環境になりました。
    #個人的にREST APIを使ったツールを作ってみる活動はしていたのですが、メインの環境では対応していなかったのもあって、モチベーションが続いてませんでした…。

    できれば周りにも利用したり、応用したり、良いアイディアを出してもらいたいなあと思ったので、まずはどんな感じで使えるか、というサンプルを作ることにしました。

    * * *

    チケットの参照はWebから行うことの方が多いので、やっぱりチケットを作るサンプルから。

    参考にさせていただいたREST APIについての記述は、Redmine本家と、r-labsのサイトの日本語訳になります。(ありがとうございます!)

    動作確認は、daipresentsさんの記事を参考にさせていただきました。こちらもありがとうございます!

    daipresentsさんの記事では、RESTを試すクライアントとして、RESTClient を使われていました。こちらは使ったことが無かったので、ダウンロードしてみたところ、なるほど、これも便利でした。
    わたしの場合は、いつもはFiddler2 を使っているので、参考までにFiddler2でのスクリーンショットを載せておきます。

    1枚目がPOSTメソッドでリクエストを生成するところ。2枚目がレスポンスの画面です。
    うまくチケットが出来ると、Status Code 201が返ってきます。また、レスポンス本文にも、チケットのIDを含めたXMLが返ってきます。

    fiddler-request

    fiddler-result

    動作確認ができたので、じゃあ、チケットを作成するプログラムを…と思ったのですが、RubyやPerl, Pythonといったライブラリの組み込み状況は、サーバの環境によってまちまち。Perlしか入れていないところもあります。

    現在のチケット作成のAPIは、添付ファイル付きでの作成が出来ず、結局のところXMLをPOSTすることになるので、シンプル?に、curlとShellを使ったスクリプトを作ることにしました。

    チケット作成がメインで、Statusの指定やカテゴリの指定は重視していなかったので、オプション設定は行っていません。Shellを参考にカスタマイズすれば、Updateやカテゴリ設定も可能かと思います。(実はまだUpdateは試してないので、できたらまた追記します)

    使い方は、このような感じです。

    $redmine_postIssue.sh –u REDMINEのURL –k APIキー \
       –p プロジェクトID(番号じゃなく識別子)  \
      -t トラッカーID(番号) –s タイトル \
      -d チケット本文

    チケット作成時に、作成者を別途指定できたり、担当者も指定できます。ただ、やっぱり担当者とかトラッカーとかのIDをきちんと知っていないといけません。

    APIを使ってリッチなクライアントを作るって、凄いなあと思っています(^^;

    2011-11-16

    Translation Assistance Plugin (Jenkins)

    プラグインを追加するついでに、3か月ぶりくらいに、Jenkinsのバージョンを上げてみました。
    そうしたら、画面の右隅に ”Help us localize this page” という、見慣れぬリンクが…。

    何かな~?と思ってクリックしてみると、図のようなウィンドウがポップアップしました。

    localize

    ウィンドウには、英語表記の箇所と、それを埋めるフォームが表示されています。自分の利用する言語(Japanese)を選んでみると、英訳の下に和訳で埋まっているフォームと、そうでないフォームがありました。

    で、良く見てみると、”Help us localize this page” というリンクの文面そのものに該当するフォームがあったので、それっぽい日本語を入力してみると…。

    なんと、リンクの文面がその通りにかわったではありませんか

    このウィンドウの上部に、What's this? というリンクがあったので、クリックしてみると、これ自体がJenkinsのプラグインでした
    作者は、ズバリ、川口さん!

    説明書きには、下記のように、管理者権限があれば、設定がすぐ反映されますよ、とのこと。管理者権限が無い場合は、セキュリティ上の理由で稼働中のJenkinsインスタンスには即反映はされませんがJenkinsサーバには送信されます、ということらしいです。(まさにそうでした)

    If you have an administrative access to the Jenkins instance, your contributions will be reflected right away — just reload the page to see the effect. (If you do not have the access, your changes won't be reflected to the running instance for security reasons, but nonetheless they are sent to the Jenkins server.)

    しかも、このプラグイン、なんとも魅力的な一文が書いてあります。

    Your contributions are also sent to Jenkins project for the inclusion in future versions of Jenkins.

    「あなたのContributeは、Jenkinsプロジェクトに伝えられますので、将来のJenkinsに反映されるかもしれませんよ~!」(超訳)

    こんなところまで、自動化?というか、フィードバックを受け付けやすいようにしてあるなんて、個人的に感動してしまいました。

    本当は、アドベントカレンダーの話題にしようと思ったのですが、みなさんがどんどんフィードバックして下さったほうが幸せだと思って、Blogに書いてみました。

    2011-10-28

    WordPressの移行 (サーバ名変更とReverse Proxy下へ移動)

    テストで動かしていたWordPressですが、ログイン時と認証後のアクセスはオレオレ証明書にてHTTPS化して運用していました。 こちらを、なんとか正規証明書の下で動かすことに。
    ただし、自ホストで正規証明書を利用することは運用上難点があったので、リバースプロキシにHTTPS化してもらうことになりました。
    今までアクセスしていたホスト名はDNSを変更して、リバースプロキシ側に譲ります。一方、WordPressを稼働させていたホスト自身は、また別の名前に付け替え。
    * * *
    リバースプロキシの設定も、ホスト名の変更もそんなに手間はかかりません。 ホスト名変更の場合は、/etc/hostsと/etc/sysconfig/network を変えて、再起動でOK。
    再起動を待ち、「いざ、WordPressにアクセス!」となったのですが、何か変..
    1. アップロードした画像が表示されない。
    2. ログイン画面に遷移し、正しいアカウント&パスワードを指定してもログインできない
    ブログサービスは無料のBloggerとかを利用していて、運用は全然知識が無かったのですが、やってみると色々調整が必要なんですね。(でも、自前でBlogを立てる需要は無いと思いますが…)

    2011-10-04

    hg commitで文字コードのエラー

    Gitも怪しいのですが、Pythonのsetuptoolを使ってhgがサクッと入ってしまったので、少しためしてみることにしました。

    単純にcloneして更新して、commit して pushするので大丈夫かな…と思い、テスト開始。
    hg diff で差分もチェックできて、次はコミットです。

    が…。

    # hg –m ‘更新しました’ commit
    更新したファイル名
    transaction abort!
    rollback completed
    abort: decoding near 'てすと': 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)!

    なんと、コミットが通りません!

    心をひとまず落ち着けて良くみると、
    この文字は、Pythonの文字コード関連で良く見かけたエラーです。Pythonの文字コードを、デフォルトutf-8にしたい場合は、そういえば sitecustomize.py を書いてライブラリに置けばいいというのが定石だったので、さっそくその通りに。

    でも、まだエラーが治りません…orz

    またもGoogleさまにお世話になると、環境変数 HGENCODING というものを指定すれば良いらしく、こちらでutf-8を指定するとOKになりました。

    # export HGENCODING=utf-8
    # hg commit -m 'てすと'

    committed changeset 2: xxxxxxxx

    別な方法もあるのかと思いますが、ひとまず .bash_profileなどに設定を記載して、こちらの問題はなんとかなりました。



     

    2011-09-15

    Nginxはじめの一歩

    ひとまず入れてみたので、メモです。WordPressのフロントにも使えるのであれば、ちょっとずつ勉強しようと思います。

    オプション確認

    # /usr/local/nginx/sbin/nginx -h
    nginx: nginx version: nginx/1.1.2
    nginx: Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]
    Options:
      -?,-h         : this help
      -v            : show version and exit
      -V            : show version and configure options then exit
      -t            : test configuration and exit
      -q            : suppress non-error messages during configuration testing
      -s signal     : send signal to a master process: stop, quit, reopen, reload
      -p prefix     : set prefix path (default: /usr/local/nginx/)
      -c filename   : set configuration file (default: /etc/nginx/nginx.conf)  -g directives : set global directives out of configuration file

    起動&停止

    #/usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf (起動)
    #/usr/local/nginx/sbin/nginx –s quit (停止)
    停止時にはquitとstopの2つがあるとのこと。
    どう違うのかしら…と思ったら、同じようなことを質問されていた方がいたので、読んでみる。
    gracefulに停止するか、ブチッと止まるかの違いだそうで、ここはApacheのオプションを思えば納得いたしました。基本はquitで行きましょう。

    2011-09-09

    ログイン後のリダイレクト調整をする

    デフォルトのWordPressは、ログアウトすると再びログインフォームに戻ってしまいます。1アクションではありますが、トップページ(記事)に戻るには、ひと手間がかかります。

    特に、認証が必要ない場合はHTTP、管理画面やログインユーザはHTTPSに切り替えるという設定をしているので、ログアウト後はHTTPS –> HTTPのURLに戻って欲しいと考えました。

    WordPress、ログアウト、リダイレクトというキーワードで検索すると、こちらの記事がヒット。

    どうやらPHPのファイルに指定されている redirect_to の先を好きなURLに書き換えてあげれば良さそうとのこと。
    対象のファイルは、wp-login.phpです。

    URLを直書きしても良かったのですが、このWordPressはお引越しの可能性もあるので、サイトとして設定されているURLを指定するように変更。

    //$redirect_to = !empty( $_REQUEST['redirect_to'] ) ?
    //     $_REQUEST['redirect_to'] : 'wp-login.php?loggedout=true';

    $redirect_to = site_url('', 'http');
    wp_safe_redirect( $redirect_to );

    サイトURLって、なにか定数か関数になってないかなあと思ったら、確かに、http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/site_url (テンプレートタグ)にそのものがありました。

    この関数の引数には、サイトのルート下のパスと、Schemaと言ってHTTPのプロトコルを指定すれば良いらしく、上記の修正箇所では、 site_url('', 'http'); と書かれている部分が該当します。

    おかげ様で、これでひと手間省けるようになりました。

    WordPress始めました。

    Ploneの評価、特性を知るために、部署内での日々の記録としてのBlogはPloneのCOREBlog2でずーっと書いていました。(その前は、.NET Blog)

    だいたい5年くらい続いていたのですが、Ploneの参照するユーザや掲載するコンテンツが業務寄りになってきたため、個人Blogはちょっと邪魔?な存在に…。
    また、Ploneバージョンアップ(4以後)はどうもサポートされていないし、自分でもメンテナンスはとても無理。存続そのものが心配になってきました。

    でも、情報共有にBlogはいいなあと思っていたので、個人BlogはWordPressを立てて、そちらに記載してもらおうかと考えました。

    WordPressにした理由は、もちろんBloggerなどでも採用していることと、APIが使えるのでWindows Live Writerのようなデスクトップクライアントで、オフラインでも記載ができるからでした。

    Ploneとは違い、大きなコミュニティもあるし、Microsoftもサポートしているので、インストールはそんなに難しくないかも..と思っていたのですが、やはり素のWordPressにはカスタマイズは必要なんですね…。

    #大手サービスの環境は、それなりに色々便利な機能を最初から搭載してくれているので、違和感なく使えるんだなあと再認識しました。ありがとうございます (_ _)

    そんなこんなで、ちょこちょこ(備忘録的な)WordPressに関するPOSTが出てくるかと思います。


    各CMSの得手不得手を認識し、うまく連携できるようになったらいいな…。

    2011-08-10

    gitの設定メモ

    今日のトラブル
    設定しとかないと恥ずかしいことになるので、まずはじめにやりましょう。 (git config)
    Gitをインストールしたら、とにかくgit configで設定は済ませてしまうこと。そうでないとコミットした時のAuthor名とかメールアドレスが、OSの設定そのままが見えてしまいます。
    実は、最初にGitHubにプッシュした際に、設定を変えていなくて、使っていた環境のそのままの名前がログに出てしまい大慌てでした。
    まずやることは、下記の通り。

    # git config --global user.name "使いたい名前"
    # git config --global.email "使いたいメールアドレス"

    リポジトリごとに切り替えることはできますが、まずはデフォルトで適用される設定を変えておくこと。
    こちらの設定は、~/.gitconfig に記載されます。

    つぎはGitHubが例ですが、デフォルトの公開鍵・秘密鍵とは別のキーで、リポジトリにアクセスしたい場合の設定です。
    こちらは、.ssh/config を設定します。
    github用の場合は、下記のとおり。変更する箇所は、秘密鍵の名前のところだけです。
    Host github.com
      User git
      Port 22
      Hostname github.com
      IdentityFile ~/.ssh/id_dsa_github ♯わたしの場合はここを変えた
      TCPKeepAlive yes
      IdentitiesOnly yes
    これで、あとはSSHコマンドで、下記のような感じで取ってくることができます。

    ♯ git clone git@github.com:xxxxx/xxxxxxxx.git

    まだ全然使いこなせていませんが、公開してもいいモノは、ぜんぜん役に立たないけれど置いてみようと思っています。

    2011-08-08

    Redmine trunk稼働以前


    今日のトラブル: 動作環境はきちんと確認しましょう。

    ひさしぶりに思い立って、綺麗な環境にRedmineを入れてみることにしました。(使っているRedmineのバージョンアップを放置していたので、まずは検証用に…という考えから)


    Redmineのいろいろ(?)の後、bitbucketがリポジトリになっているということだったので、無謀にも、trunkで試してみることにしました。
    今回お世話になったサイトは、下記の通り。公式サイトから個人の皆さんのBlogまで色々ですが、本当にありがとうございました
    * * *


    さて、まずはMercurialの環境を用意しないといけないのですが、こちらはPythonのeasy_installを利用できたので、とても助かりました。詰まった点は、上記のkuroyagi32mailさまのエントリで助けていただきました。
    MySQL等も、Redmine.jp を参考に、確認しつつインストールです。
    #ちなみに、mysql_secure_installation というコマンドがあるのを初めて知りました…。
    Redmine.jp では、trunkの要件に Rails 2.3.5 と書かれていたので、Rails2.3.5で進めてみます。
    hg cloneでソースを取るのは問題なく出来たので、まずdatabase.ymlを調整。
    次に、session_store.rb を設定しようとしたところ…。
    $ rake config/initializers/session_store.rb
    Missing the i18n 0.4.2 gem. Please `gem install -v=0.4.2 i18n`
    と言われて、怒られてしまいました。
    こちらはメッセージに従って、install。
    $ sudo gem install -v=0.4.2 i18n
    じゃあ、今度は…と思ったら、またもエラー。
    $ rake config/initializers/session_store.rb
    Missing the Rails 2.3.11 gem. Please `gem install -v=2.3.11 rails`, update your RAILS_GEM_VERSI
    ON setting in config/environment.rb for the Rails version you do have installed, or comment out
    RAILS_GEM_VERSION to use the latest version installed.

    Rails2.3.11じゃないとダメなよう。物事はどんどん変わっているんですね…。仰せのとおりに、こちらもインストールします。
    $ sudo gem install -v=2.3.11 rails
    $ gem -v
    1.8.7
    $ rails -v
    Rails 2.3.11
    これでどうですか、と思ったら、まだ来ましたよ、エラーが!

    $ rake config/initializers/session_store.rb
    rake/rdoctask is deprecated.  Use rdoc/task instead (in RDoc 2.4.2+)
    WARNING: 'task :t, arg, :needs => [deps]' is deprecated.  Please use 'task :t, [args] => [deps]
    ' instead.
        at /var/service/redmine/lib/tasks/email.rake:170
    googleさんにお世話になると、こちらのissueに該当するようで、rakeは0.9.2じゃなくて0.8.7使ってね、とのこと。
    確認してみると、やっぱり0.9.2なので、一度抜いてから0.8.7のものを入れ直しました。
    $ rake -V
    rake, version 0.9.2

    $ gem uninstall rake
    $ gem install rake -v=0.8.7
    $ sudo rake config/initializers/session_store.rb
    (in /var/service/redmine)
    実は設定とか動作確認はまだまだですが、ここまでで一休みすることにしました…。


    気を取り直して、再開。まずはDBのmigrationですが...。

    $ rake db:migrate RAILS_ENV=production
    (in /var/service/redmine)
    rake aborted!
    undefined method `name' for "actionmailer":String
    (See full trace by running task with --trace)
    なんとまあ、またもやエラー!

    Redmine.orgのこのチケットに似ているのですが、どうやらまだ皆さん困っている模様。
    gemの1.7以上だとだめなんだそうで、なんでも新しければ良いわけじゃないんですね。
    これまたrubygemのバージョンを1.6.2に下げました。


    何をするにも、多分皆さんの2倍、3倍はかかるんだろうなあ…、その間にももうどんどん物事は進んでるんだろうなあ、と、寄る年波を感じています。
    おそらく次にやろうと思っても、またハマると思われるので、自分のためにメモとさせていただきます。


    こんなわたしでも、Redmineのファンです :)



    2011-08-03

    PloneのZEOクラスタやってみた

    Ploneに関わってから、ずーっとスタンドアロンで動かしていたんですが、とうとうユーザさんの業務にもストレスが出てしまう状況になってしまい、なんとか対応を検討。

    英語ならいっぱい情報はあるのかもしれませんが、勉強会などで情報交換をすることも難しく、なんだか手さぐり状態でZEOクラスタ化に取りかかりました。
    (やっぱり実際に動かしてみないと仕組みが理解できない人間です...)

    それでも、MLやtweet、チャットなどでご助言下さった皆様、ありがとうございます!

    ちなみに、クラスタ化するには、それなりにサーバのスペックを上げないといけません。実は、意外とネックだったのが、『ただのCMSにそんなにリソース要るの??』という認識を変えてもらわないといけなかったことでした(^^;
    この点は、少しずつPloneの利用を進めて行き、「みんな使うようになったし、遅いとこまるでしょ~」みたいな戦略?で、インフラチームからのリソース捻出を図って行きました…。
    ZEO化するにあたっては、こちら (単一インスタンスを ZEO クラスターに変更する )を参考にさせていただきました。


    もっと最適な方法もあるのかと思いますが、現在こんな状況、という図を載せてみます。

    * * *



    シングル構成でいろいろプロダクトを追加している状態だったことと、blobstorage化していたこ
    ともあり、ZEO化用の設定方法がうまくできずに四苦八苦...。

    やっとZEO化できたにしても、ユーザは1つのURLをめがけてリクエストを投げてくるので、どうやって処理を分担すればいいのか全くわかりません...。

    ハードウェアは全く専門外なのでハードウェアバランサはNG。(調達能力ももちろん無し)

    URLを別々にするのはユーザに負担を強いるし絶対無理。

    どうしようと悩んでいたら、Apache2.x系はソフトウェアバランサの機能が使えることが分かりました。
    mod_proxy_balancer, Ploneをキーワードにしていくと、数件MLなどで例が出ていたので、ヘッダ等を調整して、なんとかなんちゃってZEOクラスタ化の環境が出来上がりました。

    * * *

    さて、パフォーマンスの件ですが、CPU数を追加し、それに見合ったプロセスを立ち上げることで、『劇的!』ではないのですが、リクエストを分散できる分、ユーザさんを待たせる状況は減った模様です。

    ただし、プロセスを複数立ち上げるので、それなりにメモリも必要になってきます。

    さらに、前のエントリに書いたように、いつのまにかメモリの使用量が増加してしまい、放っておいたらメモリ使い切ってしまう、という状況になりました。

    こちらは原因と理由に納得したため、運用でカバーする方針としました。
    また、おかげ様で、クラスタ化の効果が見えたことで、少しメモリも追加していただきました。

    * * *

    課題はいろいろあって、「ほんとにそもそもこんな感じの構成って良いのかしら?」ということが一番です。こちらは、皆さんにご指摘、ご意見いただければ幸いです。
    (こんなへなちょこじゃダメ!というのでも)

    また、ZOPE間のメモリレプリケーションはできないと認識しているので、キャッシュを有効にできるようにStickySessionを利用していますが、このへんもちょっと怪しいです。

    たまたま重い処理の多いユーザが同居するインスタンスに接続した人は、損をしてしまいそうな気がして、微妙なところです。

    個人的には、スケールアウトの方法が分かったのと、メンテナンス作業をしやすくなったのが幸いかな、と思っています。

    まだこちらはPlone3.3.5の環境なので、Plone4もできれば試してみたいと思っています。




    2011-08-02

    メモリ確認用ワンライナー

    メモリやりくりに関連して。
    OSの実メモリがどれだけ使われているかをチェックするワンライナーのShell script。
    * * *
    プロセスに対して仮想メモリとして確保されたサイズのトータルと、プロセスに対して実際に消費されている物理メモリのトータル。(長!)気にするならRSS。
    # ps aux | awk 'NR > 1 {vsz += $5; rss += $6} END {printf("VSZ total:%10f GB\nRSS total:%10f GB\n", vsz/1048576, rss/1048576)}'
    VSZ total:  4.667442 GB
    RSS total:  1.714958 GB

    こっちは、メモリの使用率(%) が高いプロセス順に表示するもの。
    # ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr | less





    free -m, free -m -t でもチェックできます。
    • Mem:のfree が少ない!と言っても慌てない。
    • -/+ buffers/cache の free が少なくなっちゃったら要注意。



    また、 cat /proc/meminfo でもチェックできます。

    2011-07-31

    Plone & Zope / メモリ関連のメモ

    PloneをZEO化して少し幸せになったのもつかの間…。

    プロセス起動直後は問題ないとして、時間がたつとプロセスが利用するメモリがどんどん増えていきます。よくよく考えると、このような状態の模様。

    • Ploneの使うZODBはトランザクションログも同じファイルに書き出すため、放っておくとどんどん大きくなる。
    • ZODBが大きくなると、その分プロセスに使われるメモリも増えてくる。(実メモリで、ZODBのファイルサイズ分くらい使う)
    • ZODBはパックすればサイズは小さくなるが、プロセスは再起動しないとメモリを解放してくれないっぽい。
      本来はGCがきちんと働いてメモリが解放されるはずですが、その通りにはいかないようです。(後述)
    • キャッシュを利かせる調整をしているため、ユーザのアクションが増えるにしたがってキャッシュに使われる分だけプロセスの消費するメモリも増える。

    メモリを解放するには、どうやらプロセスを再起動というのが素直な方法の模様。(まあ、APサーバとしては良くある話のようです)

    ただ、DBのパックは毎日行ったほうが良い、という他には、あまり情報を見たことが無かったので、”Zope, process, restart” なキーワードで検索をしてみました。

    すると、案の定 plone.org にそれらしきエントリが…(^^;

    ざっと読んだ限り、冒頭の説明はこんな感じ。

    * * *

    Zopeを定期的に再起動させる必要はないが、サイトのサイズや動作によっては、再起動がベストプラクティスとなることも考慮すべき。

    なぜなら、ZopeはPythonのプロセスとして動いているので、状況によってはホストシステムの利用可能なメモリを使い切ってしまう可能性もある。

    これはPythonのバグではなく、Pythonのコードのせいというわけでもない。Pythonがreference-countingなガベージコレクションの構造を持っている点が大きい。

    本来は参照されなくなった、削除されたオブジェクトはGCの対象になって、メモリの増加も抑えられるはず。しかし、状況によっては、オブジェクトが利用されているかどうかを判断できないことがある。また、相互参照しているオブジェクトが多ければ、どうやって適切な順番でオブジェクトを削除していいか判断が付かないということが起こり得る。

    こうなると、オブジェクトの破棄が行われず、占有されてしまったメモリが解放できないので、プロセスを停止してPythonのメモリをいっさいがっさいクリーンアップさせるしかない。

    (こういう動作を妙に思うのであれば、Pythonの__del__ method, か、gc module のドキュメントを読むべし)

    結果的に、長期間稼働しているZopeのプロセスは、実際のアクティビティに必要としている以上の、非常に大きなメモリを占有してしまうことがある。そして、メモリを解放するためには、プロセスを再起動させるしかない。

    * * *

    …とまあ、やはりOSの状況を確認しながら、再起動は必要になってくるようです。

    あとは再起動の方法、その他考慮すべきことが書かれています。

    幸い、ZEOでクラスタ化したので、うまく負荷分散させながら順番にプロセスを再起動していけば、サービス停止を最小限に抑えられそうです。確かにこの点で、切り替えて良かった…と思います。

    なお、ZEOクライアント(Zopeのプロセス)だけを再起動すればよく、ZEO Server(DB側) はメモリを占有することはあまりないそう。

    ただし、大きく膨れてしまったZODBを pack する際には、非常に大きなメモリを必要とするらしいので、定期メンテナンスを行う時はZEO Serverのプロセスの状況も鑑みて、再起動を検討するほうがよさそう、とのこと。

    この辺は、こまめにpackすれば大丈夫なのかもしれませんが、結局は良くOSの状況、パフォーマンスを監視し、自分の判断で再起動を実施するのばベストのようです…。

    将来のバージョンでは、再起動も減らせるだろうと述べられていますが、Ploneのバージョン4までは、やはりPython2.4ベースなので、このエントリに従った方がよさそうです。

    やっぱり、運用しないと判らないことってあるんですね。プログラムの知識とか本当に何ともし難いのですが、このへんの体験談が、何かのお役に立てれば幸いです…。

    2011-07-29

    東京電力電力供給状況API と QlikViewでチャートを表示

    日本だと、まだ QlikView の話題が少ないなあと思うこのごろ。

    Personal Editionは無償という状況ですが、やはりライセンスを持っていないと、他人とデータ・レポートがやりとりできないのは厳しいのかもしれません。

    いろいろグラフ用のオブジェクトがあるのにちょっと勿体ないなあ~と考えていたので、周りにUIの紹介をするために、簡単なサンプルを作ってみました。

    今回試したのは、東京電力電力供給状況API からデータを取得し、メータ表示するというものです。

    APIはいろんな方が創られているんですが、QlikViewが解析できるフォーマットは、CSVかXML。JSONはまだQlikView自体では解析できません。

    そこで、読み込むタイミングの最新のデータはAppspotのAPIのうちCSVで提供されているデータを使い、1時間あたりの使用率はYahoo!のAPI(2番目)のものを利用させていただくことにしました。

    1. http://tepco-usage-api.appspot.com/
    2. http://developer.yahoo.co.jp/webapi/shinsai/setsuden/v1/latestpowerusage.html

     

    tepco-usage-qlikview

    tepco-usage-qlikview

    作った画面はこんな感じ。

    ブラウザで表示できるんですが、やっぱり画面リロードしたらデータが更新される、もしくは定期的に更新してくれるという代物ではないのがちょっとさびしい(^^;

    それでも、UI中心のプログラマじゃなくても、こういったタイプのグラフを使ってデータを割とすぐに表示できるのはQlikViewのいいところですね。

    * * *

    ちなみに、データはコマンドラインで定期的に更新(リロード)処理をかけています。

    QlikViewはサーバがあればサーバのスケジューラを利用できますが、私はクライアントで閉じたかったので、Jenkinsを利用してバッチジョブ化しております。

    過去のデータを蓄積したり、気温と連動して表示していけば、何曜日の何時が使用量が高い、とかが見えてきて面白いのですが、まだそこまでは作り込めていません。

    JSONのフォーマットも解析できるようになってくれるといいんだけどなあ。

    参考までに、ロードスクリプトはこんな感じです。

    ※YahooのAPIには開発者用のIDが入ります。

    -- 1時間あたりの平均はYahoo APIから

    ElectricPowerUsage:
    LOAD
        Area,
        Usage,
        Capacity,
        Date,
        YEAR(Date) AS target_year,
        MONTH(Date) AS target_month,
        DAY(Date) AS target_day,   
        Hour,
        [Capacity/unit],
        [Usage/unit]
    FROM [
    http://setsuden.yahooapis.jp/v1/Setsuden/latestPowerUsage?xxxxxxxxxxx (XmlSimple, Table is [ElectricPowerUsage]);

    -- 読み込み時の最新は、tepco-usage-api.appspot.com のCSVデータから

    CurrentData:   
    LOAD @1 as CurrentTime,
         @2 as CurrentUsage,
         @3 as CurrentCapacity
    FROM
    [
    http://tepco-usage-api.appspot.com/quick.txt]
    (txt, codepage is 932, no labels, delimiter is ',', msq);

    2011-07-24

    Cacooのステンシル使ってみました。

    お仕事でFlash(Flex)アプリをちょっとやっていたので、そもそもFlashベースらしいCacooには親しみを感じていたんですが、いつの間にか、Cacoo大好き人間になってしまいました :)

    そうして、今回は初めてのCacooの話題になります。

    * * *

    先日、ステンシル機能がリリースされたということで、さっそく試してみることにしました。(使う当てはないのですが…)

    何にしようかな~と思って、最初に登録したのは、アイコン替わりにしている、うさぎの絵です。

    Cacooのステンシルの中には、人物やフェイスマークなど、グラデーションが綺麗で可愛いものも多いので、わたしもそれに近いものが登録できるといいな…と思った次第。

    イラストレータで作成し、SVGに変換し、登録!とまでは割とスムーズに進んだのですが、Cacoo上に上げてみると、色味が変わったり、透明度指定していたものが無効になっていたり、グラデーションが消えてしまった部分がありました。

    この件については、Cacooの方が教えて下さり、のちほどCacooのBlogでも作成時の注意が書かれていたので、納得。ありがとうございます。

    それでも、やっぱり『自分で書いたものを取り込めるなんて、凄い~!』と思うばかりでした。

    redbull

    さて、うさぎに続いて、何がいいかしら…と思って、取り上げた素材がRed Bull…(^^;

    どうもIT系の皆さんに人気のようらしく、最寄りのコンビニでもドリンク剤コーナーに並んでいたのを思い出し、さっそく描いてみることに。

    ただ、わたしはイラストレーターはあまり使いこなせていないので、どうやったら空き缶や円筒形のものが描けるか、まったく見当が付きません。(実は、普段はFlashの鉛筆ツールで描いて、イラストレーター形式に変換するという方法を取っているのでした)

    「イラストレーター、缶」というキーワードで検索してみると、有難いことに、3Dのフィルタを使うという技を発見!

    半信半疑でやってみると、ホントに缶らしくなるではありませんか!

    そして、調子に乗ってラベルも書き起こしてみると、やはりうまく3D風の缶に貼り付けが出来た!

     

    harituke

     

    「これはイケる~!」と大喜びでSVGに変換し、Cacooに取り込んでみると……。

    ……『重い』のです。

    よーくデータを見てみると、3Dの陰影と曲線を描くために、線のデータがびっしり詰まっているんですね。お手軽にしかも綺麗に出来た、と思ったけれど、ステンシルとしては使え無さそう…。

    パスの単純化をすれば軽くなるかな、と思いましたが、それでもあまり変わりません。(良い方法があればどうか教えてくださいませ)

    結局、楕円と長方形を組み合わせて円柱を描き、グラデーションを付けてそれっぽくする、という方法にしました。

    * * *

    わたしの描いたものはあまり綺麗ではないし、大人気のRedBullのことですから、おそらくどなたかが今後ステンシル化してくれるのではないでしょうか(^^;

    それにしても、久しぶりにBlogを書いてみる気になったのですから、Cacooって凄い!

    もっと上手に使えるように、がんばります~。

     

     

    2011-07-19

    Jenkinsのポート33848を確認してみる

    JenkinsのRemote Access APIを利用しようと思い、JenkinsのWikiを見直したところ、内容がだいぶ更新されていました。
    APIのサポート情報にPythonが追加されていたり、パラメータ付きジョブの実行の説明が追加されていました。


    * * *


    勉強がてら、日本語版の方のWikiを修正させていただいたのですが、JenkinsがUDPポート33848でリッスンしているという説明があったので、せっかくなので確認してみることにしました。

    さて、相手はTCPではなくUDPなので、telnetは使えなさそう…。(もしオプション指定で使えるなら、どなたか教えて下さい!)

    ちょっと検索したところ、hping というコマンドが使える模様。
    わたしの環境はCentOS(実は、RPMを利用したところちょっと難があった…)なので、yum installでひとまず追加。
    オプションが色々あるのですが、こんな指定をしたところ、なるほどJenkinsからのレスポンスが確認できました。
    # hping localhost -2 -J -p 33848
    HPING localhost (lo 127.0.0.1): udp mode set, 28 headers + 0 data bytes
    len=196 ip=127.0.0.1 ttl=64 DF id=0 seq=0 rtt=408.2 ms

    ……………
    ICMP Port Unreachable from ip=127.0.0.1 name=xxx.xxx.xxx
                    E.......@...................E...
                    ..@.@.<'.........8.;....<hudson>
                    <version>1.418</version><url>htt
                    p://xxx.xxx.xxx/</u
                    rl><server-id>4bcf5847fc6bbbf4b5
                    43095658affb98</server-id><slave
                    -port>9999</slave-port></hudson>
    認証に関しても、若干記述が追加されています。英語のコメントもたくさんついていたり、PythonのサンプルコードもPOSTされていました。
    API経由での利用はまだ行っていないのですが、日本語版への反映も含めて、いろいろ試してみようと思っています。

    2011-05-11

    DevLove / 縦サミット参加レポート (3) - 鈴木さん / 和田さん編

    DevLov / 縦サミットに関するPOSTの中で、アップしていたと思っていたものの、ずっと下書きのままだったのが、鈴木さんと和田さんのレポート…!
    今ごろですが、自分の感じたものとして、Blogにアップさせていただきます。

    2. なぜソフトウェアアーキテクトが必要なのか - 鈴木さん (@yusuke_arclampさん)

    2番目は、『ソフトウェアアーキテクトが知るべき97のこと』の監修もされている、鈴木さんのお話しです。

    tatesami-2

    社内で小さな読書会をしていたので、『サインをお願いしよう!』と思っていたのですが、あいにく本を忘れてしまいました...。しかも、お願いする時に、『ピンクの...』と言ってしまいました (>_<)

    アーキテクトの方は、緑なんですよね....orz 
    失礼してしまい、申し訳ありませんでした。(そうこうしながらも、鈴木さんからはサインいただいています) 

    とても穏やかで、静かな口調でのお話しでスタートしました。そういえば、4名の講演者の中で、鈴木さんだけがスーツでした(^^

    私には高度な内容が多く、メモをかろうじてとったところと、スライドを確認しながら書き起こしてみますので、品質の件はどうかご容赦下さいませ (_ _)

    アーキテクチャってなに?:

      • 『構造』のことではない。(Not Structure)
      • システムにはミッションがある。
      • システムにかかわるすべての人々のビュー(関心事)の整合性を取ったものを作ること。
        • システムのミッションに従いながら、
        • 制約を考えつつ
        • 複数のステークホルダーの関心事を整合させ
        • ライフサイクルまで考えたシステムの分け方と組み合わせ方のこと。

    3. プログラマが知るべき、だったひとつの大事なことがら - 和田さん (@t_wadaさん)

    和田さんのセッションも、デブサミ当日、みなさんの呟きを眺めながら『ああ、聞いてみたかった~』と思っていた1つでした。

    上記の鈴木さんの監修された本も、いわば『きのこ本』なのですが、最初にわたしが『きのこ本』として認識したのは、こちらの『プログラマが知るべき97のこと』。

    プログラマなきのこ本には、ロゴがありますが、これは北海道のデザイナーさんにお願いして描いてもらったそうです。

    tatesami-3

    まずは、デブサミの講演者として、何を話したらいいのか....という葛藤からスタートです。

    『プログラマが知るべき97のこと』は、各自の想いや立場の上で書かれたものなので、お題としては取り上げにくい。悩んだ末、デブサミの先人スピーカーの方々のお話しを参考にし、

      • 自分』の話をしよう。
      • 会場じゃないと聞けないことを話そう。

    という結果に至ったそうです。このことが、和田さんのお話に、『自らの物語』としての魂を吹き込んだことになったんだなあ....と思っています。

    実は、TwitterのTLから、和田さんにとって大きな転機になる、衝撃的なことが起きたということは知っていたのですが、改めてご本人からそのお話しを聞いたとき、ずしりと心にのしかかりました...。

    大事なこと:

      • 量は質に転化します。
      • 写経しましょう。
      • 自分が渦に入り、そして渦を作っていきましょう。
      • 学び、受け継いだものを伝えることが大切です。次は、あなたの番です。
    最後は、お話しを伺っている私たちが、『渦を作る人間になってほしいです』、との言葉でした。

     

    感想:

    技術的なノウハウ、Tipsの講演ではなく、和田さん自身の『体験』を伺った、という印象があります。

    和田さんの『原体験』である、『やってみせること』は、体験・経験を伝える直接的な手段です。ただし、どんなに人に勧められても、実際に自分が手を動かして、やってみないと判らない楽しさもあります。

    どんなに熱く語っても、興味をそそられない相手もいます。ただ、この会場に集まっている方は、みんな志を同じくし、すくなくとも、自分から『渦』に引き寄せられた皆さんばかりだと思います。すでにそこに縁のようなものを感じますし、きっと、それぞれ皆さん自身の渦を作っていけるんじゃないかな.....と、私も思いました。
    #自分はどうだろう?動けないしなあ.....と少し悩みましたが、こうやって記録することもちょっとは役に立つのかしら、と思って書いてみました。

    質問タイム:

    Q. 一番納得いかない「きのこは」?

    A. コードのコメントについて、16と17という。相対した記述がある。和田さんご本人としては、17の立場だとのこと。

    AttributeError: 'module' object has no attribute 'TestCase'

    本日のトラブル - AttributeError: 'module' object has no attribute 'TestCase'
    縦サミの@t_wadaさんのお話しを聞いて、『せめてこれからはテストを書く習慣をつけたいなあ~』と考えました。
    #テスト書いてないというのはわたしだけで、同僚や職場の方がそうだということはありません、念のため....。


    さて、ちょうどジョブとして仕込む予定の簡単なプログラムを、Pythonで書くつもりだったので、ここからテストの練習をしようと思いました。


    http://www.python.jp/doc/2.5/lib/module-unittest.html のあたりの記事を参考に、まずはコードをCopy&Pasteして(下記の通りサンプルそのまんま)、unittestの動作を確認することにしましたが...。



    import random
    import unittest
    
    class TestSequenceFunctions(unittest.TestCase):
        
        def setUp(self):
            self.seq = range(10)
    
        def testshuffle(self):
            # make sure the shuffled sequence does not lose any elements
            random.shuffle(self.seq)
            self.seq.sort()
            self.assertEqual(self.seq, range(10))
    
        def testchoice(self):
            element = random.choice(self.seq)
            self.assert_(element in self.seq)
    
        def testsample(self):
            self.assertRaises(ValueError, random.sample, self.seq, 20)
            for element in random.sample(self.seq, 5):
                self.assert_(element in self.seq)
    
    if __name__ == '__main__':
        unittest.main()
    
    
    実行してみると、こんなエラーが!
    
    
    AttributeError: 'module' object has no attribute 'TestCase'
    
    
    ええ~?と思って、pythonを対話モードで起動して、 "import unittest" とタイプしたとたんに、同様のメッセージが。
    
    
    
    
    『なんじゃこりゃー』状態だったのですが、もしかしたらmoduleが無いんじゃないかと、% locate unittest.py とすると、Pythonのライブラリにはちゃんとファイルがあります。
    
    
    ....悩むこと5分。
    
    
    
    
    『もしかして?』と思って、サンプルコードのファイル名を確認したところ、"unittest.py" になっていました。
    
    
    早速、ファイル名を変更して、python test.py としたところ...。
    
    
    # python test.py
    ...----------------------------------------------------------------------Ran 3 tests in 0.001s OK
    
    
    とまあ、めでたしめでたしではありますが.....。
    
    
    こんなことで大丈夫でしょうかね。何事もやってみるものですが、『OK』の文字1つ出てくれただけでも、本当に有難かったです(^^;
    

    2011-05-10

    DevLove / 縦サミット参加レポート (2) - よしおかさん編


    つづきまして、縦サミットのレポート、今回はよしおかさんの分です。長めになってしまっているので、どうかご容赦下さいませ。


    ※スタイルとして、お話しを伺っている時に書きとめたメモ、簡単なスケッチを載せていますが、不都合な点、配慮が足りない点は、どうかご指摘いただければ幸いです。

    4. ハッカー中心の企業文化を日本に根付かせる - よしおかさん (@hyoshiokさん)

    よしおかさんの講演資料は、デブサミの後に拝見し、社内のOSS-CONTACTのMLにご紹介させていただきました。
    というのも、社内で勉強会を開催すること、また、社内で社外の勉強会を開くことの意義やメリット、デメリットについて触れられていて、きっと共感したり役に立てていただけるんじゃないかと思ったからです。テクニカルな内容よりは、むしろどんな業種、立場にも役に立てることのできるノウハウが詰まっていました。
    ですので、ご本人の講演を生で伺うことができた、とても有難~い機会でした。

    はじめに:


    本題に入る前に、『質問』することの心構えや大切さについて触れて下さいました。
      • 質問のコツは、講演の内容を聞かないうちに考えておくこと。
      • 特に海外のセッションや英語など日本語じゃないセッションでは、あらかじめ質問内容とどう話すかを考えておかないと、余裕が無くなってしまう。
      • また、講演内容を聞いていくうちに、本当に質問したかったことがぶれてしまう。(だからできるだけ事前に決めておくことが大事)
    自分が素晴らしいと思っている物事を紹介する。それをどう実現するか、みんなで考えるきっかけを作る。
    今日できることを考える。スキルと知識の差は何かと言ったら、『出来るようになること』がスキルである。『質問する』ことも、訓練をしていきましょう。
      

    よしおかさんのお顔を拝見し、お話しを伺うこと自体初めてのことでしたが、飄々として、魅力的なお話しぶりをされる方だな、という印象を受けました。(おかげ様で楽しくメモも取らせていただきました)
    個人的に、蚊やり豚がなんとも可愛らしいと感じています...。
    企業の組織文化を記述することについて:
      • 企業文化は、本来、『中の人』でないと知りようがないもの。(人の異動や、転職などにより、ゆるやかに口承などで伝えられることはあるが....)
      • 企業文化を記述することで、その企業の『何が良いのか』が分かってくる。
      • 民族誌を例にとるならば、『その文化では、当たり前として受け止め、行われていること』を記述する。
      • 例えば、ある会社では『勉強会は当たり前のこと』と考えられている場合、それはなぜなのか?
      • 理由を明確に伝えないと、異文化(異なる組織)には、そのメリットやデメリットが伝わらない。
    ...と、このあたりまでお話しされたところで、『ストップウォッチ押すの忘れてた...』という、1コマがありました。


    #組織文化を改めて記述してみる、というのは面白いなあと思いました。地理学科という、フィールドワーク中心の学科出身なので、なんかこのあたりは嬉しくなってしまいます。
    引き続き、セッション内容です。 スライド&中継の資料のほうが確実ではありますが、メモしている分を書き起こします。
    DECのスタイルの紹介:
      • ミッドナイトプロジェクト(Googleで言う20%ルール)が、むしろ『推奨』されていた。
      • 社内コンピュータのネットワークですべて繋がっていた。(ただし、スタンドアロンでは使わず、分散してるけど繋がっている)
      • VAX Notesという、社内の巨大掲示板があった。
      • ありとあらゆる情報が共有されていた。(開発日誌でも、なんでもかんでも!)
      • 世界中の、見たことも会ったこともないDECのエンジニアの日誌を読んだりできた。そして、実際に会えたりすると、ものすごく感動!(あの人だ~!)

    実は、ここまでの話で、『ああ、質問したいなあ~』という内容が出てきました。結局できなかったのですが(;_;)

    というのも、『統制』というキーワードで、『情報統制』のことを思い浮かべて、こういったオープンな巨大掲示板でいろんな情報が交わされるのだとすると、お客様の情報とか、一般社員が知っていてはいけない情報なんかも紛れる可能性があるかと思ったからです。そこを参照したり、書き込んだりするために、なんらかの認証やコントロールはあったのか....と。で、80年代はオープンだったとして、その後はどうなっていったんだろう...と。

    ただ、よしおかさんの語られた意味の『統制』は、そうした情報統制のことではなく、文化や価値観を共有しあうことで、企業としての一体感を生み出すという意味での統制ということかなと思っています。(あってるかな?)

    ハッカーって?:
      • 何かをやった人。(世の中を変えちゃった人)
      • よしおかさんの場合は、行動するエンジニアになりたかったとのこと。


    ハッカーの倫理:
      • 共通の価値観を持つ
      • コンピュータで社会を良くする
      • ラフなコンセンサスと動くコードを大事にする
      • 許可を求めるな、謝罪せよ

    ハッカー中心の文化を必要とする企業は?:
      • 良いソフトウェアを必要とするすべての企業!
      • 最高のプログラマを雇えばいい。(そう言っちゃうとみもふたもないけど)
      • 最高のプログラマは最高のプログラマのいるところで働きたがる。
      • 『こんなアプリが良いな』『こんなものが欲しいな』といくら言っても、案があっても、作れる人がいなかったら絵に描いたモチだよね


    なぜ必要なの?:
      • 社会善 (世の中を良くするためのものを作るんだよ、という大きな使命感。....ただしこれは偉い人向けの建前でもある :-P)
      • 企業の競争力 (そうしていかないと生き残れない)
      • ベストプラクティス (デスマーチ知らず。楽しんでやれるのって大事!)
      • + ハッカー中心の文化は気持ちいいから (よしおかさんの個人的な理由)


    どうやってハッカー中心の企業文化を作るか?(作るだけじゃなくて、伝承するか?):
      • 暗黙知の継承
      • 形式知の継承
      • 楽天という会社の中ですら、文化の衝突がある
      • 組織が大きくなると、タコツボ化してしまう
      • 部署を超えた、『クロス・ファンクション』は、言うほど簡単じゃない!

    ここまでで、『ううむ...』と思いつつ聞いておりました。私はスキルのあるエンジニアでも、偉い人でもなく、一平社員の身分なので、『お前に言われんでもわかっとる!』と突っ込まれると思いますが...。


    ちなみに、ここでよしおかさんの一言。


    『タコツボ』を英語で表現すると、『サイロ』がそれに該当するんだとのこと。ちょっと検索したら、こんなブログを見つけました。

    http://blogs.yahoo.co.jp/kenfsakai/38913019.html / 企業のサイロ化



    そこで社内勉強会!:
      • 志を共有するメンバーでドライブする。(上からの強制ではない。上からアサインされた、組織を超えたプロジェクトではない)
      • コミュニケーションは組織を活性化させるビタミン!

    ここでまた個人的な感想。コミュニケーションの活性化を狙って社内SNSとか、社内限定コミュも立ったりしていますが、今一つ盛り上がらなかったりするのは、大義名分の関係もあるかなあ....と思ってしまいます。『ビジネス上の自分のスキル、技術向上』という目的も見いだせる勉強会のほうが、より前向きですし、業務につながる分、精神的にも気持ちよく取り組めるかなと思っています。

    xxxクラブ的な、単純な交流目的のクラブでは、『そんなもん業務時間中にやるな!退社後とか週末にやれ!』的な後ろめたさも感じたりしてしまうかなあと思っています....。
    そういう意味で、勉強会というのは、いろんな面から見ても『好ましい』ですよね(^^
    勉強会の意義は、多くの方が肌身で感じられていると思うので、うんうんと聞くに留めています。

    さて、お話しは続きます。

    一番伺いたかったのは、『社外の勉強会を社内で開催すること』の意義でした。わたしの会社でも、そういう志を持っている方々が、定期的にではないですが、いろいろなイベントを開催することがあるからです。そういう活動の意義を再確認できたらな....という想いもありました。


    社外の勉強会を社内で開催すること:
      • 本当は、(自分の好きな/知りたい)勉強会をやりたいから引き受けるんだ。
      • でも、それだけでは組織の中は進まないので、メリット・デメリット(リスク・コスト)をきちんと説明することが重要。
      • メリット、デメリットがある。(メリットについてはあえてメモしません)
      • オープンイノベーションの時代。
      • 技術は会社のものではなく、社会のもの。
      • 会社の中での活動を通し、社会を良くするためのものを実現していこうという価値観。
      • デメリットと思われる点は?
        • 情報漏えい -> 会場以外は入らせないことで防ぐ。
        • 会場提供 -> 直接的な費用はほとんどかからない。(光熱費はかかるかな)
        • 時間外勤務 -> とは言っても、残業でも出勤扱いでもないのでコストはかからないはず。
      • 企業イメージの向上や社員のモチベーションアップ、人材の交流のメリットの方が大きい
      • 開催のメリット -> 開催のコスト (よしおかの勉強会第一の法則)

    勉強会継続のポイント:
      • 勉強会は極めて俗人的
      • 情熱と仲間が必要。(これはかなり痛感しています)
      • 暗黙知や価値観の共有が必要。
      • 維持、継続していくためには方法論や戦略が必要。(これも大事ですね~)
      • ガイドライン、戦略、ルールを形式知化することも大事。

    幸いにも、わたしの職場では、イベントをホストしてくださった先輩たちが、設備利用の際の管理部門・総務部門とのワークフロー、主催者側とのやりとりの流れといったノウハウをまとめておいて下さっているので、ゼロからのスタートよりは格段にやり易くなっています。
    よしおかさんのスライドも併せて、たくさん苦労されたんだろうな....と思いましたし、先人たちは、確かに社内のワークフローにも外にも通じている方になっています。(いまさらながら本当に感謝)



    わたしも開催のメリット > 開催のコストだと思っています。

    しかし、これも仲間がいないとできません(^^;


    子どもが小さいので、夜や週末にそんなに時間を取れないということもあり、『やりたいよね』、だけではできないんだということをひしひしと感じています...。


    そしてまた、いま、精力的に活動されている方々でも、そういった時間を取れなくなる時が来るかもしれません。(おおきなお世話か??)

    だからこそ、こういう想いを絶やさないように、文化の伝承や価値観の共有をし、あとに続いてくれる皆さんを増やし育てていかないといけないなあと感じました。
    そしておそらく、そこから生み出された良いものに、自分の子どもたちが振れて、感動してくれるなら、どんなに良いだろう...と。 (なんというか、母親モードの感想で申し訳ございません...)

    よしおかさんの Post 3.11


    よしおかさんも、新たにご自身の言葉で語っていらっしゃったので、メモを書きとめておきます。


    やはり、『仕事をするって、どういうことだろう?』という想いや、なかなか会社としても、世の中も動かないことへの絶望感も感じられた、と仰っていました。

    その上で、震災前に戻ることはできないから、その意味を良く考えよう、震災が組織を変える機会だと思って進んでいこう、と。

    被災地に行って何かできるわけじゃないけれど、電力削減は自分たちでできるはず、という想いで、Project60という取組をされているとのことでした。
    オフィスの小さな節電から、DCのオペレーションの方法を変えるということなど、やれることはたくさんある、なんでもやってみようと、と仰っていました。



    それこそ、ハッカー的な行動だよね、と。



    実は、その後、節電の取り組ででなにかできないかという話が部署で持ち上がったので、よしおかさんにうかがった内容も紹介させていただきました。
    小さいことから、個人の信条でそれは無理!というものまで、いろいろ議論や意見が出てきましたが、『できることから』という想いは皆さん持ってくださったようです。
    いわゆる、『ハック』なTipsも自然と提案がされてきました。


    こういう動きは、会社ではなく、『社会を良くするためのハック』だと思っています。


    よしおかさん。貴重なお話、本当にありがとうございました。

    DevLove / 縦サミット参加レポート (1)




    ずいぶん時間が経ってしまいましたが、4/23 縦サミットのセッションのレポートになります。ただ、聞き違いや勝手な思い込みの混ざったレポートであることは、どうかご了承ください (_ _)
    そういうものは排除して、ご自身の目で講演を確かめたいという方は、下記の動画をどうぞご覧ください。
    1つのBlogに4つ分まとめて書いてみようと思ったのですが、長くなることと、なかなかまとまらないことから、数回に分けてみます。(オープニングと嵩原さんのお話しを取り上げます)
    スタイルとして、お話しを伺っている時に書きとめたメモ、簡単なスケッチを載せていますが、不都合な点、配慮が足りない点は、どうかご指摘いただければ幸いです。

    はじめのごあいさつ: @papandaさんから

    最初のご挨拶は、@papandaさんです。
    "DevLove Urakata Team" (良い言い回しですね)  の立場として、今回のイベントについてのお話し、#4tateへの意気込みをお話し下さいました。プレゼンの画面には、『3q! 楽天さま、翔泳社さま』の感謝の言葉も。しみじみと有難い機会をいただいたんだ、と思いつつ聞いておりました。

    @papandaさんのお話しの中だったと思いますが、DevLove立ち上げの経緯が紹介されていました。
    きっかけは、つくばでのRubyKaigi の帰り道だそう。(そんなに昔ではないんですね)
    @papandaさんの同僚と、『なんかやりたいよね~』という会話がきっかけになり、そこに加え、
      • 楽しいだけじゃない!
      • 開発を前進して行られるような場を作りたい!
    という想いから立ち上がったそうです。
    そこからここまで...って、本当に凄いパワーですね。大切なきっかけを、会場の皆さんと共有できたことも、ちょっと幸せを感じました。
    DevLoveの皆さんのイベントでは、皆さんからの#4tateのメッセージを集めていて、5/28の東北ディベロッパーズイベントに届けて下さるそうです。今回も、『渾身会』の場で、メッセージ集めをされたとのこと。
    そうこうして、デブサミ史上最強の1時間となった、『4本の帆立』のセッションの再演が始まりました :)

    1. これからのRIAの話をしよう - 嵩原さん (@take3000さん)

    最初は、クラスメソッドの嵩原さんのお話しです。
    今はFlex開発から離れちゃっていますが、やっぱり、『Flex、RIAのアプリと言えばクラスメソッドさん!』がまず思い浮かびます。(過去のデブサミでも同社の方の講演実績がありますし、私もお話しを聞いて、方法を取り込んだことがあります)
    基本的には前回(2月のデブサミ)をベースにしてはいるものの、中身を少し変えている&2回目ということで、『SP1 』と銘打っての、220枚にも及ぶプレゼンの開始となりました。(凄い...)

    業務アプリの使い勝手について:
      • テクノロジーの進化、設計手法の進化によって、システム中心から人間中心の設計、デザインに変わってきた。(RIAもそう)
      • 人事給与システムやメールシステムといった、業務アプリケーションは、非コアコンピタンスの部分。(その会社の直接のサービスとなるものじゃない)
      • 使い勝手は気にしなくて良いよね、そこそこ使えて安く使えれば良いよね、という考え方。(ある種の妥協、諦め)
      • でも、ほんとうにコストが抑えられているのか?と言ったら、そうとは言えない。結局使いにくければ問い合わせがたくさん来るし、コストがかかってしまう!
    User Experience Design:
      • ユーザに対して有意義な体験優れた経験を与えるためのデザインを提供しよう。(ビジュアルなデザインじゃなくて、体験をデザインする)
      • 目指すものは、ある目的のために作りこまれたアプリケーションが、優しく快適に利用できるという点。(Ease & Pleasureのライン)
      • 『楽しい、面白い!』まで求めるのなら、それは別のアプリで...。(ゲームとか)
    大事なのは "Strategy" (戦略):
      • 『インタラクションデザインの教科書』からのUXの5Sのうち、大事なのはStrategy。(ユーザのニーズやサイトの目的、という部分)
      • ビジュアルデザインだけではない。
      • プロジェクトの終盤の方でデザイナをアサインするというのではダメ!
      • 早い段階から、User Experienceを意識した設計や開発を!
      • モデリングでは、ユーザの感情や使い勝手に踏み込んだ設計はできない!
    ユーザビリティの5つのルール:
        • アクセス: ツールの利用経験の無い人が、助力や指導無しに使えるものでないといけない。
          現実のフローに従った処理を想起させるようなつくりでないといけない。
        • 支援: ユーザの真の仕事をよりやさしく、単純に、速く、楽しく達成できることにより、さらに新しいことが出来るように支援するものでないといけない。
        • 何をシステムに反映させよう?
      UI設計の原則:
        • Exp. 再利用の原則: 同じことをさせるなら、同じダイアログを出すようにする、など。
        • ....でも、原則、ルールがたくさんあるし、どれからあてはめていけばいいんだろう?
        • 指針はシンプルに!
        • ウェブ戦略としてのUIであれば、ここ -> 効率を改善させる。より早く、正確に(間違わずに)!
        • 早く、間違わずに操作できることを目指そう。
      優秀なUIデザイナはどこ?:
          • 日本には少ない....。
          • 逆に、適正のある人を『育てていく』ほうがいいのではないか
        RIAの話:
          • Flash(Flex), Java, Silverlight -> ランタイムを配布する形で広める。
          • HTML5 -> ブラウザの標準化を進めることで展開を図る。 
          • Silverlightはブラウザ外でも動作する。.NETアプリがMac上で動かせるんだよ!
          • UIデザイナが、Blendを使ってSilverlightアプリを開発することも出来るよ!
        HTML5が出たらFlash要らなくなるの?:
          • HTML5で実現できている機能は、現状、Flash8くらいのレベル。(今Flash10)
          • 同じ機能を有するアプリケーションでも、HTML5に比べてFlashやSilverlightの方が早いものもある。
          • ユーザの要求は年々上がって行くもの。(スマートフォン、マルチデバイス対応...)
          • いったん便利さに慣れたユーザは、機能が劣ると満足しない。
          • HTML5は何でも動くと言っても、やはりJavaScript書かないといけないから、クロスブラウザの問題が残る。
          • HTML5の仕様が実際に実現できるまでに、ユーザ要求はもっと複雑化しているかもしれない
          • システムのライフサイクルを考えて、どんなRIAの技術を取り入れるかを考えることが必要。
        キネクトについて:
          • それって何になるの?
          • デバイスが触れない環境でも使える、という発想から何か考えられないか。
          • 例えば、外科手術中の執刀医が、『忙しくて、手がふさがっていて、パソコンなんか触ってられない!』という状況でも、動作をすることでTVやモニタ、CTを切り替えたりする...というのはどうだろう?
        TweetDeckの楽しさ:
          • AIRでできたTwitterアプリ。おもしろいよ。
          • いろんなサービスと連携して、成長してきている。
        アジャイル開発とUIについて:
          • クラスメソッド社の経験からのお話し(貴重!)
          • UI、UXは、コンセプトを変えるのが大変!
          • ただし、アジャイル開発でユーザへの提供がこまめに発生する分、UIに対する検証の機会も多いので、必然的にアジャイルっぽくなっていく。
        契約について:
          • IPAで、アジャイル型開発に適したモデル契約をまとめているので、参考にどうぞ。
          • 開発手法はどんどん変わっているのに、契約形態は変わっていないのが現実。
          • 変わっていくといいよね...。
        良いデザインのためには:
          • 良いデザインをするには、良いデザインを知ることから!
          • 悪いものほど印象に残り、たとえば、クレームは50人に伝播するのに対し、良い情報は3人くらいしか伝わらない。
          • 「良いもの」は、意識しないで使えてしまうからなのかも?
          • UXに向かう最初の一歩は、良いデザイン、UXに触れ、褒めること!
        正しくない行動パターン: (UIを正しく使えないパターン): 


          • 1. そのUIを見て、使い方を考える。(考えなければ使えない、どづしたらいいのか、何のためのものか判らない)
          • 2. (考えた通りに) 実行、操作してみる。
          • 3. それが正しい操作だったのか、目的を達成できる動作だったのかを、ユーザ自身が確かめる。(確かめなければならない)
          • ユーザの時間を無駄にする、余計な負担や動作を強いるものはNG。

        ITシステムに関わる全ての人が共通の目的を持とう:

          • 誰のためのソフトウェアか?
          • 誰のためのデザインか?
          • UIは、システム全体、ひいては、社会全体のコストにかかってきます!

        嵩原さんの Post 3.11


        1つめだけでも、とても聴きごたえのある内容でしたが、デブサミ時点と違うことは、3.11後であるということでした。スピーカーの皆さんが、それぞれに講演内容 に加え、 3.11を経験してからの新たな想いを語って下さっていました。
        今回のBlogでは、嵩原さんの震災後の心の葛藤と決意といったお話しを最後に添えさせていただきます。
          • ITの人間として、『為す術なし...』という無力感。
            『瓦礫一つ動かすことができないじゃないか...。』
          • でも、ぼくたちは情報を扱うプロだ!
          • ITが専門では無い人たちに伝えることが大事。
          • 情報を得るための道具が、結局使えないようじゃいけない。
            使いやすいUIじゃないといけない!
          • 理想は、『助力や指示が無くても使えるUI』ではあるけれど、まずは『根気よく使い方を教える』ことが大事だ。
          • 『魚を与えるのではなく、魚の釣り方を教えよ』、のたとえもあるように。
        ITに関わる者の責任として、人に対する優しさを忘れないことが大事、ということを仰っていました。

        感想:

        嵩原さんのまとめには、とても素直に共感できました。
        良いデザイン、良い点は、意識しないとそれが伝わってこないけれど、良いものは『良い!』、という感受性や、素直に認めて褒めるこころは大事にしたいなあと思いました。
        良いものに触れ、経験し、感動することこそが、良いものに繋がると私も思っているからです。また、作り手も、褒めてもらうと本当にうれしいですものね。
        また、このお話しの中で、業務アプリケーションのデザインというと、地味な印象かもしれませんが、重要性を再確認できました。UIデザインのお仕事は、ユーザの喜んで下さる現場に一番近いお仕事です。システム開発にかかわったすべての皆さんの願い、『このシステムはこういう目的で、こんなふうに使って欲しい』という想いが、UIを通してちゃんと伝えられないといけないんですね。
        私も少しですがUIにはかかわっていたので、『またやってみたいなあ~』という希望や、UIの価値、目的意識を改めて持つことができました。

        さらに、キネクトについての視点や、「HTML5登場でFlash/Silverlightはどうなるか?」という内容も、非常に参考になりました。そもそも私はクロスブラウザの問題が嫌でFlexを使って開発していた過去があるのですが、最近のHTML5の隆盛に、『もう行けてないのかしら....』という不安と寂しさを感じていたもので (^^;
        今回のお話しで、『いや、AIRとかSilverlightもまだまだ行けそう!』と勝手に自信を持ってしまったのでした。

        もちろん、最後に嵩原さんのお話しして下さったことも。

        UXのお話しをまとめていて、1つ思い出したのが、『ソフトウェアアーキテクトが知るべき97のこと』の1トピックです。

        上記のトピックでは、ソフトウェア全体について語られていますが、UXも含め、使い勝手や生産性、人に対する優しさと言ったものは、『ソフトウェア倫理』として、つねに振り返る必要があるなと感じました。

        お話しを聞いた者の役目として、自分の職場や、メッセージを届けられる範囲でも良いから、想いを伝えていこうと思っています。

        嵩原さん、papandaさん、どうもありがとうございました!