ブログをダークモード風に表示する

ブログをダークモード風に表示するようにした。
設定内容は下記 cssの設定はデザインCSSから行える。(遷移順序は下記)
・管理者画面 → デザイン → カスタマイズ(スパナのアイコン) → デザインCSS(高度な設定)

@media (prefers-color-scheme: dark) {
  body {
    background-color: #121212;
    color: #e0e0e0;
  }
  
  a {
    color: #80cbc4;
  }
  
  header, footer {
    background-color: #1e1e1e;
  }
  
  .entry {
    background: #000;
    border: 1px solid #484848;
  }
  
  .page-archive .archive-entry{
    background: #000;
    border: 1px solid #484848;
  }
  
  .categories a {
    background: #434343;
  }
  
  .comment-box {
    border-top: 1px solid #8c8c8c;
  }
  
  .comment-box .leave-comment-title {
    background: #353535;
    border: 1px solid #fff;
  }
  
  .pager a {
    background: #5d5d5d;
    color: #e0e0e0;
  }
}

横幅の設定は参考のリンクの設定を使わせてもらったのでリンクを参照。


参考
はてなブログの公式テーマ「Smooth」の横幅可変で広げる - ナウいエンジニヤー


armadilloA9Eで環境構築時の備忘

armadilloA9Eを使う機会があり、Armadillo Base OSで環境構築したときの備忘。
armadilloにインストールするファイルを作成手順で用意されているapp.confはデフォルトでは/var/app/rollback/volumes/プロジェクト名をvol_app、/var/app/volumes/プロジェクト名をvol_dataでマウントしている。
vol_appがスクリプトの実行用フォルダ、vol_dataがログなどのデータ用フォルダとして用意されている。
vol_appにある実行ファイルはarmadilloの電源OFFや再起動するとインストールしたイメージで上書きされてしまう。
再起動時はvol_appに置くスクリプトが実行される。
スクリプトを更新したい場合はarmadilloに更新したインストールファイルをインストールする必要がある。
armadilloの設置場所が遠方にあるなどで気軽に手元に戻せず、リモートで更新できるようにしたいこともあり以下の設定を行った。

・app.confにマウント設定を追加する
 →vol_appやvol_dataのように/var/app/volumesをvol_scriptなどとしてマウントする
 →/var/app/rollback/volumesでも再起動時に消えないようだったので良いかもしれないが、rollbackが付いてない方が適していると思う

・vol_scriptに更新を反映するスクリプトを置く
 →armadillo用のインストールファイルをインストールする際に置いておけば再起動などがあっても消えずに残る
 →git pullするファイル(cron設定用ファイルなど)やpipインストールなどを実施するスクリプトを用意しておく
 →vol_appのentrypoint.shに上記を参照するようにしておけば再起動後も反映し直してくれる(下記が一例)

# 特定のフォルダにあるshファイルを実行する
# /vol_script/scriptにshファイルを置いておけばarmadillo再起動時に参照して実行してくれる
shopt -s nullglob
for script in /vol_script/script/*.sh; do
   bash "$script"
done


参考
Armadillo Base OS:アプリケーションの作り方 | Armadilloサイト

Armadillo Base OSでのコンテナの使い方 | Armadilloサイト


base64URLのデコードとpythonの余りの計算

base64URLをデコードする機会があり、やり方を検索したときにパディングの追加部分の計算がよくわからなかったので調べた。

# base64URLをデコードするときは4の倍数になるように'='を足す必要がある
def add_padding(base64_str):
    return base64_str + '=' * (-len(base64_str) % 4)

# デコード
decode_payload=base64.urlsafe_b64decode(add_padding(payload_jwt))


「'=' * (-len(base64_str) % 4)」について

文字数を4の倍数にするのに必要な'='の数を計算している。

# 「-len(base64_str) % 4」のlen(base64_str)を21だとすると
-21 % 4 = 3

# 21文字に対して3文字足せば24文字で4の倍数になる

このように計算されるのはpythonの%(剰余演算子)は「x == (x // y) * y + (x % y)」を満たすように定義されているから。(下記引用元リンク)

切り捨て除算演算と剰余演算は、恒等式: x == (x//y)*y + (x%y) の関係にあります。切り捨て除算や剰余はまた、組み込み関数 divmod(): divmod(x, y) == (x//y, x%y) とも関係しています。

-21 % 4を上記式に当てはめると次のようになる

# x = -21、y = 4とする
x // y = -6 (-5.25を小さい方に丸める)

# x == (x // y) * y + (x % y)に当てはめる
-21 = -6 * 4 + (x % y)
(x % y) = 24 -21 = 3

参考
6. 式 (expression) — Python 3.13.5 ドキュメント
Python で、負の数を使った剰余算について - スタック・オーバーフロー
小山工業高等専門学校 教育研究技術支援部 技術室 - 初心者向け Python講座 第2回


LeetCode「58. Length of Last Word」を解く(Python3)

はじめに

ITエンジニアの採用においてコーディングテストを行う場合があることを知り、LeetCodeという学習サイトで数問解いてみたところeasyの問題でも難しかった。
ITエンジニアとして働いている身として、アルゴリズムを勉強した方が良いなと感じたのでLeetCodeの問題を通して学習を行う。

問題の選び方

LeetCodeでは難易度などのカテゴリー別に問題があるが、どの問題を解くべきかわからなかった。 軽く調べてみたところ先駆者がおすすめの問題をピックアップしてくれていたのでありがたく使わせてもらいます。
・ピックアップ
 60 questions to solve - LeetCode
 Blind 75 Must Do Leetcode - LeetCode
 Top 100 Liked - Study Plan - LeetCode

問題

58. Length of Last Word
単語と空白でできた文字列sが入力される。末尾の単語の長さを返す。

解答

    def lengthOfLastWord(self, s: str) -> int:
        # strip()で文字列前後の空白を削除
        # "   fly me   to   the moon  "なら"fly me   to   the moon"になる
        # split()で空白で区切る(区切り文字を指定しなければ空白で区切る)
        answer = s.strip().split()

        # 文字列が空になるなら0を返す
        if not answer:
            return 0

        # -1で末尾の要素を指定
        return len(answer[-1])


LeetCode「88. Merge Sorted Array」を解く(Python3)(Follow up)

はじめに

ITエンジニアの採用においてコーディングテストを行う場合があることを知り、LeetCodeという学習サイトで数問解いてみたところeasyの問題でも難しかった。
ITエンジニアとして働いている身として、アルゴリズムを勉強した方が良いなと感じたのでLeetCodeの問題を通して学習を行う。

問題の選び方

LeetCodeでは難易度などのカテゴリー別に問題があるが、どの問題を解くべきかわからなかった。 軽く調べてみたところ先駆者がおすすめの問題をピックアップしてくれていたのでありがたく使わせてもらいます。
・ピックアップ
 60 questions to solve - LeetCode
 Blind 75 Must Do Leetcode - LeetCode
 Top 100 Liked - Study Plan - LeetCode

問題

88. Merge Sorted Array
non-decreasing orderでソート済みの配列nums1,nums2とそれぞれの要素数を表すm,nが与えられる。
mはマージ対象となる要素を示していて、nums1はm+nの長さを持っており、m以降の要素には0が入っている。この0はマージ対象外として扱う。
nums1とnums2をnon-decreasing orderでソートされた配列としてマージする。
結果はnums1に入れるようにする。
こちらのFollow up版

解答

    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        
        # nums1,nums2の最後の要素の位置をi,jとする
        # nums1の長さはm + nなのでiは配列としての末尾ではない)
        i = m - 1
        j = n - 1
        # nums1の末尾の位置をkとする
        k = m + n - 1
        
        # 配列の後ろからループしていく
        # 大きい方の値をnums1の末尾(k)に入れていく
        # nums1,nums2は入力時点でソート済みなので一番大きい順に入れていくことになる
        while j >= 0:
            if i >= 0 and nums1[i] > nums2[j]:
                nums1[k] = nums1[i]
                i -= 1
            else:
                nums1[k] = nums2[j]
                j -= 1
            k -= 1

・参考
 Merge Sorted Array - LeetCode

 Merge Sorted Array - LeetCode

フォルダにファイルコピーなどをしようとしたらpermission deniedで編集できなかった時のメモ

開発中にファイルやフォルダを触ろうとしたらpermission deniedなどと出てできないことがあった。
対象のフォルダなどの権限と操作しているユーザーが合わないことが原因だった。

# ls -alで権限を確認
$ ls -al
total 68
drwxr-xr-x 5 asam asam  4096 Apr 21  2024 WorkDirectory
drwxr-xr-x 6 root root     4096 Aug  8  2021 HogeFolder
-rw-r--r-- 1  asam asam    220 Aug  8  2021 hoge1.txt
-rw-r--r-- 1  root root     3771 Aug  8  2021 hoge2.txt

# 対象のフォルダがroot権限なのでasamに変更する
sudo chown -R asam:asam HogeFolder

2025/04/24追記
VScodeでgit cloneしたリポジトリのフォルダを開いたときに「Manage Unsafe Repositories」と出ることがあったが、これも権限の問題だった。
前述のコマンドで権限を確認して実行ユーザーを合わせれば良い。(参考)

参考

第11章 ファイルシステムの権限の管理 | Red Hat Product Documentation
Linux ファイルのアクセス権について