Quantcast
Channel: マルシテイア
Viewing all 186 articles
Browse latest View live

asyncを書くのも面倒なのでasync-nodeを作った

$
0
0

https://cloud.githubusercontent.com/assets/1403842/24457202/7dca1bce-14d0-11e7-9df7-d1a674b46198.png

ちょっとスクレイピングする機会があり、Nightmareでスクリプトを書いたんだけど、Promiseをベタベタ書いたりする必要があって面倒だった。 Node.js v7.6.0からはasync/awaitが使えるようになったけど、スクリプト全体をasync functionで囲んだり .catch()する必要があったりして、ノイズが多い。

というわけで、トップレベルにいきなり awaitを書いても実行できる async-nodeというコマンドを作った。

github.com

インストール

npm i -g @fand/async-node

使用例1) GIPHYから画像をダウンロード

giphy_opt

Nightmareで画像を検索し、kevva/downloadで手元にダウンロードするスクリプト

ソース: https://github.com/fand/async-node/tree/master/examples/image-downloader

使用例2) MongoDBのデータを取得/挿入

$ async-node mongo.js -s'{"name":"foo"}'# 挿入
$ async-node mongo.js -g'{"name":"foo"}'# 取得

ソース: https://github.com/fand/async-node/tree/master/examples/mongo

どうぞご利用ください🔪🔪🔪


ハンズオンを円滑に進めるテク

$
0
0

新人教育の時期ですね。
みなさん研修資料の準備は大丈夫ですか?

僕はこの前Reactのハンズオンをやったんだけど、そこで心がけた事や学んだ事を共有します。
ハンズオンの内容については既に記事を書いたけど、細かい所を書ききれなかった。
amagitakayosi.hatenablog.com

新人研修やインターンでも使えるテクでなので、ご参考に。

やったこと

最初に完成形を提示する

ハンズオンで作るアプリについて、動画で説明した。
最終的な目標がわかると、今やっている作業の意味がわかりやすくなる。

いくつかのステップに分けて説明する

今回のハンズオンでは、8つのステップにわけて実装を進めた。
ステップ毎にテーマを与える事ができるし、ハンズオン自体の進捗もわかりやすくなる。

ステップ毎に足並みを揃える

ハンズオンでは、一度置いていかれると追いつくのが難しい。
参加者の進捗は頻繁に確認すること。

挙手を多用する

「出来ましたか?」って聞いても、答えてくれる人は少ないので、「出来たひと〜?」って挙手してもらうとよい。
(今回は挙手してもらいすぎたかも……)

お手本ブランチを用意する

ちょっと変則的なんだけど、今回はお手本ブランチを用意して、困ったときに参照できるようにした。
このブランチはステップ毎にgitのタグを打ってある。
ちょっと遅れたとしても、 git checkout step-2等とすれば追いつけるようになっている。

スクリーンショットを多用する

わかりやすさは 画像/動画 >>>文字 >>>>>>>>口頭での説明だと考えてる。
複雑な所では、keynoteやSkitchの機能で注釈を入れると良い。

動画のつくりかた
動画つくるの、実はそんなに面倒ではない。
Macの場合の手順は次のとおり。
スライドの冒頭で、教科書や資料へのリンクを表示する

資料は事前に共有されたい!
作業のペースは人によって違うので、手元で資料を見れるとグッと進めやすくなります。

会場のWiFi情報なども載せておくとラッキー。

前日にTwitterで事前準備をお願いする

git clonenpm installといった、時間のかかる作業は事前にお願いしておくと良い。

学んだこと

参加者同士の協力をお願いする

開始時に「参加者の皆さん同士で助け合ってくださいね!(^~^)」とか言っておくと良い。
Reactハンズオンでは、何も言わずとも良い感じに助け合ってくれて、とても助かった。

来場者の前提知識をハッキリさせる

gitを知らない人がgit checkoutできなくて困ってた。
必要な知識をリストアップして、事前に共有しておくと良い。
発表資料には、前提知識のない人のために適切な教材へのリンクなどを貼っておくとよい。
(当日解説してもいいが、往々にして時間が足りなくなる)

以上です

明日はエイプリルフールですね。皆様のご入社をお待ちしております。

Scala入門としてCLIツールを作り、Scala.js, React, ScalaCSSでサイトを作った

$
0
0

fand.github.io

今年2月からScalaのチームに異動し、Scala入門している。

2月中はゆっくりコップ本を読んでいたのだけど、やっぱり手を動かさないと自信が付かないので、何かツールを作る事にした。
ついでにGitHub PagesもScala.jsやScalaCSSで実装してみた。

つくったツール

github.com

!!! 実用性は度外視しています !!!

レポジトリをまるごとコピーしてくれるやつ。
ブランチを移動する度にコンパイルで時間かかるのを回避するため、ブランチ毎にコピーしたらいいのでは、という発想(上手く行ってるかはわからない……)。
手で cp -rするのが一番はやいし、ツールを作るにしても普段だったらJSで書くとこだけど、今回はせっかくなのでScalaCLIツールを作ってみた。

使い方

brewでインストール可能。

$ brew tap fand/clonepool
$ brew tap fand/clonepool

clonepool -hでかっこいいヘルプが出る。

f:id:amagitakayosi:20170407162300p:plain

仕組み

内部では motemen/ghqpeco/pecoを利用している。
$ clonepool rails/rails my-branchと入力すると以下の処理が走る。

  • $ ghq get rails/railsにより、 $(ghq root)/github.com/rails/railsにレポジトリがクローンされる
  • ~/.clonepool/github.com/rails/rails/my-branchにコピーを作成
  • my-branchブランチにチェックアウト

引数なしで $ clonepoolとすると ~/.clonepool以下のディレクトリを一覧できる。
cd $(clonepool | peco)とすると絞り込みつつ移動できて便利。

f:id:amagitakayosi:20170407162312g:plain

実装について

ほとんど scala.sys.process.Process を利用してシェルコマンドを実行しているだけ。
Gitレポジトリの操作ということで、最初はJGitを利用していたんだけど、シェルコマンドを利用したほうが楽なことがわかったのでやめてしまった。

Processの実行は scala.util.control.Exception.allCatch でラップしている。
allCatch {}は、ブロックを評価した結果をSomeで返し、例外が出たらNoneを返してくれる。

seratch.hatenablog.jp

個人的には、CLIツールを実装するときは気軽に死にたい。
JSだと、大部分ををPromiseベースで実装して、一番外側で全部catchするというのをよくやっている。
今回は getOrThrowという関数を作って、気軽に死ねるようにした。

https://github.com/fand/clonepool/blob/master/src/main/scala/example/Util.scala#L9

CLIツールを作るためのライブラリは SCOPTCLISTなどがあるが、あんまり好みじゃなかったので今回は利用していない。
かっこいいヘルプは ansi-interpolaterを利用して実装した。

homebrewでインストールできるように

Scalaのライブラリは、maven centralに登録したり、オレオレmavenレポジトリを作って公開するらしいけど、CLIツールを配布できるか良くわからなかった。
conscriptを使えば簡単に配布できるらしいけど、利用者もconscriptをインストールする必要があってなんか面倒。
sbtはhomebrewで配布されているので、今回はsbtを真似てみることにした。

今回つくったformulaはこんな感じ。

https://github.com/fand/homebrew-clonepool/blob/master/clonepool.rb

sbtのformulaと大体同じ。
jarファイルをlibexecに配置し、bin/clonepoolに java -jar clonepool.jarするシェルスクリプトを置いている。

jarファイルはsbt-assemblyというsbtプラグインを利用している。
$ sbt assemblyを実行すると勝手にjarが出来て便利。

github.com

GitHub Pagesについて

http://fand.github.io/clonepool

今回の目的はScala入門、ということでGitHub PagesもScala.js + ScalaCSS + Reactで構成した。
Octocatをクリック(またはタップ)すると回転します。

f:id:amagitakayosi:20170407162432g:plain

Scala.js

www.scala-js.org

AltJSの一種。Scalaで書かれたコードをJSに変換する。
一昔前に「機能もヤバいしファイルサイズもデカ過ぎてヤバい」って話題になってたけど、今では大分マシになってる。
今回のコードはgzip圧縮済みで122 KBだ。

sbt fastOptJSまたは sbt fullOptJSコンパイルする。
~fastOptJSとするとファイル変更をwatchしてくれる。
fullOptJSを実行すると70秒かかる……。

この前Webpack用のローダーが公開されたりしてたけど、今回はsbtで開発した。

https://github.com/mrdziuban/scalajs-loader

Scala.js自体の内容に関しては特に言うことなくて、ふつうにScalaって感じ。
ただ、あるクラスの子オブジェクト一覧を取得したくて scala.reflect.runtime を使おうとしたけど、なんか上手くいかなかったな、そういえば。

scalajs-react

Scalaは現代的な言語なのでReactも書けます

github.com

Scala.jsからReactを利用するためのライブラリ。 JSXの代わりに、 <.div()とか ^.src := "hoge"みたいな感じでDOMを記述する。

import japgolly.scalajs.react.vdom.html_<^._

<.ol(
  ^.id     := "my-list",
  ^.lang   := "en",
  ^.margin := 8.px,
  <.li("Item 1"),
  <.li("Item 2"))

(ドキュメントより抜粋)

記法自体は慣れたらそんなに難しくない。
しかし、コンポーネント自体とは別にBackendというクラスを書く必要があったり、独自の概念がたくさんあって大変。
何より実装がほとんど読めないのがしんどい……。

ScalaCSS

CSSScalaで書ける時代……!

github.com

scalajs-reactと同じ作者が開発している。
Super type-safe CSSとのこと。???????
例えば、widthなどのピクセルを指定する場所に無効な文字列を書くと、型が合わないといって怒ってくれる。

ScalaCSSはStandalone APIとInline APIの2種類のAPIを持つ。
単なるAltCSSとして使う時は Standalone APIを、CSS in JSを行なうときはInline APIを利用する。
今回は、コンポーネント毎のスタイルはInline APIで生成し、ページ全体で共通のスタイルはStandalone APIを利用して記述した。

この辺はtakezoeさんの記事で解説されてる。

takezoe.hatenablog.com

CSS in JSライブラリとしては、生成されるクラス名が .MyComponent--buttonのように予想しやすいクラス名になってしまうのが難点。 (多くのCSS in JSライブラリでは、クラス名をランダムな文字列にすることで、意図しないクラス名の衝突を回避している)

他にも、コンパイル時間が長かったり、対応していないCSSプロパティが多いので、得られる恩恵も割に合わない気がする……。 が、これも慣れてしまえば、書くの自体はそんなに難しくない。

最終的なコンポーネントの定義は以下のようになった。

package io.github.fand.clonepool.docs.components
import japgolly.scalajs.react._, vdom.html_<^._
import scalacss.Defaults._
import scalacss.ScalaCssReact._

object Link {
  val component = ScalaComponent.builder[Tuple2[String, String]]("Link")
    .render_P(t =>
      <.a(
        LinkStyle.link,
        ^.href := t._2,
        t._1
      )
    )
    .build
}

object LinkStyle extends StyleSheet.Inline {
  import dsl._
  val link = style(
    color(c"#EFF"),
    pointerEvents := "auto"
  )
}

その他

Sketchでロゴをつくったり、 http://realfavicongenerator.net/favicon生成したりした

今回学んだこと

  • Scala
    • allCatchで雑にエラーを扱う方法
    • Scala.js
    • Scala.js + React
    • ScalaCSS
  • homebrewのformulaを書く方法

今度はGolang + GopherJS入門しようかな〜〜

ハーフマラソンに出場してきた

$
0
0

f:id:amagitakayosi:20170417173353p:plain

3月末、大阪で開催されたハーフマラソンに出場した。
ついでにスーパー銭湯でのんびりしたり、鶴橋で焼肉を食べたりした。

マラソン

淀川沿いを往復するやつ。

第7回 淀川国際ハーフマラソン|サンスポマラソン

去年なんとなくジョギングしてた時22キロくらい走ってたりしたので、まあ行けるでしょ、というノリでエントリーした。
しかし、マラソン大会の経験は当然無いし、子供の頃から体力ゼロで通してきたので、結構不安になって朝のジョギングの頻度を上げたりしていた。
目標は低く、「完走できればOK」とした。

天気予報によると当日は午後から雨だったので、前日にはスポーツショップや100均に買い出しに行った。
ウエストバッグは持っていたものの、重さや収納を考えて、こちらの商品を購入した。

FlipBelt(フリップベルト) スポーツウエストポーチ FBB ブラック M

FlipBelt(フリップベルト) スポーツウエストポーチ FBB ブラック M

当日午前中は良い感じに涼しい天気だった。
ファミリーコース?みたいなのもあり、家族連れがおおい。
主催の人が歌ってたり、NMB?かなんかの曲にあわせて準備体操が始まったり、平和な感じ。

これ司会してるのラジオDJかなんかかと思ったけど、どうやら有森裕子本人らしかった。異常にテンション高い。
有森さん、スタート地点でも「いってらっしゃーい頑張って〜!フォォォおお!!」みたいな感じで、やっぱアスリートってエネルギーすごいんだなって思った。

序盤は「エッこんなゆっくり走っててもみんなスイスイ追い抜けちゃうの?」って思うくらい楽々で、道路脇の芝生の部分を走ってたりしたんだけど、これが裏目に出たのか、半分すぎた辺りから追い抜かれることが多くなった。
追い抜かれると焦ってしまって余計しんどくなるので、後半は目をつぶって走ったりしてた。

給水所では、水のほかにも一口大にカットされたアンパンやクリームパンが配られていた。
意外と制限時間までは全然余裕だったので、ちょっと立ち止まって味わって食べた。

最後のほうは足が半分麻痺してたけど、どうにか完走出来てよかった。
順位を見ると半分より下なのでやっぱり悔しい気はする。

こちらは当日のようすです。
走りながら撮るのも楽しい。

スーパー銭湯

マラソンのあとは、会場から電車で30分ほどのスーパー銭湯へ向かった。
街なかにあり、程よい広さでいろんな種類のお湯に浸かれて便利。

www.nobuta123.co.jp

日曜の夕方だが、部活帰りの少年たちが非常に多かった。
高校生や大学生のバイトが大量に働いていたのもあり、自分が大人サイドの人間って感じがしてしまう。

銭湯なのに美容室やレストランが併設されていたり、建物内の施設では自販機含め全て独自システムで決済したりと、一つの国家のような様相を呈していた。

鶴橋で焼肉

たっぷり筋肉を痛めつけたという名目で焼肉へ。
以前から鶴橋に行きたかったんだよ

www.yakinikusora.jp

鶴橋は焼肉屋さんだらけだが、今回は一番有名っぽいとこにした。
ホルモン5種盛りがお得で旨い。

ごちそうさまでした。

expo.ioを使ってリアルタイムにReact Nativeアプリを開発する

$
0
0

f:id:amagitakayosi:20170417212408j:plain

1年ぶり3度目のReact Native入門してるんだけど、expo.ioっていうサービスがメッチャ便利そうだったので紹介します。
何がどう便利かっていうと、

  • ケーブルなしで、実機の動作確認ができる
  • もちろんコード変更も即座に反映される
  • 開発版アプリの配布がワンタッチでできる
  • 便利なReactコンポーネントもついてくる

youtu.be

expo.io とは

React Nativeでのアプリ開発を支援するサービスです。
公式サイトはこちら。めっちゃ素朴……

expo.io

expoは create-react-native-appXDEexpo clientといったツールを公開しています。

  • create-react-native-app: アプリの雛形を作るCLIツール
  • XDE: アプリ開発を支援するデスクトップアプリ。実機のログをみたり、アプリを再起動したりできる
  • expo client: 開発中のアプリを実機にインストールするためのクライアント

今回はこれらを使ってReact Nativアプリケーションを開発する方法を紹介します。

事前準備

インストールするものは多いけど、設定はほぼ不要です!

開発フロー

基本的な開発の流れはこんな感じ。

  1. create-react-native-appでアプリの雛形を作成
  2. npm startして、実機で確認しつつ開発
  3. リリースビルドを作ってストアに公開

create-react-native-app

create-react-appみたいなやつです。
基本的な操作は create-react-app と同じ。
facebook公式みたいな名前なのはちょっと邪悪な感じする……;;)

$ create-react-native-app my-appとすると、 my-appディレクトリにアプリの雛形が作成されます。
雛形はかなりシンプルになっており、 .xcodeprojファイルすら存在しません。
expoでは、アプリケーションの配布・ビルドを独自のしくみで行なうため、これだけで充分なようです。

f:id:amagitakayosi:20170417222536p:plain

実機で確認しつつ開発

npm startすると、react-nativeのパッケージャーにより、JSのビルドが始まります。
同時に、ターミナルに巨大なQRコードが出現します。かっこいい。

f:id:amagitakayosi:20170417223418p:plain

手元のデバイスにインストールした expo client でこのQRコードを読み取ると、開発中のアプリケーションがexpo clientにインストールされます。
これによって、ケーブルなしでも実機で動作確認しつつ開発を進めることができます。

ReactでふつうにWeb開発してるような気分。

開発中のアプリを配布

XDE上にある「Publish」ボタンを押すと、開発中のアプリを配布するためのリンクが生成されます。
これにより、アプリを社内リリースしたり、友達にだけリリースしたりといったことができます。

f:id:amagitakayosi:20170417224311p:plain

ほぼ雛形の状態でPublishを押したのがこちら。
インストールにはexpo clientが必要です。

my-app — Expo

リリースビルド

Building Standalone Apps | Expo v15.0.0 documentation

expo clientなしで、普通にApp Storeから配布するためには、expというツールでビルドする必要があります。
今回はリリースまでやってないけど、iOS版のリリースビルドを作成する手順はこんな感じみたいです。

  1. $ npm i -g exp && exp login
  2. exp.jsonを作成
  3. exp start
  4. 別のターミナルで exp build:iosを実行

便利コンポーネントがついてくる

create-react-native-appで作ったアプリには、最初から expoがインストールされている。
わかりやすいところだと、画像を選択するImagePickerや、地図を表示する MapViewOpenGLの描画を行なうGLViewなどがある。

感想

前回React Native入門した時は全然ビルドできなくてハマってたんだけど、今回はexpoのおかげでめっちゃ気軽に開発を開始できた。
FAQにも「いまのところ有料にする予定はない」って書いてあるし、良いんじゃないですかね。

シェーダーからGIFアニメを生成するツール作った

$
0
0

f:id:amagitakayosi:20170509074747g:plain

github.com

シェーダーは、本来は3Dプログラムで物体に影をつけたり、視覚的なエフェクトを与えるための仕組みだ。
しかし、シェーダーだけで複雑なグラフィックを表現する事もでき、GLSL SandboxShadertoyには大量の作品が投稿されている。

今回は、フラグメントシェーダーのファイルからGIFアニメを生成するツールを作成した。
これを使うと、冒頭のGIF動画のようなものが作ることができる。
また、npmパッケージになっているので、フロントエンド開発のフローに沿ってシェーダーのサムネイルを作成できる。

実装はgistに転がってたスクリプトを参考にしている。

offscreen rendering with three.js and headless-gl, in coffee-script · GitHub

使い方

npm install -g glsl2imgすると、 glsl2pngコマンドと glsl2gifコマンドがインストールされる。

glsl2png

フラグメントシェーダのファイルを読みこんで、PNG画像を生成する。

$ glsl2png foo.frag             # out.pngを出力
$ glsl2png foo.frag -o foo.png  # foo.pngを出力
$ glsl2png foo.frag -s 640x360  # 画像サイズを指定

出力結果はこんな感じ。

https://cloud.githubusercontent.com/assets/1403842/25777407/30317b7c-3317-11e7-8dd1-b293f6a6091f.png

uniform変数は、デフォルトで time, resolutionを受け取れる。
time-tオプションで指定できる。
それ以外のuniform変数を指定する場合は、 -uオプションでThree.jsのuniformの形式のJSONを受け取れる。

# どっちも同じ結果になる
$ glsl2png foo.frag -t10
$ glsl2png foo.frag -u'{"time": { "type": "f", "value": 10.0 } }'

glsl2gif

フラグメントシェーダのファイルを読みこんで、GIFアニメを生成する。
デフォルトでは、15fps / 長さ1秒のアニメを作成する。
fpsと長さは -r-lオプションで指定できる。

$ glsl2gif foo.frag             # out.gifを出力
$ glsl2gif foo.frag -o foo.gif  # foo.gifを出力
$ glsl2gif foo.frag -s 640x360  # 画像サイズを指定
$ glsl2gif foo.frag -r30# 30fps
$ glsl2gif foo.frag -l10# 10秒

結果はこんな感じ

f:id:amagitakayosi:20170509075058g:plain

この記事の冒頭のGIFは、このシェーダーに -r 30 -l 2を指定して作った。

shader sample · GitHub

桜2017

$
0
0

ことしも桜の時期ですね v(^-^)v

蹴上

このあとユーフォ2期見たらOPに蹴上インクライン出てきて興奮した。

穴場

写真は暗いけど、綺麗だし静かでよい所だった。
穴場なので場所は内緒です。

上賀茂神社の西

中学生がブラバンやってて和む。 鴨川、本当に金管楽器の練習してる学生がおり、これまでそういった人々とは無縁な子供時代を送ってきた僕は「これが川か……」と感激する。

デルタ

ジョギング中に撮ったやつ。 この時、調子に乗って斜面に乗り出してたらiPhone落として液晶割れた……。

岡崎

通勤路

みなさん京都に引っ越しましょう

毎日GLSLでアニメーションを作ってる

$
0
0

最近GLSLやWebGLの世界に入門して、毎日こんなアニメーションを作っている。

4月末、東京に出張する機会があり、ついでに何か面白いイベントや展示がないか探していると、チャネルというイベントを見つけた。
以前から気になっていたBRDG/VRDG方面のイベントらしい。
会場は六本木のSuperdeluxe。出張先のオフィスからも近いので、少し早退して行ってみる事にした。

そこではハードな電子音に合わせて、GLSLやHaskellのライブコーディングによるVJが行われていた。

そのあまりのクオリティの高さに衝撃を受け、GWごろから少しずつ、ほぼ毎日GLSLを書いている。

GLSLとは

OpenGL Shading Languageの略。
OpenGLWebGLなどの3Dグラフィックス環境において、オブジェクトの影や色を計算するために作られた言語だ。
GPUのパワーを簡単に引き出すことができ、複雑なアニメーションをリアルタイムに実現できる。

元々は影を計算したりテクスチャを貼ったりするための物だったけど、GPUパワーに目をつけた人たちがGLSL単体でアート活動をし始めて、現在では独特なコミュニティを形成している。
GLSL SandboxShadertoyには、異常な努力と才能によって書かれたアニメーションが溢れている。

GLSLはいわゆるメガデモ界隈でも愛用されている。
日本のデモパーティTokyo Demo Festでは、GLSLだけで作品を作るコンテストがあったりする。

tokyodemofest.jp

僕の活動

GLSLを書いたり、GLSLからGIFアニメを生成するツールを作ったりしているので見てくれ!!

fand/webgl-study

fand.github.io

これまでに作ったアニメーションとその制作メモをGitHub Pagesにまとめている。

GLSLを動作させる環境は、Three.jsを利用して自分で実装した。
Shadertoy等を利用することも考えたが、いずれGLSLだけでなくWebGL全般について学んでいきたいと思っているので、GLSL環境から自分で構築することにした。

技術的には、glslifyとWebpackを組み合わせている。
glslifyはGLSLのコードをbrowserifyのようにバンドルするためのツール。
Webpack用のloaderも提供されていたり、glslifyを前提としたライブラリがnpmで公開されていたりする。

glslifyと関連ライブラリのお陰で、うろ覚えでも気軽にレイマーチング入門できた。 これまでに覚えたテーマとしてはこんな感じ。

レイマーチング

Web Audio APIを使った、FFTと連動するアニメーション

シェルピンスキーのギャスケット

ビルド済みのGLSLファイルは、このレポジトリの docs/shaders/以下に置いてある。

github.com

fand/glsl2img

amagitakayosi.hatenablog.com

GLSLのコードからPNG画像やGIFアニメを生成するツール。 webgl-studyの開発フローに組み込んで、サムネイル画像を簡単に作れるようにしている。

技術的には、headless-glを利用してNode.js上でWebGLを動作させ、pngjsやgifencoderで画像を出力している。

glslifyにPullReqを出した (WIP)

Atomにはlinter-glslというパッケージがあり、GLSLの構文エラーを教えてくれる。
しかし、glslifyには対応していないので、glslifyを利用したコードでは本質的ではないエラーが大量に表示されてしまう。

これを解決するには、linter-glslをglslifyに対応させるだけでなく、glslifyをsourcemapsに対応させる必要がある。
単純にglslifyを通すだけでは、linter-glslはビルド済みのコードに対してlintを実行することになるので、エラーの行数がズレてしまうからだ。

というわけで、glslifyのコードを読んで、sourcemapsに対応するPullReqを作ってみたんだけど、今のところ反応がない……

[WIP]Sourcemaps support by fand · Pull Request #6 · stackgl/glslify-bundle · GitHub

学習リソース

以下のWebサイトや書籍を読んで、色々学んでいる。
GLSLはあまり情報が豊富ではないが、幸いにもいくつかWeb書籍などが存在する。

wgld.org

wgld.org

WebGLに関する情報が大量にまとまっているサイト。
GLSLカテゴリでは、レイマーチングの基本が丁寧に解説されている。

The Book of Shaders

thebookofshaders.com

GLSLについて、WebGLの事を何一つ知らなくても学べるWeb書籍。
文中にあるGLSLコードは編集可能になっていて、結果をリアルタイムに確認しながら学習できるようになっている。

初めてのThree.js

初めてのThree.js 第2版 ―WebGLのためのJavaScript 3Dライブラリ

初めてのThree.js 第2版 ―WebGLのためのJavaScript 3Dライブラリ

オライリーのThree.jsの本。
日本語でサッと把握できて良いかな〜という事で購入したけど、まだあんまりThree.jsを活用できてない。
MMDの解説もあるので、そのうち初音ミクとか表示してなんか出来たら楽しそうだなあ。

Moleman 2

メガデモ文化を追ったドキュメンタリー映画
日本語字幕つきでYouTubeに公開されている。

www.youtube.com

いろんなすごいデモやすごい人達が紹介されていて、やる気が高まる。
僕はこれ見てコモドール64ほしくなった。ヤフオクで16万……。


ここまで読んでくれたあなたは、きっと今頃GLSLを書きたくて仕方ないはず。
みんなGLSLやろうぜ、そしてライブコーディングしたりデモ作ったりしよう!


28歳になった

$
0
0

無事に28歳を迎えることができた。ロックミュージシャンに生まれなくてよかった……
最近ブログあんまり書けてないので、まとめて近況報告しよかな。

!!!!! ほしいものリスト http://amzn.asia/haHW5vX !!!!!

引っ越した

2月のことだけど、下京区のマンションから、鴨川の近くの一戸建てに引っ越した。
木造で築50年なので、床が凹んでいたり冬は異常に寒かったりするけど、広いし部屋の感じが好みだったのでほぼ即決した。
生まれて初めての一軒家で、家具を買ったりテーブルを作ったりして楽しんでいる。

新居、1帖ほどの広さだけど庭がある。
庭には前の住人が置いていった蹲居セットが設置されており、電源を入れると京都人になりきることができる。

会社からはちょっとだけ遠くなったが、自転車でいろんな所に行ったり、同居人の友達を呼んだりできるようになった。
気に入っているので長く住むかもしれない。

椎間板、痛めてた

3月にハーフマラソンに参加した所、親指の筋に痛みを感じるようになった。

大学時代からずっと左足の感覚が麻痺してて、でも診断が下されることで自分の病気が確定してしまうのが怖くて病院に行くのを避けてたんだけど、流石に日常生活に支障が出たのと、いよいよマズいんじゃないかと焦りを感じた事もあり、会社近くの整形外科で診て貰うことにした。

整形外科は会社の同僚も複数人世話になっている町医者で、なるほど午前9時にもかかわらず満員であり、受付から診察室に通されるまでに90分待たされたが、診察自体は5分で終わってしまった。 症状を告げるなり、「それは腰のL5の神経だね〜」と即答され、椎間板がヘタっていること、ヘルニアとは違うこと、運動する時にはコルセットを着けないといけないこと、指圧マッサージは絶対にダメということを立て続けに説明された。 指圧マッサージ、その翌週くらいに初体験しようかな〜って思ってたので残念。

帰る前にリハビリ室に呼ばれ、腰の牽引をしたり、低周波治療器だとか腰の体操を行なった。 昔部活で膝をやった時、お年寄りが並んでじっと牽引されているのを見て不思議に思っていたけど、まさか自分がこんな若さで牽引されることになるとは思わなかった。

コルセット、採寸したあと「じゃあ来週3万円もってきて」って言われて仰天した。 保険の制度上、コルセットの代金は先に自腹で払って、あとから還付申請?をする必要があるらしい。 今後のことを考えると絶対に必要だから仕方ないけど、金欠だったので給料日まで待ってもらったりした。

バランスボールを導入

整形外科で勧められたのでバランスボールを導入した。

会社ではアーロンチェアやバロンチェアが支給されるので、どちらかを使っている人が多い。
僕は高級椅子よりも堅い椅子のほうが好みだったので、安いスタッキングチェアをずっと使っていたんだけど、もしかしたら腰には良くなかったのかもしれない。

購入したのはこの商品。 どの商品も似たり寄ったりなので、一番レビュー多そうなやつにした。
バランスボール、なんでどれもテカテカして青とかピンクとかなんだ、もうちょっとシンプルなやつはないのか、無印あたりがシュッとしたやつ出してくれないかな……

1月くらい使った感想はこんな感じ。

  • メリット
    • 柔らかい
    • 音楽に合わせてポヨポヨしてるとコーディングが捗る
  • デメリット
    • 空気を入れる音がうるさい
    • ポヨポヨしてるの、同僚がイライラしてないか心配
    • 尻が蒸れる

空気を入れる時、リバーブのかかった不思議な音がする。

f:id:amagitakayosi:20170624121855p:plain

腰に良いかどうかはまだわからない(左足は相変わらず痺れている)。

GLSL/TidalCycles入門してる

amagitakayosi.hatenablog.com

この前記事を書いたとおり、最近ずっとGLSLを書いている。
この後も更に9個のアニメーションを追加した。

fand.github.io

段々ハマる時間が長くなってペースが落ちてきている……。
レイマーチングは面白いけど処理が重く、ライブコーディングには向かないので、もっとライブコーディング向けの表現も練習していかないといけない。

手応えがあったやつはShadertoyにも投稿したりしている。
Shadertoy、誰にも見られないかと思ったけど、意外とコメント付くし、便利ライブラリを教えてくれたりして感動している。

Tシャツも作って自分で着ている。
みんな買ってくれ!!!

suzuri.jp

最近はTidalCyclesにも興味がでてきた。
TidalCyclesは音楽を演奏するためのライブコーディング環境。
コードはHaskellで書くため、他のライブコーディング環境と比べると圧倒的に短いコードで演奏でき、魔術感があって楽しい。

DJ/VJイベントにライブコーディング枠で参加したい!!!

Kyoto.js 13やります

connpass.com

7/30(日) にやります、皆様の募集をお待ちしております!!!!!!!!!!!!!!1


この一年は人生が大きく変わったけど、今年はこれからも変化がつづいていきそう。

TidalCyclesでライブコーディングに挑戦しよう⚡

$
0
0

とにかくこの動画を見てくれ!

たった20~30行くらいのプログラムで音楽がつくれる!
それがTidalCycles!

この記事ではTidalCyclesについてザッと紹介し、さっきの動画で演奏している内容について解説します。
僕自身もTidalCyclesに入門したばかりなので、TidalCycles仲間が増えたらいいなって思ってます😸。

対象読者

目次

TidalCyclesとは

TidalCyclesは、音楽を自動で作曲・演奏するためのシステムです。
プレイヤーは演奏内容を表すプログラムをリアルタイムに作成し、次々とシンセサイザーの演奏を変更していきます。
普通の音楽演奏に例えるなら、楽譜をリアルタイムで書いていく感じでしょうか。

このように、リアルタイムにプログラミングすることを ライブコーディングと呼びます。

他のライブコーディング用システムとの違い

ライブコーディング用システムは他にもいろいろ存在しています。
他のシステムと比較したとき、TIdalCyclesは何がどうちがうのでしょうか?

個人的にしばらく使ってみた結果、、以下のようなメリット・デメリットがあると感じました。

  • メリット
    • 非常に短いコードで音楽を作れる
    • サンプラーを簡単に使える
  • デメリット
    • インストールが難しい

メリット: 非常に短いコードで音楽を作れる

ここでいう「コード」とは和音のことではなく、プレイヤーが書くプログラムのことです。
プレイヤーは、プログラミング用のテキストエディターを利用して、コードを書くことで演奏内容を指定します。

例えば、キックの4つ打ちを Sonic Pi で表現しようとすると、以下のようなコードになります。

live_loop :kickdo
  sample :bd_haus
  sleep 1end

ところが、TidalCyclesだと、たった1行で表現できてしまいます!

d1 $ sound "bd bd bd bd"

見た目にも直感的な感じがしますね。

サンプラーを簡単に使える

TidalCyclesは、デフォルトではSuperDIrtというサンプラーを利用するようになっています。
このサンプラーには200種類以上のサンプルが含まれています。
ベーシックなTR-808/909の音色や、ガバキックなども入ってたりする。

f:id:amagitakayosi:20170629223855p:plain

TR-808のキックだけでもたくさんある。

サンプルを使うには、 d1 $ sound "808bd"とするだけ!
自作のサンプルを使うときも、サンプルのフォルダに新しいフォルダを追加して、 bd808bdの代わりにフォルダ名を書くだけで良いです。便利!

インストールが難しい

TidalCyclesはまだ歴史が浅く、日本語情報もほとんどないので、環境構築がちょっと大変かもしれないです。
ProcessingやopenFrameworksで有名なyoppa氏が、TidalCyclesのインストール方法を解説されているので、そちらをご覧ください。

第9回 Live Coding入門 – TidalCycelsのセットアップと基本 | yoppa org

動画の解説

ここでは、記事冒頭で紹介した動画のうち、僕が作ったほうについて解説していきたいと思います。

YoutubeでTidalCyclesの解説動画を見てる内に、ブレイクビーツが以外に簡単に作れる事がわかり、ランダムに音を加工したりアニソンをサンプリングするだけでBreadkcoreが作れるのでは?と思って試してみたのでした。

この動画で使ったコードは以下の通りです。
(解説の都合で一部省略しました)

-- breakcore.tidal
cps (140/120)

d1 $ sound (samples "amen*8" (irand 12))
    # crush 4.5    # cut 1    # up (rand * 10)

d2
    $ s (samples "anime" (irand 22))
    # cut 8    # up 2    # gain 0.9    # crush 3

テンポを設定

まず、1行目で曲のテンポを設定しています。

普通のDAWソフトだとBPMを指定しますが、TidalCyclesでは CPSという単位で指定します。
ちょっと奇妙な感じがしますが、これはTidalCyclesが拍単位 (beat) ではなく、サイクル (cycle) 単位で実行されるからです。
このため、5拍子や7拍子の曲を作ったり、ポリリズムの曲を簡単に実現できるというメリットがあります。

アーメンブレイク

次の段落では、いわゆるブレイクビーツを演奏しています。
TidalCyclesの基本的な文法は次のようになります。

f:id:amagitakayosi:20170629231221p:plain

トラック番号を指定して、パターンを指定して、エフェクトをかける……という順番ですね。

d1 $ sound (samples "amen*8" (irand 12))  -- "amen" サンプルをランダムに8回再生    # crush 4.5  -- ビットクラッシャー    # cut 1 -- サンプルの長さを調整    # up (rand * 10)  -- サンプルのピッチをランダムに変更

今回は自分で用意した音声ファイルを利用しましたが、TidalCyclesにはデフォルトでいくつかドラムループ音源が入っているので、そちらを利用するのも良いでしょう。

カーソルをこの段落に移動し、 ⌘ + return (Windowsの場合は Ctrl + Enter)を押すことでプログラムを実行しています。
動画内では段落が光るところがありますが、そのタイミングでプログラムが実行されています。

アニソンをサンプリングして再生

最後の段落でも、やってることは先程の段落とだいたい同じです。
ただ、サンプルの再生スピードがあまりに速いと困るので、サンプルの再生回数と長さを調整しています。

たったこれだけのプログラムで、ちょっとしたブレイクコアができてしまいました……!!

おわりに

この記事をみて興味を持っていただけたら、是非TidalCyclesを触ってみてください!
いい演奏ができたら、TwitterYoutubeに演奏動画を公開してみてくださいね ⚡⚡

Kyoto.js 13を開催します

$
0
0

f:id:amagitakayosi:20170726143849p:plain

今週の日曜 7/30 、Kyoto.js 13を開催します。
特設サイトも作った。テーマは煩悩。

Kyoto.jsは京都のJavaScriptコミュニティです。
たまに勉強会を開催したり、Slackで交流したりしています。

京都以外にも、大阪や神戸、東京から参加するメンバーもいたりします。 お近くの方は是非チェックしてください!

JavaScriptコミュニティといいつつ、テーマはだいたい何でもOKです!
今回のイベントでは、JS以外にもGLSLやOCamlに関する話があるみたいですね。

まだまだ人数に空きがあるので、ぜひ参加してください!!

f:id:amagitakayosi:20170726143403p:plain

参加登録はこちら

AtomでVJできるパッケージを作った #GLSL #livecoding

$
0
0

https://user-images.githubusercontent.com/1403842/28673275-1d42b062-731d-11e7-92b0-bde5ca1f1cae.gif

GLSLでVJやライブコーディングができるAtomパッケージを作りました。
その名も glsl-livecoder !!!

atom.io

この記事では、glsl-livecoderの使い方や機能を説明します。

目次

このパッケージでできること

AtomでこんなVJができちゃいます!

この動画は、先日僕が glsl-livecoderを使ってVJした時のものです。
動画素材や画像素材をロードしつつ、GLSLで加工したり動きを付けたりしています。
動画素材をロードしてMIDIコントローラーで操作きるので、コードをほぼ書かずにVJすることも可能です。

GLSLはOpenGLWebGLといった3Dグラフィックで用いられる言語です。
GPUで実行されるため、高画質なグラフィックをリアルタイムに描画できるという特長があります。

AtomにはTidalCycles等、ライブコーディングで音楽を演奏するパッケージがいくつか存在しているので、組み合わせると一人でDJ/VJ両方できたりもします。
TidalCyclesについては以前記事を書きました。

amagitakayosi.hatenablog.com

機能一覧

glsl-livecoderは、GLSLファイルを実行してAtomの背景に表示するパッケージです。
linterやautocompleteといった既存のパッケージを利用し、快適なコーディング環境を実現しています。

GLSL実行環境としては、以下のような機能をもっています。

  • GLSL Sandbox互換の uniform変数
  • 音声入力対応
  • MIDI入力対応
  • 任意の画像/動画をロードできる

インストール

glslangValidatorのインストール

glsl-livecoder の動作には glslangValidatorが必要です。
先にインストールしましょう。

macOSの場合

macの場合はhomebrewでインストールできます。
homebrewが入っていない場合は、まず以下のページに従ってインストールしてください。

Homebrew — The missing package manager for macOS

その後、ターミナルで brew install glslangを実行すると glslangValidatorコマンドを使えるようになります。

glslangValidatorを自分でビルドする場合は、21-3さんの記事を参考にしてください。
(21-3さんありがとうございます!)

r21nomi.log — Art & Tech log

Windows, Linuxの場合

glslangValidatorはVulkan SDKに含まれています。
こちらからVulkan SDKをインストールしましょう。

LunarG® Vulkan™ SDK - What's in the SDK - Where to Download

Windowsの場合は C:/VulkanSDK/(バージョン番号)/Bin/glslangValidatorがインストールされるので、こちらに環境変数PATHを通してください。

glsl-livecoderのインストール

Atomの設定画面、または apmより glsl-livecoderをインストールします。

Failed to require...というエラーが出た時

場合によっては以下のようなエラーが表示されるかもしれません。

Failed to require the main module of 'glsl-livecoder' because it requires an incompatible native module.
Run `apm rebuild` in the package directory to resolve.

この場合は、画面下部の虫アイコンをクリックし、 Rebuild Packagesを実行してください。

使い方

glsl-livecoderをインストールすると、Atomに以下のコマンドが追加されます。

  • glsl-livecoder:toggle
    • glsl-livecoder を起動/停止する
  • glsl-livecoder:load-shader (key: ctrl-enter)
    • 現在のタブのGLSLファイルを実行する
  • glsl-livecoder:watch-shader (key: ctrl-shift-enter)
    • 現在のタブを監視し、内容が変更されたら自動で実行する
  • glsl-livecoder:watch-active-editor (key: ctrl-alt-enter)
    • アクティブなタブを監視し、 watch-shaderを実行する
  • glsl-livecoder:stop-watching (key: ctrl-.)
    • watch-shaderwatch-active-editorを停止する

実際にサンプルコードを手元で動かしてみましょう。

まず、glsl-livecoder-examplesをcloneし、Atomで開きます。

git clone https://github.com/fand/glsl-livecoder-examples
cd glsl-livecoder-examples
atom .

コマンドパレットを開き、glsl-livecoder:toggleを実行してください。
glsl-livecoderが起動し、デフォルトのGLSLコードが評価されます。

f:id:amagitakayosi:20170804140250g:plain

このディレクトリにはサンプルコードが沢山入っています。
試しに sample2.fragを開き、 ctrl-enterで実行してみましょう。
GLSLが実行され、次のような画面になるはずです。

f:id:amagitakayosi:20170804145503g:plain

GLSLを書き換えて実行すると、すぐに反映させることができます。
例えば、7行目に p *= fract(time);を追加して実行すると、画面全体をアニメーションさせることができます。

f:id:amagitakayosi:20170804162040g:plain

次は動画のロードを試してみましょう。
video.fragを開いて ctrl-enterで実行すると、複数の動画がミックスされた画面が表示されます。

f:id:amagitakayosi:20170804162728g:plain

動画のパスは .livercで指定しています。
.livercを編集することで、任意の画像や動画をロードすることができます。
.livercを保存すると即反映されるので、動画の入れ替えも簡単に行なえます。

// .liverc{"IMPORTED": {// 動画ファイルは videos/ 内にに保存されている"video1": {"PATH": "./videos/1.mp4",
        },
        "video2": {"PATH": "./videos/2.mp4",
        },
        "video3": {"PATH": "./videos/3.mp4",
        },
    },
}

もちろん、動画をGLSLで加工することもできます!
21行目の // uv *= uv;のコメントを外して、再度 ctrl-enterしてください。
画面全体が左右対象にグニャッと歪んで表示されると思います。

f:id:amagitakayosi:20170804163206g:plain

以上、おおまかな使い方を紹介しました。
音声入力やMIDI入力の使い方に関しては、それぞれ audio.fragmidi.fragを参考にしてください!

今後の開発

今後は以下のissueに取り組んでいこうと思います。

  • パフォーマンス向上
  • カメラ入力対応
  • glslify対応

他に機能のリクエストやバグ報告があれば、TwitterGitHubでお気軽にご連絡ください!

それでは、よいVJライフを!

スクリーンショット/GIFアニメ作成技術が集まるスレ

$
0
0

お題「スクリーンショット/GIFアニメ作成技術が集まるスレ」

最近、仕事でも趣味でもスクリーンキャプチャしまくっている。
結構いろいろツール使ったりしてるので、メモっとくと需要あるかなって。

マイお題も作ったので、皆さまのGIFアニメ作成技術やこだわりを投稿してくれると助かります!😸

目次

キャプチャツール

GIF Brewery 3

gifbrewery.com

macOS向けの高機能なGIF作成/編集ツール。
スクリーンを撮影するだけでなく、Webカメラや動画ファイルからGIFアニメを作成できる。

フレームレートやスピードを簡単に設定できる上、軽量化もできる。
仕事で開発中の画面のアニメを撮影する時はだいたいコレで完結する。

もっとクオリティとサイズにこだわりたいときは、GIF Breweryで撮影したあと、後述のgifsicleやezgifで軽量化したりする。

Quicktime Player

ちょっと長めの動画とか、音声入りでキャプチャしたい時はこれ。
音声出力を取得するにはSoundflowerとかと組み合わせる必要がある。

Licecap

Cockos Incorporated | LICEcap

昔使ってた。
Windows版とMac版がある。

事前に録画する秒数を指定したり、フレームレートを指定してから録画を開始する。

デュアルディスプレイの時に出力がおかしくなることがあった気がする。
もう直ったかな?

GIF Breweryに移行してからは使ってない。

編集/軽量化

Gifsicle

Gifsicle: Command-Line Animated GIFs

CLIツール。
gifsicle -O3 foo.gif > foo2.gifとかやるとサクッと軽量化できる。
オプション覚えるのがめんどくさいのであんまり使ってない。

ezgif.com

ezgif.com

Web上でGIFの操作ができるサービス。
Optimizeメニューでは、普通に圧縮したり、カラーパレットをいじったり、ディザリングしたりできる。
フレーム毎にスキップ指定してファイルサイズを落としたりもできる。

Gifsicleのオプション覚えずに済むので楽。
処理も意外と速い。

ffmpeg

定番動画変換ツール。 Quicktime Playerで録画したやつをGIFアニメに変換する時に使ってる。

PCからTwitterに動画を投稿するとメッチャ失敗するんだけど、こちらの記事にあるオプションを付けてffmpegで変換すると投稿できるようになる。

kivantium.hateblo.jp

高画質なGIFアニメを作る方法については、いろんな記事があるのでそちらを参照。

動画ファイルからより良いアニメーションGIFを作る — Genji App Blog

ffmpeg、とにかくオプションむずすぎる。
僕はオプション勝手に指定してくれるスクリプトつくって ~/binに入れてるけど、結局あんまり使ってない……

その他小技

  • Retinaディスプレイだと解像度2倍になってキャプチャもカクつくしファイルサイズもでかくなるので、サブディスプレイでキャプチャしたりディスプレイの解像度を落とすと良い
  • Twitterは7.5秒以内の動画だとループ再生してくれるので、GIF Breweryとかでフレームを調整してキレイな無限ループにしてあげると良い
  • 頑張って高画質GIF作ってもTwitterに投稿するとメチャメチャになったりするのでmp4の方が良かったりする
  • 仕事でUIのキャプチャする時は 5fps くらいで充分

キャプチャデバイス買おうか迷ってる

最近はGLSLを書いたりVJっぽい活動をしてることもあり、キャプチャ専用デバイスを買おうか迷ってる。
一番の候補はこれ。

av.watch.impress.co.jp

レビューの記事では「音が小さい」って書いてあるけど、オーディオインターフェースあるからどうにかなるのではって思ってる。

使ってる人とか、オススメのデバイスとかあったら教えてほしいです!

Kyoto.js 13開催レポート &次回予告

$
0
0

こんにちは! Kyoto.js主催の id:amagitakayosiです。
先日開催した Kyoto.js 13 のレポートをお届けします。

kyotojs.connpass.com

今回は京都だけでなく、なんと東京や長野から来たという方もいらっしゃいました(ありがとうございます!!)。
発表内容もユニークなものが揃っています!

当日の様子はTwitterハッシュタグ#kyotojsでご覧になれます。

発表資料

「Live Coding on Atom」amagitakayosi

speakerdeck.com

1人目の発表は僕 id:amagitakayosiです。
最近ハマっているGLSLのライブコーディングや、自作したAtomパッケージの紹介をしました。

「煩悩の数だけRefluxを回そう(仮)」kamiyam

www.slideshare.net

2人目の発表は id:kamiyamさん。
Fluxフレームワークの一種であるRefluxについて、他のフレームワークの違いや、実際に開発した感想を紹介していました。

「type of typing typescript type」hiroqn

scrapbox.io

3人目は id:hiroqnさんです。
TypeScriptでの型の付け方について、良くある書き方や、ハマりどころを紹介してくれました。

「煩悩レスなコンポーネントテストを目指して」bokuweb

speakerdeck.com

4人目の発表は id:bokuwebさんです。
コンポーネントの見た目をテストする Visual Testingのメリットや、 reg-suit の開発に至った経緯などについて語ってくれました。

「Reason」kuy

speakerdeck.com

5人目は id:kuyさんです。
Facebook製のOCaml用ツールチェイン Reason の紹介と、実際に使ってみた感想を話してくれました。

Gyazoのフロントエンドから煩悩を取り払えているのか」pastak

scrapbox.io

最後の発表は id:Pasta-Kさん。
画像共有サービス Gyazoのフロントエンドについて、これまでの変遷を語ってくれました。

LT資料

JavaScript information in English」cawa

www.slideshare.net

LT1人目は id:cawaさんです。
英語の情報を効率よく収集するためのTipsやリリースを紹介してくれました。

Atomパッケージ開発のすゝめ」susisu

speakerdeck.com

LT2人目は id:susisuさん。
Markdownのテーブルエディタやカーソル移動といった、普段の操作を便利にするAtomパッケージを開発した話でした。

「はじめようGLSL」amagitakayosi

はじめようGLSL · GitHub

最後のLTは、ふたたび僕 amagitakayosi が行ないました。
ハンズオン形式で、GLSLで何ができのるか実際に体験してもらいました。

まとめ & 次回予告

発表者ならびに参加者のみなさま、本当にありがとうございました!!

毎回なぜか東京からの参加者がいるKyoto.jsですが、次回はなんと東京での開催を企画しています!!!
詳細はまだ未定ですが、開催日時は9月の中頃になる予定。

いずれconnpassやブログで案内するので、今後の更新にご注目ください!!

はてなブログのテーマを自動リロードしながら開発できるツールを作った

$
0
0

f:id:amagitakayosi:20170822133701g:plain

Sass/Lessでテーマを書いて、リアルタイムで確認しながら開発できるツールです。

github.com

目次

インストール

動作にはNode.jsが必要です。 未インストールの方はこの辺からインストールしてください。

https://nodejs.org/ja/

ターミナルで以下のコマンドを実行すると、 hbtコマンドがインストールされます。

npm install -g @fand/hatena-blog-theme-boilerplate

使い方

hbt の使い方

0. 開発用ブログを作成する

テーマの開発には、開発用のブログを開設しておくと便利です。
既存のブログをエクスポート/インポートするなどして、サンプル記事を作成しておくと良いでしょう。

1. テーマの雛形を作成する

hbtコマンドでは、新しいテーマの雛形 + 開発環境を作成できます。
以下のコマンドを順に実行すると、 my-theme という名前のテーマが作成されます。

hbt my-theme   # my-themeを作成

以下のコマンドを順番に実行して、ライブラリをインストールしておいてください。

cd my-theme
npm install  # ライブラリをインストール

2. 開発用ブログにCSSが読み込まれるようにする

開発用ブログのデザイン設定画面を開きます。
カスタマイズ > デザインCSSの内容を削除し、 カスタマイズ > フッタに以下の内容を入力してください。

<linkrel="stylesheet"href="http://localhost:3000/index.css"/><script async src='http://localhost:3000/browser-sync/browser-sync-client.js'></script>

f:id:amagitakayosi:20170822133952p:plain

変更を保存するを押すのを忘れずに!

3. テーマを開発する

テーマのディレクトリで以下のコマンドを実行すると、Sass/Lessのコンパイル及びライブリロード用のサーバーが起動します。

npm start

サーバーを止めるには Ctrl + Cを押してください。

テーマのソースコードlib/にあります。
hbtはデフォルトではSassを利用するので、 lib/index.scssが作成されます。
Lessを使いたい場合は、 lib/index.scssを削除して lib/index.lessを作成し、 npm startを再度実行してください。

ブラウザで開発用ブログを開き、 lib/内部のファイルを編集すると、開発用ブログのデザインがリアルタイムで反映されるはずです。

(記事冒頭のGIFアニメ) f:id:amagitakayosi:20170822133701g:plain

4. 完成したテーマを出力

テーマのCSSindex.cssに出力されます。
テーマを使いたいブログのデザイン設定画面で、 カスタマイズ > デザインCSSindex.cssの内容を貼り付けてください。


macでしか動作確認してないけど多分Windowsでも動くはず……?
なんか困ったことがあればお気軽にコメントください。


ポートフォリオ作った

$
0
0

昔作ったWebサイト、今見るとめっちゃダサい…… そんな経験はありませんか?

というわけでポートフォリオを作り直しました。 最近の活動ぜんぜん書いてなかったしね。

gmork.in

もくじ

ポートフォリオ

自分の活動一覧サイト、定期的に飽きて作り直したくなる。
でも、更新コストが高いと放置するようになる。

ポートフォリオ、これまでに何度か作った気がしていて、前回は無駄にReactでサーバーサイドレンダリングしてたりしてたけど、ひたすら管理が面倒だった。

今回は静的ページにしてGitHub Pagesに置き、動かすのは背景だけで我慢する、という方針にした。

Markdownで書けるようにした

更新コスト最低ということで、ページの内容はMarkdown一枚で管理できるようにした。
Markdown系のライブラリ無限にあるけど、今回は GitHub Flavored Markdownで書きたかったので、 markedでHTMLに変換してる。

GLSLでビカビカした

今年はGLSLという武器を手に入れたので、早速このサイトでも使うことにした。 と言っても背景をビカビカさせるだけ。

グリッチ感のある画像を読み込んで、時間、マウス、スクロールに連動して動かしている。 素材となった画像は、以前AVIファイル以外の動画でdatamoshできないか試して遊んでた時に得られたもの。

www.youtube.com

当時の記事は見つけられなかったけど、これもFLVの構造とか調べつつPerlスクリプト書いてて、結構楽しかったんだよな。

これまでに作ったモノ

ポートフォリオに追加するために、これまでに作ったものを見返してた。
昔作ったやつ、今見ると実装は最悪だけど、モノはそれなりに面白い気がする。

RVD

https://gmork.in/RVD

ビデオサンプラー
再生パターンは16進数の文字列で指定する。
0x8888とかって指定すると、1000 1000 1000 1000と解釈され、4つ打ちで再生される。

Cyro

www.youtube.comhttps://gmork.in/cyro

キーボード入力で音が出るやつ。

GuitarBreaks

www.youtube.comhttps://gmork.in/guitarbreaks

ギターフリークスのコントローラーでブレイクコアを演奏できるやつ。

Random Font Generator

https://gmork.in/images/t_font.png

Google FontsにあるSVGフォントをランダムにグリッチして配信するサービス。
現在は使用不可。

Glitchyou

https://gmork.in/images/t_glitch.png

https://gmork.in/glitchyou

人の写った画像を選択すると、自動で顔を検出してランダムにグリッチしてくれるやつ。

ブランディングの結果

ふりかえると、画面が光ったりグリッチしたりするやつばっかり作ってることがわかる。
こうしたブランディングの結果、人々がグリッチ情報とか教えてくれるようになってきた。

twitter.com

twitter.com

みなさんも面白映像みつけたら教えてください。

日本アルプス初挑戦

$
0
0

木曽駒ケ岳に登った。 2612mのとこまでロープウェイで行ったから、ほとんど登山してないんだけどね。

木曽駒ヶ岳には、バスとロープウェイで「千畳敷カール」という所まで登ることができる。 これがすごい混雑してて、朝の5:30からバスに並んで、ロープウェイを降りたのが8:20だった。

待ってる間めちゃくちゃ寒かった。 いちおう事前に登山グッズについて色々しらべて、シェルパーカーの中にライトダウンを着るようにしてたんだけど、全然足りない…… 3000m級の山に登るときは、かなり暖かい格好にしないといけなそう。

登る前から死にそうになりつつ、ロープウェイの駅から一足踏み出すと、見たことのない絶景が飛び込んでくる。

景色が本当に別世界。

素晴らしい景色なんて、写真よりも作られた物で触れる事が多いから、高校の修学旅行で種子島に行った時も「FFの背景みたいな紫の夜空だ」って感想を持ったんだけど、今回も「めっちゃHDR感あるな〜〜〜!!!」という感想が出た。 山の上の景色ってコントラスト強いんですね。

登山を始めるとすぐに寒さはなくなって、風も太陽も気持ちいい! 日差しが強いので、黒い服を着ていると一瞬で汗だくになる。

「山頂でカップヌードル」の実績を解除。

メモ
  • 上りのバスでめちゃくちゃ酔って終了するかと思った。次から酔い止めを準備しよう……
  • shadertoyにあるレイマーチング作品って本当にリアルなんだなあ〜
  • 野生の猿に会えて嬉しかった。子猿が親の腰にしがみついてて可愛い
  • 鎖場に挑戦した、めっちゃ楽しかったけど死ぬかと思った
  • 高山植物がたくさんいる。名前がわからないので予習しとくと楽しそう
  • 人の多い山に登るときは、待ち時間に凍死しないよう、インナーをさらにもう一枚持っていく

次はどの山のぼろうかな〜〜

今月VJを2回やります

$
0
0

最近GLSLにハマっておりますが、この度ちゃんとした場所でVJすることになりました。

  • 9/17 pastak生誕祭 @東京
  • 9/22 SMTP++ @京都

僕はどちらもGLSLのライブコーディングによるVJパフォーマンスを行ないます。
2時間 x 2回。スパルタ……!!!

pastak生誕祭 @東京

twitter.com

id:Pasta-Kの誕生日を祝う」という名目で、各地のWebエンジニアや界隈の人々が東京に集まってDJ/VJパフォーマンスを行ないます(og:image最悪だな……)。

  • 日時: 2017/09/17 15:00 - 21:00
  • 場所: 渋谷 WHITE SPACE LAB

近隣の皆さまは是非ふらっとお立ち寄りください!

SMTP++ @京都

smtppp.club

京都のぼんやり系パーティです。 京都在住のDJやVJやエンジニアっぽい人が集まって少し盛り上がる会をやります。

  • 日時: 2017/09/22 20:00 - 24:00
  • 場所: 木屋町 cafe la siesta

関西の皆さまは是非いらしてください!

ToKyoto.js(Kyoto.jsの出張版)を開催しました

$
0
0

こんにちは! Kyoto.js主催の id:amagitakayosiです。
先日開催した ToKyoto.js のレポートをお送りします。

kyotojs.connpass.com

ToKyoto.jsはKyoto.jsの特別編として、メンバーが東京にあつまって開催したイベントです。
アウェイでの開催ということで人が集まるか心配でしたが、蓋を開けてみれば70人を超える方々にご応募いただき、当日は12人が発表を行なうなど、予想外の大盛況となりました!!🎉🎉🎉

会場は白金高輪のKaizen Platformさんのオフィスをお借りしました。
会場設営や入り口での案内など、何から何までお世話になりました、ありがとうございました!🙇🙇🙇

当日の様子はTwitterハッシュタグ #kyotojsでご覧になれます。

contents

一般発表

ToKyoto.jsのタイムテーブルは、Kyoto.jsメンバーと関東の発表者で 3 on 3 トークバトルという体で組みました。
当日は id:hiroqnが事情により欠席しましたが、なかなかマニアックな発表があつまったのではないかと思います!

「Tasks to release Extension for Edge」pastak

scrapbox.io

トップバッターは京都から参戦の id:Pasta-Kです。
ブラウザ拡張をEdgeに対応しリリースするまでの道のりを紹介してくれました。
Edge向けの拡張機能はまだ64個しか存在しないそうなので、貴重な知見ですね……!

「Vue.js Extend with Compiler」kazupon

speakerdeck.com

2人目は kazupon さんです。
Vue.jsのテンプレートコンパイルの各段階をフックし、様々な拡張を行なう方法を紹介していました。
コンパイラーのフックはvue-loader等で利用されているようですが、他にも色々マジカルな事ができそうですね!

「TypeScript Transformerについてのお話」Quramy

qiita.com

3人目の発表は id:Quramyさん。
TypeScriptのASTを操作してコードをゴニョゴニョできるCustom Transformerについての発表です。
estreeとの互換性が無くて難しいという話ですが、estree周りのツールでもっとTypeScript対応が進むと良いですね……!

「APIs for VJ-ing」amagitakayosi

speakerdeck.com

4人目の発表は僕 id:amagitakayosiです。
最近はAtomでVJできるパッケージを作っているのですが、このパッケージで使っている各種ブラウザAPIを紹介しました。
9/17には実際にこれを使ってVJしたので、またレポート記事を書こうと思います!

「今、我々は、 GUIの設計について 何を考えるべきか」mizchi

speakerdeck.com

発表ラストは id:mizchiさん。
古典的なWebアプリからMVC、Fluxと、フロントエンド開発がGUI開発に近づいていく中で、設計がどう変わってきたかをまとめていました。
最近はNext.jsのようなフレームワークも増えてきたので、SSRやIsomorphicアプリの作成がめっきり簡単になったりと、時代の流れを感じますね……。

LT資料

今回のLTはなんと7人の方が参加くださり、GraphQLからWebVRまで盛りだくさんでした。
LTの順番は忘れてしまったので、順不同で紹介します。

「Data feching and caching on Apollo Client 」joe_re

speakerdeck.com

id:joe-reさんの発表は、GraphQLクライアント実装であるApollo Clientの紹介でした。
Relayとは違い、Apollo Clientは様々なフレームワークや環境から利用できるようです。
fetch, updateといった基本的な操作やページネーションの方法などを、コード例を交えて紹介していました。

「WebVR with Windows Mixed Reality」ikkou

speakerdeck.com

id:ikkouさんは、WebVRの開発方法や、WebVRでどういうことができるのかを紹介していました。
この発表はなんとVRヘッドセットを装着した状態で行われました。
WebVR APIはまだEdgeとFirefoxでしか利用できないようですが、これからの発展が楽しみです!

「IntersectionObserverはいいぞ」Leko

speakerdeck.com

id:lekoさんの発表では、DOM要素が画面内にあるかどうかを取得できるIntersectionObserverについて紹介されました。
IntersectionObserverは現在、IE/Safari以外の主要ブラウザですでに利用できるようですね。
スクロールすると固定されるヘッダなど、活用出来る場所を見ない日はないので、早くpolyfillなしで使えるようになりたいものです。

Ecmascript proposal-realms」brn

speakerdeck.com

brnさんの発表はRealm proposalについての紹介です。
RealmはNode.jsのvmモジュールのように、JSのコードを安全に実行するための仕組みです。
まだあまり知られていないプロポーザルですが、必要とされる業界は多いんでしょうね〜。

「console.animate」katashin

speakerdeck.com

katashinさんの発表では、ブラウザの開発者ツールのコンソールにアニメーションを表示する方法を紹介していました。
Firefoxの開発者ツールのパフォーマンスが良いとのことですが、Firefoxの開発者ツールは他にもDOMの重なりを3Dで見れたり、Web Audio APIのノードの図が見れたりと謎に豪華ですよね……😅

「What I did to improve performance score on Lighthouse」yayoc

speakerdeck.com

yayocさんの発表は、Google製のパフォーマンス測定ツールLighthouseを利用しつつ、アプリケーションのパフォーマンスを改善した話でした。
HTTP/2採用やCode Splitting, IntersectionObserverを利用した遅延ロードなど、色々な施策についてものすごい早足で紹介されていました。
細かい話もじっくり聞いてみたい気がします!

「Nekogata Drum Sequencer written in Scala.js」nkgt_chkonk

speakerdeck.com

LT最後は id:nkgt_chkonkさんでした。
Scala.jsにまつわる様々な困難に直面しながらもScalaを貫き通す姿勢は圧巻でした……。
Scala.jsを試してみてハマった時は、今回の資料をみてみると参考になるのではないでしょうか。

感想 & まとめ

平日の夜開催だったため、懇親会でしっかり会話できるか心配していましたが、Kaizenさんのご厚意により23:30頃までたっぷり議論できました。
(ありがとうございました! >id:axrossid:lacolacoid:jmblog

2次会でもまだまだ盛り上がり、なぜかAM 2:20からLTが行われたりしました。
さすが眠らない街東京……。

今回は、普段のKyoto.jsとはまた違った、色々なコミュニティの話が聞けて最高でした!
ふだん勉強会などに来ないという人も何人かいらしたようで、とても嬉しかったです。

参加者の皆さま、発表者の皆さま、ありがとうございました!!
京都観光の際には、是非Kyoto.jsにいらしてください!

もしまた東京で開催することがあれば……よろしくお願いします🙏🙏

AtomエディターでVJしました

$
0
0

f:id:amagitakayosi:20170925232054p:plain

先日予告した通り、この度VJデビューしました。
VJ行為には自作のAtomパッケージ glsl-livecoderを利用しています。

これまでのあらすじ

GLSLとは、OpenGLWebGLといった3Dグラフィックスで用いられるシェーディング言語である。 シェーダーはその名の通りライティングや影の計算に用いられるが、単体でもパワフルなグラフィックス表現が可能であり、シェーダーアートという分野が存在する。 僕は今年GLSLにハマり、AtomでGLSLのライブコーディングできるパッケージを作った。 そしてこの度晴れてVJデビューすることになったのだ。

pastak生誕祭 @東京

初VJです。

動画は無音で失礼。

2時間半という長丁場なので、ライブコーディング成分は控えめに、普通にVJ素材を入れ替えつつGLSLでちょちょいとエフェクトをかける、という方針。 友人の誕生祭というフレンドリーな場であったため、途中でバグを踏んだらラッキーくらいの気持ちで臨んだ。

DJのうち一人がWindows95のアイコンをプリントしたTシャツでDJしていたので、おもむろにChromeを開いて Windows 95で画像検索し、テスクチャとしてロードして背景に表示する、といったパフォーマンスも披露。

キャプチャ動画を見返してみると、f.luxを切り忘れて画面全体が黄色くなってしまっていたり、Atomをフルスクリーン表示するのを忘れてメニューバーが見えてしまっている……。

あんまりがっつりコードを書いたりエフェクトをかける余裕はなかったけど、初めての割に目立ったトラブルなくやり遂げる事ができて良かった!

SMTP++ @京都

わずか1週間後に2度目のVJ。こんどは2時間。

前回の準備不足を反省し、今回は担当DJのアイコンや写真をあらかじめ用意しておいた。 また、僕の前のVJがDJネームを画面いっぱいに表示してるのが良いなと思ったので、急遽SketchでDJネームを入れた画像素材を用意したりした。

f:id:amagitakayosi:20170925224907p:plain

今回はちゃんとAtomをフルスクリーンにしてたんだけど、途中ちょっと集中力が切れた時、いつものクセで Cmd + Tabを押してしまってChromeが表示されるという失態をさらしてしまった 😇

今回の会場は外国人観光客が多く、かつ何故かプログラマーの人が多くて、2回ほど「それってOpenGLでやってんの?」とか「なんて言語?GLSL?知らねえw」みたいに話しかけられて良い体験だった。よい旅を!

課題

今回のVJで、いくつかglsl-livecoderに欲しいと感じた機能がある。

まずは、映像を別ウインドウや別ディスプレイに表示する機能。 現在のglsl-livecoderではコードの背景に映像が表示される。 ライブコーディングという用途ではこれでバッチリだけど、普通のVJソフトとして使うにはコードが邪魔になるので、別ウインドウに表示する機能が必要なのだ。 別ウインドウにWebGLのキャンバスを置いたり、Fullscreen APIに対応することで実現できるだろう。 一時的にコードを隠す機能があれば尚良いけど、これは何も書かれていない新規タブを開くことで実現できる気がする。

あとは、任意のHTMLを表示できるようになったら良いなあと思った。 定番VJソフトのVDMXだと、テロップを簡単に流せる機能がある。 glsl-livecoderでもテロップを流したいけど、テロップだけのために専用の機能を作るのは筋が悪い気がする。 設定ファイルで表示したい .htmlファイルを指定し、ユーザーが任意のJS/CSSを利用出来るようにするのが良さそうだ。 テロップしたかったらCSSとかmarqueeで良いしね。

あとは個人的に気をつけたいこと。

  • フルスクリーンにする
  • f.luxをオフにする
  • macをおやすみモードにして通知を防ぐ

なかなか忘れがち……MacBookProのパームレストにサインペンで書いとこうかな。。

まとめ

VJめっちゃ楽しかった!

今回は初めてだった & 時間が長かったので、普通に動画素材を使ってVJしたけど、GLSLだけで自力で映像を作るVJもやってみたい。 もっと短い時間で、テーマを決めて、レイトレーシングを使ってアニメーションをガリガリ作ってみたいなあ。

これからもガンガンやっていきたい!
VJやライブコーディングのオファーお待ちしてます!!! 🔥🔥🔥⚡⚡⚡

Viewing all 186 articles
Browse latest View live