OmniAICreator/Qiita-1.07M huggingface dataset:
リーダーのあるべき姿をネトゲと照らし合わせて納得した話

先日、飲み会の席で取引先の方からこんな言葉を伝えられた。

`「リーダーっていうのはね、上に立つものじゃないんだ。前に立つものなんだよ」`

すごく共感を覚えた台詞だったのと同時に、ふと私が普段遊んでいるネットゲーム(RPG)の事を思い出した。

私がゲーム内で普段使っている職業は **タンク** と呼ばれる盾職である。
盾職の主な役割は

- 攻略の際には先頭を進んで、みんなを引っ張る
- 敵の攻撃をすべて引きつけて受け止める
- 他の職業(DPSと呼ばれる攻撃役やヒーラーと呼ばれる回復役が存在する)が戦いやすいように立ち回る

このようなものであり、ゲームプレイ中、私は基本的に前に立っている。

そして上記の話を受け、これはプロジェクト管理をしていく上でリーダーに求められるものと似ているなと感じた。

- プロジェクトを進める際には先頭を進んで、みんなを引っ張る
- チームの課題をすべて引きつけて受け止める
- チームメンバーが開発しやすいように立ち回る

こう考えていくと、日頃からどういう事を心掛ければいいかが自分の中で整理しやすくなった。
【Swift】カメラを起動させる方法！！ついでにアルバムも。

# 環境
centOS 10.13.5 High Sierra
Swift  4.1.2
Xcode　Version 9.4.1

#Buttonを設置してプログラムと繋ぐ
1, Main.storyboardにドラッグ＆ドロップでボタンを設置します。
2, controlを押しながらドラッグ&ドロップでプログラムと繋げます。

# あとは以下のコードをコピペするだけ！！

```ViewController.swift
@IBAction func album(_ sender: Any) {

let sourceType:UIImagePickerControllerSourceType = UIImagePickerControllerSourceType.camera
        // カメラが利用可能かチェック
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera){
            // インスタンスの作成
            let cameraPicker = UIImagePickerController()
            cameraPicker.sourceType = sourceType
            cameraPicker.delegate = self
            self.present(cameraPicker, animated: true, completion: nil)
            
        }
```

#ちなみに...

アルバムを開くときもほぼ同じです。

```ViewController.swift
@IBAction func album(_ sender: Any) {
        let sourceType:UIImagePickerControllerSourceType = UIImagePickerControllerSourceType.photoLibrary
        // アルバムが利用可能かチェック
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary){
            // インスタンスの作成
            let cameraPicker = UIImagePickerController()
            cameraPicker.sourceType = sourceType
            cameraPicker.delegate = self
            self.present(cameraPicker, animated: true, completion: nil)
        
    }
```


カメラは簡単に実装できるのでコピペでオッケーです！！
Library System: Smart Contract

これはとしょかんのシステムです

```
pragma solidity ^0.4.25; //version

。

contract Library {

//This is the structure of the contract
  struct Book {
    string bookTitle;
    bool inTheShelf;
    address user;
  }

//Declaration of two books
  Book book ＝ Book("book1",true,address(0));
  Book book2　＝ Book("book2",true,address(0));

//This is an array container of the books
  Book[] books;

//calls first
//This is the constructor of the smart contract
  constructor() public {      
      books.push(book);
      books.push(book2);
  }

//This is the function for borrowBook
  function borrowBook(uint i) public {
    require(!books[i].inTheShelf);
    books[i].inTheShelf = false;
    books[i].user = msg.sender;
  }

//This is the function for returnBook
  function returnBook(uint i) public {
    require(books[i].inTheShelf);
    require(books[i].user == msg.sender);
    books[i].intheShelf = true;
    books[i].user = address(0);
  }
  
}
```
書籍『土日でわかるPHPプログラミング教室』の学習環境をMac（High Sierra）で作成

# この記事は何？
掲題の書籍はWindows7 or 8を前提としていますが、僕はWindows10を使用しています。Windows10は個人的に使いづらいことと、購入者サポートにてMacOSへのフォローがあることから、Mac（High Sierra）にて学習しました。躓いたところを備忘録がてら残すとともに、とても良い本かつ対象読者が非エンジニアであることから、これから手にする方がいたら参考になれば良いなと思い書きます。

# 構築手順
### 手順書を入手
公式サポートから「MacOSインストール手順書」をDLして進めます。
https://froide.co.jp/books/programming/donichi

### VirtualBoxのインストールでエラーになる場合
同じような方がいらっしゃいました。解決策を記載してくれています。
https://qiita.com/yuyhiraka/items/464568e6e0e8be50d5f1

### vagrant --versionでエラーとなる場合
```
failed MSpanList_Insert 0x1e3000 0x316bb4bb577b 0x0
fatal error: MSpanList_Insert
```
最新版のvagrant（2.1.5）を入れ直すことで解決しました。

### git cloneで認証を促される場合
手順書記載のコマンド誤記（リポジトリ名が微妙に違う）が原因のようで、下記コマンドで成功しました。

```
git clone --recursive https://github.com/froide-kk/vagrant-donichi-php-x86_64.git vagrant
```

# その他
本の中で、アプリケーションへの接続元IPアドレスを取得する項があります。localhostにつなぎに行ってるのに10.0.2.2というIPが取得され、192.168.x.xでないことに違和感あったのですが、どうやらVirtualBoxの仕様でデフォルトだとゲートウェイが10.0.2.2、VMが10.0.2.15となるようです。
モナコイン　マイニングについて2018.10月　現状把握

# **モナコインのマイニングプール一覧**


***
モナコインのマイニングができるプールの一覧です。
昨今、モナコインの価格急騰で、モナコインを掘る人も急増したため各プールの負荷が上がり、不安定な状態に陥っています。
どのプールでマイニングしても、理論的には、掘れるモナコインの量は同じなので、負荷の高いプールは避け、安定して掘れるプールに適宜移動しましょう。


***

>[VIP Pool](https://vippool.net/)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/299867/a221a9fa-02d9-7fa4-54e5-c908e9fd8e8c.png)


一つのプールだけで掘ると、プールが止まった際のダメージがでかいので、複数のプールにアカウントを作って、いつでも切り替えられるようにすると、安定運用につながります。



# CCminerの設定

```LYRA2REv2-START.exe

ccminer.exe -a lyra2v2 -o stratum+tcp://stratum1.vippool.net:8888 -u A.B -p C

```

A=ユーザー名
B=ワーカー名
C=ワーカーのパスワード
ワーカーの作成の時に入力した、ABCを自分のものに変えます。この時AとBの間のドットを消さないように。


```LYRA2REv2-START.exe
ccminer.exe -a lyra2v2 -o stratum+tcp://stratum1.vippool.net:8888 -u Weblogin.WorkerName -p WorkerPassword

```



マイニングは取引しなくてもコインが手に入るが、必要な電気代やマシンの費用などを考えるとあまり収益が出るとは言い難いので、
短期的な収益ではなく長期的な値上がり見込んでマイニングするか<font color="Red">趣味の範囲内</font>のつもりでいると良いでしょう。将来のMonaCoinの値上がりに期待ですね！





**2017年10月ぐらいに100円超えた時は祭りだったけど2018年3月以降は過疎化。**

収益急低下の現状なども考慮されるためBEP（損益分岐点）なども考えながらマイニングすることをお勧めします:part_alternation_mark:



🔽こちらを参考にしていただければ
[***※51%攻撃とは***](https://bitflyer.com/ja-jp/glossary/fifty_one_percent_attack)
Mission Controlのデスクトップ切り替えのスライドアニメーションがうるさいときは「視差効果を減らす」をオンにするとフェードアニメーションになるよ

macOSのMisson Controlでデスクトップを切り替えるときのアニメーションが左右にスライドするものなので、作業中にデスクトップ切り替えをしていると目が回ってくることがある:

![2018-10-16 01.47.45.gif](https://qiita-image-store.s3.amazonaws.com/0/889/b93ca15b-2565-a461-500a-5d51bfa9da35.gif)

Mission Controlのデスクトップ切り替えのスライドアニメーションがうるさいと感じるときは「視差効果を減らす」をオンにするとフェードアニメーションにすることができる:

![2018-10-16 01.46.26.gif](https://qiita-image-store.s3.amazonaws.com/0/889/d2c7abe9-1292-c7ee-fc73-e8e7321aafe0.gif)

## やりかた

環境設定の「アクセシビリティ」→「ディスプレイ」→「視差効果を減らす」にチェックを入れる:

<img width="668" alt="アクセシビリティ.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/32bbb079-70da-070b-11b5-647ac19f6482.png">
Syncthingで「failed to setup inotify handler」の解決法

Syncthingで大量のファイルを同期していると発生するのが次のようなエラー:

![For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't. suin/dev failed to setup inotify handler. Please increase inotify limits, see https://docs.syncthing.net/users/faq.html#inotify-limits](https://qiita-image-store.s3.amazonaws.com/0/889/7db4a5e1-4610-6122-5bba-d3088a5d6f32.png)

これはファイルの変更検知をするinotifyが監視できるファイル数の上限より、同期しようとするファイル数が多くなったときに発生すると思われる。

inotifyの上限値は次のコマンドで確認できる:

```
cat /proc/sys/fs/inotify/max_user_watches
```

大抵は8192がデフォルトである。

下記のコマンドで一時的にこの上限値を増やすことができる

```
$ sudo sysctl fs.inotify.max_user_watches=524288
$ sudo sysctl -p
```

恒久的に変更するには次のコマンドを用い、OSを再起動する

```
$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
$ sudo sysctl -p
```
gradle play publisherがAppBundleをサポートしたので試してみた

## gradle play publisher
[gradle play publisher](https://github.com/Triple-T/gradle-play-publisher)はご存知の通り、gradleでAPKやmappingファイルなどを自動アップロードしてくれるpluginです。（詳細は割愛させていただきます）

2018年5月、Google I/OにてAppBundleが発表されたものの、gradle play publisherではAppBundleはサポートされておらず、私はAPKでの配信を続けていました。
が、2018/10/07、ついに[beta1](https://github.com/Triple-T/gradle-play-publisher/releases/tag/2.0.0-beta1)がリリースされました。
そして11/30に[正式リリース](https://github.com/Triple-T/gradle-play-publisher/releases/tag/2.0.0)となりました。

まずは一度試してみました。

#### 追記
11/30に2.0.0が正式リリースされましたので、追記します

## 対応方法

まずはバージョンをあげます。記述方法がかわります。
まずプロジェクト直下のbuild.gradleでの指定は不要となるため削除します。

```gradle:build.gradle(プロジェクト直下)
buildscript {
    repositories {
        ...
    }
    dependencies {
-       classpath 'com.github.triplet.gradle:play-publisher:2.0.0-beta1'
        ...
    }
```

次にapp直下のbuild.gradleにpluginの追加をします。

```gradle:build.gradle(app直下)
plugins {
    id 'com.android.application'
+   id 'com.github.triplet.play' version '2.0.0'
}
```

`plugins`の部分は、人によっては`apply plugin: 'com.android.application'`と記述しているかもしれません。ここにバージョンの指定をします。


その後syncすると、「serviceAccountCredentials使え」ってエラーが出たので、Readmeをよくみたら2.0.0からjsonファイルまたはp12ファイルの指定方法が変わり、`serviceAccountCredentials`を使うようになったようです。
同時に、`serviceAccountEmail` の情報もjsonファイルに含まれているため、これも不要になったようです。（残していたらエラーで消せといわれました）

```gradle:app/build.gradle
plugins {
    id 'com.android.application'
    id 'com.github.triplet.play' version '2.0.0'
    ...
}
...

play {
   track = 'alpha'
-  serviceAccountEmail = 'your-email address'
-  jsonFile = file('jsonファイル')
+  serviceAccountCredentials = file('jsonファイル')
}
```

## 実行方法

1.2.2までは以下のコマンドでした。

```shell
$ ./gradlew publishApkRelease
```

2.0.0からは以下のように微妙に変更されています。

```shell
$ ./gradlew publishReleaseApk
$ ./gradlew publishReleaseBundle
```

## 結果

自作アプリでも試してみました。
`publishReleaseBundle`を実行してみると、確かにAppBundle形式でStoreにアップロードされていました。ちなみにサイズは約13%の削減に成功しました。
まだbetaではありますが、特に凝ったことをしていない私の場合は問題なく動いていそうでした。

## 補足 - 変更内容 -
2.0.0からのBreaking Changesだけまとめておきます。
※間違っていたら指摘お願いします…

### Configutation Propertiesの廃止
以下のプロパティが廃止されています

- uploadImages 
    - gradleのキャッシュシステムとインクリメンタルビルドを利用しているので、画像が変更された場合にのみアップロードされます。そのため、このプロパティは廃止されました。
- untrackOld:
    - versionCodeのコンフリクトのために廃止されたようです
- errorOnSizeLimit
    - サイズエラーの場合は明示的にエラーとするため、廃止になりました

### Service Account Credentials API
既存の`jsonFile`と`pk12File`は`serviceAccountCredentials`に変更・統一されました

### Task名の変更
例）
旧：`publishApkRelease`
新：`publishReleaseApk`

現時点ではまだ動作するようですが、将来的に廃止されるようです。

### Android Gradle Pluginのbundle廃止
明示的にgradleのdependencyを記述する必要があるようです。普通、記述してあるはずなので基本的に気にしなくてよいのかと思います

### Listings Structureの変更
multi-dimensionのFlavorに対応するにあたり、リスティングメタデータの構造が変更されたようです。（この辺は使っていないので、あまり詳しくないです…）
例）
旧：../play/en-US/listing/shortdescription
新：../play/listings/en-US/shortdescription
単体テストの目的

# 単体テストの目的

## 新しく書いたコードの動作確認のため

クラスやメソッド単位で動作確認ができる。

テストコードの無いクラスは、「動作確認未実施のクラス」だと思え。

テストコードをよく書く人は、テストコードが無いと、自分が書いたコードだとしても信用できないようになるだろう。

## リファクタリング前後で、仕様を満たし続けていることを確認するため

クラス内部のリファクタリングを行ったときに、リファクタリング前のテストが、リファクタリング後も成功していることで、デグレが起こってないことを確認できる。

この目的の達成のためには、「内部実装の変更によって、テストコードに影響が出る」ようなことがあってはならない。
テストコードに手が入ると、「変更前の仕様を、変更後も満たし続けていること」が証明できないためだ。

そのためには、かなりしっかりとクラス設計を考えないといけない。
実際、「テストコードに手を入れずに、全テストの成功を保ち続けること」はかなり難しい。

# 単体テストの目的でないもの

## コードカバレッジを上げるため

コードカバレッジを上げるために単体テストを書くのは、**間違っている**。

プロジェクトのC0コードカバレッジ率の目標値を達成させるために、「とりあえず通してみました」といったテストが量産されているのを見たことがある。

テストケースが十分に網羅できていれば、コードカバレッジは自然と上がるのだ。
コードカバレッジを上げることが目的ではない。コードカバレッジはあくまでもコードの品質を計るための手段である。
.stignoreを全ノードで同期する方法

結論から言うと、.stignoreは同期されないファイルであるため、Syncthingがそれ自体を直接同期することはない。

そのワークアラウンドの対処法として、`.stglobalignore`というファイルを作り、そこに同期したくないファイルのルールを書いておく。

```text:.stglobalignore
.DS_Store
```

その上で、全ノードの`.stignore`にそれをインクルードするルールを書いていく。

```text:.stignore
#include .stglobalignore
```

このステップは手間だが、これ以上簡単な方法はないと思われる。
Webpack v3 → v4移行パッケージ対照表

webpack v4がリリースされてから久しいですが、v3を使っているという方はまだそれなりにいるのではないかと思います。  
私の業務で触れた当初、v4はリリースしたてでプラグイン周りもまだベータが取れていかなったのでv3を選択していましたが、安定してきたのでv4に移行しました。

移行の段階でいつくかのエラーとの戦いがありました。直接的な原因がわかるエラーは良いのですが、間接的にしか読み取れないエラーもあったのでpackage.jsonと見比べて不足している変更がないかわかるよう対照表にしました。

現在移行を検討している方、詰まっている方へ何かの助けになれば幸いです。

|パッケージ|v3|v4|用途|備考|
|:------|:------|:------|:------|:------|
|webpack|webpack@^3.x.x|webpack@^4.x.x|バンドラー|modeオプションが必須に[^1]|
|webpack-cli|不要|webpack-cli@^3.x.x|cliツール|v4から新たに追加|
|webpack-dev-server|webpack-dev-server@^2.x.x|webpack-dev-server@^3.x.x|ローカルサーバー||
|html-webpack-plugin|html-webpack-plugin@^2.x.x|html-webpack-plugin@^3.x.x|html書き出し||
|extract-text-webpack-plugin|extract-text-webpack-plugin@^2.x.x|削除|css抽出|v4でcssへの使用が非推奨になった[^2]|
|mini-css-extract-plugin|なし|mini-css-extract-plugin@^0.x.x|css抽出|extract-text-webpack-pluginに代わり追加|
|uglifyjs-webpack-plugin|webpackに同梱|uglifyjs-webpack-plugin@^2.x.x|js圧縮|v4でplugins → optiomization.minimizer配下に変更[^3]|
| webpack.optimize.CommonsChunkPlugin |webpackに同梱|なし|js分割|v4でplugins → optiomization. splitChunks配下に変更[^4]|
| webpack-pwa-manifest |webpack-pwa-manifest@^2.x.x|webpack-pwa-manifest@^3.x.x|manifest.json作成|PWA関連|
| workbox-webpack-plugin |workbox-webpack-plugin@^2.x.x|workbox-webpack-plugin@^3.x.x|Service Worker作成|作成時 workboxPlugin → WorkboxPlugin.GenerateSWに変更、glob設定が不要になり一部プロパティ名変更[^5]|

[^1]: https://webpack.js.org/concepts/mode/
[^2]: https://github.com/webpack-contrib/extract-text-webpack-plugin#usage
[^3]: https://webpack.js.org/plugins/uglifyjs-webpack-plugin/
[^4]: https://webpack.js.org/plugins/split-chunks-plugin/
[^5]: https://developers.google.com/web/tools/workbox/guides/migrations/migrate-from-v2#workbox-webpack-plugin
配列の値をfor文を使わずに出力する方法

Javaで配列をコンソールに表示したいとき、これまではfor文などを記述していたのですが、Arrays.toStringメソッドを使うことで楽に表示することができます。

[参考にしたページ](http://d.hatena.ne.jp/phithon/20110121/java_array_to_string)

```java:サンプル

int[] a = {1, 2};	

// これまで
for (int i: a) {
	System.out.println(i);
}
// または
Arrays.stream(a).forEach(System.out::println);

// これから
System.out.println(Arrays.toString(a));

// 注意
System.out.println(a.toString());
```
```:コンソール
1
2
1
2
[1, 2]
[I@bebdb06
```
上記の３つのものを比較すると，Arrays.toStringメソッドが一番すっきり書けます．Stream APIを使った方法もいいような気がしますが，これは多次元配列を扱う際に記述が難しくなるので，Arrays.toStringがベターです．

ちなみに最後のようにa.toString()とすると，配列変数のハッシュ値が表示されてしまいます．また，System.out.printlnなどの標準出力メソッドでは，内部で引数のtoString()が呼ばれるようになっているので，System.out.println(sb.toString());などの冗長な書き方は控えましょう．

## 多次元配列のとき
deepToStringメソッドを使いましょう。

```java
String[][] sss = {{"a","bb"}, {"ccc"}};

System.out.println(Arrays.toString(sss));
System.out.println(Arrays.deepToString(sss));
```
```:コンソール
[[Ljava.lang.String;@bebdb06, [Ljava.lang.String;@7a4f0f29]
[[a, bb], [ccc]]
```

# まとめ
配列を標準出力したいときは**Arrays.toString**，**Arrays.deepToString**メソッドを使いましょう．
Rの同一グラフに複数データプロット、凡例について少しまとめた

# 作りたいグラフ
みどりぼん（データ解析のための統計モデリング入門)にあるグラフ。
![Rplot_3plot.png](https://qiita-image-store.s3.amazonaws.com/0/196857/f8fa7d5d-9fd7-d81c-e763-a9a7f42d897f.png)

# コード
以下のようにすれば作れる（ベストな方法かは不明）

```r:下準備
# plotするデータ
# xですが、諸事情でyとしています
y <- 0:20
# ポアソン分布
prob.a <- dpois(y, lambda=3.5)
prob.b <- dpois(y, lambda=7.7)
prob.c <- dpois(y, lambda=15.1)
# 凡例用
# 各データの説明(今回はlambdaの値を書く)
labels <- c(3.5, 7.7, 15.1)
# 点の種類
pchs <- c(1, 5, 2)
```


```r:グラフ作成
# まずひとつのデータについてプロット
plot(y, prob.a, type="b", lty=2, xlab="y", ylab="prob")
# prob.bをプロット
points(y, prob.b, pch=2)
lines(y, prob.b lty=2)
# prob.cをプロット
points(y, prob.c, pch=2)
lines(y, prob.c, lty=2)
# 凡例
legend("topright", title="lambda", legend = labels, pch = pchs)
```

# 説明

### 下準備
* labels：各データの内容、今回はlambdaの値を書く
* pchs：各データにおける点の種類をpchの値で指定

### グラフ作成

* plot()内のtypeおよびltyは 
* 各軸のラベルはplot()内のxlab, ylabで指定
* 一つのデータについてプロットした後、points()およびlines()を使って、グラフを重ねていく。
* pointsのpchは点の種類、linesのltyは線の種類(cf. http://cse.naro.affrc.go.jp/takezawa/r-tips/r/53.html)
* legend()の"topright"は右上の意味top or bottom, right or left
* legend()のtitleで、凡例の説明用のテキストを指定
* legend()のlegendで各データを説明するテキストを配列で指定
* legend()のpchでどのデータのことを言っているかを区別するために、点の種類を指定(pchのかわりに、ltyを使ったり、または両方使ったりしても良い)


# 参考文献
* legend()の引数について参考にした
(http://www.is.titech.ac.jp/~mase/mase/html.jp/temp/legend.jp.html)
* 凡例の作り方について参考にした(https://stats.biopapyrus.jp/r/graph/legend.html)
* 凡例のtitleの部分が出てこなかったので参考にした(http://www.sthda.com/english/wiki/add-legends-to-plots-in-r-software-the-easiest-way)
HackMDでQiita記事を執筆するときの手順

# はじめに

Qiitaで投稿するのは好きなのですが、
中々良いエディタがなくて、なんとかならないかと考えていて、
HackMDを使って執筆してみたところ、気持ちよく原稿を書けたので、
共有したいと思います。

# なぜHackMD

1. 図が描ける
1. VIMのキーバインドで投稿できる

## 理由１：図が描ける

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89176/2de093c9-5c3a-8ecc-9090-6958021de28c.png)

HackMDの最大の特徴は、図を描けることだと思っています。
UMLやフローなどを描けるということは、説明のしやすさに直結します。
わかりやすい図と最低限の文章にするということは、
読み手にとっても、書き手にとっても嬉しいです。

## 理由２：VIMのキーバインドで投稿できる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89176/cab2493e-3a93-1bb7-c613-71f5bd34252d.png)

Emacsキーバインドを習得中ですが、
まだVIMキーバインドに慣れてしまっているので、
原稿を書くときの気持ちよさが倍増します。
日本語と英語の切り替えが面倒ですが。。


# 執筆から投稿までの流れ


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89176/c83fc4f2-7ee2-d04c-976c-6cb91d108762.png)


## 1. HackMDをサインアップする

HackMDはサインアップしなくても使えますが、
図のソースを残しておくためにサインアップしておくのが良いと思います。
私は、GitHubのアカウントを持っていたので、それでSign Upをしました。

## 2. HackMDで記事を書く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89176/80459ba2-09b0-eff4-1f87-f2571660da1a.png)

## 3. 本文はMarkdownをそのままQiitaに貼り付ける

文字だけでなく、スクリーンショットも貼り付けられるのが気持ちいい。

## 4. 図は「⌘+controll+shift+4」でスクリーンショットを撮って、それをQiitaに貼り付ける

図はソースがそのまま貼り付けられてしまうので、HackMD側で図を⌘+controll+shift+4でスクリーンショットを撮って、それをQiitaに貼り付ける

## 5. 体裁を整えたら投稿

調整は不要だと思います。
タイトルとタグを設定したら、投稿ボタンから投稿するだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89176/ad9ffb3d-af5f-6816-0881-f1d0e7c17f11.png)

## Tips

ちなみに、画像はHackMDからそのままコピペすればQiitaでも表示可能ですが、
画像がずっと残っている保証はないので、画像を右クリックでコピーした後、Qiitaに貼り付ければQiitaの領域（qiita-image-store.s3.amazonaws.com）に保存されるので比較的安心です。

# 最後に

執筆環境を整えて、いっぱいQiitaに投稿しましょう！

# 参考

https://hackmd.io/b_l4reliTdWOSn9SiCmbJQ?both
勉強記録 20181015_PM AWS ソリューションアーキテクト – アソシエイト

# Amazon SNS
- Amazon Simple Notification Service (Amazon SNS) は、サブスクライブしているエンドポイントまたはクライアントへのメッセージの配信または送信を調整し、管理するウェブサービスです。
- Amazon SNS を使用して、SMS 対応デバイスにテキストメッセージ、または SMS メッセージを送信できます。

# IAM
- タスク用の IAM ロール
 - タスクのコンテナで使用できる IAM ロールを指定できます。アプリケーションは AWS 認証情報で AWS API リクエストに署名する必要があります。

# VPM Flow Logs
- VPC Flow Logs is a feature that enables you to capture information about the IP traffic going to and from network interfaces in your VPC. 

# SQS
- 先入れ先出し (FIFO)

# DBについて
- DynamoDBはスキーマレス
- Aurora の DDL
https://aws.amazon.com/jp/blogs/news/amazon-aurora-under-the-hood-fast-ddl/

# Redshift
- クロスリージョンスナップショット
- 暗号化
 - Amazon Redshift では、クラスターに対してデータベースの暗号化を有効にして、保管時のデータを保護できます。クラスターに対して暗号化を有効にすると、クラスターとそのスナップショットのデータブロックとシステムメタデータが暗号化されます。
- Amazon Redshift での AWS KMS を使用したデータベース暗号化
 - Amazon Redshift によるキー管理用に AWS KMS を選択すると、4 階層の暗号化キーがあります。これらのキーは、階層の最上位から順にマスターキー、クラスターの暗号化キー (CEK)、データベースの暗号キー (DEK)、データ暗号化キーとなっています。
 - クラスターを起動すると、Amazon Redshift では、AWS アカウントが作成したか AWS KMS での使用アクセス権限のあるカスタマーマスターキー (CMK) のリストが返されます。暗号化キーの階層でマスターキーとして使用する CMK を選択します。
 - Amazon Redshift の初期の設定では、スターキーとしてデフォルトのキーが選択されています。デフォルトのキーは AWS 管理のキーであり、AWS アカウントが Amazon Redshift 用に作成したものです。暗号化されたクラスターをリージョンで初めて起動してデフォルトのキーを選択すると、AWS KMS でこのキーが作成されます。 

# VPC ピアリング接続
- VPC ピアリング接続は、2 つの VPC 間でプライベートなトラフィックのルーティングを可能にするネットワーキング接続です。

# Lambda 統合で API Gateway API を構築する
- Lambda 統合で API を構築するには、Lambda プロキシ統合または Lambda カスタム統合のどちらかを使用できます。一般的に、汎用性があって強力な機能を提供しながら高速かつ合理化された API セットアップのために Lambda プロキシ統合を使用します。
- カスタム統合は、バックエンド Lambda 関数に到達する前に API Gateway が受信リクエストデータを前処理する必要がある場合、より良い価値提案であるかも知れません。ただし、レガシーテクノロジーです。]

# Amazon EBS スナップショットのコピー
- 地理的拡張: アプリケーションを新しいリージョンで起動します。

# Turn on CloudTrail across all regions and support for Multiple Trails

# AWS Storage Gateway とは
- AWS Storage Gateway は、オンプレミスのソフトウェアアプライアンスをクラウドベースのストレージと接続し、お客様のオンプレミスの IT 環境と AWS のストレージインフラストラクチャとの間にデータセキュリティ機能を備えたシームレスな統合を実現するサービスです。このサービスを使用すると、AWS クラウドにデータを保存し、データのセキュリティを維持するために役立つ、スケーラブルで費用効率が高いストレージを利用できます。

# Route53 s3 フェールオーバー
http://aws.typepad.com/aws_japan/2013/02/create-a-backup-website-using-route-53-dns-failover-and-s3-website-hosting-.html

# Memcached と Redis の比較
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/mem-ug/SelectEngine.html

# Amazon Kinesis Data Firehose
- ストリーミングデータをデータストアや分析ツールに確実にロードする最も簡単な方法です。ストリーミングデータをキャプチャして変換し、Amazon S3、Amazon Redshift、Amazon Elasticsearch Service、Splunk にロードして、現在お使いの既存のビジネスインテリジェンスツールやダッシュボードで、ほぼリアルタイムに分析することができます。

# 署名付き URL を使用したオブジェクトのアップロード
- デフォルトでは、すべてのオブジェクトおよびバケットはプライベートです。署名付き URL は、ユーザー/顧客が特定のオブジェクトをバケットにアップロードできるようにする必要があるが、AWS セキュリティ認証情報またはアクセス許可を持つことを求めない場合に有用です。

# Amazon Route 53 announces support for multivalue answers in response to DNS queries
https://dev.classmethod.jp/cloud/aws/route53-multivalue-response/

#
Yeomanのカスタムジェネレータで特定フォルダ配下を一括コピー

# はじめに

Yeomanのカスタムジェネレータでは、テンプレートファイルのコピーを絶対やりますよね。
http://yeoman.io/authoring/file-system.html
この公式ドキュメントには`copyTpl()`関数だけ載ってますけど、ファイルをそのまんまコピー、しかも特定フォルダ配下をそのまんま一括コピーしたいときは、もっと簡単な方法があります。

# `this.fs.copy()`関数を使う方法

## シンプルなコピー

`generators/app/templates/static`ってフォルダを作っておいて、そのまんまコピーしたいテンプレートファイルはその中に全部つっこんで以下のように書くと、`static`配下の全ファイル・フォルダを、ジェネレータで作成するプロジェクトのルート配下に綺麗にコピーしてくれます。

第二引数の`this.destinationRoot()`がポイントですね。

```js:generators/app/index.js
  writing() {
    // Copy all static files
    this.fs.copy(this.templatePath('static'), this.destinationRoot())
  }
```

ただこれだと、ドットで始まる隠しファイル・ディレクトリは無視されちゃうのです。

## ドットファイルも含める
ドットファイルも含めてコピーしたいときは、`copy()`の第三引数にオプションをつければOK。

```js:generators/app/index.js
  writing() {
    // Copy all static files
    this.fs.copy(this.templatePath('static'), this.destinationRoot(), {
      globOptions: { dot: true },
    })
  }
```

# 解説
Yeomanの`this.fs`配下のメソッドは[mem-fs-editor](https://github.com/SBoudrias/mem-fs-editor)というライブラリが実体のようです。

[copyメソッド](https://github.com/sboudrias/mem-fs-editor#copyfrom-to-options-context-templateoptions-)の第三引数に`options`オブジェクトを任意で渡せて、3種類のキーを指定可能。

* process
    * よく分からんかったのでスルー
* ignoreNoMatch
    * `true`を指定すると、第一引数の`from`ファイルが見つからなくてもスルーして処理を続ける
* globOptions
    * ファイルのマッチングパターンをオブジェクトで細かく指定する
    * [fast-globライブラリのOptions](https://github.com/mrmlnc/fast-glob#options-1)を指定
    * `dot: false`がデフォルトなので、`true`にするとドットファイル有効

# 参考ドキュメント
http://yeoman.io/authoring/file-system.html
https://github.com/sboudrias/mem-fs-editor
https://github.com/mrmlnc/fast-glob
https://github.com/yeoman/generator/issues/642
MBP 13inch（整備済み）を手に入れろ！ その1

# 2部構成です
1. 導入　←　今ここ
2. [やったこと&結末](https://qiita.com/wol/items/44020f4df999b775cbb2)

# あらすじ
- 外にPCを持ち出したいと思う機会が増えてきた
- いい機会だからMacデビューしてみよう。持ち運びメインだから13インチのMacBook Proがほしい！
- 新品はちょっとお高いから整備済み品を狙おう！

# ところが
<img width="184" alt="スクリーンショット 2018-10-16 0.34.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/278872/f16cfdd9-a89e-1721-a9c6-d9abfac2a0a1.png">
<img width="193" alt="スクリーンショット 2018-10-16 0.35.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/278872/9181932b-e788-5d25-6128-eee20f86edd2.png">
<img width="189" alt="スクリーンショット 2018-10-16 0.36.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/278872/4597aaeb-8251-a62a-5fa6-35abe1c5a10e.png">


#### ぜんぜん入荷しない・・！！
15インチMBPとか普通のMacBookとかはちょこちょこ入荷してるみたいだから、13インチも入荷してると思うんだけどなーー
もしかして人気ですぐ売れちゃうのかな・・？

# ということで
入荷したらLINEに通知するようにしてみました。
<img width="375" alt="IMG_7C8E4C105AD5-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/278872/4b5fd081-a469-cafc-433d-e61eb6d14516.jpeg">

#　構成
今回テンプレートは必要ないのでスピード重視です。

1. Heroku  
サーバを借りてるわけでもなく、かといって家のPC立ち上げっぱなしにするのも電気代がなぁ、、、ということで、
前々から気になっていたHeroku（ヘロク）というサービスを利用してみました。  
HerokuはいわゆるPaaSというやつで、これだけでまた記事が書けるので詳しくは説明省きますが、レンタルサーバの1種みたいな感じです。
2. PostgreSQL  
触ったことなかったので使ってみました。とは言っても構築はHerokuにお任せしちゃったのでほぼノータッチです。
3. Node.js  
サーバサイドで動作するjavascriptです。今回はpupeteerというライブラリを使ってchromeを操作します。JavaでSeleniumみたいな感じですね。

# つづく
その2へ続きます
GitKrakenでリポジトリがなくなった！

##開発環境
開発環境として、
Ubuntu、Docker、Jupyter、GitKrakenを使用。

##GitKrakenのリポジトリがなくなった！
早速本題

      could not find a compatible repository at リポジトリ名. do you want to create a new repository there?


というエラーが表示されてしまい、焦ってしまう…が！
Initialize を押してしまうと、リポジトリが初期化されてしまうので注意！
無くなっているわけではなくシステムが探しきれていないだけ。
Recentory Opened　ではなくOpen a Repository を選択。

![project.png](https://qiita-image-store.s3.amazonaws.com/0/248639/54a6631b-3098-8e25-774b-cdef6e87ad83.png)

ファイルパスを辿っていき、リポジトリのあるフォルダを選択すればOK！

今までのファイルログがなくなったかと思って焦った…
Rspecのあれこれ1

Rspecでわかったことをまとめます。（理解できていない点も含めて記載しておく。）その１です。

## Rspecってこういうの


```ruby:user.rb
class User
  validates :name, presence: true

  def repeat_user
    if user.use_count > 0
    return true
  end
```

```ruby:spec/user_spec.rb
require 'spec_helper'

describe User do
  let(:user) { User.new(name: "pi----yo", email: "piyo@hoge.com", use_count: 2) }

  describe 'validations' do
    it "name", :aggregate_failures do
      user.name = "piyopiyo"
      expect(user).to be_valid
      user.name = ""
      expect(user).to be_invalid
    end
  end

  describe '#repeat_user' do
    it '二回以上購入（リピートユーザー）ならtrueが返る' do
      expect(user.repeat_user).to be true
    end

    it '一度も購入していない場合は falseが返る' do
      user.use_count = 0
      expect(user.repeat_user).to be false
    end
  end
end
```
## キーワード
- `describe`　〜についてテストするよと明示する。 `'#repeat_user'`のように書くと、  インスタンスメソッドのrepeat_userメソッドをテストしますという意味。
- `let` インスタンス変数のように使える。 `let(:user){.....}`と記述すると、{.....}内の値を `user` として参照できるようになる。値の書き換えも可能。
- `aggregate_failures` 特定のエクスペクテーション群をまとめて検証する。これを使用しないと、群の中でエラーになった部分までしかテストの実行がされないため、1個ずつ直して再度回す...というような作業を繰り返すことになる。
　
　 ※エクスペクテーション => expect(X).to eq Y で記述する `期待値と実際の値の比較` 部分のこと。

- `expect` 値の比較を行う。
- `before do ... end` example の実行前に毎回呼ばれる。 ブロックの中では、テストを実行する前の共通処理やデータのセットアップ等を行う。


## これから調べたいこと
- [ ]  `subject` の使い方 => ちょろっと見たけど使用してみてまとめたい
- [ ] 　Factory_botやFabricationを使用したテストデータ生成周り
 　　　　　　　　　　　　　　　　　　　　　※ Fabricationはmongoidのembeded_manyに対応しているテストデータジェネレータ
PHP 文字列操作関数

PHPの基本的な文字列操作関数

### ◆文字列から不要な文字を除去する

スペース除去や、指定文字の除去はtrim関数を使う。

```php:qiita.php
echo " Hoge"; //  Hoge

echo trim(" Hoge"); // Hoge
```

上の例では、`Hoge` の前のスペースも出力されるのに対して、
下の例では、スペースを除去して出力してくれる。
第二引数を指定しないとスペースを除去してくれる。

また、指定文字を左端から除去したい場合

```php:qiita.php
$str = 'Hello World!';

echo trim($str,'He'); // llo World!
```

左端から除去するか、右端から除去するかは下記のようにltrim,rtrimを使用することで指定が可能になる。

```php:qiita.php
$str = 'Hello World!';

// 左から除去
echo ltrim($str,'He');// llo World!

// 右から除去
echo rtrim($str,'ld!'); // Hello Wor
```

### ◆文字列の大文字小文字を変換する

文字列をすべて大文字、若しくは小文字にする

```php:qiita.php

$str = 'Hello World!';

// 全て小文字に変換する
echo strtolower($str); // hello world!

// 全て大文字に変換する
echo strtoupper($str); // HELLO WORLD!
```

次は、先頭の文字だけを大文字にする方法、各単語の先頭を大文字にする方法

```php:qiita.php

$str = 'my name is hoge';

// 文字列の先頭の文字のみ大文字にする
echo ucfirst($str); // My name is hoge

// 各単語の先頭の文字を大文字にする
echo ucwords($str); // My Name Is Hoge
```



### ◆文字列の中から文字を抽出する

substr関数の第一引数に、文字列、第二引数に文字列の何番目から抽出するかを指定する。
第三引数を指定しない場合は文字列の最後の文字までを抽出する。
第三引数に文字数を指定することで、何番目から何文字の文字という指定をして抽出することができる。
また、文字の先頭を指定する場合、1でなく0と指定する必要があるので注意する。
スペースも1文字とカウントする。

```php:qiita.php
$str = 'Hello World!';

// $strの6番目から最後の文字を抽出する
echo substr($str, 6); // World!

// $strの0番目から5文字抽出する
echo substr($str ,0 ,5); // Hello
```

### ◆文字列の中に指定文字を何個含むかを調べる

文字列の中に指定文字がいくつ含まれているかを調べるには、substr_count関数を使う。

```php:qiita.php
$str = 'Hello Hello World!';

// $strの中に'Hello'がいくつ含まれるかを調べる
echo substr_count($str, 'Hello'); // 2
```
なぜかRustで言語処理100本ノック ～第1章 前編～

Rustで[言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)しています。
# 第1章: 準備運動
今回は余裕があったので問題の要求より少し汎用性を持たせてみました。後編は[こちら](https://qiita.com/kbone/items/eacbbd09d66ef26c1bb9)。
## 00. 文字列の逆順
> 文字列"stressed"の文字を逆に（末尾から先頭に向かって）並べた文字列を得よ．

一番最初の問題ですが、案外素直にいきませんでした...一度`Chars`に変換してから逆順にし、`String`に再変換して返しています。

```rust
pub fn reverse(text: &str) -> String {
    text.chars().rev().collect()
}
```

## 01. 「パタトクカシーー」
> 「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ．

前の問題ができていれば発想は同じなので簡単。Rustは結構functionalに書けますよね。

```rust
pub fn odd_chars(text: &str) -> String {
    text.chars().step_by(2).collect()
}
```

## 02. 「パトカー」＋「タクシー」＝「パタトクカシーー」
> 「パトカー」＋「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ．

これは意外とひねりが必要でした。
まずイテレータで交互に結合というのが無さそうなのと、`char`型同士の簡単な演算で文字の結合としてできるものは有っても(`format`マクロ等)そのたびに`String`を生成するのでちょっと非効率かなと思い、バッファを用いる形にしてみました。

```rust
pub fn concat_alternately(left: &str, right: &str) -> String {
    let mut result = String::new();
    left.chars().zip(right.chars()).for_each(|(l, r)| {
        result.push(l);
        result.push(r);
    });
    result
}
```

## 03. 円周率
> "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し，各単語の（アルファベットの）文字数を先頭から出現順に並べたリストを作成せよ．

単純に空白区切りで文字を数えるだけなら簡単なのですが、`','`や`'.'`を除こうとすると、標準では正規表現が使えないのでほんのちょっとだけ手間を掛けなきゃいけないみたいです。

```rust
pub fn pi_from_text() -> Vec<usize> {
    let text = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.";
    text.replace(",", "").replace(".", "").split_whitespace().map(|s| s.len()).collect()
}
```

## 04. 元素記号
> "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し，1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字，それ以外の単語は先頭に2文字を取り出し，取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．

文章にするために犠牲になったMgをどう扱うか迷いましたが、とりあえずそのままにしておきました。
考え方は円周率のときと同じですが、`map`ではなく`enumerate`からの`for_each`にして、`HashMap`へ格納しています。また、問題文中の「○○番目」は1始まりなので注意が必要です。

```rust
pub fn element_symbols() -> HashMap<String, usize> {
    let text = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.";
    let mut result = HashMap::new();
    text.replace(".", "").split_whitespace().enumerate().for_each(|(i, s)| {
        let symbol = match i {
            0 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | 18 => s.get(0..1).unwrap(),
            _ => s.get(0..2).unwrap()
        };
        result.insert(symbol.to_string(), i + 1);
    });
    result
}
```
なぜかRustで言語処理100本ノック ～目次～

# はじめに
最近Rustが好きでC++の代替品として使っているのですが、しょっちゅう文字列処理のところでコンパイラ先生に怒られてしまいます。そこでかの有名な[言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)を通して扱いに慣れようと思います。これはRustでやるならこんな感じになるのかな？という解法を残しておくための備忘録ポエム的なものです。

# 開発環境
OS: ArchLinux (Kernel: 4.18.12-arch1-1-ARCH)
rustc: 1.29.1 (by rustup)

# 目次
* [第1章 前編](https://qiita.com/kbone/items/47d108d361359de6b34c)
* [第1章 後編](https://qiita.com/kbone/items/eacbbd09d66ef26c1bb9)
* [第2章 前編](https://qiita.com/kbone/items/2d947090fb152ef9d0fb)
* [第2章 後編](https://qiita.com/kbone/items/36a48daf62a43f605e2d)
* [第3章 前編](https://qiita.com/kbone/items/9b62f365c081c09ae39f)
* [第3章 後編](https://qiita.com/kbone/items/6c61df1c1ec5caab0982)
* [第4章 前編](https://qiita.com/kbone/items/604d8edf2c470f8af57b)
* [第4章 後編](https://qiita.com/kbone/items/67c6b1c995a7ccfbce8b)
* [第5章 前編](https://qiita.com/kbone/items/a1322e652113b7719d9f)
* [第5章 後編](https://qiita.com/kbone/items/49154783c68d7cbcc8ff)
[cocoa][swift]え！それって参照渡し？

<p>とても違和感を感じる用語がある。それは、『参照渡しだ』。</p>
<p>え！違うだろ？と感じていたが、いい機会なので、調べてみた。</p>

<h1>引数</h1>

<p>引数と呼ばれるものにどんな種類があるのか、まずは列挙してみる。</p>

<h2>実引数</h2>

<p>関数に渡す値。</p>

<pre><code>sum(1, 2);
</code></pre>

<h2>仮引数</h2>

<p>関数が受け取った変数。</p>

<pre><code>int sum(int a, int b) {     return a + b; }
</code></pre>

<h2>値渡し(call by value)</h2>

<p>値が渡される。</p>

＜h２>ポインタ渡し</h2>

<p>渡す値がアドレスの値渡し。</p>

<h2>参照渡し</h2>

<ul>
<li>変数渡し(call by variable)<br />変数そのものを渡す。</li>
<li>参照渡し(call by reference)<br />参照渡しで、内部でアドレス情報を渡す方法。</li>
</ul>

<h1>Pascal</h1>

<p>Pascalでは，値渡し(call by value)と変数渡し(call by variable)が存在し、変数渡しは参照渡しに相当する。</p>

<p>そもそもは、変数渡しの実装方法に参照渡しがある。参照渡しは、変数に対する参照（アドレス情報）を渡す方法だ。</p>

<p>Inside Macintoshは、コードはPascalで記載されているが、それをC言語で利用する場合、varがついた変数渡しの引数は、C言語ではポインターと読み替えていた。</p>

<p>具体的には、Inside Macintoshで以下のようにPascalで説明されていたとする。</p>

<pre><code>PROCEDURE GetPort(VAR port: GrafPtr);
</code></pre>

<p>これをC言語では、以下のように読み替える。</p>

<pre><code>void GetPort (GrafPtr * port);
</code></pre>

<h1>C言語</h1>

<p>C言語の関数の引数は全て値渡し。K&Rでしっかりと説明されている。</p>

<p>ポインタでアドレスの値を渡すのを参照渡しと呼ぶのは間違いだ。</p>

<h1>Java</h1>

<p>Javaも全て値渡し。</p>

<p>ポインタ演算ができない、アドレス（参照）の値渡しが利用できるが、これを参照渡しと呼ぶのは、如何なものか。</p>

<h1>C++</h1>

<p>値渡しに加え、本物の参照渡しが存在する。</p>

<pre><code>void time_two(int& a)
{
    a *= 2;
}
</code></pre>

<p>また、C++11では右辺値参照・ムーブセマンティクスという所有者の移動が用意されている。</p>

<h1>C#</h1>

<p>二つの参照渡しの方法が用意されている。</p>

<pre><code>int initializeInMethod = 0;  // 初期化が必須
OutArgExample(initializeInMethod);
Console.WriteLine(initializeInMethod);
 
void OutArgExample(ref int number)
{
    number = 44;
}
</code></pre>

<pre><code>int initializeInMethod;
OutArgExample(out initializeInMethod);
Console.WriteLine(initializeInMethod);
 
void OutArgExample(out int number)
{
    number = 44;  // 代入が必須
}
</code></pre>

<p>refは変数が渡されるので、初期化によって値が設定されていない変数はNGだ。</p>
<p>outは値を返すという意味から、初期化は必須でないか、関数内で値を必ず設定しないといけない。</p>

<h1>Swift</h1>

<p>値渡しだが、inoutキーワードをつけると値呼びの結果返し（call-by-value-result）となる。</p>

<p>C言語のポインターの場合と同様に、変数が参照型の場合、参照の値渡しにより値を変更できる。</p>

<pre><code>class Demo {
    public var num = 0;
}
 
func set999(a: Demo) {
    a.num = 999;
}
 
let demo = Demo()
set999(demo)
</code></pre>

<p>値呼びの結果返しの例。</p>

<pre><code>func set999(a: inout Int) {
    a =999
}
 
var num = 0
set999(&num)
</code></pre>

【関連情報】
<a href="https://cocoa-kanto.connpass.com/event/101034/">Cocoa.swift 2018-10</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
ラズパイZeroW にgreengrassをインストールしようとして出来なかった

ラズパイZero W にgreengrassをインストールし（ようとし）た

# 先に結論

`できなかった`

## 理由
pi zero のcpuはarmv6l

```
$ uname -a
Linux raspberrypi-204 4.14.71+ #1145 Fri Sep 21 15:06:38 BST 2018 armv6l GNU/Linux
```
greengrassの動作要件はARMv7l
> アーキテクチャ: ARMv7l、OS: Linux、ディストリビューション: Raspian
参考）
https://aws.amazon.com/jp/greengrass/faqs/

┐(´～`；)┌

# 手順
以下実施手順メモ

* sshができた
* git インストール
	* `sudo apt-get install git`
* 動作環境確認

```
mkdir Downloads
cd /home/pi/Downloads
git clone https://github.com/aws-samples/aws-greengrass-samples.git
cd aws-greengrass-samples
cd greengrass-dependency-checker-GGCv1.5.0
sudo modprobe configs
sudo ./check_ggc_dependencies | more
```

以下のエラー

```
Missing required dependencies:
1. The 'memory' cgroup is not enabled on the device.
Greengrass will fail to set the memory limit of user lambdas.


----------------------------------Exit status---------------------------------------
Either the script failed to verify all dependencies or the device is missing one or
more of the required dependencies for Greengrass version 1.6.

Refer to the 'Errors' and 'Missing required dependencies' sections under 'Results'
for details.
```
* /boot/cmdline.txt に以下を追記して、rebootして再チェックしてクリア 
`cgroup_enable=memory cgroup_memory=1`
	* 参考） https://www.raspberrypi.org/forums/viewtopic.php?t=203128

```
greengrass-linux-armv7l-1.6.0.tar.gz
0f977cdc14-setup.tar.gz
```
 をラズパイにコピー（この時点ですでにarmv7と書いてる。。。）

* 展開

```
sudo tar -xzvf greengrass-OS-architecture-1.5.0.tar.gz -C /
sudo tar -xzvf 0f977cdc14-setup.tar.gz -C /greengrass
```

```
cd /greengrass/certs/
sudo wget -O root.ca.pem http://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem
```


実行するとエラー

```
cd /greengrass/ggc/core/
sudo ./greengrassd start
Illegal instruction
```

っと、ここで、調べて、ARMv6では動かないことが判明
CorDappsとは？

#目的
Corda V3.2の[ドキュメント](https://docs.corda.net/building-a-cordapp-index.html
)を参照しながら、CorDappsについて理解する。
ドキュメントの内容を日本語で簡単にまとめたもの。

Cordaの概要に関しては[Corda Key concepts](https://qiita.com/lcez1nna/items/d5874277a035b96e71a6)を参照。

#内容
##CorDappsとは？
CorDappsはCorda上で稼働する分散アプリケーションのこと。（コーダップスと呼ぶ）
CorDappsの目的は、台帳の更新を当事者間が合意すること。そのためにフローを定義する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/231906/2cf65687-47d4-2170-d92c-902d765c1ee9.png)
CorDappsは次の主要コンポーネントで構成されている。

+ States
+ Contracts
+ Services
+ Serialisation whitelists

Cordappsはネットワークにデプロイされるのではなく、ノードごとにインストールされる。
例えばノードの所有者は債券CorDappsをインストールするかどうか選択できる。所有者は以下をにインストールするかもしれない。

+ BondState
+ BondContract
+ ３つのフロー
   + IssueBondFlow(債券の発行フロー)
   + TradeBondFlow(債券の交換フロー)
   + ExitBondFlow(債券の償還フロー)

債券のCorDappをインストールすると、ノード所有者は、CorDappで定義されたフローを使用して、債券の発行、販売、交換、償還に関連する台帳の更新に同意することができる。

##CorDappsをコーディング
JavaかKotlinでコーディングする。
CorDappsのコンポーネントはCordaライブラリをsubclassまたはimplementしたJavaクラスの形式をとる。

+ Flows subclass FlowLogic
+ States implement ContractState
+ Contracts implement Contract
+ Services subclass SingletonSerializationToken
+ Serialisation whitelists implement SerializationWhitelist

テスト目的で以下も含まれる

+ APIs and static web content (Cordaのビルトインサーバー)
+ RPC clients(RPC経由でノードとやりとりするプロセスを自動化するプログラム)

テンプレートはそれぞれ以下を参照。

[Java Template](https://github.com/corda/cordapp-template-java)
[Kotlin Template](https://github.com/corda/cordapp-template-kotlin)

#まとめ

今後は実際にサンプルアプリを作成する予定。


#参考文献
https://docs.corda.net/cordapp-overview.html
executeGroovyScript で FlowFile が NULL だった時の対応

# はじめに
今回はマジで備忘録です。
が、だいぶ悩んだのでメモ書きとして残しておきます。
とはいえど、もう少し時間が経ってドキュメントが揃ってきたら大したことではないので不要になるでしょうが…

# executeGroovyScript で FlowFile が NULL だった時どうするのか？
まず executGroovyScript とは Apache NiFi と呼ばれるツールで Groovy を用いた Script を書く時に使う Processor のことです。
詳しくは下記を参照のこと。
[データフローオーケストレーションツールApache NiFiとは？](https://qiita.com/kimutansk/items/a083fc963fbe31068cf8)

私の現場では、ですが以下のように使います。

```
def flowFile = session.get()
if(flowFile != null){
 // なんかの処理
 session.transfer(flowFile, REL_SUCCESS)
}
else {
 session.transfer(flowFile, REL_FAILURE)
}
```

session.get() で FlowFile を取得。そこから値を出したり処理したりします。
ただ動かしてみたところ、渡す元の Processor の値が何も入っていなくても session.get() で受け取る FlowFile は null にはならない様子。
なら null の時のパターンは不要？とも思いましたが何かあっては困る上、参考にするものが少なく確信が得られない以上 null チェックは行うべきかなと。
ということで以下のようにしてテスト。

```
def flowFile = session.get()
flowFile = null
if(flowFile != null){
 // なんかの処理
 session.transfer(flowFile, REL_SUCCESS)
}
else {
 session.transfer(flowFile, REL_FAILURE)
}
```
するとおそらく else 処理が走ったと思われますが今度は以下のエラーが。
<img width="521" alt="スクリーンショット 2018-10-15 23.30.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/269525/6c5bb25e-fe6b-8414-0baf-913f2d8ff6c5.png">
私は英語がからっきしなので chrome 先生に翻訳してもらいましょう。
それが次。
<img width="521" alt="スクリーンショット 2018-10-15 23.30.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/269525/fda2224b-eb23-fba2-0a83-65c8214fe45b.png">
いろいろありますがわかるのは中段のこれ。

```
[null, class org.apache.nifi.processor.Relationship]
```
多分`session.transfer(flowFile, REL_FAILURE)`のことでしょうね。
そりゃ null じゃ動かないよなぁということで google 先生に尋ねてみると出てくるコードは下の感じ。

```
def flowFile = session.get()
if(flowFile == null) return
 // なんかの処理
 session.transfer(flowFile, REL_SUCCESS)
```
`return`とな。ただ指示を出した上の人の言うところ、「例外で落ちた時、failuer にいってくれるのはいいんだけど一々エラーのマーク（下の通り）が出るの気になるからなんとかできない？」とのこと。
<img width="353" alt="スクリーンショット 2018-10-15 23.37.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/269525/b53ca2f1-57af-ea7b-d453-f9f24cfdbc6f.png">
*右上のやつ(というか件数がやばいことに)*

じゃあ確か、FlowFile 作れるのあったなーと思いやってみる。
`def file = session.create()`
が、うまくいかず。何か要素を入れる必要があるのかなと思いやってみるも駄目…っ！！
ちょーっとお手上げだなーと思っていたところ家で調べていたら以下の記事が。
https://stackoverflow.com/questions/44189181/apache-nifi-flowfilehandlingexception-when-transfer-flowfile-in-custom-processo
エラーの内容はちょっと違いますが要約しますと、`session.transfer()` の時の FlowFile が`session.get()`で呼び出したもの以外を使っているからエラーが起きてますよ、という内容。
あれ、ということは `session.create()`も駄目じゃない？（そもそも実行したところクラスが違うっぽいのでそういう問題でもないかも）

# 〆
ということで何故みんな揃って null チェック後は return しているのか。
**→そもそもそんなの想定されていないから executeGroovyScript と NiFi に後処理任せようぜ！**
…ということかなと。
実際想定されないものみたいですし、それはそれでさっさと return してログを見ようぜってことですかね。

英語が駄目だと書いたとおり、記事内の stackoverflow も chrome 翻訳ですし、受け取り方が間違えているなどありましたらコメントいただけると幸いです。
python-docxを使ってdocxファイルを書き換える


# はじめに

毎週作成が必要な週報を自動生成するための検討です。

- 前提
    - 週報はdocxファイルである
    - しかもテンプレートが決まっている
    - 自分以外も更新する
    - 更新した箇所は赤文字にしなければならない

調べたところ、python-docxを使えば、
文字だけ置き換えられることが分かりました。
また、paragraphごとに文字色を変えられることも分かりました。
これなら行けそうです。

```python
paragraph.text = paragraph.text.replace("before","after")
paragraph.runs[0].font.color.rgb = RGBColor(204, 0, 0)
```


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89176/ca12a438-57e0-eec4-8ebf-e457804517c0.png)

# python_docのDocumentの構造

構造を見ると、paragraphはDocument直下にあるだけでなく、tablesの中にもあることが分かり、
すべてのparagraphのtextを置換するためには、それぞれのpragraphを置換する必要があります。

Document直下のparagraph
`document.paragraphs[0].text`

tables内のparagraph
`document.tables[0].rows[0].cells[0].paragraphs[0].text`

また、文字色を設定する場合は`runs[0]`を使います。なぜ`[0]`が付くのかは分かりません。
`paragraph.runs[0].font.color.rgb = RGBColor(204, 0, 0)`


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89176/6d197a9b-d28a-6339-789e-bf4a199a3b43.png)


# 書き換えのサンプルコード

`paragraph`と`tables`しか書き換えしていないので、
それ以外の図形や、ヘッダー・フッターの書き換えも必要であれば
追加の実装が必要です。

```python
from docx import Document
from docx.shared import RGBColor
from docx.enum.text import WD_COLOR_INDEX

def replace_text(paragraph):
    replaced_text = paragraph.text.replace("before","after")
    if paragraph.text != replaced_text:
        paragraph.text = replaced_text
        paragraph.runs[0].font.color.rgb = RGBColor(204, 0, 0)
        paragraph.runs[0].font.highlight_color = WD_COLOR_INDEX.YELLOW

document = Document("original.docx")

for paragraph in document.paragraphs:
    replace_text(paragraph)

paragraphs = (paragraph
              for table in document.tables
              for row in table.rows
              for cell in row.cells
              for paragraph in cell.paragraphs)

for paragraph in paragraphs:
    replace_text(paragraph)

document.save("output_new.docx")
```

以上で置き換え完了です


# 参考

- http://www.tonyballantyne.com/graphs.html
- https://www.robotech-note.com/entry/2018/05/13/Python%E3%81%A7word%2Cdocx%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%82%92%E7%BD%AE%E6%8F%9B%E3%81%99%E3%82%8B%EF%BC%88python-docx%EF%BC%89
SendGridで改行が消えた/増えた場合の対応

# 改行が消えている場合

## 原因

SendGridのデフォルト設定ではプレーンテキストを自動的にHTML化するようになっており、変換時に改行コードが削除されてしまう。

## 対策

SendGridにログインして、「Setting」→「Mail Settings」→「Plain Content」をONにして”INACTIVE”から”ACTIVE”に変更すればプレーンテキストのまま送信するようになる。

# 改行が増えている場合

## 原因

SendGridの設定を変更してプレーンテキストで送信するようにしても、CakePHP3のEmailクラスを利用してメール送信すると1つの改行が2つに増えてしまう事象が発生した。

今回はcharsetを"UTF-8"として送信したいのだが、Emailクラスではcharsetが"UTF-8"の場合にはContent-Transfer-Encodingを"8bit"とするようになっている。

[SendGridのサポートページ](https://support.sendgrid.kke.co.jp/hc/ja/articles/206313205-SMTP%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AB%E6%B0%97%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B-)によると、

>歴史的経緯から、メールサーバの中には7bitエンコードしか扱えないものが存在します。このため、Content-Transfer-Encodingに8bitが指定された場合、SendGrid側で自動的にquoted-printableに変換します。この際、余分な改行が追加される場合があります。

とのことでこちらの事象が発生している。

## 対策

Emailクラス自体には本文のエンコード方法(=Content-Transfer-Encoding)を変更する手段がなさそうなので、[こちら](https://qiita.com/oh-sky/items/a9084001ecb01664e0e0)の記事を参考にbase64でエンコードするクラスを別途用意してそちらを使う事で解決が出来た。
シンボリックリンクのあるディレクトリでgulp watchして痛い目を見たお話

# はじめに

件名通りです。
痛い目を見ないように、備忘録も兼ねて。

# gulp watchでファイルの変更を監視しよう

タイトルのように思った時が私にもありました( ˘ω˘)

watch対象のディレクトリ構成はこちら

```
test
 ├─foo
 |  └─ foo.txt
 |
 ├─bar(fooへのsymlink)
 |
 └─test.txt
```

とってもシンプルな構成です。

# watch開始ッ！

```gulpfile.js
const gulp = require('gulp');

gulp.task('default', () => {
  const watcher = gulp.watch('test/*');
  watcher.on('change', function (event) {
    console.log(event.path);
  })
});
```

これをnpmから起動してtest配下をwatchしてみました。
変更があればパスを表示するだけのはず……！

# test.txtの更新

```console
touch test/test.txt
```

touchコマンドで更新日時を書き換えてみます。
さて、gulpのwatchの結果はというと……


```console
$ gulp
[23:33:48] Starting 'default'...
[23:33:48] Finished 'default' after 7.42 ms
/xxx/test/test.txt
/xxx/test/bar
```

test.txtを更新していないのにbarもconsole.logとして対象に出ているッ！？
今回はconsole.logなんですが、barディレクトリのpathをファイル操作系の関数とかに突っ込んでいたりすると……:ghost:
まぁ、**タイトルが痛い目を見たお話**というところで察して下さい。:innocent:

# 考察:thinking:

gulpは特にバグっていないとして:frowning2:

symlinkのあるディレクトリでファイルを更新すると、symlink側の更新？リンクの再生成か何かが起きる？
そのためにgulpのwatchイベントに引っかかる。

……とかなのだろうか？

このあたり、原因や理由が書かれているドキュメント的なものがあれば欲しい……
どなたかご存知でしたら:sob:
ATOM ショートカットキーの私的まとめ①

これから開発をしていくにあたり、テキストエディタにはATOMを使用する。
その際作業が捗りそうなショートカットキーを、備忘録も兼ねてまとめておく。


| 機能               | ショートカットキー    |
|:------------------|:--------------------|
| 画面を分割する  |  Cmd + K →　両方離して▶︎ |
| 分割画面を行き来する  |  Cmd + K →　Kだけ離して▶︎や◀︎ |
| コマンドパレットを出す | Shift + Cmd + P  |
| ドキュメントを閉じる  | Cmd + W  |
| ツリービューの表示  | Shift + Cmd + ¥  |
| 複数単語にカーソルを当てる  | Cmdを押しながら該当単語をクリック  |
| 同じ単語を選択  | Cmd + D  |
| 同じ単語を選択時にスキップ  | Cmd + K → Kだけ離してD  |
| 一つ前の選択をキャンセル  | Cmd + U  |
| 次の同じ単語を選択  | Cmd + G  |
| 前の同じ単語を選択  | Shift + Cmd + G  |
| 行を選択  | Cmd + L  |
| 行をコメントアウト  | Cmd + /  |
| 選択行の下に行を挿入  | Cmd + return  |
| 選択行の上に行を挿入  | Shift + Cmd + return  |
| 行ごとコピー  | Shift + Cmd + D  |
| プロジェクト内のファイル検索  | Cmd + T  |
| プロジェクト内の単語検索  | Shift + Cmd + F  |

とりあえずこんなところで。
自己発光するオブジェクトのライティングを実装する(4-9. 相当)

# はじめに

点光源、スポットライト光源と実装してきましたが、今回は自己発光するオブジェクトを実装します。
自己発光というのは、太陽や電球などのように、自身で光を発しているため、他に光源がなくても明るく見えるような状態を指します。このような光は放射光(emissive light)と呼ばれています。

![スクリーンショット 2018-10-15 23.14.52.png](https://qiita-image-store.s3.amazonaws.com/0/10332/e6338e1e-5ae7-3a6e-67f3-3064e423d920.png)

放射光はオブジェクトの頂点を法線やライトの向きにかかわらず同じ色で照らすため、放射光だけでオブジェクトをレンダリングした場合には凹凸は表現されず、どの角度から見てものっぺりとした2Dの絵に見えます。

4-4.節で環境光について「この部屋にあるオブジェクトを取り巻く環境光はすべてこの色だということにする」という考え方を説明しました。環境光と放射光はよく似ていますが、環境光はすべてのオブジェクトに対して影響を与える色パラメータであるのに対し、放射光はそのオブジェクトのみに影響を与える色パラメータです。

# 1. 放射光を実装する

放射光の実装はシンプルです。

```cpp:Game.cpp
    ...
    program->SetUniform("emissive_color", GLKVector4Make(0.f, 0.f, 0.4f, 0.f));
    mesh->Draw();

    program->SetUniform("emissive_color", GLKVector4Make(0.f, 0.f, 0.0f, 0.f));
    planeMesh->Draw();
}
```

まずは新しいUniform変数として `emissive_color` を設定します。
放射光はオブジェクト単位で設定するものなので、stanford bunnyは青みのある放射光を設定し、plane objには放射光を設定しないでおきます。uniform変数をそれぞれで設定しないと、前のオブジェクトで用いた放射光が次のオブジェクトで設定されてしまいますので注意してください。

頂点シェーダーも変更していきます。
頂点シェーダーは前回実装したスポットライトのままなので、複数箇所の修正が必要です。

まずはスポットライトの範囲外の色計算からです。
光源の影響を受けないので、影響を受けるのは放射光と環境光だけです。
放射光はそのオブジェクトの表面素材の基本となる色味なので、そのまま足し合わせます。
もし放射光を設定していなければ、ゼロを加算するだけなので、環境光がそのまま適用されることになります。

```glsl:myshader.vsh
        ...
        // out-range
        // attenuation * 0.f;
        color = ambient_color + emissive_color;
        return;
        ...
```

もう1箇所、光のあたっている場合の色計算も修正します。
こちらも同様に放射光の色を足し合わせるだけです。

```glsl:myshader.vsh
    ...
    color = vertex_color * diffuse_color * diffuse_power * attenuation + ambient_color + specular_color * specular + emissive_color;
    ...
```

実行結果は以下のようになりました。

![スクリーンショット 2018-10-15 23.01.31.png](https://qiita-image-store.s3.amazonaws.com/0/10332/8f06b274-4de2-9eb1-2ec1-568e2d3db850.png)

放射光の設定されていないplane objは、スポットライトの範囲外は環境光の色になっていますが、
放射光を設定したstanford bunnyは、全体的に青みがかっています。

※[macOSでOpenGLを勝手に勉強する(目次)](https://qiita.com/uechoco@github/items/655806d9252c035f9efc)

# 参考資料

* [放射光 - UWP app developer | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/uwp/graphics-concepts/emissive-lighting)
* [その７ テクスチャはマテリアルと共に](http://marupeke296.com/FBX_No7_TextureMaterial.html)
Solidityのサンプルコード：簡単な図書館システム

今日、簡単なスマートコントラクトを書きました。:smile:

## コード
```solidity:libraryContract.sol
pragma solidity ^0.4.25;
contract LibraryContract {
  struct Book {
    string title;
    bool isBorrowed;
    address holder;
  }

  Book[] bookCollection;

  function addBook(string _title) public {
    bookCollection.push(Book(_title, false, address(0)));
  }

  function borrowBook(uint _index) public {
    require(!bookCollection[_index].isBorrowed);
    bookCollection[_index].isBorrowed = true;
    bookCollection[_index].holder = msg.sender;
  }

  function returnBook(uint _index) public {
    require(bookCollection[_index].isBorrowed);
    require(bookCollection[_index].holder == msg.sender);
    bookCollection[_index].isBorrowed = false;
    bookCollection[_index].holder = address(0);
  }
  
  function getBookHolder(uint _index) public view returns (address) {
    require(bookCollection[_index].isBorrowed);
    return bookCollection[_index].holder;
  }

  function isBookAvailable(uint _index) public view returns (bool) {
    return !bookCollection[_index].isBorrowed;
  }
}
```
このコードは単純な図書館システム。本を追加したり、借りれたり、返​せたりすることができます。

### スタートとBook(本) struct
```solidity
pragma solidity ^0.4.25;
contract LibraryContract {
  struct Book {
    string title;
    bool isBorrowed;
    address holder;
  }

  Book[] bookCollection;
  ...
}
```
最初の行にSolidityのバージョンを入れます。次の行から最後まで、スマートコントラクトは「LibraryContract」でくくります。次に、「Book」というstructでBook objectとは何かを定義しています。「title」という変数に本の題名を含めています。誰かが本を借りたら、「isBorrowed」という変数はtrueになります。「holder」という変数に本の借人を含めています。そして、「bookCollection」というBook同位列があります。

### 本を付け加えて借りて返​せてにする
```solidity
pragma solidity ^0.4.25;
contract LibraryContract {
  ...
  function addBook(string _title) public {
    bookCollection.push(Book(_title, false, address(0)));
  }

  function borrowBook(uint _index) public {
    require(!bookCollection[_index].isBorrowed);
    bookCollection[_index].isBorrowed = true;
    bookCollection[_index].holder = msg.sender;
  }

  function returnBook(uint _index) public {
    require(bookCollection[_index].isBorrowed);
    require(bookCollection[_index].holder == msg.sender);
    bookCollection[_index].isBorrowed = false;
    bookCollection[_index].holder = address(0);
  }
  ...
}
```
最初の関数で本を加えられます。次の関数で本を借りられます。最後の関数で本を返​せ​ま​す。本を借りられるか返せるかどうかをチェックします。

### 補足
```solidity
pragma solidity ^0.4.25;
contract LibraryContract {
  ...
  function getBookHolder(uint _index) public view returns (address) {
    require(bookCollection[_index].isBorrowed);
    return bookCollection[_index].holder;
  }

  function isBookAvailable(uint _index) public view returns (bool) {
    return !bookCollection[_index].isBorrowed;
  }
}
```
この補足の関数は「本の借人は誰ですか？」と「この本を借りれりますか？」という質問に答えるものです。

[EthFiddle](https://ethfiddle.com/7yZEHWNVXd)でこのコードを見ることもできます。:grinning: