OmniAICreator/Qiita-1.07M huggingface dataset:
Calabash-Androidのテストの書き方まとめ

Calabashのテストの書き方についてテストの書き方についてあまり記事がなかったのでまとめてみる
https://github.com/calabash/calabash-android

# Calabashのセットアップ
ココらへんみたらだいたいわかる
http://toshihirock.blogspot.jp/2014/03/calabash-androidandroid.html
http://www.slideshare.net/chariderpato/calabashbdd

### 実行
http://stackoverflow.com/questions/13307640/calabash-android-no-test-server-found-and-could-not-sign-test-server

.setting_calabashが必要な時・いらない時→デバッグビルドの時はいらない、間違えて作った時は消すとOK
http://www.atmarkit.co.jp/ait/articles/1412/16/news043_3.html

* 既に入っているアプリはアンインストールされて新しいAPKがインストールされる→初期起動扱い


# テストの書き方
### featureファイルの役割
デフォルトで作られるmy_first.featureがどういう役割なのかを探ってみる

#### Featureごとに新しいアプリをインストール
* featureファイルの実行ごとに既存のアプリをアンインストールし、新しいアプリがインストールされる
* featureファイルの中には1つのFeatureの宣言しかできない

これはだめ！怒られる

```my_feature.feature
 Feature: 起動1

   Scenario: hogeを選択
     Then I see "hoge選択"
     Then I press view with id "button_id1"

 Feature: 起動2

   Scenario: hugaを選択
     Then I see "huga選択"
     Then I press view with id "button_id2"


```

正しくはこう

```my_feature.feature
 Feature: 起動1

   Scenario: hogeを選択
     Then I see "hoge選択"
     Then I press view with id "button_id1"
```


#### Scenarioレベルは同じアプリを使用してアプリを起動
同じfeatureファイルの中でのシナリオは同じアプリが使用されるが、シナリオレベルではアプリは終了状態からスタートする

```my_feature.feature
 Feature: 起動1

   Scenario: hogeを選択
     Then I see "hoge選択"
     Then I press view with id "button_id1"

  Scenario: hugaを選択
     Then I see "huga選択"
     Then I press view with id "button_id2"


```


#### 同じふるまいをstepにまとめる

step_definitions/calabash_steps.rbを修正すると、いくつかのふるまいをまとめてメソッドのように管理できる

```calabash_steps.rb
 require 'calabash-android/calabash_steps'

 Then /^gotoSearchTopKanto$/ do
         step %{I see "hoge選択"}
         step %{I press view with id "button_id1"}
 end
```

stepのファイルを複数に分けることも可能そう

```myfirst_steps.rb
 require 'calabash-android/calabash_steps'

//以下にstepsを書いていく
```

step用のコードはここから参考にする
https://github.com/calabash/calabash-android/blob/master/ruby-gem/lib/calabash-android/canned_steps.md
MAC SierraでASP.NET ＆ Hello World!

MacでASP.NETを頑張ってみた記録。

## ざっとインストール手順

1. [.NET Coreのインストール](https://www.microsoft.com/net/core#macos)
1. .NET Version Manager (DNVM) & monoのインストール
1. [Visual Studio Code（エディタです、IDEとしても、.NETやるなら入れましょう）
](https://code.visualstudio.com/Download)


## .NET Core でHelloWorld

現時点(2016-10-17)で、opensslは、brew側にはリンクされないという・・・本筋とは関係無いところでハマりました (；´Д｀)

#### １. opensslを最新にする

```
$ brew update
$ brew install openssl <-- 新規でbrewインストールの場合
$ brew upgrade openssl <-- アップデートの場合

この時点で、以下の２つのopensslを確認
$ where openssl
/usr/local/opt/openssl/bin/openssl　<--これがBrewでInstallしたもの `OpenSSL 1.0.2j`
/usr/bin/openssl <-- こちらはMac初期から入っていた物
```

.NET Coreで利用されるため、HomeBrewでインストールしたOpenSSLのライブラリにシンボリックリンクを張ります。

```
$ ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/
$ ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/
```

#### 2. opensslが整ったところで、.NET Coreのインストール

以下よりダウンロードしてインストール
[.NET Core](https://www.microsoft.com/net/core#macos)

インストール後は、パスを設定

.zshrc or bash_profileなどに、先ほどのOpenSSLのパスと一緒にいれておきましょう。
```
export PATH="/usr/local/share/dotnet:/usr/local/opt/openssl/bin:$PATH"
```

#### 3. 軽く遊んでみる

```
$ mkdir hwapp
$ cd hwapp
$ dotnet new
```

この時点で、以下のファイルが生成される。

```
$ ls
Program.cs* project.json*
```

Program.csはこんな感じ。要するに「世界の皆さんこんにちは！」ってやつ。

``` Program.cs
using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}
```

コンパイル＆実行

```
$ dotnet restore
$ dotnet run
Project webapp (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling webapp for .NETCoreApp,Version=v1.0

Compilation succeeded.
    0 Warning(s)
    0 Error(s)

Time elapsed 00:00:02.5733314

Hello World!
```

ここまでは、まあ *.NET Core* が切り出された事で、ＭａｃでもＬｉｎｕｘでも、コンパイルと実行が出来るよって話ですね。
.NET frameworkの中心部を切り離すことで、世界を広げたって感じですかね〜


## Install .NET Version Manager (DNVM) & mono

これを入れることで、Visual Studio Codeが.NETのIDEとして、宜しく動いてくれる様になるかもねってやつ？
スミマセン、位置づけがまだ欲判ってないｗ

パッケージとコマンドラインからのインストールがあるけど、
どうやらCLIからのインストールの方がバージョンが新しい ＆ 気分的にCLIな感じなので以下の通り。

```
$ curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
$ dnvm upgrade -r coreclr
$ dnvm upgrade -r mono

# こんな感じでリストアップされればOK
$ dnvm list

Active Version              Runtime Architecture OperatingSystem Alias
------ -------              ------- ------------ --------------- -----
       1.0.0-rc1-update2    coreclr x64          darwin
  *    1.0.0-rc1-update2    mono                 linux/osx       default
```


## Install Visual Studio Code

#### 1. 以下から、Mac版をダウンロードしてインストール

##### [Download Visual Studio Code - Mac, Linux, Windows](https://code.visualstudio.com/Download)


#### ２. アプリを起動して、C#をインストールします。

![161018-0001.png](https://qiita-image-store.s3.amazonaws.com/0/46529/85d0e8f8-fee4-37f9-9dae-22f8ee4d14b5.png)


## 続く。。。

ちょっと長くなるので、続きはこちら！
[MAC SierraでASP.NET その２ ~始めてのWEBアプリ~ - Qiita](http://qiita.com/madaran0805/items/83bc868b30d2ccc948f5)
WordPress の面倒くさいページネーションの動作テスト

WordPress をインストールしたてだと投稿が一個しかなくて、ページネーションの動作テストが面倒くさい。
わざわざいっぱい投稿して記事数を増やすのも面倒くさい。
[Duplicate Post](https://wordpress.org/plugins/duplicate-post/) をインストールしてコピーして記事数を増やすのも面倒くさい。

そんなあなたに functions.php 等に以下を追加すれば一気に解決！

```php:functions.php
// 投稿が一個しかないのでページ送りした際にエラーになるのを回避
add_action( 'pre_get_posts', 'pager_many_many_tester_offset' );
function pager_many_many_tester_offset( $query ) {
	if ( ! is_admin() && $query->is_main_query() ) {
		$query->set( 'offset', 0 );
	}
	return $query;
}

// 投稿を9999にする
add_filter( 'found_posts', 'pager_many_many_tester_found_posts' );
function pager_many_many_tester_found_posts( $found_posts ) {
	$found_posts = 9999;
	return $found_posts;
}
```
こうすれば、[WP-PageNavi](https://wordpress.org/plugins/wp-pagenavi/)でも
<img width="724" alt="スクリーンショット 2016-10-17 19.16.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/72931/6823d816-78a3-b962-387e-ca393885d4bb.png">
[paginate_links](https://codex.wordpress.org/Function_Reference/paginate_links) を使ったページネーションでも
<img width="173" alt="スクリーンショット 2016-10-17 19.16.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/72931/f4ad5dd6-30a3-58e5-f4b4-b5fcd7bb6e06.png">
簡単にテストする事ができます。

以上、良いページネーションライフを。
tgif で描いた図に日本語を追加し、tex で読み込むときに余白を取り除く方法


## モチベーション
かつては tgif で日本語入力するための環境が MacPorts で簡単に構築できたのですが、MacOS のバージョンが上がるたびに、使えなくなったり、新しい方法が出てきたりします。
その度に使えるか検証しなければならず、時間がかかります。
そこで、なるべく環境に依存しない形で

- tgif や xcircuit で図を描く
- それらで描いた図に日本語を追加する
- 図に空白がある場合はトリミングする（取り除く）
- その図を tex で読み込む

ことを実現します。

2016年12月21日追記
もう少し簡単にできることが分かったので修正しました。

## 日本語を追加

- tgif や xcircuit で描いた図を keynote で取り込みます。
- 必要な箇所に日本語を追加します。

## PS ファイル作成

- keynote の「プリント」で「PDF」タブから「PostScript として保存」を選択
- file_name.ps を作成

## PS -> EPS ファイルへの変換

```
% ps2eps file_name.ps
```

これで bounding box が作成され余計な空白が除去されます。
ps2eps コマンドがない場合は、MacPorts などでインストールする。

2016年12月21日追記
ここでできた EPS ファイルが TeX で読み込める！
但し、必要に応じて
\includegraphics[angle=270, width=0.5\textwidth,clip]{file_name.eps}
とオプションに angle=270 を追加して、図を回転させる必要がある。

ここの段階で EPS ファイルを取り込めるので、以下の作業は必要ない。

## EPS -> PDF ファイルへの変換

```
% ps2pdf -dPDFSETTINGS=/prepress -dEPSCrop file_name.eps
```

これで PDF ファイル（file_name.pdf）が作成される
ただ、ここで作成されたファイルは Tex で読み込まれない。
私の環境だけ？
ps2pdf がない場合は MacPorts などでインストールする。


## PDF ファイルをもう一度変換

Mac の「プレビュー」で file_name.pdf を読み込む。
必要に応じて回転させて向きを変える。
その後、保存する

これで、Tex で読み込める PDF ファイルが作成される！！


## PDF から余計は空白を取り除く（トリミングする）もう一つの方法（あまりお勧めではない）

以下の方法は、PDF を画像で作成するらしく解像度が著しく低下するのでお勧めはしないが、簡単に PDF から余計な空白をとりのぞける。

- keynote で日本語入力するところまでは同じ
- keynote で全てを選択して、コピー
- プレビューを起動して、「クリップボードから新規作成」

これで、余白のない PDF を作成可能
imgタグのsrcにbase64の画像を使う（hamlでのサンプル付き）


base64にエンコードしたデータをDBに持たせると、画像の管理がすこぶる楽ちんになるので好きです。

そんなやり方は邪道だ！というご意見ご感想もお待ちしております。

## 記法

```haml
hoge.each do |item|
	%img{:src => "data:image/png;base64,#{item.image}",:alt => "icon"}/
end
```

## そもそも画像をどこで管理するか問題
皆さんお気づきかと思いますが、上記のコードは、`item.image`にbase64でエンコードしたデータを格納している想定で書いています（要は画像データをDBに持たせている）。

んで、画像はバイナリじゃなくて画像置き場（image配下とかS3とか）に持たせるべきだろ！という意見があると思います。僕もそう思います。でも何でもかんでもその思想に則る必要はなくて、DB管理の方が何かと都合がいい場合も多いですよね。

僕は以下の場合、DBで管理しても良いのではないかと思っています。

- 画像の容量をアプリ側でコントロール出来る(小さめの画像、etc：アイコン)
- 定常的に登録されるような画像ではない(ユーザー毎、マスターデータ毎)

逆に、以下のようなパターンは、ストレージで保管すべきだと思います。

- 画像の容量をアプリ側でコントロール出来ない(大きい画像、etc：写真)
- 定常的に画像が投稿される(画像投稿サイト、ブログ)

DB管理だと、ActiveRecordの恩恵にも授かれるし、何より管理者が管理しやすいことが利点としてあげられます。なので、こういうケースにおいては積極的にbase64でエンコードしたデータをblob型のカラムにぶん投げるやり方でもいいんじゃないでしょうか。

## おまけ：画像データをbase64にエンコードする方法
WEBツールでもchromeでも出来ますが、コマンドラインでも一発で出来ます。

```
$ base64 hoge.png
```
チーム内のナレッジ共有が可能な「Boostnote」チーム版

![Boostnote_Team_🔊.png](https://qiita-image-store.s3.amazonaws.com/0/34809/ea4fb730-5d96-13bb-3c28-b23a031b58c5.png)

プログラマ向けノートアプリの「Boostnote」がチーム版の先行登録を開始しました。

https://b00st.io/team/


※以前書いた記事（Boostnoteについてはこちらを参照下さい）：
[”150種類以上のシンタックスに対応した「Boostnote」がアップデートでどんどんいい感じに”](http://qiita.com/naitwo2/items/f4f716330de766ded795"150種類以上のシンタックスに対応した「Boostnote」がアップデートでどんどんいい感じに")

# チームの機能

チーム内でナレッジ、スニペットが簡単に共有できるようです。

>自身のBoostnoteの中身をワンタッチで共有することができる為、マークダウンで書いたナレッジやちょっとしたスニペ ットを、気軽に共有することが可能です。

現バージョンも共有用URLを発行して、URLを知っている人であれば投稿内容を見れますが、チームバージョンではその共有範囲が同じチーム内に限定されると思われます。

# Boostnoteで共有する意味

一般的なナレッジ共有サービスは、自分がためているナレッジ・スニペットを専用のナレッジサービスに能動的に投稿する必要がありました。

※例えば、社内で独自にナレッジサービスがあれば、自分のローカルにメモとして貯めているナレッジ・スニペットを、内容をコピー（整形する場合もあるかもしれません）して社内ナレッジサービスに投稿するという手間が発生します

普段ナレッジ・スニペットを貯めているBoostnote内でそのまま簡単に共有可能になれば、再投稿で生じる障壁が減り、共有が活性化される気がします。


# 先行登録

一般公開は今年の冬を予定しているそうですが、事前登録で先行して使うことができます。
※随時招待されるとのこと

https://b00st.io/team/



オープンソースということで、様々なアイディアや要望が国内外問わずにフィードバックされているようです。
リリースのスピードもかなり早いです。
今後にますます期待できます。

チーム内でナレッジの共有を検討している人は、先行登録してはいかがでしょう。
infinidbでエラーがでて起動できなくなった場合，全台再起動すると治るかも．

- 症状としては多対多のデータを含むテーブルをjoinしてメモリーを使い果たしてシステムが落ちた．
- エラーメッセージは

```
Jan  7 16:01:14 sphynx PrimProc[16613]: 14.857119 |0|0|0| C 28 CAL0045: FATAL ERROR: PrimProc has allocated too much memory! PrimProc is restarting.
``` 
な感じ

- oam server上でinfinidb を再起動させたり， ccでrestartSystemしても正常に起動しない．．．


でやることは，

- 手動で，全台のinfinidbを手動で再起動する．

```start_idbs.sh
#!/bin/sh                                                                                                                                                      
ids=(-master 01 03 04 05 06 07 08 09 10)
for id in ${ids[@]} ; do
    host=worker_${id}
    echo $host
    ssh $host "sudo /etc/init.d/infinidb restart"
done
```
みたいscriptで全台再起動．これで復旧できた．
Webを支える技術

# Webを支える技術

## 本書を読んだ目的

業務でPUTメソッドについて調べていて、ググっただけでは納得できる情報がなかったので
本書を購入し読みました。

ですので、知りたかった情報を中心に記載しようと思います。

## 冒頭の良い言葉

冒頭に良いこと書いてます。

> シンプルさは究極の洗練である。
> ----- Leonardo da Vinci

Webの特徴を一言で言い表すならば、シンプルさに尽きる

## 第１部 Web概論

### Webを支える技術はHTTP、URI、HTML

![HTTP-URI-HTML.png](https://qiita-image-store.s3.amazonaws.com/0/1762/a4a0650a-1cce-d8da-0558-78b70640fafe.png)

### REST

#### アーキテクチャスタイル

### スタイルに合わせてRESTを構成する

| スタイル | 説明 |
|:-----------|:------------|
| クライアント / サーバ | ユーザインタフェースと処理を分離する     |
| ステートレスサーバ    | サーバ側でアプリケーション状態を持たない  |
| キャッシュ           | クライアントとサーバの通信回数と量を減らす |
| 統一インターフェース  | インタフェースを固定する  |
| 階層化システム       | システムを階層に分離する  |
| コードオンデマンド    | プログラムをクライアントにダウンロードして 実行する |

## 第２部 URI

```
http://blog.example.jp/entries/1
```

| 項目 | 内容 |
|:-----------|:------------|
| URI | http  |
| スキーム | blog.example.jp |
| パス | /entries/1 |

```
http://blog.example.jp:8000/search?q=test&debug=true#n10
```

| 項目 | 内容 |
|:-----------|:------------|
| URIスキーム | http |
| ユーザー情報 | yohei:pass |
| ホスト名 | blog.example.jp |
| ポート番号 | 8000 |
| パス | /search |
| クエリパラメータ | q=test&debug=true |
| URIフラグメント | #n10 |

## 第３部 HTTP
HTTPはTCP/IPをベースとしたプロトコル
RFC2616

### HTTP 基本

| 階層 | プロトコル |
|:-----------|:------------|
| アプリケーション層  | HTTP、NTP、SSH、SMTP、DNS |
| トランスポート層 |  UDP、TCP |
| インターネット層 |  IP |
| ネットワークインタフェース層 | イーサネット  |

### HTTPメソッド

| メソッド | 意味 |
|:-----------|:------------|
| GET | リソース取得 |
| POST  | 子リソース作成、リソースへのデータの追加、そのほかの処理 |
| PUT  | リソース更新、リソース作成 |
| DELETE  | リソースの削除 |
| HEAD | リソースのヘッダ(メタデータ)の取得 |
| OPTIONS | リソースがサポートしているメソッドの取得 |
| TRACE | 自分宛にリクエストメッセージを返す(ループバック)試験 |
| CONNECT | プロキシ動作のトンネル接続への変更 |s

#### CRUD

GET、POST、PUT、DELETEでCRUD


| CRUD名     | 意味         | メソッド |
|:-----------|:------------:|:------------:|
| Create | 作成 | POST/PUT |
| Read | 読み込み | GET |
| Update | 更新 | PUT |
| Delete | 削除 | DELETE |

#### PUT

リソースの更新

リソースの作成

##### POSTとPUTの使い分け

複数のリソースを作成する場合はPOST、１つのリソースを作成する場合はPUTっていう覚え方してます。

## 第４部 ハイパーメディアフォーマット

## 第５部 Webサービスの設計


## 調査結果

Ajaxの通信際にPUTメソッドを使っていて、PUTメソッドは脆弱性があるから、POSTに実装し直してくださいってことで
この本でHTTPメソッドのことを勉強しました。

でも、原因はHTTPではなく、WebDAV経由で外部からアクセスされた際にHTTPから継承しているPUTメソッドを使って
リソースの更新を行い、OSを乗っ取られる可能性があるとかないとかっていう脆弱性らしく・・・
[wayland] wayland-scannerを使用してwaylandのプロトコルをXMLから生成する

waylandのプロトコルの生成方法のメモ

# 概要
`wayland` では `wayland-scanner` というツールを使用して、XML からプロトコルを生成します。
例として、 `wayland` のデフォルトのプロトコル定義ファイルである `wayland.xml` では以下のように実行できます。
[wayland/wayland.xml at master · wayland-project/wayland](https://github.com/wayland-project/wayland/blob/master/protocol/wayland.xml)

```console:wayland.xmlでの例
$ wayland-scanner code < wayland.xml > wayland-protocol.c
$ wayland-scanner server-header < wayland.xml > wayland-server-protocol.h
$ wayland-scanner client-header < wayland.xml > wayland-client-protocol.h
```

`<`, `>` に関しては、 `wayland-scanner` 独自の実装というわけではなく
shellコマンドの文法での `<`(XMLを標準入力), `>`(標準出力のリダイレクトでファイルを作成)を行っているだけです。

# ３種類のオプションと出力されるファイルについて

上記のように、現在のwaylandでは１つのプロトコル定義ファイル(XML)から三種類のファイルを生成します。
指定できるオプションは以下の３つになります。

+ code
+ server-header
+ client-header

## code
`code` は `*.c` を出力し、`server`, `client` 双方で利用されます。
使用方法としては、クライアントもしくはサーバーのビルド時に一緒にビルドするか、ライブラリ化してリンクするかのどちらかになります。

## server-header
`server-header` は `weston` などのサーバー側が使用する定義がされたヘッダを出力します。
クライアントアプリを作成する場合は基本的には関係ありません。

## client-header
`client-header` は、waylandを使用するクライアントアプリを実装する際の定義がされているヘッダを出力します。

# 出力ファイルの命名規則について
上記の３つのオプションで出力するファイルについて、ファイル名については明確な規定はない認識ですが、`wayland`コミュニティの慣習として以下のように定義されることが多いようです。

```console:プロトコルの命名慣習
$ wayland-scanner code < ${PROTOCOLNAME}.xml > ${PROTOCOLNAME}-protocol.c
$ wayland-scanner server-header < ${PROTOCOLNAME}.xml > ${PROTOCOLNAME}-server-protocol.h
$ wayland-scanner client-header < ${PROTOCOLNAME}.xml > ${PROTOCOLNAME}-client-protocol.h
```

特にほかに規定がなければ、上記のように命名するのが無難かと思われます。

# 出力用シェルスクリプトサンプル
いちいち手で打つのはめんどうなため、スクリプトを作りました。

[wayland-scanner genarate script](https://gist.github.com/koara-local/6387a4e2a827286ea4691bd073516c89)

```bash:wayland-scanner-output.sh
#!/bin/bash -eu

# The MIT License (MIT)
# Copyright (c) 2016 Kohei Arao
# https://opensource.org/licenses/MIT

FILEPATH=$1

# validate
FILENAME=$(basename ${FILEPATH})
EXTENSION=${FILENAME##*.}
PROTOCOLNAME=${FILENAME%.*}

echo "FILENAME=${FILENAME}"
echo "EXTENSION=${EXTENSION}"
echo "PROTOCOLNAME=${PROTOCOLNAME}"

if [[ EXTENSION == "xml" ]] || [[ 0 == $(cat ${FILEPATH} | grep "<protocol name=\"${PROTOCOLNAME//-/_}\">" | wc -l) ]];
then
	echo "validate error!"
	exit 1
fi

wayland-scanner code < ${FILEPATH} > ${PROTOCOLNAME}-protocol.c
wayland-scanner server-header < ${FILEPATH} > ${PROTOCOLNAME}-server-protocol.h
wayland-scanner client-header < ${FILEPATH} > ${PROTOCOLNAME}-client-protocol.h
```

```console:使用例
$ ./wayland-scanner-output.sh wayland.xml
```

# 参考
## 公式
[Wayland](https://wayland.freedesktop.org/)

## Github(Mirror)
[Wayland](https://github.com/wayland-project)
[wayland-project/wayland: Core Wayland protocol and libraries](https://github.com/wayland-project/wayland)
[wayland-project/weston: Reference compositor for Wayland (mirror)](https://github.com/wayland-project/weston)
jsで指定の位置にページ内スクロール

ページ内スクロールを実現させる方法で、
divタグの出てくる順番でやるなら、

```app.html
  <div class="question" v-on:click="scrollAnswer(0)"></div> <!-- aへ遷移 -->
  <div class="question" v-on:click="scrollAnswer(1)"></div> <!-- bへ遷移 -->
  <div class="question" v-on:click="scrollAnswer(2)"></div> <!-- cへ遷移 -->
  <div class="question" v-on:click="scrollAnswer(3)"></div> <!-- dへ遷移 -->

  <div class="answer">a</div>
  <div class="answer">b</div>
  <div class="answer">c</div>
  <div class="answer">d</div>
```

```app.coffee
  scrollAnswer: (index) ->
    position = $('.answer').eq(index).offset().top()
    $('html,body').animate({ scrollTop: position - 100 }, 'slow')
    return false

```
こんな感じで、divの順番で遷移できる。
（今回はVue.js使ってます。）

ただ、ユーザーごとに表示項目を変えたいってなった場合に、対応出来ない上に、
順番だと後から追加・削除する際にメンテナンス性が悪い。

なので、以下のように変更。

```app.html
  <div class="question" v-on:click="scrollAnswer('.class-a')"></div> <!-- aへ遷移 -->
  <div class="question" v-on:click="scrollAnswer('.class-b')"></div> <!-- bへ遷移 -->
  <div class="question" v-on:click="scrollAnswer('.class-c')"></div> <!-- cへ遷移 -->
  <div class="question" v-on:click="scrollAnswer('.class-d')"></div> <!-- dへ遷移 -->

  <div class="answer class-a">a</div>
  <div class="answer class-b">b</div>
  <div class="answer class-c">c</div>
  <div class="answer class-d">d</div>
```

```app.coffee
  scrollAnswer: (tag) ->
    position = $(tag).offset().top()
    $('html,body').animate({ scrollTop: position - 100 }, 'slow')
    return false

```

こうすることで、ユーザーごとの表示項目変更にも対応し、
後から追加・削除したり、順番入れ替えたりしてもhtml側の修正のみで対応できる。
iOS10でPush通知を受け取るとどうなるの？こうなるよ

## アプリを起動してない状態からPush通知から起動

UNUserNotificationCenterDelegateの

```swift
userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void)
```

を実装している場合は上記が呼ばれ、実装していない場合は

AppDelegateの

```swift
application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject])
```

が呼ばれる

## アプリ起動中にPushを受け取った場合

UNUserNotificationCenterDelegateの

```swift
userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void)
```

を実装している場合は上記が呼ばれ、実装していない場合は

AppDelegateの

```swift
application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)
```

が呼ばれる
TerminalでカレントディレクトリをFinderで開く

#MacのTerminalでカレントディレクトリをFinderで開く方法


`open`コマンドを使います。
ピリオド`.`はカレントディレクトリを表すので、

```
open .
```

とすればカレントディレクトリがFinderで開かれます。
ちなみに2つのピリオド`..`は一つ上のディレクトリ（親ディレクトリ）を表すので、

```
open ..
```

とすれば、親ディレクトリをFinderで開くことができます。

#Windowsのコマンドプロンプトでカレントフォルダをエクスプローラで開く方法


`start`コマンドを使います。
ピリオド`.`はカレントディレクトリを表すので、

```
start .
```

とすればカレントフォルダがエクスプローラで開かれます。
ちなみに2つのピリオド`..`は一つ上のディレクトリ（親ディレクトリ）を表すので、

```
start ..
```

とすれば、親フォルダをエクスプローラで開くことができます。
続2：RTX1200を買った話

#速度測定
[Radish Network Speed Testingtitle](http://netspeed.studio-radish.com/)を使用しインターネットとの速度測定をしました
 Ver.5.1 βのJavaScript版を使用しました

#実測
##条件
回線:NTT東 フレッツ 光ネクスト ギガマンション・スマートタイプ 光配線方式
ISP:OCN
測定地: 東京都某所
PC
OS:Windows10 Pro 14393.321
CPU:Core i7 2600k
RAM:16GB
NIC:Intel® 82579V Gigabit Ethernet
ケーブル:Cat5e自作

 精度: 高 接続数: 1-16 RTT測定: 速度測定前後/速度測定中
 データタイプ: 圧縮可能性低 測定クライアント: JavaScript

測定回数はそれぞれ3回の平均値
PPPoE直、BUFFALO WZR-300HP,RTX1200(ファストパスon/off)で測定してます
時間は平日昼間に測定してます

##測定結果
###PPPoE直
下り:438.73 Mbps
上り:350.00 Mbps
###BUFFALO WZR-300HP
下り:95.78 Mbps
上り:82.19 Mbps
###RTX1200(ファストパスオフ)
下り:50.63 Mbps
上り:74.41 Mbps
###RTX1200(ファストパスオン)
下り:469.97 Mbps
上り:472.27 Mbps

#結論
業務用ルーターやべぇ
PPPoE直結より速度が出てる感じがします
VLAN切れたりと中古でこの価格は安い
ZFSでのスナップショット基本

# **はじめに**
ZFSでのスナップショット機能の基本的な使い方について記載します。

# **概要**
- スナップショットの作成
- スナップショットの確認
- スナップショットへのロールバック
- スナップショットの削除

# **スナップショットの作成**
## **事前確認**
### スナップショットを取りたい領域の確認
※今回は`vol001/test3`の領域のスナップショットを取得する

```shell-session
root@solaris:~# zfs list
NAME                               USED  AVAIL  REFER  MOUNTPOINT
vol001                            58.9T  11.7T   141K  /vol001
vol001/test1                      9.06G  11.7T  9.06G  /vol001/test1
vol001/test2                      80.0K  11.7T  80.0K  /vol001/test2
vol001/test3                      49.2G  11.7T  49.2G  /vol001/test3
```

## **スナップショットの作成**
```shell-session
root@solaris:~# zfs snapshot vol001/test3@20161017
```

# **スナップショットの確認**
```shell-session
root@solaris:~# zfs list -t snapshot
AME                                                 USED  AVAIL  REFER  MOUNTPOINT
vol001/test3@20161017                                  0      -  3.43G  -
```

# **スナップショットへのロールバック**
```shell-session
root@solaris:~# zfs rollback vol001/test3@20161017
```

# **スナップショットの削除**
```shell-session
root@solaris:~# zfs destroy vol001/test3@20161017
```
特定のビットを指定のビットへコピーする

最近C言語のプロジェクトを行うことになったのでリハビリも兼ねてビット演算を書いてみた。
同じ変数の特定ビットから指定したビットへコピーする関数。

追記：baseの内容も書き換えていたので修正。

```c:ソース
unsigned char copyBit( unsigned char base, unsigned char x_bit, unsigned char y_bit )
{
	unsigned char ret = 0;

	/* ビットチェック(Xビット位置のビットが1か判定) */
	if( ( ( base >> ( x_bit - 1 ) ) & 1 ) )
	{
		/* Yビット位置のビットを1に設定 */
		ret = ( base | ( 1 << ( y_bit - 1 ) ) );
	}
	else
	{
		/* Yビット位置のビットを0に設定 */
		ret = ( base & ~ ( 1 << ( y_bit - 1 ) ) );
	}
	return ret;
}
```

第１引数に元となる変数を指定、第２引数にコピー元ビット位置、
第３引数にコピー先ビット位置を指定する。
ビット位置は1始まりで指定する（0ビット目という指定ではない）。

```c:使い方
unsigned char bit = 0x01;
bit = copyBit( bit, 1, 5 );
```

copyBit()を使った時の例。

[例1] 1ビットから5ビットへコピーする
base = 0000 0001(2進数), x_bit = 1, y_bit = 5
返却 = 0001 0001(2進数)

[例2] 1ビットから5ビットへコピーする
base = 0001 0001(2進数), x_bit = 1, y_bit = 5
返却 = 0001 0001(2進数)

[例3] 1ビットから5ビットへコピーする
base = 0000 0000(2進数), x_bit = 1, y_bit = 5
返却 = 0000 0000(2進数)

[例4] 1ビットから5ビットへコピーする
base = 0001 0000(2進数), x_bit = 1, y_bit = 5
返却 = 0000 0000(2進数)

[例5] 8ビットから3ビットへコピーする
base = 1000 0000(2進数), x_bit = 8, y_bit = 3
返却 = 1000 0100(2進数)

[例6] 0ビットから4ビットへコピーする
<<禁止>>
base = 1111 1111(2進数), x_bit = 0, y_bit = 4
返却 = 1111 0111(2進数)

[例7] 9ビットから6ビットへコピーする
<<禁止>>
base = 1111 1111(2進数), x_bit = 9, y_bit = 6
返却 = 1101 1111(2進数)
超簡単メモ： 超簡単 Mac OS X で素早く ZIP にパスワードを付ける方法 (Terminalで)


自分が、いつも忘れてしまうので、メモです。

Mac OS のターミナルでパスワード付き ZIP ファイルを作る方法です。

## ZIP ファイルを用意

普通に ZIP ファイルを用意しましょう。

## Terminal もしくは iTerm など 互換性のあるソフトを起動

Mac のターミナルや iTerm などのシェルを実行できるソフトを起動しましょう。

## zipcloak コマンドを使う

zipcloak コマンドを使って、パスワードを付与します。

- `zipcloak [パスワードを付けたい ZIP ファイル]`
- [パスワードを付けたい ZIP ファイル] は、Finder から、ファイルをそのまま Terminal に Dorag & Drop すると、ファイルパスを入れてくれるので便利
- パスワードを入れる
- 確認用にもう一度、パスワードを入れる

## 完成

これで、パスワード付きの ZIP ファイルになりました。
IntellijIDEA ＋ cocos2d-x(JS)

# IntellijIDEAでcocos2d-x(js)を使いたい

[cocos2d-x(js)の開発環境](http://qiita.com/erisa_studiop2/items/eedae287b237b892711a)でcocos2d-x(js)を開発できるようになりました。

でも、できたらIntellijIDEAで使いたいと思います。

## 使えたには使えたけど？
結論からいうと、よくわからなかったです(^^;
一応、IntellijIDEAでcocos2d-xを書くことは出来るし、リビルドとかわりと簡単ですが、これが正しい使い方なのかどうか不明です。
ちなみに、cocos2d-x + intellijで検索するとよく出てくるのが、

http://discuss.cocos2d-x.org/t/cocos-code-ide-v2-intellij-idea-set-up-solved/22196

これなのですが、CocosCodeIDE自体が、今はないので、これと同じことができません＞＜

## とりあえず
1. cocos2d-xのプロジェクトをつくる  
```
cocos new {プロジェクト名} -l js
```  
で新規のプロジェクトを作ります。
2. intellijIDEAで、上記プロジェクトをopenします。
3. index.htmlを右クリックして、「Open in Browser」で確認。  
<img src="https://qiita-image-store.s3.amazonaws.com/0/56195/fd07e89c-684e-6be4-7185-4fbda9893b07.png" width="306" height="400">  
5. ブラウザを開いたままリビルドするには、
「Build」→ 「rebuild Project」で出来る。  
![cap2.png](https://qiita-image-store.s3.amazonaws.com/0/56195/3392d6a2-105e-43e5-115f-ed9c748ab0a8.png)  

## だれかもうちょっと効率的なやり方を教えてください。
一応、使えることは使えるけど、なんかこれなら、intellijIDEAを使う意味があまりないような？
正しい使い方を教えていただければ幸いです。
phpやってた人が javascript 多次連想配列をループする 値を取得する

以下の多次連想配列があったとして

    var fruits = {
       Apple:{color:red, shape:round},
       Grape:{color:purple, shape:grain},
       Peach:{color:pink, shape:heart}
       };

ループして取得する

    for(var key in fruits){
    var value = fruits[key];
    console.log("フルーツの種類:" + key); //出力:連想配列fruitsのキーAppleなど

       for(var key2 in value){
       var value2 = value[key2];
       }

       console.log("色は" + value.color); //連想配列valueのキーcolorの値
       console.log("形は" + value.shape); //連想配列valueのキーshapeの値
    }

```:出力
フルーツの種類:Apple
色はred
形はround
フルーツの種類:Grape
色はpurple
形はgrain
フルーツの種類:Peach
色はpink
形はheart
```

って地道にやってしまったのだが､スマートにやるには

ループして取得する

    for(var key in fruits){
    console.log("フルーツの種類:" + key); 
    console.log("色は" + fruits[key].color); 
    console.log("形は" + fruits[key].shape); 
    }
だけでよかったという､､
Mac / Linux CentOS 6系　何故か絶対忘れるエラーログ等の場所

**【なぜ】**
何故こんなに使用頻度が高いのにファイルの場所を忘れるのでしょうか

わからないですね。

ということでスプレッドシートに保存していた自分用の場所一覧ですが放出します。
役に立てば幸いです。

**【場所】**
>Linuxアパッチエラーログ場所
`/etc/httpd/logs/`


>Linuxアパッチコンフファイルの場所
`/etc/httpd/conf`

>Linuxアパッチコンフファイルの場所	
`/etc/httpd24/conf`

>hostsファイル
`/etc/hosts`

>Mac アパッチ アクセス・エラーログファイルの場所
`cd /private/var/log/apache2/`

>Mac アパッチエラーログ閲覧　shift+Gで最終行まで移動
`less /private/var/log/apache2/error_log`

>MAC httpd.confファイル編集
`vim /etc/apache2/httpd.conf`

>MAC バーチャルホスト編集
`vim /etc/apache2/extra/httpd-vhosts.conf`
	
>phpmyadminこんふ
`/etc/httpd/conf.d/`

>phpmyadminドキュメントルート
`/usr/share/phpmyadmin`



**テック系イベント情報など掲載しております。**
**[nest++](http://nestplus2.com/)**
.ssh/configもDRYで書きたい

# 結論

これが

```
Host hoge-humidai
  HostName hoge.com
  User hoge
  port 10022

Host hoge-a
  HostName 10.15.0.10
  User hoge
  IdentityFile ~/.ssh/hoge-a
  ProxyCommand ssh -W %h:%p hoge-humidai

Host hoge-b
  HostName 10.15.0.20
  User hoge
  IdentityFile ~/.ssh/hoge-b
  ProxyCommand ssh -W %h:%p hoge-humidai

Host hoge-c-1
  HostName 10.15.0.30
  User hoge
  IdentityFile ~/.ssh/hoge-c
  ProxyCommand ssh -W %h:%p hoge-humidai

Host hoge-c-2
  HostName 10.15.0.40
  User hoge
  ProxyCommand ssh -W %h:%p hoge-humidai

Host hoge-c-3
  HostName 10.15.0.50
  User hoge
  ProxyCommand ssh -W %h:%p hoge-humidai
```


下記のようになります


```
Host hoge-humidai
  HostName hoge.com
  port 10022

Host hoge*
  User hoge

Host hoge* !hoge-humidai
  ProxyCommand ssh -W %h:%p hoge-humidai

Host *-a
  HostName 10.15.0.10
  IdentityFile ~/.ssh/hoge-a

Host *-b
  HostName 10.15.0.20
  IdentityFile ~/.ssh/hoge-b

Host *-c-?
  IdentityFile ~/.ssh/hoge-c
Host *-1
  HostName 10.15.0.30
Host *-2
  HostName 10.15.0.40
Host *-3
  HostName 10.15.0.50
```

# 詳しく

上記の.ssh/configについて詳しく説明します。
.ssh/configをまとめる際にはHostでのパターンマッチを利用します。
Hostでサポートされているパターンマッチは`*, ?, !`の3種類があり、マッチした項目の設定を適用させることができます。
また、最初にマッチしたHostの設定内容はその後にマッチしたHostの設定に上書きされることはありません。

## 「\*」任意の長さの文字にマッチさせる

```
Host hoge*
  User hoge
Host *-a
  HostName 10.15.0.10
  IdentityFile ~/.ssh/hoge-a
```

Hostではワイルドカードを使うことができます。
上記のように設定することで`hoge`から始まるHostに

```
User hoge
```
の設定を反映させることができます。
また、`-a`で終わるHostに

```
HostName 10.15.0.10
IdentityFile ~/.ssh/hoge-a
```
の設定を反映します。
「hoge-a」は両方にマッチするため、これらの設定が適用されます。

## 「?」任意の1文字にマッチにマッチさせる

```
Host *-c-?
  IdentityFile ~/.ssh/hoge-c
Host *-1
  HostName 10.15.0.30
```

`hoge-c-1`や`hoge-c-2`の重複設定を省略するために上記のようにしています。
その際に`*-c-?`というパターンを利用することで、`-c-`の後に任意の1文字が存在する場合にのみマッチさせることができます。(ナンバリングが2桁を超えたら設定は変えてください)

## 「!」パターンを否定する

```
Host hoge* !hoge-humidai
  ProxyCommand ssh -W %h:%p hoge-humidai
```

今回の例のように踏み台サーバ以外にのみ設定を適用したい場合はパターン否定を利用します。
Hostには複数のホスト名やパターンを設定することができます。
上記では`hoge*`のパターンと`!hoge-humidai`の2つを設定し、後者は「hoge-humidai」を否定しているため、「hoge」から始まるかつ「hoge-humidai」ではないHostにマッチするようになっています。


# その他

```
alias ssh='cat ~/.ssh/conf.d/*.config > ~/.ssh/config;ssh'
```

今回の内容とは関係ありませんが、.zshrcや.bashrcなどに上記のコマンドを追加することで、.ssh/conf.d以下にプロジェクト単位などで設定ファイルを分けて管理することができます。
Raspberry Pi に RDP で接続できないときの対処

# `xrdp` をインストールしたのに接続できない！

Raspberry Pi に RDP (Remote Desktop Protocol) で接続する方法については，すでに解説記事がたくさんあります．

参考：[Raspberry Pi でリモートデスクトップ](http://qiita.com/suppy193/items/e2f811dd136780099ceb)

これらの記事によれば，基本的には Raspberry Pi 側で

```bash
sudo apt install xrdp
```

するだけで RDP 接続できるようになるはずです．

ところが，一部環境にて，ログイン時に下記のようなログが表示され，Raspberry Pi に接続できないことがあるようです．

![Connection Log](https://qiita-image-store.s3.amazonaws.com/0/126427/8072c835-aa32-54c9-da77-8cfa041f0954.png)

```txt:Connection_Log
connecting to sesman ip 127.0.0.1 port 3350
sesman connect ok
sending login info to session manager, please wait...
xrdp_mm_process_login_response: login successful for displa
started connecting
connecting to 127.0.0.1 5910
error - problem connecting
```

## 環境

私の環境は以下の通りです．

* モデル
    - Raspberry Pi 3 Model B
* OS
    - Raspbian 8.0 (Jessie)

なお，すでに `ssh` 等で Raspberry Pi には接続できるようになっていることを前提とします．
IP アドレスの固定化などは別途行ってください．

# 解決策：`tightvncserver` をインストールしましょう

公式フォーラムのスレッドによると，`tightvncserver` をインストールすることで解決することがあるようです．
以下の操作はすべて Raspberry Pi 側で行います．

1. いったん，`xrdp` をアンインストールします．

    ```bash
    sudo apt remove xrdp
    ```

1. `tightvncserver` をインストールします．

    ```bash
    sudo apt update
    sudo apt install tightvncserver
    ```

1. 再度 `xrdp` をインストールします．

    ```bash
    sudo apt install xrdp
    ```

以上で，Windows 等のクライアントから，Raspberry Pi に RDP で接続できるようになります．

参考：[RDP: " login succesful" followed by error problem connecting](https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=140826)
「オフラインリアルタイムどう書く第30回(とある世界のタクシー料金)」の問題を解いてみた


[横浜へなちょこプログラミング勉強会](https://yhpg.doorkeeper.jp/)にて過去に出題された[とある世界のタクシー料金](http://nabetani.sakura.ne.jp/hena/ord30taxi/)を解いてみた。
回答にかかった時間は40分程度。

`[from,to].sort.join.to_sym`が非常に気に食わないが、`sort`しなくてもよいように`ROUTE`に逆順も持つのはおかしな話なので妥協した。

```ruby
class Taxi
  FIRSTRIDE = [[995, 400], [845, 350]]
  ROUTE     = {
    AB: [1090, 0], AC: [180,  0], AD: [540,  1], BC: [960,  0], BG: [1270, 0],
    CD: [400,  1], CF: [200,  0], DE: [720,  1], DF: [510,  1], EG: [1050, 1],
    FG: [230,  1]
  }
  ADD_FARE  = [60, 50]

  def drive input
    input.each_char.each_cons(2).inject(FIRSTRIDE[[?A, ?B, ?C].include?(input[0]) ? 0 : 1]){|(left, fare), (from, to)|
      range, meter_type = ROUTE[[from,to].sort.join.to_sym]
      c = range <= left ? 0 : ((range - left) / 200.0).ceil
      [(left + 200 * c) - range, fare + ADD_FARE[meter_type] * c]
    }[1]
  end
end

test = <<_TEST
/*0*/ test( "ADFC", "510" );    
/*1*/ test( "CFDA", "500" );    
/*2*/ test( "AB", "460" );    
/*3*/ test( "BA", "460" );    
/*4*/ test( "CD", "400" );    
/*5*/ test( "DC", "350" );    
/*6*/ test( "BG", "520" );    
/*7*/ test( "GB", "530" );    
/*8*/ test( "FDA", "450" );    
/*9*/ test( "ADF", "450" );    
/*10*/ test( "FDACB", "750" );    
/*11*/ test( "BCADF", "710" );    
/*12*/ test( "EDACB", "800" );    
/*13*/ test( "BCADE", "810" );    
/*14*/ test( "EGFCADE", "920" );    
/*15*/ test( "EDACFGE", "910" );    
/*16*/ test( "ABCDA", "960" );    
/*17*/ test( "ADCBA", "1000" );    
/*18*/ test( "BADCFGB", "1180" );    
/*19*/ test( "BGFCDAB", "1180" );    
/*20*/ test( "CDFC", "460" );    
/*21*/ test( "CFDC", "450" );    
/*22*/ test( "ABGEDA", "1420" );    
/*23*/ test( "ADEGBA", "1470" );    
/*24*/ test( "CFGB", "640" );    
/*25*/ test( "BGFC", "630" );    
/*26*/ test( "ABGEDFC", "1480" );    
/*27*/ test( "CFDEGBA", "1520" );    
/*28*/ test( "CDFGEDABG", "1770" );    
/*29*/ test( "GBADEGFDC", "1680" );
_TEST

require 'minitest/autorun'

describe 'Taxi' do
  taxi = Taxi.new
  test.split("\n").each do |line|
    t, n, input, expect = line.match(/^\/\*(\d+)\*\/\s*test\(\s*"([^"]+)",\s*"([^"]+)"\s*\);*\s*$/).to_a
    it input do
      assert_equal expect, taxi.drive(input).to_s
    end
  end
end
```
Facebookのページにrubyのkoalaで自動投稿する方法


表題の通り、[arsduo/koala](https://github.com/arsduo/koala)を使い、Facebookのページに自動投稿をしたかったのですが、トークンの取得などに迷う事が多かったので、まとめました。

2016/10/17時点での、Facebook Graph APIを使い、ページに投稿する方法を解説します。
開発者のページのレイアウトなどは頻繁に変わるため、適宜読み替えてください。


# 1. Facebook開発者登録を行う

[こちら](https://developers.facebook.com/)で開発者登録を行ってください。
この時、パーミッションの設定の関係で、自動投稿したいページの管理者のユーザーで作業する必要があります。

![スクリーンショット 2016-10-17 14.11.15.png](https://qiita-image-store.s3.amazonaws.com/0/75491/d9024fe7-1477-b269-fe01-5c2cda3b71a2.png "スクリーンショット 2016-10-17 14.11.15.png")

# 2. アプリを作成する

[アプリ](https://developers.facebook.com/apps/)の画面で、新しいアプリを作成します。
![スクリーンショット 2016-10-17 14.15.00.png](https://qiita-image-store.s3.amazonaws.com/0/75491/0c6eaf5d-2085-2ec7-f90a-c58ff64fe10d.png "スクリーンショット 2016-10-17 14.15.00.png")

iOSでもandroidでもなく、Facebookキャンパスでもなく、Webサイトで使うわけではなく、Webシステムのバッチ処理から作成するため、BASIC SETUPを行いました。

![スクリーンショット 2016-10-17 14.16.27.png](https://qiita-image-store.s3.amazonaws.com/0/75491/f31edee9-d5cb-cf4e-fa15-c5b5fd0d4ed6.png "スクリーンショット 2016-10-17 14.16.27.png")
アプリの名称を入れ、カテゴリを選択して作成します。
![スクリーンショット 2016-10-17 14.19.01.png](https://qiita-image-store.s3.amazonaws.com/0/75491/aaffd0be-1b06-c1fb-d43f-c7e11f151def.png "スクリーンショット 2016-10-17 14.19.01.png")

# 3. アプリのトークンを取得する

[Graph API エクスプローラー](https://developers.facebook.com/tools/explorer/145634995501895)でアクセス用のAPIを取得します。
アプリケーションに自分のアプリを入れ、Get Tokenから、Get User Access Tokenを選択します。
![スクリーンショット 2016-10-17 14.28.31.png](https://qiita-image-store.s3.amazonaws.com/0/75491/8a73e233-78b2-2db7-842d-53d1a088b681.png "スクリーンショット 2016-10-17 14.28.31.png")

パーミッションの一覧が出て来るので、ページに自動投稿したい今回はmanage_pagesとpublish_pagesにチェックを入れて、登録します。
![スクリーンショット 2016-10-17 14.32.36.png](https://qiita-image-store.s3.amazonaws.com/0/75491/c6e73213-a9ed-39a1-d343-bb060a07259d.png "スクリーンショット 2016-10-17 14.32.36.png")

# 4. ページのアクセストークンを取得する

3で取得したアクセストークンを元に
https://graph.facebook.com/me/accounts?access_token=取得したアクセストークン
にアクセスすると、jsonデータとして、貴方の管理しているページのアクセストークンが出て来るはずです。
このアクセストークンを使うと、ページへの投稿ができます


# 5. ページに投稿してみる 
koalaを使うと、↓のような形で投稿可能です。

```ruby
require "koala"
@api = Koala::Facebook::API.new("ページのアクセストークン")
@api.put_wall_post("Hello there!", {
  "name" => "Link name",
  "link" => "http://www.example.com/",
  "caption" => "{*actor*} posted a new review",
  "description" => "This is a longer description of the attachment",
  "picture" => "http://www.example.com/thumbnail.jpg"
})
```

実際に内部でやっているのは、
https://graph.facebook.com/me/feed
に対して、 access_tokenと message のパラメータと、その他オプショをPOSTしているだけなので、koalaを使わなくても、POSTしてあげることで投稿が可能です

# 6. アプリを公開する

ページに投稿なども成功しているのですが、このままだと開発中のアプリで投稿した状態になっているので、自分以外のアカウントでは見れません。
その為、アプリレビューのところから、アプリを公開しましょう。

この時、ページ投稿の権限が無いので、本来ならアプリがページ投稿できないのですが、[Graph API エクスプローラー](https://developers.facebook.com/tools/explorer/145634995501895)でアクセストークンを取得する際に権限を設定したので、そのアクセストークンに限り、投稿ができる様です。

![スクリーンショット 2016-10-17 14.57.45.png](https://qiita-image-store.s3.amazonaws.com/0/75491/06670647-dd83-86c7-6f55-31f6850c87a4.png "スクリーンショット 2016-10-17 14.57.45.png")
Drawable.invalidateSelf()とはなにものなのか

AnimatableなDrawable自作したときにハマったので。

# Drawable

`View`の`onDraw()`にあたる処理だけを切り出した抽象クラスです。
`View`の場合は主に`onMeasure()`、`onLayout()`、`onDraw()`の3つを担いますが、`Drawable`は`onDraw()`のみになります。
サイズや配置などは、使う側(View)に委ねられています。

# Drawable.invalidateSelf()

`View.invalidate()`同様、再描画を促すメソッドです。`invalidate()`の`Drawable`版と思ってかまわないと思います。

とはいえ、`Drawable`は`View`と違い、描画しかサポートしていないため、本来再描画を促すことはできません。
では`invalidateSelf()`はどのように再描画可能にしているのか？

これには`Drawable.setCalllback()`メソッドが関係しています。


# Drawable.setCallback()

`setCallback()`とはなんなのか？（名前雑すぎて役割が何もつかめないんだけど…）

`setCallback()`の引数`Drawable.Callback`インターフェースは以下のようになっています。

```Drawable.Callback
public interface Callback {

    void invalidateDrawable(Drawable who);

    void scheduleDrawable(Drawable who, Runnable what, long when);

    void unscheduleDrawable(Drawable who, Runnable what);
}
```

`Drawable.Callback`の役割は2つ`invalidateDrawable()`と`scheduleDrawable()`です。

`invalidateDrawable()`は`who`(SelfにあたるDrawable)が`View.invalidate()`を要求するコールバックです。
`scheduleDrawable()`は`who`が特定の時刻にスケジューリングされた`Runnable`の実行を要求するコールバックです。

この`Drawable.Callback`ですが、基本的に実装する必要はありません。というのも、既に`View`が実装してくれているからです。[^1]
`CustomView`などで`invalidateSelf()`を有効にする場合は、**`drawable.setCallback(this)`**するだけで構いません。

ここまでで、`invalidateSelf()`は`Drawable.Callback`に`invalidate()`を要求するというメソッドであることがわかります。
`invalidateSelf()`をするためには準備が必要なんですね。（ハマり）


# View.verifyDrawable()

先ほど、`View`は`Drawable.Callback`を実装しているので、`drawable.setCallback(this)`するだけで`invalidateSelf()`は動くと書きましたが、**これだけでは動かないケースが存在します**。

`View`の`invalidateDrawable()`の実装では、`invalidate()`を呼び出せる`Drawable`を制限しています。
この条件を実装しているのが`View.verifyDrawable()`です。

デフォルトでは以下のように実装されています。

```View.java
@CallSuper
protected boolean verifyDrawable(@NonNull Drawable who) {
    return who == mBackground || (mForegroundInfo != null && mForegroundInfo.mDrawable == who);
}
```

`background`及び`foreground`に設定されている`drawable`以外の`invalidateDrawable()`は承認されません。
`ImageView`の場合はこれに加えて、`src`にあたる`Drawable`を追加しています。

つまり場合によっては、`setCallback(this)`をしても`verifyDrawable()`をoverrideし忘れると`invalidate()`されないということです。
気をつけましょう。（2度目のハマり）


# 注釈

[^1]: supportライブラリのように、`Drawable`のラッパーをつくる場合は自前で実装したりするようです
CentOS 7.2にCUDA、Chainerをインストールする

CentOS 7.2にCUDAとChainerをインストールした際のメモ。

# 1. CUDAの導入
0. [https://developer.nvidia.com/cuda-downloads](https://developer.nvidia.com/cuda-downloads)から、cuda_8.0.44_linux.runをダウンロードする(事前にユーザ登録しておくこと、Linux、X86_64、CentOS、7、runfile(local)を選択)
0. `sudo init 3`でXサーバを停止する
0. 再ログインして、`sudo  sh cuda_8.0.44_linux.run`、入力するパラメータはデフォルトのまま
0. `sudo reboot`で再起動
0. 再ログインして、.bash_profileに以下を追加し、`source .bash_profile`

`CUDA_ROOT_DIR="/usr/local/cuda-8.0"`
`export CUDA_ROOT_DIR`
`PATH="$PATH:${CUDA_ROOT_DIR}/bin"`
`export PATH`
`LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${CUDA_ROOT_DIR}/lib64/"`
`export LD_LIBRARY_PATH`

# 2. CUDAのサンプルプログラムのコンパイル
0. `sudo yum install freeglut freeglut-devel`(makeする際に、エラーが出たので左記を実施)
0. `cd ~/NVIDIA_CUDA-8.0_Samples/`
0. `make` 
0. `bin/x86_64/linux/release/deviceQuery`でGPUの情報を確認

# 3. cuDNNの導入
0. [https://developer.nvidia.com/cudnn](https://developer.nvidia.com/cudnn)より、cudnn-8.0-linux-x64-v5.1.tgzをダウンロード
0. ダウンロード先のディレクトリにて、`tar xvfz cudnn-8.0-linux-x64-v5.1.tgz`
0. `cd cuda`
0. `sudo cp lib64/libcudnn* /usr/local/cuda/lib64/`
0. `sudo cp include/cudnn.h /usr/local/cuda/include`

# 4. Chainerの導入
0. `su`
0. `CUDA_PATH=/usr/local/cuda pip install chainer`
0. `exit`

# 5. Chainerの動作確認
0. `wget https://github.com/pfnet/chainer/archive/v1.16.0.tar.gz`
0. `tar xzf v1.16.0.tar.gz`
0. [CUDAなしで実行] `python chainer-1.16.0/examples/mnist/train_mnist.py`
0. [CUDAありで実行] `python chainer-1.16.0/examples/mnist/train_mnist.py --gpu 0` (`nvidia-smi`で確認すると、グラフィックカードの電力消費が増えているのが分かる)
cocos2d-x(js)の開発環境

# はじめに。  
2DならUnityも力入れてるし、そっちの方が開発の主流ではないか？と思われますが、PCブラウザゲームとなると、Unityは現在のところけっこう重いので、こっちで。（将来的に、WebAssenblyが本格的にリリースされたら、Unityでも問題ないかも)
CocosCreaterもありますが、ちょっとまだ不安定なところも多いらしいので、こっちで。
けっこう、あちらこちらに環境設定のことは書いてありますが、cocos2d-xのサイト行くとダウンロードリンクが消えていたりとか多いので、あらためて2016年10月現在のものをまとめておきます。
ちなみに、ここでは、Windowsが前提となっています。

## 開発環境を整える
1. Windowsの場合、Pythonをいれる  
macOSならいいんですが、WindowsだとPythonをインストールしなくてはなりません。  
http://www.pythonweb.jp/install/  
こちらを参考に。  
難点は、PATHの設定だと思いますが、まあなんとかなります。  
　
2. cocos2d-xを入れる  
http://www.cocos2d-x.org/download  
![SnapCrab_NoName_2016-10-12_17-16-42_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/56195/e582eee1-9a85-326d-cb6c-f0ec223910f6.jpeg)  
ダウンロードして解凍したら、適当なディレクトリにコピーして完了。  
例：C:\cocos2d-x-3.13.1   
ほかのサイトを見ると、cocos2d-x(js)を使うには、cocos2d-jsをインストールするようなことが書いてありますが、cocos2d-xにJavaScriptも含まれているらしいので、cocos2d-xだけで大丈夫｡(2016.10現在)  
　
3. setup.pyの実行  
1でやったpythonのインストールが正常であれば、  
C:\cocos2d-x-3.13.1\setup.py  
を、ダブルクリックするだけで、環境設定のコマンドが実行されます。
![SnapCrab_NoName_2016-10-12_17-30-6_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/56195/0c68e00f-4fce-909b-9612-1d291bcb5ab0.png)  
こんなかんじ。SDKの設定を聞かれるので、SDKのパスを入力します。PCのWEB版だけ作るのであればすべてENTER押してSKIPしてしまってOK。  
SDKについて　参考：http://freedom-man.com/blog/cocos2d-js-environment/  
　
4. プロジェクトを作ってみる  
以上で、インストールは終了ですが、プロジェクトが作れるかやってみます。
コマンドプロンプトを立ち上げ  
```
cocos new {プロジェクト名} -d {ディレクトリ} -l js
```  
というようにコマンドを入力します。  
{ProjectName}は任意のプロジェクト名を  
-d プロジェクトを生成したいディレクトリを指定  
-l 使用言語、ここではJavaScriptなので、`js`  
入力したディレクトリに  
![SnapCrab_NoName_2016-10-12_17-56-37_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/56195/f33e10bf-b010-60c1-6c00-ed54fc2ee686.png)  
こういったファイルが出来ていれば成功です。  
　
5. プロジェクトを実行してみる。  
コマンドプロンプトで   
```
cocos run -s {プロジェクトのベースパス} -p web
```  
と入力します。  
-p 実行したいプラットフォーム　ここではPCブラウザなので`web`  
そうすると、  
![SnapCrab_NoName_2016-10-12_18-6-33_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/56195/5233358e-cdf1-2700-1620-f047154bf49a.png)  
こんな画面がブラウザで表示されれば成功です。


## cocos studioをインストール  
cocos2d-xを入れて、jsファイルを直接いじり、コマンドプロンプトでcocosコマンドを実行して・・・というのがハードルが高い、というのであれば、cocos studioを使うのも手です。
ここで問題なのが、cocos2dの公式サイトにはもうcocos studioのダウンロードリンクがないということ。
以下のリンクから、ダウンロードできました。
[mac] http://cocos2d-x.org/filedown/CocosForMac-v3.10.dmg
[win] http://cocos2d-x.org/filedown/CocosForWin-v3.10.exe
↑どうやら、cocosと、cocos studioは別物らしいですが、cocosにはcocos studioも含まれているので、問題なし
' t.text 'に指定できる字数

データベースに' t.text 'を用い、カラムを作成した際の字数指定について。

指定できる字数は、以下のようになっています。

```t.text :hoge, limit: 255```
```t.text :hoge, limit: 65535```
```t.text :hoge, limit: 16777215```
```t.text :hoge, limit: 4294967295```

' t.string 'などとは違い、上記以外の値を記述してもschemaには反映されないので注意です。
指定した後は、保存して、

```
bundle exec rake db:reset:migrate
```

でschemaを再生成しましょう。

当記事が、どなたかの一助となれば幸いです。
[Atom][Vimmer向け] Windonws環境でAtom環境構築メモ

# 概要
LinuxではTerminalでvim使えばいいけれども、Windows環境でvimを使うのはShift-JISとか改行とかいろいろでわりとしんどいのでメインエディタとしてはAtomを使うことにした。（開発はLinuxがメインなので、あくまでも補助的な使用を想定）
本記事は `vim-mode-plus` でのVimキーバインド前提で環境を作る方法のメモになります。（随時更新予定）

# インストール方法と日本語化
以下のページなどを参考にインストールして下さい。

[超初心者におすすめのhtml・cssテキストエディタAtomをインストールする方法](http://creating-homepage.com/archives/754#sec2)

記事内にも書いてありますが、特にこだわりがなければ日本語化パッケージを入れると良さげです。
[japanese-menu](https://atom.io/packages/japanese-menu)

# Atom初期設定
以下は個人的なメモ、設定はお好みでどうぞ。

## プロキシ環境下での設定
[プロキシ環境下でapm installできない - Qiita](http://qiita.com/megmogmog1965/items/7613267d7e7a677a5d8a)

## スペルチェック無効化
日本語のドキュメント作成時に赤線が出まくるので、スペルチェックを無効化する。
[Atomでスペルチェックを無効にする - Qiita](http://qiita.com/t_mario_y/items/e34eedbbc1adc7d7e162)

todo: 日本語だけスペルチェック無効化したい

## タブ可視化
タブを記号で見えるように変更。
以下の記事がちょっと古いのでエディタ設定がコア設定の中に含まれていますが、設定のEditorを選択すればその中にあります。
[Atomテキストエディタで TABスペース・半角スペース・改行 を見えるように設定する方法](http://creating-homepage.com/archives/1302)

## vimキーバインドの有効化（Vimmerなら必須）
packageから `vim-mode-plus` をインストールして下さい。
vimキーバインド使うならvim使えよとは言ってはいけない。

[2015年、Atom に乗り換えた。そして vim-mode-plus をリリースした。 - Qiita](http://qiita.com/t9md/items/17754b3383932aa8e782)

# その他設定メモ
## PlantUML
PlantUMLのプレビューがAtomだと簡単なのでAtomを選んだようなところもあるぐらい便利です。
テキストでUMLを作図できます。詳細は以下のページなどを参照して下さい。

[PlantUMLを自動変換してLiveプレビューしてくれるAtom拡張 PlantUML-Viewer がイイ！ - pierre3のブログ](http://pierre3.hatenablog.com/entry/2015/08/23/220217)
[PlantUML の使い方 | プログラマーズ雑記帳](http://yohshiy.blog.fc2.com/blog-entry-152.html)
windowsユーザである僕のための Mac atom ショートカット一覧

# atomショートカット

普段はwindowsですが職場でMacを使用しています。
そんな僕がエディターにatomを選んだわけですが
何やらショ−トカットが(windowsユーザである僕にとって)分かりづらい。

そこで「よく使うけどあれどうやって打てばいいの！」っていうショートカットを一覧化します。
あと「へ〜、こんなのもあるんだ」と思ったものを雑多に記載しています。
「Ctrl + c :コピー」といった馴染み深いものは記載しておりません。
（Macだと Command + c だけど）

注意点として以下のような「Command」を二度記載する場合、
一度`Command + k`　押下後に`Command + u`を押下することを表します。
その際 Command キーは押下しっぱなしでも一度離してもOKのようです。

```
選択範囲を大文字化
Command + k + Command + u
```

# 検索

|ショートカット|動作|
|:-:|:-:|
|一度検索したキーワドの次へ検索|Command +  g|
|プロジェクト内の検索(grep？)|Command + Shift + f|
|プロジェクト内のファイル検索|Command +  p|
|指定した行へジャンプ|Ctrl + g|
|対応する括弧に移動|Ctrl + m|
|対応する括弧内を選択（現在のブロックを選択）|Command + Ctrl + m|

# ウィンドウ

|ショートカット|動作|
|:-:|:-:|
|閉じたタブを復活する|Command + Shift + t|
|アクティブなタブの移動|Command + option  ← or →|
|パネル分割|Command + k + 分割したい方向のカーソルキー|
|パネル間の移動|Command + k + Command + 移動したい方向のカーソルキー|
|現在展開しているエディターからファイル検索|Command + b|

# 入力補助

|ショートカット|動作|
|:-:|:-:|
|行の複製、現在行を下にコピー|Command + Shift + d|
|現在行の削除|Ctrl + Shift + k|
|行の移動|Command + Ctrl + ↑ / Command + Ctrl + ↓|
|コメントする/コメントアウトをはずす|Command + /|
|選択範囲を小文字化|Command + k + Command + l|
|選択範囲を大文字化|Command + k + Command + u|
|現在行を選択|Command + l|
|選択範囲で改行削除（行結合）|Command + j|
|カーソル追加（矩形選択用に）※|Ctrl + Shift + ↑ / Ctrl + Shift + ↓|
※ただしMac でも windowsでもOSのデフォルトキーにのっとられがちなのでキーバインドを変更した方が良さげ。

# ファイル操作

|ショートカット|動作|
|:-:|:-:|
|選択した単語と同じ単語を全選択（一度に全修正が可能）|Command + Ctrl + g|
|コマンドパレットを開く|Ctrl + Shift + p|
|エンコードの種類を変更(文字コード指定）|Ctrl + Shift + u|

# その他

|ショートカット|動作|
|:-:|:-:|
|Markdownプレビュー表示の切り替え|Ctrl + Shift + m|
|コマンドパレット（どの操作がどのショートカットと紐付いているか）表示|Command + Shift + p|
Arch Linuxで、Systemd-nspawnによる仮想環境を構築し、Emacs-mozcをインストールする方法

誰が得をするのかという内容ですが、それなりに苦労したので記事にしてみます。

関連記事：
[Arch LinuxでSystemd-nspawnを使ってSpacemacsをGUIで起動し、Emacs-mozcを使う](http://qiita.com/acro5piano/items/5edbb8f21d9e8de1f0ff)

# 動機

Arch Linuxではfcitx-mozcとemacs-mozcが競合しており、双方を使うことができない。
そこで、Systemd-nspawnによりコンテナを作り、そこで最低限のアプリケーションをインストールし、emacs-mozcを利用する。

# 手順

ゴールは、ホスト側のEmacsが、コンテナ内にインストールされた`mozc_emacs_helper`を呼び出せるようにすること

## Arch Linuxのコンテナを作成

Systemd-nspawnを使う

```bash
mkdir -p $HOME/var/container/arch
sudo pacstrap -i -c -d $HOME/var/container/arch base　base-devel
```

## コンテナ内にemacs-mozcをインストール

```bash
cat << 'EOF' >> /etc/pacman.conf
[pnsft-pur]
SigLevel = Optional TrustAll
Server = http://downloads.sourceforge.net/project/pnsft-aur/pur/$arch
EOF

pacman -Syy
pacman -S emacs emacs-mozc

useradd --create-home arch-container-user
```

## 動作確認

```bash
echo -e '(0 CreateSession)\n(1 SendKey 1 97)' |
sudo systemd-nspawn --quiet -D $HOME/var/container/arch -u arch-container-user mozc_emacs_helper
```

エラーが帰ってこなければOK

## ホストのEmacsにmozcをインストール

```lisp
M-x package-install mozc
```

で入れた後、

```lisp:init.el
(require 'mozc)
```

を追加する

## ホストにmozc_emacs_helperコマンドを追加


```bash:$HOME/bin/mozc_emacs_helper
#!/bin/bash

sudo systemd-nspawn --quiet -D $HOME/var/container/mozc_emacs_helper -u arch mozc_emacs_helper
```

注

- `--quiet`オプションを入れるのがポイントで、入れないとSystemd-nspawnのメッセージが入り、mozc.elが動作しない
- コンテナ側のユーザーがrootだと、mozc_emacs_helperがうまく動作しないので、`arch`ユーザーを指定する
- コンテナに入る時、パスワード無しで`sudo`できるよう、ホスト側の`visudo`で設定しておく

# やってみる

Emacsを起動して、`M-x mozc-mode`します。

こんな感じになりました。

![Screenshot_2016-10-17_12-37-10.png](https://qiita-image-store.s3.amazonaws.com/0/103885/89d1703f-8b6d-0711-cb01-ac40f06a101a.png)


# 感想

最近はEmacsをGUIで起動しないので、正直あまり使い道は無さそうです。

が、GUI/CUIアプリケーションに関わらず、いざとなったらコンテナと連携できるというのは安心できますね。
仮想化最高。

# 参考

http://qiita.com/scalper/items/a1ab77ae7b2b06fb3f49
まごチャンネル💕SORACOM

[![まごチャンネルヘッダイメージ](https://qiita-image-store.s3.amazonaws.com/0/77230/02a78c91-a32e-4ef7-5c7a-d1b82dba654e.jpeg)](https://mago-ch.com)

SORACOMさん、一周年おめでとうございます！

[SORACOMリレーブログ](https://blog.soracom.jp/relay-blog/2016-10/)、7日目は株式会社チカクの高橋からお届けいたします。

「チカク」といいましても、何やってる会社ですかね？って思う方が大半ですよね。
チカクは、まごチャンネルという製品・サービスを提供しているスタートアップです。

僕たちが提供しているまごチャンネルは、おじいちゃんやおばあちゃんが離れて暮らすお孫さんの動画や写真をテレビで見られるサービスです。
SORACOM AirのSIMを挿した状態で出荷していますので、ネットのないご家庭でも使えます。
簡単に使えるよう、電源スイッチすらありません。電源ケーブルとHDMIケーブルをつなげるだけです。

最近は、SORACOM Conference 2016 “Discovery”のアタックムービーで取り上げていただいたり、三越伊勢丹グループで取り扱っていただいたり、グッドデザイン賞ベスト100に選出していただいたり、日経トレンディの特集で生活部門の大賞をいただいたり、会社も週刊東洋経済で「すごいベンチャー100」にとりあげていただくなど、大変誉れ高く、恐縮することも多いのですが、実態はまだ社員10名にも満たないよちよち歩きのスタートアップでございます。

**なんせ、出荷時の設定から箱詰めまで、全部自分たちでやってますから！**
ときおりオフィスから旅立つまごチャンネルに**「幸せになれよ」**なんて声をかけたりして。

*SORACOM Conference 2016 “Discovery”で流していただいた動画*
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr"> <a href="https://t.co/JJ2CEx93HA">https://t.co/JJ2CEx93HA</a> via <a href="https://twitter.com/YouTube">@YouTube</a></p>&mdash; 高橋 一貴 (@kappa4)<a href="https://twitter.com/kappa4/status/787996022320435200">October 17, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
そんなまごチャンネルは、1年前の2015年9月14日にクラウドファンディングのMakuakeさんで発表したのですが
3G/LTE回線網の運用をどのようにしていくかは悩みどころでした。

そんな発表からわずか2週間後、迷える子羊たちならぬ迷えるおっさんども(当時の社員平均年齢30代なかば)のもとに、神が降臨いたしました。かねてよりお付き合いのあった玉川さんにSORACOM Airの話を伺ったのです。
タイミングといい、機能といい、僕たちが必要なものど真ん中でした。

**あの時の玉川さん、はっきり言って後光がさしてましたね！**

たしかに覚えてる。

SORACOM Airの存在そのものだけでも我々は生かされていると言って過言ではないのですが、それだけではなく、何度も助けられています。

かつて、サーバ側の負荷問題が起きたことがありました。
朝4時にアラートコールが鳴り、慌てて起きると、次々とインスタンスが落ちていきます。
**立ち上げてもすぐ落ちるモグラたたき状態。**
![game_moguratataki.png](https://qiita-image-store.s3.amazonaws.com/0/77230/6195fcc3-5e37-f2b7-75ad-2ea834668ccd.png)

おじいちゃんおばあちゃんがまごチャンネルを見はじめる日の出までに力づくでスケールアウトして一次対応し、一息ついたところでオフィスに向かいます。原因究明、恒久対応と手順を踏んでいきますが、戻していく作業もまた慎重にやらなければなりません。

まごチャンネルは接続状況を常時サーバに送ることでヘルスチェックをしているのですが、その周りに原因があり、送られてくるデータを一時的に減らす必要がありました。
そこで、SIMを一時的に休止中にし、負荷状況をチェックしながら使用中に戻していく対応をしました。

もし、簡単にAPIを叩いて休止にできなければ、立ち上がっては落ち立ち上がっては落ちを繰り返していたことでしょう……あな恐ろしや……考えただけで意識が遠のきます。SORACOMさまさまです。
(まごチャンネルは回線が不安定で送れない場合のために、蓄積とリトライをするのでデータもロストしません)

**そんなSORACOMが一周年ということで、改めまして本当におめでとうございます！
いつもいつも良くしていただいて、感謝してもしきれません！！**
まごチャンネルもほぼ同じタイミングの発表ですので、これからもともに走っていきましょー！
 
ところで、製造量の少ないスタートアップにとって、3G/LTEモジュールの調達は色んな意味でドラマチックです。
スタートアップのそんな需要に応えてくれる神様、また降りてこないかなー……|ω･`)

------
まごチャンネル： https://mago-ch.com
チカク： https://chikaku.co.jp
MacでChromeが消費しているメモリ量を表示するワンライナー

Google Chromeはマルチプロセスなので、アプリ全体として消費しているメモリ量を知るには各プロセスのメモリ使用量を合計する必要がある。

## ワンライナー

```bash
$ ps aux | grep -i chrome | tail -n +2 | awk -F' ' '{sum += $6} END {print sum/1000 " MB"}'
5505.85 MB
```