投稿者: sumito.tsukada

  • Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

    はじめに

    GitLab CIでDockerのimageをbuildしようとする際、 “` Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? “` というエラーがでた。その対処。

    原因

    Dockerコンテナ内で、Dockerコンテナを立てる事を許可されていないため。

    対策

    GitLab Runnerのサーバの設定を変更する

    “` /etc/gitlab-runner/config.toml “` を以下の通り修正

    変更前

      [runners.docker]
        tls_verify = false
        image = "docker:stable"
        privileged = false
    

    変更後

      [runners.docker]
        tls_verify = false
        image = "docker:stable"
        privileged = true

     

    特にサービスの再起動など設定は不要。

    再度GitLab CIが走るたびに上記tomlファイルが読み込まれる仕組み。

  • MacOSX のzshでlessコマンド(source-highlight)の色付け

    MacOSX のzshでlessコマンド(source-highlight)の色付け

    はじめに

    lessコマンドは通常、白と黒の画面で表示されるため、vimのように色付けしたいことがある。“` source-highlight “` を使ったlessコマンドで色付けする方法を紹介。

    設定

    install

    brew install source-highlight
    

    このような画面が表示されればinstall完了だ。

    環境変数を設定

    ~/.zshrc を編集

    export LESS='-R'
    export LESSOPEN='| /usr/local/bin/src-hilite-lesspipe.sh  %s'

    読み込み

    source ~/.zshrc

    確認

    vimと同じ色付けになるわけではなく、若干の差異は発生する

    vimで開いたjsonファイル

    色付けしたlessで開いたjsonファイル

    vimで開いたymlファイル

    色付けしたlessで開いたymlファイル

     

    特にymlファイルは対応できていない印象。しかし、shellやjsonは見やすくなる。

  • ディレクトリの中のファイルの文字を一括置換するワンライナー

    ディレクトリの中のファイルの文字を一括置換するワンライナー

    はじめに

    ディレクトリの中のファイルの文字を一括置換したい時がある。一括置換するワンライナーを紹介。

    前提

    変換元: github.com/hogehoge/src
    変換先: git.sumito.com/hogehoge/src

    ワンライナー

    grep -rl github.com/hogehoge/src ./* | xargs perl -i -pe 's#github.com/hogehoge/src#git.sumito.com/hogehoge/src#g'

    注意

    grep の検索文字はエスケープしない。
    sedの区切り文字は / (スラッシュ) で区切ることが一般的だが、他の文字で代用も可能。
    特にディレクトリのような / (スラッシュ) が入る際は、他のものを今回は # (シャープ)を区切り文字とする。

  • User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:

    User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:

    はじめに

    API gatewayのテストをしていると、

    “` User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api: “` というエラーが出た。

    原因

    パーミッションエラー

    対処

    API gatewayの許可IPを確認する。

    aws:SourceIpにIPを追加する。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": "*",
                "Action": "execute-api:Invoke",
                "Resource": "arn:aws:execute-api:*:*:*/*",
                "Condition": {
                    "IpAddress": {
                        "aws:SourceIp": [
                            "123.0.0.1",
                            "1.23.4.1"
                        ]
                    }
                }
            }
        ]
    }

     

    参考情報

    クラメソさん、いつもありがとうございます。

    https://dev.classmethod.jp/cloud/aws/api-gateway-resource-policy/

     

  • 音声から日本語の文字起こしを行う

    音声から日本語の文字起こしを行う

    概要

    日本語の音声ファイルを文字起こししたい場合がある。真っ先に思い浮かんだのがAmazon transcribeだが、まだ日本語には対応していなかった。

    調べたところ、Google Speech APIが日本語に対応していたのでこちらを使って文字起こしをしてみた。

    サンプルの音声

    iPhoneに付属しているボイスメモというアプリで録音した

    https://itunes.apple.com/jp/app/%E3%83%9C%E3%82%A4%E3%82%B9%E3%83%A1%E3%83%A2/id1069512134?mt=8

    今回はあくまでもサンプルなので、今日の日付を読み上げた。

     

     

    加工

    ボイスメモで録音したファイルはm4aファイルになる。

    このフォーマットではGoogle Speech APIが対応していないのでwavファイルへ変換する。

    Speech APIが対応しているファイルフォーマットは以下にまとまっている

    https://cloud.google.com/speech-to-text/docs/encoding?hl=ja

    macでは標準で付属しているafconvertというソフトを使う事で手軽に変換できる。

    -d LEI16を指定する事で読み込める形になる。

    afconvert -f WAVE -d LEI16 sample.m4a sample.wav

    GCPの設定

    コンソール画面左上の[ツールとサービス] > [APIとサービス] > [ライブラリ] を選択。

     

    APIの一覧から[Speech API]を選択し、[有効にする]を押して  を有効にする。

    音声ファイルを格納

    先ほど変換したwavファイルをCloud Storageに格納する。

    文字起こし

    Cloud Shellをアクティブにする

    ジョブの登録

    $ gcloud ml speech recognize-long-running gs://gcp-translate/sample.wav --language-code='ja-JP' --async
    

    以下のようなレスポンスが来る

    Check operation [441557619774374990] for status.
    {
      "name": "441557619774374990"
    }

    ステータス確認

    $ gcloud ml speech operations describe 441557619774374990

    以下のようなレスポンスが来る

    {
      "name": "441557619774374990",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
        "progressPercent": 23,
        "startTime": "2019-06-01T16:39:03.805780Z",
        "lastUpdateTime": "2019-06-01T16:43:43.954310Z"
      }
    }

    この画面で進捗率23%という事がわかる。

    時間をおいて実施すると進捗率は変わる。

    {
      "name": "441557619774374990",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
        "progressPercent": 86,
        "startTime": "2019-06-01T16:39:03.805780Z",
        "lastUpdateTime": "2019-06-01T16:52:40.778647Z"
      }
    }

     

    進捗率が100%になったら、リダイレクトさせてtextに出力。

    gcloud ml speech operations describe 441557619774374990 > test

    ファイルを開き、中身を確認

    cat test
    {
      "done": true,
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
        "lastUpdateTime": "2019-06-10T14:28:36.384592Z",
        "progressPercent": 100,
        "startTime": "2019-06-10T14:28:32.372249Z"
      },
      "name": "441557619774374990",
      "response": {
        "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
        "results": [
          {
            "alternatives": [
              {
                "confidence": 0.9525875,
                "transcript": "\u4eca\u65e5\u306f2019\u5e746\u670811\u65e5\u3067\u3059"
              }
            ]
          }
        ]
      }
    }

    ファイルを開いた際、descriptionがエンコードされていなかったら適宜エンコードする必要がある。

    最も手軽なのは、jqコマンドに渡す事で読めるフォーマットになる

    $ cat test | jq -r '.'
    {
      "done": true,
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
        "lastUpdateTime": "2019-06-10T14:28:36.384592Z",
        "progressPercent": 100,
        "startTime": "2019-06-10T14:28:32.372249Z"
      },
      "name": "441557619774374990",
      "response": {
        "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
        "results": [
          {
            "alternatives": [
              {
                "confidence": 0.9525875,
                "transcript": "今日は2019年6月11日です"
              }
            ]
          }
        ]
      }
    }

     

    今日は2019年6月11日です

    という音声が無事取れた。

    音声が綺麗に拾えていれば、これを使って文字起こしをする事ができそうだ。

  • cliブラウザ lynxを使ってwebサーバにアクセスする

    cliブラウザ lynxを使ってwebサーバにアクセスする

    はじめに

    ChromeやFFなどのブラウザを使う人が大半だが、実はCliでもブラウザがあるので紹介。

    どのような時に使うか

    CLIでブラウザを利用することはほとんどないが、あるサーバからあるサーバへ通信の接続をしたい場合、単純な接続確認であれば “` telnet [サーバIP] 80 “` などを使って、接続可能か不可能かは確認することが多い。

    しかし、そのサーバが返すコンテンツの中身を確認したい様なことがある。その様な時に活躍できる。

    linxのインストール

    CentOSへインストールする際、非常に簡単

    yum install lynx

    これだけである。

    使い方は

    lynx https://tsukada.sumito.jp/

    と実施すれば、非常に簡単にコンテンツの取得が可能

    しかし、昨今のwebサーバはクッキーをクライアントに送るのが一般的だったりするので、この状態でページ遷移を繰り返して行くと、以下の様なアラートを受けることが多い。

    そのため、“` -accept_all_cookies “` オプションを用いて実施すると自動で受け入れてくれる。

    lynx https://twitter.com  -accept_all_cookies

     

     

  • go言語で設定ファイルを簡単に読み込む

    go言語で設定ファイルを簡単に読み込む

    はじめに

    go言語で設定ファイルを読み込む際、https://gopkg.in/ini.v1 というのがとても便利だったため紹介。

    これを使う事で、Configファイルに記載したパラメータを簡単にgoで使う事ができる。

    インストール

    https://gopkg.in/ini.v1

    を参考に、

    go get gopkg.in/ini.v1
    でインストールが可能。

    goでconfigファイルを読み込む

    サンプルのファイルを見ながらだと理解しやすいと思うので、コードをベースに紹介。

    読み込むconfigファイル

    [web]
    port = 443
    
    [db]
    name = oreoredb
    user = userA

     よくある形式。

    読み出すgoはこのような感じに記載

    package main
    
    import (
    	"fmt"
    	"gopkg.in/ini.v1"
    )
    
    type Config struct{
    	Port int
    	Db string
    	User string
    }
    
    var Cnf Config
    
    func init(){
    	c, _ := ini.Load("config.ini")
    	Cnf = Config{
    		Port: c.Section("web").Key("port").MustInt(),
    		Db: c.Section("db").Key("name").MustString("hogehoge.sql"),
    		User: c.Section("db").Key("user").String(),
    	}
    }
    
    func main(){
    	fmt.Printf("%v \n", Cnf.Port)
    	fmt.Printf("%v \n", Cnf.Db)
    	fmt.Printf("%v \n", Cnf.User)
    }

    結果

    $ go run read.go
    443 
    oreoredb 
    userA

    簡単に取り出す事ができた。

    詳細の使い方はこちら

    https://godoc.org/gopkg.in/ini.v1

     

    golang の新書

  • go言語でランダムな数値を出力させる

    go言語でランダムな数値を出力させる

    はじめに

    go言語でランダムな数値を出力させる

    コード

    package main
    
    import "math/rand"
    import "time"
    import "fmt"
    
    func main() {
        rand.Seed(time.Now().Unix())
        
        for i := 1; i <= 10; i++ {
            fmt.Println(rand.Intn(10))
        }
    }

    結果

    darkenergy:tmp sumito$ go run random.go
    4
    6
    3
    1
    7
    9
    3
    3
    1
    8
    darkenergy:tmp sumito$

     内訳

    rand.Intnは、randパッケージに新しい乱数を生成するとき、同じ初期化 rand.NewSource(1) を使っている。 これをUnixtimeをシードとしてあたえる事で、異なる乱数を出す事ができる。

    参考情報

    https://qiita.com/makiuchi-d/items/9c4af327bc8502cdcdce http://www9.plala.or.jp/sgwr-t/lib/srand.html

    golang の新書

  • go言語でgracefulを使ってwebサーバを立てる

    go言語でgracefulを使ってwebサーバを立てる

    はじめに

    gracefulというパッケージがあるので、これを利用することで簡易的にwebサーバを立ち上げることができる。

    これを使えばApacheやNginxを使わずとも、go言語だけでwebサーバを立ち上げることができるのでその方法を紹介。

    gracefulを利用する

     

    まずはgo get

    go get gopkg.in/tylerb/graceful.v1

    その後、.goを作成する。

    手順は README.md より抜粋

    package main
    
    import (
      "gopkg.in/tylerb/graceful.v1"
      "net/http"
      "fmt"
      "time"
    )
    
    func main() {
      mux := http.NewServeMux()
      mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
        fmt.Fprintf(w, "Welcome to the home page!")
      })
    
      graceful.Run(":3001",10*time.Second,mux)
    }

    とりあえずコピペでよい。

    起動

    go run greaceful.go

    ブラウザで

    http://localhost:3001/

    へ接続

    これは非常にシンプルな例だが、API作成などに非常に役立ちそう。

     

     

  • 「かんばん」について

    「かんばん」について

    はじめに

    かんばんプロジェクトについてレクチャーを受けた。学んだことをまとめる。

    かんばんを導入することのメリット

    • タスクの可視化
    • WIPの制限
    • 流れをコントロール

    かんばん作成時のルール

    • 「かんばん」に参加しない人を作らない。
       全員に参加してもらう。
    • DoingにはWIP(Work in progress)制限を設ける。
    • WIPは人数 x 2倍からはじめて、少しづつ減らして行くとよい
       可能な限り、終わらせることを優先させる。
       次のものが空いている人は、次のものを取りに行く仕組み。
    • Doingが外的要因により進行できなくなった場合、上から別の付箋を付けてブロック状態を表示する。
      • ブロックされていることを明示させる
      • ブロックされてて手が止まっていても、WIP制限に例外を作ったり、制限を緩めたりしない。
    • 優先順は、上が高、下が低。
      • Todoだけじゃなく、Doingも基本的にこの順に並べる
    • Todoには直近のタスクだけを作る。
      • いきなり全部作ると大変なので、Todoは全部で20個に制限するなどルールを作り、なくなったら足して行くなどするのもよい。
    • 振り返りで必ず見直す

    レーンについて

    • 業務に合わせてレーンを作る。
       緊急レーンを作るケースもあり、その場合はかならず1個までというルールも併せて導入する。

    かんばんで取得すべきメトリックについて

    • 以下の日付を記入することで、それぞれのリードタイムを計測出来る。
      • Doingに入った際に「開始日」
      • Doneに入った際に「完了日」
      • デプロイ後に「デプロイ日」
    • 上記計測することで、デプロイの数がスループットになる
    • スループットを計測することで、リードタイムの平均が取得出来る。

    ふせんについて

    • 色に意味を持たせる。
      • 同じ内容で違う色を使わない。
      • 例えば、一般的なタスクを黄色
      • CSから上がってくるものはピンク
      • ブロックはオレンジ
      • 改善・リファクタリングタスクは緑など
    • 誰もがわかる見出しをつける。
      • 詳細はRedmineやJIRAとかで良い
    • フォーマットを決めて書き方の見本を書いて置くと良い。
    • 粒度は半日〜1日で終わるくらいが望ましい。
      • タスク単位ではなく、ユーザーストーリーに紐づく形が望ましい。
      • APIだけ作っても、使うフロントがあって初めてユーザに価値を提供出来る。
    • 明確に担当者が決まっているのであれば、担当者を書く

    運用上のルール

    • DoingからTodoへ基本戻さない。
      • 完了させることを優先する。
    • 次のものが空いている人は次のものを取りに行く。
    • 誰でも取りにいけるように、人依存にさせない。

    よくある質問

    どのくらいの規模に向いているのか?

    • 規模は100人超えても使っている所もあるが、人数・規模の制限はない。

    チームが2つにわかれている場合どうするか?

    • プロダクトで区切るのか。チームで区切るのかは対象・内容次第。
    • 今回は複数のプロダクトをまたいでやるケースがある為、チーム毎の方が良い。

    急ぎのバグ対応やCS問い合わせのタスクがある場合は?

    • 緊急レーンで対応するチームもある。
    • ただし1個だけといった絶対的なルールを作る。

    アナログとデジタルの共存について

    • リアルでは「ふせん」、デジタルではJIRAやredmineを使うとなると、2重管理になってしまう。
       しかし、それは仕方がないと割り切る。
       それぞれの特性を生かして使う
       アナログの方は状況の把握・見える化と優先順の調整のみ。
       細かい管理はデジタル(redmineやJIRA)で行う。