オンラインでプログラミング

no extension

先ほどの「週末スペシャル」でも紹介したが, paiza.IO を試してみる。

コードを試すだけならアカウントはいらないが,コードを再利用したり他のサービスと連携する場合はサインアップが必要。 GitHub アカウントと連携できるのでその辺は問題ないだろう。

まず「スタック追跡とパニック・ハンドリング」のコード例を paiza.IO書いてみた

こんな感じでコードと実行結果を埋め込むこともできる1。 また埋め込まれたコードはその場で編集して実行し直すこともできる。 試しに for 文の中を以下のコードに差し替えて実行してみて欲しい。

for depth := 0; ; depth++ {
    pc, _, line, ok := runtime.Caller(depth)
    if !ok {
        break
    }
    fmt.Fprintf(log, " -> %d: %s: (%d)\n", depth, runtime.FuncForPC(pc).Name(), line)
}

paiza.IO で書いたコードは Gist と連携できる。 たとえば上のコードは

という感じで Gist に保存されている。 Gist との同期は自動ではなく明示的に指定する必要がある。

paiza.IO で書いたコードで他の(Twitter API などの)サービスと接続することも可能。 “The Go Playground” では外部との通信はできないので,これは嬉しい機能である。 たとえば「Git.io から短縮 URL を取得するコード」を参考に書いたコードがこれ。

実行をスケジューリングすることも可能なので,簡単なサーバ監視プログラムとか,色々な使い方ができそうである。

更に Twitter でコードを書くことも可能。 あらかじめ @paiza_run を follow しておいて

とコードを投げれば

と結果が返ってくる。 これはスクリプト言語でやったほうが面白いかな。

更に更に,他のユーザが書いたコードを fork することも可能。 またチャット等でリアルタイムにやり取りしながらコードを書くこともできるみたい。 遠隔ペアプログラミングとかできそうだよね。

ただし, paiza.IO では実行時間と使えるメモリに制限があって,大体どの言語でも2秒で512MBが制限になっている模様。 また Go 言語の場合は標準以外の外部パッケージが使えない。 たとえば以下は「文字エンコーディング変換」で書いたコードだが

package main

import (
    "fmt"
    "io"
    "os"

    "golang.org/x/text/encoding/japanese"
    "golang.org/x/text/transform"
)

func main() {
    reader := NewDecoder(os.Stdin)
    writer := NewEncoder(os.Stdout)
    if _, err := io.Copy(writer, reader); err != nil {
        fmt.Fprintln(os.Stderr, err)
    }
}

func NewDecoder(reader io.Reader) *transform.Reader {
    return transform.NewReader(reader, japanese.ShiftJIS.NewDecoder())
}

func NewEncoder(writer io.Writer) *transform.Writer {
    return transform.NewWriter(writer, japanese.EUCJP.NewEncoder())
}

paiza.IO ではコンパイル時にエラーになる。

欲を言えば “The Go Playground” にあるようなコードの整形機能が欲しいところである。


  1. ただし埋め込んだコードを表示するにはブラウザ設定で third-party cookie を有効にする必要がある。 Firefox であれば例外設定をすることもできる。いや,こういうのマジ勘弁して欲しいんですけど。今時 third-party cookie とかありえない。 ↩︎