2020年2月12日水曜日

開発時の予期しない問題の予防1

こんにちは

ソフトな道をほのぼのと今日も歩きます。


今回は、開発している時に、やっておいたほうがよいことを記載します。


こちらを行うことで、認識していない不具合の遭遇をある程度予防できると

思います。


なぁんだ、そんなことか?と言った内容ですので、さらっと見るだけでもいいと思います。


------------------------------------------------------------------------------------------

1.条件文のその他の処理をどうするかを考えておく。


2.デバッグメッセージをソース内に組み込んでおきます。その際”#ifdef”で

表示/非表示切り替えが容易に行えるようにしておきます。

------------------------------------------------------------------------------------------



“1.条件文のその他の処理をどうするかを考えておく。”

こちらswitch文のdefaultの処理を作りましょうということです。if文の場合、elseでしょうか。

意外とこういうところから意味の分からない現象につながっていく危険性があります。


“2.デバッグメッセージをソース内に組み込んでおきます。その際”#ifdef”で

表示/非表示切り替えが容易に行えるようにしておきます。”

これは、デバッグ用メッセージを利用して、不具合の特定/対策などが早期にできるようにする私なりの工夫となります。

以下、一例です。

-----------------------------------------------------------------------------------------------

[test.c]

switch ( state& 0x7 ) {

case TEST_SENSOR_1:       

#ifdef DEBUG_TEST_MESSAGE

    printf("test sensor_1: 開始センサアクティブ (%s %d) \n", __FILE__, __LINE__);

#endif

[test.h]

#define   DEBUG_TEST_MESSAGE

-----------------------------------------------------------------------------------------------

test.cに#ifdef ”キーワード”としておき、

ヘッダファイル”test.h”にてキーワードを定義する/しないによって#ifdef内が

有効/無効になります。

こうしておくと、runして2二日後に原因不明なハングが発生といった

やっかいな不具合の調査時に役に立ちます。(絞り込みを行うことができます。)


今回は以上です。


[環境]

私の使用環境は VMware 上でUbuntu14.04を使用しています。

コンパイラ: arm-linux-gnueabihf-gcc


最近、東京は国際人が多くなりましたね。


新型コロナではないですが、本人は気づいていない(潜伏期間の人)が


他国の人(免疫の無い)に伝染病をうつしてしまう可能性がないか、


気になってしまいます。


いずれにしても、人混みは避けたほうが良さそうですね。



2020年2月6日木曜日

[Linux] サウンドがならない対応

こんにちは

ソフトな道をほのぼのと今日も歩きます。


Linuxにおけるアプリ開発をしています。


今回は、音が鳴らないという現象が発生しました。


ALSAを使用しての音声出力を行っています。


音ファイルはRIFF形式のものですが、


このファイルは一体どんな設定なんだろう。。


ということで調べてみたところ、以下のサイトが大変わかりやすかったです。


https://taku-o.hatenablog.jp/entry/20181120/1542726865


私が使用しているファイルをエディタでバイナリで開いてみて


リンク先内容と照らし合わせて書き出してみました。


---------------------------------------------

bits_per_sample : 16bits

num channels: 1チャネル(モノラル)

サンプリングレート: 22050

byte rate: ブロックサイズは44100

---------------------------------------------


この設定で音が鳴るはず。。と思っていたのですが、


まだ動作しませんでした。


調べてみたところ、バッファはmallocを使って行っていましたが、


これを以下のように、2バイトバス幅に設定した静的バッファに


したところ音が鳴りだしました。



static short buff[0x1000];



推測ですが、bits_per_sampleが16bitなので、アライメントがそれにあう


short型でメモリ確保しておかないとだめなのかもしれません。

そして、音が鳴るようになったところで、ターミナル(teraterm)をみたら、


なにやら、以下の表示がされていました。


“ALSA lib pcm.c:8432:(snd_pcm_recover) underrun occurred”


調べてみたところ、以下が参考になりました。


https://tutorialmore.com/questions-174806.htm


確かに、”snd_pcm_writei();”を連続して呼び出す際にウェイトを入れてあげると


上記”underrun ”は発生しなくなりました。


ウェイトを入れるのは美しくないので、それに代わる何かを探してみました。


そしてありました。



snd_pcm_set_params();のレイテンシの設定を変更してあげる。



こちらを行うことで、上記”underrun”の現象はなくなりました。


以上です。


[環境]

私の使用環境は VMware 上でUbuntu14.04を使用しています。

コンパイラ: arm-linux-gnueabihf-gcc


新型コロナウィルスが発生していますが、なんとか乗り切りましょう。


(マスクが少ないから、石鹸でよく洗って再度使うしかない状態です。


フリマの一部の人たちに買い占められて、高値を払うか、それとも死を選ぶかの


究極的選択になっていますが、私は買わないで使いまわす選択肢を選びます!


その分、武漢へ空からマスクを降らせましょう。)



2020年1月30日木曜日

エラー出力関数

こんにちは

ソフトな道をほのぼのと今日も歩きます。


Linuxにおけるアプリ開発をしています。


エラー出力をどうするかを検討しています。


ターミナル上に表示するのと、syslogを行いたいのですが、


あとで面倒な思いをしたくないので関数を作成して、


その中で、必要に応じて変更していけば、作業効率はいいと思いました。


以下載せておきます。


void PRINT_ERR_Message(int rtc, char* file, int line, char* message)

{

    syslog(LOG_ERR, "Error: 0x%x %s (%s %d) \n", rtc,message,file,line );

    printf("Error: 0x%x %s (%s %d) \n", rtc,message,file,line);

}

[使用例]

 PRINT_ERR_Message(rtc, __FILE__, __LINE__ , "正常終了");

 PRINT_ERR_Message(rtc, __FILE__, __LINE__ , "");

[結果]

 Error: 0x0 正常終了 (./bios/main.c 102)

 Error: 0x0  (./bios/main.c 104)

 

 syslog内を見てみましょう。

 cat /var/log/syslog | tail -10

   Jan 1 00:01:05 localhost : Error: 0x0 正常終了 (./bios/main.c 102)

   Jan 1 00:01:05 localhost : Error: 0x0 (null) (./bios/main.c 103)

   Jan 1 00:01:05 localhost : Error: 0x0  (./bios/main.c 104)


以上です。


[環境]

私の使用環境は VMware 上でUbuntu14.04を使用しています。


2020年1月22日水曜日

アラートダイアログ数値入力

こんにちは

ソフトな道をほのぼのと今日も歩きます。


AndroidStudioを使用して、androidアプリを作成しているのですが、


menuからアラートダイアログを出力するところまでは出来たのですが

アラートダイアログ内で時間設定を入力できるようにしたい。。。

という状況になりました。


いろいろサイトを見て最終的に、以下の処理でいけるようになりました。


ポイントとしましては

  1. EditTextのinputtypeに番号を指定する。

  2. setViewに設定しておいたEditTextを指定する。

です。


-------------------------------------------------------

[処理内容]


   var Time_edit_hour: String?=null

   …

 var TIME_editText:EditText= EditText(this)

 TIME_editText.setHint("number ")

 TIME_editText.inputType=InputType.TYPE_CLASS_NUMBER


 AlertDialog.Builder(this).apply {

       setTitle("時間設定")

       setMessage("時間を入力せよ[h]")

       setView(TIME_editText)

               .setPositiveButton("OK", { dialog, which ->

                   // TODO:Yesが押された時の挙動

                   Time_edit_hour= TIME_editText.text.toString()

               })

       show()

       return true

   }

-------------------------------------------------------

以上です。


[環境]

kotlin言語を使用しています。


kotlin言語は使い初めのころは、わけもわからずに使って、もがいていました。

今もそうですが、利点としては、JAVAと比べると、少ないコード量ですみ、すっきりした見た目になります。

あと、文字列の操作が楽なのがよいですね。

まだまだ、道のりは長いですが一つづつ覚えていきましょっ。


2020年1月16日木曜日

通信デバックで受信データを騙すには


こんにちは

ソフトな道をほのぼのと今日も歩きます。


現在、通信処理をデバッグしています。


相手方がいないと実際の動作は見ることができませんが


ソース内容を以下の処理にしておけば通信発生した後のデバッグはできます。


① 受信発生

② ソース内バッファにpushする。

③ 処理を行う際、バッファからpopする。

④ popしたデータを受信したものとして解析処理を行う。


上記は、通信用バッファをソース内のバッファに詰めるようにしておけば、

実際に受信が起きなくても

ソース内のバッファにテストしたいデータを入れられます。

それにより、通信が発生している前提としてデバッグしけます。


以上です。


[環境]

私の使用環境は VMware 上でUbuntu14.04を使用しています。


Windows7はサポートが切れてしまうということで、Windows 10にしました。

そしたら、Excel2013が起動したと同時に落ちる現象が発生しました。

修復することで現象は解消しましたが、意外と他は何もせずとも

動作しました。

流石、Microsoftですね。昔だったら、ハードディスク内のデータはフォーマットされていたのに。


2020年1月8日水曜日

圧縮ファイルに日付をつける

こんにちは

ソフトな道をほのぼのと今日も歩きます。


linux上で自分が作業しているディレクトリをよくバックアップ(圧縮ファイル)を取ります。


その時にファイル名に日付をつけたりしますが、以下のようにすると

シェルを実行するだけで上記バックアップを取れます。


ここではそのシェルについて説明します。


まず、zokinというディレクトリがあったとします。

それをtar.gzで圧縮して保存したいとします。


流れとしては以下です。


  1. “zokin”ディレクトリがカレントディレクトリにあるとします。

  2. シェルを実行します。(“source ./test.sh”)

  3. “zokin_20200108.tar.gz” が作成されます。(現在日付:2020年1月8日)


シェルの内容は以下です。

-------------------------------------------------------

[/test.shの内容]


#!/bin/sh -x


VAR=$(date +"%Y%m%d")

echo "$VAR"

sudo tar -zcvf zokin_"$VAR".tar.gz zokin/

-------------------------------------------------------


これを実行することで、

日付付きの圧縮ファイルが作成されます。


以上です。



[環境]

私の使用環境は VMware 上でUbuntu14.04を使用しています。


[参考]

$(date +"%Y%m%d")

は初め以下のように書いていました

`date +"%Y%m%d"`

これだと、分かりづらかったので、”$()”の方法を


採用しました。


2020年1月2日木曜日

2020年挨拶

こんにちは


明けましておめでとうございます。


linux, androidなど、仕事を通じて分かった内容や今後どうしていくかなどの内容を記載していきます。

コンフィデンシャルな内容は載せませんのでご了承くださいね。


では、本年もよろしくお願いします。