OmniAICreator/Qiita-1.07M huggingface dataset:
Oracleのパスワードに"/"を入れたらsqlplusでログインできなくなった

## 概要
Oracleのパスワードに"/"を入れたらsqlplusでログインできなくなったので解決した話です。
パスワードは「test/test」と仮定しています。

## 詳細
どうやら、"/"があるとコマンドラインのオプションと思うようで以下のようなエラーになりました。
エスケープなど頑張ってみたのですがダメでした:frowning2:

```sh:ターミナル
$ sqlplus testuser@db001

SQL*Plus: Release xx.x.x.x.x Production on xxxxxxxx
Copyright (c) 1982, 2016, Oracle.  All rights reserved.

パスワードを入力してください: 【"test/test"を入力】
SP2-0306: オプションが無効です。
使用方法: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM|SYSBACKUP|SYSDG|SYSKM|SYSRAC}] [edition=value]]
条件 <logon> ::= <username>[/<password>][@<connect_identifier>]
      <proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
ユーザー名を入力してください:
```

## 解決策
sqlplus /nologでsqlplusに入り、connコマンドでログインする。

```sh:ターミナル
$ sqlplus /nolog

SQL*Plus: Release xx.x.x.x.x Production on xxxxxxxx
Copyright (c) 1982, 2016, Oracle.  All rights reserved.

SQL> conn testuser/"test/test"@db001
接続されました。
SQL>
```
ログインできたらpasswordコマンドでパスワードを変えると良いと思います。僕は速攻で変更しました:relaxed:

## 最後に
解決できるまで、"/"をパスワードいれた自分の未熟さを恨みました:sob:
Android Studio3.2でCould not find lint-gradle-api.jar (com.android.tools.lint:lint-gradle-api:26.1.2).

# 環境

- Android Studio `3.2.1`
- プロジェクトのGradle Plugin：`3.1.2`

# 現象
- **Android Studio 3.2.1でプロジェクトを初めて開くとエラーメッセージが表示された**
  - エラーの元はとgradleのようだ
  - プロジェクトは３年以上前に作成された古いアプリ
  - Android Studio 3.1でビルドはできていた

### エラーログ

```
FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project 'my_android_project'.
> Could not resolve all files for configuration ':classpath'.
   > Could not find lint-gradle-api.jar (com.android.tools.lint:lint-gradle-api:26.1.2).
     Searched in the following locations:
         https://jcenter.bintray.com/com/android/tools/lint/lint-gradle-api/26.1.2/lint-gradle-api-26.1.2.jar
```

`classpath`が解決できてない？
`lint-gradle-api.jar`とは一体なんだ...？

classpath という単語があるなら、トップレベルbuild.gradleが原因に違いない。

# 原因

[このstackoverflow](https://stackoverflow.com/questions/46972122/could-not-find-com-android-tools-lintlint-gradle-android-studio-3)によると、トップレベルのbuild.gradleにある依存関係の宣言順が間違っている。

```gradle
buildscript {
    repositories {
        jcenter()
        google() // <=宣言順がおかしい
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath 'com.google.gms:google-services:3.2.1'
    }
}

allprojects {
    repositories {
        jcenter()
        google() // <=同上
        mavenCentral()
        maven { url "https://maven.google.com" }
    }
}
```

公式も順番は優先度に関係があると言っている。
[Dependency order | Android Developers](https://developer.android.com/studio/build/dependencies#dependency-order)

日本語訳
`最初のライブラリーは2番目のライブラリーよりも高い優先度を持ち、2番目のライブラリーは3番目のライブラリーより高い優先度を持ちます。`

エラーログを見るに、
`lint-gradle-api.jar (com.android.tools.lint:lint-gradle-api:26.1.2).` が `  https://jcenter.bintray.com/~` から検索したが見つからないと出ている。

おそらく`lint-gradle-api.jar`は`jcenter()`の中ではなく、`google()`の中に含まれているんだろう。

それでこのようなエラーログが出ていると予想した。

# 解決策

`google()`の宣言位置を一番上に移動させるだで解決した。

```gradle
buildscript {
    repositories {
        google() // <=jcenterの前に移動
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath 'com.google.gms:google-services:3.2.1'
    }
}

allprojects {
    repositories {
        google() // <=同上
        jcenter()
        mavenCentral()
        maven { url "https://maven.google.com" }
    }
}
```

これは古いAndroid Studioで作成されたバージョンで発生する問題のようで、割と見かけるエラーなのかもしれない。
自分は初めて見たけどね。
mojaveでpod init エラー


mojave ```pod init``` をするとエラーが起きる

```
-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory
```

こちらで解決

```
$ sudo gem update --system -n /usr/local/bin
$ sudo gem install -n /usr/local/bin cocoapods
```
spring framework 簡易勉強メモ（一）：ApplicationContext、Bean、Autowired

# spring framework 簡易勉強メモ（一）：ApplicationContext、Bean、Autowired

### 本質
   - new classの回避
   - IoC、DI、依存性の注入

### 考え方
   - 容器の定義（ApplicationContext）
   - 入れ物の定義（Bean）

### 定義方法

   - A、JAVAベース
   - B、XMLベース
   - C、アノテーションベース★

### JAVAベース

   - @Configuration(容器側)
   - @Bean(容器側)

### XMLベース

   - XMLファイルより

### アノテーションベース

   - @Configuration(容器側)
   - @ComponentScan(容器側)
   - @Component(入れ物側)

### Beanの参照

   - A、setXXX()
   - B、コンストラクタ()
   - C、@Autowired★

### @Autowired
   - @Autowired(required = false)
     - injection時値が必須かどうか設定、未設定時エラーを回避
   - @Qualifier("XXX") 
    - injection時型ベース⇒名前ベース、同じ型複数Beanを注入可能
   - @Bean(name = "XXX")
    - 指定可能
   - @XXX
    - アノテーションの自分定義が可能
   - @Resource
    - フィールドまたプロパティ
   - ListやMapで一括Autowiredは可能

### @ComponentScan

   - @ComponentScan(basePackages = "XXX.XX.XX")
   - 対象：
    - @Controller リクエストやレスポンス
    - @Service　ビジネス
    - @Repository　データ永続化
    - @Component　上記以外
   - フィルター指定可能

### Beanのスコープ

   - singleton（default）
    - DIコンテナに同一のインスタンス
   - porototype
    - Beanを取得時インスタンスを生成
   - session
    session単位
   - request
    request単位
   - など略

### 異なるスコープ問題の理解

   - 生成インスタンスの本質から考慮
   - scoped proxyの使用

### 容器の破棄

   - 明示的にクロース
    context.close()
   - try-with-resources

### Configの分割

   - @import({AxxConfig.class,BxxConfig.class})

### Configurationのプロファイル化

   - @profile("development")
   - @profile("production")
   - 環境ごとで上記を選択可能
Ansible Vault と SSM Parameter Store を組み合わせてみた

もっといいやり方があるのではと思いつつ。
# Ansible Vault設定

`ansible-vault` コマンドで秘匿情報を作成・編集する。
例えば `hosts/hoge` 配下にインベントリ設定をしているときに、all向けに秘匿情報を設定したい場合を考える。この場合、 `hosts/hoge/group_vars/all` 配下に秘匿情報として `vault.yml` を作成すれば良い。

```shell
$ ansible-vault create /hosts/hoge/group_vars/all/vault.yml
```

上記コマンドの実行時に暗号化および復号用のパスワードを入力する。

作成した `vault.yml` を編集するときは `edit` サブコマンドを使う。

```shell
$ ansible-vault edit /hosts/hoge/group_vars/all/vault.yml
```

いずれも端末デフォルトのエディタが立ち上がって編集可能になる。

vault.yml の中では `vault_` というプレフィックスで変数を定義し、平文の変数ファイル内で参照すると取り回しが良い (role内で直接参照すると細かな変更が辛くなりがちである)。 以下はDataDogのAPIキーとして `vault_dd_api_key = xxxxxxxxxxxxx` を暗号化して、 `all.yml` で読み出す例。

```yml:group_vars/all/all.yml
### Datadog Settings
# vault_... は Ansible Vault で設定した秘匿情報
datadog_api_key: "{{ vault_dd_api_key }}"
datadog_checks:
  process:
    init_config:
    instances:
      - name: ssh
        search_string: ['ssh', 'sshd' ]
      - name: chronyd
        search_string: ['chrony', 'chronyd']
      - name: syslog
        search_string: ['rsyslogd']
        cpu_check_interval: 0.2
        exact_match: true
        ignore_denied_access: true
      - name: crond
        search_string: ['crond']
      - name: httpd
        search_string: ['httpd']
```



# Passwd を読むスクリプト

今回は SSM の Parameter Store にセキュリティ文字列としてパスワードを保存する。パラメータ名は自由。今回は `ansible-vault-pass` とする。

- [AWSドキュメント](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/param-create-console.html)
    - KMSのキーを作成し、IAMロール/ユーザに復号許可ポリシーを設定する必要がある。

保存したパスワードを読み出すスクリプトを作成する。

```shell:vault_pass.sh
#!/usr/bin/env sh
aws ssm get-parameters \
  --names "ansible-vault-pass" \
  --with-decryption --query "Parameters[*].Value" \
  --output text
```

このスクリプトをAnsibleのルートに配置して、 `ansible.cfg` に以下を追記する。

```:ansible.cfg
### Ansible Vault のパスワードをスクリプトから取得
vault_password_file = vault_pass.sh
```

上記設定で `ansible-playbook` をすればok。AWSの設定とサーバ設定をまとめて行う場合はこのくらいの設定が楽でいい気がした。

# 参考
- [Gitリポジトリ上でAWSアクセスキーを大公開しないためにAnsible Vaultをフル活用する | ヌーラボ](https://nulab-inc.com/ja/blog/nulab/encrypt-aws-access-key-with-ansible-vault/)
オートシェイプのオブジェクトを取得する方法

#はじめに
Excel VBAのお話です。

シート内の特定のオートシェイプの背景色などのプロパティを変更したいことがあります。
このとき、目的のオートシェイプオブジェクトを取得する必要があります。

ここでは、シート内のオートシェイプオブジェクトの取得方法を紹介します。

#オートシェイプはどこにある？
オートシェイプはSheetオブジェクト内のShapesプロパティに格納されています。
Sheetオブジェクトは`ActiveSheet`や`WorkBooks(ブック番号or名前).WorkSheets(シート番号or名前)`などで指定することができます。


#特定のオートシェイプにはどうやってアクセスする？
`Shapes`と複数形ですので、これもまたWorkSheetsなどと同じように番号または名前で指定することができます。

##番号で指定する場合
これはアクティブシートの１つめのオートシェイプオブジェクトを選択する例です

```vb
ActiveSheet.Shapes(1)
```

##名前で指定する場合

名前で指定する場合は、まずは名前をつけてやる必要があります。
オートシェイプに名前をつける場合は以下のようにします。
対象のオートシェイプを選択すると、シートの左上、関数入力欄の左側（普段であればセルのアドレスが表示される場所）にそのオートシェイプの名前が表示されます。
ここにそのオートシェイプの名前を入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/ce099ffb-6c44-a278-7ad7-37e804c82c19.png)

そうしたら、VBAで以下のように指定してそのオートシェイプオブジェクトを指定できます。
これは`ボタン１`と名付けたオートシェイプを選択する例です。

```vb
ActiveSheet.Shapes("ボタン１")
```

`ActiveSheet`の部分はシートオブジェクトであれば良いので、他の指定の仕方でももちろん構いません。

オートシェイプオブジェクトを取得できたら、あとはそのオブジェクトが持つ様々なプロパティの値を取得したり、設定したりお好きなようにどうぞ。


##使用例
- オートシェイプの名前を取得したい場合：

```vb
ActiveSheet.Shapes(1).Name
```

- オートシェイプの塗りつぶし色を設定したい場合：

```vb
ActiveSheet.Shapes(1).Fill.ForeColor.SchemeColor = 3
```



#すべてのオートシェイプを変更するには？
さて、そうするとすべてのオートシェイプに対して機械的に変更を加えたい場合はどうするのか、という当然の欲求が出てきます。

番号でオートシェイプを指定する方法を上で紹介しましたが、これはつまりForループを回せるということですね。
下の例はシート内のすべてのオートシェイプの塗りつぶし色を緑に指定するものです。

```vb
For i = 1 To ActiveSheet.Shapes.Count
   With ActiveSheet.Shapes(i)
     .Fill.ForeColor.SchemeColor = 3
   End With
Next i
```
Unity WebGL UnityStreamingMovieTexture(WebGLMovieTexture)が動画再生を実現している仕組み

<font color="red">Unity 5の頃の話なので、今は他の手法が取れると思います</font>

https://github.com/jtothebell/UnityStreamingMovieTexture を Unity に組み込むときに調べたことをメモしています
せっかく調べて、「面白い仕組みだな」と思ったので供養しておこうと思います

当時は WebGL 上で MovieTexture が利用できない、という状況でした。それらを踏まえて読んでいただけると幸いです

## やったこと
* WebGL では動画再生のために EasyMovieTexture は使えない (Unity 5.x の頃)
* ので、 WebGLMovieTexture というものを利用した
    * 2018/10/29 現在は https://github.com/jtothebell/UnityStreamingMovieTexture にコードがある
    * EasyMovieTexture は再生制御はいい感じにやってくれるのだが、WebGLMovieTexture は若干クセがある
        * WebGLMovieTexture の時だけ、Update 関数内で texture の Update を実施するように実装してあげる必要がある
        * なぜ、こんなことをしたかというと、下記の「WebGLMovieTexture の仕組み」を読んでもらえればわかると思う

## WebGLMovieTexture の仕組み

* `WebGLMovieTexture.jslib` ([ソースコードはこちら](https://github.com/jtothebell/UnityStreamingMovieTexture/tree/master/Assets/Plugins)) というものと、Unity 側で jslib を利用するための cs ファイルが入っている
* 描画の仕組みは以下の通り
    * WebGLMovieTexture は HTML5 の video タグを利用していて、そこに描画された画像を Unity 側に通知することで機能を実現している
        * video タグ自体には `display: none` あたりが設定されているためユーザには見えない
    * WebGLMovieTexture インスタンスによって video タグが生成される
    * WebGLMovieTextureUpdate は、テクスチャとしてマッピングしたい texture と video インスタンスが引数に渡される
        * ここで、 video インスタンスから OpenGL で video タグにレンダリングされている画像を読み込み、引数で渡された texture にレンダリングする
        * GLctx.textImage2D や GLctx.pixelStorei とかを使っている
    * WebGLMovieTextureUpdate を連続して実行することで動画（っぽく）見せている
        * ちなみに、この関数を呼ぶタイミングは Unity の Update のタイミングにするとよい。
        * WebGLMovieTexture インスタンス生成自体は Awake など任意のタイミングで
Metabase の同時接続が多すぎて負荷がかかった時

Metabase 等の BI ツールを運用する時は、 Read Replica などを立ててそちらにアクセスするのが普通に安全な方法だが、そうでない環境もある。

Metabase は並列で繋ぎに行くので、 Heroku の無料プラン等、同時接続数が限られた環境では死ぬことがある。

Metabase の設定画面で変更できると思っていたが、

https://github.com/metabase/metabase/issues/2172

上記 Issue を読む限り、最大接続数は 15 となっているので問題は無さそうだが、複数のデバイスで見た時に20を超えて、死んだ。

そのような環境では、複数デバイスで見ない方が良さそう。
Docker / Kubernetesのセキュリティ調査メモ

Webや書籍をざっとあさり、Docker / Kubernetesのセキュリティについて調査したメモ。

※この他にも多数ありましたが、まずはこのあたりからかな？というものを書き出しています。

## Dockerのセキュリティ

### ベースイメージ
- 公式イメージを利用する
- alpineなど、小さなイメージを利用する
- Docker Content Trustで署名チェックする

### Dockerfile
- rootユーザを使わず、実行ユーザを使う
- 外部のファイルを追加する場合はチェックサムを検証する
- 機密情報は環境変数など外部から取得する構成にする

### CI
- Quay.ioなどでイメージのセキュリティスキャンを行う
- Docker Bench for Securityで実行環境も含めたベストプラクティスをチェックする

### ホスト
- Container-Optimized OSなど、コンテナのホストとして適切なセキュリティ原則を実装したOSを利用する

### 実行時
- ファイルシステムには最小の権限しか与えない
- `/var/run/docker.sock` をマウントしない
- `--privileged` などで権限を付与しない
- CPUやメモリ使用量に制限をかける

### その他
- dockerdのリモート制御時は認証をかける
- sudo省略のためにユーザをdockerグループに追加することをしない
- docker login後はdocker logoutする
- CPUやメモリ使用量が異常なコンテナがないか監視する
- AppArmor、SELinux、GRSECなどを使用する

## Kubernetesのセキュリティ

### APIサーバ
- APIサーバへのアクセスを制限する
- APIの監査ログを残す
- すべてのAPIトラフィックにTLSを使用する

### ネットワーキング
- CalicoによるNetworkPolicyを設定する
- Istioなどでトラフィックを暗号化する

### コンテナの権限
- Service Account、RBACを適切に設定する
- SecurityContext、PodSecurityContext、PodSecurityPolicyを適切に設定する
- seccomp、AppArmor、SELinuxを利用する
- クラウドのメタデータAPIへのアクセスを制限する

### Kubelet
- Kubeletの権限を制限する
- Kubeletへのアクセスを制限する

### その他
- 機密情報は、base64エンコードでしかないSecretをGitリポジトリにそのままアップロードするのではなく、kubesecやサードパーティのVaultなどで暗号化して管理する
- AWSの場合、kube2iamやkiamでクラスタではなくPodに対してIAM Roleを割り当てる
- kube-benchでクラスタをチェックする
- kube-hunterによるペネトレーションテストを実施する

## 情報元

### Web
- [Docker最新動向2017秋＋セキュリティの落とし穴](https://www.slideshare.net/zembutsu/developers-summit-2017-kyusyu-dist)
- [Docker のセキュリティ](http://docs.docker.jp/engine/security/security.html)
- [コンテナを守る技術2018/container-security-20180310](https://speakerdeck.com/pottava/container-security-20180310)
- [コンテナのセキュリティ（第 1 回）: 3 つの主要領域](https://cloudplatform-jp.googleblog.com/2018/05/exploring-container-security-an-overview.html)
- [コンテナのセキュリティ（第 2 回）: ノード イメージとコンテナ イメージ](https://cloudplatform-jp.googleblog.com/2018/05/exploring-container-security-Node-and-container-operating-systems.html)
- [コンテナのセキュリティ（第 3 回）: Grafeas で管理するコンテナ イメージのメタデータ](https://cloudplatform-jp.googleblog.com/2018/06/exploring-container-security-digging-into-Grafeas-container-image-metadata.html)
- [Kubernetesのセキュリティのベストプラクティス](https://speakerdeck.com/ianlewis/kubernetesfalsesekiyuriteifalsebesutopurakuteisu)
- [Securing a Cluster](https://kubernetes.io/docs/tasks/administer-cluster/securing-a-cluster/)
- [Kubernetes Security - Best Practice Guide](https://github.com/freach/kubernetes-security-best-practice)

### 書籍
- [Docker/Kubernetes 実践コンテナ開発入門](https://www.amazon.co.jp/dp/4297100339)
- [Kubernetes完全ガイド (impress top gear)](https://www.amazon.co.jp/dp/4295004804)
Unity WebGL ブートプロセス

**Unity 5の頃のお話です**
散らかったメモですが、誰かの参考になれば幸いです

## ざっくり Unity WebGL ブートプロセス

* index.html 内に記載されている UnityLoader.js がロードされる
* UnityLoader.js 経由で js/mem を取得する
* その後に data が取得され、WebGL が起動する

## Unity WebGL の成果物構成

* WebGL のビルドが完了したときに以下のファイルが生成される

```
* (Root Folder)
    * index.html
    * TemplateData
        * favicon.ico
        * fullbar.png
        * fullscreen.png
        * loadingbar.png
        * logo.png
        * progresslogo.png
        * style.css
        * UnityProgress.js
    * (Release|Development)
        * .htaccess
        * (Output Name).data(gz)
        * (Output Name).js(gz)
        * (Output Name).mem(gz)
        * UnityLoader.js
```

* Release ビルドを実施すると Release フォルダとなり、Development ビルドをするとフォルダ名が Development になる
* ここで、ビルド毎に異なるファイルは Release or Development フォルダ以下のファイルになる
    * (Output Name).data / (Output Name).js / (Output Name).mem / UnityLoader.js
        * Release ビルド時には gzip 圧縮される 5.X 以上で圧縮形式を選べる。UnityLoader.js は圧縮されない
        * 圧縮されると拡張子の最後に gz が付与される
    * UnityLoader.js はビルド毎に UUID 情報が埋め込まれている。Development の場合には、data ファイルのサイズなども記録されている
* <font color="red">上記のため、リリースをする際には data/js/mem に加え、UnityLoader.js も更新しなければならないことに気を付ける</font>

## キャッシュについて
### js/mem をキャッシュする仕組み

* 既存のブラウザのキャッシュを踏襲している
* そのため配信する Web サーバ側にContent-Cache の設定を行い、変更がなければ、304 Not Modifed が返るように設定すれば、ある程度トラフィックを抑えることができる

### data をキャッシュする仕組み
* Unity 5.x では Player Settings の「Data Caching」を有効にすると .data のキャッシュが働く
* .data が IndexedDB に保存されていて、.data の UUID も保存されている。
* UnityLoader.js 内部で PACKAGE_UUID という UUID を保持しており、その UnityLoader.js の UUID と IndexedDB に保存された PACKAGE_UUID を比較して、UUID が異なっていたらキャッシュから読まずにリモートからデータを取得する
apachebenchで負荷テストをする


昨日、[wrk2を使ってパフォーマンステストをし可視化してみる。](https://qiita.com/RyujiKawazoe/items/1da4342d8854543ca4cc)という記事を書きました。

いざ API Gateway + Lambdaで作成したサーバレス環境に対して負荷をかけようとしたところいっこうにつながらない...

四苦八苦してましたが、わざわざ解決するくらいなら信頼と実績のApache Benchを使ったほうが早いので負荷テストをします。

用意したもの
---

* docker
* Apache Bench
	* [https://hub.docker.com/r/jordi/ab/](DockerImage)を用意してくれた偉大な有志に感謝


docker-composeの環境は下記に簡単なもの用意しました。
https://github.com/RyujiKawazoe/apachebench_study



使ってみる
---

起動

```
docker-compose run apachebench
```

負荷をかけてみる

```
ab -e hogehoge.csv -n 10 -c 1 -t 15 'https://fugafuga.com/'
```

結果が得られる

```
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking fugafuga.com (be patient)
Finished 18 requests


Server Software:        
Server Hostname:        fugafuga.com
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
TLS Server Name:        fugafuga.com

Document Path:          
Document Length:        12400 bytes

Concurrency Level:      1
Time taken for tests:   15.772 seconds
Complete requests:      18
Failed requests:        0
Total transferred:      232092 bytes
HTML transferred:       223200 bytes
Requests per second:    1.14 [#/sec] (mean)
Time per request:       876.247 [ms] (mean)
Time per request:       876.247 [ms] (mean, across all concurrent requests)
Transfer rate:          14.37 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       55   66  11.0     64      90
Processing:   608  810 182.5    763    1380
Waiting:      607  809 182.5    763    1380
Total:        694  876 180.5    824    1449

Percentage of the requests served within a certain time (ms)
  50%    824
  66%    859
  75%    906
  80%    952
  90%   1127
  95%   1449
  98%   1449
  99%   1449
 100%   1449 (longest request)
```
MP4 MetaデータのBinary解析と設定／取得について

##はじめに
アプリから作成した動画ファイル(MP4)を、SharePointから「ファイルプロパティのMetaデータ（タグ）」で検索する要件がありましたが、Metaデータ（タグ）を設定する方法をググっても情報が見つけられなかったので、MP4のBinaryを解析し、Metaデータ（タグ）の設定と取得を行うプログラムを作成しました。

##該当箇所
サブタイトル、評価、タグ以外のMetaデータは「C# + taglib」で修正できます。
今回の記事はタグのみです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148666/9f7aee18-513d-16ab-9152-54e84ee81c70.png)

##Binary解析
「Header Reader MP4」を使用し解析しております。 
※ダウンロードサイトが「https保護」されていないので、リンクは差し控えます。

###UdtaBox
以下の図により、タグ編集前(plan mp4)とタグ編集後(tag edit mp4)を比べると、UdtaBoxにXtraBox追加されていることがわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148666/49d47126-a60c-9d20-b28b-e76c5536ff5c.png)

###XtraBox
タグ編集プログラム作りながら解析した結果を以下に記載いたします。

|byteからまで|byte値|値の説明|
|---|---|---|
|1～4|0x00 0x00 0x00 0x4D|固定値|
|5～8|0x58 0x74 0x72 0x61|Xtra 固定値|
|9～12|0x00 0x00 0x00 0x45|13byte目～最終byteまでの総byte数  |
|13～16|0x00 0x00 0x00 0x0B|固定値|
|17～27|0x57 0x4D 0x2F 0x43 0x61 0x74 0x65 0x67 0x6F 0x72 0x79 |[WM/Category](https://docs.microsoft.com/en-us/windows/desktop/wmp/wm-category-attribute) 固定値  |
|28～31|0x00 0x00 0x00 0x03 |タグ数 ;区切り テスト;test;1234;なので3  |
|32～35|0x00 0x00 0x00 0x0E |テスト文字列のbyte数(unicode) + 8  <br/> 例:) 1文字の場合 0x0A, 2文字の場合 0x0C, 3文字の場合 0x0E, 4文字の場合 0x10 |
|36～37|0x00 0x08 |固定値 タグ文字列の開始 |
|38～44|0xC6 0x30 0xB9 0x30 0xC8 0x30 |テスト文字列 Unicode |
|45～46|0x00 0x00 |固定値 タグ文字列の終了 |
|47～50|0x00 0x00 0x00 0x10 |test文字列のbyte数(unicode) + 8 <br />例:) 1文字の場合 0x0A, 2文字の場合 0x0C, 3文字の場合 0x0E, 4文字の場合 0x10 |
|51～52|0x00 0x08 |固定値 タグ文字列の開始 |
|53～60|0x74 0x00 0x65 0x00 0x73 0x00 0x74 0x00 |test文字列 Unicode |
|61～62|0x00 0x00 |固定値 タグ文字列の終了 |
|63～66|0x00 0x00 0x00 0x10 |1234文字列のbyte数(unicode) + 8 <br />例:) 1文字の場合 0x0A, 2文字の場合 0x0C, 3文字の場合 0x0E, 4文字の場合 0x10 |
|67～68|0x00 0x08 |固定値 タグ文字列の開始 |
|69～72|0x31 0x00 0x32 0x00 0x33 0x00 0x34 0x00 |1234文字列 Unicode |
|73～74|0x00 0x00 |固定値 タグ文字列の終了 |

##設定／取得 プログラム
taglibでUdtaBoxが設定できますが、Binaryしか設定できないので、指定した文字列をBinaryに変換しUtdaBoxに設定するプログラムと、taglibで取得したUdtaBoxのBinaryを文字列に変換するプログラムを作成しました。
設定／取得ともに「タグ」のみです。
GitHubにあります。[TagLibMP4Extentions](https://github.com/hy-since-2001/TagLibMP4Extentions)

###使い方
```cs:sample.cs
string mp4Path = Path.Combine(Environment.CurrentDirectory, "Test.mp4");
//タグの設定
await TagLibMP4Extentions.SetMetaTagAsync(mp4Path, new string[] { "test1", "テスト２", "test３"} );
//タグの取得
var getTag = await TagLibMP4Extentions.GetMetaTagAsync(mp4Path);
```

###環境
- .NET Framework 4.5 以降
- taglib 2.1.0 使用 

```pm:nuget
PM> Install-Package taglib -Version 2.1.0
```
heroku環境作成時のgitとのssh通信手順

母親へ株価通知サービスを作ってあげようと思い、linebotなるものを作成していると、
herokuを使っている記事が多いため参考にした。

https://qiita.com/krocks96/items/67f7510b36945eb9689b

heroku上にアプリをdeployする段階でgitコマンドに公開鍵エラーが出たため、
対応策としてqiitaやgoogleった結果を備忘録として残す。

https://qiita.com/unsoluble_sugar/items/14bea376d8e6fce82eb3

以上。
Python3系インストール覚書

# 前提
login shell はbash 
homebrew インストール済

# 手順

```
brew update
brew upgrade
brew doctor # で確認

# pyenv 入れる
brew install pyenv
# パス通します。
echo 'export PYENV_ROOT=/usr/local/var/pyenv' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"'                 >> ~/.bash_profile
source ~/.bash_profile

pyenv install --list # で入れられるバージョン確認
pyenv install 3.5.4
python --version # -> まだ2.7 
pyenv global 3.5.4
python --version # -> 3.5になってる

# anaconda入れる
pyenv install anaconda3-4.0.0 # pyenv install --list で確認してから
pyenv global anaconda3-4.0.0

python --version　# で確認

```

jupyternotebookもこれで使える。
pandasとかもね

```
pyenv versions
pyenv global system
```
で切り替えができる。
あえてpython2系使うとかだと切り替えて使っている。
ワイヤレスでWindows/MacをAndroid/iOSデバイスにミラーリングして、操作する方法 

![pc-mirror-phone.JPG](https://qiita-image-store.s3.amazonaws.com/0/217547/6ce9d694-db6b-0407-5053-fa48deeaa979.jpeg)

最近、スマホ画面をPCやテレビなどの大画面端末にミラーリングするソフトウェアや周辺機器が増えてきましたが、PC画面をスマホにミラーリングするものはあまり見かけませんでした。調べてみたところ、Windows/Macパソコンの画面をAndroid/iOSデバイスに表示して、操作可能なアプリケーションが見つかりましたので、ここでシェアいたします。

# アプリケーションをインストール

使用するのはApowerMirrorというアプリで、パソコン側ではアプリの公式サイト(https://www.apowersoft.jp/phone-mirror) にアクセスして、ダウンロードボタンをクリックして、PCにダウンロードしてインストールします。

スマホ側では、Google PlayストアまたはApp StoreからApowerMirrorを検索して、インストールします。

# PC画面をスマホにミラーリング

ApowerMirrorをPCとスマホにインストールしたら、PC画面をスマホに表示することが可能です。次の手順にやってみてください。

1. PCとスマホを同じWi-Fiネットワークに接続します。
2. PCとスマホ両方でインストール済みのApowerMirrorを起動します。
3. スマホ側のApowerMirrorアプリで、画面の底にある青い「M」アイコンをタップして、接続可能なデバイスの検出が始まります。
4. 検出が終了されたら、自分のPC名(Apowersoftが前に付いていますが)をタップして、次の画面で「PC画面ミラーリング」をタップします。
![pc-mirror-android.jpg](https://qiita-image-store.s3.amazonaws.com/0/217547/18a6dcb4-6f67-4535-59a0-aed3d66aab72.jpeg)

5. それでPC画面がスマホに表示されます。スマホでの操作の仕方も表示されますので、ミラーリングだけでなく操作もしたい方は確認してください。マウスの操作だけでなく、スマホで文字を入力してPCへ送信することも可能です。
![show-pc-screen.jpg](https://qiita-image-store.s3.amazonaws.com/0/217547/7f2dec0f-af69-f08f-f36b-6cb91d97ba99.jpeg)

# 他の実用機能

その他にも、スマホの画面をワイヤレスでPCにミラーリングすることももちろんできます。Androidデバイスは更にUSBケーブルで画面をPCに表示して、PCのマウスとキーボードでAndroidをコントロールすることもできます。（USBデバッグの権限が必要）複数のモバイルデバイスを同時にPC側にキャストする機能も搭載されています。現在スマホやタブレットの画面がますます大きくなり、パソコンとの間の画面ミラーリングが必要な場合は活用可能なソフトかと思います。また、スマホとスマホの画面ミラーリングも、両方にアプリを入れればできます。いろいろな使い道があります。
Nextcloud のグループ共有フォルダ機能

#はじめに
ownCloudやNextcloudは、サーバーに構築できるオンラインストレージパッケージとなります。従来のファイルサーバと違うところとして、、

**ユーザの領域にファイルが保管される。**

という考え方です。

私も営業で、お客様のところに訪問した時に、ここら辺の説明をしないと話がかみ合わなくなる事があります。

よくある話として、部門で共有フォルダを作りたいなんて声もあり、そんな時は管理者の領域にフォルダを作成して、部門用のグループ単位で共有するという代替案を出しておりましたが、フォルダに対して容量制限させる事は無理でした。しかしながら、今のNextcloudではグループ共有フォルダ機能ってものが存在します。今回はグループ共有フォルダ機能を紹介します。

#Group folders
これです。「Group folders」。
![画像11.png](https://qiita-image-store.s3.amazonaws.com/0/308127/b681b441-0b36-970d-b22d-68768f507767.png)

プラグインを有効にすると、管理者画面にメニューが表示されます。
![画像12.png](https://qiita-image-store.s3.amazonaws.com/0/308127/b4f8f273-0c61-d796-6c99-6461e62e7236.png)

ここで、フォルダーを作成していきます。フォルダー名を入力すると、共有するグループを指定できます。複数グループにも指定でき、Write/Shareの権限も付与できます。
![画像13.png](https://qiita-image-store.s3.amazonaws.com/0/308127/0c628963-365a-e77e-d217-245b1e48dafe.png)
次にフォルダのクォータも設定できます。容量も自由に設定できます。
![画像14.png](https://qiita-image-store.s3.amazonaws.com/0/308127/bf2e6249-8a34-56ef-7783-fc7f144f6174.png)
設定が完了したら、ファイル操作画面に表示されています。人影となっているフォルダのアイコンがグループ共有フォルダです。
![画像15.png](https://qiita-image-store.s3.amazonaws.com/0/308127/8a05ad85-463a-40dd-cb75-4db14c2b3b7b.png)
グループ共有フォルダの中へ移動すると、権限通りの操作ができます。![画像16.png](https://qiita-image-store.s3.amazonaws.com/0/308127/b5583ef7-e711-89d8-ccba-5770588d6844.png)

ちなみにどこに保存されているのかというと、指定しているdataディレクトリ配下に、__groupfoldersというディレクトリがあり、その配下に保存されているようです。

#まとめ
ユーザによって、使う使わないかは意見がわかれるところですが、地味に良い機能かと思います。
ちなみにスタイルズで使っているNextcloudでは、あまり無駄にファイルを置きたくないのもあり、ユーザ毎のクォータは少なく設定し、グループ共有フォルダのクォータを多めに設定しています。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
Mac OSXでwebページをまるごと保存する

# webページをまるごと保存したい

HTML制作業者（って言うの？）に運用中の既存ページを修正してもらう場合、いわゆる最新版を渡さないといけないシーンが存在する（少なくとも私には）。
jspとかphpとかのままだと渡せないのでhtmlに保存してから渡すのですが、業者からしてみればhtmlだけ渡されても困ったもので、参照しているすべてのファイルが欲しいと言われるのが関の山。

そもそもやり方が古いとか、そーゆーツッコミは無しでお願いします。数年前にカットオーバーしたサイトのメンテナンスだと、仕組み自体が変えられないのである程度レガシーなやり方になるんです。（開き直り）

## 全体の流れ

前置きはそれくらいにして、以下の流れで実現できました。
`wget` で実現するのですがMacのターミナルでは `wget` が使えないのでインストールします。
`wget` をインストールするために `homebrew` もインストールします。

1. homebrewをインストール
2. wgetをインストール
3. wgetでwebページをまるごと保存

## 1. homebrewをインストール

```sh:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
わりと時間がかかります。パスワードも聞かれます。

## 2. wgetをインストール

```sh:
brew install wget
```
シンプル！！

## 3. wgetでwebページをまるごと保存
```sh:
mkdir work-dir
cd work-dir
wget -p -H -E -nH -k https://www.google.com
```
ディレクトリを変えないと「わーっ！」ってファイルが出来てしまうので
ワークのディレクトリを作成して移動しておきます。
あとは `wget` を指定のパラメタで動かすだけ。
作成するディレクトリ名と取得対象のURLは自分の好きに書き換えてください。
SkyWay WebRTC Gateway で peer_id と token を受け取るまで

# 背景
本稿を開かれた方は「不思議なタイトルの投稿だな」と思われて開かれた事と存じます。peer_id と token を受け取るのって、ゴールでもマイルストンでもなんでもなくて、将に***スタート***地点のはずなのに？
そのとうりなのですが、若い人のようなスマートさのない老齢の身では、わからぬ事だらけで試行錯誤を繰り返し、***スタート地点までたどり着くまでに疲れ果てしまうという、東京マラソンのスタートみたいな***情けない顛末に至りました次第、どなたかのご参考になればとご報告させていただく次第です

# 参考にした資料
以下の資料を参考にいたしました
- [「SkyWay WebRTC Gateway」試験提供開始](https://support.skyway.io/hc/ja/articles/360008586334--SkyWay-WebRTC-Gateway-%E8%A9%A6%E9%A8%93%E6%8F%90%E4%BE%9B%E9%96%8B%E5%A7%8B)
- [github](https://github.com/skyway/skyway-webrtc-gateway)
- [SkyWay WebRTC Gatewayハンズオン](https://qiita.com/nakakura/items/555fe01941c54b698fcf)


その他、10月29日の時点で、SkyWay のコミュニティエディションのコンソールには SkyWay WebRTC Gateway に関して参照できる資料はみつけられなかったのですが、コミュニティサイトに 7件の QA があったのでそちらも参考にさせていただきました


# 正解
先に正解だと今の私が思っているプロセスをご紹介しておきます

1. githubの[readme](https://github.com/skyway/skyway-webrtc-gateway) にある ***Download*** から ***ARM*** 用のバイナリ Raspberry Pi にダウンロード

2. ダウンロードした gateway_linux_arm を実行すると port 8000で listen を始めるので、そこに向けて下記のように /peers の api を叩く

```bash
curl -H 'Content-Type:application/json' -d '{"key": "自分のキー", "domain": "申請したドメイン"}' http://localhost:8000/peers
``` 
すると、id と token が帰ってくる

```bash
{
  "command_type": "PEERS_CREATE",
  "params": {
    "peer_id": "帰ってきたid",
    "token": "帰ってきたtoken"
  }
}
```
たったこれだけで、ハマる所なんかなにもなさそうなのですが...

# 何にはまったのか
以下、たんに誤解と試行錯誤の話で技術的な話ではありません

一言でいうとダウンロードしたバイナリの役割と使い方が全くわからなかったので、REST API を wrap してくれるライブラリかなんかと勝手に誤解してました

githubの[readme](https://github.com/skyway/skyway-webrtc-gateway) の How To Use に[api](http://35.200.46.204/) があります。ごく普通の REST API に見えますが url のアドレス部分がありません。きっとどこかにあるのだろうと思って探すところから間違いがはじまります。私はこの時点で ***WebRTC Gateway*** を WebRTC と REST API を変換するインターネット上の ***Protocol Gateway*** と、ダウンロードしたバイナリはそれをなんか（サンプル見るに多分 ruby）言語から使うためのライブラリと誤解しています

で、[ハンズオンの記事](https://qiita.com/nakakura/items/555fe01941c54b698fcf)をみると IPアドレス付きで API を叩いているようなコメントがあるので、そこを指定して ***curl*** で POSTしてみるも、 ***405 Not Allowed*** が帰ってくるだけ...

Not Arrowed?
404 Not Found ならともかく、Not Arrowed ってどういう事？
この親切なレスポンスのおかげで鈍い私もやっと気が付きました、ダウンロードしたバイナリを介したパケットでないと許されないって事？ Gateway って プロトコルゲートウェイって意味じゃなくて、SkyWay の内と外の間の Gateway ってことだったの？

で、ドキュメントを再度みるのですが gateway_linux_arm の使い方がまるでわからない ^^;　実行してみると

```
pi@raspberrypi:~ $ ./gateway_linux_arm
```

こんなかんじで無口で無愛想な所が高倉健さんみたいでカッコいいです
-h とか --help つけてもやっぱり無反応
でも、ゲートウェイというからにはなんか listen してないかと期待して lsof してみたら

```
pi@raspberrypi:~ $ lsof -i
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
gateway_l 1204   pi    6u  IPv6  15319      0t0  TCP *:8000 (LISTEN)
```

おっ、8000番でなんか聴いてるじゃん！　じゃ、こいつの 8000番にさっきの API を POST したらどうなるんだ
っと、ここまで実験してやっと正解にたどり着きました。めでたし、めでたし

# 反省
多分、勉強会とかに参加すればこんな最初から躓かないですんだんだとおもうのですが、老齢の身で若い人の集まる所に出かけるのは難儀だし、とか思ってとりあえず手に入る資料だけではじめようとしたのが悪かったんだろうなと

しかし、***gateway_linux_arm*** の存在理由がまだ腑に落ちず、普通に RPi から直接 REST API 叩くのではなにがダメだったんだろ？と。まあ、先に進むと自然と納得できるようになるのかもしれません

疲れたので今日はもう寝ようかと、peer_id はもう取れているので、明日中にはセンサデータをブラウザにだせるかな...
Wordpressで常に特定カテゴリの最新記事にアクセスできるリンクを作成する

##要件
例えば、以下のような要件。
・バナー等固定でリンクを貼り付ける箇所に最新記事へのリンクを貼りたい。
・投稿記事に「最新記事はこちら」といったテキストリンクをコピペで貼り付けておき、過去記事を編集せずに常に特定カテゴリの最新記事にアクセスできるようにしたい。


##コード
functions.php内に書いていきます。

```functions.php
function custom_category_redirect($request)
{
    if (isset($_GET['latest'])
        && isset($request->query_vars['category_name'])) {

        $latest = new WP_Query(array(
            'category_name' => $request->query_vars['category_name'],
            'posts_per_page' => 1,
        ));
        if ($latest->have_posts()) {
            wp_redirect(get_permalink($latest->post->ID));
            exit;
        }

    }
}
add_action('parse_request', 'custom_category_redirect');
```

これで`http://example.com/category/some-category/?latest`のような形式でリンクを貼ると各カテゴリの最新記事にリダイレクトします。

パーマリンクの設定から[カテゴリーベース](http://ysklog.net/wordpress/30.html)を変更している場合、`/category/`の部分を任意で設定したものに変えます。
アクションフックの[parse_request](https://codex.wordpress.org/Plugin_API/Action_Reference/parse_request)はリクエスト処理に対して何らかの操作を加える際に用います。

##参考
https://wordpress.stackexchange.com/questions/128576/how-can-i-link-to-the-most-recent-post-in-a-category
FragmentからstartActivityForResultしてActivityでResult受け取るのに苦しんだメモ。

タイトル通りに苦しんだのでせっかくだし、メモ的に残します。


### やりたかったこと
FragmentでstartActivityForResultして、
別のActivityを開いて用が済んだらResultをsetしてfinishし、
startActivity〜したFragmentの親であるActivityでResultを受け取ってなんか処理する


### うまくいかない

Activity(＊)⇔Activityだと
Activity(＊)のonActivityResultは

```
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {
         //処理
    }
}
```

みたいな感じで事足りますが、FragmentからstartActivity〜しただけでなんかうまくいかない...

### こうしたらできた

Fragment(＊)→Activity→Activity(＊の親)だと
Activity(＊の親)のonActivityResultは

```
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && (requestCode & 0xffff) == REQUEST_CODE) {
         //処理
    }
}
```

としなくてはいけない。


### なんで？
大切なのはif文の中の`(requestCode & 0xffff) == REQUEST_CODE)`
requestCode、intなので32bitあるはずなんですが、16bitの制限があります。
上位16bitはrequestCodeがどのFragmentから来たのか...などを管理するbitになります。
今回、FragmentからstartActivity〜するのでまさにそういう情報が管理されている状態。
なので、上位16bitにFragment情報が乗った状態でActivityのonActivityResultに帰ってきます。

だから、`requestCode & 0xffff`で上位16bitを落として、もともとの下位16bitを取り出します。
勉強用のGit Repository (Azure DevOps) 作成メモ

最近担当したプロジェクトで、始めて自分が本格的にGitを使用する立場で開発に関わりました。
自分でテスト用の環境を作成して、プロジェクトで使用した要素の振り返りをしてみようと思います。
まずは、Azure DevOps でテスト用のプロジェクトを作成してみます。

[Start using Azure Repos](https://docs.microsoft.com/en-us/azure/devops/repos/get-started/index?view=vsts)のサイトを参考に開始。

[Start with Sign up and invite some teammates.]
(https://docs.microsoft.com/en-us/azure/devops/repos/get-started/sign-up-invite-teammates?view=vsts)のリンクをクリック。

#####1.Select the sign-up link for [Azure DevOps](https://go.microsoft.com/fwlink/?LinkId=307137).
のリンクをクリック。ここからがサイトの記載内容と少し異なったので、画面キャプチャも掲載しています。
以下のようなマイページへ遷移。私の場合は、VSTS時代に作成したプロジェクトが表示されています。

#####2.[New Project]をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/232585/65ea6b67-6ecd-7c2c-8290-3931d1774eb8.png)


#####3.プロジェクト名、Visibility(=Private)、Version Control(=Git)、Work item process(=Scrum)を設定して[Create]をクリック
<img src="https://qiita-image-store.s3.amazonaws.com/0/232585/dbfb226c-7e9e-42f6-f838-35019ed3aca4.png" width="500">


#####4.作成したプロジェクトの情報が表示される。
VSTSの名残なのか,URLはdev.azure.comは含まないものでした。
https\://dev.azure.com/{yourorganization}の形式でアクセスしても同じページが表示されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/232585/82381b66-3502-f2be-f1f5-aacc0e5149d5.png)
Rubyの基本記述の仕方〜その11〜 if文とunless文

unless文に初めて触れたので、if文との違いをまとめようと思います。

## if文

```sample.rb
if 条件式
　条件式が真である時の処理
else
　条件式が偽である時の処理
end
```
記述した条件を満たしているか否かで処理を変えることができます。

＜記述例＞

```sample.rb
if age >= 20
　puts "成人しています"
else
　puts "未成年です"
end
```


## unless文

```sample.rb
unless 条件式
　条件式が偽である時の処理
else
　条件式が真である時の処理
end
```
if文と同じ構造で記述できますが、真偽の判定が逆転します。
また、if文と違い`elseif`を使って条件式を複数記述することができません。

＜記述例＞

```sample.rb
unless age >= 20
 puts "未成年です"
else
 puts "成人しています"
```


## unless文の実用例
条件式自体が何かの処理を含んでいる場合、unlessにすると、
その処理が失敗した場合の記述だけで済むので便利です。

＜記述例＞

```sample.rb
unless @user.save
 render(user/edit)
end
```

`@user.save`の処理が失敗した時のみ該当のページを表示させる処理が書けました。
ちなみにif文で同じ内容を記述した場合`else`が必要になります。

```sample.rb
if @user.save
else
 render(user/edit)
end
```
当初、`if @user.save`の記述で「もし、ユーザーの保存が成功すれば」という意味に受け取れず
条件式と処理が同じ箇所で書かれている所に非常に違和感がありました。
しかし、慣れてくると書く量が少なくて済むのでとても便利です。






今日はこのあたりで失礼します。

## 参考サイト
Let's プログラミング初心者の方でも分かりやすいサイト　unless文
https://www.google.co.jp/search?ei=AXbWW6bcM4vqwQO945f4Dg&q=elseif&oq=elseif&gs_l=psy-ab.3..0i67k1j0l7.2207.5133.0.5291.12.9.0.3.3.0.105.664.7j1.9.0....0...1c.1.64.psy-ab..0.11.670.0..0i5i10i30k1j0i10k1j0i131k1j0i4k1.71.ein1xWrORFA
【Bigquery】週単位で集計する方法

月単位での集計はよしなにDATE_FORMATを使っていけるのですが、週単位のときに、「？」となったのでメモ。

BigqueryのStandardSQL前提で書いてますが、レガシーでも考え方は一緒のはず。（関数はどうかわからない・・・）


|_date  |user_name  |
|---|---|
|2018-09-02(日曜)|a|
|2018-09-03|b|
|2018-09-04|c|
|2018-09-05|d|
|2018-09-06|e|
|2018-09-07|f|
|2018-09-08|g|
|2018-09-09(日曜)|a|
|2018-09-10|b|
|2018-09-11|c|
|2018-09-12|e|
|2018-09-13|f|


というテーブルがあったとして、

|_week  |_count  |
|---|---|
|2018-09-02(日曜)|7|
|2018-09-09(日曜)|5|

という形で集計したいというとき。


※わかりやすくするためにあえて日曜日の日付に（日曜）とつけていますが、実際にはついている必要はないです。

## SQL

```sql
SELECT
  DATE_ADD(_date, INTERVAL - EXTRACT(DAYOFWEEK FROM DATE_ADD(_date, INTERVAL -0 DAY)) +1 DAY) AS _week,
  COUNT(user_name) AS _count
FROM
  `table`
```


### 起算日を月曜にしたい場合

```sql
DATE_ADD(_date, INTERVAL - EXTRACT(DAYOFWEEK FROM DATE_ADD(_date, INTERVAL -1 DAY)) +1 DAY) AS _week
```

で、いけるはず。

## 以上です
これができると週単位でのPVや、UUとかも工夫すればいけて幸せいっぱいですね。
leafletを鍛える。その13

#概要

leafletを鍛えてみた。
マーカークリックで飛んでみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/W/N/T/WNTC.jpg?t=1540800867)

#サンプルコード

```
var map = L.map('map').setView([38.3748331, 139.9574997], 12);
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
    attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
var marker = L.marker([38.3748331, 139.9574997], {
    title: "title"
}).addTo(map);
marker.on("click", function() {
    window.open("http://jsdo.it", "_blank");
});  
L.DomUtil.addClass( marker._icon, 'leaflet-marker-icon-color-red' );
```

#成果物

https://embed.plnkr.co/n9rL8xbOIZEG3i8pnCqt/


以上。
JP1ライセンス見積もり時のライセンスの考え方

JP1(Ver.11)はサーバーごとにCPU（コア数）を紐付けしてカウントするのではなく
コア数をカウントして数量を決める

サーバごとのコア数を算出

・物理 CPU の数
grep physical.id /proc/cpuinfo | sort -u | wc -l
・CPU ごとのコアの数
grep cpu.cores /proc/cpuinfo | sort -u

また以下はプロセッサごとによるカウント例

■ライセンスカウント例

[例１]　Xeonマルチコアプロセッサ
２コアあたり１プロセッサ数ライセンス。

[例２]　SPARCプロセッサ
デュアルコアのUltraSPARC IV，IV＋，SPARC64 VI，SPARC64 VII，VII+プロセッサの プロセッサ数ライセンス製品については、１コアあたり１プロセッサ数ライセンス。

[例３]　EP8000対応POWERプロセッサ
デュアルコア対応のPower6，Power7，Power8のマルチコアプロセッサについては、 １コアあたり１プロセッサ数ライセンス。

[例４]　Itaniumプロセッサ
Itaniumプロセッサについては、1コアあたり1プロセッサ数ライセンス。
Egret Engine 5.2の最新の安定版5.2.12がでました

# 5.2.12が出た？！

本日Egret Launcherを立ち上げたらこんなメッセージが？！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/7274ec07-674a-107d-0bf4-a1b153500a78.png)


# Update Logの翻訳

http://developer.egret.com/cn/github/egret-docs/Engine2D/update/update5212/index.html

> Egret Engineは2018/10/29にStableバージョンを5.2.12をリリースします。バージョン5.2のバグ(一次集中性缺陷/centralized defect)フィックス版です
> # AssetsManager
> - forceパラメータがfalseな時にRES.destroyRes がすべてのリソースをdestoryする不具合の修正
> - 破損したグループがアップロードされた際に例外が発生する不具合の修正
> - 壊れたフォントイメージの修復が失敗した後に、失敗した一連の結果が報告されない不具合の修正
> - テクスチャーイメージの修復が失敗した後に、失敗した一連の結果が報告されない不具合の修正
Nextcloud 14 ONLYOFFICEプラグイン

# ブラウザ上でオフィス編集
Nextcloud14が9月にリリースされました。
新しい機能として、ONLYOFFICEとの連携プラグインも出たのですが、どのようなものなのか、試してみました。ちなみに、私は営業職なので、Nextcloudサーバーの設定は、技術担当者にやってもらってます:sweat_smile:

![画像9.png](https://qiita-image-store.s3.amazonaws.com/0/308127/0c1ec774-d292-61f5-575e-d1c8cacf69cd.png)

# 設定画面
アプリ（プラグイン）を有効にすると、管理者設定画面にONLYOFFICEの項目が追加されます。
サーバー設定とかはよくわかりませんが、ブラウザー上で開く拡張子を選択できるようですね。
![画像10.png](https://qiita-image-store.s3.amazonaws.com/0/308127/7b84dea9-57c7-b8fb-47ec-2a8e526209c4.png)

# ファイルを開いてみました
いつもと変わらないファイス操作画面ですが、クリックすると・・・
![画像1.png](https://qiita-image-store.s3.amazonaws.com/0/308127/df7f794d-d206-3e46-2869-2c1256af08ca.png)
ファイルを読み込んで・・・
![画像2.png](https://qiita-image-store.s3.amazonaws.com/0/308127/14693a21-231a-b3d6-2c13-6b2dc232d058.png)
ブラウザ上にファイルが開けます。
直接編集したり、共有しているファイルだと、同時編集なんかもできます。
![画像3.png](https://qiita-image-store.s3.amazonaws.com/0/308127/3fc9442c-f8d2-f3e8-e4b2-977003669134.png)

これはエクセルです。
![画像6.png](https://qiita-image-store.s3.amazonaws.com/0/308127/31458f4c-97d7-0b65-685b-86ee02a781f2.png)

パワーポイントも開けます。
![画像8.png](https://qiita-image-store.s3.amazonaws.com/0/308127/0acba5fc-0f11-85e8-267a-7c2478130634.png)

# まとめ
とりあえず、このWord、Excel、Powerpointの3つが開く事は確認できました。PDFやJPGなんかは、もとからビューアがありますので、簡易的な編集程度なら、ブラウザー上で完結できそうです。

今までも、collabora onlineのプラグインはあったのですが、ざっくり見た感じだと、ONLYOFFICEの方がきれいに表示されているようですね。Onedriveや、BoxなどのOffice365連携っぽくなってきました。

企業によっては、「ダウンロードはさせたくない」という話もよく聞くので、ONLYOFFICEを使ってダウンロードは制限させるような機能ができれば・・・。

あとは、どのくらいのユーザが同時に開けるかですね。この辺は、スタイルズの技術者に検証をお願いしたいところです。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
Nuxt.jsでimgタグのsrc属性をバインディングする時にちょっと困った

# imgタグのsrcをバインディング

```sample.vue
<template>
    <img :src="imgUrl">
</template>

<script>
export default {
    data () {
        return {
            imgUrl: "~/assets/hoge.png"
        }
    }
}
</script>
```
ページ上では
```<img src="~/assets/hoge.png">
```
と出力されるのだが、画像は表示してくれない。

#解決法
https://ja.nuxtjs.org/guide/assets/
上記公式サイトによるとnuxtではこうコンパイルされるらしい
![スクリーンショット 2018-10-29 16.37.14.png](https://qiita-image-store.s3.amazonaws.com/0/295335/150393c0-19a5-d1b4-0cc6-c51ba397a65b.png)

というわけで、こう書いたらちゃんと表示されました。

```sample.vue
<template>
    <img :src="img">
</template>

<script>
// 開発時はimage loaderでblobにして読み込む。本番時には設定で良い感じにurlになったりする。
import HogeImage from '~/assets/hoge.png';

export default {
    data () {
        return {
            img: HogeImage
        }
    }
}
</script>
```
auto_incrementの初期値を設定したい

# やりたかったこと
とある理由であるテーブルのidが1からスタートではなく、
1001からスタートしてほしいという依頼が来た。

## コード
まずmigrationファイルを作成する。

```terminal
$rails g migration id_autoincrement_set
```
と実行するとmigrationファイルが作成されます。

```rb
class IdAutoincrementSet < ActiveRecord::Migration[5.2]
  def change
  end
end
```
中身はこのような感じだと思います。

```rb
class IdAutoincrementSet < ActiveRecord::Migration[5.2]
  def change
     execute "ALTER TABLE samples AUTO_INCREMENT = 1001"
  end
end
```
として管理画面などから記事を作成すればidが1ではなく、
1001から作成されてることがわかると思います！
Kotlinでアセットファイルを外部ストレージにコピーする

kotlinで、Androidアプリの `assets ` フォルダにあるファイルを外部ストレージ にコピーする方法です。

##方法

```kotlin

//コピー先フォルダのパス
private val basePath = Environment.getExternalStorageDirectory().path + File.separator + "hoge"

/**
 * アセットにあるファイルをストレージにコピーします
 * @param context Context
 * @param assetName コピーするアセットの名前
 */
fun copyAssetToExternalStorage(context: Context, assetName: String){

    //上記フォルダパスにアセット名を含めたフルパス
    val fullPath = basePath + File.separator + assetName

    val dir = File(basePath)

    if(!dir.exists()){
        if(!dir.mkdirs()){
            return
        }
    }

    context.assets.open(assetName).use { inputStream ->
        FileOutputStream(File(fullPath), false).use { outputStream ->
            inputStream.copyTo(outputStream)
        }
    }
}
```

##参考にさせていただいたサイト
- [Write a large Inputstream to File in Kotlin](https://stackoverflow.com/a/35529070/8800049)
- [【Android】assetsフォルダのファイルをローカルストレージにコピーする](https://qiita.com/entan05/items/cfd8d1318f54f57d14c6)
bootsnapのせいでRails5.2とかが動かない人へ

# bootsnapとは？

bootsnapについては[トレタの中の人がアウトプットしてくれている](https://qiita.com/Daniel_Nakano/items/aadeaa7ae4e227b73878)のでそちらを参照しましょう。

bootsnap自体は
1. Gemfile に `gem 'bootsnap', require: false` を追記
2. config/boot.rb に `require 'bootsnap/setup'` を追記
のお手軽簡単ステップ2つです。

# bootsnapのせいで何やらRailsが動かない

こんなログ。

```
LoadError: cannot load such file -- arel
/Users/hogehoge/***/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
...
```
当たり前ですが、arelが見つからないなんてことはないんです。

上記のbootsnapの簡単2ステップをコメントアウトすれば動いてしまうRailsアプリを持っている人向けです。

## チェックポイント
* bootsnapをbundleするとrails sやrails cが動かない
* 明らかにkernelで呼び出そうとしてる部分でコケる
* bootsnapをコメントアウトすると綺麗に動作する
* rubyのインストとかし直しても動かない(んでやっぱりbootsnapをコメントアウトすると動く)

# bootsnapのCacheを消そう

ここまで条件が一致している方は多分僕と同じなので以下をやってみましょう。

bootsnapはCacheファイルを作るんでこれを消します。

* 自分のRailsプロジェクトディレクトリの tmp/cache へ行く
* `bootsnap-load-path-cache` と `bootsnap-compile-cache` を消す(rmコマンドでok)

これで、動かなかったRailsアプリにアクセスしてみましょう。

参考：
[&#39;require&#39;: cannot load such file -- bootsnap/setup (LoadError) · Issue #73 · Shopify/bootsnap](https://github.com/Shopify/bootsnap/issues/73)

余談：
他の人に例がなく自分だけってパターンだったから、気づきづらい。時間食う。
GitHubを二要素認証(2FA)にする方法

アカウントのハッキングを防ぐ方法として二要素認証(Two factor authentication)は有効な手段です。

二要素認証の設定を怠っていた結果、アカウントがハックされてしまったというようなことがないようにしましょう。

今回はGitHubを二要素認証にする方法です。

## GitHubを二要素認証にする手順

Settingsを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/ee77efeb-0e32-7b84-c06a-8ad72154c2e9.png)

Securityという項目を選ぶと『Enable two-factor authentication』というボタンがあるのでこちらを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/1ac8e8db-f26b-ef0d-d616-71c05cf5b289.png)

二要素認証はスマホアプリを利用する方法とSMSを利用する方法から選べます。

スマホで二要素認証をするには例えば『Google 認証システム（Google Authenticator）』というアプリを利用します。

- [Google認証システム Android版](https://itunes.apple.com/jp/app/google-authenticator/id388497605?mt=8)
- [Google認証システム iOS版](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=ja)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/3c0681c8-e6ef-e487-0c05-cf7a89c7c5be.png)



二要素認証の設定が正しくできると、サインインしたあと、以下のような認証コードを入力する画面になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/10757198-4d37-8c36-7ca6-63f949499dca.png)

1Passwordを利用すると二要素認証も簡単に入力できるようになります。
詳細は以下の記事をご覧になってください。
<a href="https://nishinatoshiharu.com/2fa-with-1password/" target="_blank">二要素認証(2FA)をショートカットキー1発で行う1Password設定手順</a>
gitの除外したいファイルをローカルでのみ適用する（.vscode の設定を例に）


- 複数人で開発しているときに.gitignoreに入れるほどではないけど、自分のローカルで生成されてしまったファイルやディレクトリをgitの管理対象から恒常的に除外したくなるケースがある。
- 例えば自分だけVSCodeを使っていて、.gitignoreには追記するほどではないけど、自分の環境でのみ `.vscode` ディレクトリをgit の管理から除外したい場合。
- プロジェクトのディレクトリで下記コマンドを実行する。

やっていることは、ローカルの .git ディレクトリにあるファイルに除外したいファイルやディレクトリを追記するということをしている。

```sh
$ ls                                                                                                                                                              
Dockerfile          README.md           bin                 db                  log                 public              tmp
Gemfile             Rakefile            config              docker-compose.yaml node_modules        spec                vendor
Gemfile.lock        app                 config.ru           lib                 package.json        test

$ echo .vscode/* >> .git/info/exclude

$ cat .git/info/exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
.vscode/settings.json
```

# .gitignoreに追加する場合（本件とは関係ないおまけ）

```.gitignore
.gitignoreファイルに下記を追記

.vscode/*
```

参考：
[gitで常に.vscodeを無視する](https://qiita.com/hbsnow/items/7b0a6da2626261c4d80c)
[Git | excludeファイルにローカル環境だけ無視したいファイルを登録](http://tbpgr.hatenablog.com/entry/20130610/1370873259)
ReactNative (android)で画像ファイルが Duplicate file, Original is here. The version qualifier may be implied となるときの対処法

## 遭遇したこと
Androidでリリースビルドが通らない。。
画像ファイルが`Duplicate file, Original is here. The version qualifier may be implied`と表示される

## 対応方法
https://github.com/facebook/react-native/issues/19211
https://medium.com/@nhancv/react-native-build-release-duplicate-file-original-is-here-the-version-qualifier-may-be-implied-115e967c59e6
Timeline animationTrack AnimationWindowのAddPropertyについて

Unity で若干はまったので備忘録がてらメモ

Unity Version2018.2.4f1 にて確認

timelineを使い、AnimationTrackから任意の Rotate,Position のアニメーション作成を行った。
その後、調整をするために操作をしていたのだが、

timeline > AnimationTrack の Clipを右クリックして、
Edit Animation Window で Animationウインドーを開くも
Add Proprty ボタンが非活性のままで項目の追加ができないようだ。

![ss000.png](https://qiita-image-store.s3.amazonaws.com/0/252918/23e268a1-3f03-c388-677d-b1cb8a4e41d4.png)

上記 Recorded で 右クリック、Edit Animation Window

![ss001.png](https://qiita-image-store.s3.amazonaws.com/0/252918/f1ea9d93-05da-a158-9bf6-3e75d6a6df22.png)

Add proprty が非活性で押せない！
しかし、右クリックして、
![ss002.png](https://qiita-image-store.s3.amazonaws.com/0/252918/3507acad-4646-a6ee-7e69-a4b6011898dc.png)
RemoveProperty は押せる・・間違って消すと修復不能になるのか！？


どこでそうなるのか検証したところ、
AnimationTrackを作成して、Clipにキーを配置したことでは、
Add Property は押せた。


![ss003.png](https://qiita-image-store.s3.amazonaws.com/0/252918/e35c795a-19a9-b7f0-8b9e-f20882325996.png)

timelineに戻り、Clip を ConvertToClipTrackを行った後には

![ss004.png](https://qiita-image-store.s3.amazonaws.com/0/252918/b3f9705c-3ad2-5f29-5251-a7c4d8cc8dec.png)

![ss005.png](https://qiita-image-store.s3.amazonaws.com/0/252918/21553c61-5b7c-dca3-543f-b5cdb491d25b.png)

Add Proprety が押せなくなった。

timelineで複数の動きを作成して調整する際に、
ClipTrackで開始タイミングの調整を行うことは便利であったが、
その後に要素の追加ができない、戻せない（？）ようだ。



また、この要素の順番で計算がされているようで、
Position,Rotation
Rotation,Position 順番が異なると表示位置が異なる結果となった。
RTS
TRS とかわかっていれば対処もしやすかったのだが、まだ不慣れなUnity使いでした。

Animationデータをまとめる時に ConvertToClipTrackでcliptrack化させて
timeline上で構成を考えていたが、clipTrackすると再び戻せないことになっているんですかね？

一部アニメーションを作り直して対応しました(TT)
OCamlでチャーチ数【メモ】

## 背景

最近、五十嵐淳先生の「プログラミング言語の基礎概念」という本を読んで、興味が湧いたので自分の忘備録として残しておきます。

## やっていく

ここでチャーチ数は高階関数として表され、関数fと値xを受け取り、fにxをn回適用する関数として定義します。
まず、ゼロと後続数を定義します。

```ocaml
let zero f x = x
let succ n f x = f (n f x)
```

すると、自然数1を表す`one`と自然数2を表す`two`はこうなります。

```ocaml
let one = succ zero
let two = succ (succ zero)
```

加算を定義してみます。

```ocaml
let add n1 n2 f x = n1 f (n2 f x)
```

チャーチ数をOCamlの整数に変換する関数を定義してみます。

```ocaml
let to_int n = n (fun k -> k+1) 0
```

## 感想

楽しい。
【質問です】facebookのシェアボタン：シェア本文にテキストを最初から表示させる方法

はじめまして。

facebookのシェアボタンをhtmlメールに設置して、特定のURLをシェアするコードを記述したいと思っています。
その際、シェア本文（デフォルトだと「何か書く…」と表示される部分）に固定のテキストを入れたいのですが、そのコードの書き方がわからず困っています。。

ちなみに、下記のコードで記述してみたのですが、ローカルでの確認では、正しく表示されませんでした。
href="http://www.facebook.com/share.php?u=「シェアするページのURL」&t=「シェア本文」"

どなたか教えていただけますと幸いです。

よろしくお願いいたします。
【WinActor】Webサイトのタグ一覧をExcelに出力する

WinActor難しいですねぇ。。。エンジニアさんはみんなつまづくと思ったので備忘録残しておきます。

ライブラリ：**IE操作(Debug全タグ情報簡易版)**を活用することで、Webサイトの全タグをExcelに出力してくれるようです。

![winactor_デバッグデモ1.gif](https://qiita-image-store.s3.amazonaws.com/0/186221/2b4bd1cb-e09c-9136-d03a-d9722f0c2158.gif)

実装する過程で気づいたのですが、IE起動してWebサイトを起動する際は**「IE操作（読込完了待ち）」**というライブラリを挟まないと、次処理以降、画面がつかめなくてエラーになります。。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/fbdf5db0-8352-bceb-0d31-213bc135449c.png)
Gnome Keyringの使い方

Gnome Keyringは、Linuxで動作するキーリングツールです。
Linuxマシンをデスクトップで使うとき、あまり直接ユーザーが触ることは少ないですが、内部では重要は役割を果たしています。

# キーリング とは

キーリングは、直訳で鍵束となります。複数の鍵（≒認証情報）を一つにまとめる役割を持ちます。
Gnome KeyeingはGnomeで開発されているキーリングです。

- パスフレーズで暗号化されたSSH秘密鍵の、パスフレーズ
- ChromeやFirefoxなどのブラウザが保管するWebサイトのパスワード
- 暗号化したUSBメモリの複合パスフレーズ
- NetworkManagerが使う、WiFiのアクセスポイントのパスワード

などを暗号化して保管し、ユーザーがLinuxにログインしたタイミングや任意のタイミングで復号化し、持ち主のユーザーしか使用できないようにします。
Lastpassや1passwordのような、パスワードマネージャーのような物だと考えるとわかりやすいかもしれません。もっと簡単に言えば、暗号化できるキーバリューストアです。

キーリングを使うことで、安全に情報を保管できます。利用する場合も、ひとつだけパスワードを覚えておけば問題がありません。
また、パスワードをLinuxのログインパスワードと同じにし、起動時に自動で復号化されるような処理もできます。（※ubuntu Desktopなどはこの方法を採用しているため、ユーザーが直接キーリングを使う機会はほとんどありません、）

# Gnome Keyringのインストール

Ubuntuなど、有名なディストリビューションでは最初からインストールされてると思います。
自分はArchlinuxなので以下のコマンドでインストールしました。

```
$ sudo pacman -S gnome-keyring seahorse
```

seahorseというのは、gnome-keyringの内容を見るためのGUIツールです。Ubuntuの場合は「パスワードと鍵」というソフトがインストールされてると思います。

# 起動の設定

Archwikiによると、GDMなど主要なディスプレイマネージャーは自動で起動をしてくれるようです。
自分の場合はコンソールでログインしてるため、PAMに設定をします。
（PAMを使うことで、ログイン時に自動起動と自動復号化を介入して処理できます。）

```conf:/etc/pam.d/login
#%PAM-1.0

auth       required     pam_securetty.so
auth       requisite    pam_nologin.so
auth       include      system-local-login
auth       optional     pam_gnome_keyring.so
account    include      system-local-login
session    include      system-local-login
session    optional     pam_gnome_keyring.so        auto_start
```

2行追加しました。

```conf:/etc/pam.d/passwd
#%PAM-1.0
#password       required        pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
#password       required        pam_unix.so sha512 shadow use_authtok
password        required        pam_unix.so sha512 shadow nullok
password        optional        pam_gnome_keyring.so
```

こちらは一行追加です。

また、.xinitrcに以下を追加します

```shell-session:.xinitrc
eval $(/usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh)
export SSH_AUTH_SOCK
```

これで、起動時に自動でgnome-keyringが起動、また復号化されます（gnome keyringのパスワードとログインパスワードが同じ場合です。）

ここで、一度再起動します。
そうすると、起動時にgnome-keyringのパスワードを設定するよう求められるので設定します。
ここでログイン時と同じパスワードを設定すると、起動時に自動で復号化されるようになります（もう何回も言っているのでわかるとは思いますが。）