福野泰介の一日一創 - create every day

台風19号の中、移動部門からプレスタートした高専プロコン2019。

遅れで、途中鹿児島中央駅で2時間待ち。桜島、噴火してました。(この後、そこそこの噴火があった模様)
鹿児島地方気象台”桜島の月別噴火回数”
こちら噴火オープンデータ風、日常的に噴火してますね


超広角が良い、iPhone11


改装中の鹿児島駅


鹿児島駅で見かけた桜島大正噴火を伝えるポスター。あるといいかも、前兆を捉えるIoTセンサーや、リアルタイムオープンデータ。


鹿児島から都城への電車窓から見える桜島


ついに都城に到着!見える人々、ほぼ高専生。


朝、家を出たのは朝7時前、約11時間の長旅。前日の行程変更、「指定席はありません」と言われても「途中区間でも取れませんか?」で探してくれた指定席チケット3枚。新幹線車内で2回移動。遅れも含めて4時間半、座っていることができました。


高専プロコン2019メモ
課題部門、自由部門のノミネートされた20作品ずつ計40作品。見て回りながらローカルストレージ(localStorage)にメモできる、メモアプリ2019版!

ライブラリの依存関係を切ったシングルソース、let/const/async/awaitスタイルに更新した、CC BYで活用しやすいJavaScriptで作ったオープンソース。高専プロコンの勝手オープンデータ(CSV/utf-8)と共にご活用ください!

const loadCSV = async function(url) { const res = await fetch(url) const sdata = await res.text() const data = convertCSVtoArray(sdata) return data } window.onload = async function() { const url = "data/procon2019.csv" const data = await loadCSV(url) // いろいろ }

シンプルでいいでしょう!

いよいよ開幕、高専プロコン2019

2012年からスタートした一日一創、地味に活躍しているアプリを発見、その名は「パスワードメーカー」
ご要望にお応えして、紛らわしい文字を除く機能を追加した新バージョンです!

パスワードメーカー
開いた瞬間、生成したパスワードを選択した状態になるので、即時にコピー(Ctrl-C / Command-C)できます! 使う文字種、長さ、設定はURLに反映されるので、お好きな設定でブックマークしておくと便利です。

パスワードの強さはどう決めたらいいでしょう?

オンラインサービスのパスワードは何度か間違えるとロックされるので、そこまで気にしなくてもよかったりしますが、パスワード付きのExcelやzipファイルは要注意です。 何度間違えてもペナルティーがないので、力技の全探索が可能です。解読されるリスクを計算してみましょう。

例えば、数字4文字だと10の4乗、つまり1万通りのパスワードになります。IchigoJamのCPUでさえ1秒で5000万回計算できるので一瞬です。

数字を20文字まで伸ばすと10の20乗通り、全探索するのに、1秒に1兆回(10の12乗)試行できたとしても、10の8乗秒 = 1億秒 = 約3年かかる計算です。なかなか強くなりました。(ざっくり1日は10の5乗秒、1年は10の8乗秒と覚えておくと便利)

ただ、油断半禁物です。3台使えば1年、3000台使えば1日で解読できてしまいます。誰でも数千台とかを一時的に借りられるクラウド時代、非現実的な手段とは言えません。

オススメは、今回アプリの初期設定、アルファベット小文字、先頭は大文字の20文字。そこそこ短さながら10の27乗。1日で解読するためには3000億台のコンピューターがいるクラスです。大文字小文字を混ぜてほしいシステムにも対応。どうしても記号や数字が必要な時用にオプションもあり。

それでも、まだ不安な方のために、どーんと100文字設定を準備しました。10の100乗、記号などを含めると10の151乗までになるので、国家レベルどころか、全宇宙中のリソースを持ってしても現実的な時間で破ることはできないでしょう。(・・・と思いましたが、そもそも本プログラムの場合、乱数の品質で頭打ちです。強い乱数に関してはまた改めて)


パスワードメーカー」旧バージョン
こちら元になった2012年バージョン、そのまま残しておくことにしました。

パスワードメーカー」新バージョン
依存ライブラリがない、単一HTMLで動くシンプルでオープンなライセンスによるオープンソースなので、安全を自分でご確認いただけます。 また、自由に改造、再配布が可能なので、かわいくするのも、かっこよくするのも自由自在!

「ストップ、パスワードのつかいまわし」
自分の身は自分で守ろう、情報セキュリティの啓蒙用にもどうぞ。

links
- 一日一創 2012

朝のピーク時には東京圏を走る電車は、なんと1000台を越えていました。
東京公共交通オープンデータチャレンジ」のAPI許可がでたので、nagixさんの作品をVR用にフォークした、VR-TokyoTrainsに列車の現在位置を反映。

VR-TokyoTrains」(src on GitHub)
APIで取得できるのは出発駅と向かう駅、遅れ情報だけです。Mini Tokyo 3Dのアニメーションする電車表示は、時刻表を元に路線データからその中間地点を計算していますが、今回はひとまず出発駅にいるものと仮定して、電車の数分、駅の位置に緑の球を積みました。


iPhone iOS13からは加速度センサーの使用にユーザー操作による許可が必要になったため、青い球を一度タップして許可ください。横向きにすることスマホVRでも楽しめます。


ただ、なんといってもおすすめはVR。Oculus Questで見ると、東京のまちを歩き回れます!近づいて見えます!
A-FrameでかんたんVR実装 in JavaScript、楽しい!

こちら、駅の緯度経度を現在位置として返すAPIをNode.jsで作って動かしています。
サーバーで動かすことで、API_TOKENを共有せずに、通信量を減らせます。Node.jsを使うと、クライアントコードとサーバーコードを簡単に行き来できて便利!

require('dotenv').config() const API_TOKEN = process.env.API_TOKEN_ODPT const opstations = {} const getTokyoTrainsNow = async function() { const trains = await loadJSON("https://api-tokyochallenge.odpt.org/api/v4/odpt:Train?acl:consumerKey=" + API_TOKEN) // 列車取得 リアルタイム 496@6:11 const getStation = async function(operator, stationid) { let stations = opstations[operator] if (!stations) { stations = await loadJSON("https://api-tokyochallenge.odpt.org/api/v4/odpt:Station?odpt:operator=" + operator + "&acl:consumerKey=" + API_TOKEN) opstations[operator] = stations } for (const st of stations) { if (st["owl:sameAs"] == stationid) return st } } const res = [] for (const train of trains) { const st = await getStation(train["odpt:operator"], train["odpt:fromStation"]) const pos = [ st["geo:lat"], st["geo:long"] ] res.push(pos) } return res } const webclient = require("request") const loadJSON = async function(url) { return new Promise(function(resolve, reject) { webclient.get({ url: url }, function(error, response, body) { if (error) { reject(error) } else { resolve(JSON.parse(body)) } }) }) } module.exports.getTokyoTrainsNow = getTokyoTrainsNow

(src on GitHub by Code for Sabae)
async / await / Promiss を使うと通信周りを同期処理としてすっきりわかりやすく記述できます。
さぁ、オープンデータで便利を創ろう!備えよう!

links
- 東京公共交通オープンデータチャレンジ
- Mini Tokyo 3D 開発日誌 - Togetter

2020年入社予定の内定者合宿 in 鯖江!

Vue x Node のウェブサービース、IoT、チーム開発手法スクラムをギュッと凝縮した1時間半レクチャーからスタート!


早速アイデア会議でも活躍した、Vue x Node でつくるサンプルサービス「チャット」をWebSocketを使ってリアルタイム化!
step6.js で、さまざまな Content-Type に対応させて、もう少しまともなウェブサーバーに改良。
step7.js は、ポート番号 5001 に、WebSocketを使ったリアルタイム中継サービスを準備、chat2.html でリアルタイム版チャットを体験できます。

WebSocketを使う準備

npm i ws --save

WebSocketで受けて、全クライアントに転送するサーバー側のコードはわずかこれだけ!

const WSServer = require('ws').Server const wsserver = new WSServer({ port: 5001 }) wsserver.on('connection', function(ws) { console.log('open') ws.on('message', function(message) { console.log(message) wsserver.clients.forEach(function(client) { client.send(message) }) }) ws.on('close', function() { console.log('close') }) })

vuenodechat src on GitHub


サーボを接続して動かしてみよう!


スマホからもサーボ、動かしてみよう!


スマホからいろいろコントロールし放題!?


デバイスからネットへもコマンドひとつ!


合宿地、ラポーゼ河和田へ移動して、アイデア出しして、スクラム開発の要、チームで合意するゴールである「ビジョン」を決定!


温泉入ってリフレッシュ!ビジョンを掲げ、実現に必要なコトのリストであるプロダクトバックログから、それを実現するためのタスクに分割。 付箋紙に書いたタスクが人別に「TODO」「Doing」「Done」へと遷移していく様子をリアルタイムに共有しながら進める、スクラムのプラクティスのひとつ「タスクかんばん」を使って進める短期開発、できあがりが楽しみです!


Scrum Interaction 2019 ジェフ・サザーランド博士 メッセージ - YouTube
スクラム開発者によるイベント、あるそうです!

webの本質は共同作業、みんなの力をキュートに集めるウェブサービス、自分でも創ってみたいですね。
進化するプログラミングの世界、随分簡単にステキなサービスが作れるようになりました。

今回は、IchigoJam BASICからのステップアップにイチオシの言語「JavaScript」と便利ツール「Vue.js」と「Node.js」を使った「チャット」づくりのチュートリアル!

みんなの力を集める、つまり、ひとりひとりが持つコンピューターからデータを集約するためにいつも動いているコンピューター、サーバーが必要です。自宅のパソコンを動かし続けてもOKですし、さくらインターネットなどで借りることもできます。

そんなサーバー上で動かすための便利ツールその1「Node.js(ノード・ジェイ・エス)」を使えば、サーバーでJavaScriptが使えます。

まずは Node.js のセットアップ!
【Node.js入門】各OS別のインストール方法まとめ(Windows,Mac,Linux…) | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

GitHubから今回のチャットサービス「vuenodechat」をダウンロード。
ダウンロードしたファイル、まずは JavaScript での基本表示。console.logを使って、計算しましょう。(step0.js)

console.log(1 + 1)

こちら、コンソールを開いて、ダウンロードしたフォルダに移動し node コマンドを使って動かします。

node step0.js 2

1+1の計算ができました!

続いて、ウェブサーバーを作ります。(step1.js)

const http = require('http') const server = http.createServer() server.on('request', function(req, res) { console.log(req.url) res.writeHead(200, { 'Content-Type' : 'text/html; charset=utf-8' }) res.write('ハロー' + req.url) res.end() }) server.listen(8001)

短い!こちらも同じように動かします

node step1.js

何も出ずに固まっている?エラーが出てなければ無事動いているはずです。ブラウザで http://localhost:8001/ を開きましょう。

ブラウザのアドレス欄、URLの末尾に数字やアルファベット足してエンター、アクセスしてみてください(例:http://localhost:8001/abc)。nodeを実行した画面に表示されますね。こうして伝わってくるデータをいろいろやって、端末側(クライアントと呼びます)に返してやればOKです!

※ localhostというのは自分のコンピューターを表し、コロンの後はポート番号といって窓口のID的なものです。同じ番号の窓口で複数のサーバーは起動できないので、必要であれば番号 8001 を好きな数に変えましょう(推奨:1024〜49151)。

step2.js で、static フォルダに入っているHTMLファイルや画像ファイルを返すようなプログラムを追記。
step3.js で、クライアント側とデータをやりとりするAPIの雛形を追記。

そしていよいよ step4.js でチャットを実現するAPIを追加!
こちらがそのハイライト、サーバーのデータを操作しています。

let data = [] function serveAPI(fn, query) { if (fn.endsWith('/add')) { data.push(query) } else if (fn.endsWith('/list')) { return data } else if (fn.endsWith('/get')) { return data[query.idx] } else if (fn.endsWith('/clear')) { data = [] } else if (fn.endsWith('/remove')) { data.splice(query.idx, 1) } }

5つのAPIを実装しました(addで追加、listで全部取得、getで1つ取得、clearで全件消去、removeで1つ消去)
こちらを動かし http://localhost:8001/chat.html を開きましょう。文字をいれて SENDボタンで、1行追記されます。別のウィンドウでも開いて一人二役チャットをやってお試しください。

ipconfig (Windows) や ifconfig (Mac/linux) を使って、今使っているIPアドレスを見つけたら、同一ネットワーク内にいる人や、Wi-Fiにつないだスマホから、IPアドレスで参加できます!(例、http://192.168.1.13:8001/chat.html

chat.html 内は、Vue.js という今風なクライアント用のフレームワーク(便利ツール)を使ってます。下記のようにサーバーのAPIと通信して変数にいれると、いい感じに画面のデータを同期してくれて便利です。(参考、Vue.js はじめのいっぽ

methods: { show: async function() { this.list = (await axios.get('/api/list')).data }, send: async function() { const text = encodeURIComponent(this.chat) const ts = Date.now() await axios.get('/api/add?text=' + text + "&ts=" + ts) }, clear: function() { axios.get('/api/clear') } }

この状態だと、サーバーを止めるとデータが消えてしまうので、ファイルとして保存するようにしたのが step5.js となって、以上でハンズオン終了です。おつかれさまでした!

テキスト、絵、音声、画像など、どんなデータを集めて、どう見せる?
それはあなたの自由です!

更新のラグが気になる?WebSocketを使ったリアルタイム化する続編、公開!
Vue.js x Node.js x WebSocket でつくる「チャット」ハンズオンのリアルタイム化

河和田アートキャンプ2019ファイナルイベント&中道アート
アートキャンプ参加学生作「漆器のまちかわだ顔出しパネル」とコラボした、お手軽webアプリ完成!。

kaopanel - 河和田アートキャンプ2019
スマホかカメラ付きのPCでこちらにアクセスして、顔の位置を合わせてタップするだけ、写真をダウンロードできます!(アップロードはしません)
自分で撮影でき、しかも同時に2つの顔出しができますよ!


モデルとなったのは、総合案内所近くの顔出しパネル、顔出ししたい場所の座標と大きさを設定するだけ簡単、量産できます!(src on GitHub
SSL必須なカメラアプリのデバッグには、ngrokと、Webインスペクタによるリモートデバッグが便利です。


1500年つづく漆器の産地、河和田のステキな中道。


道中にはいろんなお店、こちら、かわだ尾花屋まちライブラリーのローストビーフ寿司、ゴミにならないエビせん皿が斬新!


牛すじが入ったたこやき風、尾花屋ボールは試作中でした


100年の歴史ある古民家、尾花屋、なんと中はライブスタジオ!イベント情報はFacebookをチェック!


LEDで電飾されていた、CAFEたんぽぽの看板!光とアート、プログラミングとアートも実現したい!


河和田アートキャンプOBで、鯖江移住者、TSUGI代表、新山さん!
PARKにて本格スパイス公園カレーやってました!


PARKで発見したチラシ、ものづくりのまち、鯖江。合コンテーマもものづくり!
ものづくり合コン2019 – めがねのまちさばえ 鯖江市


釣った人が焼いてくれる、九頭竜川の天然鮎、塩焼き!


日本酒とアート。純米吟醸 河和田おしどり by 河和田アートキャンプ featuring 梵!


めがね ケイタイクン!継体天皇さまがSDGsメガネ、グローカルをかけている!?


代表の片木さん!


河和田アートキャンプ、15周年、おめでとう!!


「鯖江のいいところ」Nikonの一眼レフD90の動画で撮ったCMは9年前。


CMがきっかけで撮ることになったPV「『MY TOWN RIDDIM』 Sing J Roy & PETER MAN 感謝」なんと22万回再生!


jigインターンでも毎年お世話になる、蔵Bar、今年は舞台が新設されました!
アートxITx鯖江、いろいろコラボしていきましょう!

links
- 中道アート2019
- 「河和田アートキャンプ」グランドファイナルと15周年記念イベントでした | 『さばえ.jp』百さんのブログです

京福バスでも活躍、月額60円のIoTサービス、sakura.ioのデータストア機能を使えば、サーバーを契約することなくリアルタイム位置表示システムを公開できます。 町内のおまつり、お神輿が今どこにいるかをリアルタイム表示システム2019年版!(昨年版


お神輿に設置するだけ簡単、神輿なう!(ジッパー式の袋に入れておけば突然の雨にも安心)

準備するもの
- GPS受信機(AE-GYSFDMAXB or GT-902PMGG(U-BLOX)
- IchigoSoda (IchigoJam 1.4βファームウェア)
- sakura.ioモジュール
- webサーバー or GitHubアカウント
- GoogleマップAPIのアカウント

GPS受信機の初期設定をします。IchigoJamに下記どちらかをいれます
GT-902PMGG(U-BLOX)の場合

20 BPS9600:UART3 30 ?"$PUBX,40,GSA,0,0,0,0,0,0*4E" 40 ?"$PUBX,40,GLL,0,0,0,0,0,0*5C" 50 ?"$PUBX,40,GGA,0,0,0,0,0,0*5A" 60 ?"$PUBX,40,GSV,0,0,0,0,0,0*59" 70 ?"$PUBX,40,VTG,0,0,0,0,0,0*5E" 80 ?"$PUBX,40,RMC,0,3,0,0,0,0*44"

GYSFDMAXBの場合

20 BPS9600:UART3 30 ?"$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"

SAVE0して、一度電源を切り、GPSの送受信(TXD/RXD)をIchigoJamに接続し、ボタンを押しながら電源を入れます。
画面に1秒おきに何かデータがでてきたらOK!(日当たりが良いところに持っていってしばらくすると、緯度経度も出るようになります)

GPSの接続に、チームIchigoJamほっかいどうのIchigoSensors2を使いました。

緯度経度をネットに送信するため、sakura.ioモジュールをIchigoSodaに接続し、下記のプログラムをいれ、SAVE0。

1 @ARUN'GPSSHARE for IchigoJam 1.4 10 VIDEO0:LED1:WAIT90*60:LED0 20 GSB@GPS:D=[4]-[91]:E=[6]-[93]:IF(ABS(D)+ABS(E)%10000)<60 CONT 30 IOT.OUT#806,8:LET[90],[3],[4],[5],[6] 40 LED1:WAIT5:LED0 50 WAIT60*5 60 GOTO20 'get GPS data 300 @GPS:CLS:BPS9600:UART3,2 301 K=INKEY():IF!KCONT 304 IFK!=36GOTO300 305 K=INKEY():IF!KCONT 306 IFK!=71GOTO300 308 K=INKEY():IF!KCONT 309 IFK!=42?CHR$(K);:GOTO308 310 UART0,0:P=#900 320 GSB@P:M=2:GSB@N:[1]=N:GSB@P:[2]=N:GSB@P:GSB@P:GSB@P:[3]=N:IFCGSB@P:[4]=N:ELSE[4]=0 330 GSB@P:GSB@P:[5]=N:IFCGSB@P:[6]=N:ELSE[6]=0 340 GSB@P:GSB@P:[7]=N:GSB@P:GSB@P:GSB@P:GSB@N:[1]=[1]+N*100:GSB@P:[0]=N:RTN 'parse 500 @P:N=0 510 C=ASC(P):P=P+1:IF!C||C=44||C=46||C=34C=C=46:RTN 520 IFC>=48&&C<=57N=N*10+C-48 530 GOTO510 540 @N:N=0:IFASC(P)=44RTNELSEFORI=1TOM:N=N*10+ASC(P)-48:P=P+1:NEXT:RTN

モバイルバッテリーなどとつないで、電源を入れたら通信が確立する1分半後くらいからデータ送信が始まります。
動きがないと送信しない、省エネ設計(20行)
送信後5秒待つ設定(50行)にしていますが、好みの調整しましょう。
IOT.OUT#806,8,0 で、キューにためておき、IOT.OUT0,0,1 で溜まっているデータをまとめて送信するのも手です。

通信モジュールを、sakura.ioのコントロールパネルから登録、作成したプロジェクトの中、連携サービスにデータストアを追加し、トークン(Token)を取得しましょう。 無料で、過去40日間分のそのモジュールから送信されたデータが取得可能。
データストア連携した画面に表示される、URL(v1/v1/ とかぶっているのを1つに編集)を開けば、データが見えます!

https://api.sakura.io/datastore/v1/channels?token=xxxxxx-xxxx-xxx-xxxx-xxxxxx

表示アプリ「神輿なう」をForkするかダウンロードします。(src on GitHub
index.html を編集して、GoogleマップのAPIキー、sakura.ioのデータストアAPIのトークンをセットします。
これで位置が表示されるようになります!

カスタマイズ!
- スタートや、ゴール、休憩場所などのアイコンをセットするには、POIを編集します。(緯度経度地図が便利です)
- 開始時刻(START_DT)、終了時刻(END_DT)をセットすると余計なデータが表示されなくなります。
- HTML/CSSをいじってオリジナルアプリに!

身近で役立つIoT、おもしろIoTにご活用ください!

links
- 京福バスにデプロイ、IchigoJam! IchigoSensors版と sakura.io DataStore API での取得方法
- 開会式前に福井国体スタート!IoTシャトルバス稼働現場と稼働実績オープンデータ

jigインターン2019、ついに最終成果発表会の日。3チーム、1作品ずつマッシュアップしながら紹介します!
まずは鯖江市特産野菜「吉川ナス」を使ったレシピのオープンデータ化が決まった「旬レシピ」から。

チーム「やばいわよ!!」
たかめろん(長野高専)、ふっけー(北九州高専)、えふ(長岡高専)、Dry(明石高専)の4名チーム!


ターゲットは学生や独身の料理初心者。外食ばかりは栄養的にも金額的にも難があるけど、特に食べたいものがないけど、おいしく安く栄養あるものを食べたい人。


そこで「旬レシピ」
スーパーに入ってスマホを取り出す開くだけのシンプル操作。その時点、その場所での旬を使った安くて簡単なレシピを写真で紹介!


「旬」マークがつきの買い物リストにもなっている食材リスト。自然に自然が身につきそう。
ついでに家の在庫量とも連動させるとより便利かも。


使用したデータとAPI。オープンデータ化の必要性は作るほどに見えてくる。まずは地元を自力でオープンデータ化しよう!


今回からの初企画、展示タイム。実際に作った作品を実際に触りながら(壊しながら?)、より深い質疑応答タイム。

旬レシピは、GitHubでオープンソース!(jigintern/Season-Foods-Navi at develop)
早速気になる、Node.js でスクレイピングして作ったというデータをチェック!3MBのJSONがありました。
スクレイピングしたソースは、こちら"GetFoodsNutrient.js"、データが大きくなりすぎないように栄養素を抜粋したとのこと。

完全食COMPとの比較もしたいので、ビタミンAの分類や、表記方法の違いを調整して栄養素完全版へとリミックス! 「GetFoodsNutrientJSON.js
Node.js をいれ、npm install cheerio-httpcli でスクレイピング用のライブラリをセットアップして、node GetFoodsNutrientJSON.js でテスト実行。

$ node GetFoodsNutrientJSON.js { food: '乳類/(液状乳類)/普通牛乳', info: [ { name: '可食部', value: '100', unit: 'g' }, { name: 'エネルギー', value: '67', unit: 'kcal' }, { name: 'たんぱく質', value: '3.3', unit: 'g' }, { name: '脂質', value: '3.8', unit: 'g' }, { name: '炭水化物', value: '4.8', unit: 'g' }, { name: 'ナトリウム', value: '41', unit: 'mg' }, { name: 'カリウム', value: '150', unit: 'mg' }, { name: 'カルシウム', value: '110', unit: 'mg' }, { name: 'マグネシウム', value: '10', unit: 'mg' }, { name: 'リン', value: '93', unit: 'mg' }, { name: '鉄', value: '0', unit: 'mg' }, { name: '亜鉛', value: '0.4', unit: 'mg' }, { name: '銅', value: '0.01', unit: 'mg' }, { name: 'マンガン', value: '', unit: 'mg' }, { name: 'ヨウ素', value: '16', unit: 'μg' }, { name: 'セレン', value: '3', unit: 'μg' }, { name: 'クロム', value: '0', unit: 'μg' }, { name: 'モリブデン', value: '4', unit: 'μg' }, { name: 'ビタミンA', value: '38', unit: 'μg' }, { name: 'ビタミンD', value: '0.3', unit: 'μg' }, { name: 'ビタミンE', value: '0.1', unit: 'mg' }, { name: 'ビタミンK', value: '2', unit: 'μg' }, { name: 'ビタミンB1', value: '0.04', unit: 'mg' }, { name: 'ビタミンB2', value: '0.15', unit: 'mg' }, { name: 'ナイアシン', value: '0.9', unit: 'mg' }, { name: 'ビタミンB6', value: '0.03', unit: 'mg' }, { name: 'ビタミンB12', value: '0.3', unit: 'μg' }, { name: '葉酸', value: '5', unit: 'μg' }, { name: 'パントテン酸', value: '0.55', unit: 'mg' }, { name: 'ビオチン', value: '1.8', unit: 'μg' }, { name: 'ビタミンC', value: '1', unit: 'mg' }, { name: '飽和脂肪酸', value: '2.33', unit: 'g' }, { name: '多価不飽和脂肪酸', value: '0.12', unit: 'g' }, { name: 'コレステロール', value: '12', unit: 'mg' }, { name: '糖質', value: '4.7', unit: 'g' }, { name: '食物繊維', value: '', unit: 'g' }, { name: '食塩相当量', value: '0.1', unit: 'g' }, { name: 'アルコール', value: '', unit: 'g ' } ] }

牛乳100gの栄養素が取得できました!(乳類/(液状乳類)/普通牛乳 - 一般成分-無機質-ビタミン類-アミノ酸-脂肪酸-炭水化物-有機酸等 - 文部科学省)


人間に必要な栄養素 オープンデータアプリIchigoJam研修@大塚製薬 の記念に作った、ゆるゆる動く栄養素アプリ。
人間に必要な栄養素 CSVオープンデータ」もどうぞ!

そういえば、吉川ナスの栄養素のどのように測定したらいいのだろう?
福井高専、物質工学科に相談してみよう!

links
- 吉川ナス – めがねのまちさばえ 鯖江市

高専インターン、2週間目、最終営業時間後は河和田アートキャンプ、蔵Barで交流会!

食とアートに取り組む、河和田アートキャンプの人と記念撮影 by THETA
VRで味わう、VRアートキャンプ古民家と蔵Barはこちら
VRアートキャンプ2019


Dvorak配列試し打ちwebアプリ
蔵Barでもキーボード配置を変更していた、ぴ。
キーボードにこだわる高専生、キー配列はQWERTY(TYPEWRITER配列)でいいのかい?


疲れが見え隠れする、インターン2週間目のおわり、指力が試されるタイプライターで対抗!
上段1列を使ってTYPEWRITERと打てるのが、QWERTY配列がデファクトになった秘密。


昼はSKこと醤油カツ丼@味見屋


おやつは歩くソースカツ丼、サバエドッグ


2スプリント終わってレビュー、ふりかえりのKPTK(Keep, Problem, Try, Kansya!)


漆器神社へ


今日はここまで!


蔵Bar到着


例の舞台は、蔵Barの拡張座席だった!天気が良ければハンモック付きで外で食事可!


山盛りな大根サラダ!


缶詰をランダムに注文!


アート x VR も楽しい!


蔵で行く宇宙、Oculus Quest対応、国際宇宙ステーションISS体験アプリ、ふわふわします。


アートキャンプ2019の学生さん、ありがとうございます!


アートキャンプの合宿も古民家、進むアート制作、発表会は9/21-22、中道アート2019と同時開催!


食後は、ラポーゼ河和田、温泉!
心身を癒やし、ゆっくり寝たら、フリーな休日、楽しんで!

河和田アートキャンプ2019blog
jigインターン12日目!! 第2スプリント終了! - jigintern2019のブログ

サバエドッグを食べるエンジニア写真集








49,800円という衝撃価格のモバイルVR「Oculus Quest」が好調

開発の楽しさを伝えるため、50行マイクラ風に続く第二弾、今回はVRらくがきアプリを48行で作成。
Tilt Brushは気持ち良いけど、起動に時間がかかるのがネック(あと、有料)。
今回作った、お絵かきツールは、超軽量なので起動も一瞬!(無料&オープンソース on GitHub

drawline-VR
フレームワーク、A-Frameを使っている。線をa-lineでだらだらと追加しているが、割りとすぐに重くなってしまうのは、どうにかできるのか!?フレームワークやWebVRの限界なのかも?


さらさらと描く様子を、本体へ録画して、USBケーブル転送。(転送は開発モードをOFFにしてAndroid File Transferを使用)

<!DOCTYPE html><html><head><meta charset="utf-8"/> <title>drawline-VR for Oculus Quest</title> <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script> <script>'use strict' const list = [] let line = [] let bkp = null AFRAME.registerComponent('input-listen', { init: function() { this.el.addEventListener('triggerdown', function(evt) { bkp = handright.getAttribute('position').clone() list.push(line) }) this.el.addEventListener('triggerup', function(evt) { line = [] bkp = null }) const removeLine = function() { const line = list.pop() if (line) for (let i = 0; i < line.length; i++) document.querySelector('a-scene').removeChild(line[i]) return line } this.el.addEventListener('gripdown', function(evt) { removeLine() line = [] bkp = null }) this.el.addEventListener('bbuttondown', function(evt) { while (removeLine()); }) }, tick: function() { if (bkp) { const p = handright.getAttribute('position').clone() const aline = document.createElement('a-entity') aline.setAttribute('line', { start: bkp, end: p, color: "#FFF" }) document.querySelector('a-scene').appendChild(aline) line.push(aline) bkp = p } } }) </script></head><body><a-scene> <a-sky color="#546c4c"></a-sky> <a-entity id='handright' oculus-touch-controls='hand: right' input-listen></a-entity> </a-scene></body></html>a

ご自由に改造、活用ください!

福井県の昭和おもしろスポット2箇所紹介。

こちら福井県庁内1Fにある喫茶店。昭和な雰囲気。


なぜかダンベルが!?レトロなレジも必見です。


懐かしの2つの時計が掲げてあったお店を発見、世代が違うと全くわからないことがわかった。(on Twitter)

links
- 一日一創 VRカテゴリ
- 一日一創 VRアプリ一覧

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像