SSH トンネルしてみる

概要

SSH で ポートフォワードして、トンネル経由で接続する。

Example

踏み台経由サーバ経由で、リモートサーバの 3306 にアクセスする。

トンネルを掘るに当たり、入り口はローカルポートの 13306 としてみる。

説明
リモート remote.com
踏み台 fumidai.com
ユーザ user

コマンド

ssh -L 13306:remote.com:3306 user@fumidai.com

これで localhost:13306 -> (踏み台) -> remote.com:3306 にトンネルが通る。

このトンネルを使って、ローカルからリモートにアクセスできるようになる。

config

.ssh/config に設定しておくならこんな感じ。

Host tunel-remote
  Hostname fumidai.com
  User user
  LocalForward 13306 remote.com:3306

これで ssh tunel-remote すると前述のコマンドと同じ意味になる。

参考

GitHub でサブチームを作ったらリポジトリの権限が剥がされた #GitHub

問題

GitHub のチーム機能を使ってサブチームを作ったら意図しない挙動になった。

サブチームを作ってリポジトリ Admin 権限を付与し、親チームは Write 権限にしようとしたところ、サブチームの権限が変更されてしまう事象が発生した。

GitHub のチーム機能についてはこちら。

help.github.com

再現手順

  1. チームを作成する (parent-team とする)
  2. parent-team を hoge リポジトリの Admin にする
  3. parent-team のサブチームを作る (child-team とする)
  4. child-team を hoge リポジトリの Admin にする
  5. parent-team の権限を Write に変更する

上記の手順を実施すると、 child-team の権限が Write になってしまう。

サブチームは個別に強い権限を付与しているので、親の権限に引きずられないでほしい。。

回避方法

別のチームやユーザに一度 Admin 権限を付与して、あとから修正できるようにした。

(Org の強い権限があれば、それで直せばいいだけではある)

補足

  • この現象が発生するのは初回だけっぽい
    • 修正後はどちらのチームの権限をいじっても平気
  • 親チームの権限を弱める場合だけでなく、強める場合でも発生する

感想

罠っぽい動き。。。

サブチームで詳細な権限を設定できるという Doc の言葉からも、あまり自然な挙動ではない気がするなぁ。

Visual Studio Code の設定を管理する #VSCode

概要

会社と自宅とか、マシンの買い替えを考慮して、VSCode の設定を管理できるようにしておく。

azure.microsoft.com

基本的な設定

Settings Sync という拡張機能が便利そうだったので、それを使ってみることにした。

GitHubトークンを使って、 Gist に設定ファイルをアップする仕組みのようだ。

private gist が作られるので、履歴も追えるようになる。

marketplace.visualstudio.com

拡張機能

現在インストールしている拡張機能は下記で確認できる。

code --list-extensions

表示された拡張機能をインストールするには下記。
※この例では python の extension

code --install-extension ms-python.python

Ansible の playbook にするならこんな感じ。

- name: "install vscode extensions"
  command: "code --install-extension {{ item }}"
  loop:
    - ms-python.python
    - ms-vscode.Go
  changed_when: false

code.visualstudio.com

CLI

CLI (code) は VSCode を起動して Shell Command のインストールをすることで使えるようになる。

インストールから設定までをまとめて(起動せずに)やりたいなと思ったら、自分で PATH 通しておけばいいらしい。

cat << EOF >> ~/.bash_profile
# Add Visual Studio Code (code)
export PATH="\$PATH:/Applications/Visual Studio Code.app/Contents/Resources/app/bin"
EOF

code.visualstudio.com

参考

stackoverflow.com

「みんなのコンピュータサイエンス」を読んだ

みんなのコンピュータサイエンス

みんなのコンピュータサイエンス

文系学部卒で、ひょんなことからプログラマになった僕にとって、コンピュータ・サイエンスというのは正直縁遠いものなのです。

そこに若干コンプレックスなどもあったことから、タイトルに釣られて読んでみたのがこの本。

本当に初歩の初歩というレベルだと思う。

入り口よりもっと手前の、入り口が見えるところに立ったくらいの感覚。

でもその分自分には分かりやすく、「面白いなぁ」と思いながら読めた。

(正直よくわからないところもあったのだが、そこは雰囲気で読み流した。)

今すぐ自分の仕事に役立つかといったらそんなことはないと思う。

でも、この本を読んだことがいつかどこかで何かに繋がりそうな気はする。

読んでよかった。

大きなファイルを分割する

経緯

  • 1GB 以上ある大きなファイルを見たい
    • ログみたいなの
  • grep 駆使とかではなくて何ならエディタで見たいようなとき
  • もういっそファイルを分割して見ることにする

split コマンドを使う

split -a 3 -b 100m bigsize.log splited-
  • -a
    • suffix の桁数を指定
  • -b
    • 分割サイズを指定
    • k(kb) や m(mb) が使える
  • 第2引数にprefix を渡せる

結果

このコマンド例だと下記のようになる。

splited-aaa
splited-aab
splited-aac
splited-aad
...

補足

オプションで、行数や正規表現で分割することもできるみたい

pytest-mock を使ってみた #python

概要

  • Python のテストを Pytest で書いてみた
  • Mock を使おうと思ったら pytest-mock という標準の薄いラッパーを使うのがいいらしい
  • そもそも標準を知らないので少し苦労した
  • なのでログとして残しておく

テスト対象

HTTPリクエストして、レスポンスを返すような処理を書いてみる。

レスポンスをモックしてテストしてみる。

import requests

def sample():
    try:
        # ここを Mock したい
        res = requests.get("http://checkip.amazonaws.com/")

    except requests.RequestException as e:
        print(e)
        raise e

    return {
        "statusCode": res.status_code,
        "ip": res.text,
    }

テストコード

本来なら 200 のレスポンスが返ってくるはずだが、 404 にしてみる

from hello_mock import app

def test_sample(mocker):
    # 嘘のレスポンスを作成
    responseMock = mocker.Mock()
    responseMock.status_code = 404
    responseMock.text = '127.0.0.1'

    # requests.get の戻り値を patch する
    mocker.patch('requests.get').return_value = responseMock

    actual = app.sample()
    assert actual['statusCode'] == 404
    assert actual['ip'] == '127.0.0.1'

補足

pytest-mock を使うと、 mocker 経由で Mock を扱えるので便利。

side-effect とかを使えば例外のテストなんかもできそう。

参考

DockerHub から image のタグ一覧を取得する

Docker Hub の image から tag を探そうと思ったときに、数が多いと中々目当てのものが見つからなかったりする。

API で取得するスクリプトを組んでる人がいたが、API のバージョンが古かったり、タグがたくさんあるとページングされたりするので、自分で書き直してみる。

#!/usr/bin/env bash

function docker-taglist() {
  local image=${1}

  local response=$(curl --silent --show-error "https://registry.hub.docker.com/v2/repositories/${image}/tags/")
  local names=$(echo ${response} | jq -r .results[].name)

  echo -e "${names}"

  # 最大 5 ページまで取得する
  local page=1
  local next=$(echo ${response} | jq -r .next)
  while [[ ${page} -lt 5 && ${next} != "null" ]]
  do
    response=$(curl --silent --show-error "${next}")
    names="${names}\n$(echo ${response} | jq -r .results[].name)"

    echo -e "${names}"

    page=$((${page}+1))
    next=$(echo ${response} | jq -r .next)
  done
}

エイリアスに登録しておけば、こんな感じで使える。

$ docker-taglist library/mysql
5.5
5.5.62
5.6
5.6.43
...

ページ数は引数で受け取れるようにするといいかもしれない。

参考

DockerHubのイメージのタグ一覧をコマンドで取得する | Mazn.net