タイトル/名前 | 更新者 | 更新日 |
---|---|---|
日記/2012/02/19/MavenのLifeCycleとかgoalとかarchetypeとかが分かりかけてきた。 | msakamoto-sf | 2012-02-20 00:12:32 |
日記/2012/02/12/AmazonEC2+EBS+milkodeでAndroidソース調査環境を整える | msakamoto-sf | 2012-02-12 22:52:51 |
日記/2012/01/29/Androidでの位置情報取得の実験 | msakamoto-sf | 2012-01-29 22:53:08 |
日記/2012/01/29/日本人を幸せにするたった一つの方法 | msakamoto-sf | 2012-01-29 10:53:54 |
技術/MacOSX/Disable Spotlight Indexing For External USB Drives | msakamoto-sf | 2012-01-23 08:12:24 |
日記/2012/01/22/MacOSX の Mach-O バイナリ | msakamoto-sf | 2012-01-22 19:01:50 |
日記/2012/01/22/JettyでWebSocketを試してみた。 | msakamoto-sf | 2012-01-22 13:30:18 |
読書メモ/「Android Security 安全なアプリケーションを作成するために」 | msakamoto-sf | 2012-01-15 22:36:31 |
日記/2012/01/15/Androidソースのrepoを無駄に使いまくってた・・・ | msakamoto-sf | 2012-01-15 12:35:21 |
技術/Security/CSRF対策参考メモ | msakamoto-sf | 2012-01-08 21:59:14 |
archetype : テンプレートシステム。Maven3の今や、単に "mvn archetype:generate" だけでOK。対話的にarchetypeを一覧から選択+必要情報を入力できるようになっている。
LifeCycle -> Phases -> Goals の順に構成されている。
LifeCycleはdefault, clean, site の3種類あり、これはどのプロジェクトでも共通・・・らしい。
LifeCycleとPhasesの紐付けも固定・・・らしい。
Phases と Goals の紐付けは、プロジェクトの Packaging やplugin設定で決まる・・・らしい。
勉強中:
というのに遅ればせながら自分もtryしてみたので、駆け足でメモ。
コンセプト:Androidのソースツリーをmirrorモードでsync + そこから任意のバージョンのソースツリーをさらにsyncして、そのソースツリーをmilkodeに突っ込む。
当然、数十GB単位のディスクスペースが必要で、環境準備だけで数時間かかる(mirrorモードのsyncやmilkodeへの登録が時間かかる)。
さらに、週末やお仕事中の「ちょっとした空き時間で調べごと」をしたいだけなので、それ以外の時間はインスタンスを落としておきたい。となるとEBS(Elastic Block Storage)で永続化して必要なときだけインスタンスを上げておく使い方になる。
簡単なサンプルコードを作って遊んでました。
https://bitbucket.org/msakamoto_sf/androidexercise/changeset/c1514aa31b8d
Network Providerはこれで動くのだけれど、Gps Provider が上手く動かない・・・。
もう少し勉強が必要。
昨日美味しい牡蠣をお腹いっぱい食べた上にお酒飲んで、さらにその後江川達也氏の「マンガ最終戦争論」読んでめがっさハイテンションになったのでたまには思いっきり釣りっぽいタイトルにしてみたし、実に久しぶりに技術以外の話題を書いてみる。
日本人を幸せにするたった一つの方法、それは・・・
「given and give」の精神
です。
まず「given」、つまり与えられます。親が産んでくれることで人生を与えられます。食事を与えられます。養ってもらえます。教育を与えられます。会社に入るなり自分で商売を始めるなりした後も、先達や周りの人から助けてもらうこともあります。
そしたら、お礼として「誰かに」giveします。別に「given」してくれた人に直接お礼をする必要はありません。誰か困っている人と出会ったらでも良いですし、あるいは会社の事業や自分の商売でお客に対してでも良いです。何かしら役に立つものを作り、与えます。これも、無償で与えなければならない、というわけではなく、お金を貰っても構いません。
「give and take」と違うところは、見返りを求め合うのではなく、見返りを求めない「give」である点です。
「give and take」は見返りを、お返しを相手に求めます。
「given and give」は、与えるときにお返しを求めません。
なぜなら、最初に来るのは「given」であり、既にどこかから与えられているからです。
「given and give」で「give」するのは、見返りを求めるからではなく、既に与えられたことに対するお返しです。
そして「given and give」は1対1の関係ではなく、自分と周囲の環境の関係です。自分に何かを与えてくれるのは周りの環境全体であり、自分が何かを与える対象も特定の誰かではなく、周りの環境全体で、その内たまたま縁が合った誰か、になります。これも「give and take」と大きく異なる点と考えています。特定の相手に対するやり取りではないので、与えてくれた人・モノと、与える先の人・モノは違っていても構わないのです。
つまり、「given and give」の精神に従えば、「与えられたことに対して『返さなければならない』」義務や、「与えたことに対して『返してもらわなければならない』」期待など存在しません。相手に求めたり、自分で義務感を感じることはないので周囲との関係はずっとリラックスしたものになります。
与えられたら、「ありがとうございます」と感謝すればよく、「何かお返しをしなくちゃ」と焦る必要はありません。
与えたら、「与えられたお返しをすることが出来ました。」と与えた相手に感謝すればよく、「代わりにあなたはこれだけのものを私に返さなければなりません」と相手に強要することもありません。
与えられても、何も与えることが出来なければ、「ごめんなさい、今自分は何も与えるものがありません」と心のなかでゴメンナサイしておけばOKです。子どもや老人は与えられるだけになりがちですが、それに対して罪悪感を感じる必要はなく、変に義務感を感じることも無く、ただ、「ありがとうございます」と感謝すればOKです。
日本人は狭い島国に単一民族で固まっています。そのような環境で「give and take」してしまうと、義務感と期待感による緊張が増加していきギスギスしてしまいます。だからこそ、相手に期待せず、また自分も過剰な義務感を感じなくて済む「given and give」を軸に据えることで、もっとリラックスして人生を楽しむことが出来るようになると、勝手に思っています。
また念のためですが、貨幣制度を否定しているわけでは無いです。貨幣制度の良し悪し、資本主義の良し悪し、商売するときのポリシーの良し悪し、は分かりません。それは個々人の人生ではなく、十億人単位で動いている世界の流れの中での話になってしまいます。
「given and give」はあくまでも個々人の日常の生活をもっとリラックスさせるためのライフハックであり、今すぐボランティア活動をしなければならない、というような話ではありません。
「~しなければならない」、「~せよ」と誰かに求めるのではなく、まず自分自身がリラックスして人生を楽しみましょう。リラックスして人生を楽しむ人が増えていくことで、きっと、社会全体がリラックスして朗らかなものになっていきます。
・・・仏教の「布施」の話を塩コショウ加えて今風にアレンジして見ました。お口に合いましたでしょうか?
余談:タイトルと冒頭の文章以外、あえて「幸せ」という単語を使っていません。なぜかというと、幸せってなんなのかは個々人が一生懸命頭を捻って、それぞれの人生ごとに考えないといけない、非常に難しい内容だと思うからです。
で、そんな難しくて中々答えのでない問題を考えようとすると、日常からリラックスしていないと、良いアイデアは思いつきません。頭も回転しません。なので、まずはリラックスしましょう、という流れです。リラックスして日々を過ごしていくことで、「幸せって何だろう」という非常に難しい難問に対して自分なりのベストアンサーを考える余裕も生まれるのではないか、と勝手に思っています。
USBストレージに対するSpotlightインデックス作成を無効にする手法(MacOSX Lion, 10.7.2 で確認):
最終的に、Terminal上で"mdutil -a -s"したときに "/Volumes/(USB ドライブの Volume名)" について Indexing が disabled されていればOK。
$ sudo mdutil -s /Volumes/REFS/ Password: /Volumes/REFS: Indexing and searching disabled.
あんまり詳しく検証していないのだけど、".fseventsd/"や".Trashes/"まで削除してしまうと、USBドライブを再接続したときに自動的にSpotlightが再indexingを開始してしまう場合があった。というわけで、安定解としては以下の流れ。
参考:
とりあえず:
otool -L 実行バイナリ
例:
$ otool -L ./mongod ./mongod: /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0) /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.3)
どこでotoolなんてコマンド見つけたのか・・・忘れた。とりあえずldd, objdump, elfread の代替としてotoolが使えるのは分かった。
WebSocketについていよいよRFCも発行されたので、もう少し本格的にいじってみるかと思い、今さらながらgihyoの記事を参考にJettyでWebSocketを試してみた。
が・・・2010年8-9月頃の記事であるため、Jettyのバージョンが8となり、いろいろ記事のコードでは動かなくなってる。
まずインターフェイスが分離されている。記事ではWebSocketクラス一つをimplementしているが、Jetty 8 ではWebSocket.OnXXYYというように用途別に最低限度必要なinterfaceのみに分離されている。今回はチャットとしてテキストメッセージしか扱わないので、WebSocket.OnTextMessageをWebSocketとあわせてimplementする。
この時点で「こりゃあ、直接jetty-websocketのテストコード漁ったほうが早そうだ」と見切りをつけて、githubからjettyのコードをclone。
以下のテストコードが見つかったので、流用。
で、特にコンテキストパスとかは設定せずに実装。こんな感じになりました。
webSocketChat.MyWebSocket.java:
package webSocketChat; import java.io.IOException; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import org.eclipse.jetty.websocket.WebSocket; public class MyWebSocket implements WebSocket, WebSocket.OnTextMessage { Connection conn; static Set<MyWebSocket> _connections = new CopyOnWriteArraySet<MyWebSocket>(); public void onOpen(Connection paramConnection) { conn = paramConnection; synchronized (_connections) { _connections.add(this); } } public void onClose(int paramInt, String paramString) { synchronized (_connections) { _connections.remove(this); } } public void onMessage(String paramString) { for (MyWebSocket c : _connections) { try { c.conn.sendMessage(paramString); } catch (IOException e) { e.printStackTrace(); } } } }
webSocketChat.MyWebSocketServer.java:
package webSocketChat; import javax.servlet.http.HttpServletRequest; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.websocket.WebSocket; import org.eclipse.jetty.websocket.WebSocketHandler; public class MyWebSocketServer extends Server { SelectChannelConnector _connector; WebSocketHandler _wsHandler; ResourceHandler _rsHandler; public MyWebSocketServer(int port, String dir) { _connector = new SelectChannelConnector(); _connector.setPort(port); addConnector(_connector); _wsHandler = new WebSocketHandler() { public WebSocket doWebSocketConnect( HttpServletRequest paramHttpServletRequest, String paramString) { System.out.printf("protocol=%s¥n", paramString); return new MyWebSocket(); } }; _rsHandler = new ResourceHandler(); _rsHandler.setDirectoriesListed(true); _rsHandler.setResourceBase(dir); _wsHandler.setHandler(_rsHandler); setHandler(_wsHandler); } private static void usage() { System.err.println("java -cp CLASSPATH " + MyWebSocketServer.class + " [ OPTIONS ]"); System.err.println(" -p|--port PORT (default 8080)"); System.err.println(" -d|--docroot file (default 'src/main/resources/html')"); System.exit(1); } public static void main(String... args) throws Exception { int port = 8080; String docroot = "src/main/resources/html"; for (int i = 0; i < args.length; i++) { String a = args[i]; if ("-p".equals(a) || "--port".equals(a)) port = Integer.parseInt(args[++i]); else if ("-d".equals(a) || "--docroot".equals(a)) docroot = args[++i]; else if (a.startsWith("-")) usage(); } MyWebSocketServer server = new MyWebSocketServer(port, docroot); server.start(); server.join(); } }
で、HTMLファイルはどんなのを用意したかというと、こちらはGoogleのpywebsocketからそのままごっそりコピペ。
で、継ぎ接ぎだらけですが曲がりなりにもチャットが動きました。
JettyとWebSocket、両方勉強できて一石二鳥かとも思ったんですが、Jettyの構造とか使い方もう少し勉強しないとダメですね・・・。
すべてのAndroidプログラマにオススメの一冊です。
自分もAndroidプログラミングを勉強していて、いくつかセキュリティ面も調査してきました。
本書籍で新しく勉強になった点など、以下、読書メモです。
以下は、本書を読んでいて不足感を感じた点です。
上記のような不足感はあるものの、Androidアプリに特化した「セキュア開発」本としては日本で恐らく第一であり、内容的にも必要十分と思われます。Androidアプリの開発者全てにオススメできる一冊です。
バージョンごとに専用のディレクトリ作って、
repo init -u https://android.googlesource.com/platform/manifest -b (バージョン)
してて、その度に10GB位ごっそり削られてた。
よくよく考えれば、repoってgitをAndroidのソースツリー用に制御する仕組みで、結局はgitで管理されてる。
ということは、単に「あるソースツリーの特定のバージョンを調べたい」だけであれば、
git archive --format=tar (バージョン) | (cd /tmp/ && tar xf - )
で済む。"(バージョン)"の正式な値については
git tag
で確認できる。
適当に調べただけなので、もしかしたらarchive以外に、特定のtagやcommit-idのファイルを取得するのに適したコマンドがあるかもしれない。
今更ながらCSRFやCSSXSS関連の参考リンクをメモ。