カッティングボード

カルマをカットしてます

ゆかりさんと雑談する

このブログは↓のアドベントカレンダーの14日目の記事です.

なんだかんだ折り返してあと半分なので頑張っていきたいと思います.

adventar.org

今週の月曜日のアドベントカレンダーの記事に↓のようなものがありました.

5st7.hatenablog.com

ゆかりさんが喋ってくれるdocomoapiがあるらしい.

ゆかりさんと対話することで寂しさを紛らわせたいよねってことで,僕はゆかりさんと雑談することに決めました.

ゆかりさんと雑談する

使用するもの

docomoapiを2つ利用します. dev.smt.docomo.ne.jp dev.smt.docomo.ne.jp

実装

実装としてはコンソールで入力した文字を雑談apiに投げて,その返答をゆかりさんに喋らせてます. ゆかりさんが喋る部分のコードはごーなんちゃらさんのコードを参考にしてます.

require 'uri'
require 'openssl'
require 'net/http'
require 'json'

APIKEY = 'YOUR_APIKEY'
speach_uri = URI.parse("https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech?APIKEY=#{APIKEY}")
speach_http = Net::HTTP.new(speach_uri.host, speach_uri.port)
speach_http.use_ssl = true

chat_uri = URI.parse("https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=#{APIKEY}")
chat_http = Net::HTTP.new(chat_uri.host, chat_uri.port)
chat_http.use_ssl = true


chat_body = {}

loop do
  chat_body['utt'] = gets

  chat_request = Net::HTTP::Post.new(chat_uri.request_uri, {'Content-Type' =>'application/json'})
  chat_request.body = chat_body.to_json
  chat_response = nil
  chat_http.start do |h|
    resp = h.request(chat_request)
    chat_response = JSON.parse(resp.body)
  end
  chat_body['context'] = chat_response['context']
  chat_body['mode'] = chat_response['mode']

  speach_request = Net::HTTP::Post.new(speach_uri.request_uri, {'Content-Type': 'application/ssml+xml','Accept': 'audio/L16'})
  speach_request.body = "<?xml version='1.0' encoding='utf-8' ?>
    <speak version='1.1'>
    <voice name='sumire'>
      #{chat_response['utt']}
    </voice>
    </speak>
  "

  speach_response = nil
  speach_http.start do |h|
    resp = h.request(speach_request)
    speach_response = resp.body
  end

  
  File.open("tmp.raw", "w") do |f| 
    f.puts(speach_response)
  end
  
  system('sox -t raw -r 16k -e signed -b 16 -B -c 1  tmp.raw output.wav')
  system('afplay output.wav')

end

いい感じに対話してるのを撮りたかったのですが,いい感じに録画する方法がなかったのでとりあえずコードだけ貼っておきます.

しりとりとかもできるので,ゆかりさんとの楽しい雑談で暇な時間をつぶせます.

APIの登録ちょっとめんどくさいですが,いろいろ試して遊べるので是非試してみてください.

明日はかのんくんです,

雑談APIにののしってとお願いするとゆかりさんにたまに罵ってもらえます.実装したdocomoの人神かよ

インフラエンジニアの教科書を読んだ

電車移動で読んでた本が読み終わったので,読んでた本を紹介しようと思います.

インフラエンジニアの教科書 

インフラエンジニアの教科書

インフラエンジニアの教科書

LINEのインフラエンジニアの人が書いている本です.

最近インフラエンジニア向けの本だと,SREとかコード書いたりする本が流行ってますが,この本はそういう本ではないです.

インフラエンジニアがインフラの構成を勉強するのに役立つ本だと思います.

RAIDの話があったり,ルーターの話があったり,クラウドとオンプレの比較があったりする本です.

正直RAID10とか知らなかったので結構ためになりました.

研究室の環境をRAID6で組んでたりしましたが,あまり使われてなかったり,仕様が確定されてなかったりする話とかあって驚きました.

僕みたいにインフラの知識ないけど,インフラ環境触ってたりする人はふわふわした知識が少し固まるのでオススメです.

〇〇の教科書系あんまり役立たないと思ってた時期ありましたが,そんなことなかったです.

インフラエンジニアの教科書2も出てるので読もうかなと思います.

kindleだとワンクリックで即座に本が買えてしまうので良くないなー.

今日やってたこと

まぁ明日アドベントカレンダーの担当なので,書くことないし準備するかーって感じでdocomoapi触ってたりしました.

エラー処理ガバガバでエラーに気づかなかったりしたので,そういうコードからはさすがに卒業したいですね.

ROSはバージョン移行うまくいってると思ってたら,うまくいってなかったというオチで辛かった.

研究室から飛ぶ不思議なパケット

今日は就活関連であんまり作業できてないので,研究室から定期的にでてる不思議なパケットについてちょっと書きます.

 TCP FIN and no ACK   

f:id:cut-ter:20171212180606p:plain ↑のエラーが最近定期的にでてしまっているのでちょっと調べてみました.

調べてみるとFINビットがあるのにACKがないと出るエラーらしいです.

エラーによってポートが空いてる確認できたり,OSを特定する手がかりになるらしいです.

Yamahaルーター、不正アクセス検知機能。:こっそりと。 - livedoor Blog

今回送り先を調べてみたところ, LINEに送っていました.送り元の人を特定して確認したところPC版のLINEを開いていたのでそれが原因な可能性もあるのですが,最近定期的に同じエラーが発生してしまっています.

別の時には研究室のルーターに対して送っていたり,DNSに対して送信してることが多いです.

10月までは全然なかったエラーなのでウィルスか何かの可能性もあるので結構怖いですね.

原因を調べてみたりしても特定できてないので辛いですね,

今回の場合は外部に飛ばしてるのでLINEのアプリの問題であればいいですが,そうでないとするとアタックをかけていることになるので余計に良くないですね.

これからは出来る限り送り元を特定して,共通点等をだして原因を特定していきたいですね.

八王子のボドゲで遊べるお店

急に話が変わりますが,昨日研究室の人たちで八王子のボドゲクラブに行ってきました. hachiohji-board-games.club

うちの研究室では最近ボドゲ部(非公式)が発足して,ボドゲを研究室でやったりしています.

研究室内にあるボドゲ以外もやりたいなーってことで試しに八王子のボドゲクラブに行きました.

2時間500円で,1日いても1000円ってことでめっちゃ格安な場所でした.

f:id:cut-ter:20171212183450j:plain

f:id:cut-ter:20171212183445j:plain

ドミニオンとかも全拡張パックあるらしいのでめっちゃいい場所でした.

ブログ更新忘れた話

毎日投稿するぞーって言って,毎日投稿してから約2週間昨日見事にブログ更新忘れてました.

毎日投稿忘れたら焼肉 f:id:cut-ter:20171211194652j:plain

なんて僕は言ってないので焼肉はおごりません.

いやぁ後輩が半年以上毎日書いてるのはマジですごいんやなぁと実感してしまいました.

圧の高いチャンネル

ブログ更新を忘れた結果下のようなめっちゃ圧の高いチャンネルができてしまいました. f:id:cut-ter:20171211195314p:plain

毎日投稿監視されるとか結構辛い.

まぁ投稿忘れる自分が悪いのでしょうがないですね.

まぁいつまでもこんなこと言ってもしょうがないので今日やったことをまとめたりします.

機械学習用の環境構築のセットアップ

機械学習用の環境をdockerで構築してたりしたのですが,なぜか

/usr/bin/ld: cannot find -lcuda

と出てしまいなぜかyoloのビルドができない..

とりあえずいろいろ調べて,↓を実行したら直りました.

sudo apt install nvidia-current

nvidiaのドライバ関連で何か足りてないっぽいので,後で詳細を調べてみます.

あと普通にopencvが足りてなかったので,↓参考にして入れました.

shibafu3.hatenablog.com

cmakeの部分をcudaを使うように書き換えてビルドすれば準備は完了でした.

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=~/Sources/opencv_contrib/modules -D WITH_CUDA=ON ..

↓のブログと今回のを組み合わせればいい感じにyoloの機械学習環境ができると思います. www.cut-ter.com

ひらくPCバック

研究室の人がひらくPCバックを持っていてめっちゃ良かったので,つい自分も買ってしまいました. f:id:cut-ter:20171211200134j:plain こんな感じで使い始めましたけど,体に密着するので重さを感じなくてマジで軽い.

数日使ったあとにまた感想書こうと思います.

 完全ディスクレスでCentos起動したかった

昨日iSCSIの設定をいろいろやって,HDDすらなしでブートできる的な記事をどっかで見かけた気がしたのでそれに挑戦してみようとしました.

先に結果としては,HDDなしでブートは上手くいきませんでした.ブートローダーがないと起動できないのは当たり前なので,ブートローダーをいい感じにしないとダメでした.記事によってはブートローダーをPXEからよみこむ的なものもあったので後日再挑戦してみようと思います.

今回は/bootだけをローカルのHDDからマウントして,それ以外をiSCSIでマウントする方法でやりたいと思います.

作業

とりあえずcentosインストーラーの立ち上げ等は割愛します. まずiSCSIのディスクを追加してあげないといけないのでとりあえず,ディスクの追加をします.

f:id:cut-ter:20171209165342p:plain

その後,iSCSIターゲットの追加をします.リモートデスクトップVMコンソールでやっていたので画面の大きさの都合上見づらい,ごめんなさい.

f:id:cut-ter:20171209165518p:plain

ターゲットIPアドレスとターゲット側で作成したイニシエーター名を入力して探索を開始します.

f:id:cut-ter:20171209170010p:plain 

見つかったらとりあえず完了.

f:id:cut-ter:20171209170335p:plain

ちゃんとディスクとして追加されてるのを確認して,自分でパーティションを区切る.

f:id:cut-ter:20171209170446p:plain

パーティションの区切り方は好みで.今回は1GBのHDDを/bootに割り当てて,今回は細かく区切る必要は特にないのでルートにiSCSIの奴を全部割り当てました.

f:id:cut-ter:20171209170622p:plain

後は通常通りにインストールして再起動.再起動かけた後は特に何もしなくてもiSCSIのディスクを読み込んでくれるので.ちゃんとマウントされてるのを確認して終了.

f:id:cut-ter:20171209170924p:plain

今回はiSCSI使ってOSのインストールを試してみました.できるかわからんけど今度は,ブートローダーをいい感じにして完全ディスクレスを目指します.

docker imageを外部で保持する

cut-ter.hatenablog.com ↑のサイトでnfsを用いて外部に保持するところまでやったので,今回は実際に動かすところまでやります.

挫折

とりあえずdocker runするかってことで,ubuntuを立ち上げようとしたところ下記のようなエラーが.

docker: Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/d9f6368b43e592400902de3ca7f07a6f2abc69655ba9e6b0c3770df22f9661c9-init/merged: invalid argument.

調べてみたところ,↓のような記事が.これによると,ext4にすると治ったとのことでファイルシステム系がダメなんやなって感じですね. github.com

まぁnfsでマウントしてきたのをさらにマウントするのは,ちょっと無理がありましたね.ということで別の方策を考えていきます.

iSCSI

iSCSIだったら,自由にマウントするファイルシステム選べるし,ディスクレベルのマウントなのでいけるやろってことで試していきます.

ホストの設定

sudo apt-get install -y iscsitarget
sudo vim /etc/default/iscsitarget

false をtrueに書き換える

ISCSITARGET_ENABLE=true
ISCSITARGET_MAX_SLEEP=3


# ietd options
# See ietd(8) for details
ISCSITARGET_OPTIONS=""
sudo mkdir /var/lib/iscsi
sudo dd if=/dev/zero of=/var/lib/iscsi/iscsi.img count=0 bs=1 seek=100G

sudo vim /etc/iet/ietd.conf

末尾に追加

Target iqn.2016-05.net.my:iscsi.img
  Lun 0 Path=/var/lib/iscsi/iscsi.img,Type=fileio
sudo service iscsitarget restart

クライアントの設定

sudo apt-get install open-iscsi
sudo iscsiadm -m node --targetname iqn.2016-05.net.my:iscsi.img --login
sudo apt-get install lsscsi

lsscsiでどこにマウントされてるのかわかるようになります.

cut-ter@ubuntu:~$ lsscsi
[1:0:0:0]    cd/dvd  NECVMWar VMware IDE CDR10 1.00  /dev/sr0
[2:0:0:0]    disk    VMware   Virtual disk     1.0   /dev/sda
[3:0:0:0]    disk    IET      VIRTUAL-DISK     0     /dev/sdb

ってことで今回は/dev/sdbにマウントされます.

sudo parted --script /dev/sdb "mklabel msdos" 
sudo parted --script /dev/sdb "mkpart primary 0% 100%" 
sudo mkfs.ext4 /dev/sdb1

↑のようにパーティション作成してiSCSIの設定は完了です.

調査

とりあえずoverlay2のなかにlディレクトリがあるので動かして,マウントしたりします.

mv overlay2/l/ ~
 mount /dev/sdb1 /var/lib/docker/overlay2/
mv ~/l/ /var/lib/docker/overlay2/

docker pull ubuntu して容量がどんな感じになるか試します.

root@ubuntu:/var/lib/docker# df
Filesystem     1K-blocks    Used Available Use% Mounted on
udev              489692       0    489692   0% /dev
tmpfs             101612    4560     97052   5% /run
/dev/sda1       15349744 1861256  12685724  13% /
tmpfs             508060       0    508060   0% /dev/shm
tmpfs               5120       0      5120   0% /run/lock
tmpfs             508060       0    508060   0% /sys/fs/cgroup
tmpfs             101612       0    101612   0% /run/user/1000
/dev/sdb1      103080224   61044  97759968   1% /var/lib/docker/overlay2

root@ubuntu:/var/lib/docker# df
Filesystem     1K-blocks    Used Available Use% Mounted on
udev              489692       0    489692   0% /dev
tmpfs             101612    4560     97052   5% /run
/dev/sda1       15349744 1861748  12685232  13% /
tmpfs             508060       0    508060   0% /dev/shm
tmpfs               5120       0      5120   0% /run/lock
tmpfs             508060       0    508060   0% /sys/fs/cgroup
tmpfs             101612       0    101612   0% /run/user/1000
/dev/sdb1      103080224  194452  97626560   1% /var/lib/docker/overlay2

ってことで大部分が/dev/sdb1 に保存されてることが確認できました.ここまでは前回と変わらないので今回はdockerでubuntuを動かして,比較的重そうなlinuxカーネルgithubからプルしてこようと思います.

linuxカーネルをプルした結果,↓ような感じになりました.結果としてはしっかりと動作中のイメージもマウント領域に保持されているようなので,これでどんなにファイルを追加したりとかしてもdockerホストの容量が足りなくなったりすることはなくなったかな.

root@ubuntu:/var/lib/docker/overlay2# df
Filesystem     1K-blocks    Used Available Use% Mounted on
udev              489692       0    489692   0% /dev
tmpfs             101612    4636     96976   5% /run
/dev/sda1       15349744 1862192  12684788  13% /
tmpfs             508060       0    508060   0% /dev/shm
tmpfs               5120       0      5120   0% /run/lock
tmpfs             508060       0    508060   0% /sys/fs/cgroup
tmpfs             101612       0    101612   0% /run/user/1000
/dev/sdb1      103080224 3456468  94364544   4% /var/lib/docker/overlay2
overlay        103080224 3456468  94364544   4% /var/lib/docker/overlay2/3b2c4f03fe9743da169bde51725e0893942cb500bd725723ac08a3748ee1cffa/merged
shm                65536       0     65536   0% /var/lib/docker/containers/d13f92d8cec61e79c5982435b73c591aa5a58dfbb2e6c586e253fb3591743eec/shm

とりあえずiSCSIでやれば,容量の対策はできそうなので研究室にNASが来た時に一度ちゃんと速度計測しようとおもいます.

Turtlebot3の組み立て

少し前にTurtlebot3というロボットを組み立てた時に,写真だけ撮って何もしてないので適当にまとめます.

Turtlebot とは

ROS(Robot Operating System)というロボット開発フレームワークで,開発プラットフォームとして使われているロボットです.

このロボットでmove_baseと言われる行動計画や,レーザーセンサによるslamなどが行えるます.それにより,障害物を避けながら移動するロボットを作成することができます.

まぁROSっていう便利なロボット開発ツールのデファクトスタンダード的なデバイスです.

開封式

Turtlebotには色々バージョンがあるのですが今回はTurtlebot3 burgerを組み立てます.

箱は↓みたいな感じです. f:id:cut-ter:20171207183950j:plain 大きさ分かりづらいですが,右上に写ってるスマホと比べてもらえればまぁまぁ大きいのがわかると思います.

中には4つの箱と説明書とケーブルが入ってました. f:id:cut-ter:20171207184454j:plain

中にはraspberry pi3とSDカードとかも入っているので,別途用意する必要があるものは特にありません.Turtlebot2まではノートPCを利用していたりしたのでだいぶ小さく進化したことがわかります.

説明書は日本語にも対応しており,とてもわかりやすいです.組み立て図等も比較的綺麗に描かれてるので特に迷うことなく組み立てることができます.でもネジの色と説明書のネジの色の白黒が全部逆になってることにだけ注意です. f:id:cut-ter:20171207184627j:plain

ネジ類は細かく小袋に分かれており,それぞれにそれがどんなネジなのか細かく書いてあるので特に迷うことはないです.各ネジの予備が1-4本ずつくらいついてるのでなくしたりしても大丈夫です. f:id:cut-ter:20171207184757j:plain

組み立て

1段目 f:id:cut-ter:20171207185231j:plain 2段目 f:id:cut-ter:20171207185258j:plain 3段目 f:id:cut-ter:20171207185310j:plain 完成品 f:id:cut-ter:20171207185309j:plain

ぐだぐだやりながら,1時間ちょっとくらいで組み立てることに成功しました.

結構ネジをきつく締めすぎると組み立てづらい部分がありました.しかしそこを緩めたままにすると最後にネジがポロポロ落ちてくるので,位置を決めたらしっかりネジを締めましょう.

こいつをちゃんと動かしたいなぁ.