J’hopper’s Heaven (ジョッパーズヘブン)

ジョブホッパー・ボブがジョブホッパーでなくなる日を夢見るブログ

リストファイルから値を読み込んでその値をWHERE句で指定してPostgreSQLをSELECTしちゃうPythonコード

thought

おはよう!そして会えないときのためにこんにちは、こんばんは、そして、おやすみなさい。ジョブホッパー・ボブです。

あるカラムで特定の値をもつエントリーの別のカラムをSELECTしたい、ってときありますよね。えぇ、ボブにはそれはもうよくあります。(๑˃́ꇴ˂̀๑)

ひとつやふたつだったら、

$ psql -d <db_name>

で接続しちゃいなYO!(*δωδ*) そんで、

# SELECT column_a FROM table WHERE column_b = 'xxx'

でいーじゃない!ってなるんですけど、それがもし、5000個とかだったら、もはや思考停止。誰だそんな数検索するやつ、アタマオカシーンジャネーノ。寝よー寝よー、もう寝よぅ _(ˇωˇ」∠)_ スヤァ… ってなってしまいまつね。そうなる前に!!!今夜寝ちゃう前に!ナウい感じ(←死語)のPythonで、5000個でも何万個でもSELECTしちゃうコードをご紹介したいと思いますよ!(←もはや需要があるのは自分だけだけどな!)

リストファイルをつくる

スクリプトファイルの中にそんな大量の値を埋め込むのはよろしくないのでね、別のファイルで用意しましょうかね。。まぁたいてい、csvとか何かでどっかから依頼されてきた結果の5000個とかだったりするので、そこらへんは、適当にそのファイルを修正してだな。改行区切りで検索条件となる値を羅列していく感じで。

$ cat searchList.txt
59c07c1853b5dc000838e693
59c891378c51df00061261a9
59c8948e8c51df000a126396
:

PostgreSQL用ドライバをインストールする

ここ、大事。

$ pip install psycopg2

スクリプトを書く

おまじないとインポート
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import psycopg2
リストファイルを読み込む

うーん、このsplitのところは、改行コードに合わせる必要がありますけれども。Macはこれでいけた。

listFile = 'searchList.txt'
searchList = open(listFile)
searchData = searchList.read()
searchList.close()
searchLines = searchData.split('\r')
PostgreSQLに接続する
conn = psycopg2.connect("dbname=<db_name> host=localhost")
PostgreSQLにQuery

rowはリストなのだよ、うむ。( ・⊝・∞)

query = "SELECT column_a FROM table WHERE column_b = '%(searchId)s';"
cursor = conn.cursor()
cursor.execute(query % {'searchId':searchId})
row = cursor.fetchone()
row[0]

ミソは、%(searchId)s のところですな!!

結果をファイルに出力する

検索数がパないですからね、printだともう後が大変。そんなわけで、SELECTした結果は別ファイルに出力する感じにしちゃおぅ。

outFile = '<OUT FILE PATH>'
if os.path.exists(outFile):
  os.remove(outFile)
f = csv.writer(open(outFile, "wb+"))
f.writerow([
  'column_a',
  'column_b'
])

できあがったスクリプト

そんなわけで、こんなスクリプトができあがりましたょv(*´∀`*)v

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import psycopg2
import os
import csv

# CREATE OUT FILE AND SET HEADERS
outFile = '<OUT FILE PATH>'
if os.path.exists(outFile):
  os.remove(outFile)
f = csv.writer(open(outFile, "wb+"))
f.writerow([
  'column_a',
  'column_b'
])

# SET SEARCH FILE
listFile = 'searchList.txt'
searchList = open(listFile)
searchData = searchList.read()
searchList.close()
searchLines = searchData.split('\r')

# EXEC SEARCH
try:
  conn = psycopg2.connect("dbname=<db_name> host=localhost")
  for searchLine in searchLines:
    searchId = searchLine.strip()
    query = "SELECT column_a FROM table WHERE column_b = '%(searchId)s';"
    cursor = conn.cursor()
    cursor.execute(query % {'searchId':searchId})
    row = cursor.fetchone()
    cursor.close()
    f.writerow([
      searchId,
      row[0]
    ])

except Exception as e:
  print(e)

finally:
  conn.close()

まとめ

文字コードと改行コードには気をつけろ。(° ꈊ °)✧˖°オホッ!

もうそろそろサーバへのファイルアップロードといえばFTPとかいうのはやめてはどうか

FTP

おはよう!そして会えないときのためにこんにちは、こんばんは、そして、おやすみなさい。ジョブホッパー・ボブです。ョ´Д`)

絶賛移設中の鯖の現行設定に、FTPが入ってますた。なぜだ。なぜなんだ。なんでまだFTPとかつかってんだぁぁぁぁぁーーーーっ!!

SCPかSFTPではだめなのか、と。
いやむしろそっちだろ、と。
毎回パスワード入れるとか、気が狂ってるのか、と。
いやまさかパスワードがないのか、と。
平文通信で気持ち悪くないのか、と。
そりゃもうあれですよ、インターネットという大海原の中を全裸で走り回るようなもんなんですよ。色々出ちゃってるよ? 服着ようよ、服。せ、せめてパンツだけでも。

はい、というわけで、FTPポジション奪取に向けて、今回は、全力でSFTPとかSCPの魅力を語っていくよ!( ・`ω・´)キリッ

魅力その1. 丸見えじゃない。

SCPちゃんもSFTPちゃんも、お洋服着てインターネットの大海原を走り回るのでね。FTPちゃんみたいに、全裸じゃないですから。丸見えじゃないですよね。

ま、一般的には暗号化とよばれてますけれどもね、このお洋服は。コホン。あ、ついつい「暗号化」などという専門用語が。(・ω<) テヘペロ

魅力その2. 鯖に必要なのはSSH。そう、それだけ。

Linux界隈の鯖ですと、フツーにSSHがデフォルトでインストールされています。

そう、SCPちゃんもSFTPちゃんも、SSHさえインストールされてればオッケー!もーまんたい!使えちゃう!他にはもうなにもいらない!FTPちゃんみたいに、vsftpdみたいな追加インストールが必要ないですのよ、すてき。(●´∀`人´∀`○)

魅力その3. シェルスクリプトにやさしい。

定期的なアップロードとかダウンロードとかを自動化するのにシェルスクリプトを書くことがそれはもう息吸って吐く並みに普通にあるわけだけれども。その話でして。

これは、、SFTPちゃんには耳の痛い話なのだけれども。対話形式のやりとりってスクリプトにするのめんどいんす。expect コマンドを駆使すればまーできるんだけど、魔術師みたいなコードになってあとからみたときに、なんだろう、もう心ボキボキに折れるんだよね、解読に。あーー、もういいや、おしまい!ってなる。

なので、自動化するならもう100:0でSCPちゃんに軍配。(*´ω`)

魅力その4. オサレなMacユーザならターミナルでカコイィ!

黒い背景に白い文字。そう、それはターミナル。これはボブの個人的な志向ですが、あらゆる作業をターミナルでできるひとって、たとえうってるコマンドがpwdとlsのループだとしても、もうその雰囲気だけでイケメン。抱いて。

話が若干それたけど、SCPちゃんもSFTPちゃんもMacならターミナルからコマンドラインで実行できるからね。雰囲気イケメンになれること間違いなし!

Winユーザなひとはこちら↓
forest.watch.impress.co.jp

魅力その5. パスワードなしで使える

前もってファイルのアップロード(またはダウンロード)先に合鍵を渡しておくことで、パスワードなしであんなことやこんなことがし放題!

ま、一般的には公開鍵認証とよばれてますけれどもね、この合鍵は。コホン。あ、またついつい「公開鍵認証」などという専門用語が。(° ꈊ °)✧˖°オホッ!

まとめ

もう、そろそろ、FTPは、やめよ。てか、お願い、やめて。+゚(。pдq)+゚。エーン

RabbitMQでEvent Exchangeプラグインを使うときに知っておきたいこと

_human & rabbit

おはよう!そして会えないときのためにこんにちは、こんばんは、そして、おやすみなさい。ジョブホッパー・ボブです。

RabbitMQでコンシューマーコネクションを可視化するために、Event Exchangeを使う必要が生まれたので、その時に調べたり確認したメモ。ただのメモ。

すべてのRabbitMQのバージョンで使えないぽい

Σ( ゚皿゚)ガーン RabbitMQ 3.5.4ではプラグインとして表示すらされない。rabbitmq3.6.0以上のバージョンじゃないとだめ。

プラグインを有効にする方法
$ sudo rabbitmq-plugins list
$ sudo rabbitmq-plugins enable rabbitmq_event_exchange
Compose(コンポーズ)では利用できない

Compose上で動くRabbitMQには、rabbitmq_event_exchangeプラグインは有効にできない。悲しみ。

help.compose.com

www.compose.com

/ 以外のvhostではエラーになる

適当なvhostで動作確認してたら、エラーが大量発生してうまくいかなかったので、この機能は、/ で利用できる機能なんだ、と言い聞かせてる。

AWS S3バケットをRegionをまたいで移行する方法

Fire buckets

おはよう!そして会えないときのためにこんにちは、こんばんは、そして、おやすみなさい。ジョブホッパー・ボブです。

会社で目の青い同僚に、「この前作ったS3バケットのRegion間違えちゃってた。もぅデータ入れちゃった。いますぐなんとかして。あ、名前は変えないで。(´,,•ω•,,`)」って言われました。(´・∀・` )アラマァ
というわけで今回は、AWSのS3バケットをRegionをまたいで移動する方法ですょ!

全体の流れ

AWS CLIで、Region内のS3バケットの同期(全コピー)はできるのですが、Regionをまたぐコピーは直接できないんですよね。あと、バケットの名前はRegionに関係なく一意でなければならないので、ちょっと厄介。なので、一時的にデータを退避させるS3バケットを作ってやっていく感じになります。具体的には、こんな感じでしょうか。

  1. 移行先のRegionに一時バケットを作成して、移行元からデータを全コピー
  2. 移行元のRegionのバケットを削除
  3. 移行先のRegionに本来のバケットを作成(削除したバケットと同じ名前)
  4. 移行先のRegion内で一時バケットから本来のバケットにデータを全コピー
  5. 一時バケットを削除

同じ名前のバケットを登録できるようになるまで(2から3の間)、結構時間がかかる(ちなみにボブの場合は1時間半ぐらい登録できなかった)ので、心とカラダに余裕がある人向けですょ( ³ω³ )

準備

AWS CLIをインストールしてください。もうね、ここにしのごの書くより、AWSさんの素晴らしいドキュメントがありますので、それを見るのがいいと思うの。(´・∀・`)

docs.aws.amazon.com

ぱいそん。pipって、ピーアイピーって読むの?それともピップって読むの?エレキバンなの?

さっそく移行

「貴様は長く生きすぎた。」キャー!ケンシロウ様ぁ!!!!間違って作っちゃったS3バケットに罵声をあびせつつ、やっちまいますよ!щ(°Д゜)゛

移行先(us-east-1)のRegionで一時バケットを作成
$ aws s3 mb s3://<backet_name>-tmp --region us-east-1
移行元(us-west-2)から移行先(us-east-1)の一時バケットへデータを全コピー

ローカルPCを経由させる感じで。。

$ aws s3 cp s3://<backet_name>/ . --recursive --region us-west-2
$ aws s3 cp ./* s3://<backet_name>-tmp  --recursive --region us-east-1
移行元(us-west-2)バケットの削除
$ aws s3 rb --force s3://<backet_name> --region us-west-2

「お前はもう死んでいる。」はははー!言ってやったぜ!

移行先(us-east-1)で本来のバケットを作成
$ aws s3 mb s3://<backet_name> --region us-east-1
一時バケットから本来のバケットへデータを同期
$ aws s3 sync s3://<backet_name>-tmp s3://<backet_name> --region us-east-1
一時バケットの削除
$ aws s3 rb --force s3://<backet_name>-tmp --region us-east-1

できたー (° ꈊ °)✧˖°オホッ!

まとめ

やってることは大したことないのにだいぶ時間がかかるので、S3バケットのRegionは間違えたくない。。(・Θ・)

おまけ

バケットの削除が完了したら、なるべく早く同じ名前のバケットを登録したい!移行先(us-east-1)で本来のバケットを作成するスクリプトがこちら。

#!/bin/bash
RESULT=2
until [  $RESULT -eq 0 ]; do
  aws s3 mb s3://<backet_name> --region us-east-1
  RESULT=$?
  sleep 10
done
echo "Bucket created!"

Amazon LinuxにCertbotクライアントをインストールしてSSL証明書を取得する方法

Robots

おはよう!そして会えないときのためにこんにちは、こんばんは、そして、おやすみなさい。ジョブホッパー・ボブです。

無料でSSL証明書を取得できる日が来るなんて。( *¯ ꒳¯*)よきかな。期限は短いけれどもオレオレ証明書(自己証明書)みたいにブラウザ警告出ないし、すごくイィとオモイマス!はい、そこで今回はAmazon LinuxにCertbotクライアントをインストールして、SSL証明書を取得する方法です。

準備

DNS レコードの追加

Certbotクライアントをインストールするサーバを、SSL証明書を取得するドメインのレコードとして登録しておきます。

セキュリティポリシーの変更

CertbotクライアントでSSL証明書を取得する際、外からHTTP、およびHTTPS接続ができないと失敗してしまいますゆえ、tcp/80とtcp/443のポートをSourceをANY (0.0.0.0/0)で解放してクレメンス。

Certbotクライアントのインストール

今回はgit cloneで。

$ git clone https://github.com/certbot/certbot.git
$ sudo mv certbot /usr/local/

より詳しい内容は↓
github.com

CertbotでSSL証明書を取得

今回の環境はApacheもNginxもインストールされておりませぬ。何を隠そう、RabbitMQちゃんをSSL対応させたいだけなので、´。•ω•。` standaloneで証明書作成だけで行きたいとオモイマス!

$ cd /usr/local/certbot
$ sudo ./certbot-auto certonly --standalone -d <your domain>

これで、 /etc/letsencrypt/live の下に指定したドメインSSL証明書が生まれます。(実態はarchiveの下だけど。)

感想

超絶便利。(° ꈊ °)✧˖°オホッ!

Amazon LinuxにRabbitMQをRPMでサクッとインストールする方法

_human & rabbit

おはよう!そして会えないときのためにこんにちは、こんばんは、そして、おやすみなさい。ジョブホッパー・ボブです。

転職したら、OSがAmazon Linuxでした。"Σ⊂(☉ω☉∩ ) 壁ドンッ!
はい、今回は、Amazon LinuxにRabbitMQをサクッとインストールしちゃう方法です。

準備

何事も、準備がたいせつということで。

RabbitMQのバージョンを決める

今回はRabbitMQ 3.6.12をインストールすることにします。現時点での最新のようなので。ちなみに、RabbitMQの現行バージョンは、RabbitMQ - Released Artifactsから確認できます。あ、そうそう。3.5系と3.6系だと必要なerlangのバージョンとかsocatの必要有無とか違いますゆえ、お忘れなきよぅ。。

socatをインストール

インストールしてないと怒られちゃうからね。

$ sudo yum install socat
erlangのインストール

RabbitMQの3.6.0以降は必要なerlangのバージョンがepelレポジトリではインストールできないのでね。

$ sudo vi /etc/yum.repos.d/rabbitmq-erlang.repo
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/6
gpgcheck=1
gpgkey=https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1
$
$ sudo yum clean all
$ sudo yum makecache
$ sudo yum install erlang --enablerepo=rabbitmq-erlang

より詳しい内容は↓
github.com

RabbiMQをRPMでインストールする

はい、今回の山場はこれね。

RabbitMQのインストール
$ wget http://www.rabbitmq.com/releases/rabbitmq-server/current/rabbitmq-server-3.6.12-1.el6.noarch.rpm
$ sudo rpm -ivh rabbitmq-server-3.6.12-1.el6.noarch.rpm
RabbitMQのプロセス起動
$ sudo service rabbitmq-server start

これだけ。もぅ超絶簡単。(° ꈊ °)✧˖°オホッ!

感想

epelレポジトリが使えないってなるとイッキにめんどくさくなるょね。╮(´-ω-`)╭

ここが違うよ外資系!外資系エージェントの特徴3選

business men



おはよう!そして会えないときのためにこんにちは、こんばんは、そして、おやすみなさい。ジョブホッパー・ボブです。

 

突然ですが、外資系の転職エージェントを利用したことがありますか?

 

ジョブホッパー・ボブは、いくつかの外資系エージェントにお世話になったことがあります。そこで今回は、転職のために外資系の転職エージェントに登録しようと思っているひとを対象に、知っておきたい外資系エージェントと日系エージェントとの違いを、3つに絞ってご紹介します。

 

その1:雑なフィルタリングと合理主義

 

そもそも豊富な候補者がいないことが原因なのかもしれませんが、外資系の転職エージェントは、こちらの希望に100%マッチしたものを紹介してきません。日系のエージェントでも多少はこのような場合はあるのですが、外資系エージェントの場合には「絶対に譲れない」と伝えている項目をも、いとも簡単に無視して紹介してきます。

 

外資系エージェントのフィルタリングは、どうやら「候補者が次の企業で何を求めているか」ではなく、「これまでの職務経歴やスキルでマッチする企業」だけで行われているのではないか、と思わざるを得ません。転職エージェントは、企業からの成功報酬なので、できる限り企業が求める人材を紹介するのが彼らの報酬に直結します。外資系の転職エージェントのすべてがそうであるとは言いませんが、多くの外資系エージェントは、候補者よりも企業側を優先しているように思います。

 

しかし、彼らのやりかたが間違っている責めることはできません。無料で利用できる転職エージェントとはいえ、彼らも企業。利益の追求は、当たり前です。ですから、そうゆうものだという意識をもってつきあうことが重要です。外資系の転職エージェントとの付き合いには、日系エージェントのようにきめ細かい対応は期待できません。むしろ、ある程度の忍耐が必要です。

 

特に、転職によってキャリアチャレンジを考えている場合は、自分の希望に合った企業を紹介してもらえる確率が極めて低くなりますので、要注意です。

 

また、日系エージェントのような、面接対策や職務経歴書の作成サポート等もないところがほとんどです。

 

その2:いきなり連絡が途絶える

 

日系の転職エージェントの場合は、選考結果について、その結果が良い場合もそうでない場合も、きちんと連絡がきますが、外資系の転職エージェントの場合はそうとは限りません。

 

おそらくは、選考結果がよくなかったのでしょう。いきなり連絡が途絶えます。

 

ジョブホッパー・ボブの経験上、9割の外資系エージェントは、選考結果がOKでなかった場合、連絡が途絶えます。結果が出るまでは、平日は就業中だからいきなり電話とかヤメテよ!と伝えているにも関わらず日中にガンガン電話してきたくせに、本当にいきなり、連絡が途絶えます。いやいや、むしろ結果こそちゃんと連絡して!と思いますね、まったく。仕方ないので、2週間ほど待った上でこちらから問い合わせると、「まだ確認中だからチョットまってて!それより、こっちの案件どーぉ?」みたいなこと言ってきて、2週間も合否出てないとか普通ねーだろヾ(。`Д´)ノ、しかも追加で紹介してきた案件、希望とまったくマッチしてないし、っていうね。もうなんなのかしら。ってなりますね。

 

というわけで、外資系エージェントの場合、いきなり連絡が途絶えたら、選考がうまくいかなかった、という意味と捉え、次に切り替えるのがよさそうです。

 

ちなみに、いきなり連絡が途絶えたのに、これまたいきなり、何事もなかったかのように別の案件を連絡してきたりします()

 

その3:カフェやランチでむき出しの下心

 

日系エージェントの場合、たいていはそのエージェントの会社に出向いて面談、という場合が多いのですが、外資系エージェントの場合は、カフェやランチを誘われることがあります。ちなみに、その費用はエージェント持ちなので、おごってもらえます

 

こちらから望むというよりかは、エージェント自ら、社外で会うことを望んでくることが多いです。たいていは、こちらが就業中であることを考慮して「できるだけ候補者の負担にならないように」というホスピタリティを建前にしています。しかし本音のところは、「企業に紹介できる人材かどうかの値踏み」や「情報の引き出し」といったところが目的ではないでしょうか。

 

ちなみに、ジョブホッパー・ボブの経験上、社外で会うことを誘ってくるのは、エージェント自身が外国人の場合です。外資系エージェントであってもエージェント自身が日本人が場合は、社外でのカフェやランチを誘われることは滅多にありません。このあたり、日本人は真面目ダナー。

 

誘われるタイミングですが、エージェントとのはじめての面談、という場合もありますし、応募した企業との面接の直前という場合もあります。あるいは、転職後に「最近どうよ?」的な感じで誘われることもあります。はじめての面談で社外で会う場合は、こちらから登録した場合ではなく、スカウトされた場合に多いです。転職後に誘われた場合は、「そろそろ転職カンガエテナイノ?」とか「まわりに転職考えてる人いたら紹介して」などといった下心も見え隠れします。

 

いずれにせよ、タダより高いものはない。ギブアンドテイクであることをお忘れなきよう・・・

 

まとめ

 

外資系エージェントは、まさしく、ザ・外資。日系エージェントのように至れり尽くせりの候補者向けサービスは持ち合わせていません。結果に執着していて、オンとオフが激しい。イケるとなればこれでもかっていうほどアグレッシブに押してきますし、ダメだとなればすばやく引きます。かといって、根に持つわけでもありません。外資系企業で働く前哨戦だと思って、こちらも合理的思考で付き合っていくのがよいのではないでしょうか。