アクセスカウンタ

プロフィール

ブログ名
KazHatブログ
ブログ紹介
Palmwareを気の向くまま作っています。
このブログでは、最近購入したSheevaPlug+について書いていこうと思います。Linuxも初めての初心者に使えるかどうかわかりませんが、先人の知恵を借りながらチャレンジしていきます。
PICはじめました。最近は、ロビのことしか書いていませんね。
zoom RSS

Windows10の調子がおかしい

2018/01/25 22:39

先日HDDを4TBのものに変えたお話をしました。

しかし、その後もWindows10の調子が良くありませんでした。

 

その症状は、何かするときの反応が非常に遅くなるというものです。

例えば、Windowsメニューボタンを押してポップアップ表示されるメニューが出るまでに非常に時間がかかるとか、ブラウザのChromeを使っている時、応答がなかったりというものです。このChromeの反応は、しばらく待つと回復する場合も、回復しない場合もありました。

 

タスクマネージャーを見ると、なぜか頻繁にディスクにアクセスが入って、100%近くなってたりしています。その時、アクセスしていそうなソフトも動かしていないので、どう対処したらよいかわかりませんでした。

そういう場合、大抵、メモリの使用率が、搭載メモリ目一杯使っていたりしている場合もあり、メモリスワップが生じて、HDDへアクセスが増えているせいかとも思っていました。

ただ、原因となるものが特定できません。

 

そうなったら、再起動が大体一番よい対処方法なので、そうしていたのですが、再起動自体もなぜか非常に時間がかかるようになってしまっていました。大体数分はかかる感じでした。

 

新しいHDDは、従来のものより回転数が落ちたものだったので、それが原因かとも思っていました。そろそろSSDの買い時かもとも思って、物色を始めたところでもありました。

 

数日前、ちょっとしたきっかけから、私のWindows10のバージョンが何か確認しようと思い、設定を開いたら、Fall Creators Update バージョン1709ができる状態になっていました。つまり、まだ、古いバージョンのままだったのです。特にバージョンアップを嫌っていたわけでもないので、早速更新OKとしました。ところが、これが全然進まない、おまけに、最終的に失敗したというメッセージで終わっていました。何度かトライしたのですが、一向に更新できる兆しがありません。

 

ネットで調べると、トラブルシューティングツールがあるとのこと。

https://aka.ms/wudiag(Microsoft社サイト)

上記のサイトを開いて、ダウンロードしたファイルを起動してトラブルシューティングを行いました。

Windows10でWindows Updateに失敗する場合の改善方法というサイトの情報を参考に作業は行いました。

 

それが終わって、念のため、再起動して、再度更新を試みたところ、新しいFall Creators Updateのインストールができるようになりました。

 

ネットの情報だと、HDD環境でも1〜2時間くらいでできたような情報でしたが、私の環境では、5時間たっても終わりませんでした。でも、何とかOSのバージョンアップが終わることができ、無事Windows10のバージョンアップができました。

 

そうしたら、反応は昔のような感じに戻りました。

HDDの使用率が意味もなく100%に行くこともなく、なぜかCPUの使用率が低かったのですが、今は、HDDの使用率より高い状態になる感じで、ちゃんと動いている感じがします。

 

Windowsメニューもマウスクリックしたらさっと表示されるようになり、おそらく、更新に失敗していた状態のままで、何か変なプロセスが動いていたのが原因だったのだろうと推定しました。

 

HDDのパフォーマンスのせいと思っていたのは誤解だったようです。でもSDDの導入はしたいと思っています。いつになるのか。

 

このOSのバージョンアップは吉となりました。でも、ここでSheevaPlugからファイルが見えなくなるという過去もあったような騒動に個人的にはなりました。

 

最初ファイルの共有の設定のせいかなと思い、プロパティの共有で設定しましたが、なぜかSheevaPlug+からアクセスできません。 そこにかまっている時間がなかったので、2〜3日そのままにしてしまいました。

 

確か昔も何かあったような記憶がありますが、どうしたのか思い出せません。

自分の記事を探したところ、見つかりました。

2016/8/11の記事にSheevaPlug+からWindows10のファイルアクセスというのがありました。

そこにネットワークと共有センターで設定していることがわかりました。

 

フォルダのプロパティ→共有→パスワード保護の欄で、ネットワークと共有センターを開き、すべてのネットワーク所で、パスワード保護共有をパスワード保護共有を無効にするを選択すると、ちゃんとSheevaPlug+からアクセスできるようになりました。

 

たった1年半ほど前のことなのに、そこに情報なしではたどり着けないとは。。。。

 

つまらないことですが、また将来同じようなことが起こるかもしれませんので、公開しておきたいと思います。

 

では、また。

記事へブログ気持玉 / トラックバック / コメント


Android アプリの画面の切り替えにアニメーション効果を

2018/01/21 21:05

アニメーションでAndroidに独創的な画面エフェクトをという@ITの記事を見ながら、画面遷移のアニメーション化にチャレンジしようとしています。

 

ソースコードも提供されているので、それで勉強しようと思いました。

 

ダウンロードしたファイルは、zipファイルだったので、展開して、AndroidStudioで開いてみましたが、どうもいつもの感じと違います。コンパイルのボタンも有効になりません。

何となく、読み込み方が悪いのかなと思いましたが、どうも違うみたいです。

 

記事の日付が2010年となっていたので、たぶんEclipse用のものなのだろうと目星をつけて、調べました。importすれば良いようです。今のAndroid StudioではGradleというものをベースにしているので、それに移行する必要があるということ。

[File] > [New] > [Import Project]、または、[Welcome] 画面で [Import project (Eclipse ADT, Gradle, etc.)] をクリックで読み込みます。

指定するフォルダは、AndroidManifest.xml ファイルが存在するフォルダということなので、ダウンロードして展開した最上位のフォルダを選べばよさそうです。

移行先のフォルダを指定して、進めると、変換が行われ、import-summary.txtというメッセージが表示されて完了したようです。

 

ただ、この状態では、私の環境のせいかエラーが生じているという状態でした。Sync gradleを行う必要がありました。それが終わると、いつものような階層構造で、Android> app以下にファイルが生成されました。

 

コンパイルのボタンも有効になっています。そこで、早速コンパイルしてみます。

 

問題なく、コンパイルが完了して、本体で起動できました。しかし、残念ながら、動画で示されていたようなアニメーション表示になりませんでした。正確には、TranslateとDialogだけは正常動作のように見えました。

このサンプルでは、Alpha、Rotate、Scale、Translate、Dialogの5種類のアニメーションで、画面効果が現れるはずですが、Dialogはその通りの小さなウインドウが表示されましたが、それ以外は、全部Translateと同じ表示になってしました。

 

記事では、Android 2.3という単語もありましたので、現在の私がターゲットとしているAndroid 6とかのレベルでは機能しないのかもしれません。

 

もう少し調べたいと思います。

 

res > anim の下に、画面遷移時のアニメーションを定義するXMLファイルがあります。

その1つを開いたところ、エラーを示す赤い波線が引かれていた個所がありました。

それは、以下です。translate_open_exit.xmlを開いています。

android:interpolator="@android:anim/overshoot_interpolator"

 

カーソルをこの行に持っていくと、anim/overshoot_interpolatorを使うには、API Level 4が必要とあり、現在は、min 1となっているとのメッセージが現れました。このため、下位バージョンへ対応させるため、アニメーション表示ができなくなっていたのかと思いました。

さらに情報を読むと、下位バージョンのサポートが不要なら、build.gradleかAndroidManifest.xmlにminSdkVersionを設定すれば良いとも書かれています。

 

以前に作ったアプリのソースを見ると、私の環境では、このminSdkVersionは、build.gradle (Module:app)に定義されていましたので、それにならいたいと思います。

 

defaultConfig内には、appicationIdしか記載ありませんでしたので、別のアプリソースを参考に

minSdkVersion 23

という行を追加してみました。以下のようなSyncが必要とメッセージが現れたので、Sync Nowをしました。

image

 

そして、再度コンパイルして、動作を実機で見てみます。

 

これなら大丈夫かもと思いましたが、動作は変わりませんでした。残念。でも、期待している部分ではありませんが、見た目は変わりました。フォントが小さくなってしまいました。これは、私のAndroidがフルHDの機種だからかもしれません。

なかなかうまくいきません。

 

私がアニメーションとして使いたかったのは、前後のメモへ移動するために左右にスワイプする時なので、Translateが動作するなら、それでも構わないのです。

 

今回勉強できた重要なポイントは、以下の4つに対応した設定が必要ということ。

名前 説明
android:activityOpenEnterAnimation 呼び出し先Activityが開くときのアニメーション
android:activityOpenExitAnimation 呼び出し元Activityが閉じるときのアニメーション
android:activityCloseEnterAnimation 呼び出し元Activityに戻るときのアニメーション
android:activityCloseExitAnimation 呼び出し先Activityが閉じるときのアニメーション

表1 アニメーション定義名と説明

これらをxmlでそれぞれ定義するのが第一です。

 

例えば、最初のactivityOpenEnterというものは、次の表示をどうするかというもので、画面の右から左へ動いて、最後に所定の位置に表示させるといった定義を行います。

それには4つのパラメータがあり、以下のようになっています。(ファイル名:translate_open_enter.xml)

android:duration="1000"
android:interpolator="@android:anim/overshoot_interpolator"
android:fromXDelta="100%"
android:toXDelta="0%"

意味するところは、durationでアニメーションの時間をms単位で指定します。

interpolatorは、補間の意味ですから、おまじないのようにこのまま記載で良いようです。

 

fromXDeltaとtoXDeltaは、X軸で、どこからどこまでに画面を表示するかという意味になるかと思います。

最初の100%だと、ちょうど、画面の右側に表示するということになり、実際には、画面に表示されない状態になりますが、そこが開始状態です。そして、最後の0%で、ぴったり画面の左端に表示するものを表示する、すなわち、通常通りの表示にするわけです。

 

その最初と最後の状態をdurationで指定した1000ms、つまり1秒で、画面をinterpolatorで指定されたように、表示するということになり、見た目では、右から左へ画面が動く形となります。

 

同様に、activityOpenExit (ファイル名:translate_open_exit.xml)は、今表示している画面をどのように消すかという定義になります。

android:fromXDelta="0%"
android:toXDelta="-100%"

 

サンプルでは、上記のようになっており、通常の表示状態から、-100%の指定で、画面の左側に完全に見えなくなるという定義となります。

これら2つを同時に行うことで、今の画面と次の画面が、右から左へスクロールしながら変わっていくという動作になるようです。

 

上表の4つにそれぞれxmlファイルを用意し、それをstyles.xmlで、どのファイルがどの定義かを設定していました。以下のような感じです。

<style name="Translate.Effect" parent="android:Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/translate_open_enter</item>
<item name="android:activityOpenExitAnimation">@anim/translate_open_exit</item>
<item name="android:activityCloseEnterAnimation">@anim/translate_close_enter</item>
<item name="android:activityCloseExitAnimation">@anim/translate_close_exit</item>
</style>

そして、このstyles.xmlをthemes.xmlで、以下のように指定していました。

<style name="TranslateEffect" parent="android:Theme">
<item name="android:windowAnimationStyle">@style/Translate.Effect</item>
</style>

 

最後に、AndroidManifest.xmlで、定義したテーマを指定しています。

<activity android:name="TranslateAnimationExample" android:theme="@style/TranslateEffect" />
<activity android:name="TranslateAnimationExample2" android:theme="@style/TranslateEffect" />

このTranslateAnimationExampleは、対象のactivityになります。移行先がTranslateAnimationExample2です。同じテーマを使用しているようです。TranslateAnimationExample2からは、戻る方向にactivityCloseEnterとactivityCloseExitが使用されるということのようです。

 

それならと、MemoVへ導入しようと試みました。しかし、うまくいきません。タイトルバーがスクロールで隠れるようにするため、既にAppTheme.NoActionBarというテーマを設定しており、上述のアニメーションのテーマと同時設定のやり方がわからなかったからです。

 

しばらく悩みましたが、Sytleだけ設定して、それをoverridePendingTransition()というものを使って指定できるという情報を見つけました。

 

上述のアニメーションの定義ファイルをプログラム内から以下のように呼び出します。

overridePendingTransition(R.anim.translate_open_enter, R.anim.translate_open_exit);

2つの引数には、移行先のactivityのアニメーション設定と、消すactivityのアニメーション設定を指定します。

これを

startActivity(intent);

の直後に置くだけです。

 

こうしたら、style.xmlに設定することなく、期待値通りうまくアニメーションしました。

 

今までは、前後のメモを表示する時の移行画面が同じでした。つまり、右スワイプも、左スワイプもデフォルトのアニメーションだったので、右スワイプする時、前のメモを見る時の表示に違和感がありましたが、これで解消です。

 

まだ、MemoVの改善点はあるのですが、今回は、ここまで。

記事へブログ気持玉 / トラックバック / コメント


MemoVをPalmの時のように運用しよう

2018/01/10 22:26

古い話で恐縮ですが、Palmを使用していた時、PalmDesktopというWindows PC上で動作するコンパニオンのソフトがありました。Palmは、ネットに接続されていませんでしたが、PalmDesktopによりPCとやりとりができ、データは同期されていました。それにより、メモ帳のデータは、PC上からも、Palm上からもアクセスして、編集ができ、適切に同期処理されて、データの整合性がとれるようになっていました。

小さなモバイルデバイス上でのデータ入力は、中々面倒で時間がかかりますので、できればPC上で行いたいというのは、Androidでも同じだと思っています。

 

Androidは、常にネットと接続されているので、クラウドのファイルと同期させることが行われていて、Evernoteと言ったアプリが提供されているのは、皆さまご存知の通りです。

 

今回作成したMemoVは、そのPalmのメモ帳にできるだけ近い使用感を持たせたつもりですが、まだできていないのが、PCとの同期、もしくはPCからもメモ帳データへアクセスという点です。

MemoVは、PCとは独立したファイルをAndroid上に持っている状態ですが、PCとは、同期するようなソフトがなく、それを作るほどの力量もないので、どうしたらよいかと考えていました。

 

私が持っているメモデータは、約640件、650Kバイトというサイズあります。昨今のストレージ容量からみると、大した量ではありませんね。フリーのクラウドストレージでも数GBのサイズが提供されますから、それを利用しないという話はありませんよね。

 

MemoVは、あるディレクトリの下に個々のメモをテキストファイルの形で持っているだけなので、これらをクラウドのストレージにアップロードすれば、PCからでもそれらのファイルにアクセスできるはずなので、その方法を取ることを考えました。

 

フリーで提供されているストレージは色々ありますが、Androidを使っていますから、Google Driveがよさげな気がしました。

 

では、早速試してみましょう。

 

  1. Google Driveのマイドライブ(My Drive)内に、MemoDataというフォルダを作りました。
    C:\Users\(ユーザ名)\Google ドライブ というフォルダがマイドライブに相当するようです。エクスプローラを使って、ファイル操作するのが簡単だと思いますが、ブラウザからでもアクセスできます。
  2. このMemoDataフォルダにメモ帳データとなるテキストファイルを格納します。
    私は、以前に作成したPalmのデータベースから変換したテキストファイル群があるので、それを入れました。
    1点注意しないといけないのは、MemoVは、フォルダ直下にファイルを格納するのではなく、カテゴリを示すフォルダ内のテキストファイルをメモデータと認識するということです。
    つまり、MemoDataの直下には、メモカテゴリとなるフォルダがあり、そのフォルダ内に個々のテキストファイルがある形にすることです。
  3. 次に、特定のユーザー(自分自身ですけど)とアイテム共有の設定のため、ブラウザ上のMemoDataフォルダ上で、マウスの右クリックをして、リンクを知っている全員が編集可という状態にしました。

ファイルの準備は、以上で終わりです。

 

今度は、Android側からGoogleドライブにアクセスできるようにしないといけません。ただGoogleドライブへアクセスすることは、Googleアプリのドライブでできますが、Android上のファイルは独立しながら、同期を取るという状態にしなければなりません。

色々と調べて、FolderSyncというアプリを利用することにしました。

 

アプリ起動後、ホーム→アカウント→+ボタン を押すと、以下のような画面が表示されました。

image

いくつかのアカウントの選択肢がありますが、今回は、Google Driveを選択しました。

image

指示に従って、適当な名前を記入、アカウント認証を行います。Googleのページに行くので、認証を許可をしました。

そうすると、アプリに戻って来るので、保存して、完了となりました。

これで、AndroidからGoogle ドライブにアクセスできるようになります。

 

次に、ホームに戻って、同期フォルダ→+ボタン を押して、同期フォルダの設定を行います。

 

固有の名前に適当な名前を記入

 

同期フォルダの設定します。

リモートフォルダは、そこをタップすると、Googleドライブのマイドライブ下のフォルダが表示されるので、適切なフォルダを選択します。私の場合、先ほど作ったMemoDataになります。

 

ローカルフォルダ(Android上)も同様に、タップして、SDカード上のフォルダを指定します。

新規に指定したい場合、+ボタン(画面上部のメニューバー上にあるもの。)を押して、新規フォルダを作ります。そのフォルダを選択すると、そのフォルダが開かれます。その後、右下の+ボタンを押すと、同期フォルダとして設定されるようです。

 

なお、アカウントは、1つしか設定していないので、デフォルトでGoogleDriveとなっていました。多分、複数のアカウントを設定していると、その中から選ぶことになるでしょう。

同期タイプは、双方向同期にしました。

 

最終的に、以下のような感じに設定しました。

image

保存を押して、完了です。

 

上記では説明しませんでしたが、同期フォルダ追加の画面の下部には、スケジュールと、同期オプションなどの枠があり、必要に応じて設定できます。

私の場合、定期的に双方向同期させたいので、スケジュールされた同期を使用をOnにして、6時間ごと同期という設定にしてみました。

 

同期オプションでは、デフォルト状態でOnになっていましたが、サブフォルダの同期、隠しファイルの同期、削除を同期の3つをOn。また、古いファイルをいつでも上書き、競合した場合の動作は、古いものを上書きにしてみました。この辺の設定はお好みで。

image

 

その下の接続は、wifiを使用がデフォルトとなっておりました。家の外では同期しませんが、無駄な通信はしないのでそのまま。

 

全部の設定を終えたら、保存を押すと完了です。

 

image

まだ、Android上には、メモの格納ディレクトリは作りましたが、ファイルはないので、最初は、強制的に同期ボタンを押して同期させます。

 

私の場合、ファイル数=メモ数 600超ありましたが、サイズは、全部でも2MB程度なので、すぐにでも完了するのかなと思っていましたが、それなりに数分?かかりました。なお、同期ステータスの画面を見ると、状況は確認できます。

 

同期が終われば、完了です。

 

これで、MemoVを起動して、データフォルダを先ほど設定したローカルフォルダ名を入力すると、おそらく、アップロードしたテキストファイルの数だけ、メモができて閲覧できることと思います。

 

ただ、私が最初に同期した後、MemoVを開きましたが、メモが表示されない状況に陥りました。最初、プログラムのバグか何かかと思って、困ったことになったな思いました。 もちろん、Android上にはファイルがダウンロードされているのを確認はしています。

 

何度か、試しているうちに、MemoVで表示できるようになったので、アプリの問題ではなさそうという結論になりました。何度か試しているというのは、単にアプリを起動していただけではなく、プログラムを変更して、どこまで動作しているのかをメッセージを表示するようなデバッグ作業をやっていたのですけど、原因となりそうなバグは見つかりませんでしたということです。

 

少し、すっきりしませんが、最初のダウンロード後、MemoVがファイルを認識できるまで、そんなこともあると思って、何度かトライしていただけると嬉しいです。

 

実際にMemoV上で、メモを作成したり、編集したりした後、同期を取れば、PC上から、対象のファイルが更新していることは確認できました。もちろん、反対方向もOKです。

 

 

今回、Googleドライブを介して、PCからもAndroidからもメモファイルにアクセスして編集ができるように設定できました。FolderSyncは最短6時間おきにしか同期できませんが、Palmと同様に、強制同期を行えば、常にGoogleドライブとAndroid上のメモを常に同期とっての取り扱いができるようになりました。

 

これで、今回の問題は解決できました。めでたし、めでたしということで、新年最初の更新を終わらせたいと思います。

 

なお、MemoVアプリは、今回バグ修正と操作性アップのため、バージョンアップしています。

 

ではまた。

記事へブログ気持玉 / トラックバック / コメント


MemoVの使い方

2017/12/08 22:12

今回は、MemoVのもう少し細かいところの使い方を紹介します。

 

使い方詳細

 

タイトルリストの表示順は、変更することができます。

移動したいメモのタイトル部分をドラッグして、必要な場所に移動してみてください。

2017-12-03-12-33-30

先日5つのメモを作りましたが、上記は、その4番目のメモを2番目に移動した後の並びをキャプチャしたものとなっています。通し番号は、自動的に変わります。

なお、これは、あとで説明する並び順をマニュアルにしている場合に有効です。

 

設定

タイトルバー右端の縦に3点の所をタップして、Settingを選んでください。

2017-12-03-12-36-512017-12-03-12-37-31

ここで各種ができます。

  1. メモデータの格納場所:これは、最初に起動したときに指定されたメモデータの保管場所を示しています。もし、場所を変更したい場合は、ここに新しい場所を入力すると、変更が可能です。
  2. メモタイトルの並び順:3種類の並び替えの方法が選択できます。
    マニュアルは、デフォルトで選択されており、自由にユーザがメモの並びを変更できます。
    名前順は、その名の通り、タイトルを名前順に自動的に並び替えます。
    日付順は、メモを修正した日付を目印に並び替えを行います。
    なお、ソート方向は、昇順、降順が選べますので、ご自由に。
    Tips:マニュアルソートの情報は、名前順、日付順とは関係なく保持しています。そのため、マニュアルで並び替えをした後、一度、名前順の表示にしても、マニュアルに再度変更すると、元の並び替えに戻ります。
  3. 等幅フォント:フォントを等幅フォントにします。私の期待値は、漢字フォントが英数字の2倍の幅になっていることでしたが、現在のフォントは、1:2でないようなので、ご注意を。良い方法がないか研究中です。
    等幅になっていることを前提に、例えば表を作っている場合を想定していました。
  4. プライベートメモ表示:プライベートメモを表示するかどうかを指定するものです。
    プライベート属性を各メモに持たせることを検討しておりますが、まだ実装されていません。

設定後、CLOSEもしくは、左矢印ボタンを押すと、設定完了します。

 

例えば、並び順を名前順に変更すると、以下のようになります。これも例の5つのメモを入力した時の状態のままで行っています。

2017-12-03-12-49-06

 

メモの削除方法

メモを削除する方法は、2つあります。

  1. タイトル画面で削除したいものを左にスワイプする方法
    スワイプすると、以下のようなメッセージが出ます。YESかNOを押して下さい。 
    2017-12-03-12-51-28
  2. メモ内容を表示する画面で、右上のメニューから行う方法
    メニュー画面のDeleteを選択すると、確認画面となりますので、そこでOKを押して下さい。
    2017-12-03-12-53-42 2017-12-03-12-53-00

 

カテゴリ

メモがたくさんになってきたら、カテゴリ分けをしてみてもよいかもしれません。

タイトル画面の中央、右に下向きの三角マークがあるカテゴリ表示部をタップしてみてください。

2017-12-03-13-13-51

このような表示になります。今は、AllとUnfiled、それとEdit Categories...という3つがあるのがわかります。

 

初期状態では、特にカテゴリを考えていませんでしたので、ここまでに作った5つのメモはすべてUnfiledに入っていることになっています。

この状態では、AllでもUnfiledでも、タイトルの表示は変わらないことがわかると思います。

 

Unfiledを選んで(タップして)見ると、以下のようになり、Allの時の表示と変わっていないことがわかると思います。

2017-12-03-13-16-48

 

今回は、カテゴリ分けをしていくという話ですから、Edit Categoriesを選択します。

すると、画面が切り替わって、以下のようになります。

2017-12-03-13-18-26

カテゴリとして、まだ、Unfiledしかないことがわかります。

新規のカテゴリを作るには、画面下部にあるNewボタンを押します。

2017-12-03-13-19-44

このような画面になりますので、適当な名称を入力してYESを押して下さい。

新しいカテゴリができます。

ここでは、試しに、新しいカテゴリという名称にしてYESを押してみました。

2017-12-03-13-21-31

カテゴリが2つに増えたことがわかります。同様にいくつでもカテゴリは増やせますが、10個程度に抑えておいた方が良いように思います。その位であれば、カテゴリリストが画面1画面に収まるので、選択する時など、使い勝手もよいですし、管理もしやすいと思うからです。

 

なお、既にあるカテゴリ名の所をタップすると、名称変更、削除ができるウインドウが出てきます。

必要に応じてお使いください。

 

タイトル画面に戻って、カテゴリ選択の所をタップすると、追加したカテゴリが増えていることがわかると思います。

2017-12-03-13-24-32

まだ、新しいカテゴリには、メモが1つもないので、選択してもタイトル画面には、何も表示されません。以下の通りです。

2017-12-03-13-25-40

 

さて、ここで、一度、Allまたは、Unfiledを押して、適当なメモをタップして、内容を表示させてください。

2017-12-03-13-27-01

これは、5番目のメモを開いて、カテゴリ選択部をタップした時の状態です。

ここで、新しいカテゴリを選ぶと、このメモは、その選択したカテゴリに移動します。

2017-12-03-13-28-36

Unfiledから新しいカテゴリに移動しました。

 

タイトル画面に戻ると、新しいカテゴリというカテゴリに、移動したメモのタイトルが表示されました。さきほどは空だったのと違いはわかるでしょうか。

2017-12-03-13-29-24

カテゴリをUnfiledにすると、4つのメモタイトルが、Allにすると、5つのメモ全部のタイトルが表示されます。

 

メモ閲覧

タイトルリストで、適当なメモを選んでタップすると、メモ閲覧状態で開くことはすでに説明しました。

その画面で、左右にスライドさせると、前後のメモへ移動します。

 

検索

検索には、2つの種類があります。

メモタイトルリストでの検索と、メモ閲覧画面での検索です。

どちらも、タイトルバーにある検索ボタン、虫メガネのアイコンをタップすると、検索文字を入力できる入力窓が開くので、そこに検索したい文字列を入力してください。

 

メモタイトルリストでの検索では、選択しているカテゴリ内のメモに対して検索を実行し、その結果を表示します。複数のメモで見つかれば、全部表示します。その時、検索文字を含む文を一部表示します。また、それをタップすると、そのメモが表示され、全文を見ることができるようになります。その時、検索文字は、ハイライトされているので、簡単に探している部分を見つけることができると思います。

ほかのメモの検索結果も、一旦、左矢印のボタンを押して、検索結果表示画面に戻れば、たどることができます。

 

メモ閲覧画面での検索では、表示しているメモ内での検索になります。見つけた文字すべてをハイライトするので、すぐにわかると思います。

 

拡大・縮小

1つ大事なことを忘れていました。タイトル画面でも、メモの内容を表示している画面でも、ピンチアウト、ピンチインで、文字の拡大、縮小が行えます。

 

 

今回は、ここまでにします。

実際に使っていただければ、そんなに奇をてらった動作にはしていないので、わかると思っています。でも、もし、わかりにくい部分があれば、ご連絡ください。

記事へブログ気持玉 / トラックバック / コメント


初めてのAndroidアプリMemoVリリースしてみました

2017/12/03 17:13

ご無沙汰しております。しばらく更新もできていませんでした。ようやく公開してもよい形になりました。何のことかって、タイトルにあるように、初めてのAndroidアプリが出来上がりました。まだ、改良の余地はありますが、基本的な動作としてデバッグは完了しましたので、使って問題ないと思われるレベルになったかと思っています。

 

少し前にPalmのデータ移行の話を書きました。

予定表はAndroidに移行できましたが、Palmのメモ帳データをAndroidへに書いたように、テキストファイルで、641件のメモファイルができましたが、文字コードがShift JISだったりして、いい感じのアプリがなく、何とかしようと思っていたのでした。Lesser Padはいい感じの所まで行っているのですが、検索ができないとか、文字コードがSJISに対応していないとか今一歩でした。
私的には、Palmのようにカテゴリをまたがって表示させるという機能は、なかなかすぐれていると思っているのですけど、そういうものもうまく見つけることができませんでした。

 

それなら、しばらくソフトも作っていなかったので、作ってみようと考えてAndroid Studioなんぞに手を出し始めた訳でした。

 

なにぶんjavaなんぞに触ったこともなかったのですが、今のIDEの支援機構に助けられ、また、先人たちの情報もネットにあふれていましたので、何とか形にできたわけです。Androidもだいぶバージョンを重ねているので、ネットの情報も、新旧いろいろ、玉石混交で苦労もありましたけど。

 

さて、リリースしたアプリについて、少し説明したいと思います。Playストアでは、MemoVで検索してみてください。

アプリの紹介のところに書きましたが、PalmのメモをベースにAndroidの作法も取り入れて構成しました。

 

以下は、起動から、使用するまでを画面キャプチャを取りながら説明したものなので、ご参考にして下さい。

 

起動

初めての起動時は、SDカードにアクセスする許可をもらうため、メッセージが出ます。

2017-12-03-12-00-52

許可しないと、以下のメッセージを出してアプリ終了してしまいます。

2017-12-03-12-02-57

許可しなかった後、再度実行すると、まず、以下のメッセージが出ます。

2017-12-03-12-03-40

OK押すと、初めて起動した時と同じ以下の表示が出ますので、許可してください。

2017-12-03-12-00-52

 

許可すると、メモのデータを格納する場所の設定を聞いてきます。

2017-12-03-12-09-57

デフォルトでは、Documentsとなっていますが、お好みで、変更してください。

CANCELを押すと、アプリが使えない旨表示して、アプリは終了となります。

2017-12-03-12-11-13

YESを押すと、確認メッセージが出ます。

2017-12-03-12-12-51

ここで、YESを押して進めてください。もし、名称を間違った時などは、NOを押すと、メモデータ格納場所設定へ戻ります。

 

そうすると、初期画面として以下の表示となります。

2017-12-03-12-06-34

これ以降は、この画面がメイン画面として、表示されることになります。

画面上にカテゴリ、検索ボタン、その他メニューが見えます。

カテゴリは、初期状態でAllとなっています。

詳細は、あとで。

 

使い方

メモを作成する時は、右下の+ボタンを押して下さい。

すると、以下のような画面が現れます。

2017-12-03-12-16-47

ここで、自由にメモを記入してください。

 

画面上部のカテゴリの名称がUnfiledになっていることにお気づきでしょうか?

最初の画面で、Allになっている時に、+を押すと、Unfiledになります。

これは、カテゴリを示しており、複数のメモをカテゴリごとに分けて管理することができます。

 

以下のような入力をしてみました。

2017-12-03-12-24-18

メモを書き終えたら、タイトルバーの左はしの左矢印を押すと、最初の画面=メモタイトル画面に戻ります。

2017-12-03-12-26-21

こんな感じに、メモの1行目がタイトルとして、リスト化されていきます。

 

以下は、5つメモを作ってみた後の状態です。

2017-12-03-12-31-52

既に作成したメモを見たいときは、そのタイトルをタップします。

1つ目のメモをタップしてみました。キャプチャでは1/6となっていますが、5つしかメモがなければ、1/5になります。

2017-12-03-13-06-04

最初に作っていた時と、少し表示が変わっています。色が少し薄くなっています。

これは閲覧モードの状態を表しています。右下のアイコンを見ると、最初は、鉛筆に斜め線が入っていましたが、こちらでは、鉛筆アイコンになっています。

もし、編集した時は、このアイコンを押して編集モードに変更してください。色と、アイコンの表示が変わると思います。

 

以上で、基本的な使い方は、終わりです。

 

とりあえず、今回は、ここまで。

記事へブログ気持玉 / トラックバック / コメント


Windows10に4TBハードディスク導入

2017/10/29 21:19

ここ最近は、Androidのプログラムに時間を取られ、更新も滞っておりますが、もう少ししたら何をしているのか公開したいと思っています。今しばらくお待ちを。

 

HDDの調子がおかしい

そんなわけで、我がPCはそれなりに稼働中ですが、最近Winsows10のPCの反応が少しおかしくなっていました。なんとなくHDDが寿命に近くなっている(5年使用)感じもしていて、過去の悲惨な状況(認識しないHDDの処置という記事にしています)に陥らないように、HDDの新調を考えていました。ちょうど、ドスパラ25周年の周年祭とかで、WDの4TBが税抜き1万円を切った価格ということでしたので、チャンスと思い早速購入しました。

入手後は、今のシステム(システムドライブのCとデータのDドライブという構成になっている)をそっくりクローン化すればよいだけだから簡単と、たかをくくっていたのです。しかし、すっかり忘れていた4TBという2TBを超えるHDDでは、従来のMBRでは対応できず、GPTというタイプでないと駄目だとか色々と問題があって、移行までに結構トラブってしまいました。
その経緯を記載しておきます。

最初のトライ (失敗)

最初は、4TB HDDをとりあえずPCに接続すると、認識されない状態であると、エクスプローラを見たらわかりました。これは初期化していないので、当たり前ですね。


コンピュータの管理画面を開くと、ディスク初期化が必要とのメッセージ。
そこで、パーティション スタイルをMBRかGPTを選べと言われました。わけわからんので、調べると、上述のように2TBを超えるとGPTを使わないといけないようですが、システムドライブとして、使用するには、制約があるとのこと。BIOSがUEFTブートで、64bit OSであることとか。
私のPC(5年前の購入ですけど)は、条件は満たしていると思うので、GPTを選択しました。

購入したHDDはWDのWD40EZRZというものですが、無料のWDの引越ソフト Acronis True Image WD Edition Softwareを利用できると、同封されていた1枚の紙に書いてありました。早速使ってみます。

 

やった手順は、以下の通りです。
1.ダウンロードして展開して、インストーラを実行。

2.インストールが完了したら実行。
3.クローン作成モードを利用。ソースドライブとターゲットドライブを指定
途中メッセージはありましたが、適当に処理して下さい。

最終実行の前に、2TBのオリジナルは、MBRだったので、そのままコピーするというメッセージが出ました。これだと、4TBを有効に利用できないので、ダメじゃないかと思い、一旦中断します。 

2回目のトライ (あれ、失敗)

やりたいことは以下。

現在の状況:稼働している2TBは、200MBのCドライブと、残りをDドライブとなっていて、MBRのパーティションとなっています。
目指すところ:購入した4TBを、従来同様、200MBのCドライブ(システム)と、残り3.数TBをDドライブにしたい。

色々と調べたら、Window10にmbr2gptなるツールが2017 Creators updateで追加されたという情報を見つけました。現システムをGPTにしたら、そのままコピーできて一気に解決できると思ったので、実行してみましたが、エラーで実行できませんでした。残念。


以下は、コマンドプロンプト管理者で実行した時の履歴です。
C:\Users\ohno> mbr2gpt /convert /disk:0 /allowFullOS
EnablePrivilege: AdjustTokenPrivileges failed (Error:0x514)
ERROR: Failed to enable backup/restore privileges.
Check that you are running in a process with elevated privileges.


この目論見は、もろくも崩れ去りました。 

3度目の正直 (これもダメ、失敗)

次に、AOMEI Backupperを使う方法が簡単そうだったので、やり始めました。しかし、クローンコピー開始して間もなくエラーで停止。よく理由はわかりません。

今、これを書いていて、思うところは、MBRとGPTと違うパーティションのHDD間でクローンコピーはできなかっただけかもしれません。一番最初に4TBをPCにつなげてディスクの初期化でGPTを選択したのがよくなかったかもしれません。

 

4度目の挑戦

この辺から雲行きが怪しくなっています。そもそも、我がPCはGPTを取り扱えるのかとか。マザーはASRock FM2A75 Pro4-Mというもので、BIOSと言ってはよくないかもしれませんが、UEFIには、対応している様子。でも、ネットで調べた設定項目がなかったりして、ちょっと自信がありません。でも、何とかして、4TBのHDDを使えるようにしたいのです。

ここで、ちょっと、落ち着いて、じっくり方針を決めてから進めることとしました。
すでに既存システムのHDDは時々反応がおかしかったり、少しヤバそうです。まずは、同じ2TBのバックアップHDDにコピーしてから、作業をした方が良いと思いました。


色々と今回の作業をやっている時に、Windowsが急にシャットダウンして、復旧作業をしたりして、450MB程の使用していないパーティションが生成されてしまったりしていて、本当にお亡くなりになったら大変という状況になっていたからです。

同じ2TB (常用しているのはST2000DM001、バックアップ用に本当にたまに接続してバックアップしているHDDはWD20EZRXと違いますが)なので、クローン化も簡単なはずです。これは、先にインストールしたWDの無料のAcronisのソフトを利用しました。このバックアップ用HDDは、前回の教訓で持っていたのですが、バックアップを結構さぼっていて、メモしている日付を見たら2年前になっていました。Win7の最後の状態をバックアップしたものでした。

数時間かかって、復旧で生成されたパーティションも含めクローン化できました。
起動チェックもして、コピーしたシステムにまず移りました。 

さて、ここから本番です。4TBのHDDにまず何でもよいからコピーするのが良いという考えに行きつきました。システムが入っているパーティションでも、MBRからGPTへの変換もできるような情報でしたので。

EaseUS Todo Backup Freeの10.6とか何種類か試したような気もしましたが、最終的にAOMEIのBackupper使ってトライを開始しました。
まず、MBRのままシステムをクローン化してしまいます。そのため、4TB中2TBまでしか利用できませんが、後で、何とかできると考えていますので、そのまま進めます。


クローン化は、結構時間がかかりました。なんだかんだと9時間位かかったと思います。夜中過ぎから始めて朝起きてもまだ実行していました。2TB→2TBの時より時間がかかったような気がします。コピーすべきサイズは同じはずですけど。使用したAOMEI Backupperは残り時間を表示してくれるのですが、それが全くあてにならないのが、少し残念でしたね。どんどん残り時間は延びる、カウントダウンが実時間通りに進まないとか。

とにかく、ようやくクローン化できたこの4TBのHDD

を使って、ちゃんとコピーされたか起動して確認します。大丈夫でした。

次に、このコピーしたシステムドライブをMBRからGPTに変換する作業をやらないといけません。

そうしないと、せっかくの4TBの意味がありません。

 

まず、ドライブの状況を確認するため、コンピュータの管理画面で、ディスクの管理画面を開いて、みました。そうしたら、なぜか、ドライブの先頭領域のSYSTEMがEFI システムパーティションになっていました。理由は全くわかりません。AOMEIのBackupperがうまく処理していたとしか思えません。再現実験をやるのには時間がかかり過ぎるのでできませんが、これは朗報です。

以下は、最終的なものですが、表示はたぶん同じです。

image


本当にこの4TBのHDDが起動ディスクとして機能しているのか、4TBのHDDだけを接続した状態で、起動してみました。もちろん、表示上はそうなっていますが、念のため。実は、まだWD2TBのHDDがつながっていたのに気づいたので。 でも、ちゃんと起動しました。大丈夫みたいです。

 

パーティションの設定

でも、まだ、この4TBのHDDには、1.8TBほどの未使用領域があります。これを有効化させないと4TBのHDDの意味がありません。また、元の2TBの不調のために生成されたと思われるパーティションが意味もなく、コピーされているので、それも無くしたいと思います。
こういう作業には、EaseUS Partition Master Freeを使っていこうと思っています。


まず、元の2TBの不調のために生成されたと思われるパーティションを無くします。回復された450MBの領域が気になるので。
システム領域は200GBあるので、これをデータ領域の方にくっつけようと思いました。表示上、それは、システム領域とデータ領域の間に存在しているように表示されていました。

既にシステム領域は私が必要と思っている200GBありますし、いじるのも怖いので、データ側にくっ付けたというわけです。

パーティションのマージというメニューで必要な領域を指定して、最終的に残すドライブを指定したら終わりです。

 

ここで、1つ落とし穴というか、時間の浪費をしてしまいました。

それは、こんな作業は、すぐに終わると高をくくっていたからです。でも、そうではなかったことです。処理を実行すると、Windows上での処理はできず、再起動が必要と言われたので、OKとしました。すると、Windowsを起動させずにコンソール状態で、移動処置が始まりました。文字だけの表示画面で、昔のDOS窓のような感じの黒地に白い文字という表示がされています。

しかし、全然処理が進みません。50%までは、10分くらいで終わったかと思いましたが、その後、まったく進んでいないように見えました。10%進むのに、1時間半ほどかかっています。

でも、ここで止める訳にもいかないので、じっと我慢するしかありません。結局7時間弱くらい処理が完了するまで待たされました。そして、ようやく、元のWindowsが起動して、今、こうやって、記事を書ける状態になっています。

 

あと、1.8TBの未使用領域があり、それをDドライブにマージしたいのですが、また、数時間もかかると、今日何もできなくなってしまうので、とりあえず、保留としました。Dドライブの後ろにあらたな領域をくっつけるだけなので、あっという間に終わるような気もしていますが、万が一時間がかかる処理だったら困るので、適当な夜間に実行しようと思います。

 

ということで、この週末は、ほぼ、PCの復旧作業というか、4TB HDDへの移行作業で終わってしまいました。でも4TBのHDDを起動ドライブとして、使えるようになったことは良かったと思います。

 

何より、データロスなく移行できたことを喜びたいと思います。でも復旧されたエリアに何か重要なものがあったのかどうか今の所、わかりません。しばらく使って問題なければ、普段使っていないデータだということでしょうけど、もし使うものでもあきらめるしかないでしょう。

 

PC本体も5年経過しているので、新しいマシンに移りたい頃なのですけど、良い候補がない感じなので、困っています。少なくとも今より高速な環境にしたいとは思うのです。

今:AMD Trinity A10-5700 4コア3.4GHz、DDR3 PC3-12800 (1600MHz) 8GBx2

という環境の上を狙いたい。そうすると、8スレッド、DDR4 2400MHz 32GB、できれば、SSDかM.2とか、予算数万と考えると、結構厳しそう。DDR4となり高速化されたとは言え、前回購入した価格からみると、同じ容量でも3倍位高いですし、一方、CPUは同じ値段のものを見ると、そんなに高速化されているようにも見えないという状況。時代ですかね。

 

特に、AMDだと、APUの上位バージョンがほぼないのが残念。A10-9800E位しかみあたらず、現在使用中のものより処理能力アップしているようですけど、せいぜい数10%アップといった感じ、コア数も同じ4つですし。 その一方、少し高いですが、Ryzenだと、Graphicボードが必要になるので、さらに出費が。ノート向けとなっているRyzen 5 2500U当たりがデスクトップ用に買えるといい感じなのですけどね。もう少し様子見です。

 

では、また。

記事へ驚いた ブログ気持玉 1 / トラックバック 0 / コメント 0


Android Studio 今日のtip [変数設定コードの自動生成]

2017/08/27 20:05

Androidのプログラミングに挑戦中ですが、思うように進んでいません。

ほとんど、Webで探したプログラムをコピーして、動作を学びながら、自分のプログラムを構築しています。このブログは、色々制約がありますし、シンプルな例を掲載していくような計画もないので、プログラムを作るのに便利だったと自分で思ったものを書いていこうかなと思います。

 

Android Studioを使っていますが、機能もたくさんあるようで、とてもすべてを把握できませんし、必要な時に、検索すると、活用方法がみつかったりします。そういう情報って、なかなか見つかりませんし、全部勉強してからというのも、難しいですから。

 

ちなみに、私は、Javaは初めてですし、Android端末を持ったのも今年からという超入門者です。

Palmのプログラム開発は、C言語でした。でも、その昔、オブジェクトPascalを少し勉強していたので、Javaの概念はわかっているような気持ちです。

 

では、まず最初に、タイトルにあるように、ソースコードの作成支援をしてくれる機能をメモしておきます。

 

単純なテキストのリストを表示する機能は、元から備わっていますが、少しカスタマイズしようとした場合、少し工夫が必要です。

 

複数の情報をリストに持たせようとしようとした場合、オリジナルを継承して、新たにその希望するデータ構造のclassを用意すると、うまく拡張ができるらしいです。

 

例えば、

public class Data {
   private String str;
   private String str_sub;
   private int serialNumber;
}

のようなものの場合、それらの各変数に値を設定したり、取り出したりするためのmethodが必要になってくるとのこと。オリジナルは、単純にString1個を操作できるだけですから、自分で拡張した分は、自分で定義しないといけないということで、至極もっとなことですね。

 

それは、上記の定義の中で、以下のようなものを設定することを意味しています。

public String getStr() {
   return str;
}

public void setStr(String str) {
   this.str = str;
}

 

これを全部の変数に対して作っていく必要がありますが、コピペするにせよ、面倒であることにはちがいありません。

Android Studioでは、これを支援してくれる機能があるということを学びました。

[Code]→[Generate]→[Getter and Setter]を実行することで、自動的に生成されます。

 

実は、これ、自分の手で書き終えてから、見つけた情報でした。

せっかく自分で書きましたが、一旦削除して、実行したら、いともたやすくコードが生成されて、感動でした。

 

今回は、こんな感じで。

記事へブログ気持玉 / トラックバック / コメント


Android開発環境

2017/06/24 00:48

Palmの時と同様に、Androidを使っていくうちに自分で、アプリを作ってみたくなってきました。

定番らしいAndroid Studioを使おうと思います。安定最新版、2.3.3をダウンロードして、実行します。

 

インストールが完了したら、起動してみます。

Welcome to Android Studioというタイトルのウインドウが開きました。

image

上記キャプチャは、クリックしてしてしまったので、メッセージがある表示になっていませんが、ウインドウの右下に並んでいるメニューの一番左のEventsの所に印が出ていて、見てみると、バージョンアップのお知らせでした。

 

それに従い、アップデートしてみました。すると、以下の画面が出ました。

image

特に無視する意味もありませんから、Update Nowボタンを押して更新しました。

これで、インストールできましたので、まずは簡単なプログラムを書いてみようと思います。 いわゆるHello  Worldを表示するようなものを作るのが、最初の目標だと思っています。

とは言え、初めてAndroid Studioを使いますし、おまけにJavaもプログラムしたことがなく、最近初心向けのWebページで勉強し始めたばかりという状況ですから、チュートリアルが必要です。

私は、Android プロジェクトの作成を参考に進めてみました。


最初に出てきたWelcome to Android Studioというタイトルのウインドウの中のStart a new Android Studio projectを押して開始。そのあとは、上記のページに記載のやり方に従っていけば問題ありません。単に記載されている通りに進めている状態なので、まだ自分自身で何をしているかもはっきりとはわかっていません。

 

でも手順通りにすると、いわゆるHello Worldができあがるらしいです。

 

ほぼ、ボタンを押していただけですけど、ソースプログラムが作成され、自動的に開かれました。

中身をみても、Hello Worldの文字もなく、何ができ上ったのかわからない状態です。中身の理解より、まず何ができているのか確認するため、Buildしてみました。

初めてコンパイルしたからか、私のPCが非力だからか、シンプルなプログラムとしては、結構時間がかかりました。

 

でも、問題なく、コンパイルはできたようです。

 

次に、どうやって実行するか考えようと思っていたら、充電を兼ねてUSBケーブルでHuawei P9liteがPCにつながっていたおかげで、エミュレータか実機のどちらで実行するのかというようなメッセージが書かれたポップアップウインドウが出ました。エミュレータ上で実行するのがよいかなとも思いましたが、エミュレータをインストールするとかの面倒さも考えて、実機での実行を了承しました。

しばらくすると、実機のP9liteの画面が変わり、Hello World!と表示されました。Palmと違ってHot Syncということもせずに、PCからP9liteへインストールが行われ、実行もされるとは、便利ですね。

 

実行した時に表示された画面が以下となります。

image

画面中央に、小さめのフォントでHello Worldと表示されました。

 

このアプリは、画面にメッセージを表示するだけの機能しかありませんので、特にボタンを押すとかではなく、Androidの標準機能で、ホーム画面に戻すしかありません。ホーム画面で探してみると、My first Appという名称で、Android君のアイコンのアプリがインストールされていました。

image

 

上述の通り、プログラムは、作れたものの、1行も、ソースコードを自分で書いていないので、何も理解していない状態です。それでも、自分でコンパイルしたアプリができ上がりました。まったく苦労もしていないので、コンパイルできて、プログラムがスマホ上で動いても、それほどの感慨も感動もないのが残念ですけど、ここまで簡単にプログラムが作れるというハードルの低さにびっくりです。という感じで、プログラム開発環境が整いました。

 

少し落ち着いて、Android Studioを眺めてみます。

javaのソースコード自体には、Hello Worldは書かれていないみたいです。

よく画面をみていたら、ソースコードを表示している後ろのタブに、activity_main.xmlという名称のファイルが開かれていました。

そのタブをクリックしてみると、リソースエディタみたいな画面が表示されました。ここでHello Worldを表示するようにしているようです。まだ、説明を読んだわけではありませんが、適当にクリックして、表示位置などの設定が変更できそうなことがわかりました。Hello Worldの文字を適当に変更して、再コンパイルすると、ちゃんとアプリに反映されることが確認できました。

画面構成をリアルタイムにPC画面上で確認しながら、変更できるので、自分のアプリを作るときは、便利そうです。

 

文字の大きさを変えようと思いましたが、文字の枠を広げたりしてみましたが、ダメでした。ネットで調べてみたら、サイズを変更する記述を加えればよいということがわかりました。

"Hello World"が書かれているTextViewの中に、

android:textSize="30sp"

といった記述を追加したら良いみたいです。spという単位は、スケール非依存ピクセルという単位ということ。これは、画面の解像度とユーザのフォントサイズの両方を加味して表示されるもので、フォントのサイズとして推奨とありました。単純には、ユーザの設定に合わせてサイズが変更されるサイズだと理解しました。ほかにdpという密度非依存ピクセルという、ディスプレイの解像度に応じた単位というものもありました。

 

サイズを変更してコンパイルしてみたら、大きくなって見栄えのする感じになりました。

先ほどのものと比べてみてください。「です」というのもちょっと加えてみました。

image

 

まだまだ、色々と勉強しないとアプリの開発はおぼつかないと思いますが、Palmware開発した経験を生かして、挑戦したいと思っているところです。

 

これから、どんなアプリを作ろうとしているのかは、まだ秘密にしておきます。少し形にできてからご報告したいと思います。多分、数週間は優に掛かってしまうと思われますし、本当に、次の報告ができるのかわかりませんので。

 

とりあえず、今回はここまで。

記事へブログ気持玉 / トラックバック / コメント


Windows10 Creators Updateのその後

2017/06/20 22:11

Open Live Writerがおかしい

 

先日Windows 10 Creators Updateを行ってから、このブログを書くために使用しているOpen Live Writerが落ちまくり、全然使いものにならなくなってしまいました。私の場合、何文字か入力して、その後に2文字熟語の漢字変換をしようとすると、固まってしまい、エラーメッセージが出て、落ちるという感じでした。

そのため、全然、物書きが進みません。

 

ネットで調べると同様の症状の方がちらほら見受けれました。一部の方の対処方法である、スペルチェックを無効にするというのを試してみましたが、効果なし。

 

Open Live Writerが5月にバージョンアップしてからおかしいのではないかという話とか、私と同様に、Creators Updateをしてからおかしくなっている方とかがいるようです。

 

バージョンダウンすると良いという話もありましたが、古いバージョンをダウンロードしてインストールするといったことはできず、ソースコードをコンパイルして、インストールしないといけないという感じで、簡単にできそうもないので、対処しようがありません。

 

で、今このブログはどうしているのかというと、昔のWindows Live Writerを起動して書いています。幸い、まだアンインストールされていなかったようで、まだ、PC内に残っていました。

起動してみると、設定環境とか履歴情報とかは、Open Live Writerと共有しているみたいで、直近の履歴も残った状態で、すぐに何も問題なくWindows Live Writerを使うことができました。

 

こちらは、Creators Update上でも、異常終了もなく、まったくストレスフリーですね。何か作業をしていて途中で止まるなど、非常に非効率で、特にものを書いている途中で消えてしまうと、再度同じことを書かなければならないわけですし、かといって、まったく同じ文章を覚えているわけでもないので、余計なストレスを感じるわけです。

しばらくは、Windows Live Writerを使っていこうと思っています。Open Live Writerがバージョンアップして直ってくれるのがよいのですけど、日本語にかかわっているような感じでもあるので、問題に気付いて、直して頂けるのか? 当該ページには、ブログもありますが、コメントを書けるようになってもおらず、どうしたらよいのかわかりません。まあ、気長に待ちましょう。それまでは、Windows Live Writerに頼りたいと思います。

 

では、また。

記事へブログ気持玉 / トラックバック / コメント


Windows10 Creators updateがやってきた

2017/06/16 22:25

確か4月ごろにリリースされたCreators updateがようやく私のPCにもやってきました。

その少し前に設定を更新するようなメッセージが出て、設定を行ったら、まもなくアップデートされますと言ったようなメッセージが出ました。それから数日経過したら、ようやくインストールできるようになりました。

いつものように、最終的に再起動で、更新が完了するわけですけど、この後、問題が発生しました。

その内容を少しご紹介します。

  1. Windows 10のアップデートをしたら、コントロールキーとcapslock キーの入れ替えがキャンセルされれしまいました。その再設定が必要でした。
    しかし、Xmouseの設定の方は、そのまま引き継がれて問題ありませんでした。
  2. SheevaPlug+からの アクセスが できなくなりました。
    共有設定がおかしくなったのだろうと思って、設定を確認しましたが、問題ありません。
    どうしたらよいかなと思ってしばらく考えていたのですけど、前回も同様な問題が起こったと思い出し、検索をしたところ、2016/8/11の記事にSheevaPlug+からWindows10のファイルアクセスというものを見つけました。
    ネットワークと共有センターの共有の詳細設定が、元に戻ってしまったようでした。
    パブリックフォルダーの共有の所と、パスワード保護共有の所を変更にしたら、SheevaPlug+からアクセスができるようになりました。
    余談ですけど、この問題が発生して、SheevaPlug+をいじっていたら、なぜかSheevaに接続しているUSBメモリにアクセスできません。マウントしたままにしていたはずですが、USBメモリのデバイスが/dev/sda1から、/dev/sdb1に変わってしまっていたようです。いつ変わったのかわかりませんが、再度mountすることで問題なくなりました。

以上、2つ問題が発生しましたが、すべて解決し、無事Windows10のバージョン1703となりました。

少し使っていたら、文字入力時に、ときどき画面中央に「あ」とか「A」とか表示されるようになっていました。非常にうっとうしいのですが、その表示を消せないか調べてみたらありました。
MS-IMEのプロパティで、IME入力モード切替の通知の所のチェックを外すだけでした。

image
   

簡単ですが、覚書として。

    記事へブログ気持玉 / トラックバック / コメント


    Palmの予定表データをAndroidへ (つづき)

    2017/06/12 22:37

    Palmのpdbファイルをicsファイルに変換するperlプログラムです。実行にはp5-Palmのライブラリが必要です。

    #!/usr/bin/perl


    # Convert Datebook.pdb to iCalendar
    # Copyleft 2006 Yoshizumi Endo <y-endo@ceres.dti.ne.jp>
    # Modified by K.Ohno 2017/6/7 LOCATION出力中止


    use Palm::PDB;
    use Palm::Datebook;
    use Encode qw/ from_to /;


    my $default_clss = "PRIVATE";
    my $private_disp = 1; # you can out put private records (=1) or out put public records only (=0).
    my $location_delimiter =" "; # delimiter between summary & location
    my $codeset = "utf8"; # output codeset


    my $dbfile = "$ENV{PWD}/DatebookDB.pdb";
    my $icsfile ="$ENV{PWD}/calendar.ics";


    my $data_server = "evolution-data-server-1.4";


    ## main


    my @wday_s = ( "", "DAILY", "WEEKLY", "MONTHLY", "MONTHLY", "YEARLY" );
    my @sday = ( "SU", "MO", "TU", "WE", "TH", "FR", "SA" );


    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)
        = gmtime(time);
    my $gmt = sprintf("%04d%02d%02dT%02d%02d%02dZ",
                      $year + 1900, $mon +1, $mday, $hour, $min, $sec);


    my $pdb = new Palm::PDB;
    $pdb->Load($dbfile) || die "Can't open: $dbfile!\n";
    my @categories = @{$pdb->{appinfo}{categories}}; # extract each category names


    open(ICS, "> $icsfile") || die "Can't open: $icsfile!\n";
    select(ICS);


    print "BEGIN:VCALENDAR\nVERSION:2.0\n";
    print "PRODID:-//Yoshizumi Endo//NONSGML ptodo2ical.pl//EN\n";


    my $i=0;


    foreach $record (@{$pdb->{records}}) {


        if (!($record->{"attributes"}{"private"} == 1 && $private_disp == 0)) {


            print "BEGIN:VEVENT\n";         
            print "UID:ptodo2ical-$gmt-$record->{id}-$ENV{USER}\@$ENV{HOST}\n";
            print "DTSTAMP:$gmt\n";


    # Summary & Location


            my $summary = $record->{description};
            from_to($summary, "shiftjis", $codeset);

            if ($summary eq "") {
                 $summary = "Error: No summary data!";
            }

            $summary =~ s/\n//g;


    # my @tmp = split($location_delimiter, $summary);
    # $tmp[0] =~ s/ *$//;
    # print "SUMMARY:$tmp[0]\n";
             print "SUMMARY:$summary\n";


    # if ($tmp[1] ne "") {
    # print "LOCATION:$tmp[1]\n";
    # }


    # Class


    # if ($record->{"attributes"}{"private"} == 1) {
    # $class = "CONFIDENTIAL";
    # } else {
    # $class = $default_clss;
    # }
    # print "CLASS:$class\n";


    # Description


            if ($record->{note} ne "") {
                $description = $record->{note};
                from_to($description, "shiftjis", $codeset);
                my @tmp = split('\n', $description);
    #            print "LOCATION:$tmp[0]\n";
                $description =~ s/\n/\\n/g;
                print "DESCRIPTION:$description\n";
            }


    # Date & Time


            if ($record->{"start_hour"} != 255) {
                 printf ("DTSTART:%04d%02d%02dT%02d%02d%02D\n",
                         $record->{"year"}, $record->{"month"},$record->{"day"},
                        $record->{"start_hour"}, $record->{"start_minute"});
                printf ("DTEND:%04d%02d%02dT%02d%02d%02D\n",
                        $record->{"year"}, $record->{"month"},$record->{"day"},
                        $record->{"end_hour"}, $record->{"end_minute"});
            } else {
                printf ("DTSTART;VALUE=DATE:%04d%02d%02d\n",
                        $record->{"year"}, $record->{"month"},$record->{"day"});
                print "TRANSP:TRANSPARENT\n"
            }


            if ($record->{repeat}{type} != 0) {
                print "RRULE:FREQ=$wday_s[$record->{repeat}{type}]";


    # 2: weekly event
                if ($record->{repeat}{type} == 2) {
                    print ";BYDAY=";
                     my $comma = 0;

                    for (my $c = 0; $c < 7; $c++) {
                        if ($record->{repeat}{repeat_days}[$c] ==1) {
                            if ($comma == 1) {
                                 print ",";
                            }
                             print "$sday[$c]"; $comma = 1;
                        }
                     }
                }


    # 3: monthly by day
                if ($record->{repeat}{type} == 3) {
                    my $weeknum = $record->{repeat}{weeknum}+1;
                    print ";BYDAY=$weeknum$sday[$record->{repeat}{daynum}]";
                }


    # 4: monthly by date
                if ($record->{repeat}{type} == 4) {
                     print ";BYMONTHDAY=$record->{'day'}";
                }


    # repeat end date
                if ($record->{repeat}{end_year} != 0) {
                    printf (";UNTIL=%04d%02d%02d",
                             $record->{repeat}{end_year},
                            $record->{repeat}{end_month},
                            $record->{repeat}{end_day});
                }


    # repeat frequency
                if ($record->{repeat}{frequency} > 1){
                    print ";INTERVAL=$record->{repeat}{frequency}";
                }
                print "\n";


    # exceptions
                if ( @{$record->{exceptions}} > 0) {
                    print "EXDATE;VALUE=DATE:";
                     for (my $c = 0; $c < @{$record->{exceptions}}; $c++) {
                         if ($c != 0) {
                            print ",";
                        }
                        printf ("%4d%02d%02d",
                                $record->{exceptions}[$c][2],
                                 $record->{exceptions}[$c][1],
                                 $record->{exceptions}[$c][0]);
                     }
                    print "\n";
                }
            }


            print "END:VEVENT\n";
            $i++;
        }
    }


    print "END:VCALENDAR\n";


    # exec ("killall -HUP $data_server");

    では、また。

    記事へブログ気持玉 / トラックバック / コメント


    Palmの予定表データをAndroidへ

    2017/06/12 22:36

    Palmデータの移行

    移行しなければならない残る3つのデータですけど、アドレス帳は、メモ帳と同様にcsvファイルに書き出す機能があるので、どうにでもなりそうです。それに、あまりこのアドレス帳は使っていなかったですし、件数も約200件とそれほど数も多くないので、手を掛ける必要もなさそうです。


    2つ目のToDoは、export形式に簡単に処理ができるcsvなどを選択できないようなので、大変そうですけど、件数をみたら、69件と多くなく、手動でも何とかなりそうな範囲かと思いました。まあ、それでも結構面倒だとは思いますが、データベースの構造を調べたり、プログラムを組むよりは、ましかなと思っています。


    予定表のデータ

    そうすると、最後に残るデータは予定表になります。これは、10年以上にわたる個人史でもあるので、件数は、よくわかりませんが、結構な量だと推定しています。PalmDesktopで対応しているdbaデータのexport機能でファイルを出力してみたら、1MBくらいのサイズになりました。1件どのくらいの容量を使っているかわかりませんけど、コメントを追加した予定は多くはないという記憶なので、1KBも必要もないでしょうから、1000件は優に超えた件数になると思われます。


    色々やっているうちに、Palm上でメニューからApp⇒Info...というのがあったことを思い出しました。そうして、予定表のレコード数をみたら、約7000件超のレコード数とわかりました。これは、手動でやれる数ではありませんね。


    本当に必要な情報かは、わかりませんけど、どこかに行ったとかの検索をして、あ、あれはこの頃だったのね、とか、こんな風に移動したのかとか参考にするときもあるので、移行しておきたいと思いました。日記みたいな側面もありますし。もちろん行先は、Googleのカレンダーしかありませんね。


    で、いつもの通り、ネットで検索して、どうしたらよいか調べます。そうしたら、予想通りというか、色々な情報があり、一筋縄ではいくのかどうかわからない状況ですね。


    無料でできるよさげなものを試してみようと思います。


    PalmDateBookUtilで変換にトライ

    まずは、PalmDateBookUtilというもの。Hot Syncの時に使われるPC側のデータベースであるdatebook.datをコマンドラインで処理して、vCal形式に変換してくれるものとのこと。

    日本人のTakeshi Yonekiという方が作られているので、日本語も問題ないでしょう。


    ところが、残念ながら、DateBook Errorという表示が出てしまい変換してもらえませんでした。

    それ以上の情報もないので、原因を探ることも、解消することもできそうもありません。思い当たる理由としては、このソフトで対応しているのが、Palm Desktop 4.0.1となっており、私が今使っているバージョン4.2.0より古いものということでしょうか。何かデータのフォーマットに違いがあるのでしょうね。


    こういうことがあると、前途に暗雲が立ち込めてきているような予感がします。

    でも気を取り直して、別のものも調べてみます。 


    きみちゃんの人生無茶修行!?のPalmからAndroidへ・・・

    を参考にしてみます。perlを使った処理みたいです。


    まずは、p5-Palmからperlのモジュールをダウンロードしてきます。そこには、最新版の1.4.0もありましたけど、安定版の1.3.0を使ってみます。

    ファイルは、p5-Palm-1.3.0.tar.gz

    ダウンロードしたら、展開しておきます。展開すると、p5-Palm-1.003_000のディレクトリの下にファイルが展開されました。


    その直下にあるREADMEを読みながら進めます。

    Makefile.PLがあるディレクトリで作業を開始します。

    まずは、READMEのINSTALLINGに書いてあるようにインストールします。


    私の場合、実行環境は、Windows10上で、cygwinを動かして、以下を実行しています。


    501 p5-Palm-1.003_000> perl Makefile.PL
    Checking if your kit is complete...
    Looks good
    Writing Makefile for Palm
    502 p5-Palm-1.003_000> make
    cp Palm/Mail.pm blib/lib/Palm/Mail.pm
    cp Palm/Address.pm blib/lib/Palm/Address.pm
    cp Palm/PDB.pm blib/lib/Palm/PDB.pm
    cp Palm/StdAppInfo.pm blib/lib/Palm/StdAppInfo.pm
    cp Palm/ToDo.pm blib/lib/Palm/ToDo.pm
    cp Palm/Memo.pm blib/lib/Palm/Memo.pm
    cp Palm/Datebook.pm blib/lib/Palm/Datebook.pm
    cp Palm/Raw.pm blib/lib/Palm/Raw.pm
    cp util/pdbdump blib/script/pdbdump
    /usr/bin/perl.exe "-MExtUtils::MY" -e "MY->fixin(shift)" blib/script/pdbdump
    503 p5-Palm-1.003_000> make install
    Installing /usr/lib/perl5/site_perl/5.8/Palm/Address.pm
    Installing /usr/lib/perl5/site_perl/5.8/Palm/Datebook.pm
    Installing /usr/lib/perl5/site_perl/5.8/Palm/Mail.pm
    Installing /usr/lib/perl5/site_perl/5.8/Palm/Memo.pm
    Installing /usr/lib/perl5/site_perl/5.8/Palm/PDB.pm
    Installing /usr/lib/perl5/site_perl/5.8/Palm/Raw.pm
    Installing /usr/lib/perl5/site_perl/5.8/Palm/StdAppInfo.pm
    Installing /usr/lib/perl5/site_perl/5.8/Palm/ToDo.pm
    Installing /usr/bin/pdbdump
    Writing /usr/lib/perl5/site_perl/5.8/cygwin/auto/Palm/.packlist
    Appending installation info to /usr/lib/perl5/5.8/cygwin/perllocal.pod


    特に問題なく完了したようです。これで準備は完了だと思われます。/usrというのは、私の環境ではWindowsでいうd:\cygwinに相当しています。

    インストールしたライブラリを使うことで、簡単にPalmのデータベースを処理できるようです。


    変換スクリプトは、Palm データベースの iCalendar 形式への変換からいただきました。

    pdatebook2ical.plをダウンロードしてきます。

    これは、ファイルの中身をみたら、Linuxで使うディレクトリ構成になっているみたいで、使用する環境もLinux上を想定したスクリプトのようです。


    そこで、きみちゃんの人生無茶修行!?のPalmからAndroidへ・・・に書かれているdiffの差分が有効になるということだと理解しました。パスをWindowsとかで使いやすいような感じにしているようでした。


    コードをみると、context方式で出力されたdiffのようでしたので、patchを当ててperlのソースファイルを更新する必要があるようです。

    ところが、私のcygwin環境にpatchがありませんでした。cygwinのsetupからインストールすればよいかと思ってトライしたのですが、元のcygwinが古すぎるのか、Palm開発用のツールのprc-toolsをインストールしてしまっているからなのか、エラーが出てcygwinのsetupがうまく動きませんできませんでした。


    仕方がないので、Windows用のpatch.exeをダウンロードしました。ところが、最初GNUのサイトからダウンロードしたのですが、うまく動作しませんでした。そのため、「ソフトウェア工房α」のpatc254w.zipを試すことになりました。こちらは、うまくいきました。理由は不明です。


    早速、きみちゃんの人生無茶修行!?さんの所に掲載されていたdiff差分データを使ってperlスクリプトの更新を行おうとしましたが、エラーが出てできません。

    contextタイプのdiffフォーマットについて知らなかったのですが、それを勉強する羽目になってしまいました。

    少し泥沼にはまり始めているような状況でしたが、色々と調べていくうちに、大体の原因がわかりました。


    それは、webに掲載する関係かもしれませんが、一部文字化け、必要な情報が消えてしまっていたということでした。

    問題点は、以下の通りでした。

    • ””、’’が半角でなく、全角2バイトコードに変換されていました。
    • 比較対象のファイル側は、---と3つのマイナスになっているはずですが、web上は全角の−みたいな記号になっていて、コピーしたら、?に変わってしまいましたので、?を3つの---に変換しました。
    • diffのフォーマットである行先頭のスペース2つが消えていました。ただし、!、+で開始している行は、行頭にスペースはありません。また、範囲を示して行も対象外。
    • オリジナルのソースの行末には、スペースが付いていたが、web上のdiffにはスペースなくなっていたりしました。そのため、オリジナルのファイルと比較が適切にできない問題がありました。また、ソースは、タブを使っていましたが、web上ではスペースになっていたりしていました。
      これらは、手修正も面倒だったので、一旦ソースファイルもdiffのファイルも、タブは廃止し、スペースは1個だけにするというルールで変換し、また、行頭、行末スペースは削除という対応を取りました。
    • \nがnになっていた部分がありました。これは、オリジナルのソースを見ながら修正しました。


    上記の問題をエディタで修正して、ようやくpatchが正常に動作して、ファイルができました。

    なお、これは、管理者権限のコマンドプロンプト上で実行しました。

    D:\My_Documents\Palmデータ変換\Calendar>patch -c original\pdatebook2ical-noTabSp.pl diff
    patching file 'original\pdatebook2ical-noTabSp.pl'

    ファイルができ上ったので、ちょっと気になったGNUのpatchをもう一度、実行してみましたが、なぜか暴走してしまいましたので、GNU版のpatchの使用はあきらめました。pdatebook2ical-noTabSp.pl は、ダウンロードしたソースファイルから、上述の修正を行ったファイルです。


    最後に、上述の通り、インデントのためのTABやら、スペースをほとんどとってしまい、ソースがみにくくなってしまったので、meadow上で、整形(M-x indent-region)して、perlのスクリプトファイルを完成させました。


    あと、書き忘れましたが、webからコピーして作ったdiffは、改行コードがUNIXタイプの0x0aになるようにしておく必要があったかと思います。


    で、ここで、よくよく変更されたperlの内容を読んでみると、最初の方は、ディレクトリをWindows用に合わせているみたいなので必須ですが、後半は、データの加工に関するもののようです。

    オリジナルのものは、タイトルの空白以降を場所(Location)のデータに割り振って運用されていたようで、それに合わせた処理をしていたようです。そういう処理もしないようにしたものになっているらしいが、変更後は、コメントの1行目をLocationに書き出すようにしたとの記述がありました。
    私の場合は、コメントの1行目に場所を入れたりしていないので、修正が必要かもしれません。


    この辺の処理については、実際に自分のデータを作ってみてから、修正したいと思いました。

    では早速、icalファイルを作ってみましょう。

    処理する対象ファイルは、Datebook.pdbとのことなので、PalmDesktopからExportしたものではありません。バックアップされているはずのファイルを探すことから始めます。PalmDesktopの設定を調べると、どこにバックアップができるかわかりました。私の場合は、以下となっていました。

    D:\My_Documents\PalmDesktop\

    この下にユーザ名のディレクトリがあり、その下にアプリごとのたくさんのディレクトリがありました。しかし、残念ながらDatebook.pdbはどこにも見つかりません。


    調べてみると、このファイルは普通は、バックアップされていないみたいです。

    palm2ical ? Palm Datebook/Calendar export to iCalendarのページに、

    Obtaining the Palm Datebook/Calendar PDB fileという章があり、いくつかの取り出し方が書かれていました。一番簡単と書かれていたFileZを使って、SDカードに書き出す方法を試しました。しかし、エラーが出てしまいうまくいきませんでした。


    仕方がないので、2番目のHotSyncでPC上にバックアップする方法を試しました。これは、FileZでDatebookDB.pdbのCreaterをdateからABCDのようなものに変更して、AttrsタブにあるBackupオプションにチェック入れたら、HotsyncすればPC上にバックアップできるというものでした。

    しかし、30分くらいHotSyncでDatebookをバックアップしているような状態が続いた後、Hotsyncがようやく終わりました。そして、PCにできたファイルを見たら、Palm上では377KBもあったサイズでしたが、64KBほどしかありませんでした。中身をバイナリエディタでのぞいてみましたが、データらしきものが見えず、適切な状態ではないようでした。2回ほど、それぞれ30分以上時間をかけてトライしてみましたが、結果はかわらず、Datebook.pdbを取り出すことができませんでした。


    Palm2CSV / Palm2iCalを利用

    何か別の方法がないかと探したところありました。

    Palm2CSV / Palm2iCalというページです。ここでは、なんと、PalmDesktopからExportしたdbaファイルから変換できるとのこと。

    画面の全容は以下のキャプチャの通りです。

    image

    英語ですが、Step1から6まで順を追って説明されているので、難しくはありません。Todo (Tasks)の変換もできるみたいです。

    Date Book ArchiveフォーマットでExportしたファイルを用意し、Step4でアップロードして、Step5で、オプションの設定を行って、Step6のConvertボタンを押して、変換してみました。Webから変換後のファイルをダウンロードしたら完了です。問題なく変換できました。オプションが色々とあるので、何種類か試して、所望のファイルになるようにしました。ファイルは、テキストファイルですから後は何とかなりそうです。iCal/icsフォーマットの勉強も少ししないと、どんなフォーマットだと私の使い方に合うのかわかりませんね。

    まだ、Google Calendarへのアップロードは行っていません。


    perlでの変換に再挑戦

    上記で、iCalフォーマットのファイルに変換できましたが、せっかく変換に苦労したperlプログラムも使えるようにしたいなと思って、画策しています。


    しかし、どうやってもDatebook.pdbを取り出せないので、しばらく考えた後、こういう場合は、Palmをハードリセットしてしまうのが良いと思いました。と、ここで、ハードリセットをどうするか思い出せないので、調べものです。まだ、情報はネットに残っていました。ありがたや。


    ハードリセットのやり方:電源ボタンを押したまま、リセットピンを押します。

    電源ボタンは押したまま、最初オレンジのロゴが出て、さらに、Palm Poweredという青っぽいロゴが出てきたら、電源ボタンから手を離して構いません。

    そうすると、データを消してよいかという感じのメッセージがでるので、上ボタンを押して、リセットします。


    ハードリセット後は、素のPalmTXなので、日本語も表示できなくなっています。でも、大丈夫。起動したら、Hotsyncすれば、データが戻るはずです。

    その後に、J-OSを起動して、日本語対応にすればよいと思いました。 ただ、Hotsyncには結構時間がかかりました。


    Hotsync後、J-OSをタップしましたが、フォントデータが足りないとか言われて、少し変です。

    Hotsyncでバックアップされないものがあるようです。私のKazHatPageの記事を見て、j-os font large.prcとj-os font small.prcをインストールして、再度J-OSを起動したら、正常にインストールできました。
    リセットを促され。再起動がしたら、日本語表示ができるようになりました。久しぶりの作業だったので、ちゃんと元に戻るか不安もありましたが、使えるようになりましたので、ここで少しほっとしました。何しろ、古いマシンですし、Palm社のホームページもなく、情報も限られてきている状態ですから。


    まだ少し作業が残っていました。SDHCカードはPalmTXのデフォルト状態では使えませんので、SDHCを実行して、使えるようにしました。このPalmwareは、SDHCではないSDカードに入れておいたので、これをPalmTXに挿して、実行して、元のSDHCカードを使えるようにしました。


    これで、たぶん元の状態に戻せたはずです。

    もう一度、FileZでDatebookDB.pdbのCreatorをPDatからABCDのようなものに変更して、AttrsのタブにあるBackupにチェックを入れてHotsyncしましたが、バックアップできません。どうしようかと思いましたが、PalmTXのCalendar(予定表)の場合、もう一つCalendarDB-PDat.pdbというデータがあるとのこと、こちらの方が新しいフォーマットらしく、情報量も多いということを知りました。

    フォーマットも新しいとは言え、基本的な部分は同じものらしいので、これをダメもとでHotsyncしようと思いました。


    FileZ上で、CalendarDB-PDat.pdbのCreatorをPDatからABCDのようなものに変更して、AttrsのタブにあるBackupにチェックを入れて、Hotsyncしたら、バックアップできました。

    FileZで見た時、DatebookDBは、377KBしかありませんが、CalendarDB-PDatの方は578KBもあり、だいぶ違いが見受けられました。そして、バックアップされたファイルは、420KBと578KBより小さいサイズでした。もしかしたら、エラーか何かで全部はバックアップされなかったのかと心配しても、今はそれを確かめるすべもありません。先に進めましょう。


    早速perlで変換と思いたいところですが、perlプログラムでは、入力ファイル名がDatebookDB.pdbと固定されたプログラムとなっていたことを思い出し、ファイル名を変更しました。

    では変換してみましょう。

    Calendar> perl original/pdatebook2ical-noTabSp.pl
    No handler defined for creator "ABCD", type "DATA"

    というエラーになってしまいました。FileZでCreator名を変更していたのを忘れていました。これをバイナリエディタで元のCreator名のdateに変更しました。

    再度実行してみます。

    Calendar> perl original/pdatebook2ical-noTabSp.pl

    特に何もメッセージも出ずに終わりました。たぶん、処理が完了したようです。同じディレクトリ内を調べると、calendar.icsというファイルができ上っていました。

    このファイルはテキストですけど、文字コードは、UTF-8、改行コードはUnix (0x0A)という形式になっているようです。


    ということで、一度は挫折しましたが、何とか、icsファイルがperlを使ってもでき上がったようです。

    テキストファイルなので、UTF-8が読めるエディタで開けます。後述するデータ構造を理解して、件数を確認したら、Palm上で見た件数と一致していましたので、上述したファイルサイズの件は問題なかったと解釈したいと思います。


    ただ、perlで生成したファイルは、「きみちゃんの人生無茶修行!?」さんの使い方に合わせたフォーマット変更が入っており、少し問題がありました。それは、icsフォーマットのLOCATION情報をコメントの1行目から取得しているので、おかしな感じになってしまっていました。ここは、要修正ですね。

    ここで、2種類のicsファイルができ上った形になります。どちらかを選ぶ必要がありますが、中身がどんな状態か理解しないといけません。でも、このファイルはテキストエディタで処理できるものですから、エディタで開いて、それを見ながら、icsファイルとはどんなもので、何をGoogleカレンダーにアップロードする必要があるのか考えたいと思います。


    icsファイルの考察&最終版データの作成

    私のPalm予定表データをどのような形で引き渡すのが最適か考えました。

    その前に、Googleカレンダーはどのような情報を受け入れているのか見るために、カレンダーのデータをエクスポートしてみました。まだ少ししか入力されていませんが、それを見ることで、適切なフォーマットもわかるだろうとの予測からです。

    iCalendar(ics)の仕様に関しては、iCalendar 仕様を参考にしました。

    階層構造になっていますけど、重要なのは、BEGIN:VENENTからEND:VENENTの部分ですかね。

    ここに、日付、タイトルなどを記述する形のようです。


    DTSTART:

    DTEND:

    RRULE:

    LOCATION:

    CATEGORIES:

    DESCRIPTION:

    SUMMARY:

    といったものが、Palmでも設定していたデータでしょうかね。


    今、手元には、Webで生成したもの、perlで生成したもの、Googleカレンダーからエクスポートしたものという3つのファイルがありますので、それを比較しながら、内容をざっと見ていきます。


    LOCATIONはPalm上でも設定できますけど、使った記憶がほとんどありません。ちなみに、Webで変換したデータには、この項目は入っていませんでした。なくてもよいかもしれません。perlプログラムでも、コメントから取得してみたり、Summaryから取得してみたりしていました。ということは、Palmのデータベースに設定されていても無視されているのだと思います。実害もなさそうなので、ここは目をつむるのが良いようです。私の場合、perlプログラムから、LOCATIONを出力するのはやめた方が良い感じです。


    カテゴリも使っていませんでした。Web変換ファイルには項目は出力されていましたが、中身はすべて空でした。これは、単にそういう処理だったのか、私のデータに設定がなかったのかのどちらかですね。Palm上でカテゴリ設定した予定を作って検証することもできますが、面倒なので、やめます。

    perlプログラムで生成したファイルには、この項目はありませんでした。


    SUMMARYとDESCRIPTIONは、入力した予定のタイトルと、コメント/ノート/詳細のことなので、一番重要な情報ですね。Googleカレンダーから取得したデータを見る限り、文字コードはUTF-8であるべきみたいです。改行コードは、Windowsの(0x0D 0x0A)になっていました。

    また、コメント内の改行は、\n (0x5c 0x6e)という記述になっていました。

    Web生成ファイルでは、\n\nとなぜか2重に変換されていて、perl版では、\Nと、適切に1個でしたが、Nが大文字になっていました。これはプログラムを見てみたら、意図的に大文字にしていたみたいなので、簡単に小文字にできそうです。


    あと問題だったのは、Web生成ファイルではUTF-8が適切に出力できていないようで、エディタでちゃんと表示されなかった点です。UTF-8での出力をやめるオプションにしたら、Shift-JISのまま出力されましたが、改行コードについては、\n\nという2重出力は変わりませんでした。また意図しないところに改行(0x0A)が入っていました。どうも1行の長さが80文字を超えないようにしているようにも思えましたが、その規則性を推察することはできませんでした。

    この辺を見ると、Web版のファイルは問題がありそうですね。


    最後に気にしておいたよさそうなのは、繰り返し予定ですかね。

    RRULEというのが適切に処理されているかどうかという点ですね。ちゃんとフォーマットを勉強していませんが、何件かみたら、何となくそれっぽい状態に見えたので、大丈夫そうです。

    例えば、何日まで繰り返す予定なら、FREQ=DAILY;UNTIL=YYYYMMDDのような感じになっていました。ほかにもFREQ=WEEKLYとかもありました。


    そんなチェックしながら、DTSTARTを見ていたら、perl版は問題ないように見える時刻になっていましたが、Web版は時刻がおかしく見えました。たぶんタイムゾーンの設定の問題かもしれません。13時開始のものが、4時開始と9時間ずれていました。Web版ではTime Zoneを設定するところがあったので、Tokyoを選んだのですけど、何か勘違いしているのかもしれません。ちゃんと設定すれば解消しそうですけど、上述の問題もありましたから、Web版は却下と判断しました。


    ということで、perl版で生成したデータが所望の形になるように、上述の問題点を変更したスクリプトを用意しました。


    最終形態のperlプログラムは、あとで掲載するとして、

    Calendar> perl original/pdatebook2ical-noTabSp.pl

    と前回同様に処理をしました。この時、DatebookDB.pdb (CalendarDB-PDat.PDBのファイル名を変更し、Creator名をdateにしたもの)が、このディレクトリに存在する必要があります。

    そうすると、このディレクトリに、calendar.icsというファイルができ上ります。


    ファイルサイズは、元が420KBだったのに対して、1322KBと巨大化。ファイルの中身をざっと見ると、文字コードは、UTF-8、改行コードは、Unixタイプの0x0a(LF)となっており、コメント内の改行は、\nが1個だけとなっており、問題なさそうでした。件数もちゃんと合っています。

    いよいよ、Googleカレンダーにインポートの時です。

    でもいきなり7000件超のデータをインポートして何か問題があると、削除したり、修正するのも面倒になりますので、生成できたファイルから数件だけ残したファイルを作成してみました。色々な場合を想定して、繰り返し予定あり、なし、コメントの有無のデータというような数種類のデータがあるファイルにしました。

    それをGoogleカレンダーにインポートして、きちんと処理できたか確認しましたが、問題なさそうです。


    では、覚悟?を決めて、Palmの予定表のデータをすべて移すことにしましょう。先ほど作成したファイルは、上述の通り1.3MBと大きくそのままではダメなようです。Googleカレンダーでインポートするファイルに1MBまでというサイズ制限があるからです。そこで、2つに分割することにしました。

    ただ、半分にする訳にはいきません。ファイル構造は、各種のBEGIN〜ENDでくくられて、かつネストしている構造なので、その構造を崩さないように、ヘッダ部を残して、データ部分だけを前半残し、後半残しといった感じで2つに分割しました。


    そして、いよいよGoogleカレンダーにインポートする段階になりました。1つ問題が発生しまして、1回目は、問題なくインポートできたようで、インポートした件数が表示されて完了しました。ところが、2回目は、エラーが発生しました。
    一時的にGoogleカレンダーが使用できないというようなメッセージでした。時間をおいて、試すように書かれていましたが、何度やっても状況は変わりませんでした。そこで、データがどのようになっているのか、確認したら、なぜかデータはインポート済みのように見えました。

    確認のため、エクスポートして、データの件数を数えたところ、2回に分けてインポートした合計の件数と一致しましたので、エラーメッセージが出ましたが、問題なくインポートできたと判断しました。


    その後、Android P9liteでカレンダーを開いて、予定が反映されていることを確認しました。

    これにて、Palm予定表データのAndroidカレンダーへの移行プロジェクトは終了です。


    最後に最終版のperlプログラムを掲載したいところですが、例によって、字数オーバーになってしまったので、次の記事に回します。

    では、また。

    記事へブログ気持玉 / トラックバック / コメント


    Palmのメモ帳データをAndroidへ (perlプログラム)

    2017/05/27 15:00

    前の記事で掲載できなかったperlプログラムを掲載します。

    #!/usr/bin/perl


    # 使い方:perl read_csv1.pl
    # 引数なしで、読み込むファイルは固定。 (プログラムが面倒だったため)
    # 使用ファイル:Palmメモ帳_置換後.csv
    # exportしたファイルの改行コードを0d 0d 0aから0d 0aに置換したもの

    # 概要:Palmのメモ帳をCSV形式でexportしたファイルを処理するプログラム
    # 1レコードは、3つのフィールドで構成。タイトル、プライベート、カテゴリ
    # メモ, プライベートかどうかのフラグ, カテゴリ
    # 3つのフィールドは、どれも""で囲まれている形式だった。
    # メモのデータは、改行コード、,(カンマ)ももちろん含む。"は""となっている。


    # 1メモ1ファイルのテキストデータとして生成。ファイル名は、メモの1行目を使用。
    # カテゴリごとにフォルダを生成してそこに格納。
    # ファイル名が重なった場合は、後ろに(番号)のようなものを付ける
    # ⇒シリアル番号をつけるようにしたので、不要に。
    # プライベートメモには、〆をファイル名の前につける


    # CSVファイルの読み込み方針
    # ファイルは、バイナリとして取り扱う。
    # ダブルクォート内外を判断して処置を進める
    # ・ダブルクォートで始まっているフィールド:
    # ""(連続クォート)を無視して、単独の"まで取り込むと、
    # ""内の改行もそのまま取り込める。普通はその後に、,(カンマ)で
    # フィールドの区切りとなっているか、改行でレコードの終わりになっている。
    # ・ダブルクォートでないフィールド:
    # 単純に、次に見つかる,(カンマ)か、改行でフィールドの区切りとなっている。
    # 改行ならレコードの終わり。

    # 2017/5/26 一応完成


    #まずは、ファイルを読み込む
    $inputFile = "Palmメモ帳_置換後.csv";
    open(IN, $inputFile);
    binmode(IN);
    read(IN, $buf, -s $inputFile);


    # 読み出したバイナリデータを1バイト単位(符号なしchar型)に展開
    @data = unpack("C*", $buf);


    # 変数の初期化
    $inQuote = 0;    # "の中か?
    $fldNum = 0;    # フィールド番号
    $startPt = 0;    # 現在のフィールドの最初の位置
    $currentPt = 0;    # 現在チェックしている位置
    $recordNum = 0;    # 現在のレコード番号 (最初が0)


    $maxPt = length($buf);
    $adj = 0;    # ""で囲まれている時に文字列の長さを調整するためのもの


    printf("読み込んだファイルサイズ=%d bytes\n", $maxPt);

    do {
        $ch = chr($data[$currentPt]);    # 1文字=1バイト取り出す

        if ($inQuote == 1) {
            # クォート内の処理
            if ($ch eq '"') {
                if (chr($data[$currentPt+1]) eq '"') {
                    $currentPt++;    # 次の"を読み飛ばすため
                } else {
                    #次が"でなければ、フィールド終わり
                    $inQuote = 0;
                }
            }
        }
        else {
            # クォート外の処理
            if ($ch eq ',') {
                # 区切りのカンマが来たので、次のフィールドの処理
                $fldData[$fldNum] = substr($buf, $startPt, $currentPt - $startPt-$adj);
                $fldNum++;
                $startPt = $currentPt + 1;
            } elsif ($ch eq '"') {
                # 始まりのダブルクォート
                $inQuote = 1;
                 $startPt++;        # 前の”を外すため
                $adj = 1;
             } elsif ((ord($ch) == 0x0d) && ($data[$currentPt+1] == 0x0a)) {
                # 改行なので、レコードの終わり
                $fldData[$fldNum] = substr($buf, $startPt, $currentPt - $startPt-$adj);
                $currentPt++;    # 次の0x0aを読み飛ばすため
               
                # ここで、ファイルを作成する
                # fldData[0]の1行目をファイル名、fldData[2]をフォルダ名に使用

                # 改行コードで分割して、最初の行をファイル名にする
                $fldData[0] =~ s/""/"/g;    # データ内の""を"に変更しておく
                @filename = split(/\x0d/, $fldData[0]);


    printf("%d(%6X): %s, %s, %s\n", $recordNum, $startPt, $filename[0], $fldData[1], $fldData[2]);


                $dir = $fldData[2];
                if (!(-d $dir)) {
                     # フォルダ(ディレクトリ)があるか確認し、なければ生成。
                    mkdir($dir);
                }


                # ファイル名は以下となるように調整
                # 長すぎないように80文字位を最長にする
                # 使えない文字(\ / : * ? " < > |)以降を削除してしまう。
                # 同一ファイル名がある場合は、後ろに(番号)を付ける
                # 拡張子は、.txtとする
                # ファイル名の先頭に番号を付け、Palmの並びと同じにできるようにする


                # まず全角文字を削除して、残った半角文字に禁止文字があるか調べる
                $fn1byte = $filename[0];
                $fn1byte =~ s/[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]//g;


                if ($fn1byte =~ /[\/:*?"<>|]/) {         
                    # 使用禁止文字が含まれていたら、
                    # 素直にスキャンして、必要な処理をする。
                    # 単に置換すると、漢字コード内の禁止文字コードまで置換される


                    $len = length($filename[0]);
                    $jj = 0;
                     while ($jj < $len) {
                        $fn1 = substr($filename[0], $jj, 1);
                        if ($fn1 =~ /[\x81-\x9f\xe0-\xfc]/) {
                            # 漢字コードの1バイト目だったら、次を読み飛ばす
                            $jj = $jj + 2;
                         }
                        else {
                            if ($fn1 =~ /[\\:*?"<>|]/) {
                                # 禁止文字だったら、改行コードに置換
                                substr($filename[0], $jj, 1, "\n");
                            } elsif ($fn1 =~ /\//) {
                                 # /だったら、-に。大抵、年月日に使用しているので。
                                substr($filename[0], $jj, 1, "-");
                             }
                            $jj++;
                        }
                     } # while
                }


                # 改行/TABコードで分割
                @filename2 = split(/[\n\t]/, $filename[0]);         
                $filename2[0] =~ s/\s+$//;        # 終わりの空白は削除         
                
                # プライベートメモには、ファイル名に〆を付ける
                if ($fldData[1] =~ /1/) { $private = '_〆';    }
                else { $private = '_'; }
                # ファイル名をパスも含めて生成
                $fn = $dir.'/'."$recordNum".$private.$filename2[0].'.txt';


                # 以下はシリアル番号をファイル名の先頭につけたので、意味なし
                $f_num = 0;
                while (-e $fn) {
                    # ファイルが存在した時は、区別するため後ろに(番号)を付ける
                    $f_num++;
                    $fn = $dir.'/'."$recordNum".'_'.$filename2[0].'('."$f_num".').txt';
                }


                # 生成するファイルをオープンする
                open(OUT, "> ".$fn);
                binmode(OUT);
                print OUT $fldData[0];
                close(OUT);


                # 次のレコードのために変数の初期化
                $fldNum = 0;
                $startPt = $currentPt + 1;
                $recordNum++;
                $adj = 0;
            }
        }
        $currentPt++;
    } while ($currentPt < $maxPt);


    close(IN);     # ファイルクローズ

    以上です。

    記事へブログ気持玉 / トラックバック / コメント


    Palmのメモ帳データをAndroidへ

    2017/05/27 14:58

    Androidを少しずつPalmのように使えるように、まずは、データの移行を始めました。

    Palmが、Palmたらしめていたと思われる4大ソフトである、予定表、メモ帳、ToDo、アドレス帳のデータが対象です。

    今頃こんなことをしている人も、それを必要とする人もいないとは思いますけど、記事にしておきます。


    メモ帳からデータを移行

    Palmでは、1つのデータベースでメモを管理しているような感じになっています。これをAndroidに移動させる場合、基本的に、1つのメモを1つのテキストファイルにする感じにしないといけないような感じですね。

    既に先人が色々とトライしたようですけど、これと言った感じのツールが見つからなかったので、自分で何とかしようかと思いました。


    PalmDesktop 4.2のMemosを開いて、Private属性にして、普通の状態では見えないようになっているメモがあれば、それも表示されるように設定しておきます。


    メニューのFile→Export...を選ぶと、ポップアップが出てきて、書き出すファイル名を聞かれます。

    image

    ファイル名は、自分がわかるように適当に入力します。

    Exportタイプは、デフォルトで、mpaとなっていますが、それをプルダウンメニューの中からcsv形式を選んで変更します。Rangeは、全部のメモを書き出すため、Allに変更します。

    image

    Exportボタンを押して、書き出します。


    すると、以下のようなポップアップが出ました。

    image

    3つのフィールドがあり、Memoは、メモの内容そのもの、Privateは、非表示属性、Categoryはカテゴリそのものとなっているようです。

    チェックボックスで書き出す情報を選べるようですが、とりあえずデフォルトのまま、つまり全部にチェックを入れたままOKを押しました。

    そうすると、あっという間にファイルが出来上がりました。私の場合、641件のメモがあり、667KBのファイルが作成されました。


    できあがったファイルの中身をチェック

    csvファイル形式なので、カンマ(,)で区切られているわけですが、指定した3つのフィールドはそれぞれ、""でくくられていました。

    Memoの所は、テキストそのものですけど、SJISで、改行コードは、なぜか0D/0D/0Aという形になっていました。普通のDOS形式だと0D/0Aだと思ったのですけどね。どうも変な感じです。バグのような。

    最初の1行分をタイトルにしているのがPalmのメモ帳の特徴でしたね。

     

    Privateの属性の所は、"1"か"0"となっていました。1がPrivateのメモで、非表示になるもののようです。

    最後のカテゴリは、Palm上でカテゴリ分けしていた時の名称が、ダブルクォーテーション””でくくられていました。

    これら3つの情報がカンマで区切られていて、最後は、0D/0Aで終わって、次のデータにつながっていました。


    先のメモフィールドの改行コードの話、ちょっと検索してみたら、0D/0D/0Aと勝手になってしまう処理系があるという記事を見つけました。0D/0Aとなっているデータを処理する際、0AというUNIXの改行コードだけを見て、DOS用に0D/0Aに変換を掛ける処理系があるらしく、置いてけぼりされた最初の0Dはそのまま残ってしまい、結果として、0D/0D/0Aとなっているとか。


    csvファイルは、テキストファイルですから、テキストエディタなら表示できるはずですけど、改行コードがおかしいせいか、Meadow (emacsのwindows版)でファイルを開いたら、文字化けして、普通に読める状態ではありませんでした。仕方がないので、バイナリエディタで、0D/0D/0Aを0D/0Aに変換したら、Meadow上でも普通に読める状態になりました。なお、元ファイルは、Excelでは読み込んでも問題ありませんでした。このくらいの違いは、Excelなら吸収してしまっているようです。


    どんなデータになっているか理解したので、先人たちの知恵を借りようと思いましたが、よい感じのものが見つかりません。

    仕方がないので、csvファイルを自分で処理しようと考えました。


    プログラム作成方針

    データ形式は、

    ”タイトル+メモ内容”,"1または0",”カテゴリ”改行

    となっているので、""内の改行は無視するようにして、改行コードまでの1行を1レコードとして処理します。


    カテゴリはフォルダ名と考え、そのフォルダにメモのタイトルをファイル名とするテキストファイルを生成していきます。private属性は、それを取り扱えるアプリがないみたいなので、ファイル名にそれとわかる適当な記号を付けることにしました。

    カテゴリは、フォルダ名になりますが、処理を進める時に、そういうフォルダが存在しなければ作成し、既にあれば何もしないようにします。


    ファイル名は、タイトルを使います。しかし、Palmと違って、ファイル名になるので、重複がないようにチェックは必要でしょうね。これは、通し番号をファイル名につけるようにしたので、自動的に重複しないようにしました。並べ替えにも番号があった方が便利ですしね。


    一番面倒な処理は、メモ内容のフィールドですね。改行コードが入っていたりするので、単に改行コードで区切りだと認識しないようにしなければなりませんね。

    また、メモの中身で、"を使っているときは、出力されたファイル上では、""と2回ダブルクォーテションになっているので、1個化しないといけません。


    だいたいのアルゴリズムもできたので、これをperlで処理しようと思います。

    当初、CSV_XSというのがうまく処理してくれるらしいので、インストールしようとしましたが、私の環境 (Windows10上で、cygwinを動かしている) ではうまくできませんでした。原因を調べるのも面倒なので、perlの標準関数などだけで処理してみようと思いました。

     

    幸いなことにcsvファイルを取り扱うためのプログラムソースがいくつか見つかりましたので、それをベースに作成します。

    Perlメモさんの 値に改行コードを含む CSV形式を扱うを参考にしました。

    csvファイルの処理は、人がルールを読むと簡単そうでしたが、ライブラリとか使わないで処理しようとしたら、結構面倒でした。


    作ったperl用のスクリプト

    以下にようになりました。この形になるまで、少しずつデバッグして、一応完成した最終形となります。

    例によって、文字数制限に引っかかってしまったので、スクリプトだけを記事に回します。

    #!/usr/bin/perl

           

    文字数制限から、ここは削除し、次の記事に回します。


    close(IN);     # ファイルクローズ

    そして、これを実行したら、全部で、11カテゴリ、計641件のメモファイルができ上がりました。

    プログラムの中にいっぱいコメントは付けたので、説明は省略します。


    この件数は、私のPalmのメモ帳に登録されている件数と同じなので、プログラムはたぶん問題なく動いたのだろうと思っています。最初は、ファイル名に使用禁止文字を使ってしまっていて、ちゃんとファイルができていなかったり、色々とありました。


    データのコピー

    データの生成は、Windows10上で実行したので、まだファイルは、PC上にあります。これをAndroid P9liteのSDカード上にコピーしました。私が最近重宝しているのは、TeamViewerのファイル転送機能です。

    何にせよ、でき上がったファイルをフォルダごと、Documentsの下にコピーしました。


    で、Android上でどうするかというと、Lesser PadというPalmのメモ帳の感じに近いアプリを先人が作られているので、それから見たりしようと思っていたのでした。

    Documentsの下のフォルダをメモ帳のカテゴリと解釈して、メモ帳データを閲覧、編集できるアプリになっていました。


    でも、1つ問題があり、上記perlで作ったデータは、Shift JISのままにしてしまったのでした。タイトルは、ファイル名なので、リストを見るのは、ファイル転送時に処理されたようで、問題なく表示されました。が、中身は、文字化けしていました。

    Lesser Padで使おうと思う方は、perlのプログラムの少しいじるか、でき上ったファイルの文字コードをutf8に変換してください。


    私はというと、たぶん一番使用頻度の高い、検索して、メモに書かれた情報を読むという用途としては、Lesser Padでは満たされないことに気づき、何かいいものがないかと調べたところ、aGrepというアプリを見つけました。アプリの説明としては、ここの説明あたりがわかりやすいと思いました。

    このaGrepで検索して、メモ帳を表示するなら、SJISのままでも問題なく表示されたので、とりあえず、面倒なコード変換はせずに、しばらく様子を見ることにしました。


    今回はここまで。次は、予定表ですかね。

    記事へブログ気持玉 / トラックバック / コメント


    Huawei P9liteのOTG化

    2017/05/04 13:42

    前回までに、root化、unix系でいうところのスーパーユーザもしくは管理者になることができました。

     

    root化により、システムファイルへのアクセスが可能になります。

    今回は、OTG対応にするためにroot化が必要だったわけです。

     

    ようやく、目的の作業に取り掛かれるところに到達できました。

     

    How to Enable OTG Support on Huawei P9 Liteというサイトの情報に従って設定していきます。

     

    必要事項:

    1. root化されていること
    2. File exploreがインストールされていること
      ES file managerかRoot Explorerを推奨とのことです。
      Root Explorerは有料ですが、ESファイルエクスプローラー無料で同等の機能のようなので、私は、ESファイルエクスプローラーをインストールしました。このアプリで後述のsystemフォルダの中身を書き換えることができるということ。

    これらの必要事項は、クリアしていますし、準備も整ったので、OTG化にトライしましょう。

    1. OTG Enabler packageの取得
      PC上にOTG Enablerパッケージを取り出します。
      以下のリンクからOTG enablerをダウンロードしました。

      Download OTG Enabler Package for Huawei P9 Lite.

      ダウンロードすると、OTG.rarというファイルがダウンロードされます。rarという圧縮形式になっているので、適当なソフトで展開します。

      のぞいてみると、OTGフォルダの中に、otg onとotg offという2つのファイルが入っていました。正直これだけっていう感じです。中身もシェルスクリプトで数行という短さでした。

    2. PCとP9liteをUSBケーブルで接続し、取り出したファイルをフォルダごとスマホ内のストレージか、SDカードにコピーします。
      PC上のエクスプローラにHUAWEI P9 liteが現れ、それをクリックすると、SDカードと内部ストレージが表示されました。
      image_thumb
      あとは、普通にファイルをコピーするように、OTGのフォルダを、SDカードにコピーすればOKです。今回は、SDカードのルートにコピーしました。

    3. コピーしたら、P9lite上で、Root Explorer(または、ESファイルエクスプローラー)を開き、OTGフォルダをSYSTEMに移動します。
      まず、SYSTEMがどこにあるのかもわかりません。ESファイルエクスプローラーの使い方もわからない状態でした。
      調べると、設定から、Rootエクスプローラのチェックを入れないといけないらしいです。
      それと、メニュー(≡)→設定でディレクトリ設定をタップ。ホームディレクトリをタップ。/sdcard/となっているのを/に変更します。←をタップすると、いくつか選択しが出てくるので、/を選択すればよいみたいです。
      そうして、画面上部のmicroSDカードの形をした内部ストレージというボタンを押すと、ファイル群がアイコンで並べられて表示されました。
      画面上部に、今いるディレクトリが表示されていて、適当にタップすると、そのディレクトリに移動できますし、アイコンをタップして移動もできるようです。簡単ですね。
      /sdcardの下にOTGフォルダを見つけました。これを長押しして、画面下に出てくるコピーをタップ、画面上部のディレクトリが表示されている所で、/をタップすると、ルートに行け、その下にsystemフォルダがありましたので、たぶんそこが目的の場所と推定しました。system内のファイル群が表示されている状態で、画面下部に貼り付けというボタンが見えるので、それをタップすると、OTGフォルダが/systemにコピーされました。
      2017-05-03-11-49-50
    4. OTGフォルダのパーミッションを755に変更
      /systemにコピーしたOTGフォルダを長押しして、画面下部にメニューが出たら、他をタップし、ポップアップメニューからプロパティを選びます。下記のような画面が表示されました。
      2017-05-03-11-52-49
      上記キャプチャの下の方にある権限の変更ボタンを押します。
      755に変更せよということなので、グループ、その他に読み込みと、実行権を与えればよいと思います。 以下のような感じですね。
      2017-05-03-11-54-26
      OKを押して設定します。
    5. 次に、Script Runner APKをインストール
      以下のサイトからファイルをダウンロードします。
      Download Script Runner APK for Huawei P9 Lite.
      rarファイルを展開後、ScriptRunnerフォルダを例のごとく、SDカードのルートにコピーします。
      ということでしたが、ファイルサイズが0になってしまっていて、おかしい状態です。
      仕方がないので、Play ストアからScriptRunnerをインストールしました。 
    6. インストールしたら、script Runner APKを開き、その指示に従ってください。
      ここの説明がこれだけだったので、何をしてよいやらという状態でしたが、/system/OTGにあるファイルをスクリプトとして、選択して、 rootにチェックを入れて実行すればよいだけのようでした。

    以上で終わりのはずでしたが、script Runnerで実行したときにエラーが発生します。

    当然、USBメモリ、USBマウスも認識されません。

    OTG ONにしようとして、エラーが発生します。
    ここからまた、苦難の道が始まりました。

     

    OTG化のための試行錯誤

    このスクリプトが何をやっているか調べました。

    #!/system/bin/sh
    echo hoston > /sys/devices/ff100000.hisi_usb/plugusb

    たった2行のスクリプトで、hostonをplugusbに書き込んでいるだけのようです。
    そのplugusbをESファイルエクスプローラーで探そうとしましたが、見つかりません。

    だから、エラーになっているように思いました。

     

    もちろん、この情報だけでOTGが動作するわけもなく、このファイルを無理やり作ってもOTGが動くわけはありません。

     

    ネットで調べたり、ESファイルエクスプローラーで探したりしていたら、見つけました。

    /sys/devices/platform/ff100000.hisi_usb/plugusb

    ディレクトリが違っています。platformというディレクトリ下になっていて、日本版は違っているのかと思いました。では、スクリプト内のディレクトリを修正したらOKだよねと思って、修正しましたが、だめでした。

    どうしてもplugusbに書き込みができません。書き込み権も付加しているのにも関わらずにです。

    plugusbファイル自体はテキストファイルで、ファイルの内容は、

    usb otg status: OTG_DEV_OFF

    write hoston/hostoff/deviceon/deviceoff to change the state.

    となっていました。つまり、hostonとかhostoffと状態を変更すれば、OTGが操作されるという意味ですね。

    現在は、OTG_DEV_OFFとなっていました。

     

    さらに調べると、どうもマウント時に書き込み不可にしてあると、書き込みできないとか、この情報はまだちゃんと確認していません。

    とにかく、書き込みができないので、OTGの状態も変更できない状態ということです。

     

    ここで、OTGチェッカーというアプリをインストールしてみたところ、エラーが表示されました。

    android.hardware.usb.host.xml

    handheld_core_hardware.xml

    というファイルがないというエラーです。

    これらをネット上から探して、/system/etc/permissionsの下に入れました。

    そうしたら、チェッカー上は、OTG対応OKという判定にはなりました。

     

    その後は泥沼でした。様々なツールやら情報を元に試行錯誤しましたが、うまくいきません。

    海外の方の映像で、USBメモリにアクセスできるようになっているのをみて、できるはずなのにと思いながら、やりましたが、私の力及ばずというところでした。

    でききれなかったのは、plugusbに書き込みができるようにすることだけだと思います。これをクリアしてもできる保証はありませんけど、力尽きて、中断としました。

     

    root化の解除

    それには、別の理由が持ち上がったためです。

    root化したことで発生する弊害があることに、遅まきながら気が付いたためです。

     

    radikoが起動しません。代替のラジオ録音なら聞くことはできました。

    Gyaoは親切にroot化している端末では使用できないというメッセージが出ました。

    Chrome上では、音声入力のアイコンがなくなり、音声入力できなくなりました。

     

    ネットで見ても、意外と多いroot化の弊害にあぜんとし、かつ、OTG化もできないので、元に戻したくなりました。OTG対応ができないので、戻すことに反対する理由はありませんから。

     

    しかし、root化したものを元に戻すことに苦労するとは、思いもよりませんでした。

    適切な情報が見当たらず、いきなり実機で試す状況になってしまったからです。

    よく調査ができていなかったという背景もありますが、調べてもあくまでも参考情報としかならず、自分の状況に合っているのか判断して進めざるを得なかったからです。

     

    まず、試したのが、SuperSuなら、簡単に非root化できるという話に飛びついてしまいました。

    私のroot化した環境では、phh Superuserというのがシステムアプリとして登録されている状態でしたが、PlayストアからSuperSuをインストールしてみました。起動すると、競合しているアプリがあるというようなメッセージが表示されたと思いますが、無視して、unrootをいきなり実行してしまいました。

    すると、何となく、rootが解除されたような感じで、ESファイルエクスプローラのroot化とかはできなくなりました。しかし、radikoやらGyaoやらは、まだ、root状態と認識していて、起動せず元に戻っていませんでした。

     

    root権限も行使できないのに、root状態と認識されるという、最もひどい状況に陥ってしまいました。

     

    ならばと、初期化を試みました。この辺から端末は、悪い方向へ転げ落ちていきます。

    でも、前回の経験があるので、少しは、考えてやっていたつもりでした。

     

    ならば、例のダウングレードを実行すればよいと思って、SDカードの/dload/にUPDATE.APPをコピーしようとしたら、PC上からアクセスできません。エクスプローラでみると、P9liteは見えるのに、その下にあるフォルダの中身が空の状態と表示されしまうのです。

    一方、HiSuiteで見ると接続できています。内部ストレージ、SDカードの使用量の表示はされています。
    どちらをクリックしても、エクスプローラではファイルが見えない状態です。ここで、かなり焦りました。

    書き込めないとどうにもなりません。本体からSDカードを出すことも考えましたが、単なる外部ストレージではないように取り扱っているように感じていたので、取り出して、書き換えしたことでさらに状況が悪化することを危惧してやめました。

    それから試行錯誤して、解決策が見つかりました。

     

    内部ストレージ、SDカードがエクスプローラで見えない時は、詳細情報→セキュリティ→HDBの仕様を許可をいったんOFFしてONするという操作をすることが良いようです。

     

    さて、話を戻して、UPDATE.APPをコピーできる状態に戻りましたので、コピーしました。

     

    そして、Android6.0へのダウンロードを実行したくて、音量上げ、音量下げ、電源の3つを押し続けました。

    しかし、音量上げと電源押しと判断されてTWRPが起動してしまいます。

    ここで、意気消沈です。TWRPというまだよくわからないソフトが割り込んでいるため、強制アップデートにいけないという事態のようです。

     

    復旧への足掛かり

    これを何とかしないといけません。

    リカバリイメージファイルを書き込まないと、いけないようですが、それが手元にありません。

    みつけた??G9青春版EMUI4.1_TWRP3.0.2 (最初の2文字は、日本の漢字でないので、ブログ上では??と表示されています)のrecovery_stock.imgをrecovery領域に、fastboot上で書き込みました。
    よく考えると、これは、先日ダウンロードしていましたね。

     

    この書き込み後、USBケーブル接続せずに、音量上げ、電源押しで、起動させても、TWRPが起動しなくなりました。

     

    リブートして、通常起動後、設定を確認しました。OEMロック解除のところは、グレーアウトしていて、ロックに戻せません。また、fastbootモード上でも、oem relockが効きませんでした。

     

    ロック状態でないと、中継パッケージがインストールできないはずですけど、ダメもとで、SDカードの/dloadフォルダに中継パッケージのUPDATE.APPを入れてみました。

     

    そして、いったん電源を切り、3つのボタン、音量上げ、下げ、電源の3つを押し続けてEMUIが起動するまで待ちました。

    そうすると、幸いなことに強制アップデートに入りました。結果がどうなるかは、わかりませんでしたけど、無事再起動して、通常の画面が現れました。初期化されているので、アプリの数は、減っていたりしますけど、ここは、そんなことは関係ありません。すでに経験済みのことなので、重要なのは、バージョンがどのようになったかです。

     

    設定→端末情報→バージョン番号を確認したところ、VNS-L22C900B300とマニュアル通りのバージョンに変わっていました。

    こうなると、復旧に期待が持てます。

     

    次にAndroid6.0にダウングレードするため、今度は、Android6.0のUPDATE.APPを/dloadフォルダに入れました。

     

    そして、前回同様に、3つのボタンを押して、強制アップデートモードに入れました。

    EMUIがアップデートを行い、リブートされると、初期設定の画面が現れました。

    そして無事Android 6.0 (VNS-L22C635B170)として、起動することができました。

    念のため、Root Checkerをインストールして、rootになっていないことを確認しました。

    radikoもインストールしてみましたが、問題なく動作します。

     

    多分、root化状態から完全に復帰できた様子です。

     

    復旧、動作確認

    多分正常状態になったように思えたので、再度Android 7.0にバージョンアップも行います。

    ダウンロードにすごく時間がかかりそうなので、別の作業も行っておきます。

     

    以下は、Android 6.0で行っています。

    まず、adbコマンドが使えなくなっていた件の確認。

    ビルド番号を7回タップして、開発者向けオプションを有効化して、USBデバッグを有効にしたら使えるようになりました。Android 6.0では、たたく回数によって、あと何回タップとかメッセージがでるのですね。親切です。たしか7.0ではそんなことはなかったような記憶が。

    また、OEMロック解除のボタンも動かせるようになっていました。

     

    root状態について調べるため、fastbootモードで見てみると、

    PHONE Unlocked
    FRP Unlock
    ←これは、OEMロック解除に連動

    となっており、root状態の時の表示と変わっていません。

     

    それなら、oem relockできるのかと思いましたが、FAILEDとなり、再ロックできませんでした。

    oem get-bootinfoを行ったら、unlockedと表示されました。

     

    この辺は、よくわかりませんが、少なくとも、radikoが聞けていますから、良しとしましょう。Gyaoも問題ありません。

    少し、すっきりできていませんが、もう少し勉強が必要でしょう。

    もしかしたら、リカバリイメージが本来のものと違っているのが、ダメなのかもしれません。

    それとも、いちどroot化したものを明確化させるため、表示だけは元に戻せないのかもしれません。

     

    完全に工場出荷時の状態にさせることはできませんでしたが、実使用上は問題ない状態に戻せましたので、良しとしましょう。

     

    ということで、P9liteでroot化、そして、元の状態に戻すということができました。

     

    肝心のOTGに関しては、もう少し調べてからトライするかもしれません。

    今回の実験で、root化しても元に戻す方法を得られましたから、よほどのことがない限り文鎮化とか、使えない状態になったりはしないという保険を持てましたので。

     

    購入したOTG対応ケーブルは、以下のようなものです。100円とは思えませんね。

    IMG_20170429_152938

    いつか活用できる日が来るとよいとは思っています。

     

    では、また。

    記事へブログ気持玉 / トラックバック / コメント


    P9lite Android 7.0でroot化・・・完了

    2017/05/03 00:05

    何とか復旧できたP9liteですが、Android 6.0でroot化というのも考えたのですけど、やっぱり最新バージョンにしておきたいと思って、7.0にバージョンアップしました。

    でもroot化、というより、USB OTGを使えるようにしたいという気持ちはありますから、また、調査を始めました。
    今度は、間違えないようにAndroid 7.0 Nougatでroot化、TWRPを使った情報に絞り込んでいくと、見つけました。

    Huawei P9 Lite Nougat Root

    という記事です。YouTubeにも動画が上がっていました。インド系の方なのですかね。英語が聞き取りにくいですね。ページの方に説明があるので、そちらを参考にしていきます。YouTubeで英語の字幕を出せるのですね。これなら、大体わかっていいですね。

     

    7.0でやろうと思っているのは、もし、またダメになっても、6.0にダウングレードしてまた元に戻すこともできることを経験済みだからです。前回はぎりぎりセーフでしたけど、そのレベル位に収まってくれれば、どうにかなるでしょう。

     

    Root化の基本的な流れ

    は、次のような感じですね。

    1. Rootファイルとこの方が言われているファイルをSDカードに書き込んでおき、
    2. recovery.imgをリカバリ領域に書き込んで、
    3. 音量上げと電源ボタンを押して起動させ、TWRPを起動させます、
    4. そして、TWRPからSDカードに書き込んでおいたファイルを本体にインストールさせる

    Rootファイルと呼ばれているものは、ダウンロードすると、複数のファイルが入っていて、boot.imgという新しいブートイメージファイルでしょうか、それと、patch.shというパッチ当てのシェルスクリプト、フォルダの中をのぞくと、superuserになるためのファイルと思われるphh.superuserという名前が入っているフォルダのなかにbase.apkというファイルなどが入っていました。

     

    記事を読むと、この方は、P9lite VNS-L21とL31でテストしたとのこと。私のL22と違いますが、調べると、電波の対応がL21と違うのがメインみたいなので、おそらくソフト的には、似ていると信じましょう。

    また、YouTubeのページのタイトルにB360とあったので、何かと思っていたのですけど、ビルド番号っぽいですね。私のL22は、ビルド番号の最後がB361となっていたので、L21のB360の次の番号ですから、そういうものなのかと考えました。

     

    なお、上述のパッチpatch.shの記述には、L22用の記述も見えたので、それなりにケアされているように思えました。

     

    覚悟を決めて、始めましょう。

     

    現在の私のP9liteは、Android 7.0ですけど、

    1. すでに開発者向けオプションは有効化され、
    2. OEMロック解除は有効になっている状態、USBデバッグも有効になっています。

    通常の動作状態になっていますが、USBケーブルでPCと接続され、HiSuiteで接続されている状態になっています。つまりPCからファイルのコピーなどは簡単に行える状態ということです。

     

    まずは、ダウンロードしたElite Kernel for P9 Lite CxxB3xx v5.1.zipをSDカードのルートにコピーしました。

     

    次に、P9liteをfastbootモードに入れます。

    あっと、その前に、HiSuite上で、バックアップを取っておきたいと思います。パスワードで暗号化はせず、全選択で、PCにバックアップします。ちょっと時間はかかりますが、念には念を入れて。

     

    USBで、PCと接続できている状態で、fastbootモードに入れます。そして、ダウンロードしておいたrecovery.imgを書き込みます。

    あれ、FAILEDとエラーメッセージが出ますね。書き込めません。

    image
    何度やってもダメです。前回はそんなこともなかったはずですけど、また、はまってしまったようです。


    少なくとも、fastbootモードの画面上では、ロックは外れていることを確認済みです。でも考えてみると、ダウングレード時にrelockを掛けた後、何もしてません。どうもそこが怪しそうと考えました。

     

    試しに、fastboot oem unlock <code>を実行してみました。

    以前に試したときは、アンロック状態でこのコマンドを入れても、既にアンロック済みと表示が出たのですが、今回は、アンロックするか?という質問の画面に行きました。

    どうも表示状態とは違い、アンロックされていなかったようです。怪しかったところが確かに悪かったようです。

     

    本体は、一旦リセットされました。再度初期化状態に戻りました。また初期化することになって不要になるかもしれませんが、色々初期設定を面倒がらず、ちゃんとやっておきます。さらにHiSuiteで、復元もしました。

     

    さて、仕切り直しです。はてさて、ちゃんと書き込めるのか?

    image

    今度は、ちゃんと無事に書き込めました。

     

    その後、ノーマル状態で、起動も確認できたので、いったん電源を切ります。

     

    USBケーブル抜き、音量上げと電源ボタンを押して、ロゴが出てくる時まで押し続けたところ、ようやく待ちに待ったオープニング画面が現れました。

    そして、まず下の左の画面となりました。

    DSCN0334

    この画面で、下部の丸を右側にスワイプしました。修正するには、スワイプしなさいと書かれていますね。

     

    すると、以下の画面となりました。

    DSCN0335

    画面上、一番上にある、Installを選びます。

     

    そして、インストールファイルを探して、選択するだけなのですけど、/sdcardの下にあるはずのファイルが見えません。
    格納場所が間違っていたのかと、一旦リブートしてみたり、ルート直下に置いたのがまずかったのかと思い、フォルダに入れようと、新たにフォルダを作りましたけど、そのフォルダ自体も見えません。何かカギになっているものがあるはずですけど、わからなかったので、見えていたフォルダにファイルを入れました。今回は、本体のPodcastsというフォルダに入れてみました。


    そして、再度上記写真の場面からInstallを押したあと、表示されるWindowsのエクスプローラみたいなものから、podcastsを探して、開いたら、ちゃんとファイルElite Kernel for P9 Lite CxxB3xx v5.1.zipが見えました。
    多分何らかの権限が関係しているのだと思いますけど、一度きりの作業ですから、深追いは避けたいと思います。

     

    そのファイルをタップして、選択しました。

    その後、画面下部に出てくる、swipe to installの指示に従って、丸をスワイプすると、インストールが開始されました。そして、上部にSuccessfulと表示されました。

     

    いよいよ最後の作業になります。画面下部のRebootボタンを押し、さらに出てきた画面では、TWRPをインストールしますかと聞かますがで、DO NOT INSTALLボタンを押して、リブートしました。

     

    何事もなく、通常通り起動しました。

    1つ変わったことがありました。通常動作時に、fastbootモードに入れるのに、今までは、adb reboot bootloaderとすればよかったのですが、今はエラーとなりfastbootモードにすることができません。
    仕方がないので、音量下げと電源ボタン長押しで対応するしかありません。

     

    まだどうしてよいかわかりませんけど、まず、本当にroot化できたか確認するため、PlayストアからRoot Checker Basicをインストールしてみました。

     

    チェックしてみると、Root化成功しているとメッセージが出ました。

    Screenshot_20170502-191403

    紆余曲折がありましたけど、何とか成功にこぎつけました。Android 7.0でもroot化できました。

    ネットの情報の扱いに注意していたつもりでしたが、バージョン違いで陳腐化しているとは思いませんでした。でも、初めてのAndroid端末で、root化の作業を試行錯誤しながらやれたので、そこそこの知識は得られたので、良しとしましょう。

     

    でも、ここまでは、本来の目的のための序章にすぎないですから、次が本題ですね。

    きりが良いので、いったんここで区切ります。

    記事へナイス ブログ気持玉 1 / トラックバック 0 / コメント 0


    P9liteの復活!

    2017/05/02 13:23

    前回、書いたように、色々いじっているうちに、とうとう端末はまともな状態でなくなってしまいました。

    工場出荷時の状態に戻そうと思ったのですけど、途中でメモリのパーティションが壊れているので、直すかと聞かれてそうしたら、システムアプリ類の一部が破壊されてしまったようです。

    起動はしたももの

    何度か、起動方法を変えてトライしていたら、幸いなことに起動しました。
    ところが、WiFiのコードを入力するところになったら、なぜかGoogle音声入力しか表示されず、キーボードになりませんでした。もちろん、ネットにつなぐ前なので、音声入力は使えない状況です。
    どうしようもないので、スキップしながら、ホーム画面にはたどり着きましたが、さきほど書いたように少しのアプリだけが画面に表示されている状態で、惨たんたる有様でした。画面上はスカスカ状態で、さびしい状態なので、あぜんとしました。

     

    まずは、キーボードを何とかインストールしたいと思っても、ネットにつなげないので、Google Playにもつなげない状況。

    PCから何とかならないかと思って、接続設定して、USBケーブルをつなぐと、HiSuiteにはつながりました。

    今までなら、ここで、HiSuiteの復元で全アプリをP9liteに再書き込みをして、アプリや、設定を元通りにできたのですけど、今は、Huaweiバックアップアプリがないというメッセージがでて、中断します。システムアプリのバックアップも壊れてなくなってしまったようです。

    非常にあせりました。でも心を落ち着けて、まずは、ネットにつなげられるようにしようと思いました。そのためには、キーボードが使えないとキーを入力できません。

     

    USBでPCと接続して、アプリのインストール

    USB接続状態では、コマンドプロンプトからもアクセスできることは確認できました。

    apkファイルをインストールできる方法があるということを発見しました。

    HiSuiteでバックアップしたファイルの中に、キーボードアプリがないかと思って探したところ、com.google.android.inputmethod.latin.apkというものを発見。何となくそれらしいと思っただけです。

    PC上で、

    >adb install ?r com.google.android.inputmethod.latin.apk

    と入力すると、SuccessのメッセージがPC上で見え、インストールができたようでした。

    P9lite上で操作してみると、キーボードアプリとして使えることができました。

    これにより、WiFiの設定ができ、ネットにはつなぐことができました。

     

    バックアップから復元できず

    そこで、早速Playストアに行き、Huaweiバックアップを探して、インストールしようとしましたが、エラーが出て、インストールできません。再度リセットしてみたり、色々トライしましたが、どうしてもインストールできず、困り果てました。

    もちろん、そのほかのアプリは、手動で、キーボードアプリのように戻すこともできるとは思いますけど、いわゆるシステムアプリがないのは、困ります。たぶん、バックアップされているファイルには含まれていないようだと思われ、将来元に戻せる可能性もありません。

    せっかくの端末をダメにしてしまったかと、修理に出すしかないと思い始めました。

     

    Android 6.0へダウングレード

    ふと、Android 6.0へのダウングレードが、Hauweiから正式にサポートされていることを思い出しました。
    ユーザデータは消えますが、そっくり6.0のシステムに戻してくれるなら、私の端末も元に戻るかもしれないと思いました。既にユーザデータもない状態なので、怖いこともありません。怖いのは、完全に動作しなくなる文鎮化ですね。

    http://consumer.huawei.com/jp/support/mobile-phones/p9lite-jp-sup.htm
    から、マニュアル、中継パッケージ、Android 6.0パッケージをダウンロードしておきます。

     

    マニュアルを読みながら早速やってみます。
    最初に要件を読むと、既存バージョンに対して、ロック解除、Root化が行われていないことが必要と書いてありました。

    Root化は失敗したので、問題ないと思われますけど、ロック解除はしてしまっているので、元に戻さないといけません。

     

    色々調べて、試行錯誤した結果、再ロック (relock)できることがわかりました。これがロック状態と違うのかどうかもわかりません。少なくともlockはできませんでした。

     

    再度ロックかけるには、fastboot oem relock <16桁のコード>とすればよいようです。


    Tips:
    FASTBOOTモードに入れるのに、今まで、電源をオフしてから、電源ボタン+音量downを押すということを苦労してやっていました。長めに押すので、結構面倒ですね。

    でも、P9liteが普通に動作している状態で、USBケーブルをつないだ状態で、PC上で、

    adb reboot bootloader

    と実行するだけで、簡単にFASTBOOTモードに入れることが、ようやくわかりました。これは非常に便利です。
    実は、fastbootコマンドを実行できる状態、つまりFASTBOOTに入ってから、上記をやったことがあったのですが、エラーとなってしまったので、使うのをあきらめていました。使えるのがいつなのかを理解していなかったでした。


    image

     

    この後、fastbootモードにしたところ、

    PHONE Relocked

    FRP Locked

    と、FRPの方は、Lockedのままだったですけど、元に戻す方法がわからなかった(後で、わかりました。設定→開発者向けオプション→OEMロック解除を有効にするを解除すればよかったのでした)ので、この状態で、ダウングレードを開始してみました。結果として、それで問題ありませんでした。

     

    これで、要件は満たしたと思いますので、ダウングレードを実行していきます。

    Step1

    Huaweiの手順書のStep1は、バックアップですけど、ここはスキップしました。すでに本体は、バックアップするようなデータもなかったからです。

     

    次に、

    Step2の中継パッケージバージョンにアップデート

    オフィシャルサイトからダウンロードした中継パッケージのdloadフォルダ、中身は、UPDATE.APPだけですけど、これをSDカードのルートディレクトリに保存します。これは、USBケーブルでPCとつないで、PC上のエクスプローラを使って、コピーしました。

    これで準備完了です。

    電源をオフした状態から、音量+、音量-、電源ボタンの3つを同時に押して強制アップデートモードに入れるとのこと。およそ20秒ほどで、EMUIとinstallingの表示が見えるまで、押し続けました。途中10秒後くらいに、Huaweiのロゴが出ても、それに惑わされず押し続けないといけないと思われます。

    インストールが終わるまで待ちます。

     

    Step3:中継パッケージバージョンを確認

    Step3のため、電源を入れます。起動後のホーム画面は、特に変わりなく、私の端末の悲惨な状況は変わっていませんが、バージョン番号を確認せよということなので、マニュアルに記載の通りのバージョンになっていることを確認しました。うまくいったようです。

    この時、Androidのバージョンは、7.0のまま、EMUIは5.0のままでした。

     

    次に、いよいよ、

    Step4のAndroid 6.0へダウングレード

    します。

    さきほどと同様に、オフィシャルサイトからダウンロードして、同じdloadフォルダ内のUPDATE.APPをP9liteのSDカード上にコピーします。こちらは、2.75GBと非常に大きいファイルですね。(先ほどのファイルは、75MBでした) そのため、SDカードへのコピーに少し時間がかかりました。
    その後、中継バージョンの時と同様に、電源を切った状態から、3つのボタンを同時に押して、強制アップデートを行いました。

    こんどは、少し長めの時間がかかりましたけど、インストールが完了したようです。

    Step5:OS のバージョン番号の確認

    電源を入れてみると、購入直後に電源を入れた時を思い出させるように、初期化手順が始まりました。キーボードも使えています。WiFiの設定、Googleのログインなど、きちんと設定でき、ホーム画面に戻りました。

    そして、バージョンの確認をします。しっかり、Android 6.0、EMUI 4.1.1となっていることが確認できました。画面上のアイコンも、初期に入っているアプリが全部揃っている様子です。

    ツールの中には、バックアップもありました。

     

    USBケーブルで、PCと接続して、HiSuiteの復元を実行してみます。

    バックアップは、Android 7.0で行ったわけですけど、ちゃんと動き出しました。一安心です。

    そして、Android 6.0として、少し前までAndroid 7.0で使っていたアプリが復元されました。Androidのバージョンが違っていても復元できるとはすばらしいですね。2つほど未完了となりました。1つは、天気、もう1つは、迷惑フィルタでということで、実質、問題はなさそうです。

    画面の配置も元通りです。

     

    P9lite復活!

    一時は、どうなることかと思いましたが、何とか元通りになりました。ふー、よかったよかった。

     

    今回、P9liteをAndroid 7.0でroot化したのがまずかったのかもしれません。古い情報では、問題なくroot化できていたようですけど、最近の情報を見ると、7.0ではだめだったという情報が見つかりました。

     

    せっかく6.0にダウングレードしたので、root化に再挑戦してみますかね。

     

    では、また。

    記事へブログ気持玉 / トラックバック / コメント


    P9liteの使いこなし・・・root化できず、それよりひどい状態に。

    2017/05/02 11:32

    P9liteでよくTeamViewerを使います。

    フルHDのディスプレイですから、PCの画面をドットバイドットで表示されるので、非常に良い感じです。

    確かに表示は、5.2型のディスプレイに表示されることになるので、非常に細かくなりますけど、すごい技術ですね。

     

    Team Viewerは、基本的にタッチして操作するわけですが、マウスが使えると、よりWindowsライクに使いこなせるようになって、よいのではと思っていました。

     

    調べてみると、Androidスマホは、OTGがサポートされていて、microUSBから変換コネクタを介してUSB機器、例えばマウス、キーボート、USBメモリなどを、特別なことをしなくても接続して使えるということなので、ぜひやってみたいと思いました。

     

    OTG対応のmicroUSB(オス)-USB-A(メス)ケーブルを調達すれば良いようです。

    今は100円ショップでも売っているという情報を見て、近くのセリアに行ってみましたが、残念ながらありませんでした。そのあと、ちょっとキャンドゥに寄ってみたら、なんと売っているではありませんか。

    早速購入しました。たった100円ですからね。

     

    そして、早速P9liteにケーブルをつないで、USBマウスをつなぎましたが、何も変化がありません。

    調べてみると、な、な、なんとP9liteはOTGをサポートしていないということらしいです。ほとんどの機種ではOTGをサポートしているとの情報だったので、安心していたのですが、思わぬところで、落とし穴にはまってしまいました。やはり格安端末だからですかね。残念。

     

    一方、Bluetoothのマウスをちょっと試せる機会があったので、設定→Bluetooth→BluetoothをONにして、マウスを認識させると画面上にカーソルが出てきて、タップ替わりのマウスクリックで使うことができました。
    当たり前ですけど、ちゃんとBluetoothを通してマウスが使えることを確認できました。

    しかし、残念ながら、TeamViewerにはマウスを認識してもらえませんでした。う〜ん、そうなのか。それはそれで困った自体ですが、タブレットモードならOKとかという情報を見かけたりしたので、マウスを使える環境になってから考えたいと思います。

     

    ところで、OTGサポートかどうかは、設定→メモリとストレージで、USBストレージの項目があればサポートされているらしいのですが、確かにそれらしき表示はありませんでした。

     

    ここであきらめきれないので、再びネットで調べてみました。日本語のサイトではP9liteでOTGは対応できないという情報しかみつかりませんでした。しかし、海外サイトで見つけました。

    How to Enable OTG Support on Huawei P9 Lite

    https://androidtutorial.net/2017/03/02/enable-otg-support-huawei-p9-lite/

     

    デフォルト状態ではサポートされていないので、簡単にOTG対応にできるわけではありません。少し手間がかかります。書かれている情報に基づいて、トライしてみます。

    いくつかのサードパーティのAndroidデベロッパーがOTG化する方法を見つけたと書かれていて、その方法は100%成功したとのこと。

     

    期待が高まります。

     

    必要事項:

    ルート化→始めにブートローダのアンロック

    1. Huaweiからアンロックコードの入手:
      開発者向けオプション:設定→端末情報→ビルド番号を複数回(7回らしい)タップ。これにより、設定内に開発者向けオプションというメニュー項目が現れます。

      P9lite本体のアンロックコードを入手するためHuaweiに登録が必要みたいです。
      以下のページに行き、
      http://emui.huawei.com/en/plugin.php?id=unlock&mod=unlock&action=apply 
      image
      が表示されるので、Huawei IDを持っていなければ、上記キャプチャの一番下にある、Registerを押して、先に登録が必要です。
      以下のような画面が出るので、
      image
      メールアドレス+Verification code(メールアドレス入力後、この欄の右のボタンを押すと、すぐにコードが送られてくる)、パスワードの設定、どこに登録するかJapanはないので、デフォルトのHongKongのままで登録(Registerボタン)を押す。

      すると、以下のような画面に移動しました。
      image
      上に並んでいるメニューからDOWNLOADを押すと、契約条件が英語で表示され、合意するにチェックを入れ、Nextを押すと、以下の画面が出ます。
      image
      各番号の取得の方法は、入力ボックスの右側にの説明の所をクリックすると、表示されます。
      ・Product Serial number=設定→端末情報→端末の状態→製造番号
      ・Product IMEI or MEID: IMEI1をまず入力する。だめだったら、IMEI2。設定→端末情報
      ・Product ID=製品ID:*#*#1357946#*#*に電話を掛けると得られます。音声電話を契約していなくても大丈夫そうです。
      Commitボタンを押すと、同じ画面に、Your unlocking password is : ****************と、16桁の数値が得られます。
    2. 得られたアンロックコードを設定
      Unlockの手順は、上記16桁のコードを取得したCommitボタンの下にある
      Please read the unlocking procedure once you have obtained the unlock password.
      を押して出てくる画面に書いてありました。

      その手順に従って進めます。
      Step 1:
      (1) Huawei Device websiteからphoneドライバをダウンロードして、PC上にインストール。
      特にリンクとかなかったのですけど、検索してそれらしいHiSuite_5.0.1.300_OVE.zipというファイルをダウンロードしました。インストールして、起動したら、新バージョン5.0.2.300_OVEに更新するとあり、再度インストール画面になりました。
      起動すると、USBケーブルで接続するというボタンが見えたので、ボタンを押してからUSBケーブルを接続しました。でも認識されませんでした。
      設定→詳細設定→セキュリティ→HiSuiteからHDBの使用を許可
      としたら、接続が認識され、PC上にP9liteの画面が表示されました。

      (2) ADBツールキット(Google提供)をダウンロードしてPC上にインストール。fastboot.exeが入っているディレクトリを確認しておくこと。 以下は、検索して、これなら大丈夫そうという手順
      ・Jave SEの最新版をダウンロードしてインストール。jdk-8u131-windows-x64.exe
      ・Androidのデベロッパー向けサイトからAndroid SDK本体をダウンロード。将来プログラムの開発もしたいと思っているので、SDK本体だけではなく全部インストールしました。

      起動したら、ウインドウの下の方にあるconfigureからSDK Managerを選びます。
      SDK Toolsのタブで、以下の2つ
      Android SDK Platform-Tools
      Google USB Driver
      をインストールします。後者は、必要か不明でしたが、インストールされていなかったので、インストールしました。

      確認必要なのは、どこにインストールされたかということです。私の場合、以下のディレクトリでした。
      C:\Users\(ユーザ名)\AppData\Local\Android\sdk\platform-tools
      にadb.exeにあればよいようです。また、同じフォルダにfastboot.exeもありました。これらは、今後の作業に必要な重要なものです。どこからでもこれらの実行ファイルを使えるように、環境変数のPATHを変更しておくとよいかと思います。

      Step 2: アンロック
      設定→開発者向けオプション→OEMロック解除を有効にする
      PINを入力して有効化。最初このPIN何だったか思いつかなかったのですけど、電源を完全に切った後に起動したときに入力するPINと気づき設定できました。
      ここは、実際には、以下をトライして問題が生じてから気づきましたので、私が実行した手順とは正確には異なりますけど、ここに書いておきます。
      (1) デバイスをfastbootモードに入れる:
      デバイスの電源を切ります。その後、最低10秒間、電源と音量下げるボタンを押し続けて起動します。
      P9lite場合、電源ボタンを少し長押しして、画面に表示される電源を切るをタップし、再度タップを促す画面(電源をOFF)が出てきて、タップすると、電源が切れました。また、電源入れるときは、なぜかわかりませんけど、USBケーブルを接続していないと、FASTBOOT画面になりませんでした。
      そうすると、FASTBOOT&RESCUE MODEと表示された画面が出てきました。 これを出すまでにずいぶん、試行錯誤して、時間もかかりました。
      DSCN0329
      画面下の方にLockという表示が見えますね。

      (2) PCと接続:
      USBケーブルでPCと接続します。私の場合、すでに接続済みですけどね。
      PC上では、コマンドプロンプトを起動して、上記のadb.exeがあるディレクトリに移動しておきます。PATHを通しておけば、どこにいても問題ないと思います。
      そして、fastboot.exe devicesと入力してEnterを押し、接続状態の確認をします。
      番号(製造番号) fastboot
      と表示されれば、適切に接続されているようです。
      image
       
      (3) unlockコマンドの実行:
      コマンド プロンプト上で、以下のコマンドを入力します。
      fastboot oem unlock ????????????????
      ??は、Huaweiのページで取得した16桁のunlock用パスワードです。
      image
      P9liteの画面が変わりました。
      DSCN0330
      FRPの所がUnlockになりました。これは写真で画面を撮ったのですけど、この時のものだったか自信がありません。すいません。
      (追記) このFRPは、開発者向けオプションで、OEMロック解除を有効にすることで、Unlockになるということがわかりました。最初の写真は、それをしないで、Fastbootに入ったときのもので、こちらは、ちゃんとOEMロックを外した時の写真でした。

      (4) デバイスのブートローダーがアンロックするのを待ちます。
      アンロックするかどうか、Yes/Noを音量ボタンで選択(赤字が選択されている状態)して、電源ボタンを押します。
      画面に警告されているように、全個人データが消去されます。(工場出荷状態にリセット)
      DSCN0333
      まっさらな状態になるので、画面の指示に従って設定を行っていきます。
      HiSuiteでバックアップを行ったので、復元もしてみました。最初画面の指示で、たぶんGoogleがバックアップしたものを復元しましたが、画面上のアイコンの並びはめちゃくちゃになってしまいました。しかし、HiSuite上で復元したら、それも含めてきれいに直りました。ただし、アプリの復元のところで、エラーが発生しました。ESエクスプローラーが怪しそうなので、それだけ復元するのをやめてみたら、復元が成功しました。

      (5) アンロックに成功しているか確認:
      これは、上述の(1)(2)と同様にして、
      fastboot oem get-bootinfo
      をPC上で実行して、メッセージがunlockedとなっていたら成功しているということになります。
      そうしなくても、P9lite上は、FASTBOOT&RESCUE MODEの画面で、
      PHONE Unlocked
      FRP Unlock
      となっているので、確認するまでもないのかもしれません。
      通常の画面に戻すため、電源ボタンを長押ししたら、再起動がかかります。

      これでようやくroot化が完了しました。と思ったら、まだアンロックできただけでした。
    3. TWRPのインストール
      TWRPの導入が良いらしいので、入れてみます。
      以下のページに従って作業していきます。6まで完了していますね。
      https://forum.xda-developers.com/huawei-p9lite/help/twrp-root-huawei-p9-lite-t3401215

      手順の7から
      https://mega.nz/#!FtB2gZKL!vEa351gke...zlFdOMGMmucb2g
      から??G9青春版EMUI4.1_TWRP3.0.2.rarをダウンロードしました。ファイル名の中国漢字がよろしくないのかそのままでは展開できませんでしたので、ファイル名を変更して展開すると、3つファイルが入っていましたが、目的のものは、recovery_twrp.imgらしいです。
      また、Fastbootモードに入って、以下を実行します。
      fastboot flash recovery recovery_twrp.img
      これは、TWRPをリカバリ領域に書き込んでいるようです。
      OKAYと表示されていますね。問題なければ、リブートします。
      fastboot reboot
      以下は、そこまでの画面キャプチャ。
      image

      して、もう一度電源を切ります。

      SuperSuをダウンロード。これは、展開しないこと。
      今回は、SR3-SuperSU-v2.79-SR3-20170114223742.zipがダウンロードできました。

      USBケーブルを抜き、音量上げと電源ボタンを押して、TWRPに入れとのこと。この時、手を離すタイミングが大切みたいです。ロゴが出るのと同時に手を離す必要があるとのこと。
      でも、TWRPが起動しません。何回かトライしましたが、だめでした。recoveryデータに問題あるかもしれないと思い、調べてみると、しましたが、だめでした。recoveryデータに問題あるかもしれないと思い、調べてみると、別のサイトが見つかりました。
      TWRP-3.0.2-0-hi6250-v4.zip
      バージョンは、同じ3.0.2ですけど、同じファイルではなさそうです。再度書き込んで電源を落として、音量upと電源ボタンを押して、ぶるっとして、Huaweiのロゴが出たら、手を離すと、開始したとのメッセージが出た状態で、その先のTWRPの画面に移行しません。

    ここから長い試行錯誤が始まりました。ファクトリリセットとかも実行したり、そして、、、
    ほぼ文鎮化に近い状態に。何とか起動はしたものの、キーボードもでず、WiFiの設定もできず、システムアプリのバックアップアプリがなくなって、HiSuiteから復元も機能しなくなってしまいました。ネットもつながらず、キーボードもなし、入力は音声入力だけが残っていますが、ネットにつながらないので、あっても機能せずの状態。にっちもさっちもいかないような感じです。

    何がまずかったかというと、起動時にパーティションがおかしいから直すかというようなメッセージが出て、そちらを選択したため、システムファイルを破壊してしまったらしいです。

    さらに、検索範囲を最近に絞ってみていたら、Android 7.0 (これは私のP9liteのバージョン)では、TWRPが動かないとかいう情報も見つかりました。3月くらいまでは、6.0でしたから、それに基づいた情報でひたすら試行錯誤していたのでした。

    現在、意気消沈の状態ですけど、まだ、完全に動かなくなったわけではありませんから、方法を探りたいと思います。誰かのご参考になれば。

    記事へブログ気持玉 / トラックバック / コメント


    グラフィックLCDのプログラミング その4

    2017/03/26 12:39

    前回までで、全部のソースがそろいました。

     

    では、コンパイルしてみましょう。


    Memory Summary:
        Program space        used  1FF1h (  8177) of  2000h words   ( 99.8%)
        Data space           used   24Ch (   588) of   400h bytes   ( 57.4%)
        EEPROM space         used     0h (     0) of   100h bytes   (  0.0%)
        Data stack space     used     0h (     0) of   186h bytes   (  0.0%)
        Configuration bits   used     2h (     2) of     2h words   (100.0%)
        ID Location space    used     0h (     0) of     4h bytes   (  0.0%)


    You have compiled in FREE mode.
    Using Omnicient Code Generation that is available in PRO mode,
    you could have produced up to 60% smaller and 400% faster code.
    See http://www.microchip.com/MPLABXCcompilers for more information.

    make[2]: Leaving directory 'D:/My_Documents/PIC/GraphicDispUnit/DisplayUnit.X'
    make[1]: Leaving directory 'D:/My_Documents/PIC/GraphicDispUnit/DisplayUnit.X'

    BUILD SUCCESSFUL (total time: 8s)
    Loading code from D:/My_Documents/PIC/GraphicDispUnit/DisplayUnit.X/dist/default/production/DisplayUnit.X.production.hex...
    Loading completed


    という感じで、成功しました。

     

    PICkit2で、書き込みを行い、動作させると、最初に、全96文字の半角英数が表示され、オープニングのメッセージが表示された後、以下のような表示となりました。成功です。

    PIMG_20170326_115129_thumb[5]_thumb

    8ドット角の漢字も読めますね。

    でも、表示速度が意外と遅い感じとなりました。

    PICの速度を32MHz化とか行って、高速化が必要そうです。

     

    しかし、問題は、プログラムのサイズです。上記に示したように、すでに8177ワード、99.8%の大きさとなっており、ほとんど追加の余地はありません。上述したようにまだ、改善余地は色々あるのに。。。

     

    プログラム領域が8Kワードというのは、色々やるには、やっぱり狭いですね。特にフリーの環境で行う場合は、最適化が十分されないので、以前も書いたように苦しいと思います。PRO版なら、60%も小さくなるって、魅力的ですね。それより、やっぱり、64Kバイト、32Kワードもある18F26K22を使うのがよいかな。28ピンなので、ちょっと大きいのが玉に瑕。今のブレッドボードの配置だと載せきれませんね。

     

    価格も若干高めだしと思ったら、今は、260円(秋月電子)なのですね。以前購入した時は、330円でしたからずいぶん値下がりしています。16F1829は160円ですから100円の違いですね。

    でも、この1個だけ購入するというのも、送料を考えると得策ではありませんから、当面見送りですかね。

     

    まあ、悩みながら趣味を楽しみたいと思います。今回は、ここまで。

    記事へブログ気持玉 / トラックバック / コメント


    グラフィックLCDのプログラミング その3

    2017/03/26 12:33

    いよいよ最後のファイルです。lcdg.cは以下となります。

    #include "mcc_generated_files/mcc.h"
    #include "lcdg.h"
    #include "font.h"


    /*
    * AQM1248A-RN 48x128ドット SPI接続グラフィックLCD
    * 制御ルーチン
    */

    //------ Command Write -----
    void LCDgCmd(uint8_t data) {

        LCD_CSB_SetLow();   // CSB=0にして、チップセレクト
        LCD_RS_SetLow(); // RS=0にして、コマンド指定
        SPI2_Exchange8bit(data);    // data書き込み
        LCD_CSB_SetHigh();  // チップ選択解除して、終了
    }

     

    //------ Command Data -----
    void LCDgData(uint8_t data) {

        LCD_CSB_SetLow();   // CSB=0にして、チップセレクト
        LCD_RS_SetHigh(); // RS=1にして、データ指定
        SPI2_Exchange8bit(data);    // data書き込み
        LCD_CSB_SetHigh();  // チップ選択解除して、終了
    }

     

    /*
    * AQM1248A グラフィック液晶の初期化
    * メーカー推奨手順
    */
    void LCDg_init() {

        LCDgCmd(0xae); // Display = OFF
        LCDgCmd(0xa0); // ADC = normal
        LCDgCmd(0xc8); // Common output = reverse
        LCDgCmd(0xa3); // bias = 1/7

        // 内部レギュレータを順番にON
        LCDgCmd(0x2c); // power control 1
        __delay_ms(2);
        LCDgCmd(0x2e); // power control 2
        __delay_ms(2);
        LCDgCmd(0x2f); // power control 3

        // コントラスト設定
        LCDgCmd(0x23); // Vo voltage resistor ratio set
        LCDgCmd(0x81); // Electronic volume mode set
        LCDgCmd(0x1c); // Electronic volume value set

        // 表示設定
        LCDgCmd(0xa4); // display all point = normal
        LCDgCmd(0x40); // display start line = 0
        LCDgCmd(0xa6); // display normal/reverse = normal
        LCDgCmd(0xaf); // display = ON

    }

     

    /*
    * 1バイト文字表示
    * data= ASCIIコード(1バイト、0x20-0x7f)をもらう
    */
    void LCDg_chr(uint16_t data) {
        int ii;

        for (ii = 0; ii < 8; ii++) {
            LCDgData(font[data - 0x20][ii]);
        }
    }

     

    /*
    * 2バイトのShift JISも対応できるように
    */
    void LCDg_str(char *str) {
        uint16_t kanji;


        while (*str) { //文字列の終わり(00)まで継続
            if (*str < 0x20) {
                //特殊文字
                switch (*str) {
                    case 0x0a: break;
                }
            } else if (*str < 0x80) {
                LCDg_chr(*str++); //1文字出力し、ポインタ+1
            } else {
                // 2バイト文字
                kanji = *str;
            }
        }

    }

     

    /*
    * 128x48ドット
    * ドット単位で、X,Y座標を引数とする
    * ただし、Y方向は、8ドット単位に丸められる
    */
    void LCDg_pos(uint8_t x, uint8_t y) {
        // カラムアドレス設定:X方向は、ドット単位
        LCDgCmd(0x10 | (x >> 4));
        LCDgCmd(x & 0x0f);

        // ページアドレス設定:Y方向は、8ドット単位
        LCDgCmd(0xb0 | (y >>3));


    }

     

    /*
    * Screen配列に格納されている文字コードに従い、画面表示
    */
    void LCDg_Update() {
        char ii, jj, kk;
        uint8_t fontdata[8];
        //4ビットのドットデータを縦2倍に変換するテーブル
        const char trans[] = {0x00, 0x03, 0x0c, 0x0f, 0x30, 0x33, 0x3c, 0x3f,
            0xc0, 0xc3, 0xcc, 0xcf, 0xf0, 0xf3, 0xfc, 0xff,};

        switch (YscrMax) {
            case 3: //縦2倍モード
                for (jj = 0; jj < YscrMax; jj++) {
                    LCDg_pos(0, jj * 16);
                    for (ii = 0; ii < XscrMax; ii++) {
                        for (kk = 0; kk < 8; kk++) {
                            LCDgData(trans[font[Screen[ii][jj] - 0x20][kk] & 0x0f]);
                            if (XscrMax == 8)
                                LCDgData(trans[font[Screen[ii][jj] - 0x20][kk] & 0x0f]);
                        }
                    }
                }
                for (jj = 0; jj < YscrMax; jj++) {
                    LCDg_pos(0, jj * 16 + 8);
                    for (ii = 0; ii < XscrMax; ii++) {
                        for (kk = 0; kk < 8; kk++) {
                            LCDgData(trans[font[Screen[ii][jj] - 0x20][kk] >> 4]);
                            if (XscrMax == 8)
                                LCDgData(trans[font[Screen[ii][jj] - 0x20][kk] >> 4]);
                        }
                    }
                }
                break;
            default:
                for (jj = 0; jj < YscrMax; jj++) {
                    LCDg_pos(0, jj * 8);
                    for (ii = 0; ii < XscrMax; ii++) {
                        if (Screen[ii][jj] < 0x80) {
                            LCDg_chr(Screen[ii][jj]);
                            //Xアドレスは自動的にインクリメントされる
                        } else {
                            ReadFontData(Screen[ii][jj]*256+Screen[ii+1][jj], fontdata);
                            ii++;
                            for (kk = 0; kk < 8; kk++) {
    //                            LCDgData(fontdata[kk]);
                                LCDgData(fontdata[kk]);
                            }

                        }
                    }
                }
                break;
        }
    }


    /*
    * テキスト表示のクリア
    * Screen配列に空白を書き込み、Updateする
    */
    void LCDg_cls() {
        int ii, jj;

        for (jj = 0; jj < 6; jj++) {
            for (ii = 0; ii < 16; ii++) {
                Screen[ii][jj] = 0x20;
            }
        }
        LCDg_Update();
        // 画面消去した後は、カーソル位置を0,0にする
        LCDg_setCursorPos(0, 0);
    }

     

    /*
    * カーソル位置設定
    */
    void LCDg_setCursorPos(char x, char y) {
        ScreenPosX = x;
        ScreenPosY = y;
    }

     

    /*
    * Screen配列に文字コードを書き込み、画面を更新
    *
    * 画面いっぱいになったら、スクロールする
    * カーソル位置を意識せずに、一種の表示ターミナルとして使用可能
    */
    void LCDg_print(char *str) {
        int x, y; 

        while (*str) {
            if (ScreenPosY >= YscrMax) {
                // スクロールをここに置くことで、最終行が空行に見えることがなくなる
                //Screenのデータを1行スクロールアップ
                for (y = 0; y < YscrMax - 1; y++)
                    for (x = 0; x < XscrMax; x++)
                        Screen[x][y] = Screen[x][y + 1];
                //最終行のデータをクリア
                for (x = 0; x < XscrMax; x++)
                    Screen[x][y] = ' ';
                ScreenPosY--;
            }
            switch (*str) {
                case '\n':
                    ScreenPosX = 0;
                    ScreenPosY++;
                    break;
                default:
                    Screen[ScreenPosX][ScreenPosY] = (char) *str;
                    ScreenPosX++;
                    if (*str >= 0x80) {
                        *str++;
                        Screen[ScreenPosX][ScreenPosY] = (char) *str;
                        ScreenPosX++;
                    }
                    if (ScreenPosX >= XscrMax) {
                        ScreenPosX = 0;
                        ScreenPosY++;
                    }
            }
            *str++;
        }
        LCDg_Update();
    }

     

    /*
    * 文字サイズの設定
    */
    void LCDg_setSize(char size) {
        switch (size) {
            case 2: // 縦2倍サイズ
                YscrMax = 3; //行数
                XscrMax = 16; //文字数
                break;
            case 4: // 縦横2倍サイズ
                YscrMax = 3; //行数
                XscrMax = 8; //文字数
                break;
            default:
                YscrMax = 6; //行数
                XscrMax = 16; //文字数
                break;           
        }
    }

     

    void LCDg_hex(uint8_t num) {

        LCDg_chr(hex[num >> 4]);
        LCDg_chr(hex[num & 0x0f]);
    }

    このファイル内では、LCDディスプレイの初期化ルーチン、実際にコマンド、データを送信するルーチンが記載されています。それに加えて、表示操作を簡単にさせるための関数が定義されています。

    関数名をご覧になれば、大体何をやっているかは想像がつくと思います。

    将来を見越して、色々仕込みは行っていますが、今は、美咲フォントと半角文字を等倍で表示する部分しか動かしていないことにご注意ください。

    なお、半角も8x8ドットと、漢字の全角と同じサイズになってしまっているので、1行に半角16文字を表示できるようにScreen変数を持っていますが、漢字の場合、2バイトコードなので、8文字しか表示されません。

    単純にScreen変数をuint8_tからunit16_tに変更したらよいはずですけど、コードサイズオーバーとなり、コンパイルできない状況なので、後日の課題としたいと思っています。

    半角文字をきちんと漢字の半角に、つまり美咲フォントを使う場合は、4x8ドット文字を用意することも、要検討です。

     

    以上で、すべてのソースコードの情報を提示できたと思います。

     

    とここで、また、サイズ制限になってしまったので、最後のまとめは、次回に回します。

    記事へブログ気持玉 / トラックバック / コメント


    続きを見る

    トップへ

    月別リンク

    KazHatブログ/BIGLOBEウェブリブログ
    文字サイズ:       閉じる