OmniAICreator/Qiita-1.07M huggingface dataset:
PHPでBINGO機能を作ってみた（ドットインストール参考）


```index.php
<?php

require_once(__DIR__ . '/function.php');
require_once(__DIR__ . '/Bingo.php');

$bingo = new \MyApp\Bingo();
$nums = $bingo->create();

 ?>

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>BINGO</title>
    <link rel="stylesheet" href="styles.css">
  </head>
  <body>
    <div id="container">
        <table>
          <tr>
            <th>B</th><th>I</th><th>N</th><th>G</th><th>O</th>
          </tr>
          <!-- ループ処理 trを回す -->
          <?php  for ($i = 0; $i < 5; $i++) : ?>
          <tr>
            <!-- ループ処理 tdを回す -->
            <?php  for ($j = 0; $j < 5; $j++) : ?>
            <td><?= h($nums[$j][$i]); ?></td>
          <?php endfor; ?>
          </tr>
        <?php endfor; ?>
        </table>
    </div>
  </body>
</html>

```

```config.php
<?php

ini_set('display_errors', 1);


require_once(__DIR__ . '/function.php');
 ?>

```

```Bingo.php
<?php

namespace MyApp;


class Bingo {
  public function create() {
    $nums = [];

    for ($i = 0; $i < 5; $i++) {
      $col = range($i * 15 + 1, $i * 15 + 15 );
      shuffle($col);
      $nums[$i] = array_slice($col, 0, 5);
    }

    $nums[2][2] = "FREE";
    return $nums;
  }
}
 ?>

```

```function.php

<?php

//htmlへ表示する際はエスケープする必要がある(htmlspecialcharsを使う)
function h($s) {
  return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}

 ?>

```

```styles.css
body {
  font-family: Arial, sans-serif;
  text-align: center;
  font-size: 16px;
}

#container {
  margin: 0 auto;
  width: 322px;
}

td, th {
  width: 60px;
  height: 45px;
}

td {
  background: #F06292;
  color: #fff;
}

th {
  color: #F06292;
  font-size: 22px;
}

```

完成図
![スクリーンショット 2018-05-03 9.13.39.png](https://qiita-image-store.s3.amazonaws.com/0/174952/cee7f230-fce6-2f4e-3075-36058bb1b232.png "スクリーンショット 2018-05-03 9.13.39.png")
chainerの作法　その4

#概要
chainerの作法を調べてみた。
オプチマイザー。

#使ったモデル
分類。

```
class MLP(Chain):
	def __init__(self, n_in, n_units, n_out):
		super(MLP, self).__init__(l1 = L.Linear(n_in, n_units), l2 = L.Linear(None, n_out))
	def __call__(self, x):
		return self.l2(F.relu(self.l1(x)))

model = L.Classifier(MLP(6, 128, 4))


```

#optimizers.Adam()

![opti_Adam.png](https://qiita-image-store.s3.amazonaws.com/0/18104/11436d66-5e44-2123-b18b-de07bc623cd9.png)

#optimizers.SGD()

![opti_SGD.png](https://qiita-image-store.s3.amazonaws.com/0/18104/a313ac05-e496-3cca-c92f-7ee669359e62.png)

#optimizers.AdaGrad()

![opti_AdaGrad.png](https://qiita-image-store.s3.amazonaws.com/0/18104/df45e2ff-d103-be4a-2f82-2dc344a633c4.png)

#optimizers.AdaDelta()

![opti_AdaDelta.png](https://qiita-image-store.s3.amazonaws.com/0/18104/d5c1bd4d-1eee-3928-6a58-67608bf7ae52.png)

#optimizers.MomentumSGD()

![opti_MomentumSGD.png](https://qiita-image-store.s3.amazonaws.com/0/18104/f58aae8a-c307-9ce7-f717-0b5e6a70a2ac.png)

#optimizers.RMSprop()

![opti_RMSprop.png](https://qiita-image-store.s3.amazonaws.com/0/18104/73ee8655-979e-a1da-447b-d34070e29007.png)

#optimizers.RMSpropGraves()

![opti_RMSpropGraves.png](https://qiita-image-store.s3.amazonaws.com/0/18104/aefe1d6c-8019-0305-b537-4888729c2756.png)


以上。
Travis CIは公開リポジトリもプライベートリポジトリもtravis-ci.comになるみたい

## 結論

<https://travis-ci.com>に統一されるぽいですよ[^integration]。
これから、**公開リポジトリでもプライベートでもどっちでも`.com`を使おう！**ってことみたいですよ。

[^integration]: "Over the next several months, we’ll be migrating all travis-ci.org repositories and customers to travis-ci.com."とあるので、統一するって解釈しました(ソース:　"Current Travis CI Users" section in https://blog.travis-ci.com/2018-05-02-open-source-projects-on-travis-ci-com-with-github-apps?utm_source=Intercom&utm_campaign=2may_release)


## いままでのTravis

いままで、公開リポジトリは<https://travis-ci.org>で、プライベートリポジトリは<https://travis-ci.com>で、orgなのかcomなのかで気をつける必要があって、すこし面倒でした。それが改善に向かうようです。

## おことわり

元のリンクと英文を極力載せてます。
英語のご解釈ありそうなので、そのときはコメントとか編集リクエストとかよろしくお願いしますね

## きっかけ

きっかけは下のポップアップが画面に出てたことで、オープンソースもプライベートリポジトリもどっちも"travis-ci.com"でできるよ。みたいなアナウンスがあって、ちょっとだけ調べてみました。

![Screen Shot 2018-05-03 at 8.42.06.png](https://qiita-image-store.s3.amazonaws.com/0/84451/9aa06d89-324a-8dfd-7961-a7b59e24be94.png)

詳細ページ：[read all the details here](https://blog.travis-ci.com/2018-05-02-open-source-projects-on-travis-ci-com-with-github-apps?utm_source=Intercom&utm_campaign=2may_release)

以下は詳細ページの内容からの引用です。

## 新しくリポジトリをCIするとき

新しくリポジトリをアクティーベートするときは、**公開でもプライベートでも.comの方を使ってね**と言っています。新しい機能とかも.comの方で提供されていくみたいです。

> If you’re activating a new repository – either public or private – on Travis CI, please use travis-ci.com. You’ll be able to take advantage of our newest features, and share additional concurrency between open source and private repositories.



## .orgですでにCIしているリポジトリたち

ビルド履歴とかはしばらく.orgに残るらしく、もうすぐしたら.org=>.comのマイグレーション方法に関して、更新される的なことを言っているような気がします。

> Existing repositories and their build histories will stay on travis-ci.org for the moment. We will have further updates soon on how to migrate your build history from travis-ci.org to travis-ci.com. Read more on how this will work [for your existing Open Source repositories in the docs](https://docs.travis-ci.com/user/open-source-on-travis-ci-com/#Existing-Open-Source-Repositories-on-travis-ci.org).


## まとめ

結局これから、.comを使っていけば良さそうですね
chainerの作法　その3

#概要
chainerの作法を調べてみた。
活性化関数。

#写真

![acti2.png](https://qiita-image-store.s3.amazonaws.com/0/18104/53bc84da-b210-79b3-e6c5-72ce25cc541f.png)

#サンプルコード


```
import numpy as np
import matplotlib.pyplot as plt
import chainer.functions as F

def main():
	actfun = [F.relu, F.elu, F.clipped_relu, F.leaky_relu, F.sigmoid, F.hard_sigmoid, F.tanh, F.softplus, ]
	x = np.arange(-5, 5, 0.2)
	for af in actfun:
		y = [i.data for i in af(x)]
		plt.plot(x, np.array(y), label = af)
	plt.legend()
	plt.savefig("acti2.png")
	plt.show()

if __name__ == '__main__':
	main()

```

以上。
異なったバージョンのXcodeを２つ起動しているとビルドできなくなる


Xcodeは複数のバージョンをインストールすることができる。そして、違ったバージョンを２つ立ち上げることも可能ぽい。
ただ、どちらかでビルドをしようとすると、エラーになるぽい。
その場合は、一度Xcode自体を終了してビルドしたい方だけ起動→ビルドするしかないようだ。
VueコンポーネントでWindowサイズ変更検知＆値取得

# 実装方法

ブラウザのリサイズはwindowのイベントでVueが直接関与する部分ではないため、コンポーネントの作成時にイベントリスナを追加します。コンポーネント削除時には、忘れずにイベントリスナも削除します。

# サンプルコード

```vue
<template>
<div>
  <p>window width: {{ width }}</p>
  <p>window height: {{ height }}</p>
</div>
</template>

<script>
export default {
  data: function () {
    return {
      width: window.innerWidth,
      height: window.innerHeight
    }
  },
  methods: {
    handleResize: function() {
      // resizeのたびにこいつが発火するので、ここでやりたいことをやる
      this.width = window.innerWidth;
      this.height = window.innerHeight;
    }
  },
  mounted: function () {
    window.addEventListener('resize', this.handleResize)
  },
  beforeDestroy: function () {
    window.removeEventListener('resize', this.handleResize)
  }
}
</script>
```

動作がモッサリするようならlodashの`_.debounce`等を使用し、発火頻度を落とすと良いみたい。
chainerの作法　その２

#概要
chainerの作法、調べてみた。
回帰。

#インポート


```
import numpy as np
import matplotlib.pyplot as plt
import chainer
from chainer import Function, gradient_check, Variable, optimizers, serializers, utils
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
```

#訓練データセットのイテレーション
-3.0から+3.0の100点
sinが教師データ
dataset、iteratorは、使わん。

```
	X = np.linspace(-3.0, 3.0, num = 100, dtype = np.float32)
	T = np.sin(X)
```

#ミニバッチに対する前処理
エポックは、300
ミニバッチは、100

```
	n_epoch = 300
	n_batch = 100
```

#ニューラルネットワークのForward/backward計算
回帰なので、活性化関数は、tanh
lossは、mean_squared

```
class MLP(Chain):
	def __init__(self):
		super(MLP, self).__init__(l1 = L.Linear(1, 20), l2 = L.Linear(20, 1), )
	def __call__(self, x):
		h = F.tanh(self.l1(x))
		out = self.l2(h)
		return out

class M_fit(Chain):
	def __init__(self, predictor):
		super(M_fit, self).__init__(predictor = predictor)
	def __call__(self, x, t):
		y = self.predictor(x)
		loss = F.mean_squared_error(y, t) * 0.5
		return loss
	def predict(self, x):
		y = self.predictor(x)
		return y
```

#パラメータの更新
オプチマイザーは、Adam

```
optimizer = optimizers.Adam()
	optimizer.setup(model)
```

#評価データセットにおける現在のパラメータの評価
Variableに、データを流し込む。

```
	for epoch in range(n_epoch):
		indexes = np.random.permutation(np.size(X))
		for i in range(n_batch):
			model.zerograds()
			x = Variable(np.array([[X[indexes[i]]]], dtype = np.float32))
			t = Variable(np.array([[T[indexes[i]]]], dtype = np.float32))
			loss = model(x, t)
			loss.backward()
			optimizer.update()
```

#中間結果をログに残す
エポックとloss。

```
		print ('epoch : ', epoch, 'loss : ', loss.data)

```

#結果
いい感じ。

![sin1.png](https://qiita-image-store.s3.amazonaws.com/0/18104/d820f86e-585c-8de0-b09e-a8abae96e10d.png)



以上。
ローカル環境で Ethereum の秘密鍵生成・アドレス取得

- 開発用に Ethereum の秘密鍵とアドレスをいくつか生成したいときがあったので、そのときに使用した方法のメモです。
- [ethereumjs-wallet](https://github.com/ethereumjs/ethereumjs-wallet) を使用すると、とても簡単に Ethereum の秘密鍵を生成したりアドレスを取得したりすることができます。
- もちろんローカル環境（オフライン）で実行可能です。

# ethereumjs-wallet のインストール

```
$ npm install ethereumjs-wallet --save
```

# 秘密鍵・アドレス取得コード例

```javascript
 var Wallet = require('ethereumjs-wallet');
 const wallet = Wallet.generate();
 console.log("privateKey: " + wallet.getPrivateKeyString());
 console.log("address: " + wallet.getAddressString());
```

# 実行
- 上記のコードを app.js として保存した場合は、次のコマンドで実行できます。

```
$ node app.js
```

# 参考
- http://blog.playground.io/entry/2018/05/03/070436
- https://github.com/ethereumjs/ethereumjs-wallet

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/ローカル環境で_Ethereum_の秘密鍵生成・アドレス取得
pythonからRのコードを利用しよう。と思ったが、、、

Pyperの使い方を示したわかりやすいページがある。
http://mia-0032.hatenablog.jp/entry/2013/08/30/000000

しかしRのコードはRでデバッグしなければならないことに気づく、、、（アホ）
Pythonで統計Moduleを作ることにした。

上記の思考過程を忘れてしまうため、メモ。
データ解析

#データ解析手順まとめ
参考文献
[データ解析の実務プロセス入門](https://www.amazon.co.jp/%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90%E3%81%AE%E5%AE%9F%E5%8B%99%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E5%85%A5%E9%96%80-%E3%81%82%E3%82%93%E3%81%A1%E3%81%B9/dp/4627817711)

#データ解析手順
1. 目的設定
↓

2. 分析計画
↓

3. データ設計
↓

4. データ収集・保存
↓

5. データの前処理
↓

6. 分析手法選択・適用
↓

7. 分析結果の解釈
↓

8. 施策の提案
↓

9. 実施と検証
↓

10. 振り返り

# データ解析
1. 状況把握
2. 推定
3. 予測
4. 再現性
5. 裏づけ

　勘や経験による意思決定を裏づけする
　ベテランの知識を組織全体の知識にできる

## データ解析のアプローチ
### 仮説検証型
仮説をデータによって裏づけるというアプローチ
### 探索型
データから何らかの仮説を得るためのアプローチ
→　探索的データ解析
※　仮説検証型と探索型を反復して実施することもある

## 探索的データ解析の取り組み
1. 分布確認
・ヒストグラム
・箱ひげ図

2. 関係確認
・散布図
・相関分析

3. 縮約
平均や合計などの処理でデータをまとめること

4. 層別化(スライシング)
データを様々な軸の様々な水準で区切り、層別にすることで、各層でデータの特徴を把握する

5. 詳細化(ドリルダウン)
データを様々な軸で詳細化
年データから月データなど、通年・各月・各週と異なる時間幅のデータの傾向を比較する手法

6. 時系列化
データを時間軸で並べて折れ線グラフで可視化

### 可視化
#### 大きさを比べる
・棒グラフ

#### 分布を見る
・ヒストグラム
・箱ひげ図

#### 量的変数の関係を見る
・散布図

#### 時系列データを見る
・折れ線グラフ

#### 時系列データの変化と分布を見る
・ロウソク足チャート

#### 割合を見る
・帯グラフ

#### 大きさの比とその内訳を見る
・積み上げ棒グラフ

#### 質的変数の関係を見る
・クロス集計
・ヒートマップ

### 再表現
データに何らかの変換や計算を用いて理解しやすくする、あるいは違った側面から見られるようにすること。

#### 要約統計量
・算術平均
・中央値
・最頻値
・幾何平均
データの各要素を乗算し、要素の個数でN乗根をとった値
・移動平均

#### 合成データ
データ同士を組み合わせて作られる新しいデータ

#### 尺度変換
データの尺度をより低位の尺度に変換することで、データを扱いやすくする

#### 無名数化
データを無名数という単位を持たない値に変換することで、単位や大きさが異なるデータ間の比較を可能にする。
比、率、偏差値みたいなもの
PostgreSQLでカラム（フィールド名）にダブルクォーテーション付ける例

WordPress For PostgreSQLのフィールド名に"ID" biting NOT NULL DAFAULT nextvalと言う
カラム（フィールド名）IDにダブルクォーテーション付ける例が出て来ます。
この様な例はカラム名に予約語（SQL文にすでに有るもの）等を使う場合の例ですがここではID(予約語？)を定義したためダブルクォーテーションでかこまれている。
以下テーブル定義文抜粋
CREATE TABLE wp_posts
(
  "ID" bigint NOT NULL DEFAULT nextval(('wp_posts_seq'::text)::regclass),
  post_author bigint NOT NULL DEFAULT 0::bigint,
  post_date timestamp without time zone NOT NULL DEFAULT now(),
  post_date_gmt timestamp without time zone NOT NULL DEFAULT timezone('gmt'::text, now()),
  post_content text NOT NULL,
  post_title text NOT NULL,............
..........
以下略
LXDコンテナで CIFS 共有をマウントする

ホスト側に共有をマウントして、コンテナで`device add`はやりたくない。

#環境
- OS: Ubuntu 16.04.2 LTS
- LXD: 2.12

#操作
コンテナに以下の設定を追加して再起動。

```shell-session
# lxc config set container raw.apparmor 'mount fstype=cifs,'
# lxc config set container security.privileged true
# lxc restart container
```
再起動後は`mount`コマンドでも`/etc/fstab`でも通常通り。
nvidia-docker2でjupyter notebookを使う時のコマンド

# 環境

- ubuntu16.04
- Docker version 17.12.1-ce
- nvidia-docker2
- [nvidia/cuda:8.0-cudnn6-runtime](https://hub.docker.com/r/nvidia/cuda/)
- tensorflow-gpu (1.3.0)
- Keras (2.1.4)

# nvidia-docker2でjupyter

### dockerコンテナの作成

```
docker run --runtime=nvidia -v /home/workspace:/root/workspace -it -p 8888:8888 hoge/fuga
```

- 「-v 普段使ってるディレクトリ:コンテナ上のディレクトリ」、でディレクトリの共有

- -p でポートの開放することで、いつもどおりjupyterをブラウザで見れるようになる

.zshrc等の最後にalias書いておく

```shell:.zshrc
alias j="jupyter notebook --ip=0.0.0.0 --allow-root"
```

このオプションが個人的に厄介だった。。

### 実行

```
$ j
```

以上っ！

# おわり

読んでくださってありがとうございますっっ

```math
\def\textlarge#1{%
  {\rm\Large #1}
}
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

（精一杯小声で）
　　$\textsmall{よ　か　っ　た　ら　い　い　ね　く　だ　さ　い　！}$
GitLab CIでGAEへ自動デプロイ

GAEにサークル（？）のWordPressを移行した際にGitLab-CIを使用して自動デプロイ出来る様にした。

自動デプロイ自体は簡単なので、記事はあるっぽいが[cloud-sdk-docker](https://github.com/GoogleCloudPlatform/cloud-sdk-docker)を使った書き方をしてる人があんまり居ない様なので書いておく。


GitLabCIからGCPへ接続する為の認証関連は分かりやすく既に記事として書かれており、
今回はotuhs_dさんの「[GitLab CIでGoogle App Engineプロジェクトを自動デプロイ](https://qiita.com/otuhs_d/items/bbf1699c53d24d2c0625)」の通りにGitLabへ設定した。分かりやすい。

本題の.gitlab-ci.ymlの設定だが下記の通りに設定。

```yml:.gitlab-ci.yml
image: google/cloud-sdk:latest
deploy_production:
  stage: deploy
  environment: Production
  only:
    - master
  script:
    - echo $DEPLOY_KEY_FILE_PRODUCTION > /tmp/$CI_PIPELINE_ID.json
    - gcloud auth activate-service-account --key-file /tmp/$CI_PIPELINE_ID.json
    - gcloud --quiet --project $PROJECT_ID_PRODUCTION app deploy
```  

ちょっとシンプルに書ける。

公式の方のGitLabを使用していれば公式がDigitalOceanで動かしている共有ランナーで後はプッシュするだけでデプロイする事が出来る。（プライベートリポジトリだと月2000回まで）


今度はGKEの方の連携も試してみたいので近いうちにやろう。
gcc バージョンアップ

#  gcc バージョンアップ
gcc の7.3.0取得

````bash
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.3.0/gcc-7.3.0.tar.gz
```

取ってきたものを解凍します。

```bash
tar zxvf gcc-7.3.0.tar.gz 
```

取得してきたgcc をビルドします。

```bash
cd gcc-7.3.0
./contrib/download_prerequisites
mkdir build
cd build/
../configure --enable-languages=c,c++ --prefix=/usr/local --disable-bootstrap --disable-multilib
make
make install
```

確認

```
->> gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --enable-languages=c,c++ --prefix=/usr/local --disable-bootstrap --disable-multilib
Thread model: posix
gcc version 7.3.0 (GCC) 

```

成功です。
go get github.com/hoge.hoge.git /usr/bin/ld: cannot find -lX11 collect2: error: ld returned 1 exit status

  # Go get でエラー

### Overview

go get github.com/hoge/hoge
/usr/bin/ld: cannot find -lX11
collect2: error: ld returned 1 exit status

上記エラーの場合

-l 左記は

libX11が足りないと言ってますので。

centos の場合ですが、インストールします。

```bash
sudo yum install -y libX11-devel
```
Rails チュートリアル メモ 第4章

# 概要

* この章は Rails というより Ruby の説明がメインだった
* Ruby 自体にはそれなりに慣れ親しんでいたので、あまり学びはなかった

# メモ

## ヘルパーモジュールのインクルード

> 単なるRubyのコードを書くのであれば、モジュールを作成するたびに明示的に読み込んで使うのが普通ですが、Railsでは自動的にヘルパーモジュールを読み込んでくれるので、include行をわざわざ書く必要がありません。

そうなんだ。

ヘルパーモジュールのソースは app/helpers/ 配下にある。
application_helper.rb には、アプリ全体で使うヘルパーを書く。
xxx_helper.rb には、xxx コントローラーでだけ使うヘルパーを書く。

## blank? メソッド

Rails では、スペースが集まってできた文字列 (`"    "`) を空とみなせる判定メソッド `blank?` が存在する。

```ruby
"      ".empty? # => false
"      ".blank? # => true
```

この `blank?` メソッドは ActiveSupport という拡張によって実装されており、ピュアな Ruby には存在しない。しかも `Object` クラスを開いて再定義されている。

## Rails におけるクラス

> ここで重要な点があります。Railsのアクションには戻り値がありません。少なくとも、返される値は重要ではありません。第3章で示したとおり、home アクションはWebページを表示するためのものであり、値を返すためのものではありませんでした。しかも、第3章では一度もStaticPagesController.newを実行しませんでした。どうしてこれでうまくいっているのでしょうか。
実は、Railsは確かにRubyで書かれていますが、既にRubyとは別物なのです。（略）... Railsは独特であり、Rubyとは切り離して学習する必要があります。

コントローラークラスについては、例えば「インスタンス変数を定義するとビューで参照できるようになるのはなんでだろう」みたいなことはもはや考えない方がいいのかもしれない。クラスの皮を被った何かと捉えた方がいいのかもしれない。

一方で、モデルクラスについては一般的な Ruby におけるクラスの考え方を持ち込んでもよさそうだ。Rails Console からモデルクラスのインスタンスを new すれば、モデル単体の動作を確認することができる。そもそもモデルクラスは、Web アプリだろうが CLI アプリだろうが関係なく、そのアプリの本質的なロジックを担う役割がある。だから、モデルクラスに関してはそれ単体で動作確認ができるべきなんだと思う。言い方を変えると、コントローラーから呼び出されないと価値が発揮できないようなモデルクラスは設計が間違っている、と言ってよいのではないか。
Ruby で重複した文字列

# Ruby 重複文字中

```Ruby
def dupli (d)

    uniqDups = d.uniq
    dups = Array.new
    uniqDups.each { |e|
        if d.grep(e).size > 1
            dups.push(e)
        end
    }
    return dups
end

dup = 'shichimitoucarashi'
p dupli(dup.split(""))

```

```Ruby
["s", "h", "i", "c", "a"]
```
anaconda3のインストール成功例（win）

**たまたまの成功例の可能性があります。あくまで自己責任でお願いします**
＜序文＞
AnaConda3のインストールは結構失敗したという事例が多いです。
かくいう私も失敗しました。
しかしなぜか急に成功したため、その経緯を記載しておきます。
願わくはそれで誰かが助からんことを。

＜winのanacondaの噂＞
win版アナコンダはインストールが面倒で、様々な要因で失敗します。
よく言われるのが日本あり、空白あり、すでにパイソン環境ありなど。
しかし解決方法には定説がないようです。

＜環境＞
PC asus X555L
Windows10（元win8.1）

＜主なインストールしているソフト＞
VS2015
VSCode
Go1.7

＜インストール作業＞
１．VSCodeにパイソン環境が残っている状態でインストール=>失敗
　　フォルダはC:\anaconda3

２．VSCodeのパイソン環境をアンインストール後インストール=>失敗
　　フォルダは同上。
　　諦めて上記フォルダごと削除

３．その後アプリの整理中にパイソンがインストール扱いになっていることに気付く。
　　c:\anacondaは削除済のため当然アンインストーラーは動かない。
　　やけっぱちでanacondaのインストーラーを実行→成功！

※正直なぜ？？？状態ですが自分で考えられる要因は３つ。
（ア）上記１→２の間では再起動していない。再起動したらうまくいくのかも？
（イ）上記３ではインストール済扱い。このレジストリ操作時にエラーになっているとすれば
　　　インストール済扱いになっていたことでスルーしてしたのではないか？
（ウ）上記２、３間でVSCodeのアップデートがあった（気がする）
　　　このアップデートで改善されたのではないか？

まあ、正直大したものではないですが、誰かの助けになれば幸いです。
**繰り返しますが自己責任でお願いします。**
Mithril.js を v0.2.x から v1.1.6 に上げてのログ

[折り返し翻訳](https://orikaeshi.com) というサービスの Mithril.js を v0.2.x から v1.1.6 に爆上げしたログ。
mithril v1 なかなかいいなと思ったけど、直近で使う予定がないので、あまり掘り下げてはいない……。

---

## m.prop removed

[マイグレーションガイド](https://mithril.js.org/change-log.html#migrating-from-v02x) を読みつつすすめると、早速この 2 つで心が折れそうになる

```js
m.prop removed
m.component removed
```

`m.component()` の方は全部 `m()` に置換するだけで動く。
が、 m.prop はそうも行かない。まず `var prop = require("mithril/stream")` でいけると書いてあるんだけど、仮想 DOM に切り替わった影響か、そもそもこれを使わなくていい場面がほとんどになっている。
かつては `m.request` の戻り値も `m.prop` だったりしたんだけど、今はただの Promise になっているし、まずは m.prop を使うべきかどうかをドキュメント見ながら判断する。ちなみに折り返し翻訳ではほぼ削除した。

## m.redraw

https://mithril.js.org/change-log.html#changes-in-redraw-behaviour

0.2.x では `m.startComputation()` と `m.endComputation()` でうまいこと調整しないと微妙な見え方になる箇所があったけど、この 2 つのメソッドが消滅した。
何も考えずに消してみたけど、微妙な見え方にならなかったので、多分再描画ロジックが賢くなったんだと思う。これから書く人は redraw 周りは極力触らずに困ったら導入考えるくらいが良さそう

## controller function -> oninit

というか初期化・dom構築前・dom更新前……といったタイミングで oninit, oncreate, onupdate などなどが呼ばれるようになった。
ライフサイクルに合わせたコードが書きやすくなって、結構コードをスッキリさせることができた。
が、単純な置換で対応しにくいので結構頭を使ったし、かつ数が多かったので、一番きつかった。

## vnode

babel 入れてれば `oninit ({ state, attrs }) { ... }` とか書けるのでおすすめ。
ハマりどころは特にない気がする。

## Nested arrays in views

https://mithril.js.org/change-log.html#nested-arrays-in-views

ざっくりいうとルートが複数の要素で出来てるいわゆるフラグメントコンポーネント作ると兄弟関係が把握できなかったりする。
折り返し翻訳でこれによるバグを踏み、 `m('div', [ ])` でくくることで解消させた。

## 所感

v1 使いやすいし覚えやすくなったと思う。やっぱりこの軽量感はステキ。
DynamoDBにつなごう！ PHP編

## はじめに

AWSのPHP-SDKを用いてDynamoDBに接続して、とりあえず一つデータを作るところまで。なお、大体は[公式のDoc](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GettingStarted.PHP.html)に書いてます。最新情報とかはこちらからどうぞ。
社内でDynamoDB使う機会が来たので人に説明しやすいように纏めて置こうという程度の内容です。


## AWSでの準備

### アクセスキーを取得する

IAMにアクセスし、アプリケーションで利用するためのユーザを作成しましょう。
そのユーザにDynamoDBへのアクセス権を付与したあと、アクセスキーを生成します。

アプリケーション毎や役割ごとにある程度分けて作ることで、最悪鍵が漏れたときの影響を最小限に出来ます。

意外とDynamoDBFullAccessっていっぱい権限載ってるんですよねえ。。。

### DynamoDBにテーブルを作成

設計の話は始めると長くなるのでしません。
適当なプライマリキーを指定してやるだけで出来ます。

最初はLocalに建てられるやつを利用するか、「キャパシティーユニット」少なくしておくとお金かからないです。
ここではあとあとStreams使ってLambdaに流して、をやる気なので東京リージョンに建ててます。

## PHP側の準備

まず、先程取得したアクセスキーを環境変数にセットします。
Laravelだと.envに書いておけば済みます。まぁお好みで。

```bash
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

[Credentialの設定方法](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#using-hard-coded-credentials)を読んでいると
ハードコードも出来ますが、Githubとかに上げておくと抜かれて大変なのでやめたほうが良いと思います。

## PHP Code

ここではComposer前提で話しますが、[AWS-SDKのDoc](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/getting-started/index.html)に書いてあるので他の手段を用いる方はそちらで。

### インストール

Composer ではアプリケーションのディレクトリで require するだけです。

```bash
$ php composer.phar require aws/aws-sdk-php
```

完了したら、autoload.phpをrequireしてあげましょう。

```php
<?php
require 'vendor/autoload.php';
```

### インスタンスの生成

AWS-SDKのインスタンスを生成した後に、createDynamoDbメソッドを用いて[DynamoDBClient](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.DynamoDb.DynamoDbClient.html)を生成してきます。
なお、RegionやEndpointは[それを記載したDoc](https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html)があるのでご参考まで。

```php
use Aws\Sdk;

$sdk = new Sdk([
    'endpoint' => 'http://dynamodb.ap-northeast-1.amazonaws.com',
    'region'   => 'ap-northeast-1',
    'version'  => 'latest'
]);
$dynamodb = $sdk->createDynamoDb();
```

### Marshaling

データをInsert/Updateする際には、[SDKに用意されたMarshaler](https://aws.amazon.com/jp/blogs/developer/dynamodb-json-and-array-marshaling-for-php/)を使います。
これは、JSONやArrayを良き形に変換してくれるスグレモノです。
DynamoDBに入れる前に通しておきましょう。

```php
use Aws\DynamoDb\Marshaler;

$marshaler = new Marshaler();
$item = $marshaler->marshalJson('
    {
        "owner_id": ' . $uid . ',
        "created_at": "' . $date . '",
        "content_id": "' . $uid . "-" . $date .  '",
        "deleted_flag": 0
    }
');
```

### DynamoDBへのInsert

あとはDynamoDBにデータをInsertしておしまいです。
実行後はAWSのコンソールからテーブルの画面で正常にデータが入っているか確認しましょう。

```php
$params = [
    'TableName' => $tableName,
    'Item' => $item
];

try {
    $result = $dynamodb->putItem($params);
    logger()->notice("Added item", $item);
} catch (DynamoDbException $e) {
    logger()->critical("Unable to add item.\nMessage: $e->getMessage()", $params);
}
```

とりあえず一つデータが入れば、利用するFunctionちょっと変えるだけで、Getしてくるのは簡単なはず！
code academy : js復習 ②

*topics*
Built-in Methods
Libraries
2つの　comment out　(//,/*~~*/)

##Built-in Methods
名前の通り、もともと作られているmethodsって事ですね
ググればたくさん出てくる

##Libraries

自分でinstanceを作成しなくても賢い人たちが
作ってくれている

そのinstanceが入っているのがLibraries
開発効率を効率よく使う事＝開発効率up

##Comments
コードにコメントをつけるには"//"を使うか"/* ~~~~ */"

 1ささっとコメント（一行で）

```js
//メインタイトル
console.log("初めてのjs");
```

 2がっつりコメント（ブロックで）

```js
console.log("おはよう");
/*
おはようという言葉の語源は
お早く〜ですね、というお早くに由来
*/
```
初手から躓く - vim-metarw-qiitaが動かん

## つかうもの
[joker1007/vim-metarw-qiita](https://qiita.com/joker1007/items/38ec69ac7d6d809dce3b)

## 具体的に何やったのよ？
プラグイン管理がvim-plugなので.vimrcに書いた。

```vim:vimrc
Plug 'mattn/webapi-vim'
Plug 'kana/vim-metarw'
Plug 'joker1007/vim-metarw-qiita'
	:
	:
let g:qiita_user='astrorobot110'
let g:qiita_token='[API token]'
```
…で、確認で`:QiitaMine`してみたけど何も出てこない。

### 何処がおかしいの？

#### `:scriptname`は？
webapi-vimが出てこないけどこれ大丈夫なの？

#### チェックすれば？
`:call webapi#base64#test()`してみる…ok。この間「本当にvim-plugがweb-api.vim読んでるの？」とか余計なことを詮索するも徒労に終わる。このディレクトリ構成で動くんだー…

#### じゃあ何が悪いの？
トークン？まさかぁ。（2～3回やり直す）

#### Win10でwebapi-vimがcurl使うときなんかおかしくなってないか確認した？
え、パス通ってるしPowershellもエイリアス通したよ？

### やってみる
```
:let res = call webapi#http#get("http://google.com")
:echo res

{'status': '500', 'header': [], 'message': 'Couldn''t connect to host', 'content': ''}
```
えぇー…

### これどうすんの？
調べた結果、vimrcに`set shell=powershell`を書いているせいでポリシー周りで悪さしてるので一旦コメントアウト。認識不足なのでちゃんと後で調べることに。
これでwebapi#http#get()は無事結果を返す。

### 再度`:QiitaMine`
アイエエエエエエ？

わからんだろうけどとりあえずソースを見てみっか…

```vim:vim-metarw-qiita/autoload/metarw/qiita.vim
function! s:endpoint_url() " {{{
  return "https://qiita.com/api/v1"
endfunction " }}}
```
えっAPIv2じゃないの？それが原因？

えっどーすんのこれ？vimの練習でvimから書けるっぽいからQiitaの垢取ったんだけど…え？

## その後

今[qiitactl](https://qiita.com/minodisk/items/74a02c564b88a6632f40)をインストールしたところです。[無事なんとかなりました](https://qiita.com/astrorobot110/items/01409ae43fb4eca109fa)
Linuxにおけるファイルパーミッションの表記

社内教育のためLinuxのパーミッションについて説明する機会があったのでそのまとめです。


## パーミッションの表記

Linux/Unixでのファイルパーミッションは「-rwxr-xr-x」のように10文字のアルファベットで表します。
この表記法には順番が決められており、先頭のファイル種別を表す1文字と、以降3文字ずつの3セット9文字で

### ファイル種別

- 先頭の1文字はファイルの種別を表します。
  -  `-` : 通常のファイル
  - `d` : ディレクトリ
  - `b` : ブロックデバイスのスペシャルファイル
  - `c` : キャラクターデバイスのスペシャルファイル
  - `l` : シンボリックリンク
  - `p` : 名前付きパイプ
  - `s` : UNIXドメインのソケット

### アクセス権
3文字で表す権限にも表記の順番があり、下記の様に表します。

- `r/-` (読み込み権限あり/なし)
- `w/-` (書き込み権限あり/なし)
- `x/-` (実行権限あり/なし)

### オーナー/グループ/全員
次に、3文字で表すアクセス権が、3セットあり、前から順に`ファイル所有者` `グループ` `全員`の3組に表せます。

### 例：
> ファイル所有者は「読み込み」「書き込み」「実行」が可
> グループと全員は「読み込み」のみ可

- 上記は`-rwxr–r–`と表記されます。

  
## パーミッションの設定
パーミッションの設定は`744`のように数字で表す事もできます。
数字も同じく決まりがあり

- `4/0`（読み込み権限あり/なし）
- `2/0`（書き込み権限あり/なし）
- `1/0`（実行権限あり/なし）
- と表され、それぞれの和により、権限が表されます。
  - `r-x`なら`5`
  - `rwx`なら`7`
  　　 
### 例：
> ファイル所有者は「読み込み」「書き込み」「実行」が可
> グループと全員は「読み込み」のみ可

- 上記は`-rwxr–r–`と表記されます。
- 数字で表記した場合`744`と表記されます。
Debian9 & nginxでhttps通信を実現してみた

#1 何をしたいか
Webサービスを作るにあたって、クライアントとの情報のやり取りをTLS/SSLを通じて行いたい。そこで  

* Let's Encryptを用いて証明書を取得
* nginxの設定を加えて、https://~を使えるようにする。（TLS/SSL通信の実現）
* http://~からhttps://~へリダイレクトし、全てのアクセスをhttps://~で行うようにする

を実現することを目指した。
前提として、Debian9 + nginxはすでに入っていること。

#2 Let's Encryptを用いて証明書を取得
##2.1 とりあえずLet's Encryptのオフィシャルサイトへアクセスする
　とりあえず、Let's Encryptのオフィシャルサイトへアクセスしてみる。
　https://letsencrypt.org/getting-started/
　すると  


>We recommend that most people with shell access use the [Certbot](https://certbot.eff.org/) ACME client. It can automate certificate issuance and installation with no downtime.

とあるので、このCertbotというやつを入れる。Certbotは
https://certbot.eff.org/
で入れ方を教えてくれる。今回はOSはDebian9でnginxを使うので、こんな感じ。
![スクリーンショット 2018-05-02 23.51.10.png](https://qiita-image-store.s3.amazonaws.com/0/81253/fca05887-c4e2-0e94-2678-14dcd5d3edfc.png)

後は、このサイトの下に出てくるshellをサーバー側で実行してあげればいい。

##2.2 じゃあ、実際に証明書取得やってみる。
###2.2.1 python-certbot-nginxをインストール
　Certbotのサイトからそのままだけど、このコマンドを実行。

```
$ sudo apt-get install python-certbot-nginx -t stretch-backports
```

>After this operation, 10.2 MB of additional disk space will be used.
Do you want to continue? [Y/n] 

とコンソールで聞かれるのでY。次に、

```
$ sudo certbot certonly --authenticator standalone --pre-hook "nginx -s stop" --post-hook "nginx"
```

を実行すると、色々聞かれるから丁寧に読んで、その指示に従って書いてください。（面倒くさいのでここでは割愛）
"IMPORTANT NOTES:"と出てきて、一番最初の項目に"Congratulations!"と出てきていたら、証明書を無事取得できていると思います。

#3 nginxの設定を加えて、https://~を使えるようにする。（TLS/SSL通信の実現）
　では、さっき取ってきた証明書を利用して、nginxを設定します。

##3.1 nginxのtls/sslの設定
/etc/nginx/conf.dの下にssl.confというファイルを作り、以下のコードを書きます。

```
server{
  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;


  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass       http://example.com;
    proxy_redirect   off;
  }
}
```

example.comの部分は適当に変えてください。
この変更を行った後

```
sudo nginx -s reload
```

を実行すると、https://example.com にアクセスできると思います。

#4 http://~からhttps://~へリダイレクトし、全てのアクセスをhttps://~で行うようにする
　もうここまでくれば、そんなに難しくないので、ざっくり書くとさっきのssl.confファイルを以下のように書き換えればいい。

```
server {
  listen	80;
  server_name example.com;
  return 301 https://$host$request_uri; 
}

server{
  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;


  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass       http://example.com;
    proxy_redirect   off;
  }
}
```

そして、再度

```
sudo nginx -s reload
```

を実行すると、リダイレクトが出来るようになっているはずです。

#4 まとめ
　今まで、何回かしていた作業なのですが時々しかやらないので、自分用にまとめました。
　もしも、何かここまずいぞとか間違っているぞ、みたいなことがありましたらコメントかメールにてご意見いただけると幸いです。

akira.kashihara@hotmail.com
Vim備忘録を(Vimで)残したい

## Q:何事？
A:趣味でLinuxを使う手前、「すいませんnano使ってます」というのをそろそろ辞めたいと思ったためだけに始めてます。
## Q:普段は何やってるの？
A:道楽でPC弄ってます。
## Q:スキルは？
A:必要ならGASを書くくらいは頑張る。
## Q:nanoじゃだめだったんですか？
A:道楽なので。
## Q:全部nano？
A:メインはwin機なので秀丸から乗り換えてるところです。
Homebrew の再インストール

MacをアップデートしてからHomebrewの調子がおかしくなり、いろいろ調べて直そうと試みましたがどうにもならなかったので、再インストールすることにしました。

#動作環境
- Mac OS High Sierra 10.13.4

#Homebrew
##アンインストール方法
インストールするコマンドの最後を`uninstall`にすればOK!!

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

##インストール方法
真っ正直にインストールコマンドを打てばOK!!

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

#ちょっとした雑談
最近しばらくHomebrewを使えなくて困っていたのですが、とうとう再インストールに踏み切りました...
本当ならサクッと自己解決できたらいいんですけどね...


#参考にした記事
[Homebrew](https://brew.sh/index_ja)
gcc 8.1に含まれるgccgoをビルドする

# gccgo とは

https://golang.org/doc/install/gccgo


> The GCC 8 releases are expected to include a complete implementation of the Go 1.10 release, depending on release timing. The Go 1.10 runtime has now been fully merged into the GCC development sources, and concurrent garbage collection is expected to be fully supported in GCC 8. 


gccgo はgccのコンパイルエンジンにgoのフロントエンドを組み合わせたもの。
今までは、通常のgolangの処理系に比べてruntimeの実装が少し古いものになっていたが、gcc 8になってgo 1.10のランタイムがマージされて、コンカレントGCもgccgoでサポートされると書いてある。

ちなみにgccのサイトでのgcc8でのgoの変更点はこちら。

https://gcc.gnu.org/gcc-8/changes.html
>Go
>
>    - GCC 8 provides a complete implementation of the Go 1.10.1 user packages.
>    - The garbage collector is now fully concurrent. As before, values stored on the stack are scanned conservatively, but value stored in the heap are scanned precisely.
>    - Escape analysis is fully implemented and enabled by default in the Go frontend. This significantly reduces the number of heap allocations by allocating values on the stack instead.


# gcc, g++, gccgo をビルド

基本は以前の記事、[gcc 7.2.0 をソースからビルドする](https://qiita.com/tetsu_koba/items/efd62c24406a89addba9) と同じ。
configure のときに、`--enable-languages=c,c++,go`　とする。

```
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-8.1.0/gcc-8.1.0.tar.xz
tar xf gcc-8.1.0.tar.xz 
cd gcc-8.1.0/
./contrib/download_prerequisites 
cd ..
mkdir obj
cd obj
../gcc-8.1.0/configure --enable-languages=c,c++,go --prefix=/usr/local --disable-multilib
make -j8
sudo make install
```


```
$ which gcc
/usr/local/bin/gcc
$ gcc --version
gcc (GCC) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ which gccgo
/usr/local/bin/gccgo
$ gccgo --version
gccgo (GCC) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ which go
/usr/local/bin/go
$ go version
go: error while loading shared libraries: libgo.so.13: cannot open shared object file: No such file or directory
$ export LD_LIBRARY_PATH=/usr/local/lib64
$ go version
go version go1.10 gccgo (GCC) 8.1.0 linux/amd64
```
CentOS7からWin10の共有フォルダへアクセスする

CentOSからWindowsの共有フォルダにアクセスしたい時の設定。
参照URLは以下。

[CIFS を使用して Red Hat Enterprise Linux システムに Windows 共有をマウントする](https://access.redhat.com/ja/solutions/1447443)

##Windows10側操作
 #共有フォルダを作成する
適当なフォルダを作成 > 右クリック > プロパティ > 共有
 ユーザーを追加し、アクセス許可のレベルを読み取り/書き込みへ変更

 #ファイアウォールの設定をする
コントロールパネル > システムとセキュリティ > Windows Defender ファイアウォール > 
詳細設定 > 受信の規則 > ファイルとプリンターの共有(SMB受信) >右クリック > 規則の有効化
 #LAN内からアクセスするだけならプロファイルがプライベートのもの
  だけ許可すればアクセス可能な筈。


##CentOS7側操作
```
#sudo mount -t cifs -o username=<*1>,password=<*2>,uid=<*3>,gid=<*4>,dir_mode=<*5>,file_mode=<*6> //<Windows側IP>/<フォルダ名*7> /<マウントする場所>
 #-t マウントするファイルタイプを指定
 #*1 上記Win側で追加したユーザー	*2 追加したユーザーのパスワード
 #*3 自分のUID		*4 自分のGID	*5 ディレクトリのパーミッシン,変更しない場合は省略可
 #*6 ファイルのパーミッション,変更しない場合は省略可
 #*7 上記Windows側で作成したフォルダ名を指定

```

起動時に自動的にマウントする設定を以下にてファイルに追加。
```
vi /etc/fstab
//<Windows側IP>/<フォルダ名>    /<マウントする場所>   cifs	username=<share user>,password=<share password>	0 0
```
`dep ensure` の代替 `dep-dl` を作ってみた。

最近、golangでパッケージのバージョン固定の用途に使うパッケージマネージャーというと [`dep`](https://github.com/golang/dep) コマンドかと思います。
ただ、このコマンドなかなかクセがあって、初回の実行時間が長くて何をやっているのかわかりづらいなど、少々わかりづらい子であったりします。
一応、 `-v` オプションを付けてあげると、何をしているのか若干見れますが、それでも終わるまで意外とかかります。
原因は、主にパッケージの依存解決で、ものすごくネットワーク負荷が高いことなようです。
（詳しくは[#289](https://github.com/golang/dep/issues/289)あたりを読むとよいかと思います。）

## 経緯とか

[昨日あたりに愚痴っていた](https://mobile.twitter.com/take_cheeze/status/991282982420758528)のですが、ゴールデンウィークの中日に出勤とかしてると、仕事の進捗が割と順調で若干手が空いたので、雑に作ってみました。
[`dep-dl`](https://github.com/take-cheeze/dep-dl)というコマンドです。
プロジェクトディレクトリで `dep-dl` コマンドを走らせると `vendor/` へ `Gopkg.lock` に書いてあるパッケージを全部ダウンロードしてくれます。

## 実装の裏とか
[雑に書いたメモ](https://gist.github.com/take-cheeze/dd0e2710ff7a4794065c4a4d953dbcc1)にほしかった機能は書いてあって、gopkg.inやgo.uber.orgと名付けれているパッケージもちゃんと取得できるようにしてあります。
本当は、何度か脳内で挑戦していて、今回は [`go-import`](https://golang.org/cmd/go/#hdr-Remote_import_paths)の仕様をやっと理解できたので、それなりに実用にたるものを作れました。

`dep ensure` にはない機能として、[GitHubからはtarballとして](https://developer.github.com/v3/repos/contents/#get-archive-link)ダウンロードするので有利かと思います。

## 性能
そこそこパッケージ数のある（100に満たない程度）プロジェクトで試してみたんですが、`dep ensure` でキャッシュなしだと2分未満程度かかるパッケージの取得が20秒程度で取得がてきました。
ただ、キャッシュありの `dep ensure` で比較してみたところ、2秒かからない程度で終わったので、時間的に
```
キャッシュなし`dep ensure` >>> `dep-dl` >>>>>> キャッシュあり`dep ensure`
```
となりました。
あんまり真面目に計測したわけではないので、測定が得意な人に試してほしいです。

## 用途
性能を見るとわかるんですが、パッケージをしょっちゅう入れ替えるような開発にはそれほど向いていません。
あえて、開発で使うとするとパッケージ変更ができない縛りができるので、ちょっとした変更を別の環境で行うならよいかと思います。

## 終わりに
ひとまず実装できた程度なんで、余裕がある時に、会社のCIで `dep ensure` 使ってるところを目標にがんばろうかと思います。
【C#】DataTableについてのメモ

# DataTableとは
DataTableとは、データベースのように表形式で格納されているデータの事です。
列を指定し、行毎にデータを指定して行く事で、テーブルのようにデータを格納します。


# DataTable作成、データの追加の仕方

## DataTableの作成方法
```c
// DataTableを宣言
DataTable dt = new DataTable("テーブル名");

// 列を追加
dt.Columns.Add("カラム名", typeof("型"));
```

## DataTableへデータを挿入
```c#
// DataRowを宣言
DataRow dr;

// 行を作成
dr = dt.NewRow();
dr["カラム名"] = "値";

// 行を表に追加
dt.Rows.Add(dr);
```

## DataTableの実践的な使い方

```c#
using System.Data;

DataTable dt = new DataTable("testTable");
DataRow dr;

dt.Columns.Add("id", typeof(int));
dt.Columns.Add("password", typeof(String));
dt.Columns.Add("userName", typeof(String));

dr = dt.NewRow();
dr["id"] = 001;
dr["password"] = "test";
dr["userName"] = "田中太郎";
// ※以下のような書き方も可能。ただし、列と値、その位置は揃える事。
// ⇒『td.Rows.Add(001, "test", "田中太郎");』

dt.Rows.Add(dr);
```
CentOS7でDropboxを

タイトルのとおりCentOSでDropboxを使いたくなったので、
忘れないうちにメモ

【参考】https://www.dropbox.com/ja/install-linux

ダサいやり方だが、個人的に一番分かり易い方法。
もっとwgetとか使って格好良くインストールできればよかった

まずは、よくわからないけどブラウザに以下のURLを打ってファイルをダウンロード

```http:
https://www.dropbox.com/download?plat=lnx.x86_64
```

そうしたら、ダウンロードが始まるので、適当に保存して

```terminale:
tar xzf [ファイル名]
```
で展開する。すると隠しファイル?が作られるので

```terminale:
ls -la
```

で「***.dropbox-dist***」が作られているのを確認。
そうしたら隠しファイルに入る。

```terminal:
cd .dropbox-dist
```
その隠しファイルの中に「***dropboxd***」があるので

```terminal:
./dropboxd
```

と打つと何かいろいろ実行され、ブラウザが開いて連携しますか？
と聞かれるので、指示通り「***連携する***」を選択。

これでDropbox と連携完了！あとは

```http:
https://www.dropbox.com/download?dl=packages/dropbox.py
```

をブラウザで開いて、dropbox.pyがダウンロードされるのでダウンロードする。
そしてdropbox.pyを保存したところに移動して

```python:
python dropbox.py
```

を実行して、インストールして完了!（←なぜ入れるのかが分からない、、、）

最後まで診ていただき、有難うございます。

(間違っていたら、御指摘をお願いします)
/usr/bin/pythonのシンボリックリンクを変更後、yumがエラー

thinkpadにCentOS入れて色々勉強中。

##環境
CentOS 7
python 2.7
Python 3.6

##やったこと
python2使わないしいちいちpython3と打つのが面倒だと思った為、
以下にてシンボリックリンクを作成。
```
rm /usr/bin/python
ln -s /usr/bin/python3.6 /usr/bin/python
```

その後yum installとかyum searchを使おうと思っても以下のエラーが出る。
```
  File "/bin/yum", line 30
    except KeyboardInterrupt, e:
　　　　　　　　　　　　^
SyntaxError: invalid syntax
```

/usr/bin/yumの中身見たら当然でした。1行目で該当のシンボリックリンクを
使ってました。
```
`#!/usr/bin/python
```

以下にてyumの1行目を修正。
```
vi /usr/bin/yum
`#!/usr/bin/python2.7
```

問題なく動作するのでたぶんOK
四流女子大学生がRaspberry Piに手を出してみた[LINE通知編]

前回の投稿
[四流女子大学生がRaspberry Piに手を出してみた[監視カメラ編]](https://qiita.com/starrysky51/items/e024d83094d60cd675cc)

# 撮った写真をLINEに送ろう！

監視カメラで撮った写真を普段使っているSNSに通知が来たら便利ですよね！
ということで、設定していきます！今回はLINEに通知するよう設定します！

# LINE Notifyにアクセス！

まず、[LINE Notify](https://notify-bot.line.me/ja/)にアクセスし、自身のLINEに登録したメールアドレスとパスワードを登録し、ログインします。
ログインしたら、マイページへ行き、トークンを発行します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/249044/e9f0b7d6-14c5-387a-bde4-1917b2ef06c6.png)

トークン名を入力し、トークルームを選択したら、トークンが発行されます。ここで注意しなけらばならないのが、トークンは一度発行すると二度と発行できないのでかならずコピペしてメモっておきましょう！

# Line通知するpythonコードを書く

[前回の監視カメラ編](https://qiita.com/starrysky51/items/e024d83094d60cd675cc#motion%E3%81%AE%E8%A8%AD%E5%AE%9A)で`/etc/motion/motion.conf`の`on_picture_save`で以下のように指定しました。

```
# 650行目付近
# 画像保存時に起動するスクリプトの指定
# このあとLineへの通知を行うため、この時点では何もしないpythonファイルを指定しています
# %f は画像ファイル名です
on_picture_save python3 /home/pi/motion/line_notify.py %f
```

ここで書いた`line_norigy.py`に、画像ファイル名を受け取ってLine通知する処理を書いてみます。

```
import requests
import sys

def main():
    url = "https://notify-api.line.me/api/notify"
    token = '発行したトークンを張り付ける'
    headers = {"Authorization" : "Bearer "+ token}

    args = sys.argv
    picture = args[1]　# ここで引数のファイル名(%f)を受け取ります

    message =  'お好みで（書かないとエラー出ます）'
    payload = {"message" :  message}
    files = {"imageFile": open(picture, "rb")}

    r = requests.post(url ,headers = headers ,params=payload, files=files)

if __name__ == '__main__':
    main()
```

これだけでできちゃいます！簡単ですね！！！ファイル名を直接指定するのは簡単だったのですが、%fでファイル名が指定されたときに、それをpython側で受け取る方法がわからず、苦労しました。

これでラズパイをお好みの場所において電源を入れれば書いたコメントと共に撮影された写真が表示されます！


# 感想
監視カメラやっと作り終えることができました！なんだかんだ約１か月かかりました汗今までなんにもやってこなかった自分がここまでできるようになるなんて感動です。ちょっとは四流から脱出できたようなできなかったような、、、（笑）今後もラズパイでほかのこともできたらなぁと思います。また、ラズパイ以外にもやってみたいです。あとpythonの勉強頑張ります。
PowerShellで汎用grep置換ツールを作ってみた

##何ができるツールか
+ Sakura Editorや秀丸エディタにもついてる「grep置換」を行うツール
+ 要するに指定ディレクトリ内のファイル全ての検索語句を、指定した語句に置換する
+ 複数語句をまとめて置換可能
+ あくまで置換することが目的なので、実行ログとかは出ない

##役立つシチュエーション
+ 客先PCにSakuraは入っているけどバージョンが古くてgrep置換機能がついていなかったとき（経験談）
+ テキストエディタはメモ帳しか入っていないうえに新規プログラムのインストールが禁止されている客先PCでgrep置換する必要になったとき
+ ~~にわかVimmerの私がgrep置換のためだけにSakuraを起動したくないと思ったとき~~

##ソース
~~変数名のセンスがない~~
###主処理
```powershell:main.ps1
# 設定ファイルのpathと名前を宣言
$setting = ".\setting.ps1"

# 設定ファイル読み込み
.$setting

# 元フォルダを成果物フォルダへ全てコピー
Copy-Item $load -destination $save -recurse -force

# ファイル名条件に該当するファイルの一覧を作成
$obj = Get-ChildItem -path $load -include $includefilename -exclude $excludefilename -recurse -force -name

# １ファイルずつ読み込み
foreach($wk in $obj) {
	# カウンタ初期化（置換後語句の配列参照に使用）
	$cnt = 0
	# ファイルを読み込み、内容を変数に格納
	$contents = cat ($load + $wk)
	# 置換処理開始
	# 検索語句を読み込み→対応する置換後語句へ置換→検索語句がある限り繰返し
	$before | % { 
		$contents = $contents -replace $_, $after[$cnt] 
		$cnt = $cnt + 1 
	}
	# 保存
	$contents > ($save + $wk)
}
```
###設定ファイル
```powershell:setting.ps1
# grep置換するフォルダのパス
$load = "D:\work\"

# 置換結果の保存先
$save = "D:\after\"

# grep置換するファイルの条件(拡張子など。ワイルドカード使用可)
$includefilename = "*.bat"

# grep置換しないファイルの条件
$excludefilename = ""

# 検索語句
# @()の中に、カンマ区切りで１つ以上指定する。
# 正規表現で記述すること。
$before = @("hoge","fizz")

# 置換後の語句
# @()の中に、カンマ区切りで$beforeと同じ個数指定する。
$after = @("fuga","buzz")
```

###実行バッチ
（客先PCのpowershell実行ポリシーを変更するわけにもいかないのでバッチから起動する）

```plaintext:run.bat
@echo off
cd /d %~dp0
powershell -NoProfile -ExecutionPolicy Unrestricted .\main.ps1
pause
exit
```
###参考にしたサイト
- [PowerShellでgrepして置換みたいなことをしたい人生だった](http://tyheeeee.hateblo.jp/entry/2014/07/09/PowerShell%E3%81%A7grep%E3%81%97%E3%81%A6%E7%BD%AE%E6%8F%9B%E3%81%BF%E3%81%9F%E3%81%84%E3%81%AA%E3%81%93%E3%81%A8%E3%82%92%E3%81%97%E3%81%9F%E3%81%84%E4%BA%BA%E7%94%9F%E3%81%A0%E3%81%A3%E3%81%9F)
- [【PowerShell】外部ファイル（インクルード）を読み込む方法](http://moriroom.my.coocan.jp/site1/?p=2376)
- [Powershellを楽に実行してもらうには](https://qiita.com/tomoko523/items/df8e384d32a377381ef9)
【Xcode】シュミレータ起動時に「Attempt to present <***> on <***> whose view is not in the window hierarchy!」が発生したときの対処方法

# 環境
- macOS HighSierra 10.13.4 
- Xcode 9.3
- Swift 4.1

# 事象
ViewContorollerのviewDidLoadメソッド内において、アラート表示させる処理を以下のように追加し、

```swift:ViewController.swift

override func viewDidLoad() {
	super.viewDidLoad()
   	
   	// アラート表示
	self.showAlert("Message Alert!!")
}

// アラート表示の処理
func showAlert(_ alertMessage: String) {
	let alertConroller = UIAlertController(
		title: "Alert", message: alertMessage, preferredStyle: .alert)
	let originAction = UIAlertAction(
		title: "OK", style: .default, handler: nil)
	alertConroller.addAction(originAction)
	self.present(alertConroller, animated: true, completion: nil)
}
```

シュミレータ起動後に、
本来、表示されるはずアラートが表示されずコンソール上に、
「アラートを表示しようとしたが、Viewがないため追加できない」というがエラー出る。

```console

2018-05-02 21:44:12.082835+0900 ***App[88818:8813297] Warning: Attempt to present <UIAlertController: 0x7f929b88a600> on <***App.ViewController: 0x7f929b6114a0> whose view is not in the window hierarchy!

```

# 原因
iOSのライフサイクルに反していることによるもの。

アラートは本来、Viewを構築`ViewDidLoad()`したあとに追加しなければいけないため、
エラー内容通り、Viewがない状態でアラートを表示(追加)することができないということであった。

> [参考記事]
> - [iOS のイベント駆動をライフサイクルイベントとユーザアクションイベントにわけて理解する](http://glassonion.hatenablog.com/entry/20120405/1333611664)
> - [UIViewControllerのライフサイクル](https://qiita.com/motokiee/items/0ca628b4cc74c8c5599d)


# 対処方法
アラート表示の処理は、Viewが構築された(画面描画が終わった)あとに追加する必要があるため、
Viewの読み込み終了時に呼ばれる`ViewDidLoad()`内ではなく、画面描画の終了時に呼ばれる`viewDidAppear()`というメソッドが用意されているのでそこに処理を追加する。

```swift:ViewController.swift

// View構築
override func viewDidLoad() {
	super.viewDidLoad()
}

// View構築後の処理
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    // アラート表示
	self.showAlert("Alert　Message!!")
}

// アラート表示の処理
func showAlert(_ alertMessage: String) {
	let alertConroller = UIAlertController(
		title: "Alert", message: alertMessage, preferredStyle: .alert)
	let originAction = UIAlertAction(
		title: "OK", style: .default, handler: nil)
	alertConroller.addAction(originAction)
	self.present(alertConroller, animated: true, completion: nil)
}

```


# まとめ
- iOSライフサイクルの重要性
PX4 Development Guide 翻訳(3) Toolchain Installation 

###ファイルとコードのインストール

PX４のコードはLinuxかMac OSで開発できます。私達はUbuntu Linux LTSを推奨します。これにより、すべてのPX4ターゲットを構築し、ほとんどのシミュレータとROSを使うことができます。

>WindowsのToolchainも存在していますが（私達はこれを使用することにひどく反対です）、公式にサポートしてはいません。
>Ubuntu Linuxを実行している仮想環境でWindows上にPX4を構築することができますが、これはシミュレーションのための信頼できるプラットフォームを提供しない可能性があります。
>Windowsで開発を開始する前に、デュアルブート環境を構築することを検討してください。

###サポート対象

以下の表では各OSがPX4ターゲットを構築できるかを示しています。

| ターゲット | Ubuntu | Mac | Windows | 
| --- | :---: | :---: | :---: |
| Nuttxベースのハードウェア:[Pixhawkシリーズ](https://docs.px4.io/en/flight_controller/pixhawk_series.html), [Crazyfile](https://docs.px4.io/en/flight_controller/crazyflie2.html), [Intel Aero](https://docs.px4.io/en/flight_controller/intel_aero.html), [Ready to Fly Drone](https://docs.px4.io/en/flight_controller/intel_aero.html) | X | X | X |
| [Qualcomm Snapdragon Flight hardware](https://docs.px4.io/en/flight_controller/snapdragon_flight.html) | X |  |  |
| Linuxベースハードウェア:[Raspberry Pi 2/3](https://docs.px4.io/en/flight_controller/raspberry_pi_navio2.html), Bebop| X | | |
| シミュレーション:[jMAVSim SITL](https://dev.px4.io/en/simulation/jmavsim.html) | X | X | X |
| シミュレーション:[Gazebo SITL](https://dev.px4.io/en/simulation/gazebo.html) | X | X ||
| シミュレーション:[ROS with Gazebo](https://dev.px4.io/en/simulation/ros_interface.html) | X |||

###開発環境
開発環境のインストール方法は以下で説明します。

* [Mac OS](https://dev.px4.io/en/setup/dev_env_mac.html)
* [Linux](https://dev.px4.io/en/setup/dev_env_linux.html)
* [Windows](https://dev.px4.io/en/setup/dev_env_windows.html) (推奨しません!)

もし、あなたがDockerに詳しい場合、すでに準備された[Docker Containers](https://dev.px4.io/en/test_and_ci/docker.html)を使用することができます。

#Mac OS

###Macでの開発環境構築
Mac OS X はPX4のメインの開発プラットフォームの一つです。これから説明するのは、NuttXベースのハードウェア(Pixhawk,et.)とシミュレータ（jMAVSim / Gazebo8）ターゲットの開発環境を設定する方法についてです。その他のターゲットについては[Toolchain installation >  Supported Targets](https://dev.px4.io/en/setup/dev_env.html#supported-targets)を参照してください。

###Homebrewでのインストール
Homebrewのインストールは早くて簡単です。[インストール手順](https://brew.sh/)

###共通ツール
Homebrewインストール後、シェルで次のコマンドを実行し、PX4のツールをインストールしてください。

```
brew tap PX4/px4
brew install px4-dev
#以下はオプションです。しかしシミュレーションツールを追加することは推奨しません。
brew install px4-sim
```

もし、要件が不足しているというエラーメッセージが出た場合はインストール指示に従ってください。あなたのシステムにはJavaとQuartzが入っていません。

```
brew cask install xquartz java
```

pipをまだインストールしていない場合は、pipをインストールして必要なパッケージをインストールします。

```
sudo easy_install pip
sudo -H pip install pyserial empy toml numpy pandas jinja2
```

###地上管制用のソフトウェア
[QGroundControl Daily Build](https://docs.qgroundcontrol.com/en/releases/daily_builds.html)をダウンロードし、インストールしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/254013/1a58964e-8c9e-4044-c5d2-69706147caf0.png)

### Editor/IDE
開発チームはしばしば、以下のツールを使います。

* [sublime Text](https://www.sublimetext.com/):素早くかけるテキストエディタです。
* [Qt Creator](https://www.qt.io/download#section-6):一般的なオープンソースのIDEです。

###次のステップ
環境設定が完了したら、[ビルド手順](https://dev.px4.io/en/setup/building_px4.html)に進みます。
STL vector・list全走査速度

自分用、ソースの説明は放棄

実行環境
OS：Windows 7 Home Premium
CPU：Core i7-2700K
RAM：16GB

検証クラス。

```c++
class cObj
{
private:
	bool m_Flag;
	double m_X, m_Y;
	double m_Angle, m_Speed;
	int m_Frame;

public:
	virtual bool Update()
	{
		m_Frame= Rand( 60, 120 );
		return false;
	}
	virtual void DrawProcess(){}
};

```

要素は65535個で回す、なんとなく

```c++
const int MAX_SIZE = 65535;
```

測定方法

```c++
	__int64	times;
	__int64 timeAvg = 0; 
	__int64 cntAvg = 0; 

	while( 1 )
	{
		times = GetNowHiPerformanceCount();

		//　*****　ここに処理部分　*****
			
		times = GetNowHiPerformanceCount() - times;
		timeAvg += times;
		cntAvg ++;

		//　平均時間　=　timeAvg / cntAvg;
	}
```

#vector全走査
```c++
std::vector< cObj > m_Vec;
m_Vec.resize( MAX_SIZE );
```

```c++
	//	50.0ms
	for( auto it : m_Vec )
	{
		it.Update();
	}

	//	20.6ms
	for( auto &it : m_Vec )
	{
		it.Update();
	}

	//	19.6ms
	unsigned max = m_Vec.size();
	for( unsigned i=0 ; i<max ; i++ )
	{
		m_Vec[ i ].Update();
	}

	//	29.8ms
	for( unsigned i=0 ; i<m_Vec.size() ; i++ )
	{
		m_Vec[ i ].Update();
	}

	//	30.4ms
	for( unsigned i=0 ; i<m_Vec.size() ; i++ )
	{
		m_Vec.at( i ).Update();
	}

	//	54.6ms
	for( auto it=m_Vec.begin() ; it!=m_Vec.end() ; ++it )
	{
		it->Update();
	}

	//	24.6ms
	auto end = m_Vec.end();
	for( auto it=m_Vec.begin() ; it!=end ; ++it )
	{
		it->Update();
	}
```


#list全走査
```c++
std::list< cObj > m_List( MAX_SIZE );
```

```c++
	//	51.2ms
	for( auto it : m_List )
	{
		it.Update();
	}

	//	21.9ms
	for( auto &it : m_List )
	{
		it.Update();
	}

	//	60.7ms
	for( auto it=m_List.begin() ; it!=m_List.end() ; ++it )
	{
		it->Update();
	}

	//	26.2ms
	auto end = m_List.end();
	for( auto it=m_List.begin() ; it!=end ; ++it )
	{
		it->Update();
	}
```

#おまけ、forward_List全走査
listより軽いと思ってやったら全然重かった、ダメ

```c++
std::forward_list< cObj > m_fList( MAX_SIZE );
```

```c++
	//	55.7ms
	for( auto it : m_fList )
	{
		it.Update();
	}

	//	26.1ms
	for( auto &it : m_fList )
	{
		it.Update();
	}

	//	60.0ms
	for( auto it=m_fList.begin() ; it!=m_fList.end() ; ++it )
	{
		it->Update();
	}

	//	31.6ms
	auto end = m_fList.end();
	for( auto it=m_fList.begin() ; it!=end ; ++it )
	{
		it->Update();
	}
```

#まとめ

endは重い
sizeも意外と重い
範囲forは&をつけないと重い

vectorが爆速かと思ってたけど、listも意外と悪くない