Author Archives: daisuke

watched’GODZILLA-1.0′

現実さながらのVFXとゴジラの咆哮が圧巻。スクリーン越しとはいえ身の毛がよだつ体験だった。特にゴジラが目の前で咆哮するシーンと、熱線を吐くシーンは見ものです。

脚本も山崎貴監督らしいな、と思った。”ゴジラによる破壊”と”人間ドラマ”が半々くらいの映画で、神木隆之介くん・浜辺美波さん・佐々木蔵之介の誰かが好きであれば楽しめるのかなと。

created’ShelfSheriff’

こちらの記事を参考に、OpenAIのVisonを使用して、画像データの解析結果をJSON形式で返却してもらいました。

実際に作ったもの

https://shelf-sheriff.vercel.app

Github

本棚の内容から、いくつかの診断+オススメのジャンルを提案してくれるWebアプリです。
アドベンチャーゲーム風に進行します。

概要(API周りに着目)

クライアント側React画像データを読み取り&Base64エンコード
サーバー側PythonデータURLの形式でOpenAIのAPIにBase64画像データを渡す

実装時に気をつけた点

  • Base64エンコード
    公式マニュアルにも書かれていますが、ローカルデータをVisonのモデルに渡すにはBase64でエンコードを行います。インターネットに転がっている画像を参照したい場合以外は、この方法になるということです。
  • MAXトークン数
    無尽蔵にトークンを使用されると、金銭面で嬉しくないのでトークン数を絞ります。
    しかし、JSONの特性上、途中でデータが切れてしまうとデコードできないので、プロンプトで”○文字以内”と調整すると良いです。
  • 画像形式
    .png, .jpeg, .jpg, .webp, .gifがサポート対象です。(公式)
  • 画像サイズ
    1画像あたり20MBまでの制限があります。(公式)

あとは、実際にAPIを叩くと親切なエラー文が返ってくるので、適宜対応できるかと思います。

クライアント側のコード一部

  //ファイルアップロード処理
  const handleFileUpload = async (event) => {
    const file = event.target.files[0];
    if (file) {
      setIsUploading(true);
      try {
        const base64 = await toBase64(file);
        const apiEndpoint = process.env.REACT_APP_API_ENDPOINT;

        const response = await axios.post(apiEndpoint, { image: base64 });
        onComplete(response.data);
      } catch (error) {
        console.error("File upload failed:", error);
      } finally {
        setIsUploading(false);
      }
    }
  };

  // エンコード処理:画像ファイル->Base64データ
  const toBase64 = (file) => new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result.split(',')[1]);
    reader.onerror = error => reject(error);
  });
サーバー側のコード全文
from decimal import Decimal
import json, os, openai
  
def decimal_to_int(obj):
    if isinstance(obj, Decimal):
        return int(obj)
  
def lambda_handler(event, context):
    openai.api_key = os.environ['API_Key']
    base64_string = event["image"]
  
    print(base64_string)
    response = openai.ChatCompletion.create(
        model="gpt-4-vision-preview",
        messages=[
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "あなたはユーモアのあるプロファイリングを行うプロです。口調は口数の少ないミステリアスな探偵。この本棚の持ち主に対して以下内容を推測してください。-character:性格(ユーモアのある表現と根拠)(hint...少ない本こそ関心が深い可能性もあります) - interesting:興味のある分野と根拠 -recommend:これから興味を持つことをお勧めする意外な分野と根拠。character,interesting,recommendという3つのkeyに対してそれぞれ70字以上100字以下のvalueを紐づけたJSONデータを返却してください。jsonファイル出力結果はstart,endで終わるようにしてください。"},
                    {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_string}",}},
                ],
            }
        ],
        max_tokens=500,
    )
    response_content = response["choices"][0]["message"]["content"]
    response_content = response_content[5:-3] #文頭にあるstart,文末にあるendの文字を削除
    response_content = json.loads(response_content)
    print("Received response:" + json.dumps(response, default=decimal_to_int, ensure_ascii=False))
    return response_content

watched’PLUTO’

手塚治虫の「鉄腕アトム」の一編である「地上最大のロボット」を物語のモチーフとしたアニメ。全8エピソードだが、他のアニメとは異なり1話1時間ある。

アニメ固有の感想で言うと、爆発や火花といったエフェクトの描写が非常に綺麗。呪術廻戦もそうだが、最近のアニメはエフェクト描写で目を見張る作品が多い。

作中で印象に残ったシーンは、ロボット夫婦のもとにロボットの子供が養子として来たシーン。初めて子供が歩いた時に夫婦の口から発せられた「生きている…! 生きているということを初めて実感した」というセリフです。生物学的にはシーン中に”生きている”ものはいないのにも関わらず、小さなロボットが初めて二足歩行をする様子・それを見て感じる親心。生きていると言わずにはいられなかったです。

おそらく鉄腕アトムのテーマ・問題提起でもあるが、「高度に科学が発展した世界におけるロボットと人間との共生」であったり「人間とは」みたいな部分が今の時代に合っていると思いました。生成形AIの隆盛により、今後、友達のようなおしゃべりロボットが登場する世の中が来た時に、それに対してどのような感情を人々が抱くのか。

listened’マーチングカーニバル in 別府 2023′

別府市制100周年イベントのようです。(公式) 精華女子・京都橘というマーチング強豪が参加すると聞いて足を運びました。当日の野外マーチング(パレード)・屋内マーチング(本編)を見ました。

京都橘の明るく弾けるような演奏は晴天&見晴らしの良い風景と非常に相性が良く元気がもらえました。(youtube)ハロウィンが近いということもあって、どの団体も仮装をしており見ていて楽しかったです。

屋内では、精華女子・京都橘の行進がすごかったです。日体大の集団行動を彷彿とさせる行進でした。また、IPUも参加しており、他の追随を許さない迫力の演奏に驚きました。甲子園で演奏しているパワーは伊達じゃなかったです。

read’Z世代: 若者はなぜインスタ・TikTokにハマるのか?’

30人ほどの協力者(Z世代)への調査を基に、著者の分析・考えを述べた本。Z世代が何を考えているのかわからないという方であれば、読んでみると理解が進むと思います。全体的に深い内容ではなく、Z世代の価値観やトレンドを並べて名付けている本という感想。

read’ワンルームエンジェル’

虚無な人生を送っている(根は優しい)元ヤンフリーターと、そこに舞い降りた翼の生えた男子高校生との生活。非常にプラトニックな愛を描いたコミック。読み終わった後、心が軽くなったような気持ちになる。

愛だ恋だの浮ついた話ではない。お互いがお互いを大切に思い、お互いの過去を知り、支え合い、どこまでもついて行くからいなくならないでほしい。そんな話。

表情を描くのが非常に上手いので、1コマ1コマ大切に読み進めてほしい。

read’インターネット・ラヴ!’

初めてBLというジャンルの本を読みました。本書がきっかけでクィア(Queer)を知ることができました。えっちなBL要素が限りなく少ないコミックです。

「SNS中毒者(ノンケ)&その人を長年ネトストしている人(クィア)」がメイン登場人物という現代らしい一冊。仕事仲間や親・元カノなど、周囲の方々がとても優しく、「こういう人間関係をみんな作れれば良いな」と思える一冊。

「責任を背負えばできなくなることも増えてくる。人生は短い。」というお父さんの言葉、響きました。

今でいう同性愛というのが多数派だった時代もあり、男の友情の延長線という考え方もある。不必要な区別はない方が悲しむ人が少なくて良いなあ。

read’なぜ、TikTokは世界一になれたのか?’

Tiktokとその運営会社であるBytedanceの歴史を紐解いた一冊。

たとえ倫理違反であっても、勝つために有効な手段を迅速に実行することで掴み取った地位。「レコメンド技術によって、人々が情報を得る手段が大きく変化する」ことを察知した創業者の慧眼。

技術面での要因

キュレーションの分野では、機械学習は人間に及ばないと思われていたのだが、そこを覆した。これを成し遂げた背景は、レコメンド技術にいち早く着目した創業者が、レコメンド技術で覇権を握れるように社外から優秀なエンジニアを雇い、社内へ知見を共有・発展させたからである。このレコメンド技術のおかげで、幅広い年代・属性のユーザーに適切なshort動画を配信できた。

また、タイミング的に、インフラ面の発展と相性が良かった。安定した4Gが広く利用できるようになったタイミングだったので、スムーズさが大切な”動画主体”かつ”短時間利用”のアプリと相性が良かった。

複数のアプリを同時にリリースして、市場テストを行えるほどの”速い”技術力。

従来のアプリ(vineなど)と一線を画すフロントエンド(動画の見せ方)。

マーケティング面での要因

「クリエイターを王族のように扱う」オペレーション。早期利用者や活発なコンテンツクリエイターを特別扱いする。食事をご馳走しながらアプリの意見を聴くことで、ニーズの把握、良好な機能改善を続けた。

誰でも参加でき、ブームに乗り遅れないようにさせる「チャレンジ」(例:アイスバケツチャレンジ)、自分をよく見せたいというニーズに応えられるフィルター・音楽という様々な戦略に支えられている。いかに興味を惹き、ハードルを下げ、クリエイターを量産するか。


read’マーケティングプロフェッショナルの視点’

マーケティングプロフェッショナルの視点・思考を戦略・マーケティング・ブランドという3つの構成で論じている。

特に印象に残った話は「ネクタイは万年筆の競合になりうる」というもの。万年筆の競合を思い浮かべると、ボールペン・シャープペンシルという『書くための文房具』という分類での競合を挙げる。しかしそれだけではなく、PCやタイプライターも『考えをアウトプットするための媒体』という分類では競合であるし、ネクタイは『知的な贈呈品』という分類では十分に競合である。

あるモノに対し、それをどういう分類とするかで競合も変化する。HP制作の競合でいうと、SNSは言わずもがな『アウトプットの場』という分類では競合であるし、紙面広告(チラシ)も『商品紹介』という分類をすれば競合となり得る。

多数に分類できるビジネスほど、競合は多数存在してしまう。

watched’名探偵ポアロ:ベネチアの亡霊’

前情報ゼロで観に行きました。タイトル的にただのミステリーかと思っていましたが、表面的にはクライム要素強めのほとんどホラー作品でした。

一見すると、亡霊という非科学的な存在を信じるしかない犯行に対するポアロの動揺は見どころです。

舞台となっているヴェネツィアの街並みがとても綺麗に描かれており、事件解決後の晴れた景色に心を救われました(終始ホラーシーンだったので)


普段ミステリー作品は鑑賞せず、初アガサクリスティでした。