モノクロタイム

I'm from the future!

【React】axiosを使用してmultipart/form-data形式の通信をする

こんにちは、れいじです。

年末なので趣味の開発に時間をつぎ込んでいます。Webサービスを作っているのですが、あまり複雑なシステムではないのでreduxなどは導入せずにシンプルに作っています。

APIとの通信に使用するモジュールとしてはredux-sagaとかredux-thunkとかまぁいろいろあるわけですが、上述の通りreduxは導入しないのでこれらは候補に入りません。

なので最近ナウいと噂のaxiosを使用してAPI通信を実装したいと思います。

github.com

やりたいこと

  • ReactAppでAPI通信をする。今回は画像を受け取り、APIに投げる処理を実装したい。

  • 画像をポストする場合の通信形式はmultipart/form-dataとする。

  • 通信メソッドはPOST。

ボタン側

※UIデザインにmaterial-uiを使用しています。そのあたりの記述はうまく読解してもらえればと

material-ui.com

<div>
    <input accept="image/*" multiple type="file" className="input" id="upload-img" onChange={this.uploadFile.bind(this)} />
    <label htmlFor="upload-img">
        <Button variant="contained" component="span" color="secondary" aria-label="Add" className="uploadIcon">
              <CameraIcon />
              UPLOAD
         </Button>
    </label>
</div>

ボタンを押すとファイル選択用ブラウザが開きます。画像を選択した後は、取得した画像をAPIにポストします。

画像を受け付ける部分(uploadFile())

 uploadFile(e) {
    this.setState({
      file: e.target.files[0],
    }, () => {
      this.sendFile();
    });
  };

最新の画像をStateに保持・更新した後にAPIに画像を送ります。

画像をAPIに送信する部分(sendFile())

いよいよaxiosが出てくる部分です

  sendFile() {
    // show loading modal
    this.setState({isLoading: true});
    const params = new FormData();
    params.append('file', this.state.file);
    axios
      .post(
        'https://api/upload',
        params,
        {
          headers: {
            'content-type': 'multipart/form-data',
          },
        }
      )
      .then((result) => {
        this.setState({
          isLoading: false
        });
      },
      )
      .catch(() => {
        console.log('upload failed...');
        this.setState({
          isLoading: false
        });
      });

axiosでPOST通信をするときのTipsとして、paramsをそのままjson形式で送信すると通信メソッドを.postで定義していてもOPTIONになってしまいます。

参考:

qiita.com

ここではパラメータをURLSearchParams()で定義してあげているのですが、今回私はmultipart/form-dataでデータを送りたいので、

const params = new FormData();
params.append('file', this.state.file);

と指定しています。

さらにヘッダーにも

{
    headers: {
        'content-type': 'multipart/form-data',
    },
}

をつけてあげます。これでOK。

f:id:yomoyamareiji:20181231112904p:plain

いいかんじにpostできました。

【vvvv Advent Calendar 2018】vvvvの薄い本を3冊書いて技術書典4/5で頒布していました

こちらの記事は「vvvv Advent Calendar 2018」の19日目の記事です

qiita.com

こんにちは,れいじです.

2018年は割とvvvvをあれこれやってた年でして,具体的には本書いてました(Not 商業誌)

2017年末にHackDay 10th Aniv.で受賞→YJTC2018でShakeを支える技術という本を無料配布していたので,これを皮切りに執筆やり始めたっていう流れです.

詳しくはこちら↓ reiji1020.hatenablog.com

書いたもの

vvvvでCGプログラミングやってみる本ービジュアルプログラミングことはじめー

4月に行われた技術書典4でこちらを頒布しました.

https://gyaopan.booth.pm/items/824607gyaopan.booth.pm

vvvvのハンズオン本です.そもそもvvvv知らないっていう人から若干知ってる~くらいの人まで多くの方に手に取っていただきました.

頒布時点で最新バージョンのvvvvのインストール~vvvvでのビジュアルプログラミングを行うための基本的なところ~実際にCGを作ってみる部分までを解説しています.

私のブースで立ち止まってくれる方はどの方もオシャレというか,「あっクリエイターさんかな?」って感じで割と同業っぽい感じがすぐわかる方が多かった気がします.

冊子版は完売してしまって再販の予定がないのですが,電子版はBoothにてワンコインで買うことができます.

vvvvでCGプログラミングやってみる本ーSpreadをマスターしてステップアップ!ー

2冊目は10月に行われた技術書典5で頒布しました.

gyaopan.booth.pm

こちらはvvvvのインストール~Spread周りを中心に解説,実際にCGを作る部分を通して本格的なパッチングに挑戦するための本でした.

ステップアップと題したこともあり,もともとvvvvについて少し知っている方向けに書いていますが初心者でも大丈夫です(大丈夫な感じに書いたつもりでした…!)

比較的新しいvvvv(vvvv50系以降)ではSpreadの種類が増え,様々なSpreadを簡単に作ることができるようになりました.これらの使用方法や実際のCGでの活用方法などを1冊にまとめた本でした.

こちらは冊子版・電子版ともにBoothより通販が可能です.

vvvvでCGプログラミングやってみる本ーマイクやKinectを使ってみよう!ー

こちら3冊目ですが,同じく10月に行われた技術書典5で頒布しました.

gyaopan.booth.pm

こちらは実際に外部接続機器を使用してCGを作ってみるTipsの詰め合わせ本になります.

余談ですが1冊目がグレースケール印刷だったのに対し,2冊目と3冊目はフルカラー印刷です.

USBカメラの他,MIDIキーボードの扱い方についても記述しています.

こちらも冊子版・電子版ともにBoothで通販を行っています.

vvvv本は反響があったか

正直ハンズオン本はかなり売れましたが,その後のステップアップ本まで進んでくれる方はまだまだ少ないです.

そろそろ「vvvvをはじめるための動機付け」が必要なのかなーと思っています.vvvvの使い方を提示するのではなくて,「vvvv使うとこんなことできるよー」的な感じ.

そもそも学ぶ動機がないとやってみよう!ってならないですよね.そのためにも採用実績とかは公開していった方がいいのかなーとか思います.

最近は世界中のパッチャーの作品やイベントでの採用実績などの報告が多く(結構有名どころのメーカー・イベントがvvvv,VLを使ったりしている),vvvv公式サイトのブログは頻繁に覗くようにしているのですがまだまだ日本は実績が少ない…!日本でもガンガン実績作って知名度上げていきたいですね.弊社コラボしてくれ頼む…

と思ってたら地味にHackDay2018の弊社ブースでvvvvで作った作品が体験できたのだった.シルエットでダンスを楽しむ「VANCE」という作品を展示していました.ヤフーブースだけどちゃんとCANDY CHUPS Lab.名義で出してもらったよ.

hackday.jp

来年はvvvv本を出すのか

多分出しますし,ニッチのさらにニッチを突く本(VL徹底解説)とか出したいなーとぼんやり考えてます.でも冊子版は作らないかも.

あとは上記3冊を1冊にまとめたコンプリート版とかも出すと思います.これは冊子にすると思う.vvvv本だとやっぱりvvvvookが偉大な教科書的立ち位置なので,私が書いた本はサブ的に使ってもらえる本になればいいなーと考えてます.

おまけ

実は明日「U-30 Yahoo! JAPAN Tech Advent Calendar 2018」で私が書いた記事が公開されます.vvvvの話もちょっと出ますが,大枠としてはメディアアートとかビジュアルプログラミングについての話になります.

挿絵とかも頑張って書いたのでみてみてくださいね.

techblog.yahoo.co.jp

ではでは!

【vvvv】Rekorderノードについて

vvvvでgif動画の書き出しを行うときは「Rekorder」ノードを使うと便利です,Twitterにアップする動画とかを気軽に録画できるのでめっちゃいい.

vvvv.org

訳あってvvvvのRendererの動作画面を連続的にgif書き出し+サーバにアップロードする必要があったのだけど,Rekorderノードは

・ctrl+4で録画開始→再度ctrl+4を押されるまで録画

するのではなく

・crtl+4で録画開始→約10秒ほどのgif動画を書き出す→別ファイルとして再度10秒ほど録画を開始→(これの繰り返し)

らしい.違ったらすみません

約10秒ほどっていうのは,フレームに直すと大体300フレームくらいです

保存先のディレクトリ名もファイル名も自由に変更できるので,わりと自由度高そうで良かった.

というメモ書きでした...

【vvvv】vvvv x LattePanda x RaspberryPi Zeroでデジタルサイネージをつくる

こんにちは,れいじです.

以前Raspberry Piで作ったWebAPIサーバと接続して,現時点の降水強度を表示するデバイスを作りました.

reiji1020.hatenablog.com

用意するもの

LattePanda 4GB/64GB

メモリ4GB,ストレージ64GBでWindows10が載った小型PCです.vvvvはWindows上でしか動作しないので,これを使って小型サイネージを作成します.

Lattepanda用散熱ファン

Lattepandaは熱を発しやすいので熱を放出してあげないと熱暴走でシャットダウンしたりします.通常使いの場合はヒートシンクでも十分ですが(所説あり),今回はvvvvを連続で動作させるため通常時よりも高い発熱が予想されます.ファンを付ければ急なシャットダウンのリスクを軽減することができます.

ケース

木製のケースです.中国の組み木の技術を使っているそうで,一見するとかなり簡素な作りに見えますが頑丈です.通気口もきちんとあるので,中に熱がこもるなどの心配もありませんでした.

ファンを取り付けたら下蓋が閉じなくなった

7インチIPSディスプレイ

LattePanda用の7インチディスプレイです.解像度が高く,IoTデバイス用のディスプレイの中では安価なのに満足度が高い商品でした.かなり薄いので,強く摘まんだら割れそうで怖い…

本当はスタンドみたいなのに入れたほうがいいと思うんですが,PC化ケースがめっちゃ高いんすよね…

[asin:B01GJL87NK:detail]

パッチ

API接続側

f:id:yomoyamareiji:20181014123058p:plain

基本的にAPI関連はHTTPGet/Postノードを使うとよしなな感じでデータの送受信が可能です.念のためRenderer(TTY)でデバッグ画面も表示しています.

GetElementを使用すれば,APIの各要素(Data,Rainfall...)にアクセスし,情報の取得ができます.今回は現時点~60分後までの予報情報が返ってくるので,7つのSliceを持つSpreadを返却するようにしています.

ディスプレイ側

f:id:yomoyamareiji:20181014135319p:plain

Particleやら3Dオブジェクトやらを駆使すると確実に熱暴走でシャットダウンするので,表示部分は軽めに作りました.

f:id:yomoyamareiji:20181014135427p:plain

降水強度によって背景色が変化します.

f:id:yomoyamareiji:20181014135458p:plain

f:id:yomoyamareiji:20181014135509p:plain

f:id:yomoyamareiji:20181014135519p:plain

7インチといってもやはり画面の大きさは限られていますので,現時点の降水強度を表示するだけにとどめています(予測値まで表示すると画面がごちゃごちゃ…)

結構ファンの音がうるさいのでベッドサイドに設置するのはやめました.あ,ヒートシンクで冷却賄うなら静音だけどやっぱりシャットダウンが怖いです.

家には掛け時計がないので,時間が表示されているのもポイント高いです.

Lattepandaのハイエンドモデルを買えばもうちょっとリッチな表現も可能になりそうです.

ではでは~