OmniAICreator/Qiita-1.07M huggingface dataset:
python3 for文 基本構造からネストまで

###Pythonのfor文

pythonのfor文にどんな特徴があるのか少しまとめた。

####構造

```
for 変数 in イテレータ:
    処理内容
```

python3にはforeach文がないそのためc#やJavaScriptなどとfor文の考え方が若干異なる。

python3のfor文はfor文というより他の言語でいうforeach文に近い。

イテレータの中からオブジェクトを一つ一つ取り出して処理していくような考え方である。

このイテレータの中には様々のものを置くことができる。リストはもちろん条件を満たせばクラス等も置ける。

pythonのstring型はイテレータでもあるので以下のような書き方もできてしまう。

```python
for c in 'aiueo':
    print(c)
```

実行結果は以下のようになる。

```
a
i
u
e
o
```

####range()関数を使ったfor文
繰り返し文でもっとも良く使うのはN回処理を繰り返すという、数字を基準にしてfor文を回していくことだ。

その際pythonではrange()関数を使う。

```python
for i in range(3):
    print(i)
```

実行結果は以下のようになる。

```
0
1
2
```

インデックスは0はじまりなことに注意

####ネストさせたfor文
次にfor文をネストさせてみる

```python
for i in range(3):
  for j in range(2):
    print(i)
    print(j)
```

実行結果は以下のようになる

```
0
0
0
1
1
0
1
1
2
0
2
1
```

実行結果から注目して欲しいのは、
for文を2つネストさせた場合2番目に書いたfor文が全て回りきるまで1番目のループは次のオブジェクトに行かない。

上の例でいえばjが1になったあとiが0から１になりその後はまたjがインクリメントされ0から1になる。

そのループが終わるとまたiがインクリメントされiが1から2になる。


### おまけ:いろいろな言語でのfor文
様々な言語のfor文を集めた。

#### c#のfor文

c#で上記のコード を書こうとするとこうなる

```c#
namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
           
 			for(int i = 0; i <= 2; i++){
				for(int n = 0; n <= 1; n++){
    				System.Console.WriteLine(i);
      				System.Console.WriteLine(n);
   				}
			}
 
        }
    }
}
```

c#ではfor文一回のループでインデックスをインクリメントしていることが分かる
対してpython3ではオブジェクトに対してループが回されている。

####rubyのfor文

rubyはpython3のfor文に考え方は近い

```ruby
for i in 0..2 do
  for n in 0..1 do
    puts i
    puts n
  end
end
```

####JavaScriptのfor文
@shiracamus さんありがとうございます。
2015年度版以降

```javascript
for (let i in [0, 1, 2]) {
  for (let n in [0, 1]) {
    console.log(i)
    console.log(n)
  }
}
```

2015年度版以前

```javascript
for(var i=0; i<=2;i++){
	for(var n=0; n<=1; n++){
    	console.log(i);
      	console.log(n);
    }
}
```

2015年度版以前のJavaScriptはc#の考え方に近くindexを回している。
しかし、2015年度版以降になるとpythonやrubyによってきたような印象を受ける。

###参考
[【Python入門】for文を使った繰り返し文の書き方](https://qiita.com/Morio/items/e8aed85346c0055beea7)
UWSCのCHKIMGXがとんでもない座標を帰してきた


#この問題にぶち当たるまで
##最近なにしてたの
最近ゲームのマクロ作りに筆者がハマっていまして・・・(某国民的人気MMOやスマホ銃ゲー)
それでルンルンとRPA()をやっていたこの頃でした
##何が起こったの
そこで当然状態遷移の把握が必要になりCHKIMGXっていう神みたいな画像認識ライブラリがあって利用させていただいたのですが・・・
<b>x:-1298015017  y:1081345421</b>
みたいなある訳ねえだろ！っていう座標がしばしば現れて非常に困る状況に見舞われました

#対策
確認してみた結果あくまで座標がおかしいだけ、認識自体はうまく行ってることが確認できたのでありえない座標が帰ってきたときだけ再チェックをかける関数を自作することにより回避しました

###コード
```ruby:function.uws
FUNCTION C_CHKIMGX(imgpath, winid, x1, y1, x2, y2, Detect_num, Threshold_delta, Target_color)
  while True
    ismatch = CHKIMGX(imgpath, winid, x1, y1, x2, y2, Detect_num, Threshold_delta, Target_color)
    print "ismatch:" + ismatch
    ifb ismatch = true and (x1 <= g_imgx_x and g_imgx_x <= x2) and (y1 <= g_imgx_y and g_imgx_y <= y2)
      break
    elseif ismatch = false
      break
    else
      PRINT "異常座標検知"
    endif
  Wend
  RESULT = ismatch
Fend
```

##おまけ
CHKIMGXでも全然認識してくれない時があって（画像サイズがとても小さい)かなり難儀していたのですが
ちゃんと色を指定してあげる(Target_color)と認識率がかなり上がり上手くいきました(そのシーンの中で特徴のある色を選択すると良い)
docstringsをMarkdownで書くという試み

そんなことができるツールを作りました。
https://github.com/tkamenoko/inari


# 動機

[PEP287](https://www.python.org/dev/peps/pep-0287/) でdocstringsのreStructured Textによる書き方が標準化されており、多くのPythonプロジェクトではそれに倣ってドキュメントが書かれている。しかし、PypiのReadmeにMarkdownファイルを使えるようになっているし、また[MkDocs](https://www.mkdocs.org/)のような優れたMarkdownツールが現れ様々なプロジェクトで用いられている。だったらdocstringsもMarkdownで書いちゃえばいいじゃん！というのが主なモチベーション。

Sphinxの設定が複雑すぎるというのも動機の一つ。小規模なプロジェクトなら最小限の機能で十分だし、設定ファイルも込み入ったものは使いたくはない。最小限の設定で使えるものを目指した。

# 使い方

## インストール

pipでインストールできる。依存ライブラリなしの単一コマンドとしても使えるけど、MkDocsと一緒に使うことを推奨。

```
pip install inari[mkdocs]
```

## CLIとして使う

対象モジュールをインポートできることが前提。

```
inari <module-name> <out-dir> [-n <out-name>]
```

これで対象モジュールからdocstringsを取得してMarkdownファイルとして出力される。`-n` を指定することでモジュール名を使う代わりに`docs/<out-name>` にファイルを出力できる。

```
.
├── docs
│   └── module-name
│       └── submodules
│           └── ...
│       └── index.md
└── module-name
    ├── __init__.py
    └── submodules
        └── ...
```

`docs/module-name/index.md` には`module-name/__init__.py` のdocstringsに加えてサブモジュールへのリンクが自動生成される。

## MkDocsプラグインとして使う

CLIでモジュールや出力先を指定する代わりに`mkdocs.yml`を編集することでプラグインとして利用できる。

```yaml:mkdocs.yml
docs_dir: "docs" # `out-dir` に設定される

plugins:
    - search # MkDocs default plugin
    - inari:
        module: <module-name> # required
        out-name: api # optional. Default: <module-name>
```

あとは`mkdocs build` か`mkdocs serve` でドキュメントが生成される。

## モジュール内参照

docstringsで`` `module.submodule.ClassName` `` のように記述すると、``[`ClassName `](../submodule#Classname)`` のような相対リンクへと自動変換される。

# まとめ

[sphinx-apidoc](https://www.sphinx-doc.org/ja/master/man/sphinx-apidoc.html)のようなツールをMkDocsに持ち込む、といったツールはこれが唯一というわけでは無いけれど、設定の簡便さを突き詰めたものは無かったと思う。ソースコードの表示のような追加したい機能もあるし、何よりテストが無いのはよろしくないので、今後もアップデートはしていく予定。MkDocsを使っている方はぜひ試してみてください。

ソースはhttps://github.com/tkamenoko/inari にあるので、改善案などがあればissue/PRを送って頂けると助かります。
CI/CDツールに関して簡単にまとめて見た

メモ書き程度に置いておきます・・・（ほぼ色んなサイトからの引用です。）
## そもそもインテグレーションとは
インテグレーションとは、統合、統一、融合などの意味を持つ英単語。
複数の異なる要素を組み合わせて１つにしたり、一体として機能するよう調整すること。

コンピュータやソフトウェア、ネットワークなどを組み合わせて一体化し、目的を達成するための
情報システムを構築することを「システムインテグレーション」（SI：System Integration）
と言い、略してインテグレーションと呼ぶことが多い。

このような業務多事業を行う企業などのことを「システムインテグレータ」
（SIer：System Integrator）、あるいは略してインテグレータと言う。

## CI（継続的インテグレーション）とは
Continuous Integrationの略で、継続的インテグレーションと呼ばれている。

CI（継続的インテグレーション）では、開発者が自分のコード変更を頻繁に
セントラルリポジトリ（masterみたいなイメージ）にマージし、その度に自動化された
ビルドとテストを実行する。

小さなサイクルでインテグレーションを繰り返し行い、インテグレーションのエラーを
素早く修正することによりチームは統合されたソフトウェアをより迅速に開発することができる。

## CD（継続的デリバリー）とは
CDとは、Continuous Deliveryの略で、継続的デリバリーと呼ばれている。

継続的デリバリー（CD）は、継続的インテグレーション（CI）を拡張した手法で、
ビルドやテストでなく、リリースプロセス全体を自動化する。

実施の目的はDevOps（開発者と運用担当者が連携して協力する開発手法）と同様で、
リリーススピードを上げることで、素早く市場からフィードバックを得られ、
ソフトウェアに反映させることができる。

ビジネス戦略を細かく修正しながら進めることで、
リスクの低減とソフトウェアの競争力向上を目的としている。

継続的デリバリー（CD)では、全てのコード変更は、ビルドとテストを実行した後、
テスト環境またはステージング環境にデプロイして、システムテストやUIテストを行う。

開発者は、準備ができた地点で、最後のステップとして運用環境への更新を承認する。
この点は、運用環境へのデプロイが明示的な承認なしで自動的に行われる
「継続的デプロイ」とは異なる。

継続的デリバリー（CD）が行えるようになった背景には、クラウドやコンテナといった技術の
普及や、インフラ環境をコードで管理できるようになった点がある。

そのため、コミットからリリース前で全ての作業が自動で行うことができる。

## CI（継続的インテグレーション）と継続的デリバリー（CD)の違いとは
CIとCDの違いは、カバーするプロセスの範囲の違いになっている。
コードレベルのテストまでを自動化するのがCIで、システムテストやデプロイなど、
実行環境やリリースまで影響するような自動化を行うのがCDになる。

CI（継続的インテグレーション）/継続的デリバリー（CD)を行うことで品質の向上と
開発の効率化を同時に達成し、リリーススピードの向上に繋がる。

今日の変化の早い社会においては、システムやサービスも素早く変化が必要になっている。
そういった背景もあり、現在、CI（継続的インテグレーション）/継続的デリバリー（CD）の
活用が広まっている。

## Jenkinsとは
Jenkinsとは、CI（継続的インテグレーション）やCD（継続的デリバリー）を
実現するためのツール。

Jenkinsは、
「ソフトウェアのリリーススピードの向上」「開発プロセスの自動化」「開発コストの削減」
といった利用目的として、注目されているオープンソースのツール。

## CircleCIとは
一言で言えば、Saas型のCI/CDサービス。Saas型とであるという点が特徴。
CircleCIはクラウド上のコンテナあるいはVMを実行環境として使用する。

コンテナかVMかはユーザーが選択可能だが、コンテナの方が起動が早く、
VMは今度有料になる可能性がある。
CircleCIではコンテナの利用を推奨している。

## JenkinsとCircleCIを比較して（CircleCI視点）
### CircleCIが優れている点
- 環境構築コストが低い
 - Saasだから
 - Web-UIで初期設定を少しやるだけ
 - 冗長化とかも勝手にされている
 - Jenkinsの場合、自前でJenkins用のサーバを立てる必要がある
- 運用コストが低い
 - Saasだから
 - サーバーメンテナンスや故障時の対応をやる必要がない
- ymlファイルで設定できる
 - Jenkinsの場合、Web-UIで細かい設定までできるが、職人芸になりがち

### CircleCIが劣っている点
- バージョン管理でSVNを使っているプロジェクトでは使えない
 - Github/BitBucket連携が前提
- リアルタイムにビルド実行ができない
 - 定期実行はできる
- CircleCIで故障が発生しても自分たちで原因解析や復旧をすることが困難
 - Saasだから
- Saasの利用料には要注意
Unity Cloud Build 環境で iOS のステッカーをバンドルしたアプリ書き出しをする

既存のアプリにiOSのメッセージ用のスタンプ（ステッカー）をバンドルし、
ビルドについても Unity Cloud Build で自動ビルドする方法をまとめておきます。


> iOS App Extension
> ステッカーパックExtension。iOS Appにステッカーパックをバンドルできます。ステッカーパックはApp Store for iMessageに掲載され、その際App Storeで該当するiOS Appに適用されているのと同じカテゴリや説明文が使用されます

https://developer.apple.com/jp/imessage/

## 前提
* Unity Cloud Build でビルドできる iOS のプロジェクトを作成済み

## 手動でやる場合
XCode プロジェクトを書き出した後、 `File -> New -> Target` などして、 sticker app extension を追加し、各種画像の指定、Provisioning profile の指定などしてやればビルドできるようになると思います。

## 自動化したい
### Unityの設定
Targetの追加、画像の指定については以下のプラグインがいい感じにやってくれます。
https://github.com/agens-no/iMessageStickerUnity

プロジェクトにインポートした後、必要な設定を行います。
`Window > Sticker Pack` から設定パネルを表示します。


| 項目       | 説明 |
|:-----------------|:------------------|
| Title            | ステッカー名、メッセージの入力画面にも表示されます |
| Bundle Version   | {アプリのバンドルID + 任意の文字列} |
| Automatic Signing | UCBでビルドする場合はチェックを外します |

Icons, Stickers には任意の画像等を指定します。

### 証明書まわりの準備
ステッカー用のAppIDを用意します。
Apple Developer のサイトの、 Identifiers から、 {アプリのバンドルID + 任意の文字列} のAppIDを作成します。
とくに必要な指定は無い気がする。

AppIDを作成したら Provisioning Profile を作成します。
作成した Profile はダウンロードしておきます。

### UCB自動化のための設定
上で作成した、ステッカー用の Provisioning Profile を指定する必要がありますが、
Unity Cloud Build では一つしか設定する項目がないので、
フォーラムで案内されていた以下の方法で指定をします。

#### ファイルの配置
Assets/UCB/xcode_fastlane.json
Assets/UCB/Fastfile
Assets/UCB/Gymfile
Assets/UCB/Stickers.mobileprovision (上で作った Profile)

``` json:xcode_fastlane.json
{
    "fastfile": "Assets/UCB/Fastfile",
    "gymfile": "Assets/UCB/Gymfile",
    "lanes": {
        "pre_build": "use_stickers_profile",
        "post_build": ""
    }
}
```

``` ruby:Fastfile
lane :use_stickers_profile do |options|
    profile_path = File.join(options[:project_dir], 'Assets/UCB/Stickers.mobileprovision')
    FastlaneCore::ProvisioningProfile.install(profile_path)
    update_project_provisioning(
        xcodeproj: 'Unity-iPhone.xcodeproj',
        target_filter: 'Unity-iPhone-Stickers',
        profile: profile_path
    )
end
```

``` ruby:Gymfile
export_options(
    provisioningProfiles: {
        "com.unity3d.cloudbuild.base.stickers" => "1e33640e-9a55-4357-a632-ca6c48a53a96"
    }
)
```
bundle id(com.unity3d.cloudbuild.base.stickersの部分), UUID(1e33640e...のやつ) をそれぞれプロジェクトのものに書き換えてください。 UUID は Mac のクイックルックなどから mobileprovision ファイルを見ると確認できる。

### Cloud Build の設定
Config > advanced options > Custom Fastlane Configuration Path
の欄に、上で作成したjsonファイルへのパスを指定します。
`Assets/UCB/xcode_fastlane.json`

以上の内容をpushしてビルドをかけると、ビルドが通るようになるかと思います。
ipaをインストールすると、メッセージアプリに、
バンドルしたステッカーが追加されているのを確認できます。

Ad Hoc とストアリリース用に、ステッカーの Provisioning Profile も使い分ける必要があるのかわかりませんが、
Gymfileやmobileprovisionファイル、fastlaneの設定用jsonファイルを2通り用意して、使い分ければ実現できるのかな、と思います。

## 参考
https://forum.unity.com/threads/xcode-9-multiple-provisioning-profiles.545121/
abc 139 c,d,e 

後日参加した
c
ふつうにシミュレーションするだけなのだが書き方が悪く手間取ってしまった。

```c++

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
#include<stdio.h>
#include<string.h>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
#define FOR(i, a, b) for (ll i = (a); i <= (b); i++)
#define REP(i, n) FOR(i, 0, n - 1)
#define NREP(i, n) FOR(i, 1, n)
using ll = long long;
using pii = pair<int, int>;
using piii = pair<pii, pii>;
const ll dx[4] = { 0, -1, 1, 0 };
const ll dy[4] = { -1, 0, 0, 1 };
const int INF = 1e9 + 7;
const ll inf = 1LL << 50;
int gcd(int x, int y) {
	if (x < y)swap(x, y);
	if (y == 0)return x;
	return gcd(y, x%y);
}
void mul(ll a, ll b) {
	a = a * b % INF;
}
///////////////////////////////////////

int main() {
	int N; cin >> N;
	int h[100100];
	for (int i = 0; i < N; ++i)cin >> h[i];
	int ans = 0;
	for (int i = 0; i < N - 1;) {
		int cnt = 0;
		while (h[i] >= h[i + 1]) {
			if (i == N - 1) {
				break;
			}
			cnt++;
			i++;
		}
		ans = max(ans, cnt);
		i++;
	}
	cout << ans << endl;
	return 0;
}
```

このような書き方でも通るがwhile文の中でiがN-1になってしまった時にbreakする処理を書き忘れてしまいバグらせてしまった。し、ほかの人のコードを見てもfor(int i=0;i<N-1;++i)の部分は変えないほうがいいというような印象を受けた以下修正コード

```
int main() {
	int N; cin >> N;
	int h[100100];
	for (int i = 0; i < N; ++i)cin >> h[i];
	int ans = 0;
	int cnt = 0;
	for (int i = 0; i < N - 1;i++) {
		if (h[i] >= h[i + 1]) {
			cnt++;
		}
		else {
			cnt = 0;
		}
		ans = max(ans, cnt);
	}
	cout << ans << endl;
	return 0;
}
```

abc d
N*(N-1)/2なのだが証明ができなかった。

証明:i=1,2,,,Nについてiが順列のxi番目に登場するとするとする。すると目的関数（最大化したいもの)は、(x1 mod 1)+(x2 mod 2)+(x3 mod 3),,,,(xN mod N)になる。各項に着目するとそれぞれの項は最大でも0,1,,,,N-1になるがi>=2についてxi=i-1とし、x1=N実際に(N mod 1)+(1 mod 2)+,,,+((N-1) mod N)=0+1+,,,N-1とできるため目的関数の最大値は0+1+,,,+N-1=N*(N-1)/2となる。

自明だった、、

E

```
//Nチームで総当たり戦を行う。各チーム戦う相手の順番が決まっているものとする
//各チーム1日で１試合しか行えない。異なるチームは同日に並行して試合を行える
//総当たり戦を完了するまでに必要な最小日数は何日か
//試合が行えるものからどんどん行えばよい日数の効率的な数え方を考える
//愚直に全チーム見て試合できそうなところを貪欲に行うとすると間に合わない
//そこで２日目以降は前日に試合の実施状況に変化があった人のみ次の試合が可能か判定する
int N;
deque<int>A[1010];//両端キュー
int step[1010];//step[i]>numだったらその日iチームは試合を行えない
int M;
int main() {
	int i, j, k, l, r, x, y; string s;
	cin >> N;
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N - 1; ++j) {
			cin >> x;
			A[i].push_back(x - 1);
		}
	}
	M = N * (N - 1) / 2;
	queue<int>Q;
	for (int i = 0; i < N; ++i)Q.push(i);
	int num = 0;
	while (Q.size()) {
		//このループ一回ごとに一日で行える試合を処理していく
		int ok = 0;
		queue<int>Q2;
		while (Q.size()) {
			i = Q.front();
			Q.pop();
			if (step[i] <= num && A[i].size() && A[A[i].front()].front() == i && step[A[i].front()] <= num) {
				step[i] = step[A[i].front()] = num + 1;
				Q2.push(i);
				Q2.push(A[i].front());
				A[A[i].front()].pop_front();
				A[i].pop_front();
				M--;
			}
		}
		num++;//日数カウント
		if (M == 0)break;//全試合終了
		swap(Q, Q2);
	}
	if (M)cout << -1 << endl;
	else cout << num << endl;
	return 0;
}
```
他人のコード写経。理屈はわかるけどこれを本番に書ける実装力はまだないな、、
dfsと有向グラフ版、トポロジカルソートでの解き方もあるらしい
CSS : 「line-clamp」 で表示行数を制御する

[こちら](https://coliss.com/articles/build-websites/operation/css/css-line-clamp-property.html)で紹介されていたline-clampプロパティを試してみた。

## 表示サンプル

<p class="codepen" data-height="560" data-theme-id="5973" data-default-tab="result" data-user="KazuyoshiGoto" data-slug-hash="PoYjrrr" style="height: 560px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="line-clamp test">
  <span>See the Pen <a href="https://codepen.io/KazuyoshiGoto/pen/PoYjrrr/">
  line-clamp test</a> by Kazuyoshi Goto (<a href="https://codepen.io/KazuyoshiGoto">@KazuyoshiGoto</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

上記サンプルでは4行まで表示するようにしています。

## HTML

```
<p class="line-clamp">文字列</p>
```
極めて単純で、行数を制限したいタグに `line-clamp` というクラスを指定しています。

## CSS

```
.line-clamp {
  display: -webkit-box;
  -webkit-line-clamp: 4;
  -webkit-box-orient: vertical;
  overflow: hidden; 
}
```

`line-clamp` 関連のプロパティはいずれも正式採用されておらず、ベンダープレフィックスが必要な状態です。
以下プロパティ別に説明します。

```
display: -webkit-box;
(display: box)
```
Flexboxの状態にするプロパティ。
`display:block` と字面も印象も似ていて混乱しそうですが、挙動は別物です。

```
-webkit-line-clamp: 4;
(line-clamp: 4)
```
今回の要。表示する行数を指定できるプロパティ。
将来的にはこのプロパティだけで今回の表現の実装が予定されている…らしい。

```
-webkit-box-orient: vertical;
(box-orient: vertical)
```
Flexbox の要素方向を設定するプロパティ。
line-clamp には現在これが必要。
Androidアプリの時間指定公開のやり方（2019年9月2日時点）

最近、Androidで審査されるようになって時間がかかる話が話題になってました。

　Androidアプリにも審査がされるようになった件
　https://qiita.com/k_masa777/items/54727e14f0861ba594ea

この記事を読んで「ふむふむ、時間指定公開で先に審査しておけば良いのかー」と思ってたのですが、失敗しちゃいました・・・

**Google Play Console のUIがメチャクチャわかりづらい！!**


ということで、眠っていた個人開発アプリで再度トライして手順をまとめてみました。
手順はアップデートの手順になります。（新規アプリではありません）



# 時間指定公開をONにする

Google Play Consoleにログインし、「価格と配布」を選びます。
そして画面下部にある`時間指定公開`のトグルをONにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/86bae002-fca1-59e4-c882-845889d0bd3c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/eaf70075-c0cc-8996-1b1e-d812473111c8.png)

これで`時間指定公開`がONになりました。
その右側にある`アップデートを送信`はグレーのままですが、こいつは気にしなくて良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/8baa45b1-4000-def4-9af8-e38bc15b5540.png)

# アプリのアップデートを送信する

いつものように`アプリのリリース`からアップデート版を登録して、アップデートの文言等を登録していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/74034d0a-dfc1-654f-0f1c-d0de31fa361a.png)

`時間指定公開`がONになっている場合、画面上部に`時間指定公開`の文字と`公開`ボタンが表示されてることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/f6148e87-74fb-726b-4e43-0a3523d60fa7.png)


そして、何ということでしょう！！
`製品版として公開を開始`を押しちゃいます!!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/fb1223dc-9b85-a569-2ecc-4376fdf6dcf5.png)

これはかなり胆力が試されるUIだと思います。
時間指定公開をONにしておくと、更新しても更新は反映されず、先ほどの画面上部に別途`公開`ボタンを押すと本当に公開される仕様です。

# レビューが終わるのを待つ

この状態でダッシュボードに戻ると、現在レビュー中になっていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/ba3ff0f5-ed5c-4e00-ad95-9fa91d2ea436.png)

# 公開する

このまま待つこと数時間・・・レビューが終わりました。
`公開中`と書かれてますが、嘘です。公開されてません。
また、画面上部にある`公開`ボタンが有効に変わってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/d28b7e47-5208-78c3-9d8b-0126d4c4d536.png)

念の為、`GOOGLE PLAYで表示`を押してみて、ストアでの表示状態を確認してみます。
更新日が古いままなので、確かに公開はされていないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/6d859bdf-ec6f-c661-1e79-8c5687997d3c.png)

ということで、画面上部の`公開`ボタンを押してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/5e115bbd-0724-983c-5f99-a75bf97d0c04.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/22d9af9d-035d-ffed-3918-b3c0886d6562.png)

これで公開完了です。
この後すぐにストアを確認すると更新されてました。

**ちなみにこの後、`価格と配布`を見ると`時間指定公開`はOFFに戻ってたので次回リリースの際はご注意ください。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/68c32469-7768-3b4e-1d36-c05d7979eadd.png)




画面はわかりづらいですが、すぐに反映されるのは素晴らしいですね。
Vuetifyのv-dialogのスクロール位置がリセットされない件に対応してみた

利用規約などスクロールが必要なコンテンツをv-dialogに書くと、スクロール位置がリセットされない件に対応してみました(Vuetify v1.5対応)

まずはこちらに対応したv-dialogを用意
https://scrapbox.io/gyarasu/Vuetify%E3%81%AEv-dialog%E5%86%85%E3%81%A7%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E4%BD%8D%E7%BD%AE%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B

dialogコンポーネントが開いた後に実行するメソッドなどに下記の方法でscrollTopを指定すればスクロール位置がリセットされます。

        let i = document.getElementById('scroll-target')
        i.attributes[1].ownerElement.scrollTop = 0
gitでローカルにHEADが存在しない時の対処方法

以下のような手順で、remote addしたローカルディレクトリにHEADが存在しませんでした。

1. サーバ側でベアリポジトリを作成
1. 開発環境のローカルでファイルを作成
1. git init,add,commit
1. git remote add ...
1. git push origin master

```bash
$ git branch -a
* master
  remotes/origin/master
``` 
orign/HEADが存在しない状態になります。
なので、以下の設定を行います。

```bash
$ git remote set-head origin master
``` 

確認

```bash
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
```
本番環境でbundle installが出来ない(スワップ領域)

#原因について
Unicorn導入の際、本番環境にてgit pullをしbundle installをしたらエラーが出る、どうやら原因はbootstrapやfontawesomeを使用した事によるメモリ不足らしい。
なぜローカルで出来て本番で出来ないのか $ topで調べたところ

```
top - 06:07:39 up 19 min,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  79 total,   1 running,  54 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1009496k total,   599180k used,   410316k free,     9768k buffers
Swap:        0k total,        0k used,        0k free,    86808k cached
```

スワップ領域が無い事が判明、どうやらAWSのEC2の小規模インスタンスには標準でスワップ領域が無いみたいです。

#スワップ領域について
スワップ領域の追加、今回の場合は2Gのファイル

```ruby:EC2サーバー
$ sudo dd if=/dev/zero of=/swap bs=1M count=2048
2048+0 レコード入力
2048+0 レコード出力
2147483648 バイト (2.1 GB) コピーされました、 32.0685 秒、 67.0 MB/秒
```

作成したファイルをスワップファイルシステムとして割り当てる。

```ruby:EC2サーバー
$ sudo mkswap /swap
スワップ空間バージョン1を設定します、サイズ = 2097148 KiB
```
$sudo swapon /swapで　600がオススメと出るのでそれを参考にアクセス権限の指定。

```ruby:EC2サーバー
sudo chmod 600 /swap
```
スワップ領域の確認方法

```ruby:EC2サーバー
$ cat /proc/swaps
Filename				Type		Size	Used	Priority
/swap                                   file		2097148	0	-2
```

#まとめ

最初はbootstrapのvarsionのせいなど色々考えてしまいましたが、思ったより単純な事で安心しました、やはりエラーログは隅々まで確認する事が大事であると再認識出来たのでよかったです。

以下、参考にさせて頂いた資料です。
https://katsu-puchi.hatenablog.com/?page=1560406500
https://www.memory-lovers.blog/entry/2018/02/04/170033
Project Euler 002を解いてみる。generator関数を使ってみる。「偶数のフィボナッチ数」

#本題:Project Euler 002
[002](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202)
>フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

->[次の問題](https://qiita.com/radiol/items/7d4f13387b7883deb8ce)

## 考え方
まず、フィボナッチ数列を作ってみます。自然数の数列なのに一般項の公式だと√5とか出てくるらしいですね。
以前に参考書でgeneratorなるものを読んだので、generatorを使ってみようと思いました。

```Python:euler002.py
def fibonacci_generator(max_num: int) -> int:
    """
    max_num未満のフィボナッチ数列を返すgenerator。
    :param max_num: int
    :return: int
    """
    last_result = 1
    result = 1
    while result < max_num:
        yield result
        result, last_result = result + last_result, result
```
generatorが呼ばれるたびに1つ前(result)と2つ前(last_result)を足してresultに代入、同時に1つ前の値(result)を2つ前(last_result)に代入しています。このあたりの変数名にセンスの無さが出ています。
`while result < max_num`のところを`while True`にして無限にフィボナッチ数列を生成するgeneratorにもできますが、なんとなく無限ループが怖かったので有限なループにしました。
あとは内包表記を使ってlistやsetを作り、sum()で合計して完了です。

## コード
```Python:euler002.py
from stop_watch import stop_watch


@stop_watch
def main():
    num_set = set(i for i in fibonacci_generator(400 * 10000) if i % 2 == 0)
    print(sum(num_set))


def fibonacci_generator(max_num: int) -> int:
    """
    max_num未満のフィボナッチ数列を返すgenerator。
    :param max_num: int
    :return: int
    """
    last_result = 1
    result = 1
    while result < max_num:
        yield result
        result, last_result = result + last_result, result


if __name__ == '__main__':
    main()
```
`結果
main処理時間: 4.601478576660156e-05 sec.
処理時間は0.000046秒程度でした。`
iosのシミュレータ立ち上げの際にエラー発生[CFBundleIdentifier", Does Not Exist](ReactNative)

# 環境
`hogehoge.xcodeproj`をメインで使用していると仮定します。

# エラー内容
iosのシミュレータを立ち上げた際に、下記のようなエラーが発生しました。

```
Error: Command failed: /usr/libexec/PlistBuddy -c Print:CFBundleIdentifier build/Build/Products/Debug-iphonesimulator/AwesomeProject.app/Info.plist
Print: Entry, ":CFBundleIdentifier", Does Not Exist
```

当初このエラー内容で調べてStackOverFlow等のサイトを探りました。
[Print: Entry, “:CFBundleIdentifier”, Does Not Exist](https://stackoverflow.com/questions/37461703/print-entry-cfbundleidentifier-does-not-exist)

しかし、解決の糸口は見えず、、、

# `.xcodeproj`ファイルが2つ混在していた
そこで、エラー内容をもう少し遡ってみてみると下記の表示が見つかりました。

```
error: Build input file cannot be found: '/Users/hoge/kikutan-mobile/ios/ReactNativePlatform/Info.plist'
```

冒頭の環境でお伝えしたように、本来であれば`hogehoge.xcodeproj`を参照しなければいけないところが、下記2つのファイルが混在していることでエラーが発生していることが判明しました。

```
ios/hogehoge.xcodeproj
ios/ReactNativePlatform.xcodeproj
```

# 解決策
不要な`.xcodeproj`を削除し（この場合`ReactNativePlatform.xcodeproj`)、シミュレータを再始動させると、うまくいきました。
JpaRepositoryのgetOneのEntityNotFoundExceptionにハマった話

この間、springboot1.5.xから2.1に上げたんですが、その際にJPAもアップデートされたもんで、

```java
hogeRepository.findById(id);
```

ってやってたやつがコンパイルエラーになったんですね。

で、以下に書いたようにgetOneに書き換えたんです。
[Springboot1.5.x to 2.1.5 Upgrade【コンパイルエラー解消まで】](https://note.mu/on_bass/n/nccd24832c7aa#VVaDP)

値がなかった場合は返ってきた値をnullチェックしてたんですが、getOneに変えたことにより、エンティティの値をgetするタイミングでEntityNotFoundExeptionが発生してtry～catchも効かねぇ。。どうしよう。。みたいになってました。
どうやら、getOneは遅延ロードするみたいで、実際にアクセスするときにデータをロードするようです。
なので、今回の用途みたいに、テーブルに値がない場合はどうこうする、みたいなときにはgetOneは向かないみたいです。
orElseでnull返すようにすれば今まで通りになりますね。

```java
Hoge hoge = hoge.Repository.findById(id).orElse(null);
if (hoge == null) {
    
}
```

どんなふうに使い分けるかは以下のページで詳しく書いてくれてました。
[Difference between getOne and findById in Spring Data JPA?](https://www.javacodemonk.com/difference-between-getone-and-findbyid-in-spring-data-jpa-3a96c3ff)

闇雲に置き換えちゃいかんって話でした。
DokerでDjangoプロジェクトを作って、Dockerで動かす。

知り合いが`python`を触りたいと言う事で、
`Django`のフレームワークのプロジェクトを作成してみた。

作成手順は[Djangoのドキュメント](https://docs.djangoproject.com/ja/2.2/)を参考にしたよ。

# できたやつ

https://github.com/tubutubumustard/django_docker.git

# プロジェクトの作成

プロジェクトを作成するための、
`Dockerfile`と`docker-compose.yml`を作成する

```:directory
~/
  docker-compose.yml
  Dockerfile
```

```:Dockerfile
FROM python:3.7.4

WORKDIR /django

RUN pip install --upgrade pip
RUN pip install Django==2.2.4
```

```:docker-compose.yml
version: '3'
services:
  django:
    build: ./
    volumes:
      - .:/django
```

`image`をビルドする

```:sh
$ docker-compose build
```

`Django`のプロジェクトを作成する

```:sh
$ docker-compose run django django-admin startproject mysite
```

プロジェクトの作成完了

```:directory
~/
  mysite/
      mysite/
          __init__.py
          settings.py
          urls.py
          wsgi.py
      manage.py
  docker-compose.yml
  Dockerfile
```

# Dokcerでプロジェクトを動かす

`docker-compose.yml`にコンテナのポートと開発用サーバーを起動するコマンドを追加する

```:docker-compose.yml
version: '3'
services:
  django:
    build: ./
    volumes:
      - .:/django
    ports:
      - "50030:8000"
    command: python /django/mysite/manage.py runserver 0:8000
```

`docker-compose`でコンテナを起動

```:sh
$ docker-compose up -d
```

アクセスする

```:URL
http://localhost:50030/
```

![スクリーンショット 2019-10-13 16.12.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272551/0a135d6c-f8b0-2ac9-555e-0c654f6ead2e.png)

# 終わり

`python /django/mysite/manage.py runserver 0:8000`で、
`0:8000`でIPを`0.0.0.0`で指定しないと、アクセスができないのは、
少しハマった。
WHOISの代わりとなるRDAPを使ってみた

### RDAPとは
- [Registration Data Access Protocol (RDAP)](https://www.icann.org/rdap) ... ICANNより
- WHOISの代替となる後継プロトコル
- 応答形式の標準化を目指している
 - jSONでレスポンスが返ってくることが特徴的

#### 値を取得してみる
HTTP/HTTPS経由で値を取得できることが特徴（RESTful API)

IPv6にも対応しているため

APNICが提供している[RDAP](https://www.apnic.net/about-apnic/whois_search/about/rdap/)を参考にアクセスするとレスポンスを得ることができる。

http://rdap.apnic.net/ip/2001:dc0:2001:11::194
https://rdap.apnic.net/ip/2001:dc0:2001:11::194

わかりやすいフォーマットを用意しているのでドメインであれば

http://rdap.apnic.net/domain/<hogehoge.com>

このように値をいれるとwhoisのように必要な値を取得することができる。

ex) https://rdap.verisign.com/com/v1/domain/google.com

#### curl+jq
jsonで値を得ることができるので [jq](https://stedolan.github.io/jq/) を使うと読みやすい。
特定の値を下記のように取得することも可能。

```
% curl -L https://rdap.verisign.com/com/v1/domain/google.com | jq .ldhName
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2343  100  2343    0     0   3555      0 --:--:-- --:--:-- --:--:--  3555
"GOOGLE.COM"
```

整形しやすい情報を扱えるようになったので今後の活用の期待が高まります。

### 国内のRDAP
[JPRS RDAP ご利用ガイド \| gTLD等ドメイン名登録情報の公開 | gTLD取次サービス | JPRS](https://jprs.jp/registrar/info/rdap/rdap-guide.html)

JPRSより

https://rdap.gtld.jprs.jp/rdap/

こちらが用意されている。

WHOISとの違い表示項目の違いの一覧（RDAP表示項目名）もあるので参考になる。


PSI-JAPANも提供を開始。

[RDAPサービス開始のお知らせ](https://psi.jp/blog/rdap_20190826)

> PSI-Japanは、2019年8月26日よりドメイン情報検索サービスRDAPの提供を開始しました。

ex) https://rdap.psi.jp/domain/google.com

#### RDAPを活用した例
[apnic/rdap-ingressd](https://hub.docker.com/r/apnic/rdap-ingressd)
dockerでRDAPサービスのプロキシをを体験することができる。
https://github.com/APNIC-net/rdap-ingressd


#### RFC
[RDAP Operational Profile for gTLD Registries and Registrars - ICANN](https://www.icann.org/resources/pages/rdap-operational-profile-2016-07-26-en)

こちらを参考に。

- RFC7480 - HTTP Usage in the Registration Data Access Protocol (RDAP)
- RFC7481 - Security Services for the Registration Data Access Protocol (RDAP)
- RFC7482 - Registration Data Access Protocol (RDAP) Query Format
- RFC7483 - JSON Responses for the Registration Data Access Protocol (RDAP)
- RFC7484 - Finding the Authoritative Registration Data (RDAP) Service

### 参考リンク
- [JPNIC Blog :: RDAP ～次世代WHOISプロトコル～ の紹介](https://blog.nic.ad.jp/blog/rdap-intro/)
- [GTLD動向～GDPR対応はRDAPで～](https://dnsops.jp/event/20180627/GDPR%EF%BC%A0RDAP.pdf)
kubernetesのserviceのnodePortタイプでバインドされるポートを固定にする

```yml
kind: Service
apiVersion: v1
metadata:
  name: service-hoge
spec:
  selector:
    app: service-hoge
  type: NodePort
  ports:
  - protocol: TCP
    port: 5000
    targetPort: 5000
    nodePort: 30500 # nodePortを指定する
    name: hoge
```
minikubeでIPを固定にする(変更する)

## 環境

* minikube: v1.3.1
* kubernetes: 1.15
* macOS: 10.14.4

## コマンド

```
minikube start --apiserver-ips=192.168.99.100
minikube ssh sudo ifconfig eth1 192.168.99.100
minikube update-context
```

`--apiserver-ips=192.168.99.100` を付与しないと、kubectl時に、

```
Unable to connect to the server: x509: certificate is valid for 192.168.99.108, 10.96.0.1, 10.0.0.1, not 192.168.99.100
```

のようなエラーで怒られます。

## 問題

固定IPにできるのはよいのですが、この方法をとるとapiserverが落ちやすくなるみたいです。

## 参照

* [Add new IP to server certificate · Issue #1974 · kubernetes/minikube](https://github.com/kubernetes/minikube/issues/1974)
* [DHCPで毎度切り替わるminikubeのIPアドレスを固定する - Qiita](https://qiita.com/yuta_vamdemic/items/f3b91cb8ed48cc5922bb)
Roomを使用した際に詰まったこと

#はじめに

業務でRoomを使用する機会がありましたが、少し詰まってしまい時間をロスってしまったので、備忘録として残しておきます。

ちなみにRoomの学習は次のサイトでハンズオン形式で行いました。
https://codelabs.developers.google.com/codelabs/android-room-with-a-view-kotlin/#0

- RecyclerViewとAdapter
- SQLite
- Coroutines
- MVPやMVCのなどのソフトウエアアーキテクチャ
- LiveDataやViewModelなどのJetpack

上記の知識が前提として簡単なアプリを作成するので、様々な復習も兼ねて良い経験となりました。

#詰まったこと

##Databaseのversion更新

「Databaseのクラスを変更したときは、バージョンを上げる」
ということは基本ですが、実際に業務で扱ったときに以下のエラーに出くわしました。

```
java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number.
```
ログに「バージョン上げてね」って書いてあるのに、当時の心理状況的には「このコードで通らないはずはない！」と思っていたので、エラーが出て焦ってました(^_^;)
以下のコードの `version = 1` を `version = 2` にするだけの簡単なオシゴトでした。。。

```kotlin

@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}
```

##DB Browser for SQLiteの使い方
端末内のDBを見る方法で少し戸惑ったので、まとめます。

###1. 次のサイトからDB Browser for SQLiteをダウンロードする。

https://sqlitebrowser.org/dl/

###2. 端末内のDB情報のあるファイルをローカルマシンに保存する。

Android Studioの(通常)右下にあるDevice File Explorerから
data > data > "package_name" > databases 内の

```
database_name
database_name-shm
database_name-wal
```
を選択して右クリックした「Save As...」で任意のディレクトリに保存します。
以前の私はdatabase_nameだけをローカルマシンに保存していたので、うまくいきませんでした。
上記の3ファイルが同一ディレクトリに存在すればいいようです。

###3. DB Browser for SQLiteで確認する。

ダウンロードしてインストールしたDB Browser for SQLiteを起動させ、`Open Database` をタップし、先ほど保存したdatabase_nameを開きます。
`Browse Data` タブの `Table:` からテーブルを選択して想定のレコードが確認できればOK。

#おわりに
また詰まったことがあったら、追加していきたいと思います。

#参考
[Room Persistence Library](https://developer.android.com/topic/libraries/architecture/room)
TypeScript: KoaでPOSTされたフォームの内容を取得する

本稿では、POSTで送信されたフォームの内容を、Koaのハンドラーで取得する方法を紹介する。

## Koa単体ではPOST Bodyは解釈できない

Koa単体では、POSTされたBodyを解釈することができない。

Bodyをパースしてオブジェクトにするには、koaとは別途[koa-body](https://github.com/dlau/koa-body)をインストールする必要がある。

```
yarn add koa-body
```

ちなみに、koa-bodyパッケージにはTypeScriptの型情報が同梱されているので、`@types`から型情報を入れる必要がない。というか、そもそも`@types/koa-body`というパッケージはない。

## koa-bodyの使い方

1) `koa-body`から`koaBody`をimportする。

```ts
import koaBody from "koa-body"
```

2) POSTデータを処理するハンドラーより先に、`koaBody()`をミドルウェアとして差し込む。

```ts
import Koa from "koa"
import koaBody from "koa-body"

const app = new Koa()

app.use(koaBody())
app.use(ctx => {
    ctx.body = JSON.stringify(ctx.request.body)
})

app.listen(4000)
```

実行例

```http:POSTリクエスト
POST / HTTP/1.1
Content-Length: 11
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Host: localhost:4000

foo=1&bar=2
```

```http:レスポンス
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 21
Content-Type: text/plain; charset=utf-8
Date: Mon, 02 Sep 2019 07:15:59 GMT

{
    "bar": "2",
    "foo": "1"
}
```

## koa-routerと組み合わせて使う

上記のコードでは、すべてのURLに対してPOST Bodyのパースが走ってしまう。特定のURLパスだけパースするには、koa-bodyだけではできないので、koa-routerなどのルーティングライブラリと組み合わせる必要がある。

```ts
import Koa from "koa"
import koaBody from "koa-body"
import Router from "koa-router"

const app = new Koa()

const router = new Router()
router.post('/', koaBody(), async ctx => {
    ctx.body = JSON.stringify(ctx.request.body)
})
app.use(router.routes())

app.listen(4000, () => process.stdout.write('Web server started at port 4000\n'))
```

koa-routerの場合、`router.post(url, middleware, middleware)`といった具合に、ミドルウェアを複数指定できるAPIになっている。したがって、`koaBody()`を1つ目の引数に、POSTデータを扱うミドルウェア(=ハンドラ)を2つ目の引数にすることで、次の流れが特定のURLだけで発生するようになる。

1. まず、Bodyのパースがされ、`ctx.request.body`に値がセットされる。
2. 次に、`ctx.request.body`の値を使って何らかの処理をする。
AtCoder Programming Guide for beginners (APG4b) EX24をJavaで書いてみた。

#はじめに

この記事は、AtCoder内コンテンツの


[AtCoder Programming Guide for beginners (APG4b)](https://atcoder.jp/contests/apg4b)

で掲載されている課題[EX24 - 時計の実装](https://atcoder.jp/contests/apg4b/tasks/APG4b_by)をJavaで記述してみたので、備忘録としてコードを公開するものです。まだJava Silverを取った程度のレベルで恐縮ですが、ご一読いただけたら幸いです。

尚、初投稿です。読みづらい点、間違い、感想等ありましたらコメントにてお伝えいただけると嬉しいです。

(AtCoderに提出する際は、Main.javaとして2つのクラスを纏めて提出してACでした。)

#Javaコード
```EX24.java
import java.util.Scanner;

public class EX24 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int hour = Integer.parseInt(sc.next());
		int minute = Integer.parseInt(sc.next());
		int second = Integer.parseInt(sc.next());
		int diff_second = Integer.parseInt(sc.next());
		sc.close();
		Clock clock = new Clock(hour,minute,second);
		System.out.println(clock.printString(hour, minute, second));
		System.out.println(clock.TimeDiff(clock, diff_second));
	}
}
```
```Clock.java
public class Clock {

	//変数：時・分・秒
	private int hour;
	private int minute;
	private int second;

	//コンストラクタ
	public Clock(int hour,int minute,int second) {
		this.hour = hour;
		this.minute = minute;
		this.second = second;
	}

	//時刻演算をするメソッド。printStringメソッドを利用して出力も併せて行う。
	public String TimeDiff(Clock clock, int diff) {
		int diff_hour = clock.hour + diff/3600;
		int diff_minute = clock.minute + (diff%3600)/60;
		int diff_second = clock.second + (diff%3600)%60;
		//範囲処理_second
		if(diff_second < 0) {
			diff_second += 60;
			diff_minute--;
		}else if(diff_second >= 60) {
			diff_second -= 60;
			diff_minute++;
		}
		//範囲処理_minute
		if(diff_minute < 0) {
			diff_minute += 60;
			diff_hour--;
		}else if(diff_minute >= 60) {
			diff_minute -= 60;
			diff_hour++;
		}
		//範囲処理_hour
		if(diff_hour < 0) {
			diff_hour += 24;
		}else if(diff_hour >= 24) {
			diff_hour -= 24;
		}
		return clock.printString(diff_hour, diff_minute, diff_second);
	}

	//時刻表示で出力するメソッド
	public String printString(int hour,int minute,int second) {
		StringBuilder sb = new StringBuilder();
		if(hour < 10) {
			sb.append("0" + hour);
		}else {
			sb.append(hour);
		}
		sb.append(":");
		if(minute < 10) {
			sb.append("0" + minute);
		}else {
			sb.append(minute);
		}
		sb.append(":");
		if(second < 10) {
			sb.append("0" + second);
		}else {
			sb.append(second);
		}
		return sb.toString();
	}
}
```
2軸ロボットアームの順運動学を座標変換できちんと変換する

#初めに
![path4828.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162025/a4c2e5ab-24ea-aae4-3688-28c127d06242.png)
このような2軸のロボットアームを考える時に[以前順運動学をpythonで実装したとき](https://qiita.com/ssaattwworg/items/1dcac3241007e8200225)ロボットアームの先端の座標を

```math
\begin{bmatrix}
x\\y
\end{bmatrix}
=
\begin{bmatrix}
L_1 \times cos(\theta_1) + L_2 \times cos(\theta_2) \\
L_1 \times sin(\theta_1) + L_2 \times sin(\theta_2)
\end{bmatrix}

\\このときL_1,L_2はアームの長さを表す．\theta_1,\theta_2はアームの角度を表す．
```
と表していましたが，実際にロボットアームの運動学を解くときには，座標変換を行って求めるものだと思いました．ということで今回は自分で導出してみたいと思います．

#事前知識

```math
回転移動\\
\begin{bmatrix}
x'\\y'\\1
\end{bmatrix}
=
\begin{bmatrix} 
cos(\theta) & -sin(\theta) & 0 \\
sin(\theta) & cos(\theta) & 0 \\
0 & 0 & 1
\end{bmatrix}
\bullet
\begin{bmatrix}
x\\y\\1
\end{bmatrix}
\\平行移動\\
\begin{bmatrix}
x'\\y'\\1
\end{bmatrix}
=
\begin{bmatrix}
1 & 0 & x_1 \\
0 & 1 & y_1 \\
0 & 0 & 1
\end{bmatrix}
\bullet
\begin{bmatrix}
x'\\y'\\1
\end{bmatrix}
\\x_1,x_2はそれぞれの軸の方向への移動量.
\\x',y'が移動後の座標，x,yが移動前の座標.
```
行列は掛け算の順序によって結果が変化するのでかける順番が重要です．
平行移動させてから回転移動させたい場合は，
移動後の行列 = 回転行列＊平行行列＊移動前の行列
の順序で行う必要が有ります．
掛け算の順序が逆になる理由は，合成写像の分野を勉強すれば理由が分かると思います．(私は線形代数を学んだことがないので断定はできませんが)
#実装
[この方](http://green.my.coocan.jp/old/robo/kinematics/transmat.pdf)が2次元の座標変換をしてくださっていたので答え合わせの意味で確認しました．

アームの長さは平行移動を用いて表しました．以下の図のようにx軸方向にL1,L2だけx軸方向に平行移動させていることが分かります．
![text4909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162025/b315454f-2135-aaac-3864-a093bbaab297.png)
以上からアームの先端の座標x',y'は

```math
\begin{bmatrix}
x'\\y'\\1
\end{bmatrix}
=
\begin{bmatrix} 
cos(\theta_1) & -sin(\theta_1) & 0 \\
sin(\theta_1) & cos(\theta_1) & 0 \\
0 & 0 & 1
\end{bmatrix}
\bullet
\begin{bmatrix}
1 & 0 & L_1 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{bmatrix}
\bullet
\begin{bmatrix} 
cos(\theta_2) & -sin(\theta_2) & 0 \\
sin(\theta_2) & cos(\theta_2) & 0 \\
0 & 0 & 1
\end{bmatrix}
\bullet
\begin{bmatrix}
1 & 0 & L_2 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{bmatrix}
\bullet
\begin{bmatrix}
0\\0\\1
\end{bmatrix}
\\移動前の座標は即ち原点なので最後の項の移動前の座標x=0,y=0
```
これを頑張って計算すると

```math
\begin{bmatrix}
x'\\y'\\1
\end{bmatrix}
=
\begin{bmatrix}
L_1cos\theta_1+L_2(cos\theta_1cos\theta_2-sin\theta_1sin\theta_2)\\
L_1sin\theta_1+L_2(cos\theta_1sin\theta_2+sin\theta_1cos\theta_2) 
\\1
\end{bmatrix}
```
となります．
以前の実装と計算結果は同じになります．
#最後に
[実際に実装したもの](https://colab.research.google.com/drive/1FgtTnx9vqv4hlWAQq1Ng-9968BizwoQv)をcolabに上げておきました．
#参考
http://green.my.coocan.jp/old/robo/kinematics/transmat.pdf
WSL (Ubuntu 18. 04) にDockerを入れる

## tl;dr
- Windows Subsystem for Linux (以後 WSL) にDockerを入れようとしたらめちゃめちゃ詰まった
- 本来WSL上でDockerを使用するなら `Ubuntu 16.04` を使用するべきらしい
- WSLが最新のDockerには対応していない模様。
- インストールが完了しても `Is the docker daemon running?` と永遠に怒られた

### 環境
- Windows 10 Pro
- Windows Subsystem for Linux (Ubuntu 18.04)

### インストール手順
まずはパッケージ関連を更新しておく

```sh
$ sudo apt-get update
```

HTTPS経由でrepositoryをやりとり出来るようにするためのパッケージをインストール  

```sh
$ sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
```

Dockerの公式GPG keyを追加する

```sh
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
    | sudo apt-key add -
```

repository( stable ) を追加する

```sh
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   bionic \
   stable"
```

再度 apt パッケージのアップデート

```sh
$ sudo apt-get update
```

docker-ce(17.09.0)のdebファイルをダウンロードします


```sh
$ wget https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_17.09.0~ce-0~ubuntu_amd64.deb
```


Dockerのインストール

```sh
$ sudo dpkg -i docker-ce_17.09.0~ce-0~ubuntu_amd64.deb
```


Userの設定。ログインユーザをdocker group に所属させることにより、dockerコマンドを sudo 無しで実行を出来るように

```sh
$ sudo cgroupfs-mount
$ sudo usermod -aG docker $USER
```

### Dockerを立ち上げる
<font color=red>**ターミナルソフトを管理者権限で動作させないと正常に動きません**</font>
↑で大いに時間を消費しました。

> 当方は管理者権限で動作させていなかった為、 `start` しても下記出力に悩まされました。
`Cannot connect to the Docker daemon. Is the docker daemon running on this host?`

systemctl は WSLでは動作しないため、serviceコマンドで開始します。

```sh
$ sudo service docker start
```

正常に開始されたことを確認します

```sh
$ sudo service docker status
* Docker is running
```


`hello-world` コンテナを建ててみる

```sh
$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.
.
.
.
For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

正常に動きました。

#### おまけ
DockerのProxy周りの環境変数は下記フォルダに書くとよい

```sh:/etc/default/docker
export http_proxy='http://your.proxy.com:yourPort'
export https_proxy='${http_proxy}'
```

#### まとめ
- WSLはDockerの最新版に対応してないのでバージョン指定して導入する
- 管理者でターミナルソフトを立ち上げないと正常に動かない

##### 参考
https://qiita.com/sugimount/items/b6277ca4a97b4a05ac11
【RDS for Oracle】Active Data Guard


# 2019/03/11からRDSでActive Data Guardが使えるみたい
>Active Data Guard を使用したリードレプリカのサポートが開始されます。Amazon RDS for Oracle では、Active Data Guard の設定を完全に管理し、プライマリ DB インスタンスとそのレプリカ間の安全なネットワーク接続を維持することによって、プライマリ DB インスタンスと同じ AWS リージョンにレプリカを簡単に作成できます。

- RDS for Oracleでリードレプリカ機能が使える。
- 条件
    - ライセンスはEnterprise Edition
    - BYOLを使用
    - Active Data Guard Option のライセンスを持っている


[Amazon RDS for Oracle が読み取りのスケーラビリティと読み取りの可用性のための Active Data Guard を使用したリージョン内リードレプリカのサポートを追加](https://aws.amazon.com/jp/about-aws/whats-new/2019/03/Amazon-RDS-for-Oracle-Now-Supports-In-region-Read-Replicas-with-Active-Data-Guard-for-Read-Scalability-and-Availability/)
NSClassFromStringで、ハマった時の解決法

## はじめに
NSClassFromStringは、クラスの名前からClassを生成できる便利なメソッドですがswiftで使用するときにNSという前時代のprefixがついているように癖があります。そこの話をちゃちゃっとまとめてみました。

## swiftでのクラスの取得方法の注意点
NSClassFromStringで取得できるクラスはswiftでは、モジュールの名前空間に影響されてしまい、モジュール名（Project Name)+ "." + ClassNameというストリングを渡さなければいけません。またモジュール名を渡さない場合は、定義しているクラスの頭に

```
@objc(ClassName)
class ClassName : NSObject {
...
}
```

として、@objc(ClassName)をつけてやるとNSClassFromStringからクラス名だけで取得できるようにはなっています。

## 要注意モジュール名
自分がハマったのですが、module + "." + ClassNameとしてもどうしてもNSClassFromStringがnilを返してくる場合がありました。classに@objcをつけるとClassNameだけできちんと値が返ってきたので、渡していClassNameが間違っているというわけではないようで、色々調べたところプロジェクト名に"-"がついている場合、その"-"の文字を"_"に置き換えて、moduleネームに渡さないとはいけないようです,つまり、
> my-project-name

の場合

> my_project_name

になります。
## まとめ
NSClassFromStringを使う場面もそんなにないかもですが、気をつけて使用しましょう。
シンプルにスプレッドシート（CSV）のデータをテーブルに入れる

## 3行で

- テーブルはあらかじめ作っておく
- テーブルに入れたい内容を書いたcsvデータを作る
- seeds.rbに読み込む記述を書く

## テーブルを作る

今回の場合 `band` というテーブルを作ります。
名前と担当楽器が記されたものです。
テーブルの作り方は割愛します。


|id|name|instrument|
|---|---|---|
||||

## csvデータを作る

テーブルに入れたいデータをExcelやGoogleスプレッドシートに書いて、**csv形式で**保存します。
具体的にはこういうもの

<img width="355" alt="aa0d2818c3a6936c9103d55202e49db8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/92a14cf5-dc26-e5ee-bf5e-e61ff0919913.png">

上記には**ID**の列がありますが、別に作らなくてもいいです。
作ったcsvファイルを `アプリケーション名/db` のディレクトリに収納します（ディレクトリの場所は任意です。 `アプリケーション名/db/csv` とかディレクトリを作って収納してもいいです）。

## seeds.rbを編集する

```ruby:seeds.rb
require "csv"

CSV.foreach('db/band.csv', headers: true) do |row|
  Band.create(
    name: row[1],
    instrument: row[2]
  )
end
```

解説

- 上で収納したディレクトリとcsvファイル名を指定します。
- `headers: true` という記述を書くとcsvファイルの１行目を無視してくれます（nameとか書いてあるところ）。
- `テーブル名.create` 
- `テーブルのカラム名: row[csvファイルの左より0から数えた列数を指定（今回の場合[0]だとIDの列になってしまう）]`

## 仕上げ

`rake db:seed` を実行させて反映
grepの個人的に良い感じな使い方

# grepって単体でいいんじゃん？

以前の記事では、xargsを使った文字列検索のコマンドは、

```
$ find ./ -type f | xargs grep 検索したい文字列
```

こちらを載せていましたし、以降私はこれを使っていたわけですが、こんなワンライナーにしなくてもお目当ての記述箇所のファイルを手に入れたければ、grep単体で事足りるわけです。

## 単体で使ったのがこちら

```
$ grep "検索したい文字列" * -risn
```

*を使って全てのファイルを指定して検索します。

rは再帰、iは大文字小文字の区別無しで検索、sは読めないファイルや存在しないファイルは無視でき、nは検索に引っかかった文字列の行番号を表示させます。このオプションコンボで大体欲しい情報が手に入ります。

調べるワードがファイル名の場合は、findを使用して、ファイルの中身はgrep単体で調べるという形で使い分けられそうです。
VB でフォルダ作成（ない場合は作る）


ruby の ```FileUtils.mkdir_p```, Linux の ```mkdir -p``` のVB版


```
Friend Module FileUtils
    Private Sub MkdirP(ByVal destDirPath As String)
        If Directory.Exists(destDirPath) Then Return
        Dim dirname = Path.GetDirectoryName(destDirPath)
        If Not Directory.Exists(dirname) Then MkdirP(dirname)
        Directory.CreateDirectory(destDirPath)
    End Sub
End Module
```

元ネタは、どこかの古い掲示板だったような気がする
学習 メモ

##Bootstrap読み込み

・CDNを使う場合（headとbodyの記述）

```html:html
<head>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
```

・CDNを使わない場合、Bootstrapをダウンロードして解凍したらhtmlファイルと同じ階層へ(headとbodyの記述）

```html:html
<head>
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
</head>
<body>
    <script src="bootstrap/js/bootstrap.min.js"></script>
</body>
```




##jQueryの読み込み

```html:html
<body>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
</body>
```




##viewportの設定

スマホに対応させるための設定

```html:html
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
```




##htmlのフォーマット例

```html:html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>HTMLフォーマット</title>
<!--以下三行記述-->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <link rel="stylesheet" href="例.css">
  </head>
  <body>
    <div>コンテンツなど記入</div>
<!--以下三行記述-->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script src="例.js"></script>
  </body>
</html>
```
IEでのRESTのレスポンス改ざん方法

## 困ったこと

サイトのIE対応をしなければならない。
で、サーバレスポンスを改ざんしてテストをしたいが、以下のような`await`後の部分にブレークポイントが貼れない。(IEはそもそもasync/awaitサポートしていないので、以下はBabelとかの前のソースマップを参照していることになる)

```javascript
const tmp = await asyncGet();
hozon(tmp); // <- ここでブレークポイント貼ってtmp改ざんしたいが貼れない
```

## Fiddlerを使ってパケットキャプチャして改ざんする

1. [Fiddler](https://www.telerik.com/fiddler)をダウンロードする。
    メルアドと用途聞かれるので、止む無く応えてダウンロード・インストールする。
1. [Fiddlerでレスポンスを止める方法](https://jemsec.blog.so-net.ne.jp/2013-07-02)を見てレスポンスを止めて改ざんしてやったぜ。

## 感想

多分パケットキャプチャとか常識なんだと思うけど、いつもChrome先輩におんぶにだっこの自分は困ってしまった。
他にも実は困ってるけど先輩とか後輩とか怖くて聞けない人のために書いた。
Project Euler 001を解いてみる。「3と5の倍数」

# きっかけ
[こちら](https://qiita.com/projecteuler/items/dcd467bc0e649f52e762)の記事をきっかけにProject Eulerを知り、面白そうなのでPythonの練習としてやってみようと思い立ちました。

->[次の問題](https://qiita.com/radiol/items/3ca9add958f8833ab4ed)

# 実行環境(2019/09/02)
- Mac Book Pro(2016)
- Python 3.7
- Numpy 1.17.1

# 速度計測
[Pythonで処理の時間を計測する冴えた方法](https://qiita.com/hisatoshi/items/7354c76a4412dffc4fd7)より処理時間を計測するstop_watch.pyを使用して速度計測を行っています。

```Python:stop_watch.py
from functools import wraps
import time


def stop_watch(func):
    @wraps(func)
    def wrapper(*args, **kargs):
        start = time.time()
        result = func(*args, **kargs)
        elapsed_time = time.time() - start
        print(f'{func.__name__} 処理時間: {elapsed_time} sec.')
        return result

    return wrapper
```
使うときは、stop_watch.pyを同じフォルダに入れた状態でimportし、計測したい関数の前に`@stop_watch`をつけます。

```Python
from stop_watch import stop_watch


@stop_watch
def main():
    pass

if __name__ == '__main__':
    main()
```
結果
`main処理時間: 1.2615349292755127 sec.
`

#本題:Project Euler 001
[001](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%201)
>10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
>同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.

## 考え方
単純に3 or 5の倍数のリストを内包表記で作ってsum()で合計すればいいかなと考えました。

```Python:euler001.py
@stop_watch
def main():
    n= 1000
    num_list = [i for i in range(1, n) if i % 3 == 0 or i % 5 == 0]
    print(sum(num_list))
```
これでも答えは出ますが、n = 10000 * 10000などの大きな数字になってくると時間がかかってしまいます。[【初心者】pythonで０から Project Euler を解いてみた](https://qiita.com/projecteuler/items/9f63c749123e928a48a7)を拝見したところ、
`[3の倍数の集合の和] + [5の倍数の集合の和] - [15の倍数の集合の和] = 答え`
で計算しており、なるほどと思いました。
せっかくなのでn = 10000 * 10000で速度を比較してみました。

## コード
```Python:euler001.py
import numpy as np
from stop_watch import stop_watch


@stop_watch
def main():
    n = 10000 * 10000
    num_list = [i for i in range(1, n) if i % 3 == 0 or i % 5 == 0]
    print(sum(num_list))


@stop_watch
def np_main():
    n = 10000 * 10000
    print(np.sum(np.arange(3, n, 3)) + np.sum(np.arange(5, n, 5)) - np.sum(np.arange(15, n, 15)))

if __name__ == '__main__':
    main()
    np_main()
```
結果
`2333333316666668
main処理時間: 15.443045139312744 sec.
2333333316666668
np_main処理時間: 0.2614269256591797 sec.`
numpyを使用したこともあり、60倍ほど高速化できました。
AWS 認定 - 試験対策 「ソリューションアーキテクト - アソシエイト」（5

# セッション 5：運用上の優秀性(オペレーショナルエクセレンス)を備えたアーキテクチャを定義する + クロージング
[AWS Innovate オンラインカンファレンス](https://aws.amazon.com/jp/blogs/news/aws-innovate-japan-201904-registration/)
* AWS 認定 - 試験対策 「ソリューションアーキテクト - アソシエイト」
* [セッション１：回復性の高いアーキテクチャを設計する](https://qiita.com/yodyman/items/73a0f91b79675f5e80ff)
* [セッション 2：パフォーマンスに優れたアーキテクチャを定義する](https://qiita.com/yodyman/items/8071258b1fe972477674)
* [セッション 3：セキュアなアプリケーションおよびアーキテクチャを規定する](https://qiita.com/yodyman/items/3398f00a57de87347ae8)
* [セッション 4：コスト最適化アーキテクチャを設計する](https://qiita.com/yodyman/items/298ae52c4f84624ef774)
* [セッション 5：運用上の優秀性(オペレーショナルエクセレンス)を備えたアーキテクチャを定義する + クロージング](https://qiita.com/yodyman/items/53dd34d1e4ca99aeed34)

## 運用上の優秀性を実現するソリューションの設計特性を選択する

### 運用上の優秀性を実現するには、準備・運用・進化の３分野が存在します

#### 準備
効果的な準備が必要

* 優先順位を決める、ビジネス成功のための運用方針の決定
* 運用のための設計、デプロイ→更新→運用を想定
* 運用可能かの判断、体制・手順・ドキュメントの準備

#### 運用
* 技術的なメトリックスに終始せずにビジネスの成果とお客様の成果によって運用を評価する
* 運用上のイベントに応答する手順を作成して作業を行い、その効果を検証してビジネスのニーズをサポートする
* 目的とするビジネスの成果の達成度を評価するために使用するメトリクスを収集します

#### 進化
* 運用を進化しつづけましょう
* 運用から学んだ教訓を共有、取り入れることが大切

### 運用上の優秀性を向上させる６つの原則
#### コードを使用して運用する
* ヒューマンエラーの抑制
* 一貫性のある応答を実現

#### ドキュメントに注釈をつける
* 人が判断し易くする

#### 定期的に小規模な元に戻すことができる変更を適用する
* コンポートネントを定期的に更新するように設計
* 失敗した場合に元に戻せるようにする

#### 運用手順を定期的に改良する
* 運用手順を更新するときに改善する

#### 障害を予想する
* 障害シナリオをテストし、影響を検証する
* 定期的なゲームデーを実施

#### 運用上のすべての障害から学ぶ
* 教訓から改善する
* 組織で共有する

#### サービス
* AWS Config
* AWS CloudFormation
* AWS Trusted Advisor
* AWS Inspector
  * EC2のセキュリティ脆弱性をチェック
  * 脆弱性レポート作成
* VPC フローログ
  * VPC内のネットワークログを記録
* AWS CloudTrail
* CloudWatch

## クロージング
* [試験詳細](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/?nc1=h_ls)
* [トレーニング/セルフペースラボ](https://aws.amazon.com/jp/training/self-paced-labs/)
* [トレーニング/コース](https://aws.amazon.com/jp/training/course-descriptions/)