2020年12月22日火曜日

[Linux] "System program problem detected"と表示されました

こんにちは、針山散策を今日もほのぼのと行います。


今日は、VMWare 環境のUbuntuを起動した時に、


"System program problem detected"と表示されました。


レポート読んでも分かった気になるだけなので、ググってみたところ

以下が参考になりました。


"Ubuntu/System program problem detectedの対処方法"

https://linux.just4fun.biz/?Ubuntu/System+program+problem+detected%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95


クラッシュした時に生成されるファイルがあるようで、

それがあると、上記メッセージが起動時に表示されるという流れなのですね。

なので、そのファイルを削除すれば、起動処理で引っかからずに済む。


理解しました。


[今日のひとこと]

大腸の内視鏡検査を昨日受診しました。

I had an endoscopy of the large intestine yesterday.

結果として、問題ありませんでした。

As a result, I'm glad I didn't have any problems.


2020年12月21日月曜日

[Android] 音声認識

こんにちは、針山散策を今日もほのぼのと行います。


音声認識してアプリを操作したいというユーザがいたので


音声認識の処理を実装すると、どういう振る舞いが発生するのかを調べてみました。


ソースは、以下のページが非常に参考になりました。


単発版 音声機能を追加する

https://akira-watson.com/android/recognizerintent.html


Android Developper Studio用

https://developer.android.com/training/wearables/apps/voice.html?utm_campaign=building-for-wear-215&utm_source=dac&utm_medium=blog&hl=ja


音声取得開始"startActivityForResult()"を実行すると、

「どうぞお話ください」に相当するメッセージが出ます。


java.utilパッケージにある言語種類を指定してあげると


音声取得で取り込んだデータがある程度正確にListに取り込まれます。


言語種類の指定例

    Locale.JAPAN.toString()


次に、連続で音声認識しようとしてみました。



[連続版 音声機能を追加する]

以下のページを参考にしました

https://kivantium.hateblo.jp/entry/2016/02/29/191901


単発ならよいのですが、言語取得処理を連続で呼び出そうとしてみましたが


連続だと、onError()メソッド(RecognitionListener()の継承クラス内で定義)


にERROR_INSUFFICIENT_PERMISSIONS(9)


が入ってきます。


AndroidManifest.xmlに

    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

    <uses-permission android:name="android.permission.INTERNET"/>


としているからよいと思うのですが、一体何が原因なのでしょうか。


ちなみに、Android OS :8.0 (OREO)なのでApi Levelは26迄okです。


[今日のひとこと]

中国が、オーストラリアの石炭に多額の関税をかけることで輸入ストップ

しているようです。

それによって、中国が電力不足になっているらしいです。。

自国経済制裁ですか?(もしかして、既に財政破綻間際なのですか)

医療ひっ迫で、コロナ感染も前回を上回るんじゃないかと

危惧します。

日本が中国に菌をうつしたら悪いので来ないでくださいね。

2020年12月16日水曜日

[Java] クラスの静的フィールド、静的メンバはインスタンスなくてもアクセス可能

こんにちは、針山散策を今日もほのぼのと行います。


Java書籍を読んでいて、気になったのでメモ

しておきます。


気になったのは以下です。


1. クラス内(Testクラスとします)でフィールド(int test_fieldとします。)にstaticを付けた時

インスタンス化しなくてもアクセスできる。


2. クラス内(Testクラスとします)でメソッド(test_method()とします。)にstaticを付けた時

インスタンス化しなくてもアクセスできる。この時、そのメソッドで扱うのは静的なフィールドだけです。


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

class Test()

{

    static int test_field;

    int dame;

   

    static int test_method(int i){

        dame= 1; ←static なフィールドではないので扱えない。

        test_field= 2;

        return test_field;

    }

   

}


public static main()

{

    int dummy;

    Test.test_field= 1;            // newせずに使える。

    dummy= Test.test_method();    // newせずに使える。

   

}


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


[今日のひとこと]

Go to トラベルが全国一斉に停止になりました。

2Fの懐にお金が入ってこなくなるから激怒しているんだろうなと思ってしまいます。

旅行した時、お食事の時にお酒飲んではめを外してしまうがクラスタ発生の

原因なんだと思います。

お酒を一時的に廃止にして

酒メーカだけを支給対象にすればええんじゃないかと

思う。

2020年12月3日木曜日

[Java] const に相当するものはfinalか

こんにちは、針山散策を今日もほのぼのと行います。


書籍を読んでいて、さらっと書いてあったのですが、


Java入門者としては知らなかったのでメモしておきます。


finalを変数につけていたのですが、これはconstと同じで


固定値(定数)ということのようです。


待てよ?

他にも何か使い方があるのかな?と思って調べてみたところ、

ありました。


以下が参考になりました。


https://qiita.com/ryo2132/items/eb9a63f2b107c1d6b25c


→ 定数はすべて大文字で書くのが一般的ということは


"#define"みたいなもの?だと勝手に解釈します。


finalは"最後の"という意味だし、理解できました。


自分なりに以下のように覚えます。


・メソッドにつけるとそのメソッドが最後だから、加工禁止です。

→ オーバライドできませんよ。

・クラスにつけると、それが最後の末端クラスだから、もう充てにしないで

→継承しないでよ。

・フィールドにつけると、その値が最後の値なのだから、変更無理。

→定数


[今日のひとこと]

商店街にある唐揚げ屋さんに買いに行った時のこと、

おじいさんがたばこをふかしてスパスパ吸っていました。

周りにいる人はすごい剣幕でそのおじいさんを見ていました。

年をとると自分勝手になっていくのでしょうか?


2020年12月1日火曜日

[全般] タイマ割り込み処理の例

こんにちは、針山散策を今日もほのぼのと行います。


今回は、タイマ割り込みの定義の一例を記載します。


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

[ソース]

static unsigned long tau0_counter;


// function: タイマ割り込み処理

__interrupt static void timer_interrupt(void)

{

    if(tau0_counter!= 0)

    {

        tau0_counter--;

    }

}


// function: タイマを設定します。

void TIMER_SetTimer(unsigned long time)

{

   

    DisableInterrrupt();    // API名は変えてます。割り込み全体を禁止にします。

    tau0_counter= time;

    EnableInterrupt();        // API名は変えてます。割り込み全体を許可にします。

}


// function: 現在のタイマの値を取得します。

unsigned long TIMER_GetTimer(void)

{

    unsigned long result;

    result= tau0_counter;

    return result;

}


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

tau0_counter部分でいつもインクリメントをしていましたが、


今回はデクリメントすることでタイマを動作させています。


長所としては、tau0_counterがラップラウンドすることを

気にする必要がありません。


短所としては、複数のタイマ監視が同時に行えないことです。

(行う場合は複数個のtau0_counter相当を作っておく必要があります。)


イベントが必要なら、


tau0_counterが 0 になった時点でイベントフラグを立てて、

メインプログラムでそのフラグを見て処理を行えばよいです。


以上です。


2020年11月13日金曜日

[JAVA] import文の存在意義

こんにちは、針山散策を今日もほのぼのと行います。


今回は、Javaにおけるimport文について理解したことを記載します。


こちらはFQCN(Full Qualify Class Name)といって、


パッケージ名.クラス名

といった指定をするのを省略して


クラス名を指定しただけで、

パッケージ名は自動で認識させたい時に使用することが分かりました。


また、


import test.test1

import test.test2

import test.test3


import test.*


とした場合、

import test.test1

import test.test2

import test.test3


はimportされないようです。


独立しているので、それぞれimportしないといけません。

(読み込まれているものと思い込んでいました。)


[今日のまとめ]

import文は、FQCNをいちいち使いたくない

良い意味での面倒くさがり屋さん向けです。


[今日のひとこと]

大腸検査で引っかかりました。

何か悪いものでもできたのかしら。

2020年10月28日水曜日

[Android] "CREATE TABLE"する際にはcolumnを正しく設定しましょう

こんにちは、針山散策を今日もほのぼのと行います。


今回は、Androidでsqliteを使用していますが、


SQLiteDatabaseクラスを用いてinsert()実行した後に


query()するとハングしていました。


その対策をメモしておきます。


1. query()後にclose()メソッドを実行するようにしましょう。

2. SQLiteOpenHelperクラスを継承したクラス内で"CREATE TABLE"する際、

    COLUMNの数が登録しようとしている列合っているか確認しましょう。


1. query()後にclose()メソッドを実行するようにしましょう。

についてです。

こちらは、以下のように最後にclose()メソッドを実行して一度資源を解放しましょう。

    Cursor cursor = database.query(

       "Table_Name",

        new String[] {"column_1", "column_2", "column_3", "column_4", "column_5"},

       null,

       null,

       null,

       null,

       null

    );

    cursor.moveToFirst();    // カーソル行を先頭に

    cursor.moveToNext();    // カーソル行を進める

    ・・・                    // 処理

    cursor.close();           


2. SQLiteOpenHelperクラスを継承したクラス内で"CREATE TABLE"する際、

    COLUMNの数が登録しようとしている列合っているか確認しましょう。

についてです。

こちらは以下のように、列(column)の数を合わせておきましょう。ということです。


public class testHelper extends SQLiteOpenHelper {

private static final String SQL_CREATE =

   "CREATE TABLE " + Table_name + " (" +

           Database_id + " INTEGER PRIMARY KEY," +

           "column_1" + " TEXT," +

           "column_2" + " TEXT,"+

           "column_3" + " INTEGER,"+

           "column_4" + " INTEGER,"+

           "column_5" + " TEXT)";

@Override

public void onCreate(SQLiteDatabase sqLiteDatabase) {

sqLiteDatabase.execSQL( SQL_CREATE );

}


2020年10月23日金曜日

[全般] 処理と管理は分離させることに共感

こんにちは、針山散策を今日もほのぼのと行います。


今回は、要求定義書から今後の設計方針のノウハウ発掘ということで、

ググっていたところ、

以下のドキュメントを発見しました。


https://swquality.jp/temp/nagasakiqdg15_usdm.pdf


こちらは、USDMについてのドキュメントになります。


・・・・。


しかし、USDM自体知りませんでした。


こちらのUSDM (Universal Specification Describing Manner)のようで、

翻訳してみると、「作法を説明する全般仕様」です。


こじつけですが、

「作法を説明する全般仕様」→ 根本的な仕様 → 要求定義書 ということでしょうか。


こちらの特徴としては、要求定義書を作成するための指標のようです。


内容については上記リンク先を見ていただくことにして、


読んでいて最も共感したところは



・処理と管理は明確に分離する


です。


プログラムを組んでいると、管理用プログラム内で処理を行ったりしてしまう時が

たまにあります。

(その方がコーディングとしては楽な為)


しかし、それをやってしまうと保守性が悪くなってしまいます。


何か修正が必要になったとき、例えば制御用のレジスタ名で検索を掛けると、


複数ファイルの複数関数でヒットすると、一通り見ないといけなくなってしまうからです。


管理用プログラム内にヒットしていた場合は更に厄介で、影響度がその処理だけではなく、


管理側にも発生してしまいます。



[今日のまとめ]

・処理と管理は明確に分離しましょう。ファイル自体分離しておくと誤解もなくなります。


[今日のひとこと]

鶏むね肉を使用してチキン南蛮を作ってみました。

その際、肉をオーブンで焼くと固くなることもあり、

以下のようにすることで回避しました。

・フォークで100回鶏むね肉ブロックに突き刺す。

・牛乳、砂糖、しょうゆ、炭酸水に30分つける

結果として柔らかくなりましたが、水分が抜けてしまって

少しパサついてしまいました。

次は焼く直前に片栗粉を全体にも見込んでみようと思います。


2020年10月13日火曜日

[Android] [Java] アクティビティ上の部分レイアウトをフラグメントで行うことについて

こんにちは、針山散策を今日もほのぼのと行います。


今回は、Android開発において、アクティビティ上の一部分をフラグメントとして切り替え


られるようにしようとしましたが苦戦しました。


レイアウトデザインは、xmlファイルに作成していくことになるのですが、


フラグメントについては"<fragment>"のタグを使用するようにして


レイアウト内に入れることで一部分をfragmentとして開放できます。


ここではFrameLayoutとしています。


[xmlファイル]


<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:app="http://schemas.android.com/apk/res-auto"

   xmlns:tools="http://schemas.android.com/tools"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   tools:context=".MainActivity">

   

   …

   

   <FrameLayout

       android:id="@+id/container"

       android:layout_width="match_parent"

       android:layout_height="100dp"

       android:layout_marginBottom="60dp"

       app:layout_constraintBottom_toTopOf="@+id/button_QA"

       app:layout_constraintTop_toTopOf="parent"

       tools:layout_editor_absoluteX="5dp">


       <fragment

           android:id="@+id/fragment_here"

           android:name="aa.co.jp.sample.Fragment_here"

           android:layout_width="match_parent"

           android:layout_height="match_parent"

            />

   </FrameLayout>


</androidx.constraintlayout.widget.ConstraintLayout>


また、フラグメント切り替え対象は以下のリンク先を参照していただき、


"fragment_here"を置き換えたいフラグメントにreplaceするようにすれば


切り替わります。(実際は上書きされます。)


android:name("aa.co.jp.sample")はパッケージ名です。


パッケージ名は変えてしまうとビルドが通らなくなってしまいますので気を付けましょう。


[今日のひとこと]

最近、JAVAプログラミング能力認定試験2級の過去問を見ましたが

難しそうです。

簡単でも困るので、とりあえずとれるように模索していこうと思います。

AndroidStudio環境でJavaアプリを作っていこうと思います。

まずは暗記カードアプリでも作ります


2020年10月5日月曜日

[動画編集] Windows Liveが無い

こんにちは、針山散策を今日もほのぼのと行います。


今回は、Youtubeにお試しで動画アップしようと思いました。


その際、動画編集を行おうとしましたが、


参考にしていた本の内容が古かったらしく、Windows Liveアプリ


が紹介されていたのですが、こちらアプリはサポート終了とのことです。


仕方がないので、それに代わる動画編集ソフトを使用しようと思います。


以下が参考になったランキングです。

https://my-best.com/2745


今回は、shotcutを使用してみようと思います。

https://shotcut.org/


[今日のひとこと]

国勢調査をウェブ経由で提出しました。

個人名やら、家族構成やらを記入しないといけないので

個人情報保護やセキュリティは大丈夫か懸念しながら

回答しました。

区役所が知っているはずなのに、やる必要あるのか

疑問に感じました。

2020年9月22日火曜日

[デバッグ] イベントの上書き

こんにちは、針山散策を今日もほのぼのと行います。


今回は、RTOSリアルタイムOSで扱うイベント生成について注意点について記載します。


イベントというのは、ソフトウェアだと”きっかけ”で言い換えることができると思います。


モータ制御で言うと、原点にあるセンサーに反応したら原点到達のイベントを

自分タスク以外の他タスク投げる。


みたいに使います。


よく企業で状態遷移表を作成しますが、その際、イベントと状態の関係が表示されていると思います。


そのイベントのことです。


このイベントを立てるのはソースによりますが、今回の場合はイベント用の変数に代入する方式だったので

イベントが同時に2つ発生することは想定していませんでした。


仮に複数イベントサポートする場合は


1 ビット単位でイベントを持たせる。

2 優先度を設計しておく


などしておく必要があります。


さて、イベントについてですが、ユーザソースで、イベントを立てる(起床する)のにif()~if()を連発していました。


これだと、1番目のif内でイベントを立てていたりすると、その後のifで、もしイベントが立てるようなことがあると、


上書きされてしまいます。

(実際にセンサの情報が上がったよイベントを立てていたのに他のイベントで上書きされていました。)


if()~else if()~…などでイベントが発生していないことを条件に加えるようにしましょう。


[今日のひとこと]

9/21、9/22は世間はお休みなのに

私の所属する会社は営業していました。

休日扱いではないのでお金は追加でもらえるわけでもなく、

残業規制で月10時間しか働けません。


副業解禁を期待して登録者数増やせるようにしたいです。


管首相様、どうか副業規制強制解除お願いします。


それにより、ブラック企業から抜け出せる人が多く出てきます。

2020年9月16日水曜日

[デバッグ] LCDに32bit16進データ表示をできるようにした場合の幸せデバッグ

こんにちは、針山散策を今日もほのぼのと行います。


今回は、LCDに32bit16進データ表示をできるようにした場合の幸せなデバッグ


について考えてみたいと思います。


LCD(画面)には一般的には文字、画像等が表示されると思います。


LCDドライバ開発時には何とかして目的の画像を表示させようと努力するはずです。


(LCDに表示するだけでも大変な作業なんです!)


いつもゴールとしてLCDに表示することを考えていました。


しかしながら、このLCDを道具として(プログラムデバッグ)活用ができると


効率が格段に上がると思います。


最近の案件では、モータを複雑に制御するようなことがありました。


モータ制御の機能としては、スピードと回転方向があります。


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

スピード: 15段階

回転:順回転、逆回転、停止

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


これらの制御

bit0~bit3をスピードに割り当てて

bit5,6を回転に割り当てると


わざわざデバッガ上でモータの状態を監視しなくても

ある程度LCDで確認が出来るので効率的です。


[今日のひとこと]

復習は1日、3日、7日にすると記憶が効率的に身につくと

ありました。

ということは、

今日の勉強は

本日分

7日前分

3日前分

1日前分

をするということか。。。。


2020年9月8日火曜日

[テスト] 検査シートをユーザに出す前にスリムにしましょう

こんにちは


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


今回は、検査シートをユーザに提出する際にスリム化しておきましょう。


という内容です。


まず、検査シートについてですが、


こちらは主に検査項目をエクセル表にツラツラ書いている内容になります。


初回は特にボリュームが出ていたりするので


検査におけるリファクタリングを行って無駄を省きましょう。


以下、思いつくところです。


[確認事項]

1. 重複している内容は削ってあるか。

2. 名前は誤解がないようになっているか

3. 検査はソフト用の検査になっているか。ハード用なら削除。(ハード担当なら逆)

4. 変更が予想されるところはTBDになっているか。

5. 検査は意図通りの内容になっているか。

(特に、繰り返す操作の意図は明確になっているか。)

6. 誰が行っても同じ操作になる検査か。


そしてユーザに提出します。


ユーザは基本的に検査を削除する要望はありません。


なので、最低限行うべきものからスタートした方が良いです。


連続運転をしだすと月単位でずれ込んでいくので気を付けましょう。


[今日のひとこと]

10年前と違って今は非常に新入社員に対して冷めている気がします。

 居酒屋に行けなくなったから

飲みミニケーションがとりずらいからかもしれません。

いや、新入社員自体、飲みに行きたがらないからかもしれません。

早くこの状況が改善すると良いですね。

2020年9月3日木曜日

[全般] #ifdef を使用してデバッグコードをON/OFFすることについて

こんにちは


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


今回は、"#ifdef を使用してデバッグコードをON/OFFすることについて"


について記載します。


#ifdefですがいたるところに定義していて、本番用が0と1が


混ざっていた場合、混乱を起こしてしまいます。


なので、以下のようにすると、混乱がなくなると思います。


#ifdef 0    // ここは"0"で現在実施しているハードにて動作する状態にする。

            // "1"でデバッグ用とする。

#define DEBUG_SW


#endif



#ifdef DEBUG_SW   

    処理1'

#else

    //original

    処理1

#endif


混乱すると、調べるのに時間がかかってしまうし、


作業のオーバーヘッドが大きくなってしまいますので、整理する上でも


やっておいて損はしないと思います。

2020年9月1日火曜日

[テスト] 評価用にprintfをつけることによる影響

こんにちは


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


今回は、ソフトウェアのテストにおいてprintf()出力させたものを


評価対象にしていた箇所がかなりありました。


ただ、これは製品版の時にはprintf()処理は取り除くとのことなので、


大丈夫かな?と思いました。


というのも、printf()は十分なウェイトになってしまうので


タイミングによっては動作しないケースもあるのかと思いました。


ハードウェアが専用のものなので


たまたま動作している可能性があります。


組み込み系ソフトウェアでは、ハードのステータス待ちとかで


早すぎると期待した動きにならずに


最悪の場合、動かなくなってしまいます。



2020年8月24日月曜日

[Linux] closeしても、プロセス実行が発生してしまう対策

こんにちは


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


少し前になりますが「[Linux] スレッド内で使用していたメモリがSIGINTによって壊されていた為でした。」


で進展がありましたので以下記載します。


今までの変更分


1.SIGINT処理ではprintf()は行ってはいけない

2. SIGINT処理で使用する変数型を変える

        [変更前]

            static int 型

        [変更後]

            #include <signal.h>

           

            static volatile sig_atomic_t 型

3.ポインタで渡ってくるデータはローカル変数にコピーして使う。


Segmentation fault


のエラーが3日目に発生していました。


色々調べてみたところ、


プロセスをcloseしても、プロセスが一瞬入ってくるケースがありました。

これにより、openしている時に使用するapiがclose状態で実行されていたため、

想定外な動作の結果Segmentation faultのエラーになって表れていました。


対策としては以下を行うことで解決できました。


[対策]

1. close直前に"終了したことを表すフラグ"= 1にする。

2. close実行。

3. プロセス側で"終了したことを表すフラグ"を監視し1が立っていたら何もせずに抜ける。



2020年8月4日火曜日

[NORTiv4] 本番機が無い時の進め方(GPIO)

こんにちは


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


現在、現行機に変わる後継機を作成しています。


OSはNORTi V4を使用しています。


まだ、後継機(ハード)は作成中です。


センサーに反応したらある処理を行う。といった処理を実装しています。


センサーはGPIOで反応するのですが、現行機は筐体に入っていて、


他のGPIOを使って確認するすべがない状態です。


この為、現行機のある時点における、使っていないボタンを代用して


実装していこうと思います。


[今日のひとこと]

からあげの天才をよく利用するのですが


美味しすぎます。周りはサクサク、中はジューシー


一体どんな方法で実現しているのでしょうか。


揚げ方?下ごしらえの方法?教えてほしいです。

(ワタミに就職すれば分かりますか?)


ファミリーパックをネット予約にすれば、


10個→ 12個になります。


また、備考として赤、白、黒のから揚げを指定すれば


チューニングも可能でした。


また来週食べよう。


2020年7月28日火曜日

[NORTiv4] タスク生成されない

こんにちは


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


現在、現行機に変わる後継機を作成しています。


OSはNORTi V4を使用しています。


追加でタスク生成を行おうとしていましたがどうもタスク生成されても動作していないようでした。


他のタスク生成を参考にしても動作していないようでした。


(printf()で埋め込んでも表示されませんでした。)


調べたところ、以下のような指針で進めれば、比較的早く解決できそうです。


1.複数タスク生成しているなら少なくしてみる。

    → 私の場合は20タスクありましたので、2タスクだけcre_tsk()、sta_tsk()するようにしました。


2.メモリ関連の定義(私のケースでは「スタック領域先頭番地」の定義)を

    既存で動作していたものにしてみる。


これによってタスク生成されることを確認出来たら、


全体を戻して、必要分だけ入れ込めば動作するようになります。


[今日のひとこと]

「から揚げの天才」というお店が近場に出来ました。


そこに、テリー伊藤さんが宣伝の為に来ていました。


かなりの人だかりでしたが、


皆さん、密なのを感じていたようで、静かでした。


素晴らしいですね。

2020年7月25日土曜日

[実機到着前] 評価ボードにて行うこと

こんにちは


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


今日は、本番用のハードウェアボードが手元になく、

評価ボードだけあった際、何をどうしていけばよいのか分からずに途方にくれないように

する為にメモします。


1. 全体の処理を作成する。

   ハードに影響しない箇所のコーディングを行います。


2. ハードウェア制御実施した結果は正常終了のものをダミーで返す。

   ハードウェアへの制御は動いている風に記載する。

   ハードウェアへのアクセス関数を呼び出すが、中身の制御部分は空で、呼び出し元に返す値を正常終了用に作り出す。(スタブのようなもの)


3. ハードウェア制御は”1””2”とは独立して開通、制御できるところまでを行う。


4. gitにてバージョン管理する際は、1機能入れたらコミットしていくようにする。


[今日のひとこと]

世間は7/23(木)、7/24(金)はお休みですが、

私の所属する会社は営業しています。

祝日はほぼ無しなので、

案件を発注する側はその分早く成果物が出来るので

出しやすいのかもしれません

2020年7月18日土曜日

[Linux] SIGINTによってメモリ破壊をしていた箇所は意外にも3

こんにちは


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


今日は、前回「[Linux] スレッド内で使用していたメモリがSIGINTによって壊されていた為でした。」


で進展がありましたので以下記載します。


結論からいうと、


1.SIGINT処理ではprintf()は行ってはいけない

2. SIGINT処理で使用する変数型を変える

        [変更前]

            static int 型

        [変更後]

            #include <signal.h>

           

            static volatile sig_atomic_t 型

3.ポインタで渡ってくるデータはローカル変数にコピーして使う。


です。


Segmentation fault


のエラーが3日目に発生していました。


調べたところ、SIGINT内にポインタで渡ってきたデータを


そのまま音声関連の関数の引数に渡していました。


SIGINTの関数を呼び出している上位のブラックボックスの処理で


何をしているかもわからない状況なので、


書き換わる可能性がありそうでした。

(上位側のプログラムでSIGINTの関数が別スレッドとして呼ばれていた場合は

私の知らないところでメモリが書き換わる可能性がある)


ですので、データをローカルな構造体に入れて、(メモリ確保している状態で)


上記の音声関連の関数に入れるようにしました。


今回、”3”を実装して連続運転を行しはじめました。


[今日のひとこと]

JAVAプログラミング能力認定試験 というものに興味が出てきました。


というのも、Android Studioにてアプリを仕事で作ったりしていたのですが、

(Kotlin言語です。)

そもそも、お作法が体系だって習っていないことに気付いた為です。


基本から実践へという流れではなく、


実践から基本にという流れですが、おさらいも含めて資格取得してみます。


3級、2級、1級とあるみたいですが、まずは3級からでしょうか。



2020年7月9日木曜日

[Linux] SIGINTによってメモリ破壊をしていた箇所は意外にも2

こんにちは


ソフトな道を急ぎ足で今日は歩きます。


今日は、前回「[Linux] スレッド内で使用していたメモリがSIGINTによって壊されていた為でした。」


で進展がありましたので以下記載します。


結論からいうと、


1.SIGINT処理ではprintf()は行ってはいけない

2. SIGINT処理で使用する変数型を変える

        [変更前]

            static int 型

        [変更後]

            #include <signal.h>

           

            static volatile sig_atomic_t 型


こちらは、以下のリンクが大変参考になりました。

https://codezine.jp/article/detail/4700


”1”を実装して連続運転を行っていますが、20時間で


Segmentation fault


のエラーが発生していました。


今回、”2”を実装して連続運転を行っていますが、24時間

動作し続けています。(継続中)


この対応は排他制御の強力版のように思います。


動いてくれることを期待!!


[今日のひとこと]


オリエンタルラジオ 中田さんの

youtube大学でチャップリンとヒトラ(大野 裕之 (著))

を拝聴しました。

 いつもながら分かりやすい授業で

思わず書籍を読んでみました。

当時と今の情勢を見比べてみると、当時のドイツと中国が同じ状態で

占領されたフランスが今回の香港のような気がしました。

今後も、喜劇でヒトラに相当するギャグを行えば

同じように終わるのではないかと思います。


髪はポマードで「がちがち固め」で、目は線でお願いします。



2020年7月6日月曜日

[Linux] SIGINTによってメモリ破壊をしていた箇所は意外にも

こんにちは


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


今日は、前回「[Linux] スレッド内で使用していたメモリがSIGINTによって壊されていた為でした。」


で進展がありましたので以下記載します。


結論からいうと、


SIGINT処理ではprintf()は行ってはいけない。。。

です。


こちらは、以下のリンクが大変参考になりました。

https://codezine.jp/article/detail/4700


連続運転を行っていますが、1分で

Segmentation fault


のエラーが発生していたのが、1時間動作しています。

(継続中)


[今日のひとこと]


東京都知事選で、小池百合子さんが当選しました。


他の候補者とは雲泥の差でした。


強かった。


ただ、個人的にもう一つの競り合いが気になりました。


桜井さんの方が立花さんよりも票を取っていたことです。

(皆さんきちんと見てるのですね。)


2020年7月3日金曜日

[Linux] スレッド内で使用していたメモリがSIGINTによって壊されていた為でした

こんにちは


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


今日は、前回「[Linux] Watchdog タイマリスタートのタイミングによってアプリハング」


で進展がありましたので以下記載します。


結論からいうと、


スレッド内で一時的に使用する配列や変数はstaticをつけて

メモリを保護しましょう。


です。


期待していた動作と実際の動作は以下でした。


[期待していた動作]  

    1. main 処理 ループ

    2. gpio処理のスレッド発生

    3. gpio処理のスレッド開始

        char open_path[100];

        …

        sprintf(open_path, "/sys/class/gpio/gpio%d/value", 111);

    4. SIGINT 発生

    5. SIGINT処理 開始

    6. SIGINT処理 終了

    7. gpio処理のスレッド続き

        *fd = open(open_path, O_RDONLY| O_CLOEXEC);

        …

    8. gpio処理のスレッド終了

    9. main処理 ループ


[実際の動作]

    1. main 処理 ループ

    2. gpio処理のスレッド発生

    3. gpio処理のスレッド開始

        char open_path[100];

        …

        sprintf(open_path, "/sys/class/gpio/gpio%d/value", 111);

    4. SIGINT 発生

    5. SIGINT処理 開始

    6. SIGINT処理 終了

    7. gpio処理のスレッド続き

        *fd = open(open_path, O_RDONLY| O_CLOEXEC);

        open_pathが壊れている為ハング!!


期待した動作にするには

メモリを確保しておくと良さそうです。


    3. gpio処理のスレッド開始

        static char open_path[100];

        …

        sprintf(open_path, "/sys/class/gpio/gpio%d/value", 111);

    7. gpio処理のスレッド続き

        *fd = open(open_path, O_RDONLY| O_CLOEXEC);

        open_pathは保護されるので別プロセスで変更されることはありません!!



2020年7月2日木曜日

[Linux] Watchdog タイマリスタートのタイミングによってアプリハング

こんにちは


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


今日はWatchdog タイマリスタートをプログラムの中に入れて


連続運転させていると、アプリがタイミングによってハングしてしまう。


といった現象になっていました。


音声待ちの処理を行っている時に


rtc= write(fd, " ", 1);


のような処理をループ実行していると


watchdog watchdog0: watchdog did not stop!

Segmentation fault


といったエラーが発生して、アプリがハングします。


その後60秒経過後にwatchdogタイマが実施されて


再起動になります。


以下が気になった記事です。

https://quickview.cloudapps.cisco.com/quickview/bug/CSCub79985


シグナルを定義して並行的に動作させている箇所があるので


それがもしかしたら問題なのかもしれません。


対策は以下の方法で行いました。


1. 問題の箇所に対してwatchdog disableを行う。

    write(fd, "V", 1);    // Watchdogタイマディセーブル

   

    問題の処理

    …

    rtc= write(fd, " ", 1); // Watchdogタイマリスタート

   

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


[今日のひとこと]


香港国家安全維持法が7/1に施行されたようです。


第38条が特に世界が問題視しているようで、


中国が他国に戦争を仕掛けてもあんたの国は文句を言うな。


と、とらえることができると思うのですがどうなんでしょうか。


オリンピック前に、第3次世界大戦開幕ですか。


2020年6月21日日曜日

[RTOS] タスク毎の仕様

こんにちは

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

現在、Real Time OSの案件を着手しています。

フェーズ的には未だ初期の段階で、タスク間の設計書作成

を行っています。

どんなことを書けばいいのかというと、

以下のようなことを書けば良いそうです。

これらをまずは書いてユーザに提出したいと思います。

------------------------------------------
[タスク関連図]
1タスク当たりに記載する内容(タスクブロックとここでは言うことにします。)
    :タスク名、タスク概要、ID、タスク優先度
   
ドライバ
    :ドライバ名(UART CH3 Driver等)
   
ハードウェアモジュール
    :ハードウェア名(例: LCD、Wifi等)
   
タスクブロック(システム)→ タスクブロック(モータ制御)→ ドライバ →ハードウェアモジュール
   ┃
   ┣━━━━━━━━━→UART1ドライバ→BlueToothハードウェアモジュール
   ┃
   ┣━━━━━━━━━→I2cドライバ→タッチパネルハードウェアモジュール
   ┃
   ┗━━━━━━━━━→システム制御ドライバ→…

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

[今日のひとこと]
google さんからブラウザー意見アンケート
が来ました。

Apple iPhone 11 Pro

が100円のようです。

「え。まじ」と思いクリックして行きました。

紙吹雪も吹いているし、流石googleだ。と思っていました。

が、実はこれ、フィッシング詐欺のようです。

途中からカード番号入力になったので、

すぐに辞めました。

怖いですね~。

お年寄りとか「まさか私が」とかなりませんかね。

こういう輩は根こそぎ摘発した方がいいです。

2020年6月10日水曜日

[RTOS] ソース解析についてのもがき

こんにちは


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


今日は、Real Time OS(RTOS)を使用した案件において、


ソース解析について考えてみたいと思います。


まず、ソースを見てもいまいちピンときません。


タスク間でメッセージ、フラグ、セマフォなどを通して


連絡しながら、それぞれ独立して動作しています。


ですので、以下のようにして


ソース解析してみようかなと思います。


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


エクセルのシートをタスクごとに分ける。


シート0:メインプログラム、IDLEタスク

シート1:タスク①

シート2:タスク②

・・・


メッセージはセルを色付けする。(青固定とか)

フラグもセルを色付けする。(緑固定とか)

セマフォもセルを色付けする。(赤固定とか)


そうするだけでも何かつらつら記載していても


モチベーションが下がらないような気がします!


何か良い方法があったら教えてください。


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


今日のひとこと


ラーメンっておいしいですよね。


最近はテイクアウトで注文します。


お値段はお店で食べるのと変わらないです。


個人的には、もう少し安くしてもらいたいと思います。


利益はテイクアウトの方がもうかると思うんですよね。


例えば、


1席だけで考えると、ラーメンを10分で作って、10分で食べきるとすると

合計20分になります。


1時間当たり3人ですよね。


それがテイクアウトだと、席で食べる時間を削ることができるので


10分で作って、提供して、再度10分で作って。。。


なので、1時間当たり6人。


容器代がかかると言っても、後片付けとかないし


あまり考慮しないでもいいような気がします。


2020年5月28日木曜日

[エンベデッド] スケジュール表の作成

こんにちは

ソフトな道をトボトボと今日は歩きます。


昨日の昼に、スケジュール表を作成するイベントが発生しました。


今回はスケジュール表を効率的に作成するかを考えてみました。


粒度にもよりますが、ソフトウェアの詳細なスケジュールです。


”要求されている項目”と”工数”が手元にある場合、以下のようにすれば無駄がないと思います。


① スケジュール表(ガントチャート)に”要求されている項目”を記載

② 工数をその項目の横に記載

③ 並び替え

④ ガントチャートの日程の箇所に、青(背景色で何色でもOK)で、

    8以内の数を記載

⑤ "④"の数値を消します。


① スケジュール表(ガントチャート)に”要求されている項目”を記載します。

    ガントチャートに作業の項目を書いていきます。

    大項目、小項目がある場合は小項目で区別がつくように

    書きます。

    例えば、

       通信初期化_UART

       通信初期化_I2C

       

       UART 通信初期化

       I2C 通信初期化

        とかです。

       

② 工数をその項目の横に記載

    作業の項目の横に工数を記載します。

    私の場合は右隣です。

   

③ 並び替え

    作業順に並んでいないときはここで並び替えます。

    並び替えても工数はあらかじめ書き込んでいるので

    時間量は変わらないです。


④ ガントチャートの日程の箇所に、青(背景色で何色でもOK)で、

    8以内の数を記載

   

    実際に作業の項目に対してバーを埋めていきます。

    この時、1日あたり最大8時間として要求されている項目分記載します。

    10時間とか無茶な値を入れてはいけません。

   

⑤ "④"の数値を消します。

    消す理由は相手方に数値付きで渡してしまうと

    時間給が分かってしまう為です。

    消しましょう。

   

以上で行うようにします。


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


今日のひとこと


見積というのは発注者は安く抑えたい。


受注者は高く受注したい。


のマッチングをどうやるかだと思います。


コロナで分かったが、魅力的でもないトイレットペーパーに


高値がつくのは、市場にトイレットペーパーが無い


からです。


ということは、差別化はする必要は無いが


無いと困るもので、


しかも枯渇している仕事。


になります。


そんな仕事ありますかね。。。。


防衛関連、セキュリティ関連、アベノアプリ、、、


戦争関連が多そうです。

平和が一番なのに。

2020年5月23日土曜日

[Linux] アプリケーションからwatchdog を制御する

こんにちは

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


今回は、LinuxアプリからWatchdog タイマを再設定した時に


”watchdog watchdog0: watchdog did not stop!”

メッセージが出力されました。


その調査・対応について記載してみたいと思います。


このメッセージはターミナル上にwatchdogタイマ再設定の都度


出てくるので、ターミナルは大量のメッセージで埋め尽くされてしまいます。


このメッセージをカーネルソース内で以下のコマンドにて検索しました。


"grep "watchdog did not stop" -ir ./パス"


検索した結果

drivers/watchdog/

下のソースにヒットしました。


メッセージ出力はエラーに転んだ時に出力するようになっていました。

→ カーネルを直すのもいいのですが、上位側(アプリケーション)

でエラーがないように扱うのが筋のような気がしました。


そして、色々調べてわかったのは


アプリ内で


fd= open("/dev/watchdog", O_WRONLY);


を再設定する際に毎回実行していましたが、このopen()が入ってくると


毎回上記メッセージが出ます。


そこで、open("/dev/watchdog", O_WRONLY);は起動時の一回だけにして


後は開きっぱなしの状態(close()しないということです)で値を書き込む。


といった方法にしてみたら


上記メッセージは出なくなりました。


今日のひとこと


東京は6/1から緊急事態宣言解除になる話が出ています。


もしそうなったら、出勤者であふれかえってしまいます。


ただ、首都圏以外が5/22に解除されたとのことなので


その10日後の6/1で再発して


やはり緊急事態解除はやめよう。なんてことになるんじゃないかと


予想します。


良い意味で外れることを願います。

2020年5月18日月曜日

[Linux] snd_pcm_wait()から先に進まない

こんにちは

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


今回は、組み込み製品の試験を長時間していると、音が鳴り終わったと同時に


フリーズしているような現象になっていました。


こちらを調査してみましたので記載します。


環境としては以下です。


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


言語: C言語

CPU: Arm Cortex-A9をコアに持つCPU

開発している環境: Ubuntu 14.04

コンパイラ: arm用gnuコンパイラ

カーネル: linux-3.10.31

音: ALSAライブラリ"libasound バージョン2.0.0"を使用


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


まず、フリーズに見えていた現象は、


実は "snd_pcm_wait()"から返ってこなかったのが原因でした。


タイムアウトの引数として-1を


指定することで、永遠にreadyになるまで待っていました。


snd_pcm_wait()を実行中にスレッドが入って処理してしまうと


タイミングによってreadyにならないケースがあるようです。


今回の対策としては、タイムアウト時間を指定することで、


フリーズ状態を避けるようにしました。

(エラーになっているのか分からないので、

syslogにsnd_pcm_state_tの状態を出力するようにしました。)


以下、サンプルです。

(動作保証は無しと致します。)


===============================================================


void test(snd_pcm_t* pcm, int timeout)

{

    int rtc;

   

    rtc= snd_pcm_wait((snd_pcm_t *)pcm, timeout);

    if(rtc!= 1)

    {// not ready

        snd_pcm_state_t state = snd_pcm_state((snd_pcm_t *)pcm);

        syslog(LOG_ERR, "status: %d \n", (int)state);

    }

}

===============================================================


今日のひとこと


暑かったり寒かったりで体調が悪くなる季節です。


筋肉トレーニングや、逆立ちなどして


体軸や外面を整えて乗り切りましょう。



2020年5月8日金曜日

[Sphero mini] ロボットプログラミングを試しにしてみた。

こんにちは


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


今回は、Sphero mini kitというおもちゃが祖父から子供宛に届きました。


コロナウィルスで家から出られない為の暇つぶしアイテムのようです。


環境構築などはこちらに記載がありました。


子供にやらせてみたところ、結構はまっているようです。


”sphero edu”と”sphero play”があり、前者で適当に私も


ブロックでプログラミングしてみました。


関心したのは、JavaScript表記にボタン一つで変換できることです。


以下ブロックをコードに変換したものになります。


内容としては、以下のような動作を行います。


[内容]
  1. Sphero miniのledをランダムカラー点灯
  2. 180℃スピンさせる。
  3. 1秒前進
  4. Sphero miniのledをランダムカラー点灯
  5. 180℃スピンさせる。
  6. ランダムのサウンドを鳴らす。(スマートホンからの音でしたw)
  7. 1秒後退
  8. ”1””7”を100回繰り返す。


[JavaScript]


var kakudo = '0';

async function startProgram() {
setMainLed({ r: 49, g: 255, b: 234 });
kakudo = '0';
for (var _i0 = 0; _i0 < 100; ++_i0) {
setMainLed(getRandomColor());
await spin(180, 1);
await roll(0 + 180, 142, 1);
setMainLed(getRandomColor());
await spin(180, 1);
await Sound.play(false);
await roll(0 + 0, 142, 1);
await delay(0.025);
}
}


async function blockName() {
}

[ブロックプログラミング]


今日のひとこと


子供用のプログラミング教育用のアイテムは意外と侮れないですね。

Web系の言語が一番入りやすいのかもしれません。

トライ、エラーでロボットが期待通りに動いてくれないとかなら

子供も笑いながらデバッグしてくれるし。

私は組み込み系開発がメインで、Web系は知らなかったので、

JavaScriptを学ぶにはこれを機に触ってみようかなと思います。

2020年5月4日月曜日

[Linux] バージョン情報

こんにちは
ソフトな道をほのぼのと今日も歩きます。


今回は、ユーザに提供するアプリケーションのバージョンについて


記載したいと思います。


皆さんは、アプリケーションを提供する際にどのようにバージョンをつけていますか?


私の場合、案件によって異なるので、これといったバージョンをつける方法が
定まっていません。


なので、例を挙げる事で今後のバージョンのつけ方について


ヒントになれば良いと思っています。


今回の案件の環境は以下の通りです。


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

・環境

言語: C言語
CPU: Arm Cortex-A9をコアに持つCPU
開発している環境: Ubuntu 14.04 64bit
コンパイラ: arm-linux-gnueabihf-gcc
カーネル: linux-3.10.31


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


バージョンをつける際に以下のようなことを行っています。
  1. メモリをバージョン用に5バイト分確保します。
  2. "1."のメモリに"1.00"と書いて最後にNULLを書き込みます。
  3. main()からそのバージョン情報を読み出しターミナル上にそのバージョンを表示しています。
また、アプリケーション自体をエディタで表示させると、
"1.00"がどこかに見えます。


参考としてソースを載せます。


========================================

参考ソース


static char VERSION[5]= {"1.00\0"};


//******************************************************************************
//  Function: バージョン情報を取得する
//  Input : なし
//  Output : バージョン情報
// Return : なし
// Comment : アプリケーションバージョン情報を返します。
//******************************************************************************
void MAIN_Get_Version(char* ver_p)
{
memcpy(ver_p, VERSION, sizeof(VERSION));
}


void main(void)
{
char version[5];
MAIN_Get_Version(version);
printf("%s",version);
}
========================================


今日のひとこと



GWが始まりました、天気は晴天です。


緊急事態宣言の最中、食材を買いにスーパーに行きました。


暑いのは分かるのですが、マスクを顎まで下げて、
(要するに口にマスクはつけていない状態)

会話している人達がいました。

気持ちは分かるのですが、マスクもあまり意味がないのも分かるのですが

顎マスクはカッコ悪いです。

2020年4月28日火曜日

[エンベデッド] ソース確認いかに早くするか

こんにちは

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


今日は2020/04/28です。


在宅の営業マンから今日の午前中にソース解析してLAN対応できそうか返事をくれと


言われました。


そのソースは昨日の夜に送られてきたというもので、どこから手を付けたものかと


思案しました。


中身見ても良くわからないし、OSは実績のないものだし、という状況での判断です。


結論としては、やれることだけやろう。。。。


出来ること:


1. グローバル検索で単語"LAN"、"Ether"で検索する。

2. 検索でヒットしたソースパスをメモしておく。

3. "2"でヒットしたパスのフォルダ内のソースファイル名を見てみる。

    また、ファイル内を見てみる。

4. コメント、関数名をみていく。


これである程度は内容は理解できた気になれました。


営業さんには、見積もり条件を惜しげもなく出すようにすることで

対応できると回答しました。


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

以上です。