2018年1月14日日曜日

ゼルダ始めました あの開発手法を参考にしたい

ゼルダの伝説ブレスオブワイルドをいまさらながら始めました
むちゃくちゃ面白いです

ホライゾンドーンもやりましたが、ゼルダのほうが創意工夫とイベントが散らばっていて、一枚上手感がぬぐえませんね
ホライゾンドーンも突然巨大な機械獣が歩いてて、おぉーってなるので、ぜひやってみてください

どちらもよいオープンワールドゲームです



閑話休題


ところで、ゼルダといえば、ゲームの内容そのものもそうですが、開発手法なども結構話題になっていますね
例えば、ワールドづくりが自然とユーザを誘導する形になっていたりなど、ユーザ体験を重視する話題に事欠きません

その中で1つ気になっているのが、意見の共有方法についてです
普通だと、エクセルとかに修正案件をまとめて書いて共有&修正するのが正しいと思います

ただゼルダだと、マップに直接意見を描いて見れるようにしていたみたいです
これ、すごいですよね
誰が意見書いて、どういう影響を与えそうか、周りの人にいっぺんにわかるようになっています

これ、ITのほうでも参考にできないかなと思っているのですが、可視化が難しいので、何とも言えないです

うーん、テストコードにissueを出す感じになるのだろうか?
でも、それだと、修正したときの影響範囲とか周りの人にわからないしな・・・

むずかしいですね

結論出たら、また記事を書きたいと思います
よろしくお願いいたします



2018年1月7日日曜日

クラウドファンディングでいろいろ買ってみた

ちょっと前にクラウドファンディングにお金突っ込んでたので、自分のまとめ書きます
個人の感想なのでね!! 違うケースもあるのでね!! あくまでも参考にね!!

買ったのは
  • カレー
  • ヘッドホン
  • おかし
  • スマートウォッチ的な計測系デバイス

ほかにも買った記憶がありますが、忘れました


主に使ったのは、


先に結論述べます
投資的な意味だと、かなりいいです
成功すると嬉しいですし、facebookとかでそのあとの活動を追えて満足感高いです

見返り品目的だとまぁまぁです
手元に来るまで時間かかりますし、印象と違うものが出来上がるのもよくあります


個人的なまとめは以下

日本のファンディングサイトと海外の差について


日本のはほぼできているパターンがかなり多いです
そのため、資金さえ調達すれば量産、梱包、配達のフローにすぐに入ります(それでも3,4か月は待つことになるかと

海外のは、本当にプロトタイプなので、資金が集まったら作るケースもあります
むっちゃ時間かかります


デバイスとそれ以外

それ以外のほうが早いですね
お菓子とか
基本的にむっちゃいいのがもらえます

デバイスは印象と違うのが来るとびっくりしますが、それも面白いのでモーマンタイ


優しい目で見守りましょ

開発とか遅れると荒れます
でも、支援目的なのだから、優しく見守りましょ

etc

ところでアイドル支援って面白いですね
やってないけど、どうなるんだろ

最近意識していること

最近、働き始めていろいろわかってきたので、まとめます

それはできるだけ機械に任せるべきだということです

なんでそういう結論に至ったかというと人間は疲れるし、同じ作業するのは機械のほうが向いています

なので、人間に同じことをやらせるのは無駄of無駄です

繰り返しの作業になることを察した瞬間にそれはツールかスクリプトにして誰でも、一瞬でできるようにすべきです

そうしていかないと、運用負荷で自分が死ぬし、工数が取れなくてチームも死にます

lets自動化

yahooボックスの一括ダウンロードスクリプト使ってみた

こんにちは
今日はヤフーボックスから一括ダウンロードする方法をお伝えします
なんでかというと、もうサービス終了しているので、ファイルを1つ1つをするしかなく、面倒極まりないからです(手で4時間ぐらい頑張ったけど、途中で死ぬかと思ったので、やめました

http://lp6m.hatenablog.com/entry/2016/08/12/184232
こちらのサイトを参考にしました
超感謝

というわけでやり方

用意するのはRubyとChromeです
最初にソースコードを見せます
これです
```
#Yahoo! Box Downloader
require 'mechanize'
require 'nokogiri'
require 'kconv'
require 'scanf'
require 'date'
require 'uri'
require 'json'
require 'erb'
require 'net/http'
require 'open-uri'
require 'logger'
include ERB::Util
filenum_of_page = 100 #一度に読み込むファイル数 20,50,100のどれか
sid = "****"
topuniqid = "****"
crumb = "****"
appid = "****"
puts "sid = #{sid}"
puts "uniqid = #{topuniqid}"
puts "crumb = #{crumb}"
puts "appid = #{appid}"
agent = Mechanize.new
agent.user_agent_alias = 'Windows IE 7'
cookie = Mechanize::Cookie.new :domain => '.yahoo.co.jp', :name => "_n", :value => ""***********",", :path => '/', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie
cookie = Mechanize::Cookie.new :domain => '.yahoo.co.jp', :name => "B", :value => "***********", :path => '/', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie
cookie = Mechanize::Cookie.new :domain => '.yahoo.co.jp', :name => "F", :value => "***********", :path => '/', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie
cookie = Mechanize::Cookie.new :domain => '.yahoo.co.jp', :name => "JV", :value => "***********", :path => '/', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie
cookie = Mechanize::Cookie.new :domain => '.yahoo.co.jp', :name => "sB", :value => "***********", :path => '/', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie
cookie = Mechanize::Cookie.new :domain => '.yahoo.co.jp', :name => "SSL", :value => "***********", :path => '/', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie
cookie = Mechanize::Cookie.new :domain => '.yahoo.co.jp', :name => "T", :value => "***********", :path => '/', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie
cookie = Mechanize::Cookie.new :domain => '.yahoo.co.jp', :name => "Y", :value => "***********", :path => '/', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie
cookie = Mechanize::Cookie.new :domain => '.yahoo.co.jp', :name => "YLS", :value => "***********", :path => '/', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie
#ここから巡回してファイルをダウンロード
folderList = Array.new
folderList.push(topuniqid)
#folderListが空になるまで巡回する
while folderList.size != 0 do
 #folderListから一つ取り出す
 nowuniqid = folderList.pop
 #そのフォルダ内のファイルのリストが書かれたJSONを取得する
 urlstr = "https://box.yahoo.co.jp/api/v1/filelist/" + sid + "/" + nowuniqid + "?_=" + DateTime.now.strftime('%Q').to_s + "&"
 urlstr << "results=#{filenum_of_page}&start=1&output=json&sort=%2Bname&filetype=both&meta=1&thumbnail=1&tree=1&sharemembercount=1&ownerinfo=1&boxcrumb="
 urlstr << url_encode(crumb)
 begin
  agent.get(urlstr)
  jsonstr = JSON.parse(agent.page.body.to_s)
  # 複数ページが存在する場合はまず全ページたどってファイル情報を入手
  filenum = jsonstr['ObjectList']['TotalResultsAvailable'].to_s
  unless jsonstr['ObjectList']['Object'] == nil
   jsonstr['ObjectList']['Object'].each do |object|
    type = object['Type'].to_s
    name = object['Name'].to_s
    uniqid = object['UniqId'].to_s
    dlurl = object['Url'].to_s
    path = "." + object['Path'].to_s #パスの先頭にドットをつけないとうまく相対パスにならない
    #ファイルかフォルダかで処理を分岐
    if(type == 'file') then
     dlurl << "?appid=#{appid}&error_redirect=1&done=https%3A%2F%2Fbox.yahoo.co.jp%2Ferror%2Fdownload_error&boxcrumb="
     dlurl << url_encode(crumb)
     #dlurlからリダイレクトされたURLを取得 これがダウンロードリンク
     agent.get(dlurl)
     redirect_link = agent.page.uri.to_s
     #ファイルを保存
     #File.write(path, Net::HTTP.get(URI.parse(redirect_link)))
     open(redirect_link) do |file|
      open(path, "w+b") do |out|
       out.write(file.read)
      end
     end
     puts "Download #{path}"
    elsif(type == 'dir') then
     #folderListに追加してあとで巡回
     folderList.push(uniqid)
     Dir.mkdir(path)
    end
   end
  end
 rescue Exception => e
  puts e.message #=>divided by 0
  puts e.class #=>ZeroDivisionError
 end
end
```

このソースコードの
```
sid = "****"
topuniqid = "****"
crumb = "****"
appid = "****"
```

```
cookie = Mechanize::Cookie.new :domain => '.yahoo.co.jp', :name => "YLS", :value => "***********", :path => '/', :expires => (Date.today + 1).to_s
```
を埋めていきます


最初にクッキーのほうから

まず
https://webkaru.net/dev/google-chrome-extension-editthiscookie/
を入れましょう

クッキーを見るためのものです
ブラウザのクッキーを使うことで、APIの認証を突破します
いれた後に
https://box.yahoo.co.jp/user/viewer
にアクセスして、クッキーを表示してください
すると下記画面になるはずです

ここの「値」のパラメータを
```
cookie = Mechanize::Cookie.new :domain => '.yahoo.co.jp', :name => "YLS", :value => "***********", :path => '/', :expires => (Date.today + 1).to_s
```
のvalueに入れてください
ソースコードの:nameとcookieの.yahoo.co.jpの横の値が合致するように気を付けましょう
もし、ソースコードに不足していた場合、追加してください

これでクッキー側は完了です

sidとかを埋める


これはソースコードに埋め込まれているので、そこから頂戴します
chromeの右上からデベロッパーツールを開いてください

で、sourceのviewerを表示ください



するとこんな感じの中身になると思います
```
var PARMS = {'sid':"",'uniqid':"",'viewtype':"",'listformat':"",'query':"",'status':"",'rt':"0",'rf':"", 'tmp':"jhasdfgjkasdgf"},
    User  = {'sid':"box-l-jhasdfgjkasdgf-1001", 'uniqid':"jhasdfgjkasdgf-b87b-4e74-a54c-jhasdfgjkasdgf"},
    INIT  = {'guid':"jhasdfgjkasdgf",'bcrumb':"jhasdfgjkasdgf==",'browser':"Chrome",'version':"0.0",'slideshow':"supported",
             'appid':'jhasdfgjkasdgf--',
             'tmp':"1515329770"};
```
ここの
Userのsidをソースコードのsidに
Userのuniqidをソースコードのtopuniqidに
INITのbcrumbをソースコードのcrumbに
INITのappidをソースコードのappidに
反映してください

ファイルの実行

$ ruby ファイル名.rb で実行されます

'mechanize' がないという怒られ方をされたら
gem install mechanize
で入れてください
以上!

2018年1月6日土曜日

go言語触ってみた感想をつらつら

こんにちは

タイトル通り、go言語に触ってみたので、三流エンジニアが書いてみました

環境としては、GAE(Google App Engine)+Go言語

便利なところ
1. スレッド処理が簡単にかける
 ここら辺はよく聞きますが、実際に体感するとすごいですね。どうせ結構手間なんでしょ? とか思ってスレッド処理を描き始めたら、調べてから実装するまで30分ぐらいで終わりました。詳しくはchannelという言葉で調べてください。

2. コンパイラが事前に怒ってくる
 例えば、不要な変数とかあったらコンパイルエラー出して消すように言われる。あと、型が厳密なので、実際に動かす前にエラーになりそうな箇所を防ぐことができる

3. throwがない
 例外処理がありません。これはかなりの特徴だと思う。try-catchはgoto文に近くバグを生みやすい場所なので、とてもいいことだと思う。ちなみに、エラーかどうかはreturnの2つ目で返却するのが礼儀っぽい

4. デプロイ超簡単
 どっちかというと、GAEというかPaaSの利点だけど、デプロイがコマンド一発で終わるのはありがたい。



不便なところ
1. 英語の資料ぐらいしかない
 ライブラリの資料の日本語がほぼないです。といってもすごい簡単な英語なので、問題ないはず

2. マルチバイトとか特殊文字に弱い?
 goはruneという謎の型があり、マルチバイトはそっちの型の扱いになる。なので、stringを変換しようとするとrune含まれているからエラーが起きたりとかする。結構面倒。



というわけでざっくりだけど、よいgoライフを

MQTTでArduino YunとmyThingsとつなげ、IoTをやってみた

今回、紹介するのはArduinoでもIoTができるよ! というものになります
例えば、こんな感じです


これは、スマホをサーバを経由し、Arduinoに命令を出し、ロボットアームを動かしています
IoTに関しての何かを作る時とか、そもそも自分の作ったデバイスをネットに繋げる時に選択肢として真っ先に上がるのは、RaspberryPiだと思います
しかし、実はArduinoもIoTに対して様々な取り組みをしており、当然ネットにつながるボードも出しているのです!
ArduinoのIoTへの取り組み

YunとTianと呼ばれているArduinoがボードがまさにそれです
Yun


Tian


ArduinoのほうがRaspberryPiよりも電気回路については優秀ですし、わかりやすいため電気回路、ハードウェアがメインのものを作る時はYunとTianを使うのがいいとも思います
というわけで早速やってみたいと思います!

今回はArduino Yunを使います
やるならIoTだよね! ということで日本製IoTアプリのmyThingsとつなげてみたいと思います



大雑把なシステム構成はこうなります



myThingsを使って、ボタンを押したらArduinoに通知がいくようにします
最終的には、毎朝7時でかつその日が晴れだったらArduinoに通知がいくします!
というわけで、やることは3つ
1. IDCFCloudの設定
2. myThingsの設定
3. Arduino Yunの設定

IDCFCloudの設定について

サーバを設定しましょう!
自分はここら辺の記事を参考しました!
myThingsをはじめよう - Part2: IDCFクラウドに「IDCF」チャンネルをセットアップする
myThingsのIDCFチャンネルサーバを簡単につくる

まず、IDCFCloudにアクセスし、一番安いサーバを作りましょう。初期登録が必要なので、登録がまだの方はそちらも行ってください。

そして、IPアドレスの設定を行い、それを先ほど作ったサーバと紐付けてください

自分のIPアドレスの設定はこんな感じです


## 環境の構築
ssh でサーバにはいって、下記のコマンドを実行しましょう! すると環境が構築できます
```実行するコマンド
$ sudo apt-get update && sudo apt-get install -y git
$ mkdir ~/iot_apps && cd ~/iot_apps
$ git clone https://github.com/IDCFChannel/meshblu-compose
$ cd meshblu-compose
$ ./bootstrap.sh
$ docker-compose up -d openresty
$ cd ~/iot_apps/meshblu-compose
$ docker-compose run --rm iotutil register
```

それぞれの詳しいコマンドの意味はmyThingsをはじめよう - Part2: IDCFクラウドに「IDCF」チャンネルをセットアップするをみてください

210.XXX から始まるIPアドレスと、下記の2つの実行コマンドの結果はこの後も使うので、メモ帳などに残しておきましょう
```実行するコマンド
$ docker-compose run --rm iotutil owner
$ docker-compose run --rm iotutil list
```

myThingsの設定アプリのダウンロード
myThingsのアプリを入れましょう!




##組み合わせの設定と認証
次にこのQRコードを読み込んで、組み合わせを作ってください
「ボタンを押したら、IDCFサーバに通知する」組み合わせです

すると認証画面が出てくると思います



IPアドレスには、さきほどのIDCFのIPアドレス(210から始まるものです)
認証トークンには、IDCFで実行したこちらのコマンドで表示されたmeshblu_auth_tokenを入力してください
```
$ docker-compose run --rm iotutil owner
```

myThingsの設定はこれだけです!!

#Arduinoの設定
## 接続先のwifiの設定
まず、wifiの設定をします
ArduinoYunに電源を入れて、しばらく時間をおくとwifiの一覧に「Arduino Yun-XXXXXX」というものが出てきます

それに接続したあとに、http://arduino.local を開いてみてください!
すると、Arduinoの設定が始まります(初期パスワードは「arduino」です)

今後、Arduinoがどのwifiにつなぐか、といった設定を行ってください
最後まで設定すると、Arduinoの再起動が始まります

これまた時間を置いた後、さきほどArduinoがつながるwifiにPCもつなげ再度、http://arduino.local を開いてみてください

無事に開くことができたら、wifiの設定は完了です!

http://arduino.local を開いた画面


## MQTTライブラリの追加
MQTTで通信を行う為、ライブラリを入れる必要があります
今回はarduino-mqttを使っていきます!(名前わかりやすい)
https://github.com/256dpi/arduino-mqtt
まず、まるごどzipでDownloadします


そして、Arduinoから
スケッチ -> ライブラリをインクルード → .ZIP形式でライブラリをインストール
で先ほどダウンロードしたファイルを選んでください


すると、Contributedライブラリの一覧に「MQTT」というのが増えていると思います


これでライブラリの追加の完了です!
## プログラムの書き込み
https://github.com/hhata-hhajime/arduino_MQTT_sample/blob/master/simple_connect
にソースコードを置きました
適当に変数を書き換えてください
SERVER-IPADDRESSには、210から始まるIDCFのIPアドレス
ACTION1-UUIDとACTION1-TOKENには、IDCFで
```
$ docker-compose run --rm iotutil list
```
を実行した結果のaction-1のuuidとtokenを入力してください
プログラムの全文をこちらにも書いておきます
```
// SERVER-IPADDRESS, ACTION1-UUID, ACTION1-TOKEN is value
// sample values↓
// SERVER-IPADDRESS: 210.140.175.00
// ACTION1-UUID: 88d6d5f5-9553-456f-9264-389xxxxxxxx
// ACTION1-TOKEN: a828xxxxx
#include <Bridge.h>
#include <YunMQTTClient.h>

YunMQTTClient client;
void setup() {
  Bridge.begin();
  SerialUSB.begin(57600);
  client.begin("SERVER-IPADDRESS");
  connect();
}
void connect() {
  SerialUSB.print("connecting...");
  while (!client.connect("arduino", "ACTION1-UUID", "ACTION1-TOKEN")) {
    SerialUSB.print(".");
    delay(500);
  }
  SerialUSB.println("\nconnected!");
  client.subscribe("ACTION1-UUID");
}
void loop() {
  client.loop();
  if(!client.connected()) {
    connect();
  }
}
void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
  SerialUSB.print("messageReceived: ");
  SerialUSB.print(topic);
  SerialUSB.print(" - ");
  SerialUSB.print(payload);
  SerialUSB.println();
  if(payload.indexOf("connect_to_arduino") > 0)
  {
    SerialUSB.println("start something");
  }
}
```
ポートの設定をしたあとに書き込みボタンで完了です!
ポートの設定はこんな感じです


# 接続チェック!
最後に本当にできているか確認します
Arduinoでシリアルモニタを開き、myThingsでさっき作った組み合わせを実行します
そうすると、Arduinoは下記のようにメッセージを受け取れます
```
connecting...
connected!
messageReceived: 88d6d5f5-9553-456f-9264-389c7c71d6a5 - {"topic":"message","data":{"devices":["88d6d5f5-9553-456f-9264-389c7c71d6a5"],"payload":"connect_to_arduino!","fromUuid":"86c23cef-7e45-46d0-9a22-4556114c188c"}}
```


payloadに組み合わせのメッセージ部分に入力したテキストが取得できるので、ここから条件式をつけて、いろいろアウトプットを変化させることもできます

長くなってしまいましたが、これで接続できました!
ちなみに↓の組み合わせを使うと、自動で晴れの日の朝7時になったらArduinoに通知がいくようになります!

「天気で晴れだったら、IDCFで通知する」組み合わせです!

ちなみに自分はこれで自動で動くカーテンを自作中です
それでは、みなさん良いIoTライフを!

2018年1月3日水曜日

マンガコマッタラーについて

お久しぶりです

マンガコマッタラー、という面白いサービスを見つけたので、紹介します


このサイトどういうことができるかというと、マンガの「コマ割り」を文章から自動で生成するサービスです



つまり、
1. 文章を入れて
2. 生成ボタンを押すと
3. マンガのコマ割りができています

マンガを作ったことない自分でも気軽に使うことができました
生成に3~8秒ほどかかるけど

試しに作ったやつが下です
文章:
> おお、これはなんかよさそうなサービスだ
> 今後、こういうものを作っていきたい
> だけど、工数すごくかかるんだろうなぁ
> でも、根性を出せばできるはずだー!!
> おまけおまけおまけおまけおまけおまけ
> おまけおまけおまけ


できた画像



少し突っ込んだ話をすると
  • 横幅1125px 縦幅1650px
  • コマの中は透過(吹き出しを除く)
という風になっているみたいです

商用フリーのため、皆さんもコマ割りに困っている人は使ってみてはいかがでしょうか?

公式はアカウントはtwitterのようですね
https://twitter.com/MangaCreatorInf


ではでは