OmniAICreator/Qiita-1.07M huggingface dataset:
BlenderでUDIMテクスチャを適用する

調べてもBlenderのUDIMに関しての情報が全然無かったのでメモ程度にまとめることにしました。
初めて記事を書くので、拙い部分があるかもしれませんがご了承ください。

#UDIMとは
理解している方は飛ばしてください。

メッシュをUV展開するとき、大体は正方形のUVタイル一枚にUVを詰め込むか、複数のUVアイランドを重ねて配置してシェーダーを分けるかと思いますが、**UVタイル自体を一つのメッシュに複数持たせてしまおう**、というのが**UDIM**です。**Multi UV**とも呼んだりします。
####UDIMを使う利点
複雑なメッシュやスケールが大きいオブジェクトの場合、4Kテクスチャ一式でのマテリアルでは適用後のテクスチャがぼやけてしまうことがあります。そこで、例えば人のモデルであれば、顔、体、腕、脚とそれぞれマテリアルを別にして解像度を維持するという方法があります。
しかしその方法だと部位の数だけシェーダーが増えていくので、どんどんリソースを食っていきます。
UDIMでメッシュに複数のUVタイルを持たせることで、テクスチャの枚数を維持したままシェーダーを一つに抑えることができるようになります。
####UDIM番号
UDIMでは各タイルに番号が割り振られています。1001から始まり、U方向に進むごとに1002, 1003...、V方向に進むごとに1011, 1021...と数字が増えていきます。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552567/7ed8acd1-3316-714c-9771-b132410539da.png)

#Blender 2.82でのUDIM
Blender 2.82(記事作成時点ではAlpha)で正式にUDIMに対応しました。
少し使い方が難しかったので、UV展開からテクスチャ適用までの流れを簡単にまとめます。

##マルチタイルUV
UVエディターで**Nキー**を押してサイドバーを開き、**ビュー**タブの**UDIM Grid**の**Grid Shape**という項目を増やします。
ウィンドウ上部のワークスペースタブでUV Editへ移動すると簡単にUVエディターへ移ることができます。
上が**U**(右方向)で下が**V**(上方向)のタイルの数です。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552567/d9c373b0-4b5d-348c-1df1-c46b260a9178.png)

今回は横3枚、縦2枚の計6枚に設定しました。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552567/15eaaa6a-8192-71f9-b549-c90e820f513e.png)

##UV展開
メッシュをUV展開していきます。立方体の各面をそれぞれのタイルに配置しました。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552567/e28c961e-4e4e-9696-9c9c-ac2e0f658238.png)

##テクスチャ
メッシュをfbxでSubstance Painterに出力し、テクスチャを描いて出力します。Substanceについてはここでは割愛します。**各テクスチャのファイル名にUDIM番号を含めておいてください。**
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552567/1eb584be-d624-6124-8a47-f8b829b777f3.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552567/8f1a0d79-0ec7-71d7-5cdf-d5c896e437ae.png)

テクスチャを作るのはもちろんSubstanceでなくても構いません。Blenderでも作れますし、PhotoshopやMariなどを使う方法もあります。

##マテリアル
Blenderでメッシュにマテリアルを1つ設定します。**シェーダーエディター**に移動して**Basecolor_1001.png**をドラッグアンドドロップで配置すると、画像テクスチャノードが作られます。ノード内に**単一画像**に設定されているドロップダウンリストがあるので、**タイル状**に変更します。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552567/63cf17db-c711-53d2-b49a-4003cffada96.png)

**UVエディター**に移動し、上部のボックスで**先程の画像を指定**します。**Nキー**でサイドバーを開き、**画像**タブの**UDIM Tiles**で**1002, 1003, 1011, 1012, 1013**を追加します。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552567/6a503039-f115-e45c-2c07-6839959c0898.png)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552567/61a904a3-35c1-6905-ae49-836ac1b4d62f.png)

これでUDIMテクスチャが適用できました！
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552567/0e178373-3935-71ae-b257-887008ebed15.png)
AIカーをいろんなところで走らせてみた。

#### はじめに

AIカー(Donkey Car, JetRacerなど）を作ってみたものも、実際に走らせてみる場所がないということから、今年一年色々と対応したことについてまとめてみます。

#### 家の中で走らせる

100均で買った床用タイル(30cm四方）を並べ、その上に白いテープを張る。昔の水道管ゲームのように一枚のタイルで左折・右折カーブを作ろうとしたが、急なカーブになり回り切れないため、断念。また、普通のAIカーではスピードが速すぎて２ｍ×３ｍくらいのスペースでは走り切れないため、結局低速モーターをベースにした車体が必要となるため、初心者にはあまりお勧めできない。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99008/51d31f2f-b199-4d75-4c1a-ee51aab84932.jpeg" width=80%>


#### 公園で走らせてみる
近くの公園にアスファルトの小道があったので、そこで走らせてみました。アスファルトも見た目よりもかなりガタガタで、小さい車体だと、凸凹な道を走らせると、タイヤが石と石の間にはまったり、車体が飛び跳ねたりした。教師データを作成する際のmodel lossグラフもvalidateが収束せず、実際にもちゃんと走らなかった。

また、公園利用について事前に市のホームページなどで禁止項目を確認して走らせてみたが、このご時世なので、まあここまでということにしました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99008/53fba2f2-9e31-03cf-1bf0-8368945e464b.jpeg" width=80%>

#### 家の屋上で走らせてみる
とある都内の屋上にて、BBQをしながら走行会をするというイベントに呼んでいただき、そこで走らせてみました。若干ガタガタとするものの、安定した走りになりました。夕方になり日が陰ってくるとフェンスの影が延びてコースにかかってきて、その場所で止まってしました。屋外の走行会あるある。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99008/a8577eff-19a3-9d66-f72e-59d49540302d.jpeg" width=80%>


#### 室内での走行会を企画してみる
いつも利用しているTechShopと交渉して、走行会を実施しました。最初、Donkey Carの40%サイズ(3.0m x 4.54m)のコースを購入して走らせていましたが、カーブが急なところがあり回り切れないため、AWS DeepRacer用の100％サイズ（4.95m x 7.5m）のコースを準備して、走行会を実施しています。今年で合計６回の走行会となります。

スペースが取れるのであればDonkey Carのフルサイズ(6.71m x 10.26m)がおすすめです。コースを購入した時の注意事項ですが、印刷インクの匂いがかなりきついため、走行会主催する場合には、購入直後、コースを屋外に拡げて匂い取りを行っておいた方がいいです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99008/d45c250f-2fd4-6175-ff81-5312812e15e6.jpeg" width=80%>

室内だと、光の強弱が一定で自動走行させやすいです。
最近、都内、千葉県、北海道、名古屋、神戸などで走行会が開催されており、近くで開催された場合にはぜひ活用するといいです。

#### 雑感

本場アメリカのオークランドでは常設のコースがありますが、日本ではイベント開催の度にコースを敷設する状況でなかなか走らせる機会が少ないです。来年は、これじゃ日本のAIカーが遅れてしまうと危機感を持って常設コースを作ってやろうという方が現れるのを期待しています。
Office 365グループを作成できるセキュリティグループを制限

調べればたくさん出てくるけど、すぐに忘れるので自分用のメモも兼ねて書きます。

Connect-AzureAd するまでの手順は割愛。


Group.Unifiedのテンプレートを取得する
> \$Template = Get-AzureADDirectorySettingTemplate | where {$_.DisplayName -eq 'Group.Unified'}

Group.Unifiedテンプレートを変数に格納
> \$Setting = $Template.CreateDirectorySetting()

オブジェクトの作成
> New-AzureADDirectorySetting -DirectorySetting $Setting

ディレクトリ設定を取得
> \$Setting = Get-AzureADDirectorySetting -Id (Get-AzureADDirectorySetting | where -Property DisplayName -Value "Group.Unified" -EQ).id

EnableGroupCreateion を false にする
> \$Setting[“EnableGroupCreation”] = $false

GroupCreationAllowedGroupId に Office 365グループの作成を許可するセキュリティグループを指定
> \$Setting["GroupCreationAllowedGroupId"] = (Get-AzureADGroup -SearchString "Office 365グループの作成を許可するセキュリティグループ").objectid

設定の反映
> Set-AzureADDirectorySetting -Id (Get-AzureADDirectorySetting | where -Property DisplayName -Value "Group.Unified" -EQ).id -DirectorySetting $Setting

Office 365グループの作成を許可するセキュリティグループのObjectIdを確認
> Get-AzureADGroup -SearchString "Office 365グループの作成を許可するセキュリティグループ"

設定の確認
> (Get-AzureADDirectorySetting).Values
> EnableGroupCreationが False になっててGroupCreationAllowedGroupId 指定のグループのObjectId になっていること
WindowsPEにもっと簡単にアプリケーションを追加する

WindowsPEについてググってみると、"アプリケーション組み込み"とか一緒に出てきたりします。昔、BartPEの時代から続く課題だったりするんですよね...
このQiitaでも[挑戦＆解説しておられる方](https://qiita.com/ta_b0_/items/b16835740aa4b91246e9)もいます。

しかしです。
現代では後からでもどうなるとも言えます。というのも、DVDよりもUSBメモリに作る方が主流だから(?)です。普通のPortableなソフトをコピーすればいいのです。

##WinPtchXなら楽に導入できる
ダイマタイムスタートです笑。Windows10/8.1ベースWindowsPE作成ツールの[WinPtchX](https://www.vector.co.jp/soft/winnt/util/se516230.html)はアプリケーション追加の仕組みを搭載しているのです！（とは言いつつただ単に途中でxcopyしているだけですけどね。1903.1から搭載。）

![pex1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547444/9eeb85a8-6882-172d-f447-c9cb78f9522a.jpeg)

ダウンロードして解凍するとこのように出てきます。pex.exeがGUIです（exeはフロントエンドとして、実際の作成はpex.cmdなどが担っています）。copy2peフォルダ内がアプリ追加のための場所です。

![pex2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547444/c40763aa-7e21-962b-1e27-ed34d6f7ca82.jpeg)
ファイル作成が思いっきり失敗していますが気にせずに...
・cdフォルダが、DVDやUSBメモリ直下にコピーされるフォルダ
・programfilesフォルダはその通りProgram Filesフォルダ
・system32はシステム関連。パーティーション系とかで必要な時も
・syswow64はまず使いませんが、一応用意。
・regファイルはレジストリを追加する必要があるときに。

![pex3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547444/798664a6-d190-e5cc-732b-c2e64045287b.jpeg)

cdフォルダにportableなアプリたちを追加してみます。

![pex4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547444/20ef4ee0-50cb-527b-09f8-aedb2f385781.jpeg)

PE作成については特に説明するまでもありません。


##PEを起動してみる

（実機起動は面倒なので、当然のように仮想マシンを使用）

![pex5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547444/eafc50ec-e0c2-39f3-c356-772b1e16d92e.jpeg)

ファイラーのQ-Dirを開いたところです。
なぜかはわかりませんが、Win10ベースのPEはドラッグ＆ドロップができません（WinPtchX使用は関係なく、公式の作り方でもそうなります。Win10PESEなら回避できます）　なので、ファイルコピーの際は右クリックやCtrlCと貼り付けやCtrlVを活用ください。表示もすぐに更新されないのでF5で更新をお勧めします。

![pex6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547444/526d7d79-1ec2-fb84-5055-722ed1958fee.jpeg)

これはboot.wim内に組み込んだultravnc。先に作成した際にprogramfilesフォルダにコピーしておくとこうできます。

![pex7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547444/bc9feb8e-f237-7aae-b1e4-f88388c63921.jpeg)

先にcdフォルダに入れたほうはこうなっています。CPU-Zを起動したところですね。ランタイム依存がないアプリは起動できるものが多いですね。

###WinPtchXの弱点
・一見すると何やっているかよくわからない
・パッケージの組み込みが原則できない
・そのためごく一部ツールが起動できない、挙動がおかしいこともある(公式の方法でもパッケージを入れない場合は同様ですけどね)
・それを回避するため、WindowsインストールDVDをベースに作成する考え方もある

###PE上ではwow64は効かない
PEマニアの方々なら常識ですが、一般には意外と認知されていないかもしれないこと。WinPEでは原則wow64を搭載していないため、64bitPE上で32bitアプリを起動することはできません。もちろん32bitPEでも64bitアプリは起動できません。
ただし。Win10PESEなど複雑なツールを使い、wow64を組み込めば32bitアプリを動かすことは可能です。この辺りはまた別の機会に。
Elasticsearch docsをビルドしてみた

# 動機
現在、Elasticsearchのドキュメントは日本語翻訳版がv5.4のものしかありません。最新リリースはv7.5。
[v5.4リファレンス](https://www.elastic.co/guide/jp/elasticsearch/reference/current/index.html)
[Elasticドキュメント](https://www.elastic.co/guide/index.html)
そこで、社内の成果発表ネタの意味も兼ねて、最新版の翻訳に貢献しようと思ったのが本記事の動機です。
ElasticsearchのドキュメントはAsciidocで書かれていて、以下にビルドツールも公開されていますので、
今回はそれを使ったビルドを試してみました。
https://github.com/elastic/docs

# 手順

### 1. ドキュメントビルドツールのソースのクローン

```
git clone https://github.com/elastic/docs.git
```
### 2. ビルド＆実行

```
cd docs/
./build_docs --doc README.asciidoc --open
```
※dockerをインストールしている必要があります。

ビルドが終わると、ブラウザが立ち上がり以下のようなページが開きます。
--doc にビルド対象を指定、また、--openオプションを指定することでビルド後に自動的にブラウザを立ち上げ、ページを表示します。
<img width="1194" alt="スクリーンショット 2019-12-17 19.58.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432480/782fe023-5a60-5fe4-3f82-cdb3e32ee100.png">

### 3. Elasticsearchソースのクローン
上でビルドしたのは本ビルドツールのチュートリアル用ページといった感じで、Elasticsearchやその他Elastic製品のドキュメントとは異なります。
次はElasticsearchのドキュメントをビルドしてみます。
ドキュメント全体のビルドなど後々のために、ドキュメントビルドツールのディレクトリ（docs）と同じ場所にクローンするのが良さそうです。

```
git clone https://github.com/elastic/elasticsearch.git
```

### 4. ビルド
今回はひとまず単一のページをビルドしてみます。

```
 ./build_docs --doc ../elasticsearch/docs/reference/getting-started.asciidoc --lenient --open
```

--lenient オプションを指定すると、別ファイルとの依存関係等によるエラーを無視して実行することができます。

以下のようなページが作成されました。
<img width="1195" alt="スクリーンショット 2019-12-17 22.02.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432480/d57c4fad-5f54-abda-bd7b-f53830ceaf4c.png">
<img width="1197" alt="スクリーンショット 2019-12-17 22.03.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432480/4301a155-904e-c370-3c85-cd4b41fe3d9a.png">

### 5. 翻訳
今回の主目的である翻訳をしてみました。
翻訳後のファイル(今回は getting-started.asciidoc)を差し替えて同様のビルドコマンドを実行。

```
 ./build_docs --doc ../elasticsearch/docs/reference/getting-started.asciidoc --lenient --open
```

翻訳後のページを作成できました。
<img width="1201" alt="スクリーンショット 2019-12-17 22.11.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432480/15864546-ef6b-2a5e-9b3b-d35dce1b020e.png">
<img width="1196" alt="スクリーンショット 2019-12-17 22.11.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432480/3394fd68-c3ac-375e-2312-a37f963761a3.png">

# おわりに
実のところ、Elasticsearchに上記翻訳のプルリクを投げたのですが、見事に弾かれました。下記参照。
https://github.com/elastic/elasticsearch/pull/49958
悲しいことに、現在ドキュメント翻訳のコミットは受け付けていない様子。。
ですが、勉強も兼ねてもう少し翻訳は続けていこうと思っています。

Advent Calenderの予定日を過ぎて投稿しているにも関わらずの薄い内容になってしまいました。:bow_tone1:
今回はページ単体のビルドを試しましたが、今後リファレンス全体のビルドも試すつもりです。

以上。
mockmockでmockの状態遷移をしてみる(初級編)

こんにちは、mockmockチームエンジニアのジホです。

## この記事は
mockmockアドベントカレンダー 18日目の記事です。
mockmockでmockの状態遷移する方法をまとめます。
初級編として、hello world感じの例を用意しました。

## やりたいこと
mockmockでmockを起動して、json形式の `{"hello":world!}` を5回送信してmockを停止させる状態遷移をします

## 手順
### プロジェクトを作成します
イメージで赤い線を引いたところを同じくします！  
- プロジェクト設定を作成します
![createProject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/3dfea473-9ae3-1819-3c7a-205c6923cb04.png)


- データテンプレートを作成します
![createDatatemplate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/c86d2bfe-6c0c-ff61-8d39-261414cd6865.png)


- mockグループを作成します
![createGroup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/2150c4d4-cc6d-2050-d77d-5e7875906e73.png)


### [ここが重要]mockステータスを作成します
- mockステータスを作成します
![createStatus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/28ced1a3-4930-0798-393e-957518ae8495.png)


- mockステータスを設定します
![setStatusTransitionBtn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/8dc16ea2-d539-708d-ca01-4a1006d63d54.png)

`指定回数送信後による遷移`をクリックします。
5回だけ送信することが目標ですから、指定回数を5にします！
![createStatusByCount.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/71244e34-209f-c6be-9b71-a0f148af96f1.png)
作成した状態を図で確認できます！
![showStatus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/acdea987-a77c-1b21-5c6e-685df4a842a4.png)


- mockを作成します
![createMock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/959e5092-553c-53f8-43d7-fa7afa6bb58b.png)


### mockを起動して状態遷移を見届けます
![edited.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/fbb90394-48e1-aeed-be22-6391b9b58a3a.gif)



## まとめ
本記事では、mockmockでmockの状態遷移する方法を作成しました。
mockの状態をいろいろ設定して、ぜひお試しください。

明日も私、 @cheekykorkind  が `mockmockでmockの状態遷移をしてみる(中級編)` をご紹介します。


## 参考
https://console.mock-mock.com/docs/tutorials/simple_data
GoogleSpreadsheetのシート情報をExcelに取り込む簡単な方法

VBAで出来た既存システムの手動更新が面倒になって来たので､Spreadsheetを編集したら勝手に変わらないかな｡って思って色々調べました｡

スプレッドシートをシートを全体に公開にして､下記のコードに公開用URLを貼り付けるだけです｡
この方法では公開出来ない情報は取り込めません｡今回は商品とロケーションコードの組み合わせのみを取得したいだけなので方法を採用しました｡

Sub GetSpreadSheetInfo()
    With ActiveSheet.QueryTables.Add(Connection:="URL;スプレッドシートのURL", Destination:=Range("A1"))
        .Name = "spreadsheet"
        .WebFormatting = xlWebFormattingAll
        .WebSelectionType = xlSpecifiedTables
        .WebTables = "1"
        .Refresh
    End With
End Sub
※コードの貼り付け方が分からなったです｡｡｡

これが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539678/17d10082-78ce-9ee9-0ba6-423c9544029c.png)
こうなります｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539678/6903d882-8e49-58c7-547f-915af2dd7cfe.png)
競プロ C++ VScodeでデバッグできないエラーを解消する(Mac)

#はじめに

今年の8月に競プロを始めたジョナと申します。

Visual Studio Codeで環境構築をしていたのですが、Mac OS Catalinaでデバッグができないエラーに遭遇したので、初心者なりに解決法を記したいと思います。
今回はデバッグのエラーについてのみ触れるので、詳しい環境構築の情報は下記サイトや他の執筆者様のQiita記事をご参照ください。

[Get Started with C++ and Clang/LLVM in Visual Studio Code](公式サイト　英語）
https://code.visualstudio.com/docs/cpp/config-clang-mac

[macのVSCodeでc++をデバッグする (AtCoderの解答をデバッグする事例つき)]https://qiita.com/tom_sapiens/items/c4c4b7de2201272a94db


#デバッグできない問題が発生
公式サイトや記事を参考に、
-tasks.json
-c_cpp_properties.json
-launch.json
を以下のように設定したのですが、ビルドと実行はできてもデバッグができずにブレークポイントで止まらないというエラーが発生しました。

```
tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Build with Clang",
      "type": "shell",
      "command": "g++",
      "args": [
        "-std=c++14",
        "-g",
        "main.cpp",
        "-o",
        "main.out",
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}
```




```
c_cpp_properties.json

{
    "configurations": [
      {
        "name": "macOS",
        "includePath": ["${workspaceFolder}/**"],
        "defines": [],
        "macFrameworkPath": [
                          "/System/Library/Frameworks",
                          "/Library/Frameworks"],
        "compilerPath": "/usr/bin/g++",
        "cStandard": "c11",
        "cppStandard": "c++14",
        "intelliSenseMode": "${default}"
      }
    ],
    "version": 4
  }
```

```
launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "(lldb) Launch",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/main.out",
      "args": [],
      "stopAtEntry": true,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": true,
      "MIMode": "lldb",
      "logging": {
        "trace": true,
        "traceResponse": true,
        "engineLogging": true
      }
    }
  ]
}
```
#解決策 CodeLLDBを使う

私はこの問題に何週間も悩まされ続けたのですが、ついに解決法を見つけました。

https://github.com/microsoft/vscode-cpptools/issues/3829

このスレッドによると、Mac OS CatalinaをインストールしたことによってVSCodeでデバッグできなくなっている人が多くいるようです。

解決策は、VSCodeのExtensionであるCodeLLDBをインストールし、launch.jsonを以下のように書き換えることです。

```
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "lldb Debug", //nameは何でも大丈夫です
      "type": "lldb", //typeをlldbにすることでCodeLLDBが使えるそうです
      "request": "launch",
      "program": "${workspaceFolder}/main.out",
      "args": [],
    }
  ]
}
```

#結果

CodeLLDBを使うことによって、デバッグができ、ターミナルから入力も受け取れるようになりました！
launch.jsonの書く量も減ってとても楽になりましたね。

<img width="838" alt="Screen Shot 2019-12-17 at 22.03.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446327/b31c5a26-dbcf-090a-1a44-58e3331f7a01.png">

もし質問等ありましたら、コメントでお知らせいただけると幸いです。
初心者なりに、わかることがあればお返事させていただきます。
最後まで読んでくださりありがとうございました。
[Railsチュートリアルを始める方へ]クレジットカードなしでAWSに登録して、cloud9を使ってみた[2019年12月最新]

#TL;DR
###クレジットカードの代わりにバンドルカードと呼ばれるVisaプリペイドカードを用いてAWSアカウントを作成した。さらに、Railsチュートリアルで推奨されているCloud9を用いてのRailsの環境構築を行った。

---
#先行事例
この記事を執筆する上でクレジットカード以外でCloud9を使う方法について解説してあるサイトを探した。
すると、以下のような情報が得られたのでここに記しておく。
>おさいふPontaを利用してCloud9を使う
>>https://qiita.com/ygkn/items/ce4207ecfd85a84b1c37

>Vプリカを利用してCloud9を使う
>>https://www.techpit.jp/courses/laravel-trello-todo/lectures/8497101
>>https://teratail.com/questions/137987


#手順
##1.バンドルカードの作成
###Q. なぜバンドルカードを使用したのか
そもそも、AWSのアカウントを作成する際に使用することのできるクレジットカードの種類は
``Visa、MasterCard、American Express、Discover、JCB、または China Union Pay``
である。この内、オンラインで即時発行可能なVプリカという条件に合ったものの一つだったから。
要検証ではあるが、Vプリカなら何でも登録がいけるのかもしれない（例.Kyashカード,Visaギフトカード）
>　参考:[AWS / AWSアカウント作成の流れ](https://aws.amazon.com/jp/register-flow/)

##2.バンドルカードに課金
先行事例で挙げたおさいふPontaを利用してCloud9を使う記事に書かれていたのだが、
``チャージをしないとCloud9アカウント作成に失敗してしまうのでご注意ください。``
らしいので、あらかじめバンドルカードに課金しておく。
課金の方法については公式のFAQを参考にする。
>  参考:[VANDLE CARD / チャージって？](https://support.vandle.jp/hc/ja/articles/227248687-チャージって-)


##3.AWSアカウントの作成
AWS公式がAWSアカウントの作成について非常に分かりやすく説明されているので、
それを参考にしてもらえば問題ないと思う。
>　参考:[AWS / AWSアカウント作成の流れ](https://aws.amazon.com/jp/register-flow/)

##4.Cloud9を用いてRailsチュートリアルの環境を構築
以下のチュートリアルに書かれている通りにすすめれば問題ないだろう。特に躓くこともなかったのでリンクを貼るだけにとどめておく。
[Railsチュートリアル / 1.2さっそく動かす](https://railstutorial.jp/chapters/beginning?version=5.1#sec-development_environment)

##5.おまけ
[【AWS Cloud9環境の削除】無料枠の1年を越える前に、不要な環境は削除しよう。](https://blog.rokisan.com/entry/2019/02/10/232832)

---
EFIシステムパーティションを破壊した時の対処

先日研究室で夜中作業していたときに起こった惨事とその解決法について
#何が起こったのか

**誤ってパーティションを破壊してしまった。**
深夜０時ごろ、ラズパイで遊んでいた友達からSDの中身を消してフォーマットしてくれと頼まれ、
重い目をこすりながらSDをいじった際に何を思ったか誤ってEFIのシステムパーティションを消し去ってしまった。（/boot/efi以下の部分が全て消えていた）

記事をご覧の皆さんはこんなヘマはしないだろうが、この時の解決策を載せておきます。


#EFI System Partition とは
消えたEFI System Partitionがどのような役割を担っていたのか

[EFI System Partition](https://wiki.archlinux.jp/index.php/EFI_%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3)(archlinux)によると、

>EFI System Partition (ESP や EFISYS とも呼ばれます) は FAT32 でフォーマットされた物理パーティション (ディスクのメインのパーティションディスクで、LVM やソフトウェア RAID などとは異なります) でここから UEFI ファームウェアは UEFI ブートローダやアプリケーションを起動します。OS とは独立したパーティションであり、UEFI ブートには必須のパーティションになります。

自分がかなりやばい部分を消してしまったという事実を再認識したところで、解決策を見つけたので書いていく。
（ちなみに、焦りからかこの時点でようやく眠気が引いてきた）

#解決手順
##①パーティション作り直し
もともとシステムが存在していたところに、新たにパーティションを作成します。
ファイルシステム：FAT32、フラグ：boot

##②環境の変更：chroot
ブートローダーを再構築するための下準備

```terminal:terminal
sudo -s
mkdir /chroot
mount /dev/sda2 /chroot
mount --bind /dev /chroot/dev
mount --bind /dev/pts /chroot/dev/pts
mount --bind /proc /chroot/proc
mount --bind /sys /chroot/sys
mount --bind /run /chroot/run
chroot /chroot
```
##③ブートに必要なgrubをインストール

まず、①のパーティションをマウント　ー>　grubをインストール

```terminal:terminal
mount /dev/sda1 /boot/efi
grub-install --efi-directory=/boot/efi
update-grub
```
以上の手順で /boot/efi 以下が復帰します。
※まだ再起動はかけてはいけません※

##④/etc/fstabの変更
/etc/fstab 中のUUIDを変更します
UUIDを確認して、書き換えます。


```terminal:terminal
blkid /dev/sda1
vim /etc/fstab
```

#終わり
下に載せますが、ほぼ他人様のサイトを参考にしています。
今回の惨事を乗り越えて思ったのは、
「眠すぎるときにPCはいじらない」


#参考資料
[EFIのパーティションが破損して起動しなくなったUbuntuを直した](http://nodemand.hatenablog.com/entry/2016/11/11/175929)
【忘備録】RPAが壊れた時に疑うこと、直すこと

# 0. 前書き
RPAが動かなくなった時に何を確認すべきか、どのような修正をするのか、というのを忘備録として作成。
動作が外部に依存するので色々な壊れ方をするが、パターンを抑えるのが大事な気がする。
これから開発する方の参考になれば幸い。

# 1. カーソル操作に失敗する
画面のボタンが見つからなかった...だけで済まなかったりする。
画像認識で操作させる場合、RPAの認識する画像と現在の画面をよくよく観察して、微妙な違いを見つけるのが大事。

## 1-1. Webサイト、ソフトのデザイン変更
何もしてないけど壊れたらまずこれ。特に画像認識で操作させると頻繁に起こる。

### RPAが操作対象を画像で探す場合
認識用に設定した画像から変わっていないか、また操作対象のボタンの位置が変わっていないか確認する。
必要があれば画像を差し替える。

### RPAが操作対象をHTMLタグで探す場合
開発者ツールからタグ構造を確認して、操作対象のタグを修正する。

## 1-2. ウィンドウサイズの変更
画像認識の時に起こりやすい。人間には些細なことだが、RPAツールから見れば画面のデザイン変更とほぼ同義。
画面のデザインが切り替わり操作対象がずれることが懸念される。
ウィンドウサイズを手動で調整する、起動するソフトは必ず最大化させるなど対策を講じる。

### ※ 解像度の変更
以前より画面がくっきりしている、ディスプレイが変わって綺麗になった、という場合に警戒する。
高くなった解像度に合わせてウィンドウサイズを変えてしまうためバグの遠因になる。
同じ寸法のディスプレイでも、解像度が倍なら画像サイズは倍以上。傍目には違和感を感じにくいので忘れないように。
解像度が落ちた事例は見たことがないのでアドバイスすることはできない。

# 2. テキストの入力に失敗する
自動入力が原因になりやすい印象。特に日付のカレンダー。Webサイト、ソフト毎に挙動が異なるので個別の対応が必要と思われる。

## 2-1. ブラウザの自動入力ON/OFF
特にWebサイトのフォーム入力を失敗させることが多い。主に以下のバグが発生する。

- フォーム選択時に以前のテキストが自動で入力され、その上にRPAがテキストを入れて不正な値になった。
- ブラウザのキャッシュを消したため、自動入力するテキストが消えて操作に失敗した。

ブラウザの自動入力を切ってテキスト入力させる、または手動でブラウザにテキストを記録させる修正が想定される。
自動入力はWebサイトの実装にも依存するので、あまり拘らず利用するWebサイトに従う方がいいと考えられる。
(自身もまだ方針を定められていないので、考え方の例などあればご意見下さい。)

## 2-2. ウィンドウ名の変更
RPAツールが操作ウィンドウを認識できない場合に考えられる。
ウィンドウ名にワイルドカードを使い、名前の判定をゆるくする。ただし別のウィンドウが引っ掛からないよう注意。
ウィンドウのクラス名が変わる場合もあるが、めったに変えるようなものでないので忘れていい。

# 3. RPAが1回だけ動かない、時々動かない場合
動作が外部に依存するので避けられない難所。PCスペックや回線も問題になる。
正直まだこれといった改案を出せない。

## 3-1. 排他制御
ソフト、Webサイトを同時に操作できるユーザー数の制限にかかってしまう場合がある。
そもそもRPA実行中に触る顧客が悪い...とは言えないのでできる事をしよう。

- 排他制御するソフトがないか運用前に顧客へ確認する。
- 不明ならこちらで検証する。顧客に検証の意図とその操作、検証による影響を説明して許可を頂く。
- RPA動作中に指定ソフトを操作しないことを、運用前に顧客へ告知する。

### Webページの場合
2重ログイン防止のためログアウトした可能性がある。
通常のセッション切れで弾かれていた場合もあるので、原因を切り分けておくこと。

### オンプレミスのソフトを使う場合
データを同時に編集できるユーザー数が制限されている可能性がある。
これによりデータの編集に失敗していた、排他制御の警告ウィンドウがRPAの操作を邪魔していたといったバグが起こり得る。

## 3-2. 操作するデータが特例だった
通常と違う操作が必要なデータが紛れていた可能性がある。他は問題無いのにこの1件だけRPAが落ちるという状況で該当しやすい。
他のデータとの違いを理解してから顧客に問い合わせると最良だが、データから見えない事情があるため聞いてみることが大事。
この日付だけは特別な処理だった、ソフトに設定は無いがここだけは別の計算が必要など様々。

データが特例だった場合はすぐに修正しない。
まずはそのデータをRPAで触っていいのか確認。次に同じ特例がどの程度発生するのか、その特例を処理するためにどれだけの操作が必要か聞き取り、修正に見合うだけのメリットがあるか検討する。
RPAは複雑な条件をこなすツールではない。ささいな機能追加でも可読性が相当落ちるということを留意する。
個人的に、VBAとかpythonで専用に組んだ方が...と考えるほどの操作なら危険。

## 3-3. WindowsUpdate
ブラウザが何かと重い、ソフトの通信が遅い、といった場合に可能性がある。これはアプデの終了を待つしかないかも。
(Objective-C/Swift)iOS13 presentViewControllerしたViewControllerをスワイプで閉じられないようにする処理（storyboard、segue遷移版）

###こういう人に向けて発信しています。
・ViewControllerを表示して勝手に閉じられてしまって困っている人
・seuge遷移でどうすればいいかわからない人
・Swift中級者／Objective-C中級者


[前回の記事:【Objective-C/Swift】iOS13にてpresentViewControllerしたViewControllerをスワイプで閉じられないようにする処理（コード版）](https://qiita.com/godaikun_method/items/a1a6f5fcf2f566a25493)

前回はコードで画面遷移する際に
**・画面サイズをフルスクリーンと指定する。
・スワイプで画面が下がらないようにする**
を対応しました。

しかしながらコードではなくsegue遷移していた場合については、
フォローし切れていなかったので改めて補足を分けて投稿いたします。

segueで遷移する先のViewControllerをスワイプで下げられないようにする方法を記載します。

##Objective-C
```
//segue遷移を行う
- (void)gotoNextSegue{
   [self performSegueWithIdentifier:@"segueIdentifer" sender:self];
}



//segueで画面遷移する直前に呼び出される
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
   CustomViewController *customVC = (CustomViewController*)segue.destinationViewController;
   customVC.modalInPopover = YES;  //YESにするとスワイプで消えなくなる。
}
```

##Swift
```
    //segue遷移を行う
   func gotoNextSegue() -> Void {
       performSegue(withIdentifier: "segueIdentifer", sender: nil)
   }

   //segueで画面遷移する直前に呼び出される
   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       let customVC  = segue.destination as! CustomViewController
       customVC.isModalInPresentation = true;
   }
```
pythonで単色画像の生成｜Kaggleアイコン

# はじめに
Kaggleを始めるためにアカウント作成し、プロフィール設定をしようとしました。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552715/da0b42a9-7921-ba17-614f-fc50619eac4e.png width=90%>
Twitter,Qiitaのアイコンと統一しようと思い、いつもの画像をアップロードしようとすると…
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552715/25942280-84a4-08b1-ce96-02df90015e9b.png width=70%>
中央には**Upload Image(min. 400x400)**の文字が

いつもアイコンに使っていた画像のサイズが(240x420)なので当然reject!
ただの単色画像なのですが、好きな色を検索して適当に拾った画像だったので微妙なサイズでした。

よし、せっかくだし単色画像を生成するプログラムを書こう。

# 色選び
[こちら](https://www.colordic.org/)の原色大辞典さんを参考にして色を選びました。
例として、自分のアイコンの色であるlightcyanをクリックすると
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552715/d9987e5d-1a55-50b5-ebe1-5a17d1b77c86.png width=70%>
その色について様々な数値データが掲載されたページに飛びます。
今回は、rgb色空間にて画像を生成するので`rgb(224,255,255)`を使います。

# 単色画像の作成
色と画像のサイズを引数にして単色画像の配列を返す関数を作りました。

```python:create_monochromatic_img
def create_monochromatic_img(color, size):
    r = color[0] * np.ones((size[1], size[0], 1), dtype=np.uint8)
    g = color[1] * np.ones((size[1], size[0], 1), dtype=np.uint8)
    b = color[2] * np.ones((size[1], size[0], 1), dtype=np.uint8)
    return np.concatenate([r, g, b], axis=2)
```
色はlightcyan、サイズ400x400の画像を作成したいとき

```python:main
#python3.6.7
#import numpy as np
#import cv2
color = [224, 255, 255] #[r,g,b]
size = [400,400] #[height,width]
img = create_monochromatic_img(color, size)
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
cv2.imwrite('out.png', img)
```
上記のようにします。

# 出力画像
![lightcyan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552715/6b86cf7f-9fe5-5bdf-6043-5e72bb76a685.png)
いい色〜

#まとめ
numpy配列便利！(n回目)
【Objective-C/Swift】iOS13にてpresentViewControllerしたViewControllerをスワイプで閉じられないようにする処理（コード版）

###こういう人に向けて発信しています。
・ViewControllerを表示して勝手に閉じられてしまって困っている人
・Objective-C中級者
・Swift中級者

[iOS13でのモーダル表示](https://qiita.com/nullpo33/items/a46a180a0aaf63aadcea)
こちらの記事ではSwiftのみ記載があったので、
Objective-Cの内容も合わせて補足して記事として出します。

また、ネット上で調べてもうまく検索でヒットしないので
今回の記事をまとめてさせていただきました。

Objective-Cにつきましては記事を参考にせず
動作確認の上掲載しております。

##Objective-C
```
   UIViewController *vc = [[UIViewController alloc]init];
   vc.modalPresentationStyle =  UIModalPresentationFullScreen;  //表示形式の選択
   setting.modalInPopover = YES;  //YESにするとスワイプで消えなくなる。
   [self presentViewController:vc animated:YES completion:nil];

```
##Swift
```
       let vc = UIViewController()
       vc.modalPresentationStyle = .fullScreen;
       vc.isModalInPresentation = true;
       present(vc, animated: false, completion: nil)
```
**上記補足**
閉じれないとは書いていますが、**少しだけ下がるような挙動**をします。
ただしiOSのiMessageなども同様挙動する事から
**完全にスワイプするのはオフには難しい**のかと思っております。

下記内容は補足となります。

#例えばFormSheetのサイズを固定化したい時(Objective-C)

```
   UIViewController *vc = [[UIViewController alloc]init];
   vc.modalPresentationStyle = UIModalPresentationFormSheet;
    //モーダルビューのサイズを変更

   float frameWidth = 550;
   float frameHeight = 260;
   vc.preferredContentSize = CGSizeMake(frameWidth, frameHeight);
```

##例えばFormSheetのサイズを固定化したい時(Swift)
        //サイズ指定する
       let frameWidth :CGFloat = 550
       let frameHeight : CGFloat = 260;
       vc.preferredContentSize = CGSize(width: frameWidth, height: frameHeight)
Akashic Engineで自己紹介動画のようなものを作ってみた

この記事は、Akashic Engine Advent Calendar 2019の17日目の記事です。

Akashic Engineの基本用途はゲーム開発だと思いますが、ゲーム以外のことにも使えます。今回はそのひとつとしてAkashic Engine（正確には[前記事に登場したノベルゲームエンジン](https://qiita.com/pocketberserker/items/4ff0a3c9ce39bfc9e078)）を使ってあるキャラクターの自己紹介コンテンツを作ってた話をします。

## 利用例

https://kogatari-a.co/ に設置されている「Self Introduction」をクリックすると自己紹介コンテンツが起動します。このコンテンツはノベルゲームエンジンでシナリオファイルから実装スクリプトを生成し、akashic-cliのHTML export機能を使ってHTML出力した、Akashic Engineエコシステムを利用したコンテンツです。

ちなみに当該サイトのキャラクターは小語アコちゃんです。よろしく。

## キャラクターの表情切り替え

文章のレンダリングについては[前記事](https://qiita.com/pocketberserker/items/4ff0a3c9ce39bfc9e078)に書いたので、今回は表情変化について軽くふれておきます…といっても種を明かすと単純な話で、基本は[akashic-timeline](https://github.com/akashic-games/akashic-timeline)のフェードイン、フェードアウトを利用するだけです。
`Sprite`を2枚用意し、同じタイミングで変更前をフェードアウト、変更語をフェードインさせるといい感じになります。

あとは表情変化後に文字描画を自動で開始させていますが、これもakashic-timelineの`Timeline`に存在する`call`メソッドを使用しています。`Trigger`を用意し、`Trigger`に登録するハンドラで文字列描画関数を呼び出すようにしておき、`timeline.fadeIn(...).call(() => {...})`とcallに渡す関数内で`Trigger.fire`を呼び出してあげれば、あとはよしなにやってくれます。便利ですね。

## Webサイト上でのAKashic Engine製ゲームの表示

RPGアツマールに投稿する場合は特に考えなくても良いですが、独自のWebサイトに掲載する場合には自力でコンテンツ表示を考える必要があります。特にモバイル全盛期となった昨今ではモバイル環境でも閲覧できたほうが良いでしょう。

まずは単純なコンテンツの表示自体の話ですが、これはiframeを使うのが手っ取り早いかと思います。記憶が確かなら[Akashic Engine公式ページ](https://akashic-games.github.io/)でもiframeを使って組み込んでいたはずです。モバイル対応しない（画面サイズによってコンテンツを出し分けない）つもりならこれで十分でしょう。

そして画面サイズによってコンテンツを切り替えたい場合ですが…これはモバイル用にもうひとつリサイズ版ゲームを用意することで解決（？）しました。akashic-cliのHTML export機能を使いたいのでHTML自体には手を入れられないことを考慮すると、ゲーム内から画面サイズを無理やり取得してサイズを変える労力よりはもうひとつ作ってしまったほうがコストが安かったというのが、この手法に至った理由です。
ちなみに全部が全部再実装になるわけではなく、実際の描画実装部分は使いまわせるのでサイズ変更に伴う微調整をひたすらやればいいだけだったりします。具体的には背景、キャラクタの位置、一文に表示できる文字数を実際に動かして調整していく形ですね。

## BGM

BGMは[とある方](https://twitter.com/OkuriSae)に作っていただたmp3形式のファイルを、公式が提供する[complete-audio](https://github.com/akashic-games/complete-audio)で変換しました。手間を書けずに生成できて大変便利です。

## まとめ

というわけで、わりと簡単な自己紹介動画であれば簡単に作成できると思います。公式ツールが揃っているのでなんとかなる…はず。ちなみに汎用性を気にせず、Spriteとakashic-timelineとakashic-labelを駆使すればAkashic Engine公式ライブラリのみで（件のノベルゲームエンジンを使わずとも）似たようなコンテンツを作れますよ！
みなさんもゲーム開発気分でゲームでないコンテンツを作ってみてはいかがでしょうか…！？
JavaScriptを使って、テキストをコピーさせる



ダミーの入れ物を用意して、それを選択した状態にして、コピーをコマンド操作でしてあげる必要がある。

```:Javascript
        $('#btn').on('click', function(){
            const text = 'sample';

            const dummyText =  document.createElement('textarea');
            const bodyTag　= document.getElementsByTagName('body')[0];

            dummyText.text(text);
            bodyTag.appendChild(dummyText);

            dummyText.select();
            document.execCommand('copy');

            bodyTag.removeChild(dummyText);
            alert('コピーしました。');
        });
```

##参考にさせていただいたサイト
https://webllica.com/copy-text-to-clipboard/
【推し祭り】『vvvv.jsハンズオン本(冊子)』

[【推し祭り】技術書典で出会った良書 Advent Calendar 2019](https://adventar.org/calendars/4224)の14日目の記事です。(遅くなってすみません)


技術書典7では色々買ったのだが全部はじっくり読めていないのと、最近VJやCreative Codingをちょっとずつかじっているので、技術書典でももっとシーンが広がるといいなと思い、こちらを推したい。

- 『vvvv.jsハンズオン本』
    -  [CANDY CHUPS Lab.](https://techbookfest.org/event/tbf07/circle/5729086676664320)
さんの
[Booth](https://gyaopan.booth.pm/items/1159985) にて500円で販売中。(技術書典6の既刊のようです)

本来vvvvはWindows向けとのことだが、vvvv.jsのほうはMacBookでも`git clone`して`yarn`するだけでローカル環境を作ることができ、本書を開いて数分でこういう3Dアニメーションが作れる。

![vvvv.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281/5e75a1ba-8e07-08d6-caf8-9b1464664f64.gif)

この先は自分で調べる必要はあるが、既にNode.jsを触っていて、ブラウザでのクリエイティブコーディングを触ってみたい人にはとっつきやすいのではなかろうか。（ちなみに自分の普段使いは、ブラウザベースではないがノードベースのTouchDesigner）
IT健保 育児休業中の経済支援

IT健保に関する育児休業中 介護休業中の経済支援についてまとめました。

# 給付金

## 1. 出産育児一時金
出産の際の費用を医療機関等が健康保険組合に出産費用の請求を行います。
扶養家族の場合、家族出産育児一時金という。
産休に入る前に育児休業給付金の申請書に署名、捺印して会社に提出し、
会社がハローワークへ手続きします。
育児休業給付金は、2ヵ月に一度、2ヵ月分がまとめて給付されます。初回の給付は、育児休業開始から2ヵ月後。以後、育休が2ヵ月経過するごとに申請が必要となります。

育児休業給付金の支給対象になるのは、産休の終了翌日からになります。
[育児休業について](https://www.its-kenpo.or.jp/hoken/jimu/ikuji/kyuugyo.html)

#### 支給額：420,000円（産科医療補償制度対象分娩でない場合は404,000円）
出産費用が支給額以下の場合、健康保険組合に差額を請求することができる。
[提出書類1](https://www.its-kenpo.or.jp/hoken/situation/case_03/hihoken.html#case1)

#### 支給方法：受取代理制度、直接支払制度
出産する分娩機関が直接支払制度あるいは受取代理制度のどちらかを実施しているか
で利用する制度が決まります。まずは、出産予定の分娩機関にてお尋ねください。
[直接支払制度と受取代理制度の違い](http://www.brother-kenpo.jp/kyufu/syussan/img/dif.pdf)

## 2. 出産育児付加金
ITSが独自に用意している制度です。
出産後に申請可能、銀行に振り込んでくれます。
会社の情報を入力する必要ないため、直接でも会社経由でも申請可能です。
支給額：90,000円
申請：[提出書類1](https://www.its-kenpo.or.jp/hoken/situation/case_03/hihoken.html#case1)

## 3. 育児休業給付の支給
産休からそのまま育休に入る方は、「産休」と「育休」それぞれ別の申請(計2回)が必要になりますのでご注意してください。
180日目　　：67%
181日目以降：50%

さらに、育児休業中は健康保険料と厚生年金保険料が全額免除されます。なので、給付金から社会保険料が控除されることはなく丸々もらえます。

## 免除
以下は、被保険者ではなく会社が　申請することで免除を受けることができる。

### 1. 所得税の免除
産前産後休業期間中に勤務先から給与が支払われていなければ、給与に係る所得税の負担はありません。
育児休業給付も非課税のため、支払う必要はありません。

### 2. 住民税は免除されない
住民税の金額は前年度の収入によって決定されることになっているので、前の年に働いていた実績のある人ならば育児休業中であっても支払う必要があります。
　ただし、育児休業期間の給付金は非課税であるため、翌年の住民税を算出する際の収入には含まれません。
特別徴収を継続する場合と普通徴収に切り替える場合が考えられます。勤務先に相談しましょう。

### 3. 社会保険料の免除
社会保険料の免除は自動的に行われるものではなく、事業主による年金事務所への申出が必要です。
[社会保険料の免除につてい](https://www.its-kenpo.or.jp/hoken/situation/case_03/ikuji.html)

### 4. 厚生年金保険料等の免除
産前産後休業の期間中、健康保険・厚生年金保険の保険料は、会社から年金事務所又は健康保険組合に申出をすることによって、本人負担分、会社負担分ともに免除されます。社会保険料の免除を受けても、健康保険の給付は通常どおり受けられます。また、免除された期間分も将来受け取る年金額に反映されます。

### 5. 雇用保険料の免除
産前産後休業期間中に勤務先から給与が支払われていなければ、雇用保険料の負担はありません。

## お問い合わせ
### 1. IT健保
お問い合わせは[適用一課](https://www.its-kenpo.or.jp/toiawase/index.html)へ

### 2. ハローワーク
千 葉 043-242-1181
新宿 03-3200-8609

＞パパ・ママ育休プラス
お問い合わせは都道府県労働局雇用環境・均等部（室）へ
千 葉 043-221-2307
東 京 03-3512-1611

## その他
- [給付金と育児休業期間の計算ツール](https://www.office-r1.jp/childcare/)
- [標準報酬月額表](http://www.team-cells.jp/hyoujyun/hyoujyunhousyu.php)
- [パパ・ママ育休プラス](https://www.mhlw.go.jp/file/06-Seisakujouhou-11900000-Koyoukintoujidoukateikyoku/0000169713.pdf)
- [はじめての育児休業給付金！](https://13imi.me/ikukyu-kyufukin/)
- [児童手当](https://www.city.chiba.jp/kodomomirai/kodomomirai/kikaku/jidouteate.html)
「データは嘘をつかない」は本当か？人は..嘘をつくぞ...

# 間違いなくデータは嘘をつかない
皆さんは統計局が実施している「家計調査」をご存知でしょうか？よく「平均」の誤った使い方の揶揄として挙げられるものなので、統計関係の入門書などに目を通したことがある方は一度は聞いた内容だと思います。

**２０１８年の家計調査によると、「二人以上の世帯」における平均貯蓄残高の平均は..**
### １，７５２万円
だそうです。
総務省統計局ー家計調査報告２０１８年より（https://www.stat.go.jp/data/sav/sokuhou/nen/index.html）

これをみて多くの方は「中央値」で話せよ、と思うでしょう。現にかなり前から統計局は中央値を同資料に記載しています。ちなみに中央値の場合は１，０３６万円らしいですが、まだまだ現実との乖離があると思いませんか？
なので最近は「格差社会」という前提で、「最頻値」というものを用いて「５世帯に１世帯は貯蓄が２００万円に満たないんです！」なんて言ってたりします。

さて、では上記の「平均値」、「中央値」、「最頻値」の中で正しいものはどれなのでしょうか？

# 分析や集計、グラフ化には誰かの意図が紛れ込んでいる
上記は少し極端でシンプルな例ではありますが、どれもデータに基づいた正しい値ですし、シーンによって使い分ければどの数値も大きく意味のあるものです。問題は情報を伝える側が、「伝える内容を取捨選択できる」ことにあります。

データという事実が絵の具であれば、分析した内容は分析者の一つの作品です。
「〜〜という仮設のもと、この値を分析してみよう」
「データの推移がよりわかりやすくするようにグラフにしてみよう」
と考えている時点で、分析者の頭には、ある程度見せたい内容が描かれています。

# それは悪いこと？
もちろん悪意のある捏造じみた内容や、「報道しない自由の行使」などは悪いといえるでしょう。
しかしながら分析自体に意図があるのは当然のことで、むしろ仮設や肌感覚を、数字の力で明文化する最強のビジネスメソッドだと思います。
寒くなってきたからおでんが売れるだろう、と在庫を多めに用意しておきたい。けど店長が無駄なことはしなくていいと言ってきたら、気温とおでんの売上金額の相関係数を突き出してやればいいのです。

一言で済む話なのですが、あえて最後にもってきました。
**分析資料を読み解く上で気をつけないといけないことは、誰がどういう意図で分析したのか？**
あとは、きれいなグラフに心を奪われないブレない心も。
ここが違うよSSHとSSL！

#大幅に修正しました(2019/12/18)
指摘をいただき、内容に誤りが多いことがわかったので修正しました！
こちらの記事を非常に参考にさせていただきました。

[SSL/TLSの見落とされがちな「認証」という基本機能](https://qiita.com/angel_p_57/items/dcb12a6a864f9aeba427)
[SSHの公開鍵認証における良くある誤解の話](https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432)

#はじめに
SSLとSSHってなんか名前よく似てて、ごっちゃになってよくわからない！！
となったので自分用のメモとしてまとめる。

# SSLとは
SSL(Secure Sockets Layer)とは暗号化の仕組みである。
トランスポート層のプロトコルであり、HTTPやFTPなどのプロトコルで行われる通信を暗号化して安全に送受信するためのプロトコルである。
また、TLS（Transport Layer Security）というSSLの次世代規格がすでに存在。
今はTLSが主流であるが、合わせてTLS/SSLと記載されることがある。

SSLの目的としては２つ

- ~~サーバーが安全かどうかの証明~~
- **意図した接続先かどうか(なりすましでないか)の証明(認証)**
- 通信内容の暗号化

例えばama●onなどで物を購入する際、名前や住所などの個人情報を入力し、送信する必要があります。
この時に注意しなくてはならないことが下の2点です。

- 個人情報を送信する先が意図した相手であること
    - 本当にama●onのサイトか？見た目がそっくりなだけではないか？
    - そもそもama●onは信頼できるサイトなのか？
- (送信先が意図した相手であるうえで、)送信途中で誰かに個人情報を盗み見られないか

##個人情報を送信する先が意図した相手であること
いくら通信を暗号化したとしても送信先が意図する相手でなければなんの意味もありません。
送信先が意図した相手かどうかを確かめる時に利用されるのが**サーバ証明書**です。

サーバに接続を要求した時にサーバ証明書が送られ、この証明書を頼りにサーバー側が信頼できるサイトかどうかを判断する。
ただし、サーバ証明書が送られてきたとしてもその証明書が信頼できるとは限らない。
そこで「その証明書、信頼できるよ！」と保証してくれるのが**認証局**。
ただし、今度はその認証局が本当に信頼できるかわからない...といって堂々巡りになっていく。

この堂々巡りを一番大元まで辿ると**ルート証明書を持つ認証局**までたどり着く。
このルート証明書はあらかじめブラウザに登録されているため、確実に信頼できるといえる。

最下層の証明書から、中間の証明書(**中間CA証明書**)をたどり、最上位の証明書(**ルート証明書**)までたどり着くことで、最下層の証明書が信頼できると判断できる。
信頼された証明書を持つサイトは[https~]から始まるURLとなり、ブラウザのURL欄に錠のマークがつけられる。

※ただしルート証明書が確認できたとしても、不正なサイトな場合もある。
そのため、接続する先のドメインをしっかりと確認することと、自分で信頼できるサイトであると判断する必要がある。
詳しくは[SSL/TLSの見落とされがちな「認証」という基本機能](https://qiita.com/angel_p_57/items/dcb12a6a864f9aeba427)を参照

##送信途中で誰かに盗み見られることはないか
平文でそのまま送ってしまっては、送信途中で盗み見られてしまう可能性があるため**暗号化**を行います。
暗号化は共通鍵を用いて行いますが、共通鍵を共有する方法として以下の通り

- 鍵交換による共通鍵の共有
    - DHEなどの鍵交換を用いた共通鍵の共有
    - [SSL/TLS（SSL3.0～TLS1.2）のハンドシェイクを復習する](https://qiita.com/n-i-e/items/41673fd16d7bd1189a29#%E9%8D%B5%E4%BA%A4%E6%8F%9B)
- 公開鍵による認証による鍵交換の保護
    - デジタル署名で認証を行ったうえで鍵交換を行う
    - [【図解】初心者も分かる”公開鍵/秘密鍵”の仕組み～公開鍵暗号方式の身近で具体的な利用例やメリット〜](https://milestone-of-se.nesuke.com/sv-advanced/digicert/public-private-key/)

**証明書に公開鍵を含め、共通鍵を公開鍵で暗号化して送り返す方法は、セキュリティの問題上近年使われなくなっている。**

#SSHとは
SSH(Secure Shell)は暗号化された遠隔ログインシステム。
SSHで接続する際に重要なことは以下の3つ

- クライアントからみてサーバーが意図した相手であること
- サーバーからみてクライアントが認証できること
- 送信途中で誰かに個人情報を盗み見られないか


##クライアントからみてサーバーが意図した相手であること
SSLでは認証局が発行した**証明書**により、接続先が信頼できるかどうかを確かめることができた。
一方でSSHにおいては、接続先の証明書となるものが公開鍵である。
SSLでは証明書により保証されているが、SSHの場合の公開鍵が保証されていない。
(現在はSSHでも証明書による運用も可能)

そのためサーバーにSSHで接続すると、サーバーが公開鍵を受け取るが
この公開鍵を用いてディジタル署名を検証し、サーバーの検証を行う。


##サーバーからみてクライアントが認証できること
SSLの場合はユーザー認証はオプション扱い(クライアント証明書を用いるもの)であったが
SSHの場合はユーザー認証が必須である。

###認証方法(公開鍵認証)
1. ユーザー側で秘密鍵と公開鍵のペアを作成
1. 事前に接続先のサーバーに公開鍵を渡しておく
1. ユーザー側で秘密鍵を利用して署名を作成し、サーバーへ送る
2. サーバー側で公開鍵を用いて検証を行い、ユーザーの認証を行う

詳細に関してはこちらの記事がわかりやすくまとまってました。
[SSHの公開鍵認証における良くある誤解の話](https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432)

##送信途中で誰かに盗み見られることはないか
暗号化に関してはSSLと大きな違いはないと考えられます。

#最後に
色々と修正しましたが、誤りがある場合はまたご指摘お願いします。
DDDで非同期プログラミング（Kotlin Coroutine）


こんにちは。
AnyMind Groupという会社でCastingAsiaというプロダクトのテックリードをしています。以前はScala中心でしたが、今はPython,Kotlinを使ってDDDに取り組んでいます。

本記事では、Kotlin Web Applicationでの非同期処理をどう書くかをお話できればと思います。

## 環境

- SpringBoot WebFlux 2.2
- Kotlin 1.3

なお、本記事では非同期プログラミングライブラリとしてKotlinのCoroutine( https://github.com/Kotlin/kotlinx.coroutines )を使いますが、ReactorやRxJavaなどでも代用出来るかと思います。

## なぜ非同期処理を書きたいのか

### 用途に応じてThread Poolを分け、パフォーマンスを向上させたい

IO(HTTP通信やSQLの発行、ファイル操作)は、近年ではR2DBCやNonBlockingなライブラリも出てきましたが、ThreadをBlockしてしまう処理もまだあるかと思います。

このとき、SpringBoot WebFluxのデフォルトのThread Pool(`reactor-http-nio`)はnon-
blockingを前提としてthread数が少なく作られているため、IO系などBlockingする処理を入れると全てのthreadがsleepしてしまいパフォーマンスが急激に落ちます。

（ちなみに`reactor-http-nio`のデフォルトのthread数はこちら）
https://github.com/reactor/reactor-netty/blob/0.9.x/src/main/java/reactor/netty/resources/LoopResources.java#L45

そのため、Blockingの有無や優先度に応じて別のthreadPoolを使い分けたくなります。

### 並行・並列処理を明示的に記すことで、よりドメインを表現したい

例えばListを処理をする際に、各要素の処理を並列で実行出来ると速度の改善が見込めます。

また、RDBへデータを保存すると同時に（並行して）、外部サーバーにHTTPリクエストを送る、というコードを組めると、「この処理はそれぞれ独立しているんだな（前の処理の結果に応じて次の処理内容が変わるわけではない）」と理解することが出来ます。

これらから、ドメイン理解（とパフォーマンス改善）に役立つと期待できます。

## DDDに非同期処理を導入する

使いこなせると便利なのがわかって頂けたかと思いますが、非同期処理を書く時に問題になるのが、**『どのExecutor（ThreadPool）上で実行するか』**を明示してあげないといけないことです。

しかし、**どのThreadPool上で実行するか**という情報はドメイン層には書きたくありません。ドメイン層では、ただ『ここの処理は平行・直列に処理するべき』ということだけを書きたいのです。
一方でApplication層では、どのExecutorを使うかを明示する必要があります。

例えばCoroutineのドキュメントにあるこのようなコード

```kotlin:sample.kt
val a = async {
    log("I'm computing a piece of the answer")
    6
}
val b = async {
    log("I'm computing another piece of the answer")
    7
}
log("The answer is ${a.await() * b.await()}")
```

DDDでのイメージとしては、このコードはDomain層にあり2つの結果を使う業務ロジックが記されていて、asyncの中のコードはInfrastructure層で別のContextで実行されるイメージです。

まずこのコード自体が`CoroutineScope`の中にいないと実行できないので、Domain層にも何らかの方法で『何かは明示しないContext』を使いたいです。またasyncの中では『IO用といった明示されたContext』を使いたいですね。

それぞれ以下のように書けます。

### Domain層

```kotlin:domain.kt
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope

suspend fun calcSomeLogic(): Result {
  coroutineScope {
    val a = async { someRepository.call() }
    val b = async { someExternalApiAccessor.call() }
    log("The answer is ${a.await() * b.await()}")
  }
}
```

ここでは`coroutineScope`を使うことで、calcSomeLogicの呼び出し元のCoroutineContextをそのまま使えます。これによりコード上では並行処理を明示しつつ、どのContextを使うかは呼び出し側で決められるようになります。

### Infrastructure層

```kotlin:SomeRepositoryImpl.kt
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.withContext
import java.util.concurrent.Executor

class SomeRepositoryImpl: SomeRepository {
  private val ioExecutor: Executor = ???

  suspend fun call():Int {
    withContext(ioExecutor.asCoroutineDispatcher()) {
      doSomeBlockingTask()
    }
  }
}
```

Infrastructure層では、具体的にContextを明示することでBlockingな処理を他の処理に影響与えることなく実行出来るようになります（ここでは別途用意した`ioExecutor`を作っています）。

## まとめ

以上、簡単にですがKotlinを例に上げてDDDで非同期プログラミングをしてみました。非同期処理は便利ですが、JDBCのConnectionなどThreadSafeでないものを扱い場合にはご注意ください。

ちなみにScalaだと、Domain層では`cats.effect.Async`, Application層では`scala.concurrent.Future`を使うと同じような事ができます。（`scala.concurrent.Future`は実行にExecutionContextが必要なためDomain層では使いにくいため。AsyncとFutureの相互変換が肝）
5374ガジェットを作ってみた

#5374ガジェット
* ゴミの日に光ってお知らせしてくれます
* 光の色でゴミの種類が分かります
* 玄関に設置すれば、出掛けるギリギリに思い出せます

こんな感じのデバイスです
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ごみを捨てる日を光でお知らせしてくれるデバイスを作ってみました（5374ガジェット） <a href="https://t.co/VDnEb50lZo">pic.twitter.com/VDnEb50lZo</a></p>&mdash; yukima77@NT加賀 (@ykmtd77) <a href="https://twitter.com/ykmtd77/status/1206906606018908161?ref_src=twsrc%5Etfw">December 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#作った背景
本家の[5374アプリ](http://5374.jp/)もすごく便利でかなりゴミを捨てられるようになりました。ただ、それでもどうしても僕はごみを捨て忘れることがあって、それがなぜかを真剣に考えて、あることに気が付きました。 __そうだ、途中で忘れるんだ！__
ちゃんと覚えてるんです、通知が来たときは。それが、「あぁ、今日ゴミの日だ！」と思っても、すぐに別の割り込みが入って、さらにそれが自分以外のことでなかなか大変なことだったりすると、もうゴミのことがどんどん頭から離れていく。なので、自分のためにも作ってみました。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/02904fa2-6250-fa92-9faa-ac5119600f02.png)

#概要
詳細の設計情報は、[Github](https://github.com/yukima77/5374gadget)や[Speakerdeck](https://speakerdeck.com/yukima77/5374gadget)を参考にして欲しいのですが、簡単には以下のような感じです。ESP8266開発ボードにフルカラーLEDをはんだ付けして、WiFi経由で時刻やゴミの日情報を取ってきます。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/f8faebf6-de0c-62bc-8fa1-3d9edec5e90f.png)


現在は、石川県金沢市のゴミの日データは[PharaohKJ](https://qiita.com/PharaohKJ)さんがサーバー上に用意してくれているので、石川県金沢市のみはそのまま使うことが出来ます。あとは、サーバーが準備が大変との声もあったので、csvファイルで内部に保存できるようにもなっています（ただ、これだと１年に１回データを更新する必要があります）。ローカルにはなりますが、石川県かほく市、津幡町、加賀市に対応しています。

#今後の予定
* スイッチサイエンスで販売予定です
* いろんな地域で使えるようにしていきます

なので、いろいろ協力してくれる人や使ってみたい自治体の人を募集してます。

#参考情報のリンク
[Github](https://github.com/yukima77/5374gadget)
[YouTube](https://www.youtube.com/watch?v=qJWiomebpK0)
[Speakerdeck](https://speakerdeck.com/yukima77/5374gadget)

#そういえば
[IoTリーグ2019決勝審査会](https://mashupawards.connpass.com/event/153901/)
に呼んでいただくことが出来ました。
~~CIVICTECHリーグ2019決勝審査会に呼ばれてない。。。~~
Solidity v0.6.0の重大な変更


# はじめに
寒いですね。私の財布も寒いです。
ところでもうすぐ[Solidityのv0.6](https://github.com/ethereum/solidity/issues/8025)が出るらしいですね。
今v0.5系でもの作ってるんですが、いずれは対応しなければいけないので、どんなもんかと調べました。
そしたらやっぱり入ってました、[破壊的な変更](https://solidity.readthedocs.io/en/latest/060-breaking-changes.html)。
何個かあるのですが、その中でもわかりやすいのをいくつかピックアップして説明します。
ありえないコードをある程度こんな感じかなーと想像で書いてるところもあるので、その辺りはご了承ください。
あと間違ってたらごめんね。
なんでもいいけど早くv1出して欲しいですね。

# 変更点

## virtualってつけないとオーバーライドできない

```
contract Parent {
	function getFugaFuga() externa view returns (uint256){}

	function getHogeHoge() external virtual view returns (uint256){
            return 5;
        }

	function getFooBaa() external view returns (uint256){
            return 15;
        }
}

contract Child is Parent {
    //セーフ！！！
	function getFugaFuga() external view returns (uint256){
            return 1;
        }
    //セーフ！！！
	function getHogeHoge() external virtual view returns (uint256){
            return 1;
        }
     //アウト！！！
	function getFooBaa() external view returns (uint256){
            return 2;
        }
}
```

インターフェース、もしくは「virtual」修飾子がないとオーバーライドはエラーになるらしい。つけずにオーバーライドしている箇所が既存のコードにあったら修正不可避


## array.lengthは完全に読み取り専用

```
function hoge() externa view returns (uint256){
    uint[] numbers;
    numbers.push(1);
    numbers.length = 2; //アウト！！！
    return numbers.length; //セーフ！！！
}
```
今まではlengthに直接数字セットして配列数とかセットできたけど、今後はなしとのこと。
使えないわけではなく読み取り専用になっただけなので、参照するのはセーフ。

## arrayのpushは長さを返さない
```
function hoge() externa view returns (uint256){
    uint[] numbers;
    return numbers.push(1); //アウト！！！
}
```
配列のpushが配列数を返却しなくなった。配列数を取得したい場合は上の場合だとpushしたあとちゃんとlengthでとること。


## address(constract)　が使えない
```
function hoge() externa view returns (address){
    return address(contractObject); //アウト！！！
}

function Huga() externa view returns (address){
    return contractObject.address; //セーフ！！！
}
```
コントラクトのアドレスを取得する際、addressで囲っていたけど、v0.6以降はｃontract.addressで取得することになる。


## フォールバック関数に名前をつけることになった
```
function () external payable {  //アウト！！！
    // 何かしらの処理 
}
function fallback() external payable {  //セーフ！！！
    // 何かしらの処理 
}

```
今まで名前つけなくてよかったけど、v0.6からはつけるようになる。

## abstractが使える
```
contract Parent {
	function getHogeHoge() external view returns (uint256){
            return getFooBaa();
        }

	function getFooBaa() external abstract view returns (uint256){};
}

contract Child is Parent {
	function getFooBaa() external view returns (uint256){
            return 2;
        }
}
```
新機能の紹介。
抽象メソッドを明示的に宣言できるようになった。個人的にこれが一番嬉しい。


# 最後に
以上終わり。もっと気になる人は[破壊的な変更](https://solidity.readthedocs.io/en/latest/060-breaking-changes.html)をみればいいと思う。
【画像処理100本ノックに挑戦】Q.22. ヒストグラム操作

# 使用したライブラリ
[【画像処理100本ノック】独自の画像入出力クラスを作る](https://qiita.com/jajagacchi/items/834e8425b84f94df8a49)

# Q.22. ヒストグラム操作
> ヒストグラムの平均値をm0=128、標準偏差をs0=52になるように操作せよ。
これはヒストグラムのダイナミックレンジを変更するのではなく、ヒストグラムを平坦に変更する操作である。
平均値m、標準偏差s、のヒストグラムを平均値m0, 標準偏差s0に変更するには、次式によって変換する。

線形変換で所望の統計量を持つように変換するだけです。負の値や256以上の値が出てしまうのでそれぞれ0,255にします。

```c++
int main()
{
	PPM ppm("imori_dark.pnm");
	int width = ppm.Get_width();
	int height = ppm.Get_height();

	int N = 256;
	std::vector<int> hist(N);
	for (int n = 0; n < N; n++)
	{
		hist[n] = 0;
	}

	double m = 0;
	double m2 = 0;
	for (int j = 0; j < height; j++)
		for (int i = 0; i < width; i++)
		{
			m += ppm(i, j, 'r');
			m += ppm(i, j, 'g');
			m += ppm(i, j, 'b');
			m2 += ppm(i, j, 'r')* ppm(i, j, 'r');
			m2 += ppm(i, j, 'g')* ppm(i, j, 'g');
			m2 += ppm(i, j, 'b')* ppm(i, j, 'b');

		
		}
	m /= (double)(width * height * 3);
	m2 /= (double)(width * height * 3);
	double s2 = m2 - m * m;
	double s = sqrt(s2);
	
	PPM ppm2(width, height);
	double m0 = 128;
	double s0 = 52;
	for (int j = 0; j < height; j++)
		for (int i = 0; i < width; i++)
		{
			double a;
			a = s0 / s * (ppm(i, j, 'r') - m) + m0;
			if (a < 0) a = 0;
			else if (a >= N) a = N - 1;
			ppm2(i, j, 'r') = a;
			hist[a]++;
			
			a = s0 / s * (ppm(i, j, 'g') - m) + m0;
			if (a < 0) a = 0;
			else if (a >= N) a = N - 1;
			ppm2(i, j, 'g') = a;
			hist[a]++;
			
			a = s0 / s * (ppm(i, j, 'b') - m) + m0;
			if (a < 0) a = 0;
			else if (a >= N) a = N - 1;
			ppm2(i, j, 'b') = a;
			hist[a]++;
			
			
			
		}
	for (int n = 0; n < N; n++)
	{
		std::cout << n << " " << hist[n] << std::endl;
	}
	ppm2.Flush("out.ppm");

	


	return 0;
}
```
![imori_dark.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/a7254f0e-d6b7-1177-dead-3b2045676944.jpeg) ![out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/d92588cb-789d-c8d3-9882-8c630986972f.png)
（API通信で受け取ったデータを管理する為の）データモデルクラスのつくりかた(Objective-C)

###こういう人に向けて発信しています。
・クラスごとの複雑なデータを管理したい人
・APIから返却されたデータを管理したい人
・Objective-C初心者

##どういう時に活用するべきか
API通信後にJSONが返却されたデータをModel化してあげると
`datamodel.value`のように取り出しやすいのでオススメです。



##CustomModel.h
```
#import <Foundation/Foundation.h>

@interface CustomModel : NSObject<NSCopying>
@property (nonatomic) NSString *accountID;
@property (nonatomic) NSString *passwordID;

/**
本メソッドを呼び出してカスタムモデルを初期化する。
*/
- (instancetype)initMode:(NSDictionary *)modelDict;
@end
CustomModel.m

#import "CustomModel.h"

@implementation CustomModel

#pragma mark - Initialize
- (instancetype)initMode:(NSDictionary *)modelDict{
   self = [super init];
   self.accountID = modelDict[@"accountID"];
   self.passwordID = modelDict[@"passwordID"];
   return self;
}

#pragma mark - NSCopying
//hクラスの記述して外部クラスから参照できなくてもOK
- (instancetype)copyWithZone:(NSZone *)zone {
   CustomModel *copyModel = [[[self class] allocWithZone:zone] init];
   if(copyModel){
       copyModel.accountID = self.accountID;
       copyModel.passwordID = self.passwordID;
   }
   return copyModel;
}

@end
```
##使用例
```
NSDictionary *initDic = @{@"accountID": @"iga34egineer",
                         @"passwordID": @"1234"};
CustomModel *customModel = [[CustomModel alloc]initMode:initDic];  //Aモデルを初期化する。
CustomModel *backupModel =  customModel.copy;  //AモデルをBモデルにコピーする。
customModel.accountID = @"reset";   //Aモデルに変更を加えているが、Bモデルに影響はしない。
```
###注意点
copyに関しては実装しておいた方が良いと思います。

そもそもcopyに関しては同一内容で別インスタンスで持つという意味ですが、
アプリ開発でこういうケースは結構多く活用します。

メニュー画面から対応するカスタムモデルを元に画面遷移して
ViewControllerを描画して各種モデルの内容を変更するが、
元のメニュー画面のデータには影響させないとかね。

逆に言うと、Bモデルを操作した内容をAモデルにも連動して変更を行いたい時は
**.copyを取り除いて**ください。

インスタンスを同一にしたくないが中身を同一でコピーしたい場合について
方法は二種類あります。
**（１）.copyを使用する（本記事のように）
（２）プロパティ属性で「(nonatomic,copy)」のようにcopy属性を付与する。**

一応今回は（１）の方がコードで見た時分かりやすいかと思いますが、
設計上考えるとプロパティ属性で付与してあげる事が一番かと思います。

基本的な構造として、copyするオブジェクトって処理の都度copy属性にする、しないって切り替わらないと思うのですよ。


それも考えると一度付与した状態で変わらないプロパティ属性で良さそうなのと、
コードでのcopyですと常にcopy記述が必要になります。

もし作業者が代わり、
copyを忘れてしまった場合などはインスタンスがコピー元と同一のインスタンスとなってしまいます。

##追加：モデルの中身が同一かどうかの判定式を追加
割とカスタムクラスモデルの中身が同一かのチェックって行うんですよね。
追加してみました。

```
//CustomModel.m  

#pragma mark - Equal Check

/**
内容が同一かどうか（注意：インスタンスが同一かではない）
*/

- (BOOL)isEqualModel:(CustomModel *)model{
   if(![self.accountID isEqualToString:model.accountID]) return NO;
   if(![self.passwordID isEqualToString:model.passwordID]) return NO;
   return YES;
}
```
CustomModel.hにも記載して外部クラスから参照できるようにして下さい。

###使用例
```
CustomModel *customModel = [[CustomModel alloc]initMode:initDic];  //Aモデルを初期化する。
CustomModel *backupModel =  customModel.copy;  //AモデルをBモデルにコピーする。
customModel.accountID = @"reset";   //Aモデルに変更を加えているが、Bモデルに影響はしない。
       
if([customModel isEqualModel:backupModel]){
   NSLog(@"モデルの中身が同一");
}else{
   NSLog(@"モデルの中身が同一ではない");
}
```
上記コードでコメントアウトしている場合としていない場合で
if文の内容が変わります。

このように呼び出して**カスタムクラスモデル内の中身が同一かチェック**します。