ubuntu 13.10 にFTPSサーバー

ubuntu 13.10 にFTPSサーバー

FTPだと平文、つまりパスワードなどが丸見え

これは wireshark などで実験すると体験できる

このため暗号化されている FTPS を使う

sudo apt-get install vsftpd
でインストール

sudo vim /etc/vsftpd.conf
で設定ファイルを開き

#write_enable=YES

write_enable=YES
というように最初の#を削除
これで書き込み可能に

#ls_recurse_enable=YES

ls_recurse_enable=YES
にしてディレクトリごとの転送を可能に

ssl_enable=YES

ssl_ciphers=HIGH

require_ssl_reuse=NO

を最終行に追記

sudo service vsftpd restart
でサービス再起動

ssl_enable=YES
はSSL有効化

ssl_ciphers=HIGH
・ssl_ciphersオプションは
FileZillaClientへの対応

require_ssl_reuse=NO

サイズが0バイトのファイルが作成される対応

これで後は FileZilla を起動し
ホスト名にIPアドレス

Encryption には
Require explicit FTP on over TLS

ログオンの種類を 通常

ユーザ名
パスワードを設定し接続すれば
暗号化されたFTPでファイルのやりとりが可能になる

今回はエラー多発のため
ubuntuにFTPSサーバーを構築

Net::FTPSSL を使ってFTPSでvsftpdに接続する時のメモ。「522 SSL connection failed」

を参考にさせていただきました

犬山城へのお得切符

お正月ということで
まだ行ったことのないエリアに旅行してみました

いろいろと経験してみると新しい発見とかアイデア
が浮かぶこともあります

今回は名古屋からですので
犬山城下町きっぷ
という割引切符を使いました

犬山城下町きっぷについては
http://www.meitetsu.co.jp/osusume/shohin/1225953_1244.html
に掲載されています

往復の電車賃が通常よりお得になること
そして
セットで犬山城への料金が入っていること
また、城下町のお店の一部で
セットになっているクーポンが使えるなど
メリットがあったためこの切符を購入してみました

名鉄名古屋からだと、約30分くらいでした

名鉄名古屋だと1300円でかえますが
http://www.meitetsu.co.jp/pages/joukamachi_01.html
に他の地域から購入するときの金額
が掲載されています

ちなみに
クーポン対象の店舗は
http://www.meitetsu.co.jp/pages/joukamachi_02.html
に掲載されています

今回はお正月ということもあり
いくつかの店舗はお休みでしたが
また機会があればいってみようと思います

Android で地図を出すとき
GPSを有効化したり wifi を有効化することを
促されこれを起動するのが面倒でした

この前、サーバの起動をNFCにかざすだけで実行できたのでNFCを使うことで
これらを解決できるかもしれません

AndroidアプリからWebAPIへアクセス

AndroidアプリからWebAPIへアクセス

AndroidアプリからWebAPIを呼び出す場合
HTTP通信をするため
メインスレッドとは別のスレッドで
非同期処理する

Androidアプリで、スレッドを作成して
非同期処理させるには
いくつかのアプローチがある

Android 3.0までは
Android SDKで提供されるAsyncTaskクラスを直接利用するのが一般的だった

AsyncTaskクラスでは
メインUIスレッドとは別の非同期処理と
UIスレッドへの実行結果を通知する仕組みが用意されている

これにより、
別スレッドからのUI操作の問題も回避でき
非同期処理が実装できる

ただ、Android 3.0から非同期処理をより
汎用的に扱うためloaderという仕組みができた

loaderクラスは
非同期にデータを読み込むための抽象的クラスで
Activity
Fragmentどちらでも利用できる

Android 3.0未満でも
Support Library という互換ライブラリーを使えば
loaderを使うことができる

AsyncTask と似たもので
AsyncTaskLoader

これは、Loaderのサブクラスで
従来のAsyncTaskクラスの機能が使える

AsyncTaskでは
非同期処理と
UIスレッドへのアクセスができるため
便利だけど
UIへの処理が分散する

AsyncTaskLoaderでは
この問題をActivityに対してコールバックするメソッド、
つまりインターフェースの実装をすることで
解決している

Activityクラスで
LoaderCallbacksインターフェースを実装すれば
非同期処理の各イベントに応じて決められたメソッドが、呼び出される

このメソッドの中で
非同期処理の進捗状況の表示や
処理完了時のViewの更新処理を記述するようにする

このように、ActivityLoaderクラスを使うことで
ActivityのUI制御と非同期処理の処理を分けて実装することができる

NFC タグの有効活用

NFC タグの有効活用

最近のタブレット Nexus シリーズとか
Android の最新版にはNFCがついているので

NFCタグを購入して実験

今回使用したのは

ワンタッチでスマホのアクションを自動化する「NFCタグ」を使いこなして日常生活をハックする

を参考に
NFCタグの設定と動作から

タグは、以前週刊アスキーのおまけと
すでに購入済みのものがあるので、これを使うことに

まずNFCタスクランチャーが欲しいのでこれをダウンロード

現在は名前が変わって Trigger になっている
https://play.google.com/store/apps/details?id=com.jwsoft.nfcactionlauncher

次に まずは簡単なものから試したいので
http://octoba.net/archives/20131117-android-app-trigger-230997.html
を参考に

trigger を起動して
タスクの提案 > ドライブモード > NFC
と選択して

この状態でNFCタグを Nexus7 の後ろにかざす

すると
このNFCの設定がタグに書き込まれる

ここまでできたら、次に
書き込んだタグの上に Nexus 7 をかざしてみる
もちろん NFC対応 Android でもOK

すると
NFCが有効になっているなら
マップアプリが起動する

まずは実験成功なので
次に自分でトリガーとアクションを設定できるので
NFCにかざしたら、tweet するようにする

これは
タスクの提案 > 新規タグ
で + を押してトリガーの選択で NFC を選択

これを WiFi とかにすると
WiFi に接続したときに実行することもできる

今回はとりあえずNFCで実行

画面に NFC とでているので次をタップ

設定タスク、つまり実行することを設定するので
まずは一番したあたりにある
タスク 2 
とかかれているのを
tweet などわかりやすい名前に変更

これは、後々管理するときの名前になる

次に + を押してリストを表示

今回は twitter へつぶやきたいので
ソーシャルメディア > Twitter ツイート
で次へ

すると何をつぶやくか、というダイアログがでるので
とりあえず
test tweet とか
書いておく

これで次にをおせばできあがり

ここからさらに追加もできるけど、今回はお試しなので
完了
を選択

これで後は Nexus7 の後ろに NFC タグをかざせば
書き込みができるので
書き込み終了したら

再度このタグにかざしてみる

すると、 twitter アプリのようにアカウント利用することを
許可するか聞かれるため
ここで
Twitter のアカウントでログインすれば「認証したことになる

これで、NFCをかざすと twitter に投稿できているのが確認できる

次回は Tasker によるアプリ

スマートポスターについて

スマートポスターについて

スマートポスターは、URIに付加情報を加えるためのレコード

URIは、単体でも意味を持つ

スマートポスターは、モノやイベント
その他の情報を物理的なモノを得るために使う

使用例としては
映画のポスターに
スマートポスターレコードが含まれたタグを貼っておけば
ポスターへNFC端末をかざせば
タグのURLから映画の詳細のあるサイトを表示することができる

URIには、SMS 電話番号なども含めることができるため
番号を教えたり
GPSレコードでイベント会場を指し示すこともできる

つまり、スマートポスターは
かざすことで情報へ簡単にアクセスできるものになる

アプリケーションレコードの概要

アプリケーションレコードの概要

このレコードはNDEF headerへ以下の情報をセットする

TNF:0x04(NFC Forum external type)
type:android.com:pkg
payload:パッケージ名

次に、レコード作成と読み込み

これは、android.com:pkg をバイト列にしてtypeへ指定し
payloadには任意のパッケージ名を
タイプと同様の方法でバイト化したものを含める

ソースにすると
private static NdefRecord toNdefRecord(String pkg){
//パッケージ名をバイト列へ変換
byte[] pkgBytes = pkg.getBytes(Charset.forName(“US-ASCII”));

//NDEF record作成
return new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE, RTD_ANDROID_APP, new byte[0] , pkgBytes);
}

public static final byte[] RTD_ANDROID_APP = “android.com:pkg”.getBytes();

public static AndroidApplicationRecord parse(NdefRecord parseRec) throws FormatException{
if(parseRec.getTnf() != NdefRecord.TNF_EXTERNAL_TYPE){
throw new FormatException(“TNFがNFC forum well known type ではありませんでした”);
}
if(!Arrays.equals(parseRec.getType(), RTD_ANDROID_APP)){
throw new FormatException(“タイプがandroid.com:pkgではありませんでした”);
}

//読み取ったデータを文字列へ変換
String packageName = new String(parseRec.getPayload(), Charset.forName(“US-ASCII”));

return new AndroidApplicationRecord(packageName);
}

アプリケーションレコードの利用

アプリケーションレコードの利用

アプリケーションレコードは
AARともいわれる
これは、Android Application Record の略

これは、Androidが独自に定めたレコード

アプリケーションレコードには、Androidのパッケージ名を入れておくことが可能で
このレコードをNDEF Messageに含めておくことで
優先的にそのパッケージ名を持つアプリで扱うことができる
また、そのアプリが見つからない場合、
GooglePlayからアプリをダウンロードするように促す

アプリケーションレコードを含める位置は
NDEF messageのどの位置でもよいとはいっても
NDEF messageの末尾に入れることが推奨されている

注意点として Android API level 10 では
AAR非対応のため、正しく認識できない

Android でJSON

Android でJSON

JSONは javascript Obuject Notation の略

javascript で使われるデータ表記をモデルとした
データ記述方法のこと

これは成魚のための文字が少なく
データが比較的軽量なので
多くのAPIで使われる

例のソースにすると
{
“dataA”:”data1″,
“dataB”:”data2″,
“dataC”:{
“dataC-1″:”dataC”,
“dataC-2″:”dataD”
}

}
というようにペアになっていて階層にすることも可能

次に。JSONオブジェクト

JSON形式のデータファイルを扱うにはJSONObuject を使う

ソースにすると
String text = “{“+
“‘nodeA’ : ‘nodeA-data’,”+
“‘nodeB’ : ‘nodeB-data'”+
“}”;
JSONObject json_data = new JSONObject(text);

これでJSONObuject にしている

そして
JSONオブジェクトから値を取り出すには
getXXX() という形のメソッドを使う
これは型により変わる
大抵の場合なら string 形式なので
getString()になる

この変換はAPI使うなら必須かも

ソースにすると
String text = “{“+
“‘nodeA’ : ‘nodeA-data’,”+
“‘nodeB’ : ‘nodeB-data'”+
“}”;
JSONObject json_data = new JSONObject(text);

で text という JSONオブジェクトを作成している

そしてこれから値を取得する

string result = json_data.getString(“nodeA”);
これで
値として
nodeA-data

result に格納される

これはJSONが
キー:値
というよく見る組み合わせで管理しているからだ

つまり、getXXX() でキーを取得すれば
値を格納することができるわけだ

さて、ここまではよくあるやり方
実際にAPIを使うときには、ほぼ確実に階層データになっている

階層構造のあるデータの操作が必要になる

改造構造のあるJSONデータを扱うには
取得した JSONObject のgetJSONObject() を使うことになる

ソースにすると

まず
String text = “{“+
“‘nodeA’ : ‘nodeA-data’,”+
“‘nodeB’ : ‘nodeB-data’,”+

“‘nodeC’: “+ “{” +
“‘nodeC-A’ :+’data1′,”+
“‘nodeC-B’:’data2′”+
“}”+
“}”;
これで階層構造のJSONを変数 text に格納

次に
JSONOBject json_data = new JSONOBject(text);
として
json_data に変換したデータを格納する

ここまではほとんど同じ

次に階構造のあるJSONを取得する

JSONbject inner = json_data.getJSONObuject(“nodeC”);
まずは複数格納している上のものを取得する

次に
String result = inner.getString(“nodeC-A”);
とすれば
nodeC-A の中身の data1 が取得できる

つまり
一度上のものを取得しておけば
あとは別の変数に
getXXX() でデータを引っ張ってくことができる

PHPで
$result->item
というように階層をたどるのと同じ要領になる

そして、もう一つよく使うのが配列が含まれるデータの操作について

基本的に検索結果とかだとほぼ配列を使うことになる
配列が含まれるJSONデータは
JSONObuject の getJSONArray() を使うことで取得する

ソースにすると

String text =”{“+
“‘nodeA’ : ‘nodeA-data’,”+
“‘nodeB’ : ‘nodeB-data’,”+
“‘nodeC’ : ‘[‘A’,’B’,’C’]”+
“}”;
として text にデータを格納

次にect
JSONObject json_data = new JSONObject(text);
でJSONデータにする

ここから配列として取り出したいので
JSONArray inner = json_data.getJSONArray(“nodeC”);
で配列 nodeC を inner に格納

そして代入するための文字列を
StringBuilder string = new StringBuilder();
で用意して

for(int i=0;i

URIフィールドについて

URIフィールドについて

このフィールドには、RFC 3987 に沿ったURIが入る

このRFCはIRIだけど
レガシーな理由からURIというキーワードで使われ続けている

このURIのエンコーディングは
URIスキームにより特別に指定されていない限り、UTF-8であること

URIは、7bitのUS-ASCII空間のみで定義されている

このため、それ以外の文字が含まれるなら
IRI[RFC 3987]
IDN[RFC 3492]
に従い、適切にエンコードする必要がある