feat: use hexo

This commit is contained in:
2021-01-21 21:45:05 +09:00
parent 2d93c3d6ca
commit 039bac5e09
185 changed files with 2400 additions and 2575 deletions

View File

@@ -0,0 +1,37 @@
---
title: Rails Assetsのパッケージをコマンドラインから検索する
date: 2014-03-14 09:00:00 +09:00
redirect_from: "/blog/2014/03/14/rails-assets-cli"
---
[Rails Assets](https://rails-assets.org/) は Bower パッケージを Bundler で管理出
来る便利なサービスである。
ウェブサイトにアクセスして、Rails Assets に登録されているパッケージを検索するの
は面倒なので CLI から検索したい。そのためには`gem search --source {url}`オプショ
ンを利用したら良い。
```bash
$ gem search {package-name} --source https://rails-assets.org | grep "^rails-assets-"
```
`gem search` は source を指定しているにも関わらず RubyGems.org のパッケージも引
っかかってしまうので Rails Assets のプレフィックスで抽出している。
### シェルスクリプト
```bash:rails-assets.sh
#!/bin/sh
# Usage: rails-assets [package-name] [-a]
gem search $1 $2 --source https://rails-assets.org | grep "^rails-assets-"
```
もっと簡単に、シェル関数を定義することも出来る。
```bash:~/.zshrc rails-assets(){ gem search $1 $2 --source
https://rails-assets.org | grep "^rails-assets-" }
```
```

View File

@@ -0,0 +1,87 @@
---
title: Run dokku with Dockland
date: 2014-05-30 09:00:00 +09:00
redirect_from: "/blog/2014/05/30/dokku-with-dockland"
---
ローカルから heroku-toolbelt ライクに dokku コマンドを叩く dockland gem をリリースした。
Github: [uetchy/dockland](https://github.com/uetchy/dockland)
## インストール方法
```bash
gem install dockland
```
## 使い方
### 普通のやり方
まずは普通に dokku コマンドを叩く。
`ssh -t dokku@example.com <command> <app-name> <options>`でリモートの dokku コマンドを直接叩ける。
```bash
$ ssh -t dokku@example.com config:set sushi-app KEY1=VALUE
-----> Setting config vars and restarting sushi-app
KEY1: VALUE
-----> Releasing sushi-app ...
-----> Release complete!
-----> Deploying sushi-app ...
-----> Deploy complete!
```
しかしこれではホスト名やアプリ名を毎回打ち込む羽目になって大変だ。
### dockland のやり方
dockland で同じことをやる。
```bash
$ cd sushi-app # ローカルのプロジェクトリポジトリに移動
$ git config remote.dokku.url # プッシュ先を確認しておく
dokku@example.com:sushi-app
$ dockland config:set KEY1=VALUE # 叩く時はコマンドとオプションだけ
-----> Setting config vars and restarting sushi-app
KEY1: VALUE
-----> Releasing sushi-app ...
-----> Release complete!
-----> Deploying sushi-app ...
-----> Deploy complete!
$ dockland config
=== sushi-app config vars ===
KEY1: VALUE
```
このように dockland が `git config` をパースして必要な情報を自動で収集してくれるので、コマンドがシンプルになる。
ついでに、
```bash:.zshrc
alias dokku='dockland'
```
という具合に alias を張っておけば、まるでリモートで`dokku`を実行している感覚でローカルから`dokku`コマンドを触ることが出来る。
```bash
$ cd rails-app
$ dokku logs
[2014-05-29 15:38:56] INFO WEBrick 1.3.1
[2014-05-29 15:38:56] INFO ruby 2.1.2 (2014-05-08) [x86_64-linux]
[2014-05-29 15:38:56] INFO WEBrick::HTTPServer#start: pid=10 port=5000
〜〜〜
```
## 結論
### 良い所
- リモートの dokku コマンドを叩きたい時はプロジェクトの Git リポジトリに入って dockland コマンドを叩くだけで良い
### 悪いところ
- 実装が綺麗じゃないすぎる

View File

@@ -0,0 +1,48 @@
---
title: HomebrewでmacOSに構文解析システムKNPを入れる
date: 2014-09-23 09:00:00 +09:00
redirect_from: "/blog/2014/09/23/homebrew-osx-knp"
---
Homebrew で macOS に構文解析システム KNP をインストールします。
# 前提
OS X 用のパッケージ管理ツール Homebrew がインストールされている必要がある。
インストール方法は[こちら](http://www.engineyard.co.jp/blog/2012/homebrew-os-xs-missing-package-manager/)
# インストール
デフォルトの Homebrew リポジトリに KNP は含まれていないので [homebrew-nlp](https://github.com/uetchy/homebrew-nlp) を tap する。
```bash
brew tap uetchy/nlp
```
Tap し終わったら、`knp`をインストールする。knp が依存している形態素解析システム`juman`とデータベース`tinycdb`は Homebrew によって自動でインストールされる。その内の`juman`は上記の **uetchy/nlp** Tap によって提供されている。
```bash
brew install knp
```
固有表現解析を行いたい場合は **--with-crf++** オプションを付けてインストールする。このオプションを付けると、依存解決のために`crf++`も同時にインストールされる。
```bash
brew install knp --with-crf++
```
KNP のインストールにはありえないくらい時間が掛かる。
# チェック
インストールが終わったら動作チェックをする。
```bash
$ juman < test.txt | knp
# S-ID:1 KNP:4.11-CF1.1 DATE:2014/09/23 SCORE:-19.04210
今日は──┐
良い──┤
天気です。
EOS
```

View File

@@ -0,0 +1,95 @@
---
title: homebrew-caskを単純なダウンローダーとして使う
date: 2014-10-27 09:00:00 +09:00
redirect_from: "/blog/2014/10/27/brew-cask-downloader"
---
![image](/uploads/brew-cask-downloader.png)
homebrew-cask を単純なダウンローダーとして使う。
# 理由
1. **pkg 形式** で配布されているアプリケーションはインストール時にオプションをカ
スタマイズ出来ることが多い。
2. にも関わらず`brew cask install`を使うと、それらのオプションを選べずにインスト
ールされてしまい悲しい。
3. そこで、`brew cask`で fetch までは自動化して、インストール自体は手動でやろう
( スマートではないが。)
# 方法
## 準備
以下のようなシェルスクリプトを書いて、**/usr/local/bin/brew-smash** など任意の実
行パスに配置し、`chmod +x /path/to/brew-smash`等で実行権限を与える。
```bash:/usr/local/bin/brew-smash
#!/bin/sh
# Usage: brew smash app-name
if [ -z "$1" ] ; then
echo "Usage: brew smash app-name"
exit 1
fi
if [ ! -d "Casks" ] ; then
KEEP_CLEAN=true
else
KEEP_CLEAN=false
fi
HOMEBREW_CACHE=. brew cask fetch "$1"
if [ "$KEEP_CLEAN" = true ] ; then
rm -r "Casks"
fi
```
もしくは直接ダウンロードしても良い。
```bash
$ curl https://gist.githubusercontent.com/uetchy/eb625f922eff16eb404b/raw/brew-smash.sh -o /usr/local/bin/brew-smash
$ chmod +x /usr/local/bin/brew-smash
```
## 実際に使う
以下のように`brew smash`コマンドを叩く
```bash
$ brew smash send-to-kindle
==> Fetching resources for Cask send-to-kindle
==> Downloading https://s3.amazonaws.com/sendtokindle/SendToKindleForMac-installer-v1.0.0.220.pkg
######################################################################## 100.0%
==> Success! Downloaded to -> ./send-to-kindle-1.0.0.220.pkg
```
# シェルスクリプトの解説
難しいことはやってないが、`brew cask fetch`コマンドはキャッシュ先に**Casks**ディ
レクトリを生成するので、それを除去している。また、元々カレントディレクトリに
Casks という名前のディレクトリがある場合、それを削除してしまわないようにしている
# 本当にやりたかったこと
こういう機能いれてくれ
```bash
$ brew cask install virtualbox
==> Fetching resources for Cask virtualbox
==> Downloading http://download.virtualbox.org/virtualbox/4.3.18/VirtualBox-4.3.18-96516-OSX.dmg
###### ################################################################## 100.0%
==> Cask virtualbox has installation options
==> Do you need to install 'Oracle VM VirtualBox Command Line Utilities'? [y/n]
==> y
==> Success!
```

View File

@@ -0,0 +1,56 @@
---
title: Sketch 3 plugin 'StickyGrid'
date: 2014-12-03 09:00:00 +09:00
redirect_from: "/blog/2014/12/03/sketch-plugin-stickygrid-ja"
---
選択したシェイプのポイントをグリッドに吸い付かせるプラグイン StickyGrid を作りました。
![](http://uechi-public.s3.amazonaws.com/github/sketch-stickygrid.png)
Vector ツールで軽くスケッチしてからこのプラグインを適用することで、簡単に幾何学的なオブジェクトを作ることが出来る。
# インストール
[リリースページ](https://github.com/uetchy/Sketch-StickyGrid/releases/latest)から zip アーカイブをダウンロードし、**StickyGrid.sketchplugin** をダブルクリックしてインストールする。
もし、より*CLI-way*がお好みであれば、以下のコマンドでもインストールすることが出来る。
```bash
cd $HOME/Library/Application Support/com.bohemiancoding.sketch3/Plugins
git clone https://github.com/uetchy/Sketch-StickyGrid.git
```
# 使い方
吸い付かせたいシェイプを 1 つ、または複数選択して **`ctrl` + `⌘` + `G`** を押すと、パスがグリッドの交差点に吸い付く。
ショートカット以外にも、メニューから**Plugins > Sketch-StickyGrid > Snap to Grid**を選んでも良い。
シェイプはもちろん、グルーピングされたシェイプも、逆にシェイプポイントだけでも吸い付く。
# プラグインの開発にあたって
## プラグインのデバッグ
デバッギングには[Sketch-DevTools](https://github.com/turbobabr/sketch-devtools)を使っていましたが、最新版の Sketch では使えなくなってしまった。
その代わりに Mac 標準アプリの **Console.app** を使う方法が公式デベロッパーサイトの記事 [Debugging - Sketch Developer](http://developer.sketchapp.com/code-examples/debugging/) で紹介されている。
スクリプト内で`log`関数を呼び出すと、Console.app にログが出力される。
```js
log(context.document.gridSize)
```
## ドキュメントの情報源
ドキュメントは公式デベロッパーサイト [Sketch Developer](http://developer.sketchapp.com) があるものの、パス編集に関するドキュメントは全くなかった。
そこで、[class-dump](http://stevenygard.com/projects/class-dump/) を使って Sketch.app のヘッダーファイルを抽出し、ひたすら **目 grep** をしてシェイプ操作とグリッドに関する API を探し出し、プラグインの実装に役立てた。
また、先人によって公開されている数多の Sketch プラグインのソースを見ることも、開発の助けになった。
# 結論
苦行僧じみた Sketch プラグインの開発には **class-dump****Console.app** が必携。

View File

@@ -0,0 +1,56 @@
---
title: Sketch 3 plugin 'StickyGrid'
date: 2014-12-03 09:00:00 +09:00
redirect_from: "/blog/2014/12/03/sketch-plugin-stickygrid"
---
For practicing Sketch plugin development, I created **StickyGrid** to let shape points sticked with grids.
![](http://uechi-public.s3.amazonaws.com/github/sketch-stickygrid.png)
Draw something in rough and apply this plugin then you'll get geometric shapes at ease.
# How to install
From [GitHub releases](https://github.com/uetchy/Sketch-StickyGrid/releases/latest), Download a zipped archive then unarchive it then double click **StickyGrid.sketchplugin** so you are prepared for using StickyGrid.
Loving _CLI-way_ than anything, You also want to run those commands to get the same thing.
```bash
cd $HOME/Library/Application Support/com.bohemiancoding.sketch3/Plugins
git clone https://github.com/uetchy/Sketch-StickyGrid.git
```
# Usage
At first, selecting **`ctrl` + `⌘` + `G`** を押すと、パスがグリッドの交差点に吸い付く。
ショートカット以外にも、メニューから**Plugins > Sketch-StickyGrid > Snap to Grid**を選んでも良い。
シェイプはもちろん、グルーピングされたシェイプも、逆にシェイプポイントだけでも吸い付く。
# プラグインの開発にあたって
## プラグインのデバッグ
デバッギングには[Sketch-DevTools](https://github.com/turbobabr/sketch-devtools)を使っていましたが、最新版の Sketch では使えなくなってしまった。
その代わりに Mac 標準アプリの **Console.app** を使う方法が公式デベロッパーサイトの記事 [Debugging - Sketch Developer](http://developer.sketchapp.com/code-examples/debugging/) で紹介されている。
スクリプト内で`log`関数を呼び出すと、Console.app にログが出力される。
```js
log(context.document.gridSize)
```
## ドキュメントの情報源
ドキュメントは公式デベロッパーサイト [Sketch Developer](http://developer.sketchapp.com) があるものの、パス編集に関するドキュメントは全くなかった。
そこで、[class-dump](http://stevenygard.com/projects/class-dump/) を使って Sketch.app のヘッダーファイルを抽出し、ひたすら**目 grep**をしてシェイプ操作とグリッドに関する API を探し出し、プラグインの実装に役立てた。
また、先人によって公開されている数多の Sketch プラグインのソースを見ることも、開発の助けになった。
# 結論
苦行僧じみた Sketch プラグインの開発には**class-dump**と**Console.app**が必携。

View File

@@ -0,0 +1,176 @@
---
title: Take control of Chrome with Myo Armband
date: 2014-12-16 09:00:00 +09:00
redirect_from: "/blog/2014/12/16/myo-armband"
---
Thalmic Labs の MYO アームバンドが届いたので Google Chrome をマイノリティ・リポートっぽいジェスチャーで操作する Myo Scripts を書いてみる。
### 主な情報源
- <https://developer.thalmic.com/start/>
- <https://www.thalmic.com/blog/tag/myo-scripting-basics/>
- <https://developer.thalmic.com/docs/api_reference/platform/script-tutorial.html>
# 基本
Lua で記述し、拡張子は**.myo**を使う。
作成したスクリプトは Myo Connect を経由してアームバンドとやりとりをすることになる。
> デバッグコマンドとして`myo.debug(obj)`が用意されている。
## scriptId
スクリプトを識別するための`scriptId`は必ず書かなければならない。
```lua
scriptId = 'co.randompaper.myo.chrome'
```
## onForegroundWindowChange(app, title)
```lua
function onForegroundWindowChange(app, title)
return app == "com.google.Chrome"
end
```
onForegroundWindowChange の返り値が**true**の場合、スクリプトをアクティブにする。つまり上のように書けば Google Chrome のウィンドウが最前面に出ている時だけスクリプトを有効化させることが出来る。
いかなる状況でもジェスチャーをハンドルしたい場合は以下のように書く。
```lua
function onForegroundWindowChange(app, title)
return true
end
```
実際には、**親指と中指でダブルタップ** するジェスチャーを検知した後に、全ての Myo Scripts の onForegroundWindowChange を呼び出している。そして true が返ってきたスクリプトのみを実行している。
アクティブになったスクリプトは一定時間が経過してアームバンドがロックされるまでイベントハンドラーが呼ばれ続ける。
## onPoseEdge(pose, edge)
スクリプトがアクティブになっている間に行われたジェスチャーをハンドルするメソッド。
```lua
function onPoseEdge(pose, edge)
if pose == 'fist' and edge == 'on' then
myo.debug("グー")
elseif pose == 'fist' and edge == 'off' then
myo.debug("グーじゃなくなった")
end
end
```
### pose の種類
| pose | 意味 |
| ------------- | ------------------------ |
| rest | 安静時 |
| fist | 握り拳 |
| fingersSpread | 手を開く |
| waveIn | 手首を手前に曲げる |
| waveOut | 手首を手前とは逆に曲げる |
| doubleTap | 中指と親指でダブルタップ |
| unknown | 判別不能 |
## onPeriodic()
```lua
function onPeriodic()
roll = myo.getRoll()
myo.debug(roll)
end
```
onPeriodic はスクリプトがアクティブな間ずっと呼ばれ続ける。常にアームバンドのジャイロ情報を取得してなんやかんやしたい時に使う。
# 実装
以上のハンドラーを駆使し作ってみる。
今回のように Google Chrome のスクロール操作をアームバンドのジェスチャーでやりたい場合、**onPeriodic** で`myo.getRoll()`メソッドを呼び出せば手首の回転する角度を取得出来るわけである。しかし、そのまま**onPeriodic**上にスクロールを行うコードを続けて書くと常にアームバンドの傾き具合でスクロールされてしまい困る。
そこで、「握り拳を握っている間だけ手首の傾きによってウェブページをスクロールさせる」ようにする。
## 握り拳を握っている間だけ手首の傾きによってウェブページをスクロールさせる
初めにグローバルで `enableScroll` 変数を宣言し、false で初期化する。
```lua
enableScroll = false
```
そして、onPoseEdge に握り拳が握られると enableScroll を true に、戻ると false にするコードを書く。
```lua
function onPoseEdge(pose, edge)
if pose == 'fist' and edge == 'on' then
enableScroll = true
elseif pose == 'fist' and edge == 'off' then
enableScroll = false
end
end
```
最後に onPeriodic で手首の角度を取得してキーボードの ↑ か ↓ を連打するコードを書く。
```lua
function onPeriodic()
if enableScroll then
roll = myo.getRoll()
key = ''
if roll < -0.05 then
key = 'up_arrow'
elseif roll > 0.05 then
key = 'down_arrow'
end
if key ~= '' then
myo.keyboard(key, 'press')
end
end
end
```
実際にこのスクリプトを動かしてみると上手くスクロールしない。myo.getRoll()で取得した角度は絶対的な角度だからだ。握り拳が作られた瞬間の角度を 0 として扱った方がプログラムの見通しも良くなる。
そこで新たに initRoll 変数をグローバルで宣言する。そして onPoseEdge を以下のように修正する。
```lua
function onPoseEdge(pose, edge)
if pose == 'fist' and edge == 'on' then
initRoll = myo.getRoll()
enableScroll = true
elseif pose == 'fist' and edge == 'off' then
enableScroll = false
end
end
```
続けて onPeriodic の
```lua
roll = myo.getRoll()
```
を、
```lua
roll = myo.getRoll() - initRoll
```
に修正する。
これで、絶対角度を握り拳が握られた瞬間の手首の角度を 0 とする相対角度を取得出来る。
実際に動くスクリプトを Github で[公開している](https://github.com/uetchy/myo-scripts)。
### 番外編
Myo C++ SDK を使ってアイアンマンみたいなジェスチャーでレーザーガンを撃った気分になれるアプリを作った。
[uetchy/myo-gun](https://github.com/uetchy/myo-gun)