ð èªååãèµ€åã«ãªãåã«æ¢ãã â weekly revenue-gate ã§ã³ã³ãã³ã忝ãå¯èŠåãã
è§£ééç¥ãåãåã£ããšããClaude APIã®è«æ±æžã¯ç¿æã容赊ãªãå±ããŸããéç£ã©ã€ã³ã14æ¬åæã«åããªãããæå120äžãç¶æã§ããŠããã®ã¯ãããã皌ãã ããã§ã¯ãªããã©ã®ã©ã€ã³ãèµ€ååããŠãããããæ¯é±ææã«èªåã§å¯èŠåããä»çµã¿ãå ã«äœã£ãããã§ãã
ãªããã®ä»çµã¿ãå¹ãã®ã
è€æ°ã®éç£ã©ã€ã³ãåæã«èµ°ããããšãå¥åŠãªããšãèµ·ããŸããå¿ããã»ã©ãæ°åãèŠãªããªãã®ã§ãã
ã¢ãã£ãªèšäºã©ã€ã³ã¯é±28æ¬åºåããŠããŸããLINEã¹ã¿ã³ãã©ã€ã³ã¯é±19ã»ãããiOSã¢ããªã®ã¢ã€ãã¢åºåã¯é±8æ¬ãSNSæçš¿ã©ã€ã³ã«è³ã£ãŠã¯é±120æ¬ä»¥äžã®ãã¡ã€ã«ãã¯ãåºããŸããããã ãã®éãæäœæ¥ã§ç®¡çããŠãããšãããã®ã©ã€ã³ã¯å æããã皌ãã ïŒããšããåãã«å³çã§ãã人ã¯ãŸãããŸããããããŠçããããªãç¶æ ãšããã®ã¯ãèµ€åã©ã€ã³ãç¡æèã«é€ãç¶ããŠããç¶æ ãšå矩ã§ãã
Claude APIã®è²»çšã¯å°ããèŠããŸãã1åã®ããã³ããå®è¡ã¯æ°åã§ãããšããã14ã©ã€ã³ãé±ã«åèšæ°çŸæ¬ã®ãã¡ã€ã«ãçæãç¶ãããšãæã®APIè²»çšã¯ç©ã¿äžãããŸãããã®ãšããã©ã®ã©ã€ã³ã皌ãã§ããªãã®ãããããã«èšããªããšãã³ã¹ãåæžã®å€æãã§ããŸããã
ããã§å žåçãªå¯Ÿå¿ã¯ãã¹ãã¬ããã·ãŒããã€ãããã§ãããããç§ã¯ããããããŸããã§ããã鱿¬¡ã§ã¹ãã¬ããã·ãŒããéããŠèšå ¥ããäœæ¥ããç¿æ £ãšããŠç¶ãã詊ãããªãããã§ããç¶ããªãäœæ¥ã¯ãç°å¢ãã§ã¯ãªããæå¿åãã«äŸåããŠããŸããæå¿åã¯æéã§ãã
revenue-gate.sh ã解決ããã®ã¯ããã§ããæ¯é±ææ8æ20åãMac ãèªåã§ã¬ããŒããçæããŠãã¹ã¯ãããã«çœ®ãã éãã ãã§ãããæžããã®ã¯ãªãã倿ã ãã人éãããã
äœæ¥ã§ãªãç°å¢ãäœãããšã®æå³ã¯ããã«ãããŸãã倿ã®ããªã¬ãŒãå€éšããèªåã§å±ããªããæå¿åãæ¶è²»ããã«æææ±ºå®ã§ããŸããã¬ããŒããå±ãïŒäœããå€ãã£ããµã€ã³ãšããæ¡ä»¶åå°ãäžåºŠäœããšã鱿¬¡ã®åç確èªã¯ãããããšãã§ã¯ãªããèªç¶ã«èµ·ããããšãã«ãªããŸãã
ããäžã€ã®èšèšææ³ã¯**ãæ¢ãã倿ã¯äººéããããã§ãæ¢ããã¹ãã©ã€ã³ãèŠã€ããã®ã¯æ©æ¢°ãããã**ãšãã圹å²åæ ã§ããã¹ã¯ãªããã¯èªå忢ããŸãããã³ãŒããèªããšããæžããŠãããŸãã
KILLæšå¥šã®ãžã§ãã¯ãäœã®ãã/誰ãå¬ãã/ãããå²ãã/ãã€èŠåããã«
çããããªããã°åæ¢ããïŒèªå忢ã¯ããªãã倿ã¯äººéïŒ
èªå忢ããªãèšèšã¯éèŠã§ããæ©æ¢°ãåæã«ã©ã€ã³ãæ¢ãããšãæ¢ãŸã£ãåå ã®æ€èšŒãã§ããªããã誀æ€ç¥ã§çšŒãé ãæ®ºãå¯èœæ§ããããŸããæ©æ¢°ã®ä»äºã¯ããã®ã©ã€ã³ã¯é£ç¶2é±éãäœæ¬ãåºåããã®ã«åçããŒãã§ãããšããäºå®ãçªãã€ããããšã§ããããããå ã¯äººéã®å€æã§ãã
å®éã«2026-07-03ã®ååã¬ããŒãã§ã¯ãASMRã©ã€ã³ãé±14æ¬åºåããŠããŠð¢ïŒç·ïŒã§ãããç¿é±2026-07-06ã®ã¬ããŒãã§ã¯é±0æ¬ã«ãªãâ ïžïŒåºå忢ïŒïŒã«ãªã£ãŠããŸããããã®å€åã¯ãç§ãæå³ããŠæ¢ããã®ã§ã¯ãªããäœããã®çç±ã§ãžã§ããæ¢ãŸã£ãŠããããšãæå³ããŸããã¬ããŒãããªããã°æ°ã¥ããã«ãASMRã©ã€ã³ã¯åããŠããããšæã蟌ãã ãŸãŸãå¥ã®æé©åã«æéã䜿ã£ãŠããã¯ãã§ãã
å šäœã®æµã
ä»çµã¿ã®å šäœåãå ã«ç€ºããŸãã
âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æ¯é±ææ 8:20 / 13:20 (launchd äºéçºç«) â
ââââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââ
â
âŒ
revenue-gate.sh
â
ââââââââââââââââŒâââââââââââââââ
â â â
⌠⌠âŒ
revenue.jsonl revenue-gate.conf åã©ã€ã³ã®
(売äžãã°) (ã©ã€ã³å®çŸ©) åºåãã£ã¬ã¯ããª
(ãã¡ã€ã«æ°ã«ãŠã³ã)
â â â
ââââââââââââââââŒâââââââââââââââ
â
âŒ
revenue-gate-state.json
(é£ç¶ãŒãåçé±ã«ãŠã³ã)
â
âŒ
Markdown ã¬ããŒãçæ
â
ââââââââââââââŽâââââââââââââ
⌠âŒ
~/Desktop/Revenue Gate/ Obsidian vault
(å³æç¢ºèªçš) (briefs/revenue-gate/)
é¢äžãããã¡ã€ã«ã¯5çš®é¡ã§ããé çªã«èŠãŠãããŸãã
ã©ã€ã³å®çŸ©ãã¡ã€ã«ïŒrevenue-gate.confïŒ
~/.claude/data/revenue-gate.conf ããã¹ãŠã®éç£ã©ã€ã³ã管çããŸãããã©ãŒãããã¯ãã€ãåºåãã®3åã§ãã
name|åºåãã£ã¬ã¯ããª|glob
å®éã®ãã¡ã€ã«ããæç²ãããšãããªã£ãŠããŸãã
article|~/Desktop/Article/articles|
note|~/Desktop/Article/note|
maker|~/Desktop/Article/solomaker|
affiliate|~/Desktop/ã¢ãã£ãªèšäº|
asmr|~/dev/asmr-factory/out|
sns-bokuwalily|~/dev/bokuwalily-sns/out|
senior-tube|~/dev/senior-tube-factory/drafts|
line-stamps|~/digital-products/line-stamps-keigo/out|
lead-outreach|~/lead-finder/runs/_logs
idea-ios|~/Desktop/iosã¢ããª|
idea-chrome-ext|~/Desktop/Chromeæ¡åŒµ|
affiliate-livedoor|~/dev/affiliate-livedoor/queue|
affiliate-blogger|~/dev/affiliate-blogger/queue|
affiliate-fc2|~/dev/affiliate-fc2/published|
14ã©ã€ã³ãå®çŸ©ãããŠããŸãã3åç®ã® glob ã¯çç¥ãããš *ïŒå
šãã¡ã€ã«ïŒãšããŠæ±ãããŸããç¹å®ã®æ¡åŒµåã ãã«ãŠã³ããããå ŽåïŒäŸïŒ*.mp3ã*.mdïŒã¯3åç®ã«æå®ã§ããŸãã
æ°ããã©ã€ã³ã远å ãããšãã¯ããã® conf ã«1è¡è¶³ãã ãã§ããã¹ã¯ãªããæ¬äœã«ã¯è§ŠããŸããã
売äžãã°ïŒrevenue.jsonlïŒ
~/.claude/data/revenue.jsonl ã«åçãèšé²ããŸãã圢åŒã¯JSON LinesïŒ1è¡1ã¬ã³ãŒãïŒã§ãã
{"date":"2026-06-15","source":"note","amount_jpy":3200,"note":"ææèšäº1æ¬"}
{"date":"2026-06-22","source":"affiliate","amount_jpy":8400,"note":"Amazonå ±é
¬"}
source ã conf ã® name ãšäžèŽããããšã§ãã©ã®ã©ã€ã³ã®å£²äžããçŽã¥ããŸããèšé²ã¯ä»å±ã® rev.sh ã³ãã³ãã§è¡ããŸãã
rev.sh note 3200 ææèšäº1æ¬
ããã¯å¯äžã®æäœæ¥ãã€ã³ãã§ãã売äžéç¥ãæ¥ãã¿ã€ãã³ã°ã§å®è¡ããŸããcronã§èªåå ¥åã§ããåçïŒAPIã§åããASPçïŒã¯å°æ¥çã«èªååã§ããŸãããçŸç¶ã¯æåã§ååã§ããé±ã«æ°åã5ç§ã®äœæ¥ã§ãã
ç¶æ ãã¡ã€ã«ïŒrevenue-gate-state.jsonïŒ
ãé£ç¶ãŒãåçé±ãã®ã«ãŠã³ããä¿æããŸãã
{
"updated": "2026-07-06T08:20:05",
"week": "202628",
"zero_weeks": {
"affiliate": 2,
"article": 2,
"asmr": 2,
"idea-chrome-ext": 2,
"idea-ios": 2,
"lead-outreach": 2,
"line-stamps": 2,
"maker": 2,
"note": 2,
"senior-tube": 2,
"sns-bokuwalily": 2
}
}
2026-07-06æç¹ã§ã¯å
šã©ã€ã³ã zero_weeks: 2 ã§ããåçãã°ã®èšé²ãå§ããã¿ã€ãã³ã°ããã®é±ãªã®ã§ãåœç¶ã®ç¶æ
ã§ããéçšãé²ãã«ã€ããŠã皌ãã©ã€ã³ã¯0ã«ãªã»ããããã皌ããªãã©ã€ã³ã®ã«ãŠã³ã¿ãŒã ããäžãã£ãŠãããŸãã
ã¹ã±ãžã¥ãŒã©ïŒrevenue-gate.plistïŒ
macOS ã® launchd ã«ç»é²ããèªåå®è¡ã®å®çŸ©ã§ããæææ¥ã®2åçºç«ãç¹åŸŽçã§ãã
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Weekday</key><integer>1</integer>
<key>Hour</key><integer>8</integer>
<key>Minute</key><integer>20</integer>
</dict>
<dict>
<key>Weekday</key><integer>1</integer>
<key>Hour</key><integer>13</integer>
<key>Minute</key><integer>20</integer>
</dict>
</array>
8:20 ã«èµ·åããŠããã°1åç®ã«å®è¡ãããŸããMacãèµ·åããŠããªãã£ãå ŽåïŒé±æ«ã«éãããŸãŸææãè¿ããã±ãŒã¹ïŒãlaunchd ã¯ãèµ·åæå»ãéããå Žåã¯æ¬¡åãŸã§åŸ ã€ãã®ãããã©ã«ãåäœãªã®ã§ã13:20 ã®2åç®ãä¿éºã«ãªã£ãŠããŸãã
ã¹ã¯ãªããåŽã«ã¯é±å ã®éè€å®è¡ãé²ãä»çµã¿ãå ¥ã£ãŠããŸãã
WEEK_MARKER="$LOG_DIR/.revenue-gate-done-$(date +%G%V)"
if [ -f "$WEEK_MARKER" ] && [ "${REVENUE_GATE_FORCE:-0}" != "1" ]; then
exit 0
fi
%G%V ã¯ISOé±çªå·ïŒäŸïŒ202628ïŒã§ããã¬ããŒããäžåºŠçæãããš .revenue-gate-done-202628 ãšããããŒã«ãŒãã¡ã€ã«ã眮ããåãé±ã«2åç®ãèµ·åããŠãå³çµäºããŸãã匷å¶åå®è¡ããããšã㯠REVENUE_GATE_FORCE=1 bash ~/.claude/scripts/revenue-gate.sh ã§äžæžãã§ããŸãã
å€å®ããžãã¯ïŒrevenue-gate.sh å ã® PythonïŒ
ã¹ã¯ãªããã®äžæ žã¯ã·ã§ã«ã«åã蟌ãŸãã Python ãã¢ããã¥ã¡ã³ãã§ããPython 3 ãçŽæ¥äœ¿ãããšã§ãæ¥ä»èšç®ã»ãã¡ã€ã«èµ°æ»ã»JSONæäœã確å®ã«è¡ã£ãŠããŸãã
def weekly_file_count(directory, glob):
root = pathlib.Path(directory)
if not root.is_dir():
return None
threshold = dt.datetime.now().timestamp() - (7 * 24 * 60 * 60)
count = 0
for current_root, _, files in os.walk(root):
for filename in files:
if not fnmatch.fnmatch(filename, glob):
continue
path = pathlib.Path(current_root) / filename
try:
if path.stat().st_mtime >= threshold:
count += 1
except OSError:
continue
return count
weekly_file_count ã¯åºåãã£ã¬ã¯ããªä»¥äžãååž°çã«èµ°æ»ããæŽæ°ã¿ã€ã ã¹ã¿ã³ãã7æ¥ä»¥å
ã®ãã¡ã€ã«ãæ°ããŸãã revenue.jsonl ã®å£²äžèšé²ã§ã¯ãªããå®éã®ãã¡ã€ã«ã·ã¹ãã ãçŽæ¥ã«ãŠã³ãããç¹ãéèŠã§ãããžã§ãããåããŠããã€ãããã§ãåºåãŒããªãå³åº§ã«æ€åºã§ããŸãã
å€å®ã®éŸå€ã¯ãã®ããžãã¯ã§ãã
if count is not None and zweeks >= 4 and count > 0:
verdict = "ðŽ KILLæšå¥š"
elif count is None or count == 0:
verdict = "â ïž åºå忢?"
elif zweeks >= 2:
verdict = "ð¡ èŠèгå¯"
else:
verdict = "ð¢"
4段éã®å€å®åºæºãæŽçãããšãããªããŸãã
ð¢ïŒæ£åžžïŒ â é£ç¶ãŒãåçã2鱿ªæºããã€åºåããããŸã æ©æãªã®ã§é芳ã
ð¡ïŒèŠèгå¯ïŒ â é£ç¶ãŒãåçã2ã3é±ãåºåã¯ç¶ããŠãããåçãåºãŠããªããã³ã¹ãå¯Ÿå¹æã®æ€èšŒãå§ããã·ã°ãã«ã
â ïžïŒåºå忢ïŒïŒ â çŽè¿7æ¥éã®ãã¡ã€ã«æ°ããŒããŸãã¯èšæž¬äžèœããžã§ãèªäœãæ¢ãŸã£ãŠããå¯èœæ§ãé害ãããããªãããæå³çã«æ¢ãããconfã«æ®ã£ãŠããã ããããããªãã
ðŽïŒKILLæšå¥šïŒ â é£ç¶4é±ä»¥äžãŒãåçãªã®ã«ãã¡ã€ã«ã¯åºç¶ããŠããããããæãå±éºãªç¶æ ã§ããAPIã³ã¹ãã ããæµåºãç¶ããŠããã©ã€ã³ã§ãã
ååã¬ããŒãïŒ2026-07-03ïŒãš2åç®ïŒ2026-07-06ïŒã䞊ã¹ããšã3æ¥éã§ã©ã€ã³ã®ç¶æ ãã©ãå€ãã£ãããèŠããŸãã
| ã©ã€ã³ | 07-03 åºå | 07-06 åºå | å€å®å€å |
|---|---|---|---|
| sns-bokuwalily | 237æ¬ | 120æ¬ | ð¢âð¡ |
| note | 40æ¬ | 49æ¬ | ð¢âð¡ |
| maker | 36æ¬ | 30æ¬ | ð¢âð¡ |
| affiliate | 31æ¬ | 28æ¬ | ð¢âð¡ |
| asmr | 14æ¬ | 0æ¬ | ð¢ââ ïž |
| article | 14æ¬ | 11æ¬ | ð¢âð¡ |
å
šã©ã€ã³ãð¡ãâ ïžã«ç§»è¡ããã®ã¯åçèšé²ããŸã éå§ããŠããªãããã§ãïŒrevenue.jsonl ã¯ç©ºïŒããããéèŠãªå€åã1ä»¶ãããŸããASMRã©ã€ã³ã07-03æç¹ã§é±14æ¬ã®åºåãããŠããã«ããããããã07-06ã§ã¯0æ¬ã«ãªã£ãŠããŸããããã¯ã¹ã¯ãªãããèªåã§æ€åºããç°åžžã§ããæäœæ¥ã§ç£èŠããŠããã°ãããããæ°é±éã¯æ°ã¥ããªãã£ããšæããŸãã
å®è£ ã®è©³çް
Python ãã·ã§ã«ã«åã蟌ãçç±
revenue-gate.sh ã®ã³ã¢ã¯ã·ã§ã«ã¹ã¯ãªããã§ã¯ãªããã·ã§ã«ã«åã蟌ãŸãã Python ã§ããã¹ã¯ãªããã®32è¡ç®ããããå§ãŸããŸãã
TMP_REPORT="$(mktemp /tmp/revenue-gate.XXXXXX.md)"
if /usr/bin/python3 - "$CONF" "$REVENUE_FILE" "$STATE_FILE" "$REPORT_DATE" > "$TMP_REPORT" <<'PY'
import datetime as dt
import fnmatch
import json
import os
import pathlib
import sys
...
PY
<<'PY' ãšããã·ã³ã°ã«ã¯ã©ãŒãã®ãã¢ããã¥ã¡ã³ãã¯ãæ¬äœäžã® $ ãã·ã§ã«ãå±éããªãããã«ããããã®æžãæ¹ã§ããã¯ã©ãŒããªãã§ <<PY ãšæžããšãPython ã³ãŒãäžã® $HOME ã ${something} ãã·ã§ã«ã«é£ãããŸããèªååã¹ã¯ãªããã§ãã®ãã¹ããããšç¡é³ã§å£ããã®ã§æ°ãã€ããŠãã ããã
/usr/bin/python3 ãšãã«ãã¹ã§æžããŠããã®ã¯ãlaunchd ã® PATH ãè²§çžã ããã§ããpython3 ã ãæžããš /usr/bin ããéã£ãŠããªãç°å¢ã§ã¯èŠã€ãããªããHomebrew ã® /opt/homebrew/bin ã«å
¥ã£ãŠããã©ã€ãã©ãªã䜿ãå Žåã¯ããã«æ³šæãèŠããŸãïŒä»åã¯æšæºã©ã€ãã©ãªã®ã¿ãªã®ã§ /usr/bin/python3 ã§åé¡ãããŸããïŒã
åŒæ°ã sys.argv[1] 以éã§åãåãæ¹åŒã«ããŠããã®ã¯ãPython å
ã§ãã¹ãçŽæ¥æååãšããŠæžãããšãé¿ããããã§ããå°æ¥ conf ã®ãã¹ãå€ããããªã£ããšããã·ã§ã«å€æ°ã1ãæçŽãã ãã§æžã¿ãŸãã
zero_weeks ã«ãŠã³ã¿ã®ã¹ããŒããã·ã³
revenue-gate-state.json ã®æŽæ°ããžãã¯ã¯84ã108è¡ç®ã§ããé±çªå·ïŒ%G%VïŒãå€ãã£ãå Žåã ãã«ãŠã³ããæŽæ°ããŸãã
if state.get("week") == current_week:
# åãé±ã®åå®è¡ â ã«ãŠã³ãã¯å€ããªã
for entry in entries:
name = entry["name"]
try:
zero_weeks[name] = int(zero_weeks.get(name, 0))
except (TypeError, ValueError):
zero_weeks[name] = 0
else:
# æ°ããé± â åçãŒããªã+1ãåçããã°0ã«ãªã»ãã
for entry in entries:
name = entry["name"]
if weekly_revenue.get(name, 0.0) > 0:
zero_weeks[name] = 0
else:
try:
previous = int(zero_weeks.get(name, 0))
except (TypeError, ValueError):
previous = 0
zero_weeks[name] = previous + 1
state.get("week") == current_week ã®åå²ãå¹ããŠããã®ã¯ãREVENUE_GATE_FORCE=1 ã§åŒ·å¶åå®è¡ãããšãã§ããåãé±ã«2åç®ãèµ°ãããŠã zero_weeks ãäºéã«ã«ãŠã³ããããŸããã
try / except (TypeError, ValueError) 㯠JSON ã«ãŽããå
¥ã£ãŠãããšãã®é²åŸ¡ã§ããããšãã° "zero_weeks": {"note": null} ã®ããã« null ãå
¥ã£ãç¶æ
ãã int(None) ããããšãããš TypeError ãåºãŸããèªååãžã§ãã¯æ°ã¶æåŸã«èªåãå¿ããé ã«å£ããã®ã§ããã®ãããã®é²åŸ¡ã¯å
¥ããŠããã¹ãã§ãã
weekly_file_count ã® os.walk ãš fnmatch
éç£ãžã§ãã®å®æ
ãèŠãã®ã weekly_file_count ã§ãïŒ132ã148è¡ç®ïŒã
def weekly_file_count(directory, glob):
root = pathlib.Path(directory)
if not root.is_dir():
return None
threshold = dt.datetime.now().timestamp() - (7 * 24 * 60 * 60)
count = 0
for current_root, _, files in os.walk(root):
for filename in files:
if not fnmatch.fnmatch(filename, glob):
continue
path = pathlib.Path(current_root) / filename
try:
if path.stat().st_mtime >= threshold:
count += 1
except OSError:
continue
return count
èã¯3ã€ãããŸãã
ãã£ã¬ã¯ããªãååšããªããšãã« None ãè¿ãã return None ãå€å®ããžãã¯ã«æµãããš count is None ã§ â ïž åºå忢? ã«ãªããŸããããã¹ãééã£ãŠããã®ããžã§ããæ¢ãŸã£ãã®ãããããªãããšããåºå¥ãå€å®çµæã«å«ããããšãããšèšèšãè€éã«ãªãã®ã§ãNone ããã®ãŸãŸ â ïž ã«ãããã³ã°ããã®ã劥åœã§ãã
st_mtime ã§éå»7æ¥éãåãã os.path.getmtime ã§ã¯ãªã pathlib.Path(...).stat().st_mtime ã䜿ã£ãŠããŸããã©ã¡ããåãã§ãããã«ãŒãäžã§ãã§ã« path ãªããžã§ã¯ããäœã£ãŠããã®ã§ã¡ãœããåŒã³åºãã1ã€ã§æžã¿ãŸããOSError ã continue ã§é£ã°ããŠããã®ã¯ãèµ°æ»äžã«ãã¡ã€ã«ãåé€ãããããšãžã®å¯ŸåŠã§ãã
fnmatch.fnmatch ã§ã°ãããã£ã«ã¿ããããã *.md ãæå®ããã° Markdown ã ãã*.mp3 ãªãé³å£°ã ãã察象ã«ã§ããŸãããã®é¢æ°ã¯ã·ã§ã«ã®ã°ããããåçŽã§ã** ã«ããååž°ãããã¯ãããŸãããå垰㯠os.walk åŽãæ
ã£ãŠããŸãã
åºåçµæã¯ã¬ããŒãã®ãã®åã«åºãŸãïŒ2026-07-06 ã®å®ã¬ããŒãããæç²ïŒã
| sns-bokuwalily | 120 | 2 | ð¡ èŠèŠ³å¯ |
| note | 49 | 2 | ð¡ èŠèŠ³å¯ |
| maker | 30 | 2 | ð¡ èŠèŠ³å¯ |
| affiliate | 28 | 2 | ð¡ èŠèŠ³å¯ |
sns-bokuwalily ã®120æ¬ã¯SNSæçš¿ãžã§ããé±120æ¬ä»¥äžã®ãã¡ã€ã«ãåããŠããããšãæå³ããŸãããããAPIã³ã¹ããæŒãäžããŠããã©ã€ã³ã®çé åè£ã§ãåçãåºãªãé±ãç¶ãã°ðŽã«ãªããŸãã
mktemp â Python stdout â cp ã®2ã¹ãããæžãåºã
ã¬ããŒãã®æžãåºãã¯ããæµããŸãã
TMP_REPORT="$(mktemp /tmp/revenue-gate.XXXXXX.md)"
if /usr/bin/python3 - ... > "$TMP_REPORT" <<'PY'
...
PY
then
mkdir -p "$DESKTOP_DIR" "$VAULT_DIR"
cp "$TMP_REPORT" "$DESKTOP_DIR/revenue-gate-${REPORT_STAMP}.md"
cp "$TMP_REPORT" "$VAULT_DIR/revenue-gate-${REPORT_STAMP}.md"
touch "$WEEK_MARKER"
echo "[...] revenue-gate archived" >> "$LOG"
else
status=$?
echo "[...] ERROR: report generation failed (${status})" >> "$LOG"
rm -f "$TMP_REPORT"
exit "$status"
fi
rm -f "$TMP_REPORT"
Python ãæåãããšãã ã cp ã§ãã¹ã¯ããããš Obsidian vault ã®äž¡æ¹ã«ã³ããŒããŸãã倱æãããšã㯠$TMP_REPORT ãåé€ããŠãã°ã«ãšã©ãŒãæ®ããexit "$status" ã§éãŒãçµäºããŸããmktemp ã䜿ãã®ã¯ãPython ãéäžã§å€±æããŠäžå®å
šãªãã¡ã€ã«ãæ®ãããšãé²ãããã§ããå®å
ã«çŽæ¥æžããŠããŸããšãååã ãæžãããå£ããã¬ããŒããããã¹ã¯ãããã«æ®ããŸãã
ã¹ã¯ãªããã®æçµè¡ã§ããŒã«ãŒãã¡ã€ã«ã®å€ããã®ãåé€ããŠããŸãã
find "$LOG_DIR" -maxdepth 1 -name '.revenue-gate-done-*' -mtime +35 -delete 2>/dev/null
-mtime +35 ã¯35æ¥ä»¥äžåã®ããŒã«ãŒãæ¶ããŸãã鱿¬¡ã«1åãã€æºãŸããã¡ã€ã«ã ~/.claude/logs/ ã«ç¡éã«å¢ããªãããã®æé€ã§ãã
ç§ãè©°ãŸã£ã話
set -u ãš launchd ã®ç°å¢å€æ°ãè¡çªãã
åæçã¯éè€å®è¡ãã§ãã¯ãããæžããŠããŸããã
if [ "$REVENUE_GATE_FORCE" != "1" ]; then
# ãã§ãã¯ããžãã¯
fi
ã¿ãŒããã«ããæåå®è¡ãããšæ®éã«åããŸããããã launchd çµç±ã§ææ8:20ã«çºç«ããããšãããã°ã«äœãåºãªããŸãŸåŠçãæ¢ãŸãäºè±¡ãçºçããŸããã
åå 㯠set -u ãšã®çµã¿åããã§ããlaunchd 㯠/bin/bash ãæ°ããã»ãã·ã§ã³ãšããŠèµ·åãããããREVENUE_GATE_FORCE ã¯ç°å¢å€æ°ãšããŠååšããŸãããset -u ãããç¶æ
ã§æªå®çŸ©å€æ°ãåç
§ãããšãã·ã§ã«ã¯ãã®è¡ã§å³çµäºããŸããã¹ã¯ãªããã¯24è¡ç®ã® echo "[...] ===== revenue-gate éå§ =====" >> "$LOG" ã«å°éããåã«æ»ãã§ããã®ã§ããã°ã«ã¯äœãèšé²ãããŸããã§ããã
çŽãæ¹ã¯ã·ã³ãã«ã§ãã
# 倿Žå
if [ "$REVENUE_GATE_FORCE" != "1" ]; then
# 倿ŽåŸ
if [ "${REVENUE_GATE_FORCE:-0}" != "1" ]; then
:-0 ã¯ã倿°ãæªå®çŸ©ãŸãã¯nullãªã 0 ã䜿ãããšãã Bash ã® Parameter Expansion ã§ããset -u ãå
šäœã«å¹ããããŸãŸç¹å®ã®å€æ°ã ãããã©ã«ãå€ãæããããæ£ãããã¿ãŒã³ã§ããçŸåšã®ã³ãŒãïŒ20è¡ç®ïŒã¯ ${REVENUE_GATE_FORCE:-0} ã«ãªã£ãŠããŸãã
èªååã¹ã¯ãªããã§ set -u ãå
¥ããã®ã¯æ£ãã倿ã§ããããç°å¢å€æ°ããªãã·ã§ãã«ã«åãåããã倿°ãã¯å
šãŠ :- 圢åŒã«ããªããšãããªããã¿ãŒããã«ã§åãïŒlaunchd ã§ãåããšããæã蟌ã¿ããã®ãã°ã®æ ¹æ¬ã§ãã
.DS_Store ãåºåæ°ã«ã«ãŠã³ããããŠãã
revenue-gate.conf ã§ã°ãããçç¥ããã©ã€ã³ã¯ *ïŒå
šãã¡ã€ã«ïŒãšããŠæ±ãããŸãã
sns-bokuwalily|~/dev/bokuwalily-sns/out|
ãã®ã©ã€ã³ã®åºåãã£ã¬ã¯ããªã Finder ã§éããéãmacOS ãèªåã§ .DS_Store ãçæããŸãããPython ã® fnmatch.fnmatch(".DS_Store", "*") 㯠True ãè¿ããŸããos.walk ã¯ããããã¡ã€ã«ãé€å€ããŸãããçµæãšããŠããžã§ããäœãåºåããŠããªãã®ã«ãé±åºåæ°: 1ããšè¡šç€ºãããŠããŸããŸããã
zero_weeks ã1ã®æç¹ã§åºåã1æ¬ã ãš ð¢ ã®å€å®ã«ãªããŸãããåé¡ãªããã«èŠããã®ã«å®éã¯ãžã§ããæ»ãã§ããããšãã誀æ€ç¥ã§ãã
æ«å®ã®çŽãæ¹ã¯ conf ã®3åç®ã«æç€ºçãªæ¡åŒµåãæå®ããããšã§ãã
sns-bokuwalily|~/dev/bokuwalily-sns/out|*.md
æ ¹æ¬çã«ã¯ weekly_file_count ã®äžã§ããããã¡ã€ã«ãé€å€ãããã£ã«ã¿ã远å ããã¹ãã§ããããglob ãæç€ºããªãã©ã€ã³ã¯éçšè
ã®è²¬ä»»ããšããå²ãåãã§çŸç¶ã¯èšèšããŠããŸãã
revenue.jsonl ã® source åãã¿ã€ãããŠå£²äžãè¿·åã«ãªã£ã
rev.sh ã§å£²äžãèšé²ãããšããsource ã®åå㯠revenue-gate.conf ã® name åãšå®å
šäžèŽããªããšãããŸããã
{"date":"2026-07-01","source":"affiliate","amount_jpy":8400,"note":"Amazonå ±é
¬"}
ç§ãå®éã«ãã£ããã¹ã¯ affiliate-livedoor ã®ã€ããã§ affiliate ãšæã£ãŠããŸã£ãããšã§ãã8,400åã®å£²äžã affiliate-livedoor ã©ã€ã³ã§ã¯ãªã affiliate ã©ã€ã³ã«èšäžãããŸãããæ°ã¥ããã®ã¯ã¬ããŒããèŠããšããaffiliate-livedoor ã® zero_weeks ããªã»ãããããŠããªãã®ã« affiliate ã ããªã»ãããããŠããããã§ãã
çç¶ã®ç¹åŸŽã¯ãåèšåçã¯æ£ããããã©ã€ã³ã®å€å®ããºã¬ãããšããç¹ã§ããåèšã§èŠããšå£²äžã¯å ¥ã£ãŠããã®ã«ãç¹å®ã©ã€ã³ãæ°žé ã«ð¡ããäžãã£ãŠããªãã
ä¿®æ£ã¯ revenue.jsonl ãçŽæ¥ç·šéããããšã§ããJSON Lines ãªã®ã§ééããè¡ãæ£ãã source åã§æžãçŽããŸãããã ãç¶æ
ãã¡ã€ã«ã® zero_weeks ã¯åœé±ã®ã«ãŠã³ããåèšç®ããªãã®ã§ãä¿®æ£åŸã« REVENUE_GATE_FORCE=1 ã§åŒ·å¶åå®è¡ããå¿
èŠããããŸãã
é·æçãªé²è¡çãšã㊠rev.sh ã« conf ãšã®çªãåããããªããŒã·ã§ã³ã远å ããäºå®ã§ãããæäœæ¥ãã€ã³ãã¯ããã ããªã®ã§ãæã¡ééããã jsonl ãçŽããã§ä»ã¯éçšããŠããŸãã
ASMR ã14æ¬â0æ¬ã«èœã¡ãåå ã¯ã«ãŠã³ãçªã®ãºã¬ã ã£ã
ååã§è§ŠãããASMRã©ã€ã³ã07-03ã®é±14æ¬ãã07-06ã®é±0æ¬ã«çªèœãããä»¶ã®å®éã®åå ã§ããããžã§ããå£ããããšæã£ãŠèª¿ã¹ãã®ã§ãããéããŸããã
weekly_file_count ã¯å®è¡æå»ãããéå»7æ¥éãã®ãã¡ã€ã«ãæ°ããŸãã
- 07-03ïŒæšïŒã®ã¬ããŒãïŒ06-26ã07-03 ã®ãã¡ã€ã«ã察象ãASMRãžã§ãã06-26ïŒæšïŒã«14æ¬ããŸãšããŠçæããŠãããããå š14æ¬ãã«ãŠã³ãã«å ¥ã£ãã
- 07-06ïŒæ¥ïŒã®ã¬ããŒãïŒ06-29ã07-06 ã®ãã¡ã€ã«ã察象ã06-26ã®ãã¡ã€ã«ã¯çªã®å€ã«åºãããã®åŸ1é±éãASMRãžã§ãã¯æ¬¡ã®ãããããŸã çæããŠããªãã£ããçµæãŒãã
ASMRãžã§ãã¯ãé±1åãŸãšããŠçæããšããèšèšã ã£ãã®ã§ãããlaunchd ãææèµ·åã®ã¹ã±ãžã¥ãŒã«ã ã£ãã®ã«å¯Ÿãã06-26ã¯æšæã§ãããç§ãæåã«æåã§å®è¡ããã®ãæšæã ã£ãããã7æ¥ãµã€ã¯ã«ããããŠããŸããã
ãã®æ§é çãªåé¡ã¯ã鱿¬¡ã¬ããŒãã®ã«ãŠã³ãçªãšãéç£ãžã§ãã®åºåãµã€ã¯ã«ãäžèŽããŠããªãå Žåãæ£åžžãªãžã§ããç°åžžã«èŠããããšããç¹ã§ããé±1åãŸãšããŠåºåãããžã§ãã¯ãã¬ããŒãã®ææ¥ãšåºåæ¥ãè¿ããã°æ¯é±æ€åºãããŸãããã¿ã€ãã³ã°ãæªããšéé±ã§ãŒãã«ãªããŸãã
çŸç¶ã®éçšäžã®å¯ŸåŠã¯ãâ ïžãåºããå³åº§ã«ãžã§ããå£ãããšå€æãããçŽè¿ã®åºåæ¥æãæå確èªããŠãã倿ãããã§ããå®ç§ã§ã¯ãããŸããããæåç£èŠããã¯ã¯ããã«ãŸãã§ãããã®åé¡ã«æ°ã¥ããããšèªäœãã¬ããŒãããªããã°2ã3ã¶æèŠéãããŠããã¯ãã§ããã¹ã¯ãªãããç€ºãæ°åããäºå®ãã§ã¯ãªãã調æ»ã®ããªã¬ãŒããšããŠäœ¿ãããšããè·é¢æãéèŠã§ãã
ã€ãŸãããã€ã³ã
ååã»äžæ®µã§åãäžãã4ä»¶ïŒset -uãšç°å¢å€æ°è¡çªã».DS_Storeæ··å
¥ã»sourceåã¿ã€ãã»ã«ãŠã³ãçªãºã¬ïŒã®å
ã«ããå®éçšã§èžããã€ã³ãããããŸããç®æ¡æžãã§ãŸãšããŸãã
-
ISOé±çªå·ã®å¹Žå¢çãã°ã
date +%G%Vã®ãã¡%Gã¯ISO幎ïŒã«ã¬ã³ããŒå¹Žã§ã¯ãªãïŒãè¿ããŸãã2026幎12æ28æ¥ïŒæïŒãäŸã«ãšããš202701ã«ãªããŸããããŒã«ãŒãã¡ã€ã«åãzero_weeksã®ããŒã%G%Vã§çµ±äžãããŠããã®ã§èšç®èªäœã¯çããŸããããã2026å¹Žã®æçµé±ãåŠçããã¯ããªã®ã«ãã¡ã€ã«åã2027幎ã«ãªã£ãŠããããšããæ··ä¹±ãçã¿ãŸããèªåã§ãã©ãŒã¯ããŠ%Y%Vã«å€ãããšå®å šã«å£ããŸããISO weekã®å¹Žã¯ã«ã¬ã³ããŒå¹Žãšãºã¬ãããšãåæã§ããããã®ã¹ã¯ãªããã%G%Vãéžãã§ããã®ã¯çç±ããããŸãã -
conf ã«ååšããªãsourceã§ rev.sh ãå©ããšå£²äžãéã«æ¶ããã
weekly_revenueãštotal_revenueã¯ãªãŒãã³ããã·ã¥ãªã®ã§ä»»æã® source åãåãä»ããŸãããããã¬ããŒãã¯entriesïŒconf ã® name åïŒã ããã€ãã¬ãŒãããŸããããšãã°affilIateïŒå€§æåIïŒãšæãŠã°affiliateã©ã€ã³ãšã¯å¥ãšã³ããªãçãŸããåçãã©ãã«ã衚瀺ãããŸãããçç¶ã¯ãrev.sh ã§èšé²ããã®ã« zero_weeks ããªã»ãããããªããã§ããP2ã§è§Šãã source åã¿ã€ãïŒåã©ã€ã³å ã®èª€èšé²ïŒãšäŒŒãŠããŸããããã¡ãã¯ãconf èªäœã«å®çŸ©ã®ãªãååãžã®èšé²ããšããäºçš®ã§ãjq -r '.source' ~/.claude/data/revenue.jsonl | sort -uã§ source äžèЧãåºããconf ãšçªãåãããã®ãå¯äžã®æ€åºææ®µã§ãã -
ç Žæã·ã³ããªãã¯ãªã³ã¯ãå³â ïžã«ãªãã
weekly_file_countã®å é ã¯if not root.is_dir(): return Noneã§ããç Žæããã·ã³ããªãã¯ãªã³ã¯ïŒãªã³ã¯å ã®ãã£ã¬ã¯ããªãæ¶ããã»å€ä»ãSSDãæªæ¥ç¶ãªã©ïŒã¯is_dir()ãFalseãè¿ããNoneââ ïž åºå忢?ã«ãªããŸãããžã§ããæ£åžžçšŒåããŠããã®ã«ã¬ããŒããèŠåãåºãç¶ããç¶æ³ã¯ããããŠãããã4ä»¶ç®ã®ã±ãŒã¹ã§ããåºåãã£ã¬ã¯ããªã倿Žãããå€ä»ããã©ã€ãã«ç§»ãããããåŸã¯ conf ãæŽæ°ããå¿ èŠããããŸãã -
os.walkãã·ã³ããªãã¯ãªã³ã¯ãã£ã¬ã¯ããªã远跡ããªããos.walk(root)ã®ããã©ã«ãã¯followlinks=Falseã§ããéç£ãžã§ãã®åºåå ã~/Desktop/Article/articlesãšããã·ã³ããªãã¯ãªã³ã¯ã§æããå®äœãå¥ãã¹ã«ããæ§æã ãšã«ãŠã³ããåžžã« 0 ã«ãªããŸãããFinder ã§ã¯èŠããŠããã®ã«é±åºåæ°ã 0ããšããçç¶ãåºãããããçããŸããconf ã®åºåãã£ã¬ã¯ããªåã«ã¯å®äœãã¹ãæžãã®ãå®å šã§ãã -
mktempã®ã¬ãŒãããªããçŸè¡ã³ãŒãã¯TMP_REPORT="$(mktemp /tmp/revenue-gate.XXXXXX.md)"ã®åŸã«|| exit 1ããããŸããã/tmpãæ¯æžãããšmktempã倱æããŠç©ºæåãè¿ãã> "$TMP_REPORT"ãã«ã¬ã³ããã£ã¬ã¯ããªã«ç©ºãã¡ã€ã«ãçæããããPythonã®åºåãæšãŠãããŸããéåžžã®Macã§ã¯çºçããŸãããã/tmp ãå ±æããCIç°å¢ãæ®éãéŒè¿«ãããã·ã³ã§ã¯èµ·ããŸãããã©ãŒã¯ããŠäœ¿ãå Žåã¯|| { echo "ERROR: mktemp failed" >> "$LOG"; exit 1; }ã远å ããŠãã ããã -
åçéèšçªãšãã¡ã€ã«ã«ãŠã³ãçªã®åºæºç¹ããºã¬ããåçéèšã¯
week_start = report_date - timedelta(days=7)ïŒæ¥ä»ããŒã¹ã0:00:00èµ·ç¹ïŒããã¡ã€ã«ã«ãŠã³ãã¯datetime.now().timestamp() - (7 * 24 * 60 * 60)ïŒå®è¡æå»ããŒã¹ã8:20:00èµ·ç¹ïŒã§ããã¡ããã©7æ¥åã®ãã¡ã€ã«ãã©ã¡ãã®çªã«å ¥ããã§å€å®ãå€ããããšããããŸãããä»é±ã®åçã¯ããã®ã«åºåãŒãããåºåã¯ããã®ã«åçãŒãããšãã1æ¥åã®ãºã¬ãå¢çä»è¿ã§çããŸããå®éçšäžã¯èª€å·®ã®ç¯å²ã§ãããæ¥æ¬¡ãããã§1ãã¡ã€ã«ãã€çæããã©ã€ã³ã§ã¯ç²ŸåºŠã«åœ±é¿ããŸãã -
launchd ã®ãã°ã«ã¯ Python ã® stdout ãå ¥ããªããplist ã®
StandardOutPathãšStandardErrorPathã¯åãrevenue-gate-launchd.logãæããŠããŸãããããåã蟌ã¿Pythonã®print()åºåã¯ã·ã§ã«ã®> "$TMP_REPORT"ã«ãªãã€ã¬ã¯ãããããã launchd.log ã«ã¯æ®ããŸãããPython åŽã«ãããã°åºåãå ¥ã㊠launchd.log ã远ããããŠãäœãåºãŠããªãçç±ã¯ããã«ãããŸããPython ã®ãããã°åºåã¯import sys; sys.stderr.write("debug\n")ãšã㊠stderr ã«æµããš launchd.log ã«å ¥ããŸãã -
æ°ã©ã€ã³ã远å ããé±ã¯éå»ã®ãŒãå±¥æŽãåŒãç¶ãããªããconf ã«æ°ããã©ã€ã³ã远å ããé±ã
zero_weeks.get(name, 0)ã§ 0 ããã«ãŠã³ããå§ãŸããŸããããã¯ã³ãŒãäžæ£ããåäœã§ããããconf 远å åããæ°é±é皌ãã§ããªãã©ã€ã³ã0é±ã¹ã¿ãŒãã§è¿œå ããããšããæèãæ¶ããŸããå°æ¥ðŽã«ãªã£ããšãããã€ããäžæ¡ç®ã ã£ãããã远ããŸãããæ°ã©ã€ã³ã远å ãããšãã¯revenue.jsonlã«amount_jpy: 0ã»note: "ã©ã€ã³éå§"ã§éå§èšé²ãæ®ãç¿æ £ããåŸããçµç·¯ãèªãããã§åœ¹ç«ã¡ãŸãã -
ã¢ãŒã«ã€ããã¡ã€ã«ã¯èªååé€ãããªããããŒã«ãŒãã¡ã€ã«ïŒ
.revenue-gate-done-*ïŒã¯-mtime +35 -deleteã§35æ¥åŸã«æé€ãããŸããã~/Desktop/Revenue Gate/ã®ã¬ããŒãæ¬äœãš Obsidian vault ã®briefs/revenue-gate/ã«ã³ããŒããããã¡ã€ã«ã¯æ¶ããŸããã鱿¬¡ã§1ãã¡ã€ã«å¢ãç¶ãã1幎ã§50ãã¡ã€ã«è¶ ã«ãªããŸããObsidian ã®å šææ€çŽ¢ã«ã¬ããŒããããããå§ãããsettings.jsonã®userIgnoreFiltersã«briefs/revenue-gateã远å ããããææ¬¡ cron ã§6ã¶æä»¥äžåã®ã¬ããŒããarchive/ã«ç§»ãåŠçãè¶³ãã®ãçŸå®çã§ãã
ãã¹ããã©ã¯ãã£ã¹
3é±ééçšããŠæŽçããã«ãŒã«ã14æ¡ã«ãŸãšããŸãã
1. set -u ãå
¥ãããªãå
šãªãã·ã§ã³ç°å¢å€æ°ã« :- ããã©ã«ãå€ãä»ããã${REVENUE_GATE_FORCE:-0} ã®ãã¿ãŒã³ãlaunchd ã¯æ°ããã»ãã·ã§ã³ã§èµ·åããããã¿ãŒããã«ãšã¯ç°å¢å€æ°ãç°ãªããŸããæåå®è¡ã§éãã¹ã¯ãªããã launchd ã§ç¡é³æ»ããæå€åå ã§ãã
2. launchd ã®ç»é²ã¯äºéçºç«ã¹ãããã«ããã8:20 ã«å ã㊠13:20 ãç»é²ããé±å
éè€å®è¡ã¯ããŒã«ãŒãã¡ã€ã«ïŒ%G%V ããŒã¹ïŒã§é²ããŸããMac ã鱿«ã«éãããªãå¿
é ã§ããplist ã® StartCalendarInterval ãé
åãåãä»ããããšã¯å
¬åŒããã¥ã¡ã³ãã§ã¯ç®ç«ããªãã®ã§ãã®ã¹ããããã¯ãã®ãŸãŸäœ¿ããŸãã
3. å®å
ãžã®çŽæ¥æžãåºãã¯çŠæ¢ãmktemp â Python stdout â cp ã®é ã«ãããPython ãéäžã§ã¯ã©ãã·ã¥ãããšããå®å
ãã¡ã€ã«ãåå£ããç¶æ
ã§æ®ãã®ãé²ããŸããif python3 ... > $TMP; then cp $TMP $DEST; fi ãšããæ§é ãååæ§ã®ä¿èšŒã«ãªããŸãã
4. Python ãã¢ããã¥ã¡ã³ã㯠<<'PY'ïŒã·ã³ã°ã«ã¯ã©ãŒãïŒã§æžãã<<PY ã ãšPythonã³ãŒãäžã® $HOME ã ${var} ãã·ã§ã«ã«å±éãããŸããçŸæç¹ã§ã³ãŒãå
ã«å€æ°ããªããŠããå°æ¥è¿œå ãããšãã«ã·ã¬ããšå£ããŸããã·ã³ã°ã«ã¯ã©ãŒãã¯ã³ã¹ããŒãã®ä¿éºã§ãã
5. Python ã¯ãã«ãã¹ /usr/bin/python3 ã§åŒã¶ãlaunchd ã® PATH 㯠/usr/bin:/bin:/usr/sbin:/sbin çšåºŠããéã£ãŠããŸãããpython3 ã ãæžããšHomebrewç°å¢ã§ã¯èŠã€ãããªãããšããããŸããã¹ã¯ãªããåé ã§ export PATH="/opt/homebrew/bin:..." ã远å ããŠããããå®éã¯åé¡ãããŸããããPython ã®åŒã³åºãã«ã¯ãã«ãã¹ãç¶æããŠãããš launchd ãããã°ã楜ã«ãªããŸãã
6. conf ã® glob åã¯çç¥ããå¿
ãæç€ºããã*.md, *.mp3 ãªã©ãçç¥ãããš * ãšããŠæ±ããã.DS_Storeã».gitkeepã»__pycache__ ãæ··å
¥ããŸããåºåæ°1ã«ãªã£ãŠããã®ã«ãžã§ããæ¢ãŸã£ãŠããããšãã誀æ€ç¥ã®æ ¹æ¬åå ãããã«ãããŸãã
7. åçèšé²ã³ãã³ãã¯5ç§ã§å®çµããããrev.sh note 3200 ææèšäº1æ¬ ãšãã圢åŒãç¶æã§ããŠããã®ã¯ãèšé²ã3åèªã§çµããããã§ããèšé²ãæéã ãšç¶ããªããªããzero_weeks ãæå³ããªããªããªããŸããASPèªå飿ºã§ãããã®ã¯å°æ¥çã«cronã§èªååããŸãããæåèšé²ã®æµæãæå°åããããšãä»ã®çŸå®è§£ã§ãã
8. JSON Lines 㯠jq ã§åžžæãã«ã¹ãã§ãã¯ã§ããç¶æ
ãç¶æãããjq -c . ~/.claude/data/revenue.jsonl > /dev/null ã§ããŒã¹ãšã©ãŒã峿€åºã§ããŸããæåç·šéã§ä¿®æ£ããããšã¯å¿
ããã®ã³ãã³ããéããŠãã REVENUE_GATE_FORCE=1 ã§åŒ·å¶åå®è¡ããŸãã
9. ã¹ã¯ãªããæ¬äœã¯èªå忢ããªãèšèšãç¶æãããðŽ KILLæšå¥š ã¯ã¬ããŒãå
ã®æèšã§ããããžã§ããæ¢ããã¢ã¯ã·ã§ã³ã¯ã³ãŒãã«æãããŠããŸãããæ©æ¢°ãèªå忢ãããšããªãæ¢ãŸã£ãããã®æèã倱ããã誀æ€ç¥ã§çšŒãé ãæ®ºããªã¹ã¯ããããŸããã©ã€ã³åæ¢ã¯äººéãæåã§è¡ãããã®èšèšææ³ã¯å€ããªãã»ããããã§ãã
10. â ïž ãããžã§ããå£ãã確å®ããšèªãŸãªããã«ãŠã³ãçªã®ãºã¬ã»ã·ã³ããªãã¯ãªã³ã¯åé¡ã»ææ¬¡ãŸãšãåºåã®ã¿ã€ãã³ã°ãªã©ãæ£åžžãªãžã§ãã â ïž ã«ãªããã¿ãŒã³ãè€æ°ãããŸããæåã«ç¢ºèªããã®ã¯ ls -lt <åºåãã£ã¬ã¯ããª> | head -5 ã§ãã¡ã€ã«ã®æçµæŽæ°æ¥æã確èªããããšã§ãããã¡ã€ã«ãååšããŠmtimeãæè¿ãªãçªãºã¬ãååšããªããã°ãžã§ãé害ã§ãã
11. state.json ã®ãŒãé±ã«ãŠã³ãã¯å®æçã«æå確èªãããã¬ããŒãã«ã¯ð¡ èŠèгå¯ãšã ã衚瀺ãããŸããããã®è£ã«ããæ°å㯠state.json ã«ãããŸããjq .zero_weeks ~/.claude/data/revenue-gate-state.json ã§åã©ã€ã³2é±ã3é±ããèŠããŸãã3é±ãªããããã倿ãå§ããã¿ã€ãã³ã°ã§ãã
12. 匷å¶åå®è¡ã® alias ãçšæããã.zshrc ã« alias rg-force='REVENUE_GATE_FORCE=1 bash ~/.claude/scripts/revenue-gate.sh' ã远å ããŠãããšãã¿ã€ãä¿®æ£åŸã®åéèšã1ã³ãã³ãã§æžã¿ãŸããREVENUE_GATE_FORCE ãææã¡ãããã³ã«ã¹ãã«ãã¹ããã®ã§ alias ã¯å¿
é ã§ãã
13. conf ãç·šéãããå¿
ãæåã§1åå®è¡ããŠåºåã確èªãããæ°ã©ã€ã³ã远å ããçŽåŸã globãå€ããåŸã¯ãrg-force ã§å³ã¬ããŒããçæããé±åºåæ°ãšå€å®ãæåŸ
éããã確èªããŸããæ¬¡ã®ææãŸã§åŸ
ã£ãŠãããå®ã¯èšå®ãééã£ãŠãããã«æ°ã¥ããš1é±éåã®ããŒã¿ãé£ã³ãŸãã
14. 4é¢éãªãã€ã³ãã¯æ¯é±è¯»ããã¬ããŒãæ«å°Ÿã®ãäœã®ããïŒèª°ãå¬ããïŒãããå²ããïŒãã€èŠåããã¯èªåã§æžããæèšãªã®ã§èªã¿é£ã°ããã¡ã§ãããããð¡ã3é±ç®ã«å ¥ã£ãã©ã€ã³ã«å¯ŸããŠãã®4åã«çããããªãå Žåã¯ãããããæ¢ãã©ããã®ã·ã°ãã«ã§ããKILLã®å€æã¯ããããå§ãŸããŸãã
ãŸãšã
revenue-gate.sh ã®æ§é ãã³ãŒãã¬ãã«ã§è¿œã£ãŠããŸãããå
šäœã§èŠããŠããããšã¯1ã€ã§ããéç£ã©ã€ã³ãå¢ããã»ã©ãèŠãæéãæžãã æ¯é±ææã«èªåã§æ°åãå±ããªããã°ã14ã©ã€ã³ã®ã³ã¹ãå¯Ÿå¹æãåæã«ææ¡ããããšã¯ç©ççã«äžå¯èœã§ãã
æå120äžã®å èš³ããã©ã®ã©ã€ã³ã皌ãã§ãããããšãã©ã®ã©ã€ã³ãAPIã³ã¹ããé£ã朰ããŠããããã®äž¡æ¹ãæ¯é±ææ¡ããŠããããšã§æãç«ã£ãŠããããã«ãèªååã®èŠæš¡ãåºããã»ã©ãèªåã§æ¢ãŸããä»çµã¿ããåçãå®ããŸããASMR ã©ã€ã³ã07-03ãã07-06ã®3æ¥éã§é±14æ¬ãã0æ¬ã«èœã¡ãããšããã¬ããŒãããªããã°æ°é±éèŠéãããŠããã¯ãã§ãã
å®è£
ã³ã¹ã㯠revenue-gate.shïŒ204è¡ïŒãš plistïŒ37è¡ïŒã®2ãã¡ã€ã«ãèšçœ®15åã§ããããã§é±æ¬¡ã®åç倿ã«å¿
èŠãªæ
å ±ãæ¯ææã«èªåã§å±ããªããROIã¯åæ¥ã«ååã§ããŸãã
åçãŒãã®ã©ã€ã³ã4é±éåãç¶ããã³ã¹ãããæã«äžåºŠã§ãæ¢ããŠããã°æµ®ããAPIã³ã¹ããè¶ ããåã«ãä»é±ã®ææã¬ããŒããèŠãŠã倿ããŠãã ããã
ä»çµã¿ã®å šäœåã»æ120äžã®å èš³ã»30æ¥æé ã¯æænoteã«ãŸãšããŠããŸãã ð Claude CodeèªåŸç°å¢ã§ãå®éã©ã皌ãã â ä»çµã¿ã»å®äŸã»å§ãæ¹ã»ãµããŒã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ