July 31, 2023
案件などでお客様の使用しているテキストファイル (CSV, YAML, TXT, etc…) を読み込んでゴニョゴニョする処理を書くときがある。 これらのテキストファイルがどこでどのように作られたかは分からない。
システムの文字コードとファイルの文字コードが異なる場合、ファイル読み込みに失敗する。 また、ファイルが暗号化されていても読み込みに失敗する。
そのため、ファイル読み込み処理は上記のことを考慮して実装する必要がある。 諸々考慮して実装した、ぼくのかんがえたさいきょうのコードが下記。
def load_file(path_to_file): encodings = ["utf-8-sig", "cp932", "shift_jis", "euc-jp", "iso-2022-jp"] for encoding in encodings: try: with open(path_to_file, "r", encoding=encoding) as f: # 何らかの方法でファイル読み込み # yaml の場合 loaded_file = yaml.safe_load(f) # いろいろして、何かを return する return # 指定した encoding で読み込みに失敗したとき except UnicodeDecodeError as e: # 別の encoding を試すために continue で次のループへ進む # 失敗したという情報を残しておいてもいいかもしれない logger.debug(e) continue # その他もろもろ想定され得るエラーを拾う except ... ... # 想定外のエラーを忘れずに拾う except Exception as e: # いろいろ処理したりメッセージ出したり終了させたり .
...
April 30, 2023
はじめに # Ansible の Playbook 開発時、Docker コンテナで動作検証するときがある。 場合によっては systemd を有効にしたコンテナに SSH 接続したいときがある。 更に、その接続を一般ユーザーで行いたいときもある。
sshd を有効にしただけのコンテナには一般ユーザーで SSH 接続できる。
しかし、systemd と sshd を同時に有効化するとコンテナに一般ユーザーで SSH 接続できなくなる。
本記事では上記の問題とその対処法について説明する。
⚠️ 注意 # systemd を有効化するにはコンテナ起動時に --privileged オプションが必要となる。 --privileged オプションを付けて実行すると、コンテナはホストマシンのリソースへの制限がほとんど無くなるため、特別な理由が無い限り systemd の有効化は非推奨。
一般ユーザーで SSH 接続する際に起こる問題 # Docker コンテナにおいて CentOS や RHEL のベースイメージを使用している場合、systemd と sshd を有効にした状態で一般ユーザーで SSH 接続を試みると以下のエラーが発生する。
$ ssh USER@hostname System is booting up. Unprivileged users are not permitted to log in yet. Please come back later.
...
April 29, 2023
はじめに # Ansible の reboot タスクは ansible.builtin.reboot module を用いて以下のように書く。
# playbook.yaml --- - hosts: all gather_facts: false tasks: - name: This is Reboot task ansible.builtin.reboot: 一般的なマシンや VM に対しては上記の記述のみで所望の動作をする。
しかし、Docker コンテナでは Ansible がハングしてしまい次のタスクに進まなくなる。
本記事では Docker コンテナで Ansible の reboot タスクを成功させるための方法を説明する。 必要な設定は以下2ステップである。
Docker の再起動ポリシーを設定する Ansible の reboot タスクの完了判定を設定する 検証環境 # ansible: 7.1.0 Docker version: 23.0.3 Docker の再起動ポリシーを設定する # コンテナ停止時の挙動は 再起動ポリシー を設定することで制御する。 再起動ポリシーの値は4種類ある (表は ここ から拝借)
...
December 16, 2021
この記事は Emacs Advent Calendar 2021 の17日目の記事です.
Emacs は小指を酷使するテキストエディタであり,Emacs ユーザーの小指は逞しくなっていることと思う.この記事ではそんな可哀そうな小指を労るパッケージである meow の概要と設定を紹介する (解説はしない).
概要 # meow は vi/vim に代表される modal editing を提供するパッケージ. modal editing とは, Normal Mode や Insert Mode のような移動や編集に特化したモードを切り替えながら編集すること. hjkl による移動, s で1行カット, p でペースト, A で下に1行追加など,移動・編集のための1ストロークのコマンドが複数ある SPC を prefix とするコマンドの実行が可能になっている.例えば C-x C-f なら SPC x f キーバインドのテンプレートとして QWERTY やその他のキー配列に合わせたものが予め用意されている Emacs 由来のキーバインドと conflict しない設計になっており, meow 使用中でも入力専用の INSERT なら普段通り Emacs を使うこともできる 移動や範囲選択を少し楽にしたいという用途としては手軽に導入できて良い 最も有名な関連パッケージとして evil があるが,それと比べて faster & simple god-modeも1ストロークのコマンド実行を可能にするが, meow はそれに加えて便利なテキスト編集機能を備える 基本的には 1ストロークのコマンド実行専用の NORMAL モードと,入力専用の INSERT モードを行き来する 便利な編集機能は こちらで解説されている 設定 # leaf.
...
December 14, 2021
この記事は Emacs Advent Calendar 2021 の15日目の記事です.
はじめに # この記事では以下の画像のような title-bar と mode-line のカスタマイズ方法を紹介する.
Title bar のカスタマイズ # この項目でやっていることは以下の記事とほとんど同じ
emacsのタイトルバーに時計とファイル名を表示 時刻表示するための設定は以下のとおり.
;; This shoud be set before exec `display-time`. (setq display-time-string-forms '((format "%s %s %s" dayname monthname day) (format " %s:%s" 24-hours minutes)) frame-title-format '(" - " display-time-string " - ")) (display-time) ポイントは display-time-string-forms に書式を設定してから (display-time) を実行しているところ.この順番を守らないと display-time-string-forms の default 値が使われてしまう (と こちらの記事に書いてあった).
title-bar をカスタマイズするためには frame-title-format をいじる. frame-title-format のより詳しい説明については Emacs Wiki を参照されたい.
...
December 13, 2021
この記事は Emacs Advent Calendar 2021 の14日目の記事です.
はじめに # Emacs を始めたての頃はパッケージ導入の際の設定は理解しないままネットからコピペすることが多いと思う.この記事では,パッケージ導入から自分に適した設定までの一連の動作を一人で行えるようになることに重点を置く.
タイトルにあるバブちゃんとは,Emacs の基本的な操作に慣れ始めて,コピペを駆使すればパッケージ導入を行うことができるようになった人を指す.いわばハイハイができるようになった状態である.この記事では,そんなバブちゃんが Emacs 内での二足歩行を会得する際の助けになるような情報提供を目指す.
記事の前半では便利な tips やパッケージの紹介を行い,後半では前半に紹介した内容を活用してパッケージの設定を行った実例を紹介する.
想定読者 # 息をするように C-b, C-f, C-n, C-p などの移動ができる C-c, M-x などの基本的な表記を理解している 以下の記事で解説されている内容が5割くらい理解できていれば (たぶん) 大丈夫 https://qiita.com/eggc/items/8722d8883ebf1d9446da この記事で扱わないこと # elisp 全般 パッケージの導入方法 setq や custom-set-variables 等を用いた変数の設定方法 tips # ここではパッケージ導入とその設定を行う際に知っておくと役に立つ built-in 機能を紹介する.
パッケージ検索 # M-x list-packages でインストール可能なパッケージ一覧を見ることができる.(package-archives の設定が済んでいる前提)
このバッファ内で iserch 等の検索をかければ気になるパッケージに出会える可能性がある.パッケージをクリックまたは RET すればパッケージの説明と,github上で管理されていればそのリンクを見ることができる.
パッケージの説明はパッケージファイルの冒頭に書かれている # 多くの場合,パッケージファイルの冒頭にパッケージの説明が書かれている.親切なパッケージでは推奨設定が記載されていることもある.
...
August 5, 2021
ゴールは native compilation 機能を備えた Emacs,通称 Gcc Emacs を使えるようにすること.Gcc Emacs に関してはこちらの素晴らしい記事を参照されたい.
ネイティブコンパイルEmacsの登場 ビルドは Emacs Wiki の Gcc Emacs のページをよく読めばいいが,OS 毎の成功事例は多いに越したことはないと思うので,Ubuntu 18.04.5 におけるビルド手順をまとめておく.
tl;dr # 実行手順は以下のとおり
ビルドに必要なパッケージを入れる
ビルド
$ git clone --single-branch --depth=1 https://github.com/emacs-mirror/emacs.git $ cd emacs/ $ ./autogen.sh $ ./configure --with-json --with-modules --with-harfbuzz --with-compress-install \ --with-threads --with-included-regex --with-zlib --with-cairo \ --without-rsvg --without-sound --without-toolkit-scroll-bars \ --without-gpm --without-dbus --without-pop \ --without-mailutils --without-gsettings --without-x \ --with-native-compilation \ --prefix=$HOME/src/emacs-builds/ $ make -j(nproc) $ make install 環境 # Ubuntu 18.
...
July 31, 2021
tl;dr # lsp-mode と corfu をデフォルト設定のまま同時に使うと, corfu と company-mode の補完窓が同時に出てきてしまい,後者にカーソルが奪われる 原因は lsp-mode 内部で company-mode が起動されるから これを阻止するためには lsp-completion-provider に :none を指定すれば良い 環境 # macOS Big Sur 11.4 (intel) Emacs 28.0.50 corfu.el ver. 0.10 lsp-mode ver. 7.1.0 背景 # corfu は company-mode のように補完機能を強化してくれるパッケージ.Emacs が備える補完機構 (dabbrev-completion や Capfs (completion-at-point-functions)) に準拠しており,補完 UI を提供するのみというミニマルな設計思想であるため,リッチな機能を備える company-mode と比べて軽量で高速.
corfu.el company-mode lsp-mode は language server から情報を拾ってきてくれるパッケージ.python を例に挙げると, numpy をインポートするとその内部の情報を拾ってきてくれる.その情報を補完機構に渡すことで,補完候補にいい感じにメソッドなどが現れてくれる.
...
July 26, 2021
2021/07 現在における google-translate.el の設定と使い方をまとめる.
環境 # macOS 11.4 Emacs 28.0.50 google-translate.el ver. 0.12.0 設定 # 以下に leaf.el を用いた設定を示す. leaf.el については こちらの記事 を参照されたい.
(leaf google-translate :ensure t :require t :bind ("C-c t" . google-translate-smooth-translate) :custom (google-translate-translation-directions-alist . '(("en" . "ja") ("ja" . "en"))) :config (defun google-translate--search-tkk () "Search TKK." (list 430675 2721866130))) ポイントは require と defun の2箇所.これらを追加しないと翻訳実行時に Search failed: ",tkk:'" と怒られる.公式に依ると google-translate-backend-method に curl か wget を指定してみてくれと 書いてある が,私の環境ではエラー解消に寄与しなかった.その他の backend も設定できるようだが,調査が面倒だったので こちら の issue を参考に設定した.
...
July 19, 2021
level-3 # latex test
\(a = \sum^n_i x_i\) \(a = \frac{b}{c}\) \begin{align*} a &= \sum^n_i x_i \\\
a &= \frac{b}{c} \end{align*}
level-4 # code block
import numpy as np a = np.arange(10) b = a.reshape([-1, 2])