UE4で使える"つよい"mosquittoライブラリ

github.com

なんとBP上で扱えるらしい(GitHub説明画像より)

そもそもMosquittoって広く知られているソフトウェアかよくわからない(自分も最近知った)なので、まずはそこから

Mosquitto(MQTT)とは

MosquittoはMQTTというメッセージングプロトコルを、EclipseC++オープンソース実装したものです。

mosquitto.org

C++なので、UE4に組み込めるってわけですね。

んで、そのプロトコルであるMQTT(Message Queue Telemetry Transport)ですが、IBMが1990年代後半に開発した、信頼性の低いネットワーク上で動く低性能のデバイスで実現する軽量で柔軟なプロトコルです。

www.ibm.com

MQTT概要

それが公開された現在は、Publish/Subscribeの単一のメッセージに対して多数のクライアントが受信できる形をとっています。そのために、Brokerと呼ばれるサーバー役を立てる必要があります。
クライアントはBrokerに接続し、必要であれば接続後の任意のタイミングでSubscribeをします。この時、「Topic」を指定します。このトピックはメッセージに付けられるタグのようなもので、タグとは違い階層構造を取れることです。また、複数指定することもできます。
接続したクライアントがメッセージをpublishしたい時は、メッセージと共に上記のTopicをBrokerに送信します。すると、そのTopicをSubscribeしている全てのクライアントはそのメッセージをBrokerから受信します。

Topicで区別するだけなので、接続するデバイスの組み合わせごとにソケット通信を立てる必要がなく、雑に送受信できるのが良いですね。Brokerが必要ですが....(PublicBrokerというものが建っており、それを利用することもできる。Publicなので不特定多数の人間がつないでるけど...)

UnrealMosquitto

表題のやつです。
Broker機能は無いですが、クライアント機能は実装されており、BPからも振る舞いを実装できます。
個人的には受信時の振る舞いをBPで雑に実装できるのがアツいですね。なにかしらのデバイスからの情報をUE4でカッチョイイ感じに可視化したい時とかは使えるんじゃないでしょうか。どうせデバイスのログは軽量な別ソフトでしょうし。そのネットワークにMQTTで簡単にjoinできるのはアツい。熱盛っ!

ちょっと重要な内容ですが、余談を。
実は現在の状態だと4.20でビルドできなかったりShippingできなかったりと諸々問題があるのでPullRequestを出させていただきました。もしこれから使われる方がいましたら、そのへんにご気をつけください。

おわり

MQTTで気軽にjoinして積極的にUE4でビジュアライズしていこう💪
MQTTに表面上似たものとしてAdvanced Message Queuing Protocol(AMQP)があります。こちらはその中にも種類が分かれており、中にはサーバー役の必要ないZeroMQもあります。

im@sparqlのドキュメントみたいなの書いてる

im@sparql.doc

タイトル通りです。

以前から、im@sparqlが気になってはいるのもののSPARQLとかわっかんねぇな?というお話をいただいており、どげんかせんといかんと思いながら放置していましたが、IM@S Engineer Talksでちょっと話題になったこともあり使命感を感じて開設しました。

内容

Getting Started

  1. im@sparqlとは
    im@sparqlの思想みたいなのを書いた、よくある意識高いページ。
    一番最初にありますが、im@sparqlのあとがきみたいなものです。
  2. 触れてみる
    im@sparqlを使う上で欠かせない要素のSPARQLを解説する部分。
    データベースの大枠に触れる、未経験者には難解なクエリですが、次項以降のサンプルクエリを読み解けるように解説しました。
  3. 使ってみる
    データベースの中身を一切知らない状態から、千早さんのプロフィールを取得するまでの流れを3STEPで解説しています。
    SPARQLのクエリの組み方が分かれば幸いです。
  4. 組み込んでみる
    完成形のWebページを例に、実際にオープンデータベースとしてWebページから活用する方法を解説しています。
    Http通信でJSONが取得できるので、そのへんに慣れてる人には退屈な内容です。
  5. 貢献する
    GitHubに公開されているim@sparqlのデータベースの中身を解説しています。
    中身が読めればクエリも効率的に立てやすくなるでしょう。
    また、データベースに足りない情報を補うのを手伝っていただければ幸いです。

Query Samples
クエリ集みたいなのも置いていければ...
まだどういう風に置くか未定。Gist.GitHubをただただ貼れば良い?

締め

これをきっかけに、im@sparqlを活用していただければと思います。
それと、活用した何かを作った時、もし良かったらに報告してもらえると嬉しくなります。

こいついっつもim@sparqlの話してんな?

IoT(Idol of Thing)でRasPiに千早さんもどきを宿らせる

f:id:crssnky:20180710221717p:plain
はい。
そんなことはみなさんご存知でしょうね。

今年から一人暮らしなので、お部屋ではやりたい放題なのでは?!と思い、1年以上買って寝かせてたRasPi3を取り出しました。
イマイチ使いみちが見つから無かったのですが、ここらでいっちょRasPiならではのことに挑戦していきます。

注意:技術の説明じゃないので、こんなアイデアどう?ってスタンスで見てください

作りたいのはこちら f:id:crssnky:20180710222151p:plain
こんな感じでですね、自宅に入ったら「おかえりなさい」と声をかけてもらえるシステムですね。

センサー

センサーはドーム型の人感センサー、
"HC-SR501"
を使います。(Amazonとか秋月でご参照ください...)
f:id:crssnky:20180711225930j:plain
こんな感じで自室ドアに貼り付けます。1Kなので自室ドアで良いんです。
こいつには、電源・GND・信号の3つの端子があります。単純でありがたいですね。
また、センサーが反応してから次にアクティブになるまでの間隔と、反応強度を変更する可変抵抗も付いています。
ご自分の気分で調整してください。

配線

諸々の配置の関係で、RasPi3は逆側の壁際に設置してます。
そのため、5m近い長さの線が必要になりました。
自作するしかねぇ! f:id:crssnky:20180711231709j:plain
というわけで、某電気街で買ってきました。圧着ペンチはAmazonだけど。
"エンジニア 精密圧着ペンチ オープンバレル端子用 PA-20"

頑張ることもなく、3色の線が完成です。
f:id:crssnky:20180711232229j:plain
配線しましゅ。 f:id:crssnky:20180711232432j:plain
これでハードウェアはOKですね。

プログラム構成

後々の機能拡張を見据え、WebからRasPiを制御したいと思い、
I/Oが制御できる環境を探しました。
それがこの、Pythonで動くWebフレームワーク「bottle.py」です。
売り文句として、

  • 軽い
  • 早い
  • 単一ファイルのimport(pipしなくてもいい)(pip版もある)
  • 依存関係ない

らしいです。 これを使ってWebのViewerからI/Oの制御までを行います。
今回で言えばこんな感じ f:id:crssnky:20180714002244p:plain
ってなんの説明にもなってない画像ですね。
とりあえず、Pythonのコード内の時間とかで制御する時の変数をWebから書き換えるってことを今回はやらせていってると思ってもらえれば。

f:id:crssnky:20180714013108p:plain
これ実際のコードです。汚いけど見られてもまずいものはないはず。
テンプレートエンジンだったり、CSSなどのファイルがキッチリロードできるようにだったり、http通信のモジュールだったりをimportしています。
また、時間による動作はapschedulerBackgroundSchedulerを使っています。これにより、cron的な日時に合わせて動作を行うことができます。

書いてはいなかったですが、起床アラームの機能も付与しており、"Alerm"系で表しています。
AlermConf, WelcomeBacktimeConfでは、現在設定されている時間を渡しています。
見た目はこんな感じ f:id:crssnky:20180714015049p:plain
RasPiは良いですね。AppleBonjourが入っていれば、ローカルのRasPiに対してraspbery.localでIPから代替できますから。
それは置いといて、こんな感じでViewerの方も作りました。
自分しか使わないので、CSSも無しです。
渡された現在設定の時間を表示し、代わりに新たに設定したいものを渡せるようにしています。
Python側でPushされた更新したい時間を受け取り、内部変数を書き換えてスケジューラーを更新することで完成します。

というわけでできたものがこちら

node.jsで、im@sparqlに当日の誕生日を訊いてつぶやくやつ+

1個前の記事のやつ、誕生日のアイドルのプロフィールを画像化してくっつけたら良いのでは??と案をいただいたので、実装しました。

画像生成に使用したのはwebshotというパッケージ。

github.com

なんか関数一発でまぁまぁ良いサイズで撮れたので採用しました。
あと、コールバックが増えてきたので、Qも導入しました。

やってることとしては、1つ目のthenでは、まずrequestを使ってSPARQLをたたきます。
2つ目のthenで、取得したjsonをforEachします。本当は、Q.all()みたいなの使えばよかったんですが、一つ前のthenから受け取ったものを使ってall()を回すのが分からなくて、thenの中でforEachし、indexとlengthが等しければresolveして抜けるようにしました。
forEachでは、json内にあるプロフィールのURLをスクショして鯖に保存しています。なんでファイルに残しているかというとデバッグ用です。
また、同時にTwitterにアップロードもしています。その結果得られる画像のIDを配列に保存してそれを次のthenに渡します。
次のthenでは、実際にツイート内容を作成してつぶやいています。mediaは調べたら、stringで、","区切りで良いみたいです。

以下、gist

node.jsで、im@sparqlに当日の誕生日を訊いてつぶやくやつ

GW初日です(あでぃしょなるたいむ)。

いつもは朝早くに出勤しないといけないので早めに寝るのですが、
GWなので深夜にコーヒー淹れてのコーディングを楽しみました。

内容はほとんどim@sparqlの誕生日表示のコピペですが、
なんか僕のアカウントでつぶやかせたかったのでnode.jsで書きました。

やってることとしては、今日の日にちを含む(=一致する)誕生日のアイドルを訊いて、
名前とim@sparqlの詳細表示サービスのURLを貼る感じですね。

余談ですが、
サイト開始時からある誕生日表示機能も、DBに283アイドルを追加したら勝手に283アイドルも誕生日表示してくれたので、 やっぱSPARQLというか、Linked RDFのオープンデータとしての利点が冴えてんなぁと思った4/25(櫻木真乃の誕生日)

以下、gist

THE IDOLM@STER MILLION THE@TER GENERATION 05 夜想令嬢 -GRAC&E NOCTURNE- 辞典

目的は物語を読む上での知識を提供するものであり、 物語に対して考察をしたものではありません。 なんとなく知りたくなった単語をピックアップしています。
主にWikipediaとかWeblioとか...

皆様がこの物語を受け取る手助けになれば幸いです。

昏き星、遠い月

「昏」

  1. 日暮れ、日没直後の時間帯「黄昏時」
  2. 道理にくらいこと「混迷」 → 専門外なこと
  3. 目がくらむ「昏倒」

ニュアンスとしては、見通しが良くないこと(?)

「獨」

「独」の旧字体

夜想令嬢 -GRAC&E NOCTURNE-

GRAC&E

たぶん、英単語"Grace"。間に挟まる"&"とは...
1. 優美,優雅,気品,しとやかさ,上品
2. (上の立場の人が示す)親切,好意,思いやり
3. [公爵・公爵夫人・大司[主]教の敬称に用いて] 閣下,閣下夫人,猊下(しかし、今回の地位は"伯")

NOCTURNE

日本語訳:夜想曲

  • 主にピアノ独奏曲
  • 語源はラテン語「夜」→ 「nox」
    nocturnusでnoctū (“by night”) + -rnus (単数男性形主格)

おそらく、"夜想令嬢"と"grace nocturne"は対訳関係

第一幕

ヴァンパイア

吸血鬼。

民話や伝説が広い範囲で存在するが、現代日本人が一般的に想像する吸血鬼は、創作物の影響が強い

  • 葬られた死者が、その肉体で人間や家畜を襲う
  • バルカン半島スラブ人地域では、4世紀頃既に信じられてた 血を飲む、銀を恐れる、退治(殺害)方法までも確立されていた
  • 一般的な吸血鬼像は、古代ルーマニアから続くものである
    • 吸血鬼に殺されると吸血鬼になる

Prelude

  1. 前ぶれ,前兆
  2. 前奏曲
  3. 語源:ラテン語「前に演奏する」の意

「終焉の無い呪い」への前触れであり、
"-GRAC&E NOCTURNE-"のシナリオの前奏曲でもある

クリスティーナ

女性名。 「キリスト教徒」を意味する古代ギリシア語 Χριστιανός(christianos)に由来し、そのラテン語に転訛した形である christianus の女性形が christina である。

エドガー

ヨーロッパの男性名。
古英語のead(富,幸せ,豊かさ)とgar(槍)を由来とする。

エレオノーラ

元は、「エレオノーレ(Eleonore)」
ヨーロッパで用いられるプロヴァンス起源の女性名。
イタリア語圏で、エレオノーラ(Eleonora)となる。

プロヴァンス
フランス,イタリア,モナコにまたぐイタリック語派

アレクサンドラ

ヨーロッパの女性名。
アレクサンドロスに由来する男性名(アレクサンダー,アレクサンドルなど)の女性形。

アレクサンドロス
ギリシャ人の人名であり、古典ギリシャ語で「男達を庇護する者」を意味する。
元来はギリシャ神話で戦場における戦士の庇護者である女神、ヘーラーの称号の1つであった。

ノエル

  1. フランス語でクリスマスの季節や歌のこと
  2. ヨーロッパ系の男性名(NoëlまたはNoel) 女性形はNoëlleまたはNoelle

辺境伯

国境付近に防備の必要上置いた軍事地区(辺境地区、辺境伯領)の指揮官として設けられた地方長官の名称

異民族と接しているため、他の地方長官よりも広大な領域と大きな権限が与えられており、一般の地方長官である爵位よりも高い地位にある役職とみなされていた。

魔除けの香

魔除けの香→ハーブ+魔女....?

  • 魔女狩り:15世紀から18世紀(科学の発展)まで

ポマンダー:中世(特に16世紀)に流行した香り玉

  • 香りと健康は関連性があるとされていた
  • 金属の装飾品の中にハーブやスパイスを詰め、魔除けとして持ち歩いた

不浄を祓う剣の使い手

魔を払う・不浄を祓うと言えば
一般的だった鋼と比べ比重が大きく高価であるため、貴族としても剣士としてもアレクサンドラは優秀

鋼:8.95[g/cm^3]
銀:10.50[g/cm^3]

ヴァンパイアハンター

スラブ人に伝わる吸血鬼と戦う宿命を持つ"クルースニク"がある

白い羊膜に包まれて生まれ、赤い羊膜に包まれて生まれてくる吸血鬼クドラクとの戦いを宿命とする
普段は青年だが、クドラクと戦う際は互いに馬,豚,牛,猪などに変身して戦う。この時、クルースニクが化けている動物は白いので、簡単に見分けがつく。

民の血を啜る貴族

こういうよくある悪い貴族も日本だけでなく世界中で吸血鬼と呼ばれる

あのマルクスも資本を、「吸血鬼のように、行きている労働者を吸うことで成り立つ」と定義してる(らしい)

第ニ幕

約束の地

ヘブライ語聖書に記された、ユダヤ教キリスト教において、神がイスラエルの民に与えることを約束した土地。
約束の地は、「エジプトの川」からユーフラテス川までの領域とされ、"パレスチナ"とは別概念である。
聖書での言及は地域の設定,譲与(?)のみで、その土地がどうこうと言った内容は無い

ルカ

  1. 新約聖書の『ルカによる福音書』及び『使徒行伝』の著者とされる人物
  2. イタリア語の男性名Luca
  3. ロシア語の男性名Лука(Luka)
  4. ギリシャ語のΛουκᾶς(Lukas)は、聖書ではルカと音訳される

アンジェラ

英語、イタリア語などの女性名
ドイツ語ではアンゲラとなる

Overture

  1. 序曲,前奏曲
  2. 語源:古期フランス語「開始」の意

ヴァンパイアとなったエドガーとクリスの旅、
香が無くなり目覚めてしまったノエル、
「終焉の無い呪い」が「開始」するのでした...

Everlasting

  1. 永久に続く,不朽の,永遠の
  2. 果てしのない,退屈するほど長い
  3. 永久,永遠

試聴ではエドガーとクリス部分のみ。
それは、CDでのみ語られたエレオノーラとアレクサンドラの物語が歌詞に含まれているからです。

DTBのリスペクトゲームを作った、よ

あけましておめでとうございます

そりゃ新年ですから。もう16日ですけど。

はじめに

本年はこんな感じの年賀状を、少ない友人に送りつけました。
f:id:crssnky:20180116220802p:plain:w350
いわゆるDTB(どうぶつタワーバトル)っぽさを狙ったデザインです。
右上にQRコードを置いたのですが、これが絵がかけない人なりのおまけってことです。
どこに繋がってるかというと→DogTowerBattle
f:id:crssnky:20180116222023p:plain:w350
これまたDTBっぽいゲームが出てきました。
そうです、おまけでDTBのリスペクトゲームを作りました。

本編

元々QRコードで公開する予定だったので、OSに依存にしないWebアプリとして作りました。 と、同時にUnityのWebGLやってみたいなぁ、という気持ちがあったのを思い出して、UnityのWebGLで公開することを決めました。
まだ正式にはモバイルでwebGLサポートしてないみたいですけど、まぁ3Dのゲームじゃないし大丈夫っしょ。←実際大丈夫でした(iPhone6s Chrome)。

作成

f:id:crssnky:20180116231014p:plain:w350
本作は、最初にTitle Sceneに降りたって、Play Sceneへ移動、終わったらその上にResult Sceneを重ねるという構成にします。Result後はまたPlay Sceneへ移動もできるようにします。

Title

f:id:crssnky:20180116232229p:plain:w350
Canvasにそれっぽいタイトルを作成し、Pushテキストを表示する。←これは表示するテキスト以上の大きさのオブジェクトにして、Play Sceneへ移動するタッチイベントを設定する。
上部のRank Text「高く積み上げて点数を稼ごう!」は、非同期でDBへユーザーのハイスコアを取得していって、取得でき次第切り替える。(参考:当記事の画像2枚目)
DB参考↓ qiita.com

あと、ランダムでテキトーにDogを降らせます。賑やかしですね。

Play

f:id:crssnky:20180116234203p:plain:w350
f:id:crssnky:20180116234427p:plain:w350
あー、CanvasとMainCameraの表示エリアの大きさの差が大きすぎる~~
フィールドはBoxで作って、回転ボタンは左右を用意。
新しいパーツを出すタイミングは、最新のパーツが静止したタイミングRigidbody2D.IsSleeping()で出します。
本家と同様、落ちたらゲーム終了です。

Result

f:id:crssnky:20180116235340p:plain:w350
Play Sceneに重ねます。
ボタンは再挑戦(→Play Scene読込)と、Tweet(→Tweet Intentで結果をツイート)の2種。
その上のResult Textは、DBへ非同期でアクセスして、取得でき次第順位を表示します。

おわりに

以上が簡単な作った内容です。
説明が少なすぎると思うので、githubのリンクを貼っておきます。
github.com

色々と配慮して足りてないので、あくまでもソースコードなどの参考用ということで。