MongoDBをbrewから入れる


諸般あって手元にMongoDBを入れたいなとおもったときに以前はbrewからインストールできていたのに “No available formula” になることに今更気づいたのでその解決策。

☁ brew tap mongodb/brew
Updating Homebrew…
==> Tapping mongodb/brew
Cloning into ‘/usr/local/Homebrew/Library/Taps/mongodb/homebrew-brew’…
remote: Enumerating objects: 51, done.
remote: Counting objects: 100% (51/51), done.
remote: Compressing objects: 100% (44/44), done.
remote: Total 250 (delta 20), reused 17 (delta 7), pack-reused 199
Receiving objects: 100% (250/250), 53.06 KiB | 362.00 KiB/s, done.
Resolving deltas: 100% (112/112), done.
Tapped 9 formulae (36 files, 111.4KB).

☁ brew install mongodb-community
Updating Homebrew…
==> Installing mongodb-community from mongodb/brew
==> Downloading https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-4.2.7.tgz
######################################################################## 100.0%
==> Caveats
To have launchd start mongodb/brew/mongodb-community now and restart at login:
brew services start mongodb/brew/mongodb-community
Or, if you don’t want/need a background service you can just run:
mongod –config /usr/local/etc/mongod.conf

徒然日記 – ちょっとした模様替え, ちょっとしたプルリクエスト


3ヶ月以上在宅勤務を続けてきていると机の位置も今の部屋より違う場所がいいんじゃないかということにやっと気づき、午前中は机を動かした(ものを入れ替えた)。そして机の上もだんだん散乱してきていたのでこれを機会に整理したり物を捨てるなどしていた。
午後からカラーミーショップのWordpressプラグインのささやかな修正をするなどしていた。

n回目くらいだけど、細々とでも自分のできる範囲でのアウトプットを継続することはやっていきたいし、自分が示していくべきところだと思うのでやれる範囲でやっていく。

今日のYouTube

B’zの稲葉さんと立川談春の対談。数年前のだけど面白い。

徒然日記 – 日本型プラットフォームビジネス読了, チャーハン


日本型プラットフォームビジネス読了。国内のプラットフォームビジネスを行っている事業者をサマリした形になっている部分と分類をいくつかの形で提示し、国内の代表企業についてそれぞれのマトリクスで当てはめるという形でまとめられているため事例集的な位置づけで読むとよいかもしれない。以前読んだ以下の2冊と組み合わせて読むとよいのではないかと感じた。

お昼ごはんは高菜チャーハン作った。1月末来から在宅勤務がはじまって昼ごはんを作ってみる機会も増えてきてチャーハンに関してはパラパラ具合をしっかり出せる様になってきた。ごはんを焼くというのを意識しないと理想的にならないというか。また、作ってみようと思う。

盆栽いじりの様にSlack眺めるくんがtwitterタイムラインも眺められる修正入れていた。Slackのメッセージの間にtwitterのツイートが入ってくるのは情報がミックスされる感じがあって面白い。これ検索キーワードとかだけ指定できて流せてもよいかもしれないがそれやるなら別のツール使ってtakosan経由でSlackに流せばいいんじゃないかという気もしてきた。

午後からはプログラム書いたり手帳に書いたメモを起こしたり本を読んでいる間にマイケル・ナイマンの曲をずっとかけていた。

徒然日記 – サバ缶パスタ, 今更ながらtwitter APIと戯れる


昨晩から部屋の中の気温が微妙に高く、寝付けずやっと寝れたかなと思ったらすぐに目を覚ましを繰り返していたら朝になった。どうも季節の変わり目の睡眠が上手にできなくなってきた感がある。以前はこんなことはなかったのに。

お昼ごはんにサバ缶とホールトマトとその他残った野菜(ナス、玉ねぎ、人参)をみじん切りにして投入するとできあがるサバトマトパスタを作って食べる。味付けは塩コショウで適当にやるといい塩梅になる。鯖とトマトは偉大。

弊作のSlackながめるくんのタイムラインにtwitterのタイムラインもマージして表示できないかなと思ってtwitterのAPIのGET statuses/home_timelineを眺めたりしていた。以前から一般ディベロッパーのAPI呼び出し制限が相当厳しくなって実質タイムライン取得する系のアプリケーションが作れなくなったと聞いていたが15分の間に15回しか呼び出せないrate limitを見るにつれ、たしかにそうだなと思っていたが、もっとも個人の用途なのであれば1分に1回程度の呼び出しができればよいかと思いながら雑に実装してみたりしていた。

HTML中からSNSアカウントのリンクを正規表現で取り出す


こんな感じでよいのだろうか。みんな大好きHTTPieを利用した場合。例として弊社。トップページのHTMLを取得し、その取得結果に対してgrep実行して抽出する。

☁  ~  http https://pepabo.com/ | grep -Eo "twitter\.com\/[a-zA-Z0-9_]+"
twitter.com/pepabo

慢性的なSQL能力と正規表現不足の人間なので何か想定抜けありそうなのだけれども上の様な形で書けばリンクでマークアップされていたりすればうまく取り出せるのではないだろうかとは思う。

徒然日記 – メモを取りながらプログラムを書く


GAS(Google Apps Script)で書きたいと思っていたちょっとしたプログラムがあったので午前中からラジオを聴きながらプログラムを書いていた。やりたいことは

といった内容。

Redashで得られる結果がカラム名と取得行がまとめられたJSONが返ってくる仕様なのでそれを読み取りつつスプレッドシート上に反映させていくというもので非常にシンプルではあるのだけれども悲しいかな以前の様に頭の中だけでまとめきれなくなってきているので原点回帰してノートにメモを取りながらコードを書いていった。

スプレッドシート上のここに書いたものを読み取って参照して得られたJSONをこういった形に解釈してスプレッドシート上のフォーマットの項目名を参照してセルにその値を書き込んでいって…とノート上に書き取りながら考えを整理していくとそれなりにまとめられて、それを見ながらコードに書き落としていくとやりたいことが実現できた気がする。

このやり方、四半世紀…25年以上前にBASIC言語でプログラム書いていたとき*1と変わらず、なんか懐かしいなと思いつつ楽しみながら一日を過ごしていた。


今日読んだ印象に残った記事。自分も同感なところが多かった。

r25.jp

機嫌については自分も思うことがあるのでどこかで書いてみたい。

*1:学校のパソコン室にあった台数に限りがあって1台を3名くらいで使っていたので自分の番ではないときは紙のノートの上でプログラムを書いていた記憶がある

google apps scriptでスプレッドシートの特定の列, 行を配列として取り込む


google apps scriptのgetRange と getValuesを利用して特定のシートの指定した範囲のセルに含まれる値を取得することができるのだが、これだと列方向に対して値を取得した際に

[["A1"], ["A2"], ["A3"], ... ]

といった形で取得され、逆に行に対して値を取得すると

[["A1", "B1", "C1", ...]]

という形で取得される。複数の行・列を指定しての範囲を指定してセルの情報を取得する場合はよいのだけれども単一の行と列を取得する場合は少し扱いにくい。

f:id:hideack:20200211113912p:plain
1次元配列で返って欲しい例

上の様になってほしいので

parseLine(“シート名”, “B:B”);

みたいな形で呼び出すとシンプルな1次元配列で返すものを準備した。

function parseLine(sheetName, range) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var selectRange=sheet.getRange(range);
var values=selectRange.getValues();
var responseArray = [];
var isCol = false;
var isNum = new RegExp(/^[0-9]+(\.[0-9]+)?$/);
if (isNum.test(range.charAt(0))) {
for(var i=0; i<values[0].length; i++) {
responseArray.push(values[0][i].toString());
}
} else {
for(var i=0; i<values.length; i++) {
responseArray.push(values[i][0].toString());
}
}
return responseArray;
}

得てしてこういうのを書くと既にAPIとして備わってること多い気もするのだけれども実際どうだろう。

徒然日記 – fastifyのテンプレートエンジン


昨夜思いつきで雑に書いたプログラムを休憩時間にfastifyを使って動かしてみようと思ってこれまた雑に書いてみたところでHTMLを返したくなり、テンプレートエンジンのところどうするのがいいんだろうと思ってて見つけたものを使った。

github.com

まだ表に出せてないんだけどもう少し整えてgithubとかに上げたい。

こういう形で実際に思いついたのをすぐ手を動かして試してみるという感覚、しばし書いている通り忘れたくないので続けねば。激減はしてるけれども。

GAS(Google Apps Script)でカラーミーショップAPIを利用する


カラーミーショップ では、カラーミーショップAPIというAPIを用意していてネットショップを運営するための管理画面から行えるオペレーションであったり、ショップ自体が供える情報を取得する仕組みがある。この仕組みを活用してカラーミーショップでは今年の5月からカラーミーショップアプリストアというネットショップを運営するにあたっての機能をアドオンしたり効率化することができるプラットフォームの提供を開始している。

自分自身がこのプラットフォームに参加してもらうためのEC支援系の企業の方々だったり、エンジニアの方とお話することがまま増えていく中で、もっとAPI活用できないかなと考えたとき、例えばサービスで提供しているCSVダウンロードの機能だったりをgoogle docs (Google Apps Script) とカラーミーショップAPIで置き換えられないかなと思って試してみた。あと、自分自身がもう少しこの周りをもっと利用しないと気づけないところもあるのではないかと思ってみたところもモチベーションだったりする。

ちなみに開発者体験を向上させたいという視点からエンジニアサイドでもハッカソンインベントもチャレンジしている。

tech.pepabo.com

少し話がずれてしまった。

以下、一例として「ネットショップに登録している商品の “ID, 商品名, 価格” をgoogle docsスプレッドシートに書き出す」というオペレーションを試してみた。こういったところからネットショップだったりの運営を自動化してみるところにチャレンジしてみるのも一案だと思う。


googel docsでスプレッドシートを新規作成する

新しくスプレッドシートの新規作成をして、そこから “ツール > スクリプトエディタ” を選択。

スクリプトIDを控える

スクリプトエディタを開いた際の “ファイル > プロジェクトのプロパティー” を開くと以下の様なダイアログが表示される。

f:id:hideack:20191104151818p:plain

スクリプトIDが表示されるダイアログ

ダイアログ中に表示される スクリプトID を後に利用するので控える。

カラーミーショップAPIでアプリケーション登録をする

カラーミーショップAPIのアプリケーション登録から今回のGASでカラーミーショップAPIを利用するアプリケーションを登録する。
登録は https://api.shop-pro.jp/oauth/applications/new から行える。

ディベロッパー登録していない場合は https://api.shop-pro.jp/developers/sign_up から行える。

f:id:hideack:20191104142443p:plain

カラーミーショップAPIの新規アプリケーション登録画面

登録の際に必要となるリダイレクトURIには、一つ前の手順で控えたスクリプトIDを含めた以下のものを設定する。

https://script.google.com/macros/d/スクリプトID/usercallback で設定する

アプリケーション登録を完了した際に表示されるクライアントID, クライアントシークレットを控える

画面上に表示されるクライアントID及び、クライアントシークレットを控える。

f:id:hideack:20191104142646p:plain

アプリケーション登録完了時の画面

OAuth認証をするためのライブラリを追加する

Google Apps ScriptでOAuth認証を行うためのライブラリを登録する。スクリプトエディタのメニューにある “リソース > ライブラリ…” を選択して表示されるウインドウ中の Add a library のフォームに以下の識別子を入力する。

1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF

f:id:hideack:20191104142854p:plain

OAuth認証用のライブラリを追加する

そうすると “OAuth2” のライブラリが見つかるので最新のバージョンを指定して保存する。

f:id:hideack:20191104143300p:plain

OAuth2のライブラリが見つかるので最新のものを選択

ソースコードを記述する

試しにカラーミーショップAPIから認証を取った利用店舗の商品情報を取得してみる。以下、サンプルソースコード。

上記のソースコードを入力し終えた後、スクリプトエディタの “実行 > 関数を実行” で以下の順番を踏んで関数を実行する。

doAuthentication

実行が正常に終わった後、”表示 > ログ” で表示されるURLをブラウザに貼り付けて開く。そうするとカラーミーショップAPIでのOAuth認証が走り「認証に成功しました。タブを閉じてください。」という表示が行われたら認証成功。

getProducts

実行するとカラーミーショップAPIから取得された認証ショップの商品情報がシート (ここでは “シート1” という名前固定) に書き出されていく

f:id:hideack:20191104144951p:plain

シートに書き出された様子(ここでは商品ID, 商品名, 価格が書き出されている)

追伸(2020年5月30日)

はてなブログから移設した際にソースコードが読みにくくなっていたのでgistを利用して貼り付け直しました。

スクリーンショットを取るAPI的なもの – 徒然日記


連休一日目。昨日、どうも心持ちがすっきりしない出来事があり、夜もあまり熟睡できない感もあってすぐ目が覚めてしまい気分を紛らわしたい気持ちになったので久しぶりにいちからコードを書いた。こういうときの自分の解決策は

  • プログラムを書く
  • 写経をする*1
  • 料理を作る

の三択になる。

GitHub – hideack/shutter: puppeteerによるスクリーンショット取得するシンプルなAPIを提供

大した内容ではなく、やってることはpuppeteerを使ってクエリパラメータで渡されたURLのスクリーンショットを撮り、そのPNGを返し、その撮影した内容はファイルキャッシュしてくれるといったものになる。実際に使うにはPaaSにカジュアルにおいて使うことを想定して書いてみた。

これで何ができるのかというと具体的な用途としてはスプレッドシートに書いたURLのスクリーンショットをセル中に差し込むみたいなことができる様になる。世に同様のサービスはいくつもあると思うのだけれどもそれなりの契約の手間だったりコスト感だったりを考えたときに使えるケースもあるのではないかなと思っている。*2

f:id:hideack:20190713184934p:plain
google docsスプレッドシートでIMAGE関数使ってセル中にスクリーンショットを表示させる

ただ、スプレッドシートでそれなりの数のURLが列挙されている状況でこのスクリーンショット参照用のURLを並べるとそこそこのリクエストが並行してサーバーに飛ぶのでここは使い方次第かもしれない。ちなみにherokuの無料プランだと5行くらいURLを書いた各セルの横にこのスクリーンショットを参照するURLを記載したときは捌けるくらいだった。もっとも、今回の実装、オンザフライ方式*3で本当は多分キューイングして端からスクリーンショットを撮るとかするのが正解なのかなとビールを呑みながら思っていたりする。

他の用途としては例えばSlackのボットにスクリーンショットを撮らせる際に使うみたいなこともできそうだなというのは思ったりした。

コード、こういう書き方がベストなのかさっぱり見当がつかないので、識者の方で気づいたところがあったらコメントもらえると嬉しい。

*1:ちなみに般若心経

*2:例えば何かしらの調査をするがためのシートを作りそこにスクリーンショットを差し込む目的だけのために外部サービス契約するのもなんだかなと思う気持ちがある

*3:もしかして死語?