OmniAICreator/Qiita-1.07M huggingface dataset:
ソースコードをAWS CodeCommitに入れる

AWSを無料枠の中で使っていますが、ソースコード管理のサービスも使ってみようと思います。
AWS CodeCommitというサービスで、Gitリポジトリを提供してくれます。

以下、無料枠の範囲です。
・最初の 5 人のアクティブユーザー
・無制限のリポジトリ
・50 GB のストレージ/月
・10,000 件の Git リクエスト/月


# AWS側の準備（リポジトリの作成）

CodeCommitのサービスを選択して、「Create Repository」します。これでおしまい。

設定としてはConnect to your repositoryで接続するプロトコル（https or ssh）とClient OS(Unix系 or Windows)を選択します。
私はhttps と Windowsを選択しました。
![code-commit-5.png](https://qiita-image-store.s3.amazonaws.com/0/169729/1c719d6f-1c35-5bd9-bc38-89c7ef1f6a1e.png)
リポジトリを作成した後に、CloneURLで表示されるURLが、ローカルリポジトリから接続するURLになるので、保存しておきましょう。

# AWS側の準備（アカウントの作成）

開発環境としてEclipse + AWS Toolkit for Eclipseを導入していたので、Toolkit用のIAMアカウントにCodeCommitのロールを付与して使う事にします。

ロール設定については以下に詳細な説明があります。
http://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-gc.html

CodeCommit(Git)を利用するユーザに対してAWSCodeCommitFullAccessの権限を付与した後に、IAMに移動し「ユーザ」リンクを選択→CodeCommit(Git)を使うユーザを選択→「認証情報」タブを選択→AWS CodeCommitのHTTPS Git 認証情報の生成を行います。
![code-commit-3.png](https://qiita-image-store.s3.amazonaws.com/0/169729/8324fc80-9f2d-be83-5674-1c315f5dca7e.png)

※管理者が認証情報を作って利用者にCredential渡す場合はこれでOK、利用者自身が認証情報を作る場合は利用する場合は、ユーザにIAMSelfManageServiceSpecificCredentialsとIAMReadOnlyAccessを付与してIAMが利用できるようにします。

これでgitCredentials.csvが生成されます。
ダウンロードされるcsvファイルの中に、GitにアクセスするためUserIdとPasswordが書かれています。

# ローカル側の準備（ローカルリポジトリーの作成）
EGitを導入したEclipseを利用します。

Gitのパースペクティブを開いてローカルリポジトリーを作成します。
![code-commit-2.png](https://qiita-image-store.s3.amazonaws.com/0/169729/d3633977-eb4f-e2be-cc83-2316afd466a4.png)


# ローカル側の準備（リモートの設定）
ローカルリポジトリーを作成したらリモートリポジトリーを設定しますが、ここで設定するのがAWS CodeCommitで作成したリポジトリーになります。

URI＝CodeCommitのCloneURLで表示されたアドレス
ユーザー＝gitCredentials.csvに記載されたUser Name
パスワード＝gitCredentials.csvに記載されたPassword

![code-commit-10.png](https://qiita-image-store.s3.amazonaws.com/0/169729/312d4c88-2c20-17af-cafa-48ce39722ffd.png)

情報を入力し、無事にリモートリポジトリーの設定も完了です。

簡単に終了しました。
無料枠で使用していますが、このままAWSにロックインされそうな勢いですね。
Macで隠しファイルを表示させるショートカット


試した環境　macOS Sierra

Macでフォルダを開くときや、追加する際、
Finderや、Atom、IntelliJ 系のIDEなど
アプリケーションにかかわらず、

```
Cmd + Shift + . 
```
で隠しファイル、フォルダを表示させる事ができます。

意外にカンタンにできるけど気づかなかったので記録しておきます。
Macでbundle install中にeventmachineでopenssl/ssl.hがないとエラーが発生したときの対策


## 環境

- Mac Pro (多分どのMacで起きるかと)
- macOS Sierra 10.12.4
- Ruby 2.0.0p645
- Rubyは書かないという強い意志 ~~（私はRubyを書きたくありません）~~

## 具体的なエラー内容

```bash
$ bundle install --path vendor/bundle
・・・
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /path/to/ruby extconf.rb
checking for rb_trap_immediate in ruby.h,rubysig.h... no
checking for rb_thread_blocking_region()... yes
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for inotify_init() in sys/inotify.h... no
checking for __NR_inotify_init in sys/syscall.h... no
checking for writev() in sys/uio.h... yes
checking for rb_thread_fd_select()... yes
checking for rb_fdset_t in ruby/intern.h... yes
checking for rb_wait_for_single_fd()... yes
checking for rb_enable_interrupt()... no
checking for rb_time_new()... yes
checking for sys/event.h... yes
checking for sys/queue.h... yes
checking for clock_gettime()... yes
checking for CLOCK_MONOTONIC_RAW in time.h... yes
checking for CLOCK_MONOTONIC in time.h... yes
creating Makefile

make "DESTDIR="
compiling binder.cpp
In file included from binder.cpp:20:
./project.h:116:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
         ^
1 error generated.
make: *** [binder.o] Error 1


Gem files will remain installed in /path/to/project/vendor/bundle/ruby/2.0.0/gems/eventmachine-1.0.7 for
inspection.
Results logged to /path/to/project/vendor/bundle/ruby/2.0.0/gems/eventmachine-1.0.7/ext/gem_make.out

An error occurred while installing eventmachine (1.0.7), and Bundler cannot continue.
Make sure that `gem install eventmachine -v '1.0.7'` succeeds before bundling.
```

といったかんじに `eventmachine` でエラーが発生する。

## 対処法

### OpenSSLをとりあえず入れる

Homebrewが入っていない人は以下

```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

```bash
$ brew update
$ brew install openssl
$ brew link openssl --force # ここだけログを書いておきます
Linking keg-only openssl means you may end up linking against the insecure,
deprecated system OpenSSL while using the headers from Homebrew's openssl.
Instead, pass the full include/library paths to your compiler e.g.:
  -I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib
```

1番下に出てきた `-I/usr/local/opt/openssl/include` がミソになるらしい

### eventmachineを入れる

```bash
$ gem install eventmachine -v '1.0.7' -- --with-cppflags=-I/usr/local/opt/openssl/include
Building native extensions with: '--with-cppflags=-I/usr/local/opt/openssl/include'
This could take a while...
Successfully installed eventmachine-1.0.7
Parsing documentation for eventmachine-1.0.7
unable to convert "\xCF" from ASCII-8BIT to UTF-8 for lib/fastfilereaderext.bundle, skipping
unable to convert "\xCF" from ASCII-8BIT to UTF-8 for lib/rubyeventmachine.bundle, skipping
Installing ri documentation for eventmachine-1.0.7
1 gem installed
```

入った！

## 参考サイト

http://stackoverflow.com/questions/30818391/gem-eventmachine-fatal-error-openssl-ssl-h-file-not-found
メールアドレスを一意にする（array_reduce() の使いどころ）

## はじめに

リファレンスマニュアルを見ていると「機能は分かるけど、いったい何に使うのかピンとこない」ってことはないですか？そうするとなかなか頭に入らないですよね。この記事では array_reduce() 関数の「使いどころ」の一例として、メールアドレスを一意にする処理を考えます。

※ そんな「使いどころ」的な記事が増えるといいな、とも思います。

## 免責

「array_reduce() の使いどころ」と題していますが、こんな使い方ばかりではありませんでしょうし、むしろ邪道である可能性もあります。このような記事を鵜呑みにしてはいけません。また、このスニペットを引用して上司に怒られても、あなたの書いたプログラムの正当性をこの記事が保証するわけでもありません。

## 使いどころ

システムからメールを送信することは、よくあります。

問題になるのは、いつ、どんな場面で誰に送るのか、ということが結構複雑に決まることです。To に対して設定するアドレス、C.C. に対して設定するアドレス、部署、担当プロジェクト、取得元（システムの内部のデータベースから取得するのか、全社統一データベースから API を用いて取得するのかなど）考えることはたくさんあります。

全部を単純に結合すると重複が出ることがあります。重複を排除したい場合も「To に設定したアドレスは C.C. には設定しない」といった配慮が必要なので、単純に array_unique() は採用できません。欲しいのは、複数の配列からの重複排除です。

※ 全部を単純に結合して送信したとしても大して不都合が出るわけでもありません。そうして問題が出ないならそれでもいいでしょう。ですが世の中にはそういうことを気にする人も少なからず居ます。

## スニペット

このスニペットは、すでに変数 `$to_addr` と `$cc_addr` にカンマ区切り文字列のメールアドレスが設定済みで、そこから重複を排除したい場合のコード例です。

```php

// 入力（banana さんが重複）
$to_addr = ['apple@example.com'  , 'banana@example.com' , 'citrus@example.com'];
$cc_addr = ['banana@example.com' , 'durian@example.com' , 'elderberry@example.com'];

$addressUniqueFilter = function ($carry, $addr) {
    static $allAddressArray = array();
    if (is_null($carry) || !is_array($carry)) {
        $carry = [];
    }
    $addr = trim($addr);
    if (!in_array($addr, $allAddressArray)) {
        $carry[]           = $addr;
        $allAddressArray[] = $addr;
    }
    return $carry;
};

$toAddressArray = array_reduce($to_addr, $addressUniqueFilter);
$ccAddressArray = array_reduce($cc_addr, $addressUniqueFilter);

var_dump($toAddressArray);
var_dump($ccAddressArray);

/*
出力：

array(3) {
  [0] =>
  string(17) "apple@example.com"
  [1] =>
  string(18) "banana@example.com"
  [2] =>
  string(18) "citrus@example.com"
}
array(2) {
  [0] =>
  string(18) "durian@example.com"
  [1] =>
  string(22) "elderberry@example.com"
}

*/
```
仮想環境(vagrant + virtualbox)にあるmariadbにダンプファイルをインポートする

#MariaDBにダンプファイルをインポートする
##１．仮想環境にダンプファイルを送る
まずは仮想環境にファイルを送ります。
###１－１.MACユーザだったら、、、
VagrantのSSHの設定ファイルを書き出す
$ vagrant ssh-config > ssh.config

書き出した設定ファイルを使って転送する
$ scp -F ssh.config dump.sql vagrant@default:~/
こんなかんじですかね！

###１－２．Winだったら、
WinSCPとかでDragAndDropしちゃう^^

##２．sourceコマンドでダンプを入れる
mysql -u ユーザ名 -p
パスワード
↓
EX)
mysql -u root -p
root

ログインできたら、、、

use DB名
Ex)↓
use test_db

Database changed←と出力される
source ダンプファイルを置いたパス
EX)↓
source /home/vagrant/dump.sql

以上となります！
お疲れ様でした！
【VMware＠Bluemix IaaS 2017】ー サーバー購入編

#はじめに
去年私の先輩が行なっていた[VMware on BluemixInfrastructure（Softlayer（旧称））の技術検証](http://qiita.com/khayama/items/b8dc884c7ea273861a24)。
これを今年はVMwareのバージョンを6.5に上げて一部再検証してみようと思います。
全体的に去年の手順を参考にしつつ、[こちらのドキュメント](http://pubs.vmware.com/vsphere-65/index.jsp?topic=%2Fcom.vmware.vsphere.install.doc%2FGUID-7C9A1E23-7FCD-4295-9CB1-C932F2423C63.html)も参考に作業を進めていきます。

第一回のこの回ではBluemix Infrastructureでの仮想サーバー・物理サーバー及びIPアドレスの購入方法について説明していきます。

#スペック
ガイドの「ESXiのインストールおよび設定」＞「ESXiの要件」＞「ESXiのハードウェア要件」によると、ESXi6.5のハードウェアに必要となる要件は以下のようになります。
> ■少なくとも**2つのCPUコア**を持つホスト マシン
■少なくとも**4GBの物理RAM**
(一般的な本番環境で仮想マシンを実行するためには、少なくとも8GBのRAM)
■**1つ以上のギガビット**またはより高速なイーサネット コントローラ。
■最低**1GBの起動デバイス**が必要です。ローカルディスク、SAN、または iSCSI LUN から起動する場合、VMFSボリュームと4GBのスクラッチパーティションを起動デバイスに作成するには、**5.2GB**のディスク

そこで今回は以下のように構成します。
（有料となるもののみを記載しています）
>**物理サーバー**(2台)
>>サーバー：Dual Intel Xeon E5-2620 v3（6Cores,2.40 GHz）
OS：なし
RAM：128GB
Hard Drives：Disk600GB SAS（RAID1）
アップリンクポート速度：10 Gbps Dual Public & Private Network Uplinks (Unbonded) 

>**仮想サーバー**(1台)：DNSサーバー兼作業用
（昨年の検証で作業に対して処理速度がが遅かったのでコンピューティングのスペックを上げています）
>>コンピューティング：2 x 2.0 GHz Cores
OS：Windows Server 2012 R2 Standard Edition(64bit)
RAM：1GB
Disk100GB（LOCAL）

#サーバーの購入方法
まず、Bluemix InfrastructureポータブルのTop画面のDevicesアイコンをクリックします。
![Device購入.png](https://qiita-image-store.s3.amazonaws.com/0/141025/f71d9449-f9a2-522e-baa0-9b35ef31d7ee.png)

Bare Metal Servers（物理サーバー）・Virtual Server（仮想サーバー）のうち、Hourly（時間単位課金）・Monthly（月額課金）のどちらか必要となるものを選びます。
![Devices.png](https://qiita-image-store.s3.amazonaws.com/0/141025/a25753ae-395b-e7a4-8d54-e05198d90620.png)

データセンターを選択し、必要となる構成を選択していきます。

##注1：BYOSするときには？
今回のようにOSをBYOSする場合は”Other”を選択し”No Operating Service”をを選択します。
![OS.png](https://qiita-image-store.s3.amazonaws.com/0/141025/70164a59-c6ae-0fb2-ef53-1a091c288f84.png)

##注2：RAIDの設定方法
ディスクの台数を選択し、ディスクの割り当てを押します。
すると、SATA・SAS・SSDの選択肢が出てくるので適当な種類と容量を選択します。
今回の検証では、ディスク2台を600GBのSASで選択しました。
![RAID.png](https://qiita-image-store.s3.amazonaws.com/0/141025/fa298315-5841-19e8-8009-bb4f38438aa7.png)


##注文の確定
構成を選び「注文に追加」を選んだら、構成を確認し、「拡張システム構成」の「ホスト名とドメイン名」を入力し、右欄に移動して、チェックボックスの内容を確認してチェックを入れた後「注文の送信」をクリックして、注文を完了します。
![ホスト名とドメイン名.png](https://qiita-image-store.s3.amazonaws.com/0/141025/a02b735d-6899-d8b7-624d-b3180e52bb01.png)

#IPアドレスの注文方法
3つのサーバーで同一のセグメントを共有するためこの懸賞ではIPアドレスを追加で購入しました。
IPアドレスを購入するには、まずトップ画面の「ネットワーク」アイコンをクリックします。
![ネットワーク.png](https://qiita-image-store.s3.amazonaws.com/0/141025/becdce9c-50fc-1b25-b341-e05d8376cfe9.png)

サービスの一覧から「サブネット/IP」を見つけ、「注文」をクリックします。
次に、サブネットのタイプを選択します。
各IPアドレスの種類の詳細については[こちら](https://www.ibm.com/developerworks/community/blogs/560da618-352c-4903-9e75-2dadfda71076/entry/softlayer%25e3%2581%25ae%25e6%25ad%25a9%25e3%2581%258d%25e6%2596%25b9_ip%25e3%2582%25a2%25e3%2583%2589%25e3%2583%25ac%25e3%2582%25b9%25e7%25b7%25a8?lang=en)を参照してください。

　今回の検証ではPortable Private IP Addressを64個注文します。選択したら「続行」を押しましょう。

最後にVLANを選択します。横のマークを押して各項目を展開すると、VLANに接続されるデバイスが表示されるので参考にしてください。

以上で完了です！
お疲れ様でした！
脱・踏み台サーバへの一歩 Amazon EC2 Systems Manager を使ってコマンドを実行する

Amazon EC2 System Manager というサービスの存在を今しがた知ったので、試してみました。

この機能を使えば Chef や Ansible を使わずとも、手軽に複数のサーバにてコマンドを実行することが可能です。

実行結果は S3 に保存可能です。

作業対象サーバーの台数分、手順書を作成してクロスチェック云々など、楽しくない作業が少しでもなくなれば幸いです。

# 使い方

Amazon EC2 System Manager とは :
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/what-is-systems-manager.html

・・・上記の URL に沿うのが堅実な道なのですが、詳しいことはさて置き、まずは手っ取り早く試してみたいと思ってしまうのが人情でしょう。

というわけで『とりあえず何をどうすればコマンドを実行できるのか？』だけ紹介します。

## 0. この記事の前提

- IAM Role を EC2 インスタンスに適用できること
- OS は Amazon Linux
- SSH でログイン可能  
※ssm エージェントをインストールするため（新規作成の場合は user command でも可）





## 1. IAM Role の作成

まずは、コマンドを実行させる対象の EC2 インスタンスに紐付ける IAM Role を作成し、 AmazonEC2RoleforSSM ポリシーをアタッチします。

![](https://qiita-image-store.s3.amazonaws.com/0/20877/8d124ea1-783b-489c-1b31-fb71b969e6d3.png)

※今回は検証用の root アカウントで作業しているので、ssm 用のアカウント作成は省略しています。

※実運用では、ちゃんと ssm 用のアカウントを作成しましょう。

※IAM Role は EC2 インスタンスに紐付けないと適用されません。




## 2. S3バケットの作成

2500文字までならマネジメントコンソール上でも確認可能なので、この工程は省略可能です。

## 3. ssm エージェントのインストール

コマンドを実行させる対象のインスタンに ssm エージェントをインストールします。手順は下記の通りです。

```
# mkdir /tmp/ssm
# cd /tmp/ssm
# yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
# status amazon-ssm-agent
-----
amazon-ssm-agent start/running, process 2185
-----

# ps -ef|grep amazon-ssm-agent|grep -v grep
-----
root      2185     1  0 21:04 ?        00:00:02 /usr/bin/amazon-ssm-agent
-----
```

ssm エージェントのインストール:
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent.html#sysman-install-ssm-agent

## 4. コマンドの実行

EC2 サービスを開き、左のサイドメニューの『SYSTEMS MANAGER SERVICES』から『コマンド履歴』を開きます。

![](https://qiita-image-store.s3.amazonaws.com/0/20877/b0305c4f-b256-1460-8104-b053f25ddbac.png)

青い『コマンドの実行』というボタンを押しましょう。すると下記の画面が開きます。

![](https://qiita-image-store.s3.amazonaws.com/0/20877/e5e9f1f0-2162-97ba-24c2-600d6e57c382.png)

『コマンドのドキュメント』は『AWS-RunShellScript』を選択し、『ターゲットインスタンス』は IAM Role を割り当て ssm エージェントをインストールしたインスタンスを選択します。

細かいことは画像を見て適宜設定していただくとして、今回実行するコマンドは下記の通りです。

一連のコマンドは root ユーザによって実行されるので、 sudo は必要ありません。

```
id

ss -antp

yum check-update

echo $?
```

これを『Commands』に貼り付けたら『実行』ボタンを押しましょう。

## 5. 実行結果の確認

下図のように『成功』となっているでしょうか？

![](https://qiita-image-store.s3.amazonaws.com/0/20877/7473217c-155b-6a7d-179d-8f27dd91664a.png)

『出力の表示』を開けば下図のように実行結果を確認できます。

![](https://qiita-image-store.s3.amazonaws.com/0/20877/d76a5ff5-009f-25af-47a8-f29b758ee4f6.png)


今回は実行対象が１台だけでしたが、複数台同時に実行する際は hostname コマンドなども使った方が実行対象の特定もしやすいかもしれません。(2020/03/22 追記：うっかりhostnameを書き換えたりする恐れがあるので、個人的には uname の方が好みです）

# コマンドの終了ステータスにご用心

下記は今回実行したコマンドですが、最後のコマンドが yum コマンドの終了ステータスの echo になっている事にお気づきでしょうか？

```
id

ss -antp

yum check-update

echo $?
```

yum check-update は正常に終了してもステータスは 100 を返します。

Amazon EC2 System Manager では、最後のコマンドの実行結果が 0 でないと一連の実行結果は『失敗』と判定されてしまいますので、ご注意ください。
AWS Lambdaの初回起動が遅い問題を解決する魔法の設定

**たまーにしか実行しないようなプログラムこそ、サーバーレス**で実行したいですよね。

ところがサーバーレスの代表格であるAWS Lambdaで、ライブラリを含んたzipをアップロードすると初回実行が非常に遅いのです。
Lambdaは一定時間実行されないと、アンロードされてしまうので、**たまーにしか実行しないようなケースでは毎回遅い初回実行**になってしまいます。

特にAPI Gatewayを通してLambdaを実行する場合はタイムアウトが上限30秒なので、PhantomJs等、重い処理が入っている場合は、初期化や処理中にタイムアウトしてしまいます。

色々試した結果、以下の方法で解決しました。

##解決方法

**Lambda関数のトリガにCloudWatchイベントスケジュールで五分毎の実行を入れるだけ！**

![image](https://qiita-image-store.s3.amazonaws.com/0/157770/3330d624-a6bb-d063-f174-216bc871d6e5.png)


*※魔法の設定とか書いてごめんなさい*

##手順（要らないかもしれないけど念のため）

1.Lambda関数のトリガを開く

![image](https://qiita-image-store.s3.amazonaws.com/0/157770/3374d10e-ce90-0d80-f374-278ea28fdb4f.png)


2.トリガ追加をクリック

![image](https://qiita-image-store.s3.amazonaws.com/0/157770/ec9e0895-9406-a1c0-2625-23efe434cbe0.png)

3.トリガーを追加でClundWatchイベント - スケジュールを選択

![image](https://qiita-image-store.s3.amazonaws.com/0/157770/f37a0351-a77b-1d30-5154-563a6f790e2c.png)

4.ルール名を適当に入れて、スケジュール式を「rate(5 minute)」を指定して、送信ボタン

![image](https://qiita-image-store.s3.amazonaws.com/0/157770/8bdc1edf-c8b1-82ad-cdcf-e75aa2273132.png)

5.こんな感じになればOK

![image](https://qiita-image-store.s3.amazonaws.com/0/157770/88012d8e-3f2f-5a6f-3978-6d88b0b7fa21.png)

6.関数側はパラメータ無しの場合、空振りするようにしておくと良い

ソースはnode.jsであれば以下のような感じ。

```js:index.js
exports.handler = (event, context, callback) => {

    // パラメータがない場合、空振りさせる（判定方法は適宜変更）
    if (event.sampleParam === undefined) {
        console.log(`exec by timer.`);
        callback(null, {"result":`NOP`});
        return;
    }
    
    console.log(`exec by api.`);
    // ☆☆☆ APIの処理 ☆☆☆
    // ☆☆☆ APIの処理 ☆☆☆
    // ☆☆☆ APIの処理 ☆☆☆
    callback(null, {"result":`OK`});
    
};
```

## 補足
- 同時実行が必要な場合は複数のスケジュールを入れてキープおくと良いです
- コストについては、五分毎の場合、一日288回増なので気にしなくて良さそうです
- 五分毎でキープしてますが何分まで伸ばしてもアンロードされないかは調べてません
Rでシェープファイルを読み込む

覚えたことは少しでもメモしていこうと思う。

# シェープファイル
ESRI社の商用GISソフトウェアで使われる地図データ形式だが、仕様が公開されているので他のアプリケーションでもサポートしているものが多い。
シェープファイルは複数のファイルから構成される。

- `.shp` 幾何データが格納されたメインファイル
- `.shx` 幾何データのインデックスファイル
- `.dbf` dBASE形式で保存された属性データ
- `.sbn` `.sbx` 空間インデックスファイル(オプション)

これらのファイルが同一ディレクトリにあってデジタル地図として機能できる。

# シェープファイルの読み込み

## サンプルファイルの準備

`maptools`の中にサンプルファイルが入っているので使用してみる。

```r:install_maptools.R
install.packages("maptools")
library(maptools)
```

サンプルファイルへのパスを取得。

```r:get_path.R
f <- system.file("shapes/sids.shp", package="maptools")
```

ちなみに、ここで取得したディレクトリ内を覗いてみると先程の3つのファイルが入っていることが分かる。

```zsh
% ls /Library/Frameworks/R.framework/Versions/3.3/Resources/library/maptools/shapes | grep sids                                                                                                                                                                   [~]
sids.dbf
sids.shp
sids.shx
```

## ファイルの読み込み

少し古い教科書では`maptools::readShapeSpatial()`を使用することになっていて、現在でも一応読み込めるがdeprecatedなので`rgdal::readOGR`または`sf::st_read`を使うように促される。

```r 
> map <- readShapeSpatial(f)
 警告メッセージ: 
1: use rgdal::readOGR or sf::st_read 
2: use rgdal::readOGR or sf::st_read 
```

パッケージをインストールしておく。

```r 
install.packages("rgdal")
install.packages("sf")
```

これで警告なしにシェープファイルを読み込める。

```r 
map2 <- rgdal::readOGR(f)
map3 <- sf::st_read(f)
```

`maptools::readShapeSpatial()`は地図データを`Spatial***DataFrame`という専用のクラスで読み込む。***の部分はシェープファイルの形式に応じてPoints、Lines、Polygonsと変化する。

`maptools::readShapeSpatial()`と同様に`SpatialPolygonsDataFrame`などの形式で読み込むのは`rgdal::readOGR()`で、`sf`はよりデータフレームに近い形式で読み込む（今後は`sf`を使っていく感じになっていく？模様。 [RでGISをやるときにはsfパッケージ、という世の中になるらしい。 - Technically, technophobic.](http://notchained.hatenablog.com/entry/2017/01/06/213333)）。

## 使う
はい。この先は勉強していません。

`sf`ではそのまま`plot()`に投げるとメタデータの数だけプロットが出るようですね。

```r 
plot(map2, col = "grey", border = "white")
plot(map3)
```

![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/109348/80f50617-5b64-c0b7-5c16-6c22b5777c51.png)

![Rplot01.png](https://qiita-image-store.s3.amazonaws.com/0/109348/dd9449f6-89b5-8455-dc61-b4261149e61f.png)

# 参考

- 谷村晋「Rで学ぶデータサイエンス7 地理空間データ分析」
- 古谷知之「シリーズ統計科学のプラクティス5 Rによる空間データの統計分析」
技術英語 > we'll work [from both ends] of a word [to the middle] / palindrome

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 3231 / 12833)

> Here, we'll work **from both ends of** a word **to the middle** to see if it's a palindrome.


https://www.merriam-webster.com/dictionary/palindrome
> :  a word, verse, or sentence (as “Able was I ere I saw Elba”) or a number (as 1881) that reads the same backward or forward

Coders at Workに出てきたPeter Norvig氏によるWorld's Longest Palindromeに関する記事を見つけた。
http://norvig.com/palindrome.html

palindrome生成プログラムを作成したようだ。ただし、以下の記載があるため、意味をなしていない部分があるようだ。
> ... point out that my creation should not be called a true palindrome, because it makes no sense.
Ansible + Vagrant 複数環境の構築メモ

# Ansible + Vagrant 複数環境の構築メモ 

- Vagrantfile 複数環境構築方法
  
```
  config.vm.define "host" do |node|
    node.vm.box = "bento/centos-7.2"
    node.vm.hostname = "host"
    node.vm.network "forwarded_port", guest: 80, host: 81, guest_ip: "192.168.0.30" 
    node.vm.network "private_network", ip: "192.168.0.30"
  end

  config.vm.define "webservers" do |node|
    node.vm.box = "bento/centos-7.2"
    node.vm.hostname = "webservers"
    node.vm.network "forwarded_port", guest: 80, host: 80, guest_ip: "192.168.0.10" 
    node.vm.network "private_network", ip: "192.168.0.10"
  end

  config.vm.define "dbservers" do |node|
    node.vm.box = "bento/centos-7.2"
    node.vm.hostname = "dbservers"
    node.vm.network "forwarded_port", guest: 80, host: 82, guest_ip: "192.168.0.20" 
    node.vm.network "private_network", ip: "192.168.0.20"
  end

```

- 上記、設定の説明<br>
"192.168.0.30"  → ansible (host)<br>
"192.168.0.10"  → webserver (target)<br>
"192.168.0.20"  → dbserver (target)

```
vagrant up 
```
80 ポートの開放を行う。転送先を仮想ではないローカルPCのIPに設定

```
ip a
```
して、IPが振られていない場合

```
sudo systemctl restart network.service
```



host → target にansibleで環境構築するには鍵設定が必要。
hostにて下記コマンドを実行

```
ssh-keygen
ssh-copy-id 192.168.0.10
ssh-copy-id 192.168.0.20
```

# ポート指定して、WEBサーバー・DBサーバーの疎通確認

必要なファイルをクローン

```
git clone https://github.com/seihmd/vagrant-multiserver-example
```

```
# vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

    VAGRANT_VM_PROVIDER = "virtualbox"
    machineNames = ["example.com.web", "example.com.db"]
    config.vm.box = "centos/7"

    N = 1

    (0..N).each do |index|
        config.vm.define machineNames[index] do |machine|
            machine.vm.hostname = machineNames[index]
            machine.vm.network "forwarded_port", guest: 80, host: 10020 + index, guest_ip: "192.168.30.#{10+index}"
            machine.vm.network "private_network", ip: "192.168.30.#{10+index}",  virtualbox__intnet: "example.com"
            machine.vm.network "private_network", ip: "192.168.30.#{10+index}"

            if index == N
                machine.vm.provision :ansible do |ansible|
                    ansible.limit = "all"
                    ansible.playbook = "site.yml"
                    ansible.inventory_path = "staging"
                    # ansible.verbose = "-vvvv"
                end
            end
        end
    end
end
```

- example.com.webとexample.com.dbに入って、IPアドレスの設定

```
sudo systemctl restart network.service
```

- example.com.webにてwebサーバー起動

```
# Webサーバで実行
sudo python -m SimpleHTTPServer 80
```

- 起動確認

http://localhost:10020/
ターミナルで「xxxx-no-macbook:~ xxxx$」が邪魔だった

もろもろ[セットアップ](http://qiita.com/daigon/items/567657d11ed5a9ac62d8)の続きをしていて、気になったところは備忘のために投稿。

### 「xxxx-no-macbook:~ xxxx$」ってなってるのが嫌なので変えました

- システム環境設定 > 共有
※右下の水色フォルダ内の黄色非常口マークのやつ

<img width="780" alt="スクリーンショット 2017-04-10 1.27.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/9f494aca-53fa-76c2-c833-924fe4b03360.png">

<img width="780" alt="スクリーンショット 2017-04-10 1.28.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/8e76adf7-3840-5add-ec55-91ef27e6dfe2.png">

- 編集ボタンを押して「.local」以前を変更してOKボタン
※「.local」は消せない

これでターミナルを閉じて再度開くと設定通りに表示される。
Python Kivy で外部KvファイルをIncludeして使用する


## 概要 
Includeを使用して外部Kvファイルを取り込む基本的なアプリのテストをしてみました．

### 環境
- OS: Windows10 64bit 
- Kivy:1.9.1 
- Python3.5 

### ポイント 
 - 一階層下のフォルダに保存したKvファイルをInclude
 - 外部Kvファイル内のプロパティをRootWidgetのプロパティとして再定義 
 - 外部Kvファイル内のon_pressプロパティにRootWidget内のメソッドを関連付け 

## ファイル配置 
```
project-root
|-- main.py
|-- test.kv
`-- gui/
    `-- tab_test.kv
```

コードは以下のとおりです．

### main.py
```python:main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty

class RootWidget(BoxLayout):
    
    # Kvファイルで定義されている button_include Widget を Pythonファイル内で定義
    button_include = ObjectProperty()  
    
    def print_obj(self, obj):
        print(obj)
        
    def check_button_include(self):
        print(self.button_include)  # Python ファイル内から外部 Kv ファイルのウィジェットクラスにアクセス

class TestApp(App):
    def build(self):
        return RootWidget()


if __name__ == '__main__':
    TestApp().run()
```

### Root Widget を含む Kv ファイル
```python:test.kv
#:include gui/tab_test.kv  # 外部 Kv ファイルを取り込む

<RootWidget>:
    # button_include を RootWidget のプロパティとして定義
    button_include: tab_button_include.button_include

    TabbedPanel:
        do_default_tab: False
        
        TabbedPanelItem:
            text: 'Tab1'
            BoxLayout:
                Button:
                    text: 'button 1'
                    on_press: root.print_obj(self)
                Button:
                    text: 'button 2'
                    on_press: root.check_button_include()
        TabbedPanelItem:
            text: 'Tab2'
            ButtonInclude:  # 外部 Kv ファイルで定義しているウィジェットクラスを使用
                id: tab_button_include  # 定義したウィジェットクラスにid を振っておく
```

### 外部 Kv ファイル
```python:tab_test.kv
<ButtonInclude@Button>:
    button_include: button_include

    id: button_include
    text: 'button include'
    on_press: app.root.print_obj(self)  # "app.root.method" で外部Kvファイル内から RootWidget のメソッドを実行
```

## 実行結果
![kivy_test_include_tab1.png](https://qiita-image-store.s3.amazonaws.com/0/43136/6e20669c-13d8-7eb5-31ca-6074dfa89932.png)
![kivy_test_include_tab2.png](https://qiita-image-store.s3.amazonaws.com/0/43136/ccd6f724-516d-3a8a-9226-58743bc1bf23.png)

### それぞれのボタンの動作結果
```
Button1          ->   <kivy.uix.button.Button object at 0x000001E0A8DE18D0>
Button2          ->   <kivy.factory.ButtonInclude object at 0x000001E0A8DE1A08>
Button include   ->   <kivy.factory.ButtonInclude object at 0x000001E0A8DE1A08>
```


## 参考
- [Kivy Language — Kivy 1.9.2.dev0 documentation]
(https://kivy.org/docs/api-kivy.lang.html#include-file) 
- [Python Kivyの使い方（参考）～APIリファレンスのKivy Languageを翻訳してみた～ - Qiita](http://qiita.com/dario_okazaki/items/680b293be0fb2a5f9e60#include-)
mbedのGPIOをプルアップ / プルダウン / オープンドレインにする


`DigitalOut` クラスの代わりに `DigitalInOut` クラスを使う。

```cpp
#include "mbed.h"

DigitalInOut resetPin(PC_6, PIN_OUTPUT, OpenDrain, 0);

resetPin = 1;
wait(0.5);
resetPin = 0;
```

`OpenDrain` の部分を `PullUp`, `PullDown` に置き換えるとプルアップ・プルダウンにできる（マイコンによるのかな？）。
golangのGUIパッケージgo-gtkを試す

# URL
https://github.com/mattn/go-gtk

# 環境
Ubuntu16.04 64bit
go1.8.0
GTK(GIMP Tool Kit)は使ったことがない

# インストール

```
apt-get install libgtk2.0-dev libglib2.0-dev libgtksourceview2.0-dev
go get github.com/mattn/go-gtk/gtk

# go installについては後述、必須ではない
go install github.com/mattn/go-gtk/gtk
```
Windowsでも動くみたいですが、linuxで導入が簡単ということはそっちで開発したほうが間違いないでしょう。
手順が増えるとミスも起こりやすくなります。

# うごけー！
exampleを覗いて、最低限の機能だけを取り出しました。

```
package main

import "github.com/mattn/go-gtk/gtk"

func main() {
	gtk.Init(nil) // 無いとpanic
	win := gtk.NewWindow(gtk.WINDOW_TOPLEVEL) // ウインドウを作成
	win.ShowAll() // ウインドウを表示
	gtk.Main() // シグナル受信を待機
}
```
![go-gtkサンプル.png](https://qiita-image-store.s3.amazonaws.com/0/96468/210be1c5-9ddb-139b-2c67-f80dd38b8d04.png)


~~goで良く用いられる~~shinyと比べると相当短く書くことができます。
環境構築は面倒なのでトレードオフですね。


# 設定
これだけでは使えないので、win(ウインドウ用の変数)に設定を追加します。

```
win.SetTitle("空のウィンドウ") // タイトルバーに表示される
win.SetSizeRequest(400, 300) // サイズ指定
win.Connect("destroy", gtk.MainQuit) // ✘ボタンでプログラムを停止(gtk.Main()の待機を終了)
```
簡単な設定だけ。

# オブジェクト追加
簡単に調べた感じだとGTKではオブジェクトじゃなくって、ウィジットとかコンテナウィジットとか言うそうです。

とりあえず文字といえばラベルかな？ということで予測を出すと、gtk.NewLabel(string)という関数が。

```
lab := gtk.NewLabel("このツールはgo-gtkのテストです。")
win.Add(lab)
```
![go-gtk2.png](https://qiita-image-store.s3.amazonaws.com/0/96468/ccdc50d9-775d-2c1f-5ee4-bb05eabdcd8f.png)


中央にあるのが標準みたいですね。

# 全体のソースコード

```
package main

import "github.com/mattn/go-gtk/gtk"

func main() {
	gtk.Init(nil)
	win := gtk.NewWindow(gtk.WINDOW_TOPLEVEL)
	win.SetTitle("空のウィンドウ")
	win.SetSizeRequest(400, 300)
	win.Connect("destroy", gtk.MainQuit)

	lab := gtk.NewLabel("このツールはgo-gtkのテストです。")
	win.Add(lab)

	win.ShowAll()
	gtk.Main()
}
```

# 総評
## GTK初心者にも簡単に使える
詳しく調べたりせず、結構適当に書いても動いてしまう。
利点ではありますが、「クロスコンパイルのためにこの関数を呼び出しておくべき」みたいなルールがあったら怖いですね。
ちゃんとしたツールを作りたい時にはちゃんと調べます。

私と同じGolangとGUI経験者であれば、同じようにgo-gtkが簡単に使えるのではないでしょうか。

## コンパイル・実行
コンパイルが遅くて、実行が速い。
コンパイルはi7の高性能なCPU/SSD環境で8秒強。
実用的ではないレベルと思っていましたが...

[cgoがGoのコンパイル速度に与える影響](
http://qiita.com/cubicdaiya/items/b546a786d1359cf91120)
こちらを参考に、予め```go install github.com/mattn/go-gtk/gtk```を実行したらめちゃくちゃ早くなりました。

go-gtk製作者の@mattnさん、リンク先記事でナイスなコメントをした@mattnさん、ありがとうございます。
まだ・ArchLinux インストール覚書

[ArchLinux インストール覚書](http://qiita.com/katz_engineer/items/f032a24cb273c4eb6669)より始めたArchLinuxプロジェクト。[又々・ArchLinux インストール覚書](http://qiita.com/katz_engineer/items/45771a7bb904d0424373)でArchLinuxサーバとFreeNASをiSCSIで接続する事に決めたので、まずはiSCSIについて少し調べました。

# iSCSIとは

私はiが付かない時代の、タダのSCSIがもてはやされていた時代を体験した世代なので、アレがインターネット接続になっただけだという説明で理解できました。だからこのレベルの基本的な紹介は調査してません。

# ターゲットとイニシエータ

基本的な用語。ターゲットとはストレージを提供するサーバー側の呼び名で、イニシエータはストレージを利用するマシン側。用語の由来はわかりません、調べる気力も無いけど。

ちなみに[iSCSIターゲットをArchLinuxで作成する](https://wiki.archlinuxjp.org/index.php/ISCSI_ターゲット)のは、ちょぉっと面倒そうな匂いがします。Archに限らないようですが。その為に必要な機能はカーネルに標準で含まれているようなので、やれば出来るしわかってしまえばそれほど大変ではないかも知れません。

余談ですが[iSCSIイニシエータを設定してディスクレスマシンを作る](https://wiki.archlinuxjp.org/index.php/ISCSI_ブート)事も出来るようです。ちょっと面白いかも。

# iSCSIターゲットをFreeNASで

FreeNASでiSCSIターゲットを設定するのは、比較的簡単のようです。

1. まずDatasetではなくてzvolを用意。
2. 作成したzvolをiSCSIで公開。

いずれもwebインターフェイス上で設定可能。

設定に関する参考文献: [WindowsServer2012R2からFreeNAS(9.3)へiSCSIでMPIOする手順](http://qiita.com/homihomu/items/940eb84afc69015dd999)

FreeNASではないけれど、基礎知識レベルで参考になる情報:

* [やっぱり Sun がスキ！ - zvol と iSCSI と NTFS と zfs snapshot (その 1)](https://blogs.oracle.com/yappri/entry/zvol_iscsi_ntfs_snapshot)
* [やっぱり Sun がスキ！ - zvol と iSCSI と NTFS と zfs snapshot (その ３)](https://blogs.oracle.com/yappri/entry/zvol_iscsi_ntfs_snapshot_3)

zvolとdatasetの違いについては、例えば:

* [How to ZFS - 5.データセットの作成](https://chibiegg.gitbooks.io/how-to-zfs/content/dataset.html)

要するにzfsのストレージプールには、普通のファイルシステムとブロックデバイスの2通りを作成可能の由。後者がzvolと呼ばれているようです。これはファイルシステムではないが、明示的にmountすれば中のファイルを読み書きできる模様。覚えておけば有事の際には便利に使えそうです。

と、ここまで理解できれば実作業が可能でしょう。実際の手順は別稿にて。

# iSCSIイニシエータをArchLinuxで

たぶん、ArchWikiの説明が鉄板ですかねぇ…

* [ArchWiki - iSCSI イニシエータ](https://wiki.archlinuxjp.org/index.php/ISCSI_イニシエータ)

とりあえず現時点でかき集めてきた情報は以上。実際に設定を始めたら、追加で知識などが必要になるかも知れません。その場合は追記する予定。
Slackメッセージをesaリアクションでesaにぶん投げるやつ

こういうの。

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/3063/40728f65-8e39-0cf4-070c-2877bf375a8c.gif)

`esa`っていうカスタム絵文字を追加して、↓みたいなHubot scriptを書いた。

```coffeescript
# Description:
#   特定のリアクションがついたメッセージをesaに投稿する
#
# Notes:
#   Slackだと流れていってしまう作業メモなどをesaに書きとめておく
#   環境変数にesaのアクセストークン,チーム名,投稿カテゴリを設定しておく
#     `heroku config:set ESA_ACCESS_TOKEN=xxx`
#     `heroku config:set ESA_TEAM_NAME=yyy`
#     `heroku config:set ESA_BOT_CATEGORY=zzz`
#

decode = require 'decode-html'

handleReaction = (res) ->

  message = res.message
  item = message.item
  reaction = message.reaction
  reaction_type = message.type
  return unless reaction_type is 'added'

  if reaction is 'esa'
    res.robot.adapter.client.web.channels.history item.channel, {oldest: item.ts.split('.')[0], count: 1}, (err, data) ->
      if err
        res.send "Failed to post :( #{err}"
      else
        if data.messages.length > 0
          text = decode data.messages[0].text
          data = JSON.stringify {
            post: {
              name: text.split(/\n/)[0],
              body_md: text,
              category: process.env.ESA_BOT_CATEGORY,
              user: 'esa_bot',
              message: 'Add post from slack',
            }
          }
          res.robot.http("https://api.esa.io/v1/teams/#{process.env.ESA_TEAM_NAME}/posts")
            .header('Content-Type', 'application/json')
            .header('Authorization', "Bearer #{process.env.ESA_ACCESS_TOKEN}")
            .post(data) (err, r, body) ->
              if err
                res.send "Failed to post :( #{err}"
              else
                res.send "Post to #{(JSON.parse body).url}"

module.exports = (robot) ->
  robot.react handleReaction

```

## 参考

- [esa.io ロゴデータ](https://docs.esa.io/posts/125)
- [esa API](https://docs.esa.io/posts/102#7-3-0)
- [Slack Developer Kit for Hubot](https://slackapi.github.io/hubot-slack/basic_usage)
- [Slack channels.history API](https://api.slack.com/methods/channels.history)
- https://github.com/intesso/decode-html
angular2-fullcalendar の使い方。

社内システムでAngularを使用しています。
カレンダーの実装が必要だったためおしゃれなカレンダーのライブラリを探して「angular2-fullcalendar 」にたどり着きました。
npm:https://www.npmjs.com/package/angular2-fullcalendar
demo:https://fullcalendar.io/

使い方を残しておきます。


```ruby:ターミナル
npm install ap-angular2-fullcalendar --save
```
コマンドを叩いて、npmからfullcalendarをインストールします。


その後下記のソースコードを描いてください。


```js:app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';

import { AppComponent } from './app.component';
import {CalendarComponent} from "ap-angular2-fullcalendar";

@NgModule({
  declarations: [
    AppComponent,
    CalendarComponent//追加
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

```





```js:style.css
@import "../node_modules/fullcalendar/dist/fullcalendar.min.css";
```







```html:app.component.html

<h1>
  {{title}}
</h1>
<angular2-fullcalendar [options]="calendarOptions"></angular2-fullcalendar><!--追加-->

```




```js:app.component.ts


import {Component, ViewChild} from '@angular/core';
import {CalendarComponent} from "ap-angular2-fullcalendar";

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app works!';

  //以下追加
  @ViewChild(CalendarComponent) myCalendar: CalendarComponent;

  changeCalendarView(view) {
    this.myCalendar.fullCalendar('changeView', view);
  }

  calendarOptions:Object = {
    height: 500,//高さを任意で指定
    fixedWeekCount : false,
    defaultDate: '2016-09-12',
    editable: true,
    eventLimit: true, // allow "more" link when too many events
    events: [
      {
        title: 'All Day Event',
        start: '2016-09-01'
      },
      {
        title: 'Long Event',
        start: '2016-09-07',
        end: '2016-09-10'
      },
      {
        id: 999,
        title: 'Repeating Event',
        start: '2016-09-09T16:00:00'
      },
      {
        id: 999,
        title: 'Repeating Event',
        start: '2016-09-16T16:00:00'
      },
      {
        title: 'Conference',
        start: '2016-09-11',
        end: '2016-09-13'
      },
      {
        title: 'Click for Google',
        url: 'http://google.com/',
        start: '2016-09-28'
      }
    ]
  };

}
```

app.component.tsのheightにはデザインに合うような数値を入れてください。
vue.jsで簡単な計算機を作る2017

## 作ったもの

[FGO Activity Predictor - GitHub](https://gist.github.com/thrakt/9f9d383e7cb66812f49a734e73a0e54f "FGO Activity Predictor")
[FGO Activity Predictor - bl.ocks.org](https://bl.ocks.org/thrakt/raw/9f9d383e7cb66812f49a734e73a0e54f/ "FGO Activity Predictor")

FGOというスマホゲーのAP計算機を作った。例によって、Googleスプレッドシートで作ってたものを移植。
経済APというのは、端的に言うと寝てる間にAPが無駄にならないように最低限減らしておくべき値のこと。[これでもう5分おきに起きなくていいですね所長。](http://www.fate-go.jp/manga_fgo2/comic13.html "第13話 寝てる間にAPチャージ！｜もっとマンガで分かる！Fate/Grand Order")

## 感想

* 日本語のドキュメントが完備されていて、それだけで完結できて大変良かった。 https://jp.vuejs.org/v2/guide/
* `<script src="https://unpkg.com/vue"></script>`で即使える。手軽でいいし最高。最近のブラウザはES6も普通に使えるし。
* ドキュメントが揃っていたのもあるだろうけど、[前回](http://qiita.com/thrakt/items/784027621a961b209b6d "vue.jsで簡単な計算機を作る - Qiita")よりかなり楽だった。本体では大きくつまる所もなく。前はもっと覚えないといけない規則がいっぱいあった気がする。
* とはいえ、`component`を分けていくところは結構苦痛もある。`$emit`とは……。整理後、はたしてこれは見通しがよくなったのだろうかという疑問も。
* 最近はReactを使っていたので、すっかりマインドセットが変わっていた事に自分で驚いた。なんと素のHTMLを書いているのに違和感がある。vueもJSXで書けるようになっていたけど、そうなると同じような感じになるんだろうか。
* 言っても高度な使い方はほとんど読んでないので、そこまで行くとまた違った感想になるかもしれない。でもそこまで行かなくても、これくらいは十分書けるというのも良さかと。
* 大きなコードになってくると大変そうな印象はあるが、HTMLの世界に親しみがあれば直感的に理解できるし、jQueryのコードをもう少し交通整理したいだとか、デザイナーさんがちょろっと使うには最適なんじゃないかと思う。何と言っても導入が楽なのは大きい。

## 感想 2017-05-05

vuexを使うように変えたので追加

* vuexも日本語のドキュメントがありすぐ使える。  
https://vuex.vuejs.org/ja/
* vuexもCDNから使用可能。`<script src="https://unpkg.com/vuex"></script>`
* ただ、普通に使うならwebpackなりを使うと思うので、一応お試しはできるぐらいの話だと思う。
* vuexを全部インラインで書く、1ファイルでという形なので、正直ロジックが大きいComponentからstoreに移っただけという感じになった。とはいえ、ModelとViewの分離ができた感はあった。なにせサーバとの通信もないので、Routerとかその辺も触ればまた違うと思われる。
* 当然なんだけどvue側へのサポートが充実しており、つなぎ込みが非常に楽。Reactだとこの辺面倒な印象がある。
* ところで、`...mapState()`とかは`Object.assign({},Vuex.mapState())`と書ける。これならトランスコンパイラなしでも動く。
NDI SDK for iOSでNDIlib_recv_create2がNULLを返す問題(iOS9.3.1)

https://twitter.com/nariakiiwatani/status/851055848893718528
https://twitter.com/nariakiiwatani/status/851062635898429441

何かわかったら追記する

2017.4.11追記
e-mailでNewTekに問い合わせたところ、まだ準備中との回答でした。
【GAS】カラム内の空白セルを削除する

スプレッドシートの内容が以下だとして、
メンバ列の順序を変えずに空白セルを詰めたいとき、

| メンバ  |当番　|　　　|
|:--------|:----|:----|
| 佐藤    |朝礼  |     |
| 鈴木    |炊事  |     |
| 　　    |点呼  |     |
| 田中    |掃除  |     |
| 伊藤    |風呂  |     |

以下のコードを実行すると、

```
function marchMembers(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var ranges = sheet.getRange(2, 1, lastRow-1);
  var values = ranges.getValues();  

  for(i = values.length - 1; i >= 0; i--){
    if(values[i][0] == ''){
      values.splice(i, 1);
      values.push(['']);
    }
  }

  ranges.clear().setValues(values);
}
```

こうなる

| メンバ  |当番　|　　　|
|:--------|:----|:----|
| 佐藤    |朝礼  |     |
| 鈴木    |炊事  |     |
| 田中    |点呼  |     |
| 伊藤    |掃除  |     |
| 　　    |風呂  |     |
又々・ArchLinux インストール覚書 

[ArchLinux インストール覚書](http://qiita.com/katz_engineer/items/f032a24cb273c4eb6669)で示したArchLinuxプロジェクトの続き。古いデスクトップマシン Inspiron 530s をサーバに仕立てるに当たり、ストレージの一部を我が家の FreeNAS ファイルサーバにする作業です。極めて家庭的な事情により作業時間がブツ切りになるので、思考過程のメモ書きを兼ねて極小記事の量産になります。という話は[ArchLinux インストール覚書](http://qiita.com/katz_engineer/items/f032a24cb273c4eb6669)の前書きにも書いたけど、いよいよそうせざるを得ない状況になったというか。

結論としては iSCSI で共有します。共有という言い方はおかしいですが…それはどうでもよくて、今回はその判断の根拠を。

# 検討

FreeNASを外部ストレージとして利用する為のプロトコルについては、選択肢がいくつかあります。

## CIFS(SMB)

これは元がMicrosoftの規格で、色々と設定が多い。それだけに勉強がてらやってみるという手もありますけども。サーバの為の基本設定として採用するのはちょっと、個人的には避けたい。サーバ周辺はなるべくLinuxで固めたいし。

## NFS

最初はNFSを利用しようとしてました。しかし調べてみると、意外と気を使わなきゃいけないらしい事がわかってきて、ちょっと面倒な気分に…:frowning2: やり始めれば一気に終わりそうだとは思うのだけど。どうも今時の技術としては応用範囲が狭そうだし…

## iSCSI

それで悩んだ時に気付いたのがiSCSI。単なるストレージ提供の規格であり、ファイル共有しないし、してはならない（参考文献: [iSCSIとは何か](http://www.syuhitu.org/other/iscsi/iscsi01/iscsi01.html)）。しかし今回の目的はそのものズバリ「サーバに対して絶対壊れないストレージを提供する」のみ。サーバで管理しているファイルの共有はサーバ側でサービスを提供する予定。だからこれで問題はありません。問題無いんですよ ←根拠の無い一抹の不安をどうしても拭い去れないので、自分を説得する為に2回言いました。

そしてもう１つ、速度差。NFSよりもiSCSIの方が速い。これを調べた事例はぐぐると沢山出てくるのでそちらを参照してください。ギガビットイーサで接続すると、ローカルストレージとほとんど変わらない速度で読み書きできる模様。原理的にiSCSIはファイル共有の為の（プロトコル上の）気遣いが不要なので、理論上の通信速度がそのまま出るはずで、当たり前ではあります。

# 結論

我が家のArchLinuxサーバ⇔FreeNAS接続プロトコルはiSCSIに決定。問題があったら、その時にまた考えます。
【初心者投稿-19】久しぶりの投稿です！

#昨日までのおさらい
先週木曜日から会社の行事で学習が全くできていませんでした！

昨日も歓迎会で数百人の前でスベってきて、深夜まで飲んでました！

企業戦士にとって学習もままならないですね・・・笑

しかし、今日はエンジニアの友だちと話しながらトップページ作りを進めていました。

明日からは平日夜の習慣を取り戻し、学習に邁進する所存です！
学習は習慣化を味方にすることが大切であると思った記事を共有します！

[習慣化って大事](https://mitanorifusa.com/articles/others/151)

自分の中のキーワードは、"歯を磨くように○○をする"ことです。

#学習の記録
* サイト作り：3日目
* 今日の勉強時間：180分くらい
* 総学習時間：20時間45分
* 今日学んだこと：何があっても学習をすすめることが大事！だと思いました。明日からはサイト作りですが、進捗や悩みを投稿します。
Laravel Mix (webpack) で、ロードパスのAliasを作ると ../../ が無くなって便利

Laravel というよりは Webpack の話なんだけど、もっと早く設定しておけば良かったと思ったのでメモ。

# 前提

- Laravel 5.4 
- webpack (Laravel mix)

で開発している。

# 問題

自分で作ったコンポーネント等を読み込む時に、相対パス指定していた。
が、それだと、 `import Hoge from '../../Hoge.vue'` などとなって分かりにくいし、ディレクトリ構成を変えると毎回変えるのが面倒だった。

# 解決策

下記を `webpack.mix.js` の最初の方に加える。

```js:webpack.mix.js
mix.webpackConfig({
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': __dirname + '/resources/assets/js'
    }
  },
})
```

これで、 `import Hoge from '@/components/Hoge.vue'` と呼び出せて分かりやすい。

vue-cli では、最初から `@` が `src` になるように設定されているので気づいた。

https://github.com/vuejs-templates/webpack/blob/master/template/build/webpack.base.conf.js#L27

Laravel Mix でもそのうちデフォルトで設定されるようになるかもしれない。
プルリク送ってみようかな。

# 参考

- https://readouble.com/laravel/5.4/ja/mix.html
- https://github.com/JeffreyWay/laravel-mix/blob/master/setup/webpack.config.js#L209

関係ないけど、 Laravel mix で調べると Laravel Elixir の情報ばっかり出てくるのがつらい
Twitterのストリームを扱う gem を userstream から twitter へ移行


Twitter を操作する gem に userstream というものがあり、かつて twitter gem がまだストリームをサポートしていなかった頃にこの userstream を使っていました。

twitter gem がストリームに対応してからというもの、最近はめっきり twitter gem を使っていますが、まだ userstream を使用したプロジェクトが手元に残っていたので、移行手順をここにメモしておこうと、そういう魂胆です。

## Gemfile
Gemfile は

```ruby:Gemfile
gem 'userstream', :git => 'git://github.com/mitukiii/userstream.git'
```

を

```ruby:Gemfile
gem 'twitter'
```

と変更します。

## 初期化

`UserStream`の初期化は、

```ruby
UserStream.configure do |config|
  config.consumer_key = ENV['TWITTER_CONSUMER_KEY']
  config.consumer_secret = ENV['TWITTER_CONSUMER_SECRET']
  config.oauth_token = ENV['TWITTER_OAUTH_TOKEN']
  config.oauth_token_secret = ENV['TWITTER_OAUTH_TOKEN_SECRET']
end
```

を

```ruby
@stream_client = Twitter::Streaming::Client.new do |config|
  config.consumer_key        = ENV['TWITTER_CONSUMER_KEY']
  config.consumer_secret     = ENV['TWITTER_CONSUMER_SECRET']
  config.access_token        = ENV['TWITTER_OAUTH_TOKEN']
  config.access_token_secret = ENV['TWITTER_OAUTH_TOKEN_SECRET']
end
```
などと変更します。

## ストリーム受信

あとは

```ruby
UserStream.client.user do |status|
  nirunari_yakunari status
end
```

としていたところを

```ruby
@stream_client.user do |status|
  nirunari_yakunari status
end
```

とすればよいです。

エラー処理の `UserStream::RateLimited` は `Twitter::RateLimited` とすればよいです。

詳しくは gem のドキュメントを読みます。[Class: Twitter::Streaming::Client — Documentation for twitter](http://www.rubydoc.info/gems/twitter/Twitter/Streaming/Client)
【GAS】カラムの内容をシャッフルする

##準備

配列をシャッフルする関数を作成

```js
function shuffle(array){
  var result = [];
  for(i = array.length; i > 0; i--){
    var index = Math.floor(Math.random() * i);
    var val = array.splice(index, 1)[0];
    result.push(val);
  }

  return result;
}
```

##使用例
スプレッドシートの内容が以下だとして、

| メンバ  |当番　|　　　|
|:--------|:----|:----|
| 佐藤    |朝礼  |     |
| 鈴木    |炊事  |     |
| 高橋    |点呼  |     |
| 田中    |掃除  |     |
| 伊藤    |風呂  |     |

以下のコードを実行すると、

```js
function shuffleMembers(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var ranges = sheet.getRange(2, 1, lastRow-1);
  var values = ranges.getValues();

  ranges.clear();
  ranges.setValues(shuffle(values));
}
```

名前部分のみシャッフルされる

| メンバ |当番　|　　　|
|:-------|:----|:----|
| 高橋   | 朝礼 |     |
| 鈴木   | 炊事 |     |
| 佐藤   | 点呼 |     |
| 伊藤   | 掃除 |     |
| 田中   | 風呂 |     |
Visual Studio 2017 更新プログラム(Windows 10 Creators Update 用 UWP アプリ向け更新)のインストール

Windows 10 Creators Update (バージョン 1703) のリリースに伴い、Creators Update 向けの UWP 用アプリをビルド可能な Visual Studio 2017 バージョン 15.1 (26403.00) がリリースされたようです。

Visual Studio 2017 の更新方法は、以下の通り。

[ツール] - [拡張機能と更新プログラム] を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/3662acc3-8e13-1247-d899-e0156d52c1a4.png)


[更新プログラム] - [製品の更新プログラム] - [Visual Studio の更新] - [更新] を選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/1e66eaf0-d65e-365a-dc7c-8a1703392f7a.png)

インスタンスの終了を促されるため、インストーラー以外の Visual Studio 2017 を終了し、[再試行] を選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/3717378a-3218-9836-7683-894eaeb41852.png)

インストールが進行する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/a660ea2f-23ef-aa7a-9e77-b26417838d08.png)

インストールが完了したら、[起動] を選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/59631af0-7907-7d21-0338-df011013999c.png)

[ヘルプ] - [Microsoft Visual Studio のバージョン情報] を選択し、対象のバージョンにアップデートされたことを確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/efb0af2d-d7e1-c551-6b58-a0f4c5bd1de1.png)

UWP 開発プロジェクト選択時のターゲット バージョン、最小バージョンの選択においても "Windows 10 Creators Update(10.0; ビルド 15063)" が選択可能となる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/d5f0f054-94c1-c323-4eee-06dbadffe2d1.png)



これまでのバージョンだと、更新するにもそれなりの時間を要していましたが、今回のリリースでは、今までより、より短時間で更新が完了します。
バグフィックス、機能追加も頻繁に行われているので、常に最新の Visual Studio を使っていきましょう！！
Linuxインストール時に読むべきドキュメント

OSのインストールや設定作業でわからないことがあった際、適当にググッて対処してしまうこともできるが、信頼できる情報源から情報を得たい場合はどうしたらよいか。何を参照すべきか。

## 1. ディストリビューションのドキュメント

各ディストリビューションでインストールガイドが用意されている。まずそれにあたってみるのが良いだろう。

 * Ubuntu
    * https://help.ubuntu.com/lts/installation-guide/amd64/index.html
 * RedHat Enterprise Linux (CentOSもおそらく同じ)
    *  https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/index.html
 * Arch Linux
    * https://wiki.archlinuxjp.org/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89

## 2. man

manコマンドでは、コマンドの使用方法だけでなく設定ファイルの書式も教えてくれる。
この場合のセクション番号は"5"(書式と慣習)だ。（セクション番号について詳しくは"man man"を見るべし）

```
man 5 sudoers   # sudoの設定方法がわかる
man -k network  # キーワードを指定して、マニュアルページを検索する
```

## おまけ. kernel関連のドキュメント
「Linuxインストール時に」というタイトルからは完全にそれるが、カーネルに関するドキュメントとして、ソースコードといっしょに含まれているものが素晴らしい。
ディレクトリは、"doc/Documentation/"。

OSのインストールの方法によっては（？）、自動でインストールされないこともあるようなので、そういうときはkernelのソースコードを自分でダウンロードしよう。

場所はココ。
https://www.kernel.org/
MongoDB でサンプルデータの REST API を作る（参照のみ、プロトタイプ用）

# EDIT >> 2018/06/02 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
## mongodb 3.6 でこの記事で扱っているビルトインの REST API は廃止されたようです。
もしこの記事の内容が必要なら mongodb 3.4 までを使ってください。

ここまで << EDIT


---






macOS で brew の場合。

# MongoDB の導入

```
$ brew install mongo

==> Caveats
To have launchd start mongodb now and restart at login:
  brew services start mongodb
Or, if you don't want/need a background service you can just run:
  mongod --config /usr/local/etc/mongod.conf
```

# MongoDB ビルトインの REST API を有効にする。

--rest --httpinterface オプションをつけてバックグラウンドで実行。

```
$ mongod --config /usr/local/etc/mongod.conf --rest --httpinterface &
```

# サンプルデータの導入
ここの内容です。
https://docs.mongodb.com/getting-started/shell/import-data/

```
$ curl https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json > primer-dataset.json
$ mongoimport --db test --collection restaurants --drop --file primer-dataset.json
```

# 確認
```
$ curl localhost:28017/test/restaurants/

{
  "offset" : 0,
  "rows": [
    { "_id" : { "$oid" : "58ea357315d762733d09d4c4" }, "address" : { "building" : "1007", "coord" : [ -73.856077, 40.848447 ], "street" : "Morris Park Ave", "zipcode" : "10462" }, "borough" : "Bronx", "cuisine" : "Bakery", "grades" : [ { "date" : { "$date" : "2014-03-03T09:00:00.000+0900" }, "grade" : "A", "score" : 2 }, { "date" : { "$date" : "2013-09-11T09:00:00.000+0900" }, "grade" : "A", "score" : 6 }, { "date" : { "$date" : "2013-01-24T09:00:00.000+0900" }, "grade" : "A", "score" : 10 }, { "date" : { "$date" : "2011-11-23T09:00:00.000+0900" }, "grade" : "A", "score" : 9 }, { "date" : { "$date" : "2011-03-10T09:00:00.000+0900" }, "grade" : "B", "score" : 14 } ], "name" : "Morris Park Bake Shop", "restaurant_id" : "30075445" } ,
...以下略
```
VisualStudioCode + TypeScript でブレークポイントが効かなかった問題（解決）


ベタにかいた場合はうまく動くけど、
フォルダを分けたり、ファイルを分割して Source Map を使ったりするとうまく行かない。

# 環境

* Visual Studio Code 1.11.1
* Type Script 2.2.2

# やりたいこと

以下のようなフォルダ構成にしたい。
デバッグ時にブレークポイントを設置したい。

	-+ .vscode
	 |
	 + src_hoge
	 | + aaa.ts
	 | + bbb.ts
	 | + tsconfig.json
	 |
	 + www_hoge
	   + main.js
	   + main.js.map

# 答え

launch.json で outFiles を指定すればうまく行きました。

# tsconfig.json

	{
	    "compilerOptions": {
	        "target": "ES5",
	        "sourceMap": true,
	        "outFile": "../www_hoge/main.js"
	    }
	}

# task.json

	{
		"version": "0.1.0",
		"command": "tsc",
		"isShellCommand": true,
		"args": ["-p", "./src_hoge/"],
		"showOutput": "silent",
		"problemMatcher": "$tsc"
	}

#launch.json

	{
	    "version": "0.2.0",
	    "configurations":
	        {
	            "type": "node",
	            "request": "launch",
	            "name": "クライアント",
	            "program": "${workspaceRoot}/www_hoge/main.js",
	            "sourceMaps": true,
	            "outFiles": [ "${workspaceRoot}/www_hoge/**/*.js" ],     <===== ★これ
	            "cwd": "${workspaceRoot}/"
	        }
	    ]
	}

# 補足

Type Script 1.8 以降、コンパイルオプションに outFile が実装されたため、browserify などは未使用。

launch.json の outDir は非推奨となったので outFiles を使っています。
Unity5.6でHTC Viveコントローラが認識されない問題と解決法

※この記事は備忘録になります。同じお悩みを抱える方が参考になれば幸いです。
### SteamVR plugin 1.2.2が2017年6月29日にリリースされ、この問題は解消されました。
![steamkousin.png](https://qiita-image-store.s3.amazonaws.com/0/162880/1705ef40-5781-b4fd-b22d-6bc1d0d05a6a.png)




## 症状
HTC Viveを使用したUnityでの開発環境上でViveコントローラが認識されない

## この不具合が起きた環境
OS:windows10 64bit
VRHMD:HTC Vive
Unity5.6.0f3
SteamVR plugin for Unity - v1.2.1


## 経緯
先日、Unity5.6が公式リリースとなりました
![01.png](https://qiita-image-store.s3.amazonaws.com/0/162880/0ac8d773-8144-5f97-4826-a0d41721f9ae.png)


Video PlayerやGoogle Daydreamのサポートなど新しい機能が多数追加されました

せっかくなのでVideo Playerを使ってVRと絡めて何か作りたいなぁと思った矢先、
HTC Viveのコントローラが反応していないことに気づきました
しかもErrorもwarningもなしです。困った。

SteamVRの再起動や再キャリブレーション、ルームスケール設定のやり直しと色々と試してみましたが
これまたどうして反応しません

ならばアップデートされたUnity側の問題かと思いSteamVR pluginのreadmeを確認してみると

> Known issues:

> * The current beta version of Unity 5.6 breaks the normal operation of the SteamVR_UpdatePoses component (required for tracked controllers).
> To work around this in the meantime, you will need to manually add the SteamVR_UpdatePoses component to your main camera.

おおっ！なんか書いてある！

ということでHierarchy内の[CameraRig]/Camera (head)/Camera (eye)に
Add ComponentでSteam VR_UpdatePosesを追加しましょう。
![update.png](https://qiita-image-store.s3.amazonaws.com/0/162880/2656908f-7c66-9234-2db0-bf7a7d07a2a9.png)


これで問題なくコントローラを使用できました

## 結論
今後のアップデートで修正されるとは思われますが、
現在のUnity5.6系でHTC Viveのコントローラが反応しない場合には
Camera (eye)にSteamVR_UpdatePosesをAddすることで回避できます
Delphi IDE Setting Changer

# Delphi IDE のテーマ変更
Delphi は Editor のフォントは変えられますが、IDE で使われるフォントは変更できませんでした。
XE8 までは。

## Theme
XE8 からは「テーマ」を使って変更できるようになったのですが、これは[直接レジストリをいじれ](http://docwiki.embarcadero.com/RADStudio/Berlin/ja/IDE_%E3%83%93%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%AB%E8%A8%AD%E5%AE%9A%E3%81%AE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0_%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA_%E3%82%AD%E3%83%BC)よ、というスパルタンさです。

そのため？ @kazinoue さんが、その[指南をする記事を書いています](http://qiita.com/kazinoue/items/424c6e042a6382f9c085)。

でも、手動ってやっぱり大変なので…

## 作りました
といっても、XE8 の時に作ったものを 10.2 Tokyo に対応させただけなのですが。

[ソースコードはここ](https://bitbucket.org/hosokawajun/delphi-ide-setting-changer)。

特に凝ったコードではないものの、フォントのリストアップ方法や、レジストリへの書き込みなどの参考になるかもしれません。

実行すると↓こんなフォームが現れます。

![isc.png](https://qiita-image-store.s3.amazonaws.com/0/12977/839ea224-ec00-610d-5cde-bd68f55924de.png)

使い方は特に説明しなくてもわかると思います。

# Let's customize

では、そんな訳で IDE のフォントやベースカラーを変更できるようになるのですが、世の中にはもっとスゴいのがあるので、そちらを使ってみるのも一興です。

↓すごいの
[Delphi IDE Theme Editor](https://github.com/rruz/delphi-ide-theme-editor)