OmniAICreator/Qiita-1.07M huggingface dataset:
sympyでsqrt(x**2)をxと計算する方法

(参考)Wolfram|Alpha: Computational Knowledge Engine
http://www.wolframalpha.com/input/?i=sqrt(x%5E2)
Alternate form assuming x is positive:x

sympyでsqrt(x**2)をxと計算する方法について、
級数以外にありますか？よろしくお願いします。


```python
from sympy import *
var('x')
print("#series(sqrt(x**2))   : ",series(sqrt(x**2)))
print("#simplify(sqrt(x**2)) : ",simplify(sqrt(x**2)))
print("#expand(sqrt(x**2))   : ",expand(sqrt(x**2)))
#series(sqrt(x**2))   :  x
#simplify(sqrt(x**2)) :  sqrt(x**2)
#expand(sqrt(x**2))   :  sqrt(x**2)
```
－－－－－－－－－－－－－－
【補足】(2018/01/18)
Sympyでsqrt(a**2)をaと表示する方法（a>0）
https://qiita.com/aomidro/items/e6d90e25549eb74c5ca5

－－－－－－－－－－－－－－
【補足】(2018/07/14)
symbolic computing in Python>Main article text>Assumptions
https://peerj.com/articles/cs-103/
オリジナル配列の自作キーボードを作った

入力デバイス好きが高じてとうとうキーボードを自作してしまったので記事にします。

今回作ったのはゲーム用途の左手用の物ですが
別の用途の自作デバイスを作りたい人なども参考になるかもしれません。
![IMG_0188.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/9191675e-50d3-6ea7-02ed-36ac6fdd20cf.jpeg)
コンセプトは親指で押せるキーを多めに、右上の丸いのは音量調整ですなんとなく付けてみました。
![IMG_0235.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/278c5872-f45d-8b66-e9e3-ccae9a724022.jpeg)
micro USB接続です。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/21846/2b791a4a-9029-aea0-61ba-d8f022de804b.png)
ガワはFusion360で設計してDMM makeの3Dプリンタで注文しました。
![IMG_0191.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/8081cd80-b2c2-ce5f-97f9-43f2d0980940.jpeg)

![IMG_0176.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/3fdfcb0f-db60-29f7-1a86-1dac0f0f69d1.jpeg)
teensyにはネジ穴が無いのではめ込む用の溝の設置、ついでに外にUSBポートも出す。さすが3Dプリンタの自由度。
![IMG_0178.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/68fa5d7d-464a-a6a0-06b9-32d030e608cd.jpeg)

![IMG_0194.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/f611fe6d-b9fe-0a6b-b9b8-e221bd108c36.jpeg)

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/21846/9642107d-bfe4-a4b0-eb9c-2b76f324fc2d.png)
[cherry mx breakout](https://www.sparkfun.com/products/13773)を見ていいなと思いましたが（小並感）価格的に高かったのでpcbも制作することにしました。KiCadで設計しスイッチサイエンスPCBで注文、価格の抑えられる10cm x 10cmの寸法で25個取れるように面付しました。
![IMG_0237.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/0f1b1d20-ad71-5751-61ca-e005c9c2731f.jpeg)

![IMG_0214.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/a67227b4-e72c-ed5f-1628-b71504e0e753.jpeg)
はんだ付けの難易度を下げるためダイオードはチップ型ではなくリード線タイプで設計、ＬＥＤとかそれ用の抵抗は無し、ブレッドボードとの互換性もありません。
![IMG_0216.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/22d1ee14-dc04-1c57-8ae3-8ba4c83eaf43.jpeg)
たくさん作ります。
![IMG_0200.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/8c2125c1-fbc7-2f9a-c444-774ed30feb59.jpeg)
ガワにスイッチをはめ込んで。
![IMG_0217.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/47325ef0-e3ae-7ed5-2919-831068c06d4d.jpeg)
はんだ付け！
![IMG_0219.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/74217402-8b87-8e54-26cc-8b7793ecfbd9.jpeg)
基盤と基盤の間を接続するやつの制作　スズメッキ線を折り曲げてカット、けっこうたくさん必要。
![IMG_0221.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/e5836f80-d43b-7b6f-5298-59840b427d71.jpeg)
基盤間を接続。
![IMG_0225.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/6989051c-2969-97f4-0e4b-31ff457281dd.jpeg)
基盤間の接続は大体完了、自作キーボードでよく見るスイッチのピンとダイオードを空中配線するのに比べたらたぶん難易度は低いんじゃないかと思います（やったことないから本当の所はわかりません）、ただめんどくささはありますね。
![IMG_0226.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/86c088e0-49d4-1525-f00b-899f9d9eae57.jpeg)

![IMG_0228.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/3719b81a-e510-7bbd-420f-5bca4cfd6237.jpeg)

![IMG_0231.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/f259227d-38e0-bb0d-2103-21e11c2d828b.jpeg)

![IMG_0233.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/e906a4a8-8bc2-4053-92ed-bd10555aada6.jpeg)

![IMG_0234.JPG](https://qiita-image-store.s3.amazonaws.com/0/21846/627b2f0a-49e7-e996-93b1-f7d7ea94ec40.jpeg)


とりあえず写真、UPコメントやソースは後で追記していきます。
SierraにRmagickを入れる方法

## gem install rmagickでエラーが出る

rmagickをインストールしようとすると以下のようなエラーが出ました。

```
checking for clang... yes
checking for Magick-config... no
checking for pkg-config... yes
checking for outdated ImageMagick version (<= 6.4.9)... no
checking for presence of MagickWand API (ImageMagick version >= 6.9.0)... no
checking for Ruby version >= 1.8.5... yes
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... no

Can't install RMagick 2.16.0. Can't find MagickWand.h.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
```

どうやら最新のhomebrewではImageMagickの新しいバージョンが入ってしまうためにインストールができないようです。

ですので、ImageMagick6系をインストールします。

```
$ brew install imagemagick@6
$ brew link --force imagemagick@6
$ echo 'export PATH="/usr/local/opt/imagemagick@6/bin:$PATH"' >> ~/.bash_profile
$ bundle install
```

問題無くRmagickがインストールできました。
sympyでヘロンの公式の証明をさがしています

sympyでヘロンの公式の証明をさがしています
よろしくお願いします。


https://gist.github.com/wootfish/74114158a367cfd8356b
# 参考 ヘロンの公式の証明と使用例

http://mathtrain.jp/heron


~~(参考)三角形の公式いろいろ:竹俣紅公式ブログ＞平成26年度裁判所事務官試験NO.16~~
~~http://lineblog.me/takematabeni/_/embed_simple/32103442/49578806~~

```python
#実行時間は、2分ぐらいかかります
from sympy import *
a=17
b=sqrt(173)
c=sqrt(40)
s=(a+b+c)/2
A=sqrt(s*(s-a)*(s-b)*(s-c))
print("#float(A)=",float(A))
#--------------------------------------------------------------------
var('x y xm1 ym1 r1 xm2 ym2 r2')
f = (x-xm1)**2 + (y-ym1)**2 - r1**2
g = (x-xm2)**2 + (y-ym2)**2 - r2**2
result=solve([f, g], [x, y])
# print("#result[0][0]",result[0][0])
# print("#result[0][1]",result[0][1])
# print("#result[1][0]",result[1][0])
# print("#result[1][1]",result[1][1])
var('AB BC CA')
AB=17
BC=sqrt(173)
CA=sqrt(40)
h=sympify(result[0]).subs({xm1:0,ym1:0,r1:CA,xm2:AB,ym2:0,r2:BC})[1]
A=1/2*AB*h
print("#float(A)=",float(A))
#float(A)= 37.0
```

# 入試問題

https://ameblo.jp/mathisii/entry-12766414098.html

2013〜20年度　京都教育大学  2013〜2022年度の問題は未入手

https://mathexamtest.web.fc2.com/daigakubetumj/10545index.html#y2013






# 参考

http://qiita.com/mrrclb48z/items/fca16b65c9186954fedc

http://qiita.com/lion/items/15f102e1f5e39ff3e40d

https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%A9%E3%83%BC%E3%83%9E%E3%82%B0%E3%83%97%E3%82%BF%E3%81%AE%E5%85%AC%E5%BC%8F

https://en.wikipedia.org/wiki/Brahmagupta%27s_formula

https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AC%E3%83%BC%E3%83%88%E3%82%B7%E3%83%A5%E3%83%8A%E3%82%A4%E3%83%80%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F

https://en.wikipedia.org/wiki/Bretschneider%27s_formula
～初投稿～Vagrant-LAMP環境設定-Windows10

研修先でおススメされたツールの設定方法をメモしました。
# 初期設定
用意するもの
・VirtualBox
　https://www.virtualbox.org/wiki/Downloads
・Vagrant
　https://www.vagrantup.com/downloads.html
・TeraTerm(exeファイル)
 　https://ja.osdn.net/projects/ttssh2/releases/
 
共にポチチポチと先に進んでインストール
インストール先の設定は初期のまま

適当な場所にVagrantで使用するフォルダを作る
コマンドプロントで作成したフォルダに移動する
コマンドで以下を入力する

`vagrant box add precise64 http://files.vagrantup.com/precise64.box`
`vagrant init precise64`
`vagrant up`

以上が終わればVirtualBoxを起動し実行できているかを確認する

次にTeratermのプラグインをインストールする
こちらもコマンドプロントで先ほどの作業したフォルダで以下のコマンドを実行する
`vagrant plugin install vagrant-teraterm`
プラグインのインストールが終われば以下のコマンドでUbuntuのターミナルにつなぐことが出来る
`vagrant teraterm`

先ほどのコマンドで開いたUbuntuのターミナルからUbuntuのアプデートを以下のコマンドでする
`sudo apt-get update`
終わればVimをインストールする
`sudo apt-get -y install vim`



## PHPのインストール
ターミナルで以下のコマンドを入力する

`sudo apt-get install python-software-properties`
`sudo add-apt-repository ppa:ondrej/php`
`sudo apt-get -y update`
`sudo apt-get -y install php`

PHPが入っているか確認
`php --version`


## MySQLのインストール
ターミナルで以下のコマンドを入力する
`sudo apt-get install -y mysql-server`
MySQLが入っているか確認
`mysql --version`

## Apache2のインストール
ターミナルで以下のコマンドを入力する
`sudo apt-get -y install apache2`
Apache2が入っているか確認する
`apache2　-v`
EC2のEBSボリュームをresize2fsせずに拡張する

# 概要
EC2のEBSボリュームを拡張する(10G -> 90G)
EC2はすでに起動済みのものとする。

# 背景

EBSのボリュームを拡張したので、ファイルシステム拡張のコマンドを実行！

```:
$ sudo resize2fs /dev/xvda1
The filesystem is already 8972864 blocks long.  Nothing to do!
```

パーティションの容量が少ないためディスクの拡張ができず、怒られてしまいました・・・。
[Linux パーティションの拡張](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/storage_expand_partition.html)が必要そうですが、ちょっと手順が多い。

しかし、サイズをEBSのサイズをあらかじめ拡張し、スナップショットから新規作成することで
コマンドを実行せずともwebコンソールからディスクを拡張できたので手順をメモ。

# 事前準備

* EC2で使用してるEBSのID、ルートデバイスの名前を控える。

![スクリーンショット 2017-04-19 20.14.28.png](https://qiita-image-store.s3.amazonaws.com/0/71267/0d657ff5-85e0-9720-6194-5afd2848dc8b.png)

* EC2のインスタンスID、アベイラビリティーゾーンを控える。


# 手順


## EBSボリュームサイズを拡張する

※EC2を停止しなくても拡張できますが、拡張中は不安定になります。

ELASTIC BLOCK STORE > ボリューム > アクション > Modify Volume
Sizeの値を変更します。

![スクリーンショット 2017-04-19 21.38.05.png](https://qiita-image-store.s3.amazonaws.com/0/71267/26831f84-94db-f821-f99b-5e43e6fe06bd.png)

## EBSボリュームのスナップショットを作成する

※EC2を停止しなくてもスナップショットを作成できますが、停止したほうが安全です。

ELASTIC BLOCK STORE > ボリューム > アクション > スナップショットの作成

## EC2を停止する

以降の作業はEC2を停止しないと行えません。

## EBSボリュームをEC2からデタッチする

ELASTIC BLOCK STORE > ボリューム > アクション > ボリュームのデタッチ

既存のEBSをデタッチします。

## EBSボリュームのスナップショットから新しいボリュームを作成する

ELASTIC BLOCK STORE > スナップショット > アクション > ボリュームの作成

EC2と同じアベイラビリティゾーンにする必要があります。

![スクリーンショット 2017-04-19 20.11.33.png](https://qiita-image-store.s3.amazonaws.com/0/71267/9adab11a-5a52-0d0b-5e92-b1f3cb63b455.png)

## 新規作成したEBSボリュームをEC2にアタッチ

ELASTIC BLOCK STORE > ボリューム > アクション > ボリュームのアタッチ

アタッチしたいEC2のインスタンスを選択します。
事前に控えておいたデバイスを入力します。

![スクリーンショット 2017-04-19 20.24.48.png](https://qiita-image-store.s3.amazonaws.com/0/71267/eca672e9-bbce-57a8-4a22-c65b90386f08.png)

## EC2を起動

これで作業完了です！

## ディスクボリュームが拡張されているか確認する

```:
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  90G  0 disk
└─xvda1 202:1    0  90G  0 part /

$ df -h
ファイルシス       サイズ  使用  残り 使用% マウント位置
/dev/xvda1            89G   84G   5G   18% /
```

## 最後に
使用していないEBSは削除しましょう！
EC2にアタッチしていなくても、料金がかかってしまいます。
TradingView覚書

# 目的
TradingViewの日本語での利用方法が探してもあまりなかったので、周りとの共有や覚書を兼ねて記録。
なお、リアルタイムでデータを反映していく必要があるため、[ここ](https://github.com/tradingview/charting_library/wiki/How-To-Connect-My-Data)(TradeViewの認証がないと見れないので注意)で言う所のJavaScript APIに即した説明となる。

# 目次
1. [デモを起動するまでの手順](http://qiita.com/Akira-Taniguchi/items/d42bea87921d1c70f472)
2. [TradingView.widgetコンストラクタ引数](http://qiita.com/Akira-Taniguchi/items/d5784793bd2fc974a52b)
3. [TradingViewのdatafeedクラス詳細](http://qiita.com/Akira-Taniguchi/items/563ae6b39f026a1c2cf9)
オンラインSICP読書女子会 #33 (2.4.3)

[オンラインSICP読書女子会 #33 (2.4.3)](https://ladiespp.connpass.com/event/54735/)

## 3.4.3 (a) メッセージパッシング

## ex. 2.75. make-from-mag-ang をメッセージパッシングで.

### ex. 2.75. 実装.

```scm
; [ex-2.75.scm]
;
(define (ex-2.75)
	(print "(make-from-mag-ang 1 2)")
	(print ";==> " (make-from-mag-ang 1 2))
	(let
		(
			(c1 (make-from-mag-ang 1 2))
		)
		(print "(apply-generic 'real-part c1)")
		(print ";==> " (apply-generic 'real-part c1))
		(print "(apply-generic 'imag-part c1)")
		(print ";==> " (apply-generic 'imag-part c1))
		(print "(apply-generic 'magnitude c1)")
		(print ";==> " (apply-generic 'magnitude c1))
		(print "(apply-generic 'angle c1)")
		(print ";==> " (apply-generic 'angle c1))
	)
	#t)


(load "./sec-3.4.3-a")


; sec 2.4.1 (複素数の表現) を参考に.
(define (make-from-mag-ang r a)
	(define (dispatch op)
		(cond
			((eq? op 'real-part) (* r (cos a)))
			((eq? op 'imag-part) (* r (sin a)))
			((eq? op 'magnitude) r)
			((eq? op 'angle) a)
			(else (error "Unknown op: MAKE-FROM-REAL-IMAG" op))))
	dispatch
	)
```

### ex. 2.75. 実行結果.

```scm
gosh> (ex-2.75)
(make-from-mag-ang 1 2)
;==> #<closure (make-from-mag-ang dispatch)>
(apply-generic 'real-part c1)
;==> -0.4161468365471424
(apply-generic 'imag-part c1)
;==> 0.9092974268256817
(apply-generic 'magnitude c1)
;==> 1
(apply-generic 'angle c1)
;==> 2
```

## ex. 2.76. 3 つの戦略の違い.

3 つの戦略:

1. 明示的ディスパッチによるジェネリック演算
2. データ主導スタイル
3. メッセージパッシングスタイル

2 つの変化:

1. 新しい型の追加
2. 新しい演算の追加

6 つの組み合わせ.
増えた型に対する演算自体の実装追加と, 増えた演算に対する各型での実装追加はいずれの場合でも同様に発生するのでここでは除外とする.

1. 明示的ディスパッチによるジェネリック演算 x  新しい型の追加
    既存のディスパッチ関数のうち, 必要な演算に対して分岐を1つずつ追加する.

2. 明示的ディスパッチによるジェネリック演算 x 新しい演算の追加
    必要な演算に対して新しいディスパッチ関数を追加し, そこに必要な型の数だけ分岐を記述する.

3. データ主導スタイル x  新しい型の追加
    新しい型に関して実装したその場所 (登録用固有関数 = モジュール) に, 必要な登録処理を追加する. 既存コードの変更は不要.

4. データ主導スタイル x 新しい演算の追加
    新しいディスパッチ関数を追加する. その実装は単純に汎用適用関数を呼び出すのみでよい.

5. メッセージパッシングスタイル x  新しい型の追加
    新しい型に関して実装したその場所 (コンストラクタ = モジュール) に, 必要な登録処理を追加する. 既存コードの変更は不要.
6. メッセージパッシングスタイル x 新しい演算の追加

    新しいディスパッチ関数を追加する. その実装は単純に汎用適用関数を呼び出すのみでよい.

> 新しい型がよく追加されるシステムでは、どのどの組み立て方が最も適しているだろうか。

どのどの.

加法的に, 既存コードの変更なしに追加ができるデータ主導スタイル若しくはメッセージパッシングスタイルのいずれかであれば同等に適していると思われる.

> 新しい演算を追加するシステムでは、どれが最も適しているだろうか。

メッセージパッシングスタイルの場合, 演算の実装はコンストラクタと同じ場所に実装する必要がある. このためもし演算の単位で処理をグループ化して記述したい場合にはデータ主導スタイルが適切となる.

特にそのようなグループ化はせず, 型の単位で処理をグループ化して記述するのであればデータ主導スタイルとメッセージパッシングスタイルのいずれかで大きな違いはない.
circle.ymlの環境変数でコマンドの結果を設定する方法

# 結論
$()の中にコマンドを書く（勿論パイプ渡し等も大丈夫）

```bash
machine:
  environment:
    EXAMPLE: $(echo "example environment variable")
```

# ダメなパターン1（そのまま文字列になる）
```bash
machine:
  environment:
    EXAMPLE: echo "example environment variable"
```

# ダメなパターン2（ビルドエラー）
```bash
machine:
  environment:
    EXAMPLE: `echo "example environment variable"`
```
Jython で java.util.concurrent.RejectedExecutionException: event executor terminated が出る場合の対処法

Jythonインタープリタで繰り返し urllib2 を使う処理をしようとするとこの例外が発生する。
Jython は内部実装で netty を使っているが、ソケットを閉じた後再度開かずにこけるらしい。

いろいろググったけどなかなか有益な情報にたどり着けなかったけれど、苦労して発見したので記録。

https://bugs.launchpad.net/sikuli/+bug/1464105

> Krzysztof Guć (krzysiek-q) wrote on 2016-12-27:	#5
> Hi All.
> 
> Hi Guys, J found Solution:
> 
> try add something that in header:

```
import sys, _socket
if _socket.NIO_GROUP.isShutdown():
    print "RE-CREATEING NIO_GROUP"
    _socket.NIO_GROUP = _socket.NioEventLoopGroup(2, _socket.DaemonThreadFactory("PyScan-Netty-Client-%s"))
    sys.registerCloser(_socket._shutdown_threadpool)
```

これで解決しました。
名前は読めないけど、ありがとう！
Rustのすごそうな記事たち

[Rust言語製ゲームエンジンPistonの紹介](http://qiita.com/ryo33/items/cbe97fd4730027a55b10)
[Rustで作ってみよう -- HyperLogLogと並列処理で、ウィキペディア全記事のユニーク単語数を見積もる（その１）](http://qiita.com/tatsuya6502/items/832f71b78c62ecad65c5)
[RustのRocketでWebアプリケーションを作ってみる](http://qiita.com/hhatto/items/b118442051a67babcc0d)
[Rustにおけるオブジェクト指向の考え方](http://qiita.com/mandel59/items/e9a5438f4c1d70cffb7a)
[Visual Studio Code で Rust 開発を始めるには](http://qiita.com/chikoski/items/53590914cc6aacc8916d)
[RustでNode.jsのネイティブモジュールが作れるやつを試した](http://qiita.com/kjunichi/items/9cfda742f33f62889341)
[docoptでドキュメントとともにコマンドラインツールを作る](http://qiita.com/rejasupotaro/items/91e1941122c48ab69a4c)
[Rust のテストフレームワーク](http://qiita.com/skitaoka/items/498c6bd1ac9d3b7ca6c9)
[Rustをはじめよう！ Rustの環境構築 Atom & SublimeText](http://qiita.com/nacika_ins/items/044c87fd8bd1d7c41191)
[Rustでむりやりプレステ1向けプログラムをつくってみる](http://qiita.com/murachue/items/2684d85fdc2a4da48fb4)
[2点間の距離計算 (C, Clojure, Go, Haskell, Java, LOGO, OCaml, Ruby, Rust, Scratch, Swift)](http://qiita.com/niwasawa/items/5128101ef93a56e8a6af)
[RustでHTTP2クライアントを試す](http://qiita.com/hhatto/items/0e0a2b2d238dc926babd)
[RustでAndroidアプリを作る](http://qiita.com/nacika_ins/items/7aaad419fac128ac5b6d)
[Rustオブジェクトの削除タイミングを手動で制御する](http://qiita.com/tatsuya6502/items/b9801d92f71e24874c9d)
JetBrains Rider で Xamarin.Android プロジェクトのデバッグが行えるようになりました

クロスプラットフォーム対応の.NET向けIDE、JetBrains Rider の EAP(Early Access Program) ver.20 で、ついに Xamarin.Android の「実行」がサポートされました（今までも「ビルドだけ」はできたのですが）。

* [Rider EAP 20: Xamarin Android, Node.js, .NET Core improvements, and more - .NET Tools Blog.NET Tools Blog](https://blog.jetbrains.com/dotnet/2017/04/14/rider-eap-20-xamarin-android-node-js-net-core-improvements/)

たとえば [Xamarin Samples](https://developer.xamarin.com/samples/) の

* [ButtonCode - Xamarin](https://developer.xamarin.com/samples/xamarin-forms/ButtonCode/)

を Rider で開いてビルド、デバッグ実行してみます。
これは Xamarin.Forms のソリューションですが、その中の Android プロジェクトは実行できます。

![](http://blog.amay077.net/assets/images/posts/rider_supports_xamarin_android_project_01.png)

上図のように、エミュレータも起動でき、ブレークポイントを置いてのステップイン・ステップオーバーなども実行できます。
デバッグ画面のルック＆フィールは JetBrains 製品らしくなっており、Android Studio を使っている人にとっても馴染みがあります。

また、Rider で Xamarin.Android プロジェクトを新規作成することも可能です。
が、Rider で作成したプロジェクトをXamarin Studioなどで開くとエラーになってしまいます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">JetBrains Rider  Xamarin Android プロジェクト作成→Run→エミュ起動→アプリ実行、までできたけど、その .sln/csproj を Visual Studio for Mac で開くとエラー <a href="https://t.co/u0HXb4dVSr">pic.twitter.com/u0HXb4dVSr</a></p>&mdash; あめい@超技術書典4/30 あ-12 (@amay077) <a href="https://twitter.com/amay077/status/852912306056863744">2017年4月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

こちらは今後の開発進行に伴い改善されていくでしょう。
手書き太字アルファベットの書き方

# 拾ってきた画像

- 機械学習の勉強中に行列が出てきたので気になって調べてみた

## 大文字


![image](https://qiita-image-store.s3.amazonaws.com/0/157750/8ac60c56-a675-93b8-ed4c-3678c0e26775.png)

## 小文字

![image](https://qiita-image-store.s3.amazonaws.com/0/157750/90906fb0-cb4e-edf8-c47e-84305a320c72.png)
出典:https://physnotes.jp/foundations/b_al/
sakura.ioからのデータをLINEに通知する

## やりたいこと
先日さくらインターネットからリリースされた[sakura.io](https://sakura.io/)を使って、Arduinoからsakura.ioのWebSocketサービスにデータを送信し、すったもんだの末にLINEで通知してみようと思います。

## 使う技術
- [Arduino](https://www.arduino.cc/)
- [sakura.io](https://sakura.io/)
- [myThings](https://mythings.yahoo.co.jp/)

## やること
### sakura.ioの準備
sakura.ioについての詳細は割愛しますが、sakura.io上でWebSocketサービスを事前に作成しておきます。※名前は「myThings」である必要はありません。
![sakura.png](https://qiita-image-store.s3.amazonaws.com/0/51093/bfb932b2-983d-dd82-4a61-cb39e3da05a5.png)

### myThingsの準備
同じくmyThingsについての詳細は割愛しますが、sakura.ioとLINEの認証を行い、以下のような組み合わせを作成しておきます。
LINEチャンネルの「データを受信したら」トリガーを使用する際にWebSocketサービスの設定が必要になるので、前項で作成したWebSocketを選択してください。
![mythings.jpg](https://qiita-image-store.s3.amazonaws.com/0/51093/10516ea8-0549-aaa4-48fc-1abb0e46df9d.jpeg)

### Arduinoの準備
今回はタクトスイッチを用いて、スイッチを押したらsakura.ioにデータを送信するようにしたいと思います。

#### 配線
![sakura_button_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/51093/35d7a973-1e7c-6e34-fd46-2ed0526341f3.png)

#### スケッチ
```c:sakura_button.ino
#include <SakuraIO.h>

SakuraIO_I2C sakuraio;
int val = 0;

void setup() {
  Serial.begin(9600);
  Serial.print("Waiting to come online");
  for(;;){
    if( (sakuraio.getConnectionStatus() & 0x80) == 0x80 ) break;
    Serial.print(".");
    delay(1000);
  }
  Serial.println("!");
 
  pinMode(7, INPUT);
}

void loop() {
  val = digitalRead(7);
  if(val == LOW) {
    sakuraio.enqueueTx(0, (uint32_t)1);
    sakuraio.send();
    delay(1000);
  } 
  
  delay(300);
}
```

## うまく動くと
<blockquote class="twitter-video" data-lang="ja"><p lang="et" dir="ltr">myThingsでsakura.io ☓ LINE <a href="https://t.co/I54st3b3Fw">pic.twitter.com/I54st3b3Fw</a></p>&mdash; 山本学 (@yamamoto_manabu) <a href="https://twitter.com/yamamoto_manabu/status/854660396438831104">2017年4月19日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

myThingsの設定如何で通知先をSlackにしたり、プッシュ通知にしたり色々変更できるのでお試しあれ。
macbook pro(2012 late)　---windows10を外付けssdに入れる---

#環境
macbook pro (2012 late)
OS(mac): 10.12(Sierra)
CPU : Intel core i5-3210M (2.5GHz)
RAM : 8GB
system　:　64bit

今回入れるOS
OS(win): windows 10 Home
外付けssd : [ESD400 ポータブルSSD](https://jp.transcend-info.com/Products/No-666)の256GBを使いました。

#参考サイト
http://fanblogs.jp/macyarounanoka/archive/102/0

#躓いた点
ほぼ上記のサイト様を参考にさせていただきましたが
(2017/04/20時点で)躓いた点をちょこちょこ記載していきます。


まず上記参考サイトの"1.1"の
windows10の[インストール画面](https://www.microsoft.com/ja-jp/software-download/windows10ISO)で「editionの選択」で困った。

4/11よりwindows 10 creaters updateなるものが登場したらしい
よくわからないし、出たばっかりでおかしくなられても困るので今回は
windows 10 anniversary update > windows 10を選択しインストールしました。

"2.2"
「最新のWindowsサポートソフトウェアをAppleからダウンロード」
を選択してないが私の環境では灰色塗りつぶとなり選択自体ができなかった。
(ここがあとで問題となりますが今は飛ばします。)

"2.4"
今回対象がなかったため飛ばします。

"3.2"　Windows(ドライブI)にWindowsイメージを展開します。
> dism /apply-image /imagefile:C:\Sources\Install.wim /index:1 /applydir:I:\

↑の部分で引っかかりました。
今回使用する osはwindows10 home なのですが /index:1はproの方をインストールするということでプロダクトキーが適用されず色々悩みました。orz

こちらの[サイト](http://blog.mokosoft.com/entry/2015/12/22/141933)に確認コマンドが記載されていたのでこちらで確認してみてください。

確認コマンド
> dism /get-wiminfo /wimfile:X:¥sources¥Install.wim

homeの場合は　/index:2 ですね。

あとは"3.5"まで設定したらwindowsのosが立ち上がりました。


ここからが結構悩んでしまったのですが、
ドライバたちがインストールされていなくて途方にくれていました。

ここで"2.2"のmacのbootcampの画面に戻ります。
最新のWindowsサポートソフトウェアをAppleからダウンロード
にチェックを入れusbにインストール
usbにがインストールされているので再起動しwindowsを立ち上げ

WindowsSupportフォルダ内の「setup.exe」を実行し無事ドライバをインストールできました。
これでwifiにも接続しインターネットに繋げることができました。
bootcampも入ったのでタッチパッドの設定もできる！


#windows10をmacの環境に近づける設定

macを使っている感覚でbootcampを使っているとどうも使いづらいので早期に設定を変えてやりました。

設定した点
・タッチパッド
・keyboard

この辺がうまくmacと同じように使えればストレスがなさそうですね。

##タッチパッドの設定
まずはwindowsはクリックが強めに押さないと反応しないのでbootcampから設定をしてやります。

参考サイト
http://yuppe.hatenablog.com/entry/2015/08/01/142632


##keyboardの設定
キーボードの文字変換がmacの[英数],[かな]ボタンで変換できるようにします。
こちらは再起動後に反映します。

参考サイト
https://pc-karuma.net/bootcamp-windows-ime/

あとはキーボードの@とかの配置が違うのでその設定

参考サイト
http://www.kotalog.net/archives/106

最後に[caps]を[ctrl]として使用できるツールがmicrosoftから出ているのでそちらを適用します。

参考サイト
http://kuneoresearch.com/bootcamp-ctrl-caps-key-change-setting/


以上

これで大体の作業がmacと変わらなくできそうです。
Homesteadでvagrant up時、SSH接続できずにハングアップする (providor=VirtualBox)

### やったこと

Homesteadを利用して、Laravel開発環境をローカルに構築しようとしてました。
[Laravel 5.4 Laravel Homestead](https://readouble.com/laravel/5.4/ja/homestead.html)

上記を参考に`vagrant box`追加、`yaml`設定、`vagrant up`と進めたところ、`vagrant up`処理中に下記でエラーになってしまいました。

```
$ vagrant up

~略~

homestead-7: SSH auth method: private key # ここで止まる

#以下コンソールにエラー出力

Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.

If you look above, you should be able to see the error(s) that
Vagrant had when attempting to connect to the machine. These errors
are usually good hints as to what may be wrong.

If you're using a custom box, make sure that networking is properly
working and you're able to connect to the machine. It is a common
problem that networking isn't setup properly in these boxes.
Verify that authentication configurations are also setup properly,
as well.
```

### 調べたこと

調べたところ、下記フォーラムのコメントの部分を行ったところ、解決しました（`vagrant up`がエラーなく完了する）。
https://laracasts.com/discuss/channels/laravel/homestead-hangs-at-ssh-auth-method-private-key?page=0

```
"Settings" -> "Network" and choose "Adapter 1" then expand the option by clicking on the arrow and make sure that "Cable Connected" is checked.
```

とりあえずVirtualBoxのネットワーク設定ということは分かりました。
ただ、`Cable Connected`が何を意味してるのかは正しく理解できていないです。
Adapter1=NATなので、外部ネットワークに接続するか否か？みたいなとこなのかな。（擬似的なLANケーブルを指すかどうか、的な）
あとで調べます。

### ※ 2017/04/20 追記

やはりケーブルに接続するかどうかの設定のようです。
http://vboxmania.net/content/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9A

```
ケーブル接続
VirtualBoxはネットワークケーブルの接続状態もエミュレートします。
チェックを付ければケーブルを接続した状態になり、チェックを外せばケーブルを抜いた状態になります。
```
UIViewControllerのサブクラスの名前を取得する方法

UIViewControllerの子クラスの名前を取得したいときに、以下を記述することで取得できる。

```swift
extension UIViewController {
    var subClassName: String {
        return NSStringFromClass(self.classForCoder).components(separatedBy: ".").last!
    }
}

```

これを使って指定のViewControllerに対して、処理を行う実装を考えているけどベストじゃない気がする。

## 参考
http://stackoverflow.com/questions/26358422/get-class-name-of-uiviewcontroller-in-swift
php継承関係にあるクラス変数を再帰的にマージするメソッド


```php
class A {
  public static $prop = array(
    "common" => 1,
    "a" => 1,
  );

  public static function getProp() {
    $parent_prop  = array();
    $ref          = new ReflectionClass(get_called_class());
    $ref_parent   = $ref->getParentClass();
    if ( $ref_parent ) {
      $parent_class = $ref_parent->getName();
      $parent_prop = $parent_class::getProp();
    }
    return array_merge($parent_prop, static::$prop);
  }
}
class B extends A {
  public static $prop = array(
    "common" => 2,
    "b" => 2,
  );
}
class C extends B {
  public static $prop = array(
    "common" => 3,
    "c" => 3,
  );
}

var_dump(A::getProp());
// array(2) {
//   ["common"]=>
//   int(1)
//   ["a"]=>
//   int(1)
// }
var_dump(B::getProp());
// array(3) {
//   ["common"]=>
//   int(2)
//   ["a"]=>
//   int(1)
//   ["b"]=>
//   int(2)
// }
var_dump(C::getProp());
// array(4) {
//   ["common"]=>
//   int(3)
//   ["a"]=>
//   int(1)
//   ["b"]=>
//   int(2)
//   ["c"]=>
//   int(3)
// }
```

動作確認
php5.3.29, php5.5.4, php5.6.0
UnityでUIを消したスクリーンショットを撮る方法

Application.CaptureScreenshotで基本的にはキャプチャを撮る事が出来るけど、
これ当然ながら画面のUIが写った状態でしかキャプチャ出来ない……
これだとキャプチャボタンを使って撮影させる場合になんともダサい画像になってしまう。
![test.png](https://qiita-image-store.s3.amazonaws.com/0/177027/e57b091e-c77d-e074-13f9-cc6c2d20b8b8.png)

それを解消する方法とスクリプトを作成してみた。

# ①UIのオブジェクトを非表示にしてキャプチャ終わったら再表示

最初にぱっと思いついた方法。
一件楽そうだが、この方法だと押したタイミングでユーザの表示から消える上、
キャプチャが終了した事をファイルチェックなりで確かめないといけないと考えて、
実装前にやめた。

# ②Camera→RenderTexture→Texture2D→PNGにする
これが今回実装した方法。
CanvasのRender Modeが「Screen Space - Overlay」の場合、
「UIを写すカメラとGameのカメラが異なる」という性質を利用し、
Cameraの映像を一旦RenderTextureに変換
→RenderTextureをTexture2Dに変換
→Texture2DをPNGに変換
→ファイルに流し込む
→邪魔なオブジェクトを消す
という方法。

以下のサイト等を参考にしながらスクリプトを作成した。
https://docs.unity3d.com/ScriptReference/Texture2D.EncodeToPNG.html
http://blog.livedoor.jp/ituki_yu/archives/27225941.html

```ScreenShot.cs

using System.Collections;
using System.IO;
using System;
using UnityEngine.UI;
using UnityEngine;

public class ScreenShot : MonoBehaviour {
    public Camera ArCam;

    public void CaptchaScreen()
    {
        Texture2D screenShot = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
        RenderTexture rt = new RenderTexture(screenShot.width, screenShot.height, 24);
        RenderTexture prev = ArCam.targetTexture;
        ArCam.targetTexture = rt;
        ArCam.Render();
        ArCam.targetTexture = prev;
        RenderTexture.active = rt;
        screenShot.ReadPixels(new Rect(0, 0, screenShot.width, screenShot.height), 0, 0);
        screenShot.Apply();

        byte[] bytes = screenShot.EncodeToPNG();
        UnityEngine.Object.Destroy(screenShot);

        string fileName = "cap_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".png";

        File.WriteAllBytes(Application.persistentDataPath + "/" + fileName, bytes);
    }
}
```

これをボタンと連携すれば、こんな感じのキャプチャが撮れる。
![stamp5-iloveimg-compressed.gif](https://qiita-image-store.s3.amazonaws.com/0/177027/9b5c3b52-cc3c-385b-dd05-748dc53ef4e0.gif)
↓結果
![fure_20170419195926756.png](https://qiita-image-store.s3.amazonaws.com/0/177027/471e5ce0-d95e-71b2-f812-4c56d1bdd62f.png)

※キャプチャの内容は気にしないで頂ければと思います。

# まとめ
一旦この方法でUIを排除したキャプチャを作ることは出来る。
ただスマフォだと一瞬動作が止まる。シャッターっぽい動きを加えたら動作ストップも気にならないかも。
もっとスマートな方法があるかもしれない……？
[Swift]変数/定数のスコープ

# 変数/定数のスコープ

## スコープとは？

- 変数/定数/関数/型の名前の有効範囲
  - ローカルスコープ
  - グローバルスコープ
- 同一スコープ内では名前が一意である必要がある

### ローカルスコープ

- 関数や制御構文によって局所的に定義されるスコープ
- 関数や制御構文が持つ実行文の内部のみで有効
  - スコープの外部からは参照できない
     - 意図しない変更が起こりにくい

```Swift:ローカルスコープ
func someFunction() {
    let a = "a"
    print(a)    // OK
}

print(a)    // コンパイルエラー

someFunction()
```

### グローバルスコープ

- どの関数にも型宣言にも含まれないスコープ
- プログラム全体から同じ名前で参照できる
  - 意図しない変更が起きやすい
     - ローカルスコープよりも説明的な命名が必要

```Swift:グローバルスコープ
let globalA = "a"

func someFunction() {
    print(globalA)  // OK
}

print(globalA)  // OK

someFunction()
```
Windows 10 上に Ubuntu 16.04 Desktop 環境を構築する

久々に Windows 上で Ubuntu 16.04 desktop を使うことになったので、Vagrant を使って構築しました。手順をメモしておきます。


導入環境
----
- Windows 10 Pro build 15063 (Creators Update)
- Oracle VirtualBox 5.0.36
    - (最新の 5.1.x はなぜか `vagrant up` が失敗する)
- Vagrant 1.9.3


Vagrant で Ubuntu を導入する手順
----
### 最新の Box を探す
[Discover Vagrant Boxes | Atlas by HashiCorp](https://atlas.hashicorp.com/boxes/search?utf8=%E2%9C%93&sort=&provider=&q=ubuntu+desktop) にて、 `ubuntu desktop` で検索し、最新の Box を探します。

今回は [boxcutter/ubuntu1604-desktop](https://atlas.hashicorp.com/boxcutter/boxes/ubuntu1604-desktop) を使います。

```sh
vagrant init boxcutter/ubuntu1604-desktop
vagrant up --provider virtualbox
```

VirtualBox に Ubuntu Desktop が立ち上がるので、 ID/PW = `vagrant/vagrant` でログイン。


Ubuntu の設定
----
### Timezone を Asia/Tokyo に変更

Xterm を起動し、以下を入力します。

```sh
timedatectl set-timezone Asia/Tokyo
timedatectl
# "Time zone: Asia/Tokyo (JST, +0900)" に変わっていればOK
```

### 日本語関連パッケージのインストール
```sh
sudo apt -y install language-pack-ja-base language-pack-ja ibus-mozc fcitx fcitx-mozc
sudo update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
source /etc/default/locale
echo $LANG 
# "ja_JP.UTF-8" になれば OK
```

### 日本語入力を使えるようにする

1. Mozc を入力方法として選択可能にする
    1. Unity ランチャーの "System Settings" を起動
    1. "Text Entry" をクリック
    1. "Input sources to use" に以下の2つが表示されているようにする
        - Mozc (Fcitx)
        - English (US)
1. Fcitx の設定
    1. ランチャーから "Fcitx" を入力し、 "Fcitx 設定" を起動
    1. "Input Method" タブ左下の "+" をクリック
    1. "Mozc" を選択して OK
    1. 同様に "English (US)" も追加
    1. (必要なら) "Global Config" タブで、"入力メソッドのオン/オフ" ショートカットキーを変更する

※設定画面に Fcitx が表示されていない場合、一度ログアウトして再ログインすれば出てくる模様。

### (必要なら) Mozc を ATOK 変換方式にする

1. タスクバーのキーボードアイコンをクリックし、 "Mozcツール > 設定ツール" をクリック
1. "キー設定の選択" セレクトボックスから "ATOK" を選んで "OK" 


### (必要なら) キーボード配列を日本語キーボードに変更

```:/etc/default/keyboard
XKBMODEL="jp106"
XKBLAYOUT="jp"
```

再起動後に反映されます。


参考
----
- [Ubuntu 14.04 LTS : 日本語環境にする ： Server World](https://www.server-world.info/query?os=Ubuntu_14.04&p=japanese)
- [UbuntuのmozcでUSキーボード入力/JISキーボード入力を簡単に切り替える方法 - Qiita](http://qiita.com/AnchorBlues/items/beeb40593fd4c579dbe5)
- [Ubuntu 16.04 LTS : システムのタイムゾーンを設定する ： Server World](https://www.server-world.info/query?os=Ubuntu_16.04&p=timezone)
- [Ubuntu 14.04 LTS : キーボードの割り当てを設定する ： Server World](https://www.server-world.info/query?os=Ubuntu_14.04&p=keymap)
- [ubuntuで日本語入力を行う - Qiita](http://qiita.com/shishamo_dev/items/238f6e5060fb838827f6)
- [第297回　Ubuntu 13.10でインプットメソッドFcitxを活用する：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0297)
DeepLearningを簡単にまとめたい〜パーセプトロン編〜

# はじめに
そろそろ

- 機械学習
- AI
- DeepLearning

あたりのことを学ばないとと思い、「ゼロから作るDeepLearning」を読んでみて、まとめとメモを兼ねて書こうかなと。

とりあえず、第1回はパーセプトロンについていきましょう

# パーセプトロンとは
パーセプトロン（perceptron）は、ニューラルネットワークやディープラ-ニングにつながる重要な考え方、つまりアルゴリズムです。

簡単にいうと、複数の信号を入力として受け取り、ひとつの信号を出力するというものです。
パーセプトロンの出力信号は、信号を流すか流さないかの2つの値になります。
信号を流す場合を`1`、流さない場合を`0`として説明していきます。

2つの入力信号、1つの出力信号のパーセプトロンの例です。
![perceptron_1.png](https://qiita-image-store.s3.amazonaws.com/0/150615/d714fdcb-0a6a-e2c4-38d4-8633f94cf800.png)

- x1,x2：入力信号
- y：出力信号
- w1,w2：重み

図の○を`ニューロン`や`ノード`と呼びます。

ここで出てきた重みは、入力信号が出力のニューロンに送られる前に計算するのに使います。

```
w1*x1, w2*x2
```
この総和が、ある限界値（`θ`）を超えた場合、出力信号(y)に`1`が入ります

```swift
func perceptron((x1, x2): (Double, Double), (w1, w2): (Double, Double), θ: Double) -> Double {
  let sum = w1*x1 + w2*x2
  var y
  if sum <= θ {
    y = 0
  } else {
    y = 1
  }
  return y
}
```

# 単純な論理回路
## AND

|x1|x2|y|
|:--|:--|:--|
|0|0|0|
|1|0|0|
|0|1|0|
|1|1|1|

2つの入力信号が`1`の時だけ、出力信号は`1`になり、それ以外は`0`になります。
例えば、

```swift
func and((x1, x2): (Double, Double)) -> Double {
  let w1 = 5
  let w2 = 3
  let θ = 7

  return perceptron((x1, x2): (x1, x2), (w1, w2): (w1, w2), θ: θ)
}
```
のように値を与えて、表の値を`x1`と`x2`に適用して計算すると

```swift
// x1 = 0, x2 = 0の例
let y_and = and((x1, x2): (0, 0))
// y_and = 0
```

`y`が表の値と全て合うのがわかるかと思います。

## NAND

|x1|x2|y|
|:--|:--|:--|
|0|0|1|
|1|0|1|
|0|1|1|
|1|1|0|

```swift
func nand((x1, x2): (Double, Double)) -> Double {
  let w1 = -5
  let w2 = -3
  let θ = -7

  return perceptron((x1, x2): (x1, x2), (w1, w2): (w1, w2), θ: θ)
}
```
の様な値でNANDを満たします。

## OR

|x1|x2|y|
|:--|:--|:--|
|0|0|0|
|1|0|1|
|0|1|1|
|1|1|1|

```swift
func or((x1, x2): (Double, Double)) -> Double {
  let w1 = 5
  let w2 = 3
  let θ = 2

  return perceptron((x1, x2): (x1, x2), (w1, w2): (w1, w2), θ: θ)
}

```
の様な値でORを満たします。

# バイアス
`perceptron`メソッドのコードを少し変更していきます。

```swift
// 変更前
func perceptron((x1, x2): (Double, Double), (w1, w2): (Double, Double), θ: Double) -> Double {
  let sum = w1*x1 + w2*x2
  var y
  if sum <= θ {
    y = 0
  } else {
    y = 1
  }
  return y
}

// 変更後
func perceptron((x1, x2): (Double, Double), (w1, w2): (Double, Double), b: Double) -> Double { 
  let sum = w1*x1 + w2*x2 + b
  var y
  if sum <= 0 {
    y = 0
  } else {
    y = 1
  }
  return y
}
```

重要な変更点は、バイアス(`b`)を導入しました。
`b = -θ`としています。
これにより、`sum`の値が正か負で`y`を判断することができます。

# XOR

|x1|x2|y|
|:--|:--|:--|
|0|0|0|
|1|0|1|
|0|1|1|
|1|1|0|

これは、どの様な`w1`、`w2`、`b`を与えても、`perceptron`メソッドではできません。

# 多層パーセプトロン
先ほどXORは実現できませんでした。
しかし、パーセプトロンは1つだけではなく、複数繋げることができます。

```swift
func xor((x1, x2): (Double, Double)) -> Double {
  let y_nand = nand((x1, x2): (x1, x2))
  let y_or = or((x1, x2): (x1, x2))
  let y_and = and((x1, x2): (y_nand, y_or))

  return y_and
}
```
この様に、パーセプトロンを組み合わせることで実現できます。

```swift
xor((x1, x2): (0, 0)) // 0
xor((x1, x2): (1, 0)) // 1
xor((x1, x2): (0, 1)) // 1
xor((x1, x2): (1, 1)) // 0
```
試してみると全て、出力が表の通りになっています。

![perceptron.png](https://qiita-image-store.s3.amazonaws.com/0/150615/f4fdc75b-e7a3-7fe9-5e68-9009fd6e42fc.png)
XORの処理を図に表すとこの様になります。
2層まであるため、`2層パーセプトロン`と呼ばれます。
goの並列処理入門編 goroutineとchannel

## ReadMeFirst

最初、Context周りを色々調べた結果を記事にしていたのですが、
前提で並列処理がイメージつかないとアレかなぁ
と思ったので、goの並列処理について簡単にパパッとまとめておきます。

Goの並列処理はカジュアルなので、世に記事が溢れてるのはご愛嬌で。

## 概念 (goroutine and channel)

Goの並行処理を構成する２つの要素について簡単に。

### goroutine

Goのランタイムによって管理される軽量スレッド。
関数の呼び出しに `go` をつけるだけで立ち上げることができる。
`go Doanything(ctx) ` みたいな感じ。

### channel

ざっくり[リファレンス](https://golang.org/ref/spec#Channel_types)から抜粋。

並列実行された関数間における値の送受信を提供する型です。
宣言はchannelで扱う値の型と共に行います。
送信・受信それぞれの専用とすることも可能です。

``` go
chan T  // T型の送信・受信 を宣言
chan <- float64 //  float64の送信専用
<- chan int // intの受信専用
```

`chan bool`と `<- chan bool` は別の型になりますので、ビルド時にエラーになる。
`cannot use sig (type chan<- bool) as type chan bool ` 

初期化はmakeで。第２引数はbufferの最大長です。

``` go
make(chan int,100) 
```

専用のオペレーターを使って値の送受信ができる。

* 値の送信は ` channel <- 値 `
* 値の受信は ` <-channel `
* len(channel)で現在格納されている数を計る事もできる(buffer指定しないと0のまま)

channelの値は格納した順に取り出されます。

buffer数値はdefaultは0ですが、`>0`の値を設定した場合、
最大長以上の書き込みをBlock(待ち)する事を利用して同時実行数を
制限するような使い方もあります。

close(channel)でchannelを閉じる事ができます。


## 簡単な例

### Sample

``` go
package main

import (
	"fmt"
	"time"
)

func main() {
	const totalExecuteNum = 6   //合計実行数
	const maxConcurrencyNum = 3 //同時実行数
	sig := make(chan string, maxConcurrencyNum)
	res := make(chan string, totalExecuteNum)
	defer close(sig)
	defer close(res)
	fmt.Printf("start concurrency execute %s \n", time.Now())
	for i := 0; i < totalExecuteNum; i++ {
		go wait6Sec(sig, res, fmt.Sprintf("no%d", i))
	}
	for {
		//全部が終わるまで待つ
		if len(res) >= totalExecuteNum {
			break
		}
	}

	fmt.Printf("end concurrency execute %s \n", time.Now())
}

func wait6Sec(sig chan string, res chan string, name string) {
	sig <- fmt.Sprintf("sig %s", name)
	time.Sleep(6 * time.Second)
	fmt.Printf("%s:end wait 6sec \n", name)
	res <- fmt.Sprintf("sig %s", name)
	<-sig
}
```

### 実行結果

```
go run main5.go
start concurrency execute 2017-04-19 18:54:43.276968001 +0900 JST
no2:end wait 6sec
no3:end wait 6sec
no1:end wait 6sec
no5:end wait 6sec
no4:end wait 6sec
no0:end wait 6sec
end concurrency execute 2017-04-19 18:54:55.279826923 +0900 JST
```

channelのbuffer数を利用して同時実行数を制限してみました。
(合計回数(6) / 同時実行数(3)) * 6 = 12秒程度で終わってますね :)

## IMO

カジュアルに使えるので、積極的に使うべきではあるけど、
基本的に並列処理自体、直列の処理より頭のリソースを使うし、
複数人開発で無秩序に色んなところで使われると、goroutineがバカスカ立ち上がったり(queueingで対策すれば良いけど)など
注意するべき所もあります:P
適用部分がサービスにとって、とにかく速度が大事な部分かどうかと言う、
複雑さと速度改善は天秤にかけるべきかな、と。

## 補足

contextの記事書く前に補足記事的に書いたのですが、
実際には、mattnさんが紹介してる[sync package](http://mattn.kaoriya.net/software/lang/go/20140625223125.htm)
などもあるので、見てみると良いのかな〜と思います:)

## 参考

[Channel types](https://golang.org/ref/spec#Channel_types)
[Tour of Go](https://go-tour-jp.appspot.com/concurrency)
[Big Sky](http://mattn.kaoriya.net/software/lang/go/20140625223125.htm)
ローカルでコードを書いて、RaspberryPiにrsyncで送って実行する話


Macとラズパイで同じPythonやNodeJSが動くからとMac上でコード書いてデバッグして（納品前日とかに）いざラズパイで動かそうとすると全然挙動が違って焦る。iPhoneアプリ開発とかでもそうだけど、実機デバッグは基本。
RaspberryPi上でコーディングしようとするとGPIOをショートさせてクラッシュしたり電源の能力不足で落ちたりなど非常に辛くて人生が終わってしまうのでMacでコードを書いてscpなりでRaspberryPiに転送して実行するのが普通だと思いますが、rsyncを使うといろいろと捗ります。


- IPアドレスをコマンドライン引数から読み込むようにします
- IPアドレスとか電源いれるたびに変わるので ssh option でHostKeyのチェックをスキップします
- ラズパイが応答しなければ3秒で切断します
- `.git`とか`node_modules`とか一緒に送りたくないものは`--execlude`に指定します
- リモートのディレクトリは、`~/sugos-tutorial-01`が指定されています

以下を`upload.sh`としてソースコードのあるディレクトリにおいておきます。
`chmod +x upload.sh`を忘れずに。

```sh
#!/bin/bash
TARGET_IP_ADDR=$1
SSH_OPTIONS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ServerAliveInterval=1 -o ServerAliveCountMax=3"
rsync -av -e "ssh ${SSH_OPTIONS}" --exclude 'node_modules' ./ pi@${TARGET_IP_ADDR}:sugos-tutorial-01
```

使い方

ラズパイのIPアドレスを`192.168.1.47`とします。

```sh
./upload.sh 192.168.1.47
```
Raspberry PiでFMラジオを聴く



　　

市販されているUSBワンセグチューナーをラズパイにつないで、FM電波を受信してみます。

## SDR (Software Defined Radio)

SDR(Software Defined Radio)、ソフトウエアラジオとかで検索するといろいろ情報出てきます。
通常ラジカセとかについているラジオは電子回路とかアナログな仕組みを使って、受信電波を復調して出力してますが、これをデジタルで行うのがSDRです。
USBワンセグチューナーは、VHF~UHF帯(30MHz~3GHz)の電波をとれるらしくかなり広域です。
　　
・航空無線 (VOR)
・FM放送
・地上波テレビジョン放送
・アマチュア無線

ここら辺の電波がとれるらしい。

## 環境
・Raspberry Pi 3
・Raspbian
・FM専用アンテナ
・[RTL-SDR専用カスタムチューナー](https://www.amazon.co.jp/SHAFT-CORPORATION-TV28Tv2DVB-T-%E5%8F%97%E4%BF%A1%E5%91%A8%E6%B3%A2%E6%95%B0%E9%AB%98%E5%AE%89%E5%AE%9A%E3%80%81%E9%AB%98%E7%B2%BE%E5%BA%A6%EF%BC%8FTCXO%EF%BC%88%E6%B8%A9%E5%BA%A6%E8%A3%9C%E5%84%9F%E5%9E%8B%E6%B0%B4%E6%99%B6%E7%99%BA%E4%BF%A1%E5%99%A8%C2%B10-5PPM%EF%BC%89%E6%90%AD%E8%BC%89TV28Tv2DVB-T%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8A%E3%83%BC%E5%8D%98%E5%93%81%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%EF%BC%BBRTL2832U-FM%EF%BC%BD%EF%BC%BB%E5%BA%83%E5%B8%AF%E5%9F%9F%E5%8F%97%E4%BF%A1%E7%94%A8%E3%80%90RTL-SDR%E5%B0%82%E7%94%A8%E3%80%91%E3%80%90USB%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%83%BC%E6%8F%9B%E8%A3%85%E5%93%81%E3%80%91/dp/B00H39R004/ref=sr_1_3?ie=UTF8&qid=1468414617&sr=8-3&keywords=RTL2832U%E3%80%80%E3%83%AF%E3%83%B3%E3%82%BB%E3%82%B0)
↑
めちゃくちゃ発熱する。
温度で受信周波数がずれちゃうらしく、この商品はその対策が施されたカスタム製品。
それでもレビューに「ハンダが溶けた！」とか書いてあるし、24時間運用したいのでヒートシンクベタ付け。
そんなとこつけても意味ないよ！って部分がある気がするけど、とにかくあったかい部分にベタ付けする。
　　
![ssd.png](https://qiita-image-store.s3.amazonaws.com/0/53216/7dd3003a-cd71-cf32-119e-99b3495d78b5.png)
親指が深爪気味である。

## さぁ、やってみよう！

### 1. SDRアプリケーション rtl-sdr を使えるようにする。

必要なパッケージのインストール

```py3:
$ sudo apt-get install autoconf libtool libusb-1.0-0-dev
$ git clone git://git.osmocom.org/rtl-sdr.git
```

ビルドする

```py3:
$ cd rtl-sdr
$ autoreconf -i
$ ./configure
$ make
```


インストール

```py3:
$ sudo make install
$ sudo make install-udev-rules
$ sudo ldconfig
```

再起動

```py3:
$ sudo reboot
```

  
  
これで使えると思いきやエラー出る

```py3:
$ rtl_test

Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM

Kernel driver is active, or device is claimed by second instance of librtlsdr.
In the first case, please either detach or blacklist the kernel module
(dvb_usb_rtl28xxu), or enable automatic detaching at compile time.

usb_claim_interface error -6
Failed to open rtlsdr device #0.

```

デバイスがうんたらかんたらと。。。

[他のUSBデバイスがいるとrtlsdrがエラーになっちゃう件](http://qiita.com/fujiba/items/f2d26b8bc727f71ac3f9)

↑で解決しました。ありがとうございます。


### 2. 聴いてみる


```py3:
# 80.0MHz TOKYO FM を聴いてみる
rtl_fm -f 80M -M fm -s 200000 -r 44100 | aplay -D plughw:0,0 -t raw -r 44100 -f S16_LE
```

### **「 これでどこでもFMラジオが聴ける!!! 」**
AndroidでGNU Socialのインスタンスを立ち上げる

# なぜやるのか
日本中にマストドン旋風が吹き荒れる今日このごろ、独自インスタンスを立てる人も少なくないようです。
Dockerで済む上にHerokuにデプロイできるとなれば楽ちんな話ですね。

ただし楽ちんだと思っているのは我々のような人種だけです。

一般層や若者に流行らせてこそのイノベーション。
中高生のカップルが２人専用インスタンスを作れるようなお手軽さが世界に革命を起こすのではないでしょうか？

しかも若者のパソコン離れが危ぶまれる昨今ですから、やれクラウドだやれ自宅サーバーだとは言っていられません。
やはり独自インスタンスはスマホで動かす必要があります。
思い返してみてください、我々が無料サーバーだのフラッシュだのCGIだの言ってた頃も同級生の女子はガラケーで魔法のiらんど使ってたでしょ？

とは言えマストドンの構成要素はそれなりに複雑で、スマホでの実行は難易度が高そう...
そこで白羽の矢が立ったのがマストドンと同じ規格で動くGNU Socialです。
GNU SocialもマストドンもOStatusという規格で動いていますので、相互にフォローやタイムラインの閲覧が可能です。

小学生が「ユーチューバーになりたい！」のと同じくらいのノリで「マストドンのインスタンスたてたい！」と口にする、
そんな世界の足がかりとして、まずはAndroidでGNU Socialを動かすところから始めたいと思います。

前置きが長くなりましたが以下が本題です。

# どうやるのか
GNU SocialはPHPが動くWebサーバーとmariaDB（MySQL）があれば動きます。
GooglePlayストア上でPHP,Webサーバー,DBサーバーがセットになったいわゆるLamp的なアプリがいくつか公開されていますが、
依存するパッケージの都合上、今回はWebサーバー（PHP）とDBをサーバーを別々に用意します。
（開発元は一緒だったりしますが）

**Webサーバー**
「PHP 向けサーバー（Server for PHP）」
https://play.google.com/store/apps/details?id=com.esminis.server.php&hl=ja

**DBサーバー**
「MariaDB サーバー」
https://play.google.com/store/apps/details?id=com.esminis.server.mariadb&hl=ja

## Webサーバーの設定
アプリを起動するとPHPをダウンロードしてインストールするように言われます。
ここではPHP5.6系の最新をインストールしましょう。

![Screenshot_2017-04-18-23-08-51.png](https://qiita-image-store.s3.amazonaws.com/0/11369/7ad1aace-441c-7c92-6246-20164d4dd653.png)

リストの左の矢印をタップしてダウンロード
その後リストの自体をタップして決定です
（これがわかりにくくて少しハマった）

インストールが終わると設定画面が表示されます
特に設定の変更はいらないですが、「データディレクトリ」の場所だけ控えておいてください。

![Screenshot_2017-04-18-23-12-11.png](https://qiita-image-store.s3.amazonaws.com/0/11369/9779db1a-d69d-480c-c7e9-28913a4f8388.png)

最後に「サーバーを開始する」を押しましょう。

## DBサーバーの設定
こちらも同じようにMariaDBをダウンロードする必要があります。
最新版で特に問題ありません。

![Screenshot_2017-04-18-23-13-32.png](https://qiita-image-store.s3.amazonaws.com/0/11369/1a811812-dd1f-6869-ee16-52e42993a24d.png)


このまま「サーバーを開始する」を押してしまいましょう。

## DBの初期化
DBサーバーが起動したらDBの初期設定を行う必要があります。
LAN内の他の端末から繋いでもいいですが、Androidアプリで完結させることもできます。
「SQL Client」
https://play.google.com/store/apps/details?id=de.mxapplications.sqlclient&hl=ja
（こちらの説明は割愛します）
（MariaDBはMySQL互換なのでMySQLクライアントならなんでもOK）

サーバーに接続できたら以下のSQLで、DATABASEとユーザーを作成します。

```SQL:
CREATE DATABASE social;
GRANT ALL PRIVILEGES ON social.* TO 'social'@'localhost' IDENTIFIED BY '任意のパスワード';
```
*（参考：https://git.gnu.io/gnu/gnu-social/wikis/home）*

DBの設定は以上です。

## スクリプトを設置する
GNU Socialの最新ソースは以下からダウンロードできます
https://git.gnu.io/gnu/gnu-social

ダウンロードしたソースを何らかの方法で端末にコピーします。
コピー先はWebサーバーの設定で控えておいた「データディレクトリ」の中の「public」ディレクトリです。
（今回の場合だと以下のようになる）

<img width="656" alt="スクリーンショット 2017-04-19 18.15.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/11369/606923db-cc0a-2c6e-c8e8-e3919cd1618e.png">

## GNU Socialのインストール
ブラウザで http://127.0.0.1:8080/install.php にアクセスすると、インストール画面が表示されます。
細かい説明は省きますが、「DataBase Settings」のところはDBサーバーの設定で作成したDATABASEとユーザーを設定してください。
（今回の例ならどちらもsocial）

以上で完了です。
無事インスタンスが立ち上がったでしょうか？

# 問題点とか
さて、スマホでGNU Socialが動くことは確認できましたが課題が山積みです。

- ドメインの設定（とIP固定問題）
- SSLの設定
- 依存アプリが多い
- 準備が多い
- iOSだと無理（PHPインタプリタ動かすとかダメ）
- GNU Socialの更新止まってるっぽい？
- そもそもマストドンじゃない（ブランド力がない）

などなど...

スマホで分散型SNSって夢があると思いますがなかなか難しいですね。
Soapメソッドを呼び出そうとしたら「Webサービスメソッド名は有効ではありません」とか言われた

#いや、ありますよ

呼び出そうとしたのはこれ

```C#:WebService.cs
[SoapRpcMethod("urn:zola2/getStatus", RequestNamespace = "urn:zola2", ResponseNamespace = "urn:zola2")]
[return: SoapElement("Result")]
public string GetStatus()
{
    object[] results = this.Invoke("getStatus", Enumerable.Empty<object>().ToArray());
    return ((string)(results[0]));
}
```

でもこんなエラーが出る
![image](https://qiita-image-store.s3.amazonaws.com/0/143870/2d6e3385-db20-dcf3-0d23-bd1b234d5a50.png)

いや、WSDLにメソッドがあることも確認したし

```xml
<operation name="getStatus">
 <documentation>Gets status</documentation>
 <input message="tns:getStatusRequest"/>
 <output message="tns:getStatusResponse"/>
</operation> 
```

大文字小文字もあってるし…
Attributeもあってるし…
ヽ（`Д´）ﾉｳﾜｧｧｧﾝ
#結局、こうだった
http://heppoco-programer-life.dreamlog.jp/archives/1214579.html

Webサービスメソッド名とC#のコード内のメソッド名が大文字小文字含めて同一でないといけないのね…。

```C#:WebService.cs
[SoapRpcMethod("urn:zola2/getStatus", RequestNamespace = "urn:zola2", ResponseNamespace = "urn:zola2")]
[return: SoapElement("Result")]
public string getStatus()
{
    object[] results = this.Invoke("getStatus", Enumerable.Empty<object>().ToArray());
    return ((string)(results[0]));
}
```

Pascal形式じゃないので見た目がC#的にちょっとあれだけど、仕方ない、か。
オフラインリアルタイムどう書く F04 の ruby と C99 による実装例


問題：http://nabetani.sakura.ne.jp/hena/ordf04octsp/
実装リンク集：http://qiita.com/Nabetani/items/8ead5622e192d9655cf5

いつもどおり、テストデータの大半を省略した ruby の実装から：

```ruby
def solve(src0)
  src = src0.to_i
  Array.new(8){ |s|
    if src[s]==1
      w = (1..8).find{ |x| src[(s+x)%8]==1 }
      w + (w==4 ? 1 : 2)
    end
  }.compact.sort.join
end

DATA.all?{ |line|
  num, src, expected = line.split(/\s+/ )
  actual = solve( src )
  okay = expected == actual
  puts( "%s %s:%s->%s ( %s )" % [(okay ? "ok" : "**NG**"), num, src, actual, expected] )
  okay
}.tap{ |x| puts( x ? "everything is okay" : "something wrong" ) }

__END__
0 165 3445
1 80  48
2 255 33333333
```

剰余を使ってぐるぐる回せばいいよ、というストレートな実装。
ビットの扱いが ruby だと楽だよね。

中央が直線になったときに頂点数が変わる部分は、アドホックな感じで。

で。

これをそのまま C99 に移植したのが下記：

```C
//clang -std=c99 -Wall
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int compare( const void * a, const void * b ){
  const char * ac = (const char * )a;
  const char * bc = (const char * )b;
  return *ac-*bc;
}

char * solve_impl( int src )
{
  char buffer[9]={0};
  char * pos=buffer;
  for( int s=0 ; s<8 ; ++s ){
    if ( src & (1<<s ) ){
      int w=1;
      for( ; w<=8 ; ++w ){
        if ( src & (1<<((w+s)%8)) ){
          break;
        }
      }
      *pos=w+( w==4 ? '1' : '2' );
      ++pos;
    }
  }
  qsort( buffer, pos-buffer, 1, compare );
  return strdup( buffer );
}

char * solve( char const * src )
{
  return solve_impl( atoi( src ) );
}

void test( char const * src, char const * expected )
{
  char *  actual = solve( src );
  _Bool ok = 0==strcmp(actual, expected);
  printf( "%s : %s / %s / %s\n", (ok  ? "ok" : "**NG**"), src, expected, actual );
  free( actual );
}

int main()
{
  /*0*/ test( "165", "3445" );    
  /*1*/ test( "80", "48" );    
  /*2*/ test( "255", "33333333" );
  return 0;
}

```

ソートがめんどくさい。実にめんどくさい。
それ以外はまあこんなもんかと思う。
`'1'` や `'2'` との加算で文字列を作る辺りは C言語らしさを出せたと思う。
Visual Studio > TextBox > Text > &Calculate> デザイン画面にてCに下線がつく > アクセスキー

[C# Tutorial In Urdu - C# If else statement](https://www.youtube.com/watch?v=BHeLWjxacQM&list=PLUyYwyJA_WfQd5zeCU890TDFQAqboekyc#t=605.655305)
の9:50あたりから

動作環境: Visual Studio 2010

TextBoxのTextプロパティに「&Calculate」と入力した時にテキスト表示が以下のように下線付きになっている。

```math
\underline{C}alculate
```

同様に「C&lear」で以下となっている。

```math
C\underline{l}ear
```

下線はショートカットキーと関連付けるのだろう。

- デザイン画面では下線がついている
- 実行時には下線が消えている (11:30ころ)
 
https://msdn.microsoft.com/ja-jp/library/az5a73z1(v=vs.110).aspx
> アクセス キーは、メニュー、メニュー項目、コントロールのラベル (ボタンなど) のテキストに含まれている下線付きの文字です。 定義済みのアクセス キーを Alt キーと一緒に押すと、ボタンを "クリック" した場合と同じ結果になります。 

アクセスキーというものらしい
Twigで hoge is defined and hoge is not empty がめんどくさすぎる

```
人数：
{% if vars.ninzuu is defined and vars.ninzuu is not empty %}
  {{ vars.ninzuu }}人
{% else %}
  -
{% endif %}
```

みたいなやつ

条件が複雑化してくるとしんでしまう

```
{% if (vars.ninzuu_min is defined and vars.ninzuu_min is not empty) 
   or (vars.ninzuu_max is defined and vars.ninzuu_max is not empty)
%}
  {% if vars.ninzuu_min is defined and vars.ninzuu_min is not empty %}
    {{ vars.ninzuu_min }}人
  {% endif %}
  〜
  {% if vars.ninzuu_max is defined and vars.ninzuu_max is not empty %}
    {{ vars.ninzuu_max }}人
  {% endif %}
{% else %}
  -
{% endif %}
```

はいしんだ！　もうむり！　しにます！

```
{% set min = vars.ninzuu_min|default %}
{% set max = vars.ninzuu_max|default %}
{% if min or max %}
  {% if min %}{{ min }}人{% endif %}
  〜
  {% if max %}{{ max }}人{% endif %}
{% else %}
  -
{% endif %}
```

なんかもっとかっこいいほうほうがあるようなきがするのでおしえてください
Atom エディタのスペルチェッカーが動作しない時（Win7）の解決法

Atomエディタを使用しています。

Macでは spell-check が正常に動作するのですが、Windows 7 ではどうしても動作しないというのが続いていました。

# 解決法

[このフォーラム](https://discuss.atom.io/t/spell-check-not-working/29126/18) に解決法が出ていました。

> For Windows 7, there is no built-in spell checking but also no well-known locations. I screwed up the ASAR parsing for the English-only fallback. Over on Issue 16223, the "best" way of handling that is to download the Hunspell dictionary at https://sourceforge.net/projects/hunspell/files/Spelling%20dictionaries/en_US/128, copy it into a well-known path (C:\Dictionaries or something like that), and then set the search path in Atom's spell-check settings to that path. Then it seems to work.

まとめると、

1.　[このページ](https://sourceforge.net/projects/hunspell/?source=typ_redirect)から辞書を入手する
2.　分かりやすい場所に辞書ファイルを置く
3.　Atom > Settings > Packages > **spell-check** を選ぶ
4.　**Locale Paths** の箱の中に、上記辞書ファイルの置いてあるフォルダのパスを貼り付ける
5.　**Use Locales**にチェックが入っているのを確認する
  ![Image 004.png](https://qiita-image-store.s3.amazonaws.com/0/109898/a2e06e78-e654-6a16-1409-0d3525307259.png)
　
# 特定の言語でspell-checkを利用するには

マークダウン言語で辞書を利用するにはさらにもう一手間必要です（**この部分はMacでも共通**）。

1. マークダウン形式のファイルを開いている状態で、Packages > Command Pallete > Toggleを選び、`Editor: Log Cursor Scope`を選ぶ。Macでは、`⌥` + `⌘` + `P` のキーボードショートカットが使えて便利です。
  ![Image 003.png](https://qiita-image-store.s3.amazonaws.com/0/109898/4860ec87-3cde-717d-fee0-7779d42a176a.png)
 
2. Scopes at Cursorとして表示されるもののうち、一番上に表示されるものを控えておく。（例, text.md）
  ![Image 001.png](https://qiita-image-store.s3.amazonaws.com/0/109898/8fbcbf74-0b45-2eeb-1490-a842702fc81a.png)

3.　Atom > Settings > Packages > **spell-check** を選ぶ
4.　**Grammers** の箱の中に、「スコープ」と呼ばれる言語の呼称がリストされています。その末尾に、`, text.md`（または上記の2で控えたスコープ名）と追加する
    ![Image 005.png](https://qiita-image-store.s3.amazonaws.com/0/109898/6505495f-ac1f-6020-5f90-94b29beaa911.png)