scpコマンドでリモートからリモートにファイルを転送する

こんにちは。
今年はスマホで遊んでいたゲームが3本サービス終了して悲しいたにすぎです。
でも大丈夫、まだ舞台の予定がある……!
さて、3といえば最近SCPコマンドのオプションでリモートからリモートに転送できる方法があることに気づいたので共有します。

開発してるとたまに、テスト環境から○○のファイルをローカルに落として、ローカルから他のサーバにあげて動作確認するぞー……みたいな作業が発生して待ち時間とかちょっとだるかったりするのですが、なんとあるオプションを使うと1発で作業先のサーバまでファイルの転送が出来るんですなあ。 ■ 使い方
通常こんなふうに2回にわけて落として、上げてってやる必要がありますが。
scp user@src.example.com:~/sample.zip .
scp ./sample.zip user2@dist.example.com:~/sample.zip

なんと-3をつけるだけでこんな感じ1回で転送できます。
scp -3 user@src.example.com:~/sample.zip user2@dest.example.com
(portや鍵の指定は .ssh/config 辺りに接続設定書いておくと使う時にごちゃごちゃしなくてよい)

地味に便利だったので共有でした。へー(-3-)って思ってくれるとうれしいです。

PostmanのPre-requestって便利だなあ

こんにちわわ🐾。たにすぎです。先日APIのテストをする機会があってPostmanを利用したんですが、改めてPre-requestの機能が便利だな、と感じたので紹介します。

Postmanとは

https://www.postman.com/
Postman社が提供するAPIの開発用プラットフォームでリクエストや認証のテスト等を行えます。
Code snippetを使えばcURLやHTMLのコードにも変換してくれるので、Postmanのチームを共有していなくても他の人にリクエスト例を共有できるのでなにかと便利です。

Pre-requestって?

リクエストの前に決まった処理をしてくれる機能です。
APIを試すぞ、って時にパラメタにユニークなIDを設定しないといけなかったり、AのAPIの結果をBのAPIをリクエストに使用したい時など、手作業でパラメタ設定すると面倒な時にこのPre-requestが便利です。

ざっくり試し方

基本的なリクエストの方法は割愛します。
今回はあるAPIのリクエスト結果をPre-requestで取得して、その結果をAPIのリクエストに使います。

とりあえずENVを設定する

右上の目が付いた表みたいなアイコンを押してEnvironmentのAddをクリック
適当に変数セットの名前を入力して、Variablesに変数名を入れる

今回は環境で変わる(であろう)URLのメインの部分と1つ目のAPIの結果を入れるなんちゃらIdsを設定しています。

Pre-requestにリクエスト前の処理を書く

今回はAの結果でIDのリストのみが返ってくるのでこんな感じになりました。

const server = pm.environment.get("server"); //envからサーバー名を取得 
const xxxIdsUrl = "https://"+server+"/?limit=40";

pm.sendRequest(xxxIdsUrl, function (err, response) {
    pm.environment.set("xxxIds", response.json()); // なんちゃらIdsに結果をセット
});

envの値の取得方法が良くわからん、て場合もよく使う例が右側にSnippetsがあるので割と楽に書けました。

結果

リクエストURL横のSendを押してリクエストしてみます。

無事結果が取得できました。envのCurrent valueも更新されてます。

まとめ

使ってる方も多いかなと思いつつPostmanのPre-requestの機能を紹介しました。
Postmanで取得データのテストも書けたり、チームでコレクションを共有したりも出来るので、上手く使えば更に効率よく開発ができるんだろなと思います。
みんなで知見を共有しつつもっと活用したいですね……!

MySQLで文字列結合しようとしたら何も表示されなかった話

こんにちは~。たにすぎです。
入社してそろそろ3か月経ちますが、入ったときには既にみんなマスク着用だったので、何かの拍子に外した姿を見ると「誰だ……?」と2秒くらい固まります。
いやあ、早く素顔で笑える日が来てほしいですね。

さて、タイトルで既に原因お分かりの方もいるかと思いますが、
NULLな文字列をCONCATでつなげたら悲しい思いをしたのでその話をします。

今回の状況

「苗字(半角スペース)名前」の形で氏名を表示する時に何も考えずにCONCATでつなげた結果を表示しようとしたら痛い目にあいました。
こういうデータがあって、 サンプルのユーザーテーブル 以下のようなクエリを書きました。
SELECT CONCAT(name_last, ' ', name_first) AS name FROM scores s
 

結果

素直にconcatだけ使った結果
あれ……? 1番下が何も表示されないな。

なんで消えちゃうの

思ってたのと違う結果になったのでドキュメント読みます。 https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_concat
引数のいずれかかが NULL である場合、CONCAT() は NULL を返します。
はい。
つなげる文字列の中で1つでもNULLがあると、結果がNULLになるんですね。知らなかった……

書き換え案

氏名で片方がない場合はあまりなさそうですが、住所で建物名がないとかは割とありそうなのでなんとかしたいです。 

IFNULL

IFNULLをつかってNULLの場合は空に置き換えてから繋ぐように書き換えてみます。
SELECT
CONCAT(name_last, ' ', name_first) AS 'IFNULL使ってないname',
CONCAT( IFNULL(name_last,''), ' ', IFNULL(name_first, '') ) AS 'IFNULL使ったname'
FROM users u
できたできた。

COALESCE

COALESCEでも結果は同じだけど、なんだかもったいないような……
SELECT
CONCAT(name_last, ' ', name_first) AS 'そのままCONCAT',
CONCAT( COALESCE(name_last,''), ' ', COALESCE(name_first, '') ) AS 'COALESCE使ったname'
FROM users u
coalesceで繋いだ例

GROUP_CONCAT

GROUP_CONCATは複数行の結果をカンマ区切りで返してくれる関数です。
こちらはどうなるんでしょう?
SELECT GROUP_CONCAT(name_last), GROUP_CONCAT(name_first)
FROM users
group_concatにnull
あ、GROUP_CONCATの方はNULLは気にしないでくれるみたいですね。
https://dev.mysql.com/doc/refman/5.6/ja/group-by-functions.html#function_group-concat

おわりに

めんどくさがるのよくないですね!
何らかの理由でIF_NULLが使えない場合はCASEとIS_NULLで対応したらいいのかな……

おまけ: PostgreSQLの場合は?

これは完全に言い訳なんですが、ここ数年はPostgreSQLをメインに使っていて、そっちはNULL含む項目をCONCATで繋げても無視した結果を返してくれていたんです……
でもそういえばCONCAT使わずに「||」(パイプ)で繋げた場合はNULLになってましたね……

SELECT CONCAT(name_last, ' ', name_first) AS "CONCATの結果", name_last || ' ' || name_first AS "パイプの結果" FROM users