home ホーム search 検索 -  login ログイン  | help ヘルプ

find 検索

411 - 420 / 1320    [|<]  [|<]  [<]  41  42  43  44  45  46  47  48  49  50   [>]  [>|][>|]
タイトル/名前 更新者 更新日
日記/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
ソート項目 / ソート順     1ページ 件ずつ表示

日記/2012/02/19/MavenのLifeCycleとかgoalとかarchetypeとかが分かりかけてきた。  

所有者: msakamoto-sf    作成日: 2012-02-19 23:53:24
カテゴリ: Java 

archetype : テンプレートシステム。Maven3の今や、単に "mvn archetype:generate" だけでOK。対話的にarchetypeを一覧から選択+必要情報を入力できるようになっている。

LifeCycle -> Phases -> Goals の順に構成されている。

LifeCycleはdefault, clean, site の3種類あり、これはどのプロジェクトでも共通・・・らしい。

LifeCycleとPhasesの紐付けも固定・・・らしい。

Phases と Goals の紐付けは、プロジェクトの Packaging やplugin設定で決まる・・・らしい。

勉強中:


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2012-02-20 00:12:32
md5:baf3363c689eb11f74c7d395689c37a9
sha1:522c946e2cf4b394b1a97dc5028fbfb2864a31a7

日記/2012/02/12/AmazonEC2+EBS+milkodeでAndroidソース調査環境を整える  

所有者: msakamoto-sf    作成日: 2012-02-12 21:42:16
カテゴリ: Android 

というのに遅ればせながら自分もtryしてみたので、駆け足でメモ。

コンセプト:Androidのソースツリーをmirrorモードでsync + そこから任意のバージョンのソースツリーをさらにsyncして、そのソースツリーをmilkodeに突っ込む。

当然、数十GB単位のディスクスペースが必要で、環境準備だけで数時間かかる(mirrorモードのsyncやmilkodeへの登録が時間かかる)。
さらに、週末やお仕事中の「ちょっとした空き時間で調べごと」をしたいだけなので、それ以外の時間はインスタンスを落としておきたい。となるとEBS(Elastic Block Storage)で永続化して必要なときだけインスタンスを上げておく使い方になる。

(全て表示する)
プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2012-02-12 22:52:51
md5:a7624c7f08e8fa607b5abe0ecc7bb3db
sha1:b155a2c27cef7d82a3f8270f1e8153a175308d33

日記/2012/01/29/Androidでの位置情報取得の実験  

所有者: msakamoto-sf    作成日: 2012-01-29 22:51:44
カテゴリ: Android 

簡単なサンプルコードを作って遊んでました。

https://bitbucket.org/msakamoto_sf/androidexercise/changeset/c1514aa31b8d

Network Providerはこれで動くのだけれど、Gps Provider が上手く動かない・・・。

もう少し勉強が必要。


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2012-01-29 22:53:08
md5:073b6eb271da5ec9611c7542086d2dd6
sha1:972118cac9bf584d0b5c1bf1d466bb9caab110e0

日記/2012/01/29/日本人を幸せにするたった一つの方法  

所有者: msakamoto-sf    作成日: 2012-01-29 09:54:46
カテゴリ:

昨日美味しい牡蠣をお腹いっぱい食べた上にお酒飲んで、さらにその後江川達也氏の「マンガ最終戦争論」読んでめがっさハイテンションになったのでたまには思いっきり釣りっぽいタイトルにしてみたし、実に久しぶりに技術以外の話題を書いてみる。

日本人を幸せにするたった一つの方法、それは・・・

「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」はあくまでも個々人の日常の生活をもっとリラックスさせるためのライフハックであり、今すぐボランティア活動をしなければならない、というような話ではありません。

「~しなければならない」、「~せよ」と誰かに求めるのではなく、まず自分自身がリラックスして人生を楽しみましょう。リラックスして人生を楽しむ人が増えていくことで、きっと、社会全体がリラックスして朗らかなものになっていきます。

・・・仏教の「布施」の話を塩コショウ加えて今風にアレンジして見ました。お口に合いましたでしょうか?


余談:タイトルと冒頭の文章以外、あえて「幸せ」という単語を使っていません。なぜかというと、幸せってなんなのかは個々人が一生懸命頭を捻って、それぞれの人生ごとに考えないといけない、非常に難しい内容だと思うからです。
で、そんな難しくて中々答えのでない問題を考えようとすると、日常からリラックスしていないと、良いアイデアは思いつきません。頭も回転しません。なので、まずはリラックスしましょう、という流れです。リラックスして日々を過ごしていくことで、「幸せって何だろう」という非常に難しい難問に対して自分なりのベストアンサーを考える余裕も生まれるのではないか、と勝手に思っています。


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2012-01-29 10:53:54
md5:283e85d3c850288e862a96404e6c2108
sha1:4d6d5ed6c9c4ef7f5a8a59ede8c5d87d21e4d09f

技術/MacOSX/Disable Spotlight Indexing For External USB Drives  

所有者: msakamoto-sf    作成日: 2012-01-22 18:38:39
カテゴリ: Apple 

USBストレージに対するSpotlightインデックス作成を無効にする手法(MacOSX Lion, 10.7.2 で確認):

  1. 買ってきたばかりのまっさらのUSBストレージをMacに接続する。
    1. Spotlightのインデックス作成が始まるが、まだまっさらなのですぐ終わる。
    2. まっさらでなければ、しばらくはインデックス作成が動いているが、とりあえず無視する。
  2. Terminal を開く。
  3. "sudo mdutil -i off /Volumes/(Volume Name)" を実行する。
  4. "/Volumes/(Volume Name)" に移動し、"touch .metadata_never_index" を実行。
  5. ".Spotlight-V100/", "._.Trashes" は削除してOK
  6. ".Trashes/", ".fseventsd/" は残しておく。

最終的に、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を開始してしまう場合があった。というわけで、安定解としては以下の流れ。

  1. とにかく "mdutil -i off" でまずSpotlightIndexingを無効化する。
  2. ".metadata_never_index", ".fseventsd/", ".Trashes/" の3セット以外のドットファイル・フォルダを削除する。

参考:



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2012-01-23 08:12:24
md5:9d7debb5996c99516aaae17e7825c29b
sha1:02ee1c6cc762b20038e6e52ccb35337baa014436

日記/2012/01/22/MacOSX の Mach-O バイナリ  

所有者: msakamoto-sf    作成日: 2012-01-22 18:59:26
カテゴリ:

とりあえず:

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が使えるのは分かった。


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2012-01-22 19:01:50
md5:bc5ef412ee4c5d83bcd43f58e2d469da
sha1:d1516bc10f9a0b1e1978bcdbe096973b32d7d7fa

日記/2012/01/22/JettyでWebSocketを試してみた。  

所有者: msakamoto-sf    作成日: 2012-01-22 13:17:12
カテゴリ: Java 

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の構造とか使い方もう少し勉強しないとダメですね・・・。


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2012-01-22 13:30:18
md5:94763ecca8fa05f9c32f02548f5a0cc8
sha1:e0153cb7aec4db6250dca6b3e2eebf34d83cff6c

読書メモ/「Android Security 安全なアプリケーションを作成するために」  

所有者: msakamoto-sf    作成日: 2012-01-15 22:35:29
カテゴリ: Android セキュリティ 読書 

すべてのAndroidプログラマにオススメの一冊です。

自分もAndroidプログラミングを勉強していて、いくつかセキュリティ面も調査してきました。

本書籍で新しく勉強になった点など、以下、読書メモです。

  • "3.5 固有識別子"(p29 - )
    • アプリ側で生成したUUIDを識別に使用するのがオススメ
    • 以下は非推奨
      • READ_PHONE_STATE必要:IMEI, IMSI, ICCID
      • READ_PHONE_STATE不要:シリアルNo, ANDROID_ID
  • "4.2.1 ディレクトリ" p42以降:アプリケーションをSDカードに移動→apkがSDカードに移る。Audio/Videoなど容量の大きいリソースを抱えたAPKの場合は効果的。データやファイルなどは"/data/data"以下のままのようだ。
    • apkをSDカードに配置させるには、p45の"SDカードインストール"も参照。
  • p83 : "5.5.2 プリファレンスメソッド" : 3種類もある・・・
    • Context.getSharedPreferences() : MODE指定可能
    • PreferenceManager.getDefaultSharedPreferences() : MODE指定不可、MODE_PRIVATE固定
    • Activity.getPreferences() : MODE指定可能
  • p89 : データベースファイルの保護 :
    • SQLiteDatabase.openOrCDreateDatabase() : MODE指定不可、但し 644 でDBファイルが作成されるので要注意(他アプリからも読取は可)
    • Context.openOrCreateDatabase() : MODE指定可能
    • SQLiteOpenHelper : MODE指定不可、MODE_PRIVATE固定
  • "6.5 疑われやすいパーミッションの組み合わせ" (p117 - )
    • パーミッションの「組み合わせ」に対して、疑われてしまいそうなペアを示してくれているので、開発したアプリがこれらに該当する場合はユーザーへ分かりやすい形で明記する必要がある。
  • "7.6 コンテントプロバイダのパーミッション設定事例" : 事例ベースで解説してくれているので分かりやすい。
    • コンテントプロバイダのパーミッションは、他(Activity/Receiver/Service)より複雑なので、最終的にこうした事例ベースに当てはめた上で検討することになりそう。
  • "OSによるインテントデータの隠ぺい" (p153 - ) : log上でIntent内容がマスクされるか否か、抜き書き
    • "tel:" マスクされる
    • "smsto:" : マスクされる
    • "mailto:" : アドレスはそのまま表示される
    • "http://" : URLとクエリがそのまま表示される
    • "geo:" : そのまま表示される
  • "9.2.3 ProGuardの使用法" (p199)
    • "アンドロイドSDKの注意点" : まさにこれに嵌ってしまった・・・。
    • SDK r16 にアップデートしたら再発。SDKェ・・・。
  • "動作している環境からパスワードを生成し、使用する" (p233 - )
    • 当然ながら、ここに掲載されているサンプルコードをそのまま使うのではなく、改造して使う。
    • ProGuardのセクションでは特に記されていないが、SDKのクラス・メソッドの呼び出しは難読化されないので、例えばPBEKeySpec()の呼び出し箇所から変数を逆に辿り、パスワードが解析される危険性は残る。(とはいえ、カジュアルハックの防止には効果がありそう)

以下は、本書を読んでいて不足感を感じた点です。

  • ログ出力についての記述 : android.util.Log#v(), d(), i() ... はisLoggable()と組み合わせないと、なんだけど、自分の認識以上に常識化してるのかな?あるいは、そもそも秘密情報はデバッグログといえども出力しない、というのは当たり前の前提になっているのだろうか。
  • アプリケーションに焦点を絞っているから仕方ないとは思うが、サーバとの通信(HTTP, HTTPSを使ったAPI呼び出しなど)関連のトピックが無い。
    • 例1:HTTPSを使うときの証明書の扱い
      • Androidにインストール済みのルート証明書
      • 自己署名証明書の危険性、などなど
    • 例2:OAuthの2-legged/3-leggedで使われるConsumerKeyの取り扱い
      • 他、サーバサイドと絡めたtokenの適切な扱いなど。

上記のような不足感はあるものの、Androidアプリに特化した「セキュア開発」本としては日本で恐らく第一であり、内容的にも必要十分と思われます。Androidアプリの開発者全てにオススメできる一冊です。


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2012-01-15 22:36:31
md5:ebc5ac52acd1699695a90fd38e18c51d
sha1:94c6b0be08cba06ec1ab05c69169ce58b858b3d4

日記/2012/01/15/Androidソースのrepoを無駄に使いまくってた・・・  

所有者: msakamoto-sf    作成日: 2012-01-15 12:29:22
カテゴリ:

バージョンごとに専用のディレクトリ作って、

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のファイルを取得するのに適したコマンドがあるかもしれない。


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2012-01-15 12:35:21
md5:91f5bc9e03a398dbbc7b1de38906154e
sha1:421548d4ed14debda4d5436d07f7f9ebf04dff84

技術/Security/CSRF対策参考メモ  

所有者: msakamoto-sf    作成日: 2012-01-08 20:08:56
カテゴリ: セキュリティ 

今更ながらCSRFやCSSXSS関連の参考リンクをメモ。

(全て表示する)
プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2012-01-08 21:59:14
md5:f57e9dcfc09b706ab01a426726d829ea
sha1:bb83e75695b668064310fddabe6c49738e02f384