mumumu の日記

Development, Translation, daily life, thoughts, and so on.

2018-03-04 18:45:12 +0900

ThinkPad Keyboard を買った

https://www3.lenovo.com/jp/ja/deals/sbiz/sbiz-accessory/KEYBOARD-Japanese/p/0B47181

最近、上のような形で3画面の環境にした。うん、良い。

だが、ノートPC (ASUS Zenbook Pro UX550VD) のキーボードがあまりにもアレだった(*注1)。リターンキーの右側に PgUp や PgDown 等のキーが存在してて、邪魔。使いにくいことこの上ない。

自分のような糞エンジニアでも生産性に影響するレベルだったため、ThinkPad Keyboard (Bluetooth版) を買った。

こういう動機で買ったものの、上のような環境だと首を横に向ければ壁によっかかる形で作業できるので、非常に良い。これまではノートパソコンを寝ながら使いたいという動機から ゴロ寝デスクの類を使ってきた が、ちょっと体勢を変えたいとか思った時も、デスクと違い、体の移動とかを考えなくても良い。

もともと ThinkPad ユーザー (*注2) だったため、このキータッチには慣れているし、何より軽いので非常に楽に使える。あと、ノートPC と違い、筐体が熱くならないのも何気にポイント高い。唯一の欠点といえば、一番左下が Fn キーで、ソフトウェア的に他の Keymap の割当が不可能なことだが、慣れの問題と言い切れるので、自分は気にならない(*注3)。

自分が本当に欲しかった環境って、「寝ながら使いたい」じゃなくて、「軽くて体がいろいろ動かしやすい」ことだったってことに今更気付いたのだった。。

なので、ゴロ寝デスクはもう使わない... 多分。

(*注1) じゃあなんで買ったし、というツッコミは尤もなんですが、急いでたので魔が差したというか...
(*注2) 社会人なりたての時に、ThinkPad T40 とか使ってたし、ThinkPad が好きな社長の会社で働いていた時は、業務用のPCも ThinkPad だった。
(*注3) 多分これが原因で Bluetooth 版を選んでない人相当いるんじゃないかと推測

2018-02-26 05:40:13 +0900

Canon IP7230 は Ubuntu 16.04 では何もインストールしなくても動く

http://cweb.canon.jp/drv-upd/ij-sfp/linux-pd-ip7230-380.html

Linux のドライバが動く、という理由で Canon IP7230 を5年前だかに導入した記憶がある。当時は Ubuntu にもドライバが出ていたのだが、現在は... ? ということで試してみたら、ネットワークに繋いだら DNS-SD 経由で自動で発見してくれ、ドライバも CUPS が持っているエントリから見つけることができた。

いい時代になったものだ。

2018-02-24 23:29:00 +0900

Linux で Mac のようにスクリーンショットを撮る

https://github.com/naelstrof/maim

職場で Mac をデフォルトであてがわれることが多くなり、スクリーンショットを撮るのに Cmd+Shift+4 するのに慣れてしまった。そんな自分が、Linux で同じことをしたくなったときどうするか?

基本的には、以下のようになる。

A) 範囲指定でスクリーンショットを撮ることが出来るプログラムを探し、インストールする
  但し、GUI が呼ばれるプログラムは不可。CLI である必要がある
B) 上記を呼び出すようにショートカットキーを割り当てる

だが、A) を満たすプログラムがなかなか見つからない。どれも GUI を呼ぶか、範囲指定ができてもborderがわからなかったりするなど使いにくいものばかりだった。 Arch Linux のページ にあるソフトウェアをもろもろ調べ、結局選んだのが maim だった。

だが、こいつが Ubuntu だけ何故かパッケージが用意されていなかった(*注1)ので、git リポジトリから最新版をインストールする羽目に。いろいろ依存していてビルドが大変だったが、Ubuntu 16.04 LTS では以下をインストールすれば(*注2)、あとは 指示通りにすれば インストールできる。

1
$ sudo apt-get install  cmake libxrender-dev libxfixes-dev libglm-dev libglew-dev libglfw3-dev libgles2-mesa-dev libx11-dev libxcomposite-dev

あとは、以下のコマンドを Ctrl+Shift+F4 にマッピングした。

1
$ maim -s ~/screenshot-$(date +%s).png

自分は KDE を使っているので Command/URL を選んで Custom Shortcutを割り当てる 方法を使ったが、他のデスクトップ環境でも似たような機能はきっとあるだろう。

(*注1) 他の主要ディストリビューションにはある (Debian 含) のに、Ubuntu だけ何故... (´ー`; )
(*注2) 他に必要なものもあるかもしれない。build-essential とかは当然の前提よ(*゜ー゜)

[Update 19th May 2018 05:39 JST by m]

Kubuntu 18.04 LTS では、ソースからビルドしなくても maim パッケージ一発で maim が入るようになっていました。しあわせ(`ー´)

2017-10-23 00:59:00 +0900

Slack mobile notifications not working (on Android)

https://get.slack.help/hc/ja/articles/201398457-%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E9%80%9A%E7%9F%A5

システム運用時に、何かあった時のアラート等の通知を Slack で受け取っている人もいるだろう。

特に、帰宅後や休暇時に一定の処置が必要なお知らせは重要である。Slack ではチャンネル単位でデスクトップとモバイルの通知の設定が細かく設定できるようになっているので、使い勝手では個人的にあまり困っていない。

だが、自分に合った設定を施しても、一部の Notificaton が受け取れなかったり、通知が遅れたりするとちょっと問題だ。 そういう時は、上記のリンクにあるヘルプの設定を確かめて設定をやり直してもうまくいかないことがある。そうした場合に、自分がやったのは、Android の電源設定を見直すことだった。

最近の Android は、電源設定が割と細かくなっており、スリープ時にネットワーク接続が無効になる場合がある。

自分はこれを上記のように常に接続されるように見なおしたところ、Slack のモバイル通知が思ったように受け取れるようになった。 メモ程度の内容だが、これからも多分同じようなことが起こると思うので、ここにメモしておく。

[ Update Febrary 25th 02:04:50 JST by m ]

自分が持っている Zenfone 4 には、「自動起動マネージャー」と呼ばれる機能があり、そこでアプリを許可しておかないと、電池が足りない等の場合にアプリが終了させられて通知が遅れる場合がある。よって、通知をすぐに受け取りたいアプリは許可リストに入れておく必要がある。以下の例だと、メールクライアントや Slack がそうだ。

2017-10-02 04:27:00 +0900

[PATCH] added socks support to Ruby httpclient

https://github.com/nahi/httpclient/pull/380

以下のような関係にある3つのホストがあり、server は firewall の外から名前解決もできないし、client からは ssh 経由でしか通信できないとする。また、firewall には curl(1) などのツール類はポリシー上一切入っていないとする。

1
2
3
4
5
+----------+          +-----------+         +------------+
|          |          |           |         |            |
|  client  +----------> firewall  +--------->   server   |
|          |   only   |           |         |            |
+----------+   ssh    +-----------+         +------------+

そこで、client から server の状態を http 経由でもろもろ確認したいとする。 以下のようにして、firewall に対して SOCKS プロキシを立てて通信したくなりはしないだろうか。

1
2
$ ssh -fN -D 9999 firewall
$ curl --socks5-hostname localhost:9999 http://server/

ただステータスコードを簡単に確認するためなら、これでも問題ない。だが、特定のプログラミング言語の HTTP通信ライブラリとかを使っていて細かい操作をしている場合、その通信ライブラリが SOCKS プロトコルに対応している必要がある。

自分の場合、上記に類似した状況 (*注1) で Ruby 製のHTTPクライアントライブラリを使っていて、やはり Ruby 側を対応したほうが後々のためにも便利だよな、と思い、 httpclient の gem に対して patch を書いた。これが取り込まれると、以下のようなことができるようになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
require 'httpclient'

#  ssh -fN -D 9999 remote_server
clnt = HTTPClient.new('socks4://localhost:9999')

#clnt = HTTPClient.new('socks5://localhost:9999')
#clnt = HTTPClient.new('socks5://username:password@localhost:9999')

#ENV['SOCKS_PROXY'] = 'socks5://localhost:9999'
#clnt = HTTPClient.new

target = 'http://www.example.com/'
puts clnt.get(target).content

target = 'https://www.google.co.jp/'
puts clnt.get(target).content

つまり、HTTPプロキシと同じ感覚で SOCKS プロキシが設定できるようになる。 凄くニッチなニーズではあるけれども、取り込まれると良いな。

やりたいことがはっきりしていたので、Ruby の経験の多寡に関わらず、意外にすんなり書けた。また、自動テストのためには SOCKSサーバが必要だったことと、プロトコル自体は非常に簡単だったため、それも自前で実装した。 Net::SSH::Proxy にクライアント実装があり、それを拝借してきたお陰で、そんなに手間はかからなかった。

Ruby を使い始めてそんなに経っていないので、Ruby のコードを書くにあたってのお作法が殆どわからなかった。そこで、 rubocop の助けを借りた。大したチェックはされないだろうとたかを括っていたが、コード上のメトリクスやベストプラクティスのあれこれまで細かく指摘されたのでびっくり。これを使ったお陰で、それなりに自信を持ってコードを書き進めることができた。

特定のプログラミング言語の初心者のうちは、可能であれば lint の類を使いながら書いてみると良いかもしれない。

(*注1) 実際はもっと複雑なのだが、そもそも、こんな状態を作っていること自体が筋が悪くて、firewall の中でなんとかすべき事案である。