シェル芸botでそんな感じの処理について実行されてたので、どんな方法があるのか一通りまとめてみることにした。
とりあえず、GNU sedやperl、rubyなら正規表現の\Bがあるので、それを使えばいいだろう。
echo あいうえお | sed 's/\B/x/g'
echo あいうえお | perl -C -ple 'use utf8;s/\B/x/g'
echo あいうえお | ruby -ple '$_.gsub!(/\B/,"・")'
blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお | sed 's/\B/x/g'
あxいxうxえxお
black...
Elasticsearchでメールアドレスを登録する際、ドメイン名でのみヒットするようにしたいということがあったので、そのいった処理ができるようanalyzerを設定してみたのでその備忘。
今まで知らなかったのだけど、Analyzerで指定できるchar_filterでは正規表現での値の置換が行えるらしく、それで@より前を全て削除することでドメインのみをtokenとして登録できるようだ。
以下、定義用のjsonサンプル。
{
"settings": {
"analysis": {
"analyzer": {
"domain_split_analy...
たまーにsshで直接コマンドを実行する事があるのだが、この場合だと擬似端末(pty)が有効にならない。
こうなると、authorized_keysなどで実行できるコマンドを制限している際、擬似端末が無いと挙動がおかしくなるようなプログラムを実行させる時にちょっと困る事がある。
blacknon@BS-PUB-UBUNTU-01:~$ env | grep -i tty
SSH_TTY=/dev/pts/0
blacknon@BS-PUB-UBUNTU-01:~$ ssh blacknon@bs-pub-ubuntu-02
blacknon@bs-pub-ubuntu-02's passwo...
最近知ったのだけど、Unicodeには1~12月まで、1日~31日までを一文字で表現する文字が存在している。電報記号というらしい。
知らなかった。電報使ったこと無いし、実際にこういった文字が使われているのかもわからないけど。
以下のコマンドで一覧を出力してみる。
zsh -c "echo {$'\U32C0'..$'\U32CB'}"
zsh -c "echo {$'\U33E0'..$'\U33FE'}"
blacknon@BS-PUB-UBUNTU-01:~$ zsh -c "echo {$'\U32C0'..$'\U32CB'}"
㋀ ㋁ ㋂ ㋃ ㋄ ㋅ ㋆ ㋇ ㋈ ㋉ ㋊...
Pythonでmultiprocessingを行う際、各プロセスの返り値を取得したいということがあったので備忘として残しておく。
色々と調べてみたところ、以下のように multiprocessing.Pipe
を使って返り値を配列として取得し、それを後ほど分解するのがよさそうだ。
import multiprocessing
def worker(string, send_rev):
result = str(string) + '_result'
send_rev.send(result)
def main():
job_list = []
pip...
Elasticsearchにメールアドレスを放り込む際、どうもサブドメイン等でSearchを行う際にうまく検索ができないことがあった。
そもそもElasticsearchの検索の仕組みをよく理解できてなかったのもあるのだが、ドキュメント作成時にAnalyzerで分割した文字単位で検索を行うようだ。
で、その差異にデフォルトのAnalyzerではうまくメールアドレスの分割ができていなかったのが原因のようだ。
Elasticsearchでは、以下のようにリクエストを投げることでAnalyzerでどのように分割されるのかを見ることができるので、それでメールアドレスがどのように分割されるのか見てみ...
scpを使う場合、サーバ側にもscpがインストールされて無いといけないのだけど、ごくたまにscpがインストールされていない場合がある。
そんなときは、以下のようにすることでsshコマンド経由でファイルのやり取りをすることができる。
単体ファイルの場合
cat file | ssh user@host 'cat > ./file' # リモートサーバにコピーする場合
ssh user@host 'cat ./file' | cat > ./file # リモートサーバからコピーする場合
諸事情あってascii以外の文字列をファイルから排除する必要があったので、備忘として正規表現を残しておく。
以下のように、Perlの正規表現を使ってやることでascii以外の文字を含む行を排除できる。
grep -v -P '[^\x00-\x7F]' FILE
先日、Twitterでこんなツイートを見かけた。
先日、Twitterで警察の人事で肩書が異常に長い方について話題になってた。
ニュースのリンクはこちら。たしかに長い…(´・ω・`)。
なに書いてあるんだかさっぱりである。「兼
」って字がいっぱいあるのとサイバーセキュリティだということはわかった、みたいな感じ。
とりあえず兼任している肩書を改行させてみよう。
...
ElasticsearchでAggregationsを使って集計処理を行っていたところ、どうも件数が少なかった。
で調べてみたところ、どうやら抽出結果と同じくこちらもデフォルトでは10件までしか取得できないらしい。
で、集計結果を10件以上取得するにはどうすれば良いのかなと調べてみたところ、どうやらクエリ内でサイズを指定して、そこから取得する必要があるようだ。上限は10,000件らしい。
s_base_query = {
'query':{'bool':{'must':[],'should':[]}},
'size': 0,
'a...
Pythonを使ってElasticsearchからデータを取ってくる際、どうも計算が合わない。
なんでだろうなぁと思い調べてみたところ、どうやらElasticsearchではデータを取得する際、デフォルトでは10件までしか取得できないらしい。で、10件以上のデータを取得する場合だと、以下の方法があるようだ。
- scrollでデータを繰り返し取得して条件にあったデータを全て取得してくる
- query実行時にsizeを指定することで指定した件数までのデータを取得する(上限は10,000まで?)
上限があるというのもあり、2個目の方法はちょっと…
という訳で、scrollで処理をさせることに...
PythonからElasticsearchへや大量にクエリ(indexだけではなくcreateやupdate、deleteも)を投げる処理を行う必要があったので、Bulkでまとめて処理をさせることになった。
Bulk処理をさせる場合、helpersがよく使用されているので今回はそれを利用する。以下のように記述することで、createやupdate、deleteについてbulk処理を行わせる事ができる。以下の例では、dataに入っている各データをcreateでbulk処理させている(Elasticsearchへの接続処理等は省略)。
es_index = 'INDEX'
es_doc = '...