nkf コマンドで文字コードがなになのか調べる
curl http://b.hatena.ne.jp/ | nkf -g UTF-8
nkf -g
-g
オプションで guess
の意味がある。g はゲス(勘ぐり)だとでも覚えておけばいいかもしれない。
NKFについては
nkf については以前に使い方をまとめているので、そちらを参考にしてほしい
文字コード変換コマンドの nkfの使い方と実例をまとめました。 - それマグで!
別に記事が古くてもnkf の使い方は変わってないぞ
カレントディレクトリのファイルがコマンドとして実行されてしまう。
takuya@Desktop$ ./a aaaaaaaaaaaaaaaaaaaaaa takuya@Desktop$ a aaaaaaaaaaaaaaaaaaaaaa
bash で、このような動的に変化するPATHを認めてしまうと思いもよらない動作を引き起こすから、カレントディレクトリ( . ) はPATHから除外されてるはずなんだが。
アレコレしらべてみたけれど原因がなかなかわからなかった。
PATHに ::
が含まているとカレントディレクトリとして解釈されるらしい。しらんかった。
takuya@Desktop$ PATH=/bin:/usr/bin takuya@Desktop$ a -bash: a: コマンドが見つかりません takuya@Desktop$ PATH=/bin:/usr/bin:: takuya@Desktop$ a aaaaaaaaaaaaaaaaaaaaaa takuya@Desktop$
なんてこったい。
bashrc で:: がPATHに混じっていた。本当に驚いた。
今回ためしたbashはこれ。
takuya@$ bash --version GNU bash, バージョン 4.4.19(1)-release (x86_64-apple-darwin15.6.0) Copyright (C) 2016 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
バージョン情報を追記
env -i bash --noprofile --norc
takuya@$ bash --noprofile --norc bash: takuya_prompt_command: コマンドが見つかりません bash-4.4$ bash: takuya_prompt_command: コマンドが見つかりません bash-4.4$
環境変数を綺麗な状態で起動する
env -i bash
これと、norc を組み合わせると冒頭のコマンドになる。
env -i bash --noprofile --norc
他には、sudo が env_reset 設定になってることが多いので sudo するとかね
sudo -u takuya bash --noprofile --norc
takuya@:mysql$ systemctl status nginx ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2018-07-23 13:52:28 JST; 41min ago Docs: man:nginx(8) Main PID: 15612 (nginx) Tasks: 10 (limit: 4915) Memory: 26.1M CPU: 1.534s CGroup: /system.slice/nginx.service ├─15612 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; ├─15613 nginx: worker process ├─15619 nginx: worker process └─15621 nginx: cache manager process 7月 23 13:52:28 acid systemd[1]: Starting A high performance web server and a reverse proxy server... 7月 23 13:52:28 acid systemd[1]: Started A high performance web server and a reverse proxy server. ## ここをもっと見たい
status で、末尾に表示されるログは最新のプロセス起動後のログだけなので、過去の再起動時のプロセスもあわせて見たいと思いますよね。
journalctl -u nginx.service
または service を省略しても見られます。
journalctl -u nginx
tailf / tail -f
みたいにログをフォローして表示したい
journalctl -f
これが便利。/var/log/ を探さなくていいんです。楽
今日のログを見たい --since today
をつければ見れる。
takuya@:nginx$ journalctl -u nginx --since today -- Logs begin at Tue 2018-05-29 01:08:01 JST, end at Mon 2018-07-23 14:36:01 JST. -- 7月 23 13:51:53 acid systemd[1]: Stopping A high performance web server and a reverse proxy server... 7月 23 13:51:53 acid systemd[1]: Stopped A high performance web server and a reverse proxy server. 7月 23 13:52:28 acid systemd[1]: Starting A high performance web server and a reverse proxy server... 7月 23 13:52:28 acid systemd[1]: Started A high performance web server and a reverse proxy server.
date で解釈できるものなら何でも行けそう
journalctl -u nginx --since 2018-06-01 journalctl -u nginx --since yesterday journalctl -u nginx --since '3 days ago' journalctl -u nginx --since '3 hours ago'
since と似たようなものに until があります。
since / until と組み合わせて、ログの表示期間を指定することができる。
-o json-pretty
をつければ json でみれるぜ
journalctl -u nginx --since 'today' -o json-pretty { "__CURSOR" : "s=0997617705f94f34ae01266fa219a576;i=550fb9;b=2bf63364741441b1a80057285897e9b8;m=9ae801170e;t=571a3677f43ab;x=294ec4728d5abe08", "__REALTIME_TIMESTAMP" : "1532321513554859", "__MONOTONIC_TIMESTAMP" : "665317349134", "_BOOT_ID" : "2bf63364741441b1a80057285897e9b8", "_MACHINE_ID" : "19458862819a493f879c4a7d4730c653", "_HOSTNAME" : "acid", "PRIORITY" : "6", "SYSLOG_FACILITY" : "3", "SYSLOG_IDENTIFIER" : "systemd", "_UID" : "0", "_GID" : "0", "_TRANSPORT" : "journal", "_CAP_EFFECTIVE" : "3fffffffff", "CODE_FILE" : "../src/core/unit.c", "CODE_LINE" : "1493", "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading", "_PID" : "1", "_COMM" : "systemd", "_EXE" : "/lib/systemd/systemd", "_CMDLINE" : "/sbin/init", "_SYSTEMD_CGROUP" : "/init.scope", "_SYSTEMD_UNIT" : "init.scope", "_SYSTEMD_SLICE" : "-.slice", "UNIT" : "nginx.service", "MESSAGE_ID" : "de5b426a63be47a7b6ac3eaac82e2f6f", "MESSAGE" : "Stopping A high performance web server and a reverse proxy server...", "_SOURCE_REALTIME_TIMESTAMP" : "1532321513554828" }
その他にも
_PID=8088
として プロセスIDごとで見たり
_UID=108
として UID ごとで見たり
--no-pager
でページャーを無効にしたり
でも、これってgrep である程度できるので特に実験はしない。
日付の絞り込みはgrep では苦手な分野なので重宝しそう。
また、grep ができないことや日付以外は jq を使えば条件書けるし工夫次第では便利だと思う。
systemctl コマンドの status でログが見れる。
takuya@:mysql$ systemctl status mysqld.service ● mariadb.service - MariaDB database server Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled) (snif) CPU: 717ms CGroup: /system.slice/mariadb.service └─19015 /usr/sbin/mysqld 7月 23 14:20:31 acid systemd[1]: Starting MariaDB database server... 7月 23 14:20:32 acid mysqld[19015]: 2018-07-23 14:20:32 139713357013568 [Note] Using unique option prefix 'key_buffer' is error-prone and can break in the future. Please use the full name 'k 7月 23 14:20:32 acid mysqld[19015]: 2018-07-23 14:20:32 139713357013568 [Note] /usr/sbin/mysqld (mysqld 10.1.26-MariaDB-0+deb9u1) starting as process 19015 ... 7月 23 14:20:33 acid systemd[1]: Started MariaDB database server.
no entries と言われる。
takuya@:mysql$ journalctl -u mysqld.service -- No entries --
は?ふざけんな。 systemd
30分ほど悩んだ結果。これで見れることがわかる。
takuya@:mysql$ journalctl -u mariadb.service -- Logs begin at Tue 2018-05-29 01:08:01 JST, end at Mon 2018-07-23 14:32:02 JST. -- 6月 18 16:35:28 acid systemd[1]: Stopping MariaDB database server... 6月 18 16:35:30 acid systemd[1]: Stopped MariaDB database server. -- Reboot -- 6月 18 16:58:00 acid systemd[1]: Starting MariaDB database server... 6月 18 16:58:02 acid mysqld[1733]: 2018-06-18 16:58:02 140132049048128 [Note] Using unique option prefix 'key_buffer' is error-prone and can break in the future. Please use the full name 'ke
別名だと見れないのかよ。グループに注意する必要がある。systemd はもうちょっとなんとかならないんですか。。。
composer instal しようとしたら次のエラーが
Could not fetch ~, please create a GitHub OAuth token to go over the API rate limit
GitHub OAuth token to go over the API rate limit のエラーはfetch の上限に掛かったらしい。
パーソナルアクセストークンを使うといいんです。→ https://github.com/settings/tokens でトークンを確認
ScrenCaptured 2018-07-21 20.04.06
画面でトークンを作ったら、それをcomposer の設定に登録する。
composer config -g github-oauth.github.com <your_oauthtoken>
curl -u '[your github username]' \ -d '{"scopes":["repo"],"note":"token for composer "}' \ https://api.github.com/authorizations
公式にドキュメントがあります。
https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens
Windows 10でログオフやCTRL-ALT-DELで押した画面にキーボードショートカットがなくなった。 いままではシングルキー(ALT系)が割り当てられていたのでキー操作だけでログオフができた
いまはできない
また、Win-Lでロック画面を起動した後に、Wを押せばログイン画面に戻せたのに。 ロック画面でのユーザー切り替えにショートカットがなくなった
マウス持つのめんどくさい。タッチパネルならタッチするだけなのですが、通常のPCモニタに対してタッチパネルなど購入していただけるはずもなく
やり方は簡単
logoff.exe のショートカットを作ってスタートメニューに登録し、プロパティを開く、ショートカットを登録
登録したショートカットはグローバルショートカットとして動作する
ログオフってコマンドなんですよ。
sys32 にある logoff.exe がログオフコマンドの本体
ショートカットを作って、そこにグローバルなショートカットを割り当てる。
Win-Lでロックすればいいんだけど。 共有PCなんだからロック画面でも誰も座ってなかったらログインすればいいのに、
「takuyaさん ログイン中ですがパソコン使ってます?」といちいちくそ丁寧に聞いてくるパソコンの大先生がいっぱいるんですよ。
もうね、あほかと。いちいち聞かずにログインしてしまえばいいじゃないか。返事するのもめんどくさい。
共有PCでロック状態で放置してたらログインすればいいじゃん。 ロック画面にユーザーの名前が出るからめんどくさいマイクロソフトが悪い。
めんどくさすぎなのでWin-L以外のパパっとログオフする必要があった。
はぁ、PCの仕組みより、「マナー」っぽいことを自分ルールで増やされるのは困る。
Home editionにはlogoff.exeがなかった
どんなwindowsにもついてるわけではなさそう
マウントを解除して、、て思ってて、うっかりやらかしたら、そのまま拡張できちゃった。
takuya@:~$ sudo resize2fs /dev/mapper/spanning--test-spanning--lv resize2fs 1.43.4 (31-Jan-2017) Filesystem at /dev/mapper/spanning--test-spanning--lv is mounted on /home/takuya/mnt/spanning; on-line resizing required old_desc_blocks = 3, new_desc_blocks = 4 The filesystem on /dev/mapper/spanning--test-spanning--lv is now 7861248 (4k) blocks long. takuya@:~$ df /dev/mapper/spanning--test-spanning--lv -h ファイルシス サイズ 使用 残り 使用% マウント位置 /dev/mapper/spanning--test-spanning--lv 30G 1.1G 27G 4% /home/takuya/mnt/spanning takuya@:~$
まぁほとんどやることはないんだろうけど便利ですよね。
CMD + SHIFT + .
ファイルダイアログからしか不可視フォルダの表示と非表示を切り替えられないのですが。
defaults write com.apple.finder AppleShowAllFiles No; killall Finder
もとに戻すには
defaults write com.apple.finder AppleShowAllFiles Yes; killall Finder
https://ianlunn.co.uk/articles/quickly-showhide-hidden-files-mac-os-x-mavericks/
間違って作っちゃったファイルなどを削除したい。 find コマンドならそれも簡単
今日(直近24時間)のファイルを見つける
find var/tmp -type f -daystart -mtime -1 -exec ls -l {} \;
find var/tmp -type f -daystart -mtime -1 -delete {} \;
find /var/cache/nginx/fpm -type f -mmin -30 -exec ls -l {} \;
mmin の m は mitime のm 、なので、 amin: atime
や cmin:ctime
も使える。
find /var/cache/nginx/fpm -type f -mmin -30 -delete;
ファイルを探すのにとても便利なのに、あまり使われていないと思う。なんでみんな手作業でやっちゃうの?
なにもない行を無視してしまうので、空行を含めて行番号表示したいですよね。
nl -b a
-b, --body-numbering=STYLE
のオプションで all の a をつける。
takuya@webhooks$ cat .env | nl -b a 1 APP_NAME=Laravel 2 APP_ENV=local 3 APP_KEY=base64:q/pPI5TtWLR7nyYTlFTsoV/fKaFTRNNXuRsaYHa5pWY= 4 APP_DEBUG=true 5 APP_LOG_LEVEL=debug 6 APP_URL=http://localhost 7 8 #DB_CONNECTION=mysql 9 #DB_HOST=127.0.0.1 10 #DB_PORT=3306 11 #DB_DATABASE=homestead 12 #DB_USERNAME=homestead 13 #DB_PASSWORD=secret 14 15 BROADCAST_DRIVER=log 16 CACHE_DRIVER=file 17 SESSION_DRIVER=file 18 SESSION_LIFETIME=120 19 QUEUE_DRIVER=sync 20 21 REDIS_HOST=127.0.0.1 22 REDIS_PASSWORD=null 23 REDIS_PORT=6379 24 25 MAIL_DRIVER=smtp 26 MAIL_HOST=smtp.mailtrap.io 27 MAIL_PORT=2525 28 MAIL_USERNAME=null 29 MAIL_PASSWORD=null 30 MAIL_ENCRYPTION=null 31 32 PUSHER_APP_ID= 33 PUSHER_APP_KEY= 34 PUSHER_APP_SECRET= 35 PUSHER_APP_CLUSTER=mt1
行番号を付けるためだけのコマンド【nl】(順位を表示にもつかえそう) - それマグで!
sed 使うと、X行目に文字を追加することができます。
sed -i '3i#Hello' /etc/hosts
これを実行すると、 3行目に、#Hello
が挿入されます。
nl を組み合わせることで、sed の結果を行数を見ながら確認ができます。
cat file | sed -e 'command' | nl -b a
cat をあわせて使う。
sed -i でファイルを直接書き換えると、もとに戻すのが面倒くさい。 なので、実験にはオプションでやるか、cat を使う
直接書き換えるときは -i を使う
sed -i file
sed '10iName' file
または、cat を使う
cat file | sed '10iName'
カテゴリ整理
security コマンドを使うと、無線LANのパスワード(PSK)を平分で取得することができる。
WiFiのキーをSSIDごとに、キーチェインが保存しているので、それを指定して取り出す感じ
security find-generic-password -D "AirPort network password" -a $SSID -g
自分のキーチェインから取り出すのsudo はときに使わない、KeychainAgentからローカルのユーザー認証を聞かれるので自分のMacユーザー名とパスワードをいれる。
パスワードだけがほしいときは、 -w
オプションにする
security find-generic-password -D "AirPort network password" -a $SSID -w
takuya@Desktop$ security find-generic-password -D "AirPort network password" -a 0000docomo -g keychain: "/Library/Keychains/System.keychain" version: 256 class: "genp" attributes: 0x00000007 <blob>="0000docomo" 0x00000008 <blob>=<NULL> "acct"<blob>="0000docomo" "cdat"<timedate>=0x32303134303532353039333232305A00 "20140525093220Z\000" "crtr"<uint32>=<NULL> "cusi"<sint32>=<NULL> "desc"<blob>="AirPort network password" "gena"<blob>=<NULL> "icmt"<blob>=<NULL> "invi"<sint32>=<NULL> "mdat"<timedate>=0x32303134303532353039333232305A00 "20140525093220Z\000" "nega"<sint32>=<NULL> "prot"<blob>=<NULL> "scrp"<sint32>=<NULL> "svce"<blob>="AirPort" "type"<uint32>=<NULL> password: "B35D084737"
ちなみに 0000docomo は日本全体で共通なので公開しても構わないものである。
明示的にSSIDを指定してわかりやすくして上記例を書いたけど。オプションは次のもので十分
sudo security find-generic-password -a 0000docomo -w
これで十分。
オプションについて記述を追加
https://apple.stackexchange.com/questions/176119/how-to-access-the-wi-fi-password-through-terminal
mac には networksetup コマンドという、ネットワークでアレコレするためのコマンドが用意されている。
コマンドでアレコレできるけど、だんだんめんどくさくなって、Xcode立ち上げてAPI叩いちゃうんだけどさ。
networksetup コマンドの気持ちを理解してあげることにした。
たとえば、SSIDにつなぐときは次のようにする。
sudo networksetup -setairportnetwork en0 0000docomo shared_key
たとえば、DNSを上書きするには次のようにする
networksetup -setdnsservers Wi-Fi 8.8.8.8
networksetup -setairportpower <device name> <on off> networksetup -setdnsservers <networkservice> <dns1> [dns2] [...]
ヘルプを見れば書いてあるんだけど、いつもどっちなのか見失う。
<device name>
が en0 のようなデバイス名
<networkservice>
がネットワーク名
networksetup -listallhardwareports
実行すると、次のようになる。
Hardware Port: Wi-Fi Device: en0 Ethernet Address: 60:03:xxxxxxxxxx
ここの出力から
<networkservice>
と Hardware Port
が対応し、<device name>
と Device
が対応してることがわかる。
無線LANのことは歴史的背景から airport と呼ぶ。Wi-Fiなどのなまえは使わない。
なので無線LAN関連の設定コマンドを見るときは grep で airport してあげればいい。
takuya@my_command$ networksetup -setdnsservers | grep airport networksetup -getairportnetwork <device name> networksetup -setairportnetwork <device name> <network> [password] networksetup -getairportpower <device name> networksetup -setairportpower <device name> <on off>
同じように grep で見てあげれば、使い方が出てくる。
takuya@my_command$ networksetup | \grep -P "(?<=networksetup ).+proxy.+" Usage: networksetup -getwebproxy <networkservice> Usage: networksetup -setwebproxy <networkservice> <domain> <port number> <authenticated> <username> <password> Usage: networksetup -setwebproxystate <networkservice> <on off> Usage: networksetup -getsecurewebproxy <networkservice> Usage: networksetup -setsecurewebproxy <networkservice> <domain> <port number> <authenticated> <username> <password> Usage: networksetup -setsecurewebproxystate <networkservice> <on off> (略 Usage: networksetup -setautoproxyurl <networkservice> <url> Usage: networksetup -getautoproxyurl <networkservice> Usage: networksetup -setautoproxystate <networkservice> <on off>
たとえば、MACアドレスを変更したり、ルーティング・テーブルを変更したりといったことはできない。
man を見ると、次のように書いてある。
NETWORKSETUP(8) BSD System Manager's Manual NETWORKSETUP(8) NAME networksetup -- configuration tool for network settings in System Preferences.
man には次の通り、 network settings in System Preferences. つまり、システム環境設定でできることは全てできるってことですね。
6to4 とかあったんですね。。
おおいなぁ。
takuya@my_command$ networksetup -addDeviceToBond -duplicatenetworkservice -getinfo -listVLANs -removepreferredwirelessnetwork -setmanualwithdhcprouter -setv4off -addpreferredwirelessnetworkatindex -enableloginprofile -getmacaddress -listallhardwareports -renamenetworkservice -setmedia -setv6LinkLocal -connectpppoeservice -enablesystemprofile -getmedia -listallnetworkservices -set6to4automatic -setnetworkserviceenabled -setv6additionalroutes -create6to4service -enableuserprofile -getnetworkserviceenabled -listalluserprofiles -set6to4manual -setpassiveftp -setv6automatic -createBond -export8021xLoginProfiles -getpassiveftp -listdevicesthatsupportVLAN -setMTU -setpppoeaccountname -setv6manual -createVLAN -export8021xProfiles -getproxyautodiscovery -listlocations -setadditionalroutes -setpppoepassword -setv6off -createlocation -export8021xSystemProfile -getproxybypassdomains -listloginprofiles -setairportnetwork -setproxyautodiscovery -setwebproxy -createnetworkservice -export8021xUserProfiles -getsearchdomains -listnetworkserviceorder -setairportpower -setproxybypassdomains -setwebproxystate -createpppoeservice -getMTU -getsecurewebproxy -listpppoeservices -setbootp -setsearchdomains -showBondStatus -deleteBond -getadditionalroutes -getsocksfirewallproxy -listpreferredwirelessnetworks -setcomputername -setsecurewebproxy -showpppoestatus -deleteVLAN -getairportnetwork -getstreamingproxy -listvalidMTUrange -setdhcp -setsecurewebproxystate -switchtolocation -deletelocation -getairportpower -getv6additionalroutes -listvalidmedia -setdnsservers -setsocksfirewallproxy -version -deleteloginprofile -getcomputername -getwebproxy -ordernetworkservices -setftpproxy -setsocksfirewallproxystate -deletepppoeservice -getcurrentlocation -help -printcommands -setftpproxystate -setstreamingproxy -deleteuserprofile -getdnsservers -import8021xProfiles -removeDeviceFromBond -setgopherproxy -setstreamingproxystate -detectnewhardware -getftpproxy -isBondSupported -removeallpreferredwirelessnetworks -setgopherproxystate -settlsidentityonsystemprofile -disconnectpppoeservice -getgopherproxy -listBonds -removenetworkservice -setmanual -settlsidentityonuserprofile
man networksetup