2019年5月28日火曜日

令和時代のモノのありかた


~自分の考える令和時代~

昭和時代は黒電話を代表にどんな事が起きても壊れないものが良い製品で人気商品であった。

平成になるとモノで溢れかえり、昭和でいう良いものが売れにくい時代になったので
リリースサイクルを短くなり新商品というタイトルで目移りさせ
ガラクタやゴミでも物欲を掻き立てさせ容姿や口コミで売るのが平成になる。

令和からはいわゆるシェアエコノミーの時代がくる。
ゴミが増やさずリース販売がメインで進んでいくと思う。
日常生活に必要な家電類から植木鉢に至るまで全てリース化されて不要になれば業者に返却する。
もうゴミ量産時代は終わり。
欲しいと思った人にリースして関連サービスも提供されていき、新たなサービス業も増えいく。
所有する時代も変えていくのではなかろうか。

2019年5月23日木曜日

InkSpaceを使って画像(ラスタ)からSVG(ベクトル)へ変換する方法。



無料のドローツール「Inkspace」を使って、画像からベクトルデータに変換する方法をまとめました。

ダウンロード先
 https://inkscape.org/ja/

作業の流れ

 Inkspaceで画像を開いて、ベクトルデータに変換を行います。
 変換するとベクトルデータは範囲選択された状態になっていますが、
 ワーク上は画像データとベクトルデータが2つ重なっています。
 まず、切り取りしてクリップボードにベクトルデータを退避してから
 元画像データを削除してから
 クリップボードにあるベクトルデータを張り付けて終わり。

この話を手順にすると、、、



①InkSpaceを開く ②画像を開く ③CTRL+Aを押してすべて選択状態にしておく ④メニューバー「パス」→「ビットマップをトレース」を選択 ⑤プレビューをチェックを入れて画像が出てきたら「OK」ボタンを押す ⑥CTRL+Xで切り取りをする(トレースデータをクリップボードに退避) ⑦CTRL+Aでビットマップを全て選択して「Delete」キーを押す(最初の画像を削除) ⑧CTRL+Vでトレースデータを張り付けて、画像を白紙の上に移動させる ⑨ファイル→保存(EPSとか好きな形式で) これでファイル作成おk

2019年4月30日火曜日

VSCodeでAnaconda開発環境を整える。

VSCodeでAnaconda開発環境を整える。

Step1.PATH環境変数を設定する必要します。
 C:\Users\abc\Anaconda3
 C:\Users\abc\Anaconda3\Scripts
 C:\Users\abc\Anaconda3\Library\bin

Step2.Settings.jsonのPythonPathを設定する。
 "python.pythonPath": "C:\\Users\\abc\\Anaconda3\\envs\\bitmexbot\\python.exe"

以上で設定完了。

デバッグする時に左下のメニューバーにどのバージョンのPython実行環境を選べるので、
そこでActivateしたい環境を選べばOKです。

例:「Python 3.7.1 64bit("hoge": conda)」


Launch.jsonを作る時は、「Python: Current File」でひな型を作り
実行したいソースを開いて実行(F5)するとデバッグ開始します。

ーーーー

実はそのまま動かすと、PSSecuritException例外エラーが発生します。

PSSecuritExceptionエラーを出なくする方法

これを解決するには管理者権限でPowerShellを起動して、
以下のコマンドを入力します。

「Set-ExcutionPolicy RemoteSigned」

実行ポリシーを変更しますか?と出てきたら「Y」を押せば完了。

2019年3月28日木曜日

[ARM]最新のツールチェーン(gccとかdbg)をダウンロード

Cortex-M0+マイコンなSAMD21を使っているんだけど、
AtmelStudio開発環境で最初に同梱されているツールチェーンのバージョンが6.3.1だったりする。

古い(枯れた)環境で問題ないけども、最新のバージョンって気になるじゃん?ってことで入れてみた。


https://developer.arm.com/tools-and-software/open-source-software/gnu-toolchain/gnu-rm

上のURLから最新版をダウンロードしてきて、

「C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain」

この辺りのフォルダを差し替えるだけ!


まぁ、簡単で良かったけど、

gcc-arm-none-eabi-7-2018-q4はバグってるので

http://gcc-arm-none-eabi-7-2018-q2-update-win32.zip

1つ前をダウンロードしとく必要あり。

詳しくは下のサイトに載っています。
https://bugs.launchpad.net/gcc-arm-embedded/+bug/1810274

2019年3月22日金曜日

【ARM】【Cortex-M0+】【SAMD21】DMA転送の罠

【DMA転送の罠】

ソフトバンクが買収したARM社のマイコンをこれから積極的に活用しようとして色々勉強してるんだけど、ARMコアのDMA転送のしくみは罠すぎるというか改善余地ありに思えるw


DMA転送を語る前にまずCPUの仕組みを理解するにはOSを設計できるレベルの知識が必要で、特にスケジューリング周りは外せない。

FreeRTOSなプリエンティブ、多段フィードバックキューやタイムスライスなど。

IT系の国家資格を持ってる人なら試験範囲の部分だし、自作OSの実装などでも触っている部分だしこの辺の事は大丈夫だろうと思って油断したのがARMコアのDMA転送。。

仕様上リングバッファ非対応だとか、ラウンドロビンで優先権を回す方式など、ある程度の仕組みを調べていざ動かしてみるとなぜかフリーズするんですよね。。

(海外サイトでも動かなくて解決案が無く、Githubでもコメントでここはそのうち・・みたいな感じになっていたり。PC向けARMって大丈夫?)

フリーズする理由でいくつか考えてみると、割込みが飛んでこないからっていう理由でコールバック処理されないなど色々模索してみたけど結果解決できず。。しかもレジスタを覗いてみるとラウンドロビンのFIFOキューは空っぽ、、静的な割り当てしても反応しない、、アクティブチャンネルを変えようと思っても切り替わらないしいったいどうなってるの状態。



さまざまな代替案やアプローチを考え試したけどうまくいかなくて、最終的にはPIOでカバーという非常手段を取っておきつつ、何度も1000ページ超える英文のドキュメントを読み直しては間違った解釈が無いか、抜け漏れがないか調べてようやく気付いた事がある。



ラウンドロビン・・・(; ・`д・´)?



あー・・・(悲しみ

通信周りに関して上位レイヤーから物理レイヤーまですべて精通してるつもりだったけど、そうでもなかった件について。。

ラウンドロビンって順番に優先権を渡して終わったら次!っていう感じに回していく仕組みだから、受信側のDMA転送は指定バイト数受信が終わるまで優先権を奪ってしまうんですよね。
つまり、タイムアウトなんて機能がないため
他のDMA転送を開始しない限り優先権は切り替わる事はなく、そのままフリーズする現象が起こる。
というのもバイト単位をビートという名称で括っていて、1ビート単位で受信したよ!って割込みを発生させることができれば解決するように思えるがうまくいかない。
割込みをやめてライトバックキャッシュをポーリングして自分で転送データ数をカウントしていこうと思っても割込みが発生しない=ライトバックキャッシュは更新されない。って現象。
では、参照するたびにサスペンド・リジュームしていけば割込み飛んでくるし解決?って思いきや、割込み入るまで16クロック程度かかったりするのでオーバーランのリスクが高まる。
以上の事から1ビートを1バイト単位に刻めば解決?って思うけどそれはそれでメモリ圧迫するからしたくないジレンマ。。

今日考えたのは、タイマー割込みをDMA転送にして割込み優先度を受信DMA転送より高くしてあげればいいんじゃない?って発想。
1ms割込みを無駄に消費するけど、バス効率が悪くなるだけでCPUの負担は少ないはず。。
これでもう一度DMA転送を試してみようと思う。

教訓:知っているからって油断するとハマる罠あり

2019年3月17日日曜日

VSCodeでCortex-Mコアのビルド環境を整える

【VisualStudioCodeは便利】

VSCode上でCortex-M用のコードをビルド!

当時viかemacs、どちらを使うか悩んでいた時に

emacs派生のxyzzyを1か月使ってみて色々分かってきたんだけど

VIのシンプルさと軽量である点に惹かれてメインはVIM、しぶしぶVSを使うって感じでした。

(VSにはリファクタリング、コード補間機能が優れていて不満はないけど、もっさり感だけは・・・)



ちなみに今回VSCodeを使い始めようと思ったきっかけは

今やってるマイコンのプログラムのデバッグ環境がVIでは構築できなかったため。



最初は何をすればよいかサッパリ分からない状態だったけど

使い慣れていくうちに、これは便利だな・・・って思えるところまできましたw

というのも、GCCビルドする時もccacheを使う設定にしてみたり

GDB起動する時のConfigurationも自分で変更できるし。

むしろ書かないと何も動かないけど、書けば動くってところに魅力がある。



ってことで、今日はビルド&GDBデバッガ実行が整った記念にSS撮影w

まだ細かいところ、エラー行にジャンプする設定とかまだだけど、デバッガが使えるから重宝しそうです。


・・・さて、設定の内容に移ろうと思います。

まずは.vscodeフォルダに3つファイルがあります。

・c_cpp_properties.json  ・・・インクルード関係(参照ジャンプ用)
・launch.json       ・・・デバッガ設定
・tasks.json        ・・・ビルド設定


大まかに分けるとこんな感じです。

インクルード関係は、コード上波線~~が出てるところにカーソルを合わせると電球マークが出てくるからそれをクリックするだけでOK。

デバッガ設定はGDBを使う場合は、最初JTAGポート開いてデバイスにアタッチして、ロードして、break mainまでの一連のバッチを書きます。

ビルド環境は、Makefileのあるフォルダ設定をして、make clean、make allを実行できるようにします。

もしビルドの高速化でccacheを使う場合は、Makefileに書かれている gcc部分の前にccacheを入れるだけでOKです。

例:
gcc -o hoge.c

これを

ccache gcc -o hoge.c

にするだけ!


コードを張り付けようと思ったけど、
まだビルドエラーした時のエラー行ジャンプがまだなので、次回にします。

2019年3月2日土曜日

[C#]ビットアサインを表現する

久しぶりの更新です。

最近はマイコンのファームウェアを書いててC言語ばかりでC#も久々になってしまった。。

C言語よりC#のが便利!って思う所が沢山ある。
といってもC言語にはポインタがあって、こいつを利用しまくるとデータと型を組み合わせたりできてとても効率的なプログラムが書けるのは確かなんだけど、、
保守性を意識したり、文字列回りとかを意識するとやっぱ高級言語な方が便利だよね!って思う。

さて、通信プログラム界隈では受け取ったデータをビットフィールドで表現してアレコレやりたい!っていうのは叶うのんだけど、C#だとどうしても非効率なコードを書かないといけないのです。
もちろん誰かが作ったライブラリを使う手もあるのですが、コード生成系で出力されたコードはメンテナンスしたくない、、、みたいな好き嫌いがでてしまいますw

ということで自分で実装しました。

データ長はuint型(32bit)で固定してます。
long型にすれば64bit、
自在に操りたいならbyte型の配列にしてarray操作回りを書けばなんとか凌げるかな。


ーーー




using System;
using System.Windows.Forms;

namespace BitAssignCheck
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button8_Click(object sender, EventArgs e)
        {
            uint d = 0;
            int offset = 1;
            var v = d.GetInt(0, 3);
            for (var i = -7; i < 8; i++)
            {
                d = d.SetInt(i, offset, 3);
                var z = d.GetInt(offset, 3);
                if (z != i)
                {
                    Console.WriteLine(z);
                }
            }

        }
    }

    public static class BitAssign
    {
        public static uint GetMask(int offset, int count)
        {
            var cnt = offset + count;
            var lo = (uint)((1 << offset) - 1);
            var hi = (32 == cnt) ? 0xffffffff : (uint)((1 << cnt) - 1);
            var result = hi - lo;
            return result;
        }

        static readonly uint[] mask = new uint[]
        {
            0x00000001,
            0x00000003,
            0x00000007,
            0x0000000f,
            0x0000001f,
            0x0000003f,
            0x0000007f,
            0x000000ff,
            0x000001ff,
            0x000003ff,
            0x000007ff,
            0x00000fff,
            0x00001fff,
            0x00003fff,
            0x00007fff,
            0x0000ffff,
            0x0001ffff,
            0x0003ffff,
            0x0007ffff,
            0x000fffff,
            0x001fffff,
            0x003fffff,
            0x007fffff,
            0x00ffffff,
            0x01ffffff,
            0x03ffffff,
            0x07ffffff,
            0x0fffffff,
            0x1fffffff,
            0x3fffffff,
            0x7fffffff,
            0xffffffff,
        };

        static readonly uint[] bits = new uint[]
        {
            0x00000001,
            0x00000002,
            0x00000004,
            0x00000008,
            0x00000010,
            0x00000020,
            0x00000040,
            0x00000080,
            0x00000100,
            0x00000200,
            0x00000400,
            0x00000800,
            0x00001000,
            0x00002000,
            0x00004000,
            0x00008000,
            0x00010000,
            0x00020000,
            0x00040000,
            0x00080000,
            0x00100000,
            0x00200000,
            0x00400000,
            0x00800000,
            0x01000000,
            0x02000000,
            0x04000000,
            0x08000000,
            0x10000000,
            0x20000000,
            0x40000000,
            0x80000000,
        };

        public static bool GetBool(this uint self, int offset)
        {
            var b = bits[offset];
            var result = (0 != (self & b));
            return result;
        }

        public static int GetInt(this uint self, int offset, int count)
        {
            var value = self >> offset;
            var b = bits[count];
            var m = mask[count];
            var sign = value & b;
            var data = value & m;
            var result = (0 == sign) ? (int)data : -((int)(data ^ m) + 1);
            return result;
        }

        public static uint GetUInt(this uint self, int offset, int count)
        {
            var value = self >> offset;
            var m = mask[count];
            var data = value & m;
            return data;
        }

        public static uint SetBool(this uint self, bool value, int offset)
        {
            var b = bits[offset];
            var m = 0xffffffff ^ b;
            var result = (value) ? (self | b) : (self & m);
            return result;
        }

        public static uint SetInt(this uint self, int value, int offset, int count)
        {
            return self.SetUInt((uint)value, offset, count);
        }

        public static uint SetUInt(this uint self, uint value, int offset, int count)
        {
            var mv = mask[count];
            var data1 = (value & mv) << offset;

            var ms = 0xffffffff ^ (mv << offset);
            var data0 = (self & ms);
            var result = data0 | data1;
            return result;
        }
    }
}

もしテーブル使いたくなければ、算出する関数を使えばおk。
public static uint GetMask(int offset, int count)
{
    var cnt = offset + count;
    var lo = (uint)((1 << offset) - 1);
    var hi = (32 == cnt) ? 0xffffffff : (uint)((1 << cnt) - 1);
    var result = hi - lo;
    return result;
}

public static uint GetMask(int bits)
{
    var cnt = bits + 1;
    var result = (32 == cnt) ? 0xffffffff : (uint)((1 << cnt) - 1);
    return result;
}

public static uint GetBits(int bits)
{
    return 1 << bits;
}

2018年12月26日水曜日

勝ち続ける意志力

世界一プロゲーマの仕事術というサブタイトルに書かれている本です。

書写はUmehara Beastでも有名な梅原大吾さん。
ほんと尊敬できる人です。
今日はその人が書いた本を読んで思った事を書こうと思う。


ちなみにこの本を知るきっかけになったのは、ツイッターです。
なんだか為替をやっている人たちがゲームをFXに置き換えて考えるととても勉強になるというTLが流れて興味を持ち読み始めました。

ざっと読んだ雑感は、ゲーマーもアスリートであること。
努力の上に結果が世界一を手に入れたんだと言って過言ではない。
ちなみに努力するにしても、相手が100時間プレイしたなら自分はその3倍、300時間プレイするというスタイル。
されに研究も因数分解式に考え、
相手の何が強いのかを紐解いていき、最終的に細かくして強い部分をどう封じて有利に導くかを知ること。
そうしていくうちに相手が有利だと思ってた壁が消えて、こうすれば壁が崩せて自分が有利になる。でもその条件は・・・こうこうで、、、という風になり
メンタルというかどんな状況において平常心が保てるようになる。
これが勝負師というのかなんというのか。確かに為替FXでも使えそうな技である。

他にも雀士になった時の話などもとても参考になったりするが、
気になったならば本編を読んでみると面白いかも。
(とくに最初の方は面白い)

GoogleHomeアプリ開発1

ヨドバシカメラで1000円ちょっとでGoogleHomeが売られていたので早速購入してきました。
「Ok,Google。ラジオつけて。」
これが意外と便利w

というかTV見ないし、ネット動画見ながらラジオ聞くと普段聞かないジャンルも耳に入ってちょうどいい感じ。

さて、今日からGoogleHomeのアプリ開発を始めようと思う。
始めるにあたって本を買ってきました。


この本によるとページ通りに進めるだけで音声スキルが作れるそうなので、
何も考えずに、
というか!
めんどくさがらずに淡々と進めていきますか。。


とりあえずかっ飛ばしていきます。

キャプチャ1はどういったものかの説明なのでスキップ。

キャプチャ2ではDialogflowとはについて書かれていました。

重要な要素として
・Agent
・Intent
・Entity
・Fullfillment
この4つがあるそうです。

Agentはプロジェクトそのもの。
Intentは訳通り、スキルの意味
Entityは言い回しの辞書。あらかじめフレーズを登録しておく感じですかね。
FullfillmentはIntentoで受け取ったものを外部サーバーへ届ける橋渡し機能。

あ、忘れてました、、、
Dialogflowとは、Googleが作った会話BOT用のAIシステムの総称だそうです。
これを使わずに実装もできるみたいだけど、より自然な流れで音声スキルを作れるぽいのでとりあえず使っておきましょう。

さあいざ、実践!Helloworld!

本にはAction on Googleのアカウント登録からHello worldまで書かれています。
ネットでも似たような内容があるので、それに沿って進めれば同じ結果にたどり着けるでしょうから、URL張っておきます。

https://dev.classmethod.jp/voice-assistant/actions-on-google/hello-world-on-google-home/


今回はここまで。

追記:書籍の初版が2018.10月、現時点2018.12月なのに、すでにDialogflowの操作周りが変わってしまっているようです。
ということで上記URLが最新版のHelloworldになります。
また変わったら新しい記事にして書き留めますよ。

2018年12月24日月曜日

悩みどころ逃げどころ




 本のタイトルからしてなんだかシリアスな感じがするけど、
プロゲーマ梅原氏と社会はブロガーちきりん氏の対談本です。
梅原氏はプロゲーマ―であるとともに世界一になったこともあるが、高卒でバイト先でも偏見を持たれ、低学歴であることによる学歴社会による格差を感じていたのに対し、
高学歴で順風満帆で社会に出たちきりん氏。
二人は全く混ざり合うことない世界で人生を歩み、考え方も180度異なる視点でずっと交じり合わない対談が進んでいくのだけど意外とこれが面白いw

学校教育制度についても全く正反対の成績表だったりするけど、意外に共通点があって

「型にハマりたくない。」

二人はここで初めて意見が一致することになる。

この「型」というところにツボったw
なんでかというと、プログラミングにおいてType「型」は基本要素であり、
システム設計する上でオブジェクト指向で考えていくと必ず出現するのがクラス定義
つまり型である。

型にハマりたくない・・・自分の人生なんだから自ら決めた道を進むんだ!って意志はまさに

松本零士の銀河鉄道999の哲郎と一緒の考えで、やっぱそこに行きつくんだろうなーって個人的に思ってつぼってた。

というのも終点は機械の惑星で、そこで人間は機械の部品にされ
機械の惑星の一部になって一生を遂げるというストーリーはまさに
学校教育の時に刷り込まれたワード、
大企業に入って定年まで安泰した仕事をして定年後も安泰
という昔ならありかもしれないけど、今はそんな世の中ではないよと
昔ならアニメで教えてくれたのを今ではインターネット、
今回では本を通して教えてくれている事が非常に良いなと思った。

ちなみに最後まで話は噛み合わずに終わるけど、意外に楽しめました。
でも対談だし、対極の関係である二人の話なので共感しない部分や
考え方にクセが強く出ていてなじめない人もいると思いますが、
学校教育で思考停止してしまった「なぜ」や「どうして」といった
考える力について改めて考えさせてくれる本なので一読してみるのもよいかもしれないです。


2018年12月22日土曜日

ダイエットして気づく腹回りの余った皮

風呂上り、上半身裸でプランク(腕立て伏せみたいな体制で体をまっすぐ伸ばす筋トレ)したら腹回りが視界に入りました。
そこにはたぷんたぷんの皮があって、いろんな部位の脂肪が流れ溜まってましたw

 「こいつはダイエット前の体系を維持するために伸びた皮だ」

なんとかせねば・・・!

調べによると、腹回りの皮は1年で約2cmしか上下しないようです。
つまり体系って意外と変化に弱く
急激に筋肉つけば皮に線が入ったりするし、
急激に減れば皮がたぷんたぷんになることが分かります。

今の自分の現状にあてはめると、
10kg減ってこぶし2つ分、ベルト穴3つ分くらい変動したので
1年でベルト穴1つ分皮が縮むとすると、
腹回りの皮が今の体系に戻るのは3年先だというのが分かりますww

逆算していくと、、、、、

ダイエットしたい!って思ってる方に朗報!!

 「1年でやっていいダイエット上限(推奨)値はおおよそ5キロまで」

 それ以上は無駄に余った皮を見る事になります。
※もし10キロダウン目指してるなら1年で5キロダウンを目指し、2年計画で緩やかに落とそう。

ライザップで糖質制限って話題になったてたけど、これも実践してやるかやるかやるか…の問題。
それにダイエットもいろんなやり方があり10人十色。
糖質ダイエットだけがダイエットではなく、
自分は食生活のスタイルはそのままで好きなお菓子もアイスも食べて体重落としてますw

2018年11月14日水曜日

[AtmelStudio]クロックの設定

ATMEL SAMD21マイコンを使う上で必ず最初に設定しなければならないクロック設定。

USBホスト機能やUART回りを使うなら外部クリスタル発振子を使った方が断然よいので
今回は外部クロックを使用した場合の例です。

クロック設定例


まず最初に使うコンポーネントを追加します。
次にどのオシレータを使うか設定で、内臓8Mと外部32.768kHzのオシレータにチェック入れてから
内臓8MHzは400kHzに分周して、FDPLLで48MHzを生成します。

ソースクロックで入力するオシレータを選択していきます。
GCLK0は48MHz、GCLK3は400kHzを設定すればクロック設定終了です。


ちなみに内臓クロックの精度はこちら。
https://cdn-shop.adafruit.com/product-files/2772/atmel-42181-sam-d21_datasheet.pdf
Page972参照





2018年11月13日火曜日

【ARM】高機能JTAG、BlackMagicProbeクローンを激安STM32F103C8T6マイコンで作る。



このBlackMagicProbeというものは、ARMなCortexシリーズ用のJTAG/SWDデバッグアダプタで、通常デバッガはOpenocdを使う所をgdb使うようにしたものです。
デバッガをGDBにしたことで、FreeRTOSなどでいろんなスレッドに飛ばされたりしたときにも細かくトレースできて高速、というのがウリのようです。
もう1つ良い点は、これ1つ持っていれば各社ARMマイコンと各社専用のJTAG/SWDアダプタを買わずに済むというメリットがあります。

そんなBlackmagicProbeですが、オープンハードウェアでオープンソースなので自由にクローンが作れます。

サイトは以下URL.


あまりメジャーではないのか、記事もあまりなく構築するのに色々と苦戦しました。
まず激安マイコンのSTM32F103C8T6はフラッシュ領域が64kBなのですが、アンロックすることで128kBにできます。
今回各ファームは64kB超えのROMサイズなので、必ずアンロック作業が必要になり
特別な書き方で行わないとできないので、STLink Utility上からでは書き込むことはできないので要注意。

ちなみに参考程度のメモですが、
ファームはRaspberryPi3上で環境を構築して同じCortexコアなのでそのままビルド、ファーム転送で構築しました。


Androider