kakakakakku blog

Weekly Tech Blog: Keep on Learning!

最新バージョン Redash v5 をすぐに試せる「Redash ハンズオン資料」

Redash v4 のリリースから約5ヶ月,正式に Redash v5 がリリースされた 🎉🎉🎉

blog.redash.io

Redash v5 とは?

約1ヶ月間のベータ期間を経て,現在は Redash v5.0.1 が最新バージョンになっている.デザインの大幅な変更があった v4 から,順当に便利になっていると感じている.特に以下は個人的な目玉機能と言える.

  • クエリに「お気に入り登録」「タグ登録」をできるようになった
  • ダッシュボードに「お気に入り登録」「タグ登録」をできるようになった
  • ユーザーを無効化できるようになった
  • パラメータで日付の範囲指定ができるようになった
  • クエリ編集画面でレイアウトを変更するショートカットが使えるようになった
    • Alt + D : テーブル一覧とクエリエディタを非表示にする
    • Alt + Shift + D : テーブル一覧を非表示にする

詳細な Changelog は GitHub のリリース情報にまとまっている.

Redash ハンズオン資料 v5 対応

そして今日「Redash ハンズオン資料 v5 対応」をリリースした 🎉🎉🎉

github.com

主な変更点を以下にまとめる.

  • 全てのスクリーンキャプチャを撮り直した
  • 新コンテンツ
    • クエリの「お気に入り登録」「タグ登録」
    • ダッシュボードの「お気に入り登録」「タグ登録」
    • ユーザー追加とユーザー無効化
  • MySQL の Docker Image を kakakakakku/mysql-world-database:5.7 に変更した

Docker Image に関して,今まで使っていた kakakakakku/mysql-57-world-database は,バージョンごとにイメージ化していて,さらに Docker Hub のアップロードを手動でやっていたので,運用面で課題があった.今回から使うことにした kakakakakku/mysql-world-database:5.7 は,バージョンごとにイメージタグを切って,さらに Docker Hub の AUTOMATED BUILD を使っている.既に MySQL 8.0 も用意しているので,試すこともできる.

github.com

Redash v4.0.2

ちなみに,長らく最新バージョンとなっていた Redash v4.0.1 に Google OAuth 関連のセキュリティ問題が発覚し,急遽 Redash v4.0.2 がリリースされた経緯がある.詳しくは Arik のブログに書いてある.

https://blog.redash.io/important-redash-security-update-%EF%B8%8F-2fb8134ca689blog.redash.io

それに伴って,Redash ハンズオンも v4.0.2 に対応してある.v4 でハンズオンを試す場合は,是非 v4.0.2 を使って頂ければと!

まとめ

「Redash ハンズオン資料」を使って Redash v5 を学ぼう!

github.com

関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

コンテナのデザインパターンを学べる論文「Design patterns for container-based distributed systems」を読んだ

2016年に USENIX Conference で発表された論文「Design patterns for container-based distributed systems」を読んだ.タイトルの通り,コンテナのデザインパターンがまとまっていて,これからコンテナ設計をする人も,既にコンテナを運用している人も,デザインパターンを学べるのは価値があると思う.一部ミスリードをしているかもしれない.

論文も公開されている.

パターン一覧

  • Single-container management patterns(コンテナ管理用の単一コンテナパターン)
  • Single-node, multi-container application patterns(シングルノードでのマルチコンテナパターン)
    • Sidecar pattern(サイドカーパターン)
    • Ambassador pattern(アンバサダーパターン)
    • Adapter pattern(アダプターパターン)
  • Multi-node application patterns(分散システムのためのマルチノードでのパターン)
    • Leader election pattern(リーダー選出パターン)
    • Work queue pattern(ワークキューパターン)
    • Scatter/gather pattern(スキャッター/ギャザーパターン)

Single-container management patterns(コンテナ管理用の単一コンテナパターン)

  • コンテナは境界を提供するため,アプリケーションだけではなく,管理用(オーケストレーション)としても使える
  • コンテナを止めるときに SIGKILL シグナルを送り強制停止するのではなく,SIGTERM でコンテナの終了処理を実行できるようにする
  • "upward" : 監視メトリクスやプロファイリング情報やヘルスチェックを取得することができる(コンテナに対する管理)
  • "downward" : 優先順位の高いタスクのために,優先順位の低いタスクを終了することができる(コンテナ内部のプロセスに対する管理)

Single-node, multi-container application patterns(シングルノードでのマルチコンテナパターン)

Sidecar pattern(サイドカーパターン)

  • メインコンテナを拡張し,強化する
  • ウェブサーバがメインコンテナだとすると,ホスト側のディスクを読むログ保存コンテナはサイドカーになる
  • 他にも Git リポジトリからコンテンツを取得して,ホスト側に定期的に同期するサイドカーもある

個人的に経験があるのはログ収集用に使う Fluentd コンテナで,まさに同じユースケースと言える.サイドカーが異常になった場合も,メインコンテナに影響しないというのがポイントだと思う.

Ambassador pattern(アンバサダーパターン)

  • メインコンテナが外部とコミュニケーションをするときのプロキシになる
  • 例えば Memcached プロキシの twemproxy など
  • メインコンテナは localhost の Memcached に接続するように見えるけど,実際にはアンバサダーがプロキシをしている

ロードバランサーにも似ていて,外部とコミュニケーションをするという関心事をアンバサダーにオフロードしているのがポイントだと思う.他にも Microservices を構築するときに考える Service Mesh (Envoy / Linkerd) での Circuit Breaker もアンバサダーに分類されるかな?

Adapter pattern(アダプターパターン)

  • アンバサダーとは異なり,外部とのインターフェースを標準化する
  • システム内の全てのコンテナが同じモニタリングインターフェースを持つ

海外旅行で使う電源変換アダプタのイメージと言える.具体的には Prometheus のようなプル型のモニタリングシステムと相性が良さそう.

f:id:kakku22:20180923120447j:plain

(構成図を作った)

Multi-node application patterns(分散システムのためのマルチノードでのパターン)

Leader election pattern(リーダー選出パターン)

  • 分散システムのよく知られた課題に「リーダー選出」がある
  • 複数のノードに分散したコンテナ同士で通信をする
  • リーダー選出の実装は複雑になることが多いので,実装言語を気にせずコンテナを再利用することができる

今まで経験があるのは Consul のリーダー選出(内部的には Paxos?Raft?)ぐらいで,その他は経験がないけど,リーダー選出という複雑な部分をコンテナに押し込めるのはメリットがあると思う.ただし,論文にもあまり詳細は書かれていなかった.

Work queue pattern(ワークキューパターン)

  • リクエストを非同期に処理するため,一度キューに入れてからワーカーコンテナで処理をする
  • ワーカーコンテナは直接キューに接続するのではなく,コーディネーターコンテナからメッセージを受ける

読んでいるときに「一般的なキューとワーカーの組み合わせと何が違うんだろう?」と疑問だったけど,キューからメッセージを受ける部分もコーディネーターにオフロードすることで,キューの種類が変わっても(例えば Kafka, SQS, ActiveMQ, RabbitMQ など)ワーカーは影響を受けない構造になっていて,納得できた.個人的に1番学びのあるデザインパターンだった.

f:id:kakku22:20180923120508j:plain

(構成図を作った)

Scatter/gather pattern(スキャッター/ギャザーパターン)

  • ルートノード or 親ノードにリクエストを送る
  • そこから子ノードに並行してリクエストをファンアウトする
  • 子ノードの結果をマージするマージコンテナもある

Scatter(散布)と Gather(収集)という意味で,具体的な例で言えば MapReduce と同じ構成と言える.

f:id:kakku22:20180923120518j:plain

(構成図を作った)

まとめ

  • 論文「Design patterns for container-based distributed systems」を読んだ
  • 論文などアカデミックな情報源から学べることも多いので,継続的に読んでいきたい
  • これからコンテナ設計をする人も,既にコンテナを運用している人も,デザインパターンを学べるのは価値がある
  • 最近はコンピュータサイエンスの論文の解説が聞けるポッドキャスト「Misreading Chat」がお気に入りでずっと聞いている

misreading.chat

Cloud Computing Concepts, Part 1

Coursera で「Cloud Computing Concepts, Part 1」という講義を受講することができる.これは「分散システム」を学ぶ講義になっているので,興味がある人がいたら是非オススメしたい.僕が受講したときのメモは全て以下の記事にまとめてある.

kakakakakku.hatenablog.com

本当の「学び」を創り出す /「教育研修ファシリテーター」を読んだ

「教育研修ファシリテーター」を読んだ.どのように学びのある教育研修を創り出すのか?という講師のためのノウハウ本ではあるけど,サブタイトルに「組織・人材開発を促進する」と書いてある通り,チームビルディングをしたり,メンバーに何かを伝える場面が多い人にも役立つ本だった.例えば,エンジニアリングマネージャー,スクラムマスターなどのポジションを担当する人にもオススメできる.僕自身は技術講師(本書の表現だとファシリテーター)をしているので,実務経験だけでは学べないような,教育研修のノウハウとマインドセットを学ぶために読んだ.

前提

本書では,従来の研修と比較をするために,同じような意味で使われる言葉を明確に表現している.今回の記事も,本書の言葉通りに書いているので,前提として整理しておく.特に「受講者」という表現はよく使っているので,今後は意識的に「参加者」と表現しようと思う(とは言え,組織的に表現が決まっている場合もあると思う).

  • インストラクター(講師)
    • 「教える」ことを目的とした研修を進める人
    • 教えられる側を「受講者」と呼ぶ
  • ファシリテーター(教育研修ファシリテーター)
    • 「学び合い」を促進する人
    • 教えられる側を「参加者」と呼ぶ

「3つのスタイル」と「9つの学習法」

従来の研修と比較して,ファシリテーターは「3つのスタイル」「9つの学習法」を組み合わせるべきと書いてあった.参加して印象に残る研修は,講義だけじゃなく,ディスカッションがあったり,フィードバックがあったりするので,こういう分類があったんだなと理解できた.

  • レクチャー(講義)
    • 聴く
    • 見る
    • 考える
  • ワークショップ(協働)
    • 話し合う
    • 体験する
    • 創作する
  • リフレクション(省察)
    • 分かち合う
    • 内省する
    • 深め合う

研修の構成要素

研修の構成要素として,3つの要素が紹介されていた.

  • チーム
  • プログラム
  • ファシリテーター

特に参加者と場をコントロールするための「チーム」は参考になった.まずは参加者の属性(部署,役職など)と研修に参加した経緯などをヒアリングすることにより,期待値を調整することができる.また,参加者の年代によって価値観,スピード感が異なるので,話すスピードを調整したり,比喩を使うにしても時代を意識したり,カジュアルな言葉を使うかどうかを意識したりする必要がある.本書を読んでいて「ファシリテーターのプレゼンテーションにも TPO があるんだな」と気付けたところに学びがあった.

他には,場をコントロールするために,部屋のレイアウトにもこだわると書いてあった.特にレイアウト変更のときには参加者にも手伝ってもらうことで,その単純作業がキッカケになり,チームビルディングに繋がるというのは知れて良かった.あと,研修センターに行くとよく飴などお菓子が置いてあるのも,場をコントロールするためだったんだとわかった.

  • レクチャー(講義)
    • スクール型
    • シアター(劇場)型
  • ワークショップ(協働)
    • アイランド(島)型
    • ラウンドテーブル型
  • リフレクション(省察)
    • サークル型
    • バズ型

予定調和にならないように

本書を読んでいると,繰り返し「予定調和にならないように」という表現が出てくる.インストラクターは「予定調和(落語)」で,ファシリテーターは「ライブ(大喜利)」という比喩も出てくる.予定調和という意味は,ただテキストの通りに進めるということだけではなく,例えば,ブレストなどのワークショップをしたときに,チームごとの独自性のあるアイデアを活かさず,事前に用意したテンプレートでフィードバックをすることも予定調和と書かれていた.e-Learning では体験できない学びを創り出すためにも,ライブ感を届けられるようなファシリテーターになりたい.僕の大好きな本「Fearless Change」から引用すると「テーラーメイド」とも言えるかな.

ワークショップ手法

本書では,ところどころにワークショップ手法の紹介が入っている.体験したことがあるものも多かったけど,実施する背景だったり,コツなども整理されているので,実施する側として,改めて考え直すことができた.

  • 参加者チェック
  • 自己紹介
  • クイズ
  • グループ分け
  • バズ
  • ペアインタビュー
  • グループ討議
  • ディベート
  • 親和図法
  • ダイアログ
  • ロールプレイング
  • 研修ゲーム
  • 体験学習ゲーム
  • ケーススタディ
  • 言葉づくり
  • フレームワーク
  • 作品づくり
  • 演劇
  • チェックイン/アウト
  • フリップ
  • プレゼンテーション
  • バザール
  • セルフチェック
  • 振り返り
  • フィードバック
  • フィッシュボウル

今回はすぐに使えそうなワークショップを2個紹介したいと思う.

バズ

隣同士など,少人数で軽く話をするワークショップで,全員の前だと話にくいけど,少人数なら話せるという心理的安全性を重視したものになっている.自己紹介でも良いし,ミニディスカッションでも良いし,様々な場面で使える.複数日の研修なら,バズの組み合わせを変えたり,人数を徐々に増やしたりするのも良いと思う.

チェックイン/アウト

「今の気持ちはどう?」という質問に気軽に答えるというワークショップで,自己紹介とセットで実施しても良さそうだった.研修に対する意気込みを伝えても良いし,もっと身近な例で「朝,満員電車が大変でー」というような体験を話しても良いと思う.参加者の笑いを誘う自己紹介をする人は,チェックインが上手なんだと思う.また,チェックアウトも忘れずに実施することが重要と書いてあった.ポイントは「気軽に今の気持ちを伝える」という点かなと思う.

フィードバック

本書の後半に「フィードバックの4原則」が出てくる.自分のことは自分で気付きにくいので,フィードバックをもらうことは大切だけど,最低限のグラウンドルールを守らないと雰囲気が悪くなってしまう.

  • 両者が一致した建設的な目的のためにおこなう
  • 相手の態度・行動についてのみ伝える
  • 自分の観察・印象・判断のみを伝える
  • 具体的かつ明確に描写する

「建設的な目的」と書いてあるけど,個人的にフィードバックで大切だと思っているのは,良い点だけではなく悪い点も伝えてあげることなので,だからこそ攻撃的にならないように注意したいところ.そして,ファシリテーターとしては「今はフィードバックの時間ですよ」という雰囲気を作り,参加者同士で深め合ってもらえるようにしたいと思う.やはり「深め合ってもらう」ために場を促進するのがファシリテーターの役割なので,ファシリテーターがドヤ顔でフィードバックしてしまうことも気を付ける必要がある.本書にも「一言多いファシリテーターは要注意」と書いてあり,読んでいて「ウッ」となった.

まとめ

  • 教育研修のノウハウとマインドセットを学ぶことができた
    • 今回まとめたところ以外にもたくさん良いところがあり,1度読んだだけなのに付箋とマーカーだらけになった
  • 教育研修の場だけでなく,スクラムマスターなど,開発現場でも応用できるノウハウもたくさんあった
  • ファシリテーターとしての実務経験を繰り返しながら,定期的に読み直したい
    • 本当の「学び」を創り出せるファシリテーターになりたい

Vuex でショッピングカートを実装できる無料コース「Vuex for Everyone」を受講した

Vue School の無料コース「Vuex for Everyone」を受講した.Vue.js 初心者でも受講できるレベルになっているし,今まで Vue.js を書いたことはあるけど,Vuex はまだ使ったことがないという人にもオススメできる.進め方にもよるけど,写経するとしても2,3時間あれば終わる.

Vuex for Everyone

今回受講した「Vuex for Everyone」の題材は「shopping-cart」で,ステップバイステップに実装を進めていく.動作確認をしながら,機能を追加したり,リファクタリングをしたりする.

vueschool.io

動画を見るとわかるけど,とにかく実装スピードが早いので,写経する場合は何度も戻して見直す必要がある.ただ困ったときは Vue School の GitHub にセッションごとにコミットされているので,それを活用すればオッケー.

github.com

セッション一覧

  • Introduction
    • Meet Vuex ⏲ 2:46
    • Create a new project with vue-cli ⏲ 3:45
    • Install and use Vuex ⏲ 1:57
  • Vuex Options
    • Vuex Mutations ⏲ 3:22
    • Vuex Getters ⏲ 1:57
    • Vuex Actions ⏲ 4:25
    • Store Access from all Components ⏲ 0:53
  • Shopping Cart Features
    • Add products to the cart ⏲ 5:08
    • Vuex Mutation History and Vue Devtools ⏲ 2:46
    • Cart items and total ⏲ 4:32
    • Checkout ⏲ 3:49
  • Advanced Vuex Options
    • Dynamic Vuex Getters ⏲ 2:31
    • Vuex Map Helpers ⏲ 8:04
    • Split Vuex Store in Multiple Files ⏲ 1:11
    • Vuex Modules ⏲ 7:23
    • Namespaced Vuex Modules ⏲ 6:27

f:id:kakku22:20180915094327p:plain

(受講画面例)

Meet Vuex

  • Vuex とは何か?
  • なぜ Vuex が必要なのか?

Create a new project with vue-cli

Vue School のボイラープレートから「shopping-cart」プロジェクトを作成する.

$ npm install -g vue-cli
$ npm install -g yarn

$ vue init vueschool/webpack-template shopping-cart

? Project name shopping-cart
? Project description A Vue.js project
? Author kakakakakku <y.yoshida22@gmail.com>
? Vue build runtime
? Install vue-router? No
? Use ESLint to lint your code? No
? Setup unit tests with Karma + Mocha? No
? Setup e2e tests with Nightwatch? No

   vue-cli · Generated "shopping-cart".

   To get started:

     cd shopping-cart
     npm install
     npm run dev

   Documentation can be found at https://vuejs-templates.github.io/webpack

$ cd shopping-cart
$ yarn
$ yarn dev

次に Vuex の GitHub にあるサンプルを参考に,ProductList コンポーネントを実装する.API 部分はモックになっている.

const _products = [
    {"id": 1, "title": "iPad 4 Mini", "price": 500.01, "inventory": 2},
    {"id": 2, "title": "H&M T-Shirt White", "price": 10.99, "inventory": 10},
    {"id": 3, "title": "Charli XCX - Sucker CD", "price": 19.99, "inventory": 5}
  ]

この時点で,3商品を表示することができる.

f:id:kakku22:20180915093954p:plain

(実装画面)

Install and use Vuex

ここで Vuex をインストールする.

$ yarn add vuex

そして,新しく store/index.js を作成する.ここで,さっそく Vuex で重要なコンセプトが出てくる.

  • state
  • getters
  • actions
  • mutations

Vuex Mutations

ここでは,実際に mutations を実装する.ハンドラ関数の第一引数として state を指定し,追加でペイロードとして products を指定している.

// shopping-cart/src/store/index.js
mutations: {
  setProducts (state, products) {
    // update products
    state.products = products
  }
}

Vuex Getters

getters の実装はシンプルで,ストアからフィルタして取得できる.実際にモックの1商品の在庫を0にして,動作確認をした.

// shopping-cart/src/store/index.js
getters: { // = computed properties
  availableProducts (state, getters) {
    return state.products.filter(product => product.inventory > 0)
  }
}

f:id:kakku22:20180915094003p:plain

(実装画面)

Vuex Actions

この時点だと,まだコンポーネントから直接 Ajax で API を呼び出しているので,ベストプラクティスではなく,actions を使って解決するとのことだった.最初は,そのまま mutations をコミットすれば良いのではないかと思っていたけど,mutations は同期,actions は非同期なので,ここでは actions を使って,mutations をコミットする必要性を学べた.そして,API を呼び出しているときのローディング画像もここで実装した.

// shopping-cart/src/store/index.js
actions: { // = methods
  fetchProducts ({commit}) {
    return new Promise((resolve, reject) => {
      // make the call
      // call setProducts mutation
      shop.getProducts(products => {
        commit('setProducts', products)
        resolve()
      })
    })
  }
},

actions を呼び出すときは .dispatch を使う.そして actions の中で Promise を実装しているので,ここでは .then で受けて,ローディング画像を消している.

// shopping-cart/src/components/ProductList.vue
created () {
  this.loading = true
  store.dispatch('fetchProducts')
    .then(() => this.loading = false)
}

f:id:kakku22:20180915094012p:plain

(実装画面)

Store Access from all Components

全てのコンポーネントで store を import しなくても良いように,ルートコンポーネントに注入し,各コンポーネントでは this.$store で参照できるようにした.

// shopping-cart/src/main.js
new Vue({
  el: '#app',
  store,
  render: h => h(App)
})

Add products to the cart

次に商品をカートに入れられるようにストアにカートを実装した.ここまでの理解もあったので actions と mutations の実装も問題なかった.

f:id:kakku22:20180915094021p:plain

(実装画面)

Vuex Mutation History and Vue Devtools

Chrome 拡張を使って Vuex の状態を確認した.状態を Time Travel して戻すことができるのは,デバッグするときに便利そうだった.

f:id:kakku22:20180915094029p:plain

(実装画面)

Cart items and total

Vuex の GitHub から Filters 用の currency.js をコピーして,カートの実装を追加した.これで,カートの中に何が何個入っていて,総額も確認できるようになった.

f:id:kakku22:20180915094037p:plain

(実装画面)

Checkout

次は,購入できるようにチェックアウトボタンを実装した.実際にチェックアウトはできないので,ボイラープレートに入っている実装で,ランダムで成功したり,失敗したりするようになっている.

buyProducts (products, cb, errorCb) {
  setTimeout(() => {
    // simulate random checkout failure.
    (Math.random() > 0.5 || navigator.userAgent.indexOf('PhantomJS') > -1)
      ? cb()
      : errorCb()
  }, 100)
}

actions から,成功時の mutations と 失敗時の mutations を送っている.

// shopping-cart/src/store/index.js
checkout ({state, commit}) {
  shop.buyProducts(
    state.cart,
    () => {
      commit('emptyCart')
      commit('setCheckoutStatus', 'success')
    },
    () => {
      commit('setCheckoutStatus', 'fail')
    }
  )
}

Dynamic Vuex Getters

在庫がないときに商品名が消えてしまうのは微妙なので,Add to cart ボタンを disable にする実装をした.

f:id:kakku22:20180915094046p:plain

(実装画面)

Vuex Map Helpers

ここからは,Vuex のお作法でリファクタリングをしていく.まずは Map Helpers で state / getters / actions の宣言をシンプルにするために mapState / mapGetters / mapActions を宣言し,スプレッド演算子とともに,その中に呼び出し名を宣言できる.

// shopping-cart/src/components/ProductList.vue
computed: {
  ...mapState({
    products: state => state.products
  }),
  ...mapGetters({
    productIsInStock: 'productIsInStock'
  })
}

Split Vuex Store in Multiple Files

次は store/index.js の肥大化を防ぐために,actions だけを store/actions.js に切り出した.ただし,ここでは切り出せることを学ぶだけで,実際には次に出てくる Vuex Modules で書き直すことになる.

Vuex Modules

モジュールも Vuex のコンポーネントで,ストアごとに切り出していくようなイメージになる.今回は store/modules/cart.jsstore/modules/products.js に切り出した.モジュールごとに state / getters / mutations / actions を持っているので,わかりやすいし,テストコードも書きやすそう.結果的に store/index.js に実装はなくなり,とにかく薄くなった.

// store/index.js
import Vuex from 'vuex'
import Vue from 'vue'
import actions from './actions'
import cart from './modules/cart'
import products from './modules/products'

Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    cart,
    products
  },

  state: { // = data
  },

  getters: { // = computed properties
  },

  actions,

  mutations: {
  }
})

Namespaced Vuex Modules

最後は namespaced で,モジュールで namespaced: true を指定することにより,コンポーネント側で mapActions に名前空間を指定できるようになる.メソッド名にストア名を含めて冗長になっている場合など,シンプルに書けるようになる.

まとめ

  • Vue School の無料コース「Vuex for Everyone」を受講した
  • ショッピングカートを実装しながら,Vuex の基礎を学べた
  • 動画だと理解できなかった部分などは公式ドキュメント(日本語)を参考にした

vuex.vuejs.org

写経した GitHub リポジトリ

github.com

他にもある Vue School の無料コース

過去に受講した Firebase Realtime Database の無料コースも,Firebase Authentication の無料コースも良かった.

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

コピペのためのコマンドラインツール clipboard を試した

Mac / Windows / Linux など,クロスプラットフォームで,コピペができるツールを探していて,Go で書かれた clipboard を試した.clipboard をインストールすると gocopy コマンドと gopaste コマンドが使えるようになる.

github.com

Mac / Linux

サンプルファイルを用意して,簡単に動いた.

$ cat sample.txt | gocopy
$ gopaste
1
12
123
1234
12345

ただし,Linux の場合は以下のエラーが出るため,事前にパッケージをインストールしておく必要がある.README にも Requirements として書いてあった.

panic: No clipboard utilities available. Please install xsel or xclip.

ディストリビューションによって違うと思うけど,今回は Amazon Linux で試した.

$ sudo yum install xsel --enablerepo epel
$ sudo yum install xclip --enablerepo epel

Windows

あまり Windows に慣れていないけど,手元にある Windows 10 環境でも動かすことができた.

$ type .\sample.txt | .\gocopy.exe
$ .\gopaste.exe
1
12
123
1234
12345

コピペ対象

README にも書いてある通り,コピペ対象はテキストのみだった.png / gif など,画像もコピペできると良いんだけど,画像にも対応したライブラリはあるのだろうか?

まとめ

  • クロスプラットフォームで,コピペができる clipboard を試した
  • 実装を読むと,例えば Mac だと pbcopypbpaste を実行していた