コマンドを Popen に渡すときに
コマンドを組み立てた文字列を配列で渡すなら、split が便利だけど、shlex.split ならさらに安全に渡せるらしい。
self.prcs = Popen( shlex.split(cmd), shell=False )
たしかに文字列をsplit すると暴走するものね。
また shlex.quote もあるのでこちらも便利そう
Shell経由させないほうが孫プロセスを作らなくて楽なイメージ有る。
コマンドを組み立てた文字列を配列で渡すなら、split が便利だけど、shlex.split ならさらに安全に渡せるらしい。
self.prcs = Popen( shlex.split(cmd), shell=False )
たしかに文字列をsplit すると暴走するものね。
また shlex.quote もあるのでこちらも便利そう
Shell経由させないほうが孫プロセスを作らなくて楽なイメージ有る。
mariaDB に変えたので、PAMによる認証連携は、最初から付属してます。便利!
mysql の管理者(root) で ログインしてプラグインを有効化する
INSTALL SONAME 'auth_pam';
これでほとんど完了。あー楽。
mysql にユーザーを追加する。
CREATE USER takuya identified via pam
これでいい。楽ちん。
ここは何もしなくて良さそう。auth を使うみたい。以前に mysql + pam であれこれ設定してるので、パーミッションとかは省略して動いた。
もし、mysql やmariadb といった名前でPAMに書きたい場合(たとえば www-data や apache や postgresql などと共通名にしたいとか)
ユーザーできたので、プラグインがPAMに認証を丸投げできるように、PAM側で受け取れるように設定する。
CREATE USER takuya identified via pam USING 'my-pam-name' #
以前はこっちをやってた。
同じことを homebrew の brew コマンドでやるにはどうすればいいか
brew outdated
これで、新しくなってる brew のパッケージの一覧が取得できる。
https://stackoverflow.com/questions/12946505/how-can-i-tell-which-homebrew-formulae-are-upgradable
探したら、policykit-1 というパッケージに含まれてた。
http://manpages.ubuntu.com/manpages/xenial/man1/pkexec.1.html
pkexec の pk は policy kit の略なんですね
ubuntu の LTS Serverには含まれてなかったんですよね。。。便利だから使ってるけど余り一般的ではないコマンドなのなか。本来なら pkexec の代わりには何を使うべきなんだろう。
sudo だと環境変数の設定を sudoers に書く必要とかあるし、gksudo だと面倒だし一覧楽な do as だと思うんだけどな。
nginx の プロキシの upstream を unix ドメインソケットに設定したのだけれど動かないのね。 だから、ソケットが正しく動いてるかテストしてみたかったの。
nc -U unix:/path/to/some.sock
コレを使えばコマンドからunixソケットにアクセスして、アクセス可能かテストできるし、パーミッションもここでテストできる。
echo ' GET / ' | nc -U /path/to/unicorn.sock
これで応答するか調べられる。
pkexec でnc 実行して別ユーザからの読込とアクセスを見てみたら確認できた
echo "GET /" | sudo pkexec --user www-data nc -U /var/opt/gitlab/gitlab-workhorse/socket nc: unix connect failed: Permission denied
これで、 www-data ( nginx ) から gitlab のソケットにアクセスできてないことが分かる。
アクセス出来ないときはパーミッションをいじるよりもグループをいじったほうが確実だね。
usermod -aG gitlab-wwwdata www-data
これで試してみる
echo "GET /" | sudo pkexec --user www-data nc -U /var/opt/gitlab/gitlab-workhorse/socket HTTP/1.1 400 Bad Request Content-Type: text/plain; charset=utf-8 Connection: close
400 Bad request が正しく返ってくるので通信できることがわかった。これでnginx の設定が間違ってないことが確認できて安心。
traditional な nc ( netcat ) は -U オプションが存在しないので、invalid オプションになる。
/bin/nc.openbsd
nc: invalid option -- 'U' nc -h for help
BSDパッケージのnetcat をインストールする必要があった。
apt install netcat-openbsd
zip ファイルをアップロードしたり、バックアップしたりしてて、「ファイルが壊れた」のを検出したりしたかった。状況を再現したいなと思ってもそう簡単に壊れたりはしないので、壊れたファイルを作る必要がああった。
dd
壊れたファイルを作るには、ファイルに0バイトを書き込んで壊したり、半分にちぎったり、変なバイトを書き込む。
これをやるには cp などのコマンドでは出来ないので、 dd コマンド
を使うことになる。Cやpythonやruby でfopenして書いても良いんだけど、dd コマンドが一番楽だと思う。
最初に dd でファイルをコピーして、使い方を確認しておく
takuya@Desktop$ dd if=test.zip of=test.safe.zip 0+1 records in 0+1 records out 438 bytes copied, 0.000324 s, 1.4 MB/s takuya@Desktop$ md5sum test*.zip 48949110457174e7f10541080235174b test.safe.zip 48949110457174e7f10541080235174b test.zip
先頭から400バイトを読み込んで、残りをコピーぜずに、中断された状況を作ってみる。
takuya@Desktop$ dd if=test.zip of=test.corrupted.zip bs=1 count=400 400+0 records in 400+0 records out 400 bytes copied, 0.00151 s, 265 kB/s
結果を確認
takuya@Desktop$ md5sum test*.zip 7eeef77e910c3a770c557e3bb9d3d8a1 test.corrupted.zip 48949110457174e7f10541080235174b test.zip
壊れたことを確認する。 unzip しようとしても、return code = 9 が帰ってきて、異常終了したことが分かる。
takuya@Desktop$ unzip -t test.corrupted.zip ; echo $? Archive: test.corrupted.zip End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. unzip: cannot find zipfile directory in one of test.corrupted.zip or test.corrupted.zip.zip, and cannot find test.corrupted.zip.ZIP, period. 9
ただしこの状態でも zip のエントリ一覧は取れたりする・・・だから壊れたことを再現できるよね。
takuya@Desktop$ lsar test.corrupted.zip ; echo $? test.corrupted.zip: Zip tet/ tet/a tet/b 0
最初に、変なバイトを書き込むファイルを用意する。
takuya@Desktop$ cp test.zip test.wrong-byte.zip
400 バイト目から、30バイトのZEROを書き込んで壊す。
takuya@Desktop$ dd if=/dev/zero of=test.wrong-byte.zip bs=1 skip=400 count=30 30+0 records in 30+0 records out 30 bytes copied, 0.000153 s, 196 kB/s
ファイルが壊れたことを確認してみる
takuya@Desktop$ unzip test.wrong-byte.zip -t Archive: test.wrong-byte.zip End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. unzip: cannot find zipfile directory in one of test.wrong-byte.zip or test.wrong-byte.zip.zip, and cannot find test.wrong-byte.zip.ZIP, period.
これで、ファイルが壊れたりHDDが壊れて、ファイルが正しく転送できなかったとかプログラマ(わたし)がアホで、ファイルの転送時のネットワーク・エラー処理が甘く変なファイルが作っちゃったとか事件を再現してソレに対応した回復プログラムを作れる実験出来ると思った。
キーチェーンはパスワードの管理ツールとしてとても優秀で。
OSにバンドルされてる所が更に魅力的なんです。
パスワードを入手するには、ダブルクリックで開くしか無いと思ってたら。
取得したいパスワードを「クリップボード」に入れるのであとは、ブラウザやアプリ側で貼り付けるだけ
右クリックしたらmacOSのパスワードを聞かれるので、MacからKeychainsに許可を与えればクリップボードにパスワードが降ってくる。楽ちん。
チャットワークとかいうクソアプリが対応してないのでブラウザでログインしなくちゃいけないわけですが。Mac app Store のアプリはパスワードを使えたと思うんだけど・・・なんでログインだけ毎回入れなきゃならないんだろう。 oAuth でブラウザに転送してくれたら良いのに。アプリ内でログインなんて手間なだけだろ。。。
php のプロジェクトってちまちま転送してると、面倒くさいんですよね。ファイル監視してrsync するのに、grunt とか持ち出すのも馬鹿馬鹿しい。
かといって、サーバーにログインしてvim で編集するとIDE使えないし、コーディング規約を守るに自動整形が使えない。かといって、SFTPアクセスでエディタで開いて編集するのもかったるい。
他になんか有る?
選択肢 | 面倒なところ |
---|---|
unison | バージョンを揃える } |
lsyncd | 設定ファイルとサーバ側への導入 |
sshfs | 遅い, FUSE導入面倒くさい、オフラインで困る |
NFS系 | 認証と導入設定とメンテが面倒、ポートも面倒 |
dropbox系 | アカウントと課金、同期遅い |
git | commit/push/push をfsevent でやると本末転倒 |
選択肢としてやっぱりこれしかないのかな。ファイル更新のイベント通知をOSから受け取って、更新されたファイルだけを転送したい。
すると、 ファイル更新イベント + rsync
の組合せが楽チンで無難な選択肢になるわけです。
python でファイル更新イベントを監視して、ファイル更新がきたら転送する
ruby で書いたけど、ruby ダメだ。python のwatchdog で書き直した。
IntelliJがファイル保存同時に .idea/
を更新するので IDEがファイル更新イベントを作りまくるのでイベント検出後数秒スリープしてその間のイベントを無視するようにした。これで ファイル更新されたあとの プリプロセッサでイベント拾いまくる事が簡単に防げると思う。
#!/usr/bin/env python3 import sys from watchdog.observers import Observer from watchdog.events import PatternMatchingEventHandler from subprocess import Popen import shlex import time class SyncUpload( PatternMatchingEventHandler ) : def __init__(self,*args, **kwargs): super(SyncUpload,self).__init__(*args,**kwargs) self.prcs = None def start(self, path ): self.watch_path = path observer = Observer() observer.schedule( self, path, recursive=True ) observer.start() try: observer.join() except KeyboardInterrupt: observer.stop() except: observer.stop() def on_any_event( self, evt ): if self.prcs and self.prcs.poll() == None : # 実行中ならキャンセルする pass else: time.sleep(1) # cmd = "bash -c 'for i in {1..3} ; do echo 1 ; sleep 1 ; done; ' " cmd = "rsync -avz '%s' server:path/to/dir/ " % self.watch_path self.prcs = Popen( shlex.split(cmd) ) if __name__ == '__main__': path = sys.argv[1] if len( sys.argv ) > 1 else './' obj = SyncUpload( ['*.php'] ) obj.start( path )
オレオレDropBoxをrsyncで作る。 - それマグで!
lsyncd を使ってWinSCP的なリアルタイム同期を実現する.使い方 - それマグで!
http://takuya-1st.hatenablog.jp/entry/20111118/1321594453
他にも unison があるけど、unison はバージョンを併せないと動作しないのでめっちゃ面倒くさい。
lsyncd は片方向で使うのには、面倒だと思う、特に設定ファイルとサーバー側導入が面倒くさい。
しらべたら、 /tmp の中に wifi ログって言うファイルが300くらいあった。なんでや。。。
sudo wdutil log -wifi
これでログを取らなくなるので、静になる。
https://superuser.com/questions/1064351/when-tmp-wifi-log-will-show-up-and-how-can-i-stop-it
jQuery に依存してたり、細かなイベントが取れなかったり、設定が煩雑だったり、もっと簡単に出来るだろう。と思ってたけど
ネット探して片っ端から試したけど、これ。というのがない。
仕方ないので作った。画像を真ん中に寄せたり、要素を真ん中に寄せてポップアップするのにどれだけ苦労したら良いんだ。。。 そもそも画像のモーダルウインドウのポップアップってあんまり好きじゃないのですよね。
要は、画像をクリックして拡大したり、画面の orientation(向き)を変えても追従してくれたり、画面をリサイズしても追従してくれたり、ちゃんと真ん中でてくれて、jQueryを不要なやつで、DOM API のちょっと古いやつでも動くやつ*1がほしいわけです。
それも、画像じゃなくて指定したElementをポップアップさせたいわけですよ。
拡大したい要素に、data-modal-image
属性を追加する。
<div style='width:150px'> <img src='path/to/image' data-modal-image > </div> <script> document.addEventListener('DOMContentLoaded',function(){ var md = new ModaLayer({}); md.add_lisnters(); }) </script>
指定した要素をポップアップするので、Width指定すると意図しない動作になることが有るのでdivで囲っておくと良い。
*1:などと言いつつflexbox使ってますが
出来るんですよ。 computedStyle
を使えば出来ます。
大昔は 紙Copiとかあったし、あの人はそのまま、カーリル作ったりGyazo買収して忙しそうですけど。ScrapBoxはちょっと依存強すぎてすきになれないので、自前で作るかと昔のソース引っ張り出してた。
要素の見た目保持したやつ、現代のDOM API だととても簡単にかける。
cloneNode だと要素は取れてもスタイルは取れないので、要素のスタイルを取ってきて、見た目をそのままに、完全にコピーするような感じで、取ってくる。
キャプチャ画像にはかなわないけど、ある程度までは近くなる。
これだけです。
var clone_node_recursively = function( src, deep, with_css ){ var src = src var dst = src.cloneNode(deep); if (with_css){ dst.style.cssText = document.defaultView.getComputedStyle(src, "").cssText; var a = src.querySelectorAll('*'); var b = dst.querySelectorAll('*'); var c = Array.from(a).map( function (e,idx) { return [a[idx], b[idx]] } ) c.forEach(function (e,i) { e[1].style.cssText = document.defaultView.getComputedStyle(e[0], "").cssText; }) } return dst }
ここで、要素に当たってるCSSの情報をテキストファイル化してる。
document.defaultView.getComputedStyle(src, "").cssText
あとは、子要素をたどるだけ。簡単。ただ、親要素の背景の上に乗ってたりするので、背景色は取ってこれないのが難点ですね。背景がなかったらかなり印象が違ってしまう。
←右のサイドバーからデータ取ってくる(PCのみ
昔は、これでサービス作って一儲けだみたいな某K氏と夢を語ってたけど、あれからもう10年かー早いな。
当時のブラウザだと、body を見た目のままソノママ取り出そうとすると、計算量と出力HTMLが膨大になって使い物にならなったけど、現代のブラウザとCPUだと軽々動くんですよねー、生まれる時代を間違えたんじゃないか。
var a = { name: "takuya", say: function() { console.log( this.name ) }, tel : { name:'iphone', display: function(){ console.log(this.name) } } } var str = JSON.serialize(a) var b = JSON.deserialize(str) b.say() // => takuya
//serialize/deserialize ツール JSON.serialize = function(obj){ try{ var str = JSON.stringify(obj, function replacer (k,v){ if(typeof v === "function"){ return v.toString() }; return v ; }) return str }catch(e){ return ""; } } JSON.deserialize=function(str){ try{ var obj = JSON.parse( str ,function reciever (k,v ) { if ( typeof v === "string" && v.match(/^function/) ){ return Function.call(this, "return "+ v )(); } return v }) return obj; }catch(e){ return null } }
こういうの、公式にアレば良いんだけどなかったんだっけ?
検索したキーワードを含むファイル名を取り出して、それを全部開いて処理したいときに
grep -l
-l
をつけるとファイル名だけを取り出すことが出来る。
l
なので line
ですね
unar コマンドで展開すると文字化けがあまり発生しない。
unar とペアになってる lsar コマンドも文字化けを余り起こさずにファイルを取り出せる。
また展開できる
lsar で一覧したファイルの中から、指定したファイルを取り出すには次の方法で出来る。
unar sample.zip 'img001.jpg'
いちいちディレクトリを作られるのが面倒なので、指定したファイルだけをぱぱっと取り出して標準出力に取り出してしまうと便利だった。
unar sample.zip 'img001.jpg' -r -o - > out.jpg
これは動かなかった。( mac 版での確認 )
unar sample.zip 'サンプル/img001.jpg' -r -o - > out.jpg
日本語が入ってた場合はもう絶望的ですが、ワイルドカードを使うことである程度は回避することが出来る。
unar sample.zip '*/img001.jpg' -r -o - > out.jpg
ちょっとしたトリックですが、アーカイブのディレクトリ内部にファイルがかぶってなければだいたいうまくいく。
日本語がマッチしないのは、ZIP内部のファイル名がCP932 でLinuxの 文字コードが UTF-8 のためかもしれない。 windows め・・・
切断して、オフして再起動して、接続する。
sudo airport -z sudo networksetup -setairportpower en0 off sudo networksetup -setairportpower en0 on networksetup -setairportnetwork en0 0001docomo
これをスクリプトにしておけば、びっくりしなくて済む。macOS X のWifiは優先度を高く設定してても、電波が強い方を優先するので、意図しないSSIDに繋いだりするので、注意が必要ですね。
sudo airport -z
ifdown コマンド相当
sudo networksetup -setairportpower en0 off
ifup コマンド相当
sudo networksetup -setairportpower en0 on
networksetup -setairportnetwork en0 0001docomo
sudo /usr/sbin/networksetup -setdhcp Wi-Fi
公衆無線LAN飛んでるととんでもないところにつなぐので、これで確実に接続を試行できる。
なぜか、再起動を挟まないとMacのWifiは DHCPや802.1認証でタイム・アウトしちゃうとその後の接続が全ておかしくなるんだよね。。。。
公衆無線LANが飛んでると便利な半面で、適当な業者は本当に迷惑だわ。