ブランケットを編む!

はじめに

こんにちは。ネットワークデザインスタジオB4の阿部です。 秋になり涼しくなっていました。私としては、編み物が楽しい季節が来たぞー!って感じです。 手芸屋に行くとフワフワの毛糸だったりモコモコの毛糸だったりがたくさん並んでいて、編み物したい欲が湧いてきます。 冬は可愛い毛糸の種類が多くて楽しいです。

私は今ブランケットを編んでいるのですが、その紹介をしたいと思います。

制作

使用した毛糸はこれです。

使用糸

MONA】 品質表示:アクリル85%、ウール15% 重量:200g(糸長約520m) 色番:23105

ユザワヤ限定商品のようです。会員価格で一玉1400円くらいでした。

グラデーションになっている糸です。 大きめのブランケットを作るつもりなのですが、色替えをすると手間がかかりすぎてしまうので一本だけでいろんな色が楽しめるグラデ糸にしました。

編み物で四角を編むときは主に①と②の二つの進め方があるのですが、今回は②の方法にしました。 サイズを完全に決めていなかったのと、毛糸を使い切ってできるだけ大きなものを作りたかったからです。

四角の編み進め方

現在はこんな感じで編み進めています。

編み物の途中経過

編み方はグラニー編みです。簡単な編み方なので慣れれば無心で編み進められます。私はアニメを見ながら編んでいます。

実はもう一玉編みきってしまい、もう一玉購入しました。一玉だけだと60cm×80cmくらいのものが編めましたが、もう少し大きなものにしたくて二玉で編もうと思っています。

おわりに

最後にブランケットの構想を紹介して終わりにしようと思います。

編み物の構想

次回のブログで完成したブランケットを紹介できたらいいなと思っています。ではまた!

卒業研究の現在地

お久しぶりです。

B4の魚田真之介です。

僕は現在、卒業研究で「抽象的なイメージで会話できるオンラインコミュニケーションツールの開発」を進めています。

中間報告会も(夏休み前に)終え、一旦、今回はこれまでやってきたことと、これからやっていくことをまとめてみます。

やってきたこと

  • 課題設定
  • コンセプト設計
  • 使いたい技術
  • 技術選定・コーディング
  • 開発段階のWebアプリケーション

課題設定

個人的な動機として、SNSを使う上でのストレスがありました。僕は普段SNSをよく使うのですが、何気なく見ているときでも、ふとしたつぶやきをみて一喜一憂したり、知らず知らずのうちにストレスが溜まっているなと感じることがありました。また、SNSでの炎上や行き違い、フェイクニュースの影響が広範囲に広がっているのを見かけることが増えてきました。

これらは、コミュニケーションの媒介が原則テキストで統一されていること、そして、SNSのタイムライン上には玉石混交状態のつぶやきが同じように表示、並べられていることが原因だと仮定しました。また、テキストを構成するのは言葉です。これは辞書的な意味がある一方、多様な解釈が許容されています。つまり、同じテキストでも、人によって想起される情景や解釈が変わるわけです。そうすると、補助情報がない状態でテキストのみでコミュニケーションを行おうとしているのもSNS上でのコミュニケーション不全の原因の1つといえます。以上の問題を少しでも解消するために、課題を「やり取りする媒介をテキストから置き換えたコミュニケーションアプリを作る」と設定しました。

Webアプリケーションのコンセプト設計

Webアプリケーションの方向性を決めるためのざっくりとしたコンセプトを決めてました。 課題設定から 1. 言葉を別のものに置き換える 2. ぱっと見で解釈しにくい 3. 読むと鑑賞の両立 以上の3つの特徴を持つコミュニケーションアプリケーションを解決策としました。具体的には、言葉を視覚的な3DCGオブジェクトに置き換え、解釈しにくい抽象的な表現を用い、平面的なタイムラインを疑似3次元的なものにするという方針を立てました。

技術選定・コーディング

今回のコミュニケーションアプリは多くの人を対象として、Web上で動作するものとしました。使用する技術は、フロントエンドにNext.js、イメージオブジェクト生成の部分にThree.js+Shader、バックエンドにDjango、データベースにはPostgreSQLです。

但し、ユーザーが1からオブジェクトを描くのは、発信のハードルが高いものになってしまいます。そのハードルを低くするために、今回のアプリでは、SNSのインタフェースを再利用し、入力は言葉で行うようにしました。では、イメージオブジェクトの生成はどうするのかというと、文章を分析してくれるモデル(BERTのsentimentなど)を利用することで入力された言葉をパラメーター化し、それを用いて、Three.js+Shaderでイメージオブジェクトを生成するようにしています。

開発段階のWebアプリケーション

現段階でのインタフェース

このアプリは中央のキャンバスと、右側にあるテキストボックスとテキストのパラメーターデータを表示する掲示板で構成されます。

このアプリの使い方は、右上のテキストボックスに言葉を入力し、投稿ボタンを押して、オブジェクトをキャンバス上に投稿するというものです。テキストボックスの下には、入力したテキストとともに、パラメーターが表示され、どのようにオブジェクトが出力されたのかを確認することができるようになっています。

オブジェクトの設定は、モデルが出力してくれる感情の分類(嬉しさ、怒り、信頼)によってオブジェクトの形状を、文字数によってオブジェクトの大きさ、ポジティブさの分類(ポジティブ、ネガティブ、ニュートラル)によって、色を決定しています。中央のキャンバスはアクセスしているユーザーで共有されるようになっています。

これからやること

  • まずは、オブジェクトに選択することで、自他のオブジェクトの元のメッセージとパラメーターを取得できるようにすることです。これは、ユーザーの熟練度に関係する要素で、ユーザーがオブジェクトをつかったコミュニケーション方法を学習するという仮説に基づいています。初期ユーザーは、アプリを使って、オブジェクトを鑑賞できる一方で、相手が何を伝えたいのかがわかりません。オブジェクトを選択し、元のメッセージを読むことで、「このオブジェクトはこういうことを言っているだ。」という体験をすることになります。この体験が繰り返され、経験が積むことでオブジェクトだけで、”ある程度”言いたいことが分かる、例えば、丸をみたら、「嬉しいことがあったんだな。」と解釈できるようになると考えています。

  • 次に、テストとデプロイです。アプリとして開発する以上、それが正しく動作するのか、そしてサーバー上に配置し、公開することが必要です。この部分は僕が疎いところでもあるので、ここからの最大の壁はテストとデプロイになると考えています。

終わりに

後2~3か月で完成させられるのでしょうか。もし完成した暁には、皆様にも利用して頂けるようにお知らせできればと思います。

引き続きよろしくお願いいたします。

ShaderとThree.jsの研究

こんにちは、B4魚田です。風鈴の音が心地よくなる季節になりました。

今回は、私の制作に関連する、ShaderとThree.jsでのグラフィックの制作の過程の一部をまとめてみます。(前回の予告ではP5.jsを使う予定でしたが、変更しました。申し訳ございません。)

Shaderと Three.jsとは?

Shader

Shaderとは3DCGの描画処理プログラムのことです。オブジェクトに陰影をつけたり、表面の質感や凹凸の設定、各画素の色を決定してくれます。それぞれの機能を、オブジェクトの頂点の位置を決定するVertex Shaderと面を構成する各画素の色を決定するFragment Shaderの2つに分けて記述します。

Three.js

Three.jsとは、3DCGを作成するためのJavaScriptライブラリです。Web上でコンピュータグラフィックを描画する低レベルAPIであるWebGLを、JavaScriptで記述できるように開発されています。シーン、カメラ、オブジェクト、ライトの要素から3DCGを描画し、アニメーションやインタラクティブ機能を追加することも可能です。

グラフィックの生成

  1. 単色の球

はじめにシンプルな球を描画してみます。

まず、球の位置を決めます。Vertex Shaderは3D オブジェクトの頂点の位置を計算するためのプログラムです。

vertexShader: `
 void main() {
  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,

gl_Position = ... の部分が頂点の最終的な位置を決定します。それぞれの値はvec4(X座標、Y座標、Z座標、同次座標)となっています

次に、球の色を決めます。 このFragment Shaderは、3Dオブジェクトの表面の色を決定する役割を果たします。

fragmentShader: `
 precision mediump float;

 void main() {
  // オレンジ色のRGB値を定義 (1.0, 0.5, 0.0)
  vec3 orangeColor = vec3(1.0, 0.5, 0.0);
                
  // 最終的に出力される色に代入
  gl_FragColor = vec4(orangeColor, 1.0);
}
`,

gl_FragColor = ... の部分が最終的な色を決定します。それぞれの値はvec4(赤、緑、青、透明度)となっています。

このシェーダーは3Dオブジェクトの表面全体を均一なオレンジ色で塗りつぶします。

2.グラデーション

次に、球にグラデーションを付けてみます。 Vertex Shaderでは、uv(テクスチャ座標)をFragment Shaderに渡せるようにします。

fragmentShader: `
 //varyingは頂点シェーダーからフラグメントシェーダーにuv座標の値を渡すための変数。
varying vec2 vUv;

void main() {
//vUvにuv座標を代入する。
vUv = uv;

gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,

Fragment Shaderでは、vUvを受け取り、gradient(グラデーションの値)として代入しています。gradientは0.0~1.0の値をとるので、gl_FragColorにそのまま代入して使うことができます。

fragmentShader: `
 precision mediump float;

 //vUvを受け取る。
 varying vec2 vUv;

 void main() {
  //グラデーションの方向を決める
  float gradient = vUv.y;
    
  //gradientは0.0~1.0の値をとるので、そのまま代入する。
  gl_FragColor = vec4(1.0, gradient, 0.0, 1.0);
`

このように書き替えることでy軸方向のグラデーションを描画できます。

また、mix関数を使っても、グラデーションを描画することができます。

fragmentShader: `
 precision mediump float;

 varying vec2 vUv;

 void main() {
  //グラデーションの方向を決める
  float gradient = vUv.y;

  // オレンジと青の色味を決める
  vec3 blueColor = vec3(0.3, 0.3, 1.0);
  vec3 orangeColor = vec3(1.0, 0.5, 0.0);
  //グラデーションの色を決める
  vec3 finalColor = mix(orangeColor, blueColor, gradient);

  gl_FragColor = vec4(finalColor,1.0) 
`

このコードだと以下のような青→オレンジのグラデーションになります。

3.ノイズ

ノイズ的な表現を加えることもできます。Fragment Shaderへの書き加えることで実装します。

fragmentShader: `
 precision mediump float;

 varying vec2 vUv;

 //2つの2次元ベクトルの内積、三角関数とマジックナンバーを使ったノイズ関数
 float noise(vec2 st) {
  return fract(sin(dot(st.xy, vec2(12.9898, 78.233))) * 43758.5453123);
 }

 void main() {
  //グラデーションの方向を決める
  float gradient = vUv.y;


  vec3 blueColor = vec3(0.3, 0.3, 1.0);
  vec3 orangeColor = vec3(1.0, 0.5, 0.0);

  vec3 finalColor = mix(orangeColor, blueColor, gradient);

  //ノイズ関数を使って、表現を付け加える。
  float noiseValue = noise(vUv * 10.0);
  //以下の式はfinalColor各要素にnoiseValueを加えている。
  finalColor += noiseValue;

  gl_FragColor = vec4(finalColor,1.0) 
`

このコードでは、球の表面に白いノイズを重ねることができます。

4.照明効果

Three.jsでは予め、オブジェクトにあてるライトの設定ができますが、Shaderを使って、照明を追加することもできます。 まず、Vertex Shaderからは、頂点の位置と法線のベクトルを渡します。

vertexShader: `
 varying vec2 vUv;

//頂点の位置を取得
 varying vec3 vNormal;
 varying vec3 vPosition;

 void main() {
  //uv座標を頂点シェーダーに渡す
  vUv = uv;
  vNormal = normalize(normalMatrix * normal);
  vPosition = vec3(modelViewMatrix * vec4(position, 1.0));

  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,

Fragment Shaderでは、vNormalvPositionを受け取り、照明の位置(lightPosition)、 照明の色(lightColor)を設定します。finalColordiffuseを乗算することで、照明をあてたfinalColorを描画することができます。

fragmentShader: `
precision mediump float;

varying vec2 vUv;

 varying vec3 vNormal;
 varying vec3 vPosition;
 const vec3 lightPosition = vec3(200.0, 200.0, 200.0);
 const vec3 lightColor = vec3(1.0, 1.0, 1.0);

 void main() {
  //照明計算
  vec3 lightDir = normalize(lightPosition - vPosition);
  vec3 normal = normalize(vNormal);   
  float diff = max(dot(normal,lightDir),0.0);
  vec3 diffuse = lightColor * diff;    

  float gradient = vUv.y;

  vec3 blueColor = vec3(0.3, 0.3, 1.0);
  vec3 orangeColor = vec3(1.0, 0.5, 0.0);

  vec3 finalColor = mix(orangeColor, blueColor, gradient);

  //照明効果を乗算する。
  finalColor = finalColor * (diffuse);

  gl_FragColor = vec4(finalColor,1.0) 
`

その他の照明効果として、明るい部分をより明るく、暗い部分をより暗くするグロー効果を実装することもできます。((0.299, 0.587, 0.114)はグロースケールという定数)

// 輝度効果
float luminance = dot(finalColor, vec3(0.299, 0.587, 0.114));
float glowStrength = 5.0;
vec3 glow = vec3(1.0, 0.7, 0.3) * pow(luminance, 3.0) * glowStrength;   

gl_FragColor = vec4(finalColor + glow, 1.0);

おわりに

ここまで、Shaderでできる、グラデーション、ノイズ、照明などの描画処理をまとめました。Vertex ShaderとFragment Shaderの組み合わせによっては、さらに複雑な表現ができます。機会があれば、そういった表現もまとめたいと思います。 ご高覧頂き、ありがとうございました。

推しカフェの話

はじめに

 こんにちは。B4の鈴木です。今回は私が定期的に通っているカフェLecoin(ル・コワン)について書きます。

千駄木ドライフラワーカフェ

 初めてこのお店を訪れたのは、去年の4月のことだった。季節感のあるドライフラワーの飾りと月替わりパフェの綺麗な写真をInstagramでたまたま見つけたことをきっかけに、何度も訪れることとなった。パフェ以外にも数種類のコーヒー、ミルクティー、季節のソーダ、様々な焼き菓子など、メニューは豊富だ。

 お店に入るとすぐに花束やスパイス、アレンジメントなどのたくさんの品が棚に並んでいる。店内は一階が4席、二階が8席ほどの小さなスペースにドライフラワーの装飾が施されていて、どこを見ても楽しい。初めて来たときはつい、黄色と青と白のドライフラワーの花束を買ってしまった。また別のときには小瓶に入ったピンクペッパーを買い、料理好きの父に渡したことがある。何回訪れても、ここに住みたいと感じる。いつか自分の部屋をドライフラワーでいっぱいにするのが夢だ。

 

店内の売り場スペース

私が食べてきた可愛いパフェたち

 このお店の特徴は、カフェメニューに旬の果物を使用した月替わりパフェ&ガレットが存在することである。毎回食べる前には必ず撮影タイムを設けてきたので、今までに食べた5つのパフェを紹介したい。

2023年4月 桜のパフェ

2023年8月 パッションフルーツのパフェ

2023年11月 マロンパフェ

2024年6月 さくらんぼの紫陽花パフェ

2024年7月 桃パフェ

さいごに

 自宅からは徒歩と電車で1時間ほどと結構遠いところにあるお店だが、このパフェのために飛んでいってしまうほど美味しくて可愛くて、エネルギーを補給できる。行けなかった月のパフェはInstagramで眺め、来年同じパフェが出るとも限らないため、次はいつ食べられるだろうかと思いを馳せている。去年逃してしまった10月のお芋のパフェが復刻することを願って、これからひと月ずつ生きていきたい。

Lecoin(ル・コワン)のInstagram

散歩道フラワーズ

こんにちは、B4魚田です。

2024年も半分が過ぎ、少しの外出でも汗だくになってしまう季節になりました。 今回は、4~6月に散歩中に発見した花を紹介しようと思います。

※注意:もしかしたら、写っている花の名前が合っていない可能性があります。ご了承ください。

花紹介

1 赤いバラ

バラ科バラ属の植物です。 一番有名な花の1つですね。この花を見つけたことがこの記事のきっかけとなりました。バラの複雑な構造は何度見ても驚かされます。

2 ツツジ

ツツジツツジ属の植物です。 花弁など、各部位がわかりやすく、中学理科の教科書の例で登場した記憶があります。 公園の通路に自生していたところを撮影しました。 たわんだ花弁がチャーミングですね。

3 チューリップとシバザクラ

それぞれ、ユリ科チューリップ属とハナシノブ科の多年草となっています。 チューリップはポピュラーな花であり、シバザクラも自生しているところをよく見かけますが、そろって生えていることは珍しいと思います。 花弁の色が似ているシバザクラの後ろに、チューリップが隠れているところが可愛らしいなと感じました。

4 ドウダンツツジ

ツツジドウダンツツジ属の植物です。 花弁の形が灯台の形に似ていたことから、トウダイツツジと呼ばれていたのが、なまってトウダンツツジと呼ばれるようになったみたいです。 公園で発見し、小さな花弁が垂れているところが可愛らしいと思い、撮影しました。

5 ピンクのバラ(クイーンエリザベス?)

1と同じくバラ科バラ属の植物です。線路ぞいを散歩していたときに、一輪だけ咲いていたところを見つけ、撮影しました。 クイーンエリザベスという個別名があるとかないとか。

6 ハルシャギク

キク科ハルシャギク属の植物です。少し遠い街で散歩していた時に見つけました。ハルシャギクは公園などで自生しているところを見かけることが多いですが、改めてみると、黄色と赤が濃いオレンジという鮮やかな配色であることがわかります。この近くにいい感じなビオトープがあり、学生の憩いの場となっており、なごみました。

7 ヤマアジサイ

アジサイアジサイ属の一種です。学校近くを歩いていた時に発見しました。中央のつぼみと外縁の小さな花が可愛らしいですね。

8 アジサイ

6月の雨の日に見かけました。結構な頻度で通る道だったのですが、突然、花を咲かせていて驚いた記憶があります。花弁に乗った雨がアジサイらしさを引き立てていました。

9 ガクアジサイ

アジサイアジサイ属の一種です。 隣の隣町を歩いたときに、たまたま見つけたものです。これまで、何度か見かけたことのある花でしたが、初めて「ガクアジサイ」という名前であることをしりました。 個人的には色のバランスと形が好きな花です。

終わりに

今回は僕の見つけた花の紹介をさせていただきました。 皆さんも、熱中症に気を付けて、花を探しに行ってみてはいかがでしょうか。

次回「p5.jsできれいなイメージを作りたい。」でお会いしましょう。

1泊2日で九十九里旅!

はじめに

 こんにちは。ネットワークデザインスタジオB4の山上です。 今回は、私が6月初めに友人と九十九里浜に旅行に行った時の話です。

浜焼き

 東京から車で1時間半ほどで九十九里に到着。私たちがはじめに向かったのは浜焼きのお店でした。お店は海のすぐ近くにある「浜茶屋 向島」さんです。九十九里で取れた蛤500グラムと帆立1個とお刺身盛り合わせを注文しました。蛤は5分〜10分焼くと貝がらが開き始め、そこにタレをかけて頂きます。貝から出た汁とタレが合わさってジューシーでとても美味しかったです。帆立はタレに加えバターをたっぷり乗せて食べました。これもとても美味しかったです。しかし、お腹が満たされて満足した私たちにここで事件が起きます。貝の片付けをしようとして私が帆立の貝を持ち上げようとすると、貝のバランスが崩れ、あっという間に私の白いズボンの上に帆立のエキスとタレが混ざった汁が大量にこぼれてしまいました。すぐさま濡れたタオルで一生懸命拭きましたが、もう手遅れでした。友人も沢山拭いてくれましたが、汚れは全く取れず私の白いズボンは茶色っぽい緑色のシミが出来てしまいました。この旅行を楽しみにしていた私にとって、これは本当に悲しい出来事でした。

蛤と帆立

九十九里浜

 海に行くと、時間帯が遅かったのもあり、人が全くいませんでした。誰もいない海と綺麗な夕日に囲まれて自然に癒されました。開放的な海で、私たちは貝殻探しをしました。友人とどっちがより綺麗な貝殻を見つけられるか勝負しました。判定は投票制だったのでお互いに自分に投票し、一対一で引き分けでした。貝殻勝負が終わった頃には、陽が落ちていて海風も冷たくなり、寒かったので宿に帰りました。

浜から見た夕日

まとめ

 一泊二日で長くはなかったけれど、充実した時間を過ごすことが出来ました。たまに都会から離れて自然を感じるのはとても心地よいです。汚してしまった白いズボンを見ると、今ではショックも薄まり、楽しい思い出が蘇ります。浜焼きはとても美味しかったのでまた食べに行こうと思います。次は汚れが目立たない服で、貝をひっくり返さないように気をつけます。皆さんも東京から車で気軽に行けるので、海鮮が美味しくて海で遊べる九十九里に行ってみてはいかがですか?

バンクーバー旅行記 #1

はじめに

B4の田中です。
今回は家族でバンクーバーに行った時のお話をします。 父の仕事の関係で、私と兄と3人で旅行しようということになりました。 5日間いろんなところを巡ったのでいつか行く時の参考にしてみてください。 今回は1日目と2日目の旅の内容をお届けします。

1日目

飛行機に揺られて約10時間バンクーバー空港に到着。 まず驚いたのは快適な気温。日本はその時30度を超えていたと聞きましたが、バンクーバーでは日差しはあれど空気が涼しく、カラッとしていて汗をかくこともありません。慣れない環境にもすごくワクワクしました。 電車は日本とは全く違うシステムですごく戸惑いましたが、なんとか電車に乗りホテルに向かいました。
ホテルはダウンタウンの中心のところだったのでまずはダウンタウンの周りを観光しました。『蒸気時計』で有名なガスタウンに向かい、『プーティン』というカナダのグルメを食べました。

蒸気時計
プーティン @SteamWorks

夜まで時間があったので、人生初のカジノに行ったり、地元スーパーに行ったりして異文化を楽しみました。日本にはない食材や飲み物を見て回れてすごく新鮮でした。 バンクーバーは緯度が高いため、時間的に夜でもまだ昼のような空をしているので、今回載せている写真はほとんど昼に撮ったような明るさです。22時になっても暗くならない空はとても不思議な感覚でした。

2日目

2日目は朝食にパン屋へ行きました。日本にはないようなパンがずらりと並んでいて、パンが大好きな私はものすごく迷いました。これだけ魅力的なパンがずらりと並んでいると無限の胃袋が欲しくなります。

@purebread.
そのあとは夕方まで父が仕事だったので、兄とホテル周辺をぶらりとしました。 昼食に食べた『RedRobin』のハンバーガーが絶品でした。本場のハンバーガーはやはり違いますね。付け合わせはガーリックブロッコリーです。
ハンバーガー @RedRobin
漫画ショップを発見。日本の漫画の英訳版がずらり

そのあとは父と合流し、バンクーバー水上飛行機に乗り、バンクーバーの街を空から一望しました。高いところはすごく怖かったですが、初めても体験ですごく楽しかったです。20分間の空の旅は素敵でした。大きな大陸で平坦な土地のせいか、日本の景色とは全く違っていました。

水上飛行機

夜は北米最大級のナイトマーケット「リッチモンドナイトマーケット」に行きました。実はこの旅で唯一残念だった場所です。屋台が100以上も並んでいてすごい盛り上がりでした。中国、韓国、日本などアジア系の料理の屋台が多く、ご飯は美味しかったです。しかし、雑貨やゲームの屋台の景品は全部日本のキャラクターで、おそらく非公式であろうものばかりが並んでいました。後から中国の企業が主催していたことに納得したと同時に、中国の恐ろしさを痛感しました。 行ってみてもいいとは思いますが、わざわざ時間をかけていくほどではないと思います。

リッチモンドナイトマーケット 入場口

おわりに

実は1日目と2日目はどこに行こうかあまり決めていなかったのですが、かなり充実した時間になりました。英語にも慣れてきた頃ですね。 次回は3〜5日目の旅をお届けします。