サーバのアップデート

やらないと…と先延ばしにしていたサーバのアップデート、ようやく完了。
今回はOSをDebian 10にしました。

railsで動いているアプリケーションも何とか6.0にしました。
ところどころ動かないところは諦めたりとかしましたが、
主要なものはあまり手を入れずに動かせて良かったです。

Posted at : 2020-07-25 17:24:40 / Category : none

MCP2221Aを使う(その1)

基板を作成してみました。
昨日FusionPCBで発注、そんなに急ぎではなかったのでShigapore Postで配送にしました。
3週間後ぐらいに届くのが楽しみです。

今回作った基板は、USBで接続をして、UART、I2C、GPIOをそれぞれコネクタから出します。
メインはUSB-シリアル変換として使うため、ついでに今後その他のIOで遊ぼうと思っています。

最初、いろいろなところで使えると良いなと思い、MCP2221Aを表面実装とDIPとそれぞれ切り替えて使えるよう設計していました。
ただ、USBの基板設計ガイドラインを確認していて、明確には書いてないものの分岐はダメな気がしてきてやめました。
表面実装とDIP、どちらかは未実装になるので動作としての影響はないのですが、分岐していることで反射の影響とか受けそうだなぁ…と。
ということで、表面実装だけ残してあとはすべて削除。すっきりとした基板になりました。

image

Posted at : 2020-06-14 22:45:19 / Category : none

AVRの書き込み基板(その1)

今さらAVRの書き込み基板を作ってます。
ワンボードにAVRを2個乗っけて、モニタ用(マスタ)とプログラム実行用(スレーブ)のそれぞれで使用して、
PCからUSB1本でプログラムの書き込みから実行までできるような基板です。
基板の詳細についてはまた別の機会に書くことにして、早速失敗に気づいたので、まずはそちらから…。

UARTからデータの送受信をするプログラムを作成して実行してみるも、何かうまく行かない。
オシロで見てみるとボーレート自体は問題なさそうだし…って、なんでマイナスの電圧が?というので気づきました、レベル変換入れてない…。
そういう設計でも(仕様通りなら)良かったんですが、少なくとも今使っているUSBシリアル変換はRS-232Cのレベルでしか受けてくれません(なので仕様通りじゃない)。

こういうときのため、以前にMAX232を使ったレベル変換基板を作ったので、それを使ってみることに。
が、これもこれでよく調べてみると、この基板は電源をマイコン側から取るようになっている(当然RS-232Cのコネクタにも電源はないので、MAX232を動かすための電源が取れない)。
今回作った基板は添付の画像のようにRX, TX, GNDの3線しか出していません(ここにVCCがあれば解決する問題だった)。うーん…ダメじゃん。

そうなるとCMOSレベルで受けられる、USBシリアル変換を買うか、あるいは作るかになりそうです。

image

Posted at : 2020-06-07 21:36:56 / Category : none

Raspberry Pi 4b (4GB model)を購入

Raspberry Pi 4b (4GB model)を購入しました。
秋月のセットを購入。
いろんなところで売っているのでどこで買ってもよいんだけど、
電子部品を買う必要があり一緒に通販で購入しました。

当面の用途はローカルのDNSリゾルバにすること。
ルータがEDNS0に対応していないためGoogleのDNSを使っているのですが、
いくらレスポンスが早いと言っても、やっぱりローカルでDNSは持ちたい。
あと、ローカルに常時電源入ったデバイスがほしかったというのも理由。

買うときに少し悩んだのが発熱がどうなのかという点。
早速購入直後の状態で確かめてみたところ、以下の通りでした。

1$ vcgencmd measure_temp
2temp=63.0'C

ちょっと高いかな…。
ちなみに、1コアだけCPUに負荷をかけると以下の通り。

1$ dd if=/dev/random of=/dev/null &
2$ uptime
3 02:18:48 up  2:42,  4 users,  load average: 1.26, 0.47, 0.17
4$ vcgencmd measure_temp
5temp=69.0'C

室温が23度の条件で上記なので、夏場は厳しいかも…。

ちなみに、Power Management の状況を確認したところ、idle時は600MHz、

1$ vcgencmd measure_clock arm
2frequency(48)=600117184

一方で高負荷時は1.5GHzで動作している。

1$ vcgencmd measure_clock arm
2frequency(48)=1500398464

気休めにヒートシンクはつけてみたものの、あまり変わらず…。
うん、何となくそんな気はしていた。
運用してみてあまりにも酷ければ、ファンをつけることも考えよう。

image

必要な設定項目を設定。
GUIは停止して、SSHは常時起動に変更。

1$ sudo systemctl enable ssh
2$ sudo systemctl disable lightdm

最後にバージョンを確認。

1$ lsb_release -a
2No LSB modules are available.
3Distributor ID: Raspbian
4Description:    Raspbian GNU/Linux 10 (buster)
5Release:    10
6Codename:   buster
1$ uname -a
2Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux
Posted at : 2020-05-17 17:16:21 / Category : none

kgdbを使ったカーネルのデバッグ

kgdbを使ったLinux Kernelのデバッグ方法をまとめてみました。
この説明は以下の内容を元にして、具体的な手順を説明したものです。

kgdb, kdb の使い方と、カーネルデバッガーの内部
https://sites.google.com/site/kandamotohiro/linux/kgdb

カーネルの設定の確認

まずはカーネルの設定を確認。以下の通りに設定をします。

1# CONFIG_DEBUG_RODATA is not set
2CONFIG_FRAME_POINTER=y
3CONFIG_KGDB=y
4CONFIG_KGDB_SERIAL_CONSOLE=y
5CONFIG_DEBUG_INFO=y
6CONFIG_MAGIC_SYSRQ=y

ビルドして起動できることを確認します。

ホストとターゲットの構成

ホストとターゲットは2本のUARTで接続します。
1本はカーネルログの出力確認、breakコマンドの入力、シェルの操作を行うために使用します(以降の説明ではUART0)。
もう1本はkgdbの通信用に使用します(以降の説明ではUART1)。

image

UARTが1本しかないケースは、SSHで代替することもできます。
ただし、この場合、任意のタイミングでbreakをかけられないことと、カーネルログの出力が確認できないため、あまりおすすめはしないです。

ターゲットのカーネルを起動する

カーネルの引数にkgdbwait, kgdbocを追加します。
kgdbwaitは、カーネル起動時にkgdbの接続を待ちます。
kgdbocはUART経由でgdbに接続することを指定します。kgdbocには使用するttyとボーレートを設定します。
以下はUART1に対して、115.2kbpsのボーレートを設定しています。

1kgdbwait kgdboc=ttyS1,115200

またカーネルログの出力先は以下のとおりUART0に対して設定します。

1console=ttyS0,115200 

カーネルを起動して、以下の表示が出るとkgdbの接続待ちの状態になります。

1KGDB: Registered I/O driver kgdboc
2KGDB: Waiting for connection from remote gdb...

ホストからターゲットに接続する

ホストからターゲットのカーネルに対して、gdbでアタッチします。

ビルドしたvmlinuxをgdbで読み込みます。
ターゲットがロードしたカーネルがzImageの場合でも、シンボル情報が必要になるためvmlinuxをロードします。

1$ arm-linux-gnueabihf-gdb vmlinux

次にkgdbocでUART1に対してアタッチします。
以下はホストの/dev/ttyUSB2とターゲットのUART1が接続されている例です。

12(gdb) set serial baud 115200
3(gdb) target remote /dev/ttyUSB2

接続に成功すると以下のようにbreakpointで停止します。

10x8016fbb8 in arch_kgdb_breakpoint () at kernel/debug/debug_core.c:1070
21070            wmb(); /* Sync point before breakpoint */

kgdbの操作

ほとんどの操作はgdbと同様に行うことができます。
以下によく使う操作を記載します。
ブレークポイントを設定&実行を再開する
手順はgdbと同様です。
以下はuio_readにブレークを設定する例です。

 1(gdb) b uio_read
 2Breakpoint 1 at 0x803d910c: file drivers/uio/uio.c, line 812.
 3(gdb) c
 4Continuing.
 5[New Thread 1172]
 6[New Thread 1135]
 7[New Thread 1143]
 8[New Thread 1146]
 9[New Thread 1152]
10[New Thread 1153]
11[New Thread 1167]
12[Switching to Thread 1172]
13
14Thread 42 hit Breakpoint 1, uio_read (filep=0x839f9240, buf=0x7ef96c20 "", count=4, ppos=0x83bdff80) at drivers/uio/uio.c:812
15812     {
16(gdb)

任意のタイミングでブレークをかける

任意のタイミングでブレークをかける(つまり実行を停止して、gdbで操作できる状態にする)には、ホストからUART0に対してSysRq + gを入力します。

ホストからUART0への接続にscreenを使っている場合には、Ctrl-a -> b -> gでSysRq + gの入力できます。
SysRq +g を受け付けるとUART0には以下のように表示されます。

1# sysrq: SysRq : DEBUG

gdbは以下のようにブレークがかかります。

1Thread 1 received signal SIGTRAP, Trace/breakpoint trap.
2[Switching to Thread 4294967294]
3kgdb_breakpoint () at kernel/debug/debug_core.c:1071
41071            arch_kgdb_breakpoint();
5(gdb)
Posted at : 2020-05-06 15:45:26 / Category : none

Linux Kernelのmenuconfigで検索をする

カーネルのconfigを一部設定変更したいと思って、menuconfigを探してみるもなかなか見つからないことが多い。
.configをテキストでざっと見つつ、メニューの階層を推測して…といままでやってたんですが、
実はmenuconfig上で検索できることを知りました。これはすごく便利。

やり方は、menuconfigのUIで"/"を入力すると検索ができます。
例えば、MAGIC_SYSRQを探した結果は以下の通り。

image

左側に(3)や(4)などの数字が出ているので、それに対応するキーを押すとジャンプできます。
またselected byやdependsが書かれているので、ここからどういう条件でそのメニューが有効になるか、確認ができます。

Posted at : 2020-05-06 11:22:05 / Category : none

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

あけましておめでとうございます。今年もよろしくお願いいたします。

毎年恒例の目標をまとめてみたました。今年の目標は以下の通り。

  • 英語の listening と speaking の能力をあげる
    • 成果を客観的に見られるように、TOEICなどの試験を受けるようにする
    • 勉強は今まで通り、英字新聞や英語のニュースなどから
  • Linuxの最新情報について定期的にまとめる
    • 最近、日本語の最新情報を見ることが少なくなった気がするので、自分の理解向上のためにまとめていきたい
    • できればソースコードを追いながらできると良い

2020年もがんばっていきたいと思います。

Posted at : 2020-01-01 21:47:53 / Category : none

2019年12月31日

気づくと一年間日記を書いていませんでした。。。

年末なので今年の振り返り。
仕事や家庭などいろいろとありました。
トータルで見れば充実した一年だったのかなぁと思います。

さて、新年に立てた目標は…と見返すと、あまり課題の設定方法が良くなかった気がします。
どちらも具体的な成果にはなっていないものの、自分の中では少しづつできてきてるのかな(笑)

  • 世の中に貢献できるアイディアの実現、適切なアウトプットする
  • 世界を相手に活躍できる足がかりを作っていきたい

今年も一年ありがとうございました。来年もよろしくお願いいたします。

Posted at : 2019-12-31 21:28:39 / Category : none

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

あけましておめでとうございます。
今年もよろしくお願いいたします。

一年の抱負を考えてみました。

  • 世の中に貢献できるアイディアの実現、適切なアウトプットする
  • 世界を相手に活躍できる足がかりを作っていきたい

実現できるよう、今年もがんばっていこうと思います。

Posted at : 2019-01-01 17:48:35 / Category : life

2018年12月31日

今年も一年お疲れ様でした。
振り返ってみると、様々なできごとがあって充実した一年だったと思います。

今年のはじめに立てた目標に対しては、以下の結果となりました。

  • 世の中に貢献できるアイディア
    • アイディアの実現に向けて一つ一つ問題の解決をしている
    • 進捗が良くないので、もっと積極的に進められるようにする
  • 世界を相手に活躍できる足がかりを作っていきたい
    • 英語の学習は進めているものの、この一年は大きな成果が見えなかった
    • 特にリスニングの改善がうまくいっておらず、話す速度が早い場合や相手の発音によっては全く聞き取れない
    • 耳の問題と考えて、自分自身の発音の改善をしている。来年も継続的に改善をしていきたい
  • 研究の活動をしていきたい
    • 仕事や個人の活動など、研究の内容を参考にしつつ進められている
    • 新しく直面する問題もでてきそうなので、うまくアウトプットできるようにする

明日は2019年の目標を立てたいと思います。
皆様、良いお年をお迎えください。

Posted at : 2018-12-31 17:47:26 / Category : life

railsでbeforeunloadイベントが発生しないとき

■ 状況
railsでbeforeunloadイベントを使用して、ページ遷移時に警告を出そうとしたところ、aのリンクで意図した動作がしない。

■ 原因
railsでturbolinkを使っている場合、ページをリロードせずに画面を書き換えるため、beforeunloadイベントが発生しない。

■ 対策
対策としては以下のあたり。

  • turbolinkを使用しない
  • aのリンクにdata-turbolinks="false"を指定して、turbolinkを部分的に使用しないようにする
  • page:before-change のイベントを使用する
Posted at : 2018-02-22 22:27:31 / Category : rails

マイコンの割り込みをLinux上で再現する

マイコンの割り込みをLinux上でシグナルとスレッドを使って再現してみた。

大まかな処理は、マルチスレッドで制御のスレッドとマイコンの処理相当を行うスレッドの2つを作成、
制御側からマイコンの処理相当のスレッドをシグナルで一時停止させ、その間に割り込みハンドラを実行する。
フルのソースコードは以下を参照。

https://github.com/yasuharu/micon_int_on_linux/

まずマイコン側の処理。UARTの受信を意図したもの。
uart_rx_handlerが割り込みハンドラ、micon_mainがマイコン側のメイン処理。

 1void uart_rx_handler()
 2{
 3  static int     pos   = 0;
 4  static uint8_t buf[] = "test";
 5
 6  ringbuf_push(buf[pos]);
 7
 8  pos++;
 9}
10
11void micon_main()
12{
13  register_irq_handler(uart_rx_handler);
14
15  while(1)
16  {
17    if(ringbuf_length() > 0)
18    {
19      printf("%d\n", ringbuf_pop());
20    }
21  }
22}

メイン側の処理は、マイコン用のスレッドを作成し、一定期間ごとに割り込みを生成する。
割り込みの生成タイミングは、お好きなタイミングでどうぞ。

 1pthread_t thread_handle;
 2
 3int main()
 4{
 5  pthread_create(&thread_handle, NULL, micon_thread, NULL);
 6
 7  for(int i = 0 ; i < 5 ; i++)
 8  {
 9    sleep(1);
10
11    suspend_micon_thread();
12    do_irq_handler();
13    resume_micon_thread();
14  }
15}

シグナルはSIGUSR1とSIGUSR2を使用する。
SIGUSR1はマイコン側の処理をsuspend、SIGUSR2はマイコン側の処理をresumeするために使用する。
micon_thread内で以下の通り初期化する。

 1void micon_thread()
 2{
 3  struct sigaction sigusr1, sigusr2;
 4
 5  sigusr1.sa_flags   = 0;
 6  sigusr1.sa_handler = micon_thread_signal_usr1_handler;
 7  sigemptyset(&sigusr1.sa_mask);
 8  sigaction(SIGUSR1, &sigusr1, NULL);
 9
10  sigusr2.sa_flags   = 0;
11  sigusr2.sa_handler = micon_thread_signal_usr2_handler;
12  sigemptyset(&sigusr2.sa_mask);
13  sigaction(SIGUSR2, &sigusr2, NULL);
14
15  micon_main();
16}

今回のポイントは、以下のコードの部分。
suspend/resumeでマイコン側のスレッドを一時停止させる。
SIGUSRT1のハンドラ(micon_thread_signal_usr1_handler)内では、
sigsuspendを呼んで、SIGUSR2が発生するまで待つ。

割り込みハンドラはメインのスレッド、シグナルのハンドラはマイコンのスレッドと、
それぞれで実行しているコンテキストが違うことに注意が必要。
特にシグナルのハンドラのsigsuspendを実行する前に、割り込みハンドラが実行されないよう、
int_statusで処理待ちを行うようにしている。
(ちなみに、int_statusは本来であればmutexでロックが必要)

割り込みが発生したときの処理をまとめると以下の図になる。

処理

do_irq_handlerはこんな感じ。
int_statusを待つことだけ注意。

1void      (*irq_handler)(void);
2
3void do_irq_handler()
4{
5  while(int_status != 1);
6
7  irq_handler();
8}
Posted at : 2018-01-28 15:46:12 / Category : avr

ディープラーニングはじめてみた

とあるデータの予測をしたいため、ディープラーニングをはじめてみた。

経緯としては、今まではルールベースでの予測だったものの、あまり精度が伸びず。
ディープラーニングでうまくいかないか試行錯誤してみることにしてみました。

まずは手元のMacBookProにTensorflow + Kerasの環境を構築。
UbuntuのVM上で構築したので、pipでさくっと入って良い感じです。
Jupyter notebookを使いたかったけど、こちらはPython 2.7上に入れようとしたのが問題なのか、
依存関係が不適切になってしまい断念。まぁなくてもどうにかなるでしょう。

まずは試しにMNISTのデータセットのexampleを動かしてみる。

https://github.com/keras-team/keras/blob/master/examples/mnist_mlp.py

K520 GPUだと2秒かかる学習をi7-6700HQだと10秒ほど。約5倍…。
実際にモデルを組んでみて、どうにもならなければディープラーニング用のマシンを用意したほうが良いかも。

ひとまず動くところまでは確認できたので、モデルの作り方を検討しながら、Kerasの使い方を調べてみよう。

Posted at : 2018-01-14 20:39:34 / Category : none

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

■ 2017年について

今年は家庭状況が大きく変わりました。
大変なことも多いけど、楽しいことも多く、元気にやってます。

このブログの主としている技術的なことに関していえば、
必要な時間を割くことができずアウトプットがほとんど出せませんでした。
本当に自分が楽しいと思えることをじっくりとやっていくことが大切、と
思えるようになってきたので、着実にやっていくことを心がけていこうと思います。

さて、2017年の目標に対しての到達状況を見てみましょう。

  • 世の中に貢献できる成果を2,3は出していきたい
    • アイディアはいくつか出せた。
    • ただ、アイディアを実現するための作業ができていない。時間的なものもあるけど、あれこれ考えていてうまくいっていない部分が多い。
    • 徐々にだけど考えていくうちに見えてきた部分もあるので、実現させる方向にシフトにしていきたい。
  • 英語をきっちりと喋れるようにしたい
    • 自分としては段々と成長していることが感じられている。
    • 単一の言い回しが多かったり、表現の幅が狭いのでもっと増やしていきたい。
  • 他分野の知識を習得したい
    • 経済、料理は本で学んだり実践したりできた。
    • 特に料理は面白い。外食とかすると「こんな味付けがあるんだ」とか食材の活かし方とか、あれこれ考えながら楽しめる点が良い。

トータルで見れば意外と進んでるのかなと。良かった良かった。

■ 2018年について

大きな方向としては、楽しく面白い一年にしていきたいです。
家庭と仕事とやりたいことと大変なことも多いけど、がんばっていきます。

そんな2018年の目標は以下の通りです。

  • 世の中に貢献できるアイディア
    • 昨年のアイディアから、特に実現することに重点を置いてやっていきたい。
    • アイディアから収益を得られることを目標としていきます。
  • 世界を相手に活躍できる足がかりを作っていきたい
    • 昨年の英語をうまく活かして、海外の人と交流したりつながりを持てるようにしていきたい。その上で世界を相手に活躍できるようにしたい。
    • 1年では難しいと思うのでまずは足がかりから検討していきます。
  • 研究の活動をしていきたい
    • 大学を離れてからはあまり仕事ばかりだったけど、形はどうであれ、研究につながるような活動をしていきたい。
    • 特に今朝の夢がそんな感じだったので、実現すると良いと思う。

あと、日記も全然書いていなかったので書いていこうと思います。

Posted at : 2018-01-01 11:11:07 / Category : none

2017年9月18日

  • 2.4GHz帯のwifiがおかしい
    • 以前から調子悪いなと思ってて、5GHz帯を使うことで回避してる
    • この混信の多さ、根本的にどうにかならないのかなぁ。。。
  • 古いノートPCで5GHz帯にしか対応していないものがあり、余っていた子機で対応を検討
    • が、接続先のSSIDにスペース、パスワードに記号が入っていると登録できないって言われる…。そのSSID、Time Capsuleの初期値なんですけど
    • Web上の設定画面はJSでvalidationしてるから、適当にJS書き換えてみたけど、ファーム側でもvalidatiionしてるみたい。無理やり設定は無理だった
    • 結局、Time Capsule側でゲストネットワーク作って、それを上記要件満たすように変更
Posted at : 2017-09-19 06:05:50 / Category : none

ETF-JDRの分配金の課税

以下の2つのETFで分配金に対する課税が異なることに気付いた。

  • 1362 iシェアーズ 新興国債券ETF-JDR
  • 1583 iシェアーズ フロンティア株ETF-JDR(MSCIフロンティア100)

同じiシェアーズの外国株式だから、30% * 20.315% と思ってた。
これは誤り。以下のようになる。

そもそも、上記の税率は <現地国での課税> + <国内での課税> から求められる。
30%の部分はあくまでも米国で課税をされた場合。
また、iシェアーズのETFでもファンドの籍が異なるケースがある。

米国以外の場合、<現地国での課税>がなくなり<国内での課税>のみになるケースがある。
「1362 iシェアーズ 新興国債券ETF-JDR」の場合は、上記のケースにあたり、<国内での課税>のみになる。

※「<現地国での課税>がなくなる」の理由は、二国間租税条約に基づいて、居住国でのみ課税されることと推測しています。

ちなみに、NISAの場合は、<国内での課税>も非課税になるので、結果として0%になる。

以下の資料を参考にしつつ、内容に注意をして記載をしています。
本当に困っている場合は、この記事をあてにせず専門家に相談しましょう。

Posted at : 2017-09-17 09:48:28 / Category : money

2017年9月16日

料理の四面体を読了。
料理を火、水、空気、油の4要素で考えるとこうなるんだね。
各国の料理の共通性はわかりやすい。

https://www.amazon.co.jp/dp/B073DYQNC9/

午前は立川へ。
最近、日光の眩しさが気になってきて、サングラスを探しに行った。
普段も使えて、スポーツ(自転車)でも使えるのが欲しくて、いろいろと見て回る。
一つの候補はアディダスのかなぁ。その場では購入せず。
帰ってきて、オークリーのFlak Jacketというのも気になる。問題は値段。。。

Posted at : 2017-09-17 09:04:57 / Category : none

2017年9月11日

他の人が自分の日記を見てどう評価するか?ってことばかり考え始めると、
変に肩肘張ってしまって何も書けなくなってしまっていた。

ゆるっと、あったことをそのまま書いていくのが良いのかなぁ、と
とある人の日記を見ながら思ったりして、あれこれと書いてみようかなと。

先週一週間、休みを取って実家に帰って過ごしていた。
休日の濃密感に比べると、平日があっさりと過ぎてしまうことが多く、何かもの足りない…。
気づくともうこの時間なので、さっさと寝なければ。。。

Posted at : 2017-09-11 22:38:36 / Category : none

有料ゴミ袋の色

今住んでいる市の有料ゴミ袋の色(袋自体の色のこと)が以下のようになってるんです。

  • 燃えるゴミ : 緑
  • 燃やせないゴミ : オレンジ

これ、色が逆なんじゃないかなぁと思うんですよね…。
黄色 = 燃えるを想起してしまうような気がするんだけど、そんなことないのかなぁ。。。

Posted at : 2017-01-11 22:02:21 / Category : none

elecom WRC-1167GHBK-Sを使ったVPN接続がうまくいかない

WRC-1167GHBK-Sを使って、L2TP over IPsecをすると接続に失敗する。
パケットをキャプチャしてみると、最初の通信の段階でリクエストに対する、応答が返ってきておらず、タイムアウトしているようにみえる。
試しに、L2TP over IPsecに使用している500番ポートをポートフォワーディングすることで、VPN接続できることが確認できた。

同一の環境でルータの違いだけで問題の有無が変わっているので、
L2TP over IPsecのフォワーディングがうまくできていないんじゃないかなぁ…。
elecomに直接問い合わせをしてみようとは思ったけど、
簡単なサポートを目的とした電話サポート窓口しかないみたいなので、諦めることにした。

Posted at : 2017-01-09 21:06:37 / Category : none