OmniAICreator/Qiita-1.07M huggingface dataset:
Pygameを使ってPongを作った(解説編)

# はじめに
　PongをPythonで前回作ったのですが、説明があまりにも雑だったのでもう少し詳細な説明を行っていきたいと思います。プログラム全体は[前回](https://qiita.com/sekishoku/items/c7c933b0450d0185b6e4)のものを参照してください。説明にあたりいくつか変数名が変わっています。

# Pongで使った関数の簡単な説明
　以下、実行するにあたり

```Python3
import pygame
from pygame.locals import *
import sys
```

を前提とします。

## 基本的な諸々
　最初の１行はおまじないなので気にしなくて良いです。はじめる合図くらいの感覚。2,3行目ではウィンドウの大きさを指定し、変数にウィンドウの情報を格納します。

```Python3
pygame.init()
pygame.display.set_mode((width, height))
screen = pygame.display.get_surface()
```

ちなみに終わるときのおまじないは

```Python3
pygame.quit()
sys.exit()
```

　スクリーンに対する変更は以下の実行で反映させることができます。

```Python3
pygame.display.update()
```

## 描画
　基本的に描画の色はRGB(+透明度)で指定します。座標系は左上を原点としていて、右下に行くほど座標の値は大きくなります。
　draw関連のものは第一引数に線の色を指定します。lineであれば、(x1,y1)と(x2,y2)を結ぶような幅lwの線分を描画します。rectであれば、(x1,y1)を左上の頂点とした幅width、高さheightの長方形を太さlwの線で描画します。ellipseの場合は同じような感じでその長方形に内接する楕円を描きます。このときrect、ellipseはlwを指定しないと塗りつぶします。

```Python3
screen.fill((0, 0, 0, 0)) # 塗りつぶし　RGB+透明度
pygame.draw.line(screen, (255, 255, 255), (x1, y1), (x1, y2), lw)
pygame.draw.rect(screen, (255, 255, 255), Rect(x1, y1, w, h), lw)                                                               
pygame.draw.ellipse(screen, (255, 255, 255), (x1, y1, w, h), lw)
```

## 音声ファイルの再生
　サンプリング周波数を指定して初期化を行い、ファイルを読み込みます。再生の際は再生回数を引数で指定することができます。

```Python3
pygame.mixer.init(frequency = 44100)
pygame.mixer.music.load("./hit1.mp3")
pygame.mixer.music.play(1)
# 再生を止める場合
# pygame.mixer.music.stop()
```

## キー入力の受け取り
　キーが押されている状態かどうかの情報を格納し、押されていれば座標を上に移動します。

```Python3
pressed_key = pygame.key.get_pressed()
if pressed_key[K_UP]:
    y -= 10
```

# イベント
　今回利用したのは閉じるが押された場合(前者)とEscapeキーが押された場合(後者)です。他にもたくさん種類があります。(マウス操作とか)

```Python3
if event.type == QUIT:
    pygame.quit()
    sys.exit()

if event.type == KEYDOWN:
    if event.key == K_ESCAPE:
        pygame.quit()
        sys.exit()
```

　察しの良い方はevent.type == KEYDOWNでも入力受け取れるから、pressed_keyを取得しなくても良いと思うかもしれませんが、event.typeの場合、押されたことを処理します。そのため、長押しに対応せず長距離を移動したい場合に複数回キーを押さなくてはいけないので、今回の場合は少々不便です。

# おわりに
　かなり散発的になってしまいましたが、以上が今回のプログラムの関数の解説になります。最後に、この記事の内容はPong作成にあたり利用したもの+α程度の内容しかないので、より詳しく知りたい方は別のサイトを参照されることを進めます。特に、普通のゲームでは画像は描画せずに画像ファイルを読み込むところ、今回はそれほど物が出てこないので全部描画しているので全く触れられていません。
circleci コマンド

## 環境
```
Mac OS Mojave 10.14.6
```

## Install 
```
$ brew install circleci
```

## Install Docker for Mac が入っている場合
```
brew install --ignore-dependencies circleci
```

## Update
```
$ circleci update check
$ circleci update
```

## ./circleci/config.yml validate
```
$ circleci config validate
Config file at .circleci/config.yml is valid.
```

## execute
```
circleci local execute -c .circleci/config.yml
```

## v2.1 -> v2
```
circleci config process .circleci/config.yml
```

## Build
```
circleci build -c .circleci/config.yml 
```
Cloud FunctionsでDartを使う

## はじめに
[firebase_functions_interop](https://pub.dev/packages/firebase_functions_interop)というライブラリ使ってDartでCloud Functions動かせたので、その共有です。

READMEに書かれている通りに進めるだけでとりあえずは動かせます。

[firebase_functions_interop](https://pub.dev/packages/firebase_functions_interop)はdart2jsでdartからjsに変換してnodeで動かす作りになっています（Cloud FunctionsがDartに対応してないため。本来はサーバサイドはDart VMで動く作りのはず）。

## DartをCloud Functionsで動かすところまで

### ディレクトリ作成
ディレクトリ作成して、`firebase init functions`でCloud Functionsの準備

```
$ mkdir cloud-functions-dart-example
$ cd cloud-functions-dart-example
$ firebase init functions
```

### 依存ライブラリ準備
functionsディレクトリ内にpubspec.yamlを準備

```functions/pubspec.yaml
name: cloud_functions_dart_example
version: 0.0.1

environment:
  sdk: '>=2.0.0 <3.0.0'

dependencies:
  firebase_functions_interop: ^1.0.0

dev_dependencies:
  build_runner: ^1.0.0
  build_node_compilers: ^0.2.1

```

```
$ pub get
```

### Hello World関数を追加
```functions/node/index.dart
import 'package:firebase_functions_interop/firebase_functions_interop.dart';

void main() {
  functions['helloWorld'] = functions.https.onRequest(helloWorld);
}

void helloWorld(ExpressHttpRequest request) {
  request.response.writeln('Hello world');
  request.response.close();
}
```

### ビルド
functionsディレクトリ内にbuild.yamlを準備

```functions/build.yaml
targets:
  $default:
    sources:
      - "node/**"
      - "lib/**"
    builders:
      build_node_compilers|entrypoint:
        generate_for:
        - node/**
        options:
          compiler: dart2js
          dart2js_args:
          - --minify
```
functionsディレクトリ内でpubコマンドでビルド

```
$ pub run build_runner build --output=build
```

### デプロイ
functionsディレクトリ内のpackage.jsonにmain追記

```functions/package.json
{
    "...": "...",
    "main": "build/node/index.dart.js"
}
```

デプロイ

```
$ firebase deploy --only functions
```

### おわりに
↓のリポジトリに動かしてみたやつおいてあります。
[cloud-functions-dart-example](https://github.com/hiko1129/cloud-functions-dart-example)

Flutterでなにか作りたいやー
9/10 Tech Expert (事前学習) day 11　/　return

【学習アウトプット】

今日の目標(やること)
Ruby!!!!w

#今日のまとめ
##return（リターン）
returnはメソッド自体の答(返り値)となる

returnを利用した場合の例
（returnを利用した時点で返り値が決まるため、メソッドはその行で強制終了。）

  ```rb
def sample
   "1"
   "2"
   return"3"          # ここで処理は終わり
   "4"                # 呼ばれない
end

  puts sample         # => 3
```

returnを利用しない場合の例
（returnを省略した場合、そのメソッドの中で最後に実行された式の値がメソッドの返り値となる。）

  ```rb
def sample
   "1"
   "2"
   "3"
   "4"          # 最後に実行されている
end

  puts sample            # => 4
```

使い方例-１

```rb

  def mixer(fruit)
    puts "#{fruit}を細かく砕く"
    return "#{fruit}ジュース"
  end

  puts mixer("リンゴ") 
```


`def mixer(fruit) `    本引数"リンゴ"が代入される。
`puts "#{fruit}を細かく砕く"`  fruitには"リンゴ"が
`return "#{fruit}ジュース" `     "リンゴジュース" がmixer(fruit)全体の返り値に。
`puts mixer("リンゴ")`    返り値である"リンゴジュース"が出力される

＄リンゴを細かく砕く
　りんごジュース

```rb
juice = mixer("ブドウ") # 変数に代入
puts juice            #=> ブドウジュース 
```




使い方例-２

```rb
  def rename(name)
    name = "Mr.#{name}"
  end

  name = "Tanaka"
  rename(name)
  puts name　　　　#Tanaka
```

Mr.Tanaka　になると思ったが？
↓解答
スコープ外！
メソッド内では　Mr.Tanaka になっている。
メソッド内の変数nameの値(仮)を変えても、引数の変数name（本）とは別物のため、外は外でnameに代入する必要がある

```rb
def rename(name)
    name = "Mr.#{name}"
  end

  name = "Tanaka"
  name = rename(name)
  puts name      #Mr.Tanaka
```



##〜独り言(まとめやら感想やら)〜
明後日の夕方頃までかなぁー？
最後まで頑張るぞー☆
Pythonでフォルダ内のファイル全取得してリストを作成してみるぞ

#以前、投稿したやつですが…


〔Pythonでフォルダ内の全サブフォルダ、ファイルの取得〕
(https://qiita.com/daisuke8000/items/932a1fb79564a8426337)

これをちょっとだけいじってもうちょっと実用的にしてみる

#取得したならリストを作ろう
なんか取得して満足って寂しいので、どうせならリストにしてしまおうという
相変わらずのノープラン（計画性０、うーん、クズｗ）
とはいえ、基本は以前のやつをforループでゴリゴリに回すだけ。
そんで最後csvにドーンとかいて終わり。

```Python:gurgur.py

import os
import csv

#フォルダパス
dock = r'ここに調べたいフォルダのファイルパスを貼りましょう'

pathlist = []
namelist = []

#全サブフォルダ、ファイル抽出
for folder,subfolders,files in os.walk(dock):
    a = format(folder)
    b = format(subfolders)
    c = format(files)
    c = c.strip("[""]")
    if c == "":
        pass
    else:
        for xx in files:
            get = os.path.abspath(xx)
            namelist.append(xx)
            pathlist.append(get)

#zip()は要素の長さが違う時、長い方要素は捨てられます。
with open('file.csv','w', newline='', encoding='utf_8_sig') as f:
    writer = csv.writer(f,lineterminator='\n')
    writer.writerow(['FileName','FilePath'])
    for (name, path) in zip(namelist,pathlist):
        writer.writerow([name,path])

``` 

ZIP()は使ってみたことなかったので今回使ってみた。
それにしても、俺ってリストが大好きだなぁ…

今回もアドバイス欲しいな～
たくさんアドバイス待ってまーす。
【メモ】Python3で文字列を空白箇所で改行する方法

Python3で、空白を含む文字列が与えられた時に、改行して表示する方法をメモします。
いろんな戦略があることが分かりました。

【入力】
文字列１ 文字列２

【目指す出力】
文字列１
文字列２

【コード１】replace関数で空白を改行に置換する
s = input()
print(s.replace(' ', '\n')

【コード２】split関数で文字列を分割し、for文の繰り返しを利用して改行する
s = input()
for i in s.split():
    print(s)
議会議事録の分析　全体像の確認編

## はじめに
本稿ではデータジャーナリズムの技術について、既存の報道をもとに解説をしてみようと思います。なお、筆者の本業はマーケティングです（データ分析者ではありません）。もし誤りやよりよい方法があれば遠慮なくご指摘いただけると嬉しいです。

## 今回扱う事例
西日本新聞が福岡市議会の議事録を解析した事例を扱います。
https://www.nishinippon.co.jp/item/n/319982/
※一部リンクが切れているところがあります

### どのようなデータを扱っているか
上記の記事をみると、
・福岡市市議会の議事録約２０年分（１９９７年～２０１６年９月）のデータ
・本会議と各委員会を含めて
・インターネットで公開されている議事録を分析した
・福岡市市議会の定例会および臨時会の議事録を対象に分析。期間は1997年2月～2016年9月
・住民基本台帳を基に、区以下の地名が含まれる計１万４６１６件の発言内容をまとめた
・位置情報は、国土交通省の位置参照情報ダウンロードサービスなどを参照した
あたりがヒントになりそうです。

まとめると、大きく３つのデータを利用していると推測できます。
1. Web上で公開されている市議会の議事録（（１９９７年2月～２０１６年９月、発言者と会議体の区別ができる形式で）
2. 住民基本台帳の地名分類データ
3. 国交省の位置参照情報ダウンロードサービスなど（「など」の内容は不明）

これらは、
最も大事な、分析の基盤となるデータが「1」
そのデータを集めた後、分析する前の前処理に必要なデータが「2」
分析結果を表現するのに必要なのが「3」
と言えそうです。


### 分析の大まかな流れ
大きく以下のような流れで進んでいきます。
個々の項目については、記事を分けて説明します。
なお、データ分析あるあるですが、工程の７割は収集〜前処理に割くことになると思います。地道な作業です。

1. データの収集
   議事録データをwebサイトから収集する
　　必要なデータを、必要な形式で、自動的に収集する仕組みをつくる

2. データの前処理
　　収集したデータそのままでは粗くて分析に耐えないので、きれいに整える
　　また、今回は自然言語を扱うので、形態素解析にかける

3. データの分析
　　用意したデータを分析にかける
　　過不足や不備があれば、随時前の工程に戻ってやり直す

4. 分析結果の表現
　　グラフや地図へのプロット

順を追って説明していきます。

（別の記事に続く）
Go 1.13にアップデート後一時的にGo 1.12にダウングレードする方法

## 環境
Mac OS Mojave 10.14.6

## Go Version
```
$ go version
go version go1.13 darwin/amd64
```

## Install goenv
```
$ brew install goenv
```

## Go 1.13 -> 1.12
```
$ goenv install 1.12beta1
$ goenv global 1.12beta1
$ echo 'export PATH="$HOME/.goenv/bin:$PATH";
> eval "$(goenv init -)"' >> ~/.bashrc
$ source ~/.bashrc

$ go version
go version go1.12beta1 darwin/amd64
```

## Go 1.12 -> 1.13
```
$ goenv global system
$ go version
go version go1.13 darwin/amd64
```
Ruby on RailsでDBのカラム追加をしてみた。

## 1.はじめに
### 1-1.現在のDBの確認
```terminal
$ rails dbconsole
SQLite version 3.24.0 2018-06-04 14:10:15
Enter ".help" for usage hints.
sqlite> 
```

```
sqlite> .headers on
sqlite> select * from stores;

id|name|name_hurigana|smoking|created_at|updated_at|prefecture|city
1|山手十番館|（ヤマテジュウバンカン）|分煙|2019-08-29 12:57:40.109863|2019-08-29 12:57:40.109863
```
まずは現状のカラムの確認
id|name|name_hurigana|smoking
上記の4つが最初に作成した、カラムになります。

※**sqlite> .headers on**を行わないとカラムが表示されないので注意

## 2.手順
### 2-1.DBのカラム追加

```terminal
$ rails generate migration AddColumnToStore prefecture:string city:string
```
***Column　To　Store***の最初の文字は大文字
***Store*** のところに追加したいモデルを記入
***prefecture:string city:string***　DB作成する時同様の名前とフォーマットの設定


### 2-2.ファイルが作成されるので確認
```20190829091622_add_detail_to_store.rb
class AddDetailToStore < ActiveRecord::Migration[5.2]
  def change
    add_column :stores, :prefecture, :string
    add_column :stores, :city, :string
  end
end
```
実行を完了後は上記のようにファイルが作成されます。

### 2-3.DBの更新

```terminal
rake db:migrate
```

忘れてはいけないmigrate
これでDBの追加完了。
MySQLでINNER JOINする

# はじめに
この記事は勉強用として試したことまとめたものです。

# INNER JOIN(内部結合)とは
* テーブルとテーブルを結合するためのSQL文である。
* 条件に一致するレコードのみを抽出する。

# テストデータ作成(名前テーブル)
```sql
CREATE TABLE pokemon_name (
  book_no int NOT NULL, -- 図鑑番号
  type_no varchar(255), -- タイプ番号
  name varchar(255),    -- 名前
  PRIMARY KEY (book_no)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

-- テストデータ投入
INSERT INTO pokemon_name VALUES('001','A01','フシギダネ');
INSERT INTO pokemon_name VALUES('002','A01','フシギソウ');
INSERT INTO pokemon_name VALUES('003','A01','フシギバナ');
INSERT INTO pokemon_name VALUES('004','A02','ヒトカゲ');
INSERT INTO pokemon_name VALUES('005','A02','リザード');
INSERT INTO pokemon_name VALUES('006','A02','リザードン');
INSERT INTO pokemon_name VALUES('007','A03','ゼニガメ');
```

# テストデータ作成(タイプ名テーブル)
```sql
CREATE TABLE pokemon_type (
  no char(5),             -- タイプ番号
  type_name varchar(255), -- タイプ名
  PRIMARY KEY (no)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

-- テストデータ投入
INSERT INTO pokemon_type VALUES('A01','くさ');
INSERT INTO pokemon_type VALUES('A02','ほのお');
INSERT INTO pokemon_type VALUES('A03','みず');
```

# SQL実行
```sql
SELECT * FROM pokemon_name pn
INNER JOIN pokemon_type pt ON pn.type_no = pt.no;
```

# 実行結果
```sql
book_no|type_no|name |no |type_name|
-------|-------|-----|---|---------|
      1|A01    |フシギダネ|A01|くさ       |
      2|A01    |フシギソウ|A01|くさ       |
      3|A01    |フシギバナ|A01|くさ       |
      4|A02    |ヒトカゲ |A02|ほのお      |
      5|A02    |リザード |A02|ほのお      |
      6|A02    |リザードン|A02|ほのお      |
      7|A03    |ゼニガメ |A03|みず       |
```

# 同じ表を結合させてみた
```sql
SELECT * FROM pokemon_name pn
INNER JOIN pokemon_type pt1 ON pn.type_no = pt1.no
INNER JOIN pokemon_type pt2 ON pn.type_no = pt2.no
INNER JOIN pokemon_type pt3 ON pn.type_no = pt3.no
INNER JOIN pokemon_type pt4 ON pn.type_no = pt4.no
INNER JOIN pokemon_type pt5 ON pn.type_no = pt5.no;
```

# 実行結果
```sql
book_no|type_no|name |no |type_name|no |type_name|no |type_name|no |type_name|no |type_name|
-------|-------|-----|---|---------|---|---------|---|---------|---|---------|---|---------|
      1|A01    |フシギダネ|A01|くさ       |A01|くさ       |A01|くさ       |A01|くさ       |A01|くさ       |
      2|A01    |フシギソウ|A01|くさ       |A01|くさ       |A01|くさ       |A01|くさ       |A01|くさ       |
      3|A01    |フシギバナ|A01|くさ       |A01|くさ       |A01|くさ       |A01|くさ       |A01|くさ       |
      4|A02    |ヒトカゲ |A02|ほのお      |A02|ほのお      |A02|ほのお      |A02|ほのお      |A02|ほのお      |
      5|A02    |リザード |A02|ほのお      |A02|ほのお      |A02|ほのお      |A02|ほのお      |A02|ほのお      |
      6|A02    |リザードン|A02|ほのお      |A02|ほのお      |A02|ほのお      |A02|ほのお      |A02|ほのお      |
      7|A03    |ゼニガメ |A03|みず       |A03|みず       |A03|みず       |A03|みず       |A03|みず       |
```

# 参考
* https://www.sejuku.net/blog/56589
【Swift5】OSの設定アプリに遷移する処理

## 設定アプリ内の当該アプリの設定画面に遷移する方法

```swift:
    func showOSSettingView() {
        if let url = URL(string: UIApplicationOpenSettingsURLString) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }
    }
```

ちなみに、設定アプリのトップに遷移する方法はないらしい、、、
明確な情報知っている方いれば教えて下さい。
Automation Anywhere★基本入門「Excel」★


「Excel」です
Excel開きましょう！
※Loopはおまけ


前回の通りに開発画面を立ち上げ「Excel」を選択してください。
コマンドの中にある「サブコマンド」が見えているでしょうか？

サブコマンドがあるコマンドは、適当なサブコマンドをダブルクリックして、コマンドを開いておきます
※サブコマンドの変更設定は、開いた後でも可能です。

★Excelを開く「Open Spreadsheet」
設定値→該当ファイルの「フルパス」
※パスをコピーした際の""は削除して下さい、エラーでます。

今回、Qiita用にAAフォルダを作成し、その中にファイルを作っていますので、そのフルパスです。
パスを入力したら「Save」します。




<img width="533" alt="1AA.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/c43729ed-7763-117d-fc25-f5d963fefcdc.png">

もしくは下記の方法でも可能です



<img width="311" alt="4AA.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/e6ff4188-789f-d78e-75c8-394d6aede0be.png">

一旦、ここで保存します。
上部の「Save」を押し、次へ。

AAでは「Open Spreadsheet」は開くだけ。
Excelデータを取得して、何かの処理を行いたいとなると、これでは取得できません。


★Excelを開いたら、AAにExcelデータを取得させる処理が必要です。


サブコマンド「Get Cells」をダブルクリックして表示させます。
「処理を行いたいExcelデータの全てをGet(取得)させますので「Get All Cells」をチェック
「Save」します。


<img width="516" alt="5AA.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/da17fa79-5e95-df2c-3692-9f2da83ea734.png">

Excelデータを取得するには「Loop」コマンドを追加します。
※Cell一つだけや、範囲指定をしてもGet Cellsできますが、ほとんど「Get All Cells」です。

「Loop]コマンドを探し、サブコマンド「Each Row In A Excel Dataset」をダブルクリック。
これは、サブコマンド「Get Cells」の直下に配置されます。

<img width="516" alt="6AA.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/73ff79ef-0975-9d1b-88b3-a274d953f202.png">

表示されたコマンド内のサブコマンドが「Each Row In A Excel Dataset」である事を確認して「Save」


<img width="516" alt="7AA.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/e9063363-7b3d-b470-1bc7-8ebbd8d9ad73.png">


これで「Loop」コマンドが追加されました。


<img width="516" alt="8AA.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/0df7fe35-ec13-0a1e-f0c4-ea809978ba20.png">


画面を見ていて、色分けされているのにお気づきでしょうか？
簡単に書いておきます

黒→実行される
青→実行される(If/Loop)
緑→実行されない(comment・Diseble)


この状態でRunしても、Excelデータの取得はされますが、実行結果を確認したいですよね？
前回の「Message Box」の出番です。

挿入する場所はLoopの中です。
Loopで取得したデータはLoopの中でのみ保持されますので、その中の取得値が表示されます。

Excelデータを表示する「システム変数」があります。
基本的にAAは「Column」でデータを取得していると考えています。

選択するシステム変数「Excel Column」をinsert
次の出てくるのは「Column選択」です

Excel「A」列を「１」として扱います。
ここには「Column→１」を設定しOK、そのまま「Save」します。

<img width="571" alt="9AA.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/4ebc509c-01f3-a9c2-4f38-9e2d31baeb40.png">



<img width="533" alt="10AA.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/0fb63540-a2b7-78f3-3c90-85c029feb4cb.png">


AA自体の「Save」を行い、Runしてみてください。
ちなみに、ExcelファイルA列に好きな言葉を入力して作ってくださいね:bow_tone2:

Messageに作成した取得値が表示されれば成功です！


Automation Anywhere　★基本入門★
「Excel」これにて終了！
お読みいただき、ありがとうございました:relaxed:


次回は「File/Folders]でファイルとフォルダを探ります。
.plistってなんやねん？

iOSアプリなんかを開発しているとよく目にする.plistというファイル。実際どういったものなのか分からなかったので、調べてみました。
## .plistとは
plistとはプロパティリストの略で言葉の通り**プロパティを格納するためのファイル**です。拡張子に.plistを持ち、一般的にplistファイルと呼ばれているみたいです。
このplistファイルを**パース（構文解析）**するためには**NSPropertyListSerializationクラス**がiOSにおいては必要となります。Androidにおいてはここではスルーします。上記で出てきたNSPropertyListSerializationクラスはシリアル化(オブジェクトをバイト列やテキストに変換)された形式とプロパティリストオブジェクトを変換するメソッドを持つクラスです。そのため、このクラスがないとパースできず読み込めないみたいです。

下記にNSPropertyListSerializationクラスの公式リファレンスを載せときます。
https://developer.apple.com/documentation/foundation/nspropertylistserialization

ざっくりですがとりあえずこんな感じみたいです。

## .plistの２つの形式
.plistには2つの形式があり、それにより文法も異なります。

### NeXT形式plistの文法
NeXT形式の文法は簡単いうと、小カッコ（）で括られた中身が配列、中カッコ{}で括られた中身がディクショナリを表します。配列の要素ごとの区切りはカンマ（,）で、ディクショナリの要素ごとの区切りはセミコロン(;)で記述されます。文字列はダブルクオート(")で括られ、文字列以外のバイナリデータは<>で括られた16進数の集まりで表現されます。そして数値や真偽値に対応する表現は存在しません。
大体以下のような記述になります。


```plist
{
    "キー1" = "値1";
　　　//ディクショナリ
    "キー2" = {
        "サブキー1" = "値2";
        };
    //配列
    "キー3" = (
        "配列メンバー1",
        "配列メンバー2",
        "配列メンバー3"
    );
}
```

### XML形式plistの文法
下記のコードは先ほどのNeXT形式のコードをXML形式に変換したものです。
最初の`</xml ....>`の部分はXMLの宣言をしている文で、これからXML形式で記述しますよ！と言っている感じです。
次にDOCTYPE宣言の下のplistから/plistがplistの内容になります。
dictはディクショナリを、keyはディクショナリのキーを、arrayは配列を、stringはディクショナリ内であればバリューを、配列内であれば配列の要素を表しています。
ここで使用したXMLはHTMLと同じマークアップ言語であり、主にデータのやり取りを管理する目的で使われているものです。

```xml
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/CTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>キー１</key>
  <string>値1</string>
  <key>キー２</key>
  <dict>
    <key>サブキー１</key>
    <string>値２</string>
  </dict>
  <key>キー2</key>
  <array>
    <string>配列メンバー1</string>
    <string>配列メンバー2</string>
    <string>配列メンバー3</string>
  </array>
</dict>
</plist>
```

## ２つの形式の背景と注意点
もともとplistファイルというのは、NeXTSTEPというOSで使われていたデータの表現形式が元となってできました。この当時はまだXMLではなくNeXTで書かれていていました。しかしその後、NeXTソフトフェア（NeXTSTEP OSをリリースしていたソフトウェア）がAppleに買収され、この時に当時流行っていたXMLを利用したXML形式のplistが用意されました。このおかげで数値や真偽を表現できるようになりました。

ざっくりいうとこんな背景があるため、
**Mac OSでは古いNeXT形式のplistも使用できるが、新しいXML形式を使うことが推奨されています。**
**そしてXML形式のplistはMacOSで各フレームワークで読み込みのみの利用しか可能になっていないため注意が必要です。**

## 最後に
plistについて全く知識がなかったので、とりあえずざっくりとまとめてみました。解説等不十分な点あると思いますが、ご了承ください。

もう少し詳しく知りたいという方は下記に参考リンクを貼っておきますのでそこから確認してください。

最後まで読んでいただきありがとうございました。

## 参考リンク
https://www.itmedia.co.jp/enterprise/articles/0705/14/news013.html
https://developer.apple.com/documentation/foundation/nspropertylistserialization
https://secondflush2.blog.fc2.com/blog-entry-1012.html
https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%83%AA%E3%82%B9%E3%83%88
JS基礎知識 2

#感謝
いいねしてくれた方、編集リクエスト送ってくださった方、ありがとうございます。励みになります。

#今日やったこと(2019/9/10)
###まずは座学
プログラミングの座学について、ざっと勉強した。

####順次処理、分岐処理、反復処理の3つの処理があることを学んだ。
jsで例えると、
 ・ 分岐処理がif文やswitch文
 ・ 反復処理がfor文やwhile文

####次が変数について。
データを入れておく箱の役割を担っているやつ。jsだとvarとかletとかだと思う。

ちなみに、varとletの違いについてだが、
同じ変数でもletはブロックの中だけに限定されるが、varはブロックの壁を越えられる。
つまりvarのほうが便利。(?)　気になった場合はスコープについて調べる。

xx = 5
yy = xx

ここで、xxを出力すると5、yyを出力しても5になる。

xx = xx + 2

これはxxに5が代入されているので、左のxxは７になる。文字列は""をつけること。

####動的、静的型付言語
静的型付言語とは、変数などの値についての型が、そのプログラミングの実行よりも前にあらかじめ決められている性質の言語のことを指す。

動的型付言語とは、実行時の実際の値により型を決める性質の言語のことを指す。

jsは後者にあたる。

####演算子について。
記号を用いて演算を指示するものを演算子と呼ぶ。
 ・算術演算子
 ・関係演算子
 ・論理演算子

の3つがある。~~どうでもいいがqiitaでリストってどうやって作るんだこれ。~~

四則演算＋アルファが算術演算子。余りは%、**が累乗。

数の同異や大小が関係演算子。== != >= <= <>みたいな。

&&と||が論理演算子。かつと、または。

###座学終了。今日やったこと二つ目。
jsの昨日の続き。クラスやインスタンス、コンストラクタやメソッドなんかを触った。
すごく難しい。今の時点では理解しきれないので、明日へ持ち越し。

2記事目終了。
phalcon3.4 をLinuxにインストール

# phalcon 3.4 + php7.3 Linux 環境を作る

AWSのAmazon linux 2 をインストールする方法をいろいろと調べてました。

以下のサイトにようやくたどり着きました。。。

https://packagecloud.io/phalcon/stable


```
curl -s https://packagecloud.io/install/repositories/phalcon/stable/script.rpm.sh | sudo bash
```

このあと、

```
yum search phalcon
```

とすると

```
php-phalcon.x86_64 : Phalcon Framework
php-phalcon2.x86_64 : Phalcon Framework
php54-php-phalcon.x86_64 : Phalcon Framework
php54-php-phalcon2.x86_64 : Phalcon Framework
php55-php-phalcon.x86_64 : Phalcon Framework
php55-php-phalcon2.x86_64 : Phalcon Framework
php55-php-phalcon3.x86_64 : Phalcon Framework
php56-php-phalcon.x86_64 : Phalcon Framework
php56-php-phalcon2.x86_64 : Phalcon Framework
php56-php-phalcon3.x86_64 : Phalcon Framework
php70-php-phalcon3.x86_64 : Phalcon Framework
php71-php-phalcon3.x86_64 : Phalcon Framework
php72-php-phalcon3.x86_64 : Phalcon Framework
php73-php-phalcon3.x86_64 : Phalcon Framework
```

こんなふうに出力されるので、
ここにある、

```
yum install php73-php-phalcon3
```

これでインストールできました。


ちなみに、
cphalconのソースコードをビルドすると最新のphalcon4になるので、要注意なところと、無料枠のEC2 t2.microでは、メモリが足りなくてビルドできないという罠がありますので、要注意。
一瞬、t2.xlargeにしてコンパイルして戻してという感じでコンパイルはできたけど、phalconのバージョンが。。。ということでしたので、やはりパッケージを落としてくるのが一番はやいですね。
関連するパッケージも落としてくれるので。
JDLA Deep Learning for ENGINEER 2019#2 (E資格)

# E資格2019#2受験しました。

######(2020年1月追記）E資格取得により会社から表彰されました。<br>E資格トライしてくれる人が増えるといいなと思います。
---------------------------------------------------------------

結果として合格したので書けますが、結構しんどかったです。
改めて自分の弱みがわかったのと、コード実装力は他でこれからも鍛えないとなと感じました。

【データ】
受験者数 670名
合格者数 453名　合格率67.61%

私が受けた外部プログラム内の合格率は90％近く。
これは、きっと卒業までの課題等がきつかったからと思います。

【使った書籍】
・ゼロから作るDeep Learning
・ゼロから作るDeep Learning2
・深層学習（部分的にしか読まず）

【勉強法】６月より外部プログラム受講～受験まで
・とにかく外部プログラムの各演習問題とゼロつくの反復練習。
　最終的に、わかるところの理解を深めて、欲張らず新分野に手を出さないようにしました。

【効果】
・数式に多少強くなりました。書籍を読むときの理解が以前より進みます。
・コードにも慣れてきました。2年前から周りに推されてるKaggleでもやるかと次の目標が生まれました。
・社内での認知度は低いのでこれから・・・JDLAさん頼みますよ。結構お金かかってるんです(´;ω;｀)
　転職に有利なのかは・・・よくわかりません。

【その他】
・愛知県受験でしたが、名駅会場はいっぱいでした。千種です。
・受験者の年齢層は幅広いと感じました。CBTSは受付に入ったらもう水が飲めないのがきつかった。
・E,G 2つそろったので合格者の会などは行ってみたい。
・次の試験からシラバス変わるみたいです。
　日進月歩なので実施年号を付与⇒何度も受けることを推奨してる？
　でもE資格は外部プログラム卒業後、E資格受験資格は2年間。2年後はどうなるのか。

####（追記）試験内容について
シラバスが変わりますが、参考になれば幸いです。
分野は応用数学・機械学習・深層学習の３分野です。

外部プログラムによっては応用数学・機械学習が弱いかもしれません。
別途単発の外部プログラムやUdemyなどの動画学習サイトで勉強すると良いかもしれません。

応用数学については普段触らないので取っつきにくいですが、
線形代数の固有ベクトルや特異値分解、情報理論のエントロピー、KLダイバージェンスとJSダイバージェンスは得点源になるのでおさえておきたいです。
確率・統計はまず基礎を。

機械学習についてはSVMやロジスティックス回帰、主成分分析などの代表的な手法は特徴を覚えることと、コードも余裕があれば見ておく。K-means++など特に・・・。
深層学習もですが、コード穴埋めが結構多かったので、ゼロつくでもPythonに慣れていない人(selfってなんじゃレベル）は別途Pythonのオブジェクト指向（クラス・インスタンス・コンストラクタ・継承・・・）を書籍か動画学習サイトで見るのも手かと思います。

深層学習は幅広いので大変です。
Adamまでのコード理解。CNNはゼロつく読んでim2colまで理解。苦しいです・・・
GoogleNetやResNetなどの代表的なモデルは必ずおさえる。
VAEとGANも当然ながら。そしてGANは派生が多いのでこれも動向をなんとなく見ておく。
私は外部の最新論文紹介の動画を見ました。
RNNはGRU、Attentionまで・・・自分は頭に入らず。
強化学習は方策勾配定理やDQNを・・・自分は苦手分野。

できるところをコツコツとの方が良いと思います。
こうして振り返ると、外部プログラムと同時並行で別途学習が多いですね。
<br><br><br>



以下証書比較
E資格
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304339/c68f4893-c361-4726-9fe4-e53e5ad826dd.png)



G検定
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304339/3f9cadbe-59ae-2193-6df3-2139e99bcb29.png)

微妙にフォント違う。特に氏名の部分。
Google Cloud SDK を Homebrew で macOS にインストールする

## Google Cloud SDK とは

[Cloud SDK  \|  Google Cloud](https://cloud.google.com/sdk/)

> Cloud SDK は Google Cloud Platform 用のツールセットです。gcloud、gsutil、bq などのコマンドライン ツールを利用して、Compute Engine、Cloud Storage、BigQuery をはじめとするプロダクトやサービスにコマンドラインからアクセスできます。このようなツールはインタラクティブに実行することも、自動スクリプトで実行することもできます。

## brew cask install google-cloud-sdk でインストール

```
$ brew cask install google-cloud-sdk
==> Caveats
google-cloud-sdk is installed at /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk. Add your profile:

  for bash users
    source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.bash.inc'
    source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.bash.inc'

  for zsh users
    source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.zsh.inc'
    source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.zsh.inc'
(以下略)
```

インストールの過程で bash または zsh のユーザー向けに設定方法も表示してくれている。

## profile 設定

インストールの過程で表示された設定方法を適用する。

bash の場合は以下を実行する。 .bash_profile や .bashrc などにも追加する。

```
source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.bash.inc'
source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.bash.inc'
```

zsh の場合は以下を実行する。 .zprofile や .zshrc などにも追加する。

```
source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.zsh.inc'
source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.zsh.inc'
```

これらを実行することで環境変数 PATH の先頭に Google Cloud SDK の実行ファイルのパスが追加される。

```
$ which gcloud
/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gcloud
```

## Google Cloud SDK のバージョンを確認

インストールした Google Cloud SDK のバージョンを確認する。

```
$ gcloud --version
Google Cloud SDK 261.0.0
bq 2.0.47
core 2019.08.30
gsutil 4.42


To take a quick anonymous survey, run:
  $ gcloud alpha survey
```

## Google Cloud SDK には Python 2.7 が必要

[Cloud SDK のインストール  \|  Cloud SDK のドキュメント  \|  Google Cloud](https://cloud.google.com/sdk/downloads)

> Cloud SDK は、Linux、Mac OS X、Windows で動作し、Python 2.7.x を必要とします。Cloud SDK にバンドルされている一部のツールには追加の要件があります。たとえば、Java tools for Google App Engine development には Java 1.7 以降が必要です。

macOS には最初から Python 2 がインストールされていると思われるので別途インストールする必要はない。

```
$ /usr/bin/python --version
Python 2.7.10
```

[Google Cloud SDK のドキュメント  \|  Cloud SDK  \|  Google Cloud](https://cloud.google.com/sdk/docs/?hl=ja)

> 最近のバージョンの macOS には、Google Cloud SDK に必要な Python の適切なバージョンが含まれています。Cloud SDK には、リリース番号が Python 2.7.9 以降の Python 2 が必要です。追加の Python インタープリタをインストールする場合、それが Google Cloud SDK のインストールを妨げるものであってはなりません。

> 注: Cloud SDK バージョン 206.0.0 時点の gcloud CLI には、Python 3.4+ インタープリタを使用して実行するための実験的サポートが含まれています（このサポートの除外や Python インタープリタの構成の詳細については gcloud topic startup を実行します）。他のすべての Cloud SDK ツールには、引き続き Python 2.7 インタープリタが必要です。

今回の環境には Python 3.7 もインストールされていたが、Google Cloud SDK の動作には問題がなさそうだった。

```
$ python -V
Python 3.7.3
```

## 参考資料

- [Cloud SDK  \|  Google Cloud](https://cloud.google.com/sdk/)
- [google\-cloud\-sdk — Homebrew Formulae](https://formulae.brew.sh/cask/google-cloud-sdk)
Eclipse Buildship プラグインでGradleの実行時オプションを指定する方法

# Eclipse Buildshipとは

> Eclipse Buildship is a collection of Eclipse plug-ins that provide support for building software using Gradle.
> https://projects.eclipse.org/projects/tools.buildship

とあるように、GradleをEclipse上で扱うためのプラグインです。

Installの有無は、Eclipse上からは help> About Eclipse IDE から確認できます。

下図は Eclipse Buildship Version 3.1.1 がインストールされている様子です。
![Eclipse Buildship version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6463/6a3c18c5-704a-96e9-f6ac-3416f6819937.png)

# やりたいこと

Buildship経由のgradleタスク実行時にオプションを追加したい。CLIでいうと`gradle build -x test` ただ、それだけです。ただそれだけがEclipseのBuildshp経由できず、なんだかモヤモヤしつつも諦めてCLIコマンドをいつも叩いていましたが、回避方法がわかったので備忘に残しておきました。

# 環境

Eclipse: Version: 2018-12 (4.10.0)
Buidship: 3.1.1

# 実現方法

Gradle Tasks > にタスクを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6463/fac0014b-cdb0-c5b0-ebbd-918133f232eb.png)

次に、Project Settings で、`Override project settings` にチェックを入れ、`Program Arguments` に`-x`, `test`という2つの引数を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6463/2bff14d6-43e4-ea1a-9753-0efb8ab43c81.png)

これだけです。これだけで `gradle build -x test` と同等のビルドが実行できます。
簡単なんですがここまでに中々至らず、諦めてターミナルからいつもコマンドを打っていました。


# NGケース1

以下のようにGradle tasksに `build -x test` と横着して書いても上手く認識してくれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6463/abd2ad16-9a4b-462b-1aa6-1a3ab3f54c12.png)

```bash
FAILURE: Build failed with an exception.

* What went wrong:
Task 'build -x test' not found in root project 'buildship-example'.
```

# NGケース2

同様に、Program Argumentsに `-x test` とワンラインで書いても上手く認識してくれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6463/0f05cf0c-c4df-87dc-96e1-09fbf1ae6010.png)

```bash
FAILURE: Build failed with an exception.

* What went wrong:
Task ' test' not found in root project 'buildship-example'. Some candidates are: 'test'.
```

なんとなくワンラインで書きたくなりますが、いい感じに認識はしてくれませんのでご注意ください。

# まとめ

* EclipseとBuildshipでGradleビルドしている方がどれほどいらっしゃるかは不明ですが、やむえない理由で同じ用にハマった人の助けになれば幸いです
* Eclipseとかの設定手順を説明するのに、キャプチャをペタペタ貼って手順書を書くのは6,7年ぶりで懐かしい感覚になりました
【AWS IAM】SecurityGroupでのポリシー設定の落とし穴

下記ポリシーはSecurityGroupへのルール追加・編集ができるように見えると思います。
がしかし、セキュリティグループを追加・編集できないパターンがあります。

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:DescribeSecurityGroups",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:RevokeSecurityGroupIngress",
        "ec2:RevokeSecurityGroupEgress"
        "ec2:AuthorizeSecurityGroupIngress",
        "ec2:AuthorizeSecurityGroupEgress",
      ],
      "Resource": "arn:aws:ec2:*:*:security-group/*"
    }
  ]
}
```

#反例
実は上記ポリシー設定だと、タイプ・プロトコル・ポート範囲・ソースが一致し、説明内の文字列が異なるルールは定義できません。
既存ルールについて編集し上記条件のものを定義しようとしてしまうと、ルール自体が削除されてしまうので気を付けてください。
PowerUserAccess以上の権限ある場合は、上書きされる挙動になります。

参考：
[ec2 Actionエレメント一覧](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Operations.html)
ffmpegとSoXを使って、音声を比較する動画をちゃちゃっと作る

### 目的とゴール
　音声合成などで生成した音声を比較して、SNSでちゃちゃっと共有したい。でも大体のSNSは音声のみの共有ができない。soundcloudに投稿するのもめんどくさい。ということで、ffmpegとSoXを使ってちゃちゃっと動画にするコマンドをメモがてら書き記します。

↓こういうのが作れます

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ツイッター投稿用に、変換音声をぱぱっと比較できる動画を作れるコマンドを整えた！　こんなのが作れるはず！ <a href="https://t.co/nRGIb28xFw">pic.twitter.com/nRGIb28xFw</a></p>&mdash; ヒホ（ヒロシバ） (@hiho_karuta) <a href="https://twitter.com/hiho_karuta/status/1171396413122478082?ref_src=twsrc%5Etfw">September 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### コマンド（シェルスクリプト）

[ffmpeg](https://ffmpeg.org/)と[SoX](http://sox.sourceforge.net/)が必要です。

```bash
function make_audio_comparison {
  first_file="$1"
  first_label="$2"
  first_label_color="$3"
  second_file="$4"
  second_label="$5"
  second_label_color="$6"
  output_file="$7"
  normalize="${8:-}"

  if [ -z "$normalize"]; then
    cp "$first_file" /tmp/first.wav
    cp "$second_file" /tmp/second.wav
  else
    sox "$first_file" -r 48000 -b 32 /tmp/first.wav norm
    sox "$second_file" -r 48000 -b 32 /tmp/first.wav norm
  fi
  sox -M /tmp/input.wav /tmp/result.wav /tmp/merged.wav

  ffmpeg -y \
    -i /tmp/input.wav \
    -i /tmp/result.wav \
    -i /tmp/merged.wav \
    -filter_complex "
    [0:0][1:0][2:0]concat=n=3:v=0:a=1[a_all];
    [0:0]showwaves=s=640x480:mode=p2p:colors=$first_label_color,drawtext=text=$first_label:x=10:y=10:fontcolor=$first_label_color:fontsize=48,format=yuv420p[v0];
    [1:0]showwaves=s=640x480:mode=p2p:colors=$second_label_color,drawtext=text=$second_label:x=10:y=10:fontcolor=$second_label_color:fontsize=48,format=yuv420p[v1];
    [0:0]showwaves=s=640x240:mode=p2p:colors=$first_label_color,drawtext=text=$first_label:x=10:y=10:fontcolor=$first_label_color:fontsize=48,format=yuv420p[vt];
    [1:0]showwaves=s=640x240:mode=p2p:colors=$second_label_color,drawtext=text=$second_label:x=10:y=10:fontcolor=$second_label_color:fontsize=48,format=yuv420p[vb];
    [vt][vb]vstack[v2];
    [v0][v1][v2]concat=n=3:v=1:a=0[v_all]
    "\
    -map "[a_all]" \
    -map "[v_all]" \
    "$output_file"
}
```

### 使い方
```bash
make_audio_comparison \
  "１つ目に提示する音声ファイル" \
  "１つ目に提示する音声のラベル" \
  "１つ目に提示する音声のラベルの色" \
  "２つ目に提示する音声ファイル" \
  "２つ目に提示する音声のラベル" \
  "２つ目に提示する音声のラベルの色" \
  "出力ファイルのパス(mp4)" \
  "音声を正規化するかどうか（Trueもしくは無指定）" \
```

### その他
　ffmpegの`filter_complex`の扱い方が難しい。。
関数オブジェクト記法は関数定義記法に置き換えられない場合がある？？？

本内容を利用した場合の一切の責任を私は負いません。

「関数オブジェクト記法」、「関数定義記法」は自分が勝手につけた名称です。
定義も厳密にどうとも言えません。
簡単に言えば、

- 関数オブジェクト記法  
関数に、引き数のとこにfunctionから始まる関数定義を書く書き方  
(コールバックを必要とする関数でよくある。)

```Javascript

func1(
    function()
    {
    });

```

- 関数定義記法  
一般的な、スコープ等に含まれない書き方

```Javascript

function()
{
}

```

困ったのは下記です。

```HTML:a.htm

<!DOCTYPE html>
<html>
    <head>
        <title>怪しいコールバック</title>
        <script src="a.js"></script>
    </head>
    <body>
        <input type="button" value="root1" onclick="root1();">
        <input type="button" value="root2" onclick="root2();">
    </body>
</html>

```

```Javascript:a.js

/**
* p2という外部パッケージのコールバックを使用する関数を想定。
* 中身を書いているが、本来はわからなかったり、変更できなかったりするもの。
* @constructor
*/
function p2func(func)
{
    func();
}

/**
* p1という外部パッケージのコールバックを使用する関数を想定。
* 中身を書いているが、本来はわからなかったり、変更できなかったりするもの。
* @constructor
*/
function p1func(func)
{
    func();
}

/**
* [関数オブジェクト記法]パッケージのメソッドを使用するコード
* argをコールバックに渡すことができる。
* @constructor
*/
function root1()
{
    let arg = 1;
    p1func(
        function()
        {
            p2func(
                function()
                {
                    console.log(arg);
                }
            );
        }
    );
}

/**
* [関数定義記法]パッケージのメソッドを使用するコード
* まずはp2funcのコールバックを関数定義記法にできるか。
* 辛うじてこれはできたが定義が関数内。。。
* もう1つ、これをjsdocにかけてもコールバックは認識されない。
* 外に定義する方法は無い？？？
* @constructor
*/
function root2()
{
    let arg = 1;
    p1func(
        function()
        {
            p2func(p2callback);

            /**
            * p2funcのコールバック
            * @constructor
            */
            function p2callback()
            {
                console.log(arg);
            }
        }
    )
}

```

もしもスマートな方法が本当に無いんだとしたら、コールバックでその辺にある変数を使わない方がいいかも。 
(置き換えれないため、縛りが多く、融通が利かなくなる可能性がある。) 
そもそもコールバックなので、本質的にそこにあるものを使わないのは当然という気もするけど。
公開鍵システムでよく言われること

公開鍵 と 秘密鍵 
このふたつでできること

**自分の秘密鍵で作ったものは自分の公開鍵でしか元に戻せない。**
**自分の公開鍵で作ったものは自分の秘密鍵でしか元に戻せない。**

これが、公開鍵システムの大前提です。
これは、アルゴリズム云々のおはなしがわからなくても、知っておきたいツボです。
これを使用しているのが、PGP のシステムで、現在は良く使われいているのは GNUPG です。

たとえば、私があなたにメールを送ったとします。私はいつもPGPの仕組みを使って署名しています。
つまり、私の秘密鍵で作ったメッセージは私の公開鍵を使えば元のメッセージに戻せます。
なぜこんな仕組みが必要かというと、「私が送りました」という証拠がこれで成り立つからです。

逆に、私に対してあなたが秘密のメールを送りたいときは、PGPの仕組みを使って暗号化して送ればよいのです。
つまり、あなたが私の公開鍵で作ったメッセージは私の秘密鍵でしか元に戻せません。

これを応用して複合技ができます。
あなたの公開鍵を使って暗号化したメールを私の秘密鍵で署名する。
すると私が送ったという証拠とともに暗号化したメールが送られ、
私の公開鍵で復号化して、私が送ったという証拠が残るとともに、あなたに対して暗号化メールを送ることができるのです。

お約束
-
公開鍵 と 秘密鍵
このふたつのうち秘密鍵は外敵から守らなければなりません。
もうひとつ守らなければならないのは、秘密鍵を動作させるパスフレーズです。
この3つでシステムが成り立つようにできています。


用法をまもって正しく使いましょう。

以上!!
WindowからMacに移ったけど、最近またWindowsに戻ってきた人のためのWindows10

# Homebrewのようなパッケージ管理ツールはないの？
Chocolatey https://chocolatey.org/ がおすすめ。

## コマンド例

```powershell
PS> choco list -l
```


## よく使うChocolateyコマンド一覧

|内容|コマンド|管理者権限|
|:-----------------|:------------------|:----|
|インストール済パッケージを確認|choco list -l| |
|アップデート出来るパッケージリスト|choco outdated ||
|パッケージを検索|choco search [パッケージ名]||
|インストール|choco install [パッケージ名]|必要|
|アップデート(全て) |choco upgrade -y all|必要|
|アンインストール |choco uninstall [パッケージ名]|必要|

# 「送る」にアプリを登録したい
以下のフォルダにショートカットを作成する

```
C:\Users\[アカウント名]\AppData\Roaming\Microsoft\Windows\SendTo
```

# スタートメニューにアプリを登録したい
以下のフォルダにショートカットを作成する

```
C:\Users\[アカウント名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
```

# コントロールパネルはどこ？

 `Win` + `s` → `コントロールパネル` と入力

# 環境変数のあれこれ

## Pathを確認

```powershell
PS> $env:Path
```

## 一覧

```powershell
PS> Get-ChildItem env:
```

## 環境変数に登録(一時的)

```powershell
PS> $env:SomeEnvItem="something"
```

## 環境変数に登録(永続的)
`Win` + `s` → `環境変数を編集`

# Unix 環境が恋しい
完全な代替は難しいですが、WSL(Windows Subsystem for Linux)を有効化するとUnix系のコマンドが使えるようになります。

# 見た目が奇麗じゃないんだけど…
あきらめてください。フォントは下記アプリで多少はマシになるかも。
[Meiryo UIも大っきらい!! (No!! Meiryo UI)](http://tatsu.life.coocan.jp/MySoft/WinCust/#DLnoMeiryoUI)

# なんか使いにくい
昔のWindows知っていると逆につらい。UIも散らかっているのでマウス操作はあきらめてショートカットを多用する使い方が便利です。
参考サイト: [いまだに使いにくいというオッサンのためのWindows10の講座](http://fukuyuki.net/post-946/)
イニシャライザについて(Swift)

#イニシャライザについて
イニシャライザは型のインスタンスを初期化するための記法です。全てのストアドプロパティはインスタンス化の完了までに値が代入されていないと、初期化（インスタンス化)できないため、プロパティの宣言時（呼び出し時）に初期値を持たないプロパティは、イニシャライザ内で初期化してプロパティに値を与えることができます。

#定義方法
##普通のイニシャライザ
下記のコードを各型内（クラス、構造体、列挙体）で定義することで、利用できます。
イニシャライザはinitキーワードで宣言し、引数と初期化に関する処理を定義します。

```
init(引数) {
  初期化処理
}
```
**サンプルコード**

```
//構造体定義
struct Greeding {
　　//ストアドプロパティ定義
   let to: String

　　//コンピューテッドプロパティ定義
   var body: String{

   return "Hello, \(to)!"
   }
//インスタンス化時に渡されるtoの値をself.toで型のストアドに代入
   init(to: String) {
     self.to = to
   }
}

//インスタンス化時に型の引数に値の入ってないストアドプロパティの値を記述
let greeting = Greeting(to: "Yosuke Ishikawa")
let body = greeting.body

//結果
Hello, Yosuke Ishikawa!
```
上記のサンプルコードがイニシャライザの使用例です。
本来定義時に値を代入しておかなければいけないはずのストアドプロパティに値が設定されていません。
しかしその代わりinitでイニシャライザを定義することで、インスタンス化時に渡される値をself.toで自身のtoに代入しています。
このおかげで実行結果も正しく出力されました。

##失敗可能なイニシャライザ
イニシャライザは全てのプロパティを正しい型の値で初期化しますが、インスタンス化時に渡される引数次第では初期化できないケースが発生します。もちろんその場合はコンパイルエラーになります。
そこで初期化の失敗も加味した、**失敗可能イニシャライザ（failable initializer)**を使用します。
失敗可能イニシャライザはinitに?を加え**init?(引数)**という形で定義します。
それでは早速実装コードを見てみましょう。

**サンプルコード**

```
//構造体定義
struct Item {
　//ストアドプロパティ定義
  let id: Int
  let title: String

　//失敗可能イニシャライザ定義
  init?(dictionary: [String: Any]) {
     guard let id = dictionary["id"] as? Int,
           let title = dictionary["title"] as? String else {
           return nil
      }
      self.id = id
      self.title = title
   }
}

let dictionaries: [String: Any] = [
    ["id": 1, "title": "abc"],
    ["id": 2, "title": "def"],
　　　//idがない！
    ["title": "ghi"],
]

for dictionary in dictionaries {
    if let item = Item(dictionary: dictionary) {
       print(item)
    } else {
       print("エラー: 辞書\(dictionary)からItemを出力できませんでした")
    }
}

//結果
Item(id: 1, title: "abc")
Item(id: 2, title: "def")
エラー:辞書["title": "ghi"]からItemを生成できませんでした
```
上記のコードを見ると、失敗可能イニシャライザが定義している内部でguard文が定義されています。ここでは詳しい解説は省きますが、guard文とはfalseの場合に処理を行う文です。そのため、条件のidとtitleがない場合はnilを返します。それ以外のtrueの場合は通常通りselfを用い、自身のidとtitleに引数で指定された値を代入します。
その結果、実行結果は３つ目の結果だけidがないためエラー文が出力されます。

#注意点
プロパティの初期化はコンパイラによってチェックされています。そのため、一つでも初期化されていないプロパティがある場合は、型の整合性が取れなくなってしまうためコンパイルエラーとなるので注意が必要です。
iTerm2 の起動時に tmux コマンドを自動で実行する

# やりたいこと

iTerm2 を起動した時に tmux コマンドを自動で実行したい

# 環境

## Mac
10.13.6

## iTerm2
Build 3.3.3

![190910-0005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21296/cc220158-97fc-7b52-ae6d-e85663e688ea.png)

# 手順

Preferences > Profiles > General

Send text at start に tmux と入力

![190910-0006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21296/a703f036-7e2d-dc08-3e9b-482cce431acb.png)

# 結果

iTerm2 起動時、ウィンドウ立ち上げ、タブ起動でも tmux コマンドが実行されるようになります

![190910-0007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21296/8f2488d3-ad79-33e4-c287-b59129aea731.png)
SSH 公開鍵を公開していい仕組み

公開鍵認証で必要なこと
-
SSHでは、
 - パスフレーズ
 - 秘密鍵
を外敵から守ればよいです。では、なぜ公開鍵を公開しても問題ないのでしょう？

公開鍵認証の仕組み
-

公開鍵認証に必要なものが3つありまして、
さっきの
 - パスフレーズ
 - 秘密鍵
と
 - 公開鍵
をそろえたらこれでオーケーです。

難しいことは私も良くわかりませんが、素数の組み合わせにより成り立っているそうです。
簡単に言えば、片方の鍵(公開鍵)からもうひとつの鍵(秘密鍵)が推測できない仕組みがあるそうです。

だから、公開鍵をいくら公開しても秘密鍵とパスフレーズさえ他人にばれなければ秘密は守られるのです。

わかったような、わからなかったような。

もうひとつ大事なこと
-
ひとつ大事なことを忘れていました
**パスフレーズはカラ文字(文字列長0のこと)にするのはやめましょう**
その昔、空パスフレーズで鍵を作ってしまったがために、秘密鍵を盗まれただけで阿鼻叫喚の地獄絵図を見た人がいます。
最近のssh-keygenコマンドは5文字以下のパスフレーズは受け付けないみたいですので問題ないかと思いますが…。
Jenkins Piplineで他のJobにビルドパラメータを渡す方法

Jekins piplineに慣れてなくて
ビルドのパラメータをどうやって他のJobに渡すのか分からなかったのでメモ。

Jenkinsのビルドパラメータを定義
![hga.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210/f7bc0c00-1a3a-6a21-0db6-6ada5a0cbe41.png)


Jobの引数は `params.` を付ける。

```groovy
node {

    stage('hoge build') {
        build job: 'hoge-build', parameters: [
            string(name: 'TARGET', value: params.TARGET)
            ]
    }
    stage('fuga build') {
        build job: 'fuga-build', parameters: [
            string(name: 'TARGET_ENV', value: 'production'),
            string(name: 'TARGET', value: params.TARGET)
            ]
    }
    
}
```

＄は付けない。
Automation Anywhere★基本入門「Message Box」★



Automation Anywhereの情報が少ない！
まだ少ない！

せっかくAA CEをインストールしたのに、操作方法がよくわからない。
基本的な操作が分かれば、あとは応用を頑張るよ！という方の為に。
※有償版と、ほとんど操作は変わりません。
コマンドの基本的な使用方法にメインに掲載します。

今回は「Message Box」
さぁ、Botを作りましょう:relaxed:



・AA CEを起動します。
左上の「NEW」をクリックすると、画像のポップアップが出てきますので
「Work Bench」もクリック

新規でBot作成をする際は、この手順になります

<img width="806" alt="1_aa.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/5926205e-84d8-e0b9-ab67-82c6ef04ff2c.png">


・画面がもう一つ立ち上がります。
この画面でBot作成(開発)を行います


<img width="677" alt="2_aa.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/ac4f971f-13d1-0f03-8444-3cedccb39468.png">

・「Message Box」コマンドを表示させます。
左側にある表示が「コマンド」です。
必要なコマンドを「ドラッグ＆ドロップ」「ダブルクリック」で選択します


<img width="748" alt="3_aa.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/d782fade-b459-e18c-f10d-b00109ce97ce.png">

・この中からコマンドを探すのは大変です！
適当なコマンドをクリックし、探したいコマンドの頭文字を押してみてください
「M」で始まるコマンドをAAが探してくれます！

・「Message Box」が選択されましたら「ダブルクリック」してみましょう。
※今回は「ダブルクリック」推します



<img width="758" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/3fb8b71f-0966-0a26-f5ca-463e76e0f29b.png">

★コマンド「Message Box」が開きます。

・表示したい内容を入力してゆきます。

「初めてのAA記念日  $Year$年$Month$月$Day$日」という内容を入力します

先ず「初めてのAA記念日(文字列)」を直接入力しますが、「""」では囲いません！
次に「$Year$年$Month$月$Day$日」を入力します。
こちらはシステム変数を設定しています(年月日は文字列入力です)

「F2]キーを押下すると、AAのシステム変数(ローカル変数)一覧があらわれます。
ここでも、設定したい変数の頭文字を押し、insertします。




<img width="398" alt="5_aa.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/3d1af67b-fa90-d6a5-9459-3ffed8fbc0ae.png">



<img width="398" alt="6_aa.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/38288e44-ac9e-3884-0d9e-e80ab37d84de.png">

メッセージの入力が完了したら「Save」なのですが！
メッセージ入力欄の下の赤枠の部分で「表示秒」を設定可能です

「Close messege box after」にチェックを入れ、閉じるまでの秒を設定します。
このチェックをつけないままだと、ずっと消えませんMessage Box。


ここまで来たら、実行のみ！
AAはRunする前に「保存」が必ず必要です。
うっかり保存し忘れてしまう事がないので、大変、助かっています。

<img width="644" alt="7_aa.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489732/613bb996-3d78-ba9d-0287-42ccfe24606c.png">



保存もできたら「Run」を押してみてください！

Messageが表示されたら「初めてのAA]が動きます！



★AAにおいて「Message Box」の役割は意外と重要です。
設定した変数値が正しく取得されているか、何かの処理をした際の完了メッセージ等、頻繁に使用しています。



Automation Anywhere　★基本入門★
「Message Box」これにて終了！
お読みいただき、ありがとうございました:kissing_heart:

次回は「Excel」を開きます。
salesforce(今更その2)ListとDateTimeの便利技

#Listのサイズは決められる

Listってあらかじめサイズを決めておいてなんばん目に格納するかを決められるんですね。
1年やってて初めて知った。。。

```ruby:sample
String[] sampleList = new String[10];
system.debug(sampleList);
system.debug(sampleList.size());
```

<img width="595" alt="スクリーンショット 2019-09-10 20.20.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/8b15ab66-4194-48c6-4f31-561ba06ed7b3.png">

nullが入るんすね。
Integerとかでも同じ形になりました。

ここに値を代入していきます。

```ruby:sample
sampleList[0] = '朝起きる';
sampleList[5] = '歯を磨く';
sampleList[9] = '家を出る';
```

<img width="595" alt="スクリーンショット 2019-09-10 20.27.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/2b032e5e-ca06-4b04-690e-1222538f2445.png">

ちゃんと指定した箇所に代入されてますね。
うまく使えばリスト並び順を指定したリストを作るのに役立ちそうです。

#DateTimeで曜日をとれる！！

Date型では曜日を取ることはできないんですが、DateTime型では曜日を取得することができるみたいです。

```ruby:sample
DateTime sampleDate = datetime.newInstance(2019, 09, 10);
system.debug(sampleDate.format('EEE'));
system.debug(sampleDate.format('EEEEE'));
```

<img width="595" alt="スクリーンショット 2019-09-10 20.32.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/835aa6a2-6dc1-63a7-37f8-7b1f295a9ce6.png">

format()の中に'EEE'もしくは'EEEEE'を入力します。
'EEE'は略称の曜日が'EEEEE'では正式な形で出力されます。

土日の判定とかこれでできますね。

今更かもですが初めて知ったことばっかりなので書きました。
Zaim APIでハマったこと

公式ドキュメントやその他ブログ等で拾えなかった情報をメモします。

# 実現したかったこと

- 夫婦で財布を別に管理しつつ、食費や光熱水費などは割り勘にしたい
- zaimでクレカや現金を管理し、割り勘対象にするものをzaimで管理する
- 月末に処理スクリプトを回して、Zaim REST APIからデータを取得する
- 各人の支払いを相殺し、どちらがどちらに何円はらうか計算する

# 落とし穴１: APIでは「集計対象」の情報は取得できない

サポートにも問い合わせてみましたが、集計対象（「常に含める」「常に含めない」「月ごと・年ごとに含める」「年ごとに含める」）は取得できませんでした。

# 落とし穴2: APIでは金融機関から取得したデータは取得できない

Zaimの特徴の一つは、クレカや金融機関から入出金データを取り込む機能です。しかしながら、金融機関から取得したデータはAPIからは取得できませんでした。
サポートによると、法人向けAPIのみ対応しているそうです。

# 代替策
未定
ローカルでビルドをしたplaycanvas.jsを使用する

PlayCanvasでは自分でビルドをしたPlayCanvasのスクリプトを使用することができます。  

### PlayCanvasをビルドする環境を整える
1. Node.jsをインストール
2. GitHub

### PlayCanvasをビルドする
![ScreenShot 37](https://user-images.githubusercontent.com/39250588/64609134-bde8b380-d3bb-11e9-90ce-8ccc60f54d61.jpg)

```bash
1. git clone git@github.com:playcanvas/engine.git
2. cd engine
3. yarn build #これでビルドがされます
```

### ビルドしたPlayCanvasをローカルで動かす
![ScreenShot 37](https://user-images.githubusercontent.com/39250588/64609218-f8eae700-d3bb-11e9-9971-24d8cf75e47e.jpg)

playcanvas/engineの`npmスクリプト`にある`serve`コマンドを使用することでローカルにサーバーを建てることができます。

`yarn serve`



### 起動をするURLに対して`use_local_engine`のパラメーターをする。

PlayCanvasで開発時に`Launch`時にURLにパラメータを渡すことで使用するPlayCanvasのバージョンを変更することができます。
[ドキュメント](https://developer.playcanvas.com/en/user-manual/scripting/custom_engine/)
※`PlayCanvas 1.23`のアップデートからビルド後のスクリプトのファイル名が`playcanvas-latest.js`から`playcanvas.js`に変更されました。

サンプルとして先程作成したプロジェクトを使用します
1. `Launch`から起動をします。そうするとこのようなURLが発行されます。
[https://launch.playcanvas.com/802266?debug=true](https://launch.playcanvas.com/802266?debug=true)
2. `use_local_engine`の値にローカルの`playcanvas.js`を使用する
[https://launch.playcanvas.com/802266?debug=true&use_local_engine=http://localhost:51000/playcanvas.js](https://launch.playcanvas.com/802266?debug=true&use_local_engine=http://localhost:51000/playcanvas.js)

これで自分のローカルでビルドをしたPlayCanvasのスクリプトを読み込むことができます。

<font color="OrangeRed">
PlayCanvas開発で参考になりそうな記事の一覧です。
</font>
<font color="OrangeRed">
入門

- [PlayCanvas入門- モデルの作成～ゲームに入れ込むまで](https://qiita.com/yushimatenjin/items/2a2c35fe7b1d08f9e361)
- [JavaScriptでスロットを実装する。【PlayCanvas】](https://qiita.com/yushimatenjin/items/e84c42da74df1eb07386)
- [3Dモデルのビューワーを3分で作る【初めてのPlayCanvas】](https://qiita.com/yushimatenjin/items/4b09c9e2076a0b2a6933)
</font>
<font color="OrangeRed">
応用
</font>

- [PlayCanvasのコードエディターでes6に対応する](https://qiita.com/yushimatenjin/items/a61a21c64c1c1a550dd4)
- [Gulpのプラグインを書いたらPlayCanvasでの開発がめちゃくちゃ便利になった](https://qiita.com/yushimatenjin/items/5f0f178e8a4ba4a5ee57)
- [PlayCanvas Editorに外部スクリプトを読み込む新機能が追加されたので開発方法を考える。- Reduxを組み込む](https://qiita.com/yushimatenjin/items/7a64220cceac66843d7d)
</font>
<font color="OrangeRed">
その他の記事はこちらになります。

- [React Native + PlayCanvasを使ってスマートフォンゲームを爆速で生み出す](https://qiita.com/yushimatenjin/items/7c7ad5d35473c11f32f2)
- [PlayCanvasのエディター上でHTML, CSSを組み込む方法](https://qiita.com/yushimatenjin/items/814b4a32db53397219df)
- [【iOS13】新しくなったWebVRの使い方 ](https://qiita.com/yushimatenjin/items/344d86b3d193e0a88567)
</font>

<font color="OrangeRed">
その他関連
- [PlayCanvasタグの付いた記事一覧](https://qiita.com/tags/playcanvas)
</font>


### PlayCanvasのユーザー会のSlackを作りました！
少しでも興味がありましたら、ユーザー同士で解決・PlayCanvasを推進するためのSlackを作りましたので、もしよろしければご参加ください！

[日本PlayCanvasユーザー会 - Slack](https://t.co/IdSRIfJhN5?amp=1)
SSHの公開鍵を4096ビットで作って送ってください･･･といわれたら

もし「SSH の公開鍵を4096ビットで作って送って」といわれたら。

```
$ ssh-keygen -b 4096
```

で作ればオーケー。

あとは、[ SSH公開鍵認証ってなんぞやという前にとにかく公開鍵を送りましょう。](https://qiita.com/evakichi/items/dad805b89e499739f8e6) を参考に鍵を作って送りましょう。

以上!!
Splunkを使ったセキュリティインシデント調査レーニング

#Boss of the SOC
- 皆さん、Splunk社主催のCTFイベント（Boss of the SOC）をご存知でしょうか
- Splunkを使ったセキュリティインシデント調査のトレーニングにもなるコンテンツです
- だいたい毎年新しいシナリオがリリースされています(2019.09時点でv3まで存在)


#Ver2.0まではgithubに自己学習用コンテンツとして公開
- CC0(クリエイティブコモン)ライセンスにつき、どなたでも好きなように利用可能
- CC0の詳細は[こちら](https://creativecommons.org/publicdomain/zero/1.0/)


##Ver1.0
- データセット
    - https://github.com/splunk/botsv1
- 学習用App
    - https://splunkbase.splunk.com/app/3985/ 
<img width="1376" alt="スクリーンショット 2019-09-10 19.34.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/4b55baf7-3d42-3667-a376-c16cd96333fa.png">


##Ver2.0

- データセット
    - https://github.com/splunk/botsv2

- 学習用App
    - https://splunkbase.splunk.com/app/4430/
<img width="1392" alt="スクリーンショット 2019-09-10 19.35.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/9a76c555-bf0f-9ee1-1653-25d895c0d39e.png">


準備の仕方（ver1.0を例に実施）
---
- まずデータセットをDLして/opt/splunk/etc/app配下に展開します
    - このとき、データセットには[フルサイズ](https://s3.amazonaws.com/botsdataset/botsv1/splunk-pre-indexed/botsv1_data_set.tgz)と最小限の[attack onlyデータ](https://s3.amazonaws.com/botsdataset/botsv1/botsv1-attack-only.tgz)の②種類が存在します
    - 容量の小さいattack onlyデータでも十分学習できます
    <img width="1144" alt="スクリーンショット 2019-09-10 19.40.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/98819ffd-36c2-f389-c8e9-7853f5b05796.png">

- 例：Linuxの場合

```
データをwgetでダウンロード
# wget https://s3.amazonaws.com/botsdataset/botsv1/botsv1-attack-only.tgz

圧縮データの解凍
# tar zxvf botsv1-attack-only.tgz 
```

- 続いて[学習用App](https://splunkbase.splunk.com/app/3985/)をインストールして、Splunkに手動アップロード
    - ※Spluk v7.3を使っているとSplunkのAppのブラウジングにはヒットしないため
- 更に必要となるAdd-Onをインストールしておく
<img width="1134" alt="スクリーンショット 2019-09-10 19.44.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/50579f12-bea0-bf20-4432-9b3646342d3a.png">
- Splunkを再起動
- ver2.0も基本的なセットアップ手順は一緒です


学習Appの使い方
---
###Appを開く
<img width="401" alt="スクリーンショット 2019-09-10 19.46.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/3d3ed394-7776-6bf3-fde0-6cb8bbf3c8b5.png">
###インシデントシナリオごとの章立てになっています
<img width="519" alt="スクリーンショット 2019-09-10 19.47.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/e7bf77a7-5e16-0b39-086d-ceafc2b6f4b4.png">
### 問題一つ一つ調査の仕方をstep by stepで説明
<img width="1670" alt="スクリーンショット 2019-09-10 19.50.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/32379bfe-266f-e01b-828a-88c1c733d971.png">
<img width="1661" alt="スクリーンショット 2019-09-10 19.50.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/0d0d82a3-1dd6-af66-ea45-b5c907ccc78d.png">



### 問題、解説ともにすべて英語ですが、１つ１つサーチの順を追って学習できますのでお手元のPCにSplunkを入れてお試しあれ。
https://qiita.com/toshikawa/items/403aaf0901e778629e6d#_reference-7d234c5801a6177302d3