それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

lsでファイルを拡張子ごとに並べる

ファイルを種類順に並べたい。

デスクトップの整理でよく見る「ファイルを種類別」に整理と同じ、ファイルを種類順にまとめて結果に表示を ls コマンドでもできることがわかった。

-X で拡張子でまとめて表示

ls -lX

こうすると、ext 順にまとめて表示してくれるので、少し楽。 split コマンドなどと組み合わせたら便利かもしれない。

参考資料

man ls

lsで日付ファイル名の逆順に並べる並べ方

ls で日付・ファイル名・ファイルサイズなどを昇順・降順に並べたい

ファイルを並べて結果をだすときに、新しいものから処理したいとか、古いものから処理したいことがあるよね。

ls でファイルの日付順に並べる

新しいものが先になるように並べるには

ls -lt

ls でファイルの日付の逆順(古いものが先

古いものが先(older first)になるように並べるには 。逆順オプション -r を使う

ls -ltr

サイズ順で並べる場合にも使える

ls -lS # サイズ降順(larger first
ls -lSr # サイズ昇順 ( smaller first

別のやり方

tac コマンド を使うと、このオプションを知らなくても戦える。

tac コマンドは cat コマンドの逆スペリングになっていて、その意味は cat と出力順が逆になる。

ls -lt |tac  #ls -ltr とおなじ

参考資料

man ls

cygwinのインストールでUAC(Admin昇格)を不要にする

Cygwin のインストールにオプションがつかえた。

今更知った。もっと早く知っていれば。

./setup-x86-64.exe --no-admin

これをつけることでインストール時に、Admin権限を要求されないので、UACの権限がなくてもインストールが可能になる。

たぶんデスクトップやスタートメニュー作成で権限が要求されているので、UAC昇格で管理者権限が必要だとおもっていたCygwinも管理者権限を使わずにインストールすることが可能になっている。

cygwin のインストールオプション

そのほかにもいろいろなオプションがあって、パッケージ管理ができるようになっていてうれしい。

PS C:\Users\takuya\Desktop\cygwin>
Command Line Options:

 -D --download                     Download from internet
 -L --local-install                Install from local directory
 -s --site                         Download site
 -O --only-site                    Ignore all sites except for -s
 -R --root                         Root installation directory
 -x --remove-packages              Specify packages to uninstall
 -c --remove-categories            Specify categories to uninstall
 -P --packages                     Specify packages to install
 -C --categories                   Specify entire categories to install
 -p --proxy                        HTTP/FTP proxy (host:port)
 -a --arch                         architecture to install (x86_64 or x86)
 -q --quiet-mode                   Unattended setup mode
 -M --package-manager              Semi-attended chooser-only mode
 -B --no-admin                     Do not check for and enforce running as
                                   Administrator
 -W --wait                         When elevating, wait for elevated child
                                   process
 -h --help                         print help
 -i --ini-basename                 Use a different basename, e.g. "foo",
                                   instead of "setup"
 -0 --allow-unsupported-windows    Allow old, unsupported Windows versions
 -v --verbose                      Verbose output
 -l --local-package-dir            Local package directory
 -r --no-replaceonreboot           Disable replacing in-use files on next
                                   reboot.
 -X --no-verify                    Don't verify setup.ini signatures
 -I --include-source               Automatically include source download
 -n --no-shortcuts                 Disable creation of desktop and start menu
                                   shortcuts
 -N --no-startmenu                 Disable creation of start menu shortcut
 -d --no-desktop                   Disable creation of desktop shortcut
 -K --pubkey                       URL of extra public key file (gpg format)
 -S --sexpr-pubkey                 Extra public key in s-expr format
 -u --untrusted-keys               Use untrusted keys from last-extrakeys
 -U --keep-untrusted-keys          Use untrusted keys and retain all
 -g --upgrade-also                 also upgrade installed packages
 -o --delete-orphans               remove orphaned packages
 -f --force-current                select the current version for all packages
 -Y --prune-install                prune the installation to only the requested
                                   packages
 -m --mirror-mode                  Skip availability check when installing from
                                   local directory (requires local directory to
                                   be clean mirror!)
 -A --disable-buggy-antivirus      Disable known or suspected buggy anti virus
                                   software packages during execution.



sysd の管理単位-ユニット

systemd の管理単位

systemd は起動のすべてを 「ユニット」という単位で管理する。

ユニットは「Service」が代表例で、/etc/init.d/ に記述するようなサービスDaemonはすべて「Service unit」 として管理される。

ユニットには、service の他に、 target mount service device などがある。

これらのユニットには依存関係が記述されている。systemd はこれらの依存関係を事前に読み込んで解釈し「起動順序」を明確にする。それにより起動処理をマルチ化して高速化が可能になっている。

旧来に sysV init では /etc/rcX.d に記述されたスクリプトを「一つずつ」順番に起動していたので時間がかかっていた。Upstartでもこのあたりの解決は試みられていたがLinuxはSystemdを採用する方向のようです。Systemdから今後も変わらないことを祈るばかりです。

事前ロードがポイント

事前に依存関係や要求関係や、どのタイミングで実行するか。それらを解釈して並び替える処理が入る。その並び替え・依存関係・タイミングの管理単位が「ユニット」。

そのためリロードが必要。

常駐する自作ユニットファイルでデーモンを動かすときに、 daemonsのunit をリロードしてキャッシュを更新しないといけない。

sudo systemctl daemon-reload

そのためこのリロードコマンドが必要になっている。

ユニットの種類

systemd のユニットのタイプ別に一覧する。

ユニットはその役割ごとにそれぞれタイプが存在する。それは次のようになっている。

takuya@:~$ systemctl list-units  --type
automount  device     mount      path       service    snapshot   socket     swap       target     timer

よく使うのは、service 一覧だと思う。

参考資料

http://enakai00.hatenablog.com/entry/20130914/1379146157

systemd のファイルについて

systemd のファイルについて

debian での systemd の構成について調べた

systemd のユニットファイルが置かれている場所

  • /lib/systemd/
  • /usr/lib/systemd/
  • /etc/systemd/

など locate で探すと結構たくさんあってどうなってるのか面食らう。なので役割分担と、優先順位について学んでおいたほうが良さそうだ。

/lib/systemd/

systemd のファイルは基本的に /lib/systemd/に置かれる。

おもに、起動するサービスやジョブとターゲットの各記述がここに置かれている。

/usr/lib/systemd/ には pkgインストールしたモノを置くようだ。

/lib/usr/libLinuxのFHSファイルシステムレイアウトに従うと考えて問題なさそう。

FHSに従うので、ディストリが使うのが /lib 。一方でユーザ全体で使うのが /usr/lib ってことになる。個人ユーザーは /home/を使う。 *1

Debianだと /usr/lib/systemd/ の中身は /lib/systemd へのaliasになってる。

次のように、 path.targets などターゲットは /lib/systemd/の該当部分へのエイリアスになっている。

takuya@:~$ ll -ls /usr/lib/systemd/*
/usr/lib/systemd/catalog:
合計 52K
12K -rw-r--r-- 1 root root 9.7K 2017-01-05 08:42 systemd.catalog
12K -rw-r--r-- 1 root root  10K 2017-01-05 08:42 systemd.fr.catalog
12K -rw-r--r-- 1 root root 9.2K 2017-01-05 08:42 systemd.it.catalog
16K -rw-r--r-- 1 root root  14K 2017-01-05 08:42 systemd.ru.catalog

/usr/lib/systemd/network:
合計 0

/usr/lib/systemd/ntp-units.d:
合計 4.0K
4.0K -rw-r--r-- 1 root root 26 2017-01-05 08:42 90-systemd.list

/usr/lib/systemd/user:
合計 20K
4.0K -rw-r--r-- 1 root root 457 2017-01-05 08:42 basic.target
   0 lrwxrwxrwx 1 root root  36 2017-01-05 08:42 bluetooth.target -> /lib/systemd/system/bluetooth.target
4.0K -rw-r--r-- 1 root root 414 2017-01-05 08:42 default.target
4.0K -rw-r--r-- 1 root root 499 2017-01-05 08:42 exit.target
4.0K -rw-r--r-- 1 root root 166 2015-01-04 02:42 obex.service
   0 lrwxrwxrwx 1 root root  32 2017-01-05 08:42 paths.target -> /lib/systemd/system/paths.target
   0 lrwxrwxrwx 1 root root  34 2017-01-05 08:42 printer.target -> /lib/systemd/system/printer.target
   0 lrwxrwxrwx 1 root root  35 2017-01-05 08:42 shutdown.target -> /lib/systemd/system/shutdown.target
   0 lrwxrwxrwx 1 root root  36 2017-01-05 08:42 smartcard.target -> /lib/systemd/system/smartcard.target
   0 lrwxrwxrwx 1 root root  34 2017-01-05 08:42 sockets.target -> /lib/systemd/system/sockets.target
   0 lrwxrwxrwx 1 root root  32 2017-01-05 08:42 sound.target -> /lib/systemd/system/sound.target
4.0K -rw-r--r-- 1 root root 497 2017-01-05 08:42 systemd-exit.service
   0 lrwxrwxrwx 1 root root  33 2017-01-05 08:42 timers.target -> /lib/systemd/system/timers.target

/usr/lib/systemd/user-generators:
合計 0

ただしCentOSなどは /usr/lib と /libの区別を無くす方向なのかな?それで /usr/lib を使うようになってるみたい。

/etc/systemd

ここにはLinuxの設定として設置される。 /usr/lib/systemd よりも優先される。 実際には、 /etc/systemd には /lib/systemd への alias も数多く置かれている。

つまり units(job/service/target)の実体は /lib/systemd だが、/etc/systemd だけをみてわかるようにおいているんだろうと考えて問題なさそう。

etc はその他に systemd で journal や system.conf などのsystemd の根幹の設定が置かれているのが特徴かな。

ターゲットは /lib/systemd/system 由来のものを持ってきている。

takuya@:~$ ll -ls /etc//systemd/system

/etc//systemd/system:
合計 68K
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 bluetooth.target.wants
   0 lrwxrwxrwx 1 root root    9 2016-09-24 03:52 corosync.service -> /dev/null
   0 lrwxrwxrwx 1 root root   37 2016-06-13 22:10 dbus-org.bluez.service -> /lib/systemd/system/bluetooth.service
   0 lrwxrwxrwx 1 root root   40 2016-06-13 22:10 dbus-org.freedesktop.Avahi.service -> /lib/systemd/system/avahi-daemon.service
   0 lrwxrwxrwx 1 root root   40 2016-06-13 22:10 dbus-org.freedesktop.ModemManager1.service -> /lib/systemd/system/ModemManager.service
   0 lrwxrwxrwx 1 root root   53 2016-06-13 22:10 dbus-org.freedesktop.nm-dispatcher.service -> /lib/systemd/system/NetworkManager-dispatcher.service
   0 lrwxrwxrwx 1 root root   35 2017-03-16 16:16 display-manager.service -> /lib/systemd/system/lightdm.service
4.0K drwxr-xr-x 2 root root 4.0K 2016-11-05 15:35 getty.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2017-03-16 15:48 graphical.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 halt.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 hibernate.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 hybrid-sleep.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:11 local-fs.target.wants
4.0K -rw-r--r-- 1 root root  303 2016-10-29 16:04 mgetty.service
4.0K drwxr-xr-x 2 root root 4.0K 2017-03-16 22:14 multi-user.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 paths.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 poweroff.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 printer.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 reboot.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-11-09 19:05 sockets.target.wants
   0 lrwxrwxrwx 1 root root    9 2016-09-24 03:51 spiceproxy.service -> /dev/null
   0 lrwxrwxrwx 1 root root   31 2016-06-13 22:10 sshd.service -> /lib/systemd/system/ssh.service
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:10 suspend.target.wants
4.0K drwxr-xr-x 2 root root 4.0K 2016-06-13 22:11 sysinit.target.wants
   0 lrwxrwxrwx 1 root root   35 2016-06-13 22:10 syslog.service -> /lib/systemd/system/rsyslog.service

優先度

あとのほうが優先。

  • /lib/systemd/system/
  • /usr/lib/systemd/system/
  • /etc/systemd/system/

あとのものと先のもので同名がアレば、上書きされるとのこと。

参考資料

http://enakai00.hatenablog.com/entry/20130917/1379374797

*1:後述するが systemd はユーザー毎のユニットが存在する。

systemdでsysVinit/Upstart系のコマンドはどうなるの?

upstart 系のものはどうなるの?

takuya@:systemd$ ls -l /sbin/{start,reload,stop,restart,status}
ls: /sbin/start にアクセスできません: そのようなファイルやディレクトリはありません
ls: /sbin/reload にアクセスできません: そのようなファイルやディレクトリはありません
ls: /sbin/stop にアクセスできません: そのようなファイルやディレクトリはありません
ls: /sbin/restart にアクセスできません: そのようなファイルやディレクトリはありません
ls: /sbin/status にアクセスできません: そのようなファイルやディレクトリはありません

以前は

takuya@atom:~$ ls -l /sbin/{start,reload,stop,restart,status}
lrwxrwxrwx 1 root root 7 2011-05-06 02:11 /sbin/reload -> initctl
lrwxrwxrwx 1 root root 7 2011-05-06 02:11 /sbin/restart -> initctl
lrwxrwxrwx 1 root root 7 2011-05-06 02:11 /sbin/start -> initctl
lrwxrwxrwx 1 root root 7 2011-05-06 02:11 /sbin/status -> initctl
lrwxrwxrwx 1 root root 7 2011-05-06 02:11 /sbin/stop -> initctl

のようにコマンドはありました。今は見当たりません。

UpStart の知識は忘れたほうが良さそうです。service コマンドは残りそう

/etc/init ディレクト

以前は、/etc/init ディレクトリに upstart のジョブは置かれていました。また /etc/init.d はそのまま使えます。

いまでもなぜかssh.conf が私の環境には残っていました。これどっちで起動してるんだろう。。。

takuya@: $ cat /etc/init/ssh.conf
# ssh - OpenBSD Secure Shell server
#
# The OpenSSH server provides secure shell access to the system.

description     "OpenSSH server"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
respawn limit 10 5
umask 022

env SSH_SIGSTOP=1
expect stop

# 'sshd -D' leaks stderr and confuses things in conjunction with 'console log'
console none

pre-start script
    test -x /usr/sbin/sshd || { stop; exit 0; }
    test -e /etc/ssh/sshd_not_to_be_run && { stop; exit 0; }

    mkdir -p -m0755 /var/run/sshd
end script

# if you used to set SSHD_OPTS in /etc/default/ssh, you can change the
# 'exec' line here instead
exec /usr/sbin/sshd -D

rc にも残ってるだけどね。

takuya@:~$ ll /etc/rc5.d/ | grep ssh
33:lrwxrwxrwx 1 root root  13 2016-06-14 03:00 S03ssh -> ../init.d/ssh

どうやら、systemd の設定で起動しているようです。余り何も考えなくて良いのは楽ですね。

takuya@:systemd$ systemctl  status ssh.service
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
   Active: active (running) since 土 2017-04-29 01:07:24 JST; 5 days ago
 Main PID: 1029 (sshd)
   CGroup: /system.slice/ssh.service
           ├─  399 /bin/bash
           ├─  445 vim .bash_aliases
           ├─ 1029 /usr/sbin/sshd -D
           └─32630 /bin/bash
takuya@:~$ cat /lib/systemd/system/ssh.service
[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=sshd.service

アップデートでファイルは残ったけど、そのへんはうまくやってると信じることにする。

Upstartは使えなくなるけど、 /etc/init に書いてたようなノノはそのまま使えるわけだ。助かる。

systemdの起動プロセスとinitについて

systemd の起動について

/sbin/init (rootプロセス) として systemd が起動する。 此のときに systemd はdefaut.target というユニットをトリガーとしてシステムの起動が始まる。

以前は、sysV init と呼ばた機能がinit からコールされてたがそれが systemd になった。

また、systemd では 起動スクリプトのようなものは存在せず、直接起動するのが特徴。そのためsh を経由するようなシェルスクリプト依存はまったくないのが特徴。

systemd のイベント・ターゲットについて

Systemdでは「ターゲット」が依存関係の解決を図るキモになっている。すべてのDaemonを依存関係ごとに整理して、そのターゲットを基準に起動処理を走らせる。

ここでいうターゲットとは主にイベントのことで、デバイスが接続された、ネットワークがオンになった、ファイルシステムがマウントした等など。

より正確に言えば、Systemdはイベントが起動のトリガーになっていて、イベントに処理を紐付けるように動作します。しかし複数のイベント待ちから複数のユニット起動は記述や管理が煩雑になる。そこで、Systemdでは複数のイベントが終了したタイミングをまとめたターゲットを使うようになっている。

私たちは基本的にターゲットに処理を紐付けるようにサービス(デーモン)を定義します。

よく見るターゲットを辿ってみる

takuya@:~$ ll  /lib/systemd/system/default.target
lrwxrwxrwx 1 root root  16 2017-01-05 08:42 /lib/systemd/system/default.target -> graphical.target
takuya@:~$ ll  /lib/systemd/system/runlevel5.target
lrwxrwxrwx 1 root root 16 2017-01-05 08:42 /lib/systemd/system/runlevel5.target -> graphical.target

ここから、 次のことがわかる。

システムは graphical login を defaut.target にしている。runlevel は前方互換のために作られてて、run5 がgraphical とされていて、そういうことね。これもなるほどね。

詳しくはこのファイルたちをみていけば、依存関係がどう書かれているのかがよくわかるはず。

参考資料

Systemd入門(1) - Unitの概念を理解する - めもめも

bashのシェルスクリプトで拡張子を取得して利用するときのまとめ

特定の拡張子に○○する的なことはよくある

シェルスクリプトを書いていると拡張子で判別したいことはよくある。

bashで拡張子を取得するには

bashのブレース展開が一番ラクです。

path=/etc/apache2/httpd.conf
extension=${path##*.}  #=> conf

特定のディレクトリの中で拡張子を取得するには

xargs と組み合わせる

find  | xargs -I@  bash -c 'path=@; echo ${path##*.}'

そもそも拡張子の取得が必要ですか?

そのシェルスクリプトで拡張子をもとに検索をしたいなら、拡張子を取る必要はないかもしれないですよ。

指定した拡張子を検索

grep  . -R --include=*.php

指定した拡張子のファイルを列挙する。

find -type f -name '*.php'

ファイル名がマッチするかどうかなら、拡張子を取らなくても正規表現やglob のマッチングで倒せる

正規表現でマッチング.

[[ $path =~ conf$ ]]; 

glob マッチングで conf にマッチさせる。

[[ $path = *conf ]]; 

拡張子がとれたら?

uniq -c や sort で並べ替えると便利でしょうね。

他には?

awksed と組み合わせるのもいいですね。

シェル・スクリプトを使うと組合せは無限大なのがいいですよね。

関連資料

rubyで実行中のユーザー名(id)を取得したい

rubyスクリプトを実行したのは誰?

スクリプトの実行ユーザーを知りたい。root以外で動かされるとパーミッションがあとで面倒なので、root 以外が起動しようとすると拒否したいってことが、わりとあるわけで。

実行ユーザーIDを知るには

Process.euid  #=> root の場合0 
Process.uid #=> root の場合0

実行中のユーザー名を取るには

シェル経由なら ENV 使えるわ

ENV['USER'] #=> root

参考資料

ruby-doc-ja

pbcopy で標準出力の内容をecho表示を維持しつつコピーしたい

pbcopy コマンドはクリップボードのコピーが出来て便利。

pbcopy コマンドを使うと、ターミナルの出力内容をコピーが出来る。便利なコマンド

でも困ったことが有る。クリップボードにコピーされた内容を見れない。

takuya@~$ ls /
Applications  Network  Users    bin    dev  home                       lost+found  net  private  tmp  var
Library       System   Volumes  cores  etc  installer.failurerequests  mnt         opt  sbin     usr
takuya@~$ ls / | pbcopy

コピーされると標準出力には出てこない。pbcopyはパイプから読み取った内容をクリップボードにコピーして、その内容を出力することが出来ない。Cygwinなら

ls | tee >  /dev/clipboard | grep ....

などと、コマンド途中で挟み込むと結構便利だった。

パイプ途中、結果に冪等性がない場合に面倒くさい。

パイプの途中や、出力内容が乱数を含む場合に不便

コマンドの出力内容をクリップボードにいれるときに、何度実行しても同じ結果になるコマンドであれば、全く問題がないのですが。内容が変化する場合に困ります。

どうするか?→ pbpasteを即時に実行する。

実行結果をpbcopy クリップボードにコピーしつつ、画面にも同じものを出力したい場合、pbcopy のオプションでは出力は一切ないので、コマンドの結果を維持するのに困る。

連続して呼びたいときや、あとで使うためにいったんクリップボードにとっておくような手軽な使い方ができない。逐次ファイルに出すのも面倒くさいようね。

alias pbcopy='pbcopy ; pbpaste'

こうしておけば、コピーしつつ標準出力を維持することができて、もっと手軽に使うことが出来る。

次で使うために、コマンドの結果欲しいときにファイルに出さずクリップボードを経由できるようになる。メモ帳にいったん保存しておこうみたいなときや、目で確認できるから便利。

または && で繋いで

alias pbcopy='pbcopy && pbpaste'

パスワードの自動生成で重宝する。

パスワードを自動生成するときに、この考え方が重宝してる。

ユーザー登録時にパスワードを求められても、メアドや住所などもコピーするので画面に一旦出しておおきたいし、クリップボードにもコピーしたい。両方がほしいときにとても便利。

sf-pwgen -a alphanumeric -l 12 -c 1 |pbcopy ;pbpaste

2017/05/30 変更

パイプで渡すと、起動タイミングが若干ずれる。貼り付けがコピーより速く実行されるみたい。なので、 パイプで渡すより、; や && で別々に起動したほうがよさそう

参考資料

man pbcopy

mac で使えそうなQuickLookプラグイン

QuickLookプラグインを使う

Quicklookはないと困る存在で、使い始めるといろいろなファイルをプレビューしたくなる。

インストール・インストール済みのプラグインはここで観れる。

インストールするには、このフォルダに突っ込めばいい。

/Users/takuya/Library/QuickLook/

代表的なプラグインのインストー

home brew で入っちゃいます。

brew cask install qlcolorcode \
qlstephen qlmarkdown \
quicklook-json qlprettypatch\
 quicklook-csv betterzipql \
webp-quicklook suspicious-package

私が入れているのは次の通り

takuya@~$ ll  /Users/takuya/Library/QuickLook/
total 0
drwxr-xr-x  3 takuya access_bpf 102 2015-02-13 02:40 BetterZipQL.qlgenerator
drwx---r-x  3 takuya staff      102 2009-09-19 03:01 QLColorCode.qlgenerator
drwx------ 10 takuya staff      340 2015-10-15 17:20 QLMarkdown.qlgenerator
drwxr-xr-x  3 takuya staff      102 2013-11-28 07:26 QLPrettyPatch.qlgenerator
drwxr-xr-x  3 takuya staff      102 2016-10-11 14:12 QLStephen.qlgenerator
drwxr-xr-x  3 takuya staff      102 2013-02-03 07:14 QuickLookCSV.qlgenerator
drwxr-xr-x  3 takuya wheel      102 2013-10-31 09:17 QuickLookJSON.qlgenerator
drwx---r-x  3 takuya staff      102 2012-09-07 14:30 ScriptQL.qlgenerator
drwxr-xr-x  3 takuya staff      102 2015-10-04 20:10 jupyter-notebook-quick-look.qlgenerator
drwx---r-x  4 takuya staff      136 2013-11-02 06:03 ql_unmht.qlgenerator
takuya@~$

メモを取ったりサイトを残すときに。jupyter やmht は個人的にすご気に入ってるので。

まぁAtomやVS code 入れたら見れるんだけどね。

ほとんどのファイルはプラグインを入れなくてもアプリケーション側でプレビューしてくれることが多いのであまり直接にインストールすることがないんだけどね。

知ってると便利。

インストールされてるJDKバージョンを確認し一覧するコマンド

あれ?java どこに入れたっけ

java 本体やコマンド なんてめったに使わないので、ついつい油断しますよね。

java_home という便利なコマンドが有る。

/usr/libexec/java_home

Debian にはコマンドが見当たらなかったのでたぶん、MacOS用だと思うのですが。調べてみたらXcodeに含まれるようですね。

java_homeの出力例

takuya@Desktop$ /usr/libexec/java_home  -V
Matching Java Virtual Machines (6):
    1.8.0_131, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
    1.8.0_31, x86_64:   "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home
    1.8.0_25, x86_64:   "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home
    1.7.0_75, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home
    1.6.0_65-b14-468, x86_64:   "Java SE 6" /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-468, i386: "Java SE 6" /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home

VisualStudio Codeや .bashrc で使える

VS Codeで java support を入れたときの java.home 設定や

.bashrc での JAVA_HOME JDK_HOME での設定に使える

バージョンごとの使い分けもできる。

rbenv や pyenv 的な使い方ができる。

takuya@Desktop$ /usr/libexec/java_home  1.7.0_75
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
takuya@Desktop$ /usr/libexec/java_home  1.6.0_65
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
takuya@Desktop$

バージョンごとの使い分けに出来るので、

setenv JAVA_HOME=$(/usr/libexec/java_home  1.6.0_65)

などとすれば、Javaのバージョンを切り分けて使えますね。

参考資料

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/java_home.1.html

XPathで目的の要素を持つ親ノードから辿ることをする。

Xpath が便利なのがこれ

HTMLやテーブルで <a> を狙って取り出したいときに、複数取り出しちゃう。nth-child を使えば良いんだろうけど、Xpathの方がもうすこし柔軟に書けるので便利なんですよね。

<ul>
     <li><a></a>
     <li><a></a>
     <li><span><a></a></span>
     <li>
<ul>

これだと、2個めの a を狙うのは //li[2]/a になるんだけど。この書き方ではHTMLの構造でゴミが混じって意図したとおりにノードが取れないことが有る。

とくにいまどきテーブルレイアウトを使っていたり、意識他界系のマークアップで li と div が大量にあったりするともう大変。

○○を子ノードに持つXpathを条件する

子ノードを条件に持つXpath を使いつつ、インデックス指定をするときれいに取れてくる。

//li[ ./a ][2]/a  #=> a 

もし、うっかり インデックス指定を無精すると、配列になる。

//li[ ./a ]/a  #=> [a ,a]

もし、うっかり条件を甘くすると、もっと取れてしまって困る.

//li//a  #=> [a ,a, a]

Xpathは便利だけど奥が深いね。 まぁ contains を使うには最強ツールだと思うよほんと。

Javaの対話型コンソール(repl)を使って楽をする

ちょっと動作調べるのに main 書くのめんどくさそう

java を REPL つまり、対話型インターフェイスCLIで実行したい。

go や node でお世話になるあれ。swhift にすら搭載されて。php にすら搭載されてるあれ. ruby なら pry / irbpython なら ipython / python

Javaでもやりたいよね。

REPLを実現する jar があった

github.com

起動

普通にjar を起動するだけ

takuya@Desktop$ java -jar javarepl-428.jar
Welcome to JavaREPL version 428 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131)
Type expression to evaluate, :help for more options or press tab to auto-complete.
Connected to local instance at http://localhost:62945
java> String a = "ズンドコ"
java.lang.String a = "ズンドコ"
java> a == "ズン"
java.lang.Boolean res1 = false
java>

ああ、便利。

便利?なような気がしたけど、気の所為だった。

補完が効かない、タイピング地獄。Javaの冗長なクラス名を補完無しで書くのがつらすぎる。

うん、main 書いたほうが楽。

java9あたりから採用されるREPLを先取り

java9 から jshell が標準添付されるんで、もうすぐお役御免かも?

[Java9 新機能] jshell入門 - Qiita

参考資料

Javaプログラマ必須 - 対話型にJavaを実行できる「Java REPL」 - Calms blog

GitHub - albertlatacz/java-repl: Read Eval Print Loop for Java

curlコマンドで速度制限(スピードリミッタ)をつける

curl でファイルを次々と取得してて

curl でパッケージを取得したり、転送したりしてて他の作業に支障がでることがあります。

curl 万能なので使いすぎます。

speed limit をつけることで curl を速度制限出来ます。

速度上限をつけることで、穏やかに、急がなくていいファイルはゆっくり転送しておくことが出来ます。便利

curl --limit-rate=2k $URL

また、遅すぎると切断するようなこともできますね。

wget の場合も同じものが使える。

http://takuya-1st.hatenablog.jp/entry/20110523/1306171106

参考資料

       --limit-rate <speed>
              Specify the maximum transfer rate you want curl to use - for both downloads and uploads.  This
              feature  is  useful  if  you  have a limited pipe and you'd like your transfer not to use your
              entire bandwidth. To make it slower than it otherwise would be.

              The given speed is measured in bytes/second, unless a suffix is appended.   Appending  'k'  or
              'K'  will  count the number as kilobytes, 'm' or M' makes it megabytes, while 'g' or 'G' makes
              it gigabytes. Examples: 200K, 3m and 1G.

              If you also use the -Y, --speed-limit option, that option will take precedence and might crip-
              ple the rate-limiting slightly, to help keeping the speed-limit logic working.

              If this option is used several times, the last one will be used.
      -y, --speed-time <time>
              If a download is slower than speed-limit bytes per second during a speed-time period, the download gets
              aborted. If speed-time is used, the default speed-limit will be 1 unless set with -Y.

              This option controls transfers and thus will not affect slow connects etc. If this  is  a  concern  for
              you, try the --connect-timeout option.

              If this option is used several times, the last one will be used.

       -Y, --speed-limit <speed>
              If  a  download  is  slower  than this given speed (in bytes per second) for speed-time seconds it gets
              aborted. speed-time is set with -y and is 30 if not set.

              If this option is used several times, the last one will be used.