試してみたブログ

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

はてなブログが書いた記事タイトル・URL・投稿日をスプシにまとめる

やりたいこと

ためしてみた

  • 下記変数をGASのスクリプトプロパティに埋め込みます
  • USERNAMEははてなID
  • BLOG_IDはフルのドメイン名(私の場合は tameshitemita.hatenablog.jp となります)
  • APIキーは下記より作成できます。 blog.hatena.ne.jp
  • また作成されたAPIキーは下記より参照できます。設定 > 詳細設定
function getHatenaBlogEntriesAll() {
  var USERNAME = PropertiesService.getScriptProperties().getProperty("USERNAME");
  var BLOG_ID = PropertiesService.getScriptProperties().getProperty("BLOG_ID");
  var API_KEY = PropertiesService.getScriptProperties().getProperty("API_KEY");
  var API_URL = `https://blog.hatena.ne.jp/${USERNAME}/${BLOG_ID}/atom/entry`;
  var headers = {
    'Authorization': 'Basic ' + Utilities.base64Encode(USERNAME + ':' + API_KEY)
  };
  var options = {
    'method': 'get',
    'headers': headers,
    'muteHttpExceptions': true
  };

  var entries = [];
  var url = API_URL;
  while (url) {
    var response = UrlFetchApp.fetch(url, options);
    var xmlContent = response.getContentText();
    var document = XmlService.parse(xmlContent);
    var root = document.getRootElement();
    var atomNS = XmlService.getNamespace('http://www.w3.org/2005/Atom');

    // 記事エントリ抽出
    var entryNodes = root.getChildren('entry', atomNS);
    entryNodes.forEach(function(entry) {
      var links = entry.getChildren('link', atomNS);
      var entryLink = '';
      links.forEach(function(link) {
        if (link.getAttribute('rel') && link.getAttribute('rel').getValue() === 'alternate') {
          entryLink = link.getAttribute('href').getValue();
        }
      });
      var entryData = [
        entry.getChildText('title', atomNS), // タイトル
        entryLink, // URL
        entry.getChildText('published', atomNS) // 投稿日
      ];
      entries.push(entryData);
    });

    // "next"リンク検索(次ページがなければ終了)
    var links = root.getChildren('link', atomNS);
    var nextUrl = '';
    links.forEach(function(link) {
      if (link.getAttribute('rel') && link.getAttribute('rel').getValue() === 'next') {
        nextUrl = link.getAttribute('href').getValue();
      }
    });
    url = nextUrl ? nextUrl : null;
  }
  return entries;
}

function writeTitlesUrlsAndDatesToSheet() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('NewsList');
  sheet.clearContents();
  sheet.getRange(1, 2, 1, 3).setValues([['title', 'link', 'published']]); // B1~D1
  var entries = getHatenaBlogEntriesAll();
  if (entries.length > 0) {
    sheet.getRange(2, 2, entries.length, 3).setValues(entries); // B2~D(…
  }
}

  • 一覧化された物を見ながら偏りがあるなだったり、今度こういうの書こうと思いをはせる。

MUNBYNレシートプリンターを購入して子どものタスクを毎朝印刷する+iPhoneからメモを印刷する

tameshitemita.hatenablog.jp

先日の記事で5,6年前に購入した上記のサーマルプリンタを久々に稼働させようと思ったら、どうもうまくいかなかった。 今回下記のサーマルプリンタをブラックフライデーで購入した。

raspberrypiでの稼働実績を探して、下記のサイトを参考にさせてもらった

qiita.com

事前知識

  • ドライバ方式・・・OS経由でプリンタに送られる。専用のドライバが必要。デフォルトではこの設定になっている。
  • ESC/POS方式・・・高速でリアルタイムな制御が可能。仮想ポートやRS232Cでのシリアル通信が必要。今回は仮想ポートで使用する為設定を変更する。
  • 安めのレシートプリンタは日本語フォントを内容していない。そのため、pythonのpillowなどでテキストを画像化した上での印刷が必要となる

MUNBYNレシートプリンターの所感

  • ビープ音がともかくうるさい
  • 印刷が驚くぐらい早い
  • 自動カット内蔵は体験が良い(変にやぶれない)
  • 筐体が思ったよりもデカイ
  • 80mmの感熱紙の方が情報量も多くて良い
  • ドライバのURLが死んでいる・・・付属のDVDから設定変更ツールをなんとか入手

やりたいこと

  • こどものタスクをiPhoneから簡単に印刷させる
  • 自分のタスクもiPhoen・Macから簡単に印刷させる
  • メモなどをiPhoneからサッと入力して印刷させる

そのために必要なこと

  • ビープ音を消す
  • raspberrypiからサーマルプリンタがESC/POSで印刷できること
  • ワンコマンドでiPhoneから印刷+任意のテキストが送れる事

試してみた

  • まずはWindowsからprinter testの設定プログラムを実行
  • amazonのコンテンツにも載っている下記を実行
  • 1F 1B 1F B8 13 14 01 を入力して仮想ポートの使用に変更
  • raspberrypi側で下記を実行
from escpos.printer import Serial
from PIL import Image, ImageDraw, ImageFont

# 日本語フォント(ラズパイにデフォルトで入っているものや、外部フォントファイルを指定)例: /usr/share/fonts/truetype/fonts-japanese-gothic.ttf
font_path = '/usr/share/fonts/truetype/fonts-japanese-gothic.ttf'
font = ImageFont.truetype(font_path, 40)

width = 384  # プリンタの印刷幅(ピクセル単位、機種に合わせて調整)
height = 100
img = Image.new('1', (width, height), 1)  # '1'は白黒2値
draw = ImageDraw.Draw(img)
draw.text((10, 20), 'こんにちは世界', font=font, fill=0)

img.save("japanese_text.png")  # 確認用

p = Serial(devfile='/dev/ttyACM0', baudrate=9600)
p.image("japanese_text.png")
p.cut()
  • いったん最低限日本語で動く事を確認出来た
  • 引数を渡して引数をそのまま印刷出来る様に変更
from escpos.printer import Serial
from PIL import Image, ImageDraw, ImageFont
from datetime import datetime

def print_text(text):
    if not text:
        return  # 文字列がない場合は終了

    font_path = '/usr/share/fonts/truetype/fonts-japanese-gothic.ttf'
    font_item = ImageFont.truetype(font_path, 28)
    font_date = ImageFont.truetype(font_path, 20)

    WIDTH = 384
    head_margin = 10
    date_height = 30
    text_height = 38
    foot_margin = 20
    lines = text.split('\n')
    HEIGHT = head_margin + date_height + len(lines)*text_height + foot_margin

    img = Image.new('1', (WIDTH, HEIGHT), 1)
    draw = ImageDraw.Draw(img)

    # 日付
    now = datetime.now()
    date_text = now.strftime("%Y/%m/%d %H:%M")
    date_bbox = draw.textbbox((0, 0), date_text, font=font_date)
    draw.text((WIDTH - date_bbox[2] - 10, head_margin), date_text, font=font_date, fill=0)

    # 文字列印字
    y = head_margin + date_height
    for line in lines:
        draw.text((10, y), line, font=font_item, fill=0)
        y += text_height

    img.save("text_thermal.png")

    # 印刷
    p = Serial(devfile='/dev/ttyACM0', baudrate=9600)
    p.image("text_thermal.png")
    p.cut()

if __name__ == "__main__":
    import sys
    # コマンドライン引数を結合して一つの文字列にする
    text = ' '.join(sys.argv[1:])
    print_text(text)
  • やりたいことが出来るのが分かったのでiPhone側にショートカットでセットしていく
  • pythonの仮想環境でpipしているので実行するpythonは仮想環境配下のものになる
  • テキストダイアログを付けて入力した物を印字する+sshでワンコマンド送信
  • いい感じにやりたいことができるようになった!

Symcode 58MM USBサーマルレシートプリンターをひさびさに使ったが使え無かった

macからサーマル印刷を試そうと、「このMacについて」、「詳細情報」、「システムレポート」、USBからUSBベンダーIDとUSB製品IDを控えて、下記で印刷をした。

from escpos.printer import Usb
p = Usb(0x0xxx, 0x50xx 0)
p.text("Hello World\n")

問題無く印刷出来たので、娘の料理レシピを渡す為に改良していこうかと思ったら、どうも2度目の印刷時には必ず図が文字化けして印刷された。 ln()やcut()などを入れると改善するとあったが、改善せず電源を落として入れてするとちゃんと印刷される。

ChatGPTや過去のもろもろ調べもどうも分からず。昔は問題なく使えていた記憶があったのにな。。。 とりあえずおとなしく次のおもちゃを探すことにした。

Perplexityのタスクを毎日定期実行させる part2

tameshitemita.hatenablog.jp

前回、定期タスクをセットしてみた。 今回セットしたのは別で運営している地域メディアのネタとなりそうな事をdeep researchで探して貰うものだった。 しかし少し来たい外れな物が返ってきたので、そこを改善してみる。

期待外れと感じた理由

  • 過去分に関しての鮮度の古めな情報がメインだった
  • 既に知り得ている情報だった

改善点

  • 過去の開店日、閉店日以外を取ってくる様に指示
  • 割とあまり知られていない情報に絞る様に指示

まとめ

これで使い物になるかを再度検証していきたい!

Perplexityのタスクを毎日定期実行させる

Perplexityの有料プランの中にタスク機能があります。 あなたのルーチンを強化します。タスクを設定して、適切な時間に自動的に適切なコンテンツを提供します。 とあり、毎日での定期実行が可能です。

スケジュール型の定期実行が可能で、情報収集などに向いています。

上記でさっそくしかけてみました。 どのぐらいうまくいくのかはまた記事にて紹介しますが、自分の欲する情報を10個リストアップして貰う様にしました。

参考

www.lifehacker.jp

Pixel10ProFoldでQuickShareを使ってiPhone/MacのAirdropに画像を送ってみた

背景

forest.watch.impress.co.jp

  • 昨日からPixel10以降の機種でQuickShareからAirdorpへの転送が可能になったというニュースがあった
  • Android - iPhone間の転送はまさに課題がだった為、さっそく使ってみた

試してみた

  • システムアップデートは2025/11/5が最新

  • Pixel10から送信をしようとするが、iPhone/Macを認識しない

  • 個別のシステムのアップデートが別で存在していそう
  • 設定の検索から「システム サービス」を発見
  • 「利用可能なアップデート」に「Quick Share Extension」がいるのでタップして更新

    • 「ベータ版への参加」は不要
  • MaciPhoneが出て来た!

  • 注意点としては、iPhoneの場合は、設定画面から「すべての人(10分間のみ)」にしておくか、連絡先に登録しておく必要がある

SAM 3DをMacにいれようとしたけどダメだった

最初に結論

  • SAM 3DのソースコードMacに入れて動かしかったが、GPU要件的にもMacで動かすには厳しそうだった
  • とはいえそれを知らずに環境作ろうとした際のメモ

やりたかったこと

aidemos.meta.com

このページで画像から体のラインと重心っぽいものを表現出来るのでバッチ的に処理をしていきたかった

minicondaのインストール

www.anaconda.com

mkdir -p ~/miniconda3
curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm ~/miniconda3/miniconda.sh

source ~/miniconda3/bin/activate
conda init --all

conda install -c conda-forge mamba

mamba env create -f environments/default.yml

  • よくよくみるとSetup項目に前提条件が下記だったので、MacApple Sillicon)だと厳しそうとういのが分かった・・・