OmniAICreator/Qiita-1.07M huggingface dataset:
Carthage 導入でしがちのミス


Carthageを導入した時のミスを紹介します。

以前まではCocoaPodsを用いていたのですが、ビルド時間の改善からCarthageは不可欠だと感じました。

## CocoaPods の導入の確認

```
% pod init
% vim Podfile
```

``` Podfile.
target 'app名' do
use_frameworks!
pod 'Fabric'
pod 'TwitterKit'
pod 'TwitterCore'
end
```
```
% pod install
```

⇒一旦Xcodeを閉じて、 `.xcworkspace` を開く
以上でCocoaPodsの導入の完了です。


自分のミスは 理解していながらもCarthageの導入をCocoaPodsの導入と混同していたことでした。


## Carthage の導入
###ライブラリのインストール

```
% touch Cartfile
% vim Cartfile
```
![スクリーンショット 2017-05-12 17.40.05.png](https://qiita-image-store.s3.amazonaws.com/0/168714/9fa546ae-1b1d-fb1e-a1a6-7df85d73aa34.png)
`github "Owner/repository"` のように記述します。
記述方法はgithubのそれぞれのREADMEに記述されていたりします。

```
% carthage update --platform ios
```
Cartfileに従って、ライブラリをインストールする方法は `carthage update`のコマンドを打つだけです。
OSなどを指定したい場合は、--platformでiosなどを指定ます。

![スクリーンショット 2017-05-12 17.44.18.png](https://qiita-image-store.s3.amazonaws.com/0/168714/f5c05964-0ab4-d6ec-2a8f-66b61e36eb19.png)
ReSwift と Kingfisher がCheckoutsしたもののうまくバイナリにできなかった場合などは、以下のコマンドを打ってあげると、Checkoutsからバイナリを生成し直してくれます。

```
% carthage build
```

###作成したバイナリをXcodeプロジェクトに追加
1. `プロジェクトファイル > General > Linked Frameworks and Libraries`のプラスボタンから、 Carthage/Build に入っているframeworkを追加する。
2. add Other… を選択する
3. Finderから`Carthage > Build > 該当のライブラリ.framework`を追加します。

![スクリーンショット 2017-05-12 17.52.55.png](https://qiita-image-store.s3.amazonaws.com/0/168714/b9e8b937-90da-f3a2-0da9-0ca3e633516f.png)
上記のように3つ追加されます。

###新しいRun Scriptの作成
1. `プロジェクトファイル > Build Phases`の左上のプラスボタンからNew Run Script Phaseを選択する
2. Run Scriptの黒い部分に以下のスクリプトを追記する   
`/usr/local/bin/carthage copy-frameworks`
3. 該当のライブラリをInput Filesにプラスボタンから追加していきます。
4. $(SRCROOT)/myfilesとなっているので、myfilesにCarthage/Build/iOS/ReSwift.frameworkのように該当のライブラリのディレクトリを指定します。

![スクリーンショット 2017-05-12 17.57.24.png](https://qiita-image-store.s3.amazonaws.com/0/168714/3a51eaf0-2de3-2df0-3fc8-78feee41857c.png)

以上でライブラリの導入は完了です。
Cartfileを作成して、updateするだけは甘い考えでした。

参考
http://qiita.com/ShinokiRyosei/items/9b856ebdec5379b6c631
ARM 関数呼び出し引数の渡し方

ARMで関数呼び出しの引数の渡し方について調べてみました。

arm-none-eabi-gcc で簡単なC言語のサンプルコードをアセンブラ出力して調査しました。

```
arm-none-eabi-gcc -S test.c
```

関数呼び出しの仕様はAAPCSと呼ばれるドキュメントに記載があります。

* Procedure Call Standard for the ARM® Architecture
 * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0042f/index.html

# int 1個の場合

```
void arg1(unsigned int arg1);

void test(void)
{
    arg1(1);
}
```

```
	mov	r0, #1
	bl	arg1
```

mov で r0 に引数を代入します。
bl で関数にジャンプします。

# int 2個の場合

```
void arg2(unsigned int arg1, unsigned int arg2);

void test(void)
{
    arg2(1,2);
}
```

```
	mov	r0, #1
	mov	r1, #2
	bl	arg2
```

mov で２個目の引数をr1に代入します。

ARMではintの場合は引数４個までレジスタで渡します。

# int 5個の場合

```
void arg5(unsigned int arg1, unsigned int arg2, unsigned int arg3, unsigned int arg4, unsigned int arg5);

void test(void)
{
    arg5(1,2,3,4,5);
}
```

```
	sub	sp, sp, #8
	mov	r3, #5
	str	r3, [sp]
	mov	r0, #1
	mov	r1, #2
	mov	r2, #3
	mov	r3, #4
	bl	arg5
```
sp は　4バイトしか使わないけど８バイト伸ばします。
mov r3, #5 で５個目の引数をr3にレジスタに代入します。
str r3, [sp] で、それをメモリ上のスタックにストアします。


# float 1個の場合

```
void argf(float arg1);

void test(void)
{
    argf(1.0);
}
```

```
	mov	r0, #1065353216
	bl	argf
```
floatは32bitなので、intの場合と同じです。

# double 1個の場合

```
void argd(double arg1);

void test(void)
{
    argd(1.1);
}
```

```
	adr	r1, .L2
	ldmia	r1, {r0-r1}
	bl	argd

.L2:
	.word	2576980378
	.word	1072798105
```

double は 64bitなので r0, r1 に数値を入れます。
adr で、ラベル L2のアドレスをr1に代入し、ldmiaでr0, r1にロードします。

# dobule 3個の場合

double 2個まではレジスタ渡しできます。３個目からはスタック渡しです。

```
void argd3(double arg1, double arg2, double arg3);

void test(void)
{
    argd(1.1, 2.2, 3.3);
}
```

```
	sub	sp, sp, #12
	adr	r4, .L2
	ldmia	r4, {r3-r4}
	stmia	sp, {r3-r4}
	adr	r1, .L2+8
	ldmia	r1, {r0-r1}
	adr	r3, .L2+16
	ldmia	r3, {r2-r3}
	bl	argd

.L2:
	.word	1717986918
	.word	1074423398
	.word	2576980378
	.word	1072798105
	.word	2576980378
	.word	1073846681
```

スタックを12バイト伸ばしている理由が不明。mod 8 == 0でないけど大丈夫なのでしょうか？

# 4バイトの構造体

```
struct s4{
  int  i1;
};

void args(struct s4 st);

void test(void)
{
    struct s4 st;
    args(st);
}
```

```
	sub	sp, sp, #8
	ldr	r0, [fp, #-8]
	bl	args
```
スタックに４バイトの構造体を確保する。AAPCSではpublic interfaceの場合spは mod 8 == 0というルールなので、4バイトだけ使うが、スタックを8バイト伸ばす。
ldr で r0 に構造体をロードします。

# 16バイトの構造体

```
struct s16{
  int  i1;
  int  i2;
  int  i3;
  int  i4;
};

void args(struct s16 st);

void test(void)
{
    struct s16 st;
    args(st);
}
```

```
	sub	sp, sp, #16
	sub	r3, fp, #20
	ldmia	r3, {r0, r1, r2, r3}
	bl	args
```
スタックに16バイトの構造体を確保する。
ldmia で r0 - r3に構造体をロードします。


# 20バイトの構造体

16バイト以上の構造体は、16バイトまではレジスタで渡して、１６バイト以降はスタックで渡します。

```
struct s20{
  int  i1;
  int  i2;
  int  i3;
  int  i4;
  int  i5;
};

void args(struct s20 st);

void test(void)
{
    struct s20 st;
    args(st);
}
```

```
	sub	sp, sp, #32
	ldr	r3, [fp, #-8]
	str	r3, [sp]
	sub	r3, fp, #24
	ldmia	r3, {r0, r1, r2, r3}
	bl	args
```
スタックに20バイトの構造体を確保する。引数渡しで4バイト使うので、mod 8 == 0になるように、 24 + 8 の３２バイト スタックを伸ばす。
スタックに16バイト以降の4バイトをロードする。
ldmiaで r0 - r3に構造体をロードします。

# document

AAPCSを読む前に、Microsoftによる「ARM ABI 規則の概要」を読むと良いです。

* ARM ABI 規則の概要
 * https://msdn.microsoft.com/ja-jp/library/dn736986.aspx
NASを設定してみた。

たまに自宅でMac間でファイルをコピーしたいと思うときがあり、FreeBSDなMicroserverにZFSなNFSを設定しているのですが、小さいファイルのコピーが多いので、わざわざMicroserverを起動するほどの事でもなく、中古MIPSルーターにUSB HDを接続してNFSサーバを設定してみました。

ファームはもちろんFreeBSD/12-CurrentでZRouterでビルドしてこのためにnfs_serverというprofileを追加してみました。

netatalkもちょっと見てみたのですが、ビルドが面倒なのであきらめました。Mac OS Xになってnfsも使えるようになったので、nfsではなくnetatalkにするメリットってあるのでしょうか？

一般的にNASは24時間稼働することが一般的のようですが、自分の場合それほど使わないのに24時間運転はかなり無駄に思います。このため通常時はNFSは起動せずに、ボタンを押すとNFSをONにして、もう一度ボタンを押すとOFFになるようにしてみました。OFFの状態ではストレージのUSBハードディスクの電源を落とせますし、本体の電源をそのまま落としても問題ありません。先日書いた[evdevについてのメモ](http://qiita.com/yamori813/items/48870e32b7e3367a7bb0)はこのための下調べでした。

```ruby
#!/usr/local/bin/mruby

led = 17

nfs = 0

gpio = BsdGpio.new(0)

gpio.setflags(6, BsdGpio::OUTPUT)

gpio.set(led,1)
`killall mountd`

bin = File.open("/dev/input/event0", "rb")

while ev = bin.read(24)
typecode = ev[16,4].unpack("S*")
val = ev[20,4].unpack("L*")
  if typecode[0] == 0x04 then
    if val[0] & 0x02 == 0x02 then
      p "AOSS"
      if nfs == 0 && File.exist?("/dev/da0") then
        `mount /dev/da0 /mnt`
        `mountd -r`
        gpio.set(led,0)
        nfs = 1
      else
        mo=`showmount | grep -v -c "^Hosts"`
        mo.chop!
        if mo.to_i == 0 then
          `killall mountd`
          `umount /mnt`
          gpio.set(led,1)
          nfs = 0
        end
      end
    elsif val[0] & 0x04 == 0x04 then
      p "USB"
    elsif val[0] & 0x08 == 0x08 then
      p "RESET"
    end
  end
end
```

ディスクはnewfsでufsにしてあります。

showmountでマウント中のホストを確認し、ある場合は停止できなくしています。

ストレージは昔買って使っていなかったIDE 3.5Inc,160Gが入ったUSB HDを使いました。中にはMaxtorが入っているのですが、このハードディスクはとても熱をもつので、常時稼働はさけたいと思っていました。良い利用方法が見つかりました。

![IMGP0427.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/c004b33a-55c4-cbd8-2372-ce49ba0a154e.jpeg)

このハードディスクは昔懐かしい、IED 3.5incのディスクが入ったUSBドライブなのですが、結構な発熱しているので、完全に電源断にしたいと思ったのものひとつの理由です。

このMIPSルーターのSOCはAtherosのチップで、sys/mipsでatherosは一番活発にメンテされていてUSBやEthernetも十分安定しています。

ワットチェッカーで消費電力を調べてみました。

|状態|消費電力|
|:--|:--|
|NFS OFF|3W|
|NFS ON|18W|
|電源 OFF|0W|

NFS OFFを忘れて電源を落としてしまうと次ぎにONにするときにmountできなくなるので、そのときはcliでfsckを実行します。

NFS OFFの時にもEthernetのSwitchとして機能しているので、3Wも無駄になってるわけではありません。

何よりこの仕組みの良いところは完全に電源を遮断できるところです。私は就寝前にネットワーク関係は電源を落としているので深夜帯は0Wで運用できます。

最近のNASは省エネ化が進んでいるようですが待機中に0Wにすることは不可能です。明示的なON/OFFにまさる節電方法は無いように思います。

1000baseTで接続されたMACからファイルを書き込むと落ちてしまうので、コンソールを確認したところkern.ipc.nmbclustersが足りてませんでした。とりあえず1220から5000にしたら、落ちないようです。
ngrok | グローバルなURLからローカルサーバーを参照する ( Slack API チュートリアルより )

# ngrok をダウンロード

https://ngrok.com/ より

## 解凍して、パスの通っているディレクトリに移動させる

例: 

`$ unzip ~/Downloads/ngrok-stable-darwin-amd64.zip`
`$ mv ngrok /usr/local/bin`

# ngrok を起動

`$ ngrok http 4390`

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/7d34ee8e-6c3c-8f6c-5442-c4cf8a662e4d.png)

# 画面に表示されたURLにアクセスする。

( この場合は https://ec6b5635.ngrok.io )

ここではまだエラーが出る。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/2eef7caa-1e4c-c694-da0a-376e21f2653f.png)

# ローカルサーバーを立てる

やり方はなんでも良いが、ここでは node を使ってみる。

## node のインストール

`$ brew install node`

## サーバー起動用ファイルを作成

```js:indes.js
// First we need to import the HTTP module. This module contains all the logic for dealing with HTTP requests.
var http = require('http');

// We define the port we want to listen to. Logically this has to be the same port than we specified on ngrok.
const PORT=4390;

// We create a function which handles any requests and sends a simple response
function handleRequest(request, response){
  response.end('Ngrok is working! -  Path Hit: ' + request.url);
}

// We create the web server object calling the createServer function. Passing our request function onto createServer guarantees the function is called once for every HTTP request that's made against the server
var server = http.createServer(handleRequest);

// Finally we start the server
server.listen(PORT, function(){
  // Callback triggered when server is successfully listening. Hurray!
  console.log("Server listening on: http://localhost:%s", PORT);
});
```

## ローカルサーバーを起動する

```
$ sudo node index.js

Server listening on: http://localhost:4390
```

## 再度 グローバルURLにアクセスする

( この場合は https://ec6b5635.ngrok.io )

動いているようだ。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/e892ecff-2111-1486-865d-9096f9bddbb8.png)

# ログ

## コンソールにレスポンスが記録されている

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/f414b447-96ba-f7d6-9957-5e415a795d02.png)

## ローカルのウェブインターフェイス

こんな感じで記録されている。

( この場合は http://127.0.0.1:4041 )

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/08d269ac-da10-ab77-2b2a-4f1e156d7ab6.png)


# その他

もちろん Rails とかでも出来る！(ポートを合わせよう)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/a00b10e4-bc63-d776-9c6b-4e328338533c.png)

# 環境

- Mac OS X El Capitan 10.11.6

# 参考

- https://api.slack.com/tutorials/tunneling-with-ngrok








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SourceTreeでGitリポジトリに急にpullやfetchができなくなった時の対処

# 結論から先に

原因はいくつかあるが、たいていは下記2つのうちのどちらか。

## 原因その１

* 原因：Bitbucketにログインしていない
* 対処：WEBブラウザでBitbucketにログインすると直る

## 原因その２

* 原因：SourceTreeが `~/.ssh/config` に自動で書き込んでいるHostが間違えてる
* 対処：Hostをドメイン名（Bitbucketなら `bitbucket.org` ）に変えれば直る

```txt:~/.ssh/config
Host bitbucket.org
        HostName bitbucket.org
        User xxxxxxxx
        PreferredAuthentications publickey
        IdentityFile xxxxxxxx
        UseKeychain yes
        AddKeysToAgent yes
```

### 状況

* SourceTreeを使っている
* BitbucketのGitリポジトリを使っている
* 急にpullやfetchができなくなった
* 昨日まではできた
* terminalから直接 `git pull` してもダメ

### エラー内容

```
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

### 余談

* 最初はssh鍵がおかしくなっちゃったかなと思ったけど違った
* リポジトリが消えたわけでもなかった
* IPv4とかIPv6も関係なかった
混合ガウス分布のEMアルゴリズムによる推定


```py
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
plt.style.use("ggplot")

K = 2
M = 1
N = 1000

# 実際の値
mu1 = 1
sigma1 = 0.2
N1 = int(N*0.3)
mu2 = 5
sigma2 = 1
N2 = int(N*0.7)

x = np.concatenate([np.random.normal(mu1, sigma1, N1), np.random.normal(mu2, sigma2, N2)])
plt.hist(x, bins=100, normed=True)
plt.show()
```
![ASjFHlVqtP15AAAAAElFTkSuQmCC.png](https://qiita-image-store.s3.amazonaws.com/0/108994/7d78886f-c08c-7c8c-c460-b3b60a08c1ab.png)

```py
# 初期値
w = np.random.uniform(0,1,K)
w /=  w.sum()
mu = [3, 10]
sigma = [1, 1]
ita = np.zeros([N, K])

# EM アルゴリズム
training_iter = 50
for epoch in range(training_iter):
    # Estep
    for k in range(K):
        ita[:, k] = w[k] * stats.norm(mu[k], sigma[k]).pdf(x)
    ita = ita/ita.sum(1)[:, np.newaxis]

    # Mstep
    w = ita.sum(0) / N 
    mu = ita.T.dot(x) / ita.sum(0)
    for k in range(K):
        sigma[k] = np.sqrt(((x - mu[k]) ** 2 * ita[:, k]).sum(0) / ita[:, k].sum() * M)
    # 図示    
    x_ = np.linspace(0, 8, 200)
    y0 = w[0] * stats.norm(mu[0], sigma[0]).pdf(x_) 
    y1 = w[1] * stats.norm(mu[1], sigma[1]).pdf(x_) 
    plt.plot(x_, y0)
    plt.plot(x_, y1)
    plt.hist(x, bins=100, normed=True)
    title = "epoch: {}".format(epoch+1)
    plt.title(title)
    # plt.savefig("data/" + title + ".png")
    plt.show()
```

![タイトルなし.gif](https://qiita-image-store.s3.amazonaws.com/0/108994/b00e08a9-15b5-60a2-4176-8d1c76cf6e7f.gif)
Mac | OS の言語設定を英語にする ( だが日本語入力は保つ )

# 手順

**システム設定 > 言語と地域 > 優先する言語**  

で English を1番目に移動させる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/9b20ce63-d857-930a-b620-1ee60d95c88a.png)

その後、OSを再起動する。

# OS再起動後

**System Preference > Keyboard > Input Sources**

から日本語の入力ソースを追加する。(Google日本語入力の場合)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/6c0b7aa8-2343-6e3c-a0d9-3846d69cef7c.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/d1fd0794-8edf-aebb-114d-10d91faea9ef.png)

# 元に戻す場合

**System Preference > Language & Region > Preferred Language** で日本語を1番目に戻す。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/2f0f585f-771b-7340-2896-71d4ff96f4f3.png)

その後 OS を再起動する。


# 余談

- OSが吐くエラーメッセージでググりにくいので設定を変更した。
- OSの言語を切り替えた時に、キーボードの入力ソースも自動で変更されるようだ。
  - 以前に英語設定にした時は「日本語入力できないじゃん！」と思って一瞬で元に戻していた。

## ビフォー

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/b644b461-f520-8b42-4b06-0ef66ca173dd.png)

## アフター
![image](https://qiita-image-store.s3.amazonaws.com/0/89618/71033270-7c38-79c3-b134-486d7a0bd8af.png)

# 環境

- Mac OS Capitan 10.11.6 El 








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Slack API | メッセージのURLからメッセージ内容を取得する


# メッセージのリンクをコピーする

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/f7482215-22ba-25d8-82dc-64a211bfae45.png)

# リンクを分解する

たとえば

`https://yuma-inaura.slack.com/archives/C18TMAQSD/p1494596759016203`

というリンクの場合、以下の構成になっている。

- **C18TMAQSD** => チャンネルID
- **1494596759016203** => 投稿時刻 ( メッセージに対して一意 )

# channels.replies メソッドを使う

https://api.slack.com/methods/channels.replies/test にアクセスして、以下をそれぞれ入力する。

- channel : チャンネルID
  - ( 今回だと `C18TMAQSD` )
- thread_ts : 投稿時刻の6桁をドットで区切った値
  -  ( 今回だと `1494596759.016203` )

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/63596703-3c35-6180-c780-50f5dc7d8df5.png)

# 結果

メッセージ内容や、スレッドでの返信内容が得られる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/546b8230-587c-a680-fcbd-d4817dbd9da3.png)

# 余談

- なぜ replies なんていうメソッド名なんだろう。(メッセージが返信であるとは限らないはず)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ORCAにnode.jsでアクセスしてみた꒰｡･ω･`;꒱

# チェック方法

- expressから、ORCAにHTTPで患者情報を取得し、その結果を表示する

## ファイル構成

```bash:console
+ express_app
  + index.js
  + htdocs/
    + index.html
    + app.js
+ node_modules
+ package.json
```
## 起動方法

```bash:console
$ node index.js
```

# パッケージの追加

```bash:console
$ npm install --save xml2js
```
# 患者情報取得

## クライアントサイド

```html:index.js
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script
    src="http://code.jquery.com/jquery-3.2.1.min.js"
    integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
    crossorigin="anonymous"></script>
  <script type="text/javascript" src="app.js"></script>
</head>
<body>
  <h1>index.html</h1>
  <p id="result"></p>
  <button id="loadPatient">読込</button>
  <!--button id="loadPatient_Post">読込(POST)</button-->
</body>
</html>
```

```js:app.js
$(function() {
  $('#loadPatient').on('click', function() {
    $.ajax({
      url: '/',
      type: 'POST',
      dataType: 'json',
      data: { patient_id: 1 },
      timeout: 3000,
      success: function(json) {
        if (json.data) {
          $('#result').text(json.data.name);
        } else {
          $('#result').text('error');
        }
      },
      error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert('患者データを読み込めませんでした');
        $('#result').text('error');
      }
    });
  });
});

```

## サーバサイド

```js:index.js
var express = require('express');

var app = express();

// POSTパラメータ受信用
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

// XML->JSON変換用
var parseString = require('xml2js').parseString;

// htdocsに静的なページを用意する
app.use(express.static('htdocs'));

app.set('port', 5000);

// POST '/' 
// PARAM patient_id 患者番号
app.post('/', function(req, res) {
  // リクエストボディを取得する
  console.log(req.body);
  const patient_id = req.body.patient_id;
  if (patient_id) {
    const username = 'ormaster';
    const pswd = 'ormaster';
    var options = {
      host: '[IP]',
      port: 8000,
      path: '/api01rv2/patientgetv2?id=' + patient_id,
      headers: {
        'Authorization': 'Basic ' + new Buffer(username + ':' + pswd).toString('base64')
      }
    };

    var http = require('http');
    var data = null;
    http.get(options, function(res_) {
      res_.on('data', function(chunk) {
        data += chunk.toString();
      }).on('end', function() {
        var xml = '<root>' + data + '</root>';
        parseString(xml, function(err, result) {
          if (result) {
            const patient_name =
              result.root.xmlio2[0].patientinfores[0].Patient_Information[0].WholeName[0]._;
            res.json({ 'data': { 'id': patient_id, 'name': patient_name } });
          }
        });
      });
    }).on("error", function(e) {
      res.json({ 'err': { 'id': patient_id, name: '' } });
      console.log("Got error: " + e.message);
    });
  }
})

app.listen(app.get('port'), function() {
  console.log("Node app is running at localhost:" + app.get('port'))
});
```
都道府県別Mastodon一覧


随時更新中

都道府県別にご当地マストドンをまとめています。
足りないものに関しては編集リクエストを送って頂ければ、すぐにマージします。

###北海道地方
####北海道
[mstdn.hokkaido.jp (北海丼)](https://mstdn.hokkaido.jp)

###東北地方
####青森県
####岩手県
[イワテドン](https://iwatedon.net/
)
####宮城県
####秋田県
####山形県
[yamahatdon.jp](https://yamagatadon.com/)
####福島県

###関東地方
####茨城県
[いばどん](https://ibarakiken.m.to)
####栃木県
####群馬県
[gunmastodon.com (グンマストドン)](https://gunmastodon.com)

####埼玉県
[マストドン@埼玉連邦](https://saitama-stdn.com)

####千葉県
[chibadon.jp (ちばどん)](https://chibadon.jp)


####東京都
[mastodon.tokyo](https://mastodon.tokyo)

####神奈川県
[mastodon.yokohama ](https://mastodon.yokohama)
[m.pref.yokohama](https://m.pref.yokohama)

###中部地方
####新潟県
####富山県
####石川県
[mstdn-kanazawa.jp (金沢のMastodon)](https://mstdn-kanazawa.jp)

####福井県

####山梨県

####長野県
[https://ngndn.jp(ナガノドン)](https://ngndn.jp)

####岐阜県

####静岡県

####愛知県
 
###近畿地方
####三重県

####滋賀県
[shigadon.com (滋賀丼)](https://shigadon.com)

####京都府
[https://mastodos.com（マストどす）](https://mastodos.com/)

####大阪府
[mstdn.osaka (大阪弁・関西弁)](https://mstdn.osaka)

####兵庫県
[mstdn.hyogo.jp (兵庫丼)](https://mstdn.hyogo.jp)
[don.akashi.cloud (明石のマストドン)](https://don.akashi.cloud)

####奈良県
[mastodon.nara.jp (鹿トドン)](https://mastodon.nara.jp)

####和歌山県
[mastodon.wakayama.jp (和歌山丼)](https://mastodon.wakayama.jp)

###中国地方

####鳥取県
####島根県
####岡山県
[mstdn.okayama](https://mstdn.okayama.jp)

####広島県

[ひろしますとどん](https://hiroshimastodon.red/)

####山口県
[oidemasetodon.com（やまぐちドン）](https://oidemasetodon.com)

###四国地方
[shikokudon.m.to](https://shikokudon.m.to)
####徳島県
####香川県
####愛媛県
####高知県

###九州地方
####福岡県
[mstdn.fukuoka.jp](https://mstdn.fukuoka.jp)

####佐賀県

####長崎県
[mstdn.nagasaki.jp (長崎は今日も Mastodon)](https://mstdn.nagasaki.jp)

####熊本県
####大分県
[mastodon.oita.jp](https://mastodon.oita.jp)

####宮崎県
####鹿児島県
[saigodon.jp (Saigodon)](https://saigodon.jp)

###沖縄地方
####沖縄県

###その他
Rubyでファイルとかディレクトリをまとめて作る

#はじめに
Rubyを使って、CSVファイルから読み込んだ内容を元に
ファイルとかディレクトリをまとめて作るプログラムを作ってみました

#作成目的
・ファイルメーカー
プログラムコンテストの問題なんかを解く時に一々ファイル作るの面倒だな
→出来ればファイル名とか指定して作れると楽

・ディレクトリメーカー
上で作ったファイルをしっかり分類しておきたいな
→深い階層まで一気に作れると楽

・(双方共通)して一々プログラムを弄らなくても済むように、CSVファイルでまとめて読み込めるようにしたいな
(連番ならエクセルを使う事で楽に作れるため）

#ソースコード
どちらもAtcoderのABC用に作ると想定してます

・ファイルメーカー

```file_maker.rb
Encoding.default_external = Encoding::UTF_8
require 'csv'
require 'fileutils'
require 'date'

filelist = CSV.readlines("filelist.csv").flatten
filelist.each do |i|
  File.open "#{i}",'w' do |r|#作成したファイルを書き込みモードで開く
    r.write "#Created on #{Date.today}" #中身に必要な物を書く、今回は日付
  end
end
```
```filelist.csv
060A.rb
060B.rb
060C.rb
060D.rb
...
057D.rb
056A.rb
056B.rb
056C.rb
056D.rb
```

・ディレクトリメーカー

```directory_maker.rb
Encoding.default_external = Encoding::UTF_8
require 'csv'
require 'fileutils'

dirlist = CSV.readlines("dirlist.csv").flatten #ネストした状態で格納されてる、でも普通の区切りで問題ないのでflatten

dirlist.each do |i|
  FileUtils.mkdir_p("#{i}") #ダブルコーテションじゃないとiが反応しないので注意
end
```

```dirlist.csv
./ABC/ABC060
./ABC/ABC059
./ABC/ABC058
./ABC/ABC057
./ABC/ABC056
```

#実行時の挙動
予めCSVファイルを作成しておいて、同じディレクトリにある状態でプログラムを走らせれば
CSVファイルに記入した内容で勝手に作ってくれます

#今後の課題
二つを一体化させて、ディレクトリとファイルを同時に作っても良いかもしれない
ただ個人的に使う分には上記二つで充分なので作るか微妙
~~（そもそも大量にフォルダとファイルを作る機会があんまり無い）~~

#雑感
プログラミングによって、作業が凄く楽になったと実感するプログラムが初めて書けたと思いました
少し書き換えればJavaにも対応可能なので、個人的には良いのが作れたかなーと
ただもっと発展させる事が出来そうな気もするので頑張りたいです
chainerでx方向にconv、y方向にdeconvする

## 概要
あるタスクで，X方向の特徴量を少なくしつつ，Y方向の特徴量を多くしたくなった．
例えば大きさ（100, 100）の画像を，conv/deconvを使って(50,200)にしたい．
これを解決する方法は大きく分けて２つある．

1. conv→deconv　もしくは　deconv→conv
2. 引き伸ばし→conv

最初の方法だと２層構造になってしまうため避けたい．
そのため引き伸ばしてconvする手法を検討し，実装した．

しかし良い実装方法が思いつかず`functions.deconvolution_2d`を用いた．
可能であればもっとスマートな実装をしたい．

## 背景
convolutionを使えば，位置情報を維持しつつより少ない特徴量に写像できる．

```py3
x = numpy.random.rand(1, 1, 100, 100).astype(numpy.float32)
shape = chainer.links.Convolution2D(1, 1, ksize=(4, 1), stride=(2, 1), pad=(1, 0))(x).shape
# shape: (1, 1, 50, 100)
```

deconvolutionを使えば，位置情報を維持しつつより多い特徴量に写像できる．

```py3
x = numpy.random.rand(1, 1, 100, 100).astype(numpy.float32)
shape = chainer.links.Deconvolution2D(1, 1, ksize=(1, 4), stride=(1, 2), pad=(0, 1))(x).shape
# shape: (1, 1, 100, 200)
```

しかし，ある次元では少ない特徴量に，別の次元では多い特徴量に写像するLayerはたぶんない．

## 手法検討
### conv→deconv／deconv→conv
一番シンプルな実装だが，どうしても２層構造になり，勾配が消失しやすくなりそうなので避けたい．

```py3:conv->deconv
x = numpy.random.rand(1, 1, 100, 100).astype(numpy.float32)
x = chainer.links.Convolution2D(1, 1, ksize=(4, 1), stride=(2, 1), pad=(1, 0))(x)
x = chainer.links.Deconvolution2D(1, 1, ksize=(1, 4), stride=(1, 2), pad=(0, 1))(x)
# x.shape: (1, 1, 50, 200)
```

```py3:deconv->conv
x = numpy.random.rand(1, 1, 100, 100).astype(numpy.float32)
x = chainer.links.Deconvolution2D(1, 1, ksize=(1, 4), stride=(1, 2), pad=(0, 1))(x)
x = chainer.links.Convolution2D(1, 1, ksize=(4, 1), stride=(2, 1), pad=(1, 0))(x)
# x.shape: (1, 1, 50, 200)
```

### 引き伸ばし→conv
２つ考えた．まずその１．
`functions.unpooling_2d`を使って引き伸ばしたあと，convで小さくする．

```py3:unpooling->conv
x = numpy.random.rand(1, 1, 100, 100).astype(numpy.float32)
x = chainer.functions.unpooling_2d(x, ksize=(1, 2))
x = chainer.links.Convolution2D(1, 1, ksize=(4, 4), stride=(2, 1), pad=(1, 2))(x)
# x.shape: (1, 1, 50, 200)
```

続いてその２．
`functions.deconvolution_2d`を使って引き伸ばしたあと，convで小さくする．
1010101010...といったマスクを作って，deconvで引き伸ばす感じ．

```py3:upsample->conv
x = numpy.random.rand(1, 1, 100, 100).astype(numpy.float32)
x = chainer.functions.deconvolution_2d(x, W=numpy.array([0, 1, 0], numpy.float32).reshape(1, 1, 1, 3), stride=(1, 2))
x = chainer.links.Convolution2D(1, 1, ksize=(4, 4), stride=(2, 1), pad=(1, 1))(x)
# x.shape: (1, 1, 50, 200)
```

## 考察
どれがいいのだろう．

* conv->deconv
    * convしたときに特徴量がやたら少なくなっているので良くなさそう
    * メモリ使用量は少ない
* deconv->conv
    * この２層構造は`upsample->conv`と同値・・・な気がする
    * deconvのあとに活性化関数を挟むならありかも
* unpooling->conv
    * upconvだとか呼ばれてたりする手法に似ている
        * [Deconvolution and Checkerboard Artifacts](http://distill.pub/2016/deconv-checkerboard/)
    * これが一番無難そう
* upsample->conv
    * 良い実装方法が思いつかなかった
    * 専用のLayerを定義できればメモリ削減できそう

## 今後
そもそも2Dではなく，`links.ConvolutionND`を使って３次元convする際に適用するつもりなのだが，`functions.unpooling_nd`が無いことに気づいた．どうしよう．
NEMアカウントの時価総額をJavaScriptで計算する。

今回は非同期通信の技術を用いて暗号通貨NEMの時価総額を日本円で算出してみます。

依存するライブラリはjQueryのみ

```html:jquery
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
```

非同期通信する接続先は以下の２つです。
https://poloniex.com/public?command=returnTicker
https://blockchain.info/ticker

poloniexへはBTCとXEMの価格、blockchain.infoへはBTCと日本円の価格情報を取得に行きます。両方のサイトの情報が同時に取れないと計算ができないので、$.whenを利用して以下のように記述することができます。

```js:when
$.when(
	sendAjax("https://poloniex.com/public?command=returnTicker"),
	sendAjax("https://blockchain.info/ticker?cors=true")
)
.done(function(res1, res2) {


})
.fail(function(xhr, textStatus, errorThrown) {

	alert("時価の取得に失敗しました。");
});

```

blockchain.infoサーバはクロスドメイン制限があるので、クエリとして
?cors=true
を追加してあげましょう。残念ながらzaifのAPIはクロスドメイン制限のため今回の使用は見送りました。
poloniexからの戻りjsonはres1[0]に
blockchain.infoからの戻りjsonはres2[0]に入ってきますので

以下のように時価総額を計算することができます。

```js:price
var JPY_XEM = res1[0].BTC_XEM.last * res2[0].JPY.last;
var polo_price = account.balance / 1000000 * JPY_XEM;
polo_price = String(Math.round(polo_price)).replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
JPY_XEM = Math.round(JPY_XEM * 1000) / 1000;
$("#polo_price").text(polo_price + "円 (" + JPY_XEM + "JPY/XEM換算)");

```

.replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
で３桁カンマ、
Math.round(JPY_XEM * 1000) / 1000
で小数点３桁以下を切り捨てしているので、必要に応じて修正してみてください。

では最後に動くものを置いておきます。
addressの後ろはご自身のアドレスを指定してみてください。
徐々にブラッシュアップして最後にはXEMBookとして、貯める系XEM運用ツールにしていけたらと思っています。

http://s3-ap-northeast-1.amazonaws.com/nemtest/xembook2.html?address=NAFYRW5DCJR7L5JKOOF2XQ4YFYNDQN6Y5C3UI4PM


今回はクロスドメイン対応されている取引所からの情報取得をしてみました。

それでは！

----
以下のNEMアドレスは、全てNEM上でエンジニアが活動できるための資金に使用します。
これから私が書く記事に共感していただけましたら、ご寄附いただけると助かります。

NEM ADDRESS: NBZNQL-2JDWTG-UAW237-PXV4SS-XSPORY-43GUSW-GSB7
【メモ】iPhoneで位置情報を取得してアプリ画面に点グラフ(散布図)として表示する

# locationManagerで現在地取得

位置情報が変更された時に呼び出されるlocationManagerのコールバック関数「didUpdateLocations」
これが呼ばれるたびに位置情報をChartsの点グラフで描画

## ソースコードの一部

```swift:ViewController.swift
import Charts
import CoreLocation
//省略

class ViewController: UIViewController, CLLocationManagerDelegate {
    let rect = CGRect(x: 16, y: 344, width: 288, height: 126)
    var chartView: ScatterChartView!
    var mySet: ScatterChartDataSet!
    var dataSets: NSMutableArray = []
    var data: ScatterChartData!
    //省略
    
    override func viewDidLoad() {
        chartView = ScatterChartView(frame: rect)
        view.addSubview(chartView)
        //省略
    }
    //省略

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        NSLog("%@", "didUpdateLocation \(locations[0].coordinate.longitude),\(locations[0].coordinate.latitude)")
        let location : CLLocation = locations[0]
        let latlng = location.coordinate
        mylongitude = latlng.longitude
        mylatitude = latlng.latitude
        myGPSEntry = [BarChartDataEntry(x: latlng.longitude, y: latlng.latitude)]
        
        mySet = ScatterChartDataSet(values: myGPSEntry, label: "Me")
        self.mySet.setColor(NSUIColor.red)
        
        self.dataSets.removeAllObjects()
        self.dataSets.addObjects(from: [self.mySet])
        
        self.data = ScatterChartData(dataSets: self.dataSets as? [IChartDataSet])
        
        self.chartView.data = self.data
    }
    //省略
    
}
```
メールアドレスをBase64でエンコードして、jQueryで実装



---

前回の記事で、Base64を使用しない簡易的な方法を書いてしまったので、Base64でencodeした方法を試した結果を書きます。

ご指摘いただきありがとうございました。

---

**[HTML]**
該当部分だけ書いています。

```html:index.html
<!-- shortcut all above -->
<body>
  <div class="mail">
    <a href="" id="mail"><i class="fa fa-envelope-o fa-5x" aria-hidden="true"></i></a>
  </div>
<!-- shortcut all <script> -->
</body>
</html>
```

**[jQuery]**
Base64でencodeをあらかじめ行ったメールアドレスを書く。

```js:main.js
$(function () {
  $("#mail").click(function () {
    var iAmComplicated = function () { return atob('aGVsbG9Ad29ybGQuY29t') }; // encodeしたメールアドレス
    $(this).attr("href", 'mailto:' + iAmComplicated());
    $(this).hide(iAmComplicated());
    $(this).show('.fa-envelope-o');
    $(this).off("click");
    preventDefault();
  });
});
```

**[ここで実装できたこと]**
- メールアドレスをBOTと人の両方から解読が難しいものにすることができた
- メーラーも起動する
- encodeしたアドレスが、起動したメーラーではdecodeされている

当たり前のことですが、明らかにBase64を使用する方法が賢明だとわかりました。助言をいただいて気づくことができ、とても勉強になりましたので、こちらの記事もご指摘がありましたらよろしくお願いします。

**[encodeの方法]**

以下の参考記事で試してみました。
1. developer tool の console を開く
2. console に console.log(btoa('xxx@mail.com')); と記入（encode したいメールアドレスが xxx@mail.com の場合）
3. encode された結果が表示される

> 参考記事:
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa
http://jhirniak.github.io/post/hiding_email_with_jquery/
プログラミング 2 か月目

プログラミングを始めて 2 か月が経とうとしています。

　各言語にも少しずつ慣れてきて、簡単なプログラムや Web デザインはある程度できているような気がします。今回も前回と同じような感じで書いていきたいと思います。


#:pencil2: 進捗状況

**Progate**

HTML/CSS：道場編・実践編を残すのみ
JavaScript：すべて終了
jQuery：上級編まで
PHP Ⅱ： オブジェクト指向に苦戦中…
Ruby Ⅳ : クラス・インスタンス・initialize・require
※ Ruby on Rails5 Ⅳ ：編集・削除機能をつける


※ フレームワークの重要な概念であるMVCを理解することに重点を置きました


#:pencil2:  新着事項
　2 か月目で新たに取り入れたことや、プログラミングで意識したことを書いていこうと思います。
##各言語をつなげて総合的に理解する

　1 ヶ月目はひたすら体に染み込ませることを重視していましたが、2 ヶ月目は**「総合的に」理解すること**に重点を置きました。

　サイトやシステムは、**HTML+CSS,HTML+CSS+Javascript** といったような複数言語で構成されていますので、それらを総合的に使って簡単なものを作っていきました。


オススメ
**[CODEPREP](https://codeprep.jp)**

基本的に Progate と似ていますが、こちらは**穴埋め式**でコードを打ち込みながらプログラミングを覚えるタイプです。実践編で簡単なものを作って仕組みを理解していきました。


基礎編では頻出の技術やより特化した内容が盛り込んであるので、何度も繰り返して、Progate や書籍で理解できなかったことを重点的に覚えていきました。

Progate にない言語もありますので、興味があれば挑戦してみるのもいいかもしれませんね！



##作っているコードの図を描く

コードを打ち込んでみて分かったことですが、コードで何かを作るときはノートで**図を描く**のをお勧めします。

###なぜ図を描いた方がいいのか？

①　**脳の短期記憶では限界がある**　



頭で全部組み立てようとすると、途中で忘れてしまうことがあります。
そこからミスが発生しやすくなったり、思い出すのに時間がかかったりします。
それらを防止する目的で、全部ノートに図で描いてしまいましょう！

➁　**「文字だけ」ではイメージしにくい**

例えばこんなCSSのコードを書いたとします

```css:styles.css
.box{
 background-color:#CCC;
 width:250px;
 height:250px;
 position:relative;
 margin:0 auto;
 padding :10px;
}
```

　これをパッと見て、すぐにどんなスタイルになるのかイメージが湧き上がってくるでしょうか？　初心者の方にとっては難しいかもしれません。
　
　ただの一例ですが、こんな感じの文字だけではなかなかイメージが付きにくいと思います。本格的になると、こういうコードがズラッとたくさん書かれます。

　しかも、例に挙げたCSSだけではなくJavaScript,jQuery も実装となると、とても時間がかかるかと思います。文字、文字、文字の嵐で頭が痛くなりそうですね（汗）


③　**ファイル間の移動が多くなるのでかなり手間**

　対応しているところはどこか分かりづらいので、それを確認するためにほかのファイルを見てそれがどこか探して…といった感じでかなり手間がかかってしまいます。

　テキストエディタの中には、複数のファイルを表示させる機能が付いたものがありますので、あまりデメリットとは言えないかもしれません。



※ このように、図を描かないと手間と時間がかかって思うように進まなくなってしまうので図を描くことをお勧めします。


###図の描き方の一例

　それでは、自分はどのようにして図を描いているのかというのをお見せしたいと思います。参考にしていただけたら幸いです。


![2017-05-12_232604.png](https://qiita-image-store.s3.amazonaws.com/0/174892/18e0fd43-c93b-fbb2-a28d-5d98786d4a56.png)



茶色　→　HTML
緑色　→　CSS
黄色　→　JavaScript,jQuery の変数

※ JavaScript , jQuery の左にある記号は「動きをつける」という意味で「歯車」に見立てています。


###図を描いてみた感想
　実際に図を描いてみたら、何がどこと対応しているのかがすぐ分かるようになりました。実装するときも、図を見ながらどこをどのように実装すればいいのかも描かない時と比べで断然分かります。理解スピードも段違いに早くなった感じがします。

　図を描くことは、学習効率を高めるのにとても有効な手段だと思いますので是非ともお試しください！

#:star: 最後に
　
　 学習が進むにつれて、難しい概念が次々と現れてきました。そのため、理解するのに時間がかかりますが、着実に進んでいると思います。まだ分からないことがたくさんありますが、一日でも早く上達できるように頑張りたいと思います。
【計画】ドキュメント管理ツールを作ってみる

【経緯・動機】

新規及び既存プロジェクトが始まった際にドキュメントを作成しなければならない。
パワポやエクセル、プロジェクト管理ツール及びドキュメント管理ツールよる構成管理がしんどいので作ってみようと思った。

とりあえず世の中にいっぱいあるであろうツールだけど最近自分で手を動かすことも少なくなったのでスキルアップも兼ねて作りたい。

「これ使ってプロセス回せば"ISO 20000"なんてちょろいよね」ってなれば理想

【開発コードネーム】

まずは形からということで…
ドキュメント作成 & 構成管理 システム
DoCCS(ドックス)
Document Creation and Configuration management System


【やりたい事】※随時記載

◾️機能
・プロジェクトに紐付くドキュメントを一括管理する。
・要件定義〜テストまでの関連ドキュメントを全て紐付ける
・紐付けした先で評価を入れることができる
→レビューするのに必要な観点を洗い出すことができる
・レビューのリクエストが投げられるようにしたい(slackとか)
・ドキュメントをPDFで出力できるようにしたい(PJ単位、工程単位、ページ単位)
・バージョン管理したい
・権限管理したい
・文書外にコメントが入るようにしたい

■想定範囲
※詳細は要件定義
・要望/計画←検討
・要件定義
    業務用件
    機能要件
    非機能要件
・設計
  基本設計
    機能設計
    画面設計
    API設計
    バッチ設計
    構造設計 等

  詳細設計←UMLは画像入稿程度を想定
    フローチャート
    クラス図
    シーケンス図 等
・テスト
   単体テスト計画書
   単体テスト仕様書
   結合テスト計画書
   結合テスト仕様書
   総合テスト計画書
   総合テスト仕様書
   本番テスト計画書
   本番テスト仕様書 等
■手段
まずはローカルで…
・apache
・PHP7
・laravel
※業務で使う予定なので慣れたい

最終的にはAWSに…
・lambda
・java

その他
redisみたいなcache機構を持ちたい
Elasticseachを使ってみたい
jenkinsを使ってみたい(何に)
かっこいいソリューションがあれば随時採用

夏には完成させたいな…
画像や inline 要素の周辺に出来る余白・アキ

掲題の問題で悩んではる人が居たので、軽くレクチャーついでに知見メモ。


## 左右に出来る余白・アキ

`an apple` は当然ながら `an` と `apple` の間に空白が空きます。

inline 要素や inline-block 要素なども同様、
`<img> <img>` の様に左右に並べると空白が空きます。

下記の様に、空白なしで改行・次の要素が来る場合は空かないようですが、
綺麗にインデントした場合を考えると非現実的なので、回避策を考えます。

```html
<img>
<img>

<!-- インデントが入ると開く -->
<div>
  <img>
  <img>
</div>
```

### 解決策 1: タグの連結

トリッキーな解決策ですが、次の要素に繋げる事で解消できなくは無いです。
コメントタグを使う、ないし閉じ括弧だけ改行するなどで。

```html
       <img><!--
    --><img><!--
    --><img><!--
    --><img>
```
```html
     <img
    ><img
    ><img
    ><img>
```

### 解決策 2: float × clearfix

それでも HTML を綺麗に書きたい場合は、各要素を float させて、
親要素に clearfix を適用するのがベターかなと思います。

```css
.parent-element {
    /* Clearfix */
    &::after {
      display: table;
      clear: both;
      content: "";
    }

    .target-element { float: left }
}
```

### 解決策 3: flex 要素で囲う

`display: flex` を適用した要素で囲います。

```html
<div style="display: flex">
  <img>
  <img>
</div>
```

※画像を flex の要素で囲うと Mobile の Safari などで想定外の挙動をする事が有ったので注意。


## 下に出来る余白・アキ

テキストのベースラインが原因です。
`vertical-align` のデフォルト値が `baseline` になっているので、
それを書き換えれば解消できます。
`vertical-align: baseline`

### 解決策 1: `vertical-align`

シンプルに `vertical-align: top` を適用しましょう。

~~他に top、middle もありますがデフォルト値の baseline に
挙動が一番近い bottom が個人的には良いかなと思います。~~
(ファイルサイズ・パフォーマンス優先で `top` 推奨)

昔は縦幅の小さい装飾画像などを入れる際に、
`font-size` や `line-height` なんかが悪さをする事がありましたが、
今は背景画像にするケースが多いので、大体これで解決すると思います。
(解消しなければ `font-size` や `line-height` に小さい値を入れる。)

### その他の解決策

こちらも float × clearfix や flex 要素で囲っても解消できますが、
想定外の挙動をしたり、レイアウトを制御しにくくなったりレイアウト崩れの元にもなるので、いずれも乱用はお勧めしません。

### 余談

Tailwind CSS は img 要素に `display: block` と `vertical-align: middle` の両方が設定されています。
個人的には `block` は元の挙動と大きく異なるため、Tailwind CSS の導入・排除する際に壊れやすいポイントで嫌いな指定です。 

**元の挙動：左右に並ぶ → 導入後の挙動：上下に並ぶ**

_ref:_ https://github.com/jensimmons/cssremedy/issues/14

## 参考記事

- [inline-blockの隙間をなくす方法](http://qiita.com/BEMU/items/0f500e0306471073ed63)
- [【CSS】画像の下に出来る余白を消す方法画像の下に出来る余白を消す方法](http://delaymania.com/201507/web/css-img-bottom/)
- [imgとimgの間の余白を消す。](http://qiita.com/mimoe/items/e03a209af88e54bbd8f4)
- [なんでimgの下に隙間が入るか問題の原因究明とその解決方法](http://qiita.com/kimura511/items/2fe01fe295e308ce34aa)
- [Image inside div has extra space below the image](http://stackoverflow.com/questions/5804256/image-inside-div-has-extra-space-below-the-image)
Rubyのバージョン変更時に期待するバージョンが反映されない(T_T)

# 何が起きたか
Rubyのバージョン変更時に期待するバージョンがリストに表示されなかった。
いろいろ調べたので、結果を備忘録としてまとめてみた。

## まずはインストール可能なバージョンの確認

```
$ rbenv install -l
```

ここでインストールや変更可能なrubyバージョンがずらっと表示される

##  期待するバージョンが無かった場合
ruby-buildをアップグレード

```
$ brew upgrade ruby-build
```

ここで再度 

```
rbenv install -l
```

もしこれでもうまくいかなかった場合は
Homebrewをアップデートしてからやるとうまくいくかも。

```
$ brew update
```

## rbenv install コマンドでインストール
```
$ rbenv install 任意のバージョン
```

これでうまっくいった。めでたし。
個人的によく使うPromise


IEで使う場合は[babel-polyfill](https://babeljs.io/docs/usage/polyfill/)


## ロードを待つ

まず画像ロード用にPromiseを返す関数を用意

```javascript:loadImage.js
export default function loadImage(src) {
  const img = new Image();
  img.src = src;

  return new Promise(resolve => {
    img.onload = () => resolve(img)
  })
}
```

DOM、画像、フォントなど複数のロードが必要な場合、`Promise.all()`で待ち受けると便利

```javascript:script.js
// IMAGE_SRCS.map(loadImage)が画像1枚1枚のPromiseを格納した配列になっている
const loadImages = Promise.all(IMAGE_SRCS.map(loadImage));

document.addEventListener('DOMContentLoaded', () => {
  Promise.all([loadImages /* , loadFonts, loadSVGs, ...and so on */])
    .then((assets) => {
      console.log(assets[0]) // Loaded images!
      setTimeout(init, 500);
    })
    .catch(console.error)
})
```


## JSON取得

```javascript:json.js
export function getJSON(url, opts = {}) {

  // 時間制限
  const timelimit = 5000;
  let isSuccesed = false;

  // use es6
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if(!isSuccesed) reject();
    }, timelimit);

    fetch(url, opts)
      .then((responce) => {
        isSuccesed = true;
        return responce.json();
      })
      .then((json) => {
        console.log(`api success!!: ${url}`);
        resolve(json);
      })
      .catch((e) => {
        console.log(`catch...: ${url}, error: ${e}`);
        reject();
      });
  });

}
```

```javascript:script.js
getJSON('/words/feeds.json', {credentials: "same-origin"})
  .then((data) => {
    console.log(data);
  });
```

※Basic認証下では、`{credentials: "same-origin"}`のオプションを付けないと弾かれる。



## アニメーション制御

別でまとめてた
[Promiseでアニメーションの順番を柔軟に制御する](http://qiita.com/mo4_9/items/fa0fd154c16a3c5ee7ec)


> 参考
http://azu.github.io/promises-book/
プログラミング初心者、WordPress始めます！その２

## 自己紹介

私はプログラミングとは全く関係ない業種で働いていたはずなのですが、いつの間にかExcelVBAにハマり前任者が作った会社のプログラムを運営することを任された、いわば“にわかプログラマー”です。
つまり、かなりのプログラミング初心者です。
そうこうする内にプログラミングにハマり、気付けば30代半ば…　いい歳してプログラマーを目指したいと思い始めてしまったわけです。
そんな僕がつまづいたり勉強になったものを少しずつ皆様と共有できれば幸いだと思い投稿をさせて頂くことにします！
使用OSは主にWindowsになります。
開発環境はxamppでローカルサーバーを立ち上げての作業になります。

## プログラミング経験言語は…
HTML少々、CSS少々、JavaScript少々、PHP少々。と、どれも少々です。
そんな私ですが、とりあえずものにしたいと思い手を付けたのが**WordPress**

そんな僕が自分のお勉強の記録にちょこちょこと記事をアップしていきます。
プログラミング超初心者なのでプログラミングを理解している方たちが説明しているサイトの説明の理解に苦しむことがありますｗ
僕と同じように超初心者の方が始めるときにほんの少しだけでも参考になれば幸いです。
お勉強のメインはドットインストールさんの動画を基点にネット検索などで行っていこうかと思っております。
超々初心者なので間違った情報等ありましたら優しく教えていただけると嬉しいです。    

## ダッシュボードを使ってみよう
WordPressにログインするとまず最初に**wp-admin**というページに入ります。
ここの画面がいわゆる**ダッシュボード**というものです。
![dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/155272/32d73129-e637-5030-64ac-6fa746173a40.png)
左側にメニューバーがあります。記事の投稿は**投稿**、お問合せなどの設定は**固定ページ**、サイトのデザインは**外観**など、ここから感覚的にページの操作ができるのもWordPressの魅力ですね！  
  
## プラグインを入れてみよう
とはいえこれもWordPressの魅力の一つではありますが、とにかくプラグインが多い（汗）
プラグインの入れすぎもメンテナンスが大変になるので労力とセキュリティ的に問題がありそうです。
さらにプラグインを入れすぎるとスクリプトが多数読み込まれてパフォーマンスも低下する模様ですね。
ということで今回はいくつか良さげなものを選んでインストールしてみたいと思います。  
  
**１．[Google XML Sitemaps](https://wordpress.org/plugins/google-sitemap-generator/)**
　　サイトマップ送信の自動化ツールだそうです。  
**２．[Akismet](https://wordpress.org/plugins/akismet/)**
　　コメントスパム対策プラグインです。  
**３．[PuSHPress](https://wordpress.org/plugins/pushpress/)**
**４．[WordPress Ping Optimizer](https://wordpress.org/plugins/wordpress-ping-optimizer/)**
　　PING通知を最適化してSEOに強くなるプラグインの様です。  
**５．[WP Multibyte Patch](https://wordpress.org/plugins/wp-multibyte-patch/)**
　　日本語版WordPressのマルチバイト文字の不具合・累積的修正・強化を行うプラグインの様です。

と、ひとまず５つのプラグインを入れてみました。
  
## 画像のアップロード設定
画像のアップロードには**wp-content**というフォルダ内に画像アップロード用の書き込み可能なフォルダ(uploads)を作成しなくてはいけません。

## カテゴリーの作成
画像のアップロード準備が整った所で記事の投稿を行ってみようかと思います。
記事の投稿の前に、カテゴリーを設定しておきましょう。
左側のツールバー**投稿**タブの**カテゴリー**をクリックします。
カテゴリーの名前とスラッグ（URLに使用する文字列）を設定します。
今回はひとまず適当に**日記**と**プログラミング**を作成しました。

## 記事を投稿してみよう
では実際に記事を投稿してみようと思います。
左側のツールバー**投稿**タブの**新規追加**をクリックします。
まずは画像のアップロードを試してみましょう。
**メディアの追加**をクリックし画像を追加しましょう。
今回はテストなので僕のロゴを追加します。
![testContribution.png](https://qiita-image-store.s3.amazonaws.com/0/155272/724126cc-5359-c8be-2c2e-c4c7c761f769.png)
右側の**公開**を押して記事の投稿は完了です。
と、ここまでは感覚的に操作できますね。というかプログラム的な要素がまだありませんね。
  
ということで次回からは実際にHTML・CSS・PHPを使用してテーマの編集を行っていこうかと思います。
  
今回も最後までお読み頂きありがとうございました。

[<<プログラミング初心者、WordPress始めます！その１](http://qiita.com/ukkari_ukachan/items/325b687055d1d9121212)
[プログラミング初心者、WordPress始めます！その３>>](http://qiita.com/ukkari_ukachan/items/fef3e8b599c76f782594)
SentencePieceを形態素解析のように使えるAPIを公開した（Tweet版）

## はじめに
先日リリースしたSentencePieceを形態素解析のように使えるWebAPIはWikipediaのデータでモデルを構築しましたが、SentencePieceはドメイン依存性が強いそうなのでTweet版も作りました。例のごとくWebAPIで公開しています。[こちら](https://apitore.com/store/apis/details?id=38)から無料で使えます。

## API
- [SentencePiece API (Wiki)](https://apitore.com/store/apis/details?id=37)
- [SentencePiece API (Tweet)](https://apitore.com/store/apis/details?id=38)

## サンプルコード
- [Javaサンプル](https://github.com/keigohtr/apitore-sdk-java/tree/master/sentencepiece-response)

## 関連記事
- [私のブログ](http://blog.apitore.com/2017/04/13/api-sentencepiece/)
- [前回の記事](http://qiita.com/keigohtr/items/7baee0d72bef5c5de2de)

## やったこと
以下の条件でツイートを収集しました。合計で約200万ツイート集めています。

1. 20文字以上
2. 投稿クライアントはTwitter社公式（web、iOS、Android）
3. RTは含まない、http付きも含まない
4. 目的語（お手製の約2500語のリスト）を含む

## 結果
「吾輩は猫である。名前はまだない。」は『はまだ』という区切りがありますね。

```
"tokens": [
  {
    "wid": 7095,
    "token": "吾"
  },
  {
    "wid": 5357,
    "token": "輩"
  },
  {
    "wid": 4656,
    "token": "は"
  },
  {
    "wid": 5041,
    "token": "猫"
  },
  {
    "wid": 2950,
    "token": "である"
  },
  {
    "wid": 4671,
    "token": "。"
  },
  {
    "wid": 954,
    "token": "名前"
  },
  {
    "wid": 1648,
    "token": "はまだ"
  },
  {
    "wid": 13,
    "token": "ない"
  },
  {
    "wid": 4671,
    "token": "。"
  }
]
```

「「恐怖」を克服することが「生きる」こと」はどうでしょうか？たしかに前回とは違う切り方をしています。

```
"tokens": [
  {
    "wid": 4820,
    "token": "「"
  },
  {
    "wid": 3438,
    "token": "恐怖"
  },
  {
    "wid": 4642,
    "token": "」"
  },
  {
    "wid": 4707,
    "token": "を"
  },
  {
    "wid": 7399,
    "token": "克"
  },
  {
    "wid": 5182,
    "token": "服"
  },
  {
    "wid": 50,
    "token": "する"
  },
  {
    "wid": 1479,
    "token": "ことが"
  },
  {
    "wid": 4820,
    "token": "「"
  },
  {
    "wid": 1860,
    "token": "生き"
  },
  {
    "wid": 4643,
    "token": "る"
  },
  {
    "wid": 4642,
    "token": "」"
  },
  {
    "wid": 73,
    "token": "こと"
  }
]
```

## おわりに
ささっと紹介してしまいました。とにかく、SentencePieceはドメイン依存性が高いということなので、需要がありそうな[ツイート版のSentencePiece](https://apitore.com/store/apis/details?id=38)を作りました。よろしければご利用ください。次回は、こちらを使って作った極性判定技術をご紹介します。
[C#6.0~] シングルトンパターンの実装

C#環境でのシングルトンパターンの実装方法メモ。
だいぶあっさりとした感じでかけますね。

# 実装例

2017/05/19: コメントいただいた内容と、マルチスレッドでの使用等を考慮したものに修正

```csharp
public sealed class SingletonClass
{
    public static SingletonClass Instance { get; } = new SingletonClass();
    static SingletonClass() {} // suppress beforefieldinit
    private SingletonClass() {}
}
```

+ マルチスレッドでインスタンスが複数作成されないように、beforefieldinit属性の付与を抑制する
    + => 参考：[C# での Singleton についてまとめ - やこ～ん SuperNova2](http://d.hatena.ne.jp/saiya_moebius/20091017/1255799846)

# 関連
[[Java] シングルトンパターン - Qiita](http://qiita.com/koara-local/items/6350b8ccbec3badab4fa#_reference-e01f51d795789f4efa6f)

# 参考
[C# 6 の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](http://ufcpp.net/study/csharp/ap_ver6.html#sec-expression-bodied)
[[C#] 遅延初期化を実現する3つのパターンと2つのクラス、Singletonパターンに特化した2つの方法 - Qiita](http://qiita.com/laughter/items/e6be52db15d7326b46b9)
[C# での Singleton についてまとめ - やこ～ん SuperNova2](http://d.hatena.ne.jp/saiya_moebius/20091017/1255799846)
ALGOL60に関してちょっとだけ調べた

とある目的のために各種言語を調査しています。

+ [ALGOL](https://ja.wikipedia.org/wiki/ALGOL)

```
ALGOL（アルゴル）は、命令型プログラミング言語ファミリの1つ[注 1]。
名前「ALGOL」は「アルゴリズム言語」を意味する英語「algorithmic language」に由来する。
1950年代中ごろに開発され、多くの言語に影響を及ぼし、
ACMや教科書や学術論文などでアルゴリズム記述のデファクトスタンダードとして30年以上使われた

ALGOLはコードブロックを導入
begin と end でそれを囲むことで、構文スコープのネスティングを可能にした最初の言語となった。
"Algol 60 Report"[3] で言語設計の主要な記法となったバッカス・ナウア記法を導入している。
```

ここの記述を見る限りは、特徴的な機能として

+ コードブロック
+ 構文スコープのネスティング

が上げられるようだ。また、記法として `バッカス・ナウア記法`を導入した言語らしい。

実際に動かしてみようかと色々検索した結果、ALGOL60は見当たらなかったが[ALGOL68](http://algol68.sourceforge.net/)
の方のコンパイラは見つかった。せっかくなので動作させてみる。(ちなみに、コンパイラを落としてこなくても[online](https://www.tutorialspoint.com//execute_algol_online.php)で試せるので、面倒くさいと思う人はそちらで)

## コンパイル

```sh
wget https://jmvdveer.home.xs4all.nl/algol68g-2.8.4.tar.gz
tar zxvf algol68g-2.8.4.tar.gz
cd algol68g-2.8.4
./configure && make
```

## 実行

割と簡単に動きました。

```sh
cat > main.alg
print("Hello world!")

./a68g main.alg
```

ファイルを開いたら、さすがのvimもデフォルトでALGOLのsyntaxは対応してなかったみたい。
あとで、 [コードサンプル](http://rosettacode.org/wiki/Category:ALGOL_68)ここに転がっているのでここから適当にもらってきて試して見る。
[質問] anaconda を zsh で動かす

anaconda を zsh で動かしているのですが，source activate のところでつまってしまいました．
エラーの内容は activate:4:BASH_VERSION: parameter not set   となっていたのでacrivate のファイルの４行目を見てみると
if [[ -n $BASH_VERSION ]]; then

となってました．zshで動かしてるから$BASH_VERSION には何もセットしてないので　-n で null値と判断されると思うのですが，うまくいってないようです．ためしに　＄BASH_VERSION= 　を書き込んでみて動かしてみたのですがまた別のところでbash で動かしていないの原因とみられるerrorが出てしまいました．どなたかわかるかた，ご教授のほど．よろしくお願いいたします．
JMeterのjtlファイルをpandasを利用して解析する

# 背景
JMeterで負荷テストや性能評価を行なっているが、出力されるjtlファイルをいちいちJMeterのGUIモードで開くのが面倒なのでpandasで計算してみる。

#動作確認バージョン
python 2.7.11
JMeter 3.1

#JMeterの実行とjtlファイルの取得
以下のようにJMeterをコマンドモードで実行し、jtlファイル(csv形式)を取得する。

```bat
jmeter.bat -n -t test.jmx -l result.jtl
```

#統計量の計算例

###jtlファイルの読み込みと簡単な統計量の計算
csv形式だと1行でDataFrameの形式にできるので楽。

```python
import pandas as pd
# jtlファイルの読み込み
df = pd.read_csv(jtl_file_name)

# 対象列の取り出し(ここでは開始時間と、経過時間）
df = df.loc[:, ['timeStamp', 'elapsed']]
# 総スレッド数
cnt = len(df.index)
# 最小値
min = df['elapsed'].min()
# 最大値
max = df['elapsed'].max()
# 平均値
avg = df['elapsed'].mean()
# 標準偏差
std = df['elapsed'].std(ddof=False)
```

###Throughput(#/sec)の計算
総スレッド数を、処理全体でかかった時間で割る。
以下などを参考にした。
https://jmeter.apache.org/usermanual/glossary.html

```python
# 終了時間を得るために、各スレッドの開始時間と経過時間を足して新たな列として追加。
df['end_time'] = df['timeStamp'] + df['elapsed']
# 開始時間の最小値を取得
start = df['timeStamp'].min()
# 終了時間の最大値を取得
end = df['end_time'].max()
# 総スレッド数を、処理全体でかかった時間で割る。秒数にするため1000かける。
tp = float(cnt)*1000.0/(end - start)

```

#感想
pandas便利。
group byして処理ごとに統計量を取る事もできると思うが、今回は不要なので見送り。
処理は一瞬もたつくので、やリたい事に対してやや大げさな気もするが自由度や拡張性を考えるとメリットは大きい。
複数のHandlerクラスを使い分ける

# 背景

web画面とAPI2つを同時に提供しようしたときに、例外検知時の基本ルールとして

- web画面側：エラーページに遷移させたい（エラーページ用のhtmlを返却
- API側：error情報を格納したJSONを返却したい

とやりたいことが大きく異なりました。Handlerクラス内でif文をチマチマ書くのがしっくり来なかったのでいっその事Handlerクラスを切り替えることは出来ないかなーというのがきっかけでした。

# 実装方法

コンテナに登録されているExceptionHandlerをサービスプロバイダーで登録し直します。 
登録し直すかどうかはURLを条件に判定します。アプリケーション固有のURL直後に`api/`が続く場合はAPI用のHandlerクラスを使用し、それ以外は通常のHandlerクラスを使用します。
**※この判定ルールは各々の環境に合わせて適宜書き換えてください。**

```php:AppServiceProvider.php
	 * Bootstrap any application services.
	 *
	 * @return void
	 */
	public function boot() {
		// API関連は独自のHandlerクラスをコンテナへ再登録する
		if (strpos(\Request::getPathInfo(), '/api/') === 0) {
			$this->app->bind(ExceptionHandler::class, \App\Exceptions\ApiHandler::class);
		}
	}
```

サンプルとしてModelNotFoundExceptionがスローされた場合にerrorオブジェクトをJSON形式で返却させてみます。QueryBuilderのfindOrFailなどを呼び出して対象レコードが見つからなかった場合が下記分岐に当てはまります。
それ以外のfunctionはデフォルトのHandlerクラスをそのままコピーしています。

```php:ApiHandler.php
class ApiHandler extends ExceptionHandler {
	/**
	 * Prepare response containing exception render.
	 *
	 * {@inheritdoc}
	 *
	 * @param \Illuminate\Http\Request $request
	 * @param \Exception $e
	 * @return \Symfony\Component\HttpFoundation\Response
	 * @see \Illuminate\Foundation\Exceptions\Handler::prepareResponse()
	 */
	protected function prepareResponse($request, Exception $e) {
		if ($e->getPrevious() instanceof ModelNotFoundException) {
			return response()->json([
					'error' => [
							'code' => 9999
							'message' => '対象のデータが見つかりませんでした。'
					]
			], 404);
		}
	}
}
```

# 残課題

今の状況だとphpunitを使用してテストを行ったときにApiHandlerが使用されないという問題が発生しています。
対応方法を確認次第追記する予定です。

**（2017/05/17追記）**

原因は以下のような感じでした。
1. phpunitを通してアプリケーションの初期化
2. テストクラスのインスタンス生成
3. AppServiceProviderが実行される
4. URLをもとにHandlerクラスを振り分ける
5. テストメソッド単位で順次実行
6. MakesHttpRequests::call()でHttpRequestを発生させる
→ここで初めて~/api/の様なURLが確定するので、手順3 の段階ではURLが空っぽになっているためApiHandlerをサービスコンテナに再登録する処理が実行されない。

API関連のテストクラスの親に当たるクラスを新たに作成し、setUpメソッド内でサービスコンテナにHandlerクラスを再登録させることで回避しました。

```php:ApiTestCase.php
<?php
namespace Tests;

use Tests\TestCase;

class ApiTestCase extends TestCase {

    public function setUp() {
        parent::setUp();
        $this->app->bind(\Illuminate\Contracts\Debug\ExceptionHandler::class, \App\Exceptions\ApiHandler::class);
    }
}
```
Slack | 今見ているチャンネルのチャンネルIDを簡単に取得する

# コメントのリンクをコピーする


![image](https://qiita-image-store.s3.amazonaws.com/0/89618/12d4fb34-3f1c-15d2-2fa6-70ee5f07994b.png)

# URLを見る


https://yuma-inaura.slack.com/archives/C18TMBQSD/p1494596217838812

今回の例だと、この中の **C18TMBQSD** という部分がチャンネルIDだ。

# 関連

- [Slack | APIに使う「チャンネルID」を取得する方法 - Qiita](http://qiita.com/Yinaura/items/bd28c7b9ef614696fb7e)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
TinySegmenter for VBA クラス版


# 前口上

日本語文章を分かち書きをしてくれるオリジナルのjavascript版
http://chasen.org/~taku/software/TinySegmenter/
のVBA版がある
http://pub.ne.jp/arihagne/?entry_id=2768818
らしいけど繋がらないので、
http://www16.plala.or.jp/arihagne/software/TinySegmenter.txt
を取ってきて、オリジナルのv0.2の修正内容の反映と(雑に)クラス化してみました。

# コード

ちょっと長いのでGISTからどうぞ。
https://gist.github.com/acknpop/c42a90c67525cdfaf3b789c28f89e6f2

# 使用例

上記クラスをインポートしてから、下記をモジュールに書いて実行。

```vb

Sub Sample()
    Dim ts as TinySegmenter
    Set ts = New TinySegmenter
    
    Debug.Print Join(ts.segment("私の名前は中野です"), "|")
    
    Set ts = Nothing
End Sub
```

# 補記

Excel上で形態素解析が必要な場合は下記をご参照。
http://qiita.com/mima_ita/items/bc2aeb060ee12d280d7b
http://qiita.com/acknpop/items/4c64f73e385aee417c98
『Q03 数列の四則演算』プログラマ脳を鍛える数学パズル

#1~100までのカードが並べられている。最初は全て裏である。２番目のカードから１枚おきに裏返す。３番目のカードは２枚おきに裏返す。同じようにn枚目のカードからn-1枚おきに裏返す。裏向きの番号を調べろ。（引用：プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問）


裏返すところは、書籍まんま。上手くいかんかった。


```q3.rb
def trump(n)
  b=[]
  a=(1..n).map{|i| false}

  (2..n).each{|i|
    j=i-1
    while(j<a.length)
      a[j]=!a[j]
      j += i
    end
  }

  (1..n).each{|i| b<< i+1 if a[i]==false}
  puts b
end

trump(100)
```