OpenSCADによる3Dプリンタモデルの設計

はじめに

3Dプリンタ用のモデル、どうやって作っていますか?

僕はFusion360も使いますが、ここぞというときにはOpenSCADを使っています。

www.openscad.org

 

OpenSCADとは

OpenSCADはプログラムで3Dモデルを作成する環境です。プログラム言語で図形を定義することでいくつかのメリットがあります。

  • 変数が扱える
  • Gitなどのソースコード管理ツールと相性が良い
  • パーツのモジュール化などが用意

一方で、GUIによる編集ができないので直感的なモノ作りは難しいです。

僕は雑な形状をまずFusion360などGUIのCADで作ったのちに、OpenSCADを使うことが多いです。

ちょっとデモ

cube([1,1,1]);

 f:id:inajob:20190216181314p:plain

 こんな風に、立方体が作れます。

2次元の形状を定義することもできます。

square([10,10]);
circle(r=5);

f:id:inajob:20190216181606p:plain

 さらにこれを引き延ばせます

linear_extrude(height=5){
union(){
square([10,10]);
circle(r=5);
}

f:id:inajob:20190216181806p:plain

offsetを指定すると角が丸くなります

linear_extrude(height=5){
offset(3){
union(){
square([10,10]);
circle(r=5);
}
}

f:id:inajob:20190216182040p:plain

offsetを同じだけマイナスすると大きさを保ったまま角を丸めることができます。

linear_extrude(height=5){
offset(-3) offset(3){
union(){
square([10,10]);
circle(r=5);
}
}
}

f:id:inajob:20190216182120p:plain

図形同士を演算してくりぬいたりもできます。

$fn=50;
module sketch(){
    union(){
        square([10,10]);
        circle(r=5);
    }
}

linear_extrude(height=5){
    difference(){
        offset(-3) offset(3){
            sketch();
        }
        offset(-2) offset(1) sketch();
    }
}

f:id:inajob:20190216182615p:plain

まぁ、こんな感じで3Dデータを作ることができます。

 

3Dプリンタやレーザーカッターでの出力

こうやって作った3DモデルはSTL形式でエクスポートすることができるので、3Dプリンタで印刷することができます。

また2次元データはSVG形式の出力もできるため、うまくモデルを作るとレーザーカッター向けのデータも作成できます。

今私が作っているRakuChordは、3Dプリンタで作った筐体に加えてレーザーカッターでフロントパネルを作っています。

このようなデータを用意する際もOpenSCADで同じように扱うことができます。

また私の場合は3Dプリンタは家にあるのですが、レーザーカッターは持ち合わせていません。このような状況だと、まず3Dプリンタでレーザーカッター用のデータで部品を出力してみて、位置合わせをする。というのがさっとできるのがこの方法の良いところです。

f:id:inajob:20190216183318p:plain

下が3Dプリンタで作ったもの、上が同じデータをレーザーカットしたものです。

f:id:inajob:20190216183532p:plain

回路設計ソフトKiCADとの連携

さらに便利な機能としてKiCADでの外形データをdxfとしてOpenSCADで読み込むことができます。

私の場合は、下記の図でいうと白い枠線をCmts.Userなど、製造とは関係ないレイヤーに作成し、そのデータをdxfで出力してOpenSCADに取り込んでいます。

こうすることで、基板上のコンポーネント配置とぴったり合ったカバーなどを作ることができます。

f:id:inajob:20190216183955p:plain

まとめ

といった具合にOpenSCADを使うと非常に簡単に3Dデータのワークフローを構築できます。

もちろんFusion360でも似たようなことはできるのでしょうが、オープンソースのソフトを組み合わせて使おうとすると、テキストファイルとして3Dデータを扱えるというのは非常に取り回しが楽です。

しかし、OpenSCADは直感的な3Dの造形が難しく、今回紹介したoffsetを2回実行することで角を丸くするテクニックなども知らないとわかりません。Fusion360だと、フィレットや面取りはUIから簡単にできるため、そういう点ではFusion360のほうが簡単です。OpenSCAD使いの方で、こういったテクニックを知ってる人は、ぜひその知見を公開してほしいです。

私が使ってて気づいたことは 下記Scrapboxに随時まとめています。

scrapbox.io

またOpenSCADは独自の言語なので敬遠する人もいるかもしれません。そういった方にはJavaScriptで似たようなことをするOpenJSCADがお勧めです。

openjscad.org

 

最後に、今私が頑張って作っているRakuChordの紹介ページを貼って、この記事を締めます。

気になる方はぜひ見てみてください↓↓↓↓↓

inajob.github.io



 

 


 

 

ESP32ゲーム機o-bakoによるゲームのオンラインダウンロード

o-bakoにゲームのオンラインダウンロード機能が付きました!

o-bakoは、僕が作っているESP32で動作するゲーム機です。

inajob.hatenablog.jp

ゲームのオンラインダウンロード機能を作っているので、その紹介をします。

o-bakoの現在の状況

昨年5月から、ずいぶんと開発が進み、プリント基板化も行いました。

ちなみにこの基板、設計を大量に間違えており、工夫をしないと作ることができません・・

そして、3Dプリンタで筐体を作りました。

 さらに、リチウムイオンポリマー二次電池による、充電機能も付けてみました。

といってもこれは、市販の充電回路と、5V昇圧回路を組み合わせただけですが、、

f:id:inajob:20190131164124p:plain

o-bakoのランチャ

o-bakoはLuaでゲームプログラムが書けるという環境です。描画命令や、キーの入力スキャンなどの処理はネイティブ実装を行っており、Luaの関数から呼び出すことができます。

また、o-bakoのランチャ自体もo-bakoのアプリケーションの一つとしてLua言語で実装されています。要は”ランチャ”というゲームです。

o-bako-esp32/main.lua at master · inajob/o-bako-esp32 · GitHub

この150行程度のプログラムがランチャです。

f:id:inajob:20190131164705p:plain

実行するとこのようにSPIFFS上のファイルを一覧し、十字キーでゲームを選んで実行することができます。

o-bako用のゲーム

ゲームらしいゲームの例を見ていきましょう。

o-bako-esp32/main.lua at master · inajob/o-bako-esp32 · GitHub

この104行のプログラムは、ジャンプで敵キャラをよけるという単純なアクションゲームです。

f:id:inajob:20190131195313p:plain

o-bako固有の命令については o-bako Simulatorに紹介していますので参考にしてください。

 

ゲームを構成するファイルについてみていきます。

o-bako-esp32/example/jump at master · inajob/o-bako-esp32 · GitHub ここにあるように、このゲームを構成するのはgame.jsonとmain.lua、sprite.bmpです。

game.jsonはこのような内容です。

{"title":"jump", "files":["main.lua", "sprite.bmp"]}

これが、このゲームのタイトルと、依存しているファイルの一覧です。

main.luaはゲーム本体のLuaスクリプトです。sprite.bmpは128x128の256色インデックスカラーのビットマップファイルです。

ゲームのオンラインダウンロード

ゲームのオンラインダウンロードのため、まずはダウンロード可能なゲームの一覧をファイルにまとめています。

o-bako-esp32/games.json at master · inajob/o-bako-esp32 · GitHub

{"games":["jump", "loader", "downloader","doteditor"]}

このような内容です。この例では4つのゲームがダウンロード可能となっています。

 

ゲームのオンラインダウンロードを行う機能も一つの”ゲーム”としてLuaで記述しています。

o-bako-esp32/example/downloader at master · inajob/o-bako-esp32 · GitHub

主となるのはmain.luaで、120行程度のプログラムです。

このプログラムが、上記のゲーム一覧のjsonファイルを読み込みます。そして、ゲームをダウンロードします。

f:id:inajob:20190131172555p:plain 

まとめ

ESP32はWiFiが利用でき、非常に高性能なマイコンモジュールです。

o-bakoでは esp32-arduinoでluaを使う - Qiitaで紹介した方法でLuaを利用しています。

これらの強力な機能のおかげで、”インターネットからのオンラインゲームダウンロード機能”を備えた携帯ゲーム機を作ることができてしまいました。

これからもo-bakoの開発を進めていきますので、気になる方は私のTwitterアカウントina_ani (@ina_ani) | Twitterと、このブログを要チェックです。

 

 

 

2018年まとめ

f:id:inajob:20181228182232p:plain

所感

今年はなんといってもRakuChordのキットを販売できたのが大きかったです。昨年試行錯誤していた3Dプリンタのノウハウがようやく生きてきたのを感じます。来年もバージョンアップして売りたいな、と考えています。まだ形になっていませんがESP32を使ったゲーム環境o-bakoにも力を入れました。これは来年も継続して取り組みたいです。

また、このはてなブログの記事のうち2つの記事で非常にたくさんのブックマークをもらうことができました。

去年の反省で、”もう少しWeb系の活動がしたかった”と、書いていたのですがまぁこの2つ目の記事で実現できたかなと思います。

それと、半分仕事ですが、KubeWeeklyで紹介されている記事を読んで、一言感想を書いてQiitaに投稿する。という活動を継続して行うことができました。 → KubeWeekly 13 posts - Qiita

おかげで「英語の技術文章をさっと眺める」ということが抵抗なくできるようになってきました(理解できるとは言っていない)。次はリスニングについて抵抗をなくしていきたいところです。

体調不良は相変わらずなのですが、今年は新たなるチャレンジとして「ダンスダンスレボリューションを毎朝する」というのをはじめました。来年はもう少し健康でありたいです。

 

このブログは、今までは”自分の作ったもの”を記事として投稿していたのですが、今年は”自分の買ったもの”、”旅行記”についても投稿してみました。今後も面白いものを買ったり、変わった旅をしたときはそれも投稿していくつもりです。 興味のある方はぜひ読者登録してみてください。

ステータス

  • 引っ越してから2年目
  • 会社に入ってから9年目(来年度で10年目)
  • 結婚してから2年ちょっと

今年学んだスキル

  • 電子工作キットの販売
  • 英語の技術記事をざっと読める
  • ESP32

月別振り返り

今年はTwitterでのみ製作報告した取り組みが多かったので、少し細かい粒度でまとめてみました。

1月

  • 映画オデッセイを見る
  • PIC32に挑戦しようとして挫折
  • おうちKubernetes増強
  • 豆苗を育てるブーム
  • 3Dプリンタを簡易的な箱で覆う
  • 瞑想中 作る 

  • Arduboy Writerを作る

inajob.hatenablog.jp

 

  • タッチパネルキーボードを作る

inajob.hatenablog.jp

 

  • モバイルRaspberryPiを作ろうとする

  •  鼻笛に興味を示す。
  • 月蝕

2月

inajob.hatenablog.jp

 

inajob.hatenablog.jp

inajob.hatenablog.jp

  • ESP8266で和音

inajob.hatenablog.jp

  • T.Chordstrumを発見する
  • 布教用RakuChord完成
  • RakuChord紹介動画作成

www.youtube.com

  • RakuChord公式ページ作成

inajob.github.io

  • リビング改造 こたつ机からちゃんとしたデスクに!
  • FM音源ボードを購入してRakuChordから鳴らしてみる

www.youtube.com

  • フィラメント送り用の補助具を作った

3月

  • 掃除しないルンバ

inajob.hatenablog.jp

  • RakuChordのキット組み立て手順作成

inajob.github.io

  • シャープの電子ノートを購入
  • Osushiが流行る
  • OctoPrintのホストをRaspberryPi3に変更 遠隔プリントの準備が整う

  •  映画 her を見た
  • 名前入りキャンドルを作る

  •  納豆ボタン日本語対応

  •  モバイルRaspberryPiをつくろうとする

  •  組みひも作り器の糸巻をつくる

  •  蕁麻疹に悩む(結局花粉症だったのかな?)

4月

  • 掃除しないルンバをしゃべるようにした

  • ESP32初購入
  • ヤマハFM音源チップYM2413を購入(仮組みしただけで放置)
  • T.Chordstrumを購入した。

www.youtube.com

  • ケースも作った

  •  ESP32で豊四季TinyBASICを動かしてみる

  •  ESP32でLuaを動かしてみる

  •  本を開きっぱなしにするやつを作った

  •  倉敷観光からの帰省

5月

  • 風邪っぽい症状
  • Arduboyに自分の名前が入っているようで感動

  •  木製フィラメントを購入

  •  o-bakoシミュレータの開発

inajob.hatenablog.jp

6月

inajob.hatenablog.jp

  • RakuChordを貸し出して、演奏してもらう。うれしい。 

  •  m5stackを購入
  • 電子工作合宿
  • esp32-arduinoluaを使う 

qiita.com

qiita.com

  • makeに向けてキットを作り始める

7月

  •  腹痛からののどの痛み、風邪
  • RakuChordのケースをレーザーカッターで作れないか試行錯誤

inajob.hatenablog.jp

8月

  •  MakeにてRakuChordの販売

  •  RakuChordキット販売への道のり

inajob.hatenablog.jp

9月

inajob.hatenablog.jp

  • 平塚旅行 

inajob.hatenablog.jp

  • o-bako実機の作成

10月

  • 毎時新聞

inajob.hatenablog.jp

  • RakuChordディスプレイテスト

  • 技術書展お手伝い
  • o-bakoテストのためにソフトを書いてみる

  •  コメを炊く必要があることを知らせるやつ作った

  •  RakuChordで演奏してみた動画を作った

www.youtube.com

11月

inajob.hatenablog.jp

  • テレビチューナー購入

inajob.hatenablog.jp

  • さくら展に行った
  • Qooboが届いた。
  • 出張で中国へ
  • 映画 レディプレイヤーワン 見た
  • 映画 カメラを止めるな! を見た
  • 同人ハードウェアミートアップに参加
  • Wiiのセンサーバーを固定するやつ

12月

  • ESP32でタッチパネルと液晶

  • のどが痛い からの体調不良(熱は出なかった
  • OrangePicoPocketを購入

  • HackDayの全作品をまとめた 

scrapbox.io

 

参考

テレビチューナーを買った

いんとろ

買ったエントリばっかり続いていますが、テレビチューナーを購入しました。

何を隠そう僕は高校生くらいの時からテレビのない生活をしてきたので、テレビにはめっきり詳しくない、、、 そんな僕の奮闘を記録しておきます。

要件

  • テレビ番組が見たい(妻が年末のガキ使が見たいと言っている)
  • ものを増やしたくないのでディスプレイはパソコン用のものを流用したい
  • うちのディスプレイはDVI-DかVGA接続ができる

調査

HDMI接続あり、という絞り込みができたので、ここを参考にする。

kakaku.com

 

ちなみにHDMI接続にこだわらないとこんな感じ。

kakaku.com

 

  • 1万円程度のチューナーはコンポジット出力のみ
  • 2万円程度からHDMI接続をサポート
  • 上には上がいる

決める

コンポジット出力されたものをVGAやDVI-Dに変換するという手もあるが、なんか負けた気がするのと、しょぼい地デジチューナーは旅先のホテルとかで触ったことがあるが、すべてにおいてもっさりなので、中くらいの性能のものがいいな、、などと考えた結果、HDMIをサポートしていて一番安そうな

 こいつに決定!

テレビは難しい

B-CASカード

よくわかっていないが、これを刺さないとテレビが見られないらしい。地デジの信号はなんか暗号化か何かされていて、このカードを使ってそれを複合化している、、という認識。

HDMI変換

このチューナはHDMIを出力しますが、我が家のディプレイはDVI-DかVGAしかサポートしていない。(もっと詳しく言うと我が家には2つのディスプレイがあり、1つはVGAとDVI-D、もう一つはDVI-Dのみサポート)

ということでHDMI → DVI-D or VGAの変換が必要となる。

HDMIからDVI-Dは普段から使っている。 

ELECOM HDMI DVIアダプタ AD-HTD

ELECOM HDMI DVIアダプタ AD-HTD

 

 こういうやつ。

しかし、、これ、音声はどうなるのか・・。

パソコンの場合は音声端子は別にあるのでそっちを使えばよいが、今回のチューナはHDMIから映像と音声を出力することしかできないようだ。

つまり、HDMIから音声を分離する必要がある。

DVI-Dはひとまずあきらめて、VGAだとこういう製品がある。

このアダプタ、すっきりしそうだが、USBで給電する口がある、配線だらけになるな・・と思っていたが、実際接続してみるとUSB給電しなくても動作した。HDMIバスパワーといった仕組みなのだろうか・・ まぁ動いたからいいや。

 

たくさん探したけどHDMIをDVI-Dとオーディオに分離するアダプタは見つからなかった。

 

買っていないけど、こういう商品で一度オーディオを取り出してHDMI-DVIアダプタでHDMIをDVI-DにすればDVI-Dとオーディオになるのかな・・つらみ

まぁとりあえずはVGAで良いことにする。

同軸ケーブル

チューナーを購入して、いそいそと設置準備をしているときにふと気づいた、、「同軸ケーブルがない」部屋の壁についているテレビアンテナからのコネクタをチューナにつなげるためのケーブルです。我が家の場合は5mくらい必要そうです。

ということでそれも購入 

 こういうやつ

さて、チューナの後ろを覗くと、同軸ケーブルを刺すところが4つもある!

  • 地上デジタル出力 これはテレビにつなげるときの線で使わないはず
  • BS・110度CS出力 これもテレビにつなげるときの線で使わないはず
  • 地上波デジタル入力 これは入力らしい、それっぽい
  • BS・110度CS入力 これは入力らしい、それっぽい

ん?同軸ケーブルを刺す箇所が2か所ある。しかし壁には1つしか穴がない。

始めに間違えてBS・110度CS入力にさしてしまったが、番組スキャンがすべて失敗した。

その後地上波デジタル入力に刺したところ地上波デジタルの番組が視聴できました。

 

試していないが、こういうコネクタで「分波」してやれば見られるようになるのだろうか、、謎技術だな・・

HORIC アンテナ分波器 BS/CS/地デジ対応 白ケーブル2本付き(S-4C-FB) 40cm  BCUV-971

HORIC アンテナ分波器 BS/CS/地デジ対応 白ケーブル2本付き(S-4C-FB) 40cm BCUV-971

 

で、無事PCモニタへVGAケーブルで接続してテレビを見ることができました。

スマートフォンからの視聴 

このチューナ、スマートフォンからも視聴できるようで、LANケーブル端子がついています。

せっかくなので設定して、iPhoneに視聴アプリを入れてみてみました。見れる!しかもチューナが2つ内蔵されているので、2端末から見れるらしい!

 

ちなみに妻はAndroid端末を持っているが、USBデバッグがONだと視聴アプリは起動できないらしい。テレビアプリともなるとその辺厳重になるのだな。

PCからの視聴

スマートフォンから見れるのだから当然PCからも見れる、、と思って調べてみると、、

Windowsの場合は1世代前のアプリが使えるようだ、、 お、、おう

Macの場合はアプリが提供されていない

スマフォファースト、ということか。って、PCからみられるならHDMI接続なんて頑張らなくてもPCで全画面表示すればよいじゃないか!とおもってそれも試してみる。

しかし、、ノートパソコンのメインディスプレイだと受信できるが、外部ディスプレイで表示しようとするとみられない。どうやらノートパソコンと外部ディスプレイの接続がVGAなのが気に入らないらしい。著作権保護信号的なものがサポートしていないディスプレイには表示できないということか・・?

僕のノートPCにはVGA端子しかない、妻のノートPCはMacBookなのでそれもダメ。まぁいいや直接つなぐから。

まだ試していない機能

どうやらこのチューナUSBでハードディスクを接続すると「録画」ができるらしい。今のところ空いているHDDを持っていないので、後で試そうと思うが、これは非常に役立ちそうだ。

また、スマートフォンからの視聴は設定を適切に行えば出先からもできるらしい。すごい通信量になりそうだが・・。リアルタイムではなく録画したものをスマートフォンに転送しておいて、見ることもできるらしい。これは通勤時間にお気に入りの番組を見ることができそう。まぁまだ見たい番組がないけど

テレビを買って気づいたこと

テレビがある生活というのは、17年ほどしてこなかった、もちろん友人の家や親戚の家で見ることはあったが、そんな僕の感想

  • テレビは常にさっと付けられることが価値の一つ(うちはPCディプレイがプライマリなので、この状態にはなっていない、切り替え機とかを買うのが良いのかな。)
  • 新聞のテレビ欄はテレビ番組を見るのに最適なUI、テレビ自体の番組表はいろいろつらい
  • テレビは基本的に見たい番組がない。ごくまれに見たい番組があるが、時間を合わせるのが大変なので録画が重要

 毎週のお気に入りの番組でもあればまた気持ちも変わるかもしれない。

テレビがないとき僕はどうやって動画コンテンツを視聴していたかというとYouTubeGyaoやAbemaTVで見ていた。

わざわざ録画をして見るより、インターネット上のコンテンツの好きなものをタップして見始められるほうがはるかに簡単だ、残るは番組の魅力だが、これはまだ僕のテレビ経験が浅いため今後に期待といったところ。

さて、来年の自分がテレビを活用できているのか、否か・・

 

 

 

1万円未満で始められる!自宅ダンスダンスレボリューション!

ふと家でダンスダンスレボリューションがやりたくなった

なぜだかやたらとダンスダンスレボリューション(以下DDR)がやりたくなったので、一式そろえてみました。

f:id:inajob:20181118155207p:plain

昔友人の家で遊ばせてもらったことはあったけど、飽きるまでやったことはなかった・・大人になった今、欲しいものは買える!!! という反動のようなものがあったのかもしれません。

DDRはどうすれば遊べるか?

DDRを遊ぶためには、コントローラか、専用マットが必要です。僕は専用マットで遊びたかったので、マットも含めて調達する必要があります。

調べたところ次のゲームハードでDDRが遊べるようです

PS/PS2

PSとPS2は両方でDDRがリリースされている。ただ、PS2だとしても結構古い。PS3,PS4も互換性があるので、どれかのPSがあれば遊べそう。しかしPS3,PS4は比較的新しいため中古だと少し高い気がしました。逆にPS2やPSは古いので、故障が心配です。(主観です)

GameCube

GameCubeでもDDRがリリースされていたようです。しかしWiiの中古が十分に安いのでGameCubeをあえて選ぶこともないかな。

DreamCast

DreamCastでも遊べそうですが、中古、、あるかな?

Wii/WiiU

Wiiでも遊べます。WiiUも互換性があるので遊べそう。

 

ここまで調べたところで、独断と偏見でWiiにすることに決めました。特に専用マットの経年劣化が心配なため、比較的新しいハードウェアが良かったのです。ちなみにWiiは2018年3月にオンライン機能が実質終了しているので、価値がガクンと落ちているようです。

 

価格.com - 任天堂 Wii [ウィー] シロ (Wiiリモコンプラス・Wii Sports Resort同梱) 価格推移グラフ

f:id:inajob:20181118155303p:plain

家に元からあるもの

  • パソコン用ディスプレイ(HDMI接続できるやつ)
  • スピーカ

買い物

Wii中古は「すぐ遊べるセット」などと銘打って2000~3000円で販売されています。(付属品の有無に注意してください)

Amazon.co.jp: こちらもどうぞ: Wii本体 (シロ) (「Wiiリモコンプラス」同梱) (RVL-S-WAAG)【メーカー生産終了】

続いてDDR専用マット

Amazon.co.jp: こちらもどうぞ: Wii用 ダンス ダンス レボリューション コントローラ

こちらは2600円程度で販売されています。

また、我が家にはテレビがなく、パソコン用のディスプレイのみがあります。通常Wiiはアナログ端子でテレビと接続します(赤、白、黄のケーブルのやつ)。しかし次の装置を使うことでHDMI端子でも接続できるようになりました。 

最後にソフトウェアです。

Wiiでは複数のDDRタイトルが出ており、 最後に販売されたMUSICFITが最も高い(中古で5000円程度)ですが、収録曲も多いようです。 

しかし、私はなるべく安く遊びたかったので、次のソフトを購入しました。

 こちらは中古で1000円程度で購入できます。

 さて、ゲーム機本体+専用マット+ソフト+HDMI変換器 がそろったので、これでDDRで遊ぶことができます。1万円かからないくらいで、DDR環境を用意することができました。

 

Wii版のDDRは足だけでなく、両手を振るアクションもあって、それはそれで面白いです。(オプションでOFFにすることもできました)

感想

ひさびさに遊ぶDDRは思った以上に体力を使いました。普段から運動不足を自覚しているので、うまく生活に組み込んで楽しんで体力をつけることができればと思っています。ダイエットモードというものもあるようなので、慣れてきたらそっちも遊んでみようと思います。

 

あ、あとWiiで面白いゲームタイトルがあれば教えてください!

Kubernetes上で動くマイクロサービスとして「毎時新聞」を作り直した

これは何?

f:id:inajob:20181020191454p:plain

インターネットの世界が常に気になるけれども、ずっと見ているわけにはいけません。例えば私は仕事をしているときはTwitterをずっと眺めているわけには行きません。

 

そんな人に向けたサービスが「毎時新聞」です。
Twitterで盛り上がっている画像や、トレンドワードを1時間ごとに集約します。
寝る前に今日のページを見ると 大まかなインターネットの盛り上がり方を知ることができます。

 

実はこれ、以前も作ったことがあります。

inajob.hatenablog.jp

数年運用したのですが、最近Closeさせてしまいました。で、今回また作りました。

デモ

こちらからアクセスすることができます。

page.inajob.tk

 

こんな感じで、1時間ごとにTwitterで流行った画像を閲覧できるサービスです。

ちょうど10/20の8時で、シンカリオンの画像がはやっている様子がわかります。

f:id:inajob:20181020191234p:plain

 

 もうひとつ10/21 9時、皆さんご存知ニチアサタイムが観測できます。

f:id:inajob:20181021094824p:plain

仕組み

今回はKubernetesクラスタ上で動かすマイクロサービス群として実装してみました。

Kubernetesクラスタは以前紹介した方法で作成したものです。

inajob.hatenablog.jp

トレンド取得部分(trend-checker)

肝となるトレンド取得は、TwitterのStreaming APIを利用しています。

GET statuses/sample — Twitter Developers

一般利用なので、すべてのTwitのストリームを取得できませんが、そこそこたくさんのデータが流れてくるので、ここに流れてくる画像を含むTwitの数を数え続けるアプリケーションをGo言語で書きました。

このアプリケーションはメモリ内にランキングを保持しており、外からHTTPでアクセスすることで、このランキングを取得することができるようになっています。

ランキング取得とスコアリングのバッチ処理

上記トレンド取得のAPIを1時間ごとに呼び出して、その結果をファイルとして保存する仕組みです。これにはKubernetesのCronJobの仕組みを利用しています。

さらに、いかがわしい画像などを判定するためのスコアリングを計算するために後述のNFSW APIを呼び出して、ランキングデータにスコアデータを付け足します。

NSFW API

毎時新聞を作った時に気づいたのは「エロ画像が多い」ということでした。

まぁそれも毎時新聞の醍醐味なのかもしれませんが、せっかくなら分類してみたい、、ということで調べているとYahooが公開しているOpen NSFWというモデルがあることを知りました。

 

github.com

これは最近はやりの機械学習の仕組みで、エロ画像など職場で見るにはふさわしくない(NSFW:Not Safe For Work)な度合いを判定してくれるものです。

さらに、このOpen NSFWをWebサーバとして利用できるように改造したものを作ってくれた方がいたのでこれを利用することにしました。

blog.kksg.net

フロントエンド

ここまでで、NSFWのスコアのついた毎時の画像ランキングデータがファイルサーバに格納できました。後は表示するだけです。フロントエンドはJavaScriptを使って、ブラウザ上で画面を組み立てるようにしました。

NSFWのスコアによる表示の有無もブラウザで判定しています。

図解

f:id:inajob:20181020190320p:plain

図にすると結構壮大な感じになりました。

まとめ

以前作ったものと同じ内容のサービスですが、Kubernetesを利用したマイクロサービスとして作ることで新たな学びがたくさんありました。

このように役割ごとにマイクロサービス化することで、改良もしやすく、また別の何かを作るときもここで作ったマイクロサービスを機能として取り込みやすい作りになったと思います。

おまけ

ここまでの説明で、気づいたかもしれませんが、フロントエンドのコードをちょっと変えるだけで「裏モード」を作ることができます。「裏モード」とはつまりNSFWのスコアの高いものだけを表示するようにした毎時新聞です。 いろいろまずい画像が表示されますので、注意してアクセスしてください。

page.inajob.tk

平塚旅行してきました

8月に平塚旅行に行きました。

f:id:inajob:20180909140523p:plain

僕は関東圏に住んでいるので、平塚はそんな遠いところではありませんが、前日夜入りして翌日は平塚観光をし、さらに1泊し翌々日に帰宅という2泊2日の日程での旅行でした。

f:id:inajob:20180909141431p:plain

 

Day0

仕事終わりに平塚に移動。そのままホテルに向かいました。夕食は

”なまらうまいっしょ 平塚駅北口店” で食べました。

www.namara-umaissyo.com

 

f:id:inajob:20180909141243p:plain

Day1

この旅の一番の目的地「平塚美術館」にいきました。

www.city.hiratsuka.kanagawa.jp

 

f:id:inajob:20180909141514p:plain

この金魚実は全部絵です。

f:id:inajob:20180909141549p:plainf:id:inajob:20180909141639p:plain

素人にもわかりやすい 美術というより技術デモを見ている印象の作品でした。

作成年代別に作品が展示されており、徐々に様々な技法が確立していく様子が技術の進歩を見ているような感覚でした。

 

昼ご飯は平塚のソウルフード(らしい)ラオシャン(老郷)ラーメン!

老郷(ラオシャン)|神奈川県平塚市50年伝統のラーメン |

f:id:inajob:20180909141907p:plainf:id:inajob:20180909141937p:plain

酢が入っているというスープと、とても淡白なそうめんのような麺が独特で、おいしかったです。

 

その後図書館を見に行きました。かなり大きな図書館でうろうろしているだけで楽しかったです。

特に事典系が別の階で扱われており、そこの本は普段図書館で見ない(気づかない?)ような本が多く興味深かったです。

f:id:inajob:20180909142159p:plain

それからホテルに戻り、少し休憩(昼寝)

その後、これまた平塚名物(らしい)「都まんじゅう」を食べました。

調べてみるとこの「都まんじゅう」は八王子などでも買えるらしく、同じ製造機械で作ったものはすべて「都まんじゅう」というようです。

都まんじゅう - Wikipedia

f:id:inajob:20180909142451p:plainf:id:inajob:20180909142516p:plain

これがその製造機 2週回って饅頭が出来上がる様子は見ていて飽きません

f:id:inajob:20180909142552p:plain

夕食までもう少し時間があったので、せっかく海まで来たので海岸に向かいました。

f:id:inajob:20180909142904p:plain

夕食は平塚近くの友人を交えて、それらしい雰囲気の喫茶店で食べました。

Day2

2日目はほぼ帰るだけの予定だったのですが、少し元気があったので隣の大磯にあるらしい「めしや大磯港」に向かいました。

「めしや大磯港」では港らしくおいしい魚料理を食べることができました。(当日は時化だったらしく、小田原港で取れた魚のようでしたが・・)

かなり有名な店らしく、開店前の11時ごろから人が並んでいました。

ホーム - 大磯漁協直営! めしや 大磯港

f:id:inajob:20180909143247p:plain f:id:inajob:20180909143306p:plain

で、帰る前に喫茶店で一服し

f:id:inajob:20180909143540p:plain

グリーン席で帰ってきました。Suicaでグリーン席に乗ったのは初めてで、天井にあるSuicaマークにタッチするという初体験をしました。

f:id:inajob:20180909143611p:plain

まとめ

関東圏に住んでいながら、同じく関東圏への旅行というのは案外良いものだなと思いました。

また、旅行中Twitterで平塚にいる旨を発現したところ、followしている友人から平塚の観光スポット情報をもらうことができ、充実した旅行にすることができました。

あと、なんといっても平塚付近の友人と旅先で一緒に食事できたのが良かったです。

最後に旅に誘ってくれた妻に感謝です(言ってみたかった)