<< 11月 2012 | Home | 1月 2013 >>

非オープンソースソフトウェアがオープンソースソフトウェアを圧倒する例 - Atassianのモデル #augj

・結論
(現在のところ)なんでもかんでもオープンソースソフトウェアが成功するわけではない。
Atlassianはうまいことやって優れたソフトウェアを生み出している。

・補足
JIRAをかれこれ使い続けて早6年。
Atlassianからお金を貰っているわけではないけれどもしょっちゅうJIRAイイヨイイヨ!と説いて回っています。
JIRAに触れた当時のブログエントリを見るとオープンソースソフトウェアへパッチを送ったのもPebbleが初めてのようで、なかなか感慨深いです。

- オープンソースかどうか
JIRAと同時にオープンソースイイヨイイヨ!とも説いているわけですがJIRAはオープンソースではありません(ソースコードは公開されているけれどもOpen Source Initiative基準のライセンスではない)。

同じ事を実現するソフトウェアで、オープンソースのプロジェクトとそうでないプロジェクトでは圧倒的にオープンソースのプロジェクトの方が群を抜いている事例が多くあります。有名であまり反論もないであろう例はLinux。

一方でオープンソースのプロジェクトがイマイチでプロプライエタリなソリューションの方が優れている事例も多くあります。あくまで主観ですがOpen Office(またはLibreOffice)とMS Officeでは圧倒的にMS Officeの方が操作性、安定性、直感的なUIといった面で優れて言います。(こちらは一定の反論がありそうだけどあくまで主観!!!)

LinuxとOpen Officeの大きな違いはランタイム環境であるかそうでないか、そして利用者=ハッカーという点にあると思います。

- ランタイム環境であるかそうでないか
サーバーOSは落ちたら大損害を被るのでその安定性や、運用のしやすさには皆非常に気を使います。一方でオフィスソフトはあくまで書類を効率的に作成するための手段でしかなく、落ちても若干の手戻りが発生するだけで済みます(もちろん大損害が発生することもある)。

- 利用者=ハッカーかどうか
Linuxを(直接)触る人は概ねハッカー。オフィスソフトを触る人はマウスとキーボードを扱える人=一般的なユーザー。
一般的なユーザーが「あぁ、ここはイマイチ、オレ/ワタシが直してやろう」とは普通なりません。

- 課題トラッキングシステムは?
ITS(Issue Tracking System)、BTS(Bug Tracking System)について言うと、ユーザーの2,3割くらいはハッカーなのではないかと思います。なので「ここが気にくわない、直してやろう」と思い立つ人もそれなりにいると思います。しかし、ITSはその上にアプリケーションを構築するランタイム環境ではないので気にくわない点があってもそれほど生産性に大きな影響がなく放置してしまいがち。
なので伝統的なオープンソースのITS/BTSはいまいち盛り上がりに欠けるのではないかと思っています。(ここで言うオープンソースのITS/BTSはBugzilla、Tracの事を指しています。RedMine、Mantisは使ったことないのでわからない)

- Atlassianのモデル
Atlassianは無料で誰でも使える形ではなく主にユーザー数単位で課金して提供しています。
一方でソースコードは公開しているので顧客としてはブラックボックス化されていないので安心です。
そしてAtlassianはとにかくドッグフーディングを実践しており、可能な限り(社内では)利用者=ハッカーとしています(非プログラマもじゃんじゃんフィードバックをしているだろうことが想像できる)。

なので健全に収益を上げつつも利用者層とハッカー層を限りなく近づけ、製品を圧倒的なサイクルで更新し続けています。もはやオープンソースプロジェクトでは追いつかないのではないかというくらいの速度で。

- オープンソースのモデルは限定的にしか通用しないか?
話が飛びますが、ではオープンソースのモデルはランタイム環境であり、利用者=ハッカーでないと通用しないのかというとそうではないと思います。
要はオープンソースであるかそうでないかではなく、貢献に見合った見返りが得られる仕組みがあるかどうかが重要なのではないかと。
見返りは直接的な収益・作業効率の向上・名声・自己満足・技術的な達成感など色々な形があり、Atlassianはソースを公開しながらも「収益」やや重み付けしているに過ぎません。
インターネットや高級言語の普及により、プログラミングの習得は非常に簡単になりましたが、コンピュータを扱う人はだれでもプログラマという時代にはまだなっていません。(むしろアプリケーションのほとんど無かったマイコン時代の方がプログラマの割合は多かったかも?)
誰でも手軽にハック出来て、その見返りを得やすい仕組みをうまく用意すれば世の中(のソフトウェア)はもっともっと良くなっていくと思います。

では具体的にどうしたら良いのかと問われると、「まだよく分からない」です。非プログラマでもカスタマイズしやすい仕組みかもしれないし、BRMS等を使ったエンドユーザコンピューティングの促進かもしれないし、自然言語を解釈・実行してくれる魔法のようなランタイムかもしれません。

オープンソースのモデルが素晴らしいことに異論はないけれどもそれだけが最終解ではないと伽藍とバザールを読んでモヤモヤっとしているところでオチも結論もなくAtlassian Advent Calendar 2012の最終日をモヤモヤっと終わります。

このエントリーをはてなブックマークに追加   

Safariで特定のURLの閲覧履歴を消して快適ブラウジング

Safari(他のブラウザでも同じだと思いますが)でURLをタイプすると、これまでの訪問履歴から候補をあげてくれます。
しかし、当面再訪問しないよなーというURLも候補にあがってめんどくさいことが。

履歴を全部クリアしてしまうのはもったいないし・・・と思っていたところ、できました。任意の訪問履歴のみを消すことが。

やりかたは簡単、履歴画面(opt+cmd+2)を出して、消したい履歴を選択してDeleteを押すだけ。
ドメイン単位などで絞り込んでまとめて消すこともできます。

わかりやすいように動画も撮ってみました。

このエントリーをはてなブックマークに追加   

【本日20時まで】世界の終焉とJetBrains Personal Licenseセールの始まり #jbugj

JetBrainsが本日の世界の終焉に便乗してPersonal Licenseの大安売りしています。
例えばIntelliJ IDEAが通常$199のところ$50、AppCodeが通常$99のところ$25。
JetBrains :: Special Offers

先日のJetBrainsユーザー会にてPersonal Licenseは個人用で個人事業主、個人デベロッパ向け、会社で使うのはだめなどと解いていたのですが大きな間違いでした。

混乱を招いてしまい大変申し訳ないです。
世界の終焉とJetBrainsセールの始まり。そしてPersonal Licenseにまつわるデマ #jbugj - Togetter

フラッシュセールはあと9時間ほど。今日世界が終わってしまうと信じて疑わない人は買わない方が良いです。

このエントリーをはてなブックマークに追加   

#devlove2012 「これからの自分戦略 〜組織に埋もれない自分のウリコミ〜 #devlove2012b」という講演をしました

DevLOVE2012にて「これからの自分戦略 〜組織に埋もれない自分のウリコミ〜 #devlove2012b」という講演をさせて頂きました。

スライドはSlideshareに。

これからの自分戦略 〜組織に埋もれない自分のウリコミ〜 #devlove2012b from Yusuke Yamamoto


多分に口頭でカバーしており、スライドだけを見てもだけでは何を言いたいのかわからないかもしれません。
タイトルはやや釣り成分があり、必ずしも「組織に埋もれる」ことが悪しと言っているわけではありません。
また誰にでも通用する自分のウリコミ方法ではなく、自分はどういうことをしてきたか、どういうことを意識してきてうまくいっているのか、またこれからどういうことをしていきたいのかということを話ました。

オープンソースでセルフブランディング出来てるね!、という点では今連載している@ITの 「オープンソースコミッタへの道」と繋がる内容もありました。

何かしら参考にしてもらえる点があったら良いなと思います。

こういった場を用意してくださった@papanda、そしてお声かけてくださった@crea_memo、ありがとうございました!

関連リンク:
#devlove2012b 2012/12/16 DevLOVE2012 Day2 13:00〜 これからの自分戦略 〜組織に埋もれない自分のウリコミ〜 - Togetter

このエントリーをはてなブックマークに追加   

USP Magazineに「Twitter APIで広がるシェルスクリプトの世界」を寄稿しました

先日お誘い頂いたTechLionを主催しているUSP研究所の発行する雑誌、USP Magazineに寄稿しました。UPSじゃないよ、USP。



USP Magazineはシェルスクリプトで色々ハックしようぜ!という内容の季刊誌(と認識している)。Javaばっかりやっている自分はシェルスクリプトとはちょっと畑違いですが「Twitter APIとシェルスクリプトで何か楽しいことできるんじゃない?何か書いて!」とお声かけ頂きがんばってみました。

「Twitter APIで広がるシェルスクリプトの世界」という3ページ弱の記事になります。

Web+DB Pressでインタビューしてくださった内定女子つつみともよさん(@ttmtmy)の記事もあります。


表紙はこんな感じ。

以下の書店やオンラインでご購入いただけます。興味のある方はお手にとってそのままレジへ進んでください。(まだ店頭には並んでいないかも。今週中には?)
USP研究所: 出版 - 取扱書店
USP研究所: 出版 - 購入

そして次回のTechLionは1月16日。
「技術の草原で百獣の王を目指すエンジニアたちが集う新感覚トークライブ!」なんじゃそりゃ意味ワカラン、と思ったらとりあえず参加してみましょう。面白いイベントです。
TechLION vol.11

このエントリーをはてなブックマークに追加   

JIRA 5.2のいいところ その2 - Universal Plugin Manager #augj

Atlassian Advent Calendar 2012、12日目。小ネタで。

JIRAは標準の状態で簡単に使え、カスタマイズできる幅も広く便利です。
大抵の用途ではカスタマイズする必要もありませんが、外部ツール・サービスと連携したい場合などはプラグインをインストールすることになります。

以前はプラグインをインストールするにはjarファイルをWEB-INF/libに入れて再起動したりといった作業が必要でした。JIRA4.0のあたりからUniversal Plugin Managerというのが導入され、管理画面からプラグインのインストールやアップデートが簡単に行えるようになりました。プラグインはJIRAのインストールディレクトリではなくJIRA_HOMEに格納されるためJIRAをアップデートする度にプラグインもかき集めてインストール、といった手間もなくなったので大変便利です。


さて、やや本題からはずれますがUniversal Plugin Managerは自身すらアップデートすることができます。が、Universal Plugin Manager 2.7.8と2.7.9にはバグがありセルフアップデートに失敗するという現象が報告されています。(そしてこのバグを踏みました)
error while updating universal plugin manager for jira 5.2.1 - Atlassian Answers

しかし回避は難しくありません。作業は以下の通り。
1. JIRAをシャットダウン
2. JIRA_HOME/plugins/installed-plugins/にある *.atlassian-universal-plugin-manager-plugin*.jar を削除
3. 最新版を置く
jirahome/plugins/installed-plugins $ wget https://marketplace.atlassian.com/download/plugins/com.atlassian.upm.atlassian-universal-plugin-manager-plugin/version/137800
だけ。

このエントリーをはてなブックマークに追加   

JetBrainsユーザーグループ #jbugj を開催しました - ブログ・アンケート記入でIntelliJライセンスプレゼント

以前告知したJetBrainsユーザーグループを開催しました。
場所はメディアテクノロジーラボ様。

以前からIntelliJ IDEAを愛用していますが、正直日本で知名度は低く残念な状態なのでJetBrainsに日本市場でやる気はあるのかー!と凸したところ「やる気はある!でも日本のマーケットがよくわからない、手伝って!」といことでコミュニティを立ち上げた次第です。IntelliJ IDEAを初めとするJetBrains製品を日本でもどんどん使って貰ってデベロッパーが幸せになれたら良いなーと思っています。

そしてJetBrainsからは参加者へIntelliJ IDEAの2ヶ月試用ライセンス、2名限定でフルライセンス、そしてキーボードショートカットステッカーなどの提供もして頂きました。
試用ライセンス、抽選のフルライセンスプレゼント応募方法については最後に書いてあります。

ユーザーグループと冠していますがJetBrainsの用語に合わせただけで特に「入会する」といった概念があるわけではありません。

今回は言語の縛りは設けずIntelliJ IDEAを初めとするJetBrains製品全体をカバーする形で広く薄く取り上げました。

次回以降はJava(IDEA)中心、Ruby(RubyMine)中心といった形でもう少し掘り下げた内容であったり、「これから触ってみたい!」という方向けにハンズオンセミナー的な形にしたりして開催してみたいと思います。


会場はMTL

・IntelliJ IDEA製品群、ライセンス形態について

IntelliJ IDEA製品群、ライセンス形態について #jbugj from Yusuke Yamamoto


・IntelliJ IDEA ウォークスルー


・IntelliJのここが気持ちいい! @_siosio_ / @mike_neck
Intelli j vs-eclipse-by-mike-neck #jbugj from mike_neck Mochida


・WebStormとRubyMineを使ってみた #jbugj
WebStormとRubyMineを使ってみた #jbugj from sue445 Sueyoshi




・JetBrains発のJVM言語Kotlinの紹介 - @ngsw_taro
Kotlinの紹介 from Taro Nagasawa



冒頭にも書きましたがJetBrainsのご厚意で試用ライセンス全員、フルライセンスを抽選で2名様に差し上げられることになりました。あとキーボードショートカットステッカーも提供頂いています。

キーボードショートカットステッカー

フルライセンスの抽選対象はユーザー会についてブログに書いて頂いた方が対象となります。ユーザー会に参加していなくても上の動画、スライドをご覧になった上で感想を書いて頂ければ対象とします。ツイートした際にハッシュタグが自動的に入るよう、ブログエントリのタイトルに #jbugj を入れて頂けると助かります。
締め切りは12月18日23:59です。
2012/12/11 #jbugj アンケート/応募フォーム
IntelliJ IDEAじゃなくてRubyMineとかAppCodeとか別のが欲しい!という場合はその旨をコメント頂ければ交渉してみます。

関連記事:
2012/12/11(火) 第一回 JetBrainsユーザーグループ #jbugj - Togetter
第一回 JetBrainsユーザーグループに行ってきた #jbugj | PiyoPiyoDucky
第一回 JetBrainsユーザーグループ #jbugjに参加してきました | @johtani の日記
第一回 JetBrainsユーザーグループ に行ってきた #jbugj - j-mason's diary
第1回JetBrainsユーザグループに行ってきた - 豆無日記
12日目:番外編!JetBrains勉強会の感想 #jbugj - Kotlin Advent Calendar 2012 (全部俺)
「第一回 JetBrainsユーザーグループ」で発表してきました #jbugj - くりにっき
JetBrainsユーザーグループに行ってきました #jbugj | roundropブログ implements Programmable
第1回JetBrainsユーザー会に参加しました - androhi's diary
第一回JetBrainsユーザーグループ #jbugj に参加してきました! - kei_yam1209's blog
なまこの日誌 - 第一回 JetBrainsユーザーグループに参加したよ
第一回 JetBrainsユーザーグループに参加してみた #jbugj | I Wanna Be β
第一回 JetBrains ユーザーグループ #jbugj に参加してきました - unok's diary
技術メモ: 12月11日 第一回JetBrainsユーザーグループ に参加した
日々是精進。: #jbugj RubyMineがとても良い件。

このエントリーをはてなブックマークに追加   

#Cloudforce JAPANに行ってきた

12月6日(木)にSalesforce主催のCloudforce JAPANに行ってきました。
Cloudforce JAPAN

かなり勢いのあるSalesforce周辺の熱気を感じてみたかったのと、Developer Zoneで「Mini Hackスペースが」という企画があったのでHerokuや、必要なければまず触らないであろうAPEXを体験してみたかったというのが動機。

基調講演はCEOのマーク・ベニオフさん。とにかく熱い語り口でこれからはクラウド、ソーシャルありきと説いていました。営業支援・CRMツールとしての基本機能はもはやデファクトスタンダードなのでほとんど触れず。ソーシャルだ、ソーシャルだとChatterを前面に押していたのが印象的。

基調講演の様子

そしてMini Hack。全部で6問用意してあり、HerokuやVisualforce*1、APEX*2、Canvas Application*3などを使う問題。

Mini Hackの問題

がんばれば賞品をあげるよということでSalesforce固有の技術に慣れ親しんでもらうのが狙いのようです。Salesforceはチラっと触ったことがあるだけでデベロッパーとして触ったことはなく、HerokuもAPEXも、何もかも初めての状態。

豪華賞品の数々

どの問題も手探り状態でしたが基調講演とデベロッパーキーノートを聴講した以外はずっとハックスペースにへばりつき、なんとか6門中3問と4問目を9割方解いたところでタイムオーバー。4問目はオマケで正解扱い?で見事iPod touchをゲット!
見事全問クリアしてMacBook Airを手に入れた猛者もいらっしゃいました。

新型iPod touch青!

各要素技術の印象は以下の通り。
・Heroku
Gitに親しみがあれば超簡単。最高!

・APEX
Javaに親しみがあれば簡単。ブラウザで開発することもできるけど生産性にはやや難あり。開発環境であるForce.com IDEを使うべき。今回Force.com IDEをダウンロードはしてみたものの、最初のとっかかりがつかめず活用できなかった。

・Chatter
TwitterよりもYammerに似ている。APIはリクエストもJSONで投げるのがちょっと面倒。Herokuにデプロイしたアプリケーションを埋め込む仕組みがデベロッパープレビューとして提供されているけれどもまだまだといった感じ。

*1 Salesforce内で動くカスタムアプリにUIを作る仕組み
*2 Java風な言語でSalesforceをカスタマイズする仕組み
*3 Chatterにiframeでアプリケーションを埋め込める仕組み(だと思っている)
*4 Chatterでmentionを送る部分で400 Bad Requestが返ってきてデバッグしきれなかった

このエントリーをはてなブックマークに追加   

子供にサンタさんからのメッセージを届けよう! #santathon_dec #SantaThon_dev

子供に夢を与えるアプリを作ろうハッカソンというのに参加してみました。
サンタソン【サンタは俺らに何もくれない!だったら、俺らでアプリを作ろう】

なんと当日アプリを完成させた人は全員Kindle Paperwhilteをプレゼントという怖いくらい太っ腹な企画。
うまい話にはもちろん訳があるわけですが・・・・正直運営がひどかった
企画は大変面白いので今後もやるのであれば運営の改善を期待したいところです。

自分が作ってみたのはTwitterと連携したモバイル向けWebサービス。時間の制約がある中でそれなりに面白い物がつくれたのではないかと思います!

使い方は以下の通り:
1. @_santasan をフォローする
2. @_santasan が自動的にフォロー返しをして、簡単に使い方を説明するDMが送られてくる


3. DMに入っているURLを叩くとサンタさんからのメッセージが表示される


4. 子供に見せる

5. @_santasan にDMを送るとそのままサンタさんのメッセージとしてWeb画面に表示される


メッセージにURLが含まれていると勝手に画像と決めつけてイメージを含めて表示してくれます。

6. 悪い子だったらちょっとサンタさんにしつけてもらいます


7. クリスマス当日には「どこどこにプレゼントがあるよ!」とかメッセージを送ってあげる


工夫したのはTwitterと連携するサービスだけれどもOAuth認証など面倒が全くないこと。@_santasanをフォローするだけで使えます。
WebサービスですがiPhoneのホーム画面に置けばアプリっぽく表示されるようアイコンも設定してあるので「サンタさんからのメッセージアプリ」として子供にそれらしく見せることができます。



実際に動いているところはこちらからご覧いただけます。

同時開催でビジネスプランコンテストというのもあり、ハッカソンで余裕があればそちらにも参加しようと思い申し込んでいたのですがそれに関してはまったく案内が来ませんでした。いつのまにか進んでいたようで2名だけプレゼンをされていました。なんだかよく分かりません。
あとは
・契約書には記名捺印を・・とか書いてあるのに印鑑を持ってくるよう指示がなかった
・「"アプリ"とあるけれどもJavaやRuby、PHPが言語として上がっているからWebサービスでも良いんですよね?と主催者に問い合わせても返事がなかった
・初回のハッカソンの成果物として公序良俗どころか法律に違反するようなアプリケーションが(当初は)堂々と掲載されていた
・「著作権などを譲渡してもらう旨はイベントのページに小さいけれども記載していた」、と最後に弁明があったが、再度確認してもそういった記述は見当たらない
など、モヤモヤモヤ・・・・。

改善すべき点、問題点が大変多いイベントでしたが特定の言語やフレームワーク、ライブラリではなくアプリケーションの目的で縛りをつけるという企画は面白く楽しませていただきました。主催の株式会社エーピーコミュニケーションズ様、ありがとうございました。

著作権の譲渡は難しいですが、「ハッカソンのイベントアプリとしてリリースしたい!」との話がありましたのでgithubにおいておきます。Apache License 2.0なのでご自由にどうぞ。
yusuke/santathon · GitHub

関連記事:
クリスマス直前ハッカソン、『サンタソン』で優勝してきた! - えいのうにっき
アプリが完成した人全員にKindleプレゼント - サンタソン【サンタは俺らに何もくれない!だったら、俺らでアプリを作ろう】 #SantaThon_dev #SantaThon_dec - Togetter

このエントリーをはてなブックマークに追加   

Jettyを80番ポートで、非rootユーザーで起動する

アプリケーションサーバ、サーブレットコンテナはDMZ(インターネットからアクセスできる場所)には置かず、フロントエンドにリバースプロキシとしてApacheやNginxなどのWebサーバーを立てて運用するのがベストプラクティスとされています。

mod_proxyやmod_jkを使ってhttpやajpで通信させても良いのですが、せっかくSPDYに対応しているのにもったいない!
またJettyはSPDY対応のリバースプロキシとしても機能します。DMZにJettyを置いてリバースプロキシとして動作させ、F/Wの後ろにもう1つJettyを置けばパフォーマンス的にもセキュリティ的にもイイ感じになるはず!

ただ問題なのはUnix系のプラットフォームでは一般ユーザーで80番ポートをリスンできないこと。
etc/jetty-http.xmlの
<Set name="port"><Property name="jetty.port" default="8080" /></Set>

<Set name="port"><Property name="jetty.port" default="80" /></Set>
と書き換えて起動しても以下のような例外が出て起動できません。

2012-12-04 08:47:59.323:WARN:oejuc.AbstractLifeCycle:main: FAILED ServerConnector@73c1f55{HTTP/1.1}{0.0.0.0:80}: java.net.SocketException: Permission denied
java.net.SocketException: Permission denied
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:344)
at sun.nio.ch.Net.bind(Net.java:336)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:199)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:227)
at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69)
at org.eclipse.jetty.server.Server.doStart(Server.java:287)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69)
at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1235)
at java.security.AccessController.doPrivileged(Native Method)
at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1162)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.eclipse.jetty.start.Main.invokeMain(Main.java:452)
at org.eclipse.jetty.start.Main.start(Main.java:600)
at org.eclipse.jetty.start.Main.main(Main.java:95)


ApacheやWebLogic Serverなどはrootで起動して80番ポートをリスン開始した後にプロセスのユーザーを切り替える機能があります。ちなみにPure JavaでUnix/Linux固有のシステムコールができるはずはなく、Javaの標準APIでプロセスのユーザー切り替え
さてJettyは・・と調べたところありました。
How do I use port 80 as a non root user?

プロセスのユーザー切り替え用のネイティブライブラリがあり、etc/jetty-setuid.xmlで設定することになるようです。ただ最新のJetty9.0.0M3にはこのライブラリは同梱されていません。
GitHubからとってきて自分でビルドする必要があります。
しかしそのままではディレクトリが見つからない旨のビルドエラーが出ました
libsetuid_linuxをjetty-setuid-linuxに、libsetuid_osxをjetty-setuid-osxにリネームしたところビルド成功し、以下のファイルができあがりました。
jetty-setuid/jetty-setuid-osx/target/libsetuid_osx.so
jetty-setuid/jetty-setuid-osx/target/lib/jetty-setuid-java.jar

最新のソースコードでは問題なくビルドできる。ファイル名はちょっと異なり以下の通り。
jetty-setuid/libsetuid-osx/target/libsetuid-osx.so
jetty-setuid/libsetuid-osx/target/lib/jetty-setuid-java.jar

次に$JETTY_HOME/etc/jetty-setuid.xml を作成し以下のように記述
<Configure id="Server" class="org.eclipse.jetty.setuid.SetUIDServer">
<Set name="startServerAsPrivileged">false</Set>
<Set name="umask">2</Set>
<Set name="uid">501</Set>
<Set name="gid">20</Set>
</Configure>

uid、gidはidコマンドで取得できるものを指定。
例)
$ id yusuke
uid=501(yusuke) gid=20(staff) groups=20(staff),401(com.apple.access_screensharing),12(everyone),33(_appstore),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),100(_lpoperator),204(_developer)


関連記事:
u1aryzの備忘録とか: jetty8でport80起動

このエントリーをはてなブックマークに追加   

au テザリングで7GBを超えると・・? #iphone5 #au

iPhone5を手に入れて約2ヶ月、起きている時間の半分くらい触っているのではないかというくらい活用しています。

iPhone5でウレシイのはテザリングがデフォルトでできること。ただし通信量が7GBを超えると月末まで速度が128kbpsに制限されます。
ややビクビクしながらもガッツリ使っているのですが、11月30日に「通信量が・・・超えました」とのお知らせが。


「うわ、月末だからまだ良かったけどウワサの通信制限はじまっちゃった!」と思ったのですが速度を確認しても制限されている様子はなし。

後々読み返してみると「前日に6GBに達した」ことのお知らせでした。「通信速度が制限」という文字列だけ見て勝手に焦っていただけです。

というわけで残念ながら(?)128kbpsという世界は体験できずじまい。

ちなみに月初にリセットしてiPhoneサイドで測っていた通信量は通知が来た時点で6.691GBでした。

# Cellular Network Dataだけ合計すると5.3GBなのでTether DataはCellular Network Dataに含まれない?

ひとまず分かったことは
・結構ガッツリ使ったけど7GBには達しなかった
・6GBに達したら(翌日)通知してくれる
ということです。

このエントリーをはてなブックマークに追加   

Jettyのダウンロードと起動 #jettyjp

1. Jettyとは
Jettyは軽量、ハイパフォーマンスのサーブレットコンテナです。

JettyはMavenとの親和性が高く、コンテナをいちいちダウンロードせずともpom.xmlに依存関係を記載しておくだけで簡単に起動できて検証用途に大変便利。
またいち早くWebSocketsやSPDYに対応するなど先進的な機能も備えています。

以前から開発で便利に使わせてもらっているのですが、今後運用環境でも積極的に利用していこうと思いちょっと調べています。今twitter4j.orgもJettyで動いています。

Jettyプロジェクトは以前はcodehausにありました(古いコンポーネントは今もcodehausにある)が現在はEclipseに移管されています。

・本家サイト
Jetty
・ダウンロード
download.eclipse.org/jetty/
・最新ドキュメント
Jetty : The Definitive Reference
・ソースコード
eclipse/jetty.project
・バグ
Bug List

ライセンスはやや複雑でコンポーネントによってApache Software License 2.0(にちょっとコメントがついてる)だったりEcipse Public License 1.0だったり。

最新安定版はJetty8.1で、Servlet3.0、WebSockets、Java 6に対応しています。
最新開発版はJetty9.0M3で、SPDYのサポートも追加されています。
What version do I use?

2. Jettyのダウンロードとディレクトリ構成
ダウンロードサイトよりjetty-distribution-9.0.0.M3.zipなど最新版をダウンロード、展開します。
展開すると以下のようなディレクトリ構成になっているのがわかります。


それっぽ名前がつくのでだいたい見当が付くと思いますが、以下のような配置になっています。



bin: 起動用スクリプト
etc: 設定ファイル
lib: ライブラリなど
license-eplv10-aslv20.html: ライセンス
logs: ログファイル
notice.html: 利用上の注意
README.txt: 基本的な使い方などの説明
resources: ログ設定
start.d: 設定追加ファイル(start.iniと一緒に読み込まれる)
start.ini: 設定ファイル
start.jar: 起動用jar
VERSION.txt: リリースノート
webapps: war置き場


3. Jettyの起動
起動は簡単。ディレクトリのトップをJETTY_HOME環境変数に指定してbin/start.sh start とするだけ。
デフォルトでは8080ポートでHTTPリクエストを受け付けます。


起動時のコンソール表示は以下の通り。
$ export JETTY_HOME=~/Downloads/jetty-distribution-9.0.0.M3
$ ./jetty.sh start
Starting Jetty: STARTED Jetty 2012年 12月 3日 月曜日 14時53分32秒 JST
14:53 ~/Downloads/jetty-distribution-9.0.0.M3/bin $ Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
WARNING: System properties and/or JVM args set. Consider using --dry-run or --exec
2012-12-03 14:53:33.802:WARN::main: test-realm is deployed. DO NOT USE IN PRODUCTION!
2012-12-03 14:53:34.058:INFO:oejs.Server:main: jetty-9.0.0.M3
2012-12-03 14:53:34.100:INFO:oejs.NCSARequestLog:main: Opened /Users/yusuke/Downloads/jetty-distribution-9.0.0.M3/logs/2012_12_03.request.log
2012-12-03 14:53:34.126:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/Users/yusuke/Downloads/jetty-distribution-9.0.0.M3/webapps/] at interval 1
2012-12-03 14:53:34.131:INFO:oejd.DeploymentManager:main: Deployable added: /Users/yusuke/Downloads/jetty-distribution-9.0.0.M3/webapps/javadoc.xml
2012-12-03 14:53:34.176:INFO:oejsh.ContextHandler:main: started o.e.j.s.h.ContextHandler@fc36edb{/javadoc,file:/Users/yusuke/Downloads/jetty-distribution-9.0.0.M3/javadoc,AVAILABLE}
2012-12-03 14:53:34.177:INFO:oejd.DeploymentManager:main: Deployable added: /Users/yusuke/Downloads/jetty-distribution-9.0.0.M3/webapps/test.xml
2012-12-03 14:53:34.258:INFO:oejw.WebInfConfiguration:main: Extract jar:file:/Users/yusuke/Downloads/jetty-distribution-9.0.0.M3/webapps/test.war!/ to /private/var/folders/jm/nkmsgj7n31jbf6xvssg13ymr0000gn/T/jetty-0.0.0.0-8080-test.war-_test-any-/webapp
2012-12-03 14:53:34.398:WARN::main: test webapp is deployed. DO NOT USE IN PRODUCTION!
2012-12-03 14:53:34.841:INFO:oejc.HttpClient:main: Started org.eclipse.jetty.client.HttpClient@3db43dd2
2012-12-03 14:53:34.846:INFO:TransparentProxy:main: TransparentProxy @ /test/javadoc-proxy to http://download.eclipse.org/jetty/stable-9/apidocs
2012-12-03 14:53:34.847:INFO:oejsh.ContextHandler:main: started o.e.j.w.WebAppContext@85fdc60{/test,file:/private/var/folders/jm/nkmsgj7n31jbf6xvssg13ymr0000gn/T/jetty-0.0.0.0-8080-test.war-_test-any-/webapp/,AVAILABLE}{/test.war}
2012-12-03 14:53:34.847:INFO:oejd.DeploymentManager:main: Deployable added: /Users/yusuke/Downloads/jetty-distribution-9.0.0.M3/webapps/async-rest.war
2012-12-03 14:53:34.865:INFO:oejw.WebInfConfiguration:main: Extract jar:file:/Users/yusuke/Downloads/jetty-distribution-9.0.0.M3/webapps/async-rest.war!/ to /private/var/folders/jm/nkmsgj7n31jbf6xvssg13ymr0000gn/T/jetty-0.0.0.0-8080-async-rest.war-_async-rest-any-/webapp
2012-12-03 14:53:34.955:WARN::main: async-rest webapp is deployed. DO NOT USE IN PRODUCTION!
2012-12-03 14:53:34.995:INFO:oejsh.ContextHandler:main: started o.e.j.w.WebAppContext@5ffdc730{/async-rest,[file:/private/var/folders/jm/nkmsgj7n31jbf6xvssg13ymr0000gn/T/jetty-0.0.0.0-8080-async-rest.war-_async-rest-any-/webapp/, jar:file:/private/var/folders/jm/nkmsgj7n31jbf6xvssg13ymr0000gn/T/jetty-0.0.0.0-8080-async-rest.war-_async-rest-any-/webapp/WEB-INF/lib/example-async-rest-jar-9.0.0.M3.jar!/META-INF/resources/],AVAILABLE}{/async-rest.war}
2012-12-03 14:53:34.995:INFO:oejd.DeploymentManager:main: Deployable added: /Users/yusuke/Downloads/jetty-distribution-9.0.0.M3/webapps/ROOT
2012-12-03 14:53:35.073:INFO:oejsh.ContextHandler:main: started o.e.j.w.WebAppContext@48729352{/,file:/Users/yusuke/Downloads/jetty-distribution-9.0.0.M3/webapps/ROOT/,AVAILABLE}{/ROOT}
2012-12-03 14:53:35.102:INFO:oejs.ServerConnector:main: Started ServerConnector@523e2446{HTTP/1.1}{0.0.0.0:8080}

タグ :
このエントリーをはてなブックマークに追加   

mod_rewriteメモ - fb_action_idsやutm_source、utm_mediumなどのクエリパラメータを無視する

ふと自分でLikeした自分のブログエントリが見えないことに気がつきました。

URLは http://samuraism.jp/diary/2012/12/03/1354464180000.html?fb_action_ids=****&fb_action_types=********** といった形になっておりFacebookがトラッキング用か何かのために付けてくれているクエリパラメータのようです。
自宅サーバーで使っているPebbleが「そんなパラメータ知らない」と返事してしまうようです。無視してくれればいいのに・・。
Pebble側を修正してもいいのですが、ビルド環境が整っていなかったのでmod_rewriteで対応することに。
が、以前もはまったことがあるんだけどmod_rewriteのマッチ表現はクエリパラメータは見ない仕様なので、ReweriteCondというものを使うことに。

以下のように書いたらPebble側にはクエリパラメータが伝わらなくなり、正常に見られるようになりました。

RewriteCond %{QUERY_STRING} ^.*
RewriteRule ^/diary/(.*)$ /diary/$1?
RewriteRule ^/blog/(.*)$ /diary/$1?

このエントリーをはてなブックマークに追加   

12月15,16日 #DevLOVE 2012に出ます #devlove - 追加募集

DevLOVE 2012というイベントに出ます。
DevLOVE 2012

目玉は1日目のRubyの父まつもとゆきひろさんのセッションでしょうか。

私は2日目16日の午後、13:00からになります。
これからの自分戦略 〜組織に埋もれない自分のウリコミ〜

あまり辛抱強くない自分がとしながらも、それなりにソフトウェアエンジニアをやって来られているヒケツ?について話をできればと思います。

いったん募集は締め切っていましたが若干名余裕を確保したようで先ほどまた募集を再開しています。(注:有料イベントです)

DevLOVEというコミュニティは存在は知っていたものの、主催する勉強会に参加したことはありませんでした。
食わず嫌いも良くありませんし、"Twitterの中の人!"という七光りがなくなるのに誘って頂いたのは非常に光栄なことと思っています。@crea_memoありがとうございます。

このエントリーをはてなブックマークに追加   

JIRA5.2のいいところ その1 - 課題を手軽にアップデート #augj

Atlassian Advent Calendar 2012の1日目。

先日JIRA5.2にアップデートしました。かなり気に入っています。

JIRA5.2のいいところ、1つは標記の通り課題のアップデートが手軽に出来るところ。

今まではフィールド1つを変更するだけでもまずは編集ボタンを押してから編集モードに入り、入力したうえで更新する必要がありました。

JIRA5.2では違います、編集したいフィールドにマウスカーソルを近づけるとそのフィールドだけを編集するためのボタンが現れ、クリックするといきなり「そのフィールドだけ編集モード」(勝手に命名)になります。
編集が終わったら更新ボタンを押せば終了。AJAXで画面遷移なしに更新が終わるので非常にスマートです。

タグ :
このエントリーをはてなブックマークに追加