Nu:Tekt NTS-1 digital kitでサウンドプログラミング入門 #KORG #NTS1

Nu:Tekt NTS-1 digital kit

Korgが発売している1ボイスのハードウェアシンセサイザーです。

組み立て式のキットとして販売され、1ボイスのオシレータ、それにつながるフィルタとエンベロープ、さらにモジュレーション、ディレイ、リバーブといったエフェクトをかけることができます。

 外部からのオーディオ入力もサポートしており、外部音源に対するエフェクタとしても利用することができます。さらに、テンポシンクのための入出力、MIDI入力、USB(MIDI)とインターフェースも豊富です。

極めつけはカスタムのオシレータ、モジュレーションが作成・利用できるという機能まであります。

RakuChordなどで音を生成するプログラムをちょっと書いたことがある私にとっては、「プロ」の作ったシンセサイザーのハードウェアからソフトウェアまでを触ることができるこの製品は非常に魅力的でした。

組み立て

f:id:inajob:20191128231310p:plain

まずは組み立てです。といってもはんだ付けなどは必要ありません。

まずは基板兼ケースとなっているパネルを折り曲げて分離します。(辺に折り曲げてしまうと取り返しがつかないのでここが一番緊張しました。)

f:id:inajob:20191128231345p:plain

それからそれらをねじで止めて、鍵盤となるリボン抵抗をコネクタで接続し完成です。

USBコネクタに電源をつなげると起動し、鍵盤をタッチすることで音が鳴ることが確認できました。

f:id:inajob:20191128231413p:plain

音を出して遊ぶ

鍵盤を押すと、当然それに対応した音が鳴ります。しかしこのリボン抵抗は細かい操作ができず、音出しのテストくらいしか使用に耐えません。USB/MIDI接続を使いMIDIホストと接続することで、この問題は解消できそうです(まだ試していない)

しかしアルペジエータの機能を使うことで、それっぽいメロディをNTS-1だけでも演奏することができます。

プリセットのオシレータを使い、フィルタ、エンベロープをぐりぐり動かすだけでもかなり面白いです。

エフェクタとして遊ぶ

オーディオ入力端子に自作電子楽器のRakuChordをつなげて、エフェクタとして利用してみました。

モジュレーションのコーラスエフェクトやリバーブは音に深みが出て非常に面白いです。

ディレイはテンポと同期する機能がないため、うまく速度を調整するといい感じに動きますが、合わせるのが非常に難しいです。ぜひテンポと同期できるディレイを実装してほしいと思いました。

オシレータを自作して遊ぶ

プログラマとして見逃せないのがカスタムオシレータの自作です。調べるとNTS-1で利用できるSDKが公開されており、これを使うことでC/C++でオシレータやモジュレータが作れるようです。

github.com

しかし、このSDK、ドキュメントが非常に少なく、また海外・国内ともにあまりチュートリアルのようなものがありません。これは、結構苦労しそうです・・

↓に用意されているスクリプトを使うことでLinux,Windows,macOSそれぞれの環境でNTS-1で利用されているSTM32用のgccをセットアップすることができます。

logue-sdk/tools/gcc at master · korginc/logue-sdk · GitHub

しかし、これらをちゃんとセットアップするのは依存関係も含めて結構手間です。

ということで、まずはこのlogue-sdkの環境をまるっと閉じ込めたコンテナイメージを作成しました。

GitHub - inajob/logue-sdk-docker

このコンテナイメージを使うことで、Dockerをインストールするだけでlogue-sdkの開発を始めることができます。

さて、セットアップは簡単にできるようになったので、いよいよプログラミングです。

オシレータの作成例があるので、これを参考にします↓

logue-sdk/platform/nutekt-digital/demos/waves at master · korginc/logue-sdk · GitHub

このプログラムはよくできていてwaves.hppというファイルにC++のオブジェクトとして、オシレータが実装されており、waves.cppでlogue-sdkから呼び出されるフックの関数を実装しています。

よくできているのですが、SDKの利用方法を学ぶ際にはもう少し簡単な例が欲しいところです。

そこで、とりあえず簡単に「ラ」を鳴らすだけのオシレータを実装してみることにしました。

 

変更したファイルはこれだけ

  • waves.cpp, waves.hpp:これは削除
  • simple.cpp:新しく作成。後ほど説明
  • manifest.json:オシレータの名前やパラメータの設定
  • project.mk:書き換えてsimple.cppを指すように変更

実際にはsimple.cppを作るところ以外はほとんど機械的な変更だけです。

>> code
#include "userosc.h"

uint16_t param1; // オシレータのパラメータ記録用
uint32_t tot; // オシレータの位相の記録用

// このオシレータが起動したときに呼ばれる?
void OSC_INIT(uint32_t platform, uint32_t api)
{
  param1 = 0;
  tot = 0;
}
// オシレータが次の波形を計算するために呼ばれる?
// ynのアドレスからframes分までのメモリに波形を書き込む
// paramsに押された鍵盤の音階や周波数が入っている
void OSC_CYCLE(const user_osc_param_t * const params,
               int32_t *yn,
               const uint32_t frames)
{

  q31_t * __restrict y = (q31_t *)yn;
  // 終了メモリアドレス
  const q31_t * y_e = y + frames;

  // メモリへの書き込みループ
  for (; y != y_e; ) {
    // サンプリングレートは48KHzのようなので、以下の式で440Hzの矩形波が作れる
    // 別途param1を設定することで周波数を変更できるようにしてみる(本当は鍵盤で指定された周波数にすべき)
    float sig = (tot/(48000 / (440 + param1))%2 == 0)?0:1;
   // floatからq31に型変換しメモリに書き込む 
    *(y++) = f32_to_q31(sig);
    tot ++; // 位相を進める(オーバーフローするときに波形が乱れるのであまりよくないような気がする)
  }
}

void OSC_NOTEON(const user_osc_param_t * const params)
{
  // note onの時に呼ばれる
}

void OSC_NOTEOFF(const user_osc_param_t * const params)
{
  // note offの時に呼ばれる
}

// オシレータのパラメータが変更されたときに呼ばれる
void OSC_PARAM(uint16_t index, uint16_t value)
{
  switch (index) { // どのパラメータが変更されたかが入っている
  case k_user_osc_param_id1: //今回はこの変更のみで処理する
    {
      param1 = value; // 0..15 // OSC_CYCLEで使うので変数に入れておく
    }
    break;
  default:
    break;
  }
}
 
<<

 

これが今回の”「ラ」が鳴るだけオシレータ”です。

よく見るととても簡単です。要はOSC_CYCLEでどんどんメモリに次の波形を書き込んでいけばよいわけです。

ビルドは先ほど紹介したlogue-sdk-dockerを使えば簡単にできます。ビルドができると拡張子ntkdigunitのファイルができるので、Librarianという専用ツールでNTS-1に書き込みます。

これでOSCに新しいオシレータが追加されます。

ついでに、このプログラムを改造して押された音階に対応する音が鳴るようにしてみます。

>> code

void OSC_CYCLE(const user_osc_param_t * const params,
               int32_t *yn,
               const uint32_t frames)
{
  q31_t * __restrict y = (q31_t *)yn;
  const q31_t * y_e = y + frames;

  // メモリへの書き込みループ
  for (; y != y_e; ) {
    // osc_w0f_for_note(音階番号, 音階からのずれ周波数?) でオシレータの変分を返す
    // これらは引数のparams->pitchに入っている
    // 参考: https://github.com/korginc/logue-sdk/blob/master/platform/nutekt-digital/inc/userosc.h#L56
    // > high byte: note number, low byte: mod (0-255)

    float w = osc_w0f_for_note((params->pitch)>>8, params->pitch & 0xFF);
    // nowに今の位相が記録されている、これをフレームごとにずらしていく
    now += w;
    // プリセットのウェーブテーブルのnowの位相の値を取り出す
    float sig = osc_wave_scanf(wavesB[param1], now);
    // floatをq32に変更しメモリに書き込む
    *(y++) = f32_to_q31(sig);
  }
}

<<

こんな感じです。osc_w0f_for_noteとかosc_wave_scanfとか、wavesBとかはほかのソースコードを見ながらで書いています。この辺もう少しドキュメントが欲しいところです。(そもそもプリセットのwaves[A-D][0-15]にはどんな波形が入っているか書いてあるドキュメントが見当たらない・・)

 

と、こんな具合でC言語と勘があれば自分でオシレータを作ることができることがわかりました。

 

(ここまでのソースコードhttps://github.com/inajob/simple-oscで公開しています。)

追記: 日本語のドキュメントが公開されました! https://korginc.github.io/logue-sdk/ja/

感想

このガジェットはDTMをたしなむ人はもちろんですが、サウンドプログラミングを学びたい人」にとっても非常に便利なものであると感じました。

音をソースコードで記述する「サウンドプログラミング」ですが、リアルタイムに鳴らそうとすると、たくさんのタスクが並列に処理されるOSの上では案外書きにくいものです。

そこで役に立つのがマイコン上でのサウンドプログラミングです。これまではArduinoやmbedでも似たようなことができましたが、これらはオーディオに特化していないため、パソコンからのMIDI信号受信や、外部音源の取り込み、ディレイを扱うための大きなメモリなど、かなりの周辺機器を自作しないとまともなオーディオプログラミング環境になりません。これにはかなり高度な電子工作、マイコンプログラミングの知識が必要です。

しかしこのNTS-1はこれらの面倒な部分をすべて受け持ってくれて「サウンドプログラミング」の「おいしいところ」だけを扱うことができます。

 

といった感じで、本当にこれはサウンドプログラミング界のArduinoというべき開発環境であると感じました。

また、単純にハードウェアMIDI音源、オーディオエフェクタとしても非常に使いやすいし、品質も良いためプログラミングとは無縁のDTMユーザにもおすすめできます。(まぁ私はDTMユーザではないのでこの部分の評価はほかの人の記事を見ていただくほうが良いです)

 

私は自作電子楽器RakuChordの後段のエフェクタとして、また自作電子楽器の音源の研究という2つの目的でこれからもこのNTS-1を活用していきたいと考えています。

 

記事の中にも書いた通りプログラミング周りはドキュメントなどが少なく、これからの盛り上がりが非常に大事であると考えています。

ぜひぜひ、NTS-1を買った人は得られた知見を公開してもらえると助かります!

 

またTwitterで情報を記載する際にはハッシュタグ#NTS1を使うことをお勧めします(製品名であるNTS-1はハイフンが含まれておりハッシュタグにできないため。)

 

私も自分が発見したことをブログや下記Scrapboxのページにまとめていこうと思うので、NTS-1ユーザの方は見てみてください。

scrapbox.io

 

Amazonで買えます↓ 

 

1年継続!自宅ダンスダンスレボリューションからの1000円追加でWii Fitへの挑戦

1年間継続できました!

去年の11月ごろに購入したWiiダンスダンスレボリューションですが、ここまでの約1年間、なんだかんだと継続することができました!

inajob.hatenablog.jp

(といっても「毎日欠かさず」、とまではいきませんでしたが、「ほぼ毎日」といった感じですが・・)

 

普段からあまり運動をしない私ですが、ダンスダンスレボリューションのおかげでまぁ少しは運動習慣をつけることができたのかなと思います。

 

実施方法は「毎朝3曲踊る」というものです。

f:id:inajob:20191104093700p:plain

上図が典型的な平日の脈拍です。朝8時ごろにガッと上昇しているところがありますが、ここがダンスレボリューションです。その後通勤のためにしばらく高い状態が続き、続いてお昼、そして夕方の帰宅時に上昇しています。

 

(ちなみに上記グラフはFitbit Versaが記録したものです。こうやって運動習慣が可視化されるのは結構面白いのでおススメです。)

Fitbit Versa スマートウォッチ Black L/Sサイズ  [日本正規品] FB505GMBK-CJK

Fitbit Versa スマートウォッチ Black L/Sサイズ [日本正規品] FB505GMBK-CJK

 

遊んだソフト

もともと去年購入時は

こちらのダンスダンスレボリューションフルフルパーティーで遊んでいました。

最近になって、別のソフトも遊んでみようかなと思い

Dance Dance Revolution with MARIO (マットコントローラ同梱)

Dance Dance Revolution with MARIO (マットコントローラ同梱)

 

 こちらのゲームキューブ版のDance Dance Revolution with MARIO(以下 マリオDDR)も購入しました。(中古ですごく安かったので・・)

良く知らなかったのですがWiiではゲームキューブのソフトも遊ぶことができるためソフトとメモリーカードを購入するだけで、遊ぶことができました。

(できればメモリーカードWiiのものが使えると良かったのですが・・)

 

Wii版のダンスレボリューションマットで遊べるかどうかは心配だったのですが、全く問題なく動作しました。

f:id:inajob:20191104095629p:plain

こちらのマリオDDRはマリオにまつわる楽曲や、クラッシック曲をベースにした音楽によるダンスレボリューションです。前述のフルフルパーティーに比べると比較的難易度は易しく、ちょっと物足りない感じがしましたが、よく知っている曲でダンスダンスレボリューションを遊べるという点では楽しかったです。

トラブルはあった?

Wiiやマットが中古ということで、いろいろ 心配事があったのですが、問題が起きたのはこれです。

これはWiiの映像出力をHDMIに変換してくれる非常に役に立つアダプタなのですが、頻繁に抜き差しをしていたこともあり、これのオーディオジャックが内部でもげてしまいました。

f:id:inajob:20191104095304p:plain

幸いにも電子工作の心得があったため、難なくはんだ付けしなおして事なきを得ました。 

Wii本体やマットに関しては1年間遊び続けていますが、特に問題は起きていません。さすが任天堂です。

ダンスは上達した?

ダンスダンスレボリューションが良いのは「自分が進化する」というところです。

購入時は全く歯が立たなかった曲も何度もこなすうちにだんだん踊ることができてくるという体験が楽しく、ここまで継続することができました。

特にダンスレボリューションは1つの曲でも複数の難易度が用意されているため、次から次へとハードルが用意されている感じで、継続していても楽しかったです。

 

フルフルパーティーで「Difficult」の曲は大体A以上は記録できるようになりました「Expert」はなかなか難しく曲によってまちまち・・というところです。

もともと「Basic」の曲が楽しい!くらいのところからスタートしたのでかなりの上達です。

フルフルパーティに関しては難易度がちょうど僕に合っているらしく、まだ楽しめそうです。一方マリオDDRについては、一番難しいモードでも比較的簡単にAがとれてしまい、ちょっと簡単すぎかな、という感じでした。

効果のほどは・・?

こういう健康施策はいまいちわかりやすい効果が出ないものですし、ダンスダンスレボリューション以外の要因も絡んでくるので、効果が出たといっても一概にこれが良かった!ということも難しそうです。なので以下は参考までに・・

足の裏の感覚が変わった

これはダンスレボリューションを始めて1週間ほどで実感があったのですが、歩いているときの足の裏の感覚が少し変わった気がします。今やもうそれが普通になって特に何も感じませんが、何か足の使い方が変わったのかもしれません。

風邪が減った

ここ2-3年本当によく風邪をひきました。まぁそういうこともあって運動習慣をつけようと頑張っていたわけですが、、

今年は例年に比べて風邪をひく回数が減ったように思います。

風邪をが長引くことが減った

上記に加えて体調不良の期間が短くなったように感じます。

朝シャキッとするようになった

ダンスダンスレボリューションは朝行っていたのですが、花粉症のシーズンなどは花粉によるだるさや鼻水が少し楽になるように感じました。

まぁ調べてみると朝に急に運動をすることは健康上あまりよくない、というような話もあるようですが、僕の場合は特に悪いことは今のところ起きていません。

他にも行っている運動習慣

ダンスダンスレボリューションのほかに、毎朝のラジオ体操週末の30minジョギング(これは結構サボりがちですが、、)などを行っています。これら2つはダンスレボリューションより以前から行っていたものなので、上記の気づいた変化はダンスレボリューションによるところが大きいのでは?と考えています。(とはいえ、運動習慣が遅延して影響を及ぼすこともあると思うのでなんともわかりません)

体重は変化なし

僕は体系で言えば「やせすぎ」なので、ダイエット効果は全く期待していませんでしたが、この程度の運動では特に体重が大きく増減することはありませんでした。

ネクストチャレンジ!

そろそろダンスダンスレボリューションはやりつくした感があるので、次は・・・・

Wiiフィット プラス (バランスWiiボードセット) (シロ)

Wiiフィット プラス (バランスWiiボードセット) (シロ)

 

 Wii Fitに挑戦します!(これまた中古ですごく安かったので!)

中古だと1000円くらいでバランスボードと一緒に購入できました!どうせ買うならWii Fit Plusがおすすめです。

f:id:inajob:20191104100527p:plain

購入して数日ですが、早くも背中の筋が痛いです。

1年後、さらに健康になれているといいなぁ。

 

 

Androidを変愚蛮怒専用機にする

これは?

以前Raspberry Pi Zeroを使った携帯型の変愚蛮怒専用機を作成しました。

inajob.hatenablog.jp

しかし、よく考えてみると、ここまで頑張って作ることなく変愚蛮怒を遊ぶ方法がありそうです・・・ そうです スマートフォン を利用するのです。

といっても、遊びたいゲームのiPhone/Android版が存在しないときはどうすればよいでしょうか?

ちょっと調べるとAndroidDebian Linuxを動作させる方法があるようです。

これを利用してAndroid変愚蛮怒を遊ぶ方法を考えてみました。 

f:id:inajob:20191010221624p:plain

AndroidLinux 「GNU Root」

まずはRoot権限なしでAndroid上でLinuxユーザランドを動かす方法を探します。

play.google.com

これを使いました。

注意としては、GNU Rootはもうメンテナンスされていません。そのため新しいAndroid端末ではインストールできません。

代わりにUserLAndというソフトが使えそうです。(ただし僕は古いAndroid端末しかもっていなかったのでGNURootしか使えませんでした。)

play.google.com

 

おそらくこれから紹介する方法はUserLAndでも動作するのでは?と思いますが、確証はないです。

 

GNURootはもう古いアプリなので説明は手身近に・・

 (ここからGNURoot特有の記載です)

Rootfsとして DeibanのWheezyを選択し「Create New Rootfs」をタップ。

するとGNURoot Wheezyというソフトをインストールする画面になるので、そのままインストールします。

その後再びGNURootを起動し「Launch Rootfs」をタップすることでコンソールが起動します。

Root権限が必要な場合は「Launch as Fake Root」にチェックを入れて「Launch Rootfs」をタップするとRoot権限のコンソールが起動します。

必要に応じて2つのコンソールを使い分ける必要があります。 

Debian Wheezyはすでにパッケージリポジトリがarchiveのものしか存在しないのでまずは/etc/apt/source.listを下記のように編集する必要があります。(本当はアップグレードしたいのですが、GNURootがすでにメンテされていないので・・)

dev http://archive.debian.org/debian/ wheezy main contrib non-free
dev-src http://archive.debian.org/debian/ wheezy main contrib non-free

 編集したらapt-get updateしておきます。

さて、ここまででAndroid上にDebianユーザランドを用意することができました。 

 (ここまでがGNURoot特有の記載です)

変愚蛮怒のビルド

変愚蛮怒Linux版はソースコードで提供されています。そのためビルドする必要があるので、必要なライブラリをインストールします。(後で使うのでmake, unzip, curlも入れておきます) 

# apt-get install libncurses5-dev make unzip curl

依存関係でgccやらいろいろ入ります。

 

ここからは一般ユーザで操作します。

変愚蛮怒をダウンロードしてビルドします。

$ cd /home
$ curl -L https://ja.osdn.net/projects/hengband/downloads/10331/hengband-1.6.2.tar.gz/ > hengband-1.6.2.tar.gz
$ tar xzf hengband-1.6.2.tar.gz
$ cd hengband-1.6.2
$ ./configure --without-x
(時間がかかります)
$ make
(すごく時間がかかります)

これで./src/hengbandにバイナリが生成されます。

ここで、./src/hengbandを実行すると、確かに起動するのですが、全体的に文字化けてしまいます。(SHIFT+Qなどで終了できます。)

これは変愚蛮怒EUC-JPにしか対応していないからです。加えてAndroidのTerminalはUTF-8の日本語は表示できますがEUC-JPには対応していません。

 

ここで、役に立つのがcocotです。

cocotのビルド

vmi.jp

cocotは、端末とプロセスの間に割り込んで文字コード変換を行うツールです。これはまさに今欲しい機能です。EUC-JPで動作する変愚蛮怒の出力を受け取り、端末にはUTF-8を返すことで、文字化けを解消できそうです。

こちらもAndroid用のバイナリは存在していないので、自分でビルドします。

$ cd /home
$ curl -L https://github.com/vmi/cocot/archive/master.zip >cocot.zip
$ unzip cocot.zip
$ cd cocot-master
$ ./configure
$ make

特に問題なくcocotもビルドできました。

あとはcocotを通して変愚蛮怒を起動すればよいだけなのですが、なぜか一般ユーザで実行すると「Error: openpty()」などと表示されて実行できないので、rootの端末で作業が必要でした。

 さて、ドキドキしながら起動します。

# cd /home
# cd hengband-1.6.2
# ../cocot-master/cocot -t UTF-8 -p EUC-JP -- src/hengband

 日本語も表示された!

ということでこれでAndroidでも簡単に変愚蛮怒で遊べるようになりました。

ただ、この方法をもってしても、まれに表示の一部が文字化けする起きるようです。まぁゲームの進行に支障がないレベルのものなので、この点は妥協するとしましょう・・

別解: Xで変愚蛮怒を使う

前回Raspberry Piで試したときはX11環境をセットアップしました。Androidでもこの方法で変愚蛮怒を利用することができますが、Androidの容量を非常にたくさん消費するので、あまりお勧めしません。

しかし、もし上記の方法でうまくいかない場合はX環境での実行を試してみるのもよいでしょう。

(といいつつ、詳しい方法はここでは書きません だいたい前回記事のRaspberry Piと同じ方法になると思います。)

f:id:inajob:20191012174818p:plain

おまけ: 3Dプリンタでケースを作る

前回の変愚蛮怒専用機と同様、3Dプリンタでケースを作りました。

f:id:inajob:20191012174138p:plain

f:id:inajob:20191012174201p:plain

スマートフォンの中にバッテリーもディスプレイもCPUも内蔵されているため、非常に簡単な作りで、しかもコンパクトに設計できました。

ちなみにここで使ったキーボードはこちら↓

 まぁ作ってみたのですが、、 意外と使いづらい。キーボードと本体は分離してたほうが遊びやすいですね・・また今後改良していきたいと思います。

まとめ

ということで、物理キーボード付きの変愚蛮怒専用Androidが完成しました。

これで、気軽にどこでも変愚蛮怒が楽しめます!

Oracle Cloud Always Freeで作る 0円Kubernetesクラスタ

これは何?

Oracle社が発表したAlways FreeサービスでKubernetesクラスタを作成する方法を紹介します。

f:id:inajob:20191006162003p:plain

Oracle Cloud Free Tier | Oracle 日本

Oracle Cloud Free Tierはクレジットカードの登録さえすれば、無料でいくつかのリソースを利用することができます。

特に今回利用するFree Tierは

  • 2つのVM(1/8 CPU, 1GB Memory)
  • 10TB/monthの外部通信

です。

 

以前こういう記事を書きました。

inajob.hatenablog.jp

この記事でははVultrというVPSサービスを使い$10でKubernetesクラスタを作る方法を紹介したのですが、そのとき利用したVPSのスペックは 1CPU,1GB Memory のVM2台でした。

 

CPUこそ劣るものの、これでできるならOracle CloudののFreeTierでもKubernetesクラスタが作れるのでは?と考え挑戦してみました。

注意

この手順を使って作るクラスタはインターネットからアクセスできる状態になります。この手順通り実施したとしても様々な攻撃のリスクが存在しています。この手順を実行し起きたいかなる問題も筆者は責任を負えませんので、個人の責任で作業を行ってください。

また、これらの手順を実行した結果によってOracle Cloudへの課金が生じる可能性があります、こちらに関しても筆者は責任を負いません

FreeTierへの登録

ここは割愛します。クレジットカードの登録などが必要です。

また、ここで登録したリージョンが「ホームリージョン」となり、Free Tierで利用できるのはそのリージョンだけになるようです(お金を払えばそれとは関係なくどのリージョンでも利用できます。)

ここFreeTierが発表されてしばらくはJapanリージョンではVMが払い出せない状況にありましたが、ここ数日で払い出せるように回復しているように見えます。

 

追記:この記事を書いている2019/10/06現在、再び払い出せなくなりました。(この症状の時 VM作成時に Out of host capacity というエラーが出ます。)

VMの作成

f:id:inajob:20191006131954p:plain

インスタンス命名は何でもいいです、イメージソースはここではUbuntuの18.0.4にします。また、パブリックIPを割り当てるために「シェイプ、ネットワーク、ストレージオプションの表示」をクリックします。

f:id:inajob:20191006132111p:plain

そして”Assign in public IP address”を選択します。

さらにSSHキーを適切に設定して「作成」をクリックします。

VMが作成できると「パブリックIPアドレスが表示されます。このIPにsshすることで、作成したVMにログインできます。

 

同じ要領でWorkerのVMも作成しておきます。

このようにして作ったVM2台はちょうどAlways Free Tierの要件を満たしており、無料で利用することができます。

これから作るKubernetesクラスタ

f:id:inajob:20191006161646p:plain

master, workerのVMを作り、その2台でKubernetesクラスタを構築します。ingress-controllerをデプロイし、インターネットからそこを経由してクラスタ内のWebアプリケーションにアクセスできるようにします。(0円で)

Kubernetes Nodeの構築

次にKubernetesのNodeとして必要なパッケージのインストールです。これをざざっと実行することで

  • 最新のDockerパッケージのインストール
  • 最新のKubernetesパッケージのインストール
  • Kubernetesとしては非推奨ですが)Swapの有効化とKubeletの設定

が行えます。

apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

apt-get update
apt-get install -y docker-ce
apt-get install -y kubelet kubeadm kubectl

dd if=/dev/zero of=/swapfile count=2048 bs=1M
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo "/swapfile   none    swap    sw    0   0" >> /etc/fstab

sed -i 's/\/usr\/bin\/kubelet/\/usr\/bin\/kubelet --fail-swap-on=false --system-reserved=memory=100Mi /' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

systemctl daemon-reload
systemctl restart kubelet

ネットワークの設定(Oracle Cloud)

Kubernetesクラスタを構築する前にネットワークの設定をする必要があります。

必要なポートの設定はInstalling kubeadm - Kubernetesが参考になります。

要するにMasterはWorkerからの6443、MasterからすべてのNodeへの10250が疎通できれば良さそうです。

またこれから利用するオーバーレイネットワークのWeaveNetで利用する6783ポートも開ける必要があります。

 

「仮想クラウドネットワーク」から(おそらくmasterという名前(初めに作ったVMと同じ名前になる?)目的のネットワークを選択し、さらにその中にあるサブネットを選択します(おそらく1つしかないです)。さらに、その中のセキュリティリストを選択し、下記のように設定します。

 

上のほうのルールはもとからあるものです。

f:id:inajob:20191006133749p:plain

ネットワークの設定(iptables

Oracle Cloudの設定とは別に各ホストのiptablesも設定する必要があります。

master

iptablesの設定は既存の設定に依存します。ここまでセットアップしたVMでは例えば下記のようになっているはずです。

# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere             anywhere
3    ACCEPT     all  --  anywhere             anywhere
4    ACCEPT     udp  --  anywhere             anywhere             udp spt:ntp
5    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
6   REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

 行番号6のルールより前に通信を許可しないと、通信が捨てられてしまいます。

5行目のような(ここではSSHを許可している)ルールを追加していく必要があります。

iptables -I INPUT 6 -p tcp -m state --state NEW -m tcp --dport 6443 -j ACCEPT
iptables -I INPUT 6 -p tcp -m state --state NEW -m tcp --dport 6783 -j ACCEPT
iptables -I INPUT 6 -p tcp -m state --state NEW -m tcp --dport 10250 -j ACCEPT

 こんな感じで設定します。

Masterの構築

# kubeadm init --ignore-preflight-errors=swap

swapが有効だとうまくセットアップできないので、あえて無視するように設定します。

コマンドがうまく実行できるとkubeadm joinのスニペットが表示されます。

Workerの構築

# kubeadm join <前手順で生成されるものをコピペ> --ignore-preflight-errors=swap

 Workerでは基本的にはスニペットを実行するだけですが、ここでもswapを無視して進めるようにします。

kubectlでのアクセス

kubeconfigをコピーしてきます。(セキュリティ上はあまりよくないですが・・)

# cp /etc/kubernetes/admin.conf /home/ubuntu/
# chmod 644 admin.conf

 以降は一般ユーザで作業できます

 

$ export KUBECONFIG=/home/ubuntu/admin.conf
$ kubectl get nodes

 node一覧が表示されれば成功です。

ネットワークアドオンのデプロイ

 Pod間の通信を可能にするためにネットワークアドオンであるWeave Netをデプロイします。

$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

 

Ingress Controllerのデプロイ

Webサービスを公開するためにIngress Controllerをデプロイします。

ここでは GitHub - zlabjp/nghttpx-ingress-lb: nghttpx ingress controller for Kubernetes を使うことにします。

 

まず該当するingressリソースがない場合に表示する404画面用のPodをデプロイします。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: default-http-backend
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: default-http-backend
  replicas: 1
  template:
    metadata:
      labels:
        k8s-app: default-http-backend
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: default-http-backend
        # Any image is permissible as long as:
        # 1. It serves a 404 page at /
        # 2. It serves 200 on a /healthz endpoint
        image: k8s.gcr.io/defaultbackend-amd64:1.5
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 30
          timeoutSeconds: 5
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: 10m
            memory: 20Mi
          requests:
            cpu: 10m
            memory: 20Mi

 

apiVersion: v1
kind: Service
metadata:
  name: default-http-backend
  namespace: kube-system
  labels:
    k8s-app: default-http-backend
spec:
  selector:
    k8s-app: default-http-backend
  ports:
  - name: 8080-8080
    port: 8080
    targetPort: 8080
    protocol: TCP

次にingress-controllerが利用するServiceAccountとその権限を設定します。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nghttpx-ingress-serviceaccount
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nghttpx-ingress-clusterrole
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - endpoints
      - nodes
      - pods
      - secrets
    verbs:
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - nodes
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - services
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - "networking.k8s.io"
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - ""
    resources:
        - events
    verbs:
        - create
        - patch
  - apiGroups:
      - "networking.k8s.io"
    resources:
      - ingresses/status
    verbs:
      - update
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: nghttpx-ingress-role
  namespace: kube-system
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - pods
      - secrets
      - namespaces
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - configmaps
    resourceNames:
      # Defaults to "<election-id>-<ingress-class>"
      # Here: "<ingress-controller-leader>-<nginx>"
      # This has to be adapted if you change either parameter
      # when launching the nginx-ingress-controller.
      - "ingress-controller-leader-nginx"
    verbs:
      - get
      - update
  - apiGroups:
      - ""
    resources:
      - configmaps
    verbs:
      - create
  - apiGroups:
      - ""
    resources:
      - endpoints
    verbs:
      - get
      - create
      - update
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: nghttpx-ingress-role-nisa-binding
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: nghttpx-ingress-role
subjects:
  - kind: ServiceAccount
    name: nghttpx-ingress-serviceaccount
    namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: nghttpx-ingress-clusterrole-nisa-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nghttpx-ingress-clusterrole
subjects:
  - kind: ServiceAccount
    name: nghttpx-ingress-serviceaccount
    namespace: kube-system

 最後にingress-controllerをデプロイします。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nghttpx-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: nghttpx-ingress-lb
spec:
  selector:
    matchLabels:
      k8s-app: nghttpx-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: nghttpx-ingress-lb
        name: nghttpx-ingress-lb
    spec:
      serviceAccountName: nghttpx-ingress-serviceaccount
      terminationGracePeriodSeconds: 60
      hostNetwork: true
      containers:
      - image: zlabjp/nghttpx-ingress-controller:latest
        name: nghttpx-ingress-lb
        imagePullPolicy: Always
        livenessProbe:
          httpGet:
            path: /healthz
            # when changing this port, also specify it using --healthz-port in nghttpx-ingress-controller args.
            port: 11249
            scheme: HTTP
          initialDelaySeconds: 30
          timeoutSeconds: 5
        # use downward API
        env:
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
        ports:
        - containerPort: 80
          hostPort: 80
        - containerPort: 443
          hostPort: 443
        args:
        - /nghttpx-ingress-controller
        - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
        - --healthz-port=11249
        - --logtostderr

 これで、このクラスタWebサービスをデプロイする準備が整いました。

追加のネットワーク設定

インターネットからの80番アクセスを許可するために追加でネットワークの設定が必要です。

 

f:id:inajob:20191006141934p:plain一番下にある80番ポートについてのルールを追加しました。

 

また、workerのiptablesも合わせて追加の設定が必要です。


iptables -I INPUT 6 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

 (INPUT 6の”6”はルールを見て適切な行番号を指定する必要があります。)

 

ここで、手元のPCからworkerのパブリックIPにアクセスをしてみると

f:id:inajob:20191006142222p:plain

このようにそっけない404ページが表示されるはずです。これはKubernetesクラスタ内のPodが返したものです。

Webアプリケーションのデプロイ

最後に、nginxをクラスタ上にデプロイして動作確認をしてみます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: test-service
spec:
  ports:
    - port: 80
  selector:
    app: nginx
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: test-service
          servicePort: 80

 これをデプロイしたのちに、先ほどと同様にworkerのパブリックIPにアクセスすると

f:id:inajob:20191006142525p:plain

おめでとう!無事Kubernetesクラスタ上のアプリケーションにインターネットからアクセスできるようになりました。

まとめ

Oracle CloudのAlways Free Tierを使って、Master1台、Worker1台のKubernetesクラスタを作ることができました。

貧弱な構成ですが、無料の範囲内でインターネットからアクセスできるKubernetesクラスタを作れるのは面白いおもちゃになりそうと感じました。

また、Oracle Cloudは初めて使いましたが、普段使っているVPSと遜色なく利用することができ、特段詰まることもありませんでした。

 

2回目のRakuChord(らくこーど)通販、完売しました

このブログでもたまに触れている、僕の制作している電子楽器「RakuChord(らくこーど)」ですが、以前3月に通販してから、かれこれ半年たちました。そして満を持して9/4から第2回の通販を開始していました。

f:id:inajob:20190907174249p:plain

毎日ちょろちょろと売れていき本日9/7に完売しました

 

RakuChordがどんな楽器か?というのは下記の動画が参考になると思います。

さらに詳しい説明は公式ページ(RakuChord(らくこーど) - 楽にそれっぽい演奏ができる電子楽器)を見ていただくとして、本日のブログでは前回からの差分や、今後の展開について紹介しようと思います。

ここまでの歩み

実は開発はかなり昔から行っており2010年の記事があります。

このころはユニバーサル基板に100均のまな板をエンクロージャにしています。

その後、様々な形を検討しています。これは小型化したバージョン。

そしてこちらは長いバージョン

月日は流れ・・

基板を発注できるようになりました。

そして3Dプリンタでケースを作れるようになったことで夢の「キット化」が実現したわけです。

で、2019年3月に初めての通販を実施。

で、今回記念すべき2回目の通販を行ったという流れです。

前回からの差分

バージョン表記

今回からバージョンを数字で表記するようにしました。今回がv1.3ということにしました。今後も変更を加えていくたびにこのバージョンで区別できるようにするつもりです。

互換性

今回販売したものは2019/3に販売したものと構造はほぼ同じで、ソフトウェアについても互換性があります。ということで2019/3バージョンをお持ちの方は最新版のファームウェアに更新することで、RakuChord v1.3を体験することができます。(ソースコードはこちら https://github.com/inajob/rakuchord

前回のハードウェアバグ修正

以前販売時にこのブログでも紹介した(https://inajob.hatenablog.jp/entry/rakuchord-e-commerce)ハードウェアの問題点を修正しています。具体的にはOLEDから発生するノイズを低減するための電解コンデンサを追加しました。

また、前回アドホックに追加したプルアップ用の抵抗も、ちゃんと部品としてフットプリントを用意しました。

アンプの音量増加

LM386周りの回路を見直して、音量が少し大きくなるように回路を改良しました。

組み立てやすさのための修正

前回はスイッチとダイオードが非常に近くにあったため、はんだ付けが難しいところがありました。今回少しマージンを大きめにとったので、前回よりは作りやすくなったと思います。

前回(D19が近すぎる)→f:id:inajob:20190907173641p:plain

今回(程よくマージンがあります)→f:id:inajob:20190907173656p:plain

スイッチのフットプリント変更

メインスイッチのフットプリントを変更し、オムロンの12mmx12mmのスイッチなどが利用できるようになりました。実際はキットに同梱しているスイッチがマウントできれば、まぁそれで十分なのですが、手元ではいろいろなスイッチで試して遊んでいます。

基板の色

バージョンごとに色は変えていきたいなと思い、今回は黄色にしました。思ったより暗い色で、個人的には前回の白のほうが好みです。まぁケースに隠れてしまうのでいいのですが・・

LM386を二個入れた

前回なぜか検品したにもかかわらず、LM386というICが動かない症例が複数あったため、とりあえずキットにはLM386を2つ入れてあります。全く根本対策になっていませんが、ひとまずこれで様子を見ます。

f:id:inajob:20190907190449p:plain

今後の予定

今回も完売ということですが、そろそろ需要があるのか心配になってきました・・、しかし少なくとも次もアップデートしたいことがあるので、引き続き販売を予定しています。

 

「買いたい!」という方は 下記から「入荷お知らせメールを受け取る」をクリックしておいてほしいです。

自作電子楽器 RakuChord(らくこーど) v1.3 - inajobの作品販売 - BOOTH

 この設定は販売者は見ることができるため、今後のRakuChord開発の励みになります。

また「応援したい!」という方は「スキ!」を押していただけると、こちらも開発の励みになります。

追加予定の機能

ここに書いているのはあくまで「案」であり、次のバージョンにすべてが搭載されるわけではないことをご承知おきください。

  • ケースの外からもアクセスしやすい拡張端子(OPシリーズとのSyncや、MIDI出力、外部音源ICの接続、アナログコントローラの追加、などを想定)
  • SMD部品の利用と半完成キット化
  • より扱いやすい筐体

などなど、が今のところ考えている改良です。(SMD化は次のバージョンでは難しいか?・・)

他にもほしい機能があればぜひぜひコメントやTwitterhttps://twitter.com/ina_ani)で教えてください。

 おまけ

こんかいも部品を頑張って数えました。キットはこれがつらい・・

f:id:inajob:20190907190609p:plain

 

Maker Faire Tokyo 2019即日レビュー #MFTokyo2019

ここ数年は展示する側として参加することが多かったMaker Faire Tokyoですが、今年は個人で応募して落ちたので 普通にに参加者として楽しむことにしました。

 

f:id:inajob:20190803203355p:plain

スポンサー企業

f:id:inajob:20190803203426p:plain

感謝感謝。STEMとかそういう色合いを感じたりもしますね。

雑に面白かった作品を紹介

面白かった展示はざざっとTwitterに書いたのですが、明日行く人もいると思うので、改めてブログにも書いておこうと思います。

あくまで僕が目にとまったもの、特に今年初めて見たものを中心に写真を撮っています。(毎回おなじみですごい!みたいなものはTwitterとかでたくさん出回っているのでそっちを見てくださいw)

(ブース番号を写真と紐づけられておらず、、あとで追記するかもしれません。)

 

f:id:inajob:20190803203517p:plain

いわゆる パリピデストロイヤー。いろいろ展示してあったけど、幻らしいのでこちらを写真に収めました。

f:id:inajob:20190803203644p:plain

こちらはスタイロフォームを自由自在にカットできる装置。
キットでの販売も予定されているのだとか・・

f:id:inajob:20190803203741p:plain

上とやや似ていますが、発泡スチロールを切り抜く装置。
特徴的なのは左手のスキャン装置(?)で手書きのデータを読み取って、カットしてくれるというところ。PCレスで発泡スチロールのカットができるので子供でも操作できるのが売りなのだとか。

f:id:inajob:20190803203914p:plainf:id:inajob:20190803203937p:plain

こちらはアクリル板にレーザーカットしたマスキングテープを貼った作品。いい雰囲気でした。

f:id:inajob:20190803204116p:plain

こちらはOpenJSCADの開発者の方のブースのようでした。
http://knowhave.com/karakuriclub/ ここの方のようです。

OpenJSCADの新しいバージョンのデモなどをされていました。

f:id:inajob:20190803204432p:plain

こちらは目が見えない方向けの「点字タグ」を3Dプリンタで作っているという方のブース。OpenSCADでデータを公開しているようで、簡単にタグが作れるとのこと。

f:id:inajob:20190803204549p:plain

こちらはスポンサーブースで発見したKorgの新しいシンセガジェット!
Volcaシリーズ的なアレですが、キットとして販売するらしいです。(Volcaよりは安いのだとか・・)SDKなども公開されるようなので、自作楽器に組み込んだりと夢が広がります。

f:id:inajob:20190803213136p:plain

フルカラー3Dプリンタのサンプル。いまやこんなにきれいに出るんですね!

f:id:inajob:20190803213456p:plain

風の力で動くからくり人形(ペーパークラフト)、リズムを調整するための歯車みたいなものがついていてオルゴールみたいな感じだった。

f:id:inajob:20190803221819p:plain

ちょっと変わった動きをする歩行ロボット。この写真、人を乗せて歩いています。

f:id:inajob:20190803221920p:plain

なぞに2つのロボットが立っていました。制御難しそう。

f:id:inajob:20190803221959p:plain

完成度の高いアーケード筐体。

f:id:inajob:20190803222035p:plain

microbit用のレトロ音源ICボード。
ここの方、Orca-c専用のRaspberryPiボードも作っているようで、もしやと思って聞いてみると↓の記事を読んでみて、作ってみたとのこと。ブロガー冥利に尽きます。

inajob.hatenablog.jp

(そして基板1枚いただきました。ありがとうございます!)

f:id:inajob:20190803222258p:plain

こちらは楽器Slackの会で聞いていた「エアコンを楽器にした」やつです。なんとも不思議な演奏体験でした。

f:id:inajob:20190803222341p:plain

こちらは「ピンポン玉」を使ったドットマトリクス表示機。ドットが切り替わるときの音にまでこだわったとのこと。

f:id:inajob:20190803231219p:plain

今年もキーボード勢の人気は健在。

f:id:inajob:20190803231248p:plain

このラップトップ風IchigoJam機、閉じたらカバンみたいに持ち運べるんです。いいな!

f:id:inajob:20190803222433p:plain

木とLEDを組み合わせたこの展示もよい雰囲気で印象に残りました。

f:id:inajob:20190803222938p:plain

木といえばこちらの作品も雰囲気が良かったです。薄い木の板の裏にマトリクスLEDを置いているのかな?

f:id:inajob:20190803222503p:plain

イデア商品的なこれ。「本を読みかけの状態で立てることができる」というブックスタンドのようです。面白い。

f:id:inajob:20190803222546p:plain

展示物どれだろう・・と思っていたら、このだるまの目!!という驚きの作品。

f:id:inajob:20190803222649p:plain

こちらはからくり式の加算器。大学の授業で半加算器からやったなー と思い出しました。

f:id:inajob:20190803222745p:plain

こちらの球体のキーボード。無線式でこの台座から持ち上げることができるのですが、、打ちやすい・・! ということはなかったです。 脳トレ的な?

f:id:inajob:20190803222833p:plain

こんな見た目ですが、れっきとしたドラムマシン。左右でそれぞれパターンを作ることができ、真ん中のトグルスイッチでどちらを再生するか決めることができる。という意外と本格的な仕様。

最後に↓。これ、実はMaker Faire Kyotoで見逃して非常に悔しかった展示で、今回ついに見ることができました。この動き「高度に発達した技術は魔法と区別がつかない」という言葉通り、魔法のようだと感じました。

また制作記録の写真集のようなものも、見せていただき、苦労とこだわりを感じました。

また、制作者の方が、まるで人に接するように、このロボットの髪の毛を直したり、服を整えたりする様子にとても愛を感じました。

 写真が撮れてないけど印象的だったもの

 

 プレゼン

今回は完全に観客として参加だったので、プレゼンテーションもいくつか見ました。

 

 一つ目はこちら

f:id:inajob:20190803223446p:plain

 

 こちらの本の著者の方の講演でした。僕はこの本Amazonで予約していたので、どんな方が書かれているのかな?という興味でこの講演を聞きました。

結果この講演だけでも面白い話がたくさん出てきて、本を読むのが楽しみになりました。

 

 二つ目はこちら

f:id:inajob:20190803223646p:plain

毎回すごい数の「プロッタ」を展示していらっしゃる”いしかわきょーすけ”さんです。

f:id:inajob:20190803223659p:plain

これこれ。今年は右側の2色出せるやつとか、直動機構を説明するための真ん中のクリアファイルみたいなやつが新作・・かな? 

f:id:inajob:20190803223817p:plain

とにかく同じものを作り続ける、というところで、プロッタ、特に「直動機構」について、様々なノウハウがつめこまれた素晴らしいプレゼンでした(資料公開してほしい・・ 資料公開していただきました!ありがたい!)

speakerdeck.com

 

完全に蛇足ですが、小説「空の境界」で”起源”というワードが出てきますが

作品世界において、あらゆる存在が持つ、原初の始まりの際に与えられた方向づけ、または絶対命令。あらかじめ定められた物事の本質。無生・有生を問わず全ての物事は抗えない宿命として、それぞれ何らかの方向性を与えられて存在している。個々の人間もまた、知ろうが知るまいがこの方向性に従って人格を形成し、存在意義を持つ。

https://ja.wikipedia.org/wiki/%E7%A9%BA%E3%81%AE%E5%A2%83%E7%95%8C

まさに、このいしかわきょーすけさん ”直動機構”が起源なんだろうと思いました。
それくらいに”なにか”に突き動かされるようにプロッタづくりに情熱を注がれている姿がいつも印象的です。

 

三つ目はこちら

f:id:inajob:20190803224711p:plain

プログラムを見た時には全く気にも留めなかった発表なのですが、ブースでこんなデモを見て、ひとめぼれしました。

f:id:inajob:20190803224724p:plain

すごい完成度の手書き風プロッタです。
プレゼンを聞くと、どうやらこれ、ベンチャー企業で取り組んでいる事例のようで、実際に既にサービスとして提供しているものだそうで、道理で完成度が高いわけだと思いました。

私も昔プロッタを自作したことがあったので、”筆順データはどうしているのか?”などかなりマニアックな質問をしたりしました。

inajob.hatenablog.jp



最後がこちら

f:id:inajob:20190803224151p:plain

まぁこの業界では有名人 高須さんが自身で翻訳された「ハードウェアハッカー」という書籍についての話でした。

こちらのプレゼンは動画で公開されています。→ https://www.youtube.com/watch?v=NGmj49DtQRg

 

ハードウェアハッカー ~新しいモノをつくる破壊と創造の冒険

ハードウェアハッカー ~新しいモノをつくる破壊と創造の冒険

 

この本僕、読んでいたのですが、 結構長い本で、トピックも様々なので、改めて翻訳者の高須さんからの紹介を聞くことで、全体の構成というか、この本で著者が言いたかったことみたいなのがより詳しく理解できた気がしました。

これを踏まえてもう一度読み直してみようと思いました。

そして、それ以上に自分も同人ハードウェア活動をもっと進めたい!と思いました。(RakuChordの通販第二弾の準備も進めていますよ!)

inajob.github.io

 

てな感じで、どのプレゼンも非常に面白かったです。

おまけ: 趣味TECH祭り

 同東京ビッグサイト会議室で行われていた趣味TECH祭りもちらっと見てきました

f:id:inajob:20190803225138p:plain

本当に会議室で行われている!!

f:id:inajob:20190803225203p:plain

昨年のMaker Faire Tokyoで出会ってからやたらと良く出会う「黄色い坊主」のカワヅさん。工具箱も黄色い!!

f:id:inajob:20190803225310p:plain

元ロボット芸人の”高橋ちゃん”さんのインディーズゲーム機コレクション(?)
じつはこの方もいつぞやかのMaker Faire Tokyoで出会った仲です。(確かArduboyのブースに案内する。という劇的な?出会いでした。)

てな感じで、実はMaker Faire Tokyoを通じて界隈の有名人と結構知り合っているんだなーなんてことを裏番組である趣味TECH祭りで感じたりして、しみじみしていました。

戦利品

f:id:inajob:20190803225855p:plain

チラシ系はたくさんもらいすぎたので後で整理するとして、ステッカーなどはこんな感じ。
写真は撮っていないけどShigezoneさん(https://twitter.com/shigezoneakiba)とこにSexyCyborgさんがいて、JLCPCBのノベルティを配っていたのでいただきました。

あとはKLabの方のブースで「RaspberryPiでネットワークを遅延させるデバイス」の紹介を聞いたらそのデバイス用の拡張基盤をもらいました。(このデバイス実際に業務で使っているのだとか・・)


右上の歯車みたいなのは上に書いたOpenJSCADのブースの方からいただきました。
あと写真には写っていないけど

この基板もらっちゃいました。僕もOrca-cデバイス作ろうかなー

まとめ

Twitterとかを見ていると「あ、あれ見逃した!」みたいなのが大量にあるので、皆さんもこういうブログ記事書いて僕に教えてください!

まぁこんな感じで12時の開場から19時まで完全に「客」としてゆっくりMaker Faire Tokyoを見てきました。
何年に一度かはこういうのも良いな、と感じました。

そして人が作っているのを見ると自分も作りたい! と創作意欲がわいてきました。取り急ぎ今手元に部品がそろいつつあるRakuChordの通販の準備を始めようと思います。

f:id:inajob:20190803225807p:plain

(いい感じの夕焼けが撮れたのでこの写真で閉めます。)

ノートパソコンを新調した

背景

最近のメインPCはノートパソコンにしているのだが、どうも今までのものが性能が低くて使いにくい・・

ということで新しいものを探すことにした

パソコンで行う作業

行う作業によりパソコンの性能を選ぶ必要がある

今までのマシンで特に「性能が低いな」と感じたのはブラウジング、ビルド、Dockerを使った作業の3つです。

特に、最近Kubernetesがらみの検証を行うときに、ブラウザ+Dockerの組み合わせで作業することが多く、この際にメモリ不足となるのが非常にストレスでした。

今までのパソコンのスペック

f:id:inajob:20190728101307p:plain

LIFEBOOK P771/Cです。( https://www.fmworld.net/biz/fmv/lifebook/1107/p771c/

法人用のノートパソコンのようで、これの中古を買って使っていました。(確か2-3万くらい)

OSはWindows10 ProなのでHyper-Vなどが使えます。

メモリは標準から増やして8GBに増設しています。(メモリはいくらだったか忘れた)

CPUはCore i5-2520M(2.5GHz) 、いわゆるSandyBridge(第二世代Coreプロセッサー

ストレージはSSDに換装していました(これもいくらだったかな)

ディスプレイは12.1インチで軽量だったので持ち運ぶには非常に便利でした。

 

しかし、メモリ不足に陥ることが多かったので、メモリは8GB以上必要。ビルドも少し時間が気になることがあったので、CPUも早いといいな、という感じで新しいPCを探します。

メモリの最大搭載量

メモリが8GB越えのノートPCを探していたのですが、8GB越えということは16GBまたは32GBくらいが現実的な選択肢となってきます。

今回は、もうメモリに悩みたくない!という強い思いで32GBのマシンを探していました。

メモリ32GBというと、各社のラインナップのなかのミドル~ハイエンドクラスのマシンか、ゲーミング用PCが候補にあがりますが、結構高い(15万越えとか)

高いマシンはもちろんそれ相応のスペックなのですが、私の使い方だとその性能を必要としていない気がしていて、ちょっともったいない気がします。例えば高性能なGPUや、無駄にコアの多いCPUがあっても使いこなせる気がしません。

メモリを交換する前提で型落ち機種を探す

ということで、メモリは買った後交換する前提で、探すことにしました。

つまり、「すこし型落ちの32GBまでメモリを増やすことができるノートパソコン」にフォーカスしたわけです。

 

調べていくとDellや、Lenovoのマシンに条件を満たすものが多そう・かつ中古が市場に出回っていることに気づきました

Dellのマシンについて、最大搭載メモリー量は下記ページを参考にしました。

https://blog.takuros.net/entry/20120605/1338910909

 

Latitude 5580に決めた

f:id:inajob:20190728100941p:plain

https://japancatalog.dell.com/pd/latitude-5580-laptop.html

ということでいろいろ探し回った挙句Latitude 5580に決めました。まぁめぐり合わせと、調査の疲れの折り合うところがこれだったということで・・

  • Window 10 Pro
  • Intel Core i5-6200U(2.3GHz)
  • メモリ: 32GB(8GBから増設済み)
  • ディスプレイ15.6inch Full HD
  • 256GB SSD
  • VGA/HDMI

中古で6万くらいで購入してメモリが2万くらいだったから、占めて8万円くらい?

(↓ メモリさらに安くなってる・・今が買いですよ!)

しばらく使った感想

CPUは第2世代→第6世代までひとっとびしましたが、それにより何かがすごい快適になったという気はしませんでした。第6世代といっても末尾が「U」の低電力版だからかもしれませんが。唯一早くなったと感じたのはArduino向けプログラムのビルドかな?

 

つまり実は僕はそれほどCPUを利用する作業をしていない・・ということがわかりました。

 

メモリとストレージは劇的に良くなりました。以前だとタブをある程度開くとブラウザがクラッシュしたり、頻繁にswapが発生してフリーズみたいなことが起きていましたが、メモリが32GBあるおかげで、そのようなことは一切起きなくなりました。

普段のメモリ使用量を見ると大体16GB近辺まで使っているので、妥協してメモリを16GBにしていると、危なかったかもしれません。やはり32GBくらいが基本的人権のように思います。

大量にタブを開く+Dockerを実行 というのができるようになって、非常に作業がしやすくなりました。

 

VGAHDMIの両出力があるという点も、便利です。プレゼンを行う際などに、コンバータが不要ですし、Windows機のHDMIVGA接続はMacなどに比べて非常にタフです。(個人的な印象です)

 

悪くなった点は唯一1つ、「でかくて、重たい」ことです。まぁこれは仕方ないかな・・・32GBメモリが載せられて、12インチくらいのマシンがあればさらによかったかなと思うところです。

 

ともあれ、そんな感じで今回のノートパソコン新調は大成功だったのではないかと思っています。

 

まぁ変にケチらず、最高級マシンをバーンと買ってしまえば、このようなことをうじうじ考えなくてもよくなるようにも思うのですが、、それではなんかちょっともったいない・・ちゃんと必要なところにだけお金をかけたい・・ という謎のこだわりにより、今回のような選択をしました。

人によってこの辺の感性や、こだわりポイントは違うと思うので、ほかの人のPC選定基準も聞いてみたいと思いました。