試してみたブログ

AI関連・iPhone/Pixelなどのガジェット・音声入力・サーマルプリンタなど興味をある事をどんどん試してみた際の記録

AIでブロックパズルが解けるかチャレンジしてみた

背景

  • 暇つぶしのブロック消しパズルにはまっている
  • 自分の力だとちょっとクリア出来ない状況になったのでAIで解けるか試してみた

ゲームについて

  • Color Block Jam

play.google.com

試してみた

  • プロンプトがキモな気がする

この写真のゲームはブロックを動かして、同じ色の出口に持っていって消していくゲームです。
・▲マーク付きの端にあるのは各色の出口です
・○が4つ(2x2)で1つのブロックです。
・同じ色で星付きの物もあります。これは星付きの出口の場合、星無しの同じ色であれば出口から出れます
・数字があるものは回数分他のブロックを消すと封印が解ける
・左右や上下の両矢印があるブロックは横か縦にしか移動できない
この面が難しくてクリアできません。
これをクリアするための移動ルートを考えてほしいが、まずは盤面を正しく認識できてるか確認したい。
出口、ブロックの盤面をテキストで表してみて
  • 出力された盤面

  • 間違っている所

  • 間違い探しを事前に出来てなかった為、何回も間違った出口について質問してしまった・・・

  • またyoutubeには同じ面の攻略があった(さすがインターネット!)

www.youtube.com

  • 次困ってYoutubeになかったら再度チャレンジする

playwrightを使って特定のサイトからデータを取得する

背景

  • 毎月日次で特定のサイトから検索をしてデータを確認して転記する作業がある
  • サイト自体古めでどうするのがよいか考えていた
  • せっかくなのでplaywrightを使う

試してみた

  • とりあえず手元でpythonで動かす
uv init
uv add playwright
uv run playwright install
source .venv/bin/activate
  • 手元のブラウザ動かしてパスを取得する
playwright codegen https://xxx.xxx/
  • 出て来たpythonのコードをベースにclaudeに自分のやりたいことをマージしてもらう
  • 毎月30分掛かっていたことが5分でできるようになった!

LookerStudioで人に画面をシェア出来る様に黒塗りにするChrome拡張を作った

背景

  • Looker Studioを使っているが、実際のデータ(企業情報・個人情報)が入っていたりして、スクショを撮って黒塗りして運用している
  • そもそも拡張機能で隠せないか検証してみる

試してみた

  • developer toolでlooker studioの表のサンプルを渡す
  • 個人情報渡ると行けないので半角文字以外は全て置換
[^\x01-\x7E\uFF61-\uFF9F]
  • 一部のソースを渡して、divに対してマスクしたいプロンプトを書く

  • 下記の様な形で出来た!

  • タイトルもマスクする
  • スクロールが発生すると解除されるので注意。ここを直すか検討中。
  • 需要あればgithubで公開する

sqlfmtからsqlfluffに乗り換えた

www.sqlfluff.com

背景

  • 仕事でのdbtのjinjaのformatterにsqlfmtを使っていた
  • syntax error等が検知されない事が課題だった
  • 同僚が提案PRしてくれたので使ってみる

入れてみた

  • pip install sqlfluff
  • echo " SELECT a + b FROM tbl; " > test.sql
  • sqlfluff lint test.sql --dialect ansi

  • 使って無いCTEを検出してくれたりもする

  • 思ったよりも高機能で良さそう

Looker Studioのパラメーターを使ってURLを開いたらフィルタを適用されている様にする

背景

  • Looker Studioのパラメーターを使いたかった
  • URLを開いたらフィルタが適用されている状態にしたい(完全固定では無く、URL毎に異なる様にしたい)

試してみた

  • リソースに対してパラメーターを追加する

  • リソースから変数(パラメータ)を管理

  • URLに変更を加える

  • フィルタのデフォルトにパラメータを指定

  • json形式で渡すらしい
  • もちろんutf-8でのエンコードは必要
  • ?params= { %7B " %22 dsリソース名 " %22 : " %22 値 " %22 } %7D
  • エンコードするところとしない所がわかりづらい。。
  • しかし上記でやってもうまく適用されず、、、

  • 仕方ないの別のやり方を試す

  • 閲覧者でURLが変わる様に設定する

  • ファイル、レポート設定

  • カスタムブックマークリンクを有効にする

  • できた!けど事前の情報と少し違っていた・・・
  • 独自のパラメーターを使ってたりするみたい、、、
  • "df113": "include\uE0000\uE000IN\uE000

飲み会LTは良いという話

背景

  • 飲み会LTをやっているという話

元々ある課題感

  • 飲み会で自分の近況について話すタイムが無い(触りをしゃべってたら気がついたら別の話題へ・・・)
  • 他の人の近況を深掘るタイムが無い(気がついたら別の話題に)
  • 2人 or 3人の飲み会なら上記は問題無いが、4人以上になると上記になってしまう(なのでできる限りコンパクトな飲み会を心がけてはいるが)
  • 話題の方向性が現状の愚痴の方に伸びやすい(その場合、会社が違うとつまらない)

解決提案

  • 飲み会LTを提案
  • 事前に話したいLT(ライトニングトーク)をまとめておく
  • 自分の話したいことを決まった時間(5分〜10分)気持ちよくしゃべれる
  • 事前資料を作る事で、絵や図をベースに説明出来る
  • その瞬間だけは静かに話を聞いて貰える
  • LT後も上記のネタをベースに話が出来る(話題が尽きない)
  • 普段からネタを資料に落としておくと、不意な飲み会でも使える

  • 個室推奨

  • 人数多かったらモバイルモニタ推奨
  • 飲み物オーダーや運びで中断されないように開始するタイミングは見計らう必要がある
  • 相手にもしゃべって貰う必要があるので、事前に軽く個人的なLTを事前用意してもらうと良い

  • 全飲み会に取り入れてほしい。

  • たまに「意識高い系ですね」と言われて引かれる事があるが、「いえ、自分会話下手なので自分を知ってもらう為のやり方です」で切り返してきた

Obsidianに前日完了したTodoistのタスクを取得する

背景

  • Obsidianにいろいろ記録したい
  • 自動でTodoistの内容であれば記録できそう
  • Pythonで取得するようにした

試してみた

  • TodoistのAPIを使って取得する
  • Obsidian側からではなく、ファイルに出力するようにした
import os
from datetime import datetime, timedelta
import requests

# === 設定 ===========================================
API_TOKEN = "XXXXX"  # ★← ここに自身のトークンを入力
DIRECTORY = "XXXXXX"
# ====================================================

# 昨日の日付取得
yesterday = datetime.now() - timedelta(days=1)
date_str = yesterday.strftime('%Y-%m-%d')

# ファイルパス構築
filename = f"{date_str}.md"
filepath = os.path.join(DIRECTORY, filename)

# Todoist APIから完了タスク取得
headers = {
    "Authorization": f"Bearer {API_TOKEN}"
}
params = {
    "since": yesterday.replace(hour=0, minute=0, second=0).isoformat(),
    "until": yesterday.replace(hour=23, minute=59, second=59).isoformat()
}
response = requests.get(
    "https://api.todoist.com/sync/v9/completed/get_all",
    headers=headers,
    params=params
)

# API エラーハンドリング
if response.status_code != 200:
    print("❌ Todoist APIの呼び出しに失敗しました:", response.text)
    exit(1)

completed_items = response.json().get("items", [])

# 追記するテキスト構成
lines = ["\n# Todoistでの完了項目\n"]

if completed_items:
    for item in completed_items:
        lines.append(f"- {item.get('content', '(内容なし)')}")
else:
    lines.append("- 完了タスクはありません。")

append_text = "\n".join(lines) + "\n"

# ディレクトリがなければ作成
if not os.path.exists(DIRECTORY):
    os.makedirs(DIRECTORY)

# ファイルが存在しない場合は新規作成(初期コンテンツ含む)
if not os.path.exists(filepath):
    with open(filepath, "w", encoding="utf-8") as f:
        f.write(append_text)
    print(f"✅ ファイルが存在しなかったため新規作成しました: {filepath}")
else:
    # ファイルがある場合は末尾に追記
    with open(filepath, "a", encoding="utf-8") as f:
        f.write(append_text)
    print(f"✅ 既存ファイルの末尾に追記しました: {filepath}")
  • 毎日実行する必要があるが、とりあえずは試して価値がでそうであれば続けてみる