20190415のGoに関する記事は3件です。

VimでJupyter Notebookを編集するツールを作った

概要

VimでJupyter Notebookを編集するツール vim-jupyterを作った.
特徴は

  • 中身のJ2P2JをGoで書いたので,速い.外部依存が少ない.
    • vimpyterは良いツールだが,pandocに依存している

例えば
jupyter.png

このJupyter Notebookをvimで開くと

# j2p2jVersion: v1.0.1
# Aux:{"metadata":{"kernelspec":{"display_name":"py37","language":"python","name":"py37"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.7.2"}},"nbformat":4,"nbformat_minor":2}
# Markdown:
# # Hello World
# meta:{"metadata":{}}
# In []:
print("hello world!")
# meta:{"metadata":{}}

こうなる.Markdown CellやMetadataが全てコメント内に放り込まれる仕様.
ちょっと見た目が煩わしいけど,jsonをそのまま編集するよりはマシなはず.

インストール

1. J2P2Jをインストールする

$ go get github.com/tamuhey/j2p2j

もしくは,release pageからバイナリをダウンロードする,
こいつが裏でJupyter <=> Pythonの変換をしている.

2. vim pluginのvim-jupyterを入れる

vim-plugを使うなら.vimrcに以下を追記

Plug 'tamuhey/vim-jupyter'

なぜ作ったか

  • 外部からの接続がほとんど遮断されているサーバでJupyter Notebookを編集しなければならない事情があったのでつくった.
  • 環境構築もかなり面倒な場所だったため,ファイルを2つ持ち込めば動くツールにした.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GoでAmazon S3をKVSとして使う

これはなに

永続化が必要なバイナリKVSとしてAmazon S3を使いたい場合があります。
セッションの取り回しや、aws.WriteAtBufferやエラーがトリッキーなのでスニペットです。

package s3kvs

import (
        "bytes"

        "github.com/aws/aws-sdk-go/aws"
        "github.com/aws/aws-sdk-go/aws/awserr"
        "github.com/aws/aws-sdk-go/aws/session"
        "github.com/aws/aws-sdk-go/service/s3"
        "github.com/aws/aws-sdk-go/service/s3/s3manager"
)

var PersistentS3Store = &S3Store{}

type S3Store struct {
        Bucket     string
        Uploader   *s3manager.Uploader
        Downloader *s3manager.Downloader
}

func (s *S3Store) Init(bucket, region string) (err error) {
        s.Bucket = bucket

        sess, err := session.NewSession(&aws.Config{
                Region: aws.String(region),
        })
        if err != nil {
                return
        }

        s.Uploader = s3manager.NewUploader(sess)
        s.Downloader = s3manager.NewDownloader(sess)

        return
}

func (s *S3Store) Set(key string, body []byte) (err error) {
        params := &s3manager.UploadInput{
                Bucket: aws.String(s.Bucket),
                Key:    aws.String(key),
                Body:   bytes.NewReader(body),
        }

        _, err = s.Uploader.Upload(params)
        return
}

func (s *S3Store) Get(key string) ([]byte, error) {
        buffer := aws.NewWriteAtBuffer([]byte{})

        _, err := s.Downloader.Download(buffer, &s3.GetObjectInput{
                Bucket: aws.String(s.Bucket),
                Key:    aws.String(key),
        })
        if err != nil {
                if aerr, ok := err.(awserr.Error); ok && aerr.Code() == "NoSuchKey" {
                        return nil, nil
                }
                return nil, err
        }

        return buffer.Bytes(), nil
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GO111 で GAE用の外部ライブラリを使っていて unresolved referenceになる問題

今まで使えていたメソッドがなぜか呼び出せなくなっていてかなりハマったのでメモ。

結論としてはパッケージの先頭に以下のように書いてあったのが原因

// +build appengine

要するにappengineな環境だけでビルドする設定が入っていた。GAEでgo111対応するとこれは動かなくなるっぽい。

とりあえずこの部分のコメントを外したら動いた。

まだ理解しきってないがとりあえずメモということで。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む