OmniAICreator/Qiita-1.07M huggingface dataset:
いちばんやさしいpythonの教本のpybotをHerokuでデプロイする方法

# いちばんやさしいpythonの教本

[https://www.amazon.co.jp/いちばんやさしいPythonの教本-人気講師が教える基礎からサーバサイド開発まで-「いちばんやさしい教本」シリーズ-鈴木たかのり](https://www.amazon.co.jp/いちばんやさしいPythonの教本-人気講師が教える基礎からサーバサイド開発まで-「いちばんやさしい教本」シリーズ-鈴木たかのり/dp/4295002089)


Pythonを勉強するにあたり、progateに加えて、この教本を読んだ。
ローカル環境までのPybotの実装は比較的すんなり完了。（もちろん感動）

であれば、実際にWeb上にもデプロイしたい！と思い試行錯誤した記録をここに残します。

まず参考にしたのはこちらのページ

[いちばんやさしいpythonの教本のpybotをデプロイする方法](https://qiita.com/sr2460/items/9f65474a63cfb0a2e407)

もうね、そのままなんです。タイトルにはないけどこれも（Heroku）。
これそのままですが私なりにやったデプロイ方法を残します。

##1.環境構築

よくあるままです。
１ git
２ Python3
３ Heroku toolbelt
   →3 Herokuについてはユーザ登録必須。詳細は他の記事を参考にしてください。
４ 

まずコマンドプロントにて「cd （フォルダ名）」でpybotweb一式が格納されているフォルダを選択し、仮想環境を作成・有効化。



```ruby:
C:￥Users￥（ユーザー名）￥（フォルダ名）
python -m venv env
env￥Scripts￥activate.bat
#￥はここでは大文字ですが小文字です
```
pipを最新版にアップグレード

```ruby:
python -m pip install --upgrade pip
```

各パッケージのインストール

```ruby:
pip install requests
pip install bottle
pip install wikipedia
```
後で使うので各パッケージのバージョンをそれぞれメモしておく。


##2.コード作成
教本で作ったPybotweb.pyを若干書き換える必要があります。
私は試行錯誤の時に使ったサンプルコードを使用しました。

```ruby:pybotweb.py
 import os  #一行目に追加
  #run(host='localhost', port=8080, debug=True)  //これをコメントアウト
  run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000))) #←最終行に追加
```
Procfileの作成。コマンドプロント上で可能です。ちなみに拡張子は不要。

```ruby:
echo web: python pybotweb.py > Procfile
```
requirements.txtの作成。コマンドプロント上で可能です。ちなみに拡張子は.txt

```ruby:
pip freeze > requirements.txt
```

runtime.txtの作成。python3のバージョンを調べておきましょう。
「python --version」でわかります。ちなみにあってもなくてもいいものらしい。一応作りました。

```ruby:
echo python-3.8.1(バージョンを入力) > runtime.txt
```

##3.Heroku（へろく）でデプロイ
ログインとアプリの作成。ちなみに無料アプリは５個までです。
６個目を作ろうとするとエラーが出ます。

```ruby:
heroku login
heroku create
```

gitの初期ファイルの作成

```ruby:
git init
```

リモートリポジトリの作成



```ruby:
heroku git:clone -a (heroku createしたときにつけられたアプリ名称)
git add .
```

ここからが私がつっかえたところ。
pybotwebには、「pybotweb.py」だけではなくその他もろもろtxtファイルならなんやらがあると思います。
それらを全部gitに追加する必要がありました。

```ruby:
git add (pybotweb.py以外のすべてのファイル)
```

そこからは一般的なやり方でOK.

```ruby:
git commit -m "initial commit"
git push heroku master
```

ここでクリアしたらついにデプロイ。

```ruby:
heroku open
```
あとは
https://qiita.com/sr2460/items/9f65474a63cfb0a2e407
の通りです。
Webサーバー上にあなたのpybotが乗っかっている！
感動もひとしお。

次はLinebot化を目標にします。
【Kotlin】JUnit5でJUnit4のRuleを使う方法

2020年1月現在、JUnit4からJUnit5への過渡期の中でその両者が混合しているようなソースコードはそれなりにあるかと思います。
もしくは今後リファクタリングの際に4から5へアップグレードする必要があるかもしれません。

しっかりお金がもらえて時間があるなら一から作り直すのもありですが、世の中そんなに上手くいくことの方が少ないです。
なので今回はJUnit5で廃止されてしまった`@Rule`を場当たり的に応急処置としてとりあえず対応するための方法をご紹介します。

# その前に
JUnit5のドキュメントには「今後JUnit5で新しい拡張機能を開発する場合は、JUnit4の`@Rule`ではなく、JUnit Jupiterの`Extension Model`を使ってね。」と書いてあります。

>However, if you intend to develop a new extension for JUnit 5 please use the new extension model of JUnit Jupiter instead of the rule-based model of JUnit 4.

https://junit.org/junit5/docs/current/user-guide/#migrating-from-junit4-rule-support

なので間違ってもこれから記載する方法でJUnit4の`@Rule`をずっと使い続けて良いわけではないので、その点は注意してください。

# 方法
まずは`juint-jupiter-migrationsupport`を入れます。

```
testImplementation("org.junit.jupiter:junit-jupiter-migrationsupport:5.5.2")
```

そうしたら`@Rule`を使用しているクラスに`@EnableRuleMigrationSupport`アノテーションを付けます。

```kotlin
@EnableRuleMigrationSupport
class OldJunit4Tests {
    
    @get:Rule
    val tempDir = TemporaryFolder()
    
    @Test
    fun `TemporaryFolderを使うテスト`() {
        // doSomeThing
    }
}    
```

**以上です。**

`TemporaryFolder`ぐらいだったら`@TempDir`が追加されたのでそちらを使用すれば良いのですが、プロジェクトの都合上Ruleを大量に定義していた場合などはこの方法で乗り切ると良いでしょう。

# おまけ
JUnit5では`@Ignore`がなくなり、代わりにそれと似た機能を持つ`@Disabled`が使用されるようになりました。
そちらも似たような方法で対処が可能です。

`@Rule`の時と同様に`juint-jupiter-migrationsupport`を入れ、`@ExtendWith(IgnoreCondition.class)`または`@EnableJUnit4MigrationSupport`を使用します。

```kotlin
// @ExtendWith(IgnoreCondition.class)
@EnableJUnit4MigrationSupport
class OldJunit4Tests {
    
    @get:Ignore
    @Test
    fun `testWillBeIgnored`() {
        // doSomeThing
    }
}    
```
VirtualBox上にCentOSをインストールする際、「セッションが開けませんでした」と出た時の対処法

Hyper-Vを無効化しているのに、VT-xが有効にならなくて困っていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533444/a84fae81-a604-445a-5224-df915072663f.png)

表示上は無効化されているはずなんだけどな・・・

##解決策
１．コマンドプロンプトを管理者で実行し、以下を入力
>dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

２．再起動&VirtualBoxで起動

![ce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533444/2bab9189-d671-b032-9788-fd45008b6063.png)


内部的には、無効化されていなかったみたいです。
【Kotlin】リフレクションでcompanion objectに定義された関数を呼び出す

# TL;DR
リフレクションで`companion object`に定義された関数を呼び出す場合、通常の引数の他に`companion object`のインスタンスも渡す必要があります。

# やること
以下のクラスからリフレクションを用いて`@SampleAnnotation`を振った関数を呼び出します。

```kotlin:対象クラス
data class SampleClass(val hoge: String, val fuga: String) {
    companion object {
        @SampleAnnotation
        fun creator(str: String): SampleClass {
            return SampleClass(str, str)
        }
    }
}
```

# やり方
やり方は以下の通りです。

コツというか自分がハマったポイントは、`SampleClass::class.companionObject`を指定した場合取れるのが`companion object`のクラスで、これを`call`に渡しても動かないという点です。
渡す必要があるのはインスタンスです。

```kotlin
// コンパニオンオブジェクトのインスタンスを取得
val companionObjectInstance: Any = SampleClass::class.companionObjectInstance!!
// 実行対象の関数を取得
val targetFunction: KFunction<*> = companionObjectInstance::class.functions.single {
    it.annotations.any { annotation -> annotation is SampleAnnotation }
}
val result: Any? = targetFunction.call(companionObjectInstance, "適当な引数")
```
【Rails】Railsとdeviseのデフォルトバリデーションを解除する方法

# はじめに
知人がemailの正規表現を使ったバリデーションを自ら作成して設定しようとした際、うまく設定を反映させられませんでした
いろいろ調べたところRailsのバリデーションやらdeviseのバリデーションやらが絡んでいたためでした
今まで知らないで使ってたことなど勉強になったことが多かったので整理してまとめておきます

# 対象読者
- form_withやform_forが何かをなんとなく理解している人
- バリデーションが何かをなんとなく理解してる人

# 環境
- Ruby: 2.5.1
- Rails: 5.2.3

# 状況
- 正規表現で~@~.~という形じゃないとアドレスとして登録できないようなカスタムバリデーションを作成した
- そのバリデーションを有効にしたが、下記の画像のような謎のバリデーションにひっかかった

<img width="1440" alt="スクリーンショット 2020-01-25 12.30.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/ac5d26a8-6de0-da81-4e04-488135481beb.png">

自分で作ったカスタムバリデーションじゃないのがでてきた。。。ってなったんですが
結論、Railsのバリデーションとdeviseのバリデーションを解除してやれば、目的通り自作のカスタムバリデーションのみ反映させられました

以下に、やり方と解説を記載します

### Railsのバリデーション設定
Railsでメールアドレスやパスワードをユーザーに入力させるとき、入力フォームを作成するためにform_forやform_withを使いますよね。こんな感じで

```ruby:new.html.haml
= form_with(model: @user, local: true, class: 'hoge') do |form|
  = form.label :email, 'メールアドレス'
  = form.email_field :email
```

ここで記載したemail_fieldがさっきのバリデーションの正体です
このように記載することでRailsはこの入力フォームをemailだと認識して、簡単なバリデーションを自動でかけるようになっているみたいです

なので先ほどの記載を以下のように書き換えるとRails側でバリデーションをかけないようにできます

```ruby:new.html.haml
#変更前
= form.email_field :email

#変更後
= form.text_field :email
```
<br>
結果がこちら
<img width="1440" alt="スクリーンショット 2020-01-25 13.03.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/47f52589-db3b-cd19-b43c-6b26bfa8dc29.png">


先ほどのバリデーションは消えましたが、フラッシュメッセージにバリデーションが2つ出てきてしまいました

### deviseのバリデーション設定
今のままだとバリデーションが2つ出てきてしまいます。先ほどの画像の左側がdeviseのバリデーション、右側が自分で設定したカスタムバリデーションです
今回は自分が設定したカスタムバリデーションだけ表示させたいので、deviseのバリデーション設定を解除します

通常、deviseをインストールした場合、モデル内に下記のような記述があると思います

```ruby:models/user.rb
devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
```

この:validatableがdeviseのバリデーションなので、この記述を消します

```ruby:models/user.rb
devise :database_authenticatable, :registerable,
         :recoverable, :rememberable
```


これでdeviseのデフォルトのバリデーションも解除できました
<br>
結果はこちら
<img width="1440" alt="スクリーンショット 2020-01-25 13.05.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/45ee98ce-c4b3-5bb3-16e8-9ec358b5131e.png">


ちゃんと自分で設定したバリデーションだけが適用されていますね
*カスタムバリデーションの作成の仕方は最後の参考URLに載せておきます


# まとめ
- Railsのemail_fieldではメールアドレス用の簡単なバリデーションをかける仕様になっている
- deviseではデフォルトで簡単なバリデーションをかけるようになっている
- バリデーションの優先順位はemail_field > devise, カスタム(自作)
- カスタムバリデーションのみ適用させる場合は、text_fieldを使い、deviseの:validatableを削除する


Railsもdeviseも知らないところで色々と機能してくれてますが、少しずつそういう部分を理解していくことで、色々応用できそうですね
特にdeviseは便利ですが、意味を理解していないで使っている部分が多いと思ったので今回のようなケースはかなり勉強になりました

余談ですが、password_fieldは入力した文字を"●"で秘匿化してくれてます

間違いなどがあれば指摘していただけると助かります
少しでも参考になった、勉強になったという方がいらっしゃれば幸いです

# 参考URL
自作のカスタムバリデーションを作成する方法
- https://guides.rubyonrails.org/active_record_validations.html
- https://qiita.com/kouheiszk/items/215afa01eeaadbd99340
javascriptでテキスト音声読み上げ

# はじめに
javascriptでお手軽に音声読み上げできます。
Web Speech Synthesis API を使います。無料なのがうれしい(^^)

![20200125_speechAPE_speak.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423803/702036db-f406-17a6-745c-24fa7e9b2669.jpeg)



自分用メモまで。お勉強中です

# 環境　
windows10
python3 (anaconda)　
（※動作確認まで　ローカルホスト起動できれば、pythonでなくruby, apacheなどでもよいみたいです）

ブラウザ MicrosoftEdge (ver44?)
ブラウザ Chrome(ver74?)


#ソースコード
下記HTMLを作成して、
C:\Users\自分のユーザーのフォルダ\sample.html として保存します。

sample.html

```
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>音声読み上げ</title>
</head>
<body>
<h1>音声合成</h1>
<input class="text" value="Speech API を使おう。" style="width: 80%; height: 40px; font-size: 40px;" />
<button onclick="speak()" style="height: 30px; width: 80px;">speak</button>

<!-- スクリプト部分 -->
<script>
function speak(){
  var speak   = new SpeechSynthesisUtterance();
  speak.text  = document.querySelector('.text').value;
  speak.rate  = 1; // 読み上げ速度 0.1-10 初期値:1 (倍速なら2, 半分の倍速なら0.5, )
  speak.pitch = 0;　// 声の高さ 0-2 初期値:1(0で女性の声) 
  speak.lang  = 'ja-JP'; //(日本語:ja-JP, アメリカ英語:en-US, イギリス英語:en-GB, 中国語:zh-CN, 韓国語:ko-KR)

  sleep(2000);
  speechSynthesis.speak(speak);

}

function sleep(time){
  var date_1 = new Date().getTime();
  var date_2 = new Date().getTime();
  while (date_2 < date_1 + time){
    date_2 = new Date().getTime();
  }
  return;
};
</script>

<body>
<html>
```

＃動作確認
ローカルWEBサーバー起動 
※ webサーバー経由必須です。単体 sample.html だけでは機能しません。

```
python -m http.server 8080
```

ブラウザでアクセスします。
http://localhost:8080/sample.html

ボタンをクリックするとテキストボックスの中身を読み上げます。

# これからしたいこと
・声の種類をいろいろ変更できるようにしたい
など


<!--
・GitsHubへのアップ

・音声認識と組み合わせれば, 英語対話とかできそう。
　→発話完了されたら、偶数のラインだけ読んでいく。
　→クリックされたものを読み上げする。

・音声認識と、イラスト組み合わせて　適当なインタラクティブアニメが作れてしまう
　案①　A「おーい」→PC「はーい」、B「お茶」→PC「はいはい」なんていう
　案②　A「おーい」→PC イラスト表示　扉を開けたらランダムにキャラクター
         「おーい　熊本」「おーい鹿児島」言語認識できたら→ご当地キャラクターが表示される（種類もいろいろとか）
　　　　教育用にもなる、県を覚えるとか。歴史を覚えるとか。

・単体でも声の速度を最低の０にするとまるでおばけの声みたいです。
　絵を付けて、声のサイコロをつくるのはおもしろそうかも。ちょっと遊んでみたいです。

・Eスポーツ　だるまさんが転んだ　（脳トレ）
　　　画面をプロジェクタで大写しに
　　　→だるまさんが　の音声認識したら、　青、赤、黄など色ライト
　　　→転んだ　「青」を人が読んで、そこに、大勢がタッチする　（ついでにその色にアニメーションエフェクト）　
　
　　　→プロジェクタで　地上に表示とかできれば　足タッチができるし広い空間で運動っぽいことができる

　　　→kinectでどこタッチを認識できれば、その組み合わせでよりインタラクティブになる
　　　
　　　→IoT連携でライト点灯できれば、より広い空間で運動っぽくできるし、インタラクティブになる。

・録音APIとの連携
　検索ワード　javascript スピーカー　録音
https://ja.stackoverflow.com/questions/49519/web%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E5%87%BA%E5%8A%9B%E3%81%95%E3%82%8C%E3%82%8B%E9%9F%B3%E3%82%92javascript%E3%81%A7%E9%8C%B2%E9%9F%B3%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

-->


# 参考
参考 ソースコード:　【javascriptで実装！】Web Speech Synthesis APIを使ってブラウザで音声読み上げをしよう 
https://shinmedia20.com/javascript-speech-synthesis 

参考 APIの使い方: Webページでブラウザの音声合成機能を使おう - Web Speech API Speech Synthesis 
https://qiita.com/hmmrjn/items/be29c62ba4e4a02d305c
(コマンド化)AWS CLIにおけるMFA認証

概要
---
AWSマネジメントコンソールにアクセスするためのIAMユーザーにMFAを設定している場合、
同ユーザーにてAWS CLIを使う時にもMFAによる認証が必要になるけど、
すぐに忘れちゃうのでコマンド化した。


ざっくりセットアップ手順
---
1. アクセスキーの作成（まだやってない人は）
2. .bashrcに以下追記
3. ログインし直す or `source ~/.bashrc`

```bash:.bashrc


function AWSCLIINIT() {
    unset AWS_ACCESS_KEY_ID
    unset AWS_SECRET_ACCESS_KEY
    unset AWS_SESSION_TOKEN
    aws configure

    mfa_arn=`aws sts get-caller-identity --query 'Arn' --output text 2>/dev/null | sed -e "s/:user\//:mfa\//g"`
    if [ -n "$mfa_arn" ]
    then
        echo "YourMFA :"$mfa_arn
        echo -n INPUT YourMFA-Code :
        read mfa_code

        get_session_token=`aws sts get-session-token --output text --serial-number $mfa_arn --token-code $mfa_code 2>/dev/null`

        if [ -n "$get_session_token" ]
        then
            set -- $get_session_token
            export AWS_ACCESS_KEY_ID=$2
            export AWS_SECRET_ACCESS_KEY=$4
            export AWS_SESSION_TOKEN=$5
        else
            echo "MFA ERROR"
        fi

    else
        echo "aws configure is wrong"
    fi
}

```

使い方
---
`AWSCLIINIT`

- 中で`aws configure`をやってるので必要に応じて入力
- mfaを聞かれるので入力

```bash
$ AWSCLIINIT 
AWS Access Key ID [********************]: 
AWS Secret Access Key [********************]: 
Default region name [ap-northeast-1]: 
Default output format [json]: 
YourMFA :arn:aws:iam::123456789012:mfa/abcdefg
INPUT YourMFA-Code :123456
$
```

エラーがでなければ認証成功。環境変数にトークンなどがセットされます。


こんな感じ。
---
MFA認証前

```bash

$ aws iam get-user

An error occurred (AccessDenied) when calling the GetUser operation: User: arn:aws:iam::123456789012:user/abcdefg is not authorized to perform: iam:GetUser on resource: user abcdefg with an explicit deny

```

本コマンド利用時

```bash

$ aws iam get-user
{
    "User": {
        "UserName": "abcdefg", 
        "PasswordLastUsed": "2020-01-25T01:16:10Z", 
        "CreateDate": "2019-12-10T02:55:57Z", 
        "UserId": "AAAAAAAAAAAAAAAAAA", 
        "Path": "/", 
        "Arn": "arn:aws:iam::123456789012:user/abcdefg"
    }
}

```
EC2 でアクセスキーを設定することなく、ロールによりコマンドを実現する方法

EC2 から s3 バケットを操作したいです。
例えば、バケットを新規作成してみます。

```console
$ aws s3 mb s3://<バケット名>
make_bucket failed: s3://<バケット名> Unable to locate credentials
```

ここで、aws configure コマンドを実行して credentials を設定するかと思います。
しかしながら、.aws/config に記録されてしまい、セキュリティ的によろしくないです。

以下を実行します。
要すれば、Access Key を設定しないことが大事です。

```console
$ aws configure
AWS Access Key ID [None]: <そのまま Enter>
AWS Secret Access Key [None]: <そのまま Enter>
Default region name [None]: ap-northeast-1
Default output format [None]: <そのまま Enter>
```

ファイルの中身を確認します。

```console
$ less ./aws/config
[default]
region = ap-northeast-1
```

アクセスキーの記述はありません。

ここで、ロールを作成して、EC2 にアタッチします。
「IAM」-「ロール」-「ロールの作成」-「このロールを使用するサービスを選択」-「EC2」-「次のステップ:アクセス権限」-「ポリシーのフィルタ」- 「検索窓に s3 と入力」-「AmazonS3FullAccess にレ点を入れる」-「ポリシーの作成」
（細部省略）
要すれば、S3FullAccess（一例）という名前でロールを作成します。

では、作成したロールを EC2 インスタンスにアタッチします。

EC2 でインスタンスを選択し、以下を確認します。
IAMロール （空白）

設定
「アクション」-「インスタンスの設定」-「IAMロールの割り当て/置換」-「IAMロール」ー「作成したロール（S3FullAccess）を選択し適用」

試しに、ロールをアタッチしたインスタンス で以下を実行して、バケットを作成してみます。

```console
$ aws s3 mb s3://<バケット名>
make_bucket: <バケット名>
```

成功しました。

（参考）
https://aws.amazon.com/jp/blogs/news/easily-replace-or-attach-an-iam-role-to-an-existing-ec2-instance-by-using-the-ec2-console/
Azure Traffic Managerの構築フロー（簡易）

## 構成
Traffic Manager　⇒　APIM　⇒　WebApps(Functions)

## 構築の流れ
* プロファイルの作成
* エンドポイントの作成
  * 外部エンドポイントを選択
  * ターゲット　バックエンドのFQDNを入力
  * カスタムヘッダー　ApiKeyを不要としているのであれば無しで良い

　⇒モニター状態がオンラインになればOK

* 構成
  * パス：ヘルスチェックのパスを入力
  * カスタムヘッダー：ヘルスチェックにApiKeyを入力させるのであれば必須(host:rg01-jaea-apim-pub1.azure-api.net,Ocp-Apim-Subscription-Key:4157c73e1bcb445a953bbc623472d7a6)
* ここで②のURLにアクセスするも503エラー
  * どうやらAPIMのサーバ証明書のCNと一致していないことが原因らしい
  * [Azure Traffic Manager returns 503 but Cloud Service is working, what is missing?](https://stackoverflow.com/questions/34727977/azure-traffic-manager-returns-503-but-cloud-service-is-working-what-is-missing)

* キーコンテナで(CN=*.trafficmanager.net)を作成

* APIMのカスタムドメインに上記証明書を設定したゲートウェイを作成
  * 最初は403エラーとなっていたが、しばらく待つと正常に画面が表示された

## 参考資料
[Azure Traffic Manager を使ってサービスの可用性とデータの局所性を強化する](https://docs.microsoft.com/ja-jp/learn/modules/distribute-load-with-traffic-manager/)
⇒負荷分散のフローが可視化されているので理解しやすい

以上
C++　深さ優先探索(DFS)

#問題１　部分和問題
整数a[0],a[1],.....,a[n-1]が与えられます。その中からいくつか選び、その和ちょうどｋにすることができるか判定しなさい。

【制約】
・1 <= n <=20
・-10^8 <= a[i] <= 10^8
・-10^8 <= k <= 10^8

```c++
#include<bits/stdc++.h>
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define rep(i, n) FOR(i, 0, n - 1)
using namespace std;

int a[10010];
int n,k;

//iまでsumを作って、残りi以降を調べる
bool dfs(int i,int sum){
    //n個決め終わったら、今までの和sumがｋと等しいかを返す
    if (i==n) return sum==k;
    
    //a[i]を使わない場合
    if (dfs(i+1,sum)) return true;
    
    //a[i]を使う場合
    if (dfs(i+1,sum+a[i])) return true;
    
    //a[i]を使う使わないに拘わらず、ｋが作れないのでfalseを返す
    return false;
}

int main(){
    cin >> n;
    rep(i,n) cin >> a[i];
    cin >> k;
    if (dfs(0,0)) printf("Yes\n");
    else printf("No\n");
}
```

#~解法~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/df03afdb-9f1d-eddd-9494-571626212440.png)

左から攻せて、ひとつずつ条件を満たしているか確認する！
**深さ優先探索**は**再帰関数**で表すことが多い！

#問題2　Lake Counting
大きさがN×Mの庭があります。そこに雨が降り、水たまりが出来ました。水たまりは8近傍で隣接している場合につながっているとみなします。
全部でいくつの水たまりがあるでしょうか？
（水たまり："W" ,土："."）

```c++
#include<bits/stdc++.h>
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define rep(i, n) FOR(i, 0, n - 1)
using namespace std;

int N,M;
char field[10010][10010];

//現在位置
void dfs(int x,int y){
    //今いるところを"."に置き換える
    field[x][y]='.';
    //移動する8方向をループ
    for (int dx=-1; dx<=1; dx++){
        for (int dy=-1; dy<=1; dy++){
            //x方向にdx y方向にdy移動した場所を(nx,ny)とする
            int nx=x+dx,ny=y+dy;
            
            //①nxとnyが庭の範囲内かどうか and ②field[nx][ny]が水たまりかどうかの２つを判定
            if (0<=nx && nx<=N && 0<=ny && ny<M && field[nx][ny]=='W') dfs(nx,ny);
        }
    }
    return ;
}

int main(){
    int ans=0;
    for (int i=0; i<N; i++){
        for (int j=0; j<M; j++){
            if (field[i][j]=='W'){
                //Wが残っているならそこからdfsを始める
                dfs(i,j);
                ans++;
            }
        }
    }
    printf("%d\n",ans);
}
```

#~解法~
適当な***'W'***から始めて、そこからつながっている部分を「***'.'***」に置き換えるという操作を繰り返す！
【Docker】TypeError: bytes-like object is required, not 'str'

## 概要
`docker-compose up -d` を実行すると以下のエラーが発生する。

```bash
TypeError: bytes-like object is required, not 'str'
```
**バージョン**
Docker: 19.03.5
docker-compose: 1.25.1

## 原因
コンテナ起動時にスローされるエラーの形式が変わったため出るエラーのようです。
docker-composeのバージョン1.25.0と1.25.1で確認されていました。


## 解決方法

docker-composeのアップグレードを行なったら解決しました。

```bash
$ curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```
1つのbatファイルで乱数生成する方法+0埋めver

#概要
Windows環境で簡易テストを実施時、乱数を引数に入れたい時があります。
`start`や`call`で別ファイルを呼ばなくてもよい方法です。

##乱数生成方法
```bash:random.bat
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /l %%i in (1,1,10) do (
for /f "usebackq" %%i in (`echo !random!`) do echo %%i
)
```

##結果

```bash
> random.bat
4718
9387
21150
28469
26828
1503
26958
18045
12847
22602
```

##頭0埋めしたい場合
以下のように書き換えます。

```bash:random.bat
@echo off
setlocal ENABLEDELAYEDEXPANSION
set num=0000
set result=
for /l %%i in (1,1,10) do (
set result=!num!!random!
for /f "usebackq" %%i in (`echo !result:~-5^,5!`) do echo %%i
)
```

##結果

```bash
> random.bat
02040
06523
23965
21666
23812
05243
29043
12515
03643
01833
```
devise 導入直後のエラー（docker）

#概要
[[*Rails*] deviseの使い方（rails4版）](https://qiita.com/cigalecigales/items/73d7bd7ec59a001ccd74)
このサイト↑に沿ってdevise導入し、そこでこのエラーが発生しました。
その対処法を記載をしています。

#エラーの内容
<img width="520" alt="スクリーンショット 2019-12-26 23.25.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504349/ee9c28fd-20cd-a18f-4f89-f3ac64771d6d.png">

ルーティングエラー
Rails routes で調べても特に問題なさそう・・
[Rails: deviseをインストールした後のエラー](https://qiita.com/penguin_note/items/93b00c09c0da1f1a0eab)
これ↑を実装したが、エラー治らず・・・

#対処法
問題は恐らくdockerなのでは？となり、とりあえず
docker再起動→ローカルを再起動

docker再起動方法
右上にあるクジラを押す→restart　完了！！
<img width="240" alt="スクリーンショット 2020-01-25 14.21.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504349/559d27f7-12e0-1e70-4174-e7a8a067e4bc.png">

それでもう一度localhostをリロードすると治りました。
お疲れさまでした！！
EC2上のWindows ServerへMacbookからログインする方法


## 目的
MacbookからEC2インスタンス（WindowsServer 2016）へMacbookからログインする方法について纏めます。以下にてサーバ側（ECS2インスタンス側）とクライアント側（Macbook側）で分けて具体的な手順を解説していきます。


## サーバー側手順

### プライベートキーの検索

Amazon EC2コンソール画面からEC2インスタンスを右クリックし、Windowsパスワードの選択をクリックする。


<img width="470" alt="スクリーンショット 2020-01-25 14.17.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/f8af75f6-87b7-50aa-3d8c-0ae81f86ea51.png">


そのインスタンスに紐づいているpemファイルの情報をcopy and pasteすると、以下画面のように接続情報が表示されます。

![20140816144048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/b013161e-0f3a-4405-8fa0-38765b435340.png)

## クライアント側手順

### Microsoft Remote Desktop（Version 10）から接続

Microsoft Remote Desktopをインストールし、サーバ側で確認した情報を入力します。

<img width="1249" alt="スクリーンショット 2020-01-26 11.50.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/02efdad2-422c-7a7e-7537-3a19e9e6acdc.png">


## 接続確認

以下のようにWindows Serverへログインすることができました。

<img width="1680" alt="スクリーンショット 2020-01-25 14.32.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/93b87256-72d9-28e6-aa1a-da691f92b151.png">
python並列/非同期実行備忘録

# 切掛
Pythonの非同期実行のネタは似たようなもの(公式の翻訳/再編集?)が多かった。
頭が固くなったオジサンには厳しいので、実例を探して複数言語のサイト見て、試行錯誤してやっと動いたので、肝だけを纏めてみた。

# 概要
例は全部Windowsで外部コマンド実行のパターン
解説はほぼなし。

## PIDでチェック
簡単でいいね。オジサンがパッと思いついて作ったのがこれ。

``` python:pid.py
import subprocess
from time import sleep
procs = {}
for h in servers:
    p = subprocess.Popen(["some", "command"], ...)
    # subprocess.runでstdout=PIPEでも動きそうだが未調査
    procs[p.pid] = p

while procs:
    for pid in list(procs):
        if procs[pid].poll in not None:
            del procs[pid]
    sleep(x)
```

procsは端からpのlistにしておいてもいいけど、
このやり方だと最後に空になるのがお気に入り。

## 並列1(STDOUT不要)
実行する対象が何かを生成してくれる場合はこれでOK。
run関数が非同期実行対象。
最初に作ったときはrun_until_completeで呼び出すからcreate_subprocess_shellだけで待ってくれるのかと思っていた。

``` python:async1.py
import asyncio
from asyncoio.subprocess import DEVNULL

async def run(param):
    # 以下2つどっちでも動く
    p = await asyncio.create_subprocess_exec(*["some", "command", param],
           stdout=DEVNULL, ...)
    p = await asyncio.create_subprocess_shell("some command %s" % param,
           stdout=DEVNULL, ...)

    await p.wait()

if sys.platform.startswith('win'):
    loop = asyncio.ProactorEventLoop()
    asyncio.set_event_loop(loop)
else:
    loop = asyncio.get_event_loop()

funcs = asyncio.gather(*[run(p) for p in parameters])
loop.run_until_complete(funcs)
```

## 並列2(STDOUT必要)
実行対象の標準出力を利用して何かをする場合はこっち。
ただし結果はmainのretに終了順に返ってくるので、それに耐えられないと駄目。

``` python:async_stdout.py
import asyncio
from asyncoio.subprocess import PIPE
import sys

async def run(param):
    p = await asyncio.create_subprocess_shell("some command %s"  param,
            stdout=PIPE, ...)
    return await (p.communicate())[0].decode('code').splitlines()

async def main():
    funcs = asyncio.gather(*[run(p) for p in parameters]*)
    for f in asyncio.as_completed(funcs):
        ret = await f

if sys.platform.startswith('win'):
    loop = asyncio.ProactorEventLoop()
    asyncio.set_event_loop(loop)
else:
    loop = asyncio.get_event_loop()

loop.run_until_complete(main())
```

# 備考
なんか似たようなことばかり書いている気がする。
次はopenpyxlのことでも書くか。
SQSメッセージ数に応じてSpotFleetでインスタンスをAutoScalingする。

SQSメッセージの数に応じてスポットインスタンス数を調整したい。

## SQSの作成
SQSキューの作成

```
$ aws sqs create-queue --queue-name YOUR_QUEUE_NAME
{
    "QueueUrl": "https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxx/YOUR_QUEUE_NAME"
}
```

## CloudWatchAlarmの設定
CloudWatchコンソールから`ApproximateNumberOfMessagesVisible`メトリクスを選択。
アラームの閾値は0以上として設定し、メトリクス名をつけて作成。（`YOUR_METRICS_NAME`とする。）

※ アラームの閾値はいくつで設定しても良いが、ここで設定した数値以下の値をAutoScalingのスケーリングポリシーで取得することはできない。

## SpotFleetの設定

### リクエストの作成
EC2コンソールのナビゲーションペインから「スポットリクエスト」を選択し、[スポットインスタンスのリクエスト]を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/872aa7e3-4fcc-dbf7-913e-6a433f154eca.png)

※上記のリクエスト画面は最新版ではない。
※最新版では「ターゲット容量を維持する」にチェックを入れた上で合計ターゲット容量を0に設定する。（そうでないと0を設定できない。)

追加設定から「EBS最適化インスタンスを起動」や「インスタンスストアのアタッチ」が選択できる。
セキュリティグループやIAMインスタンスプロフィールを適当に設定する。

作成後、タブから「AutoScaling」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/cbee47f6-dead-6839-2a66-28c89d96f2d4.png)

### スケーリングポリシーを設定
ポリシートリガーに`YOUR_METRICS_NAME`を指定し。
容量の変更から、段階的なインスタンス数を選択。
ここで`YOUR_METRICS_NAME`に指定するキューメッセージするに基づくスケーリングのルールを指定できる。

## (Option)インスタンスの終了2分前イベントを受け取る
CloudWatchEventsから以下を設定する。

__イベントソースの設定__
イベントパターンを選択し、サービス名`EC2`、イベントタイプ`EC2 Spot Instance Interrupt Warning`を指定する。

__ターゲットの設定__
ここで、イベント取得時に起動したいlambdaやSNSを指定する。

なお、イベント発生時に受け取ることができるメッセージは以下。

```
{
  "version": "0",
  "id": "12345678-1234-1234-1234-123456789012",
  "detail-type": "EC2 Spot Instance Interruption Warning",
  "source": "aws.ec2",
  "account": "xxxxxxxxxxxx",
  "time": "yyyy-mm-ddThh:mm:ssZ",
  "region": "ap-northeast-1",
  "resources": [
    "arn:aws:ec2:ap-northeast-1:xxxxxxxxxxxx:instance/i-1234567890abcdef0"
  ],
  "detail": {
    "instance-id": "i-1234567890abcdef0",
    "instance-action": "action"
  }
}
```

終了予定のインスタンスは`detail`内の`instance-id`。

## テスト
### AutoScalingのテスト
SQSキューにメッセージをエンキューする。

```
$ aws sqs send-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/YOUR_QUEUE_NAME --message-body "testMessage"
```

CloudWatchAlarmから`ApproximateNumberOfMessagesVisible`メトリクスを確認する。
しばらくしてEC2コンソールからスポットインスタンスの数を確認。適切にスケールしていれば成功。

### (Option)通知のテスト
キューを取得・削除する。

```
$ aws sqs receive-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/YOUR_QUEUE_NAME

$ aws sqs delete-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/YOUR_QUEUE_NAME --receipt-handle "上記返り値のReceiptHandle"
```

数分後、メトリクスの値が変わり、インスタンスがスケールインする2分前にイベントが発生。ターゲットに指定したlambdaやSNSや発火する。

* 同時に2つのインスタンスが2分前イベントを発生させた場合でも2通のイベントを取得できることは確認済。
docker-composeの大切な変数には環境変数を設定しよう！

##はじめに
こんにちは。早速ですが、docker-composeにDBのimageを書いてる人...。
**環境変数**は使用していますか？？

個人が作成しているポートフォリオや個人のWebアプリケーションなどでGitでバージョン管理されている方が多いと思いますが、docker-composeに『直で大切な情報を載せるはあまり良くはない...』ですよね。

そんな時に環境変数を用いて、大切な情報はgitignoreしつつ、一括で管理してしましましょう！！

ではdocker-composeにて楽々できる環境変数の設定の仕方をご紹介します。

##ディレクトリの構成図を見ていく
ファイルは2つのみの単純な構成図ですが、載せておきます。笑

```directly:ディレクトリ構成図
sample-project
　     ├ .env # 環境変数を設定するファイル
　     └ docker-compose.yml
```

docker-composeと環境変数の設定ファイル.envは同ディレクトリに置かなければいけません。

##まず.envの中身を書く
今回は僕がPostgreSQLを使っているので、PostgreSQLで書きますが、設定したい変数を書けばいいだけなので、簡単にカスタムできます。

### 注意点
必ずファイル名は`.env`という名前にしてください。違う名前でも実装できますが少し設定方法が変わってきてしまいます...
それについては後半で紹介しますね(/･ω･)/ [コチラで後半まで飛べます](#envを指定しない方法)

```env:.env
POSTGRES_USER=postgres
POSTGRES_PASSWORD=passworddayo
```

##docker-composeの中身を書く
こんなDBのコンテナのみで使うことなど無いかもしれませんが、余計な情報はなしで書きます。

```yml:docker-compose.yml
version: "3"
services: 
    db:
        image: postgres
        environment:
            - POSTGRES_USER
            - POSTGRES_PASSWORD
        ports:
            - "5432:5432"
```

たったこれだけで実装可能です。

ですがここにたどり着くまで様々な落とし穴があったりします。笑

##僕的落とされたポイント
###その１→ファイル名は.envにする件について
どうやらdocker-composeの標準装備で同ディレクトリのenvファイルで定義したものを参照してくれるみたいです。公式ドキュメント*1に書かれていことが少なすぎて、『情報量！！！』と叫びましたね。[*1 docker docsへはコチラ](https://docs.docker.com/compose/env-file/)

####.envを指定しない方法
これは簡単に言うと、任意のファイル名を指定して、そのファイル内の定義したもの全てをenvironmentに入れるパターンです。
この方法については、他の方がまとめてくれている記事を紹介します*2↓
[*2 docker-composeでenv_fileとenvironmentを同時に設定する際の注意点(Qiita)](https://qiita.com/zawawahoge/items/eeaf2833583949524023)

###その２→environmentに書くのそれだけ？問題
`docker-compose.yml`を見ていただくと、**evironment**にPOSTGRES_USERとPOSTGRES_PASSWORDを書いているだけですよね。笑
元々PostgreSQLの方でevironmentに設定しなければいけない変数が決まっているのですが、`.env`で設定した名前を`docker-compose.yml`で代入するのではなく、直で`docker-compose.yml`に書いてるのです。笑

ですがその方が『**環境変数が個別に直感的に設定できる**』という意味で、ファイル名を指定してファイル全体を代入するのではなく、変数を指定するやり方が僕的には良いと思ったので、`.env`の設定方法を紹介いたしました。

##さいごに
最後まで読んでいただきありがとうございました。
間違っている点やシンプルな感想などでもございましたら、お気軽にコメントください！！

実はDjangoにて環境変数を設定する方法をメインに書きたかったのですが、Dockerありきの方法になってしまうんです。なのでそれはまた今度ということで。

DjangoやAWS,Dockerなどのバックエンドを勉強していたり、機械学習にも少し手を出しているわたくしの姿を発信しているTwitterがあるので、もし良ければ...@heacet43

##参考文献
*1 Declare default environment variables in file | Docker Documentation [https://docs.docker.com/compose/env-file/]
*2 docker-composeでenv_fileとenvironmentを同時に設定する際の注意点 [https://qiita.com/zawawahoge/items/eeaf2833583949524023]
Node.jsでAWS ElasticSearchへのHTTP リクエストの署名

#はじめに
情報保護を難しくなっている現代社会では、セキュリティ対応はますます重要になってきています。
Cloud技術の進化によって、セキュリティ対応しやすくなる部分もあります。

AWSのElasticeSearchサービスへのHTTP リクエストの署名方法を簡単にまとめてみます。


#1. AWS SDKのライブラリを使う
AWSのドキュメントにある通り、署名したリクエストを送信できますが、検索のクエリなどはちょっと手間ですね。

参考URL:　https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-request-signing.html

```node.js
var credentials = new AWS.EnvironmentCredentials('AWS');
  var signer = new AWS.Signers.V4(request, 'es');
  signer.addAuthorization(credentials, new Date());

  var client = new AWS.HttpClient();
  client.handleRequest(request, null, function(response) {
    // ....
  }
```

#2. aws-elasticsearch-connectorモジュールを使う
Node.jsからElasticSearchへアクセスするには、ElasticSearchクライアントを使うと検索などに便利です。
aws-elasticsearch-connectorを利用して署名も簡単にできます。

##2.1 aws-elasticsearch-connectorインストール
`npm install --save aws-elasticsearch-connector @elastic/elasticsearch aws-sdk`

##2.2 profile利用例
```node.js
const AWS = require('aws-sdk');
const { Client } = require('@elastic/elasticsearch');
const { AmazonConnection } = require('aws-elasticsearch-connector');
 
// Load AWS profile credentials
AWS.config.update({
  profile: 'my-profile'
});

 
const client = new Client({
  node: 'my-elasticsearch-cluster.us-east-1.es.amazonaws.com',
  Connection: AmazonConnection
});
```


##2.3 .envにアクセスキー、シークレットキー利用例
```properties
AWS_ACCESS_KEY_ID=foo      # alias: AWS_ACCESS_KEY
AWS_SECRET_ACCESS_KEY=bar  # alias: AWS_SECRET_KEY
AWS_SESSION_TOKEN=xxx  //optional
```

```node.js
const { Client } = require('@elastic/elasticsearch');
const { AmazonConnection } = require('aws-elasticsearch-connector');
 
const client = new Client({
  node: 'my-elasticsearch-cluster.us-east-1.es.amazonaws.com',
  Connection: AmazonConnection,
});
```

参考URL：https://github.com/compwright/aws-elasticsearch-connector#readme

##2.4 検索結果
```node.js
let searchResult = await client.search({
    index: 'xxx_index',
    body: {
      //...
    });

// ヒットしたデータ
let hits = searchResult.body.hits.hits;
// ヒットしたデータ数
let hitsCount = searchResult.body.hits.total;
```

ElasticSearchのクライアントAPI：
https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/client-usage.html

以上
小中学生向けのプログラミング言語4つまとめ

最近は、小学生からプログラミングを始める時代になってきているそうです。
物事を考える力がつくから～　とかで、義務教育に入るそうですね。
そんな小学生・中学生の人におすすめなプログラミング言語)を紹介します。
# Scratch
早速言語じゃないやん！ってね。
サイトはこちら：https://scratch.mit.edu/

GUIで、プログラミングをできるサイトです。
ブロックをつなげて、キャラクターを動かしたりできます。

## 特徴

他のものと違い、コードを打たないで、ブロックをつなげて作品を作ります。
そのため、始めやすいですが、他の言語に移るのは大変です。

私はあまり好きではありません。

# JavaScript

一番おすすめです。

3日くらい勉強サイトを見ていれば、(若いうちは)すぐ頭に入ってくるくらい単純な言語です。

## 特徴

動かすのが簡単です。

Chromeを使っているなら、「右クリック→検証」か「F12」を押すとデバッグツール　が出てきます。
その、「Console」と書いてあるところにコードを入力すると動かせます。

Googleで、「使っているブラウザの名前　デバッガーツール」と検索すれば、デバッガーツールの出し方が書いてあると思うので調べてみてください。

ただし、IEはおすすめしませんので。

# HTML
これはプログラミング言語かな？

とりあえず、Webサイトを作るためのマークアップ言語です。
先程書いた「デバッガーツール」を開いてElementsをみると、

```HTML
<html>
  <body>
    <a></a>
    <p></p>
  </body>
</html>
```

みたいなコードが出てくると思います。
これがHTMLです。

Webサイトはほぼこれで作られています。

プログラミング言語ではないので、動くものを作るのは大変だと思います。

JavaScriptと組み合わせると、ブラウザゲームも作ることができます。

# PHP

これは少し難易度が高いです。
PHPを動かすためには、PHPが動くサーバーが必要です(Windows上でもXamppというソフトを使えば動きます)。

そして、phpファイルにコードを書くと動くのですが、JavaScriptよりも構文(書きかた)が難しいです。

すこし時間を掛けて勉強する必要があります。

## 特徴

~~Qiitaのようなサービスを作るにはPHPが必要不可欠です。~~QiitaはRubyでできています。ご指摘くださった方、ありがとうございます。
マニュアルが日本語でわかりやすいので、すぐに調べることができます。
また、人気プログラミング言語ランキングでも上位に入っているので、仕事の件数も多いです。


# おすすめは？

最初はJavaScriptがおすすめです。

人気な言語なので、知恵袋などでもいろいろ答えが転がっています。
安定のJSから始めてはいかがでしょうか？
vimのファイラ netrwを使ってみる

# 概要
ファイラをあまり利用しないので、pluginを入れるほどではないのですが、
ごく稀にファイラを利用したくなる時があるので、
vimのファイラ netrwをちょっとカスタマイズしました。

## netrwの設定

```
let g:netrw_liststyle = 3  # ファイルをツリー表示にする
let g:netrw_winsize = 20   # ファイラのwindowサイズを20に設定
```

## key mapping

```
nnoremap <silent> <LEADER>> :Vex /var/www/html<CR>
nnoremap <silent> <LEADER>< <C-w>t:close<CR>
```

- `leader + >` で画面の左側に `/var/www/html` 配下のファイルツリーを表示するようにしています。
- `leader + <` で左側の画面に移動し、そのwindowを閉じるコマンドをマッピングしました。

これで `leader + >` でファイラを表示し、`leader + >` でファイラを閉じるようにしています。

## 画面イメージ
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68643/1d62a938-9266-fb5f-b9f7-6f09a548ab90.png)
【github】（自分用備忘録）

#ローカルからリポジトリへ！！
## 前提として
-  githubにリポジトリがあり，一度でもそのローカルからリポジトリに接続済
-  カレントディレクトリはそのローカル

## 手順
```
1. git add 自分が反映させたいファイル
2. git commit -m "何かコメント"
3. git fetch
4. git merge origin/master
5. git push --set-upstream origin master
```

**3.4.の工程はよく分からないが，しないと**
**![rejected] master->master(fetch first)される**

## 参考サイト
> https://www.softel.co.jp/blogs/tech/archives/3569

## 備考
> https://www.sejuku.net/blog/71492

↑また違う方法かも，また試したい．
Node.js(Express) + Pug(Jade)でDBにtextareaから保存された改行を表示する


# コード
```index.js
text.replace(/\r?\n/g, '<br>')
```

```index.pug
 p !{text}
```
#注意
\#{text}で出力するのではなく、!{text}でないと表示されない。

# 備考
変数である textは、DBにtextareaから保存されたテキストのデータ

例えば、テキストエリアに、

ファッキンホット
ファッキンコールド

と入力した場合

上記の処理をしないと、
ファッキンホット ファッキンコールド

と表示される。
GitHub上のリポジトリからファイルをダウンロードするワンライナー

## Contents APIを使う

REST API v3の[Contents API](https://developer.github.com/v3/repos/contents/#get-contents)を使う。

> Get contents
> Gets the contents of a file or directory in a repository.

## 前提

- [jq](https://stedolan.github.io/jq/)をインストールする
- GitHubのリポジトリ操作権限を持った[personal access token](https://help.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line)を取得する

## リポジトリのファイルをダウンロードするワンライナー

次のワンライナーでGitHub上のファイルをダウンロードできる:

```sh
curl -sSL -H "Accept: application/vnd.github.v3+json" -u <user name>:<token> \
     https://api.github.com/repos/<owner>/<repo>/contents/<file_path> \
    | jq -r .content \
    | base64 --decode > <output file name>
```

このワンライナーは次の順番で処理を実行している:

- Contents APIを呼び出してファイルの内容をJSONで取得する
- JSONからBase64エンコードされたファイルの内容を表わすフィールド `content` を取得する
    - このとき、`raw-output` (`-r`) オプションでJSON文字列ではない生の文字列としてstdoutに出力することで、`"` などを取り除く
- Base64デコードして、標準出力の内容をファイルへリダイレクトする

例として、rails/railsのactiverecord/lib/active_record.rbをダウンロードするときは次のようになる:

```sh
REPOS=rails/rails
FILE_PATH=activerecord/lib/active_record.rb

curl -sSL -H "Accept: application/vnd.github.v3+json" -u <user name>:<token> \
     https://api.github.com/repos/${REPOS}/contents/${FILE_PATH} \
    | jq -r .content \
    | base64 --decode > <output file name>
```
【HTML&CSS】サッと横並びを実装する

###はじめに
シンプルなヘッダーを作成する時ってどんなプロパティで指定してますか？
僕の場合は簡単なのでdisplay:flexで実装してます。
けどサイト修正してるとまだまだfloatを使っているサイトも多く感じるのでfloatの復習するついでに、いろいろ試してみました。

###対象
・要素を横並びさせるとき、flewboxしか使わない人
・古いサイトの修正でfloatに出会った人。

#目標
    ロゴ　　　　　　　　　　　　　　　　　　　会社案内　　事業内容　　採用情報　　お問い合わせ

みたいなヘッダーを作る

##display:flex;を使う

```index.html
  <div class="header__flex">
    <h1>ロゴ</h1>
    <nav>
      <ul>
        <li>会社案内</li>
        <li>事業内容</li>
        <li>採用情報</li>
        <li>お問い合わせ</li>
      </ul>
    </nav>
  </div>
```

```style.css
  * {
 margin: 0;
 padding: 0; 
}
ul {
  list-style:none;
}
div {
  padding: 0 30px;
}
.header__flex {
  display: flex;
  height:60px;
  align-items: center;
}
.header__flex nav {
  margin-left: auto;
}
.header__flex ul {
  display: flex;
}
.header__flex ul li {
  margin-left: 20px;
}
```  
- 簡単
- 一応ベンダープレフィックスもつける（普段はSassで書くので今回は省略）




##floatを使う
flexboxを使った時とHTML構造は同じです。わかりやすいようにクラス名の変更しているだけです。

```index.html
  <div class="header__float">
    <h1>ロゴ</h1>
    <nav>
      <ul>
        <li>会社案内</li>
        <li>事業内容</li>
        <li>採用情報</li>
        <li>お問い合わせ</li>
      </ul>
    </nav>
  </div>
```
```style.css
  * {
 margin: 0;
 padding: 0; 
}
ul {
  list-style:none;
}
div {
  padding: 0 30px;
}
.header__float {
  overflow: hidden;
  clear: both;
　/*縦中央揃いにするためにヘッダーの高さを指定する*/
  line-height: 48px;
}
.header__float h1 {
  float: left;
}
.header__float nav {
  float: right;
}
.header__float nav ul li{
  float: left;
  margin-left: 20px;
}
```  
- ロゴを左に浮かせたら、メニュリストを右に浮かせる。そしたら親要素の高さを取り戻すためにoverflow: hidden;を指定するという感じ。（簡単）
- メニューリスト内の<li>はdisplay:line-blockで指定してもいいかも。


##inline-blockを使う
flexboxを使った時とHTML構造は同じです。わかりやすいようにクラス名の変更しているだけです。

```index.html
 <div class="header__inline_block">
    <h1>ロゴ</h1>
    <nav>
      <ul>
        <li>会社案内</li><li>事業内容</li><li>採用情報</li><li>お問い合わせ</li>
      </ul>
    </nav>
  </div>
```
```style.css
  * {
 margin: 0;
 padding: 0; 
}
ul {
  list-style:none;
}
div {
  padding: 0 30px;
}
.header__inline_block{
background-color:#68abc4;
}
.header__inline_block h1{
display: inline-block;
}
.header__inline_block nav{
display: inline-block;
width: 94%;
text-align: right;
}
.header__inline_block nav ul li {
display: inline-block;
margin-left:20px;
}

```  
- ロゴを左寄せ、メニューリストを右寄せするときに大変。今回はメニューリストにwidthを指定してtext-alignで右寄せしたけど、レイアウトはすぐ崩れる。
- inline-blockでやるぐらいならfloatでヘッダー作った方がマシ。
- display:inline-blockって上に変な余白できるし、ロゴとメニューリストの縦中央揃えがシンプルにできない。


###まとめ
floatに苦手意識はあったから、復習できてよかったかなと、思う。

自分で新規サイト作ったり、特に指定がなければflexboxで絶対大丈夫だと思います。
CentOS 7にPHP 7.3をインストール（IUS Community Project）

# はじめに

IUS Community Projectを利用してCentOS7にPHP7.3をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Usage - IUS](https://ius.io/usage)

## サポート

本手法で導入した場合、[PHP: Supported Versions](https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2021-12-06がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y https://centos7.iuscommunity.org/ius-release.rpm
... 略

# yum install -y mod_php73 php73-cli which
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.3.13 (cli) (built: Dec 19 2019 03:21:53) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.13, Copyright (c) 1998-2018 Zend Technologies

# yum info mod_php73
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ty1.mirror.newmediaexpress.com
 * epel: ftp.riken.jp
 * extras: ty1.mirror.newmediaexpress.com
 * updates: ty1.mirror.newmediaexpress.com
Installed Packages
Name        : mod_php73
Arch        : x86_64
Version     : 7.3.13
Release     : 1.el7.ius
Size        : 4.8 M
Repo        : installed
From repo   : ius
Summary     : PHP module for the Apache HTTP Server
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : The mod_php73 package contains the module which adds support for the PHP
            : language to Apache HTTP Server.

# yum info php73-cli
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ty1.mirror.newmediaexpress.com
 * epel: ftp.riken.jp
 * extras: ty1.mirror.newmediaexpress.com
 * updates: ty1.mirror.newmediaexpress.com
Installed Packages
Name        : php73-cli
Arch        : x86_64
Version     : 7.3.13
Release     : 1.el7.ius
Size        : 9.8 M
Repo        : installed
From repo   : ius
Summary     : Command-line interface for PHP
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA and PostgreSQL
Description : The php-cli package contains the command-line interface
            : executing PHP scripts, /usr/bin/php, and the CGI interface.
```
今日のワンライナー part.1

# 今日のワンライナー

```
while true; do STATUS=`kubectl get managedcertificate cert -o json | jq -r '.status.domainStatus[0].status'`; if [[ $STATUS != "Provisioning" ]]; then break; fi; done; terminal-notifier -title "status" -subtitle "status" -message "$STATUS" -sound default
```

今日のワンライナーはgkeのマネージドサートのドメインステータスが`provisioning`以外になったときに通知してくれるものです。

プロビジョンに30分くらいかかることがあるので結構便利でした。
AWSからECインスタンスProxy経由でデータセンター側サーバへ接続するTips

# 概要
AWSパブリックインスタンスからSandboxをProxyにして、データセンター側サーバにSSHする

## 設定：SSG（ファイアウォール）
SSGのGlobal Policy へ、対象AWSインスタンスのGlobal IP許可するように設定追加する

## 設定：Sandbox
GlobalIP	115.30.28.159
LocalIP	172.18.4.127 

下記にAWSインスタンスの公開鍵データを追記
[root] .ssh/authorized_key

## 設定：データセンター側のサーバ
例：172.18.8.149

下記にAWSインスタンスの公開鍵データを追記
[root] .ssh/authorized_key

## 確認：AWSインスタンス
例：service-web01

### .ssh/config を修正
Snadbox経由で通信可能となるように設定する
<pre>
ServerAliveInterval 60
Host 172.18.8.149
     ProxyCommand ssh 115.30.28.159 nc %h %p
</pre>

### 通信確認
Sandbox、対象のデータセンターサーバへのSSH可能なことを確認する。
<pre>
[root@service-web01 ~]# ssh 172.18.4.127
</pre>

■参照
http://qiita.com/ik-fib/items/12e4fab4478e360a82a1
CloudFormationでパラメータストアから値を動的参照する際にハマったところ

## 背景

作成中のCFnのスタックをいくつかのVPC上で実行したいので
vpc-idやその他のパラメータはベタ書きせずに外部から参照するかたちにしました。

CFnでは[動的な参照を使用してテンプレート値を指定する](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/dynamic-references.html)機能を利用して
SSMのパラメータストアやSecrets Managerから値を参照することができます。

```yml:参照パターン
# '{{resolve:ssm:parameter-name:version}}'
'{{resolve:ssm:vpc-id:1}}'
```

## 問題

SSMパラメータストアにパラメータを設定した上で
テンプレート名のパラメータセクションでこのように書きました。

```yml:CFnテンプレート
VpcId:
  Type: AWS::EC2::VPC::Id
  Default: '{{resolve:ssm:vpc-id:1}}'
```

このテンプレートからスタックを作成するとエラーになります。

```bash:イベント内に出力されるエラー
Parameter validation failed: parameter value {{resolve:ssm:vpc-id:1}} for parameter name VpcId does not exist. Rollback requested by user.
```

存在しない…とはいえCLIからパラメータストアを参照すると普通に見えます。

```bash:CLIからパラメータストアを参照
aws ssm get-parameter --name=vpc-id
{
    "Parameter": {
        "Name": "vpc-id",
        "Value": "vpc-a1b2c3d4",
        "Version": 1,
        "Type": "String"
    }
}
```

## 解決

テンプレートの `Type` を書き換えると参照できました。

```yml:CFnテンプレート
VpcId:
  Type: String
  Default: '{{resolve:ssm:vpc-id:1}}'
```

[AWS 固有のパラメーター型](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#aws-specific-parameter-types)を使えば
入力値の検証やサジェストの面でメリットがありますが
現状はここに動的参照の値を直接置くことはできないようです。

厳密な原因が見つかっていないためまだなんとも言えませんが
`does not exist.` に惑わされないようにしましょう。
C# GUIからバックグラウンドでプロセスを実行し管理する

#はじめに
[C# GUIアプリケーションからPythonスクリプトを実行する](https://qiita.com/kimisyo/items/0879fc9f1315e2abfd1f) ではPythonスクリプトの実行が終わるまで他の操作はできない状況であった。しかし、もっと複雑なアプリケーションを考えた場合、あるPytnon等のプロセスをバックグラウンドで実行開始し、その後呼び出し元の画面にもどって別の操作をしたり、別のプロセスを実行できると便利だ。また実行中の全てのプロセスを一覧表示し、実行状況を確認したり、キャンセル等の操作も行えるとさらに便利だ。これを行うプロトタイプを作成してみた。

#実現イメージ
実現したいことを図にするとこんな感じになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/53ff096b-cb03-724c-a90c-de76de4a797b.png)

- プロセス実行画面でプロセスの実行を開始すると、その画面は閉じることができ、プロセスはバックグラウンドで実行される。その後プロセス管理画面でプロセスの状況(終わったかどうか等)を確認できる。
- 途中で詳細な実行状況を見たい場合は、プロセス管理画面で「Detail」ボタンをクリックすると、そのプロセスの進捗状況をプロセス詳細画面でいつでも参照できる。
- 複数のプロセスの進捗状況を、複数のプロセス詳細画面で同時に見ることができる。

#実現方法
ソースはhttps://github.com/kimisyo/PythonParallelExecutor で公開している。名前はPythonがついているが、コマンドラインで呼び出せるものであれば容易に修正は可能である。
[C# GUIアプリケーションからPythonスクリプトを実行する](https://qiita.com/kimisyo/items/0879fc9f1315e2abfd1f) からの変更したポイントは以下の通りである。

-  プロセスを実行する際に指定するプロセスクラスのExited, OutputDataReceived, ErrorDataReceivedイベントに対し、親のフォームのイベントハンドラを紐づけるよう変更する。
-  親フォームでは実行されたプロセスの情報(プロセスクラス）を保持しておき、DataGridViewのDataSourceと連動させておく。また、OutputDataReceived,ErrorDataReceivedイベントハンドラに実行中の各プロセスからの標準出力データが送られてくるので、これをプロセス別に保持しておく。
- プロセスの実行詳細画面を表示する際は、それまでにOutputDataReceived, ErrorDataReceivedで受け取った内容を標準出力のエリアに初期表示する。
- そして肝になる部分が、OutputDataReceived, ErrorDataReceivedイベントハンドラにおいて標準入出力データを受け取る度に全子画面にイベント発行する点だ。子画面のイベントハンドラはそれをうけとってテキストエリアに進捗状況（標準出力のデータ）を表示する。もちろん、子画面がいつも存在するとはかぎらないため、プロセス実行詳細画面を表示する際にイベントとイベントハンドラを紐づけ、プロセス実行詳細画面を閉じる際にそれを解除している。コードでいうと、PythonCommandExecutorForm.csの``` this.parentForm.MyProgressEvent += handler;```, ``` this.parentForm.MyProgressEvent -= this.handler;```のように記載しているところになる。

#おわりに
今まで避けてきたイベントの仕組みについて理解が深まった。イベントの仕組みを理解すると、各画面部品~~が非同期に連動する~~の独立性の高いアプリケーションが簡単に作れそうな気がする。
docker-compose イメージ サイズ確認方法

#概要
筆者は個人開発や学習等でGCP（GCE）を利用しています。
無料枠で使用していますが、GCEにGrowiを立てようとしたところ、つまづきました。
具体的にはドキュメントを参考に`docker-compose up`したところシェルが戻ってこなくなりました。

ROMが足りていないと考え、
正常にGrowi構築できた環境を用意し、Growi構築にあたりROM要件の確認をしました。
この方法を記事にしました。

##Growiドキュメント
https://docs.growi.org/ja/guide/

#実行環境
OS

```bash
> sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.6
```
使用しているシェル

```bash
> echo "$SHELL"
/bin/bash
```
dockerバージョン

```bash
> docker --version
Docker version 19.03.2, build 6a30dfc
```
docker-composeバージョン

```bash
> docker-compose --version
docker-compose version 1.24.1, build 4667896b
```

#確認方法

```bash
> docker-compose images
      Container             Repository         Tag       Image Id      Size 
----------------------------------------------------------------------------
growi_app_1             growi_app             latest   bb6255fd4f73   244 MB
growi_elasticsearch_1   growi_elasticsearch   latest   c6d9fe3d94b0   820 MB
growi_mongo_1           mongo                 3.6      e7f4a190b0a9   417 MB

```

#結果
1.481GB必要とわかりました。
再起動したあと自動的にadb tcpipを有効化する (root化必要)

# モチベ
[scrcpy](https://github.com/Genymobile/scrcpy/)するときにいちいちUSBつないでtcpipするのめんどくさい

# 環境
Nexus 5 無印 (タッチスクリーンが壊れてる)
Android 6.0.1 Mashmallow

# 手順
1. adb shell
2. su 
1. setprop persist.adb.tcp.port 5555
2. 端末再起動して adb shell getprop で persist.adb.tcp.port があればOK

# ソース
https://stackoverflow.com/questions/12251101/how-to-enable-adbd-to-listen-to-a-port-at-boot-time-in-android
> This will make it persistent:
> 
> ```setprop persist.adb.tcp.port 5555```

https://android.googlesource.com/platform/system/core/+/refs/heads/marshmallow-release/adb/adb_main.cpp

```
    // If one of these properties is set, also listen on that port
    // If one of the properties isn't set and we couldn't listen on usb,
    // listen on the default port.
    property_get("service.adb.tcp.port", value, "");
    if (!value[0]) {
        property_get("persist.adb.tcp.port", value, "");
    }
    if (sscanf(value, "%d", &port) == 1 && port > 0) {
        printf("using port=%d\n", port);
        // listen on TCP port specified by service.adb.tcp.port property
        local_init(port);
    } else if (!usb) {
        // listen on default port
        local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT);
    }
```

https://android.stackexchange.com/questions/151053/difference-between-system-build-prop-properties-and-setprop-persist-adb-tcp-por
> To answer your 2 last questions, according to several sources (1, 2, 3), thoses are stored in /data/property/. I couldn't find an offical reference about this location though.
> 
> For you, that would be in /data/property/persist.adb.tcp.port.

# 余談
* https://forum.xda-developers.com/showthread.php?t=635102
によると service.adb.tcp.port でも行けるみたいな感じだが再起動したら消えてしまった
* `ssh root@192.168.3.109 -L 5555:localhost:5037` みたいな感じでadbdへSSH Port Forwardingするのは妙案だと思った。これならrootなくても行ける？だれか試して。今回scrcpyはなるべくオーバーヘッド下げたいので正攻法でやった。
CentOS 7にPHP 7.3をインストール（SCL）

# はじめに

Software Collection(SCL)を利用してCentOS7にPHP7.3をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Quick Start — Software Collections] (https://www.softwarecollections.org/en/docs/)

## サポート

本手法で導入した場合、[Red Hat Software Collections Product Life Cycle - Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhscl)より、~~2021-12~~ 2024-06がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y centos-release-scl
# yum install -y rh-php73
# scl enable rh-php73 bash
... 略
```

### 各種確認

```shell-session
# which php
/opt/rh/rh-php73/root/usr/bin/php

# php -v
PHP 7.3.11 (cli) (built: Dec 10 2019 16:14:50) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc/opt/rh/rh-php73
Loaded Configuration File => /etc/opt/rh/rh-php73/php.ini

# rpm -qi rh-php73
Name        : rh-php73
Version     : 1
Release     : 1.el7
Architecture: x86_64
Install Date: Sat Jan 25 04:22:12 2020
Group       : Development/Languages
Size        : 0
License     : GPLv2+
Signature   : RSA/SHA1, Fri Jan 17 13:32:46 2020, Key ID 4eb84e71f2ee9d55
Source RPM  : rh-php73-1-1.el7.src.rpm
Build Date  : Wed Oct 23 07:57:10 2019
Build Host  : c1bj.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CBS <cbs@centos.org>
Vendor      : CentOS
Summary     : Package that installs PHP 7.3
Description :
This is the main package for rh-php73 Software Collection,
that install PHP 7.3 language.
```