OmniAICreator/Qiita-1.07M huggingface dataset:
SQS + Lambdaをやってみた

[2021-07-10追記]
本記事はSQS標準キューについての記述である。
SQS FIFOキューの場合は、Lambdaの最大並列実行数はMessage Groupの数となる。
>Total concurrency is equal to or less than the number of unique MessageGroupIds in the SQS FIFO queue. 
https://aws.amazon.com/jp/blogs/compute/new-for-aws-lambda-sqs-fifo-as-an-event-source/

[2021-07-22追記]
SQS FIFOキューはexactly onceの配信を保証しているが、Lambda関数は2回以上起動されても問題ないことが求められる。
>However, it does not guarantee only once delivery when used as a Lambda trigger. If only once delivery is important in your serverless application, it’s recommended to make your function idempotent. 
>https://aws.amazon.com/jp/blogs/compute/new-for-aws-lambda-sqs-fifo-as-an-event-source/


https://stackoverflow.com/questions/62364409/sqs-fifo-queues-not-ensuring-single-time-delivery-when-used-as-lambda-trigger

[2024-05-02追記]
アップデートにより、イベントソースマッピングで最大同時実行数（max concurrency）を設定できるようになった。これならスロットリングが発生せず扱いやすい。しかしなぜか設定可能な値は２〜1000となっており、１には設定できない。いつもながらAWSは痒いところに手が届かず手間ばかりかかって使いづらい。
https://www.skyarch.net/blog/lambda%E6%96%B0%E6%A9%9F%E8%83%BD-amazon-sqs%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AB%E3%82%88%E3%82%8B%E5%90%8C%E6%99%82%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%AE/

---



LambdaのトリガーとしてSQSを指定できるのでやってみた。

# 実験してみた結果

- キューにメッセージが入るとほぼ瞬時にLambdaが実行される
    - [By default, Lambda invokes your function as soon as records are available in the SQS queue. ](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-scaling)
- [Lambda 関数を同期的に呼び出します](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-sqs.html)
- Lambdaが実行されると、メッセージは自動的にキューから削除される。自分で削除する必要はない。
- メッセージのbodyはLambdaのeventに入ってくるので、自分でReceiveMessageする必要がない。
- エラーが起きた場合
    - デッドレターキューが無い場合は、メッセージの保持期限が切れるまでリトライされる
        - リトライ回数は[Amazon SQS がメッセージを保持する秒数(MessageRetentionPeriod)](https://dev.classmethod.jp/cloud/aws/lambda-sqs-retry/)で決まる
        - リトライ間隔は可視性タイムアウト（`VisibilityTimeout`）で決まる
    - デッドレターキューがある場合は、自分で決めた最大受信回数だけリトライされ、その後デッドレターキューに入る
    - 可視性タイムアウトを5分、最大受信回数を1回にした場合、Lambdaが1回呼び出された後5分経過してからデッドレターキューに入った
- Lambda関数に同時実行数が設定してある場合は、ちゃんとその数を保ったまま、すべてのメッセージが順次処理される
- 同時実行数を制限しつつ、適度なリトライ回数を設定するのが難しい
    - 同時実行数はちゃんと設定できるのだが、それにひっかかった場合すぐにリトライが行われ、キューの「最大受信数」（1つのメッセージを何回リトライ受信することを許すか）にひっかかってすぐにデッドレターキューに入ってしまうらしい
    - 可視性タイムアウトは30秒にしていたが、30秒も待たずにすぐリトライが行われていた
- 結論として、**LambdaのトリガーとしてSQSを指定するのは、Lambdaの同時実行数を気にする場合は使いづらい**と思った
- 基本的に**SQSの標準キューは順番も保証せず、1つのメッセージが2回以上配信されることもあるのでLambda関数には冪等性が必要になる**
    - https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html
    - FIFOキューなら順番も保証され、1つのメッセージが配信されるのはちょうど1回であることが保証される
    - [2021-01-15追記]可視性タイムアウトを0秒、Lambdaで3秒かかるように設定したら1つのメッセージが2回以上配信されるかと思ったが、予想と異なり1回しか配信されなかった。
   - （[通常、可視性タイムアウトは、アプリケーションがキューのメッセージを処理して削除するまでの最大所要時間に設定します。](https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html)）

# 参考

>キューから読み取るイベントソースマッピングについては、ソースキューの再試行ポリシーおよび可視性タイムアウトを設定することで、失敗したイベントの送信先と再試行の間の時間の長さを決定します。
>https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/retries-on-errors.html

[LambdaのリトライをAWS SQSを使ってやってみる ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/lambda-sqs-retry/)
PHP 文字列 1文字ずつ大文字にして取得する 

<h1>今回挑戦するプログラミング問題</h1>

codewars 6級
「Mexican Wave」


<h1>実現したいこと</h1>

```
wave("hello") => ["Hello", "hEllo", "heLlo", "helLo", "hellO"]
```
受け取った文字列を左から順に大文字へ変換していきたい。


<h1>コーディング</h1>
```
function wave($hello){
  for($i = 0, $res = []; $i < strlen($hello); $i++) {
    if($hello[$i] !== " ") {
      $res[] = substr_replace($hello, strtoupper($hello[$i]), $i, 1);
    }
  }return $res;
}
```
+ 文字の数だけfor文で回す
+ 新しい配列を用意して値を入れていく
+ substr_replace(置換したい文字列, 置換後の文字列, 開始位置, 置換する長さ)
+ 置換する長さは1つで固定しつつ、開始位置をfor文でズラして取得
R言語でランダムに結果を取得する

# 概要
R言語でランダムな結果を取得するための関数sampleの使い方

# 解説
以下のR言語のコードでランダムにTRUE、FALSEを1つだけ取得できます。

``` R
# 以下の結果は実行するごとに変わります
> x <- c(TRUE, FALSE) # 母集団
> sample(x, size = 1)
[1] TRUE
```

続けてsample関数を呼ぶとsample関数で出力される結果がランダムに変化しているのがわかります。

``` R
# 以下の結果は実行するごとに変わります
> sample(x, size = 1)
[1] TRUE
> sample(x, size = 1)
[1] FALSE
> sample(x, size = 1)
[1] FALSE
> sample(x, size = 1)
[1] FALSE
```

第1引数として渡す母集団の要素数を3つ以上にすることもできます。

``` R
# 以下の結果は実行するごとに変わります
> x <- c("大吉", "中吉", "小吉", "凶", "大凶")
> sample(x, size = 1)
[1] "小吉"
> sample(x, size = 1)
[1] "大吉"
> sample(x, size = 1)
[1] "凶"
```

sizeを2以上にすることで連続して結果を取得できます。このとき、sample関数の引数としてreplaceをFALSE(デフォルト値)にしている場合は、一度取得した結果は再度取得されません。

``` R
# 以下の結果は実行するごとに変わります
> x <- c("大吉", "中吉", "小吉", "凶", "大凶")
> sample(x, size = 2)
[1] "大吉" "大凶" # 2回目の出力では"大吉"は選ばれない
> sample(x, size = 3)
[1] "中吉" "大吉" "大凶"
> sample(x, size = 5)
[1] "凶"   "大凶" "中吉" "大吉" "小吉" # 毎回異なる結果が出力される

# replace = FALSEで母集団の要素数を超えるsizeを指定するとエラー
> sample(x, size = 6)
 sample.int(length(x), size, replace, prob) でエラー: 
   'replace = FALSE' なので、母集団以上の大きさの標本は取ることができません

# replaceをTRUEにすると毎回母集団の全ての要素からいずれかの結果を取得する
> sample(x, size = 10, replace = TRUE)
[1] "中吉" "中吉" "小吉" "小吉" "小吉" "小吉" "凶"   "凶"   "小吉" "中吉"
```

また、sample関数の引数としてprobを指定すると各値が出力される確率を指定できます。

``` R
# 以下の結果は実行するごとに変わります
> x <- c("あたり", "はずれ")
# 20%の確率で"あたり"、80%の確率で"はずれ"を出力
> sample(x, size = 5, replace = TRUE, prob = c(0.2, 0.8))
[1] "はずれ" "はずれ" "はずれ" "はずれ" "はずれ"
> sample(x, size = 5, replace = TRUE, prob = c(0.2, 0.8))
[1] "はずれ" "はずれ" "はずれ" "あたり" "あたり"
> sample(x, size = 5, replace = TRUE, prob = c(0.2, 0.8))
[1] "あたり" "はずれ" "はずれ" "はずれ" "はずれ"

# 母集団と指定した確率の個数が一致しない場合はエラー
> sample(x, size = 5, replace = TRUE, prob = c(0.2))
 sample.int(length(x), size, replace, prob) でエラー: 
   確率値の個数が正しくありません 
```
HTTPSの時だけツイッターカード(Twitter Card)が表示されない時

## はじめに
ツイッターカードでWEBページを表示できるようにしようとした際、HTTPのURLの場合は
問題なく表示されたが、HTTPSのURLになると正しく表示されなかったので、参考サイトを調べたが
日本語の参考サイトがあまり見つからなかったので投稿

※ツイッターカードとは、URLをツイートした際にそのツイートに、設定した画像とサイト紹介が一緒に
表示される機能

■Card validator
https://cards-dev.twitter.com/validator
このサイトにツイッターカードの表示を確認したいURLを入力すると
表示を確認できる


## まずはSSL中間証明書を疑ってみる。
下記サイトによると、中間証明書が正しく設置されていないと発生する模様
https://www.nishishi.com/blog/2017/11/sakura_twitter.html

■SSL Certificate Checker
https://www.digicert.com/help/
こちらを使って証明書が正しいか確認してみる。
ただしくインストールされていない旨の警告が出た場合、恐らく中間証明書が
原因で表示されていないと考えられる。
(自分の場合はここで警告が出た)

警告が出た場合は、
１、そもそも中間証明書を設置していない場合は設置する。
２、サーバに正しく設置しているのにエラーになる場合は、CDNやLBを経由していないか確認し、
　経由している場合はCDNやLBに正しく中間証明書が設置されているか確認する。
　(自分はサーバには正しく証明書を設置していたが、サイトがCDNを経由しており、CDNに中間証明書
　を設置し忘れていたために警告がでていた。)

## 中間証明書は正しく設置されていたが表示されない時
SSLProtocol
SSLCipherSuite
の設定が古いプロトコルや古いアルゴリズムしか受け付けない設定になっていると
発生する模様(下記サイト参考)
https://www.karhu.co.jp/blog/2018/12/https%EF%BC%88ssl%E3%81%A0%E3%81%A8twitter%E3%82%AB%E3%83%BC%E3%83%89%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C/
(ただし、どこまで古いと表示されないのかは不明)

とりあえずこの設定なら問題なかった
```SSLProtocol -All +TLSv1 +TLSv1.1 +TLSv1.2
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA```

## おわりに
Linuxの勉強をはじめて1年経つので、はじめてQiitaに記事を投稿してみました。
これからちょくちょく投稿していこうと思います。
Phoenixを触ってみる その９

https://hexdocs.pm/phoenix/templates.html

今回はtemplate。
だいぶ前回と被るので、短いです。

# Template

今までも出てきたeexのこと。
単純な変数埋め込みや関数呼び出しは前回出ましたね。

## 繰り返し

``` templates/page/index.eex
  <%= for key <- connection_keys(@conn) do %>
    <p><%= key %></p>
  <% end %>
```

こんな感じで繰り返しが可能。
注意したいのは、key参照時に"@"がついていないこと。
どうやら以下っぽい。

- reder時に渡された変数への参照 -> @をつける
- template内で宣言された変数への参照 -> @不要

## rendering chain

``` templates/page/index.eex
  <%= for key <- connection_keys(@conn) do %>
    <p><%= render(HelloWeb.SharedView, "key.html", key: key) %></p>
  <% end %>
```

template内から他のtemplateをrender出来る。
前回の説明通り、単なるマークアップの埋め込みではなく、Viewの1関数としてのtemplateを埋め込める。
関数呼び出しなので、呼び出し元と呼び出された側でちゃんとスコープが分かれているのも良いポイント。

呼び出すtemplateは同一Viewに限らず、別Viewも可能。（同一Viewなら第1引数は省略可能
なので共通パーツとしてのView+eexを用意することも出来る（Layoutがこれに該当するか）


これ、だいぶ便利そうなのだが実際どのレベルでtemplateって分けてるんだろう。
jsの世界ではatomic designとかあったりするけど、同じ考え方をしたほうがよいのだろうか・・・？
zsh-syntax-highlighting をカスタマイズする

## はじめに
いきなりですが、zshを使っていますでしょうか。
zshはスクリプト言語としての十分な性能と、強力な補完機能を備えたshellです。
zshの設定ファイルである.zshrcをゴリゴリ設定しなくとも、その協力な機能を享受することは可能です
**が！！！**
生活のほとんどをターミナル(shell)と共にするエンジニアにとって、見た目をカスタマイズしたいとお思いのエンジニアは多いハズ！
そこで、本記事ではzshのコマンドラインを華やかにしてくれるsyntax-highlightingプラグインを利用し、自身の好みに合わせた見た目を実現する方法を紹介したいと思います。

## 本編
うちのブログに移転しましたmm
[aintek.xyz/customize-zsh-syntax-highlighting](https://www.aintek.xyz/posts/customize-zsh-syntax-highlighting)
出身国のフォームの際に必要な国のリスト

Webサイトを作るときに
会員の登録で出身国を登録する時に
国名と整数？が対応したリストが必要なはず。

そのリストを表示しているサイトがあったのでシェア
https://help.surveymonkey.com/articles/ja/kb/Do-you-have-a-list-of-countries
GradleでNexus Repository Managerに作ったリポジトリをアップロードする

```
apply plugin: 'maven-publish'
```
でプラグインを追加して

```
publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
            artifact sourceJar {
                classifier 'sources'
            }
        }
    }
    repositories {
        def properties = new Properties()
        file('secret.properties').withInputStream { properties.load(it) }
        maven {
            url properties.getProperty 'url'
            credentials {
                username = properties.getProperty 'username' 
                password = properties.getProperty 'password' 
            }
        }
    }
}
```
これをbuild.gradleに追加します
こうすると、secret.propertiesからユーザー名・パスワード・URLを読み込んでpublishできるようになります

```
username=ユーザー名
password=パスワード
url=URL
```

URLに関してですが、
設定からリポジトリを選択して、URLが書かれてると思うのでそれをコピペしてください。
![Screenshot_20190216_212304.png](https://qiita-image-store.s3.amazonaws.com/0/361412/83237894-8e4f-8cea-777a-603fabcfc14e.png)
上の画像のURL(黒く塗りつぶされてるのがあるやつです)

```
gradle publish
```
でエラーが出なかったら成功です。
Gitとかでやってるときはくれぐれもsecret.propertiesをアップロードしないように、.gitignoreに加えておいてください。
環境変数とかから読み込むようにするのも良いかと思います
最近見かけたイケてないコード

クラウドなサービスの申し込み内容に応じて、何営業日先がサービスの開始見込みか表示するための関数を以下の仕様で作るとしよう。

リージョン：東と西のいずれか、または両方を利用可
オプション：各リージョンに2種類(AとB)を任意で付加することができる

|No.|東              |西              |開始見込み|
|--:|:---------------|:---------------|---------:|
|  1|利用(ABとも付加)|利用(ABとも付加)|7営業日先 |
|  2|利用(ABとも付加)|利用(Aのみ付加) |7営業日先 |
|  3|利用(Aのみ付加) |利用(ABとも付加)|7営業日先 |
|  4|利用(Aのみ付加) |利用(Aのみ付加) |5営業日先 |
|  5|利用(ABとも付加)|利用(Bのみ付加) |7営業日先 |
|  6|利用(Aのみ付加) |利用(Bのみ付加) |5営業日先 |
|  7|利用(ABとも付加)|利用(付加なし)  |7営業日先 |
|  8|利用(Aのみ付加) |利用(付加なし)  |5営業日先 |
|  9|利用(Bのみ付加) |利用(ABとも付加)|7営業日先 |
| 10|利用(Bのみ付加) |利用(Aのみ付加) |5営業日先 |
| 11|利用(付加なし)  |利用(ABとも付加)|7営業日先 |
| 12|利用(付加なし)  |利用(Aのみ付加) |5営業日先 |
| 13|利用(Bのみ付加) |利用(Bのみ付加) |3営業日先 |
| 14|利用(Bのみ付加) |利用(付加なし)  |3営業日先 |
| 15|利用(付加なし)  |利用(Bのみ付加) |3営業日先 |
| 16|利用(付加なし)  |利用(付加なし)  |1営業日先 |
| 17|利用(ABとも付加)|利用なし        |7営業日先 |
| 18|利用(Aのみ付加) |利用なし        |5営業日先 |
| 19|利用(Bのみ付加) |利用なし        |3営業日先 |
| 20|利用(付加なし)  |利用なし        |1営業日先 |
| 21|利用なし        |利用(ABとも付加)|7営業日先 |
| 22|利用なし        |利用(Aのみ付加) |5営業日先 |
| 23|利用なし        |利用(Bのみ付加) |3営業日先 |
| 24|利用なし        |利用(付加なし)  |1営業日先 |

ちなみに、表題の「最近見かけたイケてないコード」では、if文を若干グルーピングしてはいたものの、パターンの数だけ即値をreturnしていた。
**※Magic Number 使ってる悪い子はいねがぁっっ**

さて皆さんならどんなコードを書きます?
【続く】
PowerApps のアプリにバーコード読み取り機能を追加する

[PowerApps の処理を Flow で記述する](https://qiita.com/afujie/items/f9a6e1d291b183c45ede) の続きです。
前回、作成したアプリは一覧で座席を選んで詳細画面を表示し、編集画面に遷移して人の指定として名前やメールアドレスを入力する必要がありました。
今回、フリー アドレスの席に用意したQRコードをスマートフォンでスキャンして簡単に座った位置を登録する想定です。

# これまでの構成

座席表のレイアウト表示は、Power BIを使用しました。
座席情報は、SharePoint Onlineリストを使用しました。
座席情報の登録は、PowerAppsのウィザードで作ったアプリを使用しました。
複雑な登録処理は、 Microsoft Flow で記述して PowerApps から呼び出しました。

# 今回の構成

PowerApps には、iOS や Android で使えるバーコード スキャナーが用意されています。
これを活用して座席位置を入力します。人の指定は、アプリを使用しているユーザーの情報を使って自動に行います。
登録処理は、前回 Microsoft Flow で作成したフローを使用します。

# 手順

1. PowerAppsにバーコード スキャナーを追加
    1. PowerAppsでアプリの編集画面を表示
    2. 左側の画面ペインの[BrowseScreenFloow]をクリックして一覧画面を表示
    3. [挿入]-[メディア]-[バーコード スキャナー]の順にクリック
    4. 追加された[BarcodeScanner1]を適切な位置に移動
    
    　　<img width="200" alt="スクリーンショット 2019-02-16 20.30.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/184453/22978b07-a21a-2a2d-b1d8-cc4b0909ef91.png">

2. スキャンしたら登録処理を呼び出す
    1. [BarcodeScanner1]をクリックして選択
    2. 数式バーで[OnScan]の数式でフローを呼び出す

    ```:OnScan
    'PowerApp->複数の項目の取得'.Run(User().Email, BarcodeScanner1.Value);Refresh(Floor)  
    ```

3. 座席バーコード以外のエラー処理を追加
    1. 数式バーで[OnScan]の数式を変更

    ```:OnScan
    If (IsMatch(BarcodeScanner1.Value, "DESK[1-2]-[A-B][1-4]"), 'PowerApp->複数の項目の取得'.Run(User().Email, BarcodeScanner1.Value);Refresh(Floor), Notify("NG: " & BarcodeScanner1.Value, NotificationType.Error))
    ```

# 今回わかったこと

* PowerApps
    * バーコード スキャナーの読み取り処理は、OnScan
    * バーコード スキャナーで読み取った値の Value (間違えて Text を見てしまい少しハマった。Text はボタンに表示される文字の指定)
    * User()関数で、利用者のユーザー情報が取得できる
    * If も関数。If(条件, 真式, 偽式)
    * テキストのパターン マッチは、IsMatch()関数
    * IsMatch()関数は正規表現が使える
    * エラー メッセージに Notify()関数が手軽に使える。バナー メッセージがiPhone X の画面上部の切り欠きに被って使い勝手がいまいち。
ローカル開発環境をhttpsで閲覧する

わざわざ開発環境にあげてとか、オレオレ認証でとかが面倒な場合でもhttpsで通信してちょっと確認したいことありますよね？
若干力技ではありますが、[tunnels](https://github.com/jugyo/tunnels)というgemを使って接続する方法をご紹介します。  

# 前提
- Rubyをローカルに入れておく  
- ローカルサーバーは立ち上がっている

# tunnelsインストール
```
$ gem install tunnels
```

# httpsからhttpへプロキシさせる
※ ローカルサーバーのportが3000で立ち上がっている場合です。  

```
$ sudo tunnels localhost:443 localhost:3000
```

# ブラウザで確認
https://localhost
=> 当然「保護されていない通信」となるが、ローカルでの確認であれば問題ないかと  

# 補足
サンプルとして`localhost:443`を指定しましたが、当然ローカルマシンのプライベートIPを指定することもできます。
その場合は↓の具合です。

```
$ sudo tunnels 192.168.XXX.XXX:443 localhost:3000
```
同じwifi内にスマホの実機があるなら`https://192.168.XXX.XXX`でアクセスすることができるので必要な場合はお試しください。
React Navigationを使うときのSafeAreaViewを整える

# はじめに

React NativeのコンポーネントがiPhone Xの画面端にかぶってしまわないように、React NativeにはSafeAreaViewというコンポーネントが提供されていますよね。
https://facebook.github.io/react-native/docs/safeareaview

一方、RN用のナビゲーションライブラリであるReact NavigationはSafeAreaViewを内蔵しており、StackNavigatorのヘッダー上端やBottomTabNavigatorのタブバー下端に対して、iPhone Xならば自動的に余白を加えるようになっています。
https://reactnavigation.org/docs/en/handling-iphonex.html

<img width="250" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/188748/9cb4f154-2a2a-fb6f-72a4-7e4e76d1ff45.png">

# 課題

StackNavigatorとBottomTabNavigatorを両方使うアプリなら問題ないですが、片方しか使わないアプリだと課題が残ります。例えばStackNavigatorだけを使うアプリだと、以下の様に下端はかぶってしまいます。

<img width="300" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/188748/cddf169a-8f7f-3a91-002b-5d6a904f9ea5.png">

# 解決案

Navigatorが表示する各画面をSafeAreaViewで囲む案もありますが、全画面にそれをやるのは面倒です。
かといってアプリ全体をSafeAreaViewで囲むと、今度は上端の余白が二重になってしまいます。

```jsx:アプリ全体をSafeAreaViewで囲んでみる
const AppNavigator = createStackNavigator(...)
const AppContainer = createAppContainer(AppNavigator)

const App = () => (
  <SafeAreaView style={{ flex: 1 }}>
    <AppContainer />
  </SafeAreaView>
)
```

<img width="300" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/188748/ccc6d012-32f4-13c9-13e1-2dea75794106.png">

そこで以下の様に、SafeAreaViewで囲むのではなく、末尾に挿入という使い方をします。こうすると、下端にだけSafeAreaViewを効かせることができます。

```jsx:SafeAreaViewを末尾に置いてみる
const App = () => (
  <View style={{ flex: 1 }}>
    <AppContainer />
    <SafeAreaView />
  </View>
)
```

<img width="300" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/188748/cc99b6a8-8d39-17be-5efb-c21250794101.png">

SafeAreaViewの背景色をコンテンツ部分と同じ色にしても良いでしょう。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/188748/a5eeb1dd-cfc8-020a-846b-f63f2ae789e2.png">

# まとめ

SafeAreaViewで囲むのではなく、空要素として端っこに置くことで、React Navigationとうまく共存させることができました。
Vue.jsについて

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/af2074ac-ce08-fe41-2f0f-c484b19f8c75.png)
猫本まとめ
個人的に知りたい部分について
アウトラインレベル

## Vue.jsとは
JavaScriptのフレームワーク

## 特徴
一般的に言われていること

- 学習コストの低さ
  - ある特定の部分に対してだけ機能を使いたいとなった時、その使い方だけ知れば実現できるという意味において言っていると思う(CDNなどで)
- スケールの柔軟性
  - CDNとしてライブラリ的に使うことも、Vue CLIなどでフレームワーク的に拡張性があるように使うことも可能である事を言っていると思う
- 日本語ドキュメントの充実
  - 日本では流行
  - 現時点で世界的シェアはReactの方が倍以上ではある

## 使い方
大きく分けて2つある

- CDN  
  - ライブラリ的な使い方
  - jQueryとかと同じようなイメージ

- Vue CLI
  - フレームワーク的な使い方
  - ある程度全体構成を意識する必要があるイメージ

## 考え方
Vueを理解する上で重要な考え方

### データ駆動
**構造の本体はDOMではなくJavaScriptのデータ**ということ
データありきで、データに適したDOMを構築するという思想設計になっている

### コンポーネント指向
機能ごとにHTML、CSS、JavaScriptを1つのセットとして分離し、開発する仕組みや考え方

### インタラクティブ
インタラクティブなUIを構築するためのJavaScriptフレームワークというような文脈で表現される

簡単にいうと触れば動く(意訳すると対話的なので話しかければ応答する)のような感じだと思う＝画面がイケてますよ

## 用語
文脈次第で概念的なものを指すことと、Vueのある特定の技術を指すことができる用語。

### コンポーネント
サイトUI構成レベルの1部品
`Vue.component({`

### テンプレート
DOMを構築する前のHTMLベースの表記形式
`template:`、 `<template>`

### データバインディング
データと描画を同期させる仕組みのこと
htmlベースのファイルに.vueで定義した値を出力すること

### ディレクティブ
HTMLタグに混在させられるVue用の属性のこと
`v-なんか`

### 単一ファイルコンポーネント
HTML、CSS、 JavaScriptを1つにまとめたファイル
.vue拡張子のファイル

## 頻出構成要素
### Vuex
複数のコンポーネントでデータを共有したり、アプリケーション全体の状態を一元管理する**状態管理用**のライブラリ

### Vue Router
コンポーネントで構造化された複数の画面をURLと紐付ける、SPA構築のための**ルーティング用**のライブラリ

### Vue CLI
ある程度複雑さや規模が大きくなる想定で、ツールやライブラリの構築、ビルドのサポートをしてくれるもの

### webpack
Vue CLIによって作られた雛形構成のファイル群を、依存状況を解決しながら1つのファイルにまとめるためのツール名
バンドルツール

### Element
パブリックなUIコンポーネント集

## 書籍情報
mio, 基礎から学ぶ Vue.js 
https://amzn.to/2GuqPKh

## 雑感
開発時は人にとって効率的な形に(ファイルや構造を分けつつ)、
最終的に動く時はシステムとして効率的な形に(1枚のHTMLとJSに集約される)というのがよく考えられているなという感じ。
ひとまず最小構成で作ってみる
XSLT でxmlからxml作成 変数宣言の方法

前回の記事の続き今回は変数宣言について
https://qiita.com/snowp/items/9b34bd3b8f565db29132


# 変数宣言
以下のように xsl:variableで宣言を行う。

`<xsl:variable name="price" select="500"/>`

nameでのちに参照するときの名称を、selectで値を設定する。
変換もとの値をxpathなどで取得できるならxpathを指定する。

`<xsl:variable name="price" select="/aaa/bbb/rc[2]/text()"/>`

select内にはsumやconcatなどの関数を記載することができるので以下のように合計値の出力をさせることもできる。

```
<!-- 数値の合算 -->
<xsl:variable name="price" select="500"/>
<xsl:variable name="tax" select="40"/>
<xsl:variable name="totalPrice" select="sum($price,$tax)"/>

<!-- 文字列の結合 -->
<xsl:variable name="firstname" select="花子"/>
<xsl:variable name="lastname" select="山田"/>
<xsl:variable name="fullName" select="contain($firstname,$lastname)"/>


```

変数を宣言するときに中で条件を分岐させることもできる。

```
<xsl:variable name="signatureComment">
	<xsl:choose>
		<xsl:when test="$totalPrice<100000">
                    <xsl:value-of select="サイン不要"/>
		</xsl:when>
		<xsl:when test="$totalPrice<500000">
			<xsl:value-of select="サイン必要"/>
		</xsl:when>
		<xsl:otherwise>
			<xsl:value-of select="責任者の確認要"/>
		</xsl:otherwise >
	</xsl:choose>
</xsl:variable>
```

条件に応じて処理を分けたり出力するときにあくまで出力する内容が変わるだけの時は、
変数宣言時に中で分岐を行うことで後続の処理でif文のブロックを作らないで済む。

条件によって出力する部分を変数ないで分けずに出力時に分けた場合
同じ処理を複数記述することになってしまうので処理が見づらくなる可能性がある。
Project Euler 問題6 「100以下の整数の二乗の和と100以下の整数の和の二乗の差」

## 問題
100以下の整数をそれぞれ二乗した整数の和と、100以下の整数の和を二乗した整数の差を求めよ。
> The sum of the squares of the first ten natural numbers is,
>12 + 22 + ... + 102 = 385
>The square of the sum of the first ten natural numbers is,
>(1 + 2 + ... + 10)2 = 552 = 3025
>Hence the difference between the sum of the squares of the first ten natural >numbers and the square of the sum is 3025 − 385 = 2640.

>Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.

## コード例
```haskell
sumSquareDifference :: Int -> Int 
sumSquareDifference 0 = error"1以上の整数を入力してください."
sumSquareDifference x = sum[ y^2 | y <- [1..x]] - (sum[1..x])^2

sumSquareDifference' :: Int -> Int
sumSquareDifference' 0 = error"1以上の整数を入力してください."
sumSquareDifference' x = sum(map(^2)[1..x]) - (sum[1..x])^2
```
「ハッキング・ラボのつくりかた」体験学習トラブルの記録

# はじめに
「[ハッキング・ラボのつくりかた](https://www.shoeisha.co.jp/book/detail/9784798155302)」で体験学習を行うにあたり、書籍通りに進めずトラブッたことを記録していきます。ゆっくりとした学習ペースですが、本記事がなかなか更新されない場合は、書籍通り順調に学習が進んでいるか、家事育児によるものか、サボリ期間です…

# トラブル目次とトラブル詳細へのリンク
+ [Kali Linuxをダンロードするの項でダウンロードが行えない](https://qiita.com/ss_tom_jp/items/61b6798e90aac4bc6023)
+ [Kaliを起動するの項でKali Linuxが起動しない](https://qiita.com/ss_tom_jp/items/ceaa8c26663e7214db96)
+ [Guest Additionsをインストールする項でCDアイコンがデスクトップに現れない](https://qiita.com/ss_tom_jp/items/3a6f000dab3e762b3ffa)
+ [Virtual Boxマネージャ「IE8-Win7」アイコンに「アクセスできません」が表示されていて起動が行えない](https://qiita.com/ss_tom_jp/items/940a20630990ce93f835)
+ [Metasploit persistence(P259)での「EXE::CUSTOM」誤記について](https://qiita.com/ss_tom_jp/items/fc5d5ddca64e6cb67c21)(2019/02/24現在)

# 参考リンク
「ハッキング・ラボのつくりかた」著者様：[@ipusiron](https://twitter.com/ipusiron)：[FAQ](http://s-akademeia.sakura.ne.jp/main/books/lab/faq.html)

多くのトラブルは、著者様の[FAQ](http://s-akademeia.sakura.ne.jp/main/books/lab/faq.html)にて解決可能かと思いますのでそちらを参照してください。本記事も著者様の[FAQ](http://s-akademeia.sakura.ne.jp/main/books/lab/faq.html)を参考にしながら自身のトラブルを書いていこうと思います。

# 学習環境
|  項目  |  スペックなど  |
| ---- | ---- |
|  書籍版  |  初版第２刷  |
|  PC  |  Lenovo V310  |
|  CPU  |  Intel Corei3-6006U 2.00GHz  |
|  BIOS(UEFI)  |  Phoenix SecureCore Technology |
|  OS  |  Windows10 Home  |
|  メモリ  |  8GB(オンボード4GB + 増設4GB)  |
|  ブラウザ１  |  Microsoft Edge 17.17134  |
|  ブラウザ２  |  Google Chrome 71.0.3578.98  |

# 少しずつですが学習を進めていきます…
responseへのダウンロード処理でエラー画面を表示する


#この記事の概要
javaでファイルダウンロード機能を実装した際にエラーハンドリングで苦労した点を記載する。

　[要点]
　出力ストリームを自動クローズしない
　正常終了時のみクローズする
　キャッチ文でresponseをresetし、クローズしない

#環境
OS:Windows8.1 32bit
eclipse:4.5.2

#エラー画面を表示できないソース
元々のソースではtry-catch-resouses文やfinally句の中でclose処理を記載していた。

```Java

  try {
    // ダウンロード対象ファイルの入力ストリームを取得
　　　　　　　　// responseから出力ストリームを取得
    // 入力ストリームから出力ストリームへ書き込みを行う
  } catch(Exception e) {
    // 例外処理
  } finally {
    // クローズ処理
  }

}

```

このソースでは正常終了する際には問題が無いが、例外発生時にもresponseのクローズ処理をしてしまうため、クライアント側から見て正常でないファイルをダウンロードしてしまうようになっていた。

そのため下記のように修正を行う。


#エラー画面を表示するソース

```Java

  try {
    // ダウンロード対象ファイルの入力ストリームを取得
　　　　　　　　// responseから出力ストリームを取得
    // 入力ストリームから出力ストリームへ書き込みを行う
    // 正常終了時のみクローズ処理
  } catch(Exception e) {
　　　　　　　　// responseのreset処理
    // 例外処理
  } 

}

```

これで正常終了時のみダウンロードされ、例外発生時はエラー画面を表示できる
Nexus Repository Managerをインストールする

#必要なパッケージをインストールする
これはすでに導入済みの場合は問題ありません

```
sudo yum -y install wget vim
```

#Oracle JDK 8をインストールする
OpenJDKでは動きません。
[ここから](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)Oracle JDK 8をダウンロードします。
んで、FTP経由とかで渡すのは面倒くさいので、![Screenshot_20190216_195105.png](https://qiita-image-store.s3.amazonaws.com/0/361412/392487b2-64a8-a9de-7114-95c48b7f8f41.png)こんな感じでブラウザのダウンロード履歴使ってダウンロードした直リンクをコピーします。

```
wget <コピーしたURL> -o JDK-8.rpm
```
でサーバーにダウンロードしたら

```
sudo yum -y localinstall <解凍してできたファイル(rpm)>
```
でインストールします。
#Nexus Repository Managerをインストールする
同じ要領で[ここから](https://www.sonatype.com/download-oss-sonatype)Nexus Repository Managerをダウンロードします。
そしたらtarコマンドで解凍して

```
tar -xvzf ダウンロードしたファイル
```
nexus-<バージョン>フォルダとsonatype-workフォルダができますので、両方とも/opt/ディレクトリ以下に入れます。

```
sudo mv nexus-* /opt/
sudo mv sonatype-work /opt/
```
そしたらnexusユーザーを用意してchownコマンドでディレクトリの所有権を変えます。

```
sudo useradd nexus
sudo chown nexus:nexus -R /opt/nexus-*
sudo chown nexus:nexus -R /opt/sonatype-work
```
そしたら

```
sudo vim /etc/systemd/system/nexus.service
```
で新規ファイルを作成してiキーで挿入モードになったら

```
[Unit]
Description=nexus service
After=network.target

[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/opt/nexus-<バージョン>/bin/nexus start
ExecStop=/opt/nexus-<バージョン>/bin/nexus stop
User=nexus
Restart=on-abort

[Install]
WantedBy=multi-user.target
```

をコピペして終了します(エスケープキーを押した後に:wqと入力してエンターキーを押すとテキストエディタがセーブして終了します。もちろん<バージョン>はダウンロードしたバージョンに置き換えてくださいね！)
んで

```
sudo systemctl daemon-reload
```
でさきほど作った設定ファイルを読み込ませたらまず

```
sudo firewall-cmd --permanent --add-port=8081/tcp
sudo firewall-cmd --reload
```
でファイアーウォールの8081番ポートを開けて

```
sudo systemctl start nexus
sudo systemctl enable nexus
```
でNexus Repository Managerを起動させます(`sudo systemctl enable nexus`でサーバーが起動するとNexus Repository Managerも勝手に起動するようになります)。

```
http://<サーバーのIPアドレス>:8081
```
でアクセスできるか確認してください。
ちなみに最初から管理者のアカウントはすでに用意されていて、ユーザー名はadmin、パスワードはadmin123でログインできます。危険ですのでこのまま使わずに、新しいユーザーをつくるなりパスワード変えるなり必ずしてください。


Nexus Repository Managerは起動に時間がかかることがあるので、つながらなくても少し待ちましょう。
もしそれでもダメならSELinuxが邪魔をしている可能性があります。SELinuxの無効化方法や設定方法はこの記事では説明しません。検索するとすぐでてくると思います。
他にもエラーログとか確認してみてください。
Bootstrap公式ドキュメントを読む前に最低限知っておきたいこと

# 概要

* Bootstrapを使って美的センスのなさをごまかしたい
* 公式ページにある[Starter Template](https://getbootstrap.com/docs/4.3/getting-started/introduction/#starter-template "Starter Template")をカスタマイズしていけば解るだろう
* 公式ドキュメント解らない！

となった経験を踏まえ「これくらい知っておけば公式ドキュメントを読めたのでは？」という項目をまとめました。

# 基本はグリッドシステム
画面を格子状に区切って、そこにパーツを配置していこうというのが、グリッドシステムです。
`<div class="row">`で行を作り、`<div class="col">`で列を作ってグリッドにします。
1行に12の列が含まれると考えます。
<p class="codepen" data-height="300" data-theme-id="0" data-default-tab="result" data-user="sgigagaeru" data-slug-hash="bzQRBW" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="bzQRBW">
  <span>See the Pen <a href="https://codepen.io/sgigagaeru/pen/bzQRBW/">
  bzQRBW</a> by sgigagaeru (<a href="https://codepen.io/sgigagaeru">@sgigagaeru</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# primaryとかsecondaryとかは色のこと
ドキュメントを読んでいくとprimary、secondary、success、danger、warning、info、dark、lightとか出てきます。名前がもっともらしいので、何か意味があるのかと思いましたが、これは色の別名でした。primaryでなくblueでも良かった気がするんだけど。
<p class="codepen" data-height="405" data-theme-id="0" data-default-tab="result" data-user="sgigagaeru" data-slug-hash="KJrqYG" style="height: 405px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="KJrqYG">
  <span>See the Pen <a href="https://codepen.io/sgigagaeru/pen/KJrqYG/">
  KJrqYG</a> by sgigagaeru (<a href="https://codepen.io/sgigagaeru">@sgigagaeru</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# breakpointはレスポンシブデザインに関係がある
ドキュメントを読んでいって`<div class="col-2 mx-2">`なら「2列を使うdivブロックで、左右にマージンを2単位とる」までは理解できたんですが、`<div class="col-2 mx-sm-2">`の`sm`が解らなかった。
クラス名は{property}{sides}-{breakpoint}-{size}なので、`sm`はbreakpointなんですが、それは何なの？

それは画面サイズに関わる指定です。

|breakpoint|画面サイズ|
|:-:|:-:|
|sm|≧576px|
|md|≧768px|
|lg|≧992px|
|xl|≧1200px|

`mx-sm-2`は「画面サイズがsmより(576pxより)大きかったら、左右にマージンを2単位とる」を指定してます。
色々なclassでbreakpointが指定できて、これでレスポンシブデザインを実現します。

# rebootは映画でおなじみ
rebootは知らなくても困らなかったんですが「なんか秘密の呪文があるのかな？」と構えてしまいました。
ブラウザによる違いを吸収するために、かなり多くのタグに対して、CSSが再定義されています。

# これくらいでいかがでしょう？
これくらいの前提知識があれば、公式ドキュメントを読んでいける気がしています。色々やるなかで「これも解らない」ということが出てきたら追記します。

ちなみに公式ドキュメントに挫折した私は「[Bootstrap 4 フロントエンド開発の教科書](https://www.amazon.co.jp/dp/B07GRRVC3M/, "Amazonへのリンクです")」で勉強しました。とても良い本です。皆さんも公式ドキュメントに挫折したり、手元にリファレンスがある方が簡単だと思われたりしたら、御購入をお勧めします。
統計基礎を学ぶ時に見ていた記事リンク集(統計検定2級編)

# 背景
元々、大学で統計について少し学んでいて、機械学習などをやるなら統計を学び直したいなと思い、3年ぶりくらいに統計学の基礎を学び直しました。
統計検定2級、60点合格ラインで67点で合格しました(結構、ギリギリ……)。
勉強時間は60時間くらいです(情けないことにほとんど忘れていた……)。
勉強方法は過去問を解いて、解けないところはどうしてそうなるのかを調べるようにしてました。その中で、まとまっていて良かった記事や説明が丁寧な記事を紹介します。
問題の解き方を知りたい場合は、[統計WEB](https://bellcurve.jp/statistics/)が非常に優秀です。

# おすすめの記事！
[Logics of Blue t検定の考え方](https://logics-of-blue.com/t-test/)
t検定がどういった検定で、t値の数式がなぜこの式なのかが分かります。
また、t検定の種類ごとに考え方が記載されているので、理解度が増します。
かなりおすすめのサイトです。

[Logics of Blue カイ二乗検定](https://logics-of-blue.com/chi-squared-test/)
上記のサイトと同じです。カイ二乗検定がどういった検定で、どういった手順で検定を行うか丁寧に書かれています。

[Nagi Teramoさんのスライド 指数分布とポアソン分布のいけない関係](https://www.slideshare.net/teramonagi/ss-11296227)
(記事ではないのですが)指数分布とポアソン分布の関係について、ぼんやりしていたのですが、「ポアソン分布は回数に、指数分布は時間に注目しており、同じ現象を異なる視点で見ている」と書かれていて、はっとしました。

[アタリマエ！ コイン投げから分かる二項分布。正規分布やポアソン分布との関係性と近似について](https://atarimae.biz/archives/7922)
二項分布と正規分布、ポアソン分布との近似について参考にしました。

[具体例で学ぶ数学 累積分布関数の意味および確率密度関数との関係](https://mathwords.net/ruisekibunpu)
確率密度と累積分布の違いがグラフになっていてイメージしやすかったです。

# おまけ CBT試験の場合の注意点
私は2015-2017年の過去問をやっていたのですが、[この記事](https://www.messyer813.com/entry/2018/11/04/194330)にもあるように古い過去問から出ることが多いのか、あまり見ない問題も多々あった印象です。

私の会場だけかもしれませんが、計算用紙が足りなくなった場合、記載していた用紙と交換してもらう方式だったため途中まで計算していた用紙を持って行かれてしまい、少し慌ててしまいました。
会場内のルールなどはきちんと確認しようと思います……。
Cygwinを指定のフォルダーでエクスプローラーの右クリックで開き

Windowsエクスプローラーでフォルダーを選択して、右クリックで「Open PowerShell Window Here」で開けば、便利なので、いろいろ調べて、以下のRegistry登録スクリプトを見つかりました。
日本語フォルダーも対応しています。


```reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin64_bash]
@="Cygwin Here(&B)"

[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin64_bash\command]
@="C:\\cygwin64\\bin\\mintty.exe --dir \"%1\" -e /bin/xhere /bin/bash"

[HKEY_CLASSES_ROOT\Directory\shell\cygwin64_bash]
@="Cygwin Here(&B)"

[HKEY_CLASSES_ROOT\Directory\shell\cygwin64_bash\command]
@="C:\\cygwin64\\bin\\mintty.exe --dir \"%1\" -e /bin/xhere /bin/bash"

[HKEY_CLASSES_ROOT\Drive\shell\cygwin64_bash]
@="Cygwin Here(&B)"

[HKEY_CLASSES_ROOT\Drive\shell\cygwin64_bash\command]
@="C:\\cygwin64\\bin\\mintty.exe --dir \"%1\" -e /bin/xhere /bin/bash"
```
OneDrive for Businessを利用するアプリ比較

前々から、IE限定アプリだの動作保証はIEだけはやめて、マルチブラウザ対応が推奨されてる。MSは当然だがEdge押し。そんなさなかに話題になった記事が出た。
https://japanese.engadget.com/2019/02/08/internet-explorer-ie/

記事自体は今更な内容なのでいまさら何を、感。しかしOffice365では唯一、「OneDriveをエクスプローラーで開く」という機能だけはIEでないと使えない。と、そこからOneDriveをどのアプリから使うか、について自分なりにまとめてみた。

- ブラウザ利用
- エクスプローラーで開く
- OneDrive同期クライアント
- OneDriveアプリ

1. ブラウザで利用
まんま、ChromeやEdgeなどで利用する。
〇　全部web上で完結するので追加のアプリインストールは一切不要
〇　共有する際の選択肢も豊富で、ファイルの移動・コピーは高速。
×　クライアント上にファイルはないのでファイル編集や保存などはもっさり感。

2. エクスプローラーで開く
ファイル操作用のエクスプローラーで、OneDriveを利用する。
〇　アプリのインストールは不要
〇　ユーザーにもなれたインターフェイス。意外にレスポンス悪くない。
×　Windows+IEでないと使えない。共有操作はあきらめる必要あり。

3. OneDrive同期クライアント
いわゆるレガシーなOneDriveクライアント。365からダウンロードするかProPlusでインストールするアレ。
〇　クライアントにファイルを保存するので高速。勝手に同期してくれる。
〇　フォルダ指定して同期させることも可、同期してないファイルも表示可。
×　全フォルダ同期だとPCのストレージ食いつぶす恐れあり。

4. OneDriveアプリ
ストア版OneDrive（マイクロソフトストア・AppStoreなど）。
〇　ブラウザ版よりもシンプルなインターフェイス
〇　オフラインモードも可
×　Windows版だとフォルダ指定のオフラインモード使えない。（iOS版だとできるのに…）



■まとめ
リテラシーが高い方、PCのスペックに十分余裕があれば、お好きにどうぞといえるのだけど
同期クライアントはあんまりお勧めしづらい。同期できるのだが、理解しているユーザーでないと「便利じゃーん、全部同期しようぜ！」とかやって、PCのストレージを食いつぶしてしまう可能性あり。

後の3つは目的によりけり。基本はブラウザ利用。デバイス選ばないし、いつでもおなじ。
でも、毎回ブラウザ開いててOneDriveのURL開くのって、ちょっとしたことだけど頻度が高いとストレスになる。モバイル使っているユーザーなら、OneDriveアプリ使っていればインターフェイス上の抵抗はすくないはず。
ファイルサーバーメインで使っていると、エクスプローラーで使えると意外とよろこばれる。通常のOffice365利用にIEは、重いしメール書いてて崩れたりするし、ひどいもんなので絶対おすすめしないけど。webストレージになれてたら、この選択しは不要。

というわけで

- 基本はブラウザ利用で
- モバイルで使っているユーザーが多いなら、追加でOneDriveアプリ
- ユーザーにOneDriveへのハードル下げるならとりあえず、さらに追加でエクスプローラーで開くを伝える

ってのが個人的にはおススメです。
Windowsバッチ、Linux Shellで現在の日付をフォーマットする


### Windows batch
```bat
set fdate=%date:~-10,4%%date:~-5,2%%date:~-2,2%
set time2=%time: =0%
set ftime=%time2:~0,2%%time2:~3,2%%time2:~6,2%

echo %fdate%_%ftime%
```

出力：　20190216_192221


### Linux shell
```shell
#!/bin/sh

NOW=`date "+%Y-%m-%d.%H%M%S"`
echo NOW: $NOW

LAST7D=`date --date '7 day ago' +%Y-%m-%d`
echo LAST7D: $LAST7D
```

出力：
NOW: 2019-02-16.192803
LAST7D: 2019-02-09
Python3: reportlab で自動で改ページをする

Ubuntu でライブラリーのインストール方法

```bash
sudo apt install python3-reportlab
```

次のような PDF を作成します。
テーブルが大きくなると改ページをします。
![pdf_feb1601.png](https://qiita-image-store.s3.amazonaws.com/0/179446/28cec708-5b40-4646-e927-f665beaab4b8.png)

```py:table_long.py
#! /usr/bin/python
#
#	table_long.py
#
#					   Feb/16/2019
# ------------------------------------------------------------------
import sys
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.units import mm
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.platypus import Paragraph
from reportlab.platypus import Spacer
# ------------------------------------------------------------------
# [8]:
def pdf_gen_proc(file_pdf,data):
	doc = SimpleDocTemplate(file_pdf,pagesize=A4)
	fontname_g = "HeiseiKakuGo-W5"
	pdfmetrics.registerFont(UnicodeCIDFont(fontname_g))
	elements = []
#
	style = ParagraphStyle(
		name='Normal',
		fontName='HeiseiKakuGo-W5',
		fontSize=20,
	)
#
	elements.append(Paragraph('テスト',style))
	elements.append(Spacer(1,10*mm))
#
	elements.append(Paragraph('Feb/16/2019',style))
	elements.append(Spacer(1,10*mm))
#
	elements.append(Paragraph('おはようございます。',style))
	elements.append(Spacer(1,10*mm))
#
	elements.append(Paragraph('Good Morning',style))
	elements.append(Spacer(1,10*mm))
#
	tt=Table(data)
	tt.setStyle(TableStyle([
		('FONT',(0, 0),(-1, -1),"HeiseiKakuGo-W5",20),
		('GRID',(0, 0),(len(data[0]),len(data)),0.25,colors.black),]))
	elements.append(tt)
#
	elements.append(Spacer(1,10*mm))
	elements.append(Paragraph('終了',style))
	elements.append(Spacer(1,10*mm))
#
	elements.append(Paragraph('The End',style))
	elements.append(Spacer(1,10*mm))
#
	doc.build(elements)
# ------------------------------------------------------------------
# [4]:
def data_gen_proc():
	data = []
#
	for it in range(10):
		jt = it * 10
		unit_a = [jt,"おはよう","aaa","bbb","ccc","ddd"]
		unit_b = [jt + 1,"こんにちは","春","夏","秋","冬"]
		unit_c = [jt + 2,"今晩は","朝","昼","夕","晩"]
		data.append(unit_a)
		data.append(unit_b)
		data.append(unit_c)
#
	return data
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
file_pdf = sys.argv[1]
#
data = data_gen_proc()
pdf_gen_proc(file_pdf,data)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```
コミットしようとしたらMatched one or more prohibited patternsというエラーが出た

# 原因
[こちら](https://qiita.com/pottava/items/4c602c97aacf10c058f1)に詳しく記載されているのですが、git-secretsが原因みたいです。
git-secretsとはAWS が公開しているツールでパスワードなどの秘密情報を誤って 
git リポジトリに commit することを防いでくれるみたいで、防いだ時に出るエラーっぽいです。

```GitError.
[ERROR] Matched one or more prohibited patterns

Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive
 (1)
```

# 解決

自分の場合、以下のファイルをコミットしようとした際にエラーが出ました。
以下のファイルはバリデーションテストのファイルでAWSとは全く関係ありません。
おそらく数字、英語で20文字の文字列がある場合にコミットを防ぐのかな、、、？？

ちょっと詳しく原因はわかりませんでしたが、英語、数字を使わず、
ひらがなで20文字を再現したことでコミットできるようになりました！

<img width="724" alt="スクリーンショット 2019-02-16 19.02.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/331247/524023f9-7330-2a1a-ce68-d42360ea4e84.png">

# 追記

下記コマンドで一時的に回避できるみたいです！！

`git commit --amend -m "新しいメッセージ" --no-verify`
paiza c# 個人用メモ

##はじめに

完全にメモです。
新しい言語に触るとき、paizaでコーディングテストを数回することが多く、どうせなら個人用にメモを取っておこうと書いてます。
今回はc#です。アルゴリズムが整ってないせいだと思いますが（苦笑）、Sランク問題では速度が足りない（タイムオーバー）ことが多かった。
＠問題が分かってしまうようなことは一切記載しないです。

##雛形
```c#
using System;
using System.Linq;
using System.Collections.Generic;

public class PaizaTest{
    public static void Main(){
		// 入力時に空白で区切られた文字列を配列に格納
		// ⇒ 配列に格納された文字をint型に変換
		// ⇒ 変換時にListになるため配列に変換
        var line = Console.ReadLine().Trim().Split(' ').Select(s => int.Parse(s)).ToArray();
        Console.WriteLine();
    }
}
```
コーディングテストの入出力って結構面倒、、、c言語のようなscanfがあればいいんだけどなぁ。
動作速度上げるなら、入出力も自作するべき。(階層の低い方法で)

・標準入力
Console.Read();　　　　　　　　//1文字入力
Console.ReadLine();　　　　　　//1行入力
・標準出力
Console.Write("改行なし a = {0} b = {1} c = {2}", a, b, c);　　　　　//改行なし出力
Console.WriteLine("改行あり a = {0} b = {1} c = {2}", a, b, c);	　　　//改行付き出力

##refキーワード（参照渡し）
```c#
// 呼び出し
Judge(str, ref num);	//呼び出し元にも必要

// 関数
public static void Judge(string str, ref int num){}	
```
※当たり前だが、もともと参照渡しの配列とかには不要

##多次元配列
・1次元配列に変換

```c#
//・2次元配列を1次元にする
int[,] array;
var result = array.Cast<int>();

//・ジャグ配列を1次元にする
int[][] array; 
int[] result = array.SelectMany(x => x).ToArray();
```
ただ、そもそも多次元配列を使うためのコストが非常に高い。速度を早くするためのリファクタをすると結局1次元になってしまう...可読性えぇ（速度をアルゴリズムでなんとか出来ればいいんだが）

・1次元配列を2次元配列のように扱う
-入力

```c#
var list = new List<int>();
        for(int i=0; i<len; i++){
            list.AddRange(Console.ReadLine().Trim().Split(' ').Select(s => int.Parse(s)).ToArray());
        }
        var array = list.ToArray();
```

-使用

```c#
array[h*wLength + w];  // 場合によっては[(h-1)*wLength + (w-1)]
```

##面倒な入力
入力時に空白文字などの区切り文字があればsplitで分けることができるが、連続した文字が来ると面倒。ほんと

他にいいやり方がありそうだが、とりあえずの雛形

・文字列から1文字ずつ取得(正しいか未確認)

```c#
string s;
for (int i = 0; i < str.Length; i++) string s += str.Substring(i, 1);
```


##他
・動作時の型を取得
.GetType())

・linq(メソッド構文)
var count = Line.Count(v => v % 2 == 0);

・絶対値
Math.Abs();

##おわりに
感想程度ですが。
イテレータの最大回数や効率、短い時間でのアルゴリズム・可読性・リファクタ、出力後の動作速度の可視化とかできる競技プログラミングサイトって勉強し始めにはかなり使えると思います。
MacでVirtualboxBoxを使って一時的なWindows環境を構築する

# 目的

MacでWindows環境を使用する方法はいくつかありますが、
ここでは

- Windows10, 8, 7を試用したい
- 使用用途が、ブラウザやアプリのテスト
- ９０日以内に試用が完了する
- サウンドの再生がしたい
- 無料

上記を満たしたい人が対象としてます

## やりかた

### VirtualBoxをインストールする

https://www.virtualbox.org/

### Microsoft公式の仮想マシンをダウンロードして展開する

https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/

### VirtualBoxを開いて展開したファイルをインポートする

VirtualBox -> インポート -> .ovaファイルを選択

### サウンド設定する[^1]

VirtualBox -> MSEdge - Win... を選択 -> 設定 -> オーディオ

- オーディオコントローラーを Intel HD オーディオを選択
- オーディオ出力を有効化
- オーディオ入力を有効化（入力をオンとする場合のみ）

### Windows環境を起動

VirtualBox -> MSEdge - Win... を選択 -> 起動

### Windowsを最新にする

### 完了

## その他

パスワードを忘れた場合は、MS公式のダウンロードリンクに記載されてます。

[^1]: この設定をしないとサウンドが再生されないのでご注意を
EC2で立ち上げたAmazon Linux, Amazon Linux2にmongoDBをインストールする

# はじめに
Amazon LinuxやAmazon Linux2にてmongoDBをインストールするときに詰まったので。

mongoDBの公式リファレンスにしっかり書いてあった。
[Install MongoDB Enterprise on Amazon Linux — MongoDB Manual](https://docs.mongodb.com/manual/tutorial/install-mongodb-enterprise-on-amazon/index.html)

# howto
インスタンスへ接続しシェルを開いた後

##### インスタンスがamazonLinux2の場合
```shell
$ sudo vim /etc/yum.repos.d/mongodb-enterprise.repo
```

```
[mongodb-enterprise]
name=MongoDB Enterprise Repository
baseurl=https://repo.mongodb.com/yum/amazon/2/mongodb-enterprise/4.0/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
```
##### インスタンスがAmazonLinuxの場合

```shell
$ sudo vim /etc/yum.repos.d/mongodb-enterprise.repo
```

```
[mongodb-enterprise]
name=MongoDB Enterprise Repository
baseurl=https://repo.mongodb.com/yum/amazon/2013.03/mongodb-enterprise/4.0/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
```

# 後

```shell
sudo yum install -y mongodb-enterprise
```
Unity+Windows APIで非矩形ウィンドウ

# はじめに
Unityで透過ウィンドウを作る話について、2019年2月8日に @wakagomo さんが [Unity で Windows の透過ウィンドウを作る（操作も透過）](https://qiita.com/wakagomo/items/6e83019481d7cd326e72) という記事を投稿されていました。
それと同様なものを作っていたのですがなかなか記事を書けていなかったため、解説大変ありがたいです。

一方、完全に透過すると今度は操作できなくなってしまいますので、不透明部分なら操作できる方が自然だと付け足した処理がありましたので、コードと要点を投稿しておきます。


# 目的
Unityでもデスクトップマスコットなどで利用できる、枠が無いウィンドウを作りたい。

# 既存手法
Windows Vista 以降でに用意された Desktop Window Manager (DWM) のAPIを用いて、透明に見えるようにはできていた[^1]。

# 課題
* あくまでウィンドウは矩形（四角）で、透明に見える部分も下のウィンドウの操作はできず、不自然に感じられる挙動となっていた。
* WS_EX_TRANSPARENT と WS_EX_LAYERED の拡張スタイルを利用することで操作を透過、すなわち下のウィンドウを操作することも(可能ではある)[^2]。
  * だが、それでは不透明な部分でもクリックできない。
* SetLayeredWindowAttributes() 及び UpdateLayeredWindow() が正攻法だが、DWM に比べて次のような問題がある。
  * 手順が複雑
  * パフォーマンス上、不利
  * 単色での抜きとなると、半透明の表現ができず見た目が劣る

# 提案手法
* マウスカーソル直下1pxの色を調べる
* それが透明か否かで、WS_EX_TRANSPARENT ＋ WS_EX_LAYERED による操作の透過を切り替える

マウスカーソル直下の画素を見る方法については、テラシュールブログの記事[^3]を参考にしました。`ReadPixels` は重そうな印象ですが、そちらで言われているように「1ドット程度なら余裕」と判断しました。

なお、`OnPostRender()` のタイミングで `ReadPixels()` を使うのではUIの描画を拾えないため、コルーチンで`WaitForEndOfFrame()`を利用する形としました。

# コード
@wakagomo さんの[コード](https://gist.github.com/wakagomo/fe74ec4a7b74f2e3299a7f2ecc359722)をフォークして編集した [TransparentWindow.cs](https://gist.github.com/kirurobo/001232ef4ce704e426b6dee84427caf2) をGistに置きました。このコード使用方法も元のものと同様です。

## 使用方法
1. Camera の `Clear Flags` を `Solid Color` にする
2. Camera の `Background` は R,G,B,A すべてを 0 にする（Aを0にするのが大事！）
3. TransparentWindow.cs を適当なオブジェクトにアタッチする

※5/30追記 その他に、Player Settings で Run In Background を有効にしておく必要があります。


# 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58511/f66b4bac-2857-2bf8-e92a-687d1e5eeccb.png)
Unity 5.6.6 で[32ビット実行ファイルとしてビルドしたもの](https://www.kirurobo.com/download/TransparentWindowTest_x86.zip)を置いておきます。

- 右クリックで「Quit」という終了ボタンが出ます
- ドラッグできたりはしません。


透過が自然に動くようになれば、次にはドラッグしたり、大きさを変えたりしたくもなりますね…。

# 応用
というわけで、他にもいろいろ機能を詰め込んだ [UniWinApi](https://github.com/kirurobo/UniWinApiAsset/) というものをGitHubで公開しています。使用例動画が下記です。
[![VRM viewer sample](http://img.youtube.com/vi/EETQxzzv4uY/0.jpg)](http://www.youtube.com/watch?v=EETQxzzv4uY "YouTube : UniWinApi VRM viewer sample")

ただし実験的にいろいろ詰め込んでいる感があるので、安定しない面はあるかと思います。
何かの参考になればと CC0 にしてありますので、どなたかもっといいものを作ってもらえると嬉しいです。


# 参考資料
[^1]: @kirurobo. [Unityからマウスカーソルを操作する](https://qiita.com/kirurobo/items/fb6b39a6097338f02eb4). Qiita. (accessed 2019-02-16)
[^2]: @wakagomo. [Unity で Windows の透過ウィンドウを作る（操作も透過）](https://qiita.com/wakagomo/items/6e83019481d7cd326e72). Qiita. (accessed 2019-02-16)
[^3]: [tsubaki_t1](https://twitter.com/tsubaki_t1). [タップしている画素の色を取得する](http://tsubakit1.hateblo.jp/entry/20131203/1386000440). テラシュールブログ. (accessed 2019-02-16)
2>&1はどういう意味？

コマンド実行の戻り値を変数に代入して、出力したいと思いました。
`` RESULT= `sudo git show hoge 2>&1` ``
`echo $RESULT`


このように書くと、RESULTの中にコマンドの戻り値を「RESULT」という
変数の中に代入し、出力するという意味です。

ただ、「2>&1」の意味が分からなかったので、調べてみました。
下記の意味だそうです。

>コマンドの出力には標準出力と標準エラー出力があり、番号が振られています。 

>1: 標準出力
2: 標準エラー出力

>それぞれを別々のファイルに保存するときには次のようになります。 
Command 1>log.txt 2>errlog.txt 

>コマンドは普通に実行すると標準出力と標準エラー出力はまぜて出力されます。 
それと同じように混ぜてファイルに出力するための方法がご質問の記述です。 
Command >log.txt 2>&1 

ということは、標準出力も標準エラー出力も区別せずに変数にリダイレクトしたい
という意味です。
そもそもその2つが分かれているということを知りませんでした。
上記のコードでは、「標準出力」を「標準エラー出力」にマージするという書き方です。

`VAR=` ``command 2>&1 >/dev/null` ` 
ただ、このようにすることで、標準出力を/dev/nullに捨てることもできるようです。
WordPressの処理フロー

# WordPressの処理フロー
WordPressの処理フローは、MVCとかFluxなどと全然違うみたいなので、ちょっとアウトプットしておきます。

## リクエストパラメーターが全ての起点
WordPressにはMVCで定義するようなルーティングがありません。
MVCだとルーティングを定義する事によりURLとコントローラーを対応させ、コントローラーでデータを取得してビューに表示させます。
WordPressではその仕組みではないので、リクエストのパラメーターからデータの取得・テンプレートの選択を行います。

リクエストがあると、まずパラメーターの解析を始めます。解析されたパラメーターは、WPオブジェクトの$wp->query_varsに格納されます。
WPオブジェクトは、パラメーターの解析だけでなく、WordPressの処理全体のフローも担当してます。

## リクエストパラメーターの意味
$wp->query_vars変数に保存される値ですが、フィルタリングがかかっています。
実はフィルタリングするためのホワイトリストは、以下の二つです。
- $wp->public_query_vars(外部からの入力)
- $wp->private_query_vars(内部からの入力)

ホワイトリストに登録されているキーだけが受け付けられます。
パラメーターを追加したい時(例えば、独自のキーを使いたい時)は、query_varsフィルター、$wp->add_query_var()を利用する事で追加できます。
※今回は追加するところまで経験しなかったので、別記事参考にしてください。

## $wp->public_query_vars(外部からの入力)
$wp->public_query_varsにデフォルトで設定されている基本的なパラメーターの一覧はこちらにあります。
[クエリ変数](https://wpdocs.osdn.jp/WordPress_Query_Vars)

## メインクエリ
メインクエリとは、リクエストに対する検索のことです。
リクエストパラメーターが確定すると、次に出力対象のデータが検索されます。この検索のことをメインクエリと呼びます。

## WP_Queryクラス
WP_Queryクラスは、主に投稿データの問い合わせに利用されるクラスです。
WP_Queryオブジェクトに検索条件を与えて検索すると、SQLの組み立て、DBの問い合わせを行って、結果を返してくれます。
その過程で検索条件を解析した結果をクエリフラグとして保持されます。クエリフラグには、どのタクソノミーのアーカイブ検索なのか？などの情報が判定され保存されます。
メインクエリでは、このクエリフラグを調べて、現在のリクエストがどのページへの問い合わせなのかを確認しています。
[WP_Query](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query)

## テンプレートの階層
データが取得された後は、テンプレートが読み込まれます。
メインクエリが、どのページなのか確認してくれますが、
実際にどのテンプレートを使うか？は、テンプレート選択のルールに従われます。
選択されるテンプレートは階層構造になっており、詳細な方から順番にテンプレートが存在するのか？の確認が行われます。

[テンプレート階層](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E9%9A%8E%E5%B1%A4)

このテンプレート階層を利用する事で、異なるリクエストに対して違うデザインのテンプレートを利用できます。
【R】平均値の差を比較する方法（一元配置分散分析）

# 一元配置分散分析とは

* 3群以上の標本の平均値を比較する時に使われる検定方法。
 * 2群の標本の平均値を比較するのであれば、[t検定](https://qiita.com/nkojima/items/92afdadf772a1b6c82bc)を使える。
 

# テストデータ

* 以下のデータは、[文字列結合の速度比較](https://qiita.com/nkojima/items/0098dccbe4a593bc0306)で得られた、文字列結合の手法ごとの処理時間（ms）となります。
 * plus："+"による文字列結合。
 * concat：String.concat()による文字列結合。
 * builder：StringBuilderを用いた文字列結合。
 * buffer：StringBufferを用いた文字列結合。

```:string_concat.csv
method,time
plus,11729
plus,11563
plus,11592
plus,11639
plus,11575
plus,11688
plus,11603
plus,11597
plus,11651
plus,11575
concat,4985
concat,4994
concat,4977
concat,5011
concat,5043
concat,4992
concat,5113
concat,5088
concat,4979
concat,4998
builder,1
builder,1
builder,1
builder,1
builder,1
builder,1
builder,1
builder,1
builder,2
builder,1
buffer,2
buffer,1
buffer,1
buffer,2
buffer,1
buffer,1
buffer,1
buffer,1
buffer,1
buffer,2
```

# 箱ひげ図の作成

* データの傾向を把握するために、分散分析に先立って箱ひげ図を作成しました。
 * 解析データの都合上仕方がないのですが、箱ひげの"箱"が潰れたようにプロットされてしまいました...

```r:Rのコンソール
> string_concat <- read.table("C:\\string_concat.csv", header=TRUE, encoding="CP932", sep=",")
> boxplot(string_concat$time ~ string_concat$method, ylab="処理時間(ms)", main="文字列結合の手法ごとの処理時間")
```

![anova_boxplot.png](https://qiita-image-store.s3.amazonaws.com/0/312166/a6f29bb7-9160-922a-7086-be79d3736fae.png)


# 一元配置分散分析の実行

* ここでは、等分散性を仮定しない「ウェルチの方法の拡張」を使っています。
 * 等分散性を仮定する場合は、引数として"var.equal=TRUE"を指定します。
* 結果を見ると、p値（p-value）が2.2e-16（※0.01未満）となっているので、「文字列結合の手法によって処理速度が異なる」ということになります。
 * 一般的に、p値が0.05もしくは0.01未満であれば、統計学的に有意差があるとされています。

```r:Rのコンソール
> string_concat <- read.table("C:\\string_concat.csv", header=TRUE, encoding="CP932", sep=",")
> oneway.test(string_concat$time ~ string_concat$method)

        One-way analysis of means (not assuming equal variances)

data:  string_concat$time and string_concat$method
F = 175010, num df = 3.000, denom df = 17.442, p-value < 2.2e-16
```

# 多重比較の実行

* 一元配置分散分析は「n群のデータ全体で、平均値の比較を行う」方法ですが、多重比較を使うと「各群の平均値の比較」を行うことができます。
* 以下は、pairwise.t.test()という関数を使って、bonferroniの方法で多重比較を行っています。
 * Tukeyの方法で多重比較を行う時は、TukeyHSD()という関数を使うそうです。
* 多重比較の結果（※マトリックスになっている部分）は、以下のようになりました。
 * plusは、buffer/builder/concatに対しても有意差が認められた。
 * concatは、buffer/builderに対して有意差が認められた。
 * builderとbufferの間には有意差が認められなかった。


```r:Rのコンソール
> pairwise.t.test(string_concat$time, string_concat$method, p.adj="bonf")

        Pairwise comparisons using t tests with pooled SD 

data:  string_concat$time and string_concat$method 

        buffer builder concat
builder 1      -       -     
concat  <2e-16 <2e-16  -     
plus    <2e-16 <2e-16  <2e-16

P value adjustment method: bonferroni 
```

# 関連URL

* [【R】平均値の差を比較する方法（t検定）](https://qiita.com/nkojima/items/92afdadf772a1b6c82bc)
DeepLearning環境いろんな調査

#DeepLearning利用のための環境調査
DeepLearningを行うためにいろいろな情報を調べてみた
#anaconda
DeepLearningはpythonの環境を切り替えて使用することが多い。
anacondaはそれを簡単にやってくれる。
#boost
C++とpythonの連携などを視野に入れboost+numpyのことも調べてみた。
boostもanacondaでインストールできたぞ。
#python
ひさびさにpythonを仕事で使用。
いつの間にか3.X系が主流になっている感じ。
まぁ2.X系はサポートの期限もあるから仕方ないか。
#nnabla
DeepLearnignの環境としてはnnablaを調べてみた。
ビルドできるところまではいろいろなサイトを参考にいけたけれど、結果的には公式が一番わかりやすかった。
ビルドのためにpythonのパッケージを入れとかないとダメなのは最初に書いてあるのに気付くのが遅かった。
nnablaもanacondaでインストールできたのだが、最新の3.7では入らなかった。
とほほだよまったく。
Golang 無名struct の初期化

# はじめに

Go言語で、無名structを宣言と同時に初期化する構文に出会って混乱したので、備忘録のため以下に整理します。



# 値を指定して初期化

無名structを初期化するときに、値を指定して初期化することができます。

Playgroundのリンク
https://play.golang.org/p/7Ntgq9g_0Dj

Go言語のコード

```go
package main

import (
	"fmt"
)

func main() {
    teststruct := struct {
    	Message string `json:"message"`
    	Number int `json:"number"`
    }{
    	"hello",
    	1,
    }

	fmt.Println(teststruct)
}
```



Printlnで以下が出力されます

```
{Hello 1}
```



`teststruct` 変数に、初期化と同時に無名structを代入しています。該当部分を下に抜粋します。
Messageフィールドには hello という文字列で初期化され、Numberフィールドには1という数値で初期化されます。

```go
    teststruct := struct {
    	Message string `json:"message"`
    	Number int `json:"number"`
    }{
    	"hello",
    	1,
    }
```





# 関数を使用して初期化

関数や式を使用して、フィールドを初期化することもできます

Playgroundのリンク
https://play.golang.org/p/39O1hTC1H4y

Go言語のコード

```go
package main

import (
	"fmt"
)

func main() {
    teststruct := struct {
    	Message string `json:"message"`
    	Number int `json:"number"`
    }{
    	fmt.Sprintf("Hello"),
    	1+1,
    }

	fmt.Println(teststruct)
}
```



Printlnで以下が出力されます

```
{Hello 2}
```



Messageには、`fmt.Sprintf("Hello")`の返り値が代入され、
Numberには `1+1` の結果が代入されています。



# フィールドを明示的に指定

以下のように初期化するフィールドを明示的に指定して初期化することもできます

Playgroundのリンク
https://play.golang.org/p/CprTjrDdIAX

Go言語のコード

```go
package main

import (
	"fmt"
)

func main() {
    teststruct := struct {
    	Message string `json:"message"`
    	Number int `json:"number"`
    }{
    	Message: fmt.Sprintf("Hello"),
    	Number: 1+1,
    }

	fmt.Println(teststruct)
}
```
jenkinsにsudo権限を与える

jenkinsのビルド実行ユーザーは
「jenkins」というユーザーです。
なので、このユーザーにsudo権限を与えてあげます。

コマンド「visudo」で編集可能なファイル「/usr/sbin/visudo」の
中にはこんな記述があります。

> /#includedir /etc/sudoers.d

ですので、このディレクトリ配下にファイルを配置すれば、
自動的に読み込んでくれることが分かります。

> $ cd /etc/sudoers.d

ディレクトリに移動して、

> $ touch jenkins

「jenkins」ファイルを作成します。

> $ vi jenkins

「jenkins」ファイルの中身を編集します。

> jenkins ALL=(ALL) NOPASSWD:ALL

これで、jenkinsユーザーにsudo 権限を与えることができました。