ぼーっとしててやらかした。
履歴から入力してて、イライラしてるときに、truncate コマンドを本番環境に実行してしまった。もう詰んだ。死にたい。
二度とこんなことがないように
automysqlbackup
というパッケージを導入することにしました、
apt で
apt install automysqlbackup
mysql と一緒に入れておきましょう。
以前入れていたと思ったら、入って無くて本当に詰んだ。
履歴から入力してて、イライラしてるときに、truncate コマンドを本番環境に実行してしまった。もう詰んだ。死にたい。
automysqlbackup
というパッケージを導入することにしました、
apt install automysqlbackup
以前入れていたと思ったら、入って無くて本当に詰んだ。
Twitterの認証連携をして、AuthorizeApp したあとにメールアドレスの確認が必要になる。ほとんどの「JPサービス」はこの形態を取る。
認証を丸投げしてるんだからメールアドレスを必須にされても手間が増えて困るだけなんですよ。
かといってFacebookで認証連携なんてフレンドリストやメールアドレスを抜かれて困る。
選ぶんだけどメアドが必須にされるのはナゼ?
わたしには理解できないです。そのそも設計がオカシイんじゃないのか。
それとも法律で「メールアドレス」を回収するように求められるのかな?公衆無線LANのように??
-c 生成済みの md5sum の一覧とファイルを比較して改ざんを検出する。
事前にファイルのmd5sum の値の一覧を作成しておき、いまのファイルがそのファイルのハッシュ値と一致するかを調べておく。すると簡単に改竄検出や不正検出を見つけることが出来る。
最初に、md5sum の一覧を計算してファイルに書き出しておきます。
md5sum sample.txt > out.md5
次に、この出力結果を使ってファイルが一致するかチェックします
md5sum -c out.md5
out.md5の中身は次のようになっています。 md5値 ファイルPATH
が列挙されています。
c3cec535915d86f2ce51c668f6919696 sample.ext
チェック-c
の場合は、右側のファイルパスのファイルを探して、md5値を導出し事前に計算していた左側に一致するかを調べてくれます。
1ファイルだと何の役に立つかわかりにくいのですが、フォルダの中のまとめてチェックすると強いです。
find コマンドや xargs と組合せる。 フォルダのすべてのファイルについて、md5を計算する
sudo find /etc/ -mindepth 1 -type f -exec md5sum {} \; > etc.md5
結果を使って、フォルダの中のすべてのファイルについて、ファイルの改竄検出を行う。
sudo md5sum -c etc.md5
bash の if 文でつかときは --status
オプションが便利です。
このオプションを付けると、表示をしない代わりに、チェック結果をコマンドの実行結果で返してくれます。
if ( md5sum -c --status etc.md5 ) ; do echo "改竄チェックOK" else echo "改竄チェックNG" fi
これで有るフォルダの中が書き換わってないかを手軽に調べることが出来ます。
sudo md5sum -c out.md5 | grep -i failed
のようにしたら見つけることが出来ました。
もっと簡単にするには、
sudo md5sum --quiet -c out.md5
--quiet don't print OK for each successfully verified file
このオプションをつけるのもいいでしょうね。
もし、ハッシュ値保存したファイルを改ざんされると怖いので、ハッシュ値を保存したファイルのハッシュ値を取ってそれをブロックごととに保存していくといいです。このブロックが・・・
ブロックチェーン技術などで盛んにファイルの記録をハッシュ値で云々と叫ばれてます。 基本的にはハッシュ値を計算してファイルに保存してそのファイルのハッシュ値を計算してーってことです。似たようなものです。
フォルダの中のファイルつまり、あるエントリの内部のハッシュ値をすべて見るには、md5sum である程度十分です。便利だし。
衝突の可能性も有るでしょうがローカルファイルで衝突は可能性が低いしね。
How to access all your cloud files in one place in Windows 10 | TechRadar
nkf には -mB
と -MB
のペアがあるのでBase64のエンコードとデコードが出来る。
echo -n こんにちは | nkf -MB
echo 44GT44KT44Gr44Gh44Gv| nkf -mBW こんにちは
入力の文字コードを -W : utf8 で指定してる。
文字列だとうまくいく。nkf は「文字コード」を変えるコマンドなので、バイナリも文字として扱ってしまうのでデータは壊れる。アレコレすればいいだろうけど、そこまでやる必要は特になくbase64
コマンドを使ったほうが良いので。
とある文字列を処理していて、CP932(Shift_JIS ) がそのまま、URLエンコードされた文字に出会って、ちょっと面倒な自体になった 。 node の decodeURI/decodeURIComponent だとUTF-8を期待されて動かない。ruby/pythonだと内部文字コード*1から変換が面倒くさい。nkf で文字コードを変換を調べてたら、 nkf だけで行けることがわかった。
$ echo %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%EF%BC%81 | nkf --url-input こんにちは!
--url-input
オプションを使えば、デコード出来る
デコード結果をさらに utf8にするには -W
オプションをつけておけばいい。nkf --url-input -W
takuya@:~$ echo こんにちは! | nkf -MQ | sed s/=/%/g %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%EF%BC%81
-MQ
オプションはQuoted stream に変換するので、 =
を使ってる。それを%に変換すればいい
組合せて使います。
echo %82%B1%82%F1%82%C9%82%BF%82%CD | nkf -w --url-input こんにちは
NKFは枯れた技術だし安心して使えるわ。Windowsの文字コードがutf8にならねーかなぁ
文字コード変換コマンドの nkfの使い方と実例をまとめました。 - それマグで!
開くダイアログのフォルダ選択のときに、隠しファイルやフォルダを開きたいときがよくある。
ドットファイルやドットのフォルダ( .rbenv / . pyenv など)を開きたい。
たとえば、atom/visual studio code/intelli J のIDEでドットファイルを見たいときが結構ある。
私の場合 RubyMineやPycharm で rubygems や pythonのpip ファイルを見たいときが頻発した。毎回コマンドで指定するのも面倒くさいので、なんか方法がないか調べたらあった。
保存・開くダイアログで上記のショートカットを入力すると、ダイアログが開いて、フルパスで指定できるようになる。
残念ながら、補完は効かないようで・・・
フルパスを取得するには、いったんターミナルなどでフルパスを作ってクリップボードに入れておく必要がありますね。
Windows(田)のNTFSみたいに、フォルダ・ファイルごとに可視・不可視を切り替えらればいいのにね。APFSで導入されないかなー
jetbranins の rubymine の nvm / rbenv と webstorm で .npm / nvm など、ドットファイル (dotfile) になったフォルダから インタプリタで実行バイナリを選ぶときにこの方法が活躍する
rubymine などで実行環境SDKで .rbenv が出てこない時があってそのとき、この方法によって Shift+Cmd+G を押してフルパスを入力しフォルダを移動して解決する。
Windowsのホームディレクトリに出てくる、dotfiles を非表示にする。 - それマグで!
intellij で困ったので追記した。
_pry_.config.print = proc {}
irb の場合は
conf.echo = false
こうすれば、長いStringのスクロールで死ななくて済む
_pry_.config._print = _pry_.config.print _pry_.config.print = proc{}
元に戻す
_pry_.config.print = _pry_.config._print
これをトグルできる関数にしてくれると便利なんだけどな。
https://github.com/pry/pry/wiki/Customization-and-configuration#Config_print
--print-pdf
オプションHTMLをPDFに変換するコマンドは、いくつか有るけれど、 chrome のオプションだけで実現できる。
しかも chrome59 から headless
オプションがあって更に便利になった。
chrome-bin --headless --print-pdf=path/to/output.pdf input_url
input_url のところには、ブラウザで開けるものなら、大抵のものが入る。
ローカルファイルなども印刷するできる。
chrome-bin --headless --print-pdf=path/to/output.pdf /path/to/index.html
macOS X の場合は .app の中身をたどって指定する必要がある。
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --headless\ --print-to-pdf='/Users/takuya/Desktop/a.pdf' \ file:/Users/takuya/Desktop/sample.html
ログインが必要なURLなどはどうするのか。
Cookieを拾ってくるしか無い。Cookieはプロファイルに入ってるのでプロファイルから拾うしかない。
--user-data-dir=/Users/takuya/Library/ApplicationSupport/Google/Chrome/Default/"
プロファイルを指定することでCookieを拾えるのでそこから何とかする。ただし、プロファイルは起動時にロックが掛かるので、同時に複数のインスタンスで使用できない。その為に、セッションのCookieは扱うのがとても面倒なので、Chromeをいったん終了したら消えてしまうセッションCookieを扱うには、Chromeを強制終了したりSelenium側でAddCookieするとか面倒くさい処理がひつようになる。
Chromeを webdriverでアクセスすると iframe で作られた、印刷プレビューにアクセスするのがとてもめんどくさい。(セキュリティ関連のアレコレの制限をdisableオプションで取っ払えば出来るんだろうけど)
たとえば、某銀行の印刷プレビューページなどをそのまま取りたいとか。印刷用のCSSが正しく動くかどうかとか、テストしたい箇所も山ほどある。
1週間ほど毎日のように、あれこれ調べまくった結果、Chromeの起動オプションに –print-to-pdf がありました。しかしコレでは、「いま表示しているページ」を印刷するのが不便です。
Cookieを引き継ぐためにProfileを設定してChromeの再起動が必要です。
さらに探していたら、 --kiosk-printing
とう「最高」なオプションを見つけたので歓喜しました。
--kiosk-printing
とは?印刷ダイアログが開くと、印刷ボタンを無条件に押してくれます。これはキオスクモードで、ユーザーにプリンタの選択をさせない為に作られているようです。
この印刷ボタンを無条件に押してくれるオプションを使うとHTMLをPDFで保存してくれます。
Capabilitiesを活用します、そして該当ページへ移動したら、window.print()
を実行します。
caps = Selenium::WebDriver::Remote::Capabilities.chrome( "chromeOptions" => { "args" => [ '--kiosk-printing', ], "prefs" => { download: { default_directory: '/path/to/download' directory_upgrade: true, prompt_for_download: false, } } }) driver = Selenium::WebDriver.for :chrome , :desired_capabilities => caps driver.get 'chrome://version' driver.execute_script(' return window.print();')
window.print で表示された、印刷ダイアログで、ボタンを押すことは kioskオプションがやってるくれるのでSelenium側では処理をする必要がありません。
基本的には、保存先のディレクトリで指定したフォルダになりますが、設定が曖昧だと ~/Downloads
に保存されます。
もし、設定がうまくいかないときは 、Seleniumで次のページへアクセスして、設定を変更したら間違いなくうまくいく。
driver.get 'chrome://settings'
ruby ではログを出すときに Logger が便利です。
require 'logger' logger = Logger.new(STDOUT)
標準出力に出す場合は STDOUT($stdout) 、標準エラー出力に出す場合は STDERR($strerr) を指定する。
logger をインスタンス化したら、ログを書き出す。
logger.info('Hello Log') # => I, [2017-06-07T13:53:15.178750 #20342] INFO -- : Hello Log
log()
のような関数はなく、ログレベルに応じたメソッドを使う。
ログレベルは、 debug, info, warn, error, fatal, unknown があり、それぞれが、メソッド名になっている。
logger.debug('メッセージ') logger.info('メッセージ') logger.warn('メッセージ') logger.fatal('メッセージ') logger.unknown('メッセージ')
まとめて実行してみる。 Object.send(:method_name, args )
でインスタンスメソッドを呼び出せるのでそれを利用する。
[:debug,:info,:warn,:error,:fatal,:unknown].each{|e| logger.send(e,"message at level #{e}") }
実行結果
>> [:debug,:info,:warn,:error,:fatal,:unknown].each{|e| logger.send(e,"message at level #{e}") } D, [2017-06-07T13:55:36.802479 #20342] DEBUG -- : message at level debug I, [2017-06-07T13:55:36.802532 #20342] INFO -- : message at level info W, [2017-06-07T13:55:36.802549 #20342] WARN -- : message at level warn E, [2017-06-07T13:55:36.802562 #20342] ERROR -- : message at level error F, [2017-06-07T13:55:36.802574 #20342] FATAL -- : message at level fatal A, [2017-06-07T13:55:36.802585 #20342] ANY -- : message at level unknown
ログのレベルは次のようになっていて、debug が一番弱い。
一番弱いのはdebug。 弱いとは、設定でログ書き出しを無視することが出来る。
LOG_LEVELが info なら debug は書き出されない。
ログにはレベルがあって debug, info, warn, error, fatal, unknown
の順になっている。
デフォルトではすべてのログを出力する Logger::DEBUG(=0) になっていて、ログを出すとすべてが書かれる
require 'logger' logger = Logger.new(STDOUT) logger.level == Logger::DEBUG #=> true
INFOにすると、DEBUGのメッセージが無視される。
logger.level = Logger::INFO [:debug,:info,:warn,:error,:fatal,:unknown].each{|e| logger.send(e,"message at level #{e}") }
実行結果( debug のメッセージは捨てられる)
I, [2017-06-07T14:01:51.257465 #20342] INFO -- : message at level info W, [2017-06-07T14:01:51.257579 #20342] WARN -- : message at level warn E, [2017-06-07T14:01:51.257608 #20342] ERROR -- : message at level error F, [2017-06-07T14:01:51.257712 #20342] FATAL -- : message at level fatal A, [2017-06-07T14:01:51.257743 #20342] ANY -- : message at level unknown
ブロックで渡せる
logger.info { "現在のログレベルは " + logger.level.to_s + "です" } #=> I, [2017-06-07T14:05:42.599811 #20342] INFO -- : 現在のログレベルは 1です
できる。
開発中とか時刻は別にいらないんだけどってとき
logger.datetime_format = '%Y-%m-%d %H:%M:%S' logger.datetime_format = '' logger.info("サンプル") #=>I, [#20342] INFO -- : サンプル
proc を渡せばO.K.
logger.formatter = proc do |severity, datetime, progname, msg| ">>>>>> #{msg}\n" end logger.info("サンプル") # => >>>>>> サンプル
ある。ログ書式を元に、複数のサーバーからエラーログを集めたり、ログに基づいた通知をしたりする。
https://docs.ruby-lang.org/en/2.0.0/Logger.html#class-Logger-label-How+to+close+a+logger
まず、月初の01日を作ります。
Date.parse(Date.today.strftime('%Y-%m-01')).to_s
今月の1日を作る方法を知ってると後はなんでも応用が効くよね。
(Date.parse(Date.today.strftime('%Y-%m-01'))-1).to_s
strftime と parseが賢いので頼れば良いんだと思います。
この現象は、よく質問を受けます。(とくにiOS初心者の方々に)
常にFacebook アプリが開くのを当たり前と思ってる方々が、Safariで開いちゃうんだけど・・・という逆の質問もよく受けます。
リンクを長押しすると、メニューが出てきます。
このデフォルト動作を変更するには、長押しで開くメニューにすべての選択肢が出てきます。
この選択肢の意味は次のとおりです。
「どれが好きか」「選んでね」の質問と思いましょう。次回からの twitter.com のタッチ動作は「以前の選択」と同じ行動をiPhoneは繰り返します。
リンクを「Safariで開いたか・Twitter.appで開いたか」このどちらの選択をしたのか。iPhoneはこれを記憶しています。
そのため、ツイッタのアプリ選択したら、そこから先はずっとアプリで開くようになります。
逆に、Safariの「新規タブで開く」なら、そこから先はずっと、サファリで開くようになります。
Instagram や Facebook 、 Pinterst 、Tumblrなどその他のサイトでも同じです。常にSafariで開くようにすることもできれば、常にアプリで開くようにする事も出来ます。
たとえば、アプリで開くと無駄な通信を行ったり、通知されちゃったり、起動するたびに更新されて最後見てた箇所が喪失しちゃうなど不便があるので個人的にはSafariで閲覧する方法をおすすめします。パケット節約にも有利です。
この「開く・Open」の項目で選択した動作が重要です。本当に重要です。
デフォルトの動作を決定しておけば、アプリに転送されることも減少します(ゼロになるわけではない)
Instagramを開けたときに、アドレスバーの上部からレコメンドされて、AppStoreに転送されることも減少します。
このテクを活用して、
わたしは、SNSをSafariで開くことを「強くおすすめします」
通知が圧倒的に少なくなります。通知の現象はイライラとストレスを減らしてくれます。
とくにTwitterでRT爆発を食らったときは重宝します。Facebookのどうでもいい通知を一掃できるのもメリットです。
TwitterやFacebookやTumblrやInstagramはアプリごとに内蔵ブラウザをもっていて、その中に画像や動画を溜め込みます。
これらのアプリが溜め込んでいるキャッシュ量は油断してると数GB近くに達します。しかしキャッシュの削除はアプリをアンインストールしない限り出来ません。
その点、Safariで開くようにしておけば、キャッシュは出来る限り再利用されますし、キャッシュが爆発することもありません。またキャッシュだけを削除する手段も用意されています。またキャッシュはSafariが本体容量と合わせて上手に管理してくれます。
アプリは起動後10分ほど、ずっとバックグラウンドで起動しています。個人情報を収集したがるFacebookなどSNSは、はガンガンGPSやアレコレ通信をしてバッテリを摩耗させます。ハッキリ言って辛いです。
アプリを入れていると、バックグラウンドや起動時の通信でパケットを浪費してしまいます。起動時に何度も同じデータを取得したり、必要ないのにホーム画面を表示したり友達のログイン状況を通知してくれたりします。要らないですよね。数分でタイムラインの自動更新も行われたります。無駄です。
またアプリ・アップデートでパケットを浪費されたりします。
Safariで開くと、タイムラインを自動的に読み込みは動きますが、なんどもなんどもホームに飛ばされて再読込が実行されることがが減りました。
どうでしょう?これはTwitter以外にも使えるテクニックです。Facebookでも使えるテクニック。
アプリ側に制御を取られてしまうと、リンクやページや戻るでどのアプリを使用中かわからなくなって混乱することが多いので、Safariで開くとか決めておくと便利です。
もったいない!知らずに損してるiPhoneテクニック集 (impress QuickBooks)
Twitterでセフレを作る方法: もう出会い系サイトは古い!?
SSIDを指定して接続を切り替えたい
指定のSSIDに接続したい
networksetup -setairportnetwork en0 0001docomo networksetup -setairportnetwork en0 mobilepoint password(pre-sharekey )
マクドナルドきたら、マクドのWiFiにつなぎたいとか、0001docomoが電波悪いなーとか、
ぱぱっと飛んでる公衆WiFiに片っ端から試すコマンドも作れたり。重宝しますね。
メモって大事ですね。
chrome で pdf にサイトを保存することが可能です。Seleniumのscreenshot を作らなくても、単一なページであれば、PDFにすることが可能です
--print-to-pdf
オプション$ alias chrome='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' $ chrome --print-to-pdf='/Users/takuya/Desktop/a.pdf' https://www.yahoo.co.jp
--headless
オプションと併せて設定するととても便利です。
$ chrome --headless --print-to-pdf='/Users/takuya/Desktop/a.pdf' https://www.yahoo.co.jp
コマンドは次のようにするだけです。
chrome --headless --print-to-pdf='path.to.file' URL
とても簡単で、Chromeさえアレばどこでも使えるので、たとえばMarkdownー>HTMLー>PDFにするときなどに活躍しそうですね。
もし、それでも印刷できない場合はどうするのか?
幾つか解決策があります。
ひとつは、base タグの利用、もう一つが contentEditableの利用
base タグを使えば保存したHTMLでもドメインやPATHを固定できるのでそれを使うと殆どの場合解決する
それでも駄目なら、ContentEditableを有効にして、HTMLのほしい場所をクリップボードに送ってHTMLのスタイル付きで持ってくればいい。