Linuxの記憶

Android ndk開発のために久々にLinuxを入れたので、かなり昔のメモを探してきました。

bash

~/.bashrc を書き換えて bash をより便利に。

プロンプトの変更

TITLEBAR="\[\033]0;\h:\w\007\]"
PS1="${TITLEBAR}\
\[\e[7m\]\h\[\e[0m\] [\w]$ "

プログラマブル補完

cd の次にTABを押すとディレクトリだけを補完する。

complete -d cd mkdir rmdir pushd

http://en.tldp.org/LDP/abs/html/sample-bashrc.html

その他

[~/.bashrc]

# 重複するコマンドヒストリを削除
HISTCONTROL=ignoredups

screen

一つの仮想端末から複数の端末を操作可能。MDIみたいなもの。

コマンド

(注意) escape ^Tt にしてある。^Tに続いて以下のキーを入力する。

c, 新しい画面の作成
w or ^w, window一覧表示
数字, window番号に切替
n, 次のwindowに切替
p, 前のwindowに切替
^T, 直前のwindowに切替
A, windowのタイトル編集
\, quit
d, detach

screen の引数

-ls, セッションリスト表示
-r, resume
-d, detach

リージョンの管理

S, split
[TAB], フォーカスを別のリージョンに移す
Q, 他のリージョンを閉じる

コピー&ペースト

  1. ^[: copyモード開始
  2. viのキーバインドで移動
  3. spaceで選択開始
  4. viのキーバインドで移動
  5. spaceで選択終了
  6. ^]: 貼り付け
設定ファイル

[$HOME/.screenrc]

escape ^Tt
vbell off # Wuff!は五月蝿いので。^T^Gで切替可能。
bindkey -k kb stuff "\010" # Debian では Ctrl-h は DEL になるので修正
hardstatus alwayslastline "%w" # 最下行に window 一覧表示

[$HOME/.bashrc]

# screen 時に ssh, telnet でログインしたホスト名を window 名にする
# ただし ^[ は Ctrl-v ESC
if [ "$TERM" = "screen" ]; then
function ssh() {
echo -n "^[k$1^[\\"
/usr/bin/ssh $1
}
function telnet() {
echo -n "^[k$1^[\\"
/usr/bin/telnet $1
}
fi

リンク

ニコニコ実況プレイヤーとJikkyoRecを公開

ニコニコ実況Android上で楽しむために、ニコニコ実況プレイヤーとJikkyoRecを公開しました。

ニコニコ実況プレイヤーは、PCで保存した「ニコニコ実況」のログと、録画したテレビ番組(動画)をAndroid上で再生するプレイヤーです。

JikkyoRecはPC上のEpgDataCap_Bonの録画予約と連動し、ニコニコ実況のログを保存するアプリです。

EpgDataCap_Bonで録画したテレビ番組の動画(.mp4など)とニコニコ実況のログ(.jkl)を同じ名前にしてAndroidのSDカードに転送すると、「ニコニコ実況プレイヤー」で実況コメントを見ながら動画再生できます。

動作デモ(youtube


スクリーンキャプチャ

Androidの仕様上スクリーンキャプチャには動画が写っていませんが、実記では動画とコメントが同時に表示されます。

ファイル選択画面


動画再生中(横表示=全画面表示)


動画再生中(縦画面=上にコメント、下に動画)


動画再生中(デジカメにて撮影)


ダウンロード

ニコニコ実況の非公式アプリです。


質問はコメント欄へどうぞ。

b-mobile SIMを使うAndroid端末向けに電波受信強度(アンテナ)とデータ通信状況を表示するアプリを公開

Nexus Oneを購入し、通信用にb-mobile SIM U300を契約しました。
通信速度は300kbpsと遅めですが、WEBやtwitterを見る分には十分で、コストパフォーマンスの良さにとても満足しています。


ところがb-mobile SIMをAndroidで使うと常に圏外表示となってしまいます。
そこで電波受信強度(4本のアンテナ表示)とデータ通信状況(PPP接続状況、パケット送信・受信表示)をステータスバーに表示するアプリ「3Gアンテナ表示」を作成しました。

スクリーンショット


左の写真→「3Gアンテナ表示」がステータスバー(左上)にある4本のアンテナと、3Gと矢印のあるアイコンを表示しています。

右の写真→通知一覧を表示すると、PPP接続状態とデータ通信の状態、電波受信強度が表示されます。

ダウンロード

Android Marketで「3Gアンテナ表示」を検索。

もしくはQRコードでアクセス。

動作確認機種

コメント、ブログなどで動作確認ができた組み合わせです。

Nexus Oneを購入

Androidは発表当時から注目して色々調べていましたが、ガラケー2台(au W62Sと、docomo P906i ワンセグ録画を2倍速視聴用)+iPhoneの環境に、HT-03Aを追加したいとまでは思いませんでした。
というのも、HT-03Aのもっさり感と通信料の高さからiPhoneで十分と納得していました。


ところがNexus One、HTC Desire、Xperia X10など1GHzのCPUを搭載してサクサク動く端末が登場し、b-mobile SIMという月2,500円程度で300kbpsのデータ通信ができるMVNOサービスが登場したことで、iPhoneの閉鎖性(アプリ審査制、Flash排除、Mac OS上でObjectCによる開発が必要、登録料)を良く思っていなかったこともあり一気にNexus Oneを購入する気になりました。
HTC Desireの物理ボタンが気になりましたが、Googleブランドということで最新のAndroid OSにいち早くアップデートできるNexus Oneに決めました。


Nexus Oneは日本からは購入できないため、他サイトを参考にしてVPN(Hotspot Shield)でUSAに接続して、海外小包転送サービス(スピアネット)を使いました。

4/23 1時 Googleに発注
4/23 6時 Googleから発送(INDIANAPOLIS)
4/24 6時 スピアネットに着荷(San Leandro) ※現地時間14:00
4/24 6時 スピアネットから着荷連絡
4/24 10時 送料の決済
<土日はスピアネットが休業>
4/27 10時 発送連絡
4/29 10時 成田到着
4/30 10時 通関許可
5/1 10時 着荷

さすがにGW前の入手は無理でしたが、原則平日しか稼動していない通関を4/30に通ったことでGW中に入手することができました。

 本体(USA国内送料込) $529.00
 CA州税 $51.58
 スピアネット送料 $32
 消費税 \1,300
 ⇒合計 60,000円 位

インプレは後ほど。

Axis2を使いWSDLからWEBサービスとクライアントを作成

JavaSOAPクライアントとSOAPサーバ(WEBサービス)を作成する方法を簡単にまとめます。

代表的な開発パターンとしては、

  • SOAPサーバを開発しWSDLを作成する方法
  • WSDLを元にSOAPサーバを作成する方法

がありますがここでは後者のパターンで説明します。

概要としては、

  • wsdl2javaでスケルトンを作成しSOAPサーバを開発
  • wsdl2javaでスタブを作成しSOAPクライアントを開発

となります。

JavaSOAPライブラリ

Java用のSOAP調べてみるとSun公式のライブラリMetro/GlassFishApache Axisが見つかり、本当はSunのライブラリを使いたいところでしたが情報が少なそうなので無難そうなApache Axisを選びました。

Apache AxisはAxis1とAxis2があります。
多くの情報源はAxis1を前提に書かれていましたが、Axis2では標準対応など大きく変更されているようなのでAxis2を使うことにしました。

環境構築

今回は開発/動作環境として、

を使いました。(Axis2 1.4が最新ですがSOAPサーバがうまく動作しなかった*1ため1.3にしています)

Apache Tomcat/Eclipse/JDKのインストール手順は割愛します。
開発環境用にAxis2のStandard Binary Distributionをダウンロードして任意のフォルダ($AXIS2_HOME)に展開しておきます。
動作環境用にAxis2のWAR (Web Archive) DistributionをダウンロードしてTomcatのwebappsへ入れます。

WSDLからSOAPサーバを開発する方法

ここから本題です。
基本的にAxis2 Quick Start Guideに書かれている手順です。

wsdl2javaでスケルトンコードを生成

次のコマンドを入力しスケルトンコードを自動生成します。

$AXIS2_HOME/bin/WSDL2Java -uri WSDLファイルのURL/パス -s -ss -sd -ssi

コマンドを実行すると、

  • build.xml : Ant用ファイル
  • srcフォルダ: スケルトンコード
  • resourcesフォルダ: WSDLファイルのコピー

が生成されます。

コーディング

Eclipseにbuld.xmlとsrcフォルダをインポートし、「サービス名Skeleton.java」を開き、実装したいOperationに該当するメソッド内にコードを追加します。

コンパイル&deploy

Axis2にdeployするためにaarファイルを作成します。
Eclipseからbuild.xmlを右クリック→「実行(R)」→「2.Antビルド」を選択し、ターゲットを「jar.server」にして「OKボタン」を押すと、
workspace/プロジェクト名/build/lib 配下にaarファイルが生成されます。

生成されたaarファイルをAxis2の管理画面にある「Upload Service」メニュー(http://tomcatインストール先/axis2/axis2-admin/upload)からアップロードすればdeployが完了します。

http://tomcatインストール先/axis2/services/WEBサービス名?wsdl
へアクセスしてWSDLファイルが表示されればdeployが成功です。

WSDLからSOAPクライアントを開発する方法

wsdl2javaでスタブコードを生成

次のコマンドを入力しスタブコードを自動生成します。

$AXIS2_HOME/bin/WSDL2Java -uri WSDLファイルのURL/パス -s

コマンドを実行すると、

  • build.xml : Ant用ファイル
  • srcフォルダ: スタブコード

が生成されます。

コーディング&実行

Eclipseにbuld.xmlとsrcフォルダをインポートし、Javaファイルを新規作成します。
例としてAxis2のQuick Startのコード例を引用します。

package samples.quickstart.clients;

import samples.quickstart.service.adb.StockQuoteServiceStub;

public class ADBClient{
    public static void main(java.lang.String args[]){
        try{
            StockQuoteServiceStub stub =
                new StockQuoteServiceStub
                ("http://localhost:8080/axis2/services/StockQuoteService");

            getPrice(stub);
            update(stub);
            getPrice(stub);

        } catch(Exception e){
            e.printStackTrace();
            System.err.println("\n\n\n");
        }
    }
// ※以下省略
}

注意すべき箇所は、

StockQuoteServiceStub stub = new StockQuoteServiceStub ("http://localhost:8080/axis2/services/StockQuoteService");

です。
WSDLに記載されているサービスのtargetと異なるURLでサービスを提供する場合、サービスを提供するURLをスタブのコンストラクタに渡します。

最後に実行すれば動作確認ができます。

補足:任意のSOAPヘッダを付与する方法

WEBサービスによってセキュリティのためSOAPヘッダに認証情報を載せる必要があります。
(WS-Security準拠ではなく、独自の認証方式を採用しているケース)

次のようなコードを追加すると、

ServiceClient serviceClient = XXXStub._getServiceClient(); 
OMFactory omFactory = OMAbstractFactory.getOMFactory();
OMElement omElement = omFactory.createOMElement(
 new QName("http://www.example.com", "MyHeader", "myNs"), null);
omElement.setText("example");
client.addHeader(omElement);

下記のようなSOAPヘッダを追加できます。

example

*1:java.lang.NullPointerException at org.apache.axis2.engine.AbstractDispatcher.invoke (AbstractDispatcher.java:122) ...が発生。なぜ?

BkTag Ver0.6をリリース

BkTag Ver0.6をリリースしました。ダウンロードは公式サイトからどうぞ。

http://f12.aaa.livedoor.jp/~darkstar/pukiwiki14/


更新内容

  • カラーラベル処理の修正 (Becky! 2.40新方式対応)
  • 複数メールを同時にタグ処理可能
  • BkTagリストのタグ名をマウスホイールで選択可能

カラーラベル処理の修正は、Becky! 2.40で新規APIが追加されて自然な処理でカラーラベルが設定できるようになったので、新規APIを使う方式を実装しました。
Becky! 2.40以降でBkTagを使うと新方式でカラーラベルを付けられます。互換性を考慮し、Becky! 2.40より前のバージョンでは従来の<無理やりな>カラーラベル処理を行います。


また、複数メールに関しては、複数メールに同時にタグを付けたいという要望を元に実装しました。

(2014/11/25追記)Windows8.1 64bit環境へのインストール方法

BkTagのインストーラを最近のWindowsで起動するとエラーになります。
その場合は手間がかかりますが手動インストールすることで利用可能です。

  1. BkJavaBkJava1.0b7Installer.zipをダウンロードして C:\Program Files (x86)\RimArts\B2\PlugIns\へインストール
  2. BkTag-0.6\Files の各種ファイルをコピー。bktag.jarをC:\Program Files (x86)\RimArts\B2\PlugIns\BkJava\libへコピー、bktag.propertiesをC:\Program Files (x86)\RimArts\B2\PlugIns\BkJava\confへコピー、config.xmlをC:\Program Files (x86)\RimArts\B2\PlugIns\BkJava\confへ上書きコピー
  3. C:\Program Files (x86)\RimArts\B2\PlugIns\BkJava\BkJava.iniを編集し、「jvm.option.1=......」の行末にC:\Program Files (x86)\RimArts\B2\PlugIns\BkJava\lib\bktag.jar;を追加。(BkJava.iniは管理者権限でないと編集できません)

Beckyを再起動すれば使えるようになっているはずです。

Becky! 2.40リリース

今朝Becky!がバージョンアップして2.40がリリースされました。
http://www.rimarts.co.jp/becky-j.htm


個人的な一番の目玉はBecky! Plugin SDKにProcessMail()というAPIが追加になり、
カラーラベルの操作などができるようになったことです。


今まで無理やり実装してきただけにとても嬉しいです。


BkJavaがProcessMailに対応してくれれば、BkTagもカラーラベルの設定方式を
変更しようと考えています。*1

*1:BkTagはBkJavaを使いJavaで開発しているため