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

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

ジャンクな Apple Magic Mouse

ジャンクな Magic Mouse をオークションで入手しました。

ジャンクなので何かしら問題があるのですが、このマウスは

  1. 電池蓋がない

  2. 通電しない

電池蓋がないのはいいとしても通電しないのはイタいなぁと思ってよく見ると、電池ボックスの接点部分が液漏れかなにかで汚れているみたいです。 液漏れが基盤まで侵食していると私ではどうしようもないので、分解してみることにします。分解方法は

www.youtube.com

を参考しました。分解したときの写真は撮っていないのですが、幸い基盤は無事だったので電池の設定を紙やすりで磨くと無事通電して使えるようになりました。古い Magic Mouse はクリックやスクロールはできるが、マウスカーソルが動かないものも多いので、心配していましたが、このマウスは問題ないようでした。

さて、マウスは使えるようになったわけですが、電池蓋です。電池蓋がなくても問題ないといえばないのですが、なんか気になるので蓋だけ売ってないかなと思い Google で検索してみるとやはり売ってました。国内では「秋葉館」というところで売ってましたが、

www.akibakan.com

送料を含めると ¥1,000 を超えるので「これはないなー」と思い Aliexpress を探してみると、送料無料で安く売ってましたのでこちらを注文しました。

ja.aliexpress.com

3 週間くらいかかりましたが、届いたのがこれです。

ちゃんと Apple のロゴまで入っています (大丈夫なのか?)。

ジャンクな Apple Magic Mouse は何事もなかったかのように使えるようになりました。

WF-1000XM4

主に通勤時に使っているワイヤレスイヤホンを買い替えました。 今まで使っていたのは SONY の WF-1000X です。

SONY の初代の完全ワイヤレスイヤホンです。このイヤホン、音は気に入っていたのですが、通信が頻繁に切れるのが難点で、とにかく切れまくります。それでも安いものでもないし、音は気に入っていたのでずっと使ってました (結局 4 年位使いました)。
しかし、最近はバッテリーの持ちも悪くなってきたり、昨年発売された WF-1000XM4 の値段も下がってきたので、清水の舞台から飛び降りる思いで買い替えました。

使い始めて半月位ですが、とても満足しています。まず、音が大変良いです (私的に)。音は個人の好みや感覚もあるので、あくまでも個人の感想なのですが、とても気に入っています。
それから、WF-1000X の欠点だった通信の切断ですが、私の通勤経路では 1, 2 ヶ所瞬間的に切れるくらいで気になるほどでもありません。
何にしても、音が大変気に入っており、今まではお昼休みには有線のイヤホンで音楽を聴いていたのを、WF-1000XM4 を買ってからはお昼休みもこれを使うようになりました。

特に不満らしい不満はないのですが、唯一標準のイヤーピースでは耳に若干はめにくいです。だいぶ慣れてきたので、このまま使い続けようとは思っていますが、手頃な値段で良いものが見つかればイヤーピースを変えてみたいと思っています。

値段は高いですが、これは久々に満足度の高い買い物をしたなと思っています。

Rainloop で SSL 関連のエラーが発生する

ゴールデンウイークに体調崩して以来、プログラミングの気力がわかずパソコンの電源も入れない日々が続いています。まぁ、パソコンを使わなくても iPad でたいていのことはできるので不便さは感じていません。

さて、タイトルの件について書く前に、私のメール環境について書いておきます。私が通常使用しているメールアカウントは、会社から付与されたメールアカウントと私用で使っている Asahi-Net のメールアカウント (たぶん 20 年以上、30 年が近いかもしれません、使っています) の 2 つです。
この 2 つのメールアカウントとその他諸々を 3〜4 年前まではジャストシステムShuriken というメーラーで運用していましたが、ある時なんとなく「もう、メールクライアントは Web メールでいいんじゃないか」と思いはじめ、仕事用のメールクライアントを Roundcube でしばらく運用してみました。Roundcube にしたのは単に会社が借りているサーバーで予め使えるようになっていたからです。
roundcube.net 結果として、仕事用のメールを Roundcube に変えても特に不便は感じませんでしたので、私用のメールも Web メールにすべく、個人用の公開サーバーに Web メールクライアントを導入することにしました。
ここで、どの Web メールを導入するかを考えたのですが、Roundcude はなんか代り映えしないので、個人用はに Rainloop を選んでみました。 www.rainloop.net なので、特別 Rainloop が良かったとかではなく Roundcube 以外で探して最初に見つけたのが Rainloop だったというわけです。
で、順調に 1 年くらいですかね Rainloop でメールを運用していたのですが、昨年の秋に VPS を借りたので、Web メールも VPS に移行しました。移行自体は滞りなくできて私用のメールは以前と変わりなく使えるようになったのですが、ここで 1 つ問題が発生しました。

この問題がタイトルの「Rainloop で SSL 関連のエラーが発生する」です。私用のメールは問題なかったのですが、仕事用のメールサーバーに接続しようとすると

stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:1425F102:SSL
routines:ssl_choose_client_version:unsupported protocol

というエラーが発生し設定ができませんでした。以前は OS が Debian で問題なかったのですが、Ubuntu に変わったので「パッケージがなんか変わったんだろうなー」程度に考え、仕事用のメールは Roundcobe があるので特に深く調査もせずそのままにしておきました。

しかし、なんとなく気になっていたので先日ちょっと Google で検索してみると下記のサイトを発見しました。 www.ytyng.com これは「ドンピシャ」じゃないかと思い書いてあるとおりに設定すると問題なく動作するようになりました
手順としては

  1. /usr/lib/ssl/openssl.cnf (実態は /etc/ssl/openssl.cnf) の先頭に

     openssl_conf = default_conf
    

    を追加

  2. /usr/lib/ssl/openssl.cnf の末尾に

     [ default_conf ]
    
     ssl_conf = ssl_sect
    
     [ssl_sect]
    
     system_default = ssl_default_sect
    
     [ssl_default_sect]
     MinProtocol = TLSv1
     CipherString = DEFAULT:@SECLEVEL=1
    

正直、理屈はわからないのですが「Ubuntu 20 になってセキュリティレベルが上がった」のが原因のようで「TLSv1 にすると接続できる」ということらしいです。

色々と停滞気味

だいぶ良くなってきてはいるのですが、ゴールデンウィークに入って 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 を指定して画像全体を残すようにした

バッチリです。