OmniAICreator/Qiita-1.07M huggingface dataset:
AWSの大規模障害を受けて冗長化を再考する

# この記事の目的
先日あったAWSの大規模障害を受け、
いまいちど、アベイラビリティゾーンの定義と、冗長化の概念をしっかり捉えようと思いったのがきっかけです。
書いてる知識レベルは雑魚なのでチラシの裏書きだと思っていただければ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/fdb85d80-59bd-52c1-2cee-65a4a92737fc.png)


# 8月23日にAWSに何があったの？
- AZ内の冷却装置の故障によって、ネットワークコネクティビティに障害が発生
- 上記にともない、一部の物理サーバがシャットダウン
- 一部のEC2インスタンスやEBSボリュームに影響が生じる
- 冷却システムの安定化、電力システムの復旧により同日午後9時までにEC2の大部分のサービスが回復


# 被害を受けたサービス・サイト

ほんの一部ですが。
PayPayの基盤ってAlibaba Cloudじゃないんですね。
同じソフトバンクグループだから、勝手にAlibaba Cloudを使っていると思ってた🙃


|企業名|業種|原因・発生事象|
|----|----|----|
|PayPay|金融|サービス断続的に使用不可|
|ファミペイ|金融|AWSインフラの障害|
|mixi|ソーシャルメディア|接続障害|
|クリックポスト|サービス|AWSインフラの障害|
|ラクマ|サービス|システム不具合|
|楽天チケット|サービス|システム不具合|



# 冗長化の定義
Wikipediaによると、以下の通り。

>冗長化（じょうちょうか）とは、システムの一部に何らかの障害が発生した場合に備えて、障害発生後でもシステム全体の機能を維持し続けられるように、予備装置を平常時からバックアップとして配置し運用しておくこと。冗長化によって得られる安全性は冗長性と呼ばれ、英語ではredundancyと呼ぶ。

>常に実用稼動が可能な状態を保ち、使用しているシステムに障害が生じたときに瞬時に切り替えることが可能な仕組みを持つ。障害によってシステムが本来の機能を失うと、人命や財産が失われたり、企業活動が大きな打撃を受けるような場合には、冗長性設計が必須となっている。

**サーバの利用者に準じて、どこまで冗長構成を検討するかも重要な要素かと思います。**

例えば、

|システム用途|重要度||
|----|----|----|
|常時リクエストを受けるような幅広いユーザーに提供するサービス|高|冗長化の検討重要度は高い。データ冗長でのロールバックだけではなく、サーバ自体の冗長構成を検討することがほとんどのケースで必要🙃|
|企業内でのみ利用するサービス（9-17時稼働とか）|中 ~ 低|影響範囲が企業内なので狭い。（もちろん業務内容にもよるが）障害が発生したとしてもデータさえロールバックできれば可なケースも多い🤫|



# アベイラビリティゾーン（AZ）って美味しいの🍖？
アベイラビリティゾーンとは、AWSの各リージョンに存在するデータセンターのゾーンを指します。
単一AZで障害が発生しても、別AZはその障害を受けないよう設計されています。

どんな堅牢なアプリケーションでも、ホスティングしている単一の物理DCがやられたらシステムはおしまいです。
**マルチAZにEC2をデプロイすることで可用性はぐーんと増します。🤫**
せっかくおなじAWS料金を支払うなら、冗長化構成を検討しない手はないですよね👾

また、***AWSを利用する=クラウドの責任共有モデルに合意することになります。***
利用サービスの設定で回避できる問題や障害、マルチAZを利用したアーキテクチャの組み方で回避できるということであれば、
<font color="OrangeRed">**すべてAWS利用者側の責任になります。**</font>


|AZの場所|AZ間の距離|単一AZの可用性|マルチAZの可用性|AWSが定めているマルチAZにおけるEC2のSLA|
|---|---|---|---|---|
|非公開|数キロ ~ 数十キロ|99.9%|99.99%|99.99%|



# マルチAZを利用した冗長化構成のベストプラクティス（雑です）
Webサーバーのフロントにロードバランサーを置き、異なるAZにEC2をデプロイする構成です。
**料金が高い以外、デメリットはありません。最小構成においてもやるべきです🤒**


|メリット|デメリット|
|----|----|----|
|LBによる負荷分散|料金が高い|
|異なるAZでのDR対策|料金が高い|
|ホットスタンバイでの自動フェイルオーバー|料金が高い|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/aad9dbed-5b5d-f380-0057-fdb308ec1ff0.png)


# 「インフラとしてのクラウドはもろい」のか？
先日の大規模障害の際、AWS側が物理障害の復帰に要した時間は**<font color="OrangeRed">7時間ほど</font>**だったようです。
***7時間で全快ってすごくないですか？***
***オンプレでこの速さで復旧できますか？***

かなりの影響範囲だったので、相当数のサーバーがダウンしていたことが想定できます。
それだけの台数をたった7時間で復旧しているのは素直に凄いことだと思います。
経過レポートも5時間の間で**<font color="OrangeRed">6回報告</font>**があったようです。


# Design for Failureの精神
AWSが提唱している設計思想の1つです。
完璧に100%稼働するシステムは存在しません。
<font color="OrangeRed">**サーバは落ちるもの、データセンタは止まるもの**</font>です。
プロダクトは揃っているのだから、開発環境や、どうでも良いサービスで無い限り、あらかじめ障害を想定した構成を組むべきです。


# マルチクラウド化の可能性
今回のAWS大規模障害を通じて、<font color="OrangeRed">**マルチクラウド運用**</font>を想起された人も少なくないと思います。
AWSですら（AWSだからなのかもしれないが）障害は避けられないのであれば、
***インフラ設計者としてはクラウドは複数使って行かないといけない***のだなあと感じます。
複数クラウド利用による***可用性向上***もそうですが、<font color="OrangeRed">**AWS一選のベンダーロックインから開放されるのもメリットだなあ</font>**と思います。
破天荒自己紹介


## 名前

---

###名前: 由来

鈴木 信二朗：人から信じられる朗らかな人になれますようにとの事らしい
しんじろう：みんなだいたいこれ
しんちゃん：池袋北口界隈の人はだいたいしんちゃん

---

##所属

---

事業戦略本部技術開発セクションのフロントエンドエンジニア

---

## 趣味

---

釣り(めちゃくそ初心者)
飲み(最近飲めてないぞ！)
旅行(最近旅行行けてないぞ！！)

---

##家族構成

---

母(めちゃくそ破天荒)
姉(アホみたいに破天荒)
弟(家族全員を反面教師にしクソ真面目)

---

##年齢 

---

 1989年3月14日(ホワイトデー)30歳
覚えやすいね！！！！！！！！！！
待ってます！！！！！！！！！！！！

---

##破天荒経歴

---

###小学生
五年生からちょっと学校行かないがち

---

###中学校
学校行かないがち
でも不登校ではなく放課後とか学校行って遊んでた

---

###高校
中学卒業してから１年間フリーターしてたらタイに飛ばされ思春期タイで過ごす

---

###社会人
もうこんな場で言えない

---

##終わりに
こんな僕ですがどうぞ仲良くしてやってくださいまし
Firefoxのコンテナータブは便利だぞ！(管理者、テスター、開発者向けだ！）

諸君！ブラウザ戦争は好きかな！？
私は大嫌いである！なぜなら揉め事は面倒くさいからだ！
揉めている暇があったら自分にあった使いやすいブラウザを探せばいいと思っているッ！

閑話休題です。

日頃からブラウザは何を利用していますか？という話にもなりますが、Firefoxの[コンテナータブ](https://addons.mozilla.org/ja/firefox/addon/multi-account-containers/)って便利ですよーっていうお話を残したいと思います。
ちなみにChromeでも同じことができると伺っていますので、Firefoxに限定するつもりはございません。(Chromeではマルチユーザ機能と呼ぶそうです。)

# Firefoxってなんぞ？

Mozillaが作った、Geckoエンジン搭載したNetscapeの後継ブラウザとでも言えばいいんですかね。。。(こんな曖昧な言い方をしたらインターネット老人会で、根掘り葉掘りいろんな古い話を聞かされそうなので、[Mozillaのリンク](https://www.mozilla.org/ja/about/history/)を貼って逃げます。）

## [コンテナータブ](https://addons.mozilla.org/ja/firefox/addon/multi-account-containers/)とは

従来のインストールした状態では、プライベートブラウジングか通常のタブかしかありません。
しかし、[コンテナータブ](https://addons.mozilla.org/ja/firefox/addon/multi-account-containers/)を使うことで、用途ごとに分けたセッション管理を行うことができ、複数のアカウントをいろんなサイトで使うことができる便利な拡張機能となっています。

こんな感じでたくさんのタブを複数アカウントログインすることが可能です。

<img width="694" alt="tabs.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13837/12dd3d86-db73-8350-2b61-4ff0d16bdfb8.png">

こっちは[コンテナータブ](https://addons.mozilla.org/ja/firefox/addon/multi-account-containers/)の種類をいくつ作っているか、です。
<img width="140" alt="containertab.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13837/9b228041-791a-ec08-b41a-6739f872f3db.png">

## 何が便利なのか

管理者なら複数アカウントを使って、検証することがあるでしょう
はたまたいろんな方からログイン状況や管理しているプロジェクトのアカウント内を見ることもあるでしょう
他にもプロジェクトによって使っているツールが違ったりして、アカウント切り替えがめんどいとかもあるでしょう

開発者やテスターならAアカウントでログインを試し、Bアカウントで違う挙動になるかをチェックすることもあるでしょう

私的利用（すんなよって会社もありますが）自分のDropboxに入りつつ、会社のDropboxにログインしたいとか、会社のG Suiteメールアドレスを見つつ自分のgmailプライベートのメールも見たいとかあるでしょう

そんな悩みを解決してくれるのが[コンテナータブ](https://addons.mozilla.org/ja/firefox/addon/multi-account-containers/)です。

## 実際の使い方

ぼくの場合は管理アカウント、個人アカウント、社員として使うアカウントの3パターンがあります。
また、AWSのアカウント切り替えも複数にまたぐことはよくある話になっており、普通のタブとプライベートブラウジングだけじゃきちーわ…って思っていたら、去年ぐらいからMozilla自身から[コンテナータブ](https://addons.mozilla.org/ja/firefox/addon/multi-account-containers/)がリリースされました。

これのおかげで業務効率が改善されたという方のインタビューがありますので、以下に数名の方からお聞きしたことを記載します。

## インタビュー内容

Aさん「[コンテナータブ](https://addons.mozilla.org/ja/firefox/addon/multi-account-containers/)を使ったことで持病が改善されました！」
Bさん「[コンテナータブ](https://addons.mozilla.org/ja/firefox/addon/multi-account-containers/)は便利ですね！寝るときも離さず身につけています！」
Cさん「やー、[コンテナータブ](https://addons.mozilla.org/ja/firefox/addon/multi-account-containers/)がないと日常の水やりが大変なんですよね」

ということでどうでもいい話でしたが、[コンテナータブ](https://addons.mozilla.org/ja/firefox/addon/multi-account-containers/)のご紹介でした。

ご一読ありがとうございました。

P.S.
セキュリティとしてもセッションを分けられ、怪しいリンクを踏むときなんかにも情報を盗まれずにすむのに役に立ちますよ。
TOPページ

# iGarage Rails
Way Garageに参加ください

## パソコンの最低仕様
###  mac
2012年よりあと

### windows
Windows 7 以上
ストレージ 128GB
メモリ 4G
CPU Intel core m3 m5 m7 i5 i7以上であること
Intel celeronなどは動かない

##事前インストール
Windowsユーザーは事前に以下のダウンロード、インストールをお願いします。
・[RailsInstaller](https://s3.amazonaws.com/railsinstaller/Windows/railsinstaller-3.3.0.exe) → ダウンロードとインストール
・[ImageMagick](https://legacy.imagemagick.org/script/download.php#windows) → ダウンロードのみ　※インストールはしない
・[Google Chrome](https://www.google.com/chrome/) → ダウンロード&インストール

## WayGarage Railsにようこそ!
### Basic
[1.インストール](/basic_1/)  
[2.Ideaアプリを作ってみよう](/basic_2/)  
[3.Commentをかけるようにしよう、デザインを追加してみよう、画像をアップロード](/basic_3/)  
[4.ログイン機能、管理画面](/basic_4/)  
[5.Companyのページを作ってみよう、RESTful API説明、MVC説明](/basic_5/)  
[6.Staffのページを作ってみよう、リレーションの説明](/basic_6/)  





### Advance
[1.プロジェクト説明、お問い合わせページを作ってみる](/advance_1/)  
[2.Gemを使って管理画面を作成する、設計説明](/advance_2/)  
[3.演習、各ページを自分で作ってみよう](/advance_3/)  
[4.検索を追加してみる](/advance_4/)  
[5.bootstrapについて、デザインを追加してみる](/advance_5/)  
[6.Herokuへのupload, まとめ](/advance_6/)  


### 番外編
1. Rubyについて
2. Githubについて
(3. HTML, CSSについて(dotinstallで勉強しよう))
Concrete CMS ログインページに IP 制限や BASIC 認証を追加する方法


# Basic 認証

Apache な Concrete CMS (concrete5) サイトでログインページに Basic 認証を付ける方法です。

Nginx での方法はこちら
https://qiita.com/katzueno/items/b6b28d12c4105b4c133d


```
<Files "login">
AuthType Basic
AuthName "KatzCurry"
AuthUserFile /var/www/html/.htpasswd
Require valid-user
</Files>

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} index\.php/login
RewriteRule ^index.php/(.*) $1 [R,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.html !-f
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule . index.php [L]
```

concrete5 はドメインのルートに設置されている想定です。違う場合は、RewriteBase を書き換えてください。

/index.php/login を /login にリダイレクトさせて、

`AuthUserFile /var/www/html/.htpasswd` を実際の .htpasswd ファイル保存先に書き換えてください。

`RewriteCond %{REQUEST_URI} index\.php/login` の記述もドメインルート設置ではない場合は変更が必要です。

# IP 制限

下記のように設定することで IP 制限が可能です。(未検証)

```
<Files "login">
	<RequireAny>
		Require ip xxx.xxx.xxx.xxx
		Require ip xxx.xxx.xxx.xxx
	</RequireAny>
</Files>

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} index\.php/login
RewriteRule ^index.php/(.*) $1 [R,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.html !-f
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule . index.php [L]
```

IP 制限といっても、AWS の ELB だったり、さくらのレンタルサーバーなどではプロキシサーバーがあるので特殊な設定が必要です。詳細は僕の別の Qiita の記事にて。
https://qiita.com/katzueno/items/4cf15117d228dbaf2448
Laravel　エラー　備忘録

Laravelで簡単なアプリケーションを作成しているときに、詰まってしまった箇所を備忘録として記事にしようと思います。

## ルーティング
~~~php

Route::get('contents/{id}/update', 'ContentsController@edit');
Route::post('/book/{book}', 'ContentsController@update');
~~~

## コントローラー
~~~php
    public function edit($id)
    {
        $book = Book::find($id);
        return view('contents/update')->with('book',$book);
    }

    ~中略~
    
    public function update(Request $request, $id)
    {
        $book = Book::find($id);
        $book->title = $request->title;
        $book->body = $request->body;
        $book->todo = $request->todo;
        $book->limit = $request->limit;
        $book->save();
        return redirect('/');
    }
~~~

## ビュー
~~~php
           
　　　　　　　<form action="/contents/update" method="POST" class="form-horizontal">
　　　　　　　　
　　　　　　　<div class="form-group">
              <label for="task-name" class="col-sm-3 control-label" >感想または学び</label>

              <div class="col-sm-6">
                <textarea type="text" name="body"  class=" big-box" value="{{ old('book') }}">{{ $book->body }}
                </textarea>
              </div>
            </div>
~~~

## 問題
この状態で`http://127.0.0.1:8000/contents/update`へアクセスすると`The POST method is not supported for this route. Supported methods: GET, HEAD, PUT, PATCH, DELETE.`というエラーが表示される。

## 解決法
ビューファイルを修正する

~~~php
      <!-- /contents/updateを/book/{{ $book->id }}に修正する -->
          <form action="/book/{{ $book->id }}" method="POST" class="form-horizontal">
            {{ csrf_field() }}

〜中略~

             <div class="col-sm-6">
                <!-- value="{{ old('book') }}"を削除する -->
                <textarea type="text" name="body"  class=" big-box" >{{ $book->body }}
                </textarea>
              </div>
~~~

actionの送信先を間違えていたのと、value="{{ old('book') }}"を記述していたことが原因でした。
(俺が)よく使うDockerコマンド

随時記述。
純粋にDockerだけの話。オーケストラレイヤの話は考えない。

# 対象
- Docker初心者
- 俺

# 本題
## BUILD系
### $ docker build -t [image]:[tag] .
頻度：★★★★★

- カレントディレクトリのDockerfileを元にイメージ作成を作成する。
- `-t` でタグ名を指定する。一応オプショナルだけど基本付ける。

### $ docker build --build-arg HOGE=FUGA -t [image]:[tag] .
頻度：★★☆☆☆

- build時の変数を引き渡す。
- 予めDockerfile内で`ARG`で定義しておかないとエラーになる。ただ、`http_proxy`の様な元々ある変数なら定義の必要ない。

## RUN系
### $ docker run [image]:[tag]
頻度：★★★★★

- コンテナを起動する。基本中の基本。
- tagを省略したら'latest'になるお

### $ docker run --rm [image]:[tag]
頻度：★★★★★

- プロセス終了したらコンテナ削除。

### $ docker run -it [image]:[tag] /bin/bash
頻度：★★★★★

- コンテナの中入る。デバッグに便利。
- bashじゃない場合(ashとか)もある。
- DockerfileのCMDが`/bin/bash`に上書きされる。CMDに指定したいコマンドはコンテナの中に入ってから実行すればいい。

### $ docker run --entrypoint="/bin/bash" -it [image]:[tag]
頻度：★★★★☆

- DockerfileにENTRYPOINT指定してる場合はこれでコンテナ入れる。

### $ docker run -e HOGE=FUGA [image]:[tag]
頻度：★★★☆☆

- 稼働時に環境変数を渡す。

### $ docker run -env-file hoge.env [image]:[tag]
頻度：★★★☆☆

- 稼働時に指定したenvファイルを読み込む。

## その他
全部頻度：★★★★★
### $ docker images
- イメージ一覧表示

### $ docker rmi [image]:[tag]
- 指定したイメージを削除
- `[image]:[tag]`はイメージIDでも可。

### $ docker ps -a
- コンテナ一覧表示
- `-a`はオプショナル。付ければ動いてないプロセスも表示してくれる。

### $ docker [system|image|container|network|volume] prune
- 使ってないやつ一括削除
- `system` : すべての停止中のイメージ、コンテナ、ネットワーク、ボリュームを一括削除
- それ他は指定したやつの使われてないのを一括削除
[Tips]SwiftUI側でViewControllerを表示

# このはじめに
SwiftUIからViewControllerを表示する時のTipsです。

# ViewControllerとStoryboard

記事用に作成したViewControllerとStoryboardになります。

## ViewController
```SampleViewController.swift
import UIKit
import Instantiate
import InstantiateStandard

class SampleViewController: UIViewController, StoryboardInstantiatable {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}
```

## Storyboard
<img width="253" alt="スクリーンショット 2019-09-04 19.18.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/f5ca7711-b6d7-a976-8bf3-b427137b8f7b.png">

# UIViewControllerRepresentableを使用

```SampleViewController.swift
import UIKit
import SwiftUI
import Instantiate
import InstantiateStandard

class SampleViewController: UIViewController, StoryboardInstantiatable {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

struct SampleViewControllerWrapper : UIViewControllerRepresentable {

    typealias UIViewControllerType = SampleViewController

    func makeUIViewController(context: UIViewControllerRepresentableContext<SampleViewControllerWrapper>) -> SampleViewControllerWrapper.UIViewControllerType {
        return UIViewControllerType.instantiate()
    }

    func updateUIViewController(_ uiViewController: SampleViewControllerWrapper.UIViewControllerType, context: UIViewControllerRepresentableContext<SampleViewControllerWrapper>) {
    }
}
```

# SwiftUIからSampleViewControllerを表示する

```SampleView.swift
import SwiftUI

struct SampleView: View {
    var body: some View {
        SampleViewControllerWrapper()
    }
}

#if DEBUG
struct SampleView_Previews: PreviewProvider {
    static var previews: some View {
        SampleView()
    }
}
#endif
```
<img width="344" alt="スクリーンショット 2019-09-04 19.28.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/f6e3d151-e7c8-9ebc-5291-7539ea18b54b.png">
Qiita って `#d3e173` みたいに書くと右側に色が表示されるって知ってた？

「[あなたの思う黄緑と、わたしの思う黄緑は違うかもしれない🎨](https://qiita.com/azukisiromochi/items/faef9e79caa99886d910)」って記事を書いてて偶然気づいたんですが、 Qiita って `#d3e173` みたいにカラーコードをコード記法で書くと、右側に色が表示されるんですね。
知ってました？

ってことで、記法やカラーコードの種類で色が表示されるかどうか検証してみました。

## コード記法の種類による比較

### インライン :o:
`#d3e173`
これは実証ずみ。表示されますね。

### シンタックスハイライト :x:

```
#d3e173
```

```css
div {
  background-color: #d3e173
}
```
これは......だめみたい。
まあそうだよね。

## カラーコードの種類による比較

### 16進カラーコード :o: 

`#e4a972`
これは実証ずみ。表示されますね。

ちなみに3桁も :o:
`#fff`

### hsl() :o: 

`hsl(165, 100%, 50%)`
hsl() もいけるみたい！

### rgba() :o: 
`rgb(234, 0, 255)`
`rgba(234, 0, 255, 0.5)`
rgba() もいけるみたい！
（ちゃんと透過されてるｗ）

### カラーネーム :x:
`yellow`
さすがにカラーネームは無理でした。


### グラデーション :x:
`linear-gradient(-135deg, #E4A972, #9941D8)`
いけたらカッコイイけど、無理みたい。

## まとめ
色を記事に書くときはインラインでコード記法すると視覚的に伝えられるかも！
Laravel6.0がリリースされたみたいなのでphp触ったことないけど入れてみたon mac

## はじめに
phpは数年前にdotinstallか何かでやって完全に理解はした気がしますが、覚えてないので実質no touchで。。。

# brewでphpをインストール
laravel6入れるのにphp7.2以上じゃないと入れられないので、最初にphp7.2以上をインストールする
どうせなら新しいのでってことで、7.3を

```bash
# brew更新
brew doctor
brew update
brew install php@7.3
# インストールされてるか確認
php -v
```


# composerをインストールする
composerよくわかってないけどpythonでいうanaconda的な？pyenv的な？感じか？

```bash
# composerインストール
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer
# インストールされてるか確認
composer -v
``` 

# プロジェクトを作ってみる
laravelはフレームワークなんですねそういえば。。。（忘れがち）
下のコマンド部分で書いてるのは、
anacondaでいう
`conda create -n test anaconda python=3.7`（仮想環境を作る）と
pythonのdjangoでいう
`django-admin startproject mysite`(プロジェクトを作る)
が合わさったみたいな感じかな？

```bash
# プロジェクト作成
composer create-project --prefer-dist laravel/laravel test "6.*"
# プロジェクト起動
php artisan serve
```

### 起動されました！
<img width="1437" alt="スクリーンショット 2019-09-04 19.00.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455534/cf81970f-3fe5-a19d-0492-e58653fe544a.png">


### ちろっと起動されたphpファイル確認してみる
```
less resources/views/welcome.blade.php
```

終了！！！！！！！！！！！！！！！！！！

# おわりに
起動するだけならすぐでした
さあlaravelを使って開発だ！（しない）
pythonのフレームワークよりフォントがおしゃれなのは認めます。
c++始めてみた：Visual Studio Code 使用方法（初心者必見）個人ノート1.8

# Visual Studio Code 使用方法（初心者必見）

本職の方が忙しくてなかなかQiita、c++学習に戻ってこれませんでしたが、やっと時間が取れました。今週は金〜土曜まで頑張ります！

今回は、Visual Studio Codeのなんちゃって使用方法を調べていきたいと思います。（プログラミング初心者、VScode初心者直伝）

## 環境
Macbook Air 13 inch Mid 2013
macOS Mojave Version 10.14.6
Xcode 10.3をダウンロード

ふと思ったんですが、Macbook Airの１３インチってコードを書くには画面が小さく感じます。
将来的に、どんなPCを使っていたとしても、２４インチの画面で作業出来る様に、作業環境を整えたいですね。（完全に蛇足）

ただ、実際にどのくらいの画面が作業するのに一番いい効率のサイズなのかは分からないんですが、２１インチ、２３インチ、２４インチ、２７インチ、それ以上、どのサイズが一番いいんでしょうか？自分の目標としては２４インチを単騎　→　デゥアルディスプレイを目指してます。

兎に角、まずは定番のYoutube自習

- [Youtube Clip 1　(日本語)](https://www.youtube.com/watch?v=e3DmHK2PDGA)
    - ウィンドウズユーザー視点ですね
    - 早速 Theme Color をMonokaiに
    - 上の動画シリーズは今の所１〜８まであるそうです [2](https://www.youtube.com/watch?v=N9lr0BPXqlA), [3](https://www.youtube.com/watch?v=t7LvE06cyIY), [4](https://www.youtube.com/watch?v=bJJVl4x9kz4), [5](https://www.youtube.com/watch?v=6PmS5zM1TwA), [6](https://www.youtube.com/watch?v=_Cmd3o8UtWM), [7](https://www.youtube.com/watch?v=vMZ0C06soxA), [8](https://www.youtube.com/watch?v=pTMWpGjLux8)
- [Youtube Clip 1　(英語)](https://www.youtube.com/watch?v=fnPhJHN0jTE)
    - インストールし始めた状態からの解説です。
AtCoder Beginner Contest 040 D - 道路の老朽化対策について(size付きUnion Find)

# AtCoder Beginner Contest 040 D - 道路の老朽化対策について

union find。
集合ごとの要素数を`self.size`で管理している。最初はそれぞれサイズは1。集合をマージする際はそれぞれのsizeを足し合わせる。

集合の数が欲しい時は`self.group_num = n`のコメントアウトを外す。集合の数は、最初はnでマージするたびに1減っていく。簡単。

https://abc040.contest.atcoder.jp/tasks/abc040_ds

```python

from collections import defaultdict
from heapq import heappush, heappop, heapify
from collections import deque
import math
import bisect
import random
import sys
 
sys.setrecursionlimit(2147483647)
INF = 10 ** 13
def LI(): return list(map(int, sys.stdin.buffer.readline().split()))
def I(): return int(sys.stdin.buffer.readline())
def LS(): return sys.stdin.buffer.readline().rstrip().decode('utf-8').split()
def S(): return sys.stdin.buffer.readline().rstrip().decode('utf-8')
def IR(n): return [I() for i in range(n)]
def LIR(n): return [LI() for i in range(n)]
def SR(n): return [S() for i in range(n)]
def LSR(n): return [LS() for i in range(n)]
def SRL(n): return [list(S()) for i in range(n)]
def MSRL(n): return [[int(j) for j in list(S())] for i in range(n)]
mod = 1000000007


class UnionFind:
    def __init__(self, n):
        # 負  : 根であることを示す。絶対値はランクを示す
        # 非負: 根でないことを示す。値は親を示す
        self.table = [-1] * n
        self.size = [1] * n
        # self.group_num = n

    def root(self, x):
        if self.table[x] < 0:
            return x
        else:
            self.table[x] = self.root(self.table[x])
            return self.table[x]

    def get_size(self, x):
        r = self.root(x)
        return self.size[r]

    def is_same(self, x, y):
        return self.root(x) == self.root(y)

    def union(self, x, y):
        r1 = self.root(x)
        r2 = self.root(y)
        if r1 == r2:
            return
        # ランクの取得
        d1 = self.table[r1]
        d2 = self.table[r2]
        if d1 <= d2:
            self.table[r2] = r1
            self.size[r1] += self.size[r2]
            if d1 == d2:
                self.table[r1] -= 1
        else:
            self.table[r1] = r2
            self.size[r2] += self.size[r1]
        # self.group_num -= 1
 
n, m = LI()
path_year = LIR(m)
path_year.sort(key=lambda x:x[2], reverse=True)
U = UnionFind(n + 1)
q = I()
q_list = LIR(q)
ans_list = [0] * q
sort_index = sorted(range(q), key=lambda x: q_list[x][1], reverse=True)
j = 0
for i in sort_index:
    v, w = q_list[i]
    while j < m and path_year[j][2] > w:
        U.union(path_year[j][0], path_year[j][1])
        j += 1
    ans_list[i] = U.get_size(v)
 
 
 
print('\n'.join(map(str, ans_list)))


```
CWLで空白を含むファイルを処理したいとき

# 概要

`cwltool` は、デフォルトだと、いくつかの文字を禁止文字としている。
空白もその１つである。

```
ERROR Workflow error, try again with --debug for more information:
Invalid filename: 'a space is here.txt' contains illegal characters
```

実験装置からでてくるファイルなどに、空白が含まれることもあるので、そのときはどうするか。

# 結論

`cwltool` では、以下のオプションをつける

```
--relax-path-checks
```
Raspberry Pi Tips集

# Raspberry PiでWi-fiを設定する
GUIでも設定できるのですが，自宅の環境ではWi-fiの設定をステルスモードにしている関係か，一度他のWi-fiルータに接続し，自宅のWi-fiに接続し直そうとすると，Wi-fiのSSIDを拾ってくれなくなりました。
少し調べてみると，下記のURLにあるとおり，/etc/wpa_supplicant/wpa_supplicant.confでscan_ssidの設定を有効にするといいみたいです。

■ Setting WiFi up via the command line (The Raspberry Pi Foundation)
<https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md>

    network={
        ssid="yourHiddenSSID"
        scan_ssid=1
        psk="Your_wifi_password"
    }

上記を参考に/etc/wpa_supplicant/wpa_supplicant.confを設定後Raspberry Piを再起動すると，自宅環境のWi-fiも認識できるようになりました。また，自宅とその他のWi-fi環境を利用する際には，「Adding multiple wireless network configurations」の設定もしていると良いのでしょうね。

    network={
        ssid="SchoolNetworkSSID"
        psk="passwordSchool"
        id_str="school"
    }
    
    network={
        ssid="HomeNetworkSSID"
        psk="passwordHome"
        id_str="home"
    }
AquaSKKで英字入力へのショートカットをlからxへと変更する

# はじめに

AquaSKKはデフォルトだと`l`で英字入力モードになるが，日本語の小文字を打つときに`l`を使う派としては辛いのでこれを修正する

# やり方

## ショートカットを`l`から`x`へと変更

```bash
cp /Library/Input\ Methods/AquaSKK.app/Contents/Resources/keymap.conf ~/Library/Application\ Support/AquaSKK/
```

~/Library/Application\ Support/AquaSKK/keymap.conf を修正する．
29行目くらいの

```text
SwitchToAscii l
```

を

```text
SwitchToAscii x
```

へと変更.

## `l`から始まる文字が正しく変換されるように変更

```bash
cp /Library/Input\ Methods/AquaSKK.app/Contents/Resources/kana-rule.conf ~/Library/Application\ Support/AquaSKK/
```

```text
ll,っ,ッ,ｯ,x
la,ぁ,ァ,ｧ
li,ぃ,ィ,ｨ
lu,ぅ,ゥ,ｩ
le,ぇ,ェ,ｪ
lo,ぉ,ォ,ｫ
lka,ヵ,ヵ,ｶ
lke,ヶ,ヶ,ｹ
ltsu,っ,ッ,ｯ
ltu,っ,ッ,ｯ
lu,ぅ,ゥ,ｩ
lwa,ゎ,ヮ,ﾜ
lwe,ゑ,ヱ,ｴ
lwi,ゐ,ヰ,ｲ
lya,ゃ,ャ,ｬ
lyo,ょ,ョ,ｮ
lyu,ゅ,ュ,ｭ
```

を追記.
ちなみにこのファイルはutf-8ではなくeuc-jpで書かれているので注意.


## 設定の再読み込み

![Screen Shot 2019-09-04 at 18.31.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196544/e43bd4dc-1f54-3826-acb1-af4ba157c38a.png)

から`設定ファイルの再読み込み`をクリック.
終了.
wxPython の 'This program needs access to the screen. Please run with a' に対処する

## 概要

- Mac
- pyenv
- virtualenv
- wxPython 4.0.6

こんな環境で wxPython さんを使おうとしました。しかし下記表示が出てきて、止まってしまいました。この問題に対応します。

```plaintext
This program needs access to the screen. Please run with a
Framework build of python, and only when you are logged in
on the main display of your Mac.
```


## 原因

wxPython は **framework build** の Python を必要とします。しかし pyenv がインストールしてくれる Python は、その framework build ではないようです。ゴメンなさいしないといけないのですが、 framework build の Python というのが何なのかは分かりません。とにかく framework build の Python が必要なんだ。(頭わるそう)

以下に、 framework build ではない Python を入手している様子を示します。

```bash
# 普通に Python を入手。
$ pyenv install 3.6.7

# virtualenv 作成。
$ pyenv virtualenv 3.6.7 lab-3.6.7
$ pyenv local lab-3.6.7

# pip upgrade。
$ pip install --upgrade pip

# wxPython 入手。
$ pip install wxPython

# 実行。
$ python foo.py
```

```python:foo.py
import wx
wx.App()
```

```plaintext:結果
This program needs access to the screen. Please run with a
Framework build of python, and only when you are logged in
on the main display of your Mac.
```


## 解決

```bash
# framework build の Python を入手。
$ env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.6.7

# virtualenv 作成。
$ pyenv virtualenv 3.6.7 lab-3.6.7
$ pyenv local lab-3.6.7

# pip upgrade。
$ pip install --upgrade pip

# wxPython 入手。
$ pip install wxPython

# 実行。
$ python foo.py
```

これで問題なく動きました。

### 参考

- [pyenv - How to build CPython with Framework support on OS X](https://github.com/pyenv/pyenv/wiki#how-to-build-cpython-with-framework-support-on-os-x)
Project Euler 005を解いてみる。「最小の倍数」

#本題:Project Euler 005
001~004まで解いてみて、いつも近道をしようとして結局遠回りをしている感が強いですが、今回も頑張っていきます。
[005](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%205)
>2520 は 1 から 10 の数字の全ての整数で割り切れる数字であり, そのような数字の中では最小の値である.
では, 1 から 20 までの整数全てで割り切れる数字の中で最小の正の数はいくらになるか.

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

## 考え方
1~20までで割り切れる最小の正の整数=2~20の最小公倍数
つまり答えの数は素因数として2~20までの数の素因数を全て含む。

##方法①配列2~20を作り、最大割れる数を探す。
[**2**, 3, **4**, 5, **6**, 7, **8**, 9, **10**, 11, **12**, 13, **14**, 15, **16**, 17, **18**, 19, **20**]
2で割れる数は割ってみる
[1, 3, **2**, 5, 3, 7, **4**, 9, 5, 11, **6**, 13, 7, 15, **8**, 17, 9, 19, **10**]
もう1回2で割ってみる
[1, 3, 1, 5, 3, 7, **2**, 9, 5, 11, 3, 13, 7, 15, **4**, 17, 9, 19, 5]
三度2で割ってみる
[1, 3, 1, 5, 3, 7, 1, 9, 5, 11, 3, 13, 7, 15, **2**, 17, 9, 19, 5]
最後にもう一度2で割ってみる
[1, 3, 1, 5, 3, 7, 1, 9, 5, 11, 3, 13, 7, 15, 1, 17, 9, 19, 5]
`2~20の配列全てを2で割り切るには4回割る必要がある→答えの素因数には、2が4つ含まれる。`
同様に3で割る、5で割る…と繰り返すことで答えの素因数がわかる。
あとはその素因数を乗算すれば答えになるはずです。

## コード
```Python:euler005.py
def main():
    n = 20
    num_arr = np.arange(2, n + 1)  # 2~20の配列を作成
    ans = 1  # 答え用の変数
    for i in range(2, n + 1):
        mask = num_arr % i == 0  # numpyで[iで割り切れる数]に一致するboolean配列を作成
        while mask.any():  # １つでも割り切れる数がある場合
            num_arr = np.where(mask, num_arr // i, num_arr)  # 割れる数はiで割る、割れない数はそのまま
            ans *= i  # 回答に掛け算
            mask = num_arr % i == 0  # maskを更新
    print(ans)


if __name__ == '__main__':
    main()
```

##方法②20以下の素数pについて、p^q <= 20を満たす最大のqを考える
2~20の数で割り切れるということは、必ず20以下の素数を全て素因数に持っていると考えられます。
あとはそれぞれの素因数が最大何個ずつ必要かがわかれば答えは計算できそうです。
20以下の整数で最も2を素因数に含む数は2の4乗=16、最も3を素因数に含む数は3^2=9及びその2倍である18です。
つまり、`n以下の整数のうち素因数pを最も多く含む数の1つは、pの累乗である`はずです。
よって、20以下の素数を列挙し、それぞれの素数pについて、p^q < 20となる最大のqを計算すれば答えに必要な素因数が計算できます。
素数の生成には、[Project Euler 003を解いてみる。頑張って素数を早く出してみる。](https://qiita.com/radiol/items/7d4f13387b7883deb8ce)で作成したprime_generatorを流用してみました。

##コード
```Python:math_functions.py
import numpy as np


def prime_generator(n: int) -> int:
    """
    n以下の素数を返すgenerator
    :param n: int
    :return: int
    """
    num_arr = np.arange(2, n + 1)
    while num_arr.size > 0:
        prime = num_arr[0]
        yield prime
        num_arr = num_arr[num_arr % prime != 0]
```

```Python:euler005.py
from math_functions import prime_generator #自作のprime_generatorをimport


def another_main():
    n = 20
    ans = 1
    for prime in prime_generator(n): #prime_generatorで20以下の素数を生成
        i = 1
        while prime ** i <= n: #素数の累乗が20以下の間
            ans *= prime #素数を累乗していく
            i += 1
    print(ans)


if __name__ == '__main__':
    another_main()
```
方法②のほうが方法①より4倍ほど早いようです。理由としては、必要な素数の数があまり多くない(n=50なんかでやると答えの数がオーバーフローする)ので素数生成があまりボトルネックにならないためと考えます。
`結果
232792560
main処理時間: 0.0004699230194091797 sec.
another_main処理時間: 0.0001049041748046875 sec.
`
エクセルの文字列分解処理

円柱状の製品があるのですが、それのシステムから抽出される文字が
100X100X50 のような形式で抽出してきます。

これは外形X内径X高さの表記なんですが、高さ別に分けるとか条件を設けていろいろ
しようとするとこの文字列を分解しなければなりません。

関数で=MID(LEFT ~~　とかやってもいいのですが、ここはスマート？にVBAで使いまわせるように出来れば便利と考えました。

ユーザーのフォーマットに合わせていろいろ変えて下さい。

引数　serchRange　には、切り分けたい文字列がある行のRangeオブジェクトを指定します。
引数　serchStr　には、切り分けたい文字を指定します。「ここでは"×"」
引数　pasteRange1　には、切り分け後ペーストしたい列を指定します。
ここでは外形と内径と高さの3つを分けたいので、引数は3つにしてあります。

```vb
Sub Diametar3(serchRange As Range, serchStr As String, pasteRange1 As Range, pasteRange2 As Range, pasteRange3 As Range)
'"×"
    Dim V As Variant, V2 As Variant, OO As Variant, II As Variant, TT As Variant
    Dim R As Range, R2 As Range, R3 As Range, R4 As Range

    Dim T As Single
    Dim start_Str As Variant, start_Int As Variant
    
    Dim maxRow As Long, maxCol As Long
    
    T = Timer
    '最終行・最終列の指定
    maxCol = Cells(1, Columns.Count).End(xlToLeft).Column
    maxRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    Set R = serchRange

    '格納用の配列の範囲を指定
    ReDim V(1 To maxRow, 1 To 1)
    ReDim V2(1 To maxRow, 1 To 1)
    ReDim OO(1 To maxRow, 1 To 1)
    ReDim II(1 To maxRow, 1 To 1)
    ReDim TT(1 To maxRow, 1 To 1)

    V = R.Value
    OO(1, 1) = "外径"
    II(1, 1) = "内径"
    TT(1, 1) = "高さ"
    
    For i = 2 To maxRow - 1

            For str1 = 1 To Len(V(i, 1))
                V2(i, 1) = Mid(V(i, 1), str1, 1)
            
            '外径の切り分け
                If V2(i, 1) = serchStr Then
            
                start_Str = InStr(V(i, 1), serchStr) - 1
                start_Int = start_Str
                start_Str = Mid(V(i, 1), 1, start_Str)
                
                OO(i, 1) = start_Str
                Exit For
                End If
            Next
                V(i, 1) = Mid(V(i, 1), start_Int + 2, Len(V(i, 1)))
                
                For str2 = 1 To Len(V(i, 1))
                    
                    V2(i, 1) = Mid(V(i, 1), str2, 1)
                    
                    '内径の切り分け
                    If V2(i, 1) = serchStr Then
                        start_Str = InStr(V(i, 1), serchStr) - 1
                        start_Int = start_Str
                        start_Str = Mid(V(i, 1), 1, start_Int)
                        II(i, 1) = start_Str
                    Exit For
                    End If
                Next
                
                V(i, 1) = Mid(V(i, 1), start_Int + 1, Len(V(i, 1)))
                
                For str3 = 1 To Len(V(i, 1))
                    
                    V2(i, 1) = Mid(V(i, 1), str3, 1)
                    
                    '高さの切り分け
                    If V2(i, 1) = serchStr Then
                        start_Str = InStr(V(i, 1), serchStr) - 1
                        start_Int = start_Str
                        start_Str = Mid(V(i, 1), 2, Len(V(i, 1)))
                        TT(i, 1) = start_Str
                    Exit For
                    End If
                    
                Next
            
    Next
    
'配列の内容をペースト
    Set R2 = pasteRange1
    Set R3 = pasteRange2
    Set R4 = pasteRange3
    
    R2 = OO
    R3 = II
    R4 = TT

'経過時間を表示
    Debug.Print Round(Timer - T, 2)
CWLで、arguments が意図せずクォートで囲われてしまうケースについて

# 概要

クォートが意図せずついてしまうことがある。
問題としては、コマンドにたいして、すべてのパラメータが１つの文字列として渡ってしまいエラーになる。

# 結論

解決策はおそらく２つで、
- １行に１つだけ、データを書いていく方法で解決できることもある。
- カンマで区切る

# TODO

簡単なサンプルにする
この場合２行目の最後にカンマがない

```
arguments: [ --no-lane-splitting,
             --runfolder-dir $(inputs.runfolderdir)
             --interop-dir $(inputs.runfolderdir)/InterOp]
```

この形にする

```
arguments:
  - --no-lane-splitting
  - --runfolder-dir
  - $(inputs.runfolderdir)
  - --interop-dir
  - $(inputs.runfolderdir)/InterOp
```

これはクォートされるかんじがある。

```
arguments:
  --no-lane-splitting
  --runfolder-dir $(inputs.runfolderdir)
  --interop-dir $(inputs.runfolderdir)/InterOp
```

これも動くはず

```
arguments: [ --no-lane-splitting,
             --runfolder-dir, $(inputs.runfolderdir),
             --interop-dir, $(inputs.runfolderdir)/InterOp]
```
BitriseのWorkflowsを複数同時に走らせる

# はじめに
Pushした際のトリガーで、例えばandroid用とios用のworkflowsが別々に設定してあり、同時に走らせたい場合があるとします。
その場合の設定を下記に記述します。

# Bitrise APIの入手
`Account settings -> Security -> Personal access tokens (BETA) -> Generate new`を選択し、APIキーを入手します。後ほど、Secrets登録しますので、ここでコピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/4e312a12-8404-c867-f10b-6df17d40363f.png)

# Secretsの設定

```
BITRISE_API = 上記のAPIキー
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/e4bc70a8-bd7a-7b92-798a-8c68867895fa.png)


# Bitrise Start Buildの導入
Workflowsに`Bitrise Start Build`をセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/9642c1d0-3d49-f7e5-36e4-86e90b317c04.png)

下記を設定します。

`Bitrise Access Token = $BITRISE_API`
`Workflows`に走らせたいworkflowを設定します。
この際、1ラインに1workflowを記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/3078ef35-5c6d-bb32-1051-e5cf601c2550.png)

# Triggersの設定
対応させたいブランチ名と今回作成したworkflowを選択します。
するとpushした際に、上述の`Workflows`で設定したものが走ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/73cb0eab-3dc9-5ef1-ee1c-8ffa4290d89f.png)


# 参考
[Starting parallel builds with a single trigger](https://devcenter.bitrise.io/builds/triggering-builds/trigger-multiple-workflows/)
ABC139 

#A-Tenki
##正解
```c
#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int cnt=0;
    string S,T;
    cin >> S >> T;
    
    for (int i=0; i<3; i++){
        if (S[i]==T[i]) cnt++;
    }
    cout << cnt;
    return 0;
}
```
##自分の誤答
```c
#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int cnt=0;
    string S,T;
    
    for (int i=0; i<3; i++) cin >> S[i]; 
    for (int i=0; i<3; i++) cin >> T[i];
    
    for (int i=0; i<3; i++){
        if (S[i]==T[i]) cnt++;
    }
    
    cout << cnt;
    return 0;
}
```

#改善点(文字列入力)
**以下のこの形はatcorderでは不適切！(paizaでは上手くいった…)**
**文字列入力**はfor文にしなくても自動的に一文字ずつ読み込んでくれるので、以後改善していく！

```c
    #不適
    string S,T;

    for (int i=0; i<3; i++) cin >> S[i]; 
    for (int i=0; i<3; i++) cin >> T[i];

    #適切
    string S,T;
    cin >> S >> T; 
```

#B-Power Socket
##正解
```c
#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int A,B;
    int i=0;
    cin >> A >> B;
    
    while((1+(A-1)*i)<B){
        i++;
    }
    cout << i;
    return 0;
}
```
##自分の誤答
```c
#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int A,B;
    int cnt;
    cin >> A >> B;
    
    for (int i=1; i<400; i++){
        if ((1+(A-1)*i)>=B){
            cnt=i;
            break;
        } 
    }
    cout << cnt;
    return 0;
}
```

#改善点(break＆i=0の無視)
後々、breakは自分が含まれているブロックのみ抜けるものなのかと、考えたがそれは異なる！
つまり、**ループの1ブロック**を抜けると考えていい！
問題はここではなく、**i=0を含めていない**が故のエラー(2つ)のみ…
物凄く時間の無駄だった…

#C - Lower
##正解

```c++
#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int ans=0,cnt=0;
    int n; cin >> n;
    vector <int> A(n); 
    for (int i=0; i<n; i++) cin >> A[i];
    
    for (int i=0; i<n-1; i++){
        if (A[i]>=A[i+1]){
            cnt++;
        }
        else {
            cnt=0;
        }
        ans=max(ans,cnt);

    }
    cout << ans;
}
```

#改善点(保存場所)
cntが条件により0に代わるため、配列でcntの数値を**複数保存**しなければいけないのかと最初考えたが、積んだ…
**max関数**を利用して、**一つの保存場所(ans)**にする方法を改めて学んだ。
Python3コードをVSCodeでリファクタリングする


# 何が問題か？
VSCodeにおいて、Pythonのリファクタリング機能はデフォルトでropeを利用する。実際、VSCodeでPython3をリファクタリングしようとするとropeをインストールするように促される。

ところが、これにそのまま従うとリネームなどで失敗してしまう。
https://github.com/microsoft/vscode-python/issues/52


原因としては、現時点でropeはPython3に完全に対応しておらず、しかも開発も停滞気味になってしまっているため。
https://github.com/python-rope/rope/issues/249

現状では、Python3ではropeを使わず、language serverを利用するのがよさそう。


# Language Server の有効化
ropeの代わりにlanguage serverを利用するやり方は簡単で、下記のように `settings.json` の `Python: Jedi Enabled` のチェックを外して、VSCodeを再起動するだけ。

![Screenshot from 2019-09-04 17-43-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67687/5ef45e95-c231-9be7-86c4-b9f4316fb124.png)

### 補足：なぜJediを無効化するか？

InteliSenseはデフォルトでJediを利用するが、厳密にはこれは

- Jedi
- rope (reafactor) 
- pylint (linter)

で構成されている。

Jediの代わりにlanguage serverを使うと、合わせてropeも無効になる

https://github.com/microsoft/vscode-python/issues/52#issuecomment-508173231
Availability Zone の ZoneId の値を確認する方法

# TL;DR
以下２つの方法で確認することができます。マルチ AZ 対応していても AWS アカウントごとに中身の ID が違うことがあるので、ここらへんは注意しておきたいところ。一応備忘録としてメモしておきます。
## aws-cli から確認する（中身は省略してます）
```
$ aws ec2 describe-availability-zones
{
    "AvailabilityZones": [
        {
            "ZoneId": "apne1-az1"
        },
        {
            "ZoneId": "apne1-az2"
        },
        {
            "ZoneId": "apne1-az3"
        }
    ]
}
```

## AWS Resource Manager から確認する
右下に表示してあります。
![スクリーンショット 2019 08 23 15.12.44(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156176/7f14abd3-9ca0-0e8a-5ee9-f7f0459fa2fb.png)


# 参考文献
- [AZ IDs for Your Resources](https://docs.aws.amazon.com/ram/latest/userguide/working-with-az-ids.html)
Action Text / フォームで添付した画像がAttachmentsテーブルへ保存されない

Action TextによるRich Text Areaの入力フォームにて添付した画像をpostした後に、show ビューで表示されない問題が起きました。
実際に下記のコマンドでMySQLへの保存状況を確認してみました。

```
$ rails db

mysql> select * from active_storage_attachments;
Empty set (0.01 sec)

mysql> select * from active_storage_blobs;
+----+------------------------------+------------------------------------+--------------+---------------------------------------------------------------+-----------+--------------------------+---------------------+
| id | key                          | filename                           | content_type | metadata                                                      | byte_size | checksum                 | created_at          |
+----+------------------------------+------------------------------------+--------------+---------------------------------------------------------------+-----------+--------------------------+---------------------+
|  1 | aaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1.jpg                              | image/jpeg   | NULL                                                          |    999999 | aaaaaaaaaaaaaaaaaaaaa== | 2019-08-24 08:50:19 |
.
.
.
```
Attachmentsテーブルは何も保存されていない状態で、Blobsテーブルにはフォームから送信した情報が保存されています。しかし、metadata(width, heightなどの情報)がNULLです。

仕組みはさて置き、
入力フォームに画像を添付する際にはクリップボタンを押して添付しますが、その際にRich Text Areaに一度クリックしてカーソルを合わせておく必要があるみたいです。
<img width="743" alt="1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484843/5450d5c7-c0b0-cd50-0971-7f9fbc773a5b.png">
もし、このメカニズムをご存じでしたら是非コメントをお願いします。
CWLで気をつけたい文字"ハイフン"について

# 概要

CWLのパラメータリファレンスを使っているだけなのに、なぜか `InlineJavascriptRequirement` が必要だというメッセージをみることがある。

# 結論

ハイフン `-` を使っていると、Javascriptとして解釈される可能性がある。
アンダースコア `_` を使うのがよいとのこと

# 参考情報

以下のようなエラーメッセージがでる。

```
ERROR Workflow error, try again with --debug for more information:
ramda01.cwl:14:14: Expression evaluation error:
                   Syntax error in parameter reference '(inputs.runfolder-dir)'. This could be due
                   to using Javascript code without specifying InlineJavascriptRequirement.
```
CentOSでApache Kafkaを動かす

#はじめに
CentOSにKafkaをダウンロードして、トピックを作りメッセージを送受信する手順です

#環境
CentOS 7.2.1511
※自分は、MacOS上のCentOSで動かしています
[macOS+Vagrant(CentOS)でpysparkを動かす](https://qiita.com/kihei171/items/b6f56a25a5632171640d)

#kafkaのダウンロードと解凍

```
$ sudo su -
# wget -O /tmp/kafka_2.12-2.3.0.tgz http://ftp.jaist.ac.jp/pub/apache/kafka/2.3.0/kafka_2.12-2.3.0.tgz
# tar -xzf /tmp/kafka_2.12-2.3.0.tgz -C /opt
# mv /opt/kafka_2.12-2.3.0 /opt/kafka
```

#Zookeeperをバックグラウンドで起動させる

```
# nohup /opt/kafka/bin/zookeeper-server-start.sh /opt/kafka/config/zookeeper.properties &
```

#kafkaをバックグラウンドで起動させる

```
# nohup /opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties &
```

#トピックの作成

```
# /opt/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic sample-topic
Created topic sample-topic.
```

#トピックの確認

```
# /opt/kafka/bin/kafka-topics.sh --list --zookeeper localhost:2181 sample-topic
```

#トピックにメッセージを送信する
※コンソールが立ち上がるので、メッセージ（なんでも良い）を打ち込んでください

```
# /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic sample-topic

>value1
>value2
>value3
```



#メッセージを受信する
※受信できていれば、先ほど打ち込んだメッセージが表示されます

```
# /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic sample-topic --from-beginning

value1
value2
value3
```
ログファイルをカンマ区切りにしたい

# やりたいこと
```hogehoge.log
YYYYMMDD XX:XX:XX USERNAME: aaaa bbbb cccc
```
こんなフォーマットのログファイルがあるとする。
これをUSERNAMEまでのスペース(aaaの手前)をカンマ区切りにしたい。

# 方法
sedコマンドでゴリ押す。力 is Power

```
sed -i -e "s/ \{1\}/,/1" hogehoge.log
```
これを必要回数繰り返す！

```hoge.sh
  for i in {1..3}; do
   sed -i -e "s/ \{1\}/,/1" hogehoge.log
  done;
```
完成！

#まとめ
もっとスマートな方法教えてください・・・
Process処理をデバッグ実行時にSystem.ComponentModel.Win32Exceptionが発生した場合の対処法

#この記事を書いた経緯
ある実行ファイル(exeName)を用いた非同期処理のプログラムは、Processを起動させる際の変数ProcessStartInfoを以下のように設定すればよい。

```C#
string args = ConstructArgs(); // なんらかの引数をメソッドで構築している
string exeName = ExeFileName; // 実行ファイル名
ProcessStartInfo psinfo = new ProcessStartInfo(exeName, args);
```
ローカルの環境で、新しくパスを指定した実行ファイルに対してこのような処理を書いていた際に
***"System.ComponentModel.Win32Exception (0x80004005): 指定されたファイルが見つかりません。"***
というエラーが出たので、その際の対処方法を記しておく。

#現象が起きた時の状況
開発用PCに、psql(PostgreSQLのターミナル型フロントエンド)をインストールし、システムのPath変数にpsql.exeの存在するフォルダのパスを設定し、そのままVSでの開発を続行した場合に、上記エラーが発生。
コマンドプロンプトを立ち上げてpsqlと打つとパス自体は正しく設定されている様子だったため、ネットを調べるが役に立ちそうな上は見つからず。

#結論
Windowsの再起動を行うことで、Processで実行される環境にpsqlへのPathが反映されるようになりました。
VSの再起動だけでは反映されなかったことから、Windows起動時に環境変数のスナップショットが読み込まれているのかと想像しているのだけれど、詳細は不明。
Windows7上のVS2015で発生した事象なので、Windows10環境では起きないのかもしれないが、Windowsの再起動という力技が時として役に立つことを再認識しました。

##2020/3/12 追記##
**Windows Server 2019のIISで動いている.NETアプリケーションからプロセスを起動した際にも同様の事象が発生しました。**
今回の場合もOSの再起動で事象が解決したことから、環境変数にパスを追加した場合にはなるべく早いタイミングでOS再起動を行わないと、その環境変数をあてにしたプロセスが正しく開始できない場合があるという認識を持つ必要があるようだ。パスの追加はアプリのインストール時に自動で追加される場合があるので、アプリの追加時にもOS再起動という多少過剰かもしれない対応を想定しておくことも考えられる。
特にサーバーの場合、新規アプリのインストールや環境変数の追加を行った場合にアプリ単体の起動確認で作業を完了してしまうと、次に再起動が可能となるタイミングを調整するのが難しい場合があるのでより注意が必要そうである。
Gatsby.jsでgatsby-source-contentfulプラグインを使用するとUnknown type "ContentfulFixed".エラー 

##エラー

Gatsby.jsでデータをContentfulからとってくるために、
gatsby-source-contentfulプラグインを利用して開発環境を立ち上げようとすると下記エラー。。。

>There was an error in your GraphQL query:

>Unknown type "ContentfulSizes". Did you mean "ContentfulPost", "ContentfulPostEdge", "ContentfulContentType", "ContentfulPostSortInput", or "ContentfulPostFieldsEnum"?

>File: node_modules/gatsby-source-contentful/src/fragments.js:4:55


どうやら`fragment.js`に原因があるようだが見に覚えがない。
　　
####環境
今回エラーが出たバージョンはそれぞれ
Gatsby version: 2.15.6
gatsby-source-contentful: 2.1.31

  
  
  
  
　　
　　


##解決策

海外フォーラムを見てると

>Contentfulに適当に画像をアップロードするとエラーが解消された

という謎ソリューションが。
嘘だろと思いつつ、試してみると直った。。笑  
  
  
  　　
  
  
  
####以下解決までの流れ。

1. 上部Navigationの`media` を選択
2. 右上の`Add Asset`から画像アップロード画面へ
3. 適当な名前をつけて画像をアップロード

そして

`yarn develop`

すると直ってる！！
　　
　　　
　　
裏技的な解決法で本質的じゃない気がするけど...
エラー解消に苦労した & 海外フォーラムにしか解決策書いてなかったため共有です。
51歳からのプログラミング　Android備忘　ActivityManagerメモ

#ActivityManager
>https://developer.android.com/reference/android/app/ActivityManager

extend Object

このクラスは、アクティビティ、サービス、プロセス、および相互関係に関する情報を取得する。

このクラスの多くのメソッドは、デバックやプロセス情報のために利用します。開発アプリの実行動作に影響を与えるような使い方はしないで下さい。これらのクラスはメソッドレベルで呼び出します。

このクラスは特別なケースでのみ利用し、アプリの開発では、このクラスを使わなくてもいいようにすべきです。しかし幾つかのメソッドはこの限りではありません。例えば、**isLowRamDevice()**は、メモリが不足するディバイスで実行しているかを検出し、それに応じて動作します。**clearApplicationUserData()**は、アプリにデータリセット機能を持たせます。

同様に、タスクスタックと関連するアプリを使うときには、**ActivityManager.AppTask**や、**ActivityManager.RecentTaskInfo**は、インナークラスを使う場合があります。

しかし、一般的には、このクラスのメソッドは、テストやデバック目的でのみ使うようにしてください。

##Nested classes
- **AppTask**<br>アプリのタスクを管理する
- **MemoryInfo**<br>利用可能なメモリ<br><font color="#099">ActivityManager#getMemoryInfo</font>
-  **ProcessErrorStateInfo**<br>エラー状態のプロセスに関する情報
-  RecentTaskInfo<br>ユーザー操作した最新のタスク情報
-  RunningAppProcessInfo<br>稼働中の<font color="#099">プロセス情報</font>
-  RunningServiceInfo<br>システムで稼働している最新のサービス情報を
-  RunningTaskInfo<br>システムで稼働している最新のタスク情報
-  TaskDescription<br>最新タスクリストにある現在のアクティビティで、設定や取得ができるアクティビティ情報

public static class ActivityManager.RunningServiceInfo
extends Object implements Parcelable

現在システムで実行中の特定のサービス情報を取得する。

#####<定数>
<table>
<tr><td>int</td>
    <td><strong>FLAG_FOREGROUND</strong></td>
    <td>サービスがフォアグラウンドプロセスとして稼働するよう要求される場合に設定する</td>
</tr>
<tr>
    <td>int</td>
    <td><strong>FLAG_PERSISTENT_PROCESS</strong></td>
    <td>サービスが永続的に稼働している場合に設定する</td>
</tr>
<tr>
    <td>int</td>
    <td><strong>FLAG_STARTED</strong></td>
    <td>サービスが明示的に開始されたときに設定する</td>
</tr>
<tr>
    <td>int</td>
    <td><strong>FLAG_SYSTEM_PROCESS</strong></td>
    <td>サービスがコアシステムプロセスで稼働してるときに設定する</td>
</tr>
</table>

#####■　フィールド

- public static final Creator<ActivityManager.RunningServiceInfo><br>**CREATOR**

- public long <br>**activeSince**<br>開始要求かバインドによってサービスが最初にアクティブを作った時、タイミング

- public int<br>**clientCount**<br>サービスに接続してるクライアントの数

- public int<br>**clientLabel**<br>システムコードでバインドされたサービスのための文字列で、ユーザーがクライアントを特定できるラベルを表示する

- public String<br>**clientPackage**<br>システムコードによってバインドされたサービスのために、バインドを保持するパッケージ。 

- public int<br>**crashCount**<br>サービスが稼働中にクラッシュした回数

- public int<br>**flags**<br>稼働中のフラグ

- poblic boolean<br>**foreground**<br>サービスがフォアグラウンドプロセスとして実行するよう要求したらtrue値をとる

- public long<br>**lastActivityTime**<br>サービスの最後のアクティビティが稼働した時（明示的な開始時かクライアントがバインドした時か）

- public int<br>**pid**<br>non-zeroなら、プロセスでサービスが稼働中

- public String<br>**process**<br>サービスが稼働するプロセス名

- public long<br>**restarting**<br>non-zeroなら、このサービスは最近実行されていないが、指定された時間に再起動される予定

- public ComponentName<br>**service**<br>サービスのコンポーネント

- public boolean<br>**started**<br>サービスが明示的に開始されていたらtrueを返す

- public int<br>**uid**<br>サービスを所有するUID

#####public constructors
ActivityManager.RunnableServiceInfo()

#####public Method
- describeContents()<br>特別なオブジェクトを説明する。Describe the kinds of special objects contained in this Parcelable instance's marshaled representation.

- readFromParcer(Parcel source)
- writeToParcel(Parcel dest,int flags)<br>Flatten this object in to a Parcel.
Railsでmysql2がbundle installできない

## こういうエラーが出る
```
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.
```

## 原因
2パターンある。
1. mysqlを起動してない
2. 必要なbundle configの設定をしていない

## 対処法
### mysqlを起動してない

以下のコマンドでmysqlサーバにログインできるか確認

```
$ mysql -u root
```

mysqlのコマンド自体が入ってない場合は以下のコマンド[mac/zsh/homebrew]
※@以下は任意

```
$ brew install mysql@5.7
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc
```

mysqlを起動

```
$ brew services start mysql@5.7
```

### 必要なbundle configの設定をしていない

```
$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
```

## 最後に

```
$ bundle install
```
VScode上のPlatformIO IDEでArduino Nano互換機(ELEGOOのCH340/ATmega340P)を使う

# はじめに

やりかたがわからず記事がまとまってなかったため残しておこうと思います。初心者なので間違いなどあれば教えていただけるとうれしいです。

# 結論

platformio.iniのboardをunoに設定する。

# 手順

## Arduino IDEとVScode、ドライバをインストールする

1. まず[Arduinoのサイト](https://www.arduino.cc)に行き、上のメニューバーからSOFTWARE->DOWNLOADSに移動し、Arduino IDEをダウンロード・インストールしてください。Windowsの方はWindows Appの方ではつかえないらしいのでzipをダウンロードしてください。
2. VScodeを持ってない人はインストールしてください。
3. ドライバは[ELEGOOのサイト](https://www.elegoo.com)からダウンロードでました。上のメニューのDOWNLOADに移動し、自分のデバイスを選択してダウンロードします。ELEGOOのドキュメントにはzipのものを使うと書いてありますが、Windowsではexeのものを開いてインストールすると使えました。

## VScode上にPlatformIOのExtensionをインストールする

VScodeを開き、左のメニューバーの"Extensions"（下図参照）に移動してください。
![Extensionsの場所](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107200/2340030d-3215-9c6d-bcd6-7897b7c242c6.png)
左上の検索窓に"platformio"と入力し、リストに表示されるPlatformIO IDEを選択してください。開けたらアイコンの右にあるInstallを押すとインストールが開始されます。インストールされると左のメニューバーにPlatformIOのアイコンが追加されます（上図でも追加されています）。

## 新規プロジェクト作成

※すでにプロジェクトを作成した方は次の章を参照してください。

PlatformIOがインストールされたと思うので左のメニューバーに追加されたPlatformIOのアイコンをクリックしてHomeを開いてください。
新規プロジェクト作成の際には右のQuick AccessからNew Projectを選択します。適当な名前を付けた後、Boardの欄ではArduino Unoを選択してください（Arduino Nano互換機を使用する場合もArduino Unoを選択してください。こうしないと書き込みできませんでした。）。FrameworkはArduinoを選択します。

## すでにプロジェクト作成した場合

プロジェクトの設定は`platformio.ini`というファイルに書かれています。`platformio.ini`は以下のようになっていると思います。

```ini:platformio.ini
[env:nanoatmega328]
platform = atmelavr
board = nanoatmega328
framework = arduino
```

ここの`board = nanoatmega328`を`board = uno`に変更してください。

# 参考

以下の投稿を参考にさせてもらいました。My problem was solved thanks to this post.
[https://community.platformio.org/t/nano-328p-boot-loader/3997/4](https://community.platformio.org/t/nano-328p-boot-loader/3997/4)
ｊｓ日付チェック

```js
	function isDate(str) {

		// フォーマット（YYYY/MM/DD）チェック
		if (!str.match(/^\d{4}\/\d{2}\/\d{2}$/)) {
			return false;
		}

		var yyyy = str.substr(0, 4);
		var mm = str.substr(5, 2) - 1; //1月は0から始まる為 -1 する。
		var dd = str.substr(8, 2);

		// 月,日の妥当性チェック
		if (mm >= 0 && mm <= 11 && dd >= 1 && dd <= 31) {

			var vDt = new Date(yyyy, mm, dd);

			if (isNaN(vDt)) {
				return false;
			} else if(vDt.getFullYear() == yyyy && vDt.getMonth() == mm && vDt.getDate() == dd) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}
```