技術のメモ帳

気が向いたときに書いてます

FactoryMethodパターンのメモ

雑な話。 抽象クラス: 作り方は同じだけど、「何」を作るか(対象)は分からない(対象は実装しない) 具象クラス: 作り方は抽象クラスを継承し、「何」を作るかだけ指定している(対象だけを実装する) この抽象クラスが具象に処理を任せていることを「Fact…

発言はフェアに、アイデアの採用はアンフェアに

この記事を読んで、ちょっと共感したフレーズがあったのでメモ。 d.hatena.ne.jp 熱量とコミットを伴う発言は重く、とりあえず言ってみただけの傍観者発言は軽く扱う。すべての発言を平等に扱うという民主的なアプローチではプロジェクトは動かない。 寄せ集…

Docker practice (1/2)

Environment Mac OSX 10.11.6 (EI Capitan) VirtualBox 5.1.4 docker 1.11.1 docker-machine 0.7.0 docker-compose 1.7.0 Installation $ brew cask install virtualbox $ brew install docker-machine $ brew cask install dockertoolbox Boot docker-machi…

ActiveRecord::Base.transactionの使い方を誤解していた

(誤解)テーブル名が異なる場合、 ActiveRecord::Base から実行しないとNG!? (正解)同じクラスからコールされるので、Baseのサブクラスならば Model.transaction でも model_instance.transaction でもOK # == Different Active Record classes in a sing…

deviseのカスタマイズをしていて思ったこと

deviseのカスタマイズで一番大事なのは、「devise使わず、別のgemでイチから作った方がいいんじゃないか」という疑問を棄てることかな、と思った。— Yoshiyuki Hirano (@yoshi_hirano) 2016年7月24日 要件を満たしているのであれば、実装の詳細に懲りすぎて…

BigQueryのQueryBuilderをgemで公開してみた

昨日、ようやくgemとして公開できました。 github.com 6月中旬あたりから始めて、移動中などの時間があるときに コツコツ書いてきたので、「一ヶ月もかかってしまったかー」とも思うのだけど 公開できたので、よかったなーと素直に喜びたいなと思います。 な…

Dashの独自CheatSheetをYAMLから生成するgemを作った

cheatset-yamlという、Dashの独自CheatSheetをYAMLから生成するgemを作りました。 github.com 動機に至るまで 今更ながらSpotlightを使うのをやめて、Alfredを導入した。 Alfred導入に併せて、Dashを使うようになった。 独自CheatSheetを作りたくなった。 DS…

elixir学習日誌: 標準入出力..例外処理

標準入出力 IO.puts :stdio, "fantastic!" IO.puts :stderr, "goddness!" 標準入力 case IO.gets "What's your name?: " do "Tom\n" -> IO.puts "Oh! Tom. Good name." "Jesica\n" -> IO.puts "Jesica! How are you?" _ -> IO.puts "Nobody knows you" end …

elixir学習日誌: 再帰とStream

再帰 末尾再帰とは? defmodule Person do def say(message, n) when n == 1 do IO.puts message end def say(message, n) do IO.puts message say message, n - 1 # ←この部分が末尾再帰 end end Person.say "Hello", 3 # => Hello # => Hello # => Hello 末…

elixir学習日誌: 関数

基本 defmodule Say do def hello name do "Hello, #{name}!" end end IO.puts Say.hello "Alice" # => "Hello, Alice!" defmodule は関数をグループ化するためのモジュール定義。 すべての関数は、モジュール名.関数名 引数 で呼び出せる。 関数の呼び出し…

elixir学習日誌: データ型〜パターンマッチング

学習動機 不純な動機は、ひとつもありません。 Rubyのシンタックスと親和性があると聞いて。 関数型言語を学習したくて。 Phoenix使ってみたくて。 名前がカッコイイから。 ゴール Phoenixを使って、APIサーバを立てる。 余談 たいていどんな言語も、次のパ…

nodebrewをインストールするときの手順

homebrewでインストールするときの手順。 パスを追加する際、brew infoに従っても、うまく動作しなかったのでメモ。 インストール % homebrew install nodebrew パスの追加 ~/.zshrcにパスを追加。 export NODEBREW_ROOT=/usr/local/var/nodebrew export PAT…

[GAS]Google Apps Scriptでツイートを投稿する

今回は、Twitter REST APIを用いて、Google Apps Scriptでツイートを投稿するまでの実装を行ってみます。 ツイートを投稿するには、OAuth認証を行う必要があります。OAuth認証については、はてなウェブサービスで利用した、google-apps-oauth1ライブラリを利…

[GAS]はてなブログAtomPubを扱うライブラリ

前回に引き続き、はてなのウェブサービスを扱うライブラリをGoogle Apps Scriptで実装しました。今回は、はてなブログです。 このライブラリを利用すると、Google Apps Scriptから、ブログエントリ一覧の取得、ブログエントリの取得・作成・編集・削除、カテ…

[GAS]はてなブックマーク REST APIを扱うライブラリ

今回は、Google Apps Scriptで、はてなブックマーク REST APIを扱うライブラリを作成してみました。 当エントリでは、利用方法を簡単に説明したいと思います。 アプリケーション登録 まず、はてなアカウントを取得し、下記ページを参考に、アプリケーション…

[GAS]Google Apps Scriptは、Strictモードを認識するのか?

TIPSです。 結論から言うと、JavaScriptのインタプリタを利用しているので、Strictモードで動作します。 確認したコードは、次の通りです。 function strict() { "use strict"; var obj = { p: 1, p: 2 }; // Strictモードの場合、同一keyは代入不可 Logger.…

[GAS]doPostでログを出力する方法

今回はTIPSです。Google Apps Scriptの公開アプリケーションで、doPost()を実装するとき、Logger.log()メソッドが使えないので、ログが確認しにくい難点があります。他の方はどうやっているのか分かりませぬが、苦肉の策として、SpreadSheetを開いて書き込む…

[GAS]PivotalTrackerのアクティビティをSlackに通知する

今回は、PivotalTrackerのActivity WebHookを受けて、(Bot経由で)Slackにアクティビティを送信して通知するWebアプリケーションを、Google Apps Scriptで書いてみます。 実装手順としては次の通りです。 新規gsファイルを作成 doPost()関数を作成 Pivotal …

[GAS]シートの行列の幅と高さを変更して方眼紙化する

今回は、Google Apps Scriptを使って、表示中のシートの行列の幅と高さを変更し、いわゆる、エクセル方眼紙化する関数を実装してみます。 以下が仕様となります。 メニューから関数を実行 promptで幅を入力 すべての行列が2の幅に変更される 実装したコード …

[GAS]SpreadsheetでYouTube検索・閲覧ができるAngularJSアプリケーション

今回は前回に引き続き、YouTube Serviceを利用したGoogle Apps Scriptを書いていきます。 Spreadsheetでサイドバーから展開できるアドオンを想定して実装します。 動作サンプル 仕様は次の通りです。 メニューからサイドバーを展開 検索フォームに文字列を入…

[GAS]SpreadsheetからYouTube動画を再生する

今回は、SpreadsheetからYouTube動画を再生するコードをGoogle Apps Scriptで書いてみました。 単純に埋め込み用のiframeを表示するだけでは脳がないので、アクティブなセルからIDを取得して、表示するようにしてみました。 実装したコード 特に難しいことは…

[GAS]MarkdownからHTMLに変換するWebアプリケーション

今回は、marked.jsを使って、MarkdownからHTMLに変換するWebアプリケーションを実装します。 実装したコード Spreadsheetからサイドバーを展開して、表示するアプリケーションです。 ファイル構成は、code.gs, layout.html, stylesheet.html, script.htmlと…

[GAS]Spreadsheetでモーダルダイアログやサイドバーを表示する

今回は、SpreadsheetでUIをカスタマイズする実装をしてみます。 新規のSpreadsheetを作成して、スクリプトエディタで下記コードを貼り付けます。 HTMLをレンダリングする まず、カスタムメニューからスクリプトを実行できるよう、onOpen()とonEdit()でメニュ…

[GAS]特定キーワードの人気レシピを解析する

今回は、cookpadの人気レシピを探すスクリプトを書いてみます。 スクレイピングによる情報収集においては、以下のマナーをご覧のうえ、お試しください。 仕様は次の通りです。 Spreadsheetのメニューから、スクリプトを実行するUIを構築(キーワードの入力を…

[GAS]YQL(Yahoo Query Language)を使って、スクレイピングをする

今回は、YQL(Yahoo Query Language)を使って、スクレイピングするサンプルを実装します。 YQLとは? YQLはYahoo.comが提供している、あらゆるWeb上のリソースにアクセスすることができる開発者向けのAPIです。 YQL - Yahoo Developer Network ざっくりとメ…

[GAS]ウェブサイトをスクレイピングする

Google Apps Scriptは、HTTPの処理や定期実行ができるため、スクレイピングも簡単にできます。 実装手順としては、次の通りです。 UrlFetchAppで対象コンテンツをfetch HtmlResponseクラスのgetContentText()メソッドで文字列化 正規表現で文字列を加工 加工…

[GAS]HTML/XMLをパースする

Google Apps Scriptは、サーバサイドJavaScriptのため、DomparserクラスやjQueryを用いたDOMの操作ができません。 そのため、HTML/XMLをパースする際は、XMLServiceクラスを利用します。 XMLServiceの使い方 XML Service Service | Apps Script | Google Dev…

[GAS]SpreadsheetでTwitter/Facebook/Google等ソーシャルメディアでのシェア状況を出力する関数

donReachという海外のAPIを利用して、Spreadsheetでソーシャルメディアでのシェア状況を出力する関数を作成します。 実装する関数 UrlFetchApp()でリクエストして、JSONをパースして返す、というシンプルな関数です。 function shareCount(url, media) { try…

[GAS]Spreadsheetで入力されたURLのPinterestのPin件数を出力する関数

SpreadSheetで指定したセルの文字列(URL)の、PinterestのPin件数を出力するGoogle Apps Scriptの関数です。 今回は返り値がJSONPのみのため、String型に変換してパースする処理が入っています。 function pinterestCount(url) { try { if (!urlValidator(u…

[GAS]Spreadsheetで入力されたURLのFacebookでいいね/シェア件数を出力する関数

SpreadSheetで指定したセルの文字列(URL)の、Facebookでいいね/シェア件数を出力するGoogle Apps Scriptの関数です。 実装する関数 UrlFetchApp.fetch()を用いて、APIにGETリクエストを投げる、シンプルな実装です。 function facebookStats(url, kind) { …

[GAS]Spreadsheetで入力されたURLのLinkedInでのシェア件数を出力する関数

SpreadSheetで指定したセルの文字列(URL)の、LinkedInでのシェア件数を出力するGoogle Apps Scriptの関数です。 実装する関数 UrlFetchApp.fetch()を用いて、APIにGETリクエストを投げる、シンプルな実装です。 function linkedInShareCount(url) { try { …

[GAS]Spreadsheetで入力されたURLのFeedlyの購読者数を出力する関数

SpreadSheetで指定したセルの文字列(URL)の、Feedlyの購読者数を出力するGoogle Apps Scriptの関数です。 FeedlyのAPIについては、The feedly Cloud APIのドキュメントを参照してください。 ライブラリ 実装の手間を省くため、ライブラリを作成しました。 …

[GAS]Gmailの受信時に特定の処理を実行するライブラリ

Gmailのメール受信時に特定処理を実行するライブラリ GmailObserverを書きました。 実際は、受信時のトリガーは存在しないため、Apps Scriptのトリガーに[1分おきに実行]と登録し、メール受信をトリガーにした処理を行います。 条件にマッチしたメールのID…

[GAS]Spreadsheetで文字列の意味を英和辞書・和英辞書・ウィキペディアから検索して出力する関数

SpreadSheetで指定したセルの文字列の意味を、デ辞蔵Webサービスが提供するEJDict英和辞典・Edict和英辞典・ウィキペディア日本語版から検索して出力するGoogle Apps Scriptの関数です。 SpreadSheetでなくとも利用可能ですが、分かりやすいのでそのように書…

[GAS]Spreadsheetで入力されたURLのツイート件数を出力する関数

SpreadSheetで指定したセルの文字列(URL)の、ツイート件数を出力するGoogle Apps Scriptの関数です。 なお、こちらは非公式のAPIとなりますので、突如使えなくなることもあります。ご注意ください。 実装する関数 UrlFetchApp.fetch()を用いて、APIにGETリ…

[GAS]SpreadSheetで入力されたURLのはてなブックマークの件数を出力する関数

SpreadSheetで指定したセルの文字列(URL)の、はてなブックマークの件数を出力するGoogle Apps Scriptの関数です。 使用するAPIは、はてなブックマーク件数取得API - Hatena Developer Centerとなります。 実装する関数 非常に単純ですが、UrlFetchApp.fetc…

[GAS]複数のファイルをzip形式に圧縮する

今回は、複数のURLのリソースを取得し、zip形式に圧縮する関数を書いてみます。 function createZipFileByUrls(urls) { try { var blobs = Object.keys(urls).map(function(i){ return UrlFetchApp.fetch(urls[i]).getBlob() }), filename = new Date().getT…

[GAS]kimono APIから変更通知を受け取り、変更内容をGmailで送信する

下記にインスパイアされたエントリとなります。 こちらの記事では、SendGridではなく、Gmailを利用して実装していきます。 それでは、まずは、kimono APIの設定から。 kimonoとは? APIを提供していないウェブサイトの情報が収集できるWEBサービスです。 スク…

[GAS]はてなブックマーク Web Hookを扱うライブラリ

Google Apps Scriptで、はてなブックマーク Web Hookを扱う場合、タグのパースやコメントの抽出などの処理が必要なため、ライブラリ化しました。 過去に書いた、以下の記事を実装しやすくしたパターンとなります。 使い方 [リソース]→[ライブラリ]を選択…

[GAS]SpreadSheetで短縮URLを出力する関数(bit.ly編)

SpreadSheetで指定したセルの文字列(URL)の、bit.lyのAPIを使って、短縮URLとして出力するGoogle Apps Scriptの関数です。 以前goo.gl版を実装したので、その関数をベースに実装していきます。 SpreadSheetを新規作成し、[ツール]→[スクリプトエディタ]か…

[GAS]英文を翻訳したCSVがダウンロードできるWEBアプリケーション

今回も、Google Apps ScriptのHTML Serviceを使って、演習的なWEBアプリケーションを実装します。 アプリの要件は次の通りです。 HTMLでFormが表示/入力できる 入力された英文は、文章単位で分割される 各文章データは、選択された言語コードで翻訳される CS…

[GAS]URLのドキュメントがダウンロードできるWEBアプリケーション

今回は、Google Apps ScriptのHTML Serviceを使って、URLのドキュメントをダウンロードするだけのWEBアプリケーションを実装します。 Google Apps ScriptでWEBアプリケーションを実装するための演習です。 仕様は次の通りです。 HTMLでFormが表示できること …

[GAS]HTMLを表示するWebアプリケーション

JSONを返す処理は、何回か行っていたのですが、HTMLを返すアプリケーションは作っていなかったので、今回はHello Worldしたいと思います。 公式リファレンスのコードと殆ど同じです。 実装する関数とテンプレート まずは、code.gsから。 function doGet() { …

[読書]UNIXという考え方

半年程前に購入した『UNIXという考え方』だが、読もう読もうと思いつつも、必ずと言っていいほど、イントロダクション辺りで睡魔に襲われ、読めずじまいだったが、この度、ようやく読了したので、そのエッセンスや感銘を受けた箇所をメモしていく。 UNIXとい…

[GAS]URLのスクリーンショット画像をGyazoに保存する

URLからスクショ画像を作成し、GyazoにアップロードするスクリプトをGoogle Apps Scriptで書きました。 スクショの生成には、screenshotlayer APIを利用しました(要登録。100件/月が無料で利用できます)。 なお、Gyazo × Google Apps Scriptについては、過…

[GAS]Amazon S3にファイルをアップロードする

S3のCRUD操作は、S3ライブラリを利用すれば、手軽に実行できます。 ライブラリの詳細は、下記を参照してください。 Amazon S3 API Binding for Google Apps Script | Engineering | Etc ライブラリのコードも公開されているので、教材としてもなかなか良さげ…

[GAS]DataURIを送信して、GoogleDriveに保存するAPI

今回は、POSTされたDataURIから画像ファイルを作成し、Google DriveにアップロードするAPIをGoogle Apps Scriptで書きます。 以前書いたGoogleドライブにファイルをアップロードするの関数の応用となります。 Driveの有効化については、上記エントリを参照し…

[GAS]URLをPOSTしてGyazoに画像ファイルをアップロードするAPIとブックマークレット

今回は、POSTされたURLの画像ファイルをGyazoにアップロードするAPIをGoogle Apps Scriptで書きます。 以前書いたGyazoに画像ファイルをアップロードするの関数の応用となります。 アクセストークンの取得については、上記エントリを参照してください。 実装…

[Ruby]sayコマンドとffmpegで多言語音声ファイルを作成する

Mac独自のsayコマンドを触っていたら、案外面白かったので、以前Google Apps Scriptで書いたSpreadSheetでテキストを翻訳する関数を使って、外国語学習で使えそうな音声ファイルを作成するスクリプトをRubyで書いてみました。 音声サンプル 以下がスクリプト…

[GAS]住所から緯度経度を出力する関数

SpreadSheetで指定したセルの文字列(住所)の、緯度経度を出力するGoogle Apps Scriptの関数です。 SpreadSheetを新規作成し、[ツール]→[スクリプトエディタ]から、エディタを起動します。 エディタ起動後、次の関数を入力し、保存します。 function getGeo…