kakts-log

programming について調べたことを整理していきます

slackをrssリーダーにする

rssリーダーとしてのslack

qiita.com

こちらの記事を読んでみた。 今更ながら、slackチャンネルにrssを登録できることを知らなかった。 個人用にメモなどで使っているslackアカウントで気になるブログのrss登録してrssリーダーにするとかなり良さそう

slack でのrss関連の公式マニュアルはこちら get.slack.help

実際に登録してみる

やることはメチャクチャ簡単です。

チャットボックス内で/feed を先頭に下記登録したいrss urlを書くだけ

/feed http://kakts-tec.hatenablog.com/feed

すると、slackbotが反応してくれて登録Done!

f:id:kakts:20161102003629p:plain

GraphQLを使ってみた

最近話題になっているGraphQLについて

RESTful web api界隈で話題になっている、GraphQLが結構気になっています。 先日のnode学園#23でもGraphQLの話が上がっていて、RESTfulって運用上結構辛いところもあるよね という文脈からGraphQLを推している 発表もありました

speakerdeck.com

あとは、海外の記事ですがGraphQLについて解説している記事も有名です https://0x2a.sh/from-rest-to-graphql-b4e95e94c26b#.gvddna8vv

GraphQLとは

A query language for your API

graphql.org

公式の説明によるとGraphQLとは、web APIのためのquery languageで、 ニーズに合わせて必要なデータだけをクエリを書いて自由に取得できるので、 かなり柔軟性の高いapiが作れるようになります。

Facebook Github Pinterestなど、大規模なサービスでも使われているのでかなり運用実績もあります

GraphQLをいじってみた

GraphQLはnode.js ruby pythonなど様々な環境で使えるので、node.jsで簡単なwebサーバを作ってみます。

express graphqlの連携

nodeのwebフレームワークであるexpressのミドルウェアとしてexpress-graphqlというモジュールがあるので、これを使って簡単にapi作ってみます。

$ mkdir test-graphql
$ cd test-graphql
$ npm install express express-graphql graphql

まず適当にディレクトリをつくってその配下に express express-graphql graphqlモジュールをインストールします

次にwebサーバ用のスクリプトを作ります require(''graphql'')の戻り値にbuildSchemaというものがあり、これがgraphQLのapiスキーマを設定するために必要なため、取得します

server.js

var express = require('express');
var graphqlHTTP = require('express-graphql');
var { buildSchema } = require('graphql');

var schema = buildSchema(`
  type Query {
    hello: String
  }
`);

var root = { hello: () => 'Hello world!' };

var app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true,
}));
app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));
 $ node server.js

server.jsを起動し、4000番ポートにアクセスするとGraphQLのUI画面が出てきます ここでクエリを書くことで求める値を取ることができます

ローカルのpcで起動している場合  http://localhost:4000/graphql でアクセスできるかと思います

GraphQL UI画面からクエリを書いてみる

f:id:kakts:20161025015649p:plain

画面左半分がクエリ入力画面で 右半分が結果画面になります。

ためしに、buildSchemaで設定したhelloをクエリで抽出してみると下記の通りちゃんと結果がでてきます f:id:kakts:20161025015905p:plain

コンソールからapiを叩いてみる

ブラウザで色々操作できるということは、コンソールからcurlでurl叩いてももちろん取得できます GraphQLのapiは POST形式で、bodyに json形式でqueryの状態を渡してあげればちゃんとレスポンスで返ってきます ここらへんのやり方はGraphQL公式の方にも詳しく書いてあるので興味ある方は読んでみると良いかと。

先程のサーバを起動させたままの状態でcurl叩くと、、、

$ curl -X POST http://localhost:4000/graphql -H "Content-Type: application/json" -d '{"query": "{hello}"}'

{"data":{"hello":"Hello world!"}}

とちゃんと返ってきます。

まとめ

GraphQLを使った感じだと、かなり導入が楽で実装自体も直感的にかけるのでかなり良いかと思います。 実サービスでの管理画面とかでうまく使えればかなり良いツール作れたりできそうです。 引き続き色々遊んでみてちゃんと使えるところまで身につけようと思います。

ただし、仕様がかなり膨大なため、本格的に使おうとするとちゃんと読まなきゃ行けないのがつらいとのことです。

https://facebook.github.io/graphql/

macで npm install時にEACCESSエラーが出る

macでnpm install 時にEACCESSエラーが出る

macでnodeやnpmバージョンアップした後、 sudo npm install などでroot権限でインストールしたあとにnpmで以下のエラーが出るようになってしまった

npm ERR! Darwin 13.4.0
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install" "-g" "babel-cli"
npm ERR! node v4.6.0
npm ERR! npm  v3.10.8
npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access

この場合npm install時に毎回参照されるnpm default directoryの権限がおかしくなっていると思い、 /usr/local/lib/node_modules以下の権限を見てみると、オーナーがrootになっていた

$ cd /usr/local/lib/node_modules
$ ls -Fal
total 0
drwxr-xr-x   13 24561   wheel   442 10 24 23:34 ./
drwxrwxrwx   93 root    admin  3162  6  2 01:01 ../
drwxr-xr-x  219 root    wheel  7446 10 24 23:34 .staging/
drwxr-xr-x    8 nobody  staff   272  3 14  2015 async/
drwxr-xr-x   13 nobody  staff   442  1 23  2016 coffee-script/
drwxr-xr-x   13 nobody  staff   442 12 15  2013 express/
drwxr-xr-x    8 nobody  staff   272  9  5  2014 express-generator/
drwxr-xr-x    8 nobody  staff   272  1 23  2016 generator-hubot/
drwxr-xr-x   19 nobody  staff   646  1 23  2016 hubot/
drwxr-xr-x    6 nobody  staff   204  7 10  2015 n/
drwxr-xr-x   27 root    wheel   918 10 23 15:07 npm/
drwxr-xr-x   14 nobody  staff   476  4 12  2016 request/
drwxr-xr-x    6 nobody  staff   204  1 23  2016 yo/

どう対処したか

多少強引ではあるが、mac環境でsudo npm installをすると rootユーザでnpm installするなみたいな警告がでていたので オーナーを自分のユーザに戻した

 $sudo chown -R testuser /usr/local

これで解決した

他のアプローチで対処できるのか

npm 公式のトラブルシューティングに対策が幾つか書いてある

docs.npmjs.com

その他の方法としては以下の方法があり、上記urlにまとまってます。

npm v4 v5について

npm v4 v5 について

先日のnode学園でnpm の開発者Forrest Norvellが登壇してnpmのv4 v5について語っていました。 nodejs.connpass.com

発表のスクリプトは以下にまとまっています。 Forrest Norvell曰く、v4はそんなに大きな変更点はなく、v5でdepricatedだった機能が完全廃止されたりと大きな変更があるようです。 奇数系バージョンが大きな変更あるっぽいですね https://gist.github.com/othiym23/c98bd4ef5d9fb3f496835bd481ef40ae

同じタイミングで、 npm v4のpre-releaseが正式に発表されています github.com

npm v4 の主な変更点

v4からの破壊的な変更についてだけまとめると以下のとおりになります

- npm search rewritten to stream results, and no longer supports sorting.
- npm scripts no longer prepend the path of the node executable used to run npm before running scripts. A --scripts-prepend-node-path option has been added to configure this behavior.
- npat has been removed.
- prepublish has been deprecated, replaced by prepare. A prepublishOnly script has been temporarily added, which will only run on npm publish.
- npm outdated exits with exit code 1 if it finds any outdated packages.
- npm tag has been removed after a deprecation cycle. Use npm dist-tag.
- Partial shrinkwraps are no longer supported. npm-shrinkwrap.json is considered a complete installation manifest except for devDependencies.
- npm's default git branch is no longer master. We'll be using latest from now on.

そのうち、気になった変更だけ幾つか整理してみます。

npm search rewritten to stream results, and no longer supports sorting.

npm searchの処理についてですが、バージョンが上がるたびに処理が遅くなっているとのことで、 ストリーム形式に書き直したそうです。この変更によって、npm searchで使っているソーティングのサポートも途切れるとのことで、 あくまでも応急処置的な対応になります。

ほんとにnpm packageの検索を効率的に行いたい場合は npms.ioを使ってくれと、npmのチームが言及しています。 npms.io

npm tag has been removed after a deprecation cycle. Use npm dist-tag.

npm packageのタグ付けを行う npm tagが廃止されて npm dist-tagを代わりに使います npm dist-tag add や npm dist-tag rm でタグの追加や削除ができますね タグ関連のコマンドを一つにまとめたという感じでしょうか docs.npmjs.com

Partial shrinkwraps are no longer supported.

npm shrinkwrapsはおもにパッケージのバージョンを固定化するために使うコマンドなのですが、v4から大きく変わるようです。 特定のバージョンをインストールするように指定する、npm-shrinkwrap.jsonは、v4からインストールされなくなります。 同様にdev環境のみいれるパッケージを package.jsonのdevDependenciesに書けるのですが、これも今回のバージョンアップで挙動が変わります。

devDependenciesに書いてあるパッケージもインストールしたい場合は、 npm shrinkwrap --devと書くことで対応できるようになります。

そこまでnpmの機能を使いこなせていない状態ですが、個人環境でいろいろ使って試してみようと思います。 v5に関しては、2017/4にはリリースするかもということなので結構目まぐるしくnpm界隈は変わっていくかと思います。

yarnについて

yarnとは

yarn


yarnとは、Facebookのエンジニアを中心に開発された、npmクライアントのこと。
npm互換のため、既存のプロジェクトにおいても互換性を気にせずに使うことができます。

インストール

インストール方法はこちらにまとまってます https://yarnpkg.com/en/docs/install
macの場合だと brew でインストールするのが一番手っ取り早いです。

使い方

npmでの使い方とほぼ変わらないです

nodeのバージョンが0.12系とかだと対応していないため、4.x系以上にする必要があります



npm と yarnどちらが早いか検証してみた

実際どれくらいインストール時間が短縮できるのか知りたかったため
簡単にjqueryリポジトリで検証してみた https://github.com/jquery/jquery



npm キャッシュクリアした上で両者を検討したがやはりyarnのほうがかなりパフォーマンスが良かった


herokuインスタンスのタイムゾーンを変更する方法

 herokuでインスタンスを立ち上げた場合、インスタンス上で使われているタイムゾーンは、標準時(UTC)がデフォルトで設定されているため、日本時間と比べてタイムゾーンが9時間分ずれている状態となっています。
 このタイムゾーンの設定を変更する方法は以下の通りになります。

まずherokuインスタンス上の時刻を確認して、時刻が標準時になっているのを確認し、タイムゾーンをAsia/Tokyoに変更させます。
heroku config のTZ にタイムゾーンのコードを設定するだけです。


heroku上でhubotのkeepalive設定がおかしい場合はこんな感じでタイムゾーンを確認すると良いと思います。