ファイルを種類順に並べたい。
デスクトップの整理でよく見る「ファイルを種類別」に整理と同じ、ファイルを種類順にまとめて結果に表示を ls コマンドでもできることがわかった。
-X で拡張子でまとめて表示
ls -lX
こうすると、ext 順にまとめて表示してくれるので、少し楽。 split コマンドなどと組み合わせたら便利かもしれない。
参考資料
man ls
デスクトップの整理でよく見る「ファイルを種類別」に整理と同じ、ファイルを種類順にまとめて結果に表示を ls コマンドでもできることがわかった。
-X で拡張子でまとめて表示ls -lX
こうすると、ext 順にまとめて表示してくれるので、少し楽。 split コマンドなどと組み合わせたら便利かもしれない。
man ls
ファイルを並べて結果をだすときに、新しいものから処理したいとか、古いものから処理したいことがあるよね。
新しいものが先になるように並べるには
ls -lt
古いものが先(older first)になるように並べるには 。逆順オプション -r を使う
ls -ltr
ls -lS # サイズ降順(larger first ls -lSr # サイズ昇順 ( smaller first
tac コマンド を使うと、このオプションを知らなくても戦える。
tac コマンドは cat コマンドの逆スペリングになっていて、その意味は cat と出力順が逆になる。
ls -lt |tac #ls -ltr とおなじ
man ls
今更知った。もっと早く知っていれば。
./setup-x86-64.exe --no-admin
これをつけることでインストール時に、Admin権限を要求されないので、UACの権限がなくてもインストールが可能になる。
たぶんデスクトップやスタートメニュー作成で権限が要求されているので、UAC昇格で管理者権限が必要だとおもっていた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.
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 一覧だと思う。
debian での systemd の構成について調べた
など locate で探すと結構たくさんあってどうなってるのか面食らう。なので役割分担と、優先順位について学んでおいたほうが良さそうだ。
/lib/systemd/systemd のファイルは基本的に /lib/systemd/に置かれる。
おもに、起動するサービスやジョブとターゲットの各記述がここに置かれている。
/usr/lib/systemd/ には pkgインストールしたモノを置くようだ。
/lib と /usr/lib は Linuxの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
あとのほうが優先。
あとのものと先のもので同名がアレば、上書きされるとのこと。
http://enakai00.hatenablog.com/entry/20130917/1379374797
*1:後述するが systemd はユーザー毎のユニットが存在する。
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 ディレクトリに 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 に書いてたようなノノはそのまま使えるわけだ。助かる。
/sbin/init (rootプロセス) として systemd が起動する。 此のときに systemd はdefaut.target というユニットをトリガーとしてシステムの起動が始まる。
以前は、sysV init と呼ばた機能がinit からコールされてたがそれが systemd になった。
また、systemd では 起動スクリプトのようなものは存在せず、直接起動するのが特徴。そのためsh を経由するようなシェルスクリプト依存はまったくないのが特徴。
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 とされていて、そういうことね。これもなるほどね。
詳しくはこのファイルたちをみていけば、依存関係がどう書かれているのかがよくわかるはず。
シェルスクリプトを書いていると拡張子で判別したいことはよくある。
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$ ]];
[[ $path = *conf ]];
uniq -c や sort で並べ替えると便利でしょうね。
シェル・スクリプトを使うと組合せは無限大なのがいいですよね。
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 ....
などと、コマンド途中で挟み込むと結構便利だった。
パイプの途中や、出力内容が乱数を含む場合に不便
コマンドの出力内容をクリップボードにいれるときに、何度実行しても同じ結果になるコマンドであれば、全く問題がないのですが。内容が変化する場合に困ります。
実行結果をpbcopy クリップボードにコピーしつつ、画面にも同じものを出力したい場合、pbcopy のオプションでは出力は一切ないので、コマンドの結果を維持するのに困る。
連続して呼びたいときや、あとで使うためにいったんクリップボードにとっておくような手軽な使い方ができない。逐次ファイルに出すのも面倒くさいようね。
alias pbcopy='pbcopy ; pbpaste'
こうしておけば、コピーしつつ標準出力を維持することができて、もっと手軽に使うことが出来る。
次で使うために、コマンドの結果欲しいときにファイルに出さずクリップボードを経由できるようになる。メモ帳にいったん保存しておこうみたいなときや、目で確認できるから便利。
または && で繋いで
alias pbcopy='pbcopy && pbpaste'
パスワードを自動生成するときに、この考え方が重宝してる。
ユーザー登録時にパスワードを求められても、メアドや住所などもコピーするので画面に一旦出しておおきたいし、クリップボードにもコピーしたい。両方がほしいときにとても便利。
sf-pwgen -a alphanumeric -l 12 -c 1 |pbcopy ;pbpaste
パイプで渡すと、起動タイミングが若干ずれる。貼り付けがコピーより速く実行されるみたい。なので、 パイプで渡すより、; や && で別々に起動したほうがよさそう
man pbcopy
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 は個人的にすご気に入ってるので。
ほとんどのファイルはプラグインを入れなくてもアプリケーション側でプレビューしてくれることが多いのであまり直接にインストールすることがないんだけどね。
知ってると便利。
java 本体やコマンド なんてめったに使わないので、ついつい油断しますよね。
/usr/libexec/java_home
Debian にはコマンドが見当たらなかったのでたぶん、MacOS用だと思うのですが。調べてみたらXcodeに含まれるようですね。
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
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のバージョンを切り分けて使えますね。
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 を使いつつ、インデックス指定をするときれいに取れてくる。
//li[ ./a ][2]/a #=> a
もし、うっかり インデックス指定を無精すると、配列になる。
//li[ ./a ]/a #=> [a ,a]
もし、うっかり条件を甘くすると、もっと取れてしまって困る.
//li//a #=> [a ,a, a]
Xpathは便利だけど奥が深いね。 まぁ contains を使うには最強ツールだと思うよほんと。
java を REPL つまり、対話型インターフェイスでCLIで実行したい。
go や node でお世話になるあれ。swhift にすら搭載されて。php にすら搭載されてるあれ. ruby なら pry / irb 、 python なら ipython / python 。
Javaでもやりたいよね。
普通に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 から jshell が標準添付されるんで、もうすぐお役御免かも?
Javaプログラマ必須 - 対話型にJavaを実行できる「Java REPL」 - Calms blog
GitHub - albertlatacz/java-repl: Read Eval Print Loop for Java
curl でパッケージを取得したり、転送したりしてて他の作業に支障がでることがあります。
curl 万能なので使いすぎます。
速度上限をつけることで、穏やかに、急がなくていいファイルはゆっくり転送しておくことが出来ます。便利
curl --limit-rate=2k $URL
また、遅すぎると切断するようなこともできますね。
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.