ほぼ老人のプログラミング日記

定年後の平凡なサラリーマンの趣味の日記

色々と停滞気味

だいぶ良くなってきてはいるのですが、ゴールデンウィークに入って 3 日目あたりから体調を崩してしまって (寝込むほどではないのですが)、病院にも行ってきたのですが特に悪いところもないらしく、個人的には季節の変わり目とか加齢によるところもあるのかなぁなどと思っています。

徐々に元に戻ってきているようなのでしばらくは様子を見てみようと思っています。

さて、体調がイマイチのこともあって、プログラミングはしばらくやっていないのですが、本の整理をしていて買ったまま読んでいないプログラミング関係の本を何冊か見つけたので、とりあえず下記の2冊を読みました。

上の 2 つのリンクは実際に僕が読んだ版のものですが、現在は新しい版のものが出でいます。

何にしろ「今さら感」の強い本ですが、「買ったからには、とりあえず読んどくか」位の勢いで読みました。

何か「勉強になった」とかは特にないのですが、「CSS3 スタンダード・デザインガイド」の方はこれまでぼんやりと使っていたセレクタの整理ができたのが良かったです。

HTML5ガイドブック」の方は、HTML5 が昨年廃止されたこともあり「今更読んでもなー」と思いましたが、大きく異なっていることもないだろうというで読みましたが、企業の業務システムを開発している僕には「仕事では、あんまり使わないかなぁ」って感じで、趣味では Canvas や Drag & Drop, Web Socket あたりは使ってみたい気がしています。

読書の話題を始めてしまったので、ついでに現在読んでいるプログラミング関係の本です。

Amazon でセールやってて安かった (Kindle 版が ¥499) だったので、とりあえず買ったものです。今見ると、結構高いんですね。

JavaScript は仕事でもよく使うのですが、UI を補完する程度なので都度ネットで検索して対応していたのですが、やはり一度しっかり勉強しようと思い読み始めました。 まだ、読み始めたばかりなのですが、NaN や Infinity, undefined の意味やセミコロンの挿入ルール等、「こんな仕様だったのか!!」とやはりちゃんと勉強しておく必要 (使う、使わないは別として) をヒシと感じています。

Debian に Python の実行環境を作成する

この記事

tiger62shin.hatenablog.com

で書いた「Excel ファイル→テキストファイル出力」ツールは Linux (Debian) で動かすので、自宅サーバー (未公開) に Python の実行環境を作成します。

LinuxPython の実行環境を作成する手順は多くの方々により公開されていますので、この記事はほぼ私のメモ書きです。

Python の実行環境を作成する方法は様々あると思いますが、ライブラリのバージョン等の依存関係をあまり気にしたくないので Miniconda を使って構築します。

Miniconda のインストール

インストーラーのダウンロード

オフィシャルサイトから、Python3.9 の最新インストール用shファイル (Miniconda3-py39_4.11.0-Linux-x86_64.sh) をダウンロード

user@server:~$ wget https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-Linux-x86_64.sh
--2022-05-09 21:08:01--  https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-Linux-x86_64.sh
repo.anaconda.com (repo.anaconda.com) をDNSに問いあわせています... 104.16.131.3, 104.16.130.3, 2606:4700::6810:8203, ...
repo.anaconda.com (repo.anaconda.com)|104.16.131.3|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 75660608 (72M) [application/x-sh]
`Miniconda3-py39_4.11.0-Linux-x86_64.sh' に保存中

Miniconda3-py39_4.11.0-Linux-x8 100%[=======================================================>]  72.16M  6.22MB/s 時間 9.3s     

2022-05-09 21:08:11 (7.72 MB/s) - `Miniconda3-py39_4.11.0-Linux-x86_64.sh' へ保存完了 [75660608/75660608]

インストーラーの実行

  1. Miniconda3-py37_4.11.0-Linux-x86_64.sh を実行

     user@server:~$ bash Miniconda3-py39_4.11.0-Linux-x86_64.sh
    
     Welcome to Miniconda3 py39_4.11.0
    
     In order to continue the installation process, please review the license
     agreement.
     Please, press ENTER to continue
     >>>
    
  2. "Please, press ENTER to continue" に対し、[Enter] キーを入力して処理を継続する
  3. "End User License Agreement - Miniconda" が表示されるので、全部読んで "yes" と入力して [Enter] キーを入力

     Do you accept the license terms? [yes|no]
     [no] >>> yes
    
  4. インストール確認メッセージが表示されるので [Enter] キーを入力してインストールを実行する

     Miniconda3 will now be installed into this location:
     /home/user/miniconda3
    
       - Press ENTER to confirm the location
       - Press CTRL-C to abort the installation
       - Or specify a different location below
    
     [/home/user/miniconda3] >>>
    
  5. インストールが実行される

     PREFIX=/home/user/miniconda3
     Unpacking payload ...
    
    
     Preparing transaction: done
     Executing transaction: done
     installation finished.
    
  6. "conda init" を実行するかどうか問い合わせがある。"yes" でも "no" でもよいと思うが、自分で初期設定を行うつもりなので "no" とした

     Do you wish the installer to initialize Miniconda3
     by running conda init? [yes|no]
     [no] >>> no
    
  7. インストール完了

     You have chosen to not have conda modify your shell scripts at all.
     To activate conda's base environment in your current shell session:
    
     eval "$(/home/user/miniconda3/bin/conda shell.YOUR_SHELL_NAME hook)" 
    
     To install conda's shell functions for easier access, first activate, then:
    
     conda init
    
     If you'd prefer that conda's base environment not be activated on startup, 
        set the auto_activate_base parameter to false: 
    
     conda config --set auto_activate_base false
    
     Thank you for installing Miniconda3!
    

.bashrc の編集

~/.bashjrc に下記を追加

. ~/miniconda3/etc/profile.d/conda.sh

変更内容を適用する

. ./.bashrc

conda コマンドが実行できるか確認

user@server:~$ conda --version
conda 4.11.0

これで、base の環境は使えるようになっているはず

  1. conda 環境をアクティブにする

     user@server:~$ conda activate
     (base) user@server:~$
    
  2. Python のバージョン確認

     (base) user@server:~$ python --version
     Python 3.9.7
    

自作ツールの実行環境を作成

base の環境をそのまま使おうとも思ったが、学習の意味もかねてツール実行用の仮想環境を作成することにした。
なお、Python は開発環境と同じ 3.9 系とした

user@server:~$ conda create -n tools python=3.9

conda 環境に切り替えてみる

user@server:~$ conda activate tools
(tools) user@server:~$

Python のバージョン確認

(tools) user@server:~$ python --version
Python 3.9.12

仮想環境から抜ける

(tools) user@server:~$ conda deactivate
user@server:~$

パッケージのインストール

今回は「Excel ファイル→テキストファイル出力」ツールの実行環境を作成することが目的なので、openpyxl と jinja2 をインストール

user@server:~$ conda activate tools
(tools) user@server:~$ conda install openpyxl
(tools) user@server:~$ conda install jinja2

確認

(tools) user@server:~$ conda list
# packages in environment at /home/tiger/miniconda3/envs/tools:
#
# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                        main  
_openmp_mutex             4.5                       1_gnu  
ca-certificates           2022.4.26            h06a4308_0  
certifi                   2021.10.8        py39h06a4308_2  
et_xmlfile                1.1.0            py39h06a4308_0  
jinja2                    3.0.3              pyhd3eb1b0_0  
ld_impl_linux-64          2.35.1               h7274673_9  
libffi                    3.3                  he6710b0_2  
libgcc-ng                 9.3.0               h5101ec6_17  
libgomp                   9.3.0               h5101ec6_17  
libstdcxx-ng              9.3.0               hd4cf53a_17  
markupsafe                2.0.1            py39h27cfd23_0  
ncurses                   6.3                  h7f8727e_2  
openpyxl                  3.0.9              pyhd3eb1b0_0  
openssl                   1.1.1n               h7f8727e_0  
pip                       21.2.4           py39h06a4308_0  
python                    3.9.12               h12debd9_0  
readline                  8.1.2                h7f8727e_1  
setuptools                61.2.0           py39h06a4308_0  
sqlite                    3.38.3               hc218d9a_0  
tk                        8.6.11               h1ccaba5_1  
tzdata                    2022a                hda174b7_0  
wheel                     0.37.1             pyhd3eb1b0_0  
xz                        5.2.5                h7f8727e_1  
zlib                      1.2.12               h7f8727e_2  

動作確認

user@server:~/work$ python excel_to_formatted_text.py --excelfile=personal_infomation.xlsx --sheetname=personal_infomation --outputfile={住所1}/{氏名}.txt --templatefile=sample_template.txt
Excel file : personal_infomation.xlsx
Sheet name : personal_infomation
Output file format : {住所1}/{氏名}.txt
Output file encoding : utf8
Output file lineterminator : lf
Template file : sample_template.txt
Template file encoding : utf8
Start row : 1
Start column : 1
Blank skip column : None
連番
氏名
電話番号
メールアドレス
郵便番号
住所1
住所2
/home/user/temp/福岡県/内村佳祐.txt is modified.
/home/user/temp/福岡県/三輪順一.txt is modified.
/home/user/temp/福岡県/正木重樹.txt is modified.
/home/user/temp/福岡県/近藤正次郎.txt is modified.
/home/user/temp/福岡県/中岡治雄.txt is modified.
/home/user/temp/福岡県/川島知里.txt is modified.
/home/user/temp/福岡県/松元夏音.txt is modified.
/home/user/temp/福岡県/横川昌信.txt is modified.
/home/user/temp/福岡県/野中忠広.txt is modified.
/home/user/temp/福岡県/神保和奏.txt is modified.

大丈夫そうですが、ちょっと確認してみます。

user@server:~/work$ ls -l 福岡県
合計 40
-rw-r--r-- 1 tiger tiger 136  5月  9 21:33 横川昌信.txt
-rw-r--r-- 1 tiger tiger 142  5月  9 21:33 近藤正次郎.txt
-rw-r--r-- 1 tiger tiger 122  5月  9 21:33 三輪順一.txt
-rw-r--r-- 1 tiger tiger 121  5月  9 21:33 松元夏音.txt
-rw-r--r-- 1 tiger tiger 117  5月  9 21:33 神保和奏.txt
-rw-r--r-- 1 tiger tiger 124  5月  9 21:33 正木重樹.txt
-rw-r--r-- 1 tiger tiger 136  5月  9 21:33 川島知里.txt
-rw-r--r-- 1 tiger tiger 137  5月  9 21:33 中岡治雄.txt
-rw-r--r-- 1 tiger tiger 118  5月  9 21:33 内村佳祐.txt
-rw-r--r-- 1 tiger tiger 110  5月  9 21:33 野中忠広.txt
user@server:~/work$ cat 福岡県/横川昌信.txt 
氏名 : 横川昌信
電話番号 : 0927830160
郵便番号 : 822-0146
住所 : 福岡県宮若市黒丸3-1-10プレシャス黒丸310

以上です。

Excel ファイルの行をテキストファイル出力

Excel ファイルの 1 行を 1 つの書式化されたテキストファイルに出力するツールを作成しました。 Excel の行から 1 枚の情報カードを作るようなイメージです。

さて、これを何に使っているかと言うと、作成したテキストファイルを iPhone の GoodReader というアプリに取り込んで備忘録のようにして使っています。

※ このサンプルで使用したデータは、下記のサイトで生成した疑似個人情報です。 hogehoge.tk


ソースコードと使い方は GitHub をご覧ください。

github.com

Python でイメージの回転と切り抜き

最近、本の整理をはじめました。大した量は持っていませんが、2LDK の賃貸マンションで置く場所がないので定期的に整理しています。
整理の方法としては、ブックオフに持っていって売ってしまうのが簡単なのですが、ハンコが押してあったり、技術書が多かったりしてなかなか売りづらいものがあるので、可能なものはスキャンして PDF にして保存するようにしています。
ただ、専用のドキュメントスキャナのような気の利いたものは持っていないので複合機の ASF を利用してちまちまとスキャンしています。
ちなみにこれです。

cweb.canon.jp

スキャン自体は時間をかければできるので問題ないのですが、ブルーバックス等の小さめの本だとスキャンサイズが設定できないため大きめの用紙サイズを指定してスキャンした後に切り抜くようなことをする必要があります。真っ直ぐにスキャンできていれば適当なユーティリティを探してくれば良いと思うのですが、下の図のように傾いてスキャンされてしまっているものが多く、傾きを直してから切り抜く必要があります。

すこし、フリーソフトウェアを探して見たのですが、良さそうなのが簡単に見つからなかったので Python で作ることにしました。
Python 画像 回転」とかで Google で検索すると Pillow というものを使うと回転や切り抜きができそうでしたので試してみました。

from PIL import Image

with Image.open('./image_cropping/input/IMG01_0015.jpg') as im:
    rotated = im.rotate(-2, resample=Image.Resampling.BICUBIC, expand=1)

    cropped = rotated.crop((100, 235, 1850, 3057))
    cropped.save('./image_cropping/output/IMG01_0015.jpg')
  • 回転してから切り抜く
  • rotate メソッドに expand=1 を指定して画像全体を残すようにした

バッチリです。

jinja2 で日本語の変数名

思うところがあって、jinja2 で日本語の変数名が使えるかどうか確認してみた。 jinja.palletsprojects.com

from jinja2 import Template


form = '''
氏名 : {{ 氏名 }}
電話番号 : {{ 電話番号 }}
郵便番号 : {{ 郵便番号 }}
住所 : {{ 住所 }}
'''

template = Template(form)
data = {
    '氏名': '長井英雄',
    '電話番号': '0934297964',
    '郵便番号': '811-3425',
    '住所': '福岡県大牟田市三池3-15-1',
}

print(template.render(data))
  • このサンプルで使用したデータは、下記のサイトで生成した疑似個人情報です。 hogehoge.tk

実行してみます。

氏名 : 長井英雄
電話番号 : 0934297964
郵便番号 : 811-3425
住所 : 福岡県大牟田市三池3-15-1

問題なさそうです。

定年退職しました

先日、定年退職しました (3月生まれです) が、定年後再雇用で嘱託社員として働いているので、生活の上では何の変化もありません。
業務も定年前後で同じプロジェクトなので変化は皆無です。変わったことといえば給料が少なくなったくらいです(定年前の 70% 位)。

生活や仕事上の変化がないことはわかっていたことなので、その事については何の感想もないのですが、「定年退職」という区切りがついたことで気持ちの上の変化というか何らかの感情が湧いてくるんじゃないかと思っていたのですが、何の感情も湧いてきませんでした。

aboutページにも書いていますが、私の職業はプログラマーです。定年退職後も現役プログラマーを続けているのもなかなか珍しいのではないかと思っていますが、世の中どんなもんなもんでしょうか?

私もある時期、管理職やプロジェクト・マネージャーのような「プログラミングをしない人」を目指したこともあったのですが、どうにも性に合わないのと、やはりプログラミングの方が好きだっので、いつしか「一生、現役プログラマー」を目指すようになり、結果今でも会社勤めをしていますが職種はプログラマーとして生計を立てています。

今のところ65歳までは働くつもりではいますが、技術的な面より体力的な衰えをひしひしと感じています。特にコロナ禍になってテレワークが中心になってあまり体を動かさなくなったのも原因の一つとは思います。

スキルアップもしていかなきゃいけないのですが、体力づくりも「やっていかなきやなぁ」などと思っています。