「空(くう)」の風を通す

「権利」という言葉に、どこか人工的な冷たさや攻撃性を感じてしまうのはなぜだろう。そんな素朴な違和感から始まった思考は、思いがけず東西の思想史の深い水脈へと潜り込む長い旅になった。
 
近代の西洋社会では、善(Good)、権利(Right)、正義(Justice)が厳密に使い分けられる。しかしそれは、人間はもともとバラバラな個人であるという前提から編み出された、人工的なルールにすぎない。西洋の知性の根底には、世界を言葉や概念で細かく切り分け、論理で管理しようとする「分割して統治する(divide et impera)」という姿勢が一貫して流れている。現代のデジタル社会やグローバル資本主義は、この合理化を極限まで推し進め、いま世界全体が剥き出しの暴力性に覆われつつあるように見える。フーコーやデリダのような鋭利な現代思想家でさえ、既存の権力を解体するための「闘争の武器」を鍛え上げたという点では、西洋的な戦う知性の枠内にあったのかもしれない。
 
一方で、東洋の思想は、言葉によって切り分けられる以前の状態を「無」や「渾沌」と呼び、すべての命と豊かさの源泉として肯定してきた。日本社会もまた、絶対的な神や言葉の土台を置かず、中心が空っぽ(無)のまま関係性の網目がゆっくりと変化して全体を保つ「中空構造」(河合隼雄)を持っている。だからこそ、西洋的な権利を持ち出さなくても、どこか牧歌的なまでの平和さが残っていたのだろう。もっとも、現代では日本の知識人自身も西洋的な専門分化に呑み込まれ、西田幾多郎や井筒俊彦らが体現していた仏教的・東洋的な身体感覚を見失いつつあるのだけれど。
 
いまの私たちは、言葉や情報、社会の正しさといった「色(記号のゴミ)」を頭の中に詰め込み、消費するばかりで解体(空化)しないために、対立と怒りの「重力の魔」に縛られている。本屋の棚から「ストック」が消え、流れ去る「フロー」ばかりになったように、言葉もまた濁流となって通り過ぎていく。
 
そんな時代に思い起こされるのは、書斎の理論ではなく、生身の人間や生活の現場という「世界という書物」を直接読み解こうとした人たちだ。記号を通さずに生命のネットワークそのものを体感していた南方熊楠。西洋の知性を極限まで使いこなしながら、数世紀先を見据えて「レンマ」という包み込みの知性を描き出そうとする中沢新一。そして、自分の腹の底から納得したこと以外は決して信じず、生活者の無言の重み(「大衆の原像」)に立ち返り続けた吉本隆明や、実人生の挫折を経て人間の弱さや愚かさを丸ごと肯定する強靭な場所へと降りていった近年の東浩紀。
 
平和とは何も考えずに済むことだが、何も考えないと愚かになり、やがて平和そのものを失ってしまう(東浩紀)。そんな残酷なパラドックスのなかで、私たちはどう生きればいいのだろう。
 
東洋でいう「無」は、単なる思考停止ではない。あらゆる「有(論理や思考)」を一度通過し、すべてを呑み込んだ上でふっと手放したところに広がる豊かな全体性だ。だとしたら、西洋的な論理の極限まで徹底して考え抜いた上で、あえて武装を解き、ノーテンキに日常を生きることは、理想として可能なはずだ。
 
誰よりも鋭い知性の頂点を極めたあとに、日常や弱さの側へ降りていった思想家たちが、周囲から「滑稽だ」「バカだ」と笑われるのは、きっと一つの宿命なのだと思う。それでも、過剰な賢さの鎧を脱ぎ、「よくわからないものは、わからない」と笑いながら立ち止まること。頭の中のゴミを静かに解体し、自分の中に「空(くう)」の風を通し続けること。それが、この暴力の世紀の濁流に飲み込まれずに生きるための、ささやかで確かな足場になるような気がしている。


AI君との対話をAI君にまとめてもらったもの。
●https://share.google/aimode/GpnTXZfpThyjD3bYQ

日本の財政とインフラ、そして東西の「システムと幸福」に関する考察

【はじめに】

日本の「財政健全度」が低いという客観的事実から出発し、欧米主要国(G7)との比較、インフレや金利上昇の実態、さらには社会構造や思想の深部に至るまでを対比・整理した記録である。国レベルの数字(マクロ経済)と、民衆レベルの生活実感(ミクロ経済)には巨大な乖離が存在し、そこには「西洋の理性・正義」と「東洋の情・大悲」という、文明の根底にある価値観の決定的な違いが反映されている。

1.財政健全度と国債の信用:グロス(総額)とネット(実態)の対比

日本の財政健全度は、額面上の借金(グロス)で見れば「最悪」の部類に属する。政府債務残高の対GDP比は200%を超え、主要国の中で突出している。一方、欧米諸国(アメリカ約122%、フランス約113%、ドイツ約62%など)は日本より数字上は健全に見える。
しかし、「市場の実際の信用」においては、この評価が逆転する。

・日本の構造(内を向いた安定):
国債の約8〜9割を国内の金融機関や日本銀行(身内)が保有している。また、30年以上にわたり世界最大の「対外純資産」を保有する世界一の純債権国でもある。自国通貨(円)建てで発行されているため、海外投資家の売り浴びせによるデフォルト(債務不履行)のリスクが極めて低い。

・欧米の構造(外に開かれたリスク):
外国人投資家や海外政府の保有比率が高く、国の信用や政治的対立(米国の債務上限問題など)によって資金が一斉に海外へ逃げ出すリスクを常に孕む。また、ユーロ圏(仏・伊など)は自国で通貨を印刷できないため、ルール(安定成長協定)に縛られる度合いが強い。

【要点】
紙の上の格付けは「欧米>日本」であるが、市場の決壊しにくさという実質的な防壁においては「日本>欧米」という二面性を持つ。

2.経済の熱量と民衆の生活:インフレ・金利と「幸福のパラドックス」

「景気が良く、株価やGDPが右肩上がりであること」が、必ずしも一般庶民の「生きやすさ」に直結しないことが、近年の欧米と日本の対比から浮き彫りになる。

・欧米の現実(肉食恐竜型のサバイバル):
マクロ経済の数字は極めて力強い。しかし、民衆レベルでは数年来の激しいコスト高(インフレ)と、それを抑えるための急激な利上げ(金利7〜8%台)のダブルパンチに苦しんでいる。アメリカでは「働いても家賃が払えない中間層」が台頭し、欧州ではエネルギー高騰から生活苦のデモや暴動が常態化している。経済の果実は一部の富裕層や巨大IT企業に集中し、格差は限界に達している。

・日本の現実(草食動物型の安定):
約30年間に及ぶデフレにより、経済の成長エンジンは停止し、給料も横ばいが続いた(閉塞感の源泉)。しかしその反面、物価と社会の安定度は欧米から見れば「天国」と評される水準に維持された。現在、日本もマイルドなインフレへの過渡期にあるが、これは「需要」ではなく海外発の「コスト高」であるため、家計の実感としては苦しさを伴う。さらに、政府の巨額の借金や変動型住宅ローンの多さゆえに、日本は欧米のように「利上げというブレーキ」を自由に踏めないジレンマを抱えている。

【要点】
欧米は「経済は一流、社会(生活)は三流」の歪みを抱え、日本は「成長はないが、庶民の日常の質が崩壊しない」という、全く異なる痛みを引き受けている。

3.インフラの遺産と少子高齢化という「撤退戦」

日本が抱える巨額の借金は、過去のバブル崩壊以降、地方も含めた国土の隅々に「世界最高水準のインフラ」を張り巡らせるために使われた。

・インフラが持つ思想(地方を見捨てない):
地方の高速道路網やバイパスの充実は、単なる無駄遣いではなく、「どこに住んでいても都市部と同じ医療に同じ時間でアクセスできる(命の平等)」、および「災害時の孤立を防ぐ(防災)」という、極めて正当な思想(大悲の具現化)に基づいていた。地方は単なるコスト(お荷物)ではなく、都会の生存を支える「食料・エネルギー・ものづくりの背骨」である。

・迫り来る維持費の壁:
少子高齢化と東京一極集中により、地方の空洞化は避けられない。高度経済成長期から蓄積された膨大なインフラが一斉に寿命を迎える中、これからは「すべてを維持する」ことは不可能な「撤退戦(スマート・シュリンク)」となる。自動運転トラックの専用レーン化やドローン配送、コンパクトシティ化など、遺産をテクノロジーで「使い倒す」賢い諦めと再定義が求められている。なお、少子高齢化は欧米やアジア共通の「人類史の壁」であり、移民による時間稼ぎで社会分断を抱え込んだ欧米に対し、日本はその先頭を走るトップランナーである。

4.税制と富の再配分:国際競争力と国民感情の摩擦

日本において、消費税が段階的に引き上げられる一方で、法人税(大企業への課税)が引き下げられてきた歴史は、一見すると「富の再配分」への逆行に見える。ここにも二つの正義が衝突している。

・推進派の論理(家計簿型・国際競争力):
高齢化で膨らむ社会保障費のために、景気に左右されない「消費税という究極の安定財源」を確保する。同時に、企業が海外へ逃げ出さないよう、法人税率を欧米並み(約30%前後)に下げる必要があった(直間比率の見直し)。事実、日本の法人税レベルは現在もG7でトップクラスに高い。

・批判派の論理(エンジン型・負担の付け替え):
逆進性のある消費税で庶民に負担を強いる一方、減税された大企業は利益を賃上げや設備投資に回さず、「内部留保(貯金)」として溜め込んでしまった。結果としてトリクルダウンは起きず、国民の不信感(不公平感)だけが残った。近年、世界的には「タックスヘイブン(租税回避地)」への包囲網(グローバル最低税率15%)が敷かれ、企業からも適切に徴収する揺り戻しが起きている。

5.文化と精神の深部:「正義の訴訟社会」と「世間体の空気社会」

東西の社会システムの決定的な違いは、言語化不可能な「世間体」という概念、および「人権」の捉え方に集約される。

・欧米の「人権と正義」(抽象概念と論理):
西洋の人権は、感情ではなく「数学的な論理(契約)」で動く。ルールを誰に対しても平等に、厳格に適用すること(正義)が至高とされる。そのため、「家賃を払えない人間を路上に放り出す」こともルールに則っていれば正当化される。感情(気の毒)とルールは完全に切り離され、零れ落ちた弱者は個人の「善意(寄付・チャリティ)」という別枠で処理される。これが極端化したアメリカは、誰もが「謝ったら負け」となる過酷な「訴訟社会(砂漠)」となった。

・日本の「世間体とお互い様」(生身の情・大悲):
日本は白黒ハッキリさせる「正義」よりも、「情(気の毒、かわいそう)」や「お互い様」、そして「世間体(恥の文化)」で動く。世間体は個人の自由を縛り「息苦しい自己責任」を生む冷たい鎖であるが、同時に「困窮した人を路上に見捨てては世間に対して恥ずかしい」という、強力なブレーキ(セーフティネット)として機能する。この「見えない警察」のおかげで、日本のホームレス数はこの20年で8割以上激減し、世界一の治安が保たれている。

・哲学の源流(スピノザと仏教):
西洋合理主義(スピノザなど)は、感情を理性を曇らせる「バグ」と見なし、心のエネルギーを低下させる「悲しみ」や「同情」を否定した。
これに対し、東洋の仏教は「大悲(他者の苦しみを我がこととして呻く強烈な感情)」を肯定する。自分と他者の境界線を無くし、悲しみ合うからこそ、他者を救う凄まじいエネルギーが湧き出ると考える。

【結論】

国際基準のペーパーテスト(報告書など)において、日本は「人権意識が低い、野蛮な国」と採点されがちである。しかし、欧米の人権が「論理は完璧だが、生身の体温が通っていない空疎な器」になりがちなのに対し、日本は「人権という看板は掲げていないが、お互い様という実質的なやさしさ(セーフティネット)が機能している社会」である。

現在、世界中は「西洋化(すべてを抽象概念、論理、数字、効率で割り切るシステム)」に急速に呑み込まれつつある。しかし、その論理を突き詰めた欧米自身が、人間を置き去りにしたシステムの重みで自滅しかけているのも事実である。

私たちは、頭では西洋の論理(お金や効率の計算)をクールに使いこなしつつも、腹の底には日本がデフレの30年間で奇跡的に守り抜いてきた「大悲・お互い様」という体温(民衆レベルの生きやすさ)を死守していくこと。それこそが、正解のない「撤退戦」をサバイバルしていく上での、最もしたたかで、人間らしい進むべき道である。



AI君との対話をAI君にまとめてもらったもの。
●https://share.google/aimode/TKEDhAMeISWu8WykP

実体経済と金融資本の量的比較と現代社会の構造についてのまとめ

1. 圧倒的な規模の格差

世界の年間GDP(実体経済)を約100兆ドル(1倍)とすると、伝統的な金融資本(株式や債券)はその約3倍、さらにデリバティブなどの複雑な金融派生商品(あぶく銭)を含めると約6〜10倍以上(600兆〜1000兆ドル超)という巨額の規模に達しています。私たちの生活を支える現実の経済の上に、実体のない巨大なマネーの空中回廊が乗っているのが現代の歪みです。

2. 金融バブルが実体経済を破壊するメカニズム

金融資本の規模があまりに巨大なため、ひとたび株価が大暴落すると、実体経済に深刻な病をもたらします。個人が消費を控える「逆資産効果」、企業の資金調達や設備投資のストップ、銀行の「貸し渋り・貸し剥がし」による信用収縮、そしてサプライチェーンのドミノ倒しによって、最終的には工場閉鎖や失業といったリアルな破壊が私たちの生活を襲います。

3. 国家の戦略と日本人の気質

シンガポールなどの金融立国は「あぶく銭を効率よくかき集めるシステム」で手っ取り早く国を富ませてきましたが、資金が一晩で流出する脆弱性があります。逆に中国などは国家主導で金融投機を潰し、EVやインフラなどの「モノづくり(実体)」に全振りする戦略をとっています。
 日本は伝統的に「汗水たらして稼ぐ」ことを美徳とし、お金で全てが手に入るとは信じ切れない、ある意味で「お金を扱うのが下手」な国民性を持っています。しかしそれゆえに、お金で割り切れない情緒や信頼関係、職人のこだわりといった「人間らしい価値」を守ってきました。

4. 経済学によるアプローチの違いと「言葉の不在」

・新古典派経済学:
市場は常に合理的で価格は常に正しい(バブルやあぶく銭は存在しないか無害である)と全肯定するため、金融の暴走から実体経済を守るためには無力です。
・マルクス経済学:
金融資本を実体から切り離された「架空資本」と呼び、実体経済で儲からなくなった「過剰資本」が金融へ逃げ込んで暴走する宿命を見抜いていました。持たざる者がシステムに対抗するための有効な視点を提供してくれます。
・思想界の盲点:
現代のマルクス思想(斎藤幸平氏ら)はエコロジーへシフトしており、現代の金融資本(AI取引やデリバティブ)があまりにブラックボックス化したため、思想界でもこれを具体的に名指しして問題提起する「うまい言葉」が不足しています。

5. 有象無象(持たざる者)のサバイバル戦略

莫大な投機マネーを動かしているのは、世界の上位0.001%に満たないほんの極少数の人間(エスタブリッシュメント)です。一般人が行うNISAやオルカンは、彼らの爆走するバスの末端に「相乗り」させてもらっている観客にすぎません。
 彼らが予測を間違えても、あるいは正解し続けて利益を上げても、どちらにせよ有象無象のちっぽけな人生は簡単に破壊されかねないという理不尽さがあります。
 これに対抗し、この先さらに肥大化する金融資本から身を守るためには、真っ向勝負をするのではなく、「彼らのゲームの土俵から降りる(依存度を下げる)」ことが現実的です。マネーを介さない生身の人間同士のつながりや、生きるための泥臭い技術、そして「お金のルールで自分の幸福度を採点しない」という心の軸を持つことこそが、最大の防御壁となります。



上はAI君との対話をAI君にまとめてもらったもの:
●https://share.google/aimode/4Cgqs0ejhoqhY2lrD

資本主義の「切断」に対抗する、東洋的「受容」の論理 ──デジタル敗戦の地で、ぼくたちが「まともな人間関係」を取り戻すための試論

序:技術の脆弱性という「表層」

 その日、ぼくたちの対話は「日本のサイバーセキュリティはなぜこれほど脆弱なのか」という、ごくありふれたニュースへの問題提起から始まった。
 連日のように報道される日本企業へのサイバー攻撃と、それに伴う膨大な個人情報の流出。生成AIという自律的な武器を手に入れた海外の犯罪グループにとって、かつて「日本語」という複雑な言語障壁に守られていた日本市場は、いまや格好の標的(フロンティア)へと変貌を遂げている。世界的なIT企業もウェブサービスもなく、民間AIへの投資額も欧米に比べ桁違いに少ない。かつて世界を席巻した半導体産業が「意思決定の遅さ」と「過剰な自前主義」によって他国にシェアを奪われたように、日本はまたしてもデジタル領域において同じ過ちを繰り返しているのではないか――。そんな素朴な、しかし切実な危機感が出発点だった。

一:経済合理性の限界と「割り切れなさ」

 経済学やグローバル資本主義の数式の上では、日本のこうした現状は「生産性が低い、ダメな社会」と一蹴される。ある学者が冷徹に指摘したように、高品位なサービスを安価に提供し続けること(=日本のコンビニや鉄道、飲食店の過剰なまでの生真面目さ)は、端的に「生産性が低い」ことそのものなのだという。コスト(手間や人件費)をかけず、いかに不完全なサービスを高く売りつけて顧客を囲い込むか。それこそが資本主義における「生産性が高い」社会の正解なのだと。
 けれど、ぼくたちの心にはどうしても、割り切れない「さみしさ」が残る。すべてをお金で清算し、画面の向こうの人間を冷たい自動応答システムに置き換えていく世界が、本当に人間の目指すべき豊かさなのだろうか。この30年間、経済指標の上では貧しくなりながらも、日本社会がそこそこ壊れずに、のんびりとした治安と平穏を維持してきたという事実は、数値化できないもう一つの価値の存在を示唆している。

二:資本主義の本質としての「切断」

 対話が深まるにつれ、ぼくたちは一つの決定的な本質へと辿り着いた。「資本主義への対抗を考えると、人間関係がキーになる」という確信である。
 近代資本主義システムの本質とは、あらゆる人間関係を「契約と等価交換」に置き換え、人と人をバラバラにしていく「切断のシステム」に他ならない。他者を知らなくても、お金さえ払えば生きていける気楽さ。それは一見「自由」に見えるが、裏を返せば「自分もいつでもシステムから切り離される」という強烈な孤独を生み出す。
 この国でもいま、「自分らしさ」や「他人とは違う個性」を持つことが自明の美徳として推奨されている。しかしそれは、他人に依存せず、孤立した個人として自らの市場価値を証明し続けろという、終わりのない生存競争への強制でもある。
 多くの若い世代が心の深いところで苦しんでいる理由も、ここにあるのではないか。彼らの身体の深層には、まだ「他者とつながり、グラデーションのようにお互いが溶け合っている状態こそが心地よい」という東洋的な感性(OS)がしぶとく残っている。それなのに、社会からは無理やり「他人から切断された強い自我」という西洋のOSをインストールさせられている。この二つのOSの致命的な摩擦が、若者たちのメンタルに「生きづらさ」というバグを引き起こしているのだ。

三:「贈与」と「自我の解体」という対抗軸

 すべてを計算可能な損得で切り分ける「切断の社会」の中で、ぼくたちが「まともな人間関係」を取り戻すにはどうすればいいのか。そこで浮かび上がってきたのが、人類学的な意味での「贈与」という概念だった。
 マルセル・モースらが論じた贈与とは、単に物品を無償で提供することではない。それは「お返しが完了するまでの、宙ぶらりんな時間」を通じて、簡単には切断できない温かい関係性や、心地よい「負い目(お互い様)」を社会の中に発生させる行為だ。日本の高品位なサービスも、経済の数式では減点されても、社会への「労働の贈与」であった。ただし、それが働く人の自己犠牲(搾取)という一方通行になっていたからこそ、システムが持続不可能なまでに摩耗していたのである。
 真に「まともな人間関係」を取り戻すためには、他人を「丸ごとaccept(受容)」しなければならない。それは、言葉によって強固に構築された独我論的な「自我」を、自ら壊していくプロセスでもある。「あの人は得か損か」「利用価値があるかないか」という言葉の物差し(自我)を一度捨て、相手のままならなさを丸ごと受け入れる。その痛みを伴う非効率的な瞬間にしか、本当の結びつきは生まれない。

結:意図せざる実験場としての日本

 日本は、経済成長を諦めた貧しい社会の中で、それでも人々がそこそこ幸せに生きていけるかという、「意図しない実験場」になっているのかもしれない。この変わった社会には、資本主義の暴走に対する強力なオルタナティブ(対抗馬)としての独自の価値がある。
 西洋のシステムを深く知ることは重要だ。サイバーセキュリティやITといった「防衛・ビジネスの仕組み」は、グローバルなルールに合わせて器用にアップデートしなければ国が持ち堪えられない。しかし、そのために内側の「お互い様の精神(贈与)」まで西洋化して捨て去る必要は、絶対にない。
 外のルール(西洋)を賢く学び利用しながらも、内側のまともな人間関係(東洋)は死守する。すべてを数値化し、人間をバラバラに切断していく巨大な資本主義の網の目に対して、日々の暮らしの中で、目の前の他者に一言「ありがとう」と声をかけ、等価交換の瞬間に「敬意という贈与」を滑り込ませる。

 技術の遅れという表層的な議論から始まったこの思索は、ぼくたちの内面にある「東洋性の灯火」をどう守るかという、静かで最も強力な抵抗の論理へと着地した。その実験の成否は、いまもぼくたちの手の中にある。




(以上はAI君との対話をAI君がまとめたもの。)
●https://share.google/aimode/YVUvPMgkEXZzYFYky

LAN内に(Rubyで)MP4動画ストリーミング・サーバーを置く

使い方

$ ruby my_video_server.rb [Directory]

で開始ディレクトリを指定する。そのディレクトリより上へはいけない。全ディレクトリをブラウズしたかったら、

$ ruby my_video_server.rb /

とする。これでストリーミング・サーバーが立ち上がる。
 
あとは、iPadなどのウェブブラウザでhttp://[PCのIPアドレス]:8080/にアクセスするだけ。なお、Linux で自分の IPアドレスを知りたければ、

$ ip a

を実行し、inet 192.168.x.x/... のような記載がある行の「192.168.x.x」部分が自分のIPv4アドレス。
 

コード

AI君が一瞬でコーディングしたもの。AI君、すごすぎやろ。
my_video_server.rb

require "bundler/setup"
require 'sinatra/base'
require 'puma'
require 'find'
require 'erb'

# 💡 最初に見せる「ルートディレクトリ」を決める
# 引数があればそれ、なければ今いる場所(カレントディレクトリ)
ROOT_PATH = ARGV[0] ? File.expand_path(ARGV[0]) : Dir.pwd

unless File.directory?(ROOT_PATH)
  puts "❌ エラー: 指定されたディレクトリは存在しません: #{ROOT_PATH}"
  exit 1
end

class MyVideoServer < Sinatra::Base
  configure do
    set :server, :puma
    set :bind, '0.0.0.0' # LAN内のiPadからのアクセスを許可
    set :port, 8080
    set :logging, false
  end

  # 🏠 1. トップページにアクセスしたら、ルートディレクトリの中身を表示
  get '/' do
    redirect '/browse/'
  end

  # 🔍 2. 指定された相対パス(フォルダ内)の中身をブラウズする
  get '/browse/*' do
    # URLから「どのフォルダを見たいか」の相対パスを取得してUTF-8化
    rel_path = params[:splat].first.to_s.force_encoding('UTF-8')
    
    # 💡 パスの安全な結合(文字列置換)。ROOT_PATHより上には絶対戻れないようにガード
    current_dir = File.expand_path("#{ROOT_PATH}/#{rel_path}")
    unless current_dir.start_with?(ROOT_PATH)
      status 403
      return "アクセス拒否: ルートディレクトリの外には出られません"
    end

    # フォルダの中身を仕分けるための箱
    sub_directories = []
    video_files = []

    # 💡 そのフォルダの直下だけを安全にスキャン
    begin
      Dir.children(current_dir).each do |child|
        next if child.start_with?('.')
        full_child_path = "#{current_dir}/#{child}"
        next if File.symlink?(full_child_path) # シンボリックリンクはスルー

        # 文字コードをクリーンに
        clean_name = child.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '')

        if File.directory?(full_child_path)
          sub_directories << clean_name
        elsif File.file?(full_child_path) && clean_name.end_with?('.mp4')
          video_files << clean_name
        end
      end
    rescue => e
      status 500
      return "エラー: フォルダを開けませんでした (#{e.message})"
    end

    # 画面の組み立て
    html = <<~HTML
      <html>
        <head>
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>我が家のファイルブラウザ</title>
          <style>
            body { font-family: sans-serif; padding: 20px; background: #f0f2f5; color: #333; }
            h1 { color: #222; font-size: 22px; margin-bottom: 5px; }
            .path { color: #666; font-size: 14px; margin-bottom: 25px; word-break: break-all; font-family: monospace; }
            ul { list-style: none; padding: 0; }
            li { margin-bottom: 12px; background: white; padding: 15px 20px; border-radius: 12px; box-shadow: 0 2px 4px rgba(0,0,0,0.04); display: flex; align-items: center; }
            .icon { font-size: 22px; margin-right: 15px; }
            a { text-decoration: none; font-size: 16px; font-weight: bold; display: block; word-break: break-all; flex: 1; }
            .dir-link { color: #ff9500; } /* フォルダはオレンジ */
            .video-link { color: #007aff; } /* 動画はブルー */
            .back-btn { display: inline-block; margin-bottom: 20px; background: #8e8e93; color: white; padding: 8px 15px; border-radius: 20px; text-decoration: none; font-size: 14px; font-weight: bold; }
          </style>
        </head>
        <body>
          <h1>📁 ファイルブラウザ</h1>
          <div class="path">現在地: /#{rel_path}</div>
    HTML

    # 上の階層へ戻るボタン(ルートディレクトリにいない場合だけ表示)
    unless rel_path.empty?
      parent_rel_path = rel_path.split('/')[0...-1].join('/')
      html += "<a class='back-btn' href='/browse/#{ERB::Util.url_encode(parent_rel_path)}'>⬅ 上の階層へ戻る</a>"
    end

    html += "<ul>"

    # フォルダ一覧を先にレンダリング
    sub_directories.sort.each do |dir|
      next_rel_path = rel_path.empty? ? dir : "#{rel_path}/#{dir}"
      encoded_path = ERB::Util.url_encode(next_rel_path)
      html += "<li><span class='icon'>📁</span><a class='dir-link' href='/browse/#{encoded_path}'>#{dir}/</a></li>"
    end

    # 動画一覧を次にレンダリング
    video_files.sort.each do |video|
      video_rel_path = rel_path.empty? ? video : "#{rel_path}/#{video}"
      encoded_path = ERB::Util.url_encode(video_rel_path)
      html += "<li><span class='icon'>🎬</span><a class='video-link' href='/watch/#{encoded_path}'>#{video}</a></li>"
    end

    if sub_directories.empty? && video_files.empty?
      html += "<li><span style='color: #999;'>このフォルダ内は空っぽ、または動画がありません</span></li>"
    end

    html += "</ul></body></html>"
    html
  end

  # 🍿 3. タップされた動画をストリーミング配信する
  get '/watch/*' do
    video_rel_path = params[:splat].first.to_s.force_encoding('UTF-8')
    full_video_path = File.expand_path("#{ROOT_PATH}/#{video_rel_path}")

    if File.exist?(full_video_path) && full_video_path.start_with?(ROOT_PATH)
      send_file full_video_path, type: 'video/mp4', disposition: 'inline'
    else
      status 404
      "動画ファイルが見つかりません"
    end
  end
end

puts "🚀 我が家の極上エクスプローラーサーバーを起動します..."
puts "🏠 基点(ルート): #{ROOT_PATH}"
puts "📱 iPadのブラウザでアクセス:"
puts "   http://[あなたのPCのIPアドレス]:8080/"
puts "--------------------------------------------------"

MyVideoServer.run!

#ver 1.0.0 (2026.10.24)

RubyによるLAN内での転送コマンド

AI君がコーディングした。
lan_share.rb

# lan_share_v4.rb
require "bundler/setup"
require 'sinatra/base'
require 'puma'
require 'faraday'
require 'faraday/multipart'
require 'fileutils'
require 'socket'
require 'find' # 💡 日本語のパスを確実にスキャンするために追加

# --- 共通設定 ---
PORT = 4567           # HTTPサーバーのポート
DISCOVERY_PORT = 4568 # 自動発見用(UDP)のポート
DISCOVERY_MSG = "RUBY_LAN_SHARE_SERVER_HERE"
SAVE_DIR = File.expand_path("~/Downloads/lan_share")

# ==========================================
# 1. サーバー側(ファイル受信 + 進捗・現状報告機能)
# ==========================================
class LANReceiver < Sinatra::Base
  configure do
    set :server, :puma
    set :bind, '0.0.0.0'
    set :port, PORT
    set :logging, false
  end

  def self.start_beacon_thread
    Thread.new do
      udp_socket = UDPSocket.new
      udp_socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
      loop do
        udp_socket.send(DISCOVERY_MSG, 0, '255.255.255.255', DISCOVERY_PORT)
        sleep 1
      rescue => e
        sleep 2
      end
    end
  end

  post '/upload' do
    type = request.env['HTTP_X_TYPE']

    # 1. 空のディレクトリ作成命令の場合
    if type == 'dir_mkdir'
      relative_path = request.env['HTTP_X_RELATIVE_PATH'].to_s.force_encoding('UTF-8')
      extract_path = File.join(SAVE_DIR, relative_path)
      FileUtils.mkdir_p(extract_path)
      puts "📁 フォルダを作成しました: #{relative_path}"
      return "OK"
    end

    # 2. 通常のファイル受信の場合
    unless params[:file]
      status 400
      return "エラー: ファイルがありません"
    end

    tempfile = params[:file][:tempfile]
    relative_path = request.env['HTTP_X_RELATIVE_PATH'].to_s.force_encoding('UTF-8')
    extract_path = File.join(SAVE_DIR, relative_path)
    
    FileUtils.mkdir_p(File.dirname(extract_path))

    File.open(extract_path, 'wb') do |f|
      f.write(tempfile.read)
    end

    size_mb = (tempfile.size / 1024.0 / 1024.0).round(2)
    puts "💾 ファイル受信完了: #{relative_path} (#{size_mb} MB)"
    
    "OK"
  end
end

# ==========================================
# 2. クライアント側(自動発見 + ディレクトリ完全解剖送信)
# ==========================================

# 💡 削れてしまっていた自動発見メソッドをここに完全復活させました
def discover_target_ip
  puts "🔍 LAN内の転送相手を自動検索中..."
  udp_socket = UDPSocket.new
  udp_socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
  udp_socket.bind('0.0.0.0', DISCOVERY_PORT)
  
  return nil unless IO.select([udp_socket], nil, nil, 5)
  
  loop do
    msg, sender = udp_socket.recvfrom_nonblock(1024)
    if msg == DISCOVERY_MSG
      target_ip = sender[3]
      next if Socket.ip_address_list.any? { |ip| ip.ip_address == target_ip }
      puts "✨ 相手を発見しました! IPアドレス: #{target_ip}"
      return target_ip
    end
  end
rescue Errno::EAGAIN, Errno::EWOULDBLOCK
  puts "❌ 相手が見つかりませんでした。"
  nil
ensure
  udp_socket.close if udp_socket
end

# ファイル送信ヘルパー
def upload_file(conn, local_file_path, relative_path)
  payload = { file: Faraday::Multipart::FilePart.new(local_file_path, 'application/octet-stream') }
  response = conn.post('/upload', payload) do |req|
    req.headers['X-Relative-Path'] = relative_path.to_s.force_encoding('UTF-8')
    req.headers['X-Type'] = 'file'
  end
  response.status == 200 && response.body == "OK"
end

# 空のフォルダ作成命令を相手に送るヘルパー
def make_remote_dir(conn, relative_path)
  response = conn.post('/upload') do |req|
    req.headers['X-Relative-Path'] = relative_path.to_s.force_encoding('UTF-8')
    req.headers['X-Type'] = 'dir_mkdir'
  end
  response.status == 200 && response.body == "OK"
end

def send_to_target(path)
  unless File.exist?(path)
    puts "❌ エラー: 指定されたパスが存在しません: #{path}"
    return
  end

  target_ip = discover_target_ip
  return if target_ip.nil?

  conn = Faraday.new(url: "http://#{target_ip}:#{PORT}") do |f|
    f.request :multipart
    f.request :url_encoded
    f.adapter :net_http
  end

  if File.directory?(path)
    puts "📂 ディレクトリ構造を解析中..."
    base_dir = File.basename(path)
    
    directories = []
    files = []

    # 💡 Find.find を使うことで、日本語フォルダの中身も100%確実に捕捉します
    Find.find(path) do |p|
      next if p == path
      next if File.symlink?(p)

      if File.directory?(p)
        directories << p
      elsif File.file?(p)
        files << p
      end
    end

    puts "🚀 遠隔地にフォルダ構造を同期中... (#{directories.size}個のフォルダ)"
    directories.each do |dir|
      rel_path = File.join(base_dir, dir.sub("#{path}/", ""))
      make_remote_dir(conn, rel_path)
    end

    puts "🚀 ファイル群のダイレクト転送を開始します... (#{files.size}個のファイル)"
    success_count = 0
    files.each_with_index do |file, idx|
      rel_path = File.join(base_dir, file.sub("#{path}/", ""))
      print "\r転送中: [#{idx + 1}/#{files.size}] #{File.basename(file)}...          "
      
      if upload_file(conn, file, rel_path)
        success_count += 1
      else
        puts "\n⚠️ 転送失敗: #{rel_path}"
      end
    end
    
    puts "\n✨ ディレクトリ全体の転送が完了しました!"
    puts "   成果: 成功 #{success_count} / 全体 #{files.size}"
  else
    puts "🚀 単一ファイルを転送中: #{File.basename(path)}"
    if upload_file(conn, path, File.basename(path))
      puts "✨ 転送が正常に完了しました!"
    else
      puts "❌ 転送に失敗しました"
    end
  end
rescue => e
  puts "\n❌ 通信エラーが発生しました: #{e.message}"
end

# ==========================================
# 3. 起動スイッチ
# ==========================================
if ARGV.empty?
  puts "🚀 LAN内 ファイル受信サーバーを起動します... (Port: #{PORT})"
  puts "保存先ディレクトリ: #{SAVE_DIR}"
  puts "--------------------------------------------------"
  LANReceiver.start_beacon_thread
  LANReceiver.run!
else
  path = ARGV[0]
  if path
    send_to_target(File.expand_path(path))
  else
    puts "【使い方】"
    puts " サーバー起動: ruby lan_share.rb"
    puts " ファイル送信: ruby lan_share.rb [ファイルやフォルダのパス]"
  end
end

#version 1.0.0 (2026.10.24)

 

使い方

コマンド化した。まず~/Documents/Ruby400/において(いまのところ、どこの場所でも可能、というわけではない)

$ lan_share

でサーバーを立ち上げる。
転送元は

$ lan_share ./sample.txt

これでサーバー側の~/Downloads/lan_share/内にファイルまたはディレクトリが転送される。複雑な構造のディレクトリも丸ごと転送可能。
 
ちなみに

Address already in use - bind(2) for "0.0.0.0" port 4567 (Errno::EADDRINUSE)

のエラーが出た場合は、~/.bashrcに

alias killport='_killport(){ kill -9 $(lsof -t -i :$1); }; _killport'

を追加して、

$ killport 4567

とかする。

AI君との対話まとめ『【思想ノート】「切断」の時代を越えて:日本型共生と「空気」の可能性』

【思想ノート】「切断」の時代を越えて:日本型共生と「空気」の可能性

少子高齢化が進む日本において、労働力の確保と「移民」への拒絶という矛盾は、単なる経済政策のねじれにとどまらない。それは、現代の日本人が抱える深層心理——他者との関わりを拒む「切断」の心理と、そこからの脱却をめぐる、極めて本質的な問いを私たちに突きつけている。

1. 政策のねじれと「防衛的切断」

現在の日本政府は、実質的な労働力として外国人の受け入れを急拡大(特定技能の拡充など)する一方で、永住権の厳格化など「排除」ともとれるブレーキを同時に踏んでいる。この矛盾は、国政がネット上の排外主義的な世論や保守層の「岩盤支持層」へ配慮している結果であり、地方自治体が直面している「街の存続」という切実な悲鳴とは大きく乖離している。

ネットのコメント欄には見るに堪えない排外的な言葉があふれているが、それは社会全体の数パーセントの過激な声がアルゴリズムによって可視化されたものに過ぎない。しかし、現実の若い世代もまた、かつての「ムラ社会」的な町内会や地域の義務を嫌う一方で、外国人に対して根強い「ヨソモノ意識」を抱えている。

この若者たちの心理は、決して他者への単純な攻撃性ではない。それは、「失われた30年」の閉塞感の中で、自分の限られた時間や、日本の社会が持つ「静かで清潔で干渉されない快適さ」をこれ以上乱されたくないという、余裕のなさからくる「守りの排他性(防衛的切断)」なのである。

2. 西洋型「自我」への違和感と、アジアの「別の道」

こうした閉塞感を打破するための処方箋として、よく欧米型の「個人主義」や「徹底した対話力」が挙げられる。しかし、欧米における「無矛盾で、統合された強い自我」同士の対話とは、本質的には言葉を用いた「闘争」であり、論理によって相手を屈服させるゲームに近い。二項対立(正義か悪か、敵か味方か)をベースにしたそのコミュニケーションは、私たちアジアの風土には不自然で、暴力的にすら感じられる。

日本人は、欧米の真似ではない「別の道」を選んでいいはずだ。それは、白黒つけずに曖昧さを残し、グラデーションの中で折り合いをつける「関係性の共生」である。

しかし、それを現代の多文化社会でやり遂げるのは「めっちゃ困難」であると考えられてきた。なぜなら、日本独自の「空気を読む」という高度な察し合いは、育ってきた環境や文化が全く同じであるという「奇跡的な同質性(内輪)」のなかでのみ機能するシステムだと思われていたからだ。空気が読めない外国人が入ってきたとき、私たちは「言葉で闘う」武器を持たないがゆえに、ただ恐怖し、シャッターを下ろすしかなかった。

3. 「空気」は国境を越えるか

だが、本当に「空気」は身内だけのものなのだろうか。ここにひとつのコペルニクス的転回がある。

極めて日本的な情緒や、セリフではなく「行間」で感情を描くアニメや漫画を、海外の人々が日本人とまったく同じように楽しみ、涙しているという現実がある。また、日本に暮らす外国人が自ら「郷に入っては郷に従え」と口にするとき、彼らが従おうとしている「郷」の本質とは、明文化されたルール以上に、その場に流れている無言の秩序や優しさ、すなわち「空気」のことではないか。

欧米人であれ誰であれ、人間には「言葉にできない気配を察する力」や「行間を読む繊細さ」が本能的に備わっている。空気は、日本人だけの排他的な特権ではない。それは国境を越えて伝わり、分かり合える普遍的な感受性なのだ。

結び:まず、コワイという壁を拓くこと

もし「空気」がオープンなものであるならば、日本が目指すべき共生社会の形が見えてくる。それは、欧米のように契約とロジックでガチガチに縛り付けるのでもなく、昔のムラ社会のように生まれ育ちで排除するのでもない。「この思いやりと静かな秩序(空気)を、一緒に大切にしよう」という作法で、ゆるやかに繋がっていく道である。

「空気は言葉にも表れる」という指摘の通り、私たちが相手を恐れて発する冷たい言葉も、受け入れようとして発する優しい言葉も、その裏にある心の開き具合(空気)はすべて相手に伝わっている。

今、最大の障害となっているのは、制度の不備でも文化の違いでもない。日本人の側が「何かされるのではないか」「自分の平穏が壊されるのではないか」と身構えて、心を閉ざしてしまっている「コワイ」という恐怖心そのものだ。

欧米型の「論破し合う闘争」ではなく、「私はあなたを怖がっていませんよ」という安心感をベースにした、日本らしい『心を拓くための対話』。このめっちゃ困難な、しかし人間味にあふれた新しいグラデーションを発明することこそが、これからの日本に課された静かな挑戦なのである。

AI君との対話まとめ『独我論の牢獄と「ヌルさ」の倫理:近代西洋OSの暴走を越えて』

【論考】独我論の牢獄と「ヌルさ」の倫理:近代西洋OSの暴走を越えて

序:限定された性悪説と契約主義の根底

欧米における社会構造や人間観の根底には、「他者は放っておけば自らの利己心に従い、私に悪をなすかもしれない」という「限定された性悪説」が潜んでいる。この強い警戒心こそが、言葉によって自他の境界線を厳密に規定する「契約主義」のインフラとなった。

キリスト教の「原罪」の観念、そしてトマス・ホッブズが唱えた「万人の万人に対する闘争」という自然状態の概念は、まさにこの人間観の言語化である。そこでは、人間関係の本質は信頼ではなく「リスク管理」であり、契約を守る限りにおいてのみ自己の「善(正義)」が担保される。

破:独我論という名の美しい牢獄(他者の記号化)

この人間観は、西洋近代の「主体の強さ」や「個人主義(Individualism)」と地続きである。ルネ・デカルトの「我思う、ゆえに我あり」に端を発する西欧哲学は、唯一確実な「自我」を出発点としたがゆえに、常に独我論(Solipsism)の罠と隣り合わせであった。

エトムント・フッサールの現象学もまた、この独我論的傾向に自覚的であり、他者経験(相互主観性)の構築に死闘を繰り広げた。しかし、どれほど精緻に他者を位置づけようとも、その他者は「私の意識の法廷」で承認された、操作・予測可能な「記号(あるいはデータ)」の域を出ない。

強固な自我の一貫性を保とうとする西洋OSにおいて、他者の全存在を無条件に受け入れることは、城門を開け放ち「自己同一性(アイデンティティ)の崩壊」を招く恐怖に等しい。彼らにとって他者とは、決して分かり合えないからこそ、ルールという記号で縛り、適切な距離を保ち続けねばならない存在なのである。

急:国家と教育に侵入する西洋OSの暴走

この「ミクロな自我の防衛システム」は、マクロな国際政治における「リアリズム(現実主義)」へと完全にスライドする。ウェストファリア体制以降の主権国家は、アナーキー(無政府状態)のジャングルで互いを警戒し合い、「安全保障のジレンマ」という軍拡の自動プログラムを駆動させてきた。

現代の日本社会や知識人層、政治家、そして民衆までもが、この西洋OSを「客観的な正解」として丸呑みし、劣化コピーとしての「知性なきリアリズム」へと退化しつつある。そこでは、リアリズムが本来持っていたはずの「自戒」や「他者視点」すら忘却され、ブレーキのない軍拡の坂道を突き進んでいる。

さらにこの歪みは、教育現場における「みんなちがって、みんないい」という耳触りの良い個性主義(個人主義の変種)の罠ともリンクしている。若者たちは「分割不可能な唯一無二の『個性(エゴ)』という記号」を社会に差し出すよう要請され、「何者かになりたい」という過酷な実存的ノイローゼ(アイデンティティ危機)に身を焦がす。

この「何者かになりたいという虚栄心」が「他者は敵であるという性悪説」と結びついたとき、現代のSNS空間やインフルエンサー経済に代表されるように、「他者を悪の記号として叩き、排除することで、自らの存在証明にする」という最も醜悪なシステムが完成する。

結:『ヌルさ』という名の最後の防波堤

この「頭がよくなりすぎた世界」――世界をすべて計算可能な記号に還元し、虚栄心と性悪説のゲームに熱狂する世界――の暴走を止める鍵は、どこにあるのか。

それは皮肉にも、現代社会が「お花畑」や「古いもの」として切り捨てようとしている、日本(東洋)の民衆が無意識のうちに保持している「良い意味でのヌルさ(寛容さ)」の中にしかない。

平野啓一郎氏が提唱する「分人主義(Dividualism)」のように、関係性の中で流動的に立ち上がる複数の自己を生きる東洋的な身体感覚は、「一貫した単一のエゴ」という西洋の呪縛から人間を解放する。一貫性のない、矛盾を抱えた自分を許容できているからこそ、同じように矛盾に満ちた「他者の全存在を無条件で受け入れる(acceptする)」心のゆとりが生まれる。

無条件の受容とは、頭での計算(合理性)をあえて止めることである。国家レベルでの実践は困難だとしても、個人において他者の全存在を accept する営みが完全に失われてしまえば、人間社会の精神はそこですべて終わる。

私たちは、西洋的な性悪説のリアリズムを冷徹な「鎧」として理解しつつも、その内側の魂には、自他を地続きに包み込む性善説的な「ヌルさ」の灯火を死守しなければならない。それこそが、人類が自らプログラミングした「独我論の牢獄からの自動破滅」を食い止める、最後の、そして唯一のアンカーなのである。

IrfanView を Linux Mint で使う

Wine の導入

まず、Linux Mint に Wine を導入します。これは解説しません。以下などがわかりやすいです。
●🍷 LinuxでWindowsアプリを動かす!Wine入門【初級編】
●🍷 Wine入門【中級編】:LinuxでWindowsアプリをもっと快適に!
 

ダウンロードとインストール

●「IrfanView」定番の画像ビューワー - 窓の杜
ここの
・IrfanView(64bit版)
・IrfanView PlugIns(64bit版)
・IrfanView日本語化モジュール
をダウンロードして(32bit版でもいいです)、端末から Wine でインストールします(下はバージョン4.73の場合)。

$ wine iview473_x64_setup.exe
$ wine iview473_plugins_x64_setup.exe
$ wine irfanview_lang_japanese.exe

 

日本語化

「メニュー」→「Wine」→「IrfanView」でソフトを立ち上げ、「Options」→「Change language」で「JAPANESE.DLL」を選択し再起動すれば、表示が日本語になります。

はてなブログから一年間に読んだ本の冊数とタイトルを出力する(個人的なコード)

使い方

ブログエントリのタイトルの「二重かぎ括弧」で囲まれたものを、本のタイトルと判断して集計、出力します。
2025年の出力例。

$ ruby blog_books.rb 2025
1月 13冊
 増補 現代美術逸脱史
 更に、古くて素敵なクラシック・レコードたち
 来たれ、新たな社会主義
 2001年映画の旅
 中村哲 思索と行動(下)2002-2019
 縄文人と弥生人
 Blue
 何ものにも縛られないための政治学
 バトラー入門
 侵略日記
 わたしの神聖なる女友だち
 地方消滅2
 パーティが終わって、中年が始まる
2月 14冊
 眼がスクリーンになるとき
 生命式
 だめ連の資本主義よりたのしく生きる
 手段からの解放
 ピークアウトする中国
 愛国者の憂鬱
 ポスト・サブカル焼け跡派
 音楽と生命
 新版 言葉果つるところ
 「戦後」を読み直す
 水中の哲学者たち
 モナドの領域
 対談集 ららら星のかなた
 功利主義
3月 7冊
 ハンス・ヨナスを読む
 バレエ・メカニック
 一切は空
 0の裏側
 国家について/法律について
 絶望ハンドブック
 縮小ニッポンの衝撃
4月 16冊
 父、松本竣介
 南三陸日記
 〈公正(フェアネス)〉を乗りこなす
 フッサール入門
 本当の翻訳の話をしよう
 ナイン・ストーリーズ
 漂流
 サボる哲学
 「なぜ?」から始める現代アート
 日本が心配
 増補版 はたらかないで、たらふく食べたい
 「若者の読書離れ」というウソ
 おいしいごはんが食べられますように
 こじらせ男子とお茶をする
 チェコ・アヴァンギャルド
 1973年に生まれて ――団塊ジュニア世代の半世紀
5月 7冊
 モールの想像力
 人生の壁
 日本人の9割が知らない遺伝の真実
 あなたに安全な人
 新訳 平和の経済的帰結
 からゆきさん 異国に売られた少女たち
 彼岸の図書館――ぼくたちの「移住」のかたち
6月 11冊
 60年代ポップ少年
 詩の構造についての覚え書
 教養主義のリハビリテーション
 盲目と洞察
 中学生までに読んでおきたい日本文学7 こころの話
 物価を考える
 ヤンキーと地元
 春の庭
 批評の教室
 貧困とは何か
 センスの哲学
7月 6冊
 ポスト人新世の芸術
 ライ麦畑でつかまえて
 宮本常一を旅する
 中学生までに読んでおきたい日本文学1 悪人の物語
 建築の難問――新しい凡庸さのために
 「国境なき医師団」を見に行く
8月 10冊
 ガザ、西岸地区、アンマン――「国境なき医師団」を見に行く
 ヘリオガバルス
 わたしは「セロ弾きのゴーシュ」――中村哲が本当に伝えたかったこと
 敗戦日記
 詭弁と論破
 江藤淳と加藤典洋
 「国境なき医師団」をそれでも見に行く 戦争とバングラデシュ編
 崇高と資本主義 ジャン=フランソワ・リオタール論
 時間とテクノロジー
 「国境なき医師団」になろう!
9月 10冊
 だれか、来る
 不完全な司書
 続 華厳という見方
 平成史
 ここで唐揚げ弁当を食べないでください
 つくるをひらく
 歴史の屑拾い
 近代を彫刻/超克する
 昭和的
 理不尽ゲーム
10月 7冊
 根っからの悪人っているの?
 オタク文化とフェミニズム
 漂泊のアーレント 戦場のヨナス
 僕には鳥の言葉がわかる
 ブロッコリー・レボリューション
 最終講義 ポスト資本主義の欲望
 久生十蘭ラメール戦記
11月 6冊
 末世を生きる
 日本、ヤバい。
 こころをそのまま感じられたら
 失われた「文学」を求めて(文芸時評編)
 地球と書いて〈ほし〉って読むな
 管理職の戦後史
12月 5冊
 定形外郵便
 戦争ミュージアム――記憶の回路をつなぐ
 ハンス・ヨナス 未来への責任
 増補新版 古代から来た未来人 折口信夫
 フレンチ・セオリー

合計 112冊

 

Ruby コード

blog_books.rb

require "nokogiri"
require "open-uri"

def get_month_titles(year, month)
  url = "http://obelisk2.hatenablog.com/archive/#{year}/#{month}"
  titles = []
  loop do
    body = Nokogiri::HTML.parse(URI.open(url))
    titles = body.css("a.entry-title-link").map(&:text).reverse + titles
    pager_node = body.css("div.pager span.pager-next a")&.at(0)
    if pager_node&.text&.strip == "次のページ"
      url = pager_node.attribute("href").value
    else
      return titles
    end
  end
end

year = ARGV.shift.to_i
total = (1..12).sum {|month|
  book_titles = get_month_titles(year, month).map {|title|
    title.scan(/『(.+?)』/)
  }.flatten
  number = book_titles.size
  puts "#{month}月 #{number}冊"
  puts book_titles.map { " " + _1 }
  number
}
puts
puts "合計 #{total}冊"

#ver. 1.0.0