はてなブログが書いた記事タイトル・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からメモを印刷する
先日の記事で5,6年前に購入した上記のサーマルプリンタを久々に稼働させようと思ったら、どうもうまくいかなかった。 今回下記のサーマルプリンタをブラックフライデーで購入した。
raspberrypiでの稼働実績を探して、下記のサイトを参考にさせてもらった
事前知識
- ドライバ方式・・・OS経由でプリンタに送られる。専用のドライバが必要。デフォルトではこの設定になっている。
- ESC/POS方式・・・高速でリアルタイムな制御が可能。仮想ポートやRS232Cでのシリアル通信が必要。今回は仮想ポートで使用する為設定を変更する。
- 安めのレシートプリンタは日本語フォントを内容していない。そのため、pythonのpillowなどでテキストを画像化した上での印刷が必要となる
MUNBYNレシートプリンターの所感
- ビープ音がともかくうるさい
- 印刷が驚くぐらい早い
- 自動カット内蔵は体験が良い(変にやぶれない)
- 筐体が思ったよりもデカイ
- 80mmの感熱紙の方が情報量も多くて良い
- ドライバのURLが死んでいる・・・付属のDVDから設定変更ツールをなんとか入手
やりたいこと

そのために必要なこと
- ビープ音を消す
- 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)
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
前回、定期タスクをセットしてみた。 今回セットしたのは別で運営している地域メディアのネタとなりそうな事をdeep researchで探して貰うものだった。 しかし少し来たい外れな物が返ってきたので、そこを改善してみる。
期待外れと感じた理由
- 過去分に関しての鮮度の古めな情報がメインだった
- 既に知り得ている情報だった
改善点
- 過去の開店日、閉店日以外を取ってくる様に指示
- 割とあまり知られていない情報に絞る様に指示
まとめ
これで使い物になるかを再度検証していきたい!
Perplexityのタスクを毎日定期実行させる
Perplexityの有料プランの中にタスク機能があります。
あなたのルーチンを強化します。タスクを設定して、適切な時間に自動的に適切なコンテンツを提供します。 とあり、毎日での定期実行が可能です。
スケジュール型の定期実行が可能で、情報収集などに向いています。

上記でさっそくしかけてみました。 どのぐらいうまくいくのかはまた記事にて紹介しますが、自分の欲する情報を10個リストアップして貰う様にしました。
参考
Pixel10ProFoldでQuickShareを使ってiPhone/MacのAirdropに画像を送ってみた
SAM 3DをMacにいれようとしたけどダメだった
最初に結論
やりたかったこと
このページで画像から体のラインと重心っぽいものを表現出来るのでバッチ的に処理をしていきたかった

minicondaのインストール
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








