OmniAICreator/Qiita-1.07M huggingface dataset:
【ポケモンルビー】n回目までに金のコイキングが釣れる確率は…？【確率統計】

# はじめに
　現在大学院生の私には、高校生の時とっても好きだったある動画がありました。その動画とは[ポケットモンスターコイキング～金鯱の逆鱗～](https://www.youtube.com/watch?v=oHBycX1q_tM)というシリーズのゲーム実況動画です（笑）。あまりにも面白くて、何度繰り返し見たか忘れてしまうほど見た記憶があります。私の青春と言っても過言ではありません。
　ところでこのシリーズは金色（色違い）のコイキング一匹のみという縛りで、ポケットモンスタールビーをクリアしようというテーマで作られた作品です。そのため、まずはじめにこの金色のコイキングを釣るところから話がスタートするのですが... 。その回数なんと**39416回**。[^1] 自分でやっていたら間違いなく第一話を投稿することなく投げ出していたに違いありません。その当時の自分は「すごい回数だな、よくやるな」ぐらいにしか思っていませんでした。
　しかし大学院生になって確率統計を勉強するようになって、ふとこのシリーズを思い出してしまったのです。そして、「**39416回も粘らないといけないのって一体どれくらいの確率で起きる出来事だったんだろう？**」という問を考えたくなってしまいました。今回はそんなテーマを扱うことで、確率統計に少しでも興味を持ってもらえる人がいればと思ってこの記事を作ってみました。是非興味を持っていただければ嬉しいです！

[^1]: 厳密には釣った回数が 38996 回で孵化した回数が420回です。

# 数学的なモデリング
　ではさっそく数学に落とし込んでいきましょう。まず色違いのコイキングが釣れる確率を $p$ とおいてみます。すると、色違いでない、つまり普通のコイキングが釣れる確率は $1-p$ ということになりますね。また、コイキングを釣る回数を $n$ 回と表現してみましょう。
　さてここで、表現したい確率を明確に言語化しておきましょう。ここで表現したいのは「$n$回目までに色違いのコイキングが釣れる確率」です。つまり、

```math
\mbox{1回目で色違いを釣る確率} + \mbox{2回目で色違いを釣る確率} + \cdots +\mbox{$n$回目で色違いを釣る確率} 
```
によって計算することができます。もちろんこのやり方でも計算できますし、文系の高校数学の範囲の知識で解くことができます。しかし、ここではもう少しスマートに考えてみましょう。「$n$ 回目までに色違いのコイキングを釣る」の否定(余事象)は「$n$ 回目までに色違いのコイキングを一度も釣れない」です。つまり

**1から「$n$ 回目までに色違いのコイキングを一度も釣れない確率」を引けば「$n$回目までに色違いのコイキングを釣る確率が求まる」**

ということになりますね。したがってこれを計算してみましょう。まず、$n$ 回目までに一度も色違いのコイキングが釣れない確率は

```math
\underbrace{(1-p)\times(1-p)\times\cdots(1-p)}_{n個} = (1-p)^n
```
よってこれを1から引けば、「$n$回目までに色違いのコイキングを釣る確率」を求めることができます。

```math
1 - (1-p)^n
```

さて、ここで色違いのコイキングが釣れる確率は、ポケモンルビーでは $1/8192$ だったそう[^2]です。したがって $p=1/8192$ ということになります。よって、$n$ 回目までに色違いのコイキングが釣れる確率は

```math
1 - \biggl(1 - \frac{1}{8192}\biggr)^n
```
となりますね。この $n$ 回目までに色違いのコイキングが釣れる確率を図にしてみるとこんな感じになります。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641580/0dd2fb3b-4f6a-2dd2-262f-0d78e88b6d82.png)

当然ですが釣る回数が増えれば増えるほど金のコイキングは釣りやすくなるわけですし、だんだんとその確率は1に近づいていきます。 

# 結果

　さて話をもとに戻せば、例の動画シリーズでは39416回の釣りという激闘の末、ようやく金のコイキングを釣っていましたね。ということは、39415回までは釣れていなかったわけです。では39415回目までに釣れる確率はどうなるかといえば、 $n=39415$ を代入してみれば良いわけですね。そうすると...

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641580/d6529f70-16f5-c98d-0730-220b8e6242cd.png)

なんと、**99.2%の確率で39415回目までに釣れているはずだった**のです！悲しいことに、0.8%もの強運(むしろ弱運)を引き当ててしまっていたのでした...。


[^2]: http://52.3.71.212/wiki/%E8%89%B2%E9%81%95%E3%81%84 より。
[cx_Oracle入門](第2回) Oracle Databaseへの接続と切断の基本

# 連載目次
[連載：cx_Oracle入門　目次](https://qiita.com/nakaie/items/df170c3fa6895cf1b44d)

# 検証環境
- Oracle Cloud利用
- Oracle Linux 7.7 (VM.Standard2.1)
- Python 3.6
- cx_Oracle 7.3
- Oracle Database 19.5 (ATP, 1OCPU)
- Oracle Instant Client 18.5

# DB接続の基本
cx_Oracleに限った話ではありませんが、Oracle Databaseに接続するには接続対象DBのユーザー名、そのユーザーのパスワード、および接続先情報(TNS接続子、EZCONNECTのどちらでも構いません)が必要です。これらは事前に準備されている必要があります。cx_Oracleでは、connect()というメソッドの引数にこれらを指定することでDBに接続できます。なお、connection()というエイリアスも用意されており、こちらを使用しても構いません。

例えば、ユーザー名が「scott」、パスワードが「Tiger」、接続先情報が「db1」である場合、
`connection = cx_Oracle.connect("scott", "Tiger", "db1")`
と、1番目の引数(引数名user)にユーザー名を、2番目の引数にパスワード(引数名password)を、3番目の引数(引数名dsn)に接続先情報を指定することでDBに接続できます。接続先情報が「hostname1:1521/db1.oracle.com」のようなEZCONNECT形式であっても、
`connection = cx_Oracle.connect("scott", "Tiger", "hostname1:1521/db1.oracle.com")`
と、同様に指定するだけです。環境変数ORACLE_SID等を用いたローカル接続の場合は、dsn引数は不要です。

このメソッドはConnectionオブジェクトを返します。以降、取得したConnectionオブジェクト(上記例だと変数connection)に対してSQL発行などの操作を実施していきます。

# DB切断の基本
Connectionオブジェクトのclose()メソッドをコールします。
`connection.close()`
以下、DB接続し、接続先DBのバージョン情報を表示(下から2行目)して切断するアプリケーションのサンプルです。

```python:sample02a.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cx_Oracle

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"

connection = cx_Oracle.connect(USERID, PASSWORD, DESTINATION)
print(connection.version)
connection.close()
```

# with構文を使用した、より安全な接続
オープンしたリソースをクローズするのはプログラミングの鉄則です。しかし、現実としてはクローズを結構忘れてしまいがちです。オープンしたリソースの確実なクローズのために、Pythonではwith構文が用意されています。そして、cx_Oracleはwith構文に対応しています。以下のようにコーディングすることで、接続の確実なクローズが可能となります。

```python:sample02b.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cx_Oracle

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"

with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
        print(connection.version)
```

# 変更履歴
- 2020/6/7
 - タイトルに回数を追加
 - 「検証環境」のOracle Instant Clientのバージョン誤りを修正
- 2020/7/5 : 連載目次を追加
Webpackerざっくりまとめ

## Webpackerとは
Webpackを簡単に導入するためのgem。
本来webpackを導入する時には`webpack.config.js`に色々設定を書かないといけないが、デフォルトでそれっぽい設定をしてくれる。

カスタマイズに難があるので、嫌っている人もまあまあいる。

## AssetPipelineじゃダメなのか
AssetPilelineでJavaScriptを管理すると、npmのモジュールを使うことができないので、、

## じゃあAssetPipelineは必要ないのか 
WebpackとAssetPipelineの併用が基本。
本来webpackではJavaScript、CSS、画像の全てを管理するけれど、
WebpackerではJavaScriptだけを管理して、CSSと画像はAssetPipelineに乗せるのが主流っぽい。

WebpackerでCSSとか画像を管理することもできるし、そういう記事も割とあるけど、Rails6のデフォルトはJavaScriptだけを管理するようになっている。

## 構成
```
app
 └── javascript
 │    └── channels
 │    └── packs
 │         └── application.js # エントリーポイント。全てのjsファイルがここに集約される。
 │    └── src # 処理を記述するファイルを保存するディレクトリ。自分で作る。名前は自由
 │         └── hoge.js
 │         └── fuga.js
config # 設定ファイル
 └── webpack
 │    └── development.js
 │    └── environment.js
 │    └── production.js
 │    └── test.js
 └── webpacker.yml
```
`src`以下に処理を書いて、`packs/application.js`から読み込む。

```app/javascript/packs/application.js
//デフォルトの記述
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")

import 'src/hoge'
```
```app/javascript/src/hoge.js
console.log('hogehoge')
```

## 参考
- [Rails 6 における Webpacker デフォルト動作 - ボクココ](https://www.bokukoko.info/entry/2020/02/05/165223)
[Linux : Ruby] seleniumでブラウザドライバのパスを明示せずにドライバを使用する

#環境
Ubuntu 18.04 LTS
Ruby 2.6.5
selenium-webdriver 3.142.7

#はじめに
rubyでselenium-webdriverを使う際、linuxではパスが通っているディレクトリにドライバファイルを置いておけば、ドライバのパスを明示しなくてもドライバを使うことができます。そのときの注意点とともに方法をまとめておきます。

#パスが通っているディレクトリにドライバを置く
今回は例としてChromeのドライバを使います。以下からはドライバをインストールしたものとして進めます。

まずは環境変数を見てパスが通っているディレクトリを確認します。

```
$ printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
```

「:」を区切りとして、パスが通っているディレクトリが表示されます。
今回は「usr/local/bin」にドライバファイルを置きました。

```
/usr/local/bin$ ls
chromedriver
```

この状態でseleniumでchromeのドライバを呼んでやればパスを指定せずに使うことができます。

```test.rb
require 'selenium-webdriver'

d = Selenium::WebDriver.for :chrome
d.get('http://****')
```

##ドライバファイル名は「chromedriver」でないと認識されない
ドライバファイル名は「chromedriver」でないと実行時にエラーとなります。
自分はver.83のドライバをインストールしたので、ドライバインストール時に「chromedriver83」として保存していたのですが、エラーとなりつまづきました。

```
/usr/local/bin$ ls
chromedriver83
```
スクリプトを実行するとエラー

```
 Unable to find chromedriver. Please download the server from (Selenium::WebDriver::Error::WebDriverError)
```
chromedriverが見つからないと言われます

##パス指定であれば別ファイル名でも可
スクリプトでドライバのパスを明示する方法であれば、別ファイル名でも大丈夫です。

```test.rb
require 'selenium-webdriver'

Selenium::WebDriver::Chrome::Service.driver_path = '/usr/local/bin/chromedriver83'
d = Selenium::WebDriver.for :chrome
d.get('http://****')
```
ちなみにこの方法だと、パスが通っているかどうかは関係ありません。
Tampermonkey で gollum のプレビュー切り替えキーボードショートカットを変更する

[gollum](https://github.com/gollum/gollum) というオープンソースの wiki には[キーボードショートカット](https://github.com/gollum/gollum/wiki#hotkeys)がある。

```
On a Page
  - e: Edit the Page
In the Editor:
  - Ctrl/Cmd-S: Save
  - Ctrl-Shift-P: Toggle Preview
```

これが Karabiner-Elements の [Emulation Modes - Emacs key bindings](https://ke-complex-modifications.pqrs.org/#emacs_key_bindings) と相性が悪い。 Karabiner-Elements が Ctrl+P を `↑` キーの入力に書き換えるので、 Ctrl+Shift+P が `↑+P` と解釈されてしまい、 gollum が用意したキーボードショートカットを呼び出せない。

特定 URL 内に閉じた話なので、 Tampermonkey で Karabiner-Elements と衝突しないキーボードショートカットを割り当てて解決した。

```javascript
// ==UserScript==
// @name         localhost gollum preview hotkey Cmd+P
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        http://localhost:4567/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // event.metaKey は keydown イベント時しか取得できない
    // https://stackoverflow.com/a/5500536/374851
    document.addEventListener('keydown', event => {
        if (event.metaKey && event.key === "p") {
          // https://github.com/gollum/gollum/blob/v5.0.1/lib/gollum/public/gollum/javascript/gollum.js.erb#L402-L405
          // Toggle Preview キーボードショートカットは最終的に以下のコードを実行している
          $('.tabnav-tab').not('.selected').click();

          // 今回割り当てた Cmd+P はブラウザの「印刷」メニューのショートカットキーと重複しているのでデフォルト挙動を無効化する
          event.preventDefault();
        }
    });
})();
```
[Ruby]GraphQLのそれぞれのqueryをファイル分割する方法

# はじめに
最近、`graphql-ruby`を使ってAPI実装をしています。最初の頃は、`query_type.rb`にロジックを書いていました。でもクエリの数が多くなると、まあ見辛いこと！
そこで、`query_type.rb`にロジックを書かずにクエリごとに分割する方法を説明したいと思います。

# やりたいこと
まず、もともとクエリを書いていたquery_type.rbがこんな感じだとします。

```types/query_type.rb
module Types
  class Query < Types::BaseObject
    field :user, ObjectTypes::UserType, null: false do
    argument :id, ID, required: true
    end

    def user(id:)
      User.find(id)
    end


    field :post, ObjectTypes::PostType, null: false do
    argument :id, ID, required: true
    end

    def post(id:)
      Post.find(id)
    end
  end
```
idを引数にもらってuser,postを返す簡単なクエリですね。
このuserとpostを返すそれぞれのqueryを２つのファイル(user.rb,post.rb)に分割したいと思います。
# クエリーを分割する
では、クエリーを分割していきます。
まずは、query_types.rbを以下のように変更します。

```types/query_type.rb
module Types
  class QueryType < Types::BaseObject
    field :user, resolver: Queries::User # userを返すqueryを定義
    field :post, resolver: Queries::Post # postを返すqueryを定義
  end
```
上記のようにquery_type.rbにfieldだけ定義します。resoleverで実際のロジックがある場所を指定します。
次に実際のロジック(resolver)を定義します。今回はgraphqlフォルダ直下にqueriesというフォルダを作りました。

```queries/user.rb
module Queries
  class User < BaseQuery
    type ObjectTypes::UserType, null: false
    argument :id, ID, required: true

    def resolve(id:)
      User.find(id)
    end
  end
```
これで、query_type.rbで定義したresolverが書けたので、userを取得することができます。
postに関しても同じようにpost.rbを用意すれば問題なしです。
ファイルを分割するだけで、かなり見易くなるので個人的にはかなりオススメです！
Proxy で悩んだら、これ試してみて

もし、Proxy（特に認証が必要な Proxy ） を利用している環境で、A2019 の Control Room には繋がるけど、デバイスが認識しないとか Bot が実行できないなどの問題が起きた場合、下記も試してください・・の例です。

そもそも、Windows には IE などで使われるブラウザ用の Proxy と、Windows Update などで使われる winhttp proxy の2種類の Proxy 設定ががあるようです。それぞれの Proxy 設定は独立していて、IE の Proxy 設定は Windows Update では使われず、winhttp は IE などのブラウザを使ってインターネットにアクセスする場合には使われない。

柔軟な使い方ができるという意見もあるかと思いますが、フツーの人たちには、むしろ面倒な仕様ですね。

とうことで、

```console
netsh winhttp import proxy source = ie
```

で、IE の Proxy 設定がブラウザ以外でも使用されるようになります。

```console
netsh winhttp set proxy <IP Address>:<Port>​
```
をしていた方にも面倒が無くて良いかなと思います。
参考までに、***netsh winhttp ?*** でヘルプが参照できます。

```console
C:\Users\username>netsh winhttp ?

The following commands are available:
Commands in this context:
?              - Displays a list of commands.
dump           - Displays a configuration script.
help           - Displays a list of commands.
import         - Imports WinHTTP proxy settings.
reset          - Resets WinHTTP settings.
set            - Configures WinHTTP settings.
show           - Displays currents settings.
```
SpringでWebSecurityConfigureAdapterを利用したときに、usernameだけでなくpasswordも取得する方法

#前提
こちらの記事にある、実装がされている。
https://qiita.com/nyasba/items/f9b1b6be5540743f8bac

#課題
```UserDetailsService.java
@Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

```
loadUserByUsernameではusernameしか取れないので


`AbstractUserDetailsAuthenticationProvider`
を利用して、passwordも引数として利用する

参考：https://stackoverflow.com/questions/53445809/spring-security-get-password-in-userdetailsservicemethod


#設定
以下のようにimplementsではなくextendsする

```UserDetailsService.java
@Service
public class UserDetailsServiceImpl extends AbstractUserDetailsAuthenticationProvider {
```
また、configureは以下のように設定する。

```WebSecurityConfig.java
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
///
///
    @Autowired
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(userDetailsService);
    }
```

以上2つを設定することで、かんたんにpasswordをrequestから抽出することができる。
Dockerイメージをgradleでビルドする（spring-boot）

SpringBootで実装したアプリケーションのDockerイメージをビルドします。
今回はDockerコマンドを直接叩くのではなくgradleを経由させる感じ。
# 前提

| product | version |
|------------------:|:------------------:|
| spring-boot | 2.3.0 |
| Gradle | 6.3 |
| Docker Engine | 19.03.5 |

各種ファイルの配置はこんな感じ。

```
root
  +- src
  +- Dockerfile
  +- build.gradle
  ...
```

# `Dockerfile` の作成
作成した `Dockerfile` はこんな感じ。

```Dockerfile:/Dockerfile
FROM openjdk:8-jdk-alpine
ENV JAVA_OPTS = "-Dspring.profiles.active=dev"
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT [ "sh", "-c", "java ${JAVA_OPTS} -jar /app.jar" ]
```
今回はデプロイ環境によってDBの接続先等も変えれるようにしたいので 
`ENV JAVA_OPTS = "-Dspring.profiles.active=dev"`
を追加。（詳細はここでは省略しますがspringではjavaの起動オプションで環境ごとの切り替えができます）

# `build.gradle` へ追記
続いて以下を追記。
今回使用するのはこちらのプラグイン。
https://github.com/palantir/gradle-docker

```gradle:/build.gradle
plugins {
    ...
    id 'com.palantir.docker' version '0.25.0'
}

...

docker {
    name "${name}:${version}"
    files bootJar.archiveFile.get()
    dockerfile file('./Dockerfile')
    buildArgs(['JAR_FILE': "${jar.archiveFileName.get()}"])
}
```
キーポイントはこの1行。

```gradle
    files bootJar.archiveFile.get()
```
これがないとイメージビルド時に以下のように怒られます。

```
> Task :application:docker FAILED
COPY failed: stat /var/lib/docker/tmp/docker-builder605201568/app-0.0.1-SNAPSHOT.jar: no such file or directory
```
前述の `Dockerfile` にて `COPY` タスクを実行しようとしたときに、jarファイルが見つからないため怒られています。
なので、 `files()` メソッドを使って `build/docker` 以下に生成したjarファイルをコピーしてあげます。
（`build` 以下に `docker` ディレクトリを生成しそこをワーキングディレクトリとしているみたいなので、そのワーキングディレクトリへのjarファイルのコピー作業が必要）
また、

```gradle
    buildArgs(['JAR_FILE': "${jar.archiveFileName.get()}"])
```
 では、`Dockerfile` 内の `JAR_FILE` 引数へ生成したjarファイル名を引き渡しています。

ちなみにですが、

```gradle
    dockerfile file('./Dockerfile')
```
は `build.gradle` と同階層に `Dockerfile` を配置している場合は特に指定不要です。（つまり今回の場合は書かなくてもよい）
別途ディレクトリを切ってそこに `Dockerfile` を入れてる、などの場合はそのパスを指定しましょう。

# いざビルド
イメージのビルドは簡単。以下を実行するだけ。
**Docker起動しておくのを忘れずに。**

```bash
// build jar.
$ ./gradlew build
// build docker image.
$ ./gradlew docker
```
これでイメージのビルドが完了します。
（このとき、`build`ディレクトリ以下に`docker`ディレクトリが生成されており、その中に `Dockerfile` と生成されたjarがコピーされていることがわかるかと思います）

`docker images` コマンドでイメージが生成されていることも確認しましょう。

# 動かす
イメージのビルドが完了したら、runしてみましょう。

```bash
$ docker run --env JAVA_OPTS="-Dspring.profiles.active=dev" ${name}:${version}
```
無事起動できます。

序盤に書きましたが、環境ごとで接続先等を変えたい場合は、
`--env JAVA_OPTS="-Dspring.profiles.active=dev"`
をオプション指定して適宜`prod`などを指定してあげればOKです。

# Registryへプッシュ
作成したイメージを今回はDockerHubへpushします。これも簡単。
**docker login を忘れずに。**

```
$ ./gradlew dockerPush
```

# おわり
こんな感じで、Gradleプラグイン経由で簡単にDockerイメージをビルドできました。
細かい部分については言及していませんが、最小パターンでやるにはこんな感じで充分かと思います。
【Ruby on rails】 No Procfile detected, using the default web server.と表示される。

##警告内容

herokuデプロイ時に発生しました。

```
###### WARNING:
remote:        No Procfile detected, using the default web server.
remote:        We recommend explicitly declaring how to boot your server process via a Procfile.
remote:        https://devcenter.heroku.com/articles/ruby-default-web-server
```


##解決方法

どうやら、Procfileが見つからないとのことです。
プロジェクトのルートディレクリ直下に「Procfile」を作成する必要があります。

```Procfile.
web: bundle exec puma -C config/puma.rb
```
こちらの意味は「config/puma.rb」のファイルを読み込むように宣言しています。

あとはいつもの通りにコミット→プッシュしてみます。
警告が消えました！
ImGui で std::vector<std::string> で Combo を作る

## 背景

ImGui 素晴らしいですよね.
Combo UI も便利ですよね.

でも, `ImGui::Combo` では, C interface なのでちょっと使いづらい... (nullで区切った一つの文字列を作る必要があるなど)

`std::vector<std::string>` とかから, 毎回 ImGui 用にデータ変換してもいいけど, 処理時間が無駄ですよね.

`std::vector<std::string>` や, `std::map<std::string, int>` みたいな変数を直接扱って, お手軽ぺろっと Combo 作りたい.

## 方法

https://discourse.dearimgui.org/t/imgui-combo-std-vector-std-string/350

https://github.com/ocornut/imgui/blob/b8fe0df7df79dcf7560246f9c3510f5e54de6ff6/imgui_demo.cpp#L779

`BeginCombo`, `EndCombo` 使います.

こんな感じになります.

```c++
//
// Combo with std::vector<std::string>
//
static bool ImGuiComboUI(const std::string &caption, std::string &current_item,
                         const std::vector<std::string> &items) {
  bool changed = false;

  if (ImGui::BeginCombo(caption.c_str(), current_item.c_str())) {
    for (int n = 0; n < items.size(); n++) {
      bool is_selected = (current_item == items[n]);
      if (ImGui::Selectable(items[n].c_str(), is_selected)) {
        current_item = items[n];
        changed = true;
      }
      if (is_selected) {
        // Set the initial focus when opening the combo (scrolling + for
        // keyboard navigation support in the upcoming navigation branch)
        ImGui::SetItemDefaultFocus();
      }
    }
    ImGui::EndCombo();
  }

  return changed;
}
```

あとはお好みで配列インデックスを返すようにしたり, `std::map<std::string, int>` や `std::map<std::string, std::string>` にしてみたりして.
AWSのDocumentDbにjsonファイルを使ってデータをインポートする

`mongoimport`というコマンドを使います。以下のコマンドを実行してください。

```bash
sudo yum install mongodb-org-tools
```

カレントディレクトリにjsonファイルを用意して、以下のコマンドを実行。

```bash
sudo mongoimport --ssl --host="your-host:27017" --collection=collection-name --db=db-name --file=your-json-file-name.json --sslCAFile rds-combined-ca-bundle.pem --jsonArray --username your-username --password your-password
```

もし、
`Importing json from file into mongodb using mongoimport`

というエラーがでたら、以下のページを参考にしてみてください。
https://stackoverflow.com/questions/30380751/importing-json-from-file-into-mongodb-using-mongoimport

`rds-combined-ca-bundle.pem`をカレントディレクトリにダウンロードしておくこともお忘れなく。

```
rs0:PRIMARY> db.test-log.find({}).pretty()
2020-06-05T10:50:37.066+0000 E QUERY    [thread1] ReferenceError: log is not defined :
```

mongodbではハイフンが入っているとこうなる。

以下のようにして。

```
rs0:PRIMARY> db['test-log'].find({}).count()
10
```

ちゃんと入っていました。
SpringでWebSecurityConfigureAdapterを利用したときに、Requestをバックスラッシュ無しで受け取りたい

#前提
こちらのサイトを参考に、SpringでJWTを利用したJWTAuthenticationFilterが実装されている。
https://qiita.com/nyasba/items/f9b1b6be5540743f8bac

#課題
bodyに入るバックスラッシュ取りたい。

```JTWAuthenticationFilter.java
curl -v -X POST -d "{ \"loginId\" : \"nyasba\", \"pass\" : \"password\"}" -H "accept: application/json" -H "Content-Type: application/json" "http://localhost:8080/user/login"
```

# 解決策
Stringで一度受け取り、その値をGSONに突っ込むことで実現できる

```JTWAuthenticationFilter.java
try {
　　　　　　　StringBuilder sb = new StringBuilder();
            BufferedReader reader = req.getReader();
            try {
                String line;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
            } finally {
                reader.close();
            }

            Gson gson = new Gson();
            UserForm userForm = gson.fromJson(sb.toString(), UserForm.class);
```

# 結果
以下のリクエストでも受け取ることができる。
```
curl -v -X POST -d "{ "loginId" : "yamada.taro@gmail.com", "pass" : "P@ssw0rd"}" -H "accept: application/json" -H "Content-Type: application/json" "http://localhost:8080/user/login"
```
量子力学の仮定


###1. 系の状態(state)は完全に波動関数ψ(x, y, z, t)で決められる。

###2. モーメントやエネルギーなど実験的に観測できる変数に対しては、必ず対応している演算子(Operator)が存在する。
　　例えば$ p_x $に対して対応している演算子は${\hat p}_x$。よく使われる演算子は以下のものがある:

　　**a. 位置**   
        
```math
{\hat q} = q
```
   
　　**b. モーメント**

```math
{\hat p} = -i \hbar \frac{\partial}{\partial x} = \frac{\hbar}{i}\frac{\partial}{\partial x}
```

　　**c. 運動エネルギー**

```math
{\hat p} = -i \hbar \frac{\partial}{\partial x} = \frac{\hbar}{i}\frac{\partial}{\partial x}
```

###3. 系の波動関数はハミルトニアン演算子の固有関数である必要がある。

###4. 系が波動関数で記述されている場合、オブザーバブル(obsevavble)oの平均値はそれに対応するエルミート演算子の期待値に等しい

　　この仮定は以下の式で表せる。

```math
{\ <o>} = \frac{\int \psi^*\hat O \psi}{\int \psi^*\psi}
```

　　もちろん波動関数は規格化された場合は, ${\int \psi^*\psi}$ は合わせた存在確率のため1となるので,

```math
{\ <o>} = {\int \psi^*\hat O \psi}
```
　　例えば, 箱の中の粒子の平均位置$\<x>$を求めたいとき, まず波動関数は

```math
{\psi} = {\sin(\frac{n\pi x}{L})}
```
　　共役*は波動関数に影響はないから、波動関数は変化しない。

　　さらに、位置qの演算子はqなので、箱のカバーできる範囲は-L~Lで積分すると、平均位置が求められる。

```math
{\ <x>} = {\int_{-L}^{L} \psi^*\hat x \psi}\ dx
      
        \quad\\=\frac{2}{L}{\sin(\frac{n\pi x}{L})}{x}{\sin(\frac{n\pi x}{L})}\ dx=\frac{2}{L}
```

　　他にも,色々仮定があるらしい。。
Ansible userで毎回changedとなることを防ぐ

# 毎回changedになる理由

```yml
- name: usermod postgres password
  user:
    name:     "postgres"
    password: "{{ user_passwd_postgres | password_hash('sha512') }}"
```

これをやってしまうと毎回ランダムな``salt``でハッシュ化されたパスワードが生成されるため、都度``chagned = True``となってしまう。

# ランダムにしないためのsalt？

``password_hash('sha512','salt')``のように指定すると、毎回``salt``が固定されるためハッシュ化された値は同じになる。

```yml
- name: usermod postgres password
  user:
    name:     "postgres"
    password: "{{ user_passwd_postgres | password_hash('sha512','salt') }}"
```

しかしコレだと``salt``がハードコーティングされていることになり、しかも全アカウントで同じ``salt``を利用すると脆弱になる。

- 参考：[Wikipedia - ソルト (暗号)](https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%AB%E3%83%88_(%E6%9A%97%E5%8F%B7))
    - ``よくある誤用``を参照されたし。


>ソルトの再利用
プログラマがパスワードをハッシュ化する際に毎回同じソルトを使用するケース。 この場合でも、既存のレインボーテーブルを無効化することはできる（ソルトの値が適切であれば）。ただし、広く使われている製品にソルトがハードコーディングされると、そこから抽出したソルトを使って新しいレインボーテーブルを生成できてしまう。 また、ソルトが固定だと、パスワードが同じユーザーはハッシュ値も同じになってしまう（ハッシュ値を作る際にユーザ名を混ぜ込んでいる場合を除く）。これにより、一つのハッシュ値で複数のユーザーを攻撃するのが容易になってしまう。 

# 結論

```yml
- name: user add yamashtt
  user:
    name: yamashtt
    password: "{{ user_passwd_postgres | password_hash( 'sha512', user_passwd_postgres_salt ) }}"
    shell: /bin/bash
```

``group_vars``に``user_passwd_postgres``(平文のパスワード)と一緒に``user_passwd_postgres_salt``も定義する。チームメンバーにはアカウント毎に``salt``も変更するように周知する。

# ~~コメント募集~~ 解決済み

本記事初投稿時に``{{}}``の中で``{{}}``を使う方法がわからずにコメントを募集していました。
以下はその記録です。投稿してわずか15分程で回答をいただけてしまいました。スバラシイ!!!

## 初投稿時に記載していた内容

```yml
- name: usermod postgres password
  user:
    name:     "postgres"
    password: "{{ user_passwd_postgres | password_hash('sha512','{{ user_passwd_postgres_salt }}') }}"
```
上記のように変数の中に変数をいれる(Linxuの``eval``みたいな)ことはできませんか？

## いただいたコメント

コメントにて[@akira6592](https://qiita.com/akira6592)さんよりサポートいただきました！ありがとうございます！

```yml
- name: usermod postgres password
  user:
    name:     "postgres"
    password: "{{ user_passwd_postgres | password_hash('sha512', user_passwd_postgres_salt ) }}"
```

``{{}}``の中では変数は全部展開されるんですね。わーお、スッキリ～!!
adb よく使うコマンド一覧

**以下のコマンドを実行するには、USBデバッグとフィンガープリントの許可をあらかじめ済ませておく必要がある。**

##接続中のデバイスを確認する
```bash
$ adb devices
```

##アプリのパッケージ名一覧を取得
```bash
$ adb shell pm list package
```

##アプリのパッケージ詳細情報を取得
```bash

$ adb shell pm dump <パッケージ名>
```

## TCPモードで起動
USBを使わずTCP/IPでアクセスすることが出来る。
設定できるポートは5555〜5585までだと言われている。

```bash
$ adb tcpip 5555
```
切断する場合

```bash
$ adb disconnect
```

## シェルを使う
```bash
$ adb shell
```
コマンドの一覧は **adb shell help** で表示する。
因みにDCIMやDownloadフォルダがあるディレクトリは **/mnt/sdcard**

## アプリインストール
```bash
$ adb install <apkファイルの絶対パス>
```

## アプリ実行
```bash
$ adb shell am start -n <パッケージ名>/<クラス名>
```
###クラス名の取得は上で書いたパッケージ詳細情報の初めの部分の内容に記述されている。

```bash
DUMP OF SERVICE package:
  Activity Resolver Table:
    Schemes:
        http:
          898a736 com.nianticlabs.pokemongo/com.nianticproject.holoholo.libholoholo.unity.UnityMainActivity filter 12fb293
            Action: "android.intent.action.VIEW"
            Category: "android.intent.category.DEFAULT"
            Category: "android.intent.category.BROWSABLE"
            Scheme: "http"
            Scheme: "https"
            Authority: "pokemongolive.com": -1
            Path: "PatternMatcher{PREFIX: /launchapp}"
            AutoVerify=true
```
例としてPokémon GOのクラス名をとってみた。
クラス名は **com.nianticproject.holoholo.libholoholo.unity.UnityMainActivity**

## 再起動
```bash
$ adb reboot
```
【python】カンガルーの位置を比較するプログラム。

#【python】カンガルーの位置を比較するプログラム。(while文)

自分用メモです。

▼設問

- 2匹のカンガルーが一定の距離間でジャンプしていく。
- スタート地点は各々、x1, x2
- 二回目以降のジャンプ距離は、v1, v2
- 何回目かのジャンプで二匹が同じ位置にくる場合は”YES”をかえす。そうでない場合は、”NO”をかえす。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/252c0900-9a6d-b4c2-41db-5932e31378cc.png)

[URL](https://www.hackerrank.com/challenges/kangaroo/problem)

▼sample input

```python:
x1 = 43
v1 = 2
x2 = 70
v2 = 2
```

▼sample output

```python:
'NO'
```

▼my answer

```python:
def kangaroo(x1, v1, x2, v2):
    n = 0
    condition = True
    while condition:
        n += 1
        c1 = x1 + v1*n
        c2 = x2 + v2*n

        #永遠に追いつかない
        if x1 <= x2 and v1 < v2:
            return "NO"
        elif x1 < x2 and v1 == v2:
            return "NO"
        elif x2 <= x1 and v2 > v1:
            return "NO"
        elif x1 > x2 and v1 == v2:
            return "NO"

        #追いつく可能性あり
        elif x1 <= x2 and v1 > v2:
            if c1 == c2:
                return "YES"
            elif c1 > c2:
                return "NO"
        elif x2 <= x1 and v2 > v1:
            if c1 == c2:
                return "YES"
            elif c2 > c1:
                return "NO"

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    x1V1X2V2 = input().split()

    x1 = int(x1V1X2V2[0])

    v1 = int(x1V1X2V2[1])

    x2 = int(x1V1X2V2[2])

    v2 = int(x1V1X2V2[3])

    result = kangaroo(x1, v1, x2, v2)

    fptr.write(result + '\n')

    fptr.close()
```

<br>
**・choreographing**
振り付けの
You are choreographing a circus show with various animals.
動物振り付けサーカスショー



**・while**

```python:
while 条件式:
   処理
```

・条件式がTrueの間、処理を繰り返す。
・通常、Falseとなる処理を入れる。
・return終了させる場合、Falseになる処理は不要。
VisualBasicで.NETアセンブラとCOMコンポーネント利用方法

# この記事を書くまでの経緯
仕事でVisual Basicのプログラムの置き換え作業を行っているだが、旧プログラム動かそうとすると、
「〇〇.ocxが参照できない」という警告がでてきたので、調べた結果いろいろわかったのでその備忘録として残す

# COMコンポーネントとは
あるソフトの仕組みを外部から利用できるようにしてくれるプログラムの部品みたいなもの(単体では動かない)

例) COMコンポーネント「execell 16.0 object Library」はExcelの仕組みを外部から利用できるようにしてくれるプログラム 

#利用方法
プログラム自体は基本OSをインストールしたときに入っているものもあれば、別途ダウンロードする必要がある。
VisualStdioの場合は[プロジェクト]-[参照の追加]で[COMコンポーネント]タブから該当のCOMコンポーネントをチェックをつける
もしくは、CreateObject関数を利用する

開発環境と実行環境が異なるPCの場合は対象COMコンポーネントがインストールされていること

[参考リンク](https://exceedone.wordpress.com/2012/08/21/dll%E5%8F%82%E7%85%A7%E9%A0%86%E7%95%AAactivex-com-net-win32api-loadlibrary/)

# .NET アセンブリについて
.NET FrameWorkで使用されるライブラリ、拡張子はdllとexeとなる

# 利用方法
COMコンポーネントと同様

開発環境と実行環境が異なるPCの場合は対象COMコンポーネントがインストールされていること(※場所はある程度きまっている上記で示した参考リンク参照願います)

# 注意点
COMコンポーネントもバージョンがあるので、そこは注意が必要(いわゆるDLL地獄とよばれるもの)
.NET アセンブリについてはGACという異なるバージョンでもコンパイル時のバージョンを利用する仕組み(side-by-side実行)があるため、間違って古いバージョンを上書きしなければ問題ない([参照](https://www.atmarkit.co.jp/fdotnet/technology/idnfw11_04/idnfw11_04_01.html))
AutoLayoutに追従する図形を描く

UIViewの `contentMode` に `redraw` を設定すると、Viewのframeが変わった時にAutoLayoutを使用しても簡単に図形を再描画することができます。
以下のコードでは下向きの三角形が描画されます。

<img width="52" alt="スクリーンショット 2020-06-05 19.41.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197742/75a2e55e-7b59-ccae-3a6f-91faaa66e1ae.png">

```swift
import UIKit

final class TriangleView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        contentMode = .redraw
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        contentMode = .redraw
    }

    override func draw(_ rect: CGRect) {
        let path = UIBezierPath()
        path.move(to: rect.origin)
        path.addLine(to: CGPoint(x: rect.maxX, y: rect.minY))
        path.addLine(to: CGPoint(x: rect.midX, y: rect.maxY))
        path.close()
        UIColor.gray.setFill()
        path.fill()
    }
}

let view = TriangleView(frame: .init(origin: .zero, size: .init(width: 50, height: 25)))
view.backgroundColor = .white
```

Playgroundだと以下のコードを追記するだけで簡単にUIを確認できて便利ですね。

```swift
import PlaygroundSupport
PlaygroundPage.current.liveView = view
```
誰でもできるデータ設計の進め方

# データ設計の進め方

正規化とか、正規形って何？
という方でも、第三正規形のデータ構造を作成できる設計方法をご紹介します。

1. 個体を認知する（エンティティの抽出）
2. 個体を識別する（マスタ、トランの分類）
3. 関係を確認する（エンティティ間の関係）	 	 	
	1. マスタ−トラン（1対多）
	2. マスタ-マスタ
	3. トラン-トラン
	4. マスタ-トラン（多対多）
4. 周延を確認する（サブセット）

この手順で設計を進めると難しいことを考えなくても、第3正規系まで作れますよ。
嘘っぽいですが、本当なのです。
## 1. 個体を認知する（エンティティの抽出）
　ID、番号、キーとつくものをキー項目として、エンティティを作っていきます。
ただし、区分番号や種別キーなどはキー項目にはなり得ません。
　大事なのは、勝手にキーを作ってエンティティを増やさないこと。
## 2. 個体を識別する（マスタ、トランの分類）
　1で作ったエンティティをマスタとトランに分類します。
　日付が項目に入るものはトラン、そうでないものはマスタとします。
　受注エンティティには受注日が入るのでトラン、製品には製品日というものが入らないのでマスタといった感じ。
## 3. 関係を確認する（エンティティ間の関係）
ここがキモです。
#### 1. マスタ-トラン（1対多）
　マスタのキー項目をトランのキー項目に加えます。それだけです。
#### 2. マスタ−マスタ
　1対1、1対多、多対多などどんな関係でも、間に新たにエンティティを作り、両方のキー項目を新たエンティティのキー項目としましょう。
#### 3. トラン-トラン
　前後関係があるはずなので、前のエンティティのキー項目を後ろのエンティティのキー項目として加えます。
　ただし、多対1、多対多の場合は間に新たなエンティティを作り、両方のキー項目をキー項目とします。
#### 4. マスタ-トラン（多対多）
　トランがヘッダー-ディテール構造になっているべきものと思われます。
　商品と受注のようなものです。
　トラン全体を管理するエンティティと明細を管理するエンティティに分け、明細とマスタを関係させると1対多になります。

## 4. 周延を確認する（サブセット）
　ここは意見が分かれるのでどこまで書くかですが・・・
　区分や種別とつく項目がある場合、マスタから切り出して新たなエンティティを作ります。
　区分やキー項目は新しく作るエンティティ名にします。
　キー項目は元のマスターのキー項目です。
　　※区分や種別はキーにはしません。
　そうすることで区分や分類をなくすことができます。
　区分や種別によって項目が変わる場合、新しいエンティティ側に持っていくと、nullを排除できます。

こんな感じで設計してみると、気がつけば第3正規形になってますよ。

50分くらいかけて講義する内容を端折ってるので、わかりにくい部分も多いと思います。

わからないことはなんでも聞いてくださいね〜。
【python】if文を1一文で書く方法。

#【python】if文を1一文で書く方法。
if else文は一文で書くことができる。

・`式(Trueで実行) if 条件式 else 式(falseで実行) `

>[公式ページ](https://docs.python.org/ja/3/reference/expressions.html#conditional-expressions)
「x if C else y」 という式は最初に条件 x ではなく C を評価します。
 C が true の場合 x が評価され値が返されます。
それ以外の場合には y が評価され返されます。

```python:通常のif文
a=5
if a<5:
　i*5
else:
  i*2
```


```python:一文で書く
a=5
i*5 if a<5 else i*2
```


▼応用
@shiracamusさんに教えてもらった記述の中身を紐解いてみる。

```python:
def gradingStudents(grades):
    return [grade + (0 if grade < 38 or grade % 5 < 3 else -grade % 5)
           for grade in grades]


if __name__ == '__main__':
    grades_count = int(input().strip())
    grades = [int(input().strip()) for _ in range(grades_count)]
    result = gradingStudents(grades)
    print(*result, sep='\n')
```


###▼if文を一列で書く
「0 if grade < 38 or grade % 5 < 3 else -grade % 5」

38未満かつ、5で割った余りが3以下なら0。(True)
Falseなら、マイナス値を5で割った余りを算出。

###▼マイナスの余り
「-5%3」のようにマイナスの値を割った場合の余り。
必ず**プラスの整数**になる

-x%y
商はマイナス。
余りは 0<=余り<y


「-5%3」の場合、商：-2, 余り:1
余り＝3*(-2)-5=1



###内包表記
・for文を一文で書く記述。
[式 for 変数 in イテラブル]　
　└ 出力はlist

・return [内包表記]
　└ returnが実行されるのは内包表記の処理が全部終わってから。

<br>
まとめると、

1. 内包表記でgradeに入っている要素を一つづつ取り出す。
2. if文でgradeに足す値を決定する。
3. 要素の数だけ繰り返す
4. 「grade + 0 or 余り」の値をリスト化
5. returnで返す。



<br>
##if文の一文表記と内包表記を使ったプログラムの例

###2つの文字列を比較して、同じ文字が含まれているかを調べる。

```python:
s1,s2="h","world"

def twoStrings(s1, s2):
    return "YES" if sum([s2.count(i) for i in set(s1)]) else "NO"
    
twoStrings(s1, s2)
```
Lambda  関数から Lambda 関数を呼び出す (Node.js)

次のページを参考にしました。
[AWS lambdaでハマったこと (lambdaからlambdaを呼び出す)](https://took.jp/post-1037/)

メインプログラム

```js:callSample/index.js
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();
exports.handler = function(event, context) {
	console.error("*** start callSample PM 18:57 ***")
	
	const event_aa = {
    "key1": 118,
    "key2": 216,
    "key3": 314
}

const payload = JSON.stringify(event_aa)

    const params = {
        FunctionName: 'example01',
        InvocationType: 'RequestResponse',
        Payload: payload
    };
    lambda.invoke(params, function(err, data) {
        if (err) {
            context.fail(err);
        } else {
            console.error("*** check callSample PM 18:51 ***")
            context.succeed(data);
        }
    });
};
```
![callSample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/8303399b-b53e-0cd6-0c8c-1bd132c00bb6.png)


呼び出される関数

```js:example01/index.js
exports.handler = async (event) => {
    // TODO implement
    console.error("***** start example01 PM 18:49 ***")
    var rvalue = {}
    rvalue['key1'] = event['key1']
    rvalue['key2'] = event['key2']
    rvalue['key3'] = event['key3']
    rvalue['message'] = 'Hello from example01'

    const response = {
        statusCode: 200,
        body: JSON.stringify(rvalue),
    };
    console.error("***** end example01 ***")
    return response;
};
```

![example01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9f350435-143d-113d-a7ed-ce382b1af639.png)

実行時には、デフォールトの roll ではなく、次のような権限を持った、ロールが必要です。
>AWSLambdaFullAccess
CSSで理解できていないところ@備忘録

#何がわからなかったのか
```CSS
height: calc(100vh - 190px);
```
```CSS
border-bottom: 1px solid #595959;
```

#どう理解したか
```CSS
height: calc(100vh - 190px);
```
calcはcalculationの略、異なる単位同士での計算が可能

```CSS
border-bottom: 1px solid #595959;
```
下のボーダーラインの太さ、色などを一括して指定するプロパティのこと
【python】内包表記。for文をシンプルに記述する。（コレクションとは、イテラブルとイテレータの違い）

#【python】内包表記。for文をシンプルに記述する。（コレクションとは、イテラブルとイテレータの違い）

for文を使って、listやset型など（コレクション）を作れる。


##内包表記とは
for文を簡単に書ける書き方。

・`[式 for 変数 in イテラブル]`
　└ []で囲むと出力の型はlistになる。
　└ {}だとセット型


```python
[(i*2) for i in range(5)]

#出力
[0, 2, 4, 6, 8]
```
出力はlist形式。
以下と同じ。

```python:
arrs=[]
for i in range(5):
    arr = (i*2)
    arrs.append(arr)
arrs

#出力
[0, 2, 4, 6, 8]
```

▼{}にするとセット型

```python
{(i*2) for i in range(5)}

#出力
{0, 2, 4, 6, 8}
```


<br>
##補足
###■コレクションとは
データ型の一種。
複数の要素を持てる型の総称。

list, range, setなど。

１つのデータしか持てない、str, int, floatなどはコレクションではない。


###■イテラブルとイテレータの違い
イテラブルは繰り返し可能なオブジェクトの総称。
イテレータはイテラブルの1種（型）でより限定的。


**・イテラブル(iterable)**
繰り返し可能なオブジェクト。
list, tapple, range型のオブジェクト。

「for i in イテラブル」


<br>
**・イテレータ**
型の一種。(元の型_iterator)
iter関数で、イテレーターになる。
next関数が使える。

**▼イテレータ型の確認**

```python:listの場合
arr = [1,2,3,4,5]

iterArr = iter(arr)
type(iterArr)

#list_iterator
```

```python:tuppleの場合
brr = (1,2,3,4,5)

iterArr = iter(arr)
type(iterArr)

#tuple_iterator
```

```python:rangeの場合
crr = range(5)

iterArr = iter(arr)
type(iterArr)

#range_iterator
```

**・next関数**
iter型の要素を一つづつ順番に取り出す。
不可逆。

next(イテレータ)

```python:イテレータ＆next
arr = [1,2,3,4,5]
iterArr = iter(arr)

next(iterArr)
1

next(iterArr)
2
~
~
~
next(iterArr)
5

next(iterArr)
StopIteration: #←全部抽出しきるとエラーになる
```

イテレータとnextを使うと順に処理をしていける。


▼イテレータはfor文も使える。
イテレータはイテラブルな要素の一つ。

```python:
arr = [1,2,3]
iterArr = iter(arr)

for i in iterArr:
    print(i)

1
2
3
```
iOSのバックグラウンド状態でできることを簡易的にまとめる


## Audio, Airplay, and Picture in Picture
音の再生・AirPlay（音楽を再生するなど）



## Location updates
位置情報更新

https://qiita.com/SatoTakeshiX/items/a7039b9a1691d05d10da

- significant-change location service 
完全にアプリを閉じてる状態でも更新できる
https://developers.cyberagent.co.jp/blog/archives/771/


## Voice over IP
通話, VoIP用のプッシュ通知
VoIPプッシュは高優先度かつ遅延なく配送されるとみなされる
https://qiita.com/mgkdev/items/303b9015fabca4eb7fb7

端末がロックした状態で着信に応答すると、CallKitの通話画面が表示されたままになります。この状態では、アプリ側の画面が表示されないためビデオが表示されません。ユーザーがロックを解除するとアプリの画面に切り替わります。
https://note.com/yorifuji/n/n1ae3ebde3943


## External accessory communication
外部アクセサリ（Bluetooth機器など）と通信

## Uses Bluetooth LE accessories
Central側の通信をバックグラウンドで継続
Bluetoothアクセサリとの通信

## Acts as a Bluetooth accessories 
Peripheral側の通信を行いたい場合
Bluetoothアクセサリとの通信
http://harumi.sakura.ne.jp/wordpress/2019/05/23/ios%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%81%A7%E9%95%B7%E6%99%82%E9%96%93ble%E9%80%9A%E4%BF%A1%E7%B6%9A%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/


## Background fetch
iOS7~
最新ニュース記事を決まったエンドポイントから通信して取得する
電子書籍のページを同期するために通信する
https://dev.classmethod.jp/references/ios-background-fetch/

## Remote notifications
通知（Notification）の監視


## Background processing, Background App Refresh Tasks
iOS13~

- Background processing

(急を要しない)後々の実行で良いメンテナンス処理
Core MLを利用した機械学習のトレーニング処理
が数分間、処理実行が可能

- Background App Refresh Tasks

30秒以内で完了できる処理
1日を通してアプリを最新に保つために必要な処理

https://grandbig.github.io/blog/2019/09/22/backgroundtasks/
GALプログラマ始動

おそらく千石のジャンク袋に入っていたGAL22V10Dが一つあり使えるようにしたいと思いいろいろ調べてみた。

PAL -> GAL -> CPLD -> FPGAと規模が大きくなったが、FPGAになるとほとんど3.3Vデバイスで5VデバイスはCPLDの最初の頃までだったようだ。またPALはOne Timeの書き込みだったので再利用はできません。

GALがでてきたのは1985年くらいで、当時マイコンは16Bit CPUの時代でした。

もともとプログラマブルロジックアレイはCPUの周辺のロジックをTTLから置き換えるために作られたが、規模が大きくなりFPGAではCPU自体も作れるようになった。

GALの開発ツールのispLEVER Classicはライセンスキーは必要ですが、フリーで使えるので、これでJEDECを生成して焼く方法を考える。

FPGAの書き込みはJTAGが使われるがGALの頃はまだJTAGがなく独自の書き込み仕様でした。

LatticeにはispGALというシリーズがありますがこれはJTAG方式で書き込みができるGALだっとと思われます。（未検証）

Amazonで販売されているTL866などを使えば書き込みができるようなのだが、自作もできるようなので探してみた。

検索すると一番先に見つかる、国内のプロジェクト。インターフェースはパラレル。かなり古い。

http://elm-chan.org/works/pgal/report.html

海外のかなり古いプロジェクト。こちらもインターフェースはパラレル。いろいろ資料があり参考になります。

http://www.armory.com/%7Erstevew/Public/Pgmrs/GAL/_ClikMe1st.htm

VPPはTLC7524(DAC)と78S40(Switching Regulator)かCA3140E(Op amp)で作っているようです。TLC7524は高いVREFが設定可能で、これで電圧を可変しているようです。

![スクリーンショット 2020-06-08 6.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/085fa6a4-bd32-7904-bc63-ecafde78fc54.png)

以下はこれが元になっているようだ。

最近までメンテされてるプロジェクトでパラレルポートを使ったプログラマ。コントロールはWindowsのアプリ。このプロジェクトは他と違いバッファ回路を全く入れていない。上記のプロジェクトの初期のミニマム構成からの派生のようだ。AtmelのATF22V10Bなどのサポートが追加されていますが、なぜかGAL6001などが消されいます。LatticeはGALの生産をやめてしまいましたが、Atmelはまだ生産しているようです。

VPPはかなり簡素化して手動スイッチと電源電圧でコントロールしてます。

http://www.bhabbott.net.nz/atfblast.html

Perl-Tkを使ったプログラマのプロジェクト。これも新しめのプロジェクト。こちらもパラレルだが特定のUSB変換でも動いているとのこと。

https://github.com/kees1948/perlblast

VPPは複雑な回路で構成されています。

2021/12追記：Aruinoを使ったライターがありました。

https://github.com/ole00/afterburner

技術評論社の雑誌でプロセッサの1987/7,10,11に「GALの特徴とROMライターアダプタ・ボードの製作」という星野操さんの連載がありました。これは1986/8に掲載されたROMライターを基にしているようです。ホストはPC9801だったようです。

なんか自分が使えそうなものないから、作ってみるか。
デプロイって...？

##そもそもデプロイとは
　デプロイって何ですか？と受講生に聞かれたらどう答えるのがいいかのを自分なりに考えてみました。


## what
結論
　👉受講生（クライアント）のアプリケーションを世界に公開するための作業。

## why
　👉ローカル（手元のPC）で作成したアプリケーションをリモートの公開用サーバーにコピーする必要があるから。

## how
　👉サーバーの用意
・AmazonWebServise、
・VPS、
・PaaS、
・レンタルサーバー、
のいずれか

　👉サーバー構築
サーバーのセットアップ
●Rubyだと以下をインストール
・RubyonRails
・MySQL
・ImageMagick

●SSHという接続方法でログイン（ローカル→リモート）
・コマンド操作はLunuxで行う。

　👉デプロイ
・ファイルのアップロード
・データベースのセットアップ
・サーバーの再起動

また、デプロイには手動デプロイと自動デプロイがある。
・手動デプロイ
①ソフトウェアを使ってファイルをアップロード。
②SSHでリモートサーバーに接続。
③データベースで必要なセットアップ（テーブルの作成など）。
④コマンドを打ち込んでサーバーを再起動。

・自動デプロイ
上記の手動デプロイが面倒であるので自動化したい。
CapistranoやFabricのツールを使う。
手動デプロイの①③④をコマンド一つで行いうことができる。


### デプロイとGit
　👉何度もデプロイを行うには簡便さが必須。
いちいち更新した箇所を探し○○と△△を選択してアップロード、、などとすると大変な作業量になってしまう。それを簡略化するためにデプロイのツールが有効。
このデプロイのツールと合わせて使うのがGitです。Gitはバージョン管理ツールとよばれるものでデプロイのツールではないと分かりました。バージョン管理とは、要は履歴を管理してくれることと同義です。このGitとデプロイツールを組み合わせることで、作業の差異を確認できるよううになります。この差があるおかげで今回更新しただけの分を簡単にピックアップできるようになるというわけです。そしてその差異をデプロイツールに渡してデプロイ完了となります。

###まとめ
カリキュラムが始まるとまずはGitの操作から入ります。
これを何のためにやるのか、具体的に何をしているのか、学習当初から分からなすぎて自分は路頭に迷いました。同じように感じてしまう受講生が少なからずいらっしゃると思います。今回学習した内容を話してあげることでもやもやを晴らしてあげることができるような気がしました。まずはgit〜デプロイまでの概観をさっと掴ませてあげる。対応のことを考えながら学習することが大事ですね。
spacemacsのThemeを変更する

# 環境
macOS
spacemacs

# 参照
SpacemacsのTheme一覧: [Spacemacs Themes](https://themegallery.robdor.com/
)
twilight-bright-themeのGitHubリポジトリ: [jimeh/twilight-bright-theme.el](https://github.com/jimeh/twilight-bright-theme.el)

# Step1. 既存のThemeを変更してみる

```
M-x load-theme
```

変更したいThemeを選びます。

# Step2. 外部のThemeをインストールして適用してみる

1. [Spacemacs Themes](https://themegallery.robdor.com/
) (SpacemacsのTheme一覧) から、使用したいThemeを選びます。
2. `twilight-bright` を使いたいため、[twilight-bright-themeのGitHubリポジトリ](https://github.com/jimeh/twilight-bright-theme.el)を見つけます。 

3. `.spacemacs.d`以下の`init.el`を開きます。

4. `dotspacemacs-additional-packages`に`twilight-bright-theme`を追記して
`dotspacemacs-themes`に`twilight-bright`を追記します。

※`dotspacemacs-themes`は上から順に読み込まれるため、先頭に記述してください。

```emacs-lisp:init.el
dotspacemacs-additional-packages '(twilight-bright-theme
                                      )
dotspacemacs-themes '(twilight-bright
                         spacemacs-light
                         spacemacs-dark
                         )
```

emacsを再起動すると読み込まれます。
hamlの初心者に書き方のまとめなど

#Hamlの初心者用にまとめてみます。
現在、hamlを学習中で色々調べています。
自分が良いと思える情報があちこちのサイトに点在しているので、備忘録も兼ねて、自分なりにまとめてみました。
初心者のすることなので、間違いなど有りましたら、ご容赦ください。
優しくご連絡いただけると助かります^^;

##インストール方法
haml-railsのインストールです。GEMです。
こちらのサイトのREADMEを参考
https://github.com/haml/haml-rails
英語は頑張るTT

##コメントアウト
    /　HTMLに表示されるコメントになる
    -# HTMLに表示されないコメントになる

##タグの書き方の基本
    %p Hello Haml!! → <p>Hello Haml!!</p>

    %p
      Hello Haml!!
    ↓
    <p>
      Hello Haml!!
    </p>

##属性の書き方
    %a{href:'http://google.co.jp',id:'hoge'}
      私はこの書き方が基本になりそうです。
    %a(href='http://google.co.jp' id='hoge')
      この書き方も慣れているので使いそうです。
      ただこの書き方だと書けない場合もあると多くのサイトに書かれていました。
      詳細はこれから体感していくことだと思います。

##classとidの書き方
    %p#hogehoge.hoge.fc_red Hello Haml!!
    ↓
    <p id="hogehoge" class="hoge fc_red">Hello Haml!!</p>

    tagを省略するとdivになります。
    #hogehoge.hoge.fc_red Hello Haml!!
    ↓
    <div id="hogehoge" class="hoge fc_red">Hello Haml!!</div>

##erbタグ <%= %>

    =link_to ’テキスト',"URL"
    ↓
    <%=link_to ’テキスト',"URL" %>
    ↓
    <a href="URL">テキスト</a>

##erbタグ <% %>
    - if corrent_user
        %p hogehoge
    - else
        %p hoge
    - end
      ↓
    <% if corrent_user %>
      <p>hogehoge</p>
    <% else %>
      <p>hogehoge</p>
    <% end %>

##改行を取り除く
子の改行

    %ul
      %li<
        hoge
    ↓
    <ul>
      <li>hoge</li>
    </ul>
親子の改行

    %ul
      %li<>
        hoge
    ↓
    <ul><li>hoge</li></ul>

とりあえず今のところはそんなとこ
また増えたり修正があれば編集します^^
2段階認証

2段階認証
検討対象のサービスが2段階認証に対応していて、そのアカウントが重要だと思う場合は有効にしてください。

2段階認証とは？
MFA 
二段階認証とは、自分が覚えている要素と自分が覚えていない要素の掛け合わせを二段階で行い個人を認証する方式

## 自分が覚えている要素
What you know(knowledge factor) id&pass, phone, pin  自分が知ってるもの

## 自分が覚えている要素以外
What you have(possesion factor) sms, device, qr, onetimepassowrd 自分が持っているもの
What you are (inharence factor) finger face 自分の特性、生体情報


2つ以上の要素の掛け合わせが二要素認証
これらを二段階に分けて認証するのが二段階認証
メールによる認証
電話番号（SMS）による認証

https://news.yahoo.co.jp/byline/kandatoshiaki/20190708-00133324/
Warning: Invocation with class name is deprecated

業務でLaravelのコードを書き、そのテストも書き、テストが正常に動作するかどうかを見ていました。

```
vendor/bin/phpunit tests/Unit/HogeTest.php
```

上のように入力して実行すると、実行はされたのですが、Warningも出てきました。

```
PHPUnit 8.5.2 by Sebastian Bergmann and contributors.

Warning:       Invocation with class name is deprecated
```

どういうことかと調べてみたところ、どうも引数として渡したものがファイル名の場合、このWarningが発生するようでした。引数を渡さない(全体のテストが実行される)か、テストコードが入っているディレクトリを渡した場合はこのWarningは発生しないようです。

参考資料：https://github.com/sebastianbergmann/phpunit/issues/3983
docker alpineのbash git prompt completion設定メモ

```Dockerfile:Dockerfile
FROM alpine

RUN apk add bash
RUN sed -i 's/root:x:0:0:root:\/root:\/bin\/ash/root:x:0:0:root:\/root:\/bin\/bash/' /etc/passwd

RUN apk add git-bash-completion
WORKDIR /usr/share/bash-compeletion/completions
RUN curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh -o git-prompt
RUN : "git関連の設定をbashrcにappend" && { \
  echo 'source /usr/share/bash-completion/completions/git'; \
  echo 'source /etc/bash_completion.d/git-prompt'; \
  echo "export PS1='[\\u@\\h \\W\$(__git_ps1 \" (%s)\")]\\\$ '" ; \
} | tee -a ~/.bashrc
ENV PROMPT_COMMAND '__git_ps1 "\u@\h:\w" "\\\$ "'
ENV GIT_PS1_SHOWDIRTYSTATE true
ENV GIT_PS1_SHOWCOLORHINTS true
```

開発コンテナでalpineなんか使いたくないのだが…。
誰かもっと良いレシピ教えて下さい
[2/10] Anthos anywhere ~ Anthos の進化を追う ~ 受講メモ

Google Cloud で実現するモダンなアプリケーション開発 2/10

ハイブリッド/マルチクラウド環境に配置したGKEベースのサービス群

Anthos Service Mech は Istio のマネージドサービス

OSSをベースにしたソフトウェアモデル

# Anthos Sample Development

GCPでワンクリックで環境構築。
試せる環境がすぐできるよ。（新規プロジェクトのみ）
サンプルアプリを通してどう動くのかも見れる。
費用はAnthonで使ってるリソースの料金。($450/monthくらい？）

# Ingress for Anthos

外部ロードバランサをベースにした新しいサービス

リージョン跨いだ負荷分散が可能→高可用性も狙える

# Anthos GKE on AWS (Beta 今夏にはGA予定)

AWS上でGKEを提供する新しいサービス
EC2で動くよ。

マルチクラウド化の第一歩。
GCPのコンソールから状況が見れる（GKE Hub入ってるから）
ログやメトリクスもGCPに貯まる

冗長構成を取ってマルチクラウドでk8sを利用したいケース

# 今後
Anthos GKE on Azure も予定しているよ。


https://cloudonair.withgoogle.com/events/app-modernization-1/resources?mkt_tok=eyJpIjoiWmpOalpETXpNR0ppT0RSaiIsInQiOiJHUUZcL3B5SjNyTGlBSVhHbDU0dk16VU5nWFNPVkc1aTJzaHFcL1lZcEIzYXRyRklhZXlJVFhwTitzOHZ3M1wvOTZtcnBRUTZhK09EWTNcL3FcLzNPdnhIWjFST0tDcFhcL3EzV2VETUE5V2dEYmhMSG8yTHdFaXpha2REMzB1a2pxMVM5byJ9#?utm_medium=email&utm_source=google&utm_content=thankyou
Ruby アクセサメソッド

# アクセサメソッドとは
インスタンス変数の値を読み書きするメソッドのこと。
Rubyはそのままではインスタンス変数にアクセスできない仕様になっています。

(例)

```ruby
class Animal
  @name = ""
end

animal = Animal.new
animal.name = "cat"
puts animal.name # => ruby.rb:6:in `<main>': undefined method `name=' for #<Animal:0x00007fce4a8b4b40> (NoMethodError)
```

このコードの定義方法だと、@nameは"クラスインスタンス変数"という違う変数として定義され、インスタンスからがアクセスできない仕様になっています。

インスタンスからアクセスすることのできるインスタンス変数の定義はどのようにすれば良いのか。

そこで、"アクセサメソッド"を使用します。

まず、アクセサメソッドは3種類あります。

- attr_reader
- attr_writer
- attr_accessor

## attr_reader
attr_readerは、インスタンス変数にアクセスするためのゲッターです。

(例)

```ruby
class Animal
  attr_reader :name 
  def initialize(name)
    @name = name
  end
end

animal = Animal.new("cat") 
puts animal.name # => cat
```

このように、attr_reader :nameと記述することで、インスタンス変数@nameにアクセスすることができます。
しかし、このままではセッターが定義されていないため、@nameをクラスの外から変更できません。

## attr_writer
attr_writerは、インスタンス変数にアクセスするためのセッターです。

(例)

```ruby
class Animal
  attr_writer :name
  attr_reader :name
  def initialize(name)
    @name = name
  end
end

animal = Animal.new("cat")
puts animal.name
animal.name = "dog"
puts animal.name 
# => cat
#    dog
```

このように、attr_reader :nameに加え、attr_writer :nameも記述することで、外からインスタンス変数@nameを変更し、アクセスできます。

## attr_accessor
attr_readerとattr_writterの機能を一つにまとめたメソッドです。

(例)

```ruby
class Animal
  attr_accessor :name
  def initialize(name)
    @name = name
  end
end
animal = Animal.new("cat")
puts animal.name
animal.name = "dog"
puts animal.name
# => cat
#    dog
```

このように外からインスタンス変数@nameを変更し、アクセスできます。
JavaScriptでスムーススクロールする

Nuxt.jsで開発している環境で、特定の場所にスムーススクロールしたいときに調べたことをまとめます。

## プラグインを使う

おそらくこの辺りのプラグインが問題なく使えそう
[nuxt-linkでスムーズスクロールするならvue-scrolltoが便利で気が利いている…と思う。](https://qiita.com/amishiro/items/f70aca4797cd57bc51b5)
[Nuxt.jsとvue2-smooth-scrollでスムーススクロールする](https://qiita.com/oblivion/items/9eba9b0d4d061260eab8)

## プラグインを使わずに実装したい

いろいろな問題から、新しいプラグインを追加することが望ましくない状況だったので、それくらいだったらプラグインいらないだろうと思い、どれがいいのか調べました。

### scrollIntoView

おそらくこれが一番シンプルな実装ができる

必要な部分だけNuxt.jsで書いてます。

```vuejs
<template>
  <div @click="startScroll"></div>
  <div ref="targetContent"></div>
</template>

<script>
export default {
  methods: {
    startScroll() {
      this.$refs.targetContent.scrollIntoView({
        behavior: 'smooth',
        block: 'start'
      });
    }
  }
}
</script>
```


参考サイト：https://usefulangle.com/post/156/javascript-scroll-to-element#:~:text=Scrolling%20to%20an%20element%20can,scrolled%20to%20var%20element%20%3D%20document

ちゃんとスムーススクロールしますが、細かい調整ができません。
例えば特定のコンテンツの少し上で止めたいなど、 `-30px` などに対応できません。

上記のscrollIntoViewのあとに

```js
window.scrollBy(0, -30); 
```

または

```js
Element.scrollTop -= 30;
```

と追記すれば解決するとのアイデアもありますが、もっといい方法がありそうですよね。

### scrollTo

これで解決しました！
`scrollTo` も `behavior: 'smooth'` が設定できました。
先入観で、スムースできないと思い込んでいたので、ぱっと出てこなかったですね・・

```vuejs
<template>
  <div @click="startScroll"></div>
  <div ref="targetContent"></div>
</template>

<script>
export default {
  methods: {
    startScroll() {
      window.scrollTo({
        top: this.$refs.targetContent.offsetTop-30,
        behavior: "smooth"
      });
    }
  }
}
</script>
```

たったこれだけです。
これくらいだったらやっぱプラグインじゃなくていいですね。

詳しくは参考サイトに書いてあるので割愛します。

#### 参考サイト
https://www.to-r.net/media/smooth_scrolling_2019/
https://developer.mozilla.org/ja/docs/Web/API/Window/scrollTo
JavaScriptのショートハンドまとめた

# 初めに
今回はJavaScriptのショートハンドについて展開します。
構文をすっきり書けることが可読性がいいプログラムコードにつながると信じています。
しかし、省略しすぎると逆に追うのが面倒になってしまうのがネックです。（そこは綺麗な設計でカバーできるかも）
JavaScriptはいろんなショートハンドがありわかりにくいですが、覚えた方がいい物ではあります。

## コード
### 条件式
before

```javascript:main.js
var x = false;
if (x) {
 console.log("hello world!");
} else {
  console.log("Test1!");
} 
```
after

```javascript:main.js
var x = false;
console.log(x ? "hello world!" : "Test1!");
```
### 条件式(elseなし)
before

```javascript:main.js
var x = true;
if (x) {
 console.log("hello world!");
}
```
after

```javascript:main.js
var x = true;
x&&console.log("hello world!");
console.log(x ? "hello world!" : "Test1!");
```
### boolean型の反転
```javascript:main.js
flg = !flg;
```
### for文
配列の中身を順番に抽出
before

```javascript:main.js
var testList = ["Test","Test1","Test2"];
for (let i = 0; i < testList.length; i++) {
　　console.log(testList[i]);
}
```
after

```javascript:main.js
var testList = ["Test","Test1","Test2"];
for (let index in testList) {
  　　console.log(testList[index]);
}
```
###関数の呼び出し
before

```javascript:main.js
let a = "aaa";
function Test() {
  console.log('test')
};
function Test1() {
  console.log('testTest')
};
if (a == "aaa") {
　　Test();
} else {
　　Test1();
}
```
after

```javascript:main.js
let a = "aaa";
function Test() {
  console.log('test')
};
function Test1() {
  console.log('testTest')
};
(a=="aaa" ? Test:Test1)();
```
#終わりに
これらをうまく活用することで重複するような（似たような）コードを書かなくてすみます。
何に対しても整理整頓が大事ということです。
error: failed to run custom build command for openssl v0.9.24

`cargo build --release` をすると `error: failed to run custom build command for openssl v0.9.24` のエラーが出る。

[slack-hook](https://crates.io/crates/slack-hook) というcrateを利用していることが原因だった。
slack-hookが依存している [reqwest](https://crates.io/crates/reqwest) が古く、そのせいで上記エラーが出ていた。
このslack-hookを利用しないようにしたらエラーは出なくなった。

[こちらの記事](https://blog.morifuji-is.ninja/post/2020-02-29/)があったことで原因を突き止めることができた。

もし他の人が同様の事象にひっかかったときのググラビリティを上げるために、qiitaにも書いとく。