[課題] Terminalっぽいことを、してみたい。 私はxyzzyというEditorを愛用しています。xyzzyには、Editorからshellを操作する機能があります。 「KyoroTextにも、Shellモードが欲しいなぁ~」と考えていました。 ためしに実装してみたら、そこそこ動いたので簡単に紹介します。 [問題] Googleを多様して、以下のような問題を解決できました。 -A Androidで、CLIアプリを動作させめ方法は? -B cd した後の、現在参照しているフォルダを利用したい? [A] Androidで、CLIアプリを動作させる方法は? 自分以外のAndroidアプリを起動する場合、通常は、Intentを使用します。 「cd」「ls」dateといった。/system/bin配下にあるネイティブアプリを動作させるには、 どうすれば良いのでしょうか? Intentで実現できるのでしょうか? Runtimeクラス、ProcessBuilderクラスで実現できます。 細かな使い方は、Google先生に聞くと良いでしょう。 KyoroTextでは、以下のようなコードを書きました。 https://github.com/kyorohiro/KyoroHelloAndroid/tree/master/KyoroCommon/src/info/kyorohiro/helloworld/util/shell CLIAppKicker > > CLIAppKicker#start(String command) > startを呼ぶとCLIアプリを起動します。 [B] cd した後の、現在参照しているフォルダを利用したい? 「Aの問題」が解決しました。なので、「ls」使いたい時は、「CLIAppKicker#start("ls")」 とすれば、「ls」が呼べます。 しかし、うまくいかない場合があります。 「cd」です。 以下のようなシナリオを考えてみましょう。 1. "/" にいる。 2. cd mnt とする。 3. cd sdcard として、SDカード配下に移動したいとする。 1. CLIAppKicker#start("cd mnt") 2. CLIAppKicker#start("cd sdcard") のようなコードで実現できそうです。しかし、 子プロセスの情報は引き継がれません。 1. CLIAppKicker#start("cd mnt") ---> /mntい移動する。 2. CLIAppKicker#start("cd sdcard") --> /sdcardに移動する。 となり、思い通りの場所(/mnt/sdcard)に移動できません。 この問題は、CLIAppKicker#start("sh") とすることで解決できます。 KyoroTextでは、以下のようなコードを書きました。 https://github.com/kyorohiro/KyoroHelloAndroid/tree/master/KyoroCommon/src/info/kyorohiro/helloworld/util/shell CmdSession.java [気をつけた点] topコマンドなど、プロセスが動作し続けるアプリでは、「InputStream#available() == 0」の状態で、InputStream#read()すると、次へ進まなくります。データが入力されるまで待機するためです。 なので、必ず、「InputStream#available() > 0」ことを確認してから、InputStream#read()する ようにしました。 [次回] テスト自動化はできた!!どのくらいテストできたか定量的に客観的にしりたい!! どうすればよいでしょうか? 次回はEMMAというテストカバレッジツールを使用する方法について解説します。
2013年1月27日日曜日
KyoroText で使用されている技術 その11
2012年12月23日日曜日
KyoroText で使用されている技術 その5
[課題] 文字コードを自動認識させる。 KyoroTexでは、テキストデータを表示/編集するためのツールです。 このテキストデータの扱いの難しところとして、「どの言語」なのか、「どのPFで書かれた」ものか、「どのようなツール」で書かれたデータなのかによって、データ構成が異なります。 例えば、「EUCJP」というルールに従うと、「あ」は 0xA4A2 で表せますが、「SJIS」というルールだと、0x82A0 であらわせます。 テキストデーターを適切に読み込むには、どのようなルールで書かれたテキストデータなのかを、前もって知っている必要があります。 しかし、テキストデータには、どのルールで書かれたものなのかが記載されていません。 KyoroTextで、どのようにしてこのルールを判定しているのかを説明します。 [判定方法] 結論から書くと、jcharsetというライブラリを使用しています。「使っていますよ!」 だけだと物足りないので、文字コード(ルール)の判定する仕組みについて、さわりだけ説明します。 文字コードの判定方法として、以下のような方法が考えられます。 - a. テキストデータが、特定の文字コードのルールに沿ったものか確認する。 - b. テキストデータに、含まれるバイトデータの出現率から、適当な文字コードを推測する。 - c. テキストデータの、テキストの並びの出現率から、適当な文字コードを推測する。 と行ったものです。 例えば、日本語だと、改行のまえに、「。」があったり、英語表記と比較して、半角のスペースが少なかったりする。 ISO2022系の文字コードだと、文字の切り替えにESCが使用されると行った特徴を上手く利用して判定するのです。 KyoroTextでは、自前でこれらの判定モジュールを作成することはあきらめました。 KyoroTextで使用しているのは、Mozillaで使用されているchardatのJava版です。 [参考] jchardatのPSMについて解説できたらなと考えていたのですが、PSM(Parallel State Machine)の部分が上手く理解できなかったので、あきらめました。 もっとjchardatを知りたい方は、以下のページなどを参照してみてください。 - http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html - http://jchardet.sourceforge.net/ [次回] KyoroTextはでっかいデータをノータイムで表示できる事を実現したアプリです。 なので、KyoroTextで編集するデータはヒープに収まらないデータとなります。 メモリーに収まらないデータの一部を編集したい場合、どうすればよいでしょうか? 次回はKyoroTextで実現した解決方法について紹介します。
2012年12月13日木曜日
KyoroText で使用されている技術 その1
数十回に渡って、KyoroText で使用されている技術について、紹介していきたいと思います。 ※ androidとj2seで、自作Editorを作成する方法を紹介します。 以下ような内容を含んでいます。 - androidにて、InputConnectionより確定文字、未確定文字、キーイベントを取得する方法 - j2seにて、未確定文字、確定文字を取得する方法。 [はじめに] 私は今「Kyoro Text」というアプリを作成しています。その際に、「試行錯誤したこと」や、「得たノウハウ」をまとめていきたいと考えています。 当初、Text Editorという、文字の表示と編集するだけのアプリに、悪戦苦闘するとは、考えていませんでした。 皆さんも、たかだかEditor程度と思いでしょう。 たかだかEditorと言う認識で正しいのかも知れません。 間違いなのかもしれません。この判断をくだすための材料を提供したいと思います。 [進め方] この文章を読んで頂いている皆様は、多分、androidやJ2SEでEditorを作るのに必要なAPIだとか、その使い方だとかを知りたくてこの文章を読んでいるのではないでしょうか? 残念ながら, あなたのご期待に沿う事は出来ないかも知れません。 モチロン、apiの使い方にもついて、触れる事は多々あると思います。しかし、apiの使い方をメインに説明しようとは考えてません。 Editorを作成するにあたり、どのような課題があって、それをどのように克服したのかを説明します。 残念ながら、優れた対処方法はほとんどありませんが、試行錯誤の結果を物語として楽しんでいただけたらと思います。 [課題一覧] - Androidで、PC等で編集したテキストを表示するには、ヒープが足りない。 - .. - .. - .. [課題] Androidで、PC等で編集したテキストを表示するには、ヒープが足りない。 KyoroTextが対象としていた端末はLowSepcなものが有り。 使用可能なJavaヒープが少ないため、Javaヒープ上にデータをすべて読み込んでから表示する事が困難でした。 また、Fileから、データを読み込む速度も重要な要素です。 Fileからデータを読み込む速度は高機能を歌っている端末だからといって早いわけではなく。古い型のものの方が早かったりしました。 このため、 最新の端末なのにタカダカ数千キロバイト程度のテキストを読み込むのにカナリ待たされたりする事があるわけです。 これらの状況をふまえて、ユーザーにストレスを与えないように、即座に画面に表示して上げるようにする必要がありました [androidのメモリ] 本当に使えるメモリはそんなに少ないのか?という疑問から解決していきましょう。 端末には、数メガのヒープを確保してもありあまる程のようりょうがあります。 これを特別な方法で取得できないのでしょうか? 結論から言うとデキます。なので、この特殊な方法を使用するという手もあります。 簡単に紹介しましょう。 - malloc - MemoryFile - ByteBuffer.alllocateDirect 続く.. 中途半端なところで、ごめんなさい!! [PS] 来年初頭に、KyoroTextの安定版をだす予定です。 そこで、「KyoroTextを紹介するページをつらないとなぁ~」と考えました。 機能の紹介だけだと、平凡な感じがしました。 そこで、KyoroTextを作成するにあたり悪戦苦闘した事を、記事にすることにしまた。 この記事が第一回目となります。 たぶん何度も書き直します。
登録:
投稿 (Atom)
mbedtls dart の 開発を始めた web wasm ffi io flutter
C言語 で開発した機能を、Dart をターゲットとして、Web でも サーバーでも、そして Flutter でも使えるようにしたい。 そこで、mbedtls の 暗号化の部分を Dart 向けのPackageを作りながら、 実現方法を試行錯誤する事にした。 dart...
-
[課題] Low Memory Killer を意図的に発生させたい Androidには、ヒープが涸渇すると使われていないアプリをKillする機能があります。 この記事では、意図的にヒープを枯渇させて、この状態をつくる方法について説明します。 単純にヒープを大...
-
Dart の Native Extensions を利用して、 SDL を用いたマルチプラットフォームのゲーム開発環境を作れるか検証してみた。 結論からいくと、 「Mac 上で動作する SDL x Dart の アプリは動作させることが難しいよ」 と言うことです。 Wind...
-
Emscripten と OpenGLを使ってゲームを作ろうと思いたって、 まずは、SDL2の基本的な使い方を試していた。 しかし、今の所は、SDL 1系 の方が、良いと思いました。 SDL2があるのに、SDL1 を選ぶのはなぜか? # 201...