OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】ABC - 091 - Two Colors Card Game

# 問題
それぞれ文字列が書かれている$N$枚の青いカードと、$M$枚の赤いカードがあり、ある文字列を宣言したときに青いカードにその文字列が書かれていると枚数分1円、赤いカードにその文字列が書かれていると枚数分-1円となるとkに、最大で差し引き何円もらえるかを求める問題。

# 方針
青いカードに含まれている文字列でないとそもそもプラスになる可能性が存在しないので、青いカードに含まれている文字列に着目して、青いカード、赤いカードにかかれている文字列をカウントし、文字列ごとに何円もらえるのかを算出して、最大値を更新していく。

文字列にある要素が含まれているかをリストの`list.count()`でカウントする。

```python
N = int(input())
S = [input() for _ in range(N)]
M = int(input())
T = [input() for _ in range(M)]
res = 0
for s in set(S):
    score = S.count(s) - T.count(s)
    if score > res:
        res = score
print(res)
```
AndroidXとSupportライブラリとは

###この記事の概要
**AndroidXとV7やDesign等のSupportライブラリの違い**について説明します。
とある参考書を元にCoodinatarLayoutのテストプログラムを書いていたら、詰まったのでとりあえず記事にしてみます。
間違っていたら、コメントで教えてください。
ちなみに参考書はこちらです。
[基礎＆応用力をしっかり育成！Androidアプリ開発の教科書 Kotlin対応 なんちゃって開発者にならないための実践ハンズオン](
https://www.amazon.co.jp/dp/B07SC5WVPY/ref=sspa_dk_detail_1?psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExQkxZRk04MDVUVzdQJmVuY3J5cHRlZElkPUEwNjE0MzYwTzg1R0s5UjJWN0NYJmVuY3J5cHRlZEFkSWQ9QTMxMjlPNjBKS1lPU1Qmd2lkZ2V0TmFtZT1zcF9kZXRhaWwmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)

#両者の違い
乱暴に言えば**新しいか古いか**です。
当然、新しい方のAndroidXをGoogleは推奨しています。

##Supportライブラリとは
ザックリ言うと、新しいOSバージョンでしか使えないクラス（ToolBarとか）を**古いOSバージョンでも使えるように互換性をもたせるライブラリ（パッケージ）**です。
これがないと古いOSで使えないクラス（Fragmentとか）が多すぎて大変です。
ただ、ほぼ同じ機能を持っていて改良されているAndroidXが出たので、GoogleはAndroidXの使用を推奨しています。
同じ機能を持つのでAndroidXとSupportライブラリ、クラス名は一緒でもパッケージ名は違うものが存在します。
ややこしいので、この記事ではAndroidXより前はまとめてSupportライブラリと呼称しています。


色々細かな説明もありますが、それは下記のURLを参考にしてください。
https://developer.android.com/topic/libraries/support-library/features?hl=JA

**OSバージョンとは？**
AndroidのOSのバージョンのことを指します。
ややこしいのが、
Android5.1、
Lollipop、
API21
と同じOSバージョンに対して3つの呼び方があることです。
記事の本題ではないので、細かく触れませんが
正式名称、
あだ名、
開発用の名称
くらいの認識でOKです。

##AndroidXとは
API28以降で導入された新しいSupportライブラリです。
とはいっても、Supportライブラリを改良したものなので、使い方はあまり変わりありません。
そして、（繰り返すようですが）Supportライブラリと同じクラス名のものが存在します。

重要なのは、**AndroidXとSupportライブラリは共存出来ない**、ということです。




下記を参考にしてください。
https://developer.android.com/jetpack/androidx?hl=JA

##詰まったポイント

**問題点**
参考書にはSupportライブラリのV7パッケージを使えと言われているのに、実際にAndroidStudioへ書き込むとMissingClassと表示され、使用できない。

**原因**
AndroidXを使用する設定だったのに、サポートライブラリを使おうとしていたこと。

**解決方法**
①AndroidXをおとなしく使う。
（パッケージ名が違いますが、機能とクラス名は一緒なので、正直これが一番だと思います。）

②プロジェクトを作り直して、**use androidx.* artifacts**のチェックを外す
＊ただし、API29以上は強制的にチェックがついています。
その場合はOSバージョンを下げるか、①しかないと思います。
下記のURLがかなり参考になります。
https://akira-watson.com/android/androidx.html

##まとめ
・Supportライブラリの後継が、AndroidX
・SupportライブラリとAndroidXは一緒に使えない
・基本的にはAndroidXを推奨

####独り言
参考書、2019年7月に発売されたばかりのものなんですが、AndroidXに関しては触れていません。
正直、Supportライブラリではなく、AndroidXで書き直すべきなのではと思います。
pyside2付属qsqlpsql.dll  windows10 64bit での使用

備考録です。
Qtが提供する（Community版windows用ではそもそもdll形式では提供が無い。今もそうでしょうか。） qsqlpsql.dllをWindowsで利用する事一度も成功しませんでした。（そういうスキルの者だとご理解下さい。）
今回、PySide2を導入したところ、
AppData/Local/Programs/Python/Python37/Lib/site-packages/PySide2/plugins/sqldrivers
内に
qsqlite.dll
qsqlodbc.dll
qsqlpsql.dll
があるのを見つけてこれは！使えるのではと。
wslの file qsqlpsql.dll　で
qsqlpsql.dll: PE32+ executable (DLL) (GUI) x86-64, for MS Windows
で64bit版である（らしい）ことを確認して、postgresql.orgよりpsqlodbc_11_01_0000-x64.zip
をダウンロード。面倒だし全く理解できないので、解凍してできた全てのファイルを pythonスクリプトと同一ファルダーにコピー、加えて sqldrivers内のqsqlpsql.dllもコピーして、

```
test.py

import sys
from PySide2.QtSql import QSqlDatabase


print (sys.path)

db = QSqlDatabase.addDatabase("QPSQL")
db.setHostName("hostname")
db.setDatabaseName("dbname")
db.setUserName("username")
db.setPassword("password")
print(  db.open() )

結果
WARNING:  nonstandard use of \\ in a string literal
LINE 1: SELECT '\\' x
               ^
HINT:  Use the escape string syntax for backslashes, e.g., E'\\'.
True
```
WARNINGはQtのpsqldriverが接続する際、サーバー側が必ず出力するものなのでむしろ歓迎。
最終行 True ですから接続成功の模様。
なぜ、スクリプトと同一フォルダーで無いと失敗するのかなど不明ですが、なにより接続する事が大事なのでそこはいいとして。

psycopg2 で、mac windows 双方で接続テストできていたのですが、これでQtの中でdb接続まで完結できるかもしれません。
リストの表示範囲を指定する(スライス)

##リストから取得したい範囲を指定してみる
`x = ["orange", "apple", "banana", "peach"]`
こんなリストが会った時、orangeだけ抜き出したい時は、こうしますよね。

`print (x[0])`
`>> orange`

では、apple・banana・peachを抜き出したい時はどうするか。

##コード例
```py
y = (x[1:3])
print (" ".join(y))
>>> apple banana
```

##解釈
注目は一行目の、(x[1:4])の部分。
xの後ろにつく「1」は、抜き出したいリストのインデックスの開始部分さします。
ここでいうappleです。
:の後の「3」は、抜き出したいリストのインデックスの終了部分さします。
ここで注意ですが、終了部分のインデックス+1が、:の後に入ります。
ここでいうbananaです。

##最後に
インデックスの開始位置や終了位置を、リストの端としたい場合は、省略することもできます。
`y = (x[1:])
print (" ".join(y))`
`>> apple banana peach`
Spring(システム構成:AWS)

1. AWSの概要
　　ー アプリケーションのデプロイ先、システムの安定稼働を担保（負荷分散、耐障害性、利便性、拡張性など）
　　ー　押さえておきたい用語
　　　　　AWS CLI, Docker, コンテナ, ECS, ALB, Fargate,Aurora,タスク)
2. 手順
・認証情報の取得
・ネットワーク構築
　　各種設定: ゲートウェイ、ファイアーウォール、サブネットなど
　　構築はコードベース（Terraform）で行う
　　　メリット　… クローン構成を即座に作成できる（本番環境の再現やブルーグリーンデプロイメントが即座にできる）

・DB構築
　　・DBサーバーの配置先（サブネット）
　　・エンコーディング
・コンテナイメージの登録
　　・Dockerコンテナへの登録
　　・この時点でビルド生成物（.jar）がコンテナへ登録される。
・コンテナ設定
　　・タスク定義
   ・ECSサービス定義
　　　　スケールアウト、スケールアップの設定を行う
・デプロイ
Spring(開発環境)

・コンテナを用いた構成管理について
   ・コンテナ技術(Dockerなど)による環境構築の簡略化ができる
   ・メリット
     a.環境設定のコード化(環境依存性の排除)
     b.環境設定の使い捨て
     c.再現性の担保

   ・dockerfile
     a.設定そのもの
     b.リポジトリにコミットされる

・コンテナ技術について  
   a. 仮想化に比べて、計算資源の消費が少なくて済む
   b. 仮想化はOSは環境ごとに別々、コンテナは１つのOSで複数の環境が動く。そのため、立ち上げも早い
   c.もちろんOSの違いは吸収できる(例えばマシンはlinuxだが、Windows環境で立ち上げるなど)
   d.コンテナはOSの設定が不要なので環境構築が楽

・Twevle Factor App
   コンテナ開発ができている条件。
   だが、Dockerを使わなくても基本的な考え方として重要 
   参考 https://www.slideshare.net/mobile/masatoshitada7/twelvefactor-app

   例
     a.ログは標準出力に 
     b.設定情報は環境変数に
       →osの違いを吸収
     c.依存関係で管理 
       →あらゆる外部ツールを一元管理。バージョン管理も含めて(構成もシンプル、すべてアプリケーションで完結する)

・コンテナ管理サービスの登場 
   Amazon ecsなど
   エンタープライズでも導入が進んでいる

・DBマイグレーションツール 
   DBのマイグレーションにより開発時のdbバージョン変更によるトラブルを防ぐ

・その他
  ビルドツール(maven grade)でもdockerの起動を管理できる
リスト表示の文字の結合(join)

#join関数を使用し、リスト表示された文字を結合してみる
`x = ["Good", "Morning", "Tom."]`
のように、リスト型で表示された文字列を、一文で表示させたいと思います。

##コード例
```py
x = ["Good", "Morning", "Tom."]
print (x)
>>> ['Good', 'Morning', 'Tom']
```

これではリスト型のままです。

それでは、join関数を使って、一文で表示させましょう。

```py
print (" ".join(x))
>> Good Morning Tom
```

##解釈
join関数は、「"".join(リスト)」の形で使用します。
""の中には、区切り文字を入れることができ、今回はあえて「" "」、とスペースを入れています。
これにより、リスト間にスペースが入り、英文表記になりました。

例えば「","」と、区切り文字としてコンマを使用するとこうなります。
`print (",".join(x))`
`>> Good,Morning,Tom`

##最後に
リストに[ユーザー名,ドメイン名]と取り、区切り文字を「@」にすれば、メールアドレスの出力ができそうですね。
ネストされたオブジェクトのプロパティをひたすらすべて列挙して、Union Typeにするワンライナー

どこで使えるのかはわからないけれど、ネストされたオブジェクトのプロパティをひたすらすべて列挙して、Union Typeにするワンライナーができたのでメモ

```.ts
type ValueOf<T> = T[keyof T];
type Property<T> = keyof T | ValueOf<{[K in keyof T]: T[K] extends object ? Property<T[K]> : never}>
```

ワンライナーといいつつ２行あるのはご愛嬌

以下のような感じで使える

```.ts
interface User {
  name: string,
  id: string,
  obj: {
    obj2: {
      aaa: string
    },
    bbb: string,
  }
}
type ValueOf<T> = T[keyof T];
type Property<T> = keyof T | ValueOf<{[K in keyof T]: T[K] extends object ? Property<T[K]> : never}>

type UserProperty = Property<User> //=> "name" | "id" | "obj" | "obj2" | "bbb" | "aaa"
```

<img width="801" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93999/ce453952-7e5e-8ad6-f29d-17c36f95c722.png">


ちなみにネストされているプロパティをチェックしなくて良いなら以下で事足りる

```.ts
type Property<T> = keyof T //=> "name" | "id" | "obj"
```

### 深さ指定で所得できるようにする

もはやワンライナーではないけれど、以下のように書けば深さ指定でプロパティを所得できる

```.ts

// 5階層まで対応。もっと深くまで辿りたい場合は 6:5 のように増やす
type NumMap = {
    5:4,
    4:3,
    3:2,
    2:1,
    1:1,
}

type ValueOf<T> = T[keyof T];
type Property2<T,P extends keyof NumMap> = P extends 1 ?  keyof T : ValueOf<{[K in keyof T]: T[K] extends object ? Property2<T[K], NumMap[P]> : never}>
```

以下のように使える

```.ts
interface User {
  name: string,
  id: string,
  obj: {
    obj2: {
      aaa: string
    },
    bbb: string,
  }
}

type NumMap = {
    5:4,
    4:3,
    3:2,
    2:1,
    1:1,
}

type ValueOf<T> = T[keyof T];
type Property2<T,P extends keyof NumMap> = P extends 1 ?  keyof T : ValueOf<{[K in keyof T]: T[K] extends object ? Property2<T[K], NumMap[P]> : never}>

type UserProperty = Property2<User,2> //=> "obj2" | "bbb"
```

<img width="851" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93999/9a307685-1d51-ffcc-6d6a-1870e1084474.png">


### まとめ

TypeScriptすごい

### 参考
https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types
HerokuのFree DynoをintegromatやGAS（Google Apps Scripts）を使ってスリープさせない方法

記録するほどのことでもないのですが、少しだけ工夫があったので残しておきます。
Heroku便利で無料枠がありがたいのですが、20分アクセスが無いとスリープ（終了）してしまって次のアクセス時にはDyno起動に掛かるオーバーヘッドが地味に気になります。ただでさえ少し遅く感じるので、デモ用途にせよPOC用途にせよ少しでもキビキビ動いてほしいものです。

そこで、integromatを使って定期的にアクセスしてDynoを起こしたままにする方法を考えました。
20分おきにHerokuで起動しているWAS（web Dyno）にアクセスして上げれば良いのだと思いますが、これですと今度はintegromatの無料枠を超えてしまいます。

integromatの無料枠を超えるのが大体3倍程度のステップ数に達しますので、3つのアカウントを使い分けてスケジュール起動させれば一応技術的には対応可能なのですが、素直に既存のintegromatにシナリオを追加して対応すると課金は発生してしまいます。

今度はDynoが起動されたままになると、worker DynoなどにHerokuの無料枠を割り当てられなくなってきますので、今度は逆にintegromatに夜の使わない時間帯はアクセスさせないようにします。これを1ステップだけで行うのに若干試行錯誤がありましたので記しておきます。

```ruby:integromat
{{if(((timestamp + "+9*60*60") % ("24*60*60")) + " > 9*60*60"; "https://test.com/login?ts=" + timestamp; "https://www.google.com?ts=" + timestamp)}}
```
<img width="663" alt="スクリーンショット 2019-09-25 20.53.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/87c464a4-5fd1-2047-b0af-2ac1a58351a7.png">

この例では、0時〜9時まではwww.google.comにアクセスすることにして、Herokuにはアクセスしないようにします。
if制御文を使って、稼働時のUnix時間により判定しています。
また、日本ですと`+9*60*60`とするところが正しく時刻判定するためのコツになります。
出来れば、指定時間帯はintegromat自体動作しないようにさせたいのですが、素のスケジュール設定では出来ないようです。integromatはステップ数に応じて無料カウンターを消費してしまうのでなるべくブロック（ステップ）を減らすのがポイントです。

一方、GASの場合は1アカウントで十分機能します。

```JavaScript:アクセススクリプト
function execHerokuAccess() {
    var response = UrlFetchApp.fetch("https://access.to.heroku.mysite.com");
    Logger.log(response);
}

// 定期的にonMyEditを呼び出すタイマーの登録処理
function starter() {
  var current = SpreadsheetApp.getActiveSpreadsheet();
  ScriptApp.newTrigger('execHerokuAccess').timeBased().everyMinutes(15).create();
}
```
まず、`starter()`を手動で実行し、必要な権限付与等の手順を実施するとトリガーの設定が自動的に作成されます。設定を変更することで15分おきから頻度を変えられるのですが、次に指定できる値は30分おきになってしまいます。

<img width="766" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/23df0366-4371-e94f-422e-029902286773.png">

これで、15分おきにweb.dynoを活性化してくれます。
This iPhone is running iOS 13.1, which may not be supported by this version of Xcode.

ios 13.1にupdateしたら、xcodeでdebugできなくなったので対応しました。色々やってみたけど、何が良かったのかいまいちわからない。

とりあえずやったこととしては、2つです。一つは、xcodeとiphoneを接続したときに、インストールするか聞かれたので、インストールするにして、xcodeを閉じろと言われたので、閉じて、再起動。

あとは、[github.com/filsv/iPhoneOSDeviceSupport](https://github.com/filsv/iPhoneOSDeviceSupport)をダウンロード、解凍して適切な場所に配置。

```sh
$ mv 13.1 (17A5821e) /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
```
シェルスクリプトで無限ループ処理させる

シェルスクリプトで無限ループや回数指定でなにか処理をさせたいときのメモ。

## 1秒ごとに日付を表示する

```shell
#!/bin/sh

while true
do
  sleep 1
  date
done
```
dateコマンドのところを自由に書けば良い。
秒単位ではなくもっと刻みたい場合は、usleepを使う。(usleepはマイクロ秒指定であることに注意)


## 60秒間だけ日付を表示する

```shell
#!/bin/sh

for i in `seq 1 60`
do
  sleep 1
  date
done
```
sleep 1しているから60秒間になるが、sleep 1しなければ60回実行するという意味になる。

## 起動
起動はバックグラウンドでもフォアグラウンドでも。
下記はバッググラウンドの例。

```shell
$ ./loop.sh &
```

## 停止
バックグラウンドで起動している場合はkillall

```shell
$ killall loop.sh
```


killallで止まらない場合は、-9 で強制終了。

```shell

$ killall -9 loop.sh
```

フォアグラウンドで起動している場合は、Ctl+Cで止める。

```shell

$ ./loop.sh 
Wed Sep 25 20:50:02 JST 2019
Wed Sep 25 20:50:04 JST 2019
Wed Sep 25 20:50:05 JST 2019
Wed Sep 25 20:50:06 JST 2019
^C
$ 
```
<br>
Ctl+Cで止まらない場合は、Ctl+Zでサスペンドしてコンソールを抜けてから、killallする。
<br>
【Xcode】素人の僕にはstoryboard使いにくくなった感

#storyboardの自動連動？みたいな機能がないような件

今回のアップデートまではstoryboardのViewとかをクリックするとそれに関連ついたcontrollerの
コード画面が開くみたいな便利機能があったんですが、それがあった位置には違うものが用意されてました。

<img width="445" alt="スクリーンショット 2019-09-25 20.48.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/34dbb890-a149-a5c5-46c5-793af4196cef.png">

この双方向の矢印何ですが、これを押すと、各Viewのコードが出てきます。

<img width="886" alt="スクリーンショット 2019-09-25 20.49.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/1a837fbf-94e7-1b10-23a7-ef86a4b5c711.png">

ここの右上の+ボタンみたいなの押すと画面分割できてそっち側でコードを開いて、
コンポーネント(ってゆうの？)を繋げることももちろんできるんですが、
なんか不便。。。

ガチでコードでViewの全てを書くいい機会にもなるからまあいいかと思うようにするけど
助けて賢い人ｗ

#profile

生まれも育ちも大阪の浪速中の浪速っ子が30才未経験からITエンジニアとして生きるブログもやってます。
よかったらみてください:muscle_tone2:

<a href="https://blogmura.com/profiles/11016817?p_cid=11016817"><img src="https://blogparts.blogmura.com/parts_image/user/pv11016817.gif" alt="PVアクセスランキング にほんブログ村" /></a>
【36日目】簡単な前置きと今日の学び(docker環境におけるbinding.pryによるデバッグ)

## はじめに

未経験公務員からIT転職を目指して独学36日目
Qiitaへの投稿は初めてです。

現在はこちらのUdemy動画を使用しながら学習を進めているような段階です。
[◆フルスタックエンジニアが教える即戦力Railsエンジニア養成講座](https://www.udemy.com/rails-kj/learn/lecture/9678160#announcements)

SNSを通じて出会った方にいただいたアドバイスの中に「なんでもいいから毎日アウトプットしろ」というものがありました。
曰く、アウトプットを一定期間継続しているというだけで評価になり差別化要因になる、と。
その他アウトプットによって得られる種々の効果については、下記が参考になると思います。
[◆「120日間」技術ブログを「毎日」投稿し続けて分かった「記事を投稿するメリット」](https://qiita.com/ryoutaku/items/ec00cd5e7fa163337151#_reference-ef636f3599963c951474)

おそらくQiitaのメインターゲットであるプロエンジニアの方々にとっては稚拙すぎる情報もあるかと思います。
しかし私のような初学者にとってはどれも未知との遭遇で、ある種の驚きに包まれたものです。
そういったごく個人的な発見を日々積み重ねていき、時には同じような初学者の学習に貢献できれば幸いと思います。

## 本題
今日は先の動画内で使われていたbinding.pryについてまとめます。
binding.pryはデバッグツールと呼ばれるものです。
プログラムの中に書いて実行すると、書かれた行でプログラムが停止し、pryのREPLが起動します。
そのあと、変数の中身を確認したりできるので、アプリが原因不明のエラーを出している時などに、原因の特定に役立つようです。

## 導入方法
gemとしてインストールすることになります。
なお、デバッグ用のツールは本番環境には不要なので、下記のとおりGemfile内にdevelopmentグループを作ると良いです。

```
# Gemfile
group :development do
  gem 'pry-byebug'
end
```
そしてBundle installするのですが、動画ではdocker環境で使用していますので、本稿ではそれに倣っていきたいと思います。

```
# ターミナル
$ docker-compose build
```
インストールが終わったら、コンテナを再起動します。

```
# ターミナル
$ docker-compose up -d
```

## 使用方法
binding.pryを使用するには、先にコンテナにアタッチする必要がありますので、まずはコンテナ名を確認します。

```
# ターミナル
$ docker ps
```

そのあと、binding.pryを使用したいコンテナ名を指定してattachします。
なお、このattachについて、私はまだ深く理解できていないので今後の課題とします。
どうやら「コンテナに入る」と表現されるようなのですが、execというコマンドと違いがあるようです。

```
# ターミナル
$ docker attach コンテナ名
```

次にコード内の動作を確認したい行にbinding.pryを仕込みます。
ちなみに動画の講師はControllerに機能を実装するたびに必ずbinding.pryを仕込んで、受け渡されているデータが想定通りかどうか確認していました。

今回は、createアクションにストロングパラメータを設定した場合について見ていきます。

```ruby:example_controller.rb
  def create
    Board.create(board_params)
    binding.pry
  end

  private

  def board_params
    params.require(:board).permit(:name, :title, :body)
  end
```

この状態で、サービス側でcreateアクションを実行します。
すると、ターミナルに現在の処理状況が表示され、pryのREPLが起動します。
あとは確認したい変数などを入力すれば、その値が下記のように確認できます。

```
# ターミナル
    10: def create
    11:   Board.create(board_params)
    12:   binding.pry
 => 13: end

[1] pry(#<BoardsController>)> params
=> <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"略", "example"=><ActionController::Parameters {"name"=>"例", "title"=>"binding.pryについて", "body"=>"初めてのアウトプットです。"} permitted: false>, "commit"=>"保存", "controller"=>"examples", "action"=>"create"} permitted: false>
[2] pry(#<BoardsController>)> 
```

「params」
でデータを取得すると「permitted: false」となってくれていることが確認できます。
ちなみにpryから抜けるには「exit」とすれば良いですが、dockerでコンテナにattachしている場合、「Ctrl + p + q」でコンテナから抜ける必要があります。


## 終わりに
とりあえず機能を実装するたびに使用しながら、受け渡している変数やデータの中身を見る癖をつけていきたいなと思います。
講師の方がしつこいくらいに使用しているので、きっとだんだんわかるはず！
Vim 複数行を一度にインデントする

#方法
1. 「V」（すなわち、シフトキーを押しながら「v」)を入力すると、Visualmodeに移行します。
2. jとkでインデントをしたい行の選択をします。
3. 範囲が決まったら、「>」か「<」を入力します。これでインデントの調整が完了です。

##2回分のインデントを挿入(または削除)したい
その時は上記の操作で、「>」(または「<」）を押す前に「2」を押しましょう。

#どのような時に複数行インデントを調整する?
Pythonプログラムを書く時、ある処理を書いた後にforかwhileのブロックに入れたいと思うことがよくあるかと思います。多くの行を手作業でインデントするのは大変かと思います。また、forやwhileがいらないと気づいたときは逆にインデントを消したいと思うでしょう。

Python以外でもインデントを綺麗に揃えるとわかりやすくて良いですね。

#参考URL
vimで複数行のインデントを連続で行う - Qiita
https://qiita.com/ymko/items/a19f5309c8eb1e9466b8
CentOS 7にPHP 7.2をインストール（SCL）

# はじめに

Software Collection(SCL)を利用してCentOS7にPHP7.2をインストール
親記事：[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)より、2020-11が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-php72;scl enable rh-php72 bash
... 略
```

### 各種確認

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

# php -v
PHP 7.2.10 (cli) (built: Nov 16 2018 15:24:33) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

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

# rpm -qi rh-php72
Name        : rh-php72
Version     : 1
Release     : 2.el7
Architecture: x86_64
Install Date: Tue Sep 24 14:56:52 2019
Group       : Development/Languages
Size        : 0
License     : GPLv2+
Signature   : RSA/SHA1, Wed Dec  5 23:56:47 2018, Key ID 4eb84e71f2ee9d55
Source RPM  : rh-php72-1-2.el7.src.rpm
Build Date  : Wed Jul 25 15:59:51 2018
Build Host  : c1bj.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CBS <cbs@centos.org>
Vendor      : CentOS
Summary     : Package that installs PHP 7.2
Description :
This is the main package for rh-php72 Software Collection,
that install PHP 7.2 language.
```
CentOS 7にPHP 7.1をインストール（SCL）

# はじめに

Software Collection(SCL)を利用してCentOS7にPHP7.1をインストール
親記事：[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)より、2019-10が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-php71 which;scl enable rh-php71 bash
... 略
```

### 各種確認

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

# php -v
PHP 7.1.30 (cli) (built: Aug 21 2019 09:27:22) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

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

# rpm -qi rh-php71
Name        : rh-php71
Version     : 1
Release     : 1.el7
Architecture: x86_64
Install Date: Tue Sep 24 14:50:30 2019
Group       : Development/Languages
Size        : 0
License     : GPLv2+
Signature   : RSA/SHA1, Wed Aug 23 14:25:21 2017, Key ID 4eb84e71f2ee9d55
Source RPM  : rh-php71-1-1.el7.src.rpm
Build Date  : Tue Aug  8 15:16:00 2017
Build Host  : c1bk.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CBS <cbs@centos.org>
Vendor      : CentOS
Summary     : Package that installs PHP 7.1
Description :
This is the main package for rh-php71 Software Collection,
that install PHP 7.1 language.
```
【Python】ABC - 092 - Chocolate

# 問題
合宿で参加者がチョコレートを消費していく。合宿には$N$人が参加して$D$日間行われたとして、$i$人目の参加者$(1 \leq i \leq N)$は、$1, A_i+1, 2A_i+1, \ldots$日目にチョコレートを1つ消費する。合宿後に残っていたチョコレートが$X$個だったとして、合宿開始前に準備されていたチョコレートの個数を求めるという問題。

# 方針
$i$人目がチョコレートを消費する日が$1, A_i+1, 2A_i+1, \ldots$であることから、初項$1$、等差$A_i$の等差数列であるとわかる。
よって、項数$n$（今回はチョコレートを消費する日数に対応）は、以下の式で求まる。

```math
1 + (n-1)A_i \leq D \\
n \leq 1 + \frac{N-1}{A_i}
```

```python
N = int(input())
D, X = map(int, input().split())
A = [int(input()) for _ in range(N)]
res = 0
for a in A:
    n = 1 + int((D-1)/a)
    res += n
print(res + X)

```
CentOS7にPHP7.0をインストール（SCL）

# はじめに

Software Collection(SCL)を利用してCentOS7にPHP7.0をインストール
親記事：[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)より、2019-11が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-php70 which;scl enable rh-php70 bash
... 略
```

### 各種確認

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

# php -v
PHP 7.0.27 (cli) (built: Apr  4 2018 13:48:44) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

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

# rpm -qi rh-php70
Name        : rh-php70
Version     : 2.3
Release     : 1.el7
Architecture: x86_64
Install Date: Tue Sep 24 14:49:12 2019
Group       : Development/Languages
Size        : 0
License     : GPLv2+
Signature   : RSA/SHA1, Mon Dec 19 22:53:48 2016, Key ID 4eb84e71f2ee9d55
Source RPM  : rh-php70-2.3-1.el7.src.rpm
Build Date  : Fri Oct 21 19:48:45 2016
Build Host  : c1be.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CBS <cbs@centos.org>
Vendor      : CentOS
Summary     : Package that installs PHP 7.0
Description :
This is the main package for rh-php70 Software Collection,
that install PHP 7.0 language.
```
CentOS 7にPHP 5.5をインストール（SCL）

# はじめに

Software Collection(SCL)を利用してCentOS7にPHP5.5をインストール
親記事：[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)より、2016-10がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

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

# yum install -y centos-release-scl;yum install -y php55 which;scl enable php55 bash
... 略
```

### 各種確認

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

# php -v
PHP 5.5.21 (cli) (built: Aug 30 2016 13:53:58)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies

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

# rpm -qi php55
Name        : php55
Version     : 2.0
Release     : 1.el7
Architecture: x86_64
Install Date: Tue Sep 24 14:47:38 2019
Group       : Development/Languages
Size        : 0
License     : GPLv2+
Signature   : RSA/SHA1, Sat Nov 28 14:49:20 2015, Key ID 4eb84e71f2ee9d55
Source RPM  : php55-2.0-1.el7.src.rpm
Build Date  : Fri Oct  2 14:47:31 2015
Build Host  : c1bk.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CBS <cbs@centos.org>
Vendor      : CentOS
Summary     : Package that installs PHP 5.5
Description :
This is the main package for php55 Software Collection,
that install PHP 5.5 language.
```
Spring Boot

1. 依存関係の概念
　・各種ツールやブラグインのバージョンを意識しなくても良い。
　・設定にはコンポーネントの名前だけ書き、あとは自動で拾ってくれる（BOM: Bill Of Materials)
 ・SPringのバージョンアップに応じて、関連するものがバージョンアップされる
 
2. コンフィグレーション
　・Springを使うための設定？
参考: https://spring-boot-reference.jp/configurationクラスを理解しよう%E3%80%82/

Springの肝
・DI
　　シングルトンの設計手法
　　いちいちnewしなくて良い。
　　　
　　
https://qiita.com/shuntaro_tamura/items/ba5a2e9b3ba305285edd

シングルトン
https://teratail.com/questions/36721
https://qiita.com/shoheiyokoyama/items/c16fd547a77773c0ccc1

@componentscan
https://blog.mookjp.io/memo/spring-boot勉強メモ/
@Component、@Service、@Controller、@RestController、@Repositoryなどのアノテーションが付けられたすべてのクラスのBeanを自動的に作成し、それらをSpringコンテナに追加する
（@Autowired=DIにできるようにする）ために使用されます。

DIについて詳しく
　https://qiita.com/ritukiii/items/de30b2d944109521298f

マルチプロジェクト

モデル


プロジェクト構成
・front …クライアント
・domain サーバーのロジック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299543/875aa311-d8c9-9f69-1f52-78f1e5e45ac2.png)



補足資料
・デバッグのノウハウ
　　・類似との差分
　　・標準的なやり方
CentOS 7にPHP 5.4をインストール（SCL）

# はじめに

Software Collection(SCL)を利用してCentOS7にPHP5.4をインストール
親記事：[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)より、2016-10がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

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

# yum install -y centos-release-scl;yum install -y php54 which;scl enable php54 bash
... 略
```

### 各種確認

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

# php -v
PHP 5.4.40 (cli) (built: Aug 30 2016 13:51:33)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies

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

# rpm -qi php54
Name        : php54
Version     : 2.0
Release     : 1.el7
Architecture: x86_64
Install Date: Tue Sep 24 14:44:59 2019
Group       : Development/Languages
Size        : 0
License     : GPLv2+
Signature   : RSA/SHA1, Sat Nov 28 14:49:35 2015, Key ID 4eb84e71f2ee9d55
Source RPM  : php54-2.0-1.el7.src.rpm
Build Date  : Fri Oct  2 14:50:04 2015
Build Host  : c1bk.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CBS <cbs@centos.org>
Vendor      : CentOS
Summary     : Package that installs PHP 5.4
Description :
This is the main package for php54 Software Collection,
that install PHP 5.4 language.
```
CentOS 6にPHP 7.0をインストール（SCL）

# はじめに

Software Collection(SCL)を利用してCentOS6にPHP7.0をインストール
親記事：[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)より、2019-11がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

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

### 各種確認

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

# php -v
PHP 7.0.27 (cli) (built: Apr  4 2018 13:49:19) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

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

# rpm -qi rh-php70
Name        : rh-php70                     Relocations: (not relocatable)
Version     : 2.3                               Vendor: CentOS
Release     : 1.el6                         Build Date: Fri 21 Oct 2016 07:47:05 PM UTC
Install Date: Tue 24 Sep 2019 02:33:40 PM UTC      Build Host: c1bd.rdu2.centos.org
Group       : Development/Languages         Source RPM: rh-php70-2.3-1.el6.src.rpm
Size        : 0                                License: GPLv2+
Signature   : RSA/SHA1, Fri 20 Jan 2017 09:19:50 AM UTC, Key ID 4eb84e71f2ee9d55
Packager    : CBS <cbs@centos.org>
Summary     : Package that installs PHP 7.0
Description :
This is the main package for rh-php70 Software Collection,
that install PHP 7.0 language.
```
RailsアプリケーションからSalesforceのBulk APIを使う

　Salesforceにデータを連携するアプリケーションをRailsで開発した際にデータの更新数が問題になった。
SalesforceのAPIを叩いて更新するわけだがAPIの実行回数の[上限は、
ベースが24時間あたり,15,000回。](https://developer.salesforce.com/docs/atlas.ja-jp.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_api.htm)


　システムのユーザーは現状500人程度だが毎月一人当たり30レコードが生成されるので、１レコードづつSOQLでAPI経由で更新していると現状でも15,000回に達してしまう！

　そこで[Bulk API](https://developer.salesforce.com/docs/atlas.ja-jp.api_asynch.meta/api_asynch/asynch_api_intro.htm)!

　SOAP APIでログインして、ジョブを作成して更新したいデータをcsvでアップロードする、か、、面倒だな。。
と思っていたらgemがあった。[salesforce_bulk_api](https://github.com/yatish27/salesforce_bulk_api)

 Restforceの認証を流用しているので移行も楽そう。

## Update

```ruby
@client = Restforce.new
@client.authenticate!
sf = SalesforceBulkApi::Api.new(@client)

# obj_name: SF側の更新対象オブジェクト。
# update_data: 反映するデータ。Hashの配列
sf.update(obj_name, update_data)
```

## NULLデータの反映

Bulk APIでは[NULLや空文字列でフィールドの更新はしてくれないらしい。](https://salesforce.stackexchange.com/questions/11175/setting-field-value-to-null-when-using-bulk-api)。NULLにしたいときは `#N/A` を使えと。。また面倒な。  

salesforce_bulk_apiの `update`メソッドでは、第4引数をtrueにすると、NULL値への更新ができるようになる。

```ruby
sf.update(obj_name, update_data, false, true)
```

## エラーメッセージの取得

Bulk APIは非同期で実行されるのでデフォルトでは、
SF側での実行結果は取得できない。`update`メソッドだと第３引数をtrueにすると、
同期処理になってレスポンスでエラー結果が取得できる。

```ruby
@client = Restforce.new
@client.authenticate!
sf = SalesforceBulkApi::Api.new(@client)

# obj_name: SF側の更新対象オブジェクト。
# update_data: 反映するデータ。Hashの配列
res = sf.update(obj_name, update_data, true, true)
Rails.logger.error resp['batches'].first.['response'].first['errors']
```
YOLOv3で独自データの物体検知（犬と猫の検知）をしてみよう②【YOLOv3での学習と予測編】

前回（https://qiita.com/osakasho/items/e689b6e5d49272aa1a6c）
前回のつづきです。
次からは、YOLOv3とGoogleColabを使っていきます。

#Google Colaboratory
高級な機械学習環境が使えるGoogle Colaboratoryで爆速でYOLOを学習させます。
Googleアカウントを作り、Gドライブを開いてください。

①右クリックして、「アプリで開く」から「その他」を選択し、「アプリの追加」をクリックしてください。
②検索欄に　Colaboratoryと打つと出てきますので、追加してください。
③追加を終えたら、Gドライブ上で右クリック→その他→GooGle colaboratoryを選択。

すると、Colaboratoryが立ち上がったらOKです。

#YOLOv3で作ったデータを学習させる。
眠れぬ夜のエンジニアさんのYOLOv3テンプレを利用します。

```
!git clone https://github.com/sleepless-se/keras-yolo3.git
%cd keras-yolo3
```

kerasのバージョンを下げます。

```
# kerasのバージョンを指定　➜　ランタイムを再起動　➜　バージョン2.2.2が反映する
!pip install tensorflow==1.14.0
!pip install keras==2.2.4
```

先ほどの「ano_data.zip」をアップロードします。

```
%cd /content/keras-yolo3/VOCDevkit/VOC2007
from google.colab import files
uploaded = files.upload()
```

解凍します。

```
%cd /content/keras-yolo3/VOCDevkit/VOC2007
!unzip ano_data.zip
```

label用のtxtファイルの作成をします。※実行するだけです。

```
%cd /content/keras-yolo3/
!python make_train_files.py
```

tag付けしたファイルの生成をします。

```
# dog cat の部分は自分のアノテーションしたもので書き換えて行うこと！
!python voc_annotation.py dog cat
```


YOLOv3の重みをダウンロード

```
!wget https://pjreddie.com/media/files/yolov3.weights
```

keras用に合わせる

```
!python convert.py -w yolov3.cfg yolov3.weights model_data/yolo_weights.h5
```

とうとう学習させる。

```
!python train.py 224
```

20分もあれば終わると思います！
学習が終えたら、左のサイドバーから「ファイル」タグを選択。
keras-yolo3→logs→000→trained_weights_final.h5

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/8f7f2694-8e68-ac34-7c72-8a1eec7b6e7b.png)


右クリックしてモデルをダウンロードできます。
ローカルで使用する場合や、保存しておきたいときはダウンロードしておきましょう。

次は、ちゃんとできてるか確認するために、画像を置いてテストします。



```
from google.colab import files
uploaded = files.upload()
```

テストする画像をアップロードします。

```
!python yolo_video.py --image
```

これで、「Input image filename：」と出るので、
自分がアップロードした画像ファイル名を入力してください。
すると予測結果がでます。

```
-- 判定結果 --
Found 3 boxes for img
cat 0.40 (245, 304) (700, 520)
cat 0.72 (379, 254) (628, 560)
dog 0.45 (130, 39) (310, 626)
2.5881030810000993
```

しっかりと入力した画像の名前が出ていればちゃんと物体検知できています。
ローカル環境でチェックすれば、ちゃんと画像が表示されて確認できます。
Ruby メソッド の 定義

# 目的

- Rubyにてメソッドを自分で定義する方法を記載する。
- 他の言語で言うところの関数化に近い機能をまとめる。

# 書き方の例

- 繰り返し使用する処理をメソッド化することでコードの総ステップ数を削減することができる。
- 下記にメソッドの定義方法を記載する。

```ruby
def メソッド名
  処理内容
end
```

# より具体的な例

- 「hello」と出力するメソッドを作成する。
- メソッド名は`output_hello`とする。
- 下記にメソッドの定義方法を記載する。

```ruby
def output_hello
  puts "hello"
end
```
【GAS】UrlFetchApp fetchの文字コード取得

文字コードはヘッダーの中にあるので多分これで取れる。

#サンプル
```javascript

function fechHtmlByUrl(url) {
  const response = UrlFetchApp.fetch(url);
  const headers = response.getHeaders();
  const contentType = headers['Content-Type'].replace(/\s+/g, '');
  const indexOfCharset = contentType.indexOf('charset=');
  const code = (indexOfCharset == -1) ? '' : contentType.substring(indexOfCharset + 8);
  return response.getContentText(code);
}

```
# 追記
https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String,Object)
公式サイトによればUrlFetchApp.fetchのAdvanced parametersでheadersをtureとすればa JavaScript key/value map of HTTP headersが手に入るらしいがよくわからないのでやってない。
Twitter Webのダウンロード機能で取得したTwitterデータの利用方法

本内容を利用した場合の一切の責任を私は負いません。

何故かググってもヒットしなかったので、念のために。

取得したアーカイブの中にtweet.jsファイルがあり、この中にTweetが入っている。
先頭はこんな感じで、JSONではなくJavascriptのコードという感じ。

```Javascript:tweet.js
window.YTD.tweet.part0 = [ {
  "retweeted" : false,
  "source" : "<a href=\"https://mobile.twitter.com\" rel=\"nofollow\">Twitter Web App</a>",
  "entities" : {
    "hashtags" : [ ],
    "symbols" : [ ],
    "user_mentions" : [ ],
    "urls" : [ ]
  },
  "display_text_range" : [ "0", "14" ],
略
} ]
```

ググったものはJSONに見立てるために文字処理でパース(?)している。
eval関数でそのまま使ってはダメなの？？？
window変数定義が嫌だから？？？

```Javascript
const fs = require("fs");
var window =
    {
        YTD:
            {
                tweet:
                    {
                        part0: [],
                        reserved: []
                    }
            }
    };
var dlTweet = fs.readFileSync("./tweet","utf-8");
eval(dlTweet);
var Tweet = window.YTD.tweet.part0;
console.log(Tweet.length);
```

自分で定義できるので、自分用のreservedプロパティを追加したりもできる。
【GAS】Gmailのメールのリンクの取得

メールのリンクはhttps://mail.google.com/mail/u/0/#all/ + そのメールのID

#サンプル
```javascript
function test() {
  const threads = GmailApp.search('test');
  const messages = GmailApp.getMessagesForThreads(threads);
  const result = messages.map(function(msg) {
    return getLinkOfEmail(msg[0]);
  });
  
  Logger.log(result)
}

function getLinkOfEmail(email) {
    return 'https://mail.google.com/mail/u/0/#all/' + email.getId();
}

```
Web Developer Roadmap 2019公開記念～エンジニアスタンプラリー開催

## Web Developer Roadmapとは
毎年更新されているWebエンジニアに必要なスキルが集約されたロードマップ。
https://github.com/kamranahmedse/developer-roadmap

Web Developer Roadmapに示された要素をマスターすれば凄腕エンジニアになれる、という一種の指標とも言える。また、自分の不足している分野にも気づきを得ることができたり、最新の技術トレンドも把握できるという優れもの。

## スタンプラリーとは
鉄道駅会社や観光地において、あるテーマの中でスタンプを集める企画のこと。集めたスタンプに応じて、プレゼントなどの特典が与えられる企画もある多々ある。観光地への誘導やテーマ内容の理解を深めるなどの目的がある。

一方で、景品の欲しさや謎の義務感などの理由から、スタンプを押すことが目的にすり替わり、本来の目的が達成されないことが懸念されている。

本企画では、後者の本末転倒的なニュアンスのスタンプラリーを指している。
※大企業の承認手続きで用いられる[俗語](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%E3%83%A9%E3%83%AA%E3%83%BC#%E4%BF%97%E7%A7%B0)ではない。


## Web Developer Roadmap スタンプラリー開催！
### 主旨
Web Developer Roadmapに標された各エンジニアスキルをスタンプ見立てて、様々なWeb技術に触れていく企画。
つまり、スタンプラリーという形式によって、凄腕エンジニアになるという本来の目的を崩壊させ、薄っぺらい達成感を獲得するというもの。

### ルール
* Introduction(gitやssh)は割愛
* スタンプ獲得以上のクオリティを求めてはいけない
* 後続タスクの技術を先行タスクで用いていはいけない
* 推奨技術(ロードマップ内黄色)は必ず実施する
* オプション(ロードマップ内オレンジ)は気分で
* オレンジに紐づいた黄色も任意

### スタンプ獲得条件
* 公式リファレンスのチュートリアルやGetting Started相当を実装
* 公式ドキュメントがない、まとまっていないときは、入門サイト等参照

### マイルストーン（随時更新予定）
[フロントエンド](https://roadmap.sh/frontend)

* [HTML](https://qiita.com/tonchan1216/items/fd350b51e9f0d997236c#html)
* [CSS](https://qiita.com/tonchan1216/items/fd350b51e9f0d997236c#css)
* [Basic of JavaScript](https://qiita.com/tonchan1216/items/db002fae690a75881074)
* [Package Managers](https://qiita.com/tonchan1216/items/62eb89c92b84679492d7)
* [CSS Pre-proccessors](https://qiita.com/tonchan1216/items/d4e99f63d758d0531136)
* [CSS Frameworks](https://qiita.com/tonchan1216/items/fadb00beee92f2ee3bb1)
* [CSS Architecture](https://qiita.com/tonchan1216/items/41b7fcf17eceec3014e8)
* [Build Tootls](https://qiita.com/tonchan1216/items/3e29a412a837d33a1b5c)
* [Pick a Framework](https://qiita.com/tonchan1216/items/0917c64a19f7c142e82b)
* [CSS in JS](https://qiita.com/tonchan1216/items/50c67105fcef5505e557)
* [Testing your Apps](https://qiita.com/tonchan1216/items/859ad811ef1264db1d75)
* [Progressive Web Apps](https://qiita.com/tonchan1216/items/5bf91520b0cbd118f76e)
* [Type Checkers](https://qiita.com/tonchan1216/items/5276110d717b41a2b823)
* [Server Side Rendering](https://qiita.com/tonchan1216/items/03a692e5a6ee5b0707e5)
* [Static Site Generators](https://qiita.com/tonchan1216/items/891d54d6a8487bfc2164)
* [Desktop Applications](https://qiita.com/tonchan1216/items/a6be1433863c26f4e0a5)
* [Mobile Applications](https://qiita.com/tonchan1216/items/dde48af1aa5afc334347)
* Web Assembly
【GAS】重要でないメールを1週間分まとめて受け取る

#なんで作ろうと思ったか
今すぐ見なくてもいい通知メールがかなりある。受信トレイが汚れるのでできれば週末に全部をまとめた一覧表をぱっと確認したくなったため。

### UI
- 今すぐ見なくていいメールをGmail側のフィルタでタグ付けかつ受信トレイスキップさせる
- 週末にスキップされたメールの一覧メールが送られてくる
メールの画像
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/0759736d-038d-c1d0-1f4e-ba2c54cba86c.png)

### 処理フロー
1. 週に1度タグ付けされたメールの取得
2. 一覧にしてメール

#ソース

```javascript
function combineBoringEmails() {
  //一週間の間のautoArchiveタグがついたメールの取得
  const boringEmails = GmailApp.search('label:autoArchive newer_than:7d');
  const messages = GmailApp.getMessagesForThreads(boringEmails);
  //メールの一覧作成。Html。メールのリンクはhttps://mail.google.com/mail/u/0/#all/ + そのメールのID
  const hyperLinks = messages.map(function(msg) {
    return makeHtmlHyperLink(msg[0].getSubject(), 'https://mail.google.com/mail/u/0/#all/' + msg[0].getId());
  })
  const htmlBody = makeHtmlList(hyperLinks);
 
  GmailApp.sendEmail('email@adress.gmail', 'メールまとめ', '', {htmlBody: htmlBody})
}

function makeHtmlHyperLink(str, url) {
  return '<a href="' + url + '">' + str + '</a>';
}

function makeHtmlList(arr) {
  return arr.reduce(function(acc, cur) {
    return acc + '<li>' + cur + '</li>';
  }, '<ol>') + '</ol>';
}

```
これを1週間トリガーで実行

#あとがき
Gmail側のフィルタ例
 from:(information OR noreply OR no-reply OR info@ OR notification)
重要なメールも混ざるので程々に。タグ付はGmail側でできるので便利。
スレッドがあるメールはうまく動かない。
Sigmoid曲線の定義域と値域を[0,1]にしたいだけ

# モチベーション

- 画像のコントラストをいじるトーンカーブをワンパラメータで実装したかった
- [画像のコントラスト調整のためのヒストグラムに適切な関数を探しています。](https://oshiete.goo.ne.jp/qa/6004727.html)ではシグモイドが推されまくっているが、シグモイドは値域が$[0,1]$ではない
- $0 \rightarrow 0$, $1 \rightarrow 1$であってほしい

## PseudoSigmoidの歴史

- [『シグモイド曲線の定義域が有界でないので、有界なシグモイド曲線を勝手に作ってみた』](https://qiita.com/unsolvedprobrem/items/a47737264883753ed340)を見つけた
- [『シグモイド関数でコントラスト強調』](http://kesaranpa.hatenablog.com/entry/2018/02/10/211641)も見つけた
- [『ガンマ曲線とシグモイド曲線による画像補正』](https://mikio.hatenablog.com/entry/2017/07/13/213105)でも似たようなことをしている

## 1. シグモイドをベースにちょっと縦に伸ばす
上記[『シグモイド関数でコントラスト強調』](http://kesaranpa.hatenablog.com/entry/2018/02/10/211641)や[『ガンマ曲線とシグモイド曲線による画像補正』](https://mikio.hatenablog.com/entry/2017/07/13/213105)での実装

```math
s(x) = \frac{1}{1+e^{a(b-x)}}\\
f(x) = \frac{s(x)-s(0)}{s(1)-s(0)}
```

### 結果
https://www.geogebra.org/m/ydqszvqw
![シグモイドもどき①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204792/1c4b47ed-21d7-1b83-8443-c8ceb61dfa8b.png)

#### いいところ
- 滑らか
- ナイーブ

#### 悪いところ
- コントラスト下げる方には対応できなさそう
- と思ったら[『ガンマ曲線とシグモイド曲線による画像補正』](https://mikio.hatenablog.com/entry/2017/07/13/213105)ではできてるっぽい。どうして。。。

## 2. PseudoSigmoid

[『シグモイド曲線の定義域が有界でないので、有界なシグモイド曲線を勝手に作ってみた』](https://qiita.com/unsolvedprobrem/items/a47737264883753ed340)の実装

```math
f(x) = \frac{sinh^{−1}[(2x−1)sinh(t)]}{2t} + \frac{1}{2}
```

### 結果
https://www.geogebra.org/m/ubnfhnzn
![Sigmoidもどき②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204792/f4a223cc-d472-6671-d478-6248c571a8e9.png)

#### いいところ
- 綺麗

#### 悪いところ
- 難しい
- コントラスト下げる方には対応できない


## 3. 指数アプローチ
指数で実装してみる。
$x^t$は$(0,0)$と$(1,1)$を通るので、これを二つひっくり返して繋げれば点対称なS字カーブができる。
以下$h$は変曲点。($[0,1]$にしたければ$h=0.5$)

```math
f(x) = \left\{
\begin{array}{ll}
h \Big( 1 + \big( \frac{x-h}{h} \big)^{2^t} \Big) & (x \geq h) \\
h \Big( 1 - \big( \frac{h-x}{h} \big)^{2^t} \Big) & (x \lt h)
\end{array}
\right.
```

### 結果
https://www.geogebra.org/m/d4zzqtqy
![Sigmoidもど③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204792/4abdf060-bec4-e9bc-8cfb-94c738af4138.png)



- なんかだいぶキモい
- **[pHジャンプ](https://hyper-chemistry.blog.so-net.ne.jp/2010-04-01)だこれ**

#### いいところ
- 負の値が実装できる

#### 悪いところ
- 変曲点付近に張り付く

## ここで気づく

```math
f(x) = \frac{sinh^{−1}[(2x−1)sinh(t)]}{2t} + \frac{1}{2}
```

これ、**逆関数出せるのでは？**

## 4. 拡張PseudoSigmoid
$t$が負の時には逆関数に移行することで、コントラストを落とす方にも対応する

```math
f(x) = \left\{
\begin{array}{ll}
0 & (t = 0)\\
\frac{sinh^{−1}[(2x−1)sinh(t)]}{2t} + \frac{1}{2} & (t \gt 0) \\
\frac{sinh[(2x−1)t]}{2sinh(t)} + \frac{1}{2} & (t \lt 0)
\end{array}
\right.
```

### 結果
https://www.geogebra.org/m/fxfwepyu
<img width="1138" alt="スクリーンショット 2019-09-25 19.55.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204792/c8ab95d6-f679-3674-c615-67094173ee4c.png">



### 実装
そのまま書いてみた ($[0,MAX] \rightarrow [0,MAX]$)

```JavaScript:extended_pseudosigmoid.js
function extended_pseudosigmoid(x, t, MAX){
	if (t === 0) return x;
	else if (t > 0) return (Math.asinh((2 * x / MAX - 1) * Math.sinh(t)) / 2 / t + 0.5) * MAX;
	else return (Math.sinh(t * (2 * x / MAX - 1)) / 2 / Math.sinh(t) + 0.5) * MAX;
};
```


## 結論
$\star$Sigmoidは偉大––––––！
OpenCVで二値化処理

# OpenCVで二値化処理を行う
大津の2値化を使用したが計算された閾値がしっくり来なくて自動計算できるものを探した。

## 二値化処理とは
ある画素の画素値を閾値によって、白または黒を割り当てる処理。

## メソッド

基本的には`cv2.THRESH_BINARY`を用いる
`cv2.THRESH_BINARY`は閾値よりも大きな値を白に割り当てるが、白黒反転や閾値以下のみを黒にするなどの処理もある。

* cv2.THRESH_BINARY
* cv2.THRESH_BINARY_INV
* cv2.THRESH_TRUNC
* cv2.THRESH_TOZERO
* cv2.THRESH_TOZERO_INV

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422261/3ed5432a-3537-05db-c056-4853550d7df2.png)
[opencvより転載](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html)

## 今回対象とする画像
![town.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422261/d5101e45-a892-7d1e-ba62-e26e9605d962.jpeg)

## 結果

`cv2.THRESH_BINARY`を使用して、閾値を適当に半分の127に設定。
パラメータの探索が面倒。
![town.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422261/24fd1409-3755-0984-a69a-1af59d220600.jpeg)

## 適応的閾値処理 

**適応的閾値処理**といういいものがあった。
`cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])`
二値化に必要な閾値を自動で計算してくれるというもの。
今回はガウス分布を利用した関数にして実装した。

```cv2_adaptive_threshold.py
cv2_img = cv2.imread('town.jpg')
gray_img = cv2.cvtColor(target_img, cv2.COLOR_RGB2GRAY)
(h,w,c) = cv2_img.shape
area_size = int(h*w/1000) # blockSizeはテキトー
i_binary = cv2.adaptiveThreshold(gray_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, area_size, 10)
cv2.imwrite(output_folder+image_name, i_binary)
```

結果は以下の通り

- 最後の引数の値が10
![town.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422261/ea9bc69f-92be-0b39-4d4b-bf19145b1618.jpeg)

- 最後の引数の値が2

![town.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422261/04be8749-7481-c6ee-9eae-eaa54145be8c.jpeg)
Ubuntu 18.04にPHP 7.2をインストール（OS標準）

# はじめに

Ubuntu18.04にPHPを標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

# apt update;apt install -y php
... 略
```

### 各種確認

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

# php -v
PHP 7.2.19-0ubuntu0.18.04.2 (cli) (built: Aug 12 2019 19:34:28) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.19-0ubuntu0.18.04.2, Copyright (c) 1999-2018, by Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc/php/7.2/cli
Loaded Configuration File => /etc/php/7.2/cli/php.ini

# apt show php
Package: php
Version: 1:7.2+60ubuntu1
Priority: optional
Section: php
Source: php-defaults (60ubuntu1)
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 12.3 kB
Depends: php7.2
Supported: 5y
Download-Size: 3084 B
APT-Manual-Installed: yes
APT-Sources: http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages
Description: server-side, HTML-embedded scripting language (default)
```
Golang - VSCodeでインストールしたパッケージについて

## はじめに
Golangの開発環境を用意する際、VSCodeで拡張機能をインストールしたり
VSCodeの`GO: Install/Update Tools`でコマンドラインツールをインストールしましたが
各機能について把握していなかったのでまとめました。

<img width="321" alt="スクリーンショット 2019-09-22 20.03.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151022/c709cb15-cefe-69fb-3a7e-4aa07280bf5e.png">


![スクリーンショット 2019-09-25 11.31.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151022/a4cba5bd-cd61-2213-5203-d2d5c7c33751.png)

## vscode-go
vs-code用の拡張機能
拡張機能の依存パッケージ（コマンドラインツール）をインストールことで機能が使える
機能については以下のリポジトリを参照

https://github.com/Microsoft/vscode-go

## gocode
コードの自動補完補完ツール
[github.com/mdempsky/gocode](github.com/mdempsky/gocode)

適用前
![gocode.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151022/b2471123-5985-9abd-f8de-b187f13de686.gif)

適用後
![gocode_af.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151022/14f7e1a4-1dac-b3a9-7621-d1ce30fdbc83.gif)


## gopkgs
インポート可能なパッケージのリストを表示
[github.com/uudashr/gopkgs](github.com/uudashr/gopkgs)
![gopkg.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151022/5bf861a7-1aa3-1478-b1ae-afa540039e48.gif)


## go-outline
JSON表現を抽出するためのシンプルなユーティリティ
[github.com/ramya-rao-a/go-outline](github.com/ramya-rao-a/go-outline)

## go-symbols
ワークスペースシンボル検索
[github.com/acroca/go-symbols](github.com/acroca/go-symbols)

## guru
ソースコードの静的解析など行うツール
[golang.org/x/tools/cmd/guru](golang.org/x/tools/cmd/guru)

## gorename
変数名や関数名のリネーム等ができるリファクタリングツール
[golang.org/x/tools/cmd/gorename](golang.org/x/tools/cmd/gorename)

## gotests
特定のソースファイルまたはディレクトリ全体のテスト生成
[github.com/cweill/gotests/](github.com/cweill/gotests/)

## impl
インターフェースを実装するためのメソッドスタブ生成
[github.com/josharian/impl](github.com/josharian/impl)

## fillstruct
構造体のフィールド初期化を行うリファクタリングツール
[github.com/davidrjenni/reftools/](github.com/davidrjenni/reftools/)
![fillstruct.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151022/1b6ccc2b-516c-9bf8-5e86-ec7a5274b736.gif)

## goplay
Webインターフェース
[github.com/haya14busa/goplay/](github.com/haya14busa/goplay/)
![goplay.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151022/0b5ec001-47c0-1af9-0b7b-d9d8af062c98.gif)


## godoctor
リファクタリング支援ツール
[github.com/godoctor/godoctor](github.com/godoctor/godoctor)

## dlv
デバッガ
[github.com/go-delve/delve](github.com/go-delve/delve)
![dlv.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151022/ce8824fd-8d3b-b9d4-752a-59720520653b.gif)

# gocode-gomod
[github.com/stamblerre/gocode](github.com/stamblerre/gocode)

## godef
定義情報の参照、ジャンプ
[github.com/rogpeppe/godef](github.com/rogpeppe/godef)

適用前
![godef.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151022/6c64c89f-dd98-d4b6-5165-3267fa5fff57.gif)

適用後
![godef_af.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151022/5881eef0-47be-4c0d-4fea-4ca5e90758bd.gif)

## golint
Linter
[golang.org/x/lint/golint](golang.org/x/lint/golint)

![golint.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151022/110739b4-7967-3dea-626e-c8ea1de9d85f.gif)
DOSバッチでバッチファイルを読み込んで編集して書き出したかった〜後編〜

#エンジニア一年生と「rem削除」の闘い～その2～
前回　[エンジニア一年生と「rem削除」の闘い（Qiita内）](https://qiita.com/osashimi_oishi/items/8826f17a3a61c0236f01)

##前提
（免罪符ともいう）
本稿を書いている私は刺身を好きなだけ食える生活がしたいだけの、2019年8月から黒い画面を触り始めたバチバチの初学者です。
完全ではない情報、詰めの甘い部分、もちろん誤った認識等があれば、申し訳ありません。ご指摘ください。
キツい言葉はやめてください。こころおれる。

##前回からの持ち越し
> **これが鬼門**
> 読み込みと書き出し自体に問題は発生しなかったが、コピー元ファイルで
> ```
> set LOG="nanyara.log"
> ```
> 等したログファイルが
> - %LOG%というお名前で
> - カレントディレクトリに
> - 完全な状態で
> 作成されるという現象が発生。
> 
> ***
> ※「完全な状態」...　echo %date% %time% start > %LOG%　等して書き出している内容がログとして記載された状態

調べて出てきたのは「構文解析」という言葉だった。
正直今でもわかっていないとは思うが、
**バッチの文法をバッチに読ますと「進研ゼ〇で見た！」とばかりに張り切ってしまう**
ということではないだろうか。と解釈している。

***
もうすこし真面目な言葉にすると
1)　バッチファイルは自分の理解できる文法を見かけると「解析」してしまう
2)　「解析」は通常「.batのファイルを実行する」と同義である
3)　ただし「実行する」時にだけ「解析」が行われるわけではない
4)　「.batで実行できるファイル」が「理解できる文法」である
5)　「.batで実行できるファイル」の「拡張子を変えた.logや.txt」も文法は同じとみなされる
以上より**.batで実行できるファイル（現在の拡張子を問わず）を.batに読み込ませると、該当ファイルを実行したのに近い動作が発生する場合がある**という風に解釈している。ということです。

##バッチでなければならない？
そんなことはない。

ただし、自由にソフトウェアをインストールできる環境ではない。
この件を整理すると下記のようになる。
***
###Windows標準の機能で実装したい
なぜか　：基本的にソフトウェアの新規インストールはできないから
- Windows標準の
  - コマンドプロンプト（バッチ）：もういや
  - PowerShell　：ざっくり調べた感じ、操作対象としての得意分野はファイル単位というよりはシステム側になりそう
  - vbs　：ファイルの編集もできるらしい　むしろ得意らしい

##vbsの勉強をした
###感想
- 戻り値の取得がやたらむつかしい
- オブジェクトをたくさんつくることになる
- 文字がいっぱいになる
- ナレッジがあまりヒットしない

詰みでは？などと思った。

##DOSに戻る
vbsでもいろいろやったものの「スマートではない」どころか非常に泥臭いスクリプトしか書けなかったし、結局やりたかった**バッチの文法をvbsに読ます**方法（具体的にはファイル内全文検索と条件に一致した場合の処理分岐、別ファイルへの書き出し）を見つけられなかったので割と心が折れた。

心が折れるとどうなるか。
やけくそになる。

##解決
###コピー元にあたるバッチファイルを複製し、全文を""で囲んだ。

めちゃくちゃな力技を行使した。
正直実装する必要に駆られていたわけではなく、むしろどちらかというと「業務に使えればいいなと思った趣味の範囲での追及」のような状況になっていたのでこれでもよかったが、業務に使うにはあまりにもクソコードではないかと思ったので使っていない。

やるにあたって
- 書き出しのセクションで!書き出す文:~5,-1!とするとか、""がある前提で文字列を加工することになる
- そもそも原文に""が含まれている場合（ファイルパス等）、原文の方の""を殺さないで後付けの""を使う　方法を考えている暇があったらほかのことを考えた方がいい
- この時点でやっと気づいたわけですが元ファイルで"%~dp0"とか使っているやつが"C:\~~"に展開されている場合もあった（注視していなかったので再現条件が不明）

##例の免責
一応動いたはずのテストコードを編集して記載しているものの編集ミス等で動かない可能性もあるコードたちです。致命的な何かが起こっても責任は負えません。
ただしご指摘をいただければありがたく修正します。