月別アーカイブ: 2025年1月

「箱根駅伝を伝える」を読んだ

原島由美子著「箱根駅伝を伝える テレビ初の挑戦」を読んだ

箱根駅伝を伝える テレビ初の挑戦

箱根駅伝といえば正月の楽しみであり、特に駅伝というスポーツ自体に強い興味がなくてもテレビ中継を見ている人は多いのではないでしょうか。

私自身も子供の頃から見ており、母が山梨出身だったこともあり山梨学院大学の順位にはいつもドキドキしながら応援していたことを覚えています。
オツオリ選手が各校の並みいるエースをごぼう抜きしていく姿は衝撃でした。

概要

本書はそんなお正月の風物詩とでも言う存在になっている箱根駅伝をテレビ生中継を初めてするということを成し遂げた、日本テレビのクルーたちの物語です。

もはや、プロジェクトXでした

今では当たり前に中継されている箱根駅伝も、1987年当時では技術的に難しく。
特に山岳地帯からの生中継というものがいかに大変だったかということが語られています。

そういう意味では、来年の箱根駅伝はちょっと違った視点でのものの見方ができるかもしれないな、と思った。

しかしながら、このプロジェクト。かなり無茶苦茶である。
プロジェクト期間としては、1年以上を費やして進めていっているように見えるのだが、いろいろな漏れが出てくる。

クルー用の宿の確保が出来ていない
弁当のことを考えていなかった
機材を山に届けるのはいいけれど、下ろすことを考えていない

ワープロすら十分に普及していなかった時代のことを考えると、プロジェクト管理という概念自体が怪しいのかもしれないな、と思わなくもない。
そう思ってしまうほどだ。

美談なのか

プロジェクトXにしても、悩ましいのは現代でこれをやると間違いなく一発アウトだ。
労基に入られたらもはや何も言えなくなるくらいアウトだろう。

そう考えると、これを美談のように感じられるのは、そういう時代を少なからず経験したことがある世代。そしてそれを乗り越えられた人だけで、若者からしたらドン引きな内容なのではないだろうかと思ってしまう。

オーバーワークが人を成長させることはあると私自身も思っている。
一方で、オーバーワークが人を壊してしまうこともよくある話だし、一度壊れてしまった人がなかなかその後も苦しんでしまう状況に追いやられることもままある。

実際のところ、本書の中でも主導したメンバーは夢中でやっていたかもしれないが、かき集められたメンバーからしてみたら扱いの酷さに文句も出ているし、ついていけなかった人もいるのではないだろうか。

どうしてもそういうことを考えてしまい、こういう物語を見たあとは、素直に感動したとは思えないんですよね。すごいとはもちろん思います。
悩ましいところですが。

そんなことを、改めて考えさせられた一冊でした。

ObsidianでKindle Highlightを管理する

Kindleで本を読んだときに、いいなと思っている機能の一つがHighlightをWebで見ることができる点だと思っています

Kindle Highlight
https://read.amazon.co.jp/notebook?ref_=k4w_ka_notebook

過去に自分がどういうことに興味を持ったのか?ということを確認することが出来ますし、ブログに記事を投稿する際にも参考にしたりしています。
Audibleにも似たような機能があるといいのですが、音声だと文字起こし範囲の指定が難しいですよね。

最近のAIは賢いもので、これらの”自分が何に興味を持ったのか?”という情報は、これから大事になってくるのではないかと考えています。
そういう意味では、それを再利用可能な状態にしておく方が良いと。
であれば、Obsidianに取り込んでしまおうかという話です

Kindle Highlights

特に何も考えることなくそのものズバリ、「Kindle Highlights」というPluginがあります

プラグインのプロパティとしては下記のものがある

Templatesで、同期したあとにどういう形でノートとして保存するのかを定義可能。
デフォルトでも大きな問題はないのだけれど、自分用に少しいじったものをここに公開しておきます。

FileName

{{title}} - {{author}}

File Content

---
tag: 📚Book
title: "{{title}}"
author: [{{author}}]
---
{% trim %}
{% if imageUrl %}![image]({{imageUrl}}){% endif %}
{% if authorUrl %}
* 著者: [{{author}}]({{authorUrl}})
{% elif author %}
* 著者: [[{{author}}]]
{% endif %}
{% if asin %}* ASIN: {{asin}}{% endif %}
{% if isbn %}* ISBN: {{isbn}}{% endif %}
{% if pages %}* Pages: {{pages}}{% endif %}
{% if publicationDate %}* 出版日: {{publicationDate}}{% endif %}
{% if publisher %}* 出版社: {{publisher}}{% endif %}
{% if url %}* Reference: {{url}}{% endif %}
{% if appLink %}* [Kindle link]({{appLink}}){% endif %}
{% endtrim %}

## 概要・要約

## Highlights
{{highlights}}

Highlight

## location: {{location}} : {{ text | truncate(20) }}
{{ text }} — [link]({{ appLink }})

{% if note %}{{note}}{% endif %}

---

このテンプレートでやるとこんな感じになります。
Highlightされた場所をより見つけやすくするために、位置情報と冒頭の数文字を出している形ですね。

このあたりはもう少し運用して手を加える場所があれば都度見直していこうかと。
ノートを削除してもう一度同期をすれば作られるので、テンプレートの改造を試すのには比較的敷居が低いと感じています。

最後にプラグインのプロパティでSync on Startupがありますが、Obsidianの起動が遅くなるので結局オフにしました

Obsidian起動してから主導でSyncする形で頻度としては十分かと。
思ったよりもこの時間がかかるのが気になってしまうので。

Obsidian の LiveSync を Fly.ioで

Obsidianはだんだん手に馴染んできているもののDynalistと違ってふと手元でメモを取ってそれをPCで確認するということが出来ないのは、正直おもしろくない。

Obsidian公式としてもSync機能は提供されているものの、せっかくデータをローカルに持ってきているという特性。
それを再び相手に明け渡すというのも面白くない

調べてみると、Syncサーバーを自分で立てる。。というか、Obsidianは内部的にCouchDBを使っているようでそれをホスティングしてくれるものを利用するSelf-hosted LiveSyncというプラグインが存在しているので早速試してみる

例によってコミュニティプラグイン一覧からlivesyncと検索すれば出てくる。

プラグインの説明を読むと、Amazon S3でも行けるっぽい。
SetUpの方法は基本的にはGithubにかかれている通りの手順となります。

Setup CouchDB on fly.io
https://github.com/vrtmrz/obsidian-livesync/blob/main/docs/setup_flyio.md

ColabでFly.ioの設定をスタートする

下記ページへアクセス

https://github.com/vrtmrz/obsidian-livesync/blob/main/setup-flyio-on-the-fly-v2.ipynb

”Open in Colab”ボタンを押下するとGoogleアカウントが正しく設定されていれば、GCPのColabを利用してFly.ioをセットアップするためのノートブックが開かれる。

これは、Fly.ioがGUIを基本的に提供しておらず、CLIでセットアップを進める必要があるからである。

下のGithubに「Choose a region and run all blocks」と書いてあったので、”ランタイム”メニューから”すべてのセルを実行”を選択するを最初選んでしまったのだが、最後にサーバーを削除するスクリプトがついているので必ず一つずつ実行してください

セクション[1]が完了するとセクション[2]に移るわけだが、ここではFly.ioへのログインが求められる

上記URLをクリックしてFly.ioへサインアップする必要がある。
ここで注意なのが、Fly.ioはCouchDBを1GB無料枠があるけれど、利用するためにはクレジットカード登録が必要になってしまうというところ。

ここで、Payment Methodを登録しておかないと、Colabのスクリプトは失敗してしまう。

セクション[3]まで完了すると、LiveSyncプラグインへ入力するための情報が表示される。
これが出れば、Colab側の作業は完了。
表示されているURIとPassPhraseは使うので必ずローカルに保存しておく。
そのうえで、画面は閉じずに一旦そのままにして、Obsidianに戻る

ObsidianでLiveSyncプラグインを有効化すると、Setup-URIをすでに保持しているのかを聞かれるので”Yes”を選択する

Colabで指定されたSetup uriを入力する。
これに関してはColab上に”Copy setup uri”というボタンがあるのでそれを押下した値をペーストすればOK

次にPassphraseを入力する。
Colabのセクション[3]を読むとPassPhraseという文言が2つ出てくるのだが、先のキャプチャで書いた、最初に提示されたフレーズを入力する

コンフィグをインポートするか聞かれたので”Yes”を選択した

続いて、この端末をどう扱うかを聞いてくる。
一番上はFly.ioに立てたDB上のデータでローカルを更新するとなっているので、2番目の「initialize new server data」を選択して、サーバーを初期化する形を選ぶ

この設定で進めるかを問われるので、下の選択肢を選択

隠しファイルをどうするかを問われているので、一旦デフォルト設定の”Disable”を選択する。

ちょこちょこ選択肢が出てくるが一旦はデフォルトにしておいてこれで設定は完了。

スマホ側

私が試したのはiOSだが、Obsidianをインストール後、Self-hosted LiveSyncのプラグインを入れて同様に入力。

新規クライアントとして登録する事で無事に同期を取ることが出来た。
いいね。

Deepseekをローカルで

少し前からDeepseekの名前は見かけていましたが、先日の発表から一気に広がりましたね。
というわけで、早速試してみようと思います。

参考にさせていただいたのはこちら

DeepSeek R1をほぼ準備なしからローカルGPUで動かす
https://note.com/cppp_cpchan/n/n3c1039c80dd0

CUDAの確認

私の環境では、CUDAは12.3だった

llama.cppをダウンロードしてくる。
https://github.com/ggerganov/llama.cpp/releases

見る限り、この2つなのだが、ローカルがCUDA 12.3で行けるものなのか。
試してみてから考える

試してみた

common_init_from_params: setting dry_penalty_last_n to ctx_size = 4096
common_init_from_params: warming up the model with an empty run - please wait ... (--no-warmup to disable)
ggml_cuda_compute_forward: ADD failed
CUDA error: the provided PTX was compiled with an unsupported toolchain.
  current device: 0, in function ggml_cuda_compute_forward at D:\a\llama.cpp\llama.cpp\ggml\src\ggml-cuda\ggml-cuda.cu:2230
  err
D:\a\llama.cpp\llama.cpp\ggml\src\ggml-cuda\ggml-cuda.cu:71: CUDA error
sh: ./llama-server.exe: このアプリケーションで、スタック ベースのバッファーのオーバーランが検出されました。このオーバーラン により、悪質なユーザーがこのアプリケーションを制御できるようになる可能性があります。 Error 0xc0000409

実行してみると、エラーとなってしまった。
エラーメッセージからは、「unsupported toolchain」ということで、12.3環境で12.4を動かしたことによるエラーではないかと推察する。

そこでCUDA 12.8(最新)を入れようとするもエラー・・・。

しょうがないので、llamaとバージョンを合わせた12.4を拾ってくる

CUDA Toolkit 12.4 Update 1 Downloads
https://developer.nvidia.com/cuda-12-4-1-download-archive?target_os=Windows&target_arch=x86_64&target_version=11&target_type=exe_local

同じエラーになった。。。

Nsight Coputeというものが原因のようだが、これは使わないっぽいのでカスタムインストールで設定を外してみる

とりあえずインストール出来たっぽい

smiで確認してみると、ちゃんとバージョンが上がっている

さて、実行です。
実行パラメータとしては以下を行っています

./llama-server.exe -m ../DeepSeek-R1-Distill-Qwen-14B-Q6_K.gguf -ngl 26 -b 2048 --temp 0.6

最初、nglの値を49にして実施してみたが、メモリが足りないというエラーとなってしまい、26でやるとエラーにならずに出来た。

このあたりのパラメータの加減は環境ごとに見極める必要がありそう。
言われているURLへアクセスすると

それっぽい画面が出来ている!

早速問い合わせてみたのだが、「Thinking」からかなりの長時間が経過しているが変化ない

GPUのパフォーマンスをタスクマネージャで確認して見ると、「専有GPUメモリ使用量」は張り付いていて、「3D」となっているところはギザギザの波形が出ている。

かなりの時間が経過した後に応答があった。

とりあえず、動くには動いたが、パフォーマンスはというとひどいものである。
パラメータを見直してなんとかなるものかはちょっとわからないが、試してみるだけ試してみようとは思う

NRC Live in Nike Ginzaに参加してきた

NRCのアプリを開くと何やらメッセージが。。。

ご当選のお知らせ。。。ナンだっけ。。。

そういえば年末に、何かしら変化をつけたいと思って応募したんだっけ。。すっかり忘れてました。

いざ銀座へ

集合時間が朝の8時ということで、千葉から行くとなると6時台前半の電車でいかなければいけません。
実際のマラソン大会でも似たような時間ではあるので対応は出来ますが、眠い。

流石に朝7時台の銀座は人が少ないです
銀座に来たの、すごい久しぶり。

この日は写真で見てわかるようにすごいいい天気でした!
サイコー!

Nike Ginzaへ行くと待っている人が。
時間にならないと開けてくれないので、私のように遠方から早めに来ている人は寒い!
でも待つしかありません

1F受付で、ウィダーインゼリーとInプロテインバー、荷物用バッグを受取り、3Fへ移動。
そちらで着替えがある人は着替え、そしてトライアルシューズを借りることが出来ます。

この日のトライアルシューズはペガサスプレミアム!!

ナイキ ペガサス プレミアムがAirでのランニングを一新
https://www.nike.com/jp/a/pegasus-premium-release-info

ペガサスシリーズの最新作。
発売日は1/30ということでこの時点では未発売のものです。
ペガサスは38を使っていた時期はありますが、通常モデルの最新は41。そしてこのプレミアムモデルといろいろとありますね。
そしてお値段は29,700円という事で、高い。。。ぐぬぬ

でも、シューズがかっこいいというのは走るモチベーションとしては大事ではあるんですよね。

セッション

セッションは箱根駅伝も走ったことがあるというコーチの方主導で進みました。

Nike Ginza の3Fでストレッチをしたあとに、みんなで馬場先濠の方へジョギング。
少し開けた場所で、ラダーやミニハードルを使った俊敏性を高めるためのトレーニングを教えてもらいました。

こういうトレーニング。
陸上競技を部活動などで経験している人には当たり前なのかもしれませんが、私にとってはとても新鮮でした。
このあたり、写真を全然取ってなかったんですよね。。。失敗です。

ひとしきりラダーとミニハードルのトレーニングを終えたあとは少し大回りして再びNike Ginzaへ。

みんなで集合写真を取ってセッションとしては終了です
(もちろんその後クールダウンはありましたが)

Nike商品

NRC Live 参加者は当日限定で10%OFFクーポンがもらえたので物色します。
靴は。。かっこいいんですが、先日HYPER SPEEDを買ったばかり。

それにしてもカラフルです。
やっぱりこのNikeのロゴはいいなぁ

走るときのウェアは今欲しいものランキングのかなり上位です。

シンプルでいいなぁと見ているわけですが、ご多分に漏れずお値段もかっこいい感じです。
10%OFFがあるとはいえ、、、
シンプルであるならば、もっと安いものもあるわけで、機能性はもちろん違えど。。。うぐぐ

心の底まで染み付いてしまっている貧乏根性が抜けません。
アウトレットのNike店舗を見て型落ちのモデルを物色しようかな。。

感想

毎回のNRC Liveがこういうメニューなのかはわかりませんが、ただ走るというだけではなく、トレーニングが入っていたのは非常に満足でした。

言ってしまうと走るだけで終わるのであれば、別にこの枠組みである必要はそれほどないですしね。

トライアルさせていただいたペガサスプレミアムの、弾むような感触も非常に面白い経験でした。以前履いていたインヴィンシブルランも楽しかったな、ということを思い出しました。

朝、家にいないのは子どもの世話をするうえで妻に迷惑をかけてしまうので心苦しいのですが、タイミングと機嫌を見ながらまた参加できればと思います。

そして、早速ではあるけれどラダーを買ってしまいました!
ミニハードルは、正直邪魔になりそうなの。。。
今年、頑張っていきます!

トレーニングラダー ラダー

GHB ミニハードル 10個セット

Obsidian使用1週間

Obsidianを仕事でも使い始めて1週間ほどが経過した。

まだ目覚ましい成果というほどのものが出ているわけではないが、デイリーノートを起点として業務をまとめていく形が徐々に作られている気がする。

タグとかそういうものを利用していくと、これまで散らばっていた情報が整理され、集約されていくので生産性が上がっている気がする。

一方で弊害も出始めている。

疲れるのだ。

これまで結構適当に過ごしていたので、何かの情報が抜け落ちていることがよくあった。
特に先週はいろいろなことが連続しておき、かなり頭を使うことを要求される感じだった。
その中で、デイリーノートを中心にやることを書いてあるので、抜け漏れが少なくなったせいでずっと頭を働かせているような感じ。

違う。
そんな真面目なキャラじゃないんだ、私は。

Obsidian。。。恐ろしい子

Fly.io のAppを削除する

Obsidian の Self-hosted LiveSync をFly.ioで作ろうとしたものの、App作成スクリプトの使い方を誤っていたようで、作り直す必要が生じてしまった。

基本的にFly.ioはCLIからの操作になるのだが、削除自体はDashboardからできるようだった

ログインすると、登録されているAppが表示されている。
Obsidian用に1GBのDBが構築されているのがわかる

Appを選択して、左下の「Settings」を選択する

「Delete app」を選択すれば削除ができる。

アプリケーションの削除が設定ページにあるという発送に思いつかず、結構探し回ってしまった。

これで削除が完了して、余計なインスタンスを維持する必要もなくなって安心。安心。

Software Design 2月号

Software Design の2月号が発売されました!

ソフトウェアデザイン 2025年2月号

今月の特集はPython。

ちょこちょこと書いてはいますが、しっかりと勉強したことはなく、なんとなくなのでこれを機会として基本を抑えておきたいところ。

そしてちょっとおもしろかったのは「実践データベースリファクタリング」の連載。
このあたりのテーブル設計に関しては、どの段階でどこまで考慮するのか?
どの段階で見直すのか?は非常に悩ましいところですね。

コードのリファクタリングと異なり、DBのリファクタは正直言って想像したくない作業です。
規模によってはそれこそ現実的には思えないものの、そもそもアプリケーションが目的を達成しないのであれば存在する価値がないわけで、やらなければいけないシーンは出てくるのでしょう。

頭の体操として、こういったケースを考えるのは面白いです。

Obsidian でノート内の未チェックタスクをリストアップする

Obsidianがこれまで愛用していたメモサービスであるdynalistのチームが開発しているという事を知って、非常に驚くとともにうれしくなりました。

徐々にObsidianを使いこなせればと思っています。
業務PCにいれる許可も取れたのでどういう単位でノートを作っていくかや、どういうふうにリンクを作っていくと効果的なのか。
考え始めるとあれこれ出てきそうですが、そのあたりに凝りすぎて肝心の仕事が進まないと手段の目的化になってしまうので注意が必要です。

ひとまず、”案件”というフォルダを作ってその中になんとなくの単位でノートを作り、作業ログ的にメモ書きを走らせています。

メモ書きを走らせていく中で、その中からTODOが生まれたときにはチェックボックスをつけるのですが、ノートが長くなってくるとなんのTODOが残っているのかが分かりづらいです。

そこで、同じノート内で未チェックのものをノート上部に置くようにしてみました

```dataview
TASK
from "案件"
where file.name = this.file.name and !completed
```

使ったPlug-Inは”Dataview”というもの

多少のタイムラグはあるけれど、現在の内容を下にクエリを走らせて表示してくれる。

しかもDataview中のチェックボックスをOn/OffすることができるのでメモからのTODOリストが自然と出来上がる。

いいじゃないか。

もう一度言う

いいじゃないか。

Obsidianの使い方に関しては先人がいっぱいいるので、いろいろなやり方を試して取り入れていければと思う。

Obsidian の デイリーノートに前日の未実施TODOを引き継ぎたい

少しずつ使い始めている Obsidian 。
まだ使いこなしていると言うには程遠いですが。。。

ToDoをいわゆるAsanaやBacklogなどタスク管理ツール、プロジェクト管理ツールで管理している人もいるとは思うのですが、もう少し細かいタスク。
プロジェクトになっていないようなタスクは基本的にこれまではテキストベースで書いていました。

今回、Obsidianを利用するにあたってデイリーノートの仕組みがせっかくあるので有効活用したいところなのですが、デイリーノートは毎回作り直されてしまうので引き継げません。

コピペすればいい話ではありますが、完了済みのタスクもペーストされてしまうので地味に面倒です。

なんとかならないかな?と見ていたら、良さげなプラグインが。

Templaterを導入

コミュニティプラグインからフィルタでTemplaterを探し出してインストールを押下します。

インストールが終わったら忘れずに有効化します。

続いて、有効化したTemplaterプラグインの設定の中から必要なものを有効化します

有効化する設定としては下記となります

Trigger Templater on new file creation
→テンプレートから新規ファイルを作成した際にTemplaterプラグインのルールに従って内容を作り上げます。今回でいうと、前回のTODOを引っ張ってくる処理を動かすわけですね

引き継ぎの実施

引き継ぎ処理の仕様としては、一旦下記とした

  • ”Work In Progress”セクションから”Memo”セクションまでの間が対象範囲
  • その中でチェックが入っていない行を引き継ぐ
  • 毎日必ずしもデイリーノートを作るとは限らないので、1週間分まで遡って最初に見つけたノートを引き継ぐ

テンプレートへの記載内容は下記となる。
セクション名は適宜変更してほしい。

## Work In Progress
<%*
let addRest = 0; // サブテンプレートから差し込むかどうか
for (let i = 1; i <= 7; i++) {
	const yesterday = tp.date.now("YYYY-MM-DD(dd)[.md]", (i*-1), tp.file.title, "YYYY-MM-DD(dd)[.md]"); // 前回の日付のファイル名を生成
	const yesterdayFile = tp.file.find_tfile(yesterday); // 前日のファイルを取得

	if(yesterdayFile){
		const content = await tp.file.include(yesterdayFile); // ファイルの内容を読み込む
		// "## Work In Progress"から"## Memo"までのテキストを抽出するための正規表現
		const wipOld = content.match(/## Work In Progress([\s\S]*?)\n## Memo/);

		if (wipOld && wipOld[1]) {
		    const taskLists = wipOld[1].match(/^(\s*)- \[ \] .*/gm);
		    if (taskLists && taskLists.length > 0) {
			    uncheckedTasks = taskLists.join('\n');
			    tR += uncheckedTasks;
			    addRest = 1;
		    }
		}
		break;
	}
}
if (addRest == 0) {
  // 進捗部分がない場合はサブテンプレートを書き出す
  tR += await tp.file.include("[[daily-todo]]");
}
%>

## Memo

これで、前回未完了分をコピペし直さなくて良くなって満足だ。