LinkedIn の投稿を役割で組み直す ― 1日4本を平日1本に
この記事の素材(コード・ログ・データ 7ファイル・まとめてダウンロードあり)arrow_downwardAIで読む ChatGPT・Claude などで、この記事に質問できます expand_more
Pixels to Motors の LinkedIn で、広告なしで最も多く表示されたのは、知られた会社名の入った業界の読み解き(「猫の配膳ロボット 売上世界一はソフトバンクか Pudu か」、559回)で、反応の割合が高かったのは課題地図(7.5%)と「ひとりとAI」の話(6.5%)だった。 2026年8月12日〜11月9日の90日分を LinkedIn から書き出して投稿の種類ごとに比べ、1日に最大4本出していた予約を、4つの役割に分けた平日17時の1日1本に組み直した。
組み直したことで、次のことが変わる。
- 同じ日に出した自分の投稿どうしで、読む人の目を取り合わなくなる。11月10日〜16日の1週間で見ると、LinkedIn の予約は24本から5本になった
- 投稿ごとに役割が決まる。広く届けたい日(水・金の業界の読み解き)と、深く読んでほしい日(月・木の課題地図、火の研究の記録)が分かれるので、2週間ごとの書き出しで「どの役割が効いたか」を比べられる
- 予約は自動のまま崩れない。決まりから外れた予約(1日2本目・土日・マンガ・英語)を入れると、GitHub の予定表の確かめが赤くなって止まる。予約の手直しにかかる時間は、前を測っていないので比べられない。次の書き出しまでに手で直した回数で確かめる
きっかけは、自分の LinkedIn の投稿をスマホで見比べたことだった。社会実装の前に解くべき課題を1つずつ紹介する投稿(課題地図)は、どれも反応が2〜5件ついているのに、表示は40〜70回で止まっていた。10月26日に「LinkedIn は研究の記録だけを平日1日1本」と決めていたが(LOG386「LinkedIn の90日を書き出した」)、予約表を開くと、マンガ7:30・課題地図8:00・記事17:00・動画の夜と、1日に3〜4本が入っていた。90日で一番届いた投稿(1,264回)は、お金を払って広く届けた(ブーストした)1本だったことも分かった。
| やったこと | なぜ | 結果 |
|---|---|---|
LinkedIn の分析を2週間分・90日分・ブーストした1本分の3つ書き出した | スマホの画面では数本しか比べられない | 90日で5,668回表示・1,926人に届いた。上位50本を読めた |
上位50本を投稿の種類ごとに分けた | 「何が刺さるか」を種類で言うため | 業界の読み解きは広く、課題地図とひとりとAIは深く届いた。英語は18本で反応率1.0% |
| ブーストした1本を別に見た | 広告の数字が全体を押し上げていた | 届いた先は自動車・産業機械のエンジニア。フォロワーは1人増えただけ |
曜日ごとに役割(柱)を決めた計画を立てた | 1日に何本も出すのをやめ、役割で比べられるようにする | 月・木=課題地図、火=研究の記録、水・金=業界の読み解き、金=ひとりとAI |
予約されていた LinkedIn 124本を組み直した | 決めた形を予約に反映する | 65本を柱の枠に入れ直し、59本を LinkedIn から外した(X はそのまま) |
予定表の確かめと、動画の予約の同期に決まりを足した | 次の予約から崩れないようにする | 1日2本目などを入れると止まる。GitHub の確かめは2つとも通った |
この記事の数字は、LinkedIn から書き出した Excel のファイルをそのまま読んだもの。効果の欄のうち、組み直したあとにどう届くかは見込みで、2週間後の書き出しで確かめる。
作業ログ ― LinkedIn の課題地図の投稿4本をスマホで見比べた
最初に見たのは、LinkedIn のアプリで開いた自分の投稿4本。どれも課題地図(pixelstomotors.com/issues )のページを1つずつ紹介する形で、毎朝8時に自動で出していた。
| 投稿 | 公開から | インプレッション | 反応 | 反応率 |
|---|---|---|---|---|
| 事故時の責任分界 | 2時間 | 26 | 4 | 約15% |
| 現場知のデータ化 | 4日 | 40 | 3 | 約8% |
| 実機データの圧倒的不足 | 1週間 | 69 | 4 | 約6% |
| 動作のポータビリティ不在 | 1週間 | 37 | 2 | 約5% |
インプレッションは、投稿が誰かの画面に表示された回数。反応は、いいねなどのリアクション・コメント・再投稿を合わせた数。反応率は反応をインプレッションで割った値で、ここでは画面の数字から手で割った。
4本とも、いいねを押している人の顔ぶれがほぼ同じで、コメントは0件だった。すべての投稿の最後に読み手への問いを置いているのに、答えた人はいない。「刺さっている」というより「いつも読んでくれる人に好かれている」に近い、というのがこの時点の見立てだった。母数が小さいので、決める前に LinkedIn から数字を書き出すことにした。
LinkedIn のクリエイター分析を Excel に書き出す
この記事のコード・ログ・データは、1ファイルずつ下に置いています。全文はリンク先にあります。
ファイルの一覧(7本)
01_sec02.txt ― 2週間分(2026年10月27日〜11月9日)の書き出しを読む / read_two_weeks.py の出力(2週間分)・28,616字
02_sec03.txt ― read_90days.py の出力(90日分)・4,316字
03_sec06.txt ― list_future_linkedin.py の出力(組み直す前の予約)・6,322字
04_replan.py_replan.py.txt ― 予約を柱の枠に入れ直すスクリプト replan.py / replan.py・3,067字
05_replan.py.txt ― 予約を柱の枠に入れ直すスクリプト replan.py / replan.py の出力(直したあと)・4,081字
06_sns_autopost.py.txt ― sns_autopost.py(足した部分と check_schedule)・3,525字
07_sync_youtube_shorts.py.txt ― sync_youtube_shorts.py(変えたあとの全体)・8,157字
LinkedIn のクリエイター分析は、自分の投稿の数字を Excel で渡す機能
LinkedIn のクリエイター分析は、個人のアカウントの投稿の数字(表示された回数・反応・フォロワーの増え方・見た人の属性)をまとめて見せる画面で、右上の「エクスポート」から .xlsx のファイルで書き出せる。PC のブラウザで https://www.linkedin.com/analytics/creator/content/ を開き、期間を選んで書き出す。1本の投稿だけの数字は、投稿の「インプレッション」の横の「表示」から同じように書き出せる。
| 言葉 | 意味 |
|---|---|
| インプレッション | 投稿が画面に表示された回数 |
| リーチしたメンバー | 投稿を見た人の数(同じ人が2回見ても1) |
| エンゲージメント | リアクション・コメント・再投稿・保存・送信を合わせた反応の数 |
| ブースト | お金を払って、投稿を選んだ相手に広く届ける機能 |
| 人気の投稿 | 期間中の上位の投稿。書き出しに入るのは最大50本 |
このプロジェクトでは、書き出したファイルを iCloud の sns_analytics/LinkedIn/ に、書き出したときのファイル名で置く(公開しない)。個人の投稿の数字はおよそ90日で見えなくなるので、2週間ごとに書き出して残す。
2週間分(2026年10月27日〜11月9日)の書き出しを読む
書き出したファイル AggregateAnalytics_Eiichi_Shimazu_2026-10-27_2026-11-09.xlsx を、シートごとに全部の行を出して読んだ。記事のために同じ処理をファイルにして、もう一度動かした出力を載せる。
read_two_weeks.py
import openpyxl,sys
wb=openpyxl.load_workbook(sys.argv[1],read_only=True)
for ws in wb:
print('==',ws.title)
for r in ws.iter_rows(values_only=True):
if any(c is not None for c in r): print(r)
read_two_weeks.py の出力(2週間分)
== 調査
('全体的なパフォーマンス', '2026/10/27 - 2026/11/9')
('インプレッション', '2202')
('リーチしたメンバー', '750')
== エンゲージメント
('日付', 'インプレッション', 'エンゲージメント')
('2026/10/27', '89', '1')
('2026/10/28', '125', '2')2週間の合計は2,202回の表示・750人。11月5日に表示が450回に跳ねていて、その日に出した「猫の配膳ロボット 売上世界一はソフトバンクか Pudu か」が1本で555回表示されていた。課題地図の投稿は、2週間の中では上位に入っていない。見た人は東京が中心で、職種はプロダクト・UX・UI のデザイナーが多かった。
90日分(2026年8月12日〜11月9日)で見直す
2週間では本数が少ないので、期間を90日にして書き出し直した(AggregateAnalytics_Eiichi_Shimazu_2026-08-12_2026-11-09.xlsx)。週ごとの表示と反応を足し、上位50本を反応の順と表示の順に並べた。
read_90days.py
import openpyxl,urllib.parse,re,collections,datetime,sys
wb=openpyxl.load_workbook(sys.argv[1],read_only=True)
def s(u):
x=urllib.parse.unquote(u.split('eiichi-shimazu_')[-1]); return re.sub(r'-(share|ugcPost|activity)-.*','',x)[:45]
for r in wb['調査'].iter_rows(values_only=True): print(r)
rows=[r for r in wb['エンゲージメント'].iter_rows(values_only=True)][1:]
wk=collections.OrderedDict()
for d,i,e in rows:
if not d: continue
y,m,dd=map(int,d.split('/')); k=datetime.date(y,m,dd); k=k-datetime.timedelta(days=k.weekday())
a=wk.setdefault(k,[0,0]); a[0]+=int(i); a[1]+=int(e)
for k,v in wk.items(): print(k,v)
p=list(wb['人気の投稿'].iter_rows(values_only=True))[3:]
print('--eng');[print(r[1],r[2],s(r[0])) for r in p if r[0]]
print('--imp');[print(r[5],r[6],s(r[4])) for r in p if r[4]]
print('--fol');print(list(wb['フォロワー'].iter_rows(values_only=True))[0])
read_90days.py の出力(90日分)
('全体的なパフォーマンス', '2026/8/12 - 2026/11/9')
('インプレッション', '5668')
('リーチしたメンバー', '1926')
2026-08-10 [40, 3]
2026-08-17 [85, 1]
2026-08-24 [39, 0]
2026-08-31 [66, 1]
2026-09-07 [165, 1]90日で一番届いた LOG12 は、ブーストした1本だった
90日で一番表示されたのは「フィジカルAI研究室を作る Log#12」(1,264回・反応17)で、10月最終週に週1,830回まで跳ねたのもこの投稿による。最初は「研究の記録が一番届いた」と読んだが、この1本はブーストしていた。お金を払って届けた数字は投稿の中身の力とは別なので、比べる対象から外した。
外すと見え方が変わる。広告なしで突き抜けたのは「猫の配膳ロボット」の1本(559回)だけで、次が「ひとりとAIで、研究と発信を続けるには」(168回・反応13)。研究の記録(研究室の Log#13、シミュレーションの Log#12・#13)は、どれも30回台だった。週ごとの表示は、ブーストを除くと9月からゆるやかに増えて、週200〜460回ほど。
ブーストした LOG12 の1本の書き出し
ブーストした1本だけの数字も書き出した(SinglePostAnalytics_Eiichi_Shimazu_7520031492190728193.xlsx)。読み方は2週間分と同じスクリプト。
read_two_weeks.py の出力(LOG12 の1本)
== 投稿データ
('投稿のURL', 'https://www.linkedin.com/posts/eiichi-shimazu_%E3%83%95%E3%82%A3%E3%82%B8%E3%82%AB%E3%83%ABai%E7%A0%94%E7%A9%B6%E5%AE%A4%E3%82%92%E4%BD%9C%E3%82%8B-log12-physical-intelligence-share-7520031491465187328-AEGy', None)
('掲載日', '2026/10/25', None)
('投稿の公開時刻', '17:00', None)
('調査', None, None)
('インプレッション数', '1264', None)
('リーチしたメンバー', '799', None)
('プロフィールアクティビティ', None, None)
('この投稿からのプロフィール閲覧ユーザー', '9', None)
('この投稿で獲得したフォロワー', '1', None)
('エンゲージメント', None, None)
('ソーシャルエンゲージメント', '18', None)
('リアクション', '14', None)
('コメント', '3', None)
('再投稿', '1', None)
('保存数', '0', None)
('LinkedInでの送信数', '0', None)
('リンクエンゲージメント', '0', None)
('Premiumカスタムボタンエンゲージメント', '0', None)
('投稿閲覧ユーザーの統計データ', None, None)
('カテゴリー', '値', '%')
('役職', 'ソフトウェアエンジニア', '9%')
('役職', '設計エンジニア', '4%')
('役職', 'プロジェクトエンジニア', '3%')
('役職', '研究開発エンジニア', '2%')
('役職', 'アプリケーションエンジニア', '2%')
('役職', 'メカニカルデザインエンジニア', '2%')
('役職', '機械エンジニア', '2%')
('役職', 'サービスエンジニア', '2%')
('役職', 'ソリューションエンジニア', '1%')
('場所', '広域東京エリア', '25%')
('場所', '名古屋', '5%')
('場所', '広域大阪エリア', '4%')
('場所', 'グレーター バンガロール エリア', '3%')
('場所', '川崎市', '2%')
('場所', '静岡', '2%')
('場所', '神戸', '1%')
('場所', '水戸 - 日立都市圏', '1%')
('場所', '京都', '1%')
('職務レベル', 'エントリーレベル', '58%')
('職務レベル', 'シニアレベル', '26%')
('職務レベル', 'マネージャーレベル', '4%')
('職務レベル', 'ディレクターレベル', '3%')
('職務レベル', '研修・トレーニング', '2%')
('職務レベル', '最高責任者 (CXO)', '2%')
('職務レベル', '副社長 (VP)', '< 1%')
('職務レベル', '経営パートナー', '< 1%')
('会社', 'Bosch Japan', '2%')
('会社', 'KPIT', '1%')
('会社', 'Honda', '1%')
('会社', 'Suzuki Motor Corporation', '1%')
('会社', 'Mitsubishi Fuso Truck and Bus Corporation', '1%')
('会社', 'Tata Elxsi', '< 1%')
('会社', 'Tata Consultancy Services', '< 1%')
('会社', 'TIER IV', '< 1%')
('会社', 'Woven by Toyota', '< 1%')
('業種', '自動車製造業', '16%')
('業種', 'ITサービス・ITコンサルティング', '11%')
('業種', '電気機器・電子機器製造業', '11%')
('業種', '産業機械製造業', '10%')
('業種', 'ソフトウェア開発', '7%')
('業種', 'オートメーション機器製造業', '5%')
('業種', 'ロボット工学', '5%')
('業種', '技術・情報・インターネット', '4%')
('業種', 'ビジネスコンサルティング・サービス', '2%')
('業種', '製造業', '2%')
('会社規模', '従業員10,001人以上', '33%')
('会社規模', '従業員201~500人', '9%')
('会社規模', '従業員51~200人', '9%')
('会社規模', '従業員1,001~5,000人', '8%')
('会社規模', '従業員11~50人', '8%')
('会社規模', '従業員5,001~10,000人', '5%')
('会社規模', '従業員2~10人', '5%')
('会社規模', '従業員501~1,000人', '4%')
799人に届いて反応18。ふだんの読み手(デザイナー)と違い、ソフトウェア・設計・機械のエンジニアに届いていた。業種は自動車製造(16%)・電気電子・産業機械・オートメーション・ロボット工学で、33%が1万人以上の会社。フィジカルAIを入れる側の業界に届いた点では、狙う相手に近い。一方で、プロフィールを見に来た人は9人、増えたフォロワーは1人で、見た人の58%がエントリーレベルだった。ブーストは届ける相手を変えられたが、「この人は誰だろう」と思わせて関係につなげるところまでは届いていない。
LinkedIn の投稿を種類ごとに分けて比べる
90日の上位50本を、題名から7つの種類に分けた。分け方は題名の言葉で決めた(課題地図は「解くべき課題」、マンガは「第◯話」、英語は英字だけの題名、研究の記録は「log」を含むもの、など)。
by_kind.py
import openpyxl,urllib.parse,re,collections,sys
wb=openpyxl.load_workbook(sys.argv[1],read_only=True)
p=list(wb['人気の投稿'].iter_rows(values_only=True))[3:]
eng={r[0]:int(r[2]) for r in p if r[0]}
imp={r[4]:(r[5],int(r[6])) for r in p if r[4]}
def s(u):
x=urllib.parse.unquote(u.split('eiichi-shimazu_')[-1]); return re.sub(r'-(share|ugcPost|activity)-.*','',x)
def cat(t):
if 'log12-physical' in t: return 'BOOST'
if '解くべき課題' in t: return '課題地図'
if re.match(r'^第\d+話',t): return 'マンガ(日)'
if re.match(r'^[a-z0-9-]+$',t) : return '英語/タグのみ'
if 'log' in t: return '研究・シミュの記録'
if any(k in t for k in ['ソフトバンク','kddi','中国','2万2000','日経','ニュース']): return '業界の読み解き'
if any(k in t for k in ['aiで','aiの','aiに','ai-を']): return 'ひとりとAI'
return 'その他(考察・試作・コラム)'
g=collections.defaultdict(list)
for u,(d,i) in imp.items(): g[cat(s(u))].append((i,eng.get(u,0),d,s(u)[:30]))
for k,v in g.items():
v.sort(reverse=True); n=len(v); ti=sum(a for a,*_ in v); te=sum(b for _,b,*_ in v)
print(f'{k}: n={n} 平均imp={ti/n:.0f} 中央={v[n//2][0]} 反応計={te} 反応率={te/ti*100:.1f}%')
for x in v[:4]: print(' ',x)
print('total posts listed',len(imp))
by_kind.py の出力
BOOST: n=1 平均imp=1264 中央=1264 反応計=17 反応率=1.3%
(1264, 17, '2026/10/25', 'フィジカルai研究室を作る-log12-physical-i')
業界の読み解き: n=5 平均imp=157 中央=61 反応計=6 反応率=0.8%
(559, 4, '2026/11/5', '猫の配膳ロボット売上世界一はソフトバンクかpuduか')
(75, 1, '2026/10/12', '2026年の上半期に出荷された人型ロボットは世界で2万200')
(61, 0, '2026/10/14', '中国は1日120億円じゃあ日本は-ロボットのお金のニュースを')
(60, 1, '2026/11/7', 'kddiとソフトバンクはフィジカルaiでもライバルか300億')
ひとりとAI: n=4 平均imp=74 中央=43 反応計=19 反応率=6.5%
(168, 13, '2026/10/31', 'ひとりとaiで研究と発信を続けるには-aiに任せる仕事と人が')
(49, 2, '2026/11/1', 'aiの間違いは誰が見つけるのか-別のaiに疑わせたら1回目で')
(43, 3, '2026/11/4', 'aiに昨日の続きをさせるには-新しい会話のaiのために置き場')
(34, 1, '2026/10/28', '画面の中で-ai-を使いこなした土台がロボットを動かす-ai')
その他(考察・試作・コラム): n=13 平均imp=46 中央=30 反応計=11 反応率=1.9%
(166, 2, '2026/10/20', 'サービスロボットを入れたら現場がどう変わるかを試せるページを')
(60, 3, '2026/9/20', '手順書どおりに進めたのに現場で小さく食い違う仕事でそんな経験')
(55, 0, '2026/10/11', 'pixels-to-motors-の-youtube-に出す')
(44, 4, '2026/10/30', 'ハロはもう作れるのか-話す転がる段差を上る1台にした家庭向け')
英語/タグのみ: n=18 平均imp=44 中央=35 反応計=8 反応率=1.0%
(130, 0, '2026/10/19', 'a-small-round-robot-that-talks')
(68, 0, '2026/10/19', 'the-nikkei-fell-3318-yen-in-a-')
(61, 2, '2026/10/11', 'its-the-end-of-the-day-a-messa')
(54, 1, '2026/10/26', 'physicalai-robotics-gpu')
課題地図: n=4 平均imp=47 中央=38 反応計=14 反応率=7.5%
(71, 4, '2026/11/1', '実機データの圧倒的不足フィジカルaiの社会実装の前に解くべき')
(41, 3, '2026/11/5', '現場知のデータ化フィジカルaiの社会実装の前に解くべき課題')
(38, 2, '2026/11/2', '動作のポータビリティ不在フィジカルaiの社会実装の前に解くべ')
(37, 5, '2026/11/9', '事故時の責任分界フィジカルaiの社会実装の前に解くべき課題')
研究・シミュの記録: n=3 平均imp=33 中央=34 反応計=3 反応率=3.1%
(36, 1, '2026/10/27', 'フィジカルai研究室を作る-log13-physical-i')
(34, 1, '2026/10/29', 'サービスロボット導入シミュレーション-log13-隠れていた')
(28, 1, '2026/10/25', 'サービスロボット導入シミュレーション-log12-ロボットに')
マンガ(日): n=2 平均imp=34 中央=33 反応計=3 反応率=4.4%
(35, 1, '2026/11/6', '第129話-通販のモジュール')
(33, 2, '2026/11/2', '第133話-6つのハンコ')
total posts listed 50
| 種類 | 本数 | インプレッション(中央) | 最高 | 反応率 |
|---|---|---|---|---|
| 業界の読み解き | 5 | 61 | 559(猫の配膳ロボット) | 0.8% |
| ひとりとAI | 4 | 43 | 168(ひとりとAIで) | 6.5% |
| 課題地図 | 4 | 38 | 71(実機データの不足) | 7.5% |
| 考察・試作・コラム | 13 | 30 | 166(現場がどう変わるか) | 1.9% |
| 英語の投稿 | 18 | 35 | 130 | 1.0% |
| 研究・シミュレーションの記録 | 3 | 34 | 36 | 3.1% |
| マンガ | 2 | 33 | 35 | 4.4% |
書き出しには上位50本しか入らないので、本数の多い種類ほど数字が高めに出ている。反応率も上位の投稿だけから出した目安。それでも、次の3つは言える。
- 広く届いたのは、知られた会社名が題に入った業界の読み解き。ただし届いても反応はされにくい
- 深く反応されたのは、課題地図と、ひとりでAIと実際にやった話
- 英語の投稿は一番本数が多いのに、反応率1.0%。読み手は日本の人が中心なので、当然の結果
LinkedIn の投稿を4つの柱と曜日に割り振る
数字をもとに、投稿を役割で4つの柱に分け、曜日ごとに柱を決めた。研究の記録は、番号順に全部は出さず、発見(数字・意外な結果)がはっきりした回だけを出す。
| 曜日 | 柱 | 役割 | 中身 |
|---|---|---|---|
| 月・木 | 課題地図 | 専門性を積み上げる | 社会実装の前に解くべき課題を1つずつ |
| 火 | 研究の記録 | 手を動かしている証拠 | 学習・推論・実機・シミュレーションの結果を、1つの発見に絞って |
| 水 | 業界の読み解き | 新しい人に届ける | 知られた会社・製品のニュースを、現場に入れる側の目で |
| 金 | ひとりとAI(ない週は業界の読み解き) | 深く反応してもらう | ひとりでAIと研究と発信を回す実際のやり方と失敗 |
LinkedIn に出さないものも決めた。マンガ・英語の投稿・研究の外側の作業の記録は X だけにする。ブーストは月に1本までにし、届いた数ではなく、プロフィールを見た人とフォロワーの増え方で見る。
- ねらい:1日1本にして、同じ日の投稿どうしで表示を取り合わないようにし、役割ごとの効き目を比べられるようにする
- 変わったこと:LinkedIn の予約が1日最大4本(毎日)から、平日17時の1日1本になった
- 見込める効果:課題地図とひとりとAIは反応率5%、業界の読み解きはインプレッションの中央100を目安にする。これは見込みで、2週間後と4週間後の書き出しで確かめる
自動投稿の予定表(schedule.json)の LinkedIn を組み直す
LinkedIn と X の投稿は、GitHub の PixelstoMotors/r2r2r-content の sns/schedule.json に予約を並べておくと、決めた時刻に GitHub Actions が出す仕組みになっている(手順は同じリポジトリの docs/sns_autopost.md)。組み直す前に、まだ出ていない LinkedIn の予約を全部出した。
list_future_linkedin.py
import json,sys
s=json.load(open(sys.argv[1]))['posts']
li=[p for p in s if p.get('platform')=='linkedin' and p.get('post_at','')>='2026-11-09T12']
print('future linkedin', len(li))
for p in li: print(p['post_at'],p['id'])
list_future_linkedin.py の出力(組み直す前の予約)
future linkedin 124
2026-11-09T17:00:00+09:00 LOG384-linkedin
2026-11-10T07:30:00+09:00 MANGA_ep125-linkedin
2026-11-10T08:00:00+09:00 ISSUE-failsafe-stop-design-linkedin
2026-11-10T17:00:00+09:00 LOG393-linkedin
2026-11-10T19:00:00+09:00 VIDEO_ghost-remote-body-linkedin
2026-11-11T07:30:00+09:00 MANGA_ep124-linkedin
2026-11-11T08:00:00+09:00 ISSUE-vlm-explainability-linkedin124本。毎朝7:30のマンガ、8:00の課題地図、平日17:00の記事、夜の動画が並び、10月26日に決めた「研究の記録だけを平日1日1本」とは別の形になっていた。課題地図とマンガの LinkedIn を、あとから毎日の枠で足していったためだった。
予約を柱の枠に入れ直すスクリプト replan.py
11月9日12時より後の、まだ出ていない LinkedIn の予約を取り出し、柱ごとの列に分けて、11月10日から平日17時の枠に順に入れ直す。研究の記録として残す13本と、業界の読み解きとして残す LOG 10本は、題名を見て手で選んだ。動画は公開されたあとの枠にしか入れない。X の予約には触らない。
replan.py
import json, datetime as dt, os, sys
ROOT = sys.argv[1]
JST = dt.timezone(dt.timedelta(hours=9))
S = os.path.join(ROOT, "sns/schedule.json")
sched = json.load(open(S, encoding="utf-8"))
posted = json.load(open(os.path.join(ROOT, "sns/posted.json"), encoding="utf-8"))
FROM = dt.datetime(2026, 11, 9, 12, 0, tzinfo=JST) # 11/9 17:00 以降の未投稿の LinkedIn を組み直す
pt = lambda s: dt.datetime.fromisoformat(s)1回目は、業界の読み解きの列を「出してよい日」の順に並べていた。すると LOG の読み解き10本が先に並び、動画は公開から1〜2か月あとの枠に入った(「パトレイバーは作れるか」は11月11日公開なのに12月23日)。並べ方を、もとの予約の日時の順に変えて、動画が公開から1週間ほどで出るようにした(スクリプトの key=lambda e: e["post_at"] がその直し)。
replan.py の出力(直したあと)
placed 65 dropped 59
2026-11-10 火 research LOG393-linkedin
2026-11-11 水 reading VIDEO_ghost-remote-body-linkedin
2026-11-12 木 issue ISSUE-failsafe-stop-design-linkedin
2026-11-13 金 reading VIDEO_patlabor-linkedin
2026-11-16 月 issue ISSUE-vlm-explainability-linkedin
2026-11-17 火 research LOG396-linkedin
2026-11-18 水 reading VIDEO_ghost-cyborg-body-linkedin65本を枠に入れ直し、59本を LinkedIn から外した。外したのはマンガの予約すべて(35本)と、研究の記録のうち発見のはっきりしない回(24本)。外した回も X の予約は残っているので、X には出る。予約は2027年3月1日まで埋まった。
sns_autopost.py の確かめに LinkedIn の決まりを足す
予定表は、push するたびに GitHub Actions が tools/sns_autopost.py check で中身を確かめている。ここに LinkedIn の決まりを足し、決まりから外れた予約を入れると赤くなって止まるようにした。2026年11月10日以降の LinkedIn の行について、日本語か、マンガやショートではないか、柱(pillar)が書いてあるか、その柱の曜日の17時か、1日1本か、を確かめる。次の空いている枠を返す next_linkedin_slot も同じ所に置き、動画の同期からも使う。
sns_autopost.py(足した部分と check_schedule)
# ---------- LinkedIn の柱と枠(2026-11-09 エイイチが採用) ----------
# LinkedIn は平日 17:00 に1日1本。曜日ごとに柱(投稿の種類)を決める。
# 月・木=課題地図、火=研究の記録、水=業界の読み解き、金=ひとりとAI(なければ業界の読み解き)。
# マンガ・英語・研究の外側の作業の記録は LinkedIn に出さない(X だけ)。docs/sns_autopost.md「LinkedIn の柱と枠」
LINKEDIN_RULE_FROM = dt.datetime(2026, 11, 10, tzinfo=JST)
LINKEDIN_SLOT = (17, 0)
LINKEDIN_PILLARS = {"issue": (0, 3), "research": (1,), "reading": (2, 4), "ai": (4,)}
rule_test.py(枠の探し方と、決まりを破った予約を試す)
import sys,json,datetime as dt
sys.path.insert(0,'tools')
import sns_autopost as s
sc=json.load(open('sns/schedule.json'))
# 枠の関数: 金曜の ai 枠の次、水曜の reading の次
print(s.next_linkedin_slot(sc,'ai',dt.datetime(2026,11,13,20,30,tzinfo=s.JST)))
print(s.next_linkedin_slot(sc,'reading',dt.datetime(2027,1,16,tzinfo=s.JST)))
# 違反を入れたら止まるか
bad={"posts":sc["posts"]+[{"id":"T-linkedin","source":"sns/LOG393_sns_posts.json","platform":"linkedin","post_at":"2026-11-10T08:00:00+09:00","pillar":"research"}]}
print(s.linkedin_rule_errors(bad))
check と rule_test.py の出力
$ python3 tools/sns_autopost.py check
問題ありません。
$ python3 -I rule_test.py
2027-01-22T17:00:00+09:00
2027-01-20T17:00:00+09:00
['T-linkedin(LinkedIn の決まり): research の枠(火曜 17:00)ではありません: 2026-11-10T08:00:00+09:00', '2026-11-10: LinkedIn が1日に2本あります(1日1本まで): LOG393-linkedin, T-linkedin']
1行目は、金曜(ひとりとAI)の枠を11月13日20:30より後で探した結果で、業界の読み解きが金曜を埋めているため2027年1月22日になる。2行目は、業界の読み解きの枠を2027年1月16日より後で探した結果。3行目の、11月10日8:00に研究の記録の予約を足した試しは、2つの理由で止まった。2026年11月10日は火曜なので、研究の記録の曜日ではある。止まったのは時刻が8:00だったことと、同じ日に LOG393 がすでに入っていたことによる。
- ねらい:決めた形を、人が覚えていなくても守れるようにする
- 変わったこと:LinkedIn の予約が枠から外れると、push したときに GitHub Actions が赤くなる
- 見込める効果:10月26日の決まりが、あとから足した毎日の枠で崩れたようなことが起きにくくなる。崩れなかったかは、次の書き出しのときに予定表を見て確かめる
本編の動画の LinkedIn を、公開のあとの柱の枠に入れる
YouTube の本編を公開予約すると、1日2回動く予定のタスクが tools/sync_youtube_shorts.py で予定表に X と LinkedIn の予約を入れている。これまでは LinkedIn も公開と同じ時刻に入れていたので、夜の LinkedIn が増えていた。公開のあとの柱の枠(meta.linkedin_pillar、なければ業界の読み解き)に入れる形に変えた。一度入れた予約は、公開がそれより後ろへずれたときだけ入れ直す。
sync_youtube_shorts.py(変えたあとの全体)
#!/usr/bin/env python3
"""sync_youtube_shorts.py — YouTube で公開予約したショートと本編の X 投稿を、公開の時刻に合わせて予定表に入れる。
元になるもの:
sns/SHORT_ep{N}_sns_posts.json ショートの X の文(posts.x_template。{url} がショートの URL に替わる)
sns/VIDEO_{名前}_sns_posts.json 本編の X の文(2026-10-24 から。{url} が https://youtu.be/{id} に替わる)。
動画との結びつけは、タイトルが meta.youtube_title と同じもの、
なければ meta.title_match の語をすべて含み、長さが meta.seconds と3秒以内のものsync_youtube_shorts.py を Mac の YouTube の一覧で試した出力
$ python3 tools/sync_youtube_shorts.py --videos "/mnt/user-data/uploads/PixelstoMotors/デジタルツイン学習R2R2R/動画/_制作ベース/youtube_videos.json" --dry-run
変わったものはありません
組み直したばかりの予定表に対して、同期が予約を動かさないことを確かめた。YouTube の一覧(youtube_videos.json)は、Mac が1時間ごとに書き出しているものを取り込んだ。
予定表を push して GitHub Actions で確かめた
$ python3 tools/sns_autopost.py check
問題ありません。
$ git log --oneline -1
80382a7 LinkedIn を柱ごとの枠に組み直す(平日17:00・1日1本)
カレンダーの一覧 completed success
SNS自動投稿 completed success
push のあとに動く2つ(予定表の確かめと、Google カレンダーに並べる一覧づくり)は、どちらも通った。カレンダーの予定は、毎日18:10の予定のタスクが新しい予定表に合わせて直す。
sns_autopost.md に足した「LinkedIn の柱と枠」の節
手順書 docs/sns_autopost.md の末尾に、次の節を足した。予約の既定の時刻・本編の動画・課題地図・マンガの節も、LinkedIn が柱の枠に入ることに合わせて直した。
## LinkedIn の柱と枠(2026-11-09)
LinkedIn は平日 17:00 に1日1本。投稿を役割で4つの柱に分け、曜日ごとに柱を決める(エイイチが採用。計画は「LinkedIn 投稿計画(2026-11 見直し)」のドキュメント、元のデータは iCloud の `sns_analytics/LinkedIn/`)。
| 曜日 | 柱(`pillar`) | 中身 |
|---|---|---|
| 月・木 | `issue` | 課題地図のページ(`ISSUE_*`) |
| 火 | `research` | 研究の記録(フィジカルAI研究室・サービスロボット導入シミュレーションなどの LOG)。発見がはっきりした回だけ |
| 水 | `reading` | 業界の読み解き(知られた会社・製品の考察記事、本編の動画) |
| 金 | `ai` | ひとりとAI(ひとりでAIと研究と発信を回す実際の話)。なければ `reading` |
- 決めた理由(2026-08-12〜11-09 の書き出し、ブーストした LOG12 を除く):届いたのは業界の読み解き(猫の配膳ロボット 559)、反応率が高いのは課題地図(7.5%)とひとりとAI(6.5%)。英語は18本で反応率1.0%、研究の記録は30台。1日に3〜4本(マンガ7:30・課題8:00・記事17:00・動画)出していて、同じ日の投稿どうしで読者の目を取り合っていた
- LinkedIn に出さないもの:マンガ・ショート・英語・研究の外側の作業の記録(サイト・動画の仕組みづくり)。これらは X だけ
- 研究の記録は番号順に全部は出さない。発見(数字・意外な結果)がはっきりした回だけを `research` に入れる。入れなかった回も X には出る
- 新しく足すとき:`tools/sns_autopost.py` の `next_linkedin_slot(schedule, pillar, after)` が、その柱の空いている最初の枠を返す。合う柱がない投稿は LinkedIn に入れない
- check(push のとき Actions も動かす)が、2026-11-10 以降の LinkedIn の行について、日本語か・マンガやショートでないか・`pillar` があるか・その柱の曜日の 17:00 か・1日1本か、を確かめる。外れていると赤くなる
- 2週間ごとに書き出して柱ごとに比べる。続ける目安は、課題地図とひとりとAIは反応率5%、業界の読み解きはインプレッションの中央100
- 2026-11-09 の組み直しで LinkedIn から外したもの:マンガの予約すべて、研究の記録のうち LOG384・397・398・402〜405・407・409・414・415・419・422・426・435・440・444・446・452・456・459・463・466・475(X の予約はそのまま)
次の書き出しで確かめること
- 2週間後(11月23日ごろ)と4週間後に90日分を書き出し、柱ごとのインプレッション(中央)と反応率を目安と比べる。下回る柱は、題名の付け方を変えてもう4週間試す
- 課題地図の題に、実際の事例や会社名を1つ入れた回と入れない回で、表示に差が出るか
- 業界の読み解きのうち、11月5日のニュースを扱ったトヨタの回(LOG449)は、枠の順番で2027年1月8日になっている。古くなる前に出すかは、次の見直しで決める
- X の予約は12月23日まで埋まっている。この記事の X も12月23日12:30になった。LinkedIn は、ひとりとAIの柱で2027年1月22日の金曜に入った