OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi 音声まわりコマンドまとめ

## 出力

### 再生
wav

```
$ aplay -D plughw:<card num>,<device num>　<file path>
```

mp3

```
$ mpg321 <file path>
```

```/usr/share/sounds/alsa/``` に音声ファイルあり．


### 出力系ハードウェアデバイス確認
```
$ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: PCH [HDA Intel PCH], デバイス 0: CX20753/4 Analog [CX20753/4 Analog]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 0: PCH [HDA Intel PCH], デバイス 3: HDMI 0 [HDMI 0]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 0: PCH [HDA Intel PCH], デバイス 7: HDMI 1 [HDMI 1]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 0: PCH [HDA Intel PCH], デバイス 8: HDMI 2 [HDMI 2]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
```

### スピーカ優先度

```
$ cat /proc/asound/cards
```



### テスト音声再生
```
$ speaker-test -t sine -f 600
```

### 出力変更
```
$ amixer cset numid=3 1　# アナログ
$ amixer cset numid=3 2　# HDMI
```


## 入力

### 録音
```
$ arecord -r 16000 -f S16_LE test.wav
```

### 入力系ハードウェアデバイス確認
```
$ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: PCH [HDA Intel PCH], デバイス 0: CX20753/4 Analog [CX20753/4 Analog]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
```

`plughw:`のあとに入れるカード番号とデバイス番号がわかる．


### マイク優先度
優先度確認

```
$ cat /proc/asound/modules
```

優先度変更

```
$ sudo cat /etc/modprobe.d/alsa-base.conf
options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1
```


## 共通

### ボリューム調整　
```
$ alsamixer
```



## 参考
http://deviceplus.jp/hobby/raspberrypi_entry_012/
http://qiita.com/plsplsme/items/57b8d79d3725497fd69b
http://qiita.com/kinpira/items/75513eaab6eed19da9a3
http://qiita.com/t_oginogin/items/f0ba9d2eb622c05558f4
centos7に自動機械学習ライブラリauto-sklearnをインストールしてみた

#機械学習の自動化とは
機械学習ってバズワードにもなり，様々なデータ分析を行うのにとても有効らしいけど，
実装しようとするとライブラリを使ったとしても，「色々な調整」を行う必要が出てくるため，とても敷居が高いです．
そこで，その「色々な調整」も機械にやってもらってしまおう，というのが機械学習の自動化です．

#auto-sklearnとは
機械学習のモデル選択などを自動で行ってくれる便利なライブラリ．
ここで用いられる機械学習のモデルはscikit-learnの実装物となる．
論文としては以下のものに該当する．

- [Feurer et al., "Efficient and Robust Automated Machine Learning," NIPS2015](https://papers.nips.cc/paper/5872-efficient-and-robust-automated-machine-learning)

#auto-sklearnのインストール
実際にcentos7へのインストールを行う．
基本的な手順は[本家（英語）のHP](https://automl.github.io/auto-sklearn/stable/)に載っており，以下の通り．
>
```
curl https://raw.githubusercontent.com/automl/auto-sklearn/master/requirements.txt | xargs -n 1 -L 1 pip install
pip install auto-sklearn
```

ただし，上記を成城に動作させるためには，いくつか環境の準備が必要となるので，それを以下にまとめる．
また，現状では（少なくともmasterブランチからのインストールでは）依存関係にあるライブラリの都合でputhon 2には対応していない模様なので，python 3環境を同時に整える．

作業内容の概要

- python 2とpython 3を共存させるためにpythonバージョン管理ツールpyenvをインストール
- python 3をインストール
- python 3環境を整備
- auto-sklearnに必要なライブラリをインストール
- auto-sklearnをインストール


```
yum -y install git zlib-devel bzip2 bzip2-devel openssl openssl-devel readline readline-devel sqlite sqlite-devel 

git clone https://github.com/yyuu/pyenv.git ~/.pyenv
vi ~/.bash_profile
# export PYENV_ROOT="$HOME/.pyenv"（.bash_profileに追加）
# export PATH="$PYENV_ROOT/bin:$PATH"（.bash_profileに追加）
# eval "$(pyenv init -)"（.bash_profileに追加）
source .bash_profile

pyenv install 3.6.0
yum -y install atlas-sse3 atlas-sse2 atlas-devel atlas lapack-devel lapack-static lapack
pip3 install numpy six cython scipy matplotlib

pip install -r https://raw.githubusercontent.com/automl/autosklearn/master/requirements.txt
pip3 install auto-sklearn
```



#動作確認
[本家（英語）のHP](https://automl.github.io/auto-sklearn/stable/)のExampleのプログラムをそのまま実行してみる．
計算にはそこそこ時間がかかる模様．
それでもインストールは完了し，動作することは確認できました！

#今後
auto-sklearnがどのくらい使えるかについては未知数なので，実際に動かして体感してみようと思います．
動的なWebページ-Web入門③-

#はじめに
Web通信とサーバーについて、とても初歩的なところからまとめた覚書です。
入門②は[こちら](http://qiita.com/awannavuamaaan/items/2579c0fcc3658fe5abdc)です。

#動的なWebページとは
リクエスト内容に応じて異なるページを表示するWebページのこと。
http通信は基本的にリクエストに対してレスポンスを返すというシンプルなプロトコルなため、初期の段階ではサーバーに設置された静的なページを返す（ブラウザに表示させる）だけでした。
しかし、現在多くのWebページが動的に内容を変更できるようになっています。例えば、買い物かごなどです。

#ステートレスなhttp
httpは1つのリクエストに対して1つのレスポンスなので、ブラウザの以前の通信状態（ステート）を維持しません。
例えば、「商品Aを買い物かごへ入れる」という動作をした際、普通であればカートのアイコンの横に`１`と表示されているはずです。しかし、ステートレスな状態だと現在このページを表示したブラウザが、「買い物かごへ入れる」という動作をした人と同じかどうかというのが判断できません。そこで利用されているのが、`cookie`です。

##cookieとセッションID

- cookieはクライアント側の状態を維持するための仕組みです。
まずサーバーがブラウザへレスポンスを返す際、cookieを一緒に返します。次にブラウザがサーバーへリクエストを出す際、このcookieも一緒に渡すことで、サーバーはこのリクエストが前回リクエストしてきたクライアントだと判断できる仕組みです。

- また、cookieはセッション管理にも使われます。セッションIDを発行してcookieとして利用することで、「このセッションIDはすでにログイン済みだから、ログイン後の画面を表示させる」といった動的なページを実現できます。

#外部プログラム
サーバーに届いた情報を外部プログラムにデータ渡しし、プログラムを実行、結果をサーバーを通じてブラウザへ返すといった流れで動的なページを実現することができます。
外部プログラムとは、`.cgi`となるcgiスクリプトなどです。このあたりに関しては、もう少し勉強が必要…。
PowerShellメモ　シャットダウン、再起動、スリープ

# <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
PowerShellでシャットダウン、再起動、スリープ(サスペンド)する方法。

# <i class="fa fa-cubes" style="font-size:1em;"></i> コード

## <i class="fa fa-cube" style="font-size:1em;"></i> シャットダウン

強制オプション付き。

```PowerShell
Stop-Computer -Force
```

## <i class="fa fa-cube" style="font-size:1em;"></i> 再起動

強制オプション付き。

```PowerShell
Restart-Computer -Force
```

## <i class="fa fa-cube" style="font-size:1em;"></i> スリープ

`Suspend-Computer`だとそのうち名前が被りそうなので違う関数名にした。

```PowerShell
Add-Type -AssemblyName System.Windows.Forms

<#
.SYNOPSIS
    コンピューターをサスペンド
#>
function SleepPC
{
    $state = [System.Windows.Forms.PowerState]::Suspend
    [bool]$force = $true
    [bool]$disableWakeEvent = $false

    [System.Windows.Forms.Application]::SetSuspendState($state, $force, $disableWakeEvent)
}
```

# <i class="fa fa-cubes" style="font-size:1em;"></i> 動作確認した環境
* PowerShell V5 (Windows 10)

# <i class="fa fa-book" style="font-size:1em;"></i> 参考サイト

[Stop-Computer - MSDN](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.management/stop-computer)
[Restart-Computer - MSDN](https://msdn.microsoft.com/powershell/reference/5.1/microsoft.powershell.management/Restart-Computer)
[Application.SetSuspendState メソッド - MSDN](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.application.setsuspendstate.aspx)
Magic KeyboardとMagic Trackpad2を購入してみた感想


Merry Christmas♪

ということで、自分へのプレゼントにAppleの純正のmagic KeyboardとMagic Trackpad2を購入しました。
購入してみてどうだったのかというレポートをちょっと。

![IMG_3117.JPG](https://qiita-image-store.s3.amazonaws.com/0/153088/33b5b47e-f08b-5cdd-b5d7-971db3bc253e.jpeg "IMG_3117.JPG")

## クラムシェルモードがとても快適

クラムシェルモードとはモニターにMacbookを繋いだ時に、Macbookを閉じた状態でパソコンが操作できるモードなんでして、
写真見てもらうのが早いです。

![IMG_4099.JPG](https://qiita-image-store.s3.amazonaws.com/0/153088/fa182738-d42a-a5bc-fed6-58f494cdbbab.jpeg "IMG_4099.JPG")

こんな感じでMacbookを閉じていても操作が可能で、意外と便利です。

何がいいかというと、大画面モニター１つだと、マルチモニターに比べて首の移動がなくなり、疲れにくいです。

購入前は、まさか自分がクラムシェルモードを使うとは思っていませんでしたが、マルチモニターより本当に首の負担が少ないです。

### クラムシェルモードの起動方法についてさらっとおさらい

1. Macbookが電源につながっていることを確認
2. Bluetoothでキーボードやマウスを接続しておく。
3. 外部ディスプレイにつながっていることを確認する。

### 地味に、パソコンの移動がより楽になった。

僕の場合は、部屋のモニターとしては、さっき写真に出たPC用の外部モニターが１台と、ふつうにテレビ用のAQUOSが一台あります。

で、ご飯食べながら映画を見たいときは、テレビにHDMIで接続して、キーボードとトラックパッド（もしくはマウス）だけ、ご飯用のテーブルにおくと、テレビでのパソコン操作がとても快適です。
（今までは、デスクチェアとご飯用テーブルを行き来してたので）

## タイピングが想像以上に気持ちいい。

Magic Keyboardですが、正直、とてもタイピングが気持ちいです。
Macbookより深さがあって、パチパチして、今こうやって文章をタイピングしているだけで、気分が上々となります。

## Better Touch Toolにもしっかりと対応している。

僕はBetter Touch Toolをとても愛用してて、といっても三本指でのタブ移動とタブの開閉くらい？
Magic trackpad2でもしっかりとBetter touch toolは対応していたので、とても安心しました。

というか、Better touchがもし仮についていなかったら、残念すぎですが、、

## 購入前に知らなかったこと

充電はライトニングケーブル（iPhoneのケーブル）でできます。
こんな感じ。なので、付属でライトニングケーブルが付いてきます。

最近iPhone 7 plusも購入したので、一気にライトニングケーブルが３本も増えました。笑

![IMG_9639.JPG](https://qiita-image-store.s3.amazonaws.com/0/153088/48247ec7-66b1-ae84-c113-aade7927049e.jpeg "IMG_9639.JPG")


## 不満について

一応、ここについても述べておきますが、購入して後悔は全くしていません。
本当に上にあげた通り、嬉しいことばかりです。

あるとしたら値段ですが、自分の場合はそのぶん、愛着がわきます　笑
（確か２つで２万円ちょっとくらいだったかな？）

年末年始、Macbook Airの初期化と、Magic KeyboardとTrackpadの購入により、また来年もとても快適なMacライフが送れそうで何よりです。
Rails EngineでCapybaraを導入しようとしてハマったこと

Rails EngineにCapybaraを導入しようとしてハマったことが二つあるので、備忘録として残しておきたいと思います。

# ルーティングを認識させる
Railsアプリを普通に書いている場合は気にする必要がないのですが、Rails Engineでfeature specをいきなり動かそうとすると、`visit (path)`のところで以下のようなエラーが発生します。

```
  1) method_call_situation pages (permit WebUI) render Succsess
     Failure/Error: visit method_call_situations_path
     
     NameError:
       undefined local variable or method `method_call_situations_path' for #<RSpec::ExampleGroups::MethodCallSituationPages::PermitWebUI:0x007fe1d21b1730>
     # ./spec/features/method_call_situations_page_spec.rb:34:in `block (2 levels) in <top (required)>'
```

Rails Engineではspec内でルーティングを認識させる必要があります。

```ruby:spec_helper.rb
...
RSpec.configure do |config|
  config.include OkuribitoRails::Engine.routes.url_helpers
end
...
```

これで、名前付きルートが認識されるようになります。

# asset precompile を行うようにする
feature spec内でRails Engine内で持っている画像等のAssetを参照しようとすると、以下のようなエラーが発生します。

```
1) method_call_situation pages (permit WebUI) available search function
     Failure/Error: <%= image_tag "okuribito_rails/logo.png", class: "header-logo" %>
     
     ActionView::Template::Error:
       Asset was not declared to be precompiled in production.
       Add `Rails.application.config.assets.precompile += %w( okuribito_rails/logo.png )` to `config/initializers/assets.rb` and restart your server
     # ./app/views/layouts/okuribito_rails/_header.html.erb:2:in `___sers_ym_works_okuribito_rails_dev_app_views_layouts_okuribito_rails__header_html_erb__3728936773133030127_70218317871640'
     # ./app/views/layouts/okuribito_rails/application.html.erb:11:in `___sers_ym_works_okuribito_rails_dev_app_views_layouts_okuribito_rails_application_html_erb___1363027026573178022_70218307163340'
     # ./spec/features/method_call_situations_page_spec.rb:34:in `block (2 levels) in <top (required)>'
     # ------------------
     # --- Caused by: ---
     # Sprockets::Rails::Helper::AssetNotPrecompiled:
     #   Asset was not declared to be precompiled in production.
     #   Add `Rails.application.config.assets.precompile += %w( okuribito_rails/logo.png )` to `config/initializers/assets.rb` and restart your server
     #   ./app/views/layouts/okuribito_rails/_header.html.erb:2:in `___sers_ym_works_okuribito_rails_dev_app_views_layouts_okuribito_rails__header_html_erb__3728936773133030127_70218317871640'
```

Rails Engine単体では、asset precompileを行うように書かれていないハズなので、当たり前っちゃ当たり前です。
そこで、以下のように`engine.rb`にて、asset precompileを行う設定にします。

```ruby:engine.rb
module OkuribitoRails
  class Engine < ::Rails::Engine
    isolate_namespace OkuribitoRails

    initializer "okuribito_rails.assets.precompile", group: :all do |app|
      app.config.assets.precompile += %w(
        okuribito_rails/logo.png
      )
    end
  end
end
```

これで、テストが通るようになります。

なお、この対処方法が正しいかどうかは残念ながら保証しかねますが、rails_adminというgemのやり方を参考にしています。

- rails_admin
    - https://github.com/sferik/rails_admin
- 該当箇所
    - https://github.com/sferik/rails_admin/blob/master/lib/rails_admin/engine.rb
Visioアドイン(VSTO)をC#で作成する(セットアップ）

## 前提知識

* VSTO(Visual Studio Tools for Office)
    * Officeで利用できるCOMアドインをVisual Studioで開発できるようにするツール。

## Visioテンプレートの作成

* [手順1] Visioアドインのテンプレート取得

![2016-02-07_16h12_11.png](https://qiita-image-store.s3.amazonaws.com/0/82321/3d94d10d-e1db-8023-63a6-518d0f190711.png)

* [手順2] Visioアドインの設定
    * VSTOのセットアップができていないと、Create a VSTO Addin projectがONにならないので、本ページの下部にあるVSTOがインストールされていないときの手順にしたがって修正下さい。

![2016-02-07_17h16_42.png](https://qiita-image-store.s3.amazonaws.com/0/82321/21e2a99d-f943-94b7-b171-fc2d0f6d8d73.png)


* [手順3] 開発環境の確認と実行（デフォルトだとF5で実行できます）

![2016-02-07_17h19_20.png](https://qiita-image-store.s3.amazonaws.com/0/82321/010de7b6-a068-4b99-2ae7-699b8906ad6e.png)

* [手順4 ]アドインの設定方法
    * 実行するとVisioが立ち上がるため、以下のアドイン設定を確認してみましょう。

![2016-02-07_17h20_23.png](https://qiita-image-store.s3.amazonaws.com/0/82321/7b44851f-3340-c171-c9f7-fc7cf9d2380f.png)

* [手順5] アドインの実行

![2016-02-07_17h27_08.png](https://qiita-image-store.s3.amazonaws.com/0/82321/6a38eac4-432d-8c79-09f4-e71efb019fdd.png)


## Visioアドインの開発メモ

```csharp
// 現在アクティブなVisioファイルの取得方法
Visio.Document activeDocument = this.Application.ActiveDocument;
```



# 【補足】もしVSTOがインストールされていないとき（[手順2]が上手くいかないとき）

* 以下のような状態のとき、橙色のMicrosoft Visual Studio Office Developerをクリックして下さい

![2016-02-07_16h21_15.png](https://qiita-image-store.s3.amazonaws.com/0/82321/61aa62c2-3e30-046e-071c-fdd3e6c89077.png)

* インストーラがダウンロードされるので実行すると下記のような画面になります。

![2016-02-07_16h23_12.png](https://qiita-image-store.s3.amazonaws.com/0/82321/4ca6cc51-4820-9be5-4cfc-136947d30de8.png)

* その後インストールが開始されるので、手順にしたがってインストールを行ってください

----------


開発詳細は、また近日公開します。
mysqldumpの特定テーブルのINSERT文を1レコードずつ出力する

### 環境
- MySQL 5.6.29
- rootパスワードなし

### 追記

シェルスクリプトじゃなくても、`--skip-extended-insert`付けるだけでよいとのこと😇

```bash
$ mysqldump -uroot -t --compact --skip-extended-insert db_name table_name
INSERT INTO `table_name` VALUES (1,'2016-12-25 12:06:19');
INSERT INTO `table_name` VALUES (2,'2016-12-25 12:06:22');
INSERT INTO `table_name` VALUES (3,'2016-12-25 12:06:22');
```

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/eiryu">@eiryu</a> --skip-extended-insertじゃダメなんです？</p>&mdash; かずひら (@kazuhira_r) <a href="https://twitter.com/kazuhira_r/status/813002607992061952">2016年12月25日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

- http://hacknote.jp/archives/5557/

****

```bash
#!/bin/sh

DB_NAME=db_name
TABLE_NAME=table_name
for id in `mysql -uroot $DB_NAME -N -e "select id from $TABLE_NAME order by 1"`
do
  command="mysqldump -uroot -t --compact $DB_NAME $TABLE_NAME --where='id=$id'"
  eval $command
done
```

mysqldumpは、普通に使うとバルクインサート状態で結果を出力する。

```bash
$ mysqldump -uroot -t --compact db_name table_name
INSERT INTO `table_name` VALUES (1,'2016-12-25 12:06:19'),(2,'2016-12-25 12:06:22'),(3,'2016-12-25 12:06:22');

$ mysql -uroot db_name -e "show create table table_name\G"
*************************** 1. row ***************************
       Table: table_name
Create Table: CREATE TABLE `table_name` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4

```

しかし、`--where`を使うと条件に合致するレコードのみ出力することが出来る。

```bash
$ mysqldump -uroot -t --compact db_name table_name --where='id=1';
INSERT INTO `table_name` VALUES (1,'2016-12-25 12:06:19');
```

それを利用して対象テーブルのidを昇順に取りだし、順次mysqldumpでテーブル指定して`--where`に渡しているだけ。

注意点は、idを取り出すときに列名を取り出さないように`-N`オプションを付けていること。これがないと、ループの初回で`--where=id=id`となり、この状態だと全件バルクインサートで出力される。`--where=id=0`などのレコードが存在しない条件だと何も出力されないのだが、なぜか先述の場合は全件出力される。

```bash
$ mysqldump -uroot -t --compact db_name table_name --where='id=id'
INSERT INTO `table_name` VALUES (1,'2016-12-25 12:06:19'),(2,'2016-12-25 12:06:22'),(3,'2016-12-25 12:06:22');
$ mysqldump -uroot -t --compact db_name table_name --where='id=0'
$ # 出力無し
```
myThings DevelopersでWebhook未対応のTwitterAPIをWebhook風に扱ってみる

## はじめに
この記事では「Twitterで特定のハッシュタグのつぶやきが新たに投稿されたら自分のサーバにWebhookさせる」ということにチャレンジしてみようと思います。

TwitterのAPIはWebhookに対応していないので、通常は定期的にポーリングするような実装になるかと思いますが、
![twitter1.png](https://qiita-image-store.s3.amazonaws.com/0/51093/de1d8f37-54c1-1930-ee33-f99c3fa8cd58.png)

今回はmyThings Developersのカスタムアクションという機能を使って、Webhook風に実現することができます。
![twitter2.png](https://qiita-image-store.s3.amazonaws.com/0/51093/41ff5e7f-15eb-ca26-ca52-75a59d0c2fb0.png)


## 背景
今年9月、[myThings Developers](https://mythings-developers.yahoo.co.jp/)というサービスがリリースされました。
myThings Developersは非エンジニアの方でも色んなサービスのAPIをマッシュアップさせることができるmyThingsアプリを、より開発者向けにアレンジしたサービスです。
※詳しくは是非[こちら](http://qiita.com/yamamotomanabu/items/c10e0f05d477a25ff80e)をご覧ください。

そういった背景もあって、今年のアドベントカレンダーはmyThingsアプリについてだけではなく、myThings Developersについて書いて頂いた記事もありました（ありがとうございました！）。
ただちょっと気になったことが。。。

myThings Developersの大きな機能は2つしかありません。
1. カスタムトリガー
2. カスタムアクション

今QiitaにあるmyThings Developers関連の記事はカスタムトリガーの活用例が多く、カスタムアクションについて触れてる記事が少なかったので、カスタムアクションについての記事を書いてみようと思いました。

## 手順
ぶっちゃけ[これ](http://qiita.com/yamamotomanabu/items/c10e0f05d477a25ff80e#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)を読んで頂いたほうが早いかもです。ただこの記事では防災情報の取得を行っているので、念のためTwitter向けの画面をお見せするとこんな感じです。
![twitter3_5.png](https://qiita-image-store.s3.amazonaws.com/0/51093/9f3b5155-c934-ce1d-a547-114dcb7a9d52.png)

![twitter4.png](https://qiita-image-store.s3.amazonaws.com/0/51093/627ce1f8-ed37-d038-fab2-8f289349e6af.png)

myThings Developersの設定は以上です。
ただしTwitterのアクセストークンをmyThings Developersに預ける処理をBaaS上に実装する必要があります。そちらは[公式チュートリアル](https://mythings-developers.yahoo.co.jp/document/tutorial_index)に参照して頂ければと思います。

注意点としては、全てのAPIに対応している訳ではなく、myThings DevelopersはそのAPIのよく使われるケースでラッピングしているので、細かい制御が必要になる場合は直接APIを使わないと実現できないこともあります。
また、Webhookといっても、自分でポーリングしなければならないところを、myThings Developersが代わりにポーリングしてくれるというものなので、リアルタイム性という意味ではmyThings Developersのポーリング間隔に依存することになります。
myThings Developersでは一部の特別なサービス以外は15分間隔でポーリングを行っているので、リアルタイム性を確保しなければならない場合は、やはり直接APIを使わないと実現できないこともあります。

とはいえ、TwitterのアイコンをFacebookやInstagramに置き換えるだけで、それらもWebhook風に扱える手軽さは一つの武器だと思います。そのようにAPI個々のルールを勉強しなくて良いのはmyThings Developersのいいところですね。
合宿で得た360度のタイムラプス撮影の知見


Swift愛好会の皆様、合宿お疲れ様でした。
iPhone7 Plusのポートレート機能とTHETA Sを持ってたおかげで
半分カメラマン的な立ち位置で参加してました。

昔行った開発合宿でレポート代わりに撮ったタイムラプスが好評だったので
今回はTHETA Sを使って360度のタイムラプス撮影に挑戦してみました。

##基点をずらさない
当たり前のことだったんですが、うっかりずらして撮影していました。
1日目は基点がずれちゃっていきなり180度方向が変わったりしてしまっています。

１日目
https://www.youtube.com/watch?v=OpUrt1rMQmE

２日目
https://www.youtube.com/watch?v=3Zsh1YZ01ko

##360度を意識して遊ぶ
漫然と開発合宿の風景を撮影しても、正直すぐ飽きます。
みんなが真面目にやればやるほど動きがないので結構退屈になります。
何かモノ作りのイベントであれば良いのですが、
プログラミングしてると時間経過による変化がわかりにくいというのがあります。
人がいなくなった時にメッセージをカメラに向けるとか、
みんなで囲むとか、ちょっと息抜きのシーンが入ってると結構後から見て和みます。

##電源管理
THETAは電源を取るためのポートが本体の底についています。
しかし、私の持っていた３脚だとそのポートを塞いでしまうため、
必然的にバッテリーのみで稼働させることになります。
しかしTHETAのバッテリーでは1日稼働させることは難しいため、
３脚は本体を両サイドから挟み込むタイプのものを用意した方が良いです。

https://www.amazon.co.jp/dp/B01LSD9SY6/ref=sr_1_8?ie=UTF8&qid=1482666687&sr=8-8&keywords=3脚

今回の合宿ではなんと偶然THETA Sをお持ちの方がもう一人いたので、
バッテリーを充電しつつ交代で撮影し、最後にそれを結合させることで対応できました。感謝！

##シェアする
THETAの専用サイトでも共有はできますが、最近はFacebookにアップロードするだけで360度対応の動画は
スマートフォンなどでVRっぽく見ることが可能になっています。
合宿などのイベントのグループがあるとこの辺り非常に楽に共有して楽しむことができます。
chatbotで会社のSlackを監視する👀

これは[トレタ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/toreta)25日目の記事です。昨日はCTOの[@masuidrive](https://twitter.com/masuidrive)による[RailsでFoundation for Emails 2.0を使ってレスポンシブなHTMLメールを送る](http://qiita.com/masuidrive/items/0e3769ad890c9f21bbcb)でした。

今日はSlackのちょっとした悩みを解決する便利botの紹介です。


# Slackに関するちょっとした悩み
Slackはオフラインのコミュニケーションにとても便利ですが、個人的に不満に感じているところがあります。

例えば、いつの間にか知らないチャンネルができてる問題。会社で作っているプロダクトが多数にわたり、人数も増えてくるとSlackのチャンネルも増えてきます。業務上知っておきたいやりとりがされているチャンネルの存在を、かなり後になって知ることになってしまった・・・😫という経験がある人も居るんじゃないでしょうか。

こうした類のSlack上で起こっている`出来事`に気づけない問題は他にもいくつかあります。例えば誰かが便利なbotを運用し始めていても、そのチャンネルに参加してないと気づかない事があるでしょう。個人的にはカスタムemojiが増えたことに気づきづらいのもSlackに対する不満です。弊社では日々おもしろemojiが増え続けているので、こうした 物の最新動向にもキャッチアップしてきたいところです :eyes: 


# Real Time Messaging API

Slackではこうした `新しくチャンネルが作られた` `teamにbotが追加された` `絵文字が追加された` といったようなイベントをAPIで拾える仕組みが用意されています。[Real Time Messaging API | Slack](https://api.slack.com/rtm)ではかなり豊富な種類のイベントを取得できるようになっていて、更にWebsocketを利用してリアルタイムに新着イベントを受け取り、それに応じてプログラムで何かするといったことが可能です。

![Screen Shot 2016-12-25 at 6.15.20 PM.png](https://qiita-image-store.s3.amazonaws.com/0/7325/03cc746f-9969-20c9-a7fd-0ac0dd65a1f3.png "Screen Shot 2016-12-25 at 6.15.20 PM.png")

# botkitでSlack監視botを作る
[howdyai/botkit](https://github.com/howdyai/botkit)を使えばRTM APIを使ったSlackイベントを監視するbotが簡単に作れます。例えば以下のような感じで特定のイベントに対するハンドラを設定しておくと、新しいイベントを検知してチャットに通知を書き込むなど好きな処理を実行できます。

```javascript:bot.js
controller.on('channel_created', function(bot, message) {
  // botがjoinしているチャンネルに新しいチャンネル名を書き込む...
});
```

新しいチャンネルが作成されたらbotが通知してくれる仕組みは、サンプルコードを作って以下に公開しています。弊社のSlackチームでも`#channel-notify`という部屋を作って密かに運用開始していますが便利です。簡単に動かせるようにしてある(はず)なので、使ってみたい人は是非。

[horimislime/slack-new-channel-notifier: Notifies when new public channels are created.](https://github.com/horimislime/slack-new-channel-notifier)

![Screen_Shot_2016-12-25_at_7_43_20_PM.png](https://qiita-image-store.s3.amazonaws.com/0/7325/8237fcff-faaa-45e5-3294-7b09454a358d.png "Screen_Shot_2016-12-25_at_7_43_20_PM.png")


# まとめ
SlackのReal Time Messaging APIとbotkitを使ったchatbotについて紹介しました。一緒に働く仲間が増えるほど、Slack上でのやり取りも増えて見落とす情報も増えてきます。簡単なchatbotを作るだけでもこうした情報も拾えたりするので、ぜひ試してみてはどうでしょう。

----
これにて[トレタ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/toreta)は終わりです。どれもとても面白い内容なので、もし見逃している記事があればチェックしてみてください！それでは。メリークリスマス :christmas_tree:
【Fuse】Fuse Advent Calendarまとめ

さっき24日の記事を書き終えたばかりですが(w)、Fusetools Advent Calendar最終日として、まとめを書きたいと思います。完全に個人の意見ですし、自己満なポエムですが、お許しください。

もともと思い立ったのが12/7くらいで、その時点でもうカレンダーとして成立していないのですが、なにかしら縛りがないと取り組むことができない自分の性格もあり、Qiitaさんの素晴らしい仕組みを利用させていただいた形になります。ありがとうございました。埋まっていない日にちに関しては、明日以降、じわじわ埋めていくつもりです。

さて、なぜこのカレンダーを書こうかと思ったのか。それは、まぁ割と勢いだったりするんですが、なんとなく考えてたことがあります。

一つはWeb制作者もアプリが作れるってことを広めたかったことです。iOSアプリといえばSwift、AndroidアプリといえばJavaというのが一般的ですが、FuseはXMlとJavaScriptを書けばアプリができちゃいます。今回のアドベントカレンダーを書いていて、予想以上にFuseの手軽さを実感することができました。実際、リファレンス見ながら書けば簡単なアプリならすぐ作れると思います。しかもワンソースで、iOSアプリとAndroidアプリを作れるのは、Adobe AIRか、Unityか、Fuseかくらいじゃないでしょうか。この中で一番手軽なのはFuseだと自分は思います。もちろん、Fuseではまだ、実現できないことはあると思うので、使うタイミングを見極めることは当然必要ですが。

もう一つは日本で全然流行ってないこと。これはある意味チャンスだな〜と思いました。1週間くらい触ってみればわかると思いますが、Fuseはかなりよくできてると思います。もちろん、ビルド後のソースを全て見たわけではないですが、実機で見る分には動きもスムーズですし、実装の楽さを考えるととてもよいコストパフォーマンスだと思います。しかし、日本語ドキュメントがほぼないです。このカレンダーを書きながら調べましたが、このFuseに関して日本語で書かれている記事は一つしか見つかりませんでした（Fuseという別なツールがあるからか？）。なので、これからFuseを始める誰かの助けになればと思い、書かせていただきました。とはいえ、リファレンス翻訳しただけじゃ、ただの翻訳家になってしまうので、今後もいろんな視点から情報を発信していきたいと思います。

一応、Fuseのコミュニティを一覧しておきます。

- [Facebookページ](https://www.facebook.com/fusetools)
- [Twitter](https://twitter.com/fusetools)
- [Newsletter](http://weekly.fusetools.com/)
- [Blog](https://medium.com/@fusetools/latest)
- [公式サイトのフォーラム](https://www.fusetools.com/community)
- [Slack](https://slackcommunity.fusetools.com/)

Slackには、スペイン専用チャンネルや、韓国人用のチャンネルや、NYのチャンネルなどがあります。日本のユーザーが増えてきたら、日本用のチャンネルや、Facebookグループ作りたいなぁとひっそり思っています。

あとは毎日記事を書くっていうことに関しては裏テーマがあって、自分がこうやって記事を世に公開することで、同僚にももっと外に出て欲しいという思いがありました。まぁ、エンジニアリングに対する向き合い方は人それぞれだし、自分がどうこういうつもりもないですけど。

最終回ということで、今一度Fuseのコンセプトを見てみました。

デザイナーに対しては 「Don't just prototype it. Build it.」
チームに対しては 「Make apps in real time.」
開発者に対しては 「Build better apps faster.」

Fuseは、開発者だけでなく、チーム全員に対してメッセージを送っています。自分のようなただの開発者は一人では見た目がしょぼいものしか作れません。ディレクターさん、デザイナーさんを含めチーム全員で取り組むことが必要です。Fuseはそんなチーム全員で開発するのに最適なツールだなと改めて感じました。

まったくとりとめのない文章でしたが、最後に、ホントはWebGLのアドベントカレンダーに参加したかったです。以上。
たくさんのファイルから重複した行の塊を見つける

# おことわり

- この記事は[JetBrains Advent Calendar 2016](http://qiita.com/advent-calendar/2016/jetbrains)の25日目に飛び入り参加して書いた記事ですが、[第23回【フリースタイル】PORTもくもく会](https://freestyle-mokumoku.connpass.com/event/46093/)のLT枠で発表した際の資料も兼ねています。  
  なのでスライドモードでお送りいたします。
- IDEと直接関係のない話ですみません。でも、IntelliJ IDEA Ultimateは素敵なんで使ってみるといいですよ！

----

# 背景

- IntelliJ IDEA Ultimate買った！ :money_with_wings:
- そしたらなんか重複したコード片を勝手に見つけて教えてくれる！  
  うひょー！すげーっ！リファクタリングしたくなる！！ :smile:
- あ、でもこれJavaとか特定の言語じゃないとダメなのね...。  
  ちょうど手元に重複だらけのシェルスクリプト群があるんだけどなぁ :confused:

----

# ないなら作ろう :triumph:

- 物事を単純化するため、とりあえず行単位で重複を検出する
- 多分アルゴリズム自体はtoken単位でやっても応用可能

----

# アルゴリズム

※特に本などを読まずに適当に考えたため、多分もっといい方法があります。

----

## 概要

1. 対象のファイルの各行がキー、各行の位置情報と「その次の行」を値にした連想配列を組み立てる
    - 対象のファイルの「最初の行」を別途記録しておく
1. 「最初の行」から初めて、連想配列に記録した情報をもとに、各行を読み取っていく

----

## 例

- ファイル(f1)の各行:
    - [A, B, C, D]
- ファイル(f2)の各行:
    - [B, C]

----

### 対象のfの各行がキー、各行の位置情報と「その次の行」を値にした連想配列を組み立てる

一行目の内容: A, B

- A:
    - (f1の1行目, 次の行はB)
- B:
    - (f1の2行目, 次の行はC)
    - (f2の1行目, 次の行はC)
- C:
    - (f1の3行目, 次の行はD)
    - (f2の2行目, 次の行はなし)
- D:
    - (f1の4行目, 次の行はなし)

----

### 「最初の行」から初めて、連想配列に記録した情報をもとに、各行を読み取っていく

例えば、Aから連想配列をたどる場合

1. 最初に連想配列でAを引く
    - 見つけた行の塊: (A, f1の1行目)
    - 次の行はB
1. 次の行Bを連想配列から引く
    - 見つけた行の塊:
        - (A, f1の1行目), (B, f1の2行目)
        - (B, f2の1行目)
    - 次の行はC
1. 次の行Cを連想配列から引く
    - 見つけた行の塊
        - (A, f1の1行目), (B, f1の2行目), (C, f1の3行目)
        - **(B, f1の2行目), (C, f1の3行目)**
        - **(B, f2の1行目), (C, f2の2行目)**
            - :point_up: 内容が重複している塊を見つけた！

----

## 特徴

- 計算時間は対象のファイルの合計行数に対して O(n * log n) （のはず）
    - [使用している連想配列](https://hackage.haskell.org/package/unordered-containers-0.2.7.1/docs/Data-HashMap-Strict.html)の実装の都合上、一行を挿入するのにそれぞれO(log n)かかるので。
    - ありふれたHash Tableベースの実装ならO(n)でいけるはず。
- 少なくとも、各ファイルのペアを1組ずつ比較する方法よりはイケてる。

----

# で、ものはできたの？

できてません (\>\_\<)
絶賛デバッグ中。GHCiのデバッガーを初めて使っているので苦戦してます...。

----

# あとで教えていただいた前例

- [mibk/dupl](https://github.com/mibk/dupl)
    - まだ公開していないとは言え、名前までほぼかぶり :cold_sweat:
    - 現在Go言語専用
    - 「suffix tree」というデータ構造を作るらしい。今回とはちょっと違うアプローチ？

----

# 所感

- めんどい。
- 適度に難しく、それなりに実用性の高い問題に出会えてよかった
  （まだハッピーエンドじゃないけど）
- 当たり前だけど難しい問題を解く時はやっぱり中間構造が大事やね。
- IntelliJがどういうアルゴリズムを使っているかは知りませんが、やっぱりすごい。
curl で、URL encoding したいとき

REST API で、URL の[クエリ文字列](http://e-words.jp/w/%E3%82%AF%E3%82%A8%E3%83%AA%E6%96%87%E5%AD%97%E5%88%97.html)に、JSONを入れたりするとき、URL encoding するの面倒ですよね。それをワンライナーでしたいという話。

例えば、こんな感じで、json が含まれているとします。

```
https://example.com/user?query={"name":"user name"}
```

`query=` 以降は、JSONなので、URL encoding が必要です。

URL encoding には、nkf を使ったり、perlを使ったりいろんな方法がありますが、ここでは、jq を使ってみます。jqが入っていない方は、`brew install jq`/`sudo apt-get install jq`等をして、インストールしてください。（jqのインストール方法は[こちら](https://stedolan.github.io/jq/download/))

```
$ echo '{"name":"user name"}' | jq -s -R -r @uri
%7b%22name%22%3a%22user%20name%22%7d%0a
```

ワンライナーで書くと、以下のようになります。

```
curl -v -H 'Content-Type: application/json' 'https://example.com/user?query='`echo '{"name":"user name"}' | jq -s -R -r @uri`
```
Ant から Gradle を起動する

Gradle はコマンドラインから呼ぶには特に困らないけれども、Eclipse のようなIDEから起動する場合（例えば、Buildship のEclipse Plug-ins for Gradle など）には次のような問題がある。

- 普段は必要としないようなタスクまで一覧に出てきてしまい大変わかりずらい。
- プロジェクトのルートに gradlew と gradlew.bat の２ファイルができる

そこで、むしろ Java IDE では一番サポートがしっかりしている Ant をタスクランナー代わりに使えばいいのではないかという考えに至った。というわけで作ったのが次のスクリプト。

```xml:build.ant
<project name="testapp">

  <target name="jar">
    <gradlew command="jar" />
  </target>

  <macrodef name="gradlew">
    <attribute name="command" />
    <sequential>
      <java classname="org.gradle.wrapper.GradleWrapperMain" fork="true"
        classpath="gradle/wrapper/gradle-wrapper.jar">
        <sysproperty key="org.gradle.appname" value="${basedir}" />
        <arg value="@{command}" />
      </java>
    </sequential>
  </macrodef>
</project>
```

本末転倒な気もしなくはないけど、Ivy の更新も止まっているし、余計な起動ファイルも不要になるのでこれはこれで良いのかも……
WordPressAPIをGoで操作したくてたまらない

最近のキーワードが、公私混同した場合、`WordPress` `Go`なので、このようなお話を。
まだ色々と途中なので、記事の尻切れ感も半端ないです。

## WordPressで行うこと
https://wordpress.org/plugins/rest-api/
コレを導入するのみです。

http://v2.wp-api.org/reference/
ドキュメントは、読んで理解しておく。

## Goで行うこと
APIのドキュメントが割りと揃っていたのでそのまま利用しても良かったのですが、[go-wordpress](https://github.com/sogko/go-wordpress)というパッケージがあったので、利用してみました。

こういうのを色々と読むのは、修行中の身としては大変ありがたい経験です。
必要に迫られてやるので、ただボーッと眺めているよりは身になるようです。

お試しのインポートはこんな感じ。

```sample.go
package main

import (
	"fmt"
	"net/http"
	"os"

	wordpress "github.com/sogko/go-wordpress"
)
```

環境変数でいくつか持っている値を定義しておきます。

```sample.go
type WpEnv struct {
	WordPressBaseURL  string
	WordPressUser     string
	WordPressPassword string
}

var (
	GetWpEnv = func() *WpEnv {
		return &WpEnv{
			WordPressBaseURL:  os.Getenv("WORDPRESS_API_BASE_URL"),,
			WordPressUser:     os.Getenv("WORDPRESS_USER"),
			WordPressPassword: os.Getenv("WORDPRESS_PASSWORD"),
		}
	}
)
```

Clientの取得。

```sample.go
func getClient() *wordpress.Client {

	client := wordpress.NewClient(&wordpress.Options{
		BaseAPIURL: GetWpEnv().WordPressBaseURL,
		Username:   GetWpEnv().WordPressUser,
		Password:   GetWpEnv().WordPressPassword,
	})

	return client
}
```

Taxonomyを取得してみる。

```sample.go
func main() {

	wpc := getClient()
	terms, resp, body, err := wpc.Taxonomies().List(nil)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	if body == nil {
		fmt.Println("body nil")
		return
	}
	if resp.StatusCode != http.StatusOK {
		fmt.Println(resp.Status)
		return
	}
	if terms == nil {
		fmt.Println("terms nil")
		return
	}

	fmt.Println(body)
	fmt.Println(resp)
	fmt.Println(terms)
}
```

ということで接続もできてどうとでもなることが分かった！ので、記事を取得して色々できるようです。
誰でも30分あればできる、2016年の振り返り方

2016年も残り1週間切りましたね。個人的には2016年色々あったので、振り返っておきたいと思っていました。

振り返ろうと思ったときにとっさに思いついたフローなのですが、やってみたら整理できてよかったので、共有してみます。

今年の穢れは今年のうちに。

## 2016年振り返りフロー

### 1. 今年身の回りに起こった出来事を列挙する
今年起こった出来事を箇条書きで洗い出します。
昨年の振り返りのときに、目標がすでに立てた場合は、その目標を並べましょう。
思い出せる範囲で構わいませんが、必要に応じて、手帳やカレンダーも見返してみましょう。

### 2. 項目をいくつかのカテゴリに分類する
項目を洗い出せたら、いくつかのカテゴリに分けてみます。このときわけるカテゴリはなんでもいいです。仕事、スポーツ、趣味など、振り返りたい単位に分けてみましょう。

### 3. カテゴリ毎に振り返りを行う
カテゴリに分けたら、それぞれに対して、以下の項目を洗い出します。    

* 今年何が起こったのか、起こしたのか？
* それは自分にとってどうだったのか？(目標がすでにあった場合はその達成率を検討する)
* この項目はどうあるのが理想なのか？
* 来年はどのようにアクションを起こすのか？
* 来年新しくやりたいことを一つは加えるとしたら？

カテゴリに応じて、そのカテゴリに合わせた内容にできるといいかもしれません。

### 4. 来年の目標を整理し、マイルストーンに落としていく
振り返りを行うと、自動的に今抱えている問題がわかり、来年何をすればいいのか見えてきます。あなたが鋼の意思をお持ちならこれだけで目標に向かって頑張れると思うのですが、私は意思が弱いので、スケジュールに落とします。
スケジュールと言っても、いつ何をする形式では、破綻するのはみなさんも業務上経験があるかと思いますので、マイルストーンにします。人間〆切がないと動かないものです。

例) 資格を取る

8月21日　試験日
8月20日まで　間違ったところの復習終了
8月1日まで　過去問終了
…

## このフローが優れているところ
ファクトベースで振り返るので、目標を立ててない僕のような人でも振り返りができ、来年の目標も立てられます。
来年はその立てた目標に対して、「進捗どうですかー？」ってやるだけですね。

## このフローは何から来ているの？
感のいいエンジニアのみなさまならおわかりかと思いますが、これはプロジェクトの要件定義から仕様に落として、各工数を洗い出している日頃の作業となんら変わりありません。

人が抱えてる問題は下記の3つに分類されると思っており、実際は大したことがないものばかりです。

### 1. すでに頭の中では解決している問題
このフローによって、解決されているということが整理できて、あとはやるだけの状態になります。

### 2. 解決しなきゃいけないが、まだ解が見えていない問題
このフローによって、今の自分では解決できないことが見えるので、調べたり、人に聞くというアクションがとれます。

### 3. 実は解決しなくていい問題
このフローによって、実は悩んでいた問題は、無理矢理解く必要がなかったことに気づき、気にする必要がなくなります。

## ここまで30分程度で終わります
以上です。私自身の振り返りは公開できない情報も含んでいるのでお見せできないのですが、特殊なことは何もしてないので、各々でカスタマイズしてもらえればいいと思います。この振り返り方も毎年アップデートしたいなと思っています。
全体で30分もかからずに終わったので、今年を振り返りたい皆様はぜひ！
Apple Watchで寿司をまわしてGetWildする

この記事は[Wanoグループ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/wano-group)の最終日です。

ちょっと前にうちの会社の上司からApple Watchをお下がりでもらったんですよ。

なのでちょっと[寿司を回して](https://twitter.com/mzp/status/799856396778905600?ref_src=twsrc%5Etfw)みようと。

ついでに[Get Wildも流して](http://qiita.com/oubakiou/items/b9b78b00906415d056b2)みようと。

それでね、クリスマスを迎えて今年を締めればいいじゃない。

https://github.com/bbq-all-stars/GetWildAndSushi

作りました。

# 概要
1. Apple Watchで寿司を表示する。
2. iPhoneのアプリを起動する。
3. Apple Watchに寿司をタップする.
4. 寿司がまわる
5. 同時にiPhoneからYoutubeの音楽が流れる。
6. うれしい

以上。

![getWildAndSushi.gif](https://qiita-image-store.s3.amazonaws.com/0/69711/ca2dd4f9-08af-ef70-935f-f7b8fc4fbacb.gif)

ちなみにGet WildはYoutubeの[これ](https://www.youtube.com/watch?v=LgBxze0ye94)を表示しています。

# ハマった所
## sendMessageがiPhone側で受け取れない
Apple WatchからiPhoneを操作する時に、WCSessionのsendMessageを使うんですよ。
これがなぜか何度やっても動かない。

```
2016-12-25 18:42:49.692848 GetWildAndSushi WatchKit Extension[17803:213358] [WC] -[WCSession _onqueue_notifyOfMessageError:withErrorHandler:] errorHandler: NO with WCErrorCodeDeliveryFailed
```

messageを送るとこんなエラーが出てiPhone側でメッセージを受け取れなかった。

## 原因
最初はこんな感じでApple Watchの送信側を書いてました。

```swift
// open func sendMessage(_ message: [String : Any], replyHandler: (([String : Any]) -> Swift.Void)?, errorHandler: ((Error) -> Swift.Void)? = nil)
WCSession.default().sendMessage(["Get": "Wild"], replyHandler: nil, errorHandler: nil)
```

定義は上のコメントの通り。
最初のDictionaryはiPhone側に送るデータ。
replyHandlerは、iPhone側でメッセージを受け取った時に、任意のタイミングで実行するコールバック関数。
errorHandlerはエラー時に呼ばれるコールバック関数を渡す。

ここで定義だとreplyHandlerはoptionalなので、適当にnilを渡してたのだが、これがいけなかったらしい。
以下のように適当な関数を渡したらいけた。

```swift
WCSession.default().sendMessage(["Get": "Wild"], replyHandler: {_ in}, errorHandler: nil)
```

なんで定義がoptionalやねん(´・ω・｀)

# というわけでみんなも寿司を回すと良いよ

Happy Merry Christmas!!!!🎉
Runtime Permission とは別の特別なパーミッションたちとその扱い方

# 特別なパーミッションとは

Android にはパーミッションと呼ばれる仕組みによって、アプリがユーザの許可無くプライベートなデータやセンサ類などにアクセスできないようになっています。Lollipop まではストアでのインストールと同時に許可を与えるフローでしたが、Marshmallow 以後は Runtime Permission という仕組みが導入され、アプリを起動してからユーザに許可を求めるフローへと変わりました。

さてこの記事では、その Runtime Permission のフローとは更に別なフローを経なければ許可ができない特別なパーミッションについてまとめます。この特別なパーミッションに対する許可を得るには、ユーザを然るべき画面へ遷移させ、システムの設定画面をつかった許可フローへナビゲートする必要があります。Runtime Permission ではダイアログが表示されましたが、こちらは別画面(システムの設定画面)でのフローです。

# 他のアプリに重ねて表示

英語の設定画面では"Draw over other apps"と表示されます。その名の通り、View を他のアプリに重ねて表示できるようにします（Facebook Messenger のチャットヘッドのようなもの）。パーミッションの名前は`android.permission.SYSTEM_ALERT_WINDOW`です。AndroidManifest.xml に`<uses-permission>`を記述して、かつ`android.settings.action.MANAGE_OVERLAY_PERMISSION`を Action とする画面でユーザが明示的に許可を与える必要があります（targetApi が 23 以後の場合）。許可があるかどうかは、`Settings#canDrawOverlays(Context)`で確認ができます。

# システム設定の変更

英語の設定画面では"Modify system settings"と表示されます。アプリから直接デバイスの設定を変更するためのパーミッションです。`android.permission.WRITE_SETTINGS`を`<uses-permission>`に記述し、`android.settings.action.MANAGE_WRITE_SETTINGS`を Action とする画面で許可を得る必要があります(targetApi が 23 以後の場合)。

# 通知へのアクセス

英語の設定画面では"Notification Access"と表示されます。ステータスバーに表示されている通知の追加や更新、削除といったイベントをトリガーにして、通知の内容を読むことができます。
システムはアプリに対して、通知へのアクセスのためのサービスへバインドしてくるので、AndroidManifest.xml では`<service>`の`android:permission`に`android.permission.BIND_NOTIFICATION_LISTENER_SERVICE`を記述します。また、実行時に`android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS`を Action とする画面でユーザが明示的に許可を与える必要があります。

# 使用状況へのアクセス

英語の設定画面では"Usage Access"と表示されます。`<uses-permission>`に`android.permission.PACKAGE_USAGE_STATS`と記述しますが、許可を得るには`android.settings.USAGE_ACCESS_SETTINGS`を Action とする画面での許可が必要です。ただしこの Action に対応する画面がないデバイスもあるため、画面遷移の前に確認が必要です。

# アクセシビリティ

アクセシビリティサービスのためのパーミッションです。通知へのアクセス同様、システムがアプリに対してサービスへのバインドを行うため、`<services>`の`andorid:permission`に`android.permission.BIND_ACCESSIBILITY_SERVICE`を設定します。また実行時に`android.settings.ACCESSIBILITY_SETTINGS`を Action とする画面で許可を与えるフローを経る必要があります。ただしこの Action に対応する画面があるかどうかはデバイス依存です。

# おわりに

これらのパーミッションが必要な場面はそう多くはないでしょう。しかし、これらのパーミッションの許可を要求するとき、アプリのなかでのフローをどう作るかが問題となります。基本的にはどのパーミッションでもデバイスの設定画面を開いてあげる必要があり、かつ何やら恐ろしげなダイアログを見た上で許可スイッチを ON にしなければなりません。一方で、許可があればそれだけユーザのプライバシーが読み取れてしまったり、デバイス上の体験を劇的に変えることができるというリスクがあるため致し方ない措置ではありますが、Runtime Permission とは別の特別な画面遷移を作る必要が有ることに留意しましょう。
組込みプログラミング > 通信の応答と内部処理

記事執筆の皆様、お疲れ様です。

組込み関連で思いついたものを投稿します。

## 振る舞い

UART通信(通信速度は9600bpsとしましょう)にて、`<CR><LF>`を終端とする30文字ほどの文字列(カンマで区切られた数値が続く)を受けた時に応答するマイコンがあるとします。
そのようなマイコンに以下の手順で文字列を送るとしましょう。

1. ターミナルソフト(例:TeraTerm)を立ち上げる
   - 送信設定にて`<CR><LF>`を終端文字列として送るようにしておく
2. コマンドをぽちぽち入力していく
3. Enter (`<CR><LF>`送信)

処理結果として以下の2種類があるかもしれません。

- ケースA: 応答を返す
  - 文字列読取り成功している
- ケースB: 応答を返さない
  - 文字列読取り失敗している

一方で、上記手順2において「30文字を一気に送信」すると、ケースA・ケースBともに「文字列読取り成功」になるとします。

上記2つのケースは何が異なるのでしょうか?

## マイコン側のプログラム

マイコン側では「30文字」ほどの文字列を受信することになります。

マイコンで2KBのメモリしか残っていない場合、メモリ使用は極力減らしたいものです。(残りのメモリでデータ処理などするかもしれない。将来の機能追加があるかもしれない。デバッグ用に残しておきたい、などの理由です)

さて、マイコンで30文字の文字列を受信する場合、その30文字はどこにどう確保するのか、という疑問が出てきます。

### 関数の中の変数にする案

```c
void processCommand()
{
    char rcvCmd[40]; // 30文字以上受けるため
　　
    /* 受信処理 */
    /* 受信データに基づく処理 */     
}
```

この場合、メモリ領域としては「スタック領域」を消費します。
参考 https://www.uquest.co.jp/embedded/learning/lecture16.html

`processCommand()`が、あるタスクから使用されている場合、タスク用に割り当てたメモリ領域を消費します。
例として120バイトのタスク用メモリ割り当ての時に30バイトを使うとなると、タスクの他の処理でメモリ使用がしんどくなりますね。
そして、タスク内のメモリ使用を失敗すると、[途中で動作しなくなるというような状況に遭遇するかもしれません](http://qiita.com/7of9/items/b3b87c87836fd6730b68)。

### staticをつける案

「関数の中の変数にする案」ではなく、staticをつけるとどうなるでしょうか。

```
static char rcvCmd[40]; // 30文字以上受けるため
```

この場合、rcvCmdは「静的領域」に確保されます。

参考 http://oresi.hatenablog.com/entry/2014/04/24/133315

「静的領域」に確保した場合、「タスク用メモリを使用しなくなる」という利点があります。

タスク用メモリ割り当て時は関数を抜けた時点でメモリが解放されるという利点がありますが、静的領域の場合はメモリ解放がありません。

静的領域をたくさん使うと、それはそれでメモリ使用方法はよくないかもしれません。
解放されないメモリをメモリプール (もしくは[メモリパラシュート?](http://qiita.com/7of9/items/9c84422bdf007bd868b2))として確保して、複数から使用する、という方法もありますが、設計時には検討事項が増えていきます。

### メモリを30文字分確保しない案

上の2つの場合とは違う方法として、メモリを30文字分確保しない場合があります。

`3.14,1.59,2.65,3.58,9.793,2.38,4.626,2.718,6.022,...,1.023<CR><LF>` (...は省略記号)
というような文字列が到達する時、**全部の文字列を受けてから処理するのではなく**、**カンマで区切られた数値ごとに処理をする**、という方法です。

この場合、項目ごとの文字数は4文字(例: `3.14`)程度になるため、「関数の中の変数にする案」と同じで4+α程度のchar型配列用メモリを確保すれば良くなります。4+α程度なら、タスク割り当てのメモリの消費としては良いかもしれません。

一方で、このような実装の場合、**終端までの文字列読込みを如何に実装するか**という検討事項が出てきます。
その方法としては以下などがあります。

- 方法1
  - 指定の時間内に連続して送信された文字列だけを受信する (例: 10msec以内の連続性)
      - 途中で文字列が途切れた時に処理を抜けることになる
- 方法2
  - 終端文字列が送られるまで受信待ちする
- 方法3
  - 前回受信した位置を保持しておき、続きの文字列を受信した時に続きの処理を行う

方法1は実装が簡単です。タイムアウト処理で抜けるだけですね。
方法2は「ポーリング」という状態になります。マイコンでの処理としては無駄が多いかと思います。
方法3は、前回受信した位置情報の保持、その初期化処理など複雑になります。

さて、冒頭の話に戻りましょう。

> コマンドをぽちぽち入力していく

コマンドをぽちぽち入力した場合、それぞれの文字の入力間隔は何msecくらいでしょうか?
おそらく10msecよりも速くはないでしょう。
(2週間前に見た映画「タイピスト！(2012)POPULAIRE」(監督: Rgis Roinsard) では、当時の世界記録保持者でも1分間に500文字程度。1文字が120msec程度ですね)

上の方法1での実装の場合には、「送信の連続性」が担保されずに「ケースB: 応答を返さない」ということになります。

> 一方で、上記手順2において「30文字を一気に送信」すると、ケースA・ケースBともに「文字列読取り成功」になるとします。

こちらの場合は、文字間の送信間隔は10msec以内になるため、方法1でも問題がなく、ケースA・ケースBともに「文字列読取り成功」ということになります。

### おわりに

ある通信仕様の装置があるとします。
その取説にコマンドが掲載されていて、手入力でコマンドを送信しても応答がない場合、今回の記事の「方法１」のような実装かもしれません。

そういう場合は、テキストファイルにコマンドを用意して「一気に送信する」という方法が有効かもしれません。

一方で、組込みプログラミング作成者の立場では、(10msec以内で)コマンドが連続して送られない場合も考慮する必要がある時は設計段階でそれを意識して設計し、コーディングしましょう。

なお、この記事で書いた方法以外でメモリ使用を少なく、送信の連続性も必要ない実装方法がありましたら、ご教授お願いいたします。
T君のPCのSSDが壊れた。　もしくはSSDにおけるトラブルと解決策について

Stylez Advent Calendar 2016 - Qiita
http://qiita.com/advent-calendar/2016/stylez
の16日目です。

# 1. ポップアップ
それは、首都圏では珍しく雪が降った11月から2週間ぐらい経ったころだろうか、T君のSlackアカウントから
「私事で、どうでも良い報告ですが、昨日Cドライブが飛んじゃって、メールすら見れない状況です。。」
という実にのんきなそして切実なメッセージが流れてきた。

その時、私は休みをもらっていて自宅でPCに向かっていた。別にすることもないので何気なくネットサーフィンをしていたときのことだった。SlackはPCを起動したら自動的に立ち上がり、見る必要もないのにいらないメッセージを送りつけてきた。

ポップアップしたメッセージの内容がよく読み取れなかった私は、ついそのメッセージの内容を確認しようとメッセージをクリックしてしまったのだった。

# 2. 逡巡

先日、その前にK君のPCが起動してもUEFIの画面から進まなくなるという事件が発生し、「なにか悪いことでも起こっているのでは？」と意識がPCの周りを一周して戻ってきた。

「いや、そうか。」
「そうじゃないか。」
「でも、そうだったよな。」

Aだっけ、Bだっけ。という意見が頭の中で議論を始め、私は意見達の間に入って「まあ、まてまて、そうと決まったわけじゃない。まだなんとかなるかもしれない。」と議論達をひとまず押さえることに成功した。

# 3. 対策(もしくは悪あがき)

Slackを開いてメッセージをメンション付きでT君に打った。
それは、よくある対策の一つでHDDが壊れたときに真っ先に実行する恒例の作業といってもよい対応だった。

もしかしたら、データだけでも取り出せれれば。そういう淡い期待があったというのは嘘ではない。

K君のPCの時には、結局そのハードウェアトラブルは、WindowsのブートCDからブートしようとしたら解消してしまった。一旦電源を抜いたのでUEFIの情報がリセットされたのかもしれない。

T君には、自分の机の中にWindows7のインストールメディアとKNOPPIXのDVDが入っていることを伝え、それを使ってSSDを読み出すことをお勧めした。

しかし、T君もさまざまなトラブルを乗り越えてきた男だ。そんなことは当に試していた。
「いや、外付けに付けてみたけど反応しないんです。Dドライブは生きてる。」

俺は天を仰いだ。
「やっぱりそうだったか...。」

諦めとも、怒りともつかない感情がわき起こってくる。
それと同時にもう少しなんとかならないかと必死に対応方法を考えていた。。

# 4. 回想

T君はPCのヘビーユーザーだ。とてもハードにPCを使う。
一回、EclipseとFirefoxとPHPStormが同時に動いているのを見た時には驚いた。その2年前、PCが遅くて困っていた彼にたまたま余った256GBのSSDを渡した。
その当時は、まだSSDが昨今ほど安くなっておらず、256GBのSSDは結構な高嶺の花だった。

当時のSSDには、2つのグレードが存在していた。
古くからSSDを専業として開発してきたメーカー。もう一つは、その頃からはやり始めたSSDに乗っかってSSDを開発し始めたメーカーだ。

T君に渡したSSDは、A社のメーカーのものだった。これは、その当時、後者のグレードに属していた。
その時、PCを複数台用意する必要があり、全台に高価なSSDを購入することができなかった。その為、安価なSSDを選ぶしかなかったのだ。

# 5. コントローラー

SSDは、ハードディスクのように円盤ではなくNANDというメモリーチップを複数あつめて作られている。
それら複数のチップは、容量の限界が有り、1つのチップで数GBまでしかデータを記録することはできない。その為、256GBなどの容量を用意するにはそれらの複数のチップを束ねている。複数のチップのどこに情報を書き込むか制御する物が必要になる。それをコントローラーといって、各社が開発にしのぎを削っている。

以前は、複数のコントローラーのメーカーがあったが現在では、J-Micronというメーカーがほぼ一社独占状態だ。

# 6.ファームウェアと突然死

私は、結構なSSDヘビーユーザーだ。Windows 7の頃からSSDを使っているから、2009年からになるだろうか。P社や、I社、C社、T社のSSDを購入しては使ってきた。実は、SSDの突然死を経験していないわけではない。

SSDの突然死の原因は明確にはなっていない。

コントローラーの項で述べた「メモリーチップ」が壊れた場合は、通常コントローラーが保護することになっている(そうではないコントローラーもあるようだが)。チップは複数搭載可能だから、データが紛失しないようにコントローラーで制御する事も可能だ。現在のSSDは既定の容量よりも多くメモリーチップを搭載することによってチップの破損する前にデータを保護する機能が付いている。

しかし、SSDにコントローラーは一つしかつんでいない。つまり、コントローラーが壊れてしまった場合、もしくはコントローラーに不具合があった場合まったく動かなくなるということになる。恐らくはこのコントローラーの問題によるものが多いのではないだろうか。

私が経験した突然死したSSDはT社の物だったが、たまたま新しいSSDにデータを移行した後に読み込めなくなったので問題にならなかった。

実は、A社のSSDは別のPCにも導入していて不具合が発生して交換していた。
しかし、T君に渡したSSDはA社のSSDの中でも高価なものだったので、そういう問題は発生しないかと思っていた。実際A社の不具合が発生してた他のSSDよりも1年以上問題なく動いている。

# 7. マーフィーの法則(バックアップ)  

『バックアップを取っていないときに、ハードディスク(記録媒体)は破損する。』


HDDもSSDも壊れるときには壊れる。その為に対応できる方法は、バックアップを取っておくことだ。しかし、壊れる時にこそバックアップがなかったりする。私は某社の容量無制限バックアップサービスを利用している。T君は、DドライブがHDDだったのである程度データは残っていたようだが。全部のデータが残っていたわけではなかった。

# 8. 宣告、沈痛、諦め

「ダメかもな。」
私は SlackでT君にメッセージを送った。

T君からは、
「もう諦めてます...」
と沈痛な返事が返ってきた。

彼には、ちゃんとしたSSDを薦めて買ってもらうことにしよう。

# 9. お断り

この話はフィクションです。
SpreadsheetでSEO施策の実装確認ツールを作る

## SEOの実装確認は大変
SEO施策の実装確認はなかなか骨の折れる作業です。  
なぜ大変かというと、

- 1ページあたりの確認量が多い
- 確認対象のページ数が多い。
の二重苦があるからです。

筆者も昔は目視で大量のURLのSEO実装状況の確認をしていたので、
非常に大変でした。  

## よくある確認方法 
確認対象となるURLをクリップボードにコピー
↓
ブラウザ上で[Pasty](https://chrome.google.com/webstore/detail/pasty/hdjihnnclpjhfdbbinmgoiehhoehhlgf?hl=ja)を使用し、各タブに展開する。
↓
各タブで[META SEO inspector](https://chrome.google.com/webstore/detail/meta-seo-inspector/ibkclpciafdglkjkcibmohobjkcfkaef)を使って確認する。  
  
とかではないでしょうか。
筆者は昔この方法で確認していました。

## 今回紹介する方法
GoogleSpreadsheetを用いて
簡単にSEO施策の実装確認ができるツールを作りたいと思います。  

ポイントは大きく2つです。

- IMPORTXML関数
- XPath指定


## IMPORTXML関数
XML、HTML、CSVからデータをインポートする関数です。

`=importxml("$取得したいURL$”,"//$xpath$")`
というように記載をします。

今回はSpreadsheetのセルにURLを入力し、
そのセルを指定する形にしたいので、
`=importxml($取得したいURLが書かれたセル$,"//$xpath$")`
という形で記載をします。

※IMPORTXMLについての詳細は[こちら](https://support.google.com/docs/answer/3093342?hl=ja)

## XPathを指定する
SEO上頻繁に施策を行う(=頻繁に確認対象となる)HTML要素については、
以前に筆者が下記の記事にまとめたので、
こちらを参照してください。
http://qiita.com/cultiva_k/items/6fd6bc8c618ff3706519

## アウトプット
これらを組み合わせると、
下記のようなスプレッドシートが作成できます。

該当のHTML要素が存在する場合には、
その内容を取得してくれます。

一方で、該当の要素が存在しない場合には、`N/A`が返されます。  

## 参考記事
http://qiita.com/ktmg/items/d53440c913e20f8bb34c
C++ Builder XE4, 10.2 Tokyo > TeeChart > 設定画面にて散布図のマーク色を変更する

```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/10)
    TeeChart v2016.17.160129 32bit VCL
```

TeeChartにて散布図を作ろうとしていた。
プロットの点の色を標準で用意された色から変更しようとしたが、どこで設定するか探すのに苦労していた。
(TeeChartの設定変更は毎回苦労する)。

Marksのタブ11個の中身(各10個程度ある)を見てもいまいち分からない。

以下の矢印で示された部分をクリックすると色選択ダイアログが出てきて変更できるようだ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0204cad8-5612-82c7-0379-102058f4d4c5.png)

これに気づくまで15分かかった。

google検索しても変更方法の情報にはなかなかたどり着けなく、適当に触っていてやっと見つけた。

UIとしてはあまり良くないように思う。

このあたりのマニュアルを読んでもいまいち分からなかった。
http://www.teechart.net/docs/teechart/vclfmx/tutorials/UserGuide/html/manu45id.htm
SEO上で重要なHTML要素のXPathのまとめ

## これは何？
SEO上で重要なHTML要素のXPathを並べました。

## どんな時に使うの？
SEO施策の実装確認を効率化するために簡易クローラーを運用するような時に使うかと思います。

- rubyのクローラーで指定する時
http://himaratsu.hatenablog.com/entry/2013/04/27/002249

- GoogleSpreadSheetのIMPORTXMLを使う時
http://qiita.com/ktmg/items/d53440c913e20f8bb34c

## 一覧
（※対象のページのHTMLの構成によってはこの限りではないです）

### titleタグ  
`//title`

### meta description  
`//meta[@name='description']/@content`

### alternate (主にhref langを想定)  
`/html/head/link[@rel='alternate']/@href`

### canonical  
`/html/head/link[@rel='canonical']/@href`

### robots(主にnoindexを想定)  
`//meta[@name='robots']/@content`

### prev  
`/html/head/link[@rel='prev']/@href`

### next  
`/html/head/link[@rel='next']/@href`
React NativeでCommand /bin/sh failed with exit code 1エラー

シュミレーターで実行時は起きないが、実機で実行する時に起きる"Command /bin/sh failed with exit code 1"エラーの解決方法。


![SS 2016-12-25 at 18.58.06.png](https://qiita-image-store.s3.amazonaws.com/0/54825/a3336662-f2ae-c844-964d-26ffffa81854.png)

Build-Phases -> Bundle React Native code and Images
Run script only when installing.にチェックを入れて再度ビルド
LittleBitsの思い出話


ポエムです。

# TEDで初めて存在を知る
名前こそ初めは覚えてなかったものの、LittleBitsのことを初めてしっったのはTEDのトークからでした。
ArduinoやRaspberry Piなどに興味を持ち出してたので教育用でこんなガジェットがあるんだなーくらいの記憶でした。

アヤ・ブデール 「光って、鳴って、楽しく学べるブロック」
https://www.ted.com/talks/ayah_bdeir_building_blocks_that_blink_beep_and_teach?language=ja


# 初購入と...
Maker Faire Tokyo 2015で発売されるEdisonを買いに行ったんだと思いますが、
たまたその場にLittleBitsのブースがあり、結果的に購入に至りました。
当時MESHとLittleBitsのどちらに手を出すか非常に迷っていたのを覚えています。
最終的にはビットの種類などから幅がありそうなLittleBitsを選びました。
確かDELUXE KIT(25,000円くらい)を購入したと思います。
![11695951_885007838232130_3541880195967137691_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/11776/054131fd-8cde-c36e-4220-4791714adf08.jpeg "11695951_885007838232130_3541880195967137691_n.jpg")
![11817175_885007591565488_8235428305280361824_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/11776/4afbc048-b78f-ab42-a422-ea7498aa5fd6.jpeg "11817175_885007591565488_8235428305280361824_n.jpg")

しかし持って帰って実際触ってみようと思ったところ、
無いんですよね...、電源モジュールが💢

問い合わせてみるとなんでも展示で使ってた箱と間違って
渡していたとのこと。買ったガジェットをすぐ試せなかったのは辛いですね、
一番肝心の電源モジュールが無いってのが泣けました。
即座に本家サイトから電源モジュール注文したのを覚えてます。
その後Kit自体は交換対応してもらって最終的には全て揃ったわけですが
LittltBitsに関して一番印象深い思い出になってしまいました。

# 試作したり
LittleBitsは教育用のツールではありますが、
プロトタイピングのツールとして非常に優秀なツールでもあります。

例えば以下の写真は自宅の玄関に音で作動するライトを設置したいなと思った際に作ったものです。
LEDをどのようなセンサをトリガにして光らせるべきか、
またどの程度の時間光らせるべきか、それには何を使えば実現できるか？
LittleBitsはこれを手元にあるbitを組み合わせてパパッと創作することができました。
所要時間は10~20分程度だったと思います、
特に電子回路に詳しくなくとも手早くTry&Errorを繰り返す事ができました。
まず動くものが作れ、後からその原理を理解することが出来る。というのは面白いですね。
![11825879_888175637915350_8091370159994687995_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/11776/07e957be-c21f-a6bb-3c7a-c12a2dc8c61d.jpeg "11825879_888175637915350_8091370159994687995_n.jpg")

# CloudBit
今年のLittleBitsカレンダーでも触れてる方が多かったので詳しくは語りませんが。
CloudBitsはLittleBitsをネットワークに接続できるようになり、
一気に利用の幅が広がります。私自身これにかなり期待をしていました。
今思えばお家ハックなどの活動に興味を持ち出したのもこの記事の影響があるのかもしれません。

ちなみに残念ながらCloudBitは技適通ってないので日本では使えません。
当然日本の代理店にも置いてなく、手に入れるには本家サイトから購入する必要があります。
CloudBit自身高めなのと、送料も入るのでなかなかのコストになります。

ご利用の際はご自宅や最寄りの電波暗室でのみお試しください。

cloudbit製品ページ
http://jp.littlebits.com/kits/cloudbit-starter-kit/

cloudBitとIFTTTで「おとうさんいまどこメーター」を作る
http://qiita.com/kazunori279/items/7dbbb525ab0cf6d5d9b5


# CocoaBit
すでにアドベントカレンダーでも触れらている
技適通ったモジュールが使われており、
ご家庭でも安心してご利用いただけますね！
http://qiita.com/tseigo/items/30a7bc79cf2d4210639e

残念ながらまだ発売はしてない状況ですが、もう間近に迫ってる状況のようです。
発売が開始されれば私は間違いなく購入するでしょう。

# お布施的購入
ちなみにCloudBitが発売されるのではと期待しつつ待ってた間に買ったお布施的bitたちを洗い出してみました。単品のbitはもう覚えてない...。

- DELUXE KIT ￥25,920
- PREMIUM KIT￥19,980
- SYNTH KIT  ￥19,980
- その他単品のbit諸々 ￥20,000くらいはいったはず...

oh...こうしてみると散財以外何者でも無いですね。(CloudBitは結局発売される見込みがないままですし)


# まとめ
LittleBitsはそろそろ日本でもWifiやBLEで無線で接続することが出来るようになってきました。これから更に盛り上がってくれるツールになるのではないでしょうか？
BLEの方はiOSとの連携もできると思うので、今後その辺も調べていけたらなと思います。
Opalの日本のコミュニティを作りたい！

この記事は[Opal Advent Calendar 2016](http://qiita.com/advent-calendar/2016/opal)の25日目の投稿として書いています。

メリークリスマス！
ついに最終日になりました。何度かてっぺんを回ってしまったこともあったけど何とかこのアドベントカレンダーをやりきることができました。
当初はもしやこれは一人で全記事書くのか?!という懸念がありましたが、[yharaさん](http://yhara.jp/)が参戦してくださって大分助かりました。この場を借りてお礼いたします。ありがとうございました。

さて、昨今の流行に乗ってアドベントカレンダーというのをやってみたのですが、これには意図があります。それは、表題のとおりOpalの日本のコミュニティを作りたいなって思ったからです。
Qiitaでアドベントカレンダーをやれば、日本のOpalに関心のある開発者に注目してもらえる、あわよくば記事を書いてくれる人が表れると思ってやってみました。
この目論みは半分くらいは達成できた気がしますが、半分くらいは目論み通りにいかなかったなーという感じです。
なんといっても、yharaさんが3分の1くらいの記事を書いてくれたのは期待以上の出来事でした。しかし、他に記事を書くひとが集らなかったこと、このアドベントカレンダー自体があまり注目を集められなかったという点では残念な結果でした。
とは言え、ここに書いてきた記事は残りつづけますし、これからOpalを入門したいという人に役に立ってもらえたらうれしいと思います。

さて表題の件ですが、コミュニティの目指す姿について書こうと思います。

1日目に書いた[Opalのすすめ](http://qiita.com/youchan@github/items/8441dcc6112335d68b76)という記事でも書いたとおり、Opalは魅力的なプログラミング環境ですが、まだまだ実用的に使おうと思うと足りないものが多すぎます。
今回のアドベントカレンダーではgemを作ってみたり、実際にコードを書いて動かすということを重視して書いていきました。それはOpalが足りないものが多いけど、そのポテンシャルは高く自分たちでコードを書いて足りない部分を補っていくことが出来るということを示したかったからです。

10年くらい前のRailsだって、こんな感じでRailsに可能性を持った人達で集まってRails東京勉強会をやったり、Railsはプロダクションにはまだ採用できないよねなんて言われていたころからRailsを触っている人達がいました。
そういう人達がいたからこそRailsはどんどん発展して今のようなWebアプリケーション開発の第一線で使われるようなフレームワークになりました。(残念ながらRails自体の発展に直接寄与した日本人はとても少ないようですが…)
また、Ruby自体もまたRailsに牽引されるように注目される言語として発展していきました。OpalにもRailsのようなキラーアプリケーションがあればという思いもあって、私は[Hyalite]()や[Menilite]()といったフレームワークを作っています。

いまOpalが開発者の力を必要としているときに、日本人がもっとそこに参加していって活躍できたらいいなと思い、そのようなコミュニティを作りたいなと思っています。(実は日本人にこだわる必要はまったくないのですが、Rubyの日本人の関わりを思うと日本人の手でという思いはどうしても出てきてしまいます。)

そういうわけで、Opalに興味のある方。Opalでなにか開発したいという方。gemなどを作ってOpalのエコシステムを作っていきたい方あるいはOpal自体の開発に参加したいという方。などなど、まずはslackのドメインを作ったので参加してもらえるとうれしいです。

https://opalrb-jp-slack.herokuapp.com/