それマグで!

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

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

ログをgrep してリアルタイム確認する確実な方法(tailf/tail -f と組み合わせ

tailf の結果をgrep してxargs したい場合

grep するだけなら問題ない。これは期待どおりに動く

tail -f   a.log  | grep name

grep が pipeの間に入ると厄介だ

tail -f a.log | grep name | grep type

この場合は正しく動作しない、中間に挟まったgrepがIOをバッファリングしてしまうので、最後のgrepまで即時にログが届かない

grep した結果をさらにパイプをしたいときにあれれ?となる。

ライン単位でバッファリングするようにする。

--line-buffered

コレをつけてバッファリングを行ごとにする。ただしこれはgrepそのもののパフォーマンスを劣化させるらしい(IO待ちのことでしょうね・・・何をどうして劣化するのかman には書いてなかったので気にしないことにしても良いような気が)

grep がバッファリングしてしまうので、確実に即時に反映されない。とくに コマンドの の間にgrep を挟み込みするときに厄介になる。

とくにtailf のような blocking io で ログが到着するまで、ブロックされるようなコマンドには特に威力を発揮する。

BSD/Linuxどちらも問題なく使えるようだ。

ログを監視して Slackに投げる方法で使いました。 →

http://takuya-1st.hatenablog.jp/entry/2017/05/11/073000

参考資料

リアルタイムに「tail -f」をgrepする方法 - Qiita

もしかして、Amazon って oAuth できるの?

ドメイン登録しようとしてて、ふと見たら・・・

あれ?認証連携アカウントがAmazon????

もしかしてAmazonってOAuthの連携ができるのではないか?

もし、アカウント連携できるなら強い

だってクレカ登録率高いもん。ショッピングサイトで使うなら絶対に強いアカウント連携ですよね。

f:id:takuya_1st:20170517012655p:plain

調べてみた

http://login.amazon.com/ にoAuthのキーワードがあるからワンちゃんいけそう。もう少し調べたいけど時間がないので誰か教えて・・・

script コマンドで作業内容をリモートで伝える

script コマンドで作業内容をリモートで伝える

screen コマンドの共有でも出来るけどね。script コマンドだけでも出来るよね。

screen の共有とかと同じです。

見せたい側で

script -f -a sample.log

みたい側で

tail -F sample.log

としておけばずっと見てられる。ファイルなので、パーミッションさえあってれば見られる。

tty / pty を共有先に指定したらもっと便利になると思う。

参考資料

GNU script と BSD script はコマンドのオプションが異なるので注意が必要

gnu script

名前
     script — 端末セッションの写し (typescript) を作成する。

書式
     script [-a] [-c COMMAND] [-f] [-q] [-t] [file]

説明
     script は端末に表示されたものすべての写し (typescript) を作成する。 これは宿題を出された学生が、インタラクティブ
     なセッションの ハードコピーを必要とする場合などに便利だろう。 記録された typescript ファイルを、後で lpr(1) など
     を使って印刷すれば良い。

     引き数 file が指定されると、 script はすべての記録を file に保存する。ファイル名が与えられなければ、写しは
     typescript というファイルに保存される。

     オプション:

     -a      出力を file または typescript に追加 (append) する。 以前の内容が保存される。

     -c COMMAND
             インタラクティブなシェルではなく、COMMAND を実行する。 標準出力が端末 (tty) でないと動作が変わってしまう
             プログラムの出力を、 script が簡単に記録できるようにする。

     -f      書き込みをするごとに出力をフラッシュする。 これは遠隔で共同作業をする場合に良い。 一方の人が `mkfifo
             foo; script -f foo' を実行した場合、 もう一方の人は、`cat foo' を使うことにより、 何が実行されているかを
             リアルタイムで監視することができる。

     -q      寡黙な動作にする。

     -t      タイミングデータを標準エラーに出力する。 このデータはスペースで区切られた 2 つのフィールドからなる。 1
             番目のフィールドは、前の出力からの経過時間を表す。 2 番目のフィールドは、そのときに何文字出力されたかを
             表す。 この情報は、タイピングと出力の実際の遅延時間で、写しを再現するために使われる。

     script は fork されたシェルが終了したときに記録を終える (Bourne シェル (sh(1)) を終わるには control-D を入力す
     る。 C シェル (csh(1)) なら exit, logout, control-d のいずれかを入力する。 ただし control-d が有効なのは
     ignoreeof がセットされていない場合である)。

     vi(1) のようなインタラクティブなコマンドでは、 typescript ファイルにゴミができることがある。 script は画面を操作
     しないコマンドを扱ったときに最もうまく動作する。 その場合の結果は、ハードコピー端末をエミュレートしたものとな
     る。

環境変数
     script は以下の環境変数を用いる。

     SHELL  環境変数 SHELL が定義されていると、 script が fork するシェルはそれになる。 SHELL が定義されていなけれ
            ば、 Bourne シェルが用いられる。 (ほとんどのシェルはこの環境変数を自動的にセットする。)

関連項目
     csh(1) (history メカニズムに関する部分), scriptreplay(1).

履歴
     script コマンドは 3.0BSD で登場した。

バグ
     script はラインフィードやバックスペースも含め、 すべて をログファイルに書きこむ。 これは普通のユーザが期待するも
     のとは異なるかもしれない。

MySQL/MariaDBのSQLとテーブル名を補完する mycli が便利

mycli が便利でやばい

SELECT / INSERT などを補完してくれて、テーブル名やカラム名を補完してくれて、SQLを色付けしてくれる。

f:id:takuya_1st:20170515010905p:plain

インストー

python で出来てるのでpip でインストー

pip install mycli

pip がないときは pyenv を

pyenv から準備すれば大丈夫です。

pyenv install $VERSION

pyenv の環境作成の手順は→ここに書いた

起動

mycli

引数なしで起動すると localhost:3308 の mysql に繋いでくれる。ローカルホスト以外に接続する場合やユーザー名やパスワード指定など、その他オプションは、mysql コマンドと同じ。

設定

初回起動すると、次のようなファイルが作られる。

 ~/.myclirc

このファイルにアレコレかくだけ。色付けは を変えるだけ

 38 # Syntax coloring style. Possible values (many support the "-dark" suffix):
 39 # manni, igor, xcode, vim, autumn, vs, rrt, native, perldoc, borland, tango, emacs,
 40 # friendly, monokai, paraiso, colorful, murphy, bw, pastie, paraiso, trac, default,
 41 # fruity.
 42 # Screenshots at http://mycli.net/syntax
 43 syntax_style = native

出力形式も選べる。MySQLに従いながら、

mysql takuya@localhost:epgrec> \T
Table type  not yet implemented.  Allowed types:
        simple
        plain
        grid
        fancy_grid
        pipe
        orgtbl
        psql
        rst
        mediawiki
        html
        latex
        latex_booktabs
        tsv
Time: 0.000s

主に使えるコマンド

mysql takuya@localhost:epgrec> ?
+-------------+-------------------+---------------------------------------------------------+
| Command     | Shortcut          | Description                                             |
|-------------+-------------------+---------------------------------------------------------|
| \G          | \G                | Display results vertically.                             |
| \dt         | \dt [table]       | List or describe tables.                                |
| \e          | \e                | Edit command with editor. (uses $EDITOR)                |
| \f          | \f [name]         | List or execute favorite queries.                       |
| \fd         | \fd [name]        | Delete a favorite query.                                |
| \fs         | \fs name query    | Save a favorite query.                                  |
| \l          | \l                | List databases.                                         |
| \timing     | \t                | Toggle timing of commands.                              |
| connect     | \r                | Reconnect to the database. Optional database argument.  |
| exit        | \q                | Exit.                                                   |
| help        | \?                | Show this help.                                         |
| nopager     | \n                | Disable pager, print to stdout.                         |
| notee       | notee             | stop writing to an output file                          |
| pager       | \P [command]      | Set PAGER. Print the query results via PAGER            |
| prompt      | \R                | Change prompt format.                                   |
| quit        | \q                | Quit.                                                   |
| rehash      | \#                | Refresh auto-completions.                               |
| source      | \. filename       | Execute commands from file.                             |
| status      | \s                | Get status information from the server.                 |
| system      | system [command]  | Execute a system commmand.                              |
| tableformat | \T                | Change Table Type.                                      |
| tee         | tee [-o] filename | write to an output file (optionally overwrite using -o) |
| use         | \u                | Change to a new database.                               |
+-------------+-------------------+---------------------------------------------------------+
Time: 0.003s

mysql だけの場合

MySQLmysql コマンドの場合は、次のようになってたので、使えるコマンドがだいぶ違いますね。

mysql> ?

For information about MySQL products and services, visit:
   http://www.mysql.com/
For developer information, including the MySQL Reference Manual, visit:
   http://dev.mysql.com/
To buy MySQL Enterprise support, training, or other products, visit:
   https://shop.mysql.com/

List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit      (\e) Edit command with $EDITOR.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
nopager   (\n) Disable pager, print to stdout.
notee     (\t) Don't write into outfile.
pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
system    (\!) Execute a system shell command.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.

どうやって出来てるのか

  • Python Prompt Toolkit
  • Sqlparse

を使って出来てるらしい

postgresql もあるの?

ある。 pgcli というのがある。

参考資料

http://mycli.net/install

https://orebibou.com/2017/05/sql%E8%A8%98%E8%BF%B0%E6%99%82%E3%81%AB%E3%82%AA%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%97%E3%83%AA%E3%83%BC%E3%83%88%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3/

pyenvを使って、pythonをインストールしてpython環境を使う。

pyenv をインストールする。

python 3.6 を使いたいなと思ってインストールをはじめました。

ユーザー空間にvirtualenv 作るより楽ちんだし pyenv 使おうぜ

インストール

git clone git://github.com/yyuu/pyenv.git ~/.pyenv

macOS なひとは

brew install pyenv

pyenv を起動するためのbashrc設定

pyenv は rbenvと同じくbash の機能を使ったPATH変更的に動くので、シェルの環境設定は大事

# pyenv を使う
if ( type  pyenv > /dev/null 2>&1  ||  [[ -d  ~/.pyenv  ]] ) &&  [[ $TERM != screen* ]] ; then
  ### pyenv
  export PYENV_ROOT="$HOME/.pyenv"
  export PATH="$PYENV_ROOT/bin:$PATH"
  eval "$(pyenv init -)"
fi

あとはコレを読み込めば準備完了

pyenv を使ったインストール

pyenv install 3.6.1

常時に使用するように設定

pyenv global 3.6.1

または特定のディレクトリで起動するようにセッティング

pyenv local 3.6.1

もともとあるpythonに戻そう

一時的に OS側に用意してある python に戻したいときは

python global system

これでオッケー。

pip もバージョンごとで管理される

pip で入れたパッケージも バージョン毎に管理される。

takuya@:~$ pyenv global 3.6.1
takuya@:~$ python -V
Python 3.6.1
takuya@:~$ pyenv global system
takuya@:~$ python -V
Python 2.7.9
takuya@:~$ mycli
pyenv: mycli: command not found

The `mycli' command exists in these Python versions:
  3.6.1

これは相当に楽ちんですね。

twitterの検索方法:自分の過去のツイート検索したり、リツイート検索したり、便利な検索方法

あのツイートどこだっけ?

あーあの retweet したやつ何処だっけ
あのときにTweetしたやつなんだけど

などと過去のリツイートやツイートを検索したいことが多々有りますよね。

検索方法が有ります。

引用元

たとえば自分の過去のツイートをRT含めて掘り出したいとき

ダイエット  include:nativeretweets from:自分のユーザーID

from:user_id@user_id でも代用できる

例ユーザーの過去のツイートから検索するには

ダイエット from:自分のユーザーID

例 ユーザーのツイートを日付(期間)で絞り込む

ダイエット until:2017-05-25 from:ユーザーID

@userID でメンションされてるのを探すには

ダイエット @userID until:2017-05-25 from:発言者

たとえば、オッパイ画像をさがすなら

リツイートがおおい画像を含むツイートを検索する例

filter:images min_retweets:1000 おっぱい

などとすることで、トレンドの検索ができる。でもトレンド検索はあまりあてにならないかも・・・

危険な発言と判定されているものを知る。 2023-05-20

from:takuya_1st -filter:safe

ツイッターが投稿内容を「危険」かどうか判定してセーフティか判定している。自分の投稿で「不適切」と判定されているものを調べることができる。

favorites もほしいなぁ

自分がふぁぼった(like/いいね)した一覧を見るのはAPI経由になるかも。。。

どうでしたか?

ツイート検索をして、彼氏の元カノや彼女の元カノを探したり、彼氏の裏垢をさがしたり、ツイート検索を覚えるだけで意中のターゲットのツイートを地域名や時間などで検索して掘り起こすことが出来ます。またあの頃言われたあの言葉のツイートを掘り起こしてニヤニヤすることも出来ます。

ちなみに、OR検索もできるらしいよ。

[asin:B00C1QD1W0:detail]

2023-05-20

不適切発言判定、safe について追記。

参考資料

tailコマンドで複数のログをまとめて表示する

同時に2つのログを見たい

tail -f を2つ起動して、ターミナル並べておくのも邪魔くさいと思ってました。

tail -f /path/to/log2 /path/to/log1 

こうすれば、複数のログファイルを同時に tail でウオッチできる。

いままでは

watch と cat を組合せてたのでこれは目からウロコだった。

実際に実行した例。

takuya@Desktop$ tail -F a.log b.log
==> a.log <==
aaaaa

==> a.log <==
aaaa

==> b.log <==
bbbb

==> a.log <==
aaaa

ログが書かれるたびに交互に表示されるので便利だった。

参考資料

https://hydrocul.github.io/wiki/commands/tail.html

tail コマンドがファイルの削除、作成時でも動くようにする

tail -f コマンドを使うとファイルの削除で動作が止まる。

tail -f /path/to/log

で ログファイルを見ているときに、別のプロセスでファイルが消えたら

ファイルが消えたら、動作が止まる。

mv /path/to/log /dev/null
rm /path/to/log 
echo hello > /path/to/log 

これはファイルディスクリプタだけを見ているので、ファイルが消えるとログを追尾できない

-F / –follow=name を使う

tail -F /path/to/log
tail --follow=name a.log

これでパス名のファイルの有無などを監視してくれるようになる。

tail -f は inotify や fsevent を見てると思うので、基本的には -F で良い気がする。

man tail

-f, --follow[={name|descriptor}]
              output appended data as the file grows;

              an absent option argument means 'descriptor'

-F     same as --follow=name --retry

inotify を見てる話はman にそう書いてる。

      -s, --sleep-interval=N
              with -f, sleep for approximately N seconds (default 1.0) between iterations; with inotify  and
              --pid=P, check process P at least once every N seconds

tail -f コマンドがログ監視てるプログラムが死んだら一緒に自動的に終了する

pid を指定すると tail コマンドが自動的に終了する

tail -f --pid=$PID /path/to/log

PIDを指定したときに

ローカルホスト開発ツールのログ監視してるときとかに便利ですね。

man tail

       --pid=PID
              with -f, terminate after process ID, PID dies

参考資料

https://hydrocul.github.io/wiki/commands/tail.html

ChromeのDeveloper tools(開発ツール)のコンソール(コマンドライン)で出てくる記号と関数

chrome の dev tools に出てくる関数

$ と $$ の違い

$ = document.querySelector
$$ = document.querySelectorAll

$x は Xpath

$x('//a')

xpath は組み立てと呼び出しが面倒なので、とても嬉しい。

その他の関数をマトメておくと

クエリ系

  • $
  • $$
  • $x

直前のものを再利用

  • $_

選択された要素

  • $0
  • $1
  • $2
  • $3
  • $4

デバッグ

  • debug
  • monitor/unmonitor
  • table
  • copy
  • profile/profileEnd

要素やオブジェクトの検証

  • inspect

イベントハンドラの監視と調査

  • getEventListeners
  • monitorEvents/unmonitorEvents

参考資料

https://developers.google.com/web/tools/chrome-devtools/console/command-line-reference?hl=ja#04

右クリックでEvernoteに送信する

右クリックでEvernoteにファイルを送りたい

Finderで右クリックでファイルをEvernoteに送るにはどうするか。

「このアプリケーションで開く」→「Evernote」とすればいいし、項目にEvernoteがなければ、その他から選べばいいいのですが。。。

最初から用意されてない拡張子が出てくるたびに登録するのが面倒くさい。UTI書き換えれば良いんだけどそれも面倒に感じた

右クリックメニューのサービス項目を作成した

f:id:takuya_1st:20170510154650p:plain

サービスを作ってすべてのファイルを大正にした。

前に作った コマンドを呼び出すようにする。

#!/bin/bash

path/to/file2evernote.js "$@"

右クリックメニューで出てくる

f:id:takuya_1st:20170510154828p:plain

これで気にせず使える。

ぱぱっとEvernoteにPDFやJPEGmarkdownCSSを放り込んで楽をすることが出来た。

Evernoteにファイルを投入するコマンド

Evernoteにファイルをまとめて放り込みたい。

コマンドでまとめてEvernoteに放り込みたい。APIを経由すると毎年〜キーを更新しなくちゃいけないので面倒くさい

なので、Apple Script ( の JavaScript ) でやろうと思う ( Windows な人は同じ目的で enscript.exe が使えます)

JavaScriptで自動化するときのポイント

コマンドを使って起動するときは

#!/usr/bin/env osascript -l JavaScript

ObjC.import('stdlib')  
/// ここがmain関数に相当する
function run( argv ){
  console.log("Hello World")
}

Evernote に新規ノートを作ってファイルを貼り付け

Evernoteに新規ノートを作ってファイルを貼り付ける場合は、次のようにする。

  var name = 'no title'
  var file_path = '/Users/takuya./.bashrc'
  var app = Application("Evernote")
  var notebooks = app.notebooks
  var defautNoteBook = Array.apply(null, notebooks).find(function(e){ return e.default })
  var note = app. createNote({
    title: name,
    notebook: defautNoteBook,
    withText : name
  })
  note.append({ attachment: Path(file_path) })
  app.activate()

NSString とFileManagerを使ってPATHの存在チェックなど

realpath と file_exist? をやって引数チェックする

file2evernote.js

ObjC.import('Cocoa')
nsStr = $.NSString.alloc.initWithUTF8String(file_path);
file_path = nsStr.stringByStandardizingPath.UTF8String;
mgr.fileExistsAtPath(e)

これをまとめてコマンドにする

引数で受け取ったファイルを一覧を処理してEvernoteに貼り付ける。

gist.github.com

使い方

./file2evernote.js *.jpg

JXAのJavaScript AutomationとObjc Cocoaのオブジェクト呼び出し例

JXA で NSString を使ってPATHの変換をしてみたのでメモ

objcのCocoa から NSString と FileManager を使ったので、いろいろ知見を得られたのでメモ。

Javascriptで、NSString を使うには、次のようにする。

ObjC.import('Cocoa')

NSStringを init して alloc する

## [[NSString alloc] init]
$.NSString.alloc.init

JS の文字列から NSString に変換する。

// [[NSString alloc] initWithUTF8String:"Hello world"];
nsStr = $.NSString.alloc.initWithUTF8String("Hello World.");

NSString から JS の文字列に変換する

JS文字列は基本的にObjC→C言語へ変換するのと同じ

// [@"Hello world" UTF8String]
var str = nsStr.UTF8String;

メソッドを呼び出す。

nsStr = $.alloc.initWithUTF8String("/Users/takuya/.bashrc")
nsStr = nsStr.stringByStandardizingPath
nsStr = nsStr.stringByStandardizingPath.UTF8String;

メソッドの呼び出しは CoCoa を書いてるときみたいに書けばいい。むしろ最後の丸括弧を除去した方がいいところが面喰らう的な。getter/setter なんかも同じ。

ポインタを引数に取るメソッドを使うとき、キーワード引数を使うとき

// - (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;

mgr = $.NSFileManager.defaultManager;
var isDir= Ref();
mgr.fileExistsAtPathIsDirectory(e,isDir) && isDir[0]

変数のポインタを扱うのは var ptr = Ref() で、デリファレンスするのは ptr[0] のように配列の中身を見る感じっぽい 同じ関数 fileExistsAtPath でもキーワード引数をつけるなら、引数を関数名にするのがみそらしい

参考資料

すごくわかり易い例がいっぱいあって助かりました。

http://palepoli.skr.jp/tips/javascript/jxa.php

Selenium で フォーム送信

Selenium で フォーム送信 するには。

若干のWaitを入れてあげるとうまく動くと思う。

driver.goto 'https://example.com/login'
wait = Selenium::WebDriver::Wait.new(:timeout => 3) # second
## ページロードを待つ
wait.until { driver.xpath('//*[@id="clogs"]/input[1]').displayed? }
## フォーム送信をするには send_keysを使う
driver.xpath('//*[@id="clogs"]/input[1]').send_keys('takuya***')
driver.xpath('//*[@id="clogs"]/input[2]').send_keys('***')
driver.xpath('//*[@id="clogs"]').submit

Selenium使おうとしたらchromedriverが古くてエラーになった。

selenium 使おうとしたらエラーになった。

>> require 'selenium-webdriver'
=> true
>> driver = Selenium::WebDriver.for :chrome , :desired_capabilities => caps
NameError: undefined local variable or method `caps' for main:Object
from (pry):2:in `__pry__'
>> driver = Selenium::WebDriver.for :chrome
EOFError: end of file reached
from
>>

EOFErrorになったので調べたら、 ChromeDriverが古い事が原因のようです。

バージョン確認

takuya@Desktop$ /Users/takuya/repos/my_command/usr/local/bin/chromedriver -v

バージョン確認したら 結構古かった。はずかしいのでバージョンは書かない。

brew でアップデート

brew でパッケージが提供されるようになったので楽ちん

takuya@Desktop$ brew install chromedriver
Updating Homebrew...
==> Auto-updated Homebrew!

アップデート後に再確認

>> require 'selenium-webdriver'
=> true
>> driver = Selenium::WebDriver.for :chrome
=> #<Selenium::WebDriver::Driver:0x..fa2af2f73e150f72c browser=:chrome>
>> driver
driver
>> driver
driver
>> driver.close
=> nil
>>

問題なく動く。EOF Error が バージョンだと気づくまでに1時間位かかった。迂闊だった。