ROS勉強会(ラズパイマウスハッカソン)に参加しました

Pocket
LINEで送る

本日のROS勉強会はラズパイマウスを使ったハッカソンということで、参加してきました。

SLAMの動作確認のためにLinuxのGUI環境(普段はそんなもん使わない。CLIオンリー。)を仮想マシンで作らなければならなかったり、ネットワークがつながらないマシンの修理係などをやったりとちょくちょく中断しましたが、13時から18時まで、とにかくひたすらコードを書きました。書いている途中の写真がない・・・。

モニタがない状態でLANがつながらないと終わりなのでモニタ持参

成果は次の2点でした。

終わったあとは主催の皆様と人形町の肉寿司に行きました。こちらも食うのに夢中で写真がありません。

以上、勉強会帰りの人のブログ的なテイストでお送りいたしました。参加側に回るのは本当に久しぶりです。主催者の皆様ありがとうございました!

アフィリエイトで恐縮ですが、持参したモニタはこれ↓です。

寝る。

Pocket
LINEで送る

Software Designで新連載

Pocket
LINEで送る

はじまりました。

全国各地の変態腕利きのワンライナー野郎がSlackに集まって書いてます。

あとの情報は・・・ぜひ本をご購入の上、確かめていただければと。

Pocket
LINEで送る

週末報

Pocket
LINEで送る

日曜夜に週末やったことのまとめをするのが習慣化してきました。

火曜に名古屋で話をするのでスライド

スライドを作っててなんとか完成させました。ファジー学会の第1回「動きの様相から先を読む」研究会(名古屋工業大学にて)という場でお話しさせていただきます。今回は珍しく「貴様の研究について話してよかろう」と言われましたので、自分の昔の研究とか今の研究とかを遠慮なく吐き出します。

簡単な価値反復のサンプル

そろそろ後期の講義の準備に取り掛かろうということで作りました。後期に確率ロボティクスという講義を受け持ってるんですけど、ここ2年、数式を書き殴るだけだったのを反省して、Jupyter notebookベースで講義を進めようと準備しています。

某原稿と某原稿の手直し

世に出るのは8月。

その他

子供が「深海2017~最深研究でせまる“生命”と“地球”~」という特別展に行きたいというので、上野の博物館行ってきました。

こんなのもいました。深いところにいるんですね。別の生物の説明に、これより深いとタンパク質の分子自体が水圧で壊れてしまうと書いてありました。

・・・と書いていて、なんで自分、ロボット屋なのに真っ先にこれ↓を貼らないんだろう、と思って頭に「?」が・・・。URGが四つとアラウンドビューモニター用のカメラが周囲に取り付けられておりました。NISSANとシールが貼ってあってアラウンドビューの画像が映されてました。

うちの子が天井にカメラがあると思って、顔を上に向けて自分の姿を写そうとしてましたが、横についてるカメラを合成して作ってるから上向いてもダメよーと説明しました。違ってたりして。

生物には無駄なものがほとんどないなーなどと、つい見とれてしまいます。そういう意味では、やっぱりロボットを見てるより生物(人間を含む)を見てる方が、自分には幸せなようです。

寝る。

Pocket
LINEで送る

地味な研究者から見ると内容薄いのに偉そうに見える記事について原因をなんとなく

Pocket
LINEで送る

炎上する記事やなんとなく鼻につくような記事というのは、論文を書くときの禁忌を必ずどこかで犯しています。職業上、こういう文を読むと論文を添削するような感じで冷静に分析できますので、よくある例をちょっと書き出してみました。なんとなく書いていてまた書き足すかもしれませんが、まとまりがなくてすみません。

一つお断りですが、世の中の文章が全部論文になれと言ったり、論文レベルの規律を守れとかいうつもりは全くなく、自身も論文でない文章では論文の手順を踏まずに書いています。この駄文も、「炎上する記事やなんとなく鼻につくような記事」の実例を挙げてないのでよろしくありません。実例あげたら大変なことになりますが・・・と言いつつ、一つ実例あげるとこんなのですかね?ひどすぎて例になってない気がしますが。

成功体験が偶然かどうか評価されていない

メディアで記事を書く人は何かに成功した人が多いわけですが、そこに分析がなく、ただ「俺様すごいから真似してね」という内容になっているものがあります。20回くらいやって成功率を書いてほしいんですが、人生一回きりなのでそうもいかず、そうもいかないのを逆手に取って好き勝手書くのはよろしくありません。

アレオレ

企業でチームを組まずにプロジェクトを行うことなど考えられないのですが、その言及がないものも多く見られます。研究なら共著者にしたり謝辞を書いたりしますが、勢い重視で抜けてる例が散見されます。

知らんうちに恨みを買いますが、長期間、顕在化しないので怖いです。

攻撃的

「◯◯はクソ」「◯◯は無駄」の類。「xxによると、◯◯を行うとyyだけ時間が余計にかかるということが示されており、これが正しいとすると◯◯よりも▲▲が良いと考えられる。」などの引用、データ、仮定を書くと客観的になり、だれも怒らないし傷つけません。

しかし、自分は「◯◯はクソ」系の記事は大好きだったり。自分も書いて炎上したことアリ。

他人のフンドシ

人間、なんとかして人よりも優位に立ちたいものです。しかもなるべく楽して。で、「海外では〜」と、自分の手柄のように海外の事例を紹介しだしますが、それお前のやったこととちゃうやんか。

たしかに海外の良い事例を常に取り入れることは重要なのですが、真面目にやってる人は、「◯◯国におけるxxの取り組み」などというクソ堅い文章を書いて頑張っているし、商業誌でもちゃんとしたものは観察者が記述した体裁になっています。同じことを書いていてもあくまで観察者として記述すれば、鼻につく文章にはなりません。

素人がやらなくてもその任務にある人がやってますので、やらなくてよいです。

偶像崇拝

これはどっちかというと読む側のリテラシーの問題ですが、カッコつけてる人でもウンコはするし、◯◯するし、常に倫理的でいられるわけではありません。子供ならともかく、人生経験豊富な大人が他人に過度に憧れを持つのはどうなんだろうと思います。憧れの人について、動物っぽい側面を見たときに幻滅するのはまだマシです。こじらせると、そういうことから目を背ける癖がつくと正しい判断ができなくなります。その人でなく、その人のやったことを正確に把握することが大事なんじゃないかなと思います。それは、憧れの対象の人が勘違いしないようにしてあげることでもあります。

誰かがすごいことをするのは、すごいスキルがあるからだったり、運だったり、人間性とは直接リンクしませんので、その人を祝福するだけにした方がよいんでないかなーと思います。それ以上を求めると、誰も幸せにならないし、オーバーなことを言うと世の中の閉塞感の一因にもなりかねないんじゃないでしょうか。

Pocket
LINEで送る

クラスタリング強化週間

Pocket
LINEで送る

ちと研究に本格的に使うために先週から今日にかけてクラスタリングのお勉強をしてました。勉強したらアウトプットできないと理解したことにならんので、試しにEMアルゴリズムの解説を書いてみました。(リンク先はPCのブラウザで閲覧ください。)

しかし、今は機械学習の教科書に書いてあって、ライブラリも用意されてて、若い人は効率よく当然のごとく勉強するものでも、自分の場合は抜けてることが多いので、なかなか追っかけるのが大変だなあと思う今日この頃デス。

去年、ノンパラメトリックベイズのクラスタリングのコードを試しに書いてみたことがあったけど、なんか怪しいのでもう一度手を入れるのと、変分ベイズの例を一つ作ってみるのが月末までの目標。お勉強つらい。

もちろん研究にはなるべく既存のライブラリ使うつもりです。ただ、計算資源が大きく制限されるロボットの場合、自分でC++で速いコードを書かねばならん場合が多いので油断なりません。自分はこれができるから不勉強なのに研究者できてるとも言えますが・・・。

今週末はこの勉強と、あとは某雑誌の原稿を書いてました。早く何書いたか公表したいけどもうちょい我慢。

なんとなく我の強い文章になってしまったので、拡散せずにひっそりと書き記しておきます。

サンプルから元の分布を推定。びっくりするほど推定できる。

寝る。

Pocket
LINEで送る

第2回 ラズパイマウスで京急VVVF音(ドレミファインバータ)

Pocket
LINEで送る

以前、ラズパイマウスのブザーで京急し、それを日経Linuxに掲載する暴挙を成し遂げたことがあったのですが、今度はステップモータの音で京急することにしました。

注意: 「京急する」はサ行変格活用の動詞で、意味は京急に励むことです。

次のビデオが結果です。音と速度が比例して加速していますが、わずかなのでわかりづらいかもしれません。

ビデオのとおり、完璧とはいかないまでも、おおかた京急でした。おそらく、ホームに赤い電車でなく、ラズパイマウスが到着しても誰も違いに気づかないのではないでしょうか。

コードはこのような殴り書きですので、後日京急する暇があったら京急して整理します。

寝る。

Pocket
LINEで送る

CPUの個数でcatkin_makeが通ったり通らなかったり

Pocket
LINEで送る

表題の通り少しハマりました。ROSについては本を書いたものの、基礎的な内容+Pythonなので、C++のコードのビルドについてはほとんど勉強しておらず、良く分かってないのが良くわかりました。同じようにハマる人がこの記事を見つけてくれたらと。また、この症状の回避方法について良く知られているのならば教えていただければと。

症状

  • 1. .msgファイルと、それを使うC++のコードを含むパッケージのcatkin_makeが、.msgファイルの処理の前にノードのコードのコンパイルを始めて一度コケるが、2度目で通る。

これはたぶん回避方法があるはずでちゃんと調べろという話ですが、面白いのは続きです。

  • 2. Travis CIだと2回catkin_makeしても通らない。

これで「???」になりました。ちなみに1については、自分のデスクトップ機でもラズパイでも2回で通ります。

ちなみにエラーはこんな感じです。Buttons.hとLeds.hが、.msgファイルから作られるヘッダファイルで、これがないとC++のコードのところでヘッダファイルが無いと叱られます。

原因

自分のPCやラズパイでは1回目のcatkin_makeはエラーを出すものの.msgの処理を完了できて、一方Travis CIの場合は完了できないということは、非同期処理のズレだろうというのがまず思いつきました。そして、Travis CIのエラーに

Invoking "make -j2 -l2" failed

とあったので、たぶんズレはコア数の違いで起こるんだろうと思いました。(makeのjオプションは、何並列で処理をするかを指定するオプションです。)

ということで、手元で

$ catkin_make -j2 

を繰り返したら、何回catkin_makeしても失敗するという、Travis CIで起きたのと同じ現象が起こりました。ちなみにPCのCPUのコア数は8、ラズパイでも4だったので、Travis CIの方が少ないということになります。

解決(超小手先)

ということで、Travis CIでcatkin_makeするシェルスクリプトの行を

catkin_make -j8 || catkin_make -j8 #CPU2個だけど8並列頑張ってね。しかも1回目コケたらもう一回やってね。

というように変更したらテストにパスしました。

お断りしておきますが、小手先です。何かすればコンパイルの順番を制御できるはずなのですが・・・。

完全解決

・・・と書いたら教えていただきました。

(もっと短い書き方がありそうですが)とりあえずベタにCMakeLists.txtに以下のように書いたら一回のcatkin_make(オプションなし)で通りました。

add_dependencies(leds ${TARGET_NAME} ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(buttons ${TARGET_NAME} ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(lightsensors ${TARGET_NAME} ${PROJECT_NAME}_generate_messages_cpp)

ありがとうございました!!!

Pocket
LINEで送る

第29回シェル芸勉強会まとめ

Pocket
LINEで送る

今回も共催の日本UNIXユーザ会様、会場提供のさくらインターネット様、参加者の皆様のご協力のもと、シェル芸勉強会を開催しました。

今回の問題は、ここ数回では難易度が下がったようで、会場では安堵の声、体力を奪われなかったという声が聞かれました(どんな会なんだ・・・)。

以下、単にリンクの貼り付け集ですが、当日の様子が分かるまとめです。

Twitterまとめ

録画

あと、大阪のLTの録画がありますが、それは大阪のレポートから辿っていただければと。

サテライト会場の様子

大阪、福岡で開いていただきました。ありがとうございました。

福岡

大阪

LTなどのスライドやブログ

大阪のLTは(やばすぎるので、ということではないですが)大阪からのレポートにお任せします。

ブログなどなど、書いたら教えてくださーい。

Pocket
LINEで送る

【問題と解答】第29回激しいシェル芸勉強会

Pocket
LINEで送る

問題のみのページはこちら

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.29

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

解答例はUbuntu Linux 16.04 で作成。Macの場合はcoreutilsをインストールの上、gsedをつかいましょう。BSD系の人は玄人なので各自対応のこと。

イントロ

Q1

次の2つのファイルは、講義で出した課題1,2それぞれの点数です。

$ cat kadai1
001 山田 20
002 出川 30
005 鳥海 44
$ cat kadai2 
001 山田 20
003 上田 15
004 今泉 22
005 鳥海 44

両方に名前のある人については点数を合計して、次のように全員の得点リストを作ってください。

001 山田 40
002 出川 30
003 上田 15
004 今泉 22
005 鳥海 88

解答

$ join -a 1 -a 2 -1 1 -2 1 kadai{1,2} | awk '{print $1,$2,$3+$5}'
001 山田 40
002 出川 30
003 上田 15
004 今泉 22
005 鳥海 88

Q2

次の2つのファイルは、5回の講義の出欠と6回目の講義で出席した人の番号のデータです。attendに6回目の講義の出欠を反映したデータを標準出力に出力してください。

$ cat attend
001 山田 出出欠出出
002 出川 出出欠欠欠
003 上田 出出出出出
004 今泉 出出出出出
005 鳥海 欠出欠出欠
$ cat attend6
001,005,003

解答

$ tr , '\n' < attend6 | sort | sed 's/$/ 出/' |
 join -a 1 attend - |
 awk 'NF==3{print $0"欠"}NF==4{print $1,$2,$3$4}'

Q3

次の2つのファイルは5回の講義の出欠とテストの成績を記録したファイルです。

###$1: 番号, $2: 名前, $3: 出欠 ###
$ cat attend 
001 山田 出出欠出出 
002 出川 出出欠欠欠
003 上田 出出出出出
004 今泉 出出出出出
005 鳥海 欠出欠出欠
###$1: 番号, $2: テストの点数(受けてない人のデータは無い)###
$ cat test 
001 90
002 78
004 80
005 93

こういうルールで、最終的な点数を出して、番号、名前、点数を記録したファイル作ってください。

  • 出席が過半数に満たない人、テストを受けていない人は0点
  • 出席が過半数の人はテストの点数を採用

解答

$ join -a 1 -o 1.1 1.2 1.3 2.2 -e 0 attend test |
 awk '/(.*欠){3}/{$4=0}{print}'
001 山田 出出欠出出 90
002 出川 出出欠欠欠 0
003 上田 出出出出出 0
004 今泉 出出出出出 80
005 鳥海 欠出欠出欠 0

Q4

Q4.1

次の出力をパイプで受けて

$ echo -1 4 5 2 42 421 44 311 -9 -11

次のように同じ桁のものを横並びに出力を得てください。横に並べる時の順番は任意とします。また、この出力のように正の数と負の数を分けます。

-11 
-9 -1 
2 4 5 
42 44 
311 421 

Q4.2

次の出力をパイプで受けて

$ echo -1 +4 5 2 42 421 44 311 -9 -11

次のように同じ桁のものを横並びに出力を得てください。Q1.1と同じく横に並べる時の順番は任意とします。

-11 
-9 -1 
2 +4 5 
42 44 
311 421 

解答

Q4.1

$ echo -1 4 5 2 42 421 44 311 -9 -11 | xargs -n 1 | sort -n |
 awk 'length(a) != length($1){print ""}{printf("%d ",$1);a=$1}' |
 awk 'NF'
-11 
-9 -1 
2 4 5 
42 44 
311 421 

Q4.2

awk内で1をかけると+符号が外れるので、符号を外して桁数を比較すると先ほどの解答例が転用できます。

$ echo -1 +4 5 2 42 421 44 311 -9 -11 | xargs -n 1 | sort -n |
 awk 'length(a*1) != length($1*1){print ""}{printf("%s ",$1);a=$1}' |
 awk 'NF'
-11 
-9 -1 
+4 2 5 
42 44 
311 421 

Q5

次のファイルの中身について、

$ cat triangle 
   1
  3 9
 7 a 6
8 4 2 5

次のように右に転がしてください。できる人はawkを使わないでやってみましょう。

   8   
  4 7  
 2 a 3 
5 6 9 1

解答

四角にして回すと楽です。

$ cat triangle | sed 's/ /0 /g' | sed 's/\([^ ]\)0/\1/g' |
 tac | rs -T | tr -d 0 | sed 's/  / /g' | sed '1s/^/   /' |
 sed '2s/^/  /'  | sed '3s/^/ /'
   8   
  4 7  
 2 a 3 
5 6 9 1

Q6

次の1から100までの素数を書いたファイル(いくつか欠番が存在)について、

$ cat prime 
2 3 5 7 11 13 17 19 31 37 41 43 47 53 59 67 71 73 79 83 89 97

次のように欠番のところで折り返してください。(ワンライナーの中に欠番を直接書かないでくださいね。)

2 3 5 7 11 13 17 19 
31 37 41 43 47 53 59 
67 71 73 79 83 89 97

解答

$ cat prime | xargs -n 1 | cat - <(seq 1 100 | factor |
 awk 'NF==2{print $2}') | sort -n | xargs |
 awk '{for(i=1;i<NF;i+=2){if($i==$(i+1)){printf("%d ",$i)}else{print "";i-=1}}}' |
 awk 'NF'
2 3 5 7 11 13 17 19 
31 37 41 43 47 53 59 
67 71 73 79 83 89 97 

Q7

リポジトリ内のnyaan.htmlは、ブラウザで見ると次のように見えます。

次のようにcatから始めて、この文字を(大きなまま)端末上に表示してみてください。

$ cat ./nyaan.html | ...

できる人は小さい通常の文字で「にゃーん」と出してみてください(これは解答例を考えていません)。

解答

$ cat ./nyaan.html | nkf --numchar-input |
 sed 's/<[^<]*>//g' | sed 's/&quot;/"/g'

Q8

次のshellgeiファイルについて、

$ cat shellgei 
                                            m                         
   ""m                        m  "m          #    # #           #     
  mm                           #  #          #mmm"""          m"      
    "    m"      mmm""         #  #   #     m"   #        mm""m       
       m"          #mm        m"  # m"     "    #             #       
  "mm""         """"  "      m"   #"          m"              #       
                                                                      
                   

次のように、文字の無い列を詰めてください。

                          m               
 ""m             m "m      #    # #      #
mm                # #      #mmm"""     m" 
  "    m" mmm""   # #   # m"   #   mm""m  
     m"     #mm  m" # m" "    #        #  
"mm""    """"  "m"  #"      m"         #                                     

解答

$ cat shellgei | sed 's/ /@/g' | sed 's/./& /g' |
 awk '{for(i=1;i<=NF;i++){if($i!="@")a[i]=$i}}END{for(i=1;i<=NF;i++){b=a[i]==""?"x":" ";printf b}}END{print ""}' |
 cat - shellgei |
 awk 'NR==1{a=$0}{for(i=1;i<=length($0);i++){if(substr(a,i,1)!="x")printf substr($0,i,1)};print ""}'
                                          
                          m               
 ""m             m "m      #    # #      #
mm                # #      #mmm"""     m" 
  "    m" mmm""   # #   # m"   #   mm""m  
     m"     #mm  m" # m" "    #        #  
"mm""    """"  "m"  #"      m"         #  
                                          
                      

もっと良い解答。

Pocket
LINEで送る

【問題のみ】第29回激しいシェル芸勉強会

Pocket
LINEで送る

解答のページはこちら

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.29

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

解答例はUbuntu Linux 16.04 で作成。Macの場合はcoreutilsをインストールしてつかいましょう。BSD系の人は玄人なので各自対応のこと。

イントロ

Q1

次の2つのファイルは、講義で出した課題1,2それぞれの点数です。

$ cat kadai1
001 山田 20
002 出川 30
005 鳥海 44
$ cat kadai2 
001 山田 20
003 上田 15
004 今泉 22
005 鳥海 44

両方に名前のある人については点数を合計して、次のように全員の得点リストを作ってください。

001 山田 40
002 出川 30
003 上田 15
004 今泉 22
005 鳥海 88

Q2

次の2つのファイルは、5回の講義の出欠と6回目の講義で出席した人の番号のデータです。attendに6回目の講義の出欠を反映したデータを標準出力に出力してください。

$ cat attend
001 山田 出出欠出出
002 出川 出出欠欠欠
003 上田 出出出出出
004 今泉 出出出出出
005 鳥海 欠出欠出欠
$ cat attend6
001,005,003

Q3

次の2つのファイルは5回の講義の出欠とテストの成績を記録したファイルです。

###$1: 番号, $2: 名前, $3: 出欠 ###
$ cat attend 
001 山田 出出欠出出 
002 出川 出出欠欠欠
003 上田 出出出出出
004 今泉 出出出出出
005 鳥海 欠出欠出欠
###$1: 番号, $2: テストの点数(受けてない人のデータは無い)###
$ cat test 
001 90
002 78
004 80
005 93

こういうルールで、最終的な点数を出して、番号、名前、点数を記録したファイル作ってください。

  • 出席が過半数に満たない人、テストを受けていない人は0点
  • 出席が過半数の人はテストの点数を採用

Q4

Q4.1

次の出力をパイプで受けて

$ echo -1 4 5 2 42 421 44 311 -9 -11

次のように同じ桁のものを横並びに出力を得てください。横に並べる時の順番は任意とします。また、この出力のように正の数と負の数を分けます。

-11 
-9 -1 
2 4 5 
42 44 
311 421 

Q4.2

次の出力をパイプで受けて

$ echo -1 +4 5 2 42 421 44 311 -9 -11

次のように同じ桁のものを横並びに出力を得てください。Q1.1と同じく横に並べる時の順番は任意とします。

-11 
-9 -1 
2 +4 5 
42 44 
311 421 

Q5

次のファイルの中身について、

$ cat triangle 
   1
  3 9
 7 a 6
8 4 2 5

次のように右に転がしてください。できる人はawkを使わないでやってみましょう。

   8   
  4 7  
 2 a 3 
5 6 9 1

Q6

次の1から100までの素数を書いたファイル(いくつか欠番が存在)について、

$ cat prime 
2 3 5 7 11 13 17 19 31 37 41 43 47 53 59 67 71 73 79 83 89 97

次のように欠番のところで折り返してください。(ワンライナーの中に欠番を直接書かないでくださいね。)

2 3 5 7 11 13 17 19 
31 37 41 43 47 53 59 
67 71 73 79 83 89 97

Q7

リポジトリ内のnyaan.htmlは、ブラウザで見ると次のように見えます。

次のようにcatから始めて、この文字を(大きなまま)端末上に表示してみてください。

$ cat ./nyaan.html | ...

できる人は小さい通常の文字で「にゃーん」と出してみてください(これは解答例を考えていません)。

Q8

次のshellgeiファイルについて、

$ cat shellgei 
                                            m                         
   ""m                        m  "m          #    # #           #     
  mm                           #  #          #mmm"""          m"      
    "    m"      mmm""         #  #   #     m"   #        mm""m       
       m"          #mm        m"  # m"     "    #             #       
  "mm""         """"  "      m"   #"          m"              #       
                                                                      
                   

次のように、文字の無い列を詰めてください。

                          m               
 ""m             m "m      #    # #      #
mm                # #      #mmm"""     m" 
  "    m" mmm""   # #   # m"   #   mm""m  
     m"     #mm  m" # m" "    #        #  
"mm""    """"  "m"  #"      m"         #                                     
Pocket
LINEで送る