OmniAICreator/Qiita-1.07M huggingface dataset:
Share×Dule

#目次
[１．課題について](#1)
[２．作成したアプリについて](#2)
[３．ターゲット](#3)
[４．特徴について](#4)
[５．行程について](#5)
[６．その他（アプリの資料・発表資料など）](#6)




#１．課題について(連絡の効率的で正確な伝達）
　私たちは現在、高校生です。高校生の立場から見た学校生活の中で課題になっていることが多くあります。その一つが連絡の効率化です。

　学校で時間割の変更や呼び出しなどの連絡が効率よく伝わらないことが多いと考えました。実体験からは〇〇先生に用があるのに職員室にもいない、連絡板にもどこにいるか書かれていないなど…

　そのほかにも時間割の変更や委員会・部活動の呼び出しでは紙面や声による伝達では時間がかかることや伝達の途中で間違った内容や情報を連絡してしまうこともありました。
　
そのようなことが起こらないために今、ほとんどの人が利用しているスマホやパソコンで簡単に確認・共有できるようにしたらよいのではないかと思いこのアプリを考えました。

#２．アプリについて
　このアプリは、学校生活での呼び出し、予定の変更、集合予定、教員の会議や出張がいつありいつ学校にいないのかなどを全体で共有しすることで誰もが確認できます！
　
　例えば、もしその教員に用事があったとしても行動を早く対応することができます！
もちろん、生徒もどこで何をしているのか書き込めるので教員も生徒を探すのに便利です！

　また、学校全体で共有することによってすべての人が同じ情報をいつでも見ることができ、伝達時間の短縮化や誤報の減少にもつながります！


#３．ターゲット
すべての高等学校の生徒と教員


#４．特徴について
・学校全体のその日の予定が一目でわかる

・個人の呼び出しについてはチェック欄があるので相手が確認したかがわかる

・カレンダー式で表示されるので当日だけでなく他の月・日の予定も共有・確認することができる

・他の月・日の予定も確認できるので自分の予定も立てやすい

・教員だけ、生徒だけでなく教員にも生徒にも情報が共有できるため教員に用事があり探す時や生徒の呼び出しなどをスムーズに行うことができる

・呼び出しや情報の伝達が声や紙面で伝えるよりも正確でスムーズなので誤報がなく確認しやすい


#５．行程について
![kintone(訂正）5.png](https://qiita-image-store.s3.amazonaws.com/0/287034/ed10cc06-948a-03f3-6d9e-b2a41ef5ba04.png)
↑ 連絡事項を入れたい日にちにカーソルを合わせ、追加ボタンを押し〔タイトル名〕にカレンダー上に出したいタイトルを入れます ↓
![kintone(訂正）6.png](https://qiita-image-store.s3.amazonaws.com/0/287034/01eb357e-e9dd-2875-640a-a60abf5fa4fa.png)
委員会や部活動などの個人以外の多人数グループに連絡する際　例えば「風紀委員」とタイトル名に入力します↑
![3.png](https://qiita-image-store.s3.amazonaws.com/0/287034/0650e801-2537-5c80-3ad4-6e54418b4cc5.png)
内容や場所時間、もちものなどを入力します ↑
記入後に保存を押しカレンダー画面に戻ると このようにカレンダー上に表示されます ↓
![kintone(訂正）7.png](https://qiita-image-store.s3.amazonaws.com/0/287034/cb3ababa-872a-6c46-a41c-5c209ead9146.png)
実際に「風紀委員」という場所をクリックすると予定の確認が行えます ↓
![kintone(訂正）8.png](https://qiita-image-store.s3.amazonaws.com/0/287034/a82fb251-876b-b7f6-ff62-1c5d6a7eb8ad.png)
個人の呼び出しをしたい場合は例えば呼び出したい人名「山田太郎」とタイトル名を入力し山田太郎さんの学年と組番号を入力します
![kintone（訂正）2.png](https://qiita-image-store.s3.amazonaws.com/0/287034/26d9f480-949a-048f-28fc-679815dc3466.png)
あとは他と同じように入力し保存をすればカレンダー上にはこのように表示されます ↓
![kintone(訂正）9.png](https://qiita-image-store.s3.amazonaws.com/0/287034/b014db20-91f4-d578-604c-d88484c65bbb.png)
↑ 「山田太郎」をクリックするとこのような表示が出てきます　個人チェック機能を使用したい場合や内容の変更を行いたい場合は右上にある「レコードを編集する」をクリックします ↓
![kintone(訂正）4.png](https://qiita-image-store.s3.amazonaws.com/0/287034/4a0c5ac6-8c7f-a0dd-bd6b-473fe8c2f791.png)
確認したら個人チェックの「確認しました」をクリックし、保存を押します ↓
![15.png](https://qiita-image-store.s3.amazonaws.com/0/287034/47e95c03-8483-e959-1c44-362b41509965.png)
これで個人の連絡がその人にしっかり届いているという確認がとれます ↓
![16.png](https://qiita-image-store.s3.amazonaws.com/0/287034/27b36e83-9698-7b57-975a-24894ca28a24.png)
このアプリでは誰が変更・追加したか見ることができるので不正な行為はできません



#６．その他（アプリの資料・発表資料など）
日直日誌

#目次
[１．課題について](#1)
[２．作成したアプリについて](#2)
[３．ターゲット](#3)
[４．特徴について](#4)
[５．行程について](#5)
[６．その他（アプリの資料・発表資料など）](#6)




#１．課題について
日直日誌を手書きで作成してから先生に見せるまでは時間がかかるため、ほかの作業ができません。そのため担任を含むクラス全員がスマホ、PCを使って日直日誌を作成でき、簡単に共有することができるアプリを作成しようと考えました。

#２．アプリについて
　教科名はプルダウンメニューから選択することができ、教科担当の先生や授業内容まで詳しく記入をすることが可能です。
　そして、仕事の評価はチェックボックスを使うことで簡単に1日の振り返りができます。感想や担任のコメントも書く欄が大幅にあるため、長い文章でも記入ができます。
　また、最後には明日の日直を記入できる欄があるため、先生、生徒に次の日直を知らせることができます。




#３．ターゲット
スマートフォン、PCを持っている高校生


#４．特徴について
・時間に余裕があるときに簡単に日誌作成ができる

・クラスで簡単に共有することができる

・チェックボックスをつけてあるので簡単に確認できる

・教科名はプルダウンメニューから選べるため打つ必要が無い

・アプリさえ入れてあればいつでもどこでも読み書きができる



#５．行程について
１．カレンダーにある＋（追加）を選択する
![はじめ.png](https://qiita-image-store.s3.amazonaws.com/0/287032/c78441ac-8edc-859f-8aa1-bfe3d0c9367d.png)

２．日直日誌の作成画面が出てくるので入力する
![4-2.png](https://qiita-image-store.s3.amazonaws.com/0/287032/f55af2a1-f674-68f8-5b3a-5b135c4dcf54.png)

教科名はプルダウンメニューを開けば教科が出てくるためそこから今日の授業を選択する
すべて入力できたら「保存」を選択する
![7-3.png](https://qiita-image-store.s3.amazonaws.com/0/287032/dcf8dc03-e0b7-581e-3450-4de4742b7557.png)

一通り入力するとこのような形になります
![2-4.png](https://qiita-image-store.s3.amazonaws.com/0/287032/2b9ad0ad-a818-d569-e0f5-16e1639b66d6.png)

３．保存をして１のカレンダー画面に戻ると日誌を作成した日の欄に時間と作成者の名前が表示される
![5-5.png](https://qiita-image-store.s3.amazonaws.com/0/287032/8282866f-792f-c1ee-b00e-107b3e9b7f45.png)

また、日誌へのコメントもできるためクラス内でコミュニケーションをとることもできる
![61.png](https://qiita-image-store.s3.amazonaws.com/0/287032/032c6e8d-7265-81c6-98f5-6d41cf347f6b.png)











#６．その他（アプリの資料・発表資料など）
スタディプラン

#目次:eye:
1．課題について
2．アプリについて
3．ターゲット
4．特徴について
5．作成した行程について
6．その他（アプリの構成）




#1．課題について:writing_hand_tone1:
　「課題がたまってしまう…:weary:」「テスト勉強がはかどらない…:sleeping:」「テストまで時間がない…:dizzy_face:」だけど「計画がうまく立てれない…:worried:」立てても「その通りに進まない…:cold_sweat:」人が多い！！そのため自分の全力でテストを受けることができず、悲しい結果に・・・:sob:それを少しでもなくし、計画的に勉強してもらい、成績を上げ、進路の幅を広げてもらいたい！！
　私たちの学校では、テスト期間中の学習計画を、プリントに記入し、先生に提出していました。書くのを忘れてしまったり、提出し忘れたり、とても大変でした:confounded:それを改善するため、アプリを使い、いつでも簡単に書き込め、いつでも提出できるようにしたい！！と考えました。

#2．アプリについて:writing_hand_tone2:
このアプリは、勉強の計画を細かく立てることができるアプリです:point_up_tone2:
１日の目標を立て、何時から何時まで何の教科の何をやるのか、細かく計画を立てることができます。１日の勉強が終わり、その日の反省も書け、次の勉強に活かすことができます。そして、学校や、塾で使用する場合、先生にそのデータを送信し、アドバイスや、コメントをもらうことができます！！



#3．ターゲット:punch_tone1:
計画が上手く立てられず、困っている学生:tired_face:

実際私たちも計画を上手く立てれず、切羽詰って勉強して後悔したことがたくさんあります。
プリントでの計画は、やはり書くことが面倒で、継続して続けることができませんでした。そのような学生は多いと思います。今の学生は、学習の目標も立てず、意志が低下している人も多いと感じています。




#4．特徴について:point_up_2_tone1:
・１日の目標が立てられる

・始める時間、終わる時間を書き込める

・何の教科をやるか書き込め、専門的な教科は自分で打ち込める

・その教科をどう勉強するのか、内容を書き込める

・達成度を書き込める

・１日の反省を書き込め、次回の勉強につなげることができる

・先生に計画を送れ、それにコメントや、アドバイスをもらうことができる

#5．作成した行程について:open_hands_tone1:
①アイデアを出し合う
　まず課題を見つけ、それを解決するために何が必要なのかを考えた。

②出たアイデアを紙や付箋を使いまとめていく
　とにかく出た意見は書き出し、まとめていった

③考えたアプリにどのような機能が必要かを考える
　使う人たちのことを想像して、この機能があれば便利だなとか、
　使ってもらえるな、ということを考えながら行った

④kintoneを使いわかりやすくなるようにアプリの構成を考えた
　見やすさを重視し、簡単にまとめられるように考えていった

#6．その他（アプリの構成）:writing_hand_tone1:
![kintone.png](https://qiita-image-store.s3.amazonaws.com/0/287031/d3e011f3-28cf-c122-2059-6522e4d1cb68.png)

これに入力すると・・・

(例)
![kintone2.png](https://qiita-image-store.s3.amazonaws.com/0/287031/6550b587-69c3-690f-86cd-35bdfc5fe0a0.png)
Work-Shareing

#目次
[１．課題について]
[２．作成したアプリについて]
[３．ターゲット]
[４．特徴について]




#１．課題について
私達は普段学校生活をしてく中で、突然の授業変更や台風など自然災害による休校の知らせが遅いことに不満を持っていました。
対応するのが遅くなることにより授業への移動が遅くなったり、休校なのに学校の途中まで来てしまう、ということが度々あり「もっと早く情報が知りたい！」と感じました。
また部活動の有無やその日の内容を顧問の先生に確認に行くのが手間に感じてしまい、確認しなくても予定が共有できれば楽になるのに、と考えました。
上記のようなことがなくなれば「より効率的に時間を使える！」と思い、学校生活に特化したアプリを作成しようと考えました。

#２．アプリについて
このアプリは、少しでも学校が楽に、効率的に生活するための情報共有アプリです。
突然の授業変更、台風などの自然災害による天気・警報を即座に見ることができ、それによる休校などを学校のＨＰを確認せずともアプリを見ることで対応することができます。
また部活動の予定などを記載するアプリと連携することにより、その日の部活動の有無・内容を見ることもできます。

アプリ画面例　Work shering↓
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/287030/5f28ddc7-cd7b-8e0d-6c15-532e7edc6e13.png)

部活動連絡アプリ↓ 
![a.png](https://qiita-image-store.s3.amazonaws.com/0/287030/ef787971-2142-868b-efd1-3f3d27765fc9.png)

部活動名の右のアイコンをクリックすると、様々な部活動を選択することができ、その選択された部活動に所属している人に通知が行くようになっています。
![b.PNG](https://qiita-image-store.s3.amazonaws.com/0/287030/44c7ddb4-d914-8822-059d-9d461b765d0a.png)



#３．ターゲット
静岡県の学校の教員、学生（特にスマートフォンを使える高校生）

#４．特徴について
・静岡県の天気・警報が見れる

・その日の連絡事項がわかる。

・日程についての変更がわかる。

・先生のところへ行く手間が省ける。

・高校生活が少しだけ楽に、効率的になる。
　　→自分の使える時間が増える!
Tips♪

#目次
[１．課題について]
[２．作成したアプリについて]
[３．ターゲット]
[４．特徴について]
[５．使い方について]



#１．課題について(プログラミングが始めての高校生)
現在の日本ではネットなどを通じ様々なニュースを知りたいときに知ることができる。しかし記事を呼んで自己理解するだけでは自分の解釈が本当にあっているのだろうかと不安を覚えてしまいがちである。
たとえば就職試験や受験での面接の最近気になったニュースは何かという質問に対して、自分の意見が本当に正しいのだろうかと思いうまくしゃべることができないこのような経験をしたことがある方は決して少なくはないはずだ。
私たちはもっと多くの人に、世の中の出来事を知ってほしいと考えこのアプリを作成した。



#２．アプリについて
このアプリは、ネットに乗っているニュースに対する理解を深めたい方や、ニュースをじっくり見て自分の意見を考えるのが苦手な人の向けに作成しました。
ひとつの記事に対して複数の人でコメントをしその記事に対して理解を深めていきます。そして年代別、職業別にで意見を見ることができるので、様々な年代の意見を比較していくこともできます。
自分だけの意見だけではなく他人の意見も見ることで意見共有ができ自分を伸ばすことができるのではないでしょうか


#３．ターゲット
受験や就職試験での面接対策を目的としている中高生や大学生。最近のニュースへの関心があり様々な人の意見を聞きたいと思っている社会人の方々。


#４．特徴について
・様々な人たちの意見を聞くことができる

・就職試験や受験の面接対策ができる

・最近のニュースや話題のニュースを知ることができる

・ニュースの理解が容易になる

・世に中の流れを感じることができる

・年代別の意見の傾向を知ることができる





#５．使い方について
性別、名前、年齢を書き込み　
記事→それ対する自分の意見を書き込みupする
![tipsスクショ.png](https://qiita-image-store.s3.amazonaws.com/0/287029/6ef2f29d-7067-dc60-4e47-a6ec3bb1313c.png)

upしたものに対し様々なコメントをもらい理解を深める↓
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/287029/74e1ca2b-5d17-4de0-c078-6125c50ae05b.png)
【C#】【自分用メモ】StringBuilderを使用して1,000,000文字高速で格納する

研修で作成したものの自分用メモ。
StringBuilderで予めCapacityを指定しておく。
参考：https://dobon.net/vb/dotnet/string/stringbuilder.html

```C#:MillionStr.cs
static void Main()
{
    const int LoopCount = 1000000;
    StringBuilder sb = new StringBuilder(LoopCount);
    const string AppendedString = "あ";
    //// ストップウォッチクラス生成
    var sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    for (int i = 0; i < LoopCount; i++)
    {
        sb.Append(AppendedString);
    }
    sw.Stop();
    Console.WriteLine(sw.Elapsed.ToString());
}
```
[Qiita Markdown記法]ページ内リンク・注釈・折りたたみ等

# 内容
自分向きメモです。
Qiita Markdown記法での、

* ページ内リンク
* 注釈
* 折りたたみ
* コメントアウト

の書き方についてのまとめ。

## ページ内リンク
それぞれのリンクをクリックすると、記法が書いてあるアンカーリンクに飛ぶようにしてある。

* [見出し1](#見出し1): 「捻りのない」場合
* [見出し2](#見出し2): 「見出し2以下」へのアンカーリンクの場合
* [見出し2.1](#見出し21): 見出し文字に`.`や`,`が入っている場合
* [見出し2-2](#見出し2-2): 出し文字に`-`が入っている場合
* [見出し2 3](#見出し2-3): 出し文字に`(スペース)`が入っている場合
* [Midashi3](#midashi3): 見出し文字の始まりが大文字のアルファベットの場合

## 注釈
注釈記法を使うと、右上に文字が出て注釈へ飛べる[^1]
注釈したい部分と注釈文には以下のように記述する

```.md
記法: ほげほげ[^1]
注釈先: [^1]: ふがふが
```

## 折りたたみ

<details><summary>折りたたみ</summary>
折りたたみ中身の文章
</details>

記法:

```.md
<details><summary>表示文字</summary>
中身の文章
</details>
```

### 折りたたみの中身にコードが含まれる場合
`<details></details>`の中で、コード部分を`<div>～</div>`で囲む必要がある

記法:

```.md
<details><summary>表示文字</summary>
中身の文章
<div>

/```
コード部分
(`の前の/は実際にはいらない)
/```

</div>
</details>
```

<details><summary>コード含む折りたたみ例</summary>
ここは`<div>`で囲んでない
<div>

```test.py
# コード部分だけ<div>で囲んである
print("test")
```

ここも`<div>`で囲んでない

</div>
</details>

## コメントアウト
HTMLのコメントアウトの方法が使える

記法: `<!-- (コメントアウトしたい内容) -->`


***

# 見出し1
アンカーリンク記法: `[見出し1](#見出し1)`

リンクの記法`[表示文字](リンクURL)`を使う
`(リンクURL)`の部分に「`#` + `見出し文字`」と記述する

## 見出し2
アンカーリンク記法: `[見出し2](#見出し2)`

見出し2以下であっても、`#`の数は1つ

## 見出し2.1
アンカーリンク記法: `[見出し2.1](#見出し21)`

見出し文字に`.`や`,`が入っている場合、
`(リンクURL)`部分には`.`や`,`を無視して記述する

## 見出し2-2
アンカーリンク記法: `[見出し2-2](#見出し2-2)`

見出し文字に`-`が入っている場合、
`(リンクURL)`部分にはそのまま記述

## 見出し2 3
アンカーリンク記法: `[見出し2 3](#見出し2-3)`

見出し文字に`(スペース)`が入っている場合、
`(リンクURL)`部分には`(スペース)`を`-`に置き換えて記述する

# Midashi3
アンカーリンク記法: `[Midashi3](#midashi3)`

見出し文字の始まりが大文字のアルファベットの場合、
`(リンクURL)`部分には`大文字`を`小文字`に置き換えて記述する

[^1]: 注釈です
php-master-changes 2018-09-11

# 2018-09-11
## weltling: 7.0.33 next
- https://github.com/php/php-src/commit/1b89522974d7596df23d7875a0d1e155c503c50a
- PHP 7.0 系の作業バージョンを 7.0.33 へ

## dstogov: Squashed commit of the following:
- https://github.com/php/php-src/commit/3a249e769b293afa454b18b8d894c3395683d26c
- プロパティのフラグ ZEND_ACC_SHADOW の削除
- [PR](https://github.com/php/php-src/pull/3502) 出して作業してた奴をマージしたもの
- 親クラスで定義されて子で定義されない private プロパティを、ZEND_ACC_SHADOW という属性としてコピーして子で持ち、適切な位置からのアクセスかのチェックに利用していた
- これを ZEND_ACC_PRIVATE に統合し、アクセス時のチェック処理を追加して区別するようにしている

## dstogov: Added test for bug [#76860](https://bugs.php.net/bug.php?id=76860) (Missed "Accessing static property as non static" warning).
- https://github.com/php/php-src/commit/5c39b2c328d002e81dd4889ca67a70e55b485861
- private static なプロパティへ -> でアクセスしようとした時に家一句が出なかったバグが前のコミットで修正され、そのテストの追加

## dstogov: Get rid of ZEND_ACC_IMPLICIT_PUBLIC
- https://github.com/php/php-src/commit/034b7ff09143e3d86d6e4f8c15728b52b0c413d7
- リフレクションでだけ使われていたプロパティのフラグ ZEND_ACC_IMPLICIT_PUBLIC の削除

## cmb69: Fix [#76510](https://bugs.php.net/bug.php?id=76510): file_exists() stopped working for phar://
- https://github.com/php/php-src/commit/b117feeb2b545b34296f2fc492166d790610fffe
- [GCC8 の strlen() の最適化バグ](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86914) への対策を入れた
- file_exists() が phar:// に動かなくなっていた

## dstogov: Use mnemonic names
- https://github.com/php/php-src/commit/37290ad8d2bd68dbe1c2884c163947416124f4f9
- ext/reflection のテストで即値を使っていたところを定数に置き換え

## nikic: Drop unused variable
- https://github.com/php/php-src/commit/e1123e3e4ea3f41062c4ac47bb5a33aac77a837e
- 不要な変数の削除

## dstogov: Removed weird test, trait can't be "static" or "final".
- https://github.com/php/php-src/commit/1570fe180f34f957ad55e912133cd34ac99087d5
- trait のメソッドをクラスへ導入する際、既存の abstract メソッドの宣言と互換性があるかのチェック処理を修正
- trait は final や static にはできないので関係ないはず、としてそのチェック部分を外してるもよう

## dstogov: Renumber ZEND_ACC_... flags
- https://github.com/php/php-src/commit/0fbd2e6a168a5cfacec6c44f4c179879a52428f3
- ZEND_ACC_ 系のフラグの番号を振り直し


## cmb69: [ci skip] Update NEWS wrt. php-7.3.RC1 tagging
- https://github.com/php/php-src/commit/e6585a472ea9457ef4edd05dfb6ed56144b2a9a4
- PHP 7.3.0RC1 のタグをうって作業バージョンを PHP 7.3.0RC2 へ
ヘキサゴンの数学

# 概要
戦略ゲーム等でよく見る、六角形のタイルで敷き詰められた座標系に関するあれこれ。以下のページが self-contained でかつ内容的にも実用上十分であると世界的に認知されている:

- 理論: https://www.redblobgames.com/grids/hexagons/
- 実践: https://www.redblobgames.com/grids/hexagons/implementation.html

言語別のライブラリ一覧

- https://www.redblobgames.com/grids/hexagons/implementation.html#third-party

以下は、忘れっぽい将来の自分に向けたメモ

# ２つのオプション
六角形の頂点が 12時方向に向くように敷き詰める方法を **pointy** なレイアウトという。六角形の辺が 12時方向を向くように敷き詰める方法を **flat** なレイアウトという。


# ３つの座標系
大まかにいって我々は３つの座標系を行き来する。(X, Y)-座標系, (x, y)-座標系, (q, r)-座標系。

(X, Y)-座標系は横軸右が X軸正の方向、縦軸下が Y軸正の方向の座標系であり、SVG や pixi.js など世の中のかなり多くの 2D ライブラリで採用している座標系である。単位はピクセル。

(x, y)-座標系は、同じく直交座標系であるが、スケールが異なる。この座標系では六角形の外接円の半径を 1 とする。原点は六角形の中心点とする。

(q, r)-座標系は、斜交座標系であり、(x, y)-座標系と同じく六角形の外接円の半径を1とし、原点として六角形の中心点をとる。pointy の場合、q 軸正方向は 3時方向、 r 軸の正方向は 5時方向。flat の場合は q軸は4時方向、r軸は6時方向。基底ベクトルの長さは各六角形の中心間の距離、すなわち√3 とする。

# 座標系を一意に指定するもの

前述のように、レイアウトの任意性と、(X, Y)-座標系の任意性がある。これを特徴づけるパラメータさえ決めてしまえば、各座標系の相互変換が一意に決まる。以下がパラメータ

- `layout`: 2値。すなわち pointy か flat のいずれか。
- `originX`: 単位はピクセル。(X, Y)-座標系の原点位置の X座標
- `originY`: 同上。 Y座標。
- `radius`: 単位はピクセル。(X, Y)-座標系における六角形の外接円の半径

上記の４つの数値が与えられれば、任意の点 P の各座標系における座標を相互変換できる。多くの場合、(q, r)-座標系で各種作業をして、(X, Y)-座標系に変換してUIライブラリに渡すという処理パターンになる。

# 主要トピック

**rounding / binning**
点の座標 (X, Y) が与えられた時、その点がどの六角形に所属するか？というのがよくあるユースケースで、round とか bin と言われる。座標を、(q, r)-座標系に変換して、四捨五入相当のことをするのだが、すこしややこしいアルゴリズムが必要になる。

**distance**
「移動力 3 の戦車が移動できるタイルは？」というようなユースケースで重要になる。マンハッタン距離に似たような、ちょっと違うような距離関数を定義できる。

**path finding**
任意の二点を指定した際にどの六角形を通るのかを探すアルゴリズム。A*-アルゴリズムが使えるので固有の難しさは存在しない。

**map creation**
指定された形（長方形・三角形・六角形などなど）のタイル一覧を生成する機能。世界地図の作成に使われる

**wraping**
作成した世界地図をつなげる。右の境界をすぎると左端から出て、、、などなど

**rotation**
回転。ユースケースは少ないが、アルゴリズム的に美しい。座標の符号を反転させるだけ！
1-1、Pythonのインストール（Windows編）

　PythonはOSに依存しないので、Windows、Mac、Linux/Unixでも使える。Windows上で書いたPythonプログラムは、Linux上でも動きます。
　Pythonプログラムを開発する為、PCにPythonのインストールが必要です。インストール完了後、インタプリタ、対話型コマンドプロンプトと簡単な開発環境が使える。

## Pythonのバージョン
　現在の所、Pythonは2.x系と3.x系の2つのバージョンがサポートされています。2.x系と3.x系はソースコードの交換性がないです。3.x系の方が新しく、様々な改善がされているので、ここではpython3のインストール方法を紹介します。

## Pythonのインストール方法

　まずは、自分のWindowsシステム種類（32ビットあるいは64ビット）によって、[Pythonの公式サイト](https://www.python.org/)からインストールファイルをダウンロードしてください。現在はPython3.7.0をインストールするをお勧めします。
　公式サイトトップの「Downloads」をクリックすると、Download for Windowsと表示される部分に専用ダウンロードボタンがあります。![1_1公式サイト.PNG](https://qiita-image-store.s3.amazonaws.com/0/263439/7408d207-3104-381a-13e0-fdb6f03b9bb6.png)
「Python 3.7.0」をクリックすると、ダウンロードできます。ダウンロードしたファイルをクリックして、インストール開始画面に移動します。![1_1インストール0.PNG](https://qiita-image-store.s3.amazonaws.com/0/263439/41ab5119-2630-a0c7-bf55-8e34d68a9636.png)
「Add Python 3.7 to PATH」を選択し、「Install Now」をクリックしてください。問題なければインストールが完了できます。

## Pythonの対話モード起動する方法　
　 Windows10ではいくつかの方法でコマンドプロンプトを呼び出すことができます。
　キーボードの「Winキー」＋「R」を押す、名前欄に　cmd　と入力してください。
![install1.JPG](https://qiita-image-store.s3.amazonaws.com/0/263439/e5d304b2-29a2-b163-8a4c-0d34406c29e3.jpeg)
「OK」を押すとコマンドプロンプトが起動します。
![install2_cmd.JPG](https://qiita-image-store.s3.amazonaws.com/0/263439/b725bb21-59ab-bb78-fa53-67325f82a976.jpeg)
 そこに、Pythonを入力して、「enter」キーを押すと、二つ状況が発生することがあります。
　①「>>>」という文字（プロンプト）が表示されると、インストールができたとの意味です。そのプロンプトの後ろにプログラムの入力ができます。今回は「exit()」を入力し、Pythonの対話モードを閉じれます（直接コマンドプロンプトを閉じでもよい）。
![cmd.JPG](https://qiita-image-store.s3.amazonaws.com/0/263439/a46a149a-c6ea-5c41-060f-d69eb2cecc67.jpeg)
　②エラーメッセージが表示される。
> ‘python’は、内部コマンドまだ外部コマンド、捜査可能なプログラムまたはバッチファイルとして認識されていません。

![cmd_err.JPG](https://qiita-image-store.s3.amazonaws.com/0/263439/5dbd4988-4ee4-71c7-16d1-20af5efbf5c5.jpeg)
Windowsシステムは「path」で設定された環境変数からpython.exeを実行する、そこにいないと、エラーメッセージが表示されます。Pythonインストール際、「Add Python 3.7 to PATH」の選択が忘れたら、手動でpython.exeを「Path」に追加してください。追加方法がわからない方は再度インストールを薦めます。

## まとめ
・今回はPythonのインストールとPythonの対話モードの開くと閉じる方法を勉強した。

前章　[0、Pythonについて）](https://qiita.com/ousrok/items/e7503363f6a800da584f)
次章　[1-2、Pythonのインタプリタ](https://qiita.com/ousrok/items/0edacb92b0c7054ba81a)
目次　[python 勉強完全まとめ(素人向き)](https://qiita.com/ousrok/items/135734b5f66afb497253)
Android Studioで保存すると自動でコード整形したい

コードを書いて「コード整形＋インポート最適化＋ファイル保存」 ←この作業を1アクションで済ませたい。

やり方は2パターンある

- マクロを使う方法
- プラグインを使う方法

## マクロを使う方法

以下の動作をマクロとして記憶させて⌘S（もしくはctrl+s）に割り当てる。
- Code => Optimization Imports
- Code => Reformat Code
- File => Save All

以下の記事に詳しく紹介されている。  
Android Studioでファイル保存時にコードを最適化したい - Qiita https://qiita.com/chocomelon/items/46810763a5be0a433158

### マクロのメリット
- やる事がシンプル
- カスタマイズ可能
- マクロの有効/無効が簡単、Android Studioを再起動せずに済む
- Android Studio起動時にPlugin読み込み数が減って起動が早くなるかも？

### デメリット
- 機能はプラグインに及ばない
- 新たにAndroid Studioをインストールして設定するとき、自動整形マクロを作成/設定方法を毎回忘れる
  - （マクロファイルをインポートすればいいだけだが、それすらも面倒だと思う時がある）

## プラグインを使う方法

**Save Actions** というプラグインをインストールする

Save Actions - Plugins | JetBrains https://plugins.jetbrains.com/plugin/7642-save-actions

いい紹介記事が見当たらなかったのでスクショを貼っておこう

### インストール

Preference => Plugins => Install JetBrains Plugin...  
からSave Actionsを検索してインストールする。

インストール完了したらAndroid StudioをRestartさせる。

<img width="1134" alt="スクリーンショット 2018-09-12 6.15.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/749ef71c-c92d-a82f-b370-63b814222d70.png">

Save Actionsを有効にするには以下の画像のような設定にする。

<img width="1134" alt="スクリーンショット 2018-09-12 6.15.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/7fa39011-69cb-134c-429b-bdc78720c33d.png">

これで保存時に自動でコード整形＋インポート整理されるはず。

### プラグインのメリット
- インストールが簡単で楽
- マクロにはできない事が多々ある（使ってないけど）
  - 変更した箇所だけコード整形とか
  - finalを自動で変数に追加

### デメリット
- プラグインだらけにするとAndroid Studioが動作が遅くなるかも
- プラグインをUpdateするとAndroid Studioの再起動を求められる

# まとめ
両方試してみて自分に合う方を使用すればよい

ちなみに、自分はマクロ派

あと、プラグイン設定ファイルをチームでgit共有したい場合はプラグインの方がいいかも
VBAからのAppleScript呼び出し

#動かないマクロ
私はずっとWindowsを使っていて、最近Macを使い始めました。
これまで書類のチェックにExcelマクロを使っていたのですが、
Excel for Mac(2016)だと一部動かない箇所がありました。

- Application.FileDialog
- FileSystemObject

他にもあるのかもしれませんが、今のところこの２つ。
解決策をググってみると、
動かない箇所をAppleScriptで代替してね、ということのようでした。

以下の形式で、VBAからAppleScriptを呼び出せました。
`MacScript(AppleScript文字列)`

…が、下記ページによると、この関数は廃止されたとのこと。
https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/macscript-function
代わりに「AppleScriptTask」という関数を使うのが良いようです。
…う〜ん。時間ないので、次回直すとして、今回はMacScript関数を使っちゃいます。

#AppleScript
###AppleScriptとは？###
Appleが開発したスクリプト言語。
Windowsのバッチファイルに近い役割だけれど、
それよりわかりやすく高性能、と感じました。
###私の習得方法###
基本、ヘルプを頼りにしました。
Macに標準でインストールされている「スクリプトエディタ」を起動し、
ヘルプ　＞　AppleScriptヘルプを表示　で概要が掴めました。

詳細なリファレンスは、
ヘルプ　＞　AppleScript Language Guide を表示　で。
こちらは全部英語なので、わからない単語が出てきたら都度３本指タップで意味を調べました。

#できあがったコード
```vb
    'Mac用
    If Application.OperatingSystem Like "*Mac*" Then
        Dim macscr As String
        macscr = "" & _
        "try" & vbCrLf & _
        "set slctFolder to choose folder with prompt ""ディレクトリを選択してください""" & vbCrLf & _
        "return slctFolder" & vbCrLf & _
        "end try"
        
        fPath = MacScript(macscr)
        ws.Cells(5, 2).Value = fPath
        Exit Sub
    End If
    
    'Windows用
    With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = "C:"

        If .Show = -1 Then  'ファイルダイアログ表示
            ' [ OK ] ボタンが押された場合
            fPath = .SelectedItems(1)
            'フォルダパスを表示
            ws.Cells(5, 2).Value = fPath
        End If
    End With
```
#少し解説
最初のif文はMacであることを判別するためのものです。

```vb
If Application.OperatingSystem Like "*Mac*" Then
```

汚いですが、以下がAppleScript部分です。
末尾の & vbCrLf & _ が鬱陶しいですが、改行を入れないとエラーになってしまうため入れています。

```vb
        macscr = "" & _
        "try" & vbCrLf & _
        "set slctFolder to choose folder with prompt ""ディレクトリを選択してください""" & vbCrLf & _
        "return slctFolder" & vbCrLf & _
        "end try"
```

###try〜end[try]###
エラーをキャッチするためのもの。フォルダの選択をせずにキャンセルするとエラーが発生するのでこれで回避。
###set 変数名 to 値###
変数に値をセットする。
###choose folder [with prompt]###
フォルダ選択ダイアログを表示する。

#今回解決したこと
Application.FileDialogで行っていたことはAppleScriptで代替できました。
FileSystemObjectの方はまだです。
フォルダ内のファイルを全て取得してコレクション変数に入れるために使っていますので、
それの代替処理を作るのが次のステップです。
【Python】CSVファイル読み書き

#読み込み

```py
import csv

with open('read_file.csv', 'r') as rf:
    reader = csv.reader(rf)
    header = next(reader) # ヘッダーを読み飛ばしたい時

    for row in reader:
        print(row)
```

#書き込み

```py
import csv

with open('write_file.csv', 'w') as wf:
    writer = csv.writer(wf, delimiter=',', lineterminator='\n')
    writer.writerow(list) # 2次元配列の場合 writer.writerows(array2d)

```
Kubernetesの公式チュートリアルをやってみる その2

[Kubernetesの公式チュートリアルをやってみる その1][topic-1] は概要を記載したのでこの記事からはチュートリアル本編に入ります。

#### 注意 && disclaimer

翻訳・意訳が主目的ではないのでいろいろ端折ったりすることがあります。
明らかな間違いはしないつもりですが、何かあれば優しくツッコんであげてください。


## 本記事の取り扱う範囲

[Using Minikube to Create a Cluster][tutorial-1] の内容を扱います。
この章からハンズオンも含まれてきます。


## Using Minikube to Create a Cluster

クラスタとは何か、Minikubeとは何か辺りの内容。

### Kubernetes クラスタ

- Kubernetes は複数のマシンを用いて高可用性クラスタを構築する。
    - `master` 1台 + `node` 複数台(3台以上を推奨)
    - アプリをコンテナ化することでクラスタ内の各ノードへの配置・スケジューリングを効率的に行うことができる。
- `master` はクラスタ管理における様々なアクティベーションを行う。
    - スケジューリング、ヘルスモニタリング、状態管理、スケーリング、アップデートなど
    - アプリがデプロイされるとどのノードで実行するかなどを制御する。
- `node` はコンテナ化アプリを実際に動かす。
    - Kubelet というエージェント経由で Kubernetes APIによって `master` と連携する。
      - 利用者が直接APIを叩くことも可能
    - `node` 内部ではDockerなどを用いてコンテナ化アプリを管理する。

### Minikube

Kubernetes の簡易版実装、開発用途などに利用する

- Mac / Linux / Windows の各OS用に用意されている。
- `node` が1つのみのクラスタを構築する。
- CLIでは起動、停止、ステータス表示、削除の簡易的なもののみを実行できる。

※本チュートリアルでは Katacoda 経由の接続先で Minikube がインストール済なので環境用意は不要


### Interactive Tutorial

Estimate Time: 10分

- minikube で Kubenetes 環境を構築する
- 構築した Kubernetes に kubectl でアクセス、情報を表示する。

#### Interactive操作について補足

- 左側に書いてある説明のコマンドをクリックするとターミナルでコマンドが実行される
    - 実際にコマンドを打たないで進められるが、慣れる意味では右のターミナルで操作したほうがよさそう
- 接続先は普通のUnix系OSなのである程度はシェル機能を使いながら操作した方が楽かも
    - 実際の運用でもコマンド補完は使うだろうと思うのでそのへんは使ってよさげ
        - 筆者がやったときもコマンド補完、history、Ctrl+R(コマンド検索)は多用していた


----

## 参考リンク

- [Kubernetes公式][kubernetes]
- [Kubernetes公式チュートリアル][tutorials]

[kubernetes]:https://kubernetes.io/
[tutorials]:https://kubernetes.io/docs/tutorials/kubernetes-basics/
[tutorial-1]:https://kubernetes.io/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/

[topic-1]:https://qiita.com/kitamin/items/f50fe470a04e38023f7a
SL パスワードつき gift Vendor スクリプト 例

ぱすわーどつきべんだーのさんぷるです。
本スクリプトは販売金額などの機能は有してませんが、money 関数など足してゆけば販売用にも使えるので挑戦してね！

string passwd にパスワードを
string folder は渡した相手のインベントリに作成されるフォルダー名です。アイテムはその中に入れられます。

では　おたのしんでね！


``` password_vendor.LSL

integer handle;
integer channel;
key user_key;
string passwd = "ぱすわーど";
string folder = "folder";

string err_message = "ぱすわーどがちがうみたい。もう一度かくにんしてね！";

integer genCh()
{
    integer gen;
    key id = llGetKey();
    string str = llGetSubString((string)id,0,3);
    gen = -1-(integer)("0x"+str);
    return gen;
}

do_given(key user)
{
    list        inventory;
    integer     num = llGetInventoryNumber(INVENTORY_ALL);
    string      script = llGetScriptName();
    integer     i = 0;

    for (; i < num; ++i)
    {
        string name = llGetInventoryName(INVENTORY_ALL, i);
        //販売スクリプトをあげないように
        if(name != script)
        {
            if(llGetInventoryPermMask(name, MASK_OWNER) & PERM_COPY)
            {
                inventory += name;
            }
            else
            {
                llSay(0, "Don't have permissions to give you \""+name+"\".");
            }
        }
    }

    if (llGetListLength(inventory) < 1)
    {
        llSay(0, "No items to offer."); 
    }
    else
    {
        // エージェントにフォルダをあげます。オブジェクトの名前をあげるフォルダの名前に使います
        llGiveInventoryList(user, folder, inventory);
    }
}

menu_passwd(key user)
{
    llTextBox(user,"ぱすわーどをいれてね\n", channel);
}

default
{
    state_entry()
    {
        llSetText("", <1,0.5,0.5>,1);

        channel = genCh();
        handle = llListen(channel, "", NULL_KEY, "");
    }

    listen( integer channel, string name, key id, string message )
    {        
        if(message == passwd)
        {
            do_given(id);
        }
        else
        {
            llInstantMessage(id, err_message);
        }
    }

    touch_start(integer total_number)
    {
        user_key = llDetectedKey(0);
        menu_passwd(user_key);
    }
}
npm install で躓いたこと

※備忘録的に投稿しております。

下記を参考にServerless Framework　をnpmでインストールしようとしたところ、タイムアウトで失敗。。。
[Serverless Framework による AWS Lambda 関数の管理1](https://engineering.mobalab.net/2017/11/18/serverless-framework-%E3%81%AB%E3%82%88%E3%82%8B-aws-lambda-%E9%96%A2%E6%95%B0%E3%81%AE%E7%AE%A1%E7%90%861/)

```$ npm install -g serverless```

「プロキシを正しく設定してくれ」と怒られた。
企業のWebプロキシではねられている模様。

調べてみたところ、下記コマンドでプロキシの設定をするとエラーが解消され、無事にインストールすることができた。
npmのconfigファイルで、httpとhttpsの設定が必要。

```$ npm config set proxy http://proxy.company.com:8080```
```$ npm config set https-proxy http://proxy.company.com:8080```

インストールが終わったら下記コマンドで確認。
```serverless --version```

参考
[企業Webプロキシの背後にNode.jsとNpmを設定する方法](https://translate.googleusercontent.com/translate_c?depth=1&hl=ja&prev=search&rurl=translate.google.co.jp&sl=en&sp=nmt4&u=https://jjasonclark.com/how-to-setup-node-behind-web-proxy/&xid=17259,15700021,15700124,15700149,15700186,15700190,15700201&usg=ALkJrhjDdnaG4qfY9N0wZezaKeqOGq7-Ug)
'Strip Engine Code' の幾重にも張り巡らせられる罠

# 前置き
Unity には 'Strip Engine Code' という機能があって、必要のないEngine側のコードを削ってくれるという便利な機能がある。
ただ、AssetBundle を作るときには注意が必要だ。なぜかというと、AssetBundleはビルドした元のファイルはアプリ本編の方には入れないのが普通で、そうなるとStripされてしまうというわけだ。くわしくはテラシュールブログの[「【Unity】Unity 5.3からAssetBundleはどう変わるのか…まとめ」](http://tsubakit1.hateblo.jp/entry/2015/12/16/233336)を読んでもらうといいかもしれない。

これを回避するためには「link.xml」というファイルを作ってその中に

```link.xml
<linker>
       <assembly fullname="UnityEngine">
               <type fullname="UnityEngine.GameObject" preserve="all"/>
               <type fullname="UnityEngine.Texture2D" preserve="all"/>
       </assembly>
</linker>
```

こんな感じに書かなくちゃいけない。で、↑の

```link.xml
              <type fullname="UnityEngine.Texture2D" preserve="all"/>
```

という部分を必要なコンポーネントを追加しなくちゃいけないということになる。
で、その必要なコンポーネントっていうのがミソで、**何が**必要かというのが事前にわかるわけではない。イヤ、わからなくはないのだが、一個一個確かめなくてはいけなくて、そもそもAssetBundleを一個一個確認して行く、というのは非現実的だ。

そこで、とりあえず全部AssetBundle をロードしていって、落ちたところを見て、落ちたときのエラーメッセージを確認しつつ、どんなコンポーネントが含まれていなかったということを確認するという地道なことをしていくしかない。

落ちたとき

    Could not produce class with ID XXX

というメッセージが出るので、そのIDが本来必要だったコンポーネントのIDというわけだ。

# 罠１

前置きが長くなった。
で、だ。

今回のエラーメッセージが

    Could not produce class with ID 210

という「210」という番号。それを**公式**のマニュアル[「YAML Class ID Reference」](https://docs.unity3d.com/2018.1/Documentation/Manual/ClassIDReference.html)を調べると、

| 210 | TerrainInstance |
|--:|:--|

とババーンと書いてある。ほうほう、「TerrainInstance」が足りないんだな、と。

####だがそれは罠だ。

いやいやいや、おかしいでしょ。
今時Terrainを使う方がありえないし、そもそもAssetBundleですよ？TerrainをAssetBundleに入れることなんてそうそうない。実際に使っていない。

# 罠２

さっぱりわからなかったが、ググってみたら[同じような質問に回答している人](https://answers.unity.com/questions/1489850/webgl-error-could-not-produce-class-with-id-210.html)がいて、そこに

> The class-ID docs are misprinted.
> The actual type is UnityEngine.CoreModule.SortingGroup, not TerrainInstance. 
> Took me a lot of brute-force testing to get to the solution :) I hope > this saves you some trouble.
> Good luck!

ま、要は

> それはミスプリントで、本当は「UnityEngine.CoreModule.SortingGroup」であって、「TerrainInstance」じゃないよ。
> はっはっは、まいったよね。俺も大変だったよ。じゃあ頑張ってな！

と言ってる。

なるほど、そういうことか。それでは「UnityEngine.CoreModule.SortingGroup」を入れればいいということだな、と。

####だがそれは罠だ（２回目）

実際に「UnityEngine.CoreModule.SortingGroup」を入れてもダメで、実際は

「UnityEngine.Rendering.SortingGroup」を入れなくてはいけない。（考えて見たらその通りで、なんで「CoreModule」でのnamespace にしてるんだろう？という。おそらく昔はそうだった的な？）

というわけで、

```link.xml
<linker>
       <assembly fullname="UnityEngine">
              <type fullname="UnityEngine.Rendering.SortingGroup" preserve="all"/>
       </assembly>
</linker>
```

というのが本当に必要なことだったということ。
現場からは以上です。
swift4 UIDatePickerの指定した年月日から年齢を出力するコード

前回、「swift4 UIDatePickerからUITextfieldへ出力まで」で記事を書いたので
その続きの、

「UIDatePickerの指定した年月日から年齢を出力するコード」
https://qiita.com/ryomaDsakamoto/items/ab4ae031706a8133f193

について書いていきます。

# そのコードがこいつ。※前回の記事を参照しながらどうぞ。
```swift:BirthdayViewController.swift
import UIKit

class BirthdayViewController: UIViewController {

    //UITextfieldに紐づいてる
    @IBOutlet weak var dateField: UITextField!

    //UIDatePickerを定義するための変数
    var datePicker: UIDatePicker = UIDatePicker()


    override func viewDidLoad() {
        super.viewDidLoad()

        // ピッカー設定
        datePicker.datePickerMode = UIDatePickerMode.date
        datePicker.timeZone = NSTimeZone.local
        datePicker.locale = Locale.current
        dateField.inputView = datePicker

        // 決定バーの生成
        let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35))
        let spacelItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(done))
        toolbar.setItems([spacelItem, doneItem], animated: true)

        // インプットビュー設定(紐づいているUITextfieldへ代入)
        dateField.inputView = datePicker
        dateField.inputAccessoryView = toolbar
    }

    // UIDatePickerのDoneを押したら発火
    @objc func done() {
        dateField.endEditing(true)

        // 日付のフォーマット
        let formatter = DateFormatter()

        //"yyyy年MM月dd日"を"yyyy/MM/dd"したりして出力の仕方を好きに変更できるよ
        formatter.dateFormat = "yyyy年MM月dd日"

        //(from: datePicker.date))を指定してあげることで
        //datePickerで指定した日付が表示される
        dateField.text = "\(formatter.string(from: datePicker.date))"


        // 本当はNSDate()じゃない方がいいと思う。
        let now = Date()
        print("今日は\(now))です")
        
        let Age = now.timeIntervalSince(datePicker.date)//生まれてからの秒数
  
        let myAge2 = Int(Age)//秒齢
        let myAge3 = Double(myAge2)
        let myAge4 = Int(myAge2/60/60/24)//日齢
        let myAge5 = Int(myAge3/60/60/24/365.24)//年齢＿端数の切り捨て:満年齢:整数Integer

        //ログから出力されていることを確認、
        print("年齢は満\(myAge5)歳です")



    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```
実際のpickerで確認すると、こんな感じで出力されているはず。
<img width="504" alt="スクリーンショット 2018-09-12 2.04.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/254495/2dbe8c1e-8b0b-998e-b155-b7ba86d30737.png">

あとはlabelで出力したいtextで出力したりやりたい放題です。
AutoML Visionなら、佐藤健と亀梨和也を人よりも賢く見分けられるかもしれない

[こちら](https://qiita.com/mine820/items/e64c5a1862a605285127)でそれなりに学習できたのですが、結果は散々だったので、GoogleのAutoML Visionと比較することにしました。
それでも見分けられなかったら、もう[このドラマ](http://www.tbs.co.jp/gibomusu_blues/)の佐藤健は亀梨和也ということで納得します（爆）

なお、AutoML Visionの使い方は、きっと良い説明が[どこか](https://blog.apar.jp/web/10326/)にあると思うので、そちらを見てください。

# データセットの設定

今までと同じ画像をデータセットとして設定します。
ローカルな学習では、それぞれ90枚づつ設定し、そのうちの1割（9枚）を評価に使っていましたが、今回は90枚全部トレーニングに使います。
![image03.png](https://qiita-image-store.s3.amazonaws.com/0/130771/b5f1208a-89af-8921-822a-e225c8c49998.png)

# 学習

本来はそれぞれ100枚以上画像を用意するのが望ましいのですが、90枚で学習を行います。
![image04.png](https://qiita-image-store.s3.amazonaws.com/0/130771/a7b60507-4f83-b60e-ec3d-8757a9839ed1.png)

学習が終わるとこんな感じの表示になります。
![image06.png](https://qiita-image-store.s3.amazonaws.com/0/130771/fa750300-e720-0b40-53a4-74a0bb33d014.png)

# 評価

もうちょっといい値が出ることを期待したのですが、イマイチな感じです。
![image07.png](https://qiita-image-store.s3.amazonaws.com/0/130771/3486eb5d-dd25-fd50-31a4-dbe5e2b68524.png)

# 識別

いよいよ肝心の、[某ドラマ](http://www.tbs.co.jp/gibomusu_blues/)の画像を使った識別結果です。
こちらもローカルで使用した画像と同じものを使用します。
![image08.png](https://qiita-image-store.s3.amazonaws.com/0/130771/84b9a079-e9df-839c-54bc-87d073167244.png)

1枚1枚載せるのも大変なので、結果を表で記述します。
（期待値は、TakeruSatoが1.0、KazuyaKamenashiが0.0）

| FileName | TakeruSato | KazuyaKamenashi |
|---|---|---|
| image01.jpg | <font color="red">0.636</font> | 0.529 |
| image02.jpg | 0.102 | <font color="red">0.899</font> |
| image03.jpg | 0.440 | <font color="red">0.592</font> |
| image04.jpg | 0.122 | <font color="red">0.828</font> |
| image05.jpg | <font color="red">0.657</font> | 0.441 |
| image06.jpg | 0.410 | <font color="red">0.553</font> |
| image07.jpg | 0.113 | <font color="red">0.894</font> |
| image08.jpg | 0.396 | <font color="red">0.693</font> |
| image09.jpg | <font color="red">0.654</font> | 0.292 |
| image10.jpg | 0.244 | <font color="red">0.598</font> |
| image11.jpg | <font color="red">0.860</font> | 0.261 |
| image12.jpg | 0.083 | <font color="red">0.740</font> |
※ここでAutoML Visionがエラーに（涙）

ほ～ら、Google先生も間違えてるし！

※ガッツリお金をかけて学習すれば、もっと賢くなる可能性はあります (￣ー￣)ﾆﾔﾘ

# おまけ

そういえばAutoML Visionのネットワークモデルって何なんだろう？
Inception-v3だったりして？！
（Advancedモードは[NASNet](https://ai.googleblog.com/2017/11/automl-for-large-scale-image.html)とのこと➡️中の人曰く『今は違うかもよ？！』）

# 余談

どうやら今までのAIの傾向だと、佐藤健が変顔をすると亀梨和也になるらしい（笑）
Diffie-Hellman鍵共有を何となく理解する

## 対象者

基本情報処理試験や情報セキュリティマネジメント試験の受験者くらいのレベルで数学はちょっと苦手な人向けです。

## Diffie-Hellman鍵共有(交換)とは

公開鍵暗号方式のアイディアのベースとなったもので、盗聴の可能性があるインターネットを通して２人が共通の秘密を安全に交換するアルゴリズムです。
Diffie-Hellman鍵共有（以下、DH鍵共有）は１９７６年に発明されてから４０年近く経ちますが、現在でもSSLなどで広く使われている方式となっています。

## どんな利点があるの

鍵を交換する最も単純な方法は、二者の一方が鍵を作成し、それをもう片方に送付する事ですが、この方法だと途中（インターネット上）にいる盗聴者により鍵が盗まれてしまう可能性があります。

DH鍵共有の仕組みを利用すると鍵を受け渡ししなくても同じ鍵を共有することができます。

## 鍵生成の仕組みを味付けで表現してみるとこう

ここからは数学を一切使わずラーメンの味付けで表示してみます（！？）

### 1.プレーンのラーメンを用意する

秘密の味付けを共有したい「A」さんと「B」さんは味付けしていないプレーンのラーメンをお互い用意します。
この『プレーンのラーメン』は誰でも手に入れられる状態でOK。
→ネットワークを介して公に取り決めしても良い

<img src="https://qiita-image-store.s3.amazonaws.com/0/145504/5359b3c7-89dd-4776-5cb5-9951a9deedfa.png" width="150px" height="150px" />

### 2.「A」さんはラーメンに「塩」を入れる

「A」さんはプレーンのラーメンに塩を加えて『塩ラーメン』を作ります。

<img width="732" alt="sio.png" src="https://qiita-image-store.s3.amazonaws.com/0/145504/11a1ed76-3c94-8580-1478-c4c9e7ae9535.png">

### 3.「B」さんはラーメンに「味噌」を入れる

「B」さんはプレーンのラーメンに味噌を加えて『味噌ラーメン』を作ります。

<img width="722" alt="miso.png" src="https://qiita-image-store.s3.amazonaws.com/0/145504/a8e19c2a-08f4-2c99-4af3-1cc3c7854d25.png">

### 4.お互いのラーメンを交換します

「A」さんは『塩ラーメン』を、「B」さんは『味噌ラーメン』をお互い交換します。
これはネットワークを介するので途中で傍受される可能性があります。

### 5.「A」さんは味噌ラーメンに「塩」を入れる

「A」さんは「Ｂ」さんから受け取った『味噌ラーメン』に２で入れたのと同じ分量の塩を入れます。
これで『味噌塩ラーメン』が完成しました。

<img width="722" alt="miso_sio.png" src="https://qiita-image-store.s3.amazonaws.com/0/145504/57055a0f-fba1-dc17-909f-c05c2bb5e00c.png">

### 6.「B」さんは塩ラーメンに「味噌」を入れる

「B」さんは「A」さんから受け取った『塩ラーメン』に3で入れたのと同じ分量の味噌を入れます。
これで『味噌塩ラーメン』が完成しました。

<img width="724" alt="sio_miso.png" src="https://qiita-image-store.s3.amazonaws.com/0/145504/450ce704-f09e-01ee-d5ba-511e6b1357e1.png">

### 7.結果

「A」さん「B」さん双方が同じ味の『味噌塩ラーメン』を作ることができました。

#### フロー

<img width="457" alt="flow.png" src="https://qiita-image-store.s3.amazonaws.com/0/145504/dbe332f0-749b-5c18-cdca-90be3d4c910a.png">

## 解説

ここからが ~~味噌~~ じゃなかったミソです。

- 「A」さん含む他の人（例：ネットワークを傍受しようとしている人）は味噌がどれほど入っているかは分からない
- 「B」さん含む他の人は塩がどれほど入っているかは分からない
- ネットワーク上から傍受できるのは『プレーンのラーメン』『塩ラーメン』『味噌ラーメン』の味付けのみ

上記の結果は一見するとうまく配合すれば『味噌塩ラーメン』を作れそうに見えますがそう簡単ではありません。
なぜなら、『塩ラーメン』と『味噌ラーメン』を単純に混ぜただけではお互いの味が薄まってしまって同じ味になりません。

どうにか同じ味を再現するには高度な成分分析器を使用して調味料の分量を特定しないといけません。
よく聞く「◯◯bit暗号」「暗号強度」と言われているものを調味料で表現すると、
1g単位で味付けするのと、1mg単位で味付けするのとどちらが解析困難かといったところでしょうか。

情報処理試験等で実際に暗号の計算問題が出ることは多分無いのでこのぐらいの認識があれば大丈夫でしょう（適当）
Rails5でGoogleMapsAPIを用い、複数のマーカーを表示する

#こんな感じにする
![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/280139/9e2baf50-87e7-6433-2c4e-2518f12570db.jpeg)

※アイコンはカスタム済み

**基本部分には下記の記事を参考にさせて頂きました。**感謝します。
[Rails5でGoogleMapを表示](https://qiita.com/enzen/items/9a919a75ebf0a34e7b91)


##使わないもの
・JSON
・gmap4rails

##投稿者の環境
Cloud9
Ruby 2.4.1
Rails 5.2
初心者マインド


#コントローラ
Placeモデルに、latitudeやlongitudeがfloatとして入っているインスタンスが既に存在していると仮定します。

```ruby:places_controller.rb
class PlacesController < ApplicationController
  def index
    @places = Place.all
  end
end
```

#ビュー

```erb:index.html.erb
<script async defer
 src="https://maps.googleapis.com/maps/api/js?v=3.exp&key=APIキー&callback=initMap">
</script>

中略

<!--マップ-->
<div id="map"></div>

<!-- js部分 -->
<script>
    function initMap() {
      
      //初期表示位置
      var latlng = new google.maps.LatLng(36.30, 139.5);
      //デザイン
      var styles = [
           {
            stylers: [
             { "saturation": -95 },
             { "lightness": -20 }
            ]
           }
          ];
          
      var map = new google.maps.Map(document.getElementById('map'), {
          zoom: 9,
          styles: styles,
          center: latlng
      });
      var transitLayer = new google.maps.TransitLayer();
      transitLayer.setMap(map);
      
      //複数マーカー ここから
      <% @places.each do |place| %>
      (function(){
        var contentString = "住所：<%= place.name %>"; 
        var infowindow = new google.maps.InfoWindow({
            content: contentString
        });
        
        var marker = new google.maps.Marker({
            position:{lat: <%= place.latitude %>, lng: <%= place.longitude %>},
            map: map,
            title: contentString, //お好みのアイコンが無ければ、左のカンマを削除
            icon: 'お好みのアイコンのパス（ない場合はこの行と真上の行のカンマを削除）'
        });
        
        marker.addListener('click', function() {
          infowindow.open(map, marker, content);
        });
       })();
      <% end %>
      //複数マーカー ここまで  
  }
</script>

```

これで最初の画像のようになるはずです。

#おわりに
JSON使おうとかいろいろやったんですが結果これに落ち着きました。かんたん！
参考[【Railsで】GoogleMapsAPIのマーカーをクリックした際にinfowindowを適切に表示したい](https://teratail.com/questions/146488)
Chromeのカスタムデバイスを管理するツール"Vibranium"をリリースしました

# TL;DR
- Chrome DevToolのカスタムエミュレートデバイスを管理するCLI
- `/Users/XXXXX/Library/Application Support/Google/Chrome/Default/Preferences` をいじるだけ
- [Vibranium](https://github.com/Pittan/vibranium)っていいます

# 背景
プライベートでハイブリッドアプリを作成していて

- いろんな端末サイズ (iPhone 6, 6 Plus, X, iPad, Android端末)
- いろんなOSバージョン (iOS 10/11/12, Android 6/7/8)
- いろんなアプリバージョン

のWebViewで見たときに判定ロジックは正しく動くか、レイアウトは崩れていないかなどを
検証したいケースによく遭遇します。

実機で確認するのが一番ですが、どうしても限界があるので、そういうときはChromeのDevToolを使います。

↓ こんな感じ
<img width="515" alt="スクリーンショット 2018-09-12 0.28.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/30152/12689dd2-634b-e249-fd18-77416b529aaf.png">

- 新しいOSや端末がリリースされたときに大量に追加する
- ユーザーからの不具合報告を確認するために一時的に追加する(既存のを書き換えちゃう)

ことが多く、デフォルトのUIだと面倒なので、CUIツールを作成しました。
Herokuが出しているCLI作成ツール [oclif](https://oclif.io/)を使いました。

# できること

- ファイルからカスタムエミュレートデバイスを追加(add)
- Chromeに保存されているカスタムエミュレートデバイスをファイルに保存(export)

一括して編集したり、カスタムデバイスのバックアップを取ることを想定しています。

# 使い方

- インストール  
  `$ npm install -g @pittankopta/vibranium`
- カスタムエミュレートデバイスをファイルに保存(vibranium.jsonに保存されます)  
  `$ vibranium export` 
- ファイルからカスタムエミュレートデバイスを追加  
  `$ vibranium add ./vibranium.json`

# 作っているときにハマったこと
## Chromeの設定は終了しているときじゃないとうまく反映されない
Chromeが終了するときにメモリ内の設定を改めてディスクに書き込むような挙動があり、
`add`コマンドで書き換えたファイルが元に戻ってしまいました。`add`コマンドのときは
Chromeが起動していないことを確認するようにしています。

## テストをどう書けば…
AngularJS, Angularをよく触っていることもあって、そのテストはうまく書けるんですが
nodeのコードはどうテストを書いたらいいものか、ちょっとわからず…。
テストが書けるようになったらちゃんとCIにも乗せたいです。

# まとめ・感想
- TypeScriptで書けるのでかなりラクにツールを作れた
- これでエミュレートデバイスを散らかしてもすぐ元に戻せる安心感
- CLIを作るのは楽しい、でもテストは難しかった
Opensuse -備忘録-

# 概要
-もろもろの設定を忘れない様にする為、ここに記す-
## OSバージョン確認(15の場合)
\#cat /etc/SUSE-brand
以前だったら[/etc/SUSE-release]とかだったのにいつのまにか変わってる、、、
前の方がRHELとかと似た感じだから解りやすいのに。。。。
## Local設
### CUI: localectlが使用可能
\# localectl status
>System Locale: LANG=en=US.UTF-8
>VC Keymap: de-latin1-nodeadkeys
>X11 Layout: de
>X11 Model: pc105
>X11 Variant: nodeadkeys
>X11 Options: terminate:ctrl_alt_bksp

[0] 設定可能なロケールを確認
\# localectl list-locales #設定可能Locale一覧
\# localectl list-keymaps # 設定可能keymap一覧

[1] locale を英語に変更
\# localectl set-locale LANG=en_US,utf8

[2] キーボードレイアウト を英語に変更
\# localectl set-keymaps us

[3] locale を確認
\# localectl status
>System Locale: LANG=en=US.UTF-8
>VC Keymap: US
>X11 Layout: US
>X11 Model: pc105+inet
>X11 Variant: nodeadkeys
>X11 Options: terminate:ctrl_alt_bksp

### GUI : Yastを使用し設定する。
下記がバージョン古い(13)が公式の手順
<http://manual.geeko.cpon.org/ja/cha.y2.lang.html>


### 自動ログイン設定
今回設定しているOpenSUSEはバイクに搭載しナビとして使用する。
その為、起動時にログイン認証を実施するのは手間なので自動ログインを有効にする。

[0]ログイン用ユーザ存在確認
\# cat /etc/passwd

[1] ログイン用ユーザ作成
\# useradd [ログイン用ユーザ]
\# passwd  [ログイン用ユーザ]

[2] 自動ログイン有効化
\#　vi /etc/sysconfig/displaymanager
>DISPLAYMANAGER_PASSWORD_LESS_LOGIN="NO"
>⇒DISPLAYMANAGER_PASSWORD_LESS_LOGIN="NO"
>DISPLAYMANAGER_AUTOLOGIN="ユーザ名"
> ⇒DISPLAYMANAGER_AUTOLOGIN="[ログイン用ユーザ]"

[3]再起動
\# reboot now
【Vuex】Storeの各プロパティ引数メモ

# 概要

VuexのStoreの各プロパティのfunctionの引数が忘れがちなので私的メモです。

https://vuex.vuejs.org/ja/

||第1引数|第2引数|第3引数|第4引数|
|:-----------------:|:------------------:|:------------------:|:------------------:|:------------------:|
| getters | state | getters | rootState | rootGetters
| mutations | state | payload | -- | -- |
| actions | context | payload | -- | -- |

# 補足説明

## getters

```js
getters: {
    //stateを取得
    isLoadingError: state => {
      return !state.serverAuth.loading;
    },
    //他のgetterを参照することもできる
    isAbleChartLoad: (state, getters) => {
      return getters.isInputedBoard && getters.isInputedDays
    }
},
modules: {
  moduleA: {
    //ネストしているモジュールがある場合にも親のstate、gettersを取得できる
    getters: {
      isIncluded: (state, getters, rootState, rootGetters) => {
        return rootState.listItems.includes(state.item);
      }
    }
  }
}
```

## mutations

```js
mutations: {
    //mutationはstateの変更ができる。第二引数にはデータペイロードを渡すことも可能
    END_LOADING_WEBHOOK_BY_INDEX(state, index) {
      state.webhookBoards[index].loading = false;
      state.webhookBoards[index].status = "";
    }
}
```

## actions

contextは以下が使用可能。

context.state => ローカルstate
context.getters => ローカルgetters
context.rootState => rootのStoreにおけるstate
context.rootGetters => rootのStoreにおけるgetters
context.commit => mutationを実行するためのcommitメソッド
context.dispatch => actionを実行するためのdispatchメソッド

必要なものをes6の引数分割束縛を使うと以下のように省略してかける

```js

actions:{
  initialLoad({state, commit, dispatch}, data) {
    state.loading = true; //context.stateをそのまま利用可能
    dispatch('loadGraph', data)  //他のactionをdispatchすることもできる
      .then(data => {
        commit('SET_GRAPH'); //context.commitをそのまま利用可能
      })
      .catch(err => {
        commit('SET_GRAPH'); //context.commitをそのまま利用可能
      });
  }
}
```
HTML5+javascriptでEPUB３を作成する(画像読み込み編）

[「HTML5+javascriptを使ってブラウザでEPUB３を作成する」](https://qiita.com/99nyorituryo/items/68f4d67bfda5d8aab25d)の記事では、概略として簡略的にかいていたのを詳細に書いてみようと思う。
第2回目
## 画像ファイルの扱い
　画像ファイルを読み込みzipファイルに保存する。

　画像ファイルの読み込みには、fileapiを利用して読み込む方法がある。fileapiで読み込みBASE64に変換を行う。acceptを用いてjpegファイルとpngファイルの読み込みだけに制限している。

```html:
<input type='file' accept='image/jpeg,image/png' id="imgfile">
```


　JavaScriptで画像データは、Base64であつかう。
ファイル名とデータの関係、例えば画像ファイルとファイル名では別々に扱うので、
Base64でjpeg画像は次のテキストで始まる。

>data:image/jpeg;base64,

この始まりの部分をカットしないとjszipでzipファイルにして保存ができない。

参考
https://github.com/Stuk/jszip/issues/151

.split('base64,')をすることでカットした。{base64: true}はbase64用の設定である。

```js:
zip.file("sample.jpg", reader.result.split('base64,')[1], {base64: true});
```
git commit 時に書くコミットメッセージ1行目の表示文字数上限を調べてみた

## はじめに
みなさまはたまに不思議なところで折り返されているコミットメッセージを見かけることはないでしょうか？

例えばこんなのです。
https://github.com/JPSERN/TestRepo/commit/5254212a0b71077372c4b065ab235ef157736e91

今日はこちらについてのネタをひとつ書きたいと思います。
ちなみに git を普段使っている方には特に真新しい内容ではありませんが、コミットメッセージはこの書式が基本という前提で進めます。

```
1行目 変更の概要、要約
2行目 何も書かない
3行目 変更の詳細、理由など
```

本来は3行目に書いた内容が折りたたまれたテキストに入ります。ところが、先ほど挙げた例の場合はこのようにコミットメッセージを書きました。

```
1行目 パブロ・ディエゴ・ホセ・フランシスコ・デ・パウラ・ファン・ネポムセーノ・マリア・デ・ロス・レメディオス・クリスピン・クリスピアーノ・デ・ラ・サンティシマ・トリニダッド・ルイス・イ・ピカソ
```

2行目以降は何も書いていません。すべて1行目に書いたにも関わらず、途中から折りたたみの中へ入ってしまっています。どうも1行目に書いて概要として表示される文字数には上限があるようです。

## では何文字までなら1行目の概要として表示されるのか
気になったので調べてみました。
調査方法としては `git commit --allow-empty` で空コミットしまくっただけですｗ

[先ほどの例](https://github.com/JPSERN/TestRepo/commit/5254212a0b71077372c4b065ab235ef157736e91) では70文字目以降が折りたたみの中に入っていたようなので、70文字からスタートしてみました。

### 70文字(折り返しなし)
- 半角
  - https://github.com/JPSERN/TestRepo/commit/73994bd15a353d9e61839182425ce5e979077fcf
- 全角
  - https://github.com/JPSERN/TestRepo/commit/cc5e06053862740860450db4c72cb26942c167eb

### 71文字(折り返しなし)
- 半角
  - https://github.com/JPSERN/TestRepo/commit/ccc8c13b25804b1854ffb5e036ea170f25c6f6d5
- 全角
  - https://github.com/JPSERN/TestRepo/commit/2350d625db201c464ce65d0611fd1e046e19690d

### 72文字(折り返しなし)
- 半角
  - https://github.com/JPSERN/TestRepo/commit/2b5de0b98329491fff57e37563799039875abbc8
- 全角
  - https://github.com/JPSERN/TestRepo/commit/b46b47ad8bdf4f54fac43fedd3443fc874d06889

### 73文字(**折り返された!!**)
- 半角
  - https://github.com/JPSERN/TestRepo/commit/b820afaf408de1725aff0335303ee73ee46f127b
- 全角 
  - https://github.com/JPSERN/TestRepo/commit/92f60ec02fe900cecb16d6ada81b6370f7ca0ce8

## 結論
調査の結果、**1行目のメッセージが72文字を超えると、70文字目以降から折り返される** ということがわかりました。(※UTF-8N で全角・半角問わず)

つまり、結論としては **72文字** が1行目の上限となります。
なので、勝手に折り返されるのが嫌な場合はどうにかして要約を72文字以内におさめるといいとおもいます。**意外とすぐ超えます( ﾟдﾟ)**


## 参考
散々調べたあとで公式にしっかり書いてあることに気づく＼(^o^)／

https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project#_commit_guidelines
> Short (50 chars or less) summary of changes
>
> More detailed explanatory text, if necessary.  Wrap it to
about 72 characters or so.  In some contexts, the first
line is treated as the subject of an email and the rest of
the text as the body.  The blank line separating the
summary from the body is critical (unless you omit the body
entirely);
ファイル名一括変更バッチ

ファイル名を一括して変更するバッチファイル。


#### batファイル

```bash
@echo off
rem フォルダ内のPNGファイルをファイル名の昇順でソートし、ファイル名を連番にして変更する
rem サンプルではファイル名が"s"で始まるPNGファイルのみ対象。

rem リネーム名：TC-IN-XXX、TC-OUT-XXX
rem 第1引数 リネームするファイルのXXX（連番）開始番号 ※省略した場合は「1」
rem 第2引数 リネームするファイルの対象ディレクトリ    ※省略した場合は自分自身のディレクトリ


SETLOCAL enabledelayedexpansion

rem リネームするファイル名のプレフィックスとサフィックスの指定
set preFix=TC-
set suffixIn=-IN
set suffixOut=-OUT

rem コピーしたファイルを格納するフォルダ（yyyymmddHMMSSTT）
set dateStrTmp1=%date%
set dateStrTmp2=!dateStrTmp1:/=!
set dateStrTmp3=!dateStrTmp2: =!
set dateStr=!dateStrTmp3:~0,8!

set timeStrTmp1=%time%
set timeStrTmp2=!timeStrTmp1::=!
set timeStrTmp3=!timeStrTmp2:.=!
set timeStr=!timeStrTmp3: =0!

set newDirName=!dateStr!!timeStr!
md !newDirName!

set startNm=%1

if "!startNm!"=="" (
	set userInputFilePath=
	rem 入力要求
	echo ファイル名の項番を外部ファイルより読み込む場合は
	echo ファイルパスを入力して下さい。
	echo 空欄の場合は連番にします。
	set /P userInputFilePath="【ファイルパス】:"
)
echo;
echo ----------------------------------------------

rem ユーザ入力が空の場合はファイル名の項番を初期化
if "!userInputFilePath!"=="" (
	
	if "!startNm!"=="" (
		echo 「項番」を自動連番します。
		echo 開始番号を入力して下さい。空欄の場合は「001]から採番します。
		set /P startNm="【開始番号】:"
		echo;	
	)


	rem 第1引数によりファイル名の連番を指定する。
	if not "!startNm!"=="" (
		rem 引数有：引数指定の数値 + 1 から連番
		set /a fileNm="!startNm!"-1
	)else (
		rem 引数無し：001 から連番
		set /a fileNm=0
	)
) else (
	
	if EXIST !userInputFilePath! (
		rem 何もしない
	) else (
		echo 指定したファイルが存在しない為、処理を中止します。
		rd /q !newDirName!
		pause
		exit
	)
)

rem 第2引数によりリネームするファイルのディレクトリを指定
if not "%2"=="" (
	cd %2
	set targetDir=%2\
) else (
	set targetDir=%~dp0
)

rem ファイル名が"s"で始まるPNGファイルのファイル名を一時ファイルに書き出す
dir /b /on ^s*.png > temp.txt

set /a  cnt=1
for /f "tokens=1,2" %%j in (temp.txt) do (
	
	set /a amari=cnt%%2
	
	if !amari! equ 1 (
		if not "!userInputFilePath!"=="" (
			rem ユーザ入力があった場合は連番を外部ファイルより読み込んで設定する
			call :readNmFromOutFile
			set /a fileNm=!errorlevel!
		) else (
			rem 連番を引数（or 1）から設定するはインクリメントする
			set /a fileNm+=1
		)
	)
	
	set fileNmStr=00!fileNm!
	set fileNmStr=!fileNmStr:~-3!

	if !amari! equ 0 (
		set newFileName=!preFix!!fileNmStr!!suffixOut!
	) else (
		set newFileName=!preFix!!fileNmStr!!suffixIn!
	)

	set newFileName=!newFileName!
	echo "%%j %%k"	→	!newFileName!.png	
	copy "%%j %%k" !newDirName!\!newFileName!.png
	echo ----------------------------------------------

	set /a  cnt+=1 
)

pause
del !targetDir!temp.txt

rem ユーザ入力があった場合は項番を外部ファイルより読み込んで返す
rem 
:readNmFromOutFile

set /a tmpCnt=!cnt!+1
set /a tmpCnt=!tmpCnt!/2

set /a innerCnt=1
for /f "tokens=1" %%i in (!userInputFilePath!) do (
	if !innerCnt! equ !tmpCnt! (
		set /a fileNm=%%i
	)
	set /a innerCnt+=1
)

exit /b !fileNm!

ENDLOCAL

```