寿司デバイス

Pocket
LINEで送る

昨日のコレが、講義で使うにはあまりにもアレだったので、ちょっとマイルドな「寿司デバイス」も作りました。

スクリーンショット 2016-01-02 10.51.06

リポジトリはココ

昨日のコレと組み合わせると、危険なワンライナーと寿司とビールが飛び交う世界がお楽しみいただけます。

スクリーンショット 2016-01-02 11.36.43

Enjoy 寿司.

Pocket
LINEで送る

30億のデバイスで走るとやばい危険シェル芸デバイス作った

Pocket
LINEで送る

年が明けました。昨年は

という騒ぎがありましたが、今年はシェル芸ポリスとして、荒ぶるシェル芸人を取り締まるふりをする所存です。出動!ミニスカポリス。

違います。

本題

今日は年明けの講義のためにデバイスドライバの例を書いておりました。ただ、今日は元日です。酒を飲みながら書いていたので、なんでこうなったかよくわからんのですが、気がついたら危険シェル芸のコマンドを吐く擬似デバイスができていました。

READMEを読んでも良く分からないと思いますので、解説を。

擬似デバイスとは

/dev/nullとか/dev/urandomとか、裏側に機械がくっついてないのに機械とのインタフェースの役割をするもののことです。/dev/nullとかのことは「デバイスファイル」と呼びます。「擬似デバイス」というのは「デバイスファイルを入出力口にして働く仮想の機械」というニュアンスの言葉です。

UNIX屋さんなら何か調査するときに、デバイスファイルを次のように使ったりします。

###コマンドの性能を測る(画面に文字を出して遅くならないように/dev/nullを使う)###
$ time grep -r hoge ~/ > /dev/null
###128バイトの大きさのファイルを作る###
uedamb:~ ueda$ head -c 128 /dev/urandom > a
uedamb:~ ueda$ ls -l a
-rw-r--r-- 1 ueda staff 128  1  1 22:32 a

要はデータを吸い込んだり、生成したりする特別なファイルということになります。なぜコマンドやデーモンによるサービスの体裁を取らないかというと、ファイルの方がcatやリダイレクトで簡単に使えるからです。データハンドリングはファイルシステムで、というのはUNIXがUNIXであるための大前提のようなものです。日経Linuxの去年の連載では、「ロボットでも基本はファイル入出力で」というテーマで執筆したのですが、それもこういうUNIXの考え方を意識したものでした。

どうやって作るのか

デバイスファイルの裏側にはデバイスドライバがいます。デバイスドライバをしかるべき方法でコーディングすれば、擬似デバイスを作ることができます。字を受けたときにどんな反応をするかをデバイスドライバ内に書けば、機械の代わりにそのコードが仕事をしてくれるわけです。本物の機械のためのデバイスドライバを書くときは(と言っても私は経験がほとんどありませんが)、デバイスドライバ内で機械のレジスタをいじることになります。

デバイスドライバはカーネルの一部として動くので、デバイスドライバのコードはカーネルを書くように書かねばなりません。printfとかmallocが使えなかったり、いろいろ面倒なので、その分敷居は少し高くなります。

あんまり詳しくは書けないのですが、コードをざっと見ていただければと。

使い方

今のところ、Ubuntu Linux 14.04でしか動作確認してません。今日作り始めたので当たり前ですが・・・。ということで、以下の操作をUnbuntuか、もし試していただけるなら別のLinux環境で行います。apt-getでgitとかmakeとかをインストールする必要があります。また、Linuxのヘッダファイルがないとコンパイルできないので、もしかしたらそれもapt-getする必要があるかもしれません。私はサーバ版でコンパイルしましたが、ヘッダはすでにあったのでapt-getする必要はありませんでした。

$ git clone https://github.com/ryuichiueda/KikenShellGeiDevice.git
$ cd KikenShellGeiDevice/
$ make

次のように「kiken.ko」というファイルができていたらOK。

$ ls kiken.ko
kiken.ko

デバイスドライバは、insmodというコマンドでカーネルに組み込みます。

$ sudo insmod kiken.ko
###カーネルから外したかったら以下のように###
$ sudo rmmod kiken 

次のように、「/dev/kiken0」というファイルができているはずです。

$ ls -l /dev/kiken0 
crw------- 1 root root 249, 0  1月  1 23:03 /dev/kiken0
###読み込みできるようにしておきましょう###
$ sudo chmod +r /dev/kiken0 

使う(危険)

なんだか薄くて真面目な解説になっちまってましたがここからが本番です。headで打ち切ってますが、アレなワンライナーがランダムに出続けます。ネタはココから。

$ cat /dev/kiken0 | head
sudo yum -y remove python*
sudo yum -y remove python*
echo '部長はヅラ' >> /etc/motd
echo ログ集計乙wwwww>> /var/log/httpd/access_log
rsync -av --delete /tmp/ ~/
yes | xargs -P 0 yes
for x in `seq 1 1 10000`; do wall '我はroot。神だ' ; done
crontab -r
echo {a..z}{a..z}{a..z}{a..z}{a..z}{a..z}{a..z}{a..z}{a..z}{a..z}{a..z}{a..z}{a..z}
rsync -av --delete /tmp/ ~/

危険極まりない。本当に何を考えているんだ。

パイプと相性抜群

とりあえず、自分のマシンを壊していいのなら、次のような使い方が標準になると思います。何の標準か知らんけど。

$ cat /dev/kiken0 | sudo bash

試さない方が良いです。何の責任も取れないことはGPLのライセンスの中に書いてあリ・・・。

安全に試す方法

かと言って何も試さないのも面白くないので、次のワンライナーを提示しておきます。grepにつけた-aは、grepがバイナリとして危険シェル芸を扱ってしまうので、文字列として扱ってくれと明示的に指示するためのオプションです。

$ cat /dev/kiken0 | grep -a 高須 | bash 

今後

オプションを充実させたり、標準入力から読み込んだ文字を関数の名前にしてfork爆弾を返す機能を実装する・・・っていうか講義の準備します。

本当に冗談です。

寝る。

20160102追記: テスト用VPSサーバにインストール。いい感じだ。

スクリーンショット 2016-01-02 10.05.42

20160102追記: Raspberry Pi 2用のMakefileを追加。

Pocket
LINEで送る

ダイナミックDNSを使わずにシェル芸等々で自宅のサーバへアクセスするシステム作った

Pocket
LINEで送る

(追記: 早速「VPSに向かってトンネル掘っとけよ!とUSP友の会で尻を突かれております。トンネル掘られそうです。」。あと、cronの頻度が高いと先方のサービスに蹴られる可能性があるのと、かと言って頻度を下げるとケーブルテレビ系だとちと辛いという話になってます。NTT, AUはIPがほとんど変わらないというのが経験上、言えることですが、保証はないです。)

久しぶりにサーバいじりネタ。本当は今週学会1つと講義2つの準備があって、講義の準備が1つ済んでいないが、子供がギャーギャー言っている環境だと趣味ぐらいしか手が動かないので・・・

やりたいこと

自宅に外からアクセスできるGitサーバ、ファイルサーバが欲しい。個人情報は置かない。自宅には光回線。IPアドレスが変わるがダイナミックDNSを使うほどでもない。

自作自宅(と言っても仕事用)サーバ

(笑)

ファイル 2015-12-13 20 35 51

ショートが怖いのでラズパイのケースは発注しました・・・。リビングの電話台という、排熱できない環境に置くので耐久テストも兼ねてます。昔は同じ場所にThinkPad x41を置いてCentOSをインストールしてNASにしていましたが、夏場に40度にもなる環境で何年もトラブルなく動いていました。恐るべし昔のThinkPad。

最低限のセキュリティー

もちろん、デフォルトのラズパイはユーザpiとパスワードraspberryという公然のお約束があるので、セキュリティーユルユルです。

とりあえず自分がやった作業を書いておくと、まず次のように自分のアカウントを作り、piユーザを消しました。

$ sudo useradd ueda
###/etc/gropuのpiユーザを全部uedaに置換###
$ sudo userdel pi
$ sudo reboot

そして、鍵を仕込んだらパスワードで入れないようにしておきました。今回のネタは鍵認証を使いこなせない人はちと難しいので先にそちらをお勉強願います。

$ vi /etc/ssh/sshd_config 
###以下のように変更###
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no
###説明が面倒くさいのでreboot###
$ sudo reboot

で、ルータのグローバルIPとポート番号をラズパイのローカルIPとポート番号と結びつけて転送できるようにします。これは・・・ルータ依存なので説明しませんが、難しいですよね・・・。

設定ができたらルータのグローバルIPを調べて、外からラズパイに向かってsshできるか試しました。

グローバルIPを調べて某所に転送するスクリプトを書いてcronに登録

で、DDNSが使えないのでこれからどうするかというところですが、とりあえずラズパイから一定時間間隔でグローバルIPを別のインターネット上のサーバ(自分のVPS)に飛ばします。

ルータの持っているグローバルIPをどう調べるかわからなかったので、グーグルで調べたらすっきりしたQiitaのエントリーが見つかったので、その通りにしました。

ueda@raspberrypi ~ $ curl inet-ip.info
203.0.113.1

おお。

ということで、次のようなシェルスクリプトを書きました。必須の行は最終行だけで、curlでIPアドレスを調べ、test.example.comに飛ばし、test.example.com側の/tmp/homeipに保存するというワンライナーです。シェルスクリプトですが、シェル芸っぽいです。宣伝ですが、こういう小技がたくさん書いてあるシェルプログラミング実用テクニック (Software Design plus)(アフィ)もよろしくお願いいたします(最近、宣伝が少なくて出版社に報いてないので宣伝)。

ueda@raspberrypi ~ $ cat ~/SYS/SENDIP 
#!/bin/bash -vx

exec 2> /tmp/SENDIP.log

curl inet-ip.info | ssh test.example.com 'cat - > /tmp/homeip'

で、これをcrontabにしかけます。

ueda@raspberrypi ~ $ crontab -e
###以下のように1行書く###
*/10 * * * * /home/ueda/SYS/SENDIP

で、test.example.comに入って、10分後に更新されているか確認します。

ueda@test:~$ cat /tmp/homeip 
203.0.113.1

更新されていなかったら、ラズパイの/tmp/SENDIP.logにログが残っているので、バグがないか確認します。当然、鍵は通してある必要があり、また、(回避の方法を知らなければ)1度だけ最初に手でログインしておく必要があります。

自分のPCの設定

(追記: Windowsガン無視すいません・・・)
まず、.ssh/configに次のように書いておきます。IPアドレスはダミーです。

Host home
    HostName 127.0.0.1

で、次のようなシェルスクリプトを書きます。sshでtext.example.comにある/tmp/homeipのIPアドレスを読み込んで、sedで.ssh/configを上書きするという乱暴なものです。

uedamb:~ ueda$ cat ~/SYS/HOMEIP 
#!/bin/bash -xv

IP=$(ssh test.example.com 'cat /tmp/homeip')

sed -i.bak "/Host home/,/HostName/s/    HostName.*/    HostName $IP/" ~/.ssh/config

なかなか一発でバグなくsedの文を書くのは大変ですが、うまくいったら、.ssh/configが次のように書き換わります。

Host home
    HostName 203.0.113.1

このシェルスクリプトもcronに仕掛けても良いですが、多分そんなにIPアドレスは変わらないので手動で良いでしょう。

これで自宅にssh接続できるはずです。この作業は自宅でやったので、iPhoneのテザリングに変えてやってみました。

uedamb:~ ueda$ ssh home

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Dec 13 12:07:41 2015 from 192.168.0.2
ueda@raspberrypi ~ $ 

できました。

終わりに

サーバをセットしてから通信できるまで1時間くらいですが、手順を書くと結構いろんな小技が必要かなと思いました。別にwebサーバを立てているわけでもないのにDDNSを使っている人は、腕試しに試していただければと。

あと、ハマる点は、外づけHDDの電源がつくタイミングとラズパイが立ち上がるタイミングによってはマウントで止まってしまうので、fstabに情報を書くのはちと危険かもしれません。

とりあえずうまくいってよかった。寝る。

Pocket
LINEで送る

考えたくない人向けWiringPi2導入手順(Raspberry Pi2 Model B, 2015年11月6日現在)

Pocket
LINEで送る

少しずつ情報が古くて一発で行かなかったので。gpioコマンドを使いたくても、Pythonもろともインストールしてしまった方が手っ取り早いようです。

しかしこの情報も、そのうち古くなるのでしょう・・・

2015年11月6日現在です。

$ sudo apt-get install python-dev python-setuptools
$ git clone https://github.com/Gadgetoid/WiringPi2-Python.git
$ cd WiringPi2-Python/
$ sudo python setup.py install
$ cd WiringPi/
$ ./build 

GitHubにもおきました。

一応、連載の関係もあるので、しばらくは不具合の対応をいたします。

Pocket
LINEで送る

【問題】第18回ニンニク入れますかシェル芸勉強会

Pocket
LINEで送る

解答はこちら: https://blog.ueda.asia/?p=6836
過去問はこちら: https://blog.ueda.asia/?page_id=684

オープニングスライド(悪い冗談)

問題で使うファイル等

今回からGitHubに置くようにしました。ファイルは

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

にあります。

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

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

環境

今回はLinuxで解答例を作りましたので、BSD系、Macな方は以下の表をご参考に・・・。

Mac,BSD系 Linux
gdate date
gsed sed
tail -r tac
gtr tr
gfold fold

Q1

次のファイルは1列目がキー、2列目が値ですが、「オトン」と「オカン」の両方の値があるキーを探してください。

$ cat text 
001 オトン
001 オトン
001 アカン
002 オカン
003 オトン
003 ヤカン
003 オカン
004 オカン
005 オトン
005 ミカン
005 アカン

Q2

次の2つのファイルについて、aだけにあるレコード、bだけにあるレコード、両方にあるレコードを分類して、

$ cat a 
谷保
鹿島田
分倍河原
川崎
$ cat b
分倍河原
谷保
登戸
南多摩

次のような出力を作ってください。

a 鹿島田
a 川崎
b 登戸
b 南多摩
c 谷保
c 分倍河原

Q3

次の3つのファイルについて、それぞれ書いてある数字の合計値を求めましょう。

$ cat a
1 2
3 4 5
$ cat b
1 2 3

$ cat c
7
8
9

Q4

次のデータについて、

$ cat cross
_abcdef
a_x____
b______
c______
d______
e______
f___x__

次のような出力を作ってください。

a-b
f-d

つまり、xのついている場所の縦軸と横軸の記号を出力するワンライナーを考えてください。

Q5

次のテキストから空白行の重複だけ除去してください。つまり、2行以上の空白行を1行にまとめてください。

あ
あ




い
い

う

え



お お
お
お

Q6

チェスボードの画像ファイルを作ってください。ウェブサイトから画像をパクるのは最近いろいろ問題となっているのでやめましょう。以下は例です。解像度は任意で構いません。

chess

Q7

次のファイルには1組だけ同じ文字が含まれていますが、何行目と何行目にあるでしょうか?

$ cat chinese_characters 
㔀㔁㔂㔃㔄㔅㔆㔇㔈㔉㔊㔋㔌㔍㔎㔏
㔐㔑㔒㔓㔔㔕㔖㔗㔘㔙㔚㔛㔜㔝㔞㔟
㔠㔡㔢㔣㔤㔥㔦㔧㔨㔩㔪㔫㔬㔭㔮㔯
㔰㔱㔲㔳㔴㔵㔶㔷㔸㔹㔺㔻㔼㔽㔾㔿
㕀㕁㕂㕃㕄㕅㕆㕇㕈㕉㕊㕋㕌㕍㕎㕏
㕐㕑㕒㕓㕔㕕㕖㕗㕘㕙㕚㕛㕜㕝㕞㕟
㕠㕡㕢㕣㕤㕥㕦㕧㕨㕩㕪㕫㕬㕭㕮㕯
㕰㕱㕲㕳㕴㕵㕶㕷㕸㕹㕺㕻㕼㕽㕾㕿
㖀㖁㖂㖃㖄㖅㖆㖇㖈㖉㖊㖋㖌㖍㖎㖏
㖐㖑㖒㖓㖔㖕㖖㖗㖘㖙㖚㖛㖜㖝㖞㖟
㖠㖡㖢㖣㖤㖥㖦㖧㖨㖩㖪㖫㖬㖭㖮㖯
㖰㖱㖲㖳㖴㖵㖶㖷㖸㖹㖺㖻㖼㖽㖾㖿
㗀㗁㗂㗃㗄㗅㗆㗇㗈㗉㕐㗊㗋㗌㗍㗎
㗐㗑㗒㗓㗔㗕㗖㗗㗘㗙㗚㗛㗜㗝㗞㗟
㗠㗡㗢㗣㗤㗥㗦㗧㗨㗩㗪㗫㗬㗭㗮㗯
㗰㗱㗲㗳㗴㗵㗶㗷㗸㗹㗺㗻㗼㗽㗾㗿

Q8

次のファイルの中に、複数回登場する数字の並びがいくつかありますが、その中で最長のものはどれでしょうか?例えば「23」という数字の並びは4つありますが、それより長い数字の列で、2回以上登場するものが存在します。

$ cat number 
8264611130023148519839960536022802096895154738213681101003238003191122723922378922942503388843815799
Pocket
LINEで送る

Raspberry Pi MouseをC++で動かすとどうなるか(けっこう楽だった)

Pocket
LINEで送る

誰か(たぶんNさん)に書けと言われたような気がするので・・・

日経Linuxで連載中の「Raspberry Piで始めるかんたんロボット製作」では、シェルスクリプトでロボットを動かしています。

まだ連載はモータを動かしたりブザーを鳴らしたりと要素の動作確認の段階ですが、8月発売の号(9月号)からロボットが走ります。こんなふうに・・・地味に・・・

シェルスクリプトで作るのは個人的な特性もありますが、ちゃんとした理由もあります。こんな感じです。

  • 行数が短くて説明しやすいこと
  • プロセスを複数使うことが簡単なこと
  • 良かれ悪かれ誰でもUNIX系のOSをイジる場合、シェルスクリプトを使わなければならないので変にシャレオツな言語を使うよりは無駄にならないこと

といったところです。

また、ロボットは私が無理言ってデバイスファイルで動かすことにしたので、字を読み書きするにはリダイレクトだけで済むようにしました。これもシェルスクリプトだと簡単です。普通の言語だとファイル開いたり閉じたり面倒です。

と言いつつC++

連載はそんな感じでシェルスクリプトでやってますが、限界もあります。

Raspberry Pi Mouseをちょっと本職に使ってみようということで、今度のICRAという学会(ロボット屋にとって一番重要な学会)の実験をやってみました。選んだのはシェルスクリプトでなくC++です。シェルスクリプトを使わない理由で一番大きいのは

  • ロボットの内部状態を表現できない

ことです。複雑なタスクをするロボットのプログラムを書くときは、ロボットが何を考えているかを変数で表現し、その値をコロコロ変えるという方法をとるのが一般的です。しかし、シェルスクリプトを使うとシェルの変数(機能が貧弱極まりない)に書くか、遅いファイル(Raspberry Piの場合はキャッシュがそんなに効かないしファイルはフラッシュメモリ上に書かないといけないので特に遅い)に書くかしないといけないのでちょっと苦しくなります。内部状態を保持してHTTPサーバのようにレスポンスしてくれるサーバのようなコマンドがあればシェルスクリプトから呼び出して使えて便利ですが、わざわざそんなもん作りたくありません。

こうなるとシェルスクリプトで書く旨味は全くないので、何か自分の知っている別の言語を使うことになります。内部状態を表現するということでオブジェクト指向言語を使うということになりますが、遅い言語だと実験がモッサリしたり、計算時間を論文に書く時にえらく損をするので、C++を選びました。

・・・と、いかにも熟慮したかのように書きましたが、ほぼノータイムでC++で、他はありません。こういうときにPython選んで「遅い遅い」言っている研究者が結構いるので、ちゃんと勉強しようよ思いつつ、人のことなので黙っております。

fstreamを使うとそんなに面倒でない

で、上で説明した「普通の言語を使うとファイルに書き込むのが面倒」ですが、C++にはfstreamという強力で素敵なサムシングがあります。例えば、以下は実験用のソース(まだまだ非公開。もちろん自分で書いた。)から、ステップモータにデバイスファイルを通じて周波数を指定するメソッドを抜粋したものです。

void Mouse::putMotorHz(int lvalue,int rvalue)
{
        ofstream r_motor("/dev/rtmotor_raw_r0");
        ofstream l_motor("/dev/rtmotor_raw_l0");
        r_motor << rvalue;
        l_motor << lvalue;
        r_motor.close();
        l_motor.close();
}

ファイル開けて値を書いて閉じるというのはやはりシェルでリダイレクトするより手間ですが、int型の数字をそのまま文字列に変換して「<<」でぶち込んでくれます。(上のメソッド、本当は値のチェックをしないといけないのですがね・・・)

今度は読み込みの例です。距離センサ(値をスペース区切りで4個出力)を読んでいます。これもデバイスファイル(/dev/rtlightsensor0)から読み出した値をintの配列sv(実は厳密にはvector<int>)に直接代入しています。

ifstream ifs("/dev/rtlightsensor0");
if(ifs.bad()){
        ifs.close();
        continue;
}

ifs >> sv[0] >> sv[1] >> sv[2] >> sv[3];
ifs.close();

比較実験はしませんが、FILE型を使うよりはかなり楽で、確か3,4倍くらいFILE型を使うより遅くて済むというくらいのトレードオフだったと記憶しています。また、ファイル処理以外はC言語と比べて最悪でも2倍くらいの減速で済みます。

あと、並列化が必要なら、新しいC++だとPOSIXスレッドがけっこう簡単に使えるので、それも変に凝った言語を使うより(慣れていれば)C++で十分だよなあと思います。たぶん、Raspberry Piのデフォルトのg++は古いので、ココ等を参考に新しいバージョンのgccをインストールして使いましょう。

もちろん、Pythonの例もGitHubに置いているように、特にシェルスクリプトにこだわる必要はなく、研究用の実験をしないならC++にこだわる必要もありません。むしろ言語を選べるように「デバイスファイルで字を読み書きする」という仕様にしましたので、みなさんもいろんな言語でロボットを動かしてみていただければと。個人的にはHaskell希望です。

ところでC++で動かしたロボットの動画はないのかというところですが、実験結果は論文が採択されるまで公表できません。また、どんな言語で動かしてもロボットの動きは一緒ですので、割愛ということで・・・

現場からは以上です。

Pocket
LINEで送る

やっと論文の「, . 」と、その他原稿の「、。 」を使い分ける(自分にとっての)究極の方法を見つけた

Pocket
LINEで送る

ここ数年の問題が解決しました。こうやれば良かったんです。何故気付かなかったのか。

研究者は普通、デフォルトで句読点を「, .」(カンマとピリオド)にしてますが、私のようなエセの場合、学術的な文章とそうでない文章が半々で使い分けないといけません。1日に何度も切り替えるのも馬鹿馬鹿しいので、普段は「、。」で書いて、論文もそのまま「、。」で書いて後でvimで変換してました。ただ、これだと論文を出すときに変換忘れをやらかしそうでなんか落ち着きません。

しかし考えてみたら、論文は必ずpLaTeXで書いてmakeしているので、上のツイートのようにMakefileに変換を仕込んでおけばよかったと。なぜ今の今まで考えつかなかったのかと。ということでMakefileを晒しておきます。コンパイル対象のファイル名を変えたらMacとかLinuxとかBSDとかで普通に使えると思います。

uedambp:RSJ2015 ueda$ cat Makefile 
rsj2015.pdf: rsj2015.dvi
	dvipdfmx -p a4 rsj2015.dvi

rsj2015.dvi: *.tex
	sed -i.bak -e 's/。/. /g' -e 's/、/, /g' rsj2015.tex
	platex rsj2015.tex
	pbibtex rsj2015.aux
	platex rsj2015.tex
	platex rsj2015.tex

clean:
	rm -f *.aux *.log *.dvi *.bbl *.blg *.pdf *.ilg *.idx *.toc *.ind

6行目のsedで、-i.bakで「ファイルの中身を出力で入れ替えて、拡張子.bakのバックアップファイルを作る」という意味になります。Vimから:!makeした場合だと、コンパイルが終わったらVimが「編集中にファイルが変わっちまった」とワーニングを出すので、再ロードして変更を読み込みます。

ところで、こういう話は「、。」と「, .」どっちが正しいという炎上案件になりがちですが、ここではそういう議論はしません。誰が何を言おうと論文のフォーマットとして句読点を「,.」で出せと言ってくるわけでして、それに従順に従っているにすぎません。

ところで、rst2015.texとう名前の通り、そういう学会に向けて何か書いておるわけですが、まだ書けてません。期限が延長されてよかったよかった・・・。

Pocket
LINEで送る

新連載の日経Linuxが明後日8日に発売されます

Pocket
LINEで送る

追記(5/6): 最初「明日8日」って書いてたけど明日は7日じゃまいか!・・・大変申し訳なく・・・orz

表題の通り、明後日5月8日に私の新連載第1回が掲載される日経Linux6月号が発売されます。

今回のテーマは私の元々の専門のロボットで、ロボットを組み立てていき、Raspberry Pi上でプログラミングして、部品や完成したロボットを動かすというテーマです。

連載の特色は、「ハードをいじらないロボット屋」である私が、ロボットのキットを作る株式会社アールティさんにソフト屋の立場からワガママを言いまくって成り立っている点です。

どっちでも動かせるので、どっちでも検証しなければならないので辛い。
どっちでも動かせるので、どっちでも検証しなければならないので辛い。

続きを読む 新連載の日経Linuxが明後日8日に発売されます

Pocket
LINEで送る

bashのpipefailで確実にスクリプトを止める

Pocket
LINEで送る

シェルプログラミング実用テクニック、出版される前からもう補足ですが、私めがbashのpipefailというオプションをすっかり見落としていたのでフォローしておきます。

本文ではbashに-e(エラーがあったら止める)をつけてもパイプラインの左側のコマンドにエラーがあったときに処理が止まらないと書きました。

例です。

続きを読む bashのpipefailで確実にスクリプトを止める

Pocket
LINEで送る

【問題と解答例】第16回春だからログ解析するぞシェル芸勉強会

Pocket
LINEで送る

問題のみのページはコチラ

始める前に

イントロのスライド

続きを読む 【問題と解答例】第16回春だからログ解析するぞシェル芸勉強会

Pocket
LINEで送る