snapが怪しい…

イメージ
メインマシンの Ubuntu26.04が固まる 通常のUpdateを行なって、再起動が必要というので再起動を実施。 gdmのログイン画面は表示される ユーザ選択 パスワード入力 デスクトップに切り替わる途中で固まる マウスは動作せず キーボードは反応する あれ?タイミングの問題かな?と思い再度実施するが、改善はしない。 どうやら最後のUpdateが問題っぽい。 ということで、GRUBメニューからSafe Mode(Netoworkあり+root)で起動する 記憶では、Linux-Kernel関係が7.0.0-29に上がっていた表示を見ているので、前の7.0.0-28に戻す。 改善せず ちなみにメインマシンの環境は Ubuntu26.04(64GB) + GeForce3060(8GB) + デュアルディスプレイ SSD(1TB+2TB) , HDD(4TB)という構成 一応、sshでの接続はできるので、MacBookからリモートでこの状況のログを確認しながら作業する。 ログを渡してGeminiに確認するが、nvidiaのドライバと、kernel7.0.0-29の問題と指摘される。 まぁ過去にもアップデート後にドライバ入れ直すことは多々あったので、またかぁ…という感じ。 そこで、open版に入れ直したり、バージョン変えたり…。 どれもだめ。 結局3時間ほど粘ったが改善せず。

sed:改行含む文字列への置換

少し苦戦した…

すでにコンテンツのあるサイトのドメイン移転とサーバ変更、管理の委託を依頼されて作業を行う。
  1. ドメイン移管
  2. サーバの変更
  3. コンテンツの設置
  4. メールアカウントの設定
以上は、問題なく完了。

さて、あとはコンテンツの修正。

アクセス解析にGoogle Analyticsを利用するのだけれど、これまでの業者さんは未設置。
そこで、各ページに仕込む必要があるけれど、いちいち修正するのはさすがに面倒。
なにせ30ページ程のhtmlが2つもある。

こんな時は、sedの登場ですな。

まずは、jsフォルダを作成。
以下のような内容のg_ana.jsを作成。まぁ、ここまでは、Google Analyticsの吐き出すコードをほんの少し変更するだけでOK
 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-xxxxxxxxx', 'auto');

  ga('send', 'pageview');

でもって、こいつを読み込むように各htmlに書き込む。

とりあえず、</head>の前に設置すれば良いので、
<script type="text/javascript" src="js/g_ana.js"></script></head>
に置換をかければ良いわけだ。

sedで処理する

60回以上も「ファイルを開く」→「編集(貼付けるだけなんだけど)」→「保存」なんてやってられない。

$ sed s#</head>#<script type="text/javascript" src="js/g_ana.js"></script></head># ./index.html | less

で確認してみる。
とりあえず、OKなのを確認。

まあ、これで何も問題はないのだけれど、ソースを見た時に</head>の位置が気持ち悪い。(美しくない)

<script type="text/javascript" src="js/g_ana.js"></script>
</head>

こうなっていて欲しい。</script>と</head>の間に改行を入れたいちゅうわけだ。
こんなもの、\nを含めて置換すりゃ一発と思ったのだけれど、これが上手くいかない。

$ sed s#</head>#<script type="text/javascript" src="js/g_ana.js"></script>\n</head>#

結果を見ると、</script>n</head> 改行されない。しかも\n→n になってるだけやんか…。

試行錯誤を、繰り返す。
繰り返す
繰り返す×10…

苦戦したわ。
最終的には、以下の用に記述すればOKだった。
$ sed 's#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'\\$'\n''</head>#'

置換文字列は、A+改行+Bの構成になっている。
置換したい文字列に"(ダブルクォート)が含まれているので、基本的には’(シングルクォート)で囲んでいる。

A='s#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'
改行=\\$'\n\
B='</head>#'

という形でOK。

最後に罠が…

これでOKだろうと思ったが、実際に書きだす前に最終確認。

$ sed 's#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'\\$'\n''</head>#' *.html

index.htmlは問題なく置換したが、途中でERRORを吐いた。
sed: RE error: illegal byte sequence
なぬ?
よく調べてみると、文字コードがUTF-8だけでなく、EUC-JPで書かれたコンテンツが混ざっている。

こらこら。
文字コードまで変換するのは、もっと面倒。なので、そのまま置換したい。

先頭におまじないを付けてやることで回避した。

LC_ALL=C sed 's#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'\\$'\n''</head>#' *.html

これで、文字コードが混在していてもOK。

最終的には、以下のコードを実行。

LC_ALL=C sed -i.bak 's#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'\\$'\n''</head>#' *.html

-i.bakオプションで、元のhtmlをhtml.bakにして保存する。

まあ、当然コピーで作業しているから、不要なんだけど、あとですぐdiffしたいし、ミスがあったら書き戻せるようにしておきたいからね。

ちゅうことで、60回以上エディタで書き換える作業をすること無く、終了。

時間的には、少し短いくらいかもしれないけど、精神衛生上極めて気持ちがいい。
改行1つに拘らなければ、1分で作業完了だったけど…(笑)






コメント

このブログの人気の投稿

MEGAにも弱点があった?

Ubuntu24.04 でGUIが死んだ

VirtualBoxでUSBを使う方法が分かった!