So-net無料ブログ作成

SDツールの土台作成 [Qt]

今回はSDカードツールの話にします。と言っても、このツールはあんまり必要じゃ無さげになってきたんですけどね・・。まあ、なんでもいいので取りかかっていきましょう。

*

まずは、プログラムを埋め込む枠を作るためにGUIから作成します。とりあえずは「ドラッグ&ドロップでSDカードのインポートフォルダにファイルをコピーする」と言うのをアプリの機能としたので、QTextEditのみを使って、そこへのドラッグ&ドロップで動作、動作状況はQTextEdit上にテキストで表示すると言う感じで対応しようと思います。・・って、だんだんやることの敷居が低くなってますね・・。

プロジェクト作成して、ウィンドウにQTextEditを貼り付けて、レイアウトをごにょごにょいじって、保存して、実行。

11022200.png
土台完成


ま、ここまでは、これまでやってきたことの焼き直しですね。カーソルが表示されていたので、readOnlyに設定したいのですが、NetWalker 上のQt Creatorでは、プロパティの編集ができないので、Qt Designer を起動して設定します。・・・、そう言えば、このソフト自体はMac向けを目指していますが、現状これの開発はNetWalker上で行ってます。NetWalkerだと、どこででも開発できるので・・。AndroidのSDKもARM向けが出ればいいんですけどね・・。

ま、それはさておき、「readOnly」のプロパティにチェックを入れて、Qt Creatorで再読み込みし、同プロパティを見てみましたが、反映されてません・・。でも、実行してみたら、カーソルは出てきませんでした。と言うことで、readOnlyにはなっている様です。う~ん、NetWalkerでは、Qt Creator上のDesignerの使用はやめましょうかね・・。

図に示すほどでもないですが、今、クラス構成は下記の様な感じにしようかと思っています。

11022201.png
単純


役割分担は下記の様にしましょう。

MainWindowClassメインウィンドウで、アプリの実行・終了の制御
QTextEditファイル・ディレクトリのドロップ場所及び、状況の表示
SdtoolMainディレクトリのチェックとかファイルのコピーとか実行全般


と言うことで、SdtoolMainと言うクラスの追加をしときます。ベースクラスは無しですね。


とまあ、同じようなことばかり繰り返してますが、つづく。






仮想実行環境の作成 [Android]

今週はAndroidの開発環境でもいじります。インストールを終えて、ほったらかしにしてたんですが、さて、実際にアプリを作るとなれば、何をすればいいんでしょうか・・? android developersの中をちらちら見ていましたが、「Hello, World」のチュートリアルがあったので、それからとっかかりましょうか。ところで、以前から思ってたんですが、"Hello, World"って、英語圏では自然なんですかねぇ・・? 日本語では「こんにちわ、世界」と言うのはおかしな感じなので、「みなさん、こんにちわ」くらいが自然ですかねぇ・・。と、そんな事はどうでもいいんですがね・・。

*

さて、チュートリアルを見たところ、最初にAVD(Android Virtual Device)を作成しましょうとなってます。が、なんかコマンドラインで作成する事になってますね・・。う〜んと思って英語版を見たところ、Eclipseから作成できる様な事が書かれています。日本語版の方は情報が古いのか・・? 仕方がないので、英語版を参考にする事にします。

チュートリアルに従って「Window」→「Android SDK and AVD Manager」を選択したところ、下記のダイアログが出ました・・・。

11021500.png
SDKの位置を設定しろとか


SDKの位置を設定してませんでしたかね?とPreferenceを確認したところ、ちゃんと設定していました。念のため「Apply」をクリック。再度、「Window」→「Android SDK and AVD Manager」を選択したところ、マネージャが立ち上がりました。

11021501.png
No AVD available


マネージャは「Virtual devices」が選択されている状態で、AVDが一つも無い様になっています。チュートリアルに従って「New...」をクリック!さらにダイアログが立ち上がりました。

各項目について、一応、ターゲットであるSmartiaを参考に下記の通りに設定します。

11021502.png
一応、Smartia仕様


詳細は次の様な感じ。

Name「SmartiaEmulator」と設定。空白を含んだところ、怒られたので、そこは詰めました。
Target「Android 2.1-update1 - API Level 7」と設定。SmartiaはAndroid 2.1なので・・。
SD Card2048MBで設定。何に使うのか分かりませんが、一応、Smartiaに2GBのカードを挿してるので・・。「File」の項目があるので、もしかしたら開発時には本物のSDカードを挿す必要があるのかも・・?「File」はディスクイメージを用意する必要があるのでしょうか??
Skin「WVGA800」を選択。画面サイズの様ですが、Smartiaは「800x480」の画面サイズなので、これを選択しました。
Hardwareデフォルトで「Abstracted LCD density」と「Max VM application heap size」が設定されていましたが、「New」を押して、Smartiaで搭載されているデバイスについて追加しておきました。「DPad」って何?とと思ったら電話の「テンキーパッド」の様です。これは、非サポート。設定内容はざっと下記の様な感じです。
Abstracted LCD density240
Max VM application heap size24
Camera supportyes
Maximum horizontal camera pixels2048
Maximum virtical camera pixels1536
Accelometeryes
SD Card supportyes
Audio playback supportyes
Audio recording supportyes
Device ram size384
Battery supportyes
GPS supportyes
Touch-screen supportyes


これらの設定で、「Create AVD」をクリック。ちょっと時間がかかりましたが、AVDが作成されました。

11021503.png
ちゃんと使えるかは不明。


ヒープサイズなど、多少気になるところはあるんですが、取りあえずこれを使う事にします。

つづく。




   

FOMAのSDカードの中身 [SD Tool]

私の携帯はSH903iと言う古い機種なのですが、親にも同じメーカーの携帯(SH902iSL)を持ってもらってます。親が使い方が分からない時に電話で聞いて来るのですが、同じ操作感じゃないと私も教えられないですからね・・。と言う感じなのですが、先日、PC上の画像を待ち受けにしたいと言い出しました・・・。ファイルのコピーが結構難点なんですよねぇ・・。「フォルダ」の概念がいまいち分かっていない様なので・・。と言う事で、FOMAで使用しているSDカードに簡単にファイルをコピーできるツールでも作りたいなぁと思いました。また、脱線しますが・・・。

さて、取扱説明書を見ると、FOMA(SH902iSL、SH903i)のSDの中身は下記の様な感じの様です。

BOOKブックリーダーフォルダ
DCIMxxxSHARP撮影静止画用フォルダ
xxxSH_UFユーザ作成フォルダ
MISCDPOF設定ファイル用フォルダ
SD_AUDIO音楽データ用フォルダ
SD_PIMPIMデータ(電話帳、スケジュール、ToDo、メール、テキストメモ、ブックマーク)用フォルダ
SD_VIDEOPRLxxx撮影動画用フォルダ
PRIVATEDOCOMODOCUMENTPUDxxxPDF対応ビューアフォルダ(SH903i以降?)
MMFILEボイスメモ、iモーションフォルダ
RINGERメロディファイル用フォルダ
STILLその他画像ファイル用フォルダ
TORUCAトルカフォルダ
TABLE管理情報フォルダ
SHARPDOCUMENTドキュメントビューアフォルダ(SH903i以降?)
IMPORTインポートフォルダ
VOICEボイスメモフォルダ(SH902iS以前用?)
SD_BINDSVC00001動画(以降可能コンテンツ)フォルダ
SVC00002iアプリデータフォルダ
SVC00003着うたフル用フォルダ(SH903i以降?)


「xxxSHARP」、「xxxSH_UF」については、「xxx」は100~999の3桁の半角数字だとのこと。他の「xxx」は記載が見当たりません・・。

今回は、画像のインポートがやりたいので、とりあえずは、ドラッグ&ドロップで「/PRIVATE/SHARP/IMPORT/」にファイルをコピーすると言う感じにしましょうか。

起動からのファイル待ちまでのシーケンスは下記の様な感じですかね。

11020900.png
シャープ端末の判定も必要かも・・。


大まかには、下記の様な実装項目がありますかね・・。

ドラッグ&ドロップ関係するクラスがいくつかある様ですが、QDropEventから見始めればいいですかね。
SDカード検出ディレクトリのドラッグ&ドロップで検出でいいと思ってますが、できたら、SDカードが挿された瞬間に検出したいですね。QFileSystemWatcherが関係ありそうな気がしますが、Mac側の動作も知っとく必要があるかも。
FOMAのSDカード判定あまり、いい案が浮かびませんが、「/PRIVATE/DOCOMO」の存在で判定しますか。「/PRIVATE/SHARP/IMPORT」もチェックする必要がありますね。QDir::exists()が使えそうですが、これって、staticじゃないですね・・。


そう言えば、PCも私と同じMacを使ってもらってます・・。なので、Mac上で動かす事を前提に考えていきたいと思います。でも、作るのはQtなので、徐々に汎用に持っていければいいかなぁ・・と言う感じで。

ちなみに、「手書きメモ」「バックアップツール」「Androidのアプリ開発」を中断させながらたらたらやってます・・。一応、メモっておきましょう。


つづく。






BackupControlクラスのメンバ関数仕様検討 [Qt]

大体の機能分担を決めたので、それに従って実装して行きたいと思います。BackupControlは以前作成したので、BackupMainも作成しておきます。こちらは、QThreadの派生クラスとします。

*

まずは、BackupControlに以前検討したメソッドを追加しようと思いましたが、自作のクラスは自分でソースを編集する必要がありそうですね・・。クラスエディタとかがあればいいのに。

さて、コードを書こうと思いましたが、よく考えたら引数とかを全く決めてませんでした。そこから始めないといけませんね。

addSourceDir()
引数QString &dir転送元ディレクトリ
戻り値intディレクトリ登録の成否。下記の値のいずれかを返す。
AddSrcSuccess追加成功
AddSrcDuplicate追加済みディレクトリ
AddSrcBackupProceededバックアップ中
AddSrcFail追加失敗
処理 引数で与えられたディレクトリを転送元ディレクトリとして追加する。追加失敗は、存在しないディレクトリ名の指定を想定。「AddSrcBackupProceeded」はUI的に発生しない様にする予定。


delSourceDir()
引数QString &dir削除対象ディレクトリ
戻り値intディレクトリ削除の成否。下記のいずれかを返す。
DelSrcSuccess削除成功
DelSrcBackupProceededバックアップ処理中
DelSrcFail削除失敗
処理 引数で指定されたディレクトリを転送元ディレクトリから削除する。削除失敗は、指定されたディレクトリが転送元として追加されていない場合を想定。「DelSrcBackupProceeded」はUI的に発生させないようにする予定。


backup()
引数なし
戻り値intバックアップ開始結果。下記のいずれかを返す。
BackupStartSuccessバックアップ開始成功
BackupStartNotSetSrcバックアップ元ディレクトリ未設定
BackupStartNotSetDestバックアップ先ディレクトリ未設定
BackupStartBackupProceededバックアップ中
BackupStartFailバックアップ開始失敗
処理 BackupMainに転送元ディレクトリリストと転送先ディレクトリを渡し、BackupMainの処理を開始する。バックアップ開始失敗はThread開始失敗を想定。「BackupStartBackupProceeded」はUI的に発生させないようにする予定。


setDestinationDir()
引数QString &dir転送先ディレクトリ
戻り値int転送先ディレクトリ設定結果。下記のいずれかを返す
SetDestSuccess転送先ディレクトリ設定成功
SetDestDuplicate設定済み転送先ディレクトリ
SetDestDuplicate設定済み転送先ディレクトリ
SetDestBackupProceededバックアップ中
SetDestFail転送先ディレクトリ設定失敗
処理 引数で指定されたフォルダを転送先フォルダとして設定する。設定失敗は指定されたフォルダが存在しない場合を想定。「SetDestBackupProceeded」はUI的に発生させない予定。


getSourceDirs()
引数なし
戻り値QStringList設定されている転送元ディレクトリのリスト
処理 設定されている転送元ディレクトリのリストをまとめて返す。


getDestinationDir()
引数なし
戻り値QString設定されている転送先ディレクトリ
処理 設定されている転送先ディレクトリを返す。何も設定されていない場合は、空文字列を返す(isEmpty()でtrueになる)。


stop()
引数なし
戻り値intバックアップ停止結果。下記を返す。
BackupStopSuccessバックアップ停止成功
BackupStopNotProceedバックアップ処理中でない
BackupStopFailバックアップ停止失敗
処理 実行中のバックアップ処理を停止させる。処理停止のフラグでも立てるか?そうすると、バックアップの実行中にフラグチェックの処理がいりますね。QThread::terminate()は使いません。


引数を参照渡しにするかポインタ渡しにするか悩みましたが、いくつかサイトを検索して、おおよそ下記の方針で使い分けることにしました。

  • ポインタ渡し - 引数を変更する可能性がある場合、NULLの引数を許容する場合
  • 参照渡し - 引数を変更しない場合、NULLの引数を許容しない場合


getSourceDirs() で、クラスのオブジェクトを返す時にどうするか悩みました。値で返すのか、ポインタで返すのか・・。自分で作ったクラスを返す時は注意する必要がある(コピーコンストラクタを作る?)が、Qtで用意されているクラスならそのまま値返しができそうな雰囲気です。ちょっと不安なんですが、まあ、今回は試しに値返しにしてみることにしました。何か不具合が出たら、それはそれでいい勉強になるでしょう。今回、色々悩んでて、クラスに対する代入演算子や初期化演算子の動きがよくわかってい無かったことが判明しましたね・・。理解できたんかなぁ・・。

スレッド実行中の処理について、排他処理を行う必要がありますね・・。うまくいくんかな・・。やり方が間違っているか・・?


さて、以下は signal です。とりあえずは、QThreadが元から持っているsignalは出てくるとして、他に何かいりますかね?と思ったら、以前検討してました。全部いるかな・・?

finished()
引数なし
戻り値なし
処理 スレッドの実行完了時に発生。コピー処理終了のsignalとして利用可能かな。


started()
引数なし
戻り値なし
処理 スレッドの実行開始時に発生。バックアップ開始のシグナルとして利用可能かな。


terminated()
引数なし
戻り値なし
処理 スレッドがterminateされたときに発生。QThread::terminate()を使う予定はないので、これは発生しない想定。なので、利用しない。


stopped()
引数なし
戻り値なし
処理 バックアップ停止完了時に発生。


startBackupFile()
引数QString &dirバックアップ元ファイルフルパス
戻り値なし
処理 1ファイルのバックアップ開始時に発生。引数はバックアップファイルのフルパス。


finishBackupFile()
引数QString &dirバックアップ元ファイルフルパス
戻り値なし
処理 1ファイルのバックアップ完了時に発生。引数はバックアップ元ファイルのフルパス。


今、思いついた関数仕様はこんなところでしょうか。実装する前に、ちゃんと動作を検討しとく必要がありますね・・。


つづく。


【参考】
参照とポインタ - Gulf of St.Lawrence
ポインタと参照の使い分け - thinkin’ in the brain
オブジェクトを返す関数 - C++ Builder / Turbo C++ 質問の木
C++編(言語解説) 第16章 コピーコンストラクタ
C++ クラス設計に関するノート - オブジェクトの広場
C++ で関数から object をどう返すか - KBDAHOLIC - やぬすさんとこ
C++ クラス設計に関するノート
コピーコンストラクタ - C++入門




   

ブログを作る(無料) powered by So-netブログ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。