A Micro Toolbox

ソフトウェアのニッチな問題の対処記録です

Git for WindowsのMinttyを新しくする

Git for WindowsのGit Bashで使っているMinttyがversion 2.8.5と古いままだったのを新しくした。

 

手順は下記でQ&Aがあった。

https://stackoverflow.com/questions/50471172/how-do-i-upgrade-mintty-in-git-for-windows

 

MSYS2のリポジトリからmintty-1~2.9.5-1-x86_64.pkg.tar.xzをダウンロード。

http://repo.msys2.org/msys/x86_64/

 

Git Bash上で展開。

$ mkdir mintty
$ tar Jxf mintty-1~2.9.5-1-x86_64.pkg.tar.xz -C mintty --strip-components 1
$ ls mintty/bin
getemojis* mintheme* mintty.exe*
$

 

一度Git Bashを閉じ、mintty/binにあるmintty.exeをコピーしてGit for Windowsのusr/bin/mintty.exeを上書き。

 

Git Bashを立ち上げて、Options > Aboutでバージョンが2.9.5になったことを確認。

 

WSLでgnuplotを動かすとlibGL errorになる

WSLのUbuntsu 18.04 LTSでgnuplotを動かしたら、グラフが表示されたもののlibGL errorが2行出た。

 

gnuplot> plot sin(x)

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-volvox'

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast

 

.bash_profileに次の1行を追加して読み込みなおしたら、libGCのエラーは解消した。

export LIBGL_ALWAYS_INDIRECT=1

 

この環境変数についてのメモ:

http://xjman.dsl.gr.jp/xf86_4/DRI6.html

 LIBGL_ALWAYS_INDIRECT, この変数を定義すると libGL.so はハードウェア アクセラレーションではなく必ず間接レンダリングを使うようになります。 レンダリングのエラーを切り分ける時に便利です。

 

 

おまけ。

 

もう一つのメッセージ XDG_RUNTIME_DIR not setも 環境変数XDG_RUNTIME_DIRを追加して解消した。

 

.bash_profileに次の行を追加。

export XDG_RUNTIME_DIR="$HOME/xdg_runtime_dir"
rm -rf $XDG_RUNTIME_DIR
mkdir $XDG_RUNTIME_DIR
chmod 700 $XDG_RUNTIME_DIR

 

本来どこに作ればよいのかよくわからない。

/tmp配下に作る例が多いけど、必ずというわけでもなさそうだし、いったん管理しやすくてローカルにあるユーザのHOME配下に固定した。

 

https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html

$XDG_RUNTIME_DIR defines the base directory relative to which user-specific non-essential runtime files and other file objects (such as sockets, named pipes, ...) should be stored. The directory MUST be owned by the user, and he MUST be the only one having read and write access to it. Its Unix access mode MUST be 0700.

 

 

 

Windows Subsystem for Linuxの初期設定

Windows Subsystem for LinuxUbuntu 18.04 LTSをインストール後にやったこと。

 

1.リポジトリを日本のサーバに変更

$ cd /etc/apt

$ sudo sed -i.bak -e "s/http:\/\/archive\.ubuntu\.com/http:\/\/jp\.archive\.ubuntu\.com/g" sources.list

 

2. 既存のソフトのアップデート

$ sudo apt update

$ sudo apt-get update

$ sudo apt upgrade --fix-missing

 

3. タイムゾーンの設定

$ sudo dpkg-reconfigure tzdata

 

4. XServer(VcXsrv)を設定

https://sourceforge.net/projects/vcxsrv/

から最新zipをダウンロードして起動。

 

2019-01-06修正。

デフォルトで進めて設定を保存。

WindowsのstartupにVcXSrvの展開ディレクトリにあるconfig.xlaunchをコピー&ペースト。

 

5. xeyes動作確認

$ sudo apt-get install x11-apps

$ vi ~/.bashrcで下記1行追加

export DISPLAY=localhost:0.0

$ . ~/.bashrc

$ xeyes &

 

6. MinTTYベースのターミナルを設定

https://github.com/goreliu/wsl-terminal

から最新リリースをダウンロードして展開。

フォルダの背景で右クリックしたときにターミナルを開くようレジストリにキー追加。

\HKEY_CLASSES_ROOT\Directory\Background\shell

wsl-terminal = WSL Terminal

  command = C:\path\to\wsl-terminal\open-wsl.exe -W "%V"

 

7. Bashのプロンプト変更

2019-01-06 command historyがおかしくなるのでプロンプト修正。

$ vi ~/.bashrcで下記1行追加

PS1="\[\033[2m\][\W]\[\033[0m\033[1m\]$\[\033[0m\] "

$ . ~/.bashrc

 

 

 

 

 

 

watchコマンドをバックグラウンドで実行する

watchコマンドをバックグラウンドで実行しようとするとすぐに停止してしまう。

$ watch -n 10 'top -Hbcn1 > top_$(date +$F_%H%M%S).txt' &                                      
[1] 6603
$ 

[1]+  Stopped                 watch -n 10 'top -Hbcn1 > top_$(date +$F_%H%M%S).txt'
$ 

次のようにすればOK。

$ watch -n 10 'top -Hbcn1 > "top_$(date +%F_%H%M%S).txt"' &> /dev/null &

マウスカーソルを左上に移動させるワンライナー

> ruby -r "win32api" -e "Win32API.new('user32', 'SetCursorPos', ['i', 'i'], 'i').call(0, 0)"

これをmcz.batなどとしてPATHの通ったところに保存し、Windowsキー+Rでmcz->エンターとうてば、マウスがスクリーンの左上に移動する。

ダミーのSMTPサーバ(続き)

前回の続き。

smtp4dev


ダミーのSMTPサーバで検索して真っ先に挙がったものがこれ。
http://smtp4dev.codeplex.com/

DOWNLOADSをクリックして、smtp4dev 2.0.9 standaloneをダウンロードする。
ZIPを展開すると実行バイナリ一つだけが入っているので、ダブルクリックして起動する。

Options -> Server -> STARTTLSのチェックを外す。
外さないとRailsからテスト送信したときにsmtp4devが落ちて(動作を停止して)しまった。
他のタイミングでも何が原因なのかわからないまま落ちることがあって、開発目的で使うにはもう少し頑丈で会ってほしいところ。


送信したテストメールの送受信元と件名がsmtp4devのMessagesタブに表示されたら、ダブルクリックするとメーラでテストメールを開くことができる。
ただ、Windows 10がWindows付属のメーラに関連付けしてしまう傾向があって、本文を確認するために他のメーラで開くには毎回関連付けを解除しなければならなかった。


Sessionsタブを開くと、メールの送信時に交わされたSMTPのログを見ることができる。
Rails側の設定を変えて、実際にどんなコマンドが送られるのかを確認することができる。


config.action_mailer.smtp_settingsにuser_nameとpasswordを設定してもしなくても送信メールを確認できた。

終了は普通のGUI同様に右上の「×」ボタンを押けばよい。

ダミーのSMTPサーバ

RailsのActionMailerを動作確認するのにGmailを使っていたけれど、もっと認証のゆるいSMTPサーバを想定した送信テストが必要になって、ダミーのSMTPサーバとして使えるものを調べた。

メール送信する環境はWindows 10 + Ruby 2.2 + Rails 4.2.6。
ダミーのSMTPサーバの条件は、SMTP AUTH PLAINが通って、日本語の件名と本文が確認しやすいこと。

結論から言うと、MailCatcherが楽だった。

Rails側の準備

config/environments/development.rb

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address: 'localhost',
    port: 25,
    domain: 'example.com',
    user_name: 'user',
    password: 'password',
    authentication: 'plain',
  }


app/mailers/application_mailer.rb

class ApplicationMailer < ActionMailer::Base
  layout 'mailer'
end


app/mailers/test_mailer.rb

class TestMailer < ApplicationMailer
  default from: "foo@example.com"

  def greet
    @greeting = "送信テストです\n届くといいですね。"

    mail(to: "bar@example.com", subject: "送信テスト")
  end

end


app/views/test_mailer/geet.text.erb

MAIL BODY -->
<%= @greeting %>
<-- MAIL BODY


送信テストはRailsのコンソールで行う。

> rails c
Loading development environment (Rails 4.2.6)
irb(main):001:0> TestMailer.greet.deliver_now

MailCatcher

DevKit設定済みの状態で、gem installでインストール。

> gem install mailcatcher

ポート番号を--smtp-portオプションで指定して起動。
指定しないと1025番が使われる。
何か問題があったときのために-vオプション(冗長表示)もつけておく。

> mailcatcher -v --smtp-port 25
Starting MailCatcher
==> smtp://127.0.0.1:25
==> http://127.0.0.1:1080

ブラウザでhttp://localhost:1080を開くとメールの確認画面になる。

config.action_mailer.smtp_settingsはaddressとportの指定だけあればよいが、user_name, passwordがあっても特に問題ない。

終了はCtrl+Cでできる。

Pythonワンライナー


Python 2.7 32bit版を入れていたので、ワンライナーでダミーSMTPサーバを起動してみた。

> python -m smtpd -n -c DebuggingServer localhost:25

このSMTPサーバにメール送信すると、ワンライナーで起動したコンソール(コマンドプロンプト)にメールが表示される。

ただし、BASE64エンコーディングされたままなので日本語としてはそのまま読めない。

config.action_mailer.smtp_settingsにuser_nameとpasswordを設定してテスト送信したら、AUTHには対応していない旨のエラーになった。

Net::SMTPAuthenticationError: 502 Error: command "AUTH" not implemented
<||