2013年5月20日月曜日

【Linux】ワイルドカード

Linuxのワイルドカードってシェルの方で勝手に展開して引数に入れてくれるのな.
引数末尾にアスタリスク【*】がある場合に自分で展開して
各々に処理を加えるルーチンを作ろうと思ってたから
予想外で嬉しい.
↑こんなかんじで確認した.

逆に考えるとアスタリスクを含む文字列をそのままアプリに渡せない.
ダブルクオーテーション【"】で囲む必要がある.

2013年5月16日木曜日

【Android】Android Studioをインストールしてみた

Google I/Oが開催された.
楽しみにしていた新型Nexus7は今日のところはなかったけど
予想外のAndroid専用開発環境.
Eclipseの環境から離れてまで移行するほどのものなのだろうか?

今回はWindows8 64bit版にこのAndroid Studioをとりあえずインストールしてみた.

必要なもの:
・Android Studioインストーラー
 ⇒http://developer.android.com/sdk/installing/studio.html
・JDK(Java Development Kit)
 ⇒http://www.oracle.com/technetwork/java/javase/downloads/index.html
・1GB弱のディスクスペース

JDKはこれまでAndroid開発してた人なら入ってるはずだよね.
入ってないなら上記Oracleのサイトから
Java Platform (JDK)7uほにゃらら
っていうのをダウンロードしてインストールする.
インストールした場所は覚えておく.

というわけで,PCにJDKが入っているという状態からスタート.

ダウンロードしたAndroid Studioインストーラーを実行したら
よく見るインストーラーが実行された.
Android StudioのインストーラーだよNextをクリックして続けてね


…はて.
この画面で止まる人はほぼいないと思うけど俺は止まってしまった.

ここで止まらなかったら先を急ごう

Java SE Development Kit (JDK) not found.
Error: Failed to find Java version for 'C:\WINDOWS\system32\java.exe': [2] 指定されたファイルが見つかりません。

Android SDK relies on the Java SE Development Kit (JDK).
before continuing, version 1.5 or better of the JDK is needed.

If you believe you have a JDK installed and it was not properly recognized, simply set an environment variable JAVA_HOME to point to it.

俺の場合の原因はSystem32下にjava.exeをコピーしていたこと.
環境変数は前に記述したほうが優先されるため,
環境変数のPath:にsystem32がJDKより前に書いてあった場合,system32下のjava.exeを見てしまって
この環境おかしいよって判定されたようだ.

そんな人はいないと思うが,対策法は2通り
・system32からjava.exeを消す
・環境変数PathにJDKのパスをsystem32より前に書く
前者は何らかの環境に影響を与えそうなので後者を選んだ.
面倒なのでJDKのパスをPathの先頭に置いた

ちなみに先の画面で止まった人は環境変数を見直すべし.
PathにJDKのパス(C:~~~\jdk1.x.x\bin)が書いてあるか見直す.
書いてないなら書く.
先の画面のエラーに
「もしJDKインストールしてるのにこの画面で止まったら【JAVA_HOME】の環境変数がおかしいんじゃね」
とか書いてあるけど,JAVA_HOMEの環境変数は必要なかった.


正しい環境変数が設定されてあると,
セットアップは次の画面へ進む.
Android SDKはJDKに依存してるけど
JDKがちゃんと見つかったぜ!よかったな!


インストールするユーザーを選択する.
このPCを使用する全ユーザー(アカウント)にインストールするなら上を,
自分だけが使うなら下を選択する.
自分しかこのPC触らねえしどうだっていいぜ~って人はどっちだっていい.勝手にしろ.


そしてインストール先.
Android StudioをこのPCのどこにインストールするかを決めてね.
特にコダワリがなければそのままでいい.先へ進むぞ.


スタートメニューにAndroid Studioのショートカットを登録するけど
どこのフォルダーにするんだぜ?っていう画面.
これもコダワリがなければそのままでいい.
ショートカットを作成しない場合は左下のチェックボックスをONにする.
Windows8においてこのショートカットフォルダーは
スタート画面(Metro)で右クリックして【すべてのアプリ】を選択した時に見ることができる.
逆に言うとほぼ見ることはない.

俺は
常用するアプリはタスクバーへPin,
よく使うアプリはスタート画面へ
それ以下のほぼ使わない奴がすべてのアプリ
という感じでアプリ管理をしてるのでほぼ見ることはない画面なのだ.


さて,インストール.
実は2枚目の画像の画面でかなり止まっていたので
この画面に来たのが嬉しかった.
環境にもよるが1分程度でインストールは完了する.
Eclipseと比較すると軽そうな予感!


で,インストールが完了し,
スタートメニューにショートカットが登録された.
さて実行…


実行…
じ…
おい!起動しろ!

というわけで,全然起動しない.
世の中の流れは速い.
ググれば対策法がすぐに見つかった.

ふたたび環境変数の設定画面を開き,
ANDROID_STUDIO_JDK
という変数にJDKのルートフォルダを指定して追加.

再チャレンジ!
ん?
旧バージョンの設定を引き継ぐかどうかの画面のようだ…
βの初リリースなのでとりあえず関係ない.
下を選択する.

すると!
きたぜえええええええ

というわけでAndroid Studioをインストールして起動までやってみた.

2013年5月15日水曜日

【C】続・エスケープされたUnicodeをデコードする


いや,これはガチでお手上げだと思ってたんだけど.
じゃあなんでprintfは日本語を出力できるのよと.
そしたら文字エンコーディングとか文字セットとかの知識がないことが露見.
ひとまず知識を詰め込んでsetlocaleせずに…というか
localeが対応していないマシンで日本語を表示させることができた.

昨日変換しようとしていた【\u3042】こういったコード
これはUnicodeのいろいろある符号化の中でUTF-16というものだったんだね.
こいつをCコード上で得ようとすると
int c = L'あ';
で得ることができる.

一方で,
printf ("あ");
これで表示される'あ'っていうのは
int c = 'あ'; // 実際にはchar1個分でないため怒られる
E38182という値.
これはUTF-8と呼ばれるものらしい.

同じUnicodeで同じ【あ】という文字をコード化した数値でも
0x3042というUTF-16と,0xE38182というUTF-8と二通りある.

これが符号化というやつ.
そこで,UTF-8もUTF-16も同じUnicodeというルールに則っているため
キーマップなしに計算だけで相互変換が可能!
つまりUTF-16からUTF-8へ変換させてやれば
printf ("あ");
と同じように表示できるはず!
光が見えてきた!

どういう相互ルールがあるかというのは
http://www5d.biglobe.ne.jp/~noocyte/Programming/CharCode.html
の5.1.を参考にさせて頂きました.
UTF8-4は…いいやとりあえず.

ビット演算だけでどうにかなりそうね.
まぁジャバラーなのでビット演算すら経験が浅いのだが.

と,いうわけで昨日のuniDec関数から呼び出す関数を新たに設置.
uniDec関数内でUTF-16の数値部分を取得しているので,
UTF-16の数値⇒UTF-8のキャラクター
という変換を行う関数である.

そして昨日のuniDecもこの関数を呼び出すため少しだけ修正.

まさか自分でもできるとは思わなかった…!

2013年5月14日火曜日

【C】エスケープされたUnicodeをデコードする

いつの間にかCに戻ってきた.
VCとかでなくPOSIXなC.

さて,鯖とのやりとりで面倒なのがエスケープされた文字列共.
URLエンコードとかUnicodeとかいろいろあるんだろうけど
今回はUnicodeのエスケープ文字列を入手してしまった場合に
こいつを力技で復元する方法を紹介する.

\uXXXX\uXXXX…ってフォーマットの文字列がエスケープされたUnicode.
鯖がどういう変換をするかはわからないがこのコード部分XXXXが分離できればいい.

URLエンコードと違ってUnicodeは腐ってもエスケープされても文字.
コードを取得して数値化し,キャラクターとして変換する.
考え方はそれだけのことである.
簡単に説明すると
コード開始文字の\uを探して文字列を分解し,
\uに続くXXXXのコードを整数に変換して
printf系で文字に直している.

ここで問題になるのがロケールの設定である.
ロケールを設定しないと正しく文字に直せない.
多分出力されない.

Linuxで
$ locale -a
と打ってやる.
出てきたリストがそのマシンで使えるロケールである.

このリストの中から望みのロケールをプログラムの最初辺りで
setlocaleしてやる.
それ以外の文字は表示されない.

つまりこんな環境ではお手上げなのである.

$ locale -a
C
POSIX
組み込み環境にありがち.