OmniAICreator/Qiita-1.07M huggingface dataset:
CEH(Certified Ethical Hacker)v9　勉強方法・教材など

先日CEHを受験し、ぶじ合格することができたので勉強方法などを記録します。
「CEHって何？」って方は[こちら。](https://www.eccouncil.org/programs/certified-ethical-hacker-ceh/)認定ホワイトハッカー的なやつです。
CEHに関しては日本語での合格体験記はほとんど存在していないと思うので、以後の受験者の方向けに参考になればと思います。
公式のトレーニングは受けてないので、別途お金払ってセルフ受験？＋独学？的な方法です。

#　使用教材・テキスト
**[・CEH v9: Certified Ethical Hacker Version 9 Practice Tests 1st Edition, Kindle版](https://www.amazon.co.jp/CEH-v9-Certified-Ethical-Practice-ebook/dp/B01EKJ2TIW/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=
)**
Kindle版で2500円とリーズナブルなので購入。
問題数が125問５セットとかなりの量あったので問題に慣れるには重宝しました。
ただ、解説がうっすい＆問題ミスが散見されるので、はじめの一冊としては不適切。
あらかじめ知識がある前提で、CEHの問題形式に慣れるために使うには○

**[・CEH Certified Ethical Hacker Practice Exams, Third Edition (All-In-One)](https://www.amazon.co.jp/Certified-Ethical-Hacker-Practice-Exams-ebook/dp/B01NCAFOM9/ref=asap_bc?ie=UTF8)**
これは絶対買ったほうがいい！！！！！必須の一冊。
１２のジャンルにわけてジャンルごとに２５問程度容易してくれている問題集なのですが、解説がめちゃくちゃ丁寧（誤答の解説まですべて書いてある）ので、これ一冊とけば要点は押さえられるのでは？と思います。
章のポイントと解説をよめば、出題者側が何を求めているのかがわかります。
しかもこの筆者とてもユーモア満点で、いきなり「僕は小さい頃からアップルパイがとんでもなくすきで～」とか始まるから「え！？これなに？何の話？？」ってびっくりするけど、最後の章まで読んだら筆者のキャラクターにメロメロでファンレター書きたくなるくらい惚れ込むｗ
「こういう問題は本当に現実に即してなくて不毛だと思うが、EC-Councilはこれが大好きだから、覚えとこう。」とか言っちゃう人。
巻頭で「The book is dedicated to my lovely and talented wife, Angela Walker.
」とか書いてある。愛妻家か？きゃわわ

この人の本は他にも出ているみたいなんですが、私はこの問題集のみのバージョンで必要十分かな、と感じました。

**・適当な問題演習アプリ**
わたしは[Androidでレビューが高かったアプリ](https://play.google.com/store/apps/details?id=com.pocketprep.ceh&hl=ja)を使いましたが、似たような問題演習ができるものなら何でも良いと思います。
寝る前の10分、ごはんを食べながら、トイレ中(!?)など、手軽にできるので重宝します。
私の使ったアプリは$30くらいの課金で630問つかえたので問題慣れに十分でした。リセットして2周、90%超えになるまでやりました。

**・Youtube**
すべてのツールを触るのは時間的に厳しいものがあるので、触るのはWireshark,snowt,nmapだけにして、それ以外はyoutubeで使い方を学びました。
ツール名で調べるとだいたい出ますし、10分くらいで要点押さえられるので効率良いです。

#　勉強方法
↑の問題集２冊を全部解き、復習。→間違えた問題のキーワード等をGoogleスプレットシートに転記。
暗記帳みたいな扱いにして、朝・昼・晩１回ずつ目を通してました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102081/b6ec5c0d-bae9-e057-4e70-e4225fdb9c9c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102081/2fa9eb79-ace3-e816-56f5-e23acc29c8f3.png)

問題集は２周しました。１週目はズタボロで50%くらいか？でしたが、２周目は85%キープくらいにはなってました。
勉強した期間は２週間でしたが、机に座るのが１日８時間くらい＆ご飯中などスキマ時間にアプリとYoutubeって感じでCEHに全振り状態でした。

#　実際の試験
試験時間は４時間半くらい用意されていて、「そんなつかわねーよｗｗｗ」って思ってたんですが、、、、**４時間かかりました。。。。**
（たぶん私が英語よむのめちゃくちゃ遅いからです）

問題としてはかなり素直な問題が多く（引っ掛けとかないです）、冷静に考えれば内容知らなくても解けるものもあったかな？という印象。モラル系の問題とか。
全問2周して、フラグを1周見返して終了ボタン押しました。
最終的にフラグは１６個たってました。出てきた単語の意味がわからなかったのが3,4問で、あとはノータッチだったり二択で迷ったり。。。
問題集では「Ping of deathが登場したのは何年でしょう？」みたいな重箱の隅つつくような問題がでてたんですが、実際の試験ではそんなこまっかい問題は出てこなかったです。良問が多かったです。
ただ英語読む量が多くて集中力が切れた。。。

#これから受ける人に伝えたいこと
・Matt Walkerさんの本は買いましょう(`･ω･´)ｂ
・Wireshark, nmap, snortはEC-Councilが大好きなので実際に触っとくのが◎
・↓海外レビューですが、ここで列挙されてるキーワードは全部説明できるようになったほうがよいです
https://www.reddit.com/r/CEH/comments/6naheu/passed_0713/

誰かの助けになりますように！　思い出したことがあれば後からアップデートします。
（もうすぐv10になっちゃうんだね、、タイミングわるくてごめんなさいです）
visualstudioを使えば、Cordovaのプラグイン追加も簡単にできる

今作っているアプリで音声読み上げをしたいので、試行錯誤しています。
MonacaでTTSのcordovaのプラグインを追加出来たら一番簡単なのですが、今無料プランなので、別の方法を模索していました。

visualstudioを使ってCordovaでモバイル開発できるので、環境を作っていました。
そして、プラグインの追加をネットで調べて見つけました。
今回、簡単に追加できましたので、手順をまとめます。

visualstudioで制作中のプロジェクトがある前提です。
プロジェクトがないと、この後の項目選択が出来ないようなので。

説明は、Windowsのvisualstudioを使っています。

![TTS3.png](https://qiita-image-store.s3.amazonaws.com/0/20977/40a7e0e7-a1fb-77eb-6cf8-c9853e18acef.png)

画像のように、表示を選択して「ソリューション　エクスプローラ」を選択します。
右側のウィンドウに、階層が表示されます。

config.xmlをダブルクリックなどで開いてください。

![TTS4.PNG](https://qiita-image-store.s3.amazonaws.com/0/20977/b2e96ac8-1c98-a79e-e91c-8b8aed9d8bce.png)
このような画面が、表示されます。

![TTS1.PNG](https://qiita-image-store.s3.amazonaws.com/0/20977/970ef3ee-9d33-a514-bde9-7d462c6780f9.png)
プラグインを選択します。

標準で入っているプラグインの追加は、コアで良いと思います。
今回は、Gitからの追加になりますので、カスタムを選択します。
画面のように、Gitを選択します。
フォームに、追加したいプラグインのURLを入力します。
https://github.com/vilic/cordova-plugin-tts

このアドレスのままフォームに入力します。
![TTS2.PNG](https://qiita-image-store.s3.amazonaws.com/0/20977/16430016-bdc0-9ba0-edd1-8713ec6c1e24.png)
追加をクリックすると、インストールが開始されます。
追加が環境すると、今画像のように表示されます。

これで、使うことが出来るようになります。
でもやっぱりFFFTP

##FTPツールは何を使っていますか？

FTP（File Transfer Protocol）はネットワーク上でファイル等の転送を行う通信プロトコルです。
特にFTP用のソフトを導入しなくても、FTPはコマンドでも使用できます。

でも黒い画面でファイル名打って・・・よりもGUIツールの方がわかりやすいし使いやすい！

長年愛用してきたFFFTPですが、
開発者としてはブランクのある私が、
以前そのままに古参のソフトを使い続けてもよいものだろうか？
と思いFTPまわりの環境を勉強することにしました。

2017年にはこんなニュースもありました。

FTPクライアント「FFFTP」ついに開発終了か　6年前に“引き継いだ”開発者が表明 - ITmedia NEWS
http://www.itmedia.co.jp/news/articles/1710/26/news112.html

終了は残念ですが、
90年代から今もなお、開発が引き継がれていたことに驚きます。

と、この投稿を３月末くらいから書き始めたのですが、
大ニュースが飛び込んできました！！

更新が途絶えていた「FFFTP」の開発に後継者、v3.0が“GitHub”で公開される（Impress Watch）
https://forest.watch.impress.co.jp/docs/news/1115458.html

やっぱりFFFTP使っていこう！
という気持ちでいっぱいになりました！

気をとりなおして、

##暗号化されていないFTPは過去のもの

FTPはセキュリティ上問題があるといわれています。
これは、転送時に暗号化されないためで、
SFTP（SSH File Transfer Protoco）やSCP、SSH
といった暗号化されたファイル転送プロトコルが用いられることが多くなっています。
おなじみのHTTPもファイル転送プロトコルで、暗号化されたものがHTTPSとなります。
ファイルが暗号化されるされないよりも、接続情報が暗号化されないことが重大です。

サーバー側ではポートごとに受信していますが、
サーバー、プランによって提供しているかどうか、分かれるところです。

大手レンタルサーバーを調べてみると、

さくらのレンタルサーバー
　FTPS/スタンダード以上でSFTPも可
XServer
　FTPS/SSHも可
ロリポップ
　FTPS/スタンダードプラン以上ではSSH、SFTPも可

といった具合です。
概ねFTPSに対応。プランによってSFTPあるいはSSHでの接続を認めているという感じです。

##それぞれのファイル転送プロトコルによる違いはどんなものなんでしょう

その前におさらい
ネットワークの勉強といえばこれ

OSI参照モデル(wiki)
https://ja.wikipedia.org/wiki/OSI%E5%8F%82%E7%85%A7%E3%83%A2%E3%83%87%E3%83%AB

###SFTP(SSH File Transfer Protocol)
SFTPとはSSH(SSH File Transfer Protocol)による暗号化・認証を行ったプロトコルです。
SSHは主にunix系OSにネットワークを介してログインするためのプロトコルで、
SSHが使える環境であれば、SFTPも利用可能です。
OSI参照モデルでいうアプリケーション層で公開鍵認証を行い、
SSH上でsftpというコマンドを発行してファイル転送を支持します。

unix系ログインといえばtelnetやrshがありましたが、こちらもパケットの暗号化をしていないため、
暗号化されたSSHを使う方が安全です。
ポートはSSHで使う22番になります。

###FTPS (FTP over SSL/TLS)
FTPSはSSL/TLSというトランスポート層で暗号化された伝送路を形成。
その上で通常のFTPを用いてファイル転送を行います。
暗号化は公開鍵暗号方式です。
FTPSで使用するポート番号は、FTP転送/制御ポートである（989/990）を使用します。
また、FTPSには2つの実行モードが存在し、
- 接続実行後にAUTHコマンドによる暗号化通信を実行する「Explicitモード」（明示モード）
- サーバーに接続後に暗号化通信を実行する「Implicitモード」（暗示）
があります。
「Explicitモード」の場合、クライアントがAUTHコマンドを実施しない限り通常のFTPで実行します。

FTPSのメリットとして、ASCII/BINARY モードのサポートやフォルダ単位での転送があります。

###SCP（Secure Copy Protocol）
SSHを使用したファイル転送プロトコルなので、ポートはやっぱり22番です。
SSH上のファイルコピーのためのコマンド、あるいはプロトコルです。
SCPとSFTPの違いは、スピードと、転送の再開ができるかできないかです。
SCPは、データの転送スピードは速いですが、中断した場合、データの転送を再開できません。
SFTPは転送スピードがSCPに比べて遅いですが、データ転送を中断しても、転送を再開できる特徴があります。

##ファイル転送クライアントソフト
無料で公開されているファイル転送クライアントソフトを比較してみます。

###Winscp
今回比較した３つのプロトコル全ての方式でファイル転送ができるのが特徴。
世界的にスタンダードなオープンソースソフトです。
接続情報を暗号化するマスターパスワード機能も搭載。

###FileZilla
FTPS、SFTPをサポートしています。
オープンソースプロジェクトでクライアントソフトだけでなく、
サーバーサイドも開発されています。
mac版linux版もあります。
しかしマスターパスワード機能はありません。

###FFFTP
FTPS、しかもExplictでしか接続できません。
マスターパスワード機能はあります。

##FFFTPを使う理由
でもやっぱりFFFTPで「FTPS Explictで接続」チェックをいれて、使っています。
理由は

- FTPSでの接続しかしない
- だってフォルダ単位で転送できるのが良いからFTPS
- 使い慣れたFFFTPがいいかなあ
- SSH接続するならteratarmとか使えば良いよね？

開発後継者も見つかった！！ことですし、
まだまだFFFTPを愛用したいと思います。

参考）
TCPやUDPにおけるポート番号の一覧(wiki)
https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7

SSHなるものをよくわからずに使っている人のための手引書
https://qiita.com/kenju/items/b09199c4b3e7203a2867

IT用語辞典 e-Words
http://e-words.jp/
 SFTP / FTPS / SSH / SCP
はじめての Azure Data Lake

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「はじめての Azure Data Lake ～ログや画像を分析してみよう～」で使われた資料のご案内です。</p>

- <strong>はじめての Azure Data Lake</strong><br />
https://www.slideshare.net/hidwatanabe/azure-antenna-azure-data-lake

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
銀行 支店 マスタで使えそうなライブラリってあるの？

Railsアプリで、銀行・支店マスタを保持して処理を行う上ので事前検討するのに、調べたもの。
（他にもありそうでしたが、ただのWebサイトだったりとかは除外しました。）

|No.| 種類  | マスタ/API    | URL                                     | 有料／無料 | 
|:--|:-----|:-------------|:-----------------------------------------|:---------|
|① | マスタ| 全銀協        | https://www.jba-shuppancenter.jp/        |   有料    |
|② | マスタ| ginkokensaku | http://ykaku.com/ginkokensaku/index.php  |   無料    |
|③ | Gem  | ZenginCode   | https://github.com/zengin-code/zengin-rb |   無料    |
|④ | API  | BankCode API | https://bankcode-api.appspot.com/        |   有料    |
|⑤ | API  | BankAuto     | http://bank-auto.com/                    |   有料    |  
|⑥ | API  | bank.teraren | https://bank.teraren.com/                |   無料    |

① 
CD-ROM(¥46,300)
都度、データ取込・マスタ洗い替えが必要。

②
信頼性に欠ける？

③
gem update運用・・・あと、データファイルが重すぎるため、普通に使うと50MBくらいメモリを食うらしいです。

④
この中では割りとよさそう。￥100/月 + 追加リクエスト数。ちょっと課金体系詳細が分からない。

⑤
課金体系よくわからない。

⑥
よさげだが、完全に個人がやってそう。

ここらへんは、そろそろ時代的にカチッとしたものが銀行からちゃんと提供されて欲しいものです。

おわり。
OpenID Connecr Self-Issued OP(IdP) の仕様と応用

# OpenID Connecr Self-Issued OP(IdP) の仕様と応用

## きっかけ

先日、OpenID TechNight Vol.15 にて、Self-Issued IdPに関する発表がありました。

* [OpenID TechNight Vol.15 - ID-Tech @ Recruit & Yahoo! JAPAN & SoftBank : ATND](https://atnd.org/events/94109)
* [OpenID Connect Self-Issued IdPを応用したSingle Sign Onの実装 by Recruit Technologies](https://speakerdeck.com/rtechkouhou/openid-connect-self-issued-idpwoying-yong-sitasingle-sign-onfalseshi-zhuang)

Self-Issued IdP(以下、SIOP)は仕様自体はOpenID Connect Core 1.0に含まれていますが、実装されてプロダクション環境で運用されている例に出会うのは滅多にないため(知らないだけかも？)、内容もとても興味深いものでした。

この記事では、SIOPについて、
* ここまでが仕様で定義されている
* それをどのように応用しているか
という視点でとらえた内容となります。

と、書き始めたところで、同じような趣旨の記事が投稿されました。
[OpenID Connect Self-issued OP概要 ~OpenID Technight #15より~](https://qiita.com/SAM-l/items/93b56c6061cfbb6653ec)

もう、下書き削除でいいんじゃないかという思いが頭をよぎりつつも、似たような記事を投下することにします。

## 仕様では何が定義されているのか

2013年頃にSIOPについて紹介したブログ記事を書きました。
[OpenID ConnectのSelf-Issued OPの話](http://d.hatena.ne.jp/ritou/20130718/1374107391)

仕様で定義されているのは、

* 端末上で動作
* 鍵ペアを生成、保存
* AuthZ Request
  * `client_id`, `grant_type=id_token` などのパラメータ
* AuthZ Response
  * ID Token の中身

までで、

* ID Tokenに含むことで端末内で保持されている情報を署名付きで受け渡しできる

というのがSIOPの基本的な機能であり、この **仕組み** をどう応用していくかが実際のプロダクトへの導入の鍵と言えるでしょう。

## SIOPの応用 : ユーザー認証 + 追加認証

発表にあった実装は、 SIOP をユーザー認証と追加認証の二点における応用と言えるでしょう。

* AuthZ Serverが登場
* AuthZ ServerはリクルートID/パスワードの認証機能を持つ
* AuthZ Server が SIOP の Client となり、 SIOP から受け取った ID Token の中の sub の値をリクルートのアカウントとの紐付けに利用
  * 初回は、SIOP の ID Token を受け取った後にユーザー認証を行い、紐付け
  * ２回目以降、SIOP の ID Token を用いてログイン可能
* nonce　を用いて SIOP のフローが正しく行われることを担保

のあたりが、ユーザー認証への応用というところです。

より話を一般化すると、SIOP自体がユーザー認証の機能を持ったり、属性情報を保持する実装も可能でしょう。
「信頼のおける」SIOPが確認済みのメールアドレスやSMS番号を保持しておいて、ユーザー未登録状態の Client に対して提供(ID Token に含む)することで、新規登録のフローを簡略化するようなシナリオも描けるかもしれません。

追加認証への応用については、

* AuthZ Server に acr パラメータをつけてリクエスト
* AuthZ Server は amr パラメータをつけて SIOP にリクエスト
* SIOPは適切な認証を行い、ID Tokenを返す

の部分がそれにあたります。

SIOP を利用することで、「端末上で動作するアプリケーションのみが実装できる機能」がwebアプリからも比較的疎結合な実装で利用できると言えるでしょう。
あらかじめ認証強度などの整理をしておき、それを要求できるようにすることで、端末上で新たな認証機能が実装された時もスムーズに対応していけそうです。

## まとめ

* 仕様で定義されているのは鍵ペア作るよ＆やりとりの方法まで
* ユーザー認証への応用について
* 追加認証への応用について

今後もこのようなSIOPの実装例が増えてくると良いですね。
ではまた！
binding.pryで毎回page breakする問題の解決方法

# binding.pryで毎回page breakする問題を解決する方法
このようにbinding.pryを行うと毎回page breakしてしまう問題が起きて不便だったので解決方法を書いておきたいと思います

<page break> --- Press enter to continue ( q<enter> to break ) --- <page break>

hogehogehoge

<page break> --- Press enter to continue ( q<enter> to break ) --- <page break>


## page breakの解決方法
以下のコマンドを pry　中に実行するとこで解決します

```
Pry.config.pager = false
```
FileMakerでフィールド内の行に対し、任意の文字列に完全一致する行をカウント

#FileMakerでフィールド内の行（繰り返し含む）に対して、任意の文字列に完全一致する行をカウント

フィールド内で任意の文字列に一致する個数はPatternCount関数でカウントできますが、PatternCount関数では、部分一致をカウントするので、
例えば、"123/12345"に対して、"123"でPatternCountした場合は、2となります。
今回は、完全一致するモノのみ数えたい場合の方法になります。
通常のフィールドに改行区切りでデータが格納されている場合と、繰り返しフィールドにデータが格納されている場合、両方を紹介致します。

##テーブルとレイアウト
まず、テーブルとレイアウトを用意します。
テーブル名とレイアウト名は、「test003」
##フィールド
次にフィールドを用意します。
![q003-01.png](https://qiita-image-store.s3.amazonaws.com/0/235280/344c7f7b-3f75-8c13-6827-2fc17470665a.png)
フィールド名は、「data」「input」「result」「data2」「input2」「result2」
「data」「input」「data2」「input2」は,テキストフィールド
「result」「result2」は計算フィールド、計算結果は数字

##繰り返しフィールドの設定
繰り返しフィールドの設定方法は、
オプションを選択し、データの格納タブ内にある繰り返し欄に任意の数を入力し設定します。
![q003-02.png](https://qiita-image-store.s3.amazonaws.com/0/235280/913f5ec4-bc64-4994-b3da-fc8ca95f7854.png)
今回は、「10」と入力し、「OK」ボタンを押下してください。

##繰り返しフィールドの表示
レイアウト側でも、「data2」を繰り返しフィールドとして表示する設定を行います。
繰り返しフィールドの表示方法は、
インスペクタのデータタブにある、繰り返しを表示と言う項目の上限値に「10」と入力します。
![q003-03.png](https://qiita-image-store.s3.amazonaws.com/0/235280/8374b5d7-4ef9-fabc-c4cb-a4253ad8f32c.png)


行の区切り線があると見やすいと思いますので、ここで設定しましょう。
###枠線の設定
外観タブにある、枠線で設定できます。
![q003-07.png](https://qiita-image-store.s3.amazonaws.com/0/235280/08018ab1-cfb6-c943-85d1-c2ec1197b2cb.png)

画像を参考に各フィールドを配置してください。
**レコードを1つ作成**し、「data」フィールドと「data2」フィールドに値を入力しておきましょう。

![q003-04.png](https://qiita-image-store.s3.amazonaws.com/0/235280/e6b9c6ff-0567-4151-54f7-e7156959c530.png)



##計算フィールドの設定
今回メインとなる、完全一致する文字列のカウントを、「result」および「result2」へ設定します。
まず、「result」には、「ValueCount(FilterValues( data ; input))」と計算式を設定してください。
計算結果は数字にしましょう。
![q003-05.png](https://qiita-image-store.s3.amazonaws.com/0/235280/629883d2-f438-8921-5e2c-a92425c0b135.png)

次に、「result2」には、「ValueCount(FilterValues( List(data2) ; input2))」と計算式を設定してください。
計算結果は数字にしましょう。
![q003-06.png](https://qiita-image-store.s3.amazonaws.com/0/235280/5daefdef-5f42-169e-2216-5c59a3316e9d.png)

以上で設定は終了です。

実際に、「input」フィールド及び、「input2」フィールドへ文字を入力してみましょう。
「result」又は、「result2」へ計算結果が表示されていると思います。

![q003-08.png](https://qiita-image-store.s3.amazonaws.com/0/235280/8d94a285-0ad7-78c0-aed9-4538dc9241f0.png)



##最後に
利用した関数を紹介します.

・ValueCount関数
https://fmhelp.filemaker.com/help/16/fmp/ja/#page/FMP_Help%2Fvaluecount.html%23

・FilterValues関数
https://fmhelp.filemaker.com/help/16/fmp/ja/#page/FMP_Help%2Ffiltervalues.html%23

・List関数
https://fmhelp.filemaker.com/help/16/fmp/ja/#page/FMP_Help%2Flist.html%23

実際に各関数がどういった動きをしているかは、公式サイトの説明を参照頂いた方が間違い無いと思いますが、簡単に解説致しますと、
まず、「result2」では、List関数を用いて、フィールド内のデータを取得します。ここで連結とありますが、改行区切りのデータになります。
その後、FilterValues関数を用いて、「input」または、「input2」を対象としたフィルターを掛けます。
最後に、ValueCount関数を用いて、フィルター後の値を数えます。

以上です。
オートエンコーダにアフィン変換を組み込む

## はじめに
[前回](./fd2c5c6ce88b179b37fd)の続きです。
前回の記事では、画像上の任意の点の座標$ (u, v) $をを入力として受け取り、画像の値を出力するニューラルネットモデルを実装しました。
これをオートエンコーダのデコーダ部として使うことで、解像度に依存しない画像表現が行えます。
今回はこのデコーダに入力する座標値にアフィン変換を適用することを考えます。
各入力画像に対して適切なアフィン変換のパラメータを使うことができれば、画像の潜在表現が改善されることが期待できます。

[実装(github)](https://github.com/tmagara/sampling-autoencoder)

## 実装
今回もVAEをベースにして、エンコーダ/デコーダともに全結合として実装しました。

- エンコーダの出力: 潜在変数$ z $の平均/分散 + アフィン変換のパラメータ
- デコーダの入力: 潜在変数$ z $ + 画像上の座標値$ (u, v) $
 
となります。

アフィン変換のパラメータは

- スケール係数 ` scale `
- 回転角 ` theta `
- 平行移動量 ` (tx, ty) `

としました。
デコーダへ入力する座標値$ (u, v) $にこのアフィン変換を適用しておくことで、拡大/縮小/回転/平行移動された画像がデコーダから出力されるわけです。

## 出力
潜在次元数を8としてMNISTの学習を行います。

次のユニット数で実験します。

- エンコーダ: [28*28 -> 512 -> 392 -> 256 -> 8+8+4]
- デコーダ: [2+8 -> 32 -> 64 -> 32 -> 1]

```
python3 train.py --gpu 0 --epoch 100 --batchsize 128 --model affine3x
```

で、100エポック学習させた出力結果が以下です。



元データ
![original.png](https://qiita-image-store.s3.amazonaws.com/0/152511/50569f85-2b46-afc1-907f-6de5308ddfaf.png)

出力
![output.png](https://qiita-image-store.s3.amazonaws.com/0/152511/0a12db7d-86be-7a89-064c-91dfbadef85e.png)

アフィン変換を抑制した生のデコーダ出力
![normalized.png](https://qiita-image-store.s3.amazonaws.com/0/152511/46283f00-10ce-55d6-e557-2fb669c7f44f.png)

微妙な違いですが、よく見比べると生データでは大きさや角度が揃っているのがわかります。
この拡大/縮小、回転角度、平行移動量の情報を潜在変数から分離することができた、ということになります。
潜在変数の損失(gaussian_kl_divergence)の最終的な値を見ると、

アフィン変換あり
```       "main/z_loss": 1.8669424057006836,
```
アフィン変換なし
```       "main/z_loss": 2.214595079421997,
```
となっていて、潜在表現が向上していることが確認できます。
Python > naming > difference > Methods | メソッド | Functions | 関数

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
p30
2.4.9 Methods

> Methods are functions attached to objects.

Python以外の言語も扱う人はMethodsとFunctionsの混同をするかもしれない。

### 記憶の宮殿

記憶の宮殿にどのように叩き込むか。

#### 案 > Functions

Functionキー(F1やF2など)はくっついている(attached)と使いにくい。だからnot attachedである。
->
Functions: not attached to Objects

(Note: 本当は「attach」はこういう意味では使わないかもしれない。)
https://www.merriam-webster.com/dictionary/attach

#### 案 > Methods

> アタチ 来自Method部落 他喜欢附加
后来 他成为了 一位着名艺术家 谁是奇特的 object 
(powered by google翻訳 (英語 -> 中国語))

メソド民族のアタチはくっつけることが大好きな少年だった。後年、彼は著名な芸術家となり、オブジェクトへのこだわりを見せる大家となった

全部、嘘の話。


### 検索用キーワード

- Function
- Method

### link

https://stackoverflow.com/questions/155609/difference-between-a-method-and-a-function
Laravelのページネーションで生成されたリンクにGETパラメータを付与する

LaravelでAPIのレスポンスとしてページネーションを使いたかった（[参考：ページネーション](https://readouble.com/laravel/5.5/ja/eloquent-resources.html#pagination)）が、pagenateで生成されたリンクURLから、アクセス時のGETパラメータが削除されてしまっていたので、正しく引き継がれるように対応した。

# 例
リクエストURL：https://example.com/users?per_page=100&page=1

### 修正前
pagenateで生成されるURLにper_pageのクエリがつかない。

```php:
$users = User::paginate($per_page);
$users->nextPageUrl(); //　https://example.com/api/v1/users?page=2
```

### 修正後
appendsすることでpage以外のクエリも追加された。

```php:
// page以外のパラメータを取得
$params = $request->except('page');
// appendsで付与
$users  = User::paginate($per_page)->appends($params);
$users->nextPageUrl();  //　https://example.com/api/v1/users?per_page=100&page=2
```
かんたん、便利:thumbsup_tone2:
XOOPS Cubeのsite_default.ini, site_custom.iniで設定した値の取得方法


```
$root = XCube_Root::getSingleton();
$value = $root->getSiteConfig('セクション名', 'パラメータ名'));
```

例

```site_custom.ini
[Foo]
Bar=Baz
```

```php
$root = XCube_Root::getSingleton();
$value = $root->getSiteConfig('Foo', 'Bar'));
echo $value;
// 出力は Baz
```

XOOPS_TRUST_PATH/settings/site_default.iniよりもXOOPS_TRUST_PATH/settings/site_custom.iniが優先される。

他にも優先順位ルールがあるので[XOOPS Cubeのiniファイルの優先順位](https://qiita.com/suin/items/d79cb118e2d52194e109)も参照してください。
【Swift4.1】JSONDecoderのスネークケース自動変換で気になったこと

## 経緯
Swift4.1からJSONDecoderのKeyDecodingStrategyを設定することで
スネークケースからキャメルケースへの変換を自動でしてくれるようになったので確認していたところ、
ふと気になったことがあったのでメモします。

## 実装

```Swift
struct Profile: Decodable {
    
    let id: Int
    let messageTitle: String
    let profileImageUrl: String
    let aaaBbbCcc: String // ??
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        do {
            let json = """
            {
                "id": 1,
                "message_title": "title",
                "profile_image_url": "hogehoge",
                "Aaa_bBb_ccC": "aaaa" //??
            }
            """.data(using: .utf8)!
            
            
            let decoder = JSONDecoder()
            decoder.keyDecodingStrategy = .convertFromSnakeCase
            let result = try decoder.decode(Profile.self, from: json)
            print(result)
            
        } catch {
            print(error)
        }
    }
}
```

変換結果

```Swift
Profile(id: 1, 
        messageTitle: "title", 
        profileImageUrl: "hogehoge", 
        aaaBbbCcc: "aaaa") // ??
```

## 疑問

なんで"Aaa_bBb_ccC"がaaaBbbCccになるんだろうと思い、
わざとエラーにした場合のコンソールの出力を見ていると

```Swift
"No value associated with 
key CodingKeys(stringValue: \"aaaBBbCcC\", intValue: nil) (\"aaaBBbCcC\"), converted to aaa_b_bb_cc_c."	
```

と出ていたので、
Decodableの中で宣言した変数の大文字部分を_(アンダーバー)で区切って全部を小文字に変換したものと
JSON文字列の方も全て小文字に変換したものを比較して
値を設定しているような動きをしています。
どういう仕組みなのか時間あるときに詳しく調べたいです。

スネークケースの中に大文字が混ざることはあまりないかもしれませんが、
気になったので記録しました。
macOSでのディスクイメージ作成でよく使うコマンド

# macOSでのディスクイメージ作成

よくつかうディスクイメージ作成コマンドです

## 書込可能・固定サイズ・最大1GB dmgファイル

	$ hdiutil create -type UDIF -fs JHFS+ \
	  -size 1gb -volname "DISKIMAGE1" DISKIMAGE1

## 書込可能・可変サイズ・最大20GB sparseimageファイル

スパースイメージなので最大領域までディスクを占拠しないので使い勝手がよい
汎用ディスクイメージ

	$ hdiutil create -type SPARSE -fs JHFS+ \
	  -volname "DISKIMAGE2" -size 20gb DISKIMAGE2

## 書込可能・可変サイズ・最大20GB・AES暗号化 sparseimageファイル

上記に暗号化機能をつけたもの

	$ hdiutil create -type SPARSE -fs JHFS+ \
	  -encryption AES-128 -stdinpass \
	  -volname "DISKIMAGE3" -size 20gb DISKIMAGE3

## 書込可能・可変サイズ・最大20GB sparsebundleパッケージ

スパースバンドルイメージの実体は複数の小さなファイルで構成されたフォルダなので、
1ファイル4GB制限のあるFAT32ドライブなどにも作成でき、
そのディスクイメージの中には4GB超のファイルを置くことができる

	$ hdiutil create -type SPARSEBUNDLE -fs JHFS+ \
	  -volname "DISKIMAGE4" -size 20gb DISKIMAGE4

## 読込専用・固定サイズ・zlib圧縮 dmgファイル

シンプルなアーカイブ作成、展開せずにマウントできるので便利

	$ hdiutil create -fs HFS+ -format UDZO \
	  -srcfolder "ソースフォルダ" \
	  -volname "DISKIMAGE5" DISKIMAGE5

## 読込専用・固定サイズ・LZFSE圧縮 dmgファイル

LZFSEはAppleの開発した新しい圧縮方式らしい(OS X 10.11以降で使用可能)

	$ hdiutil create -fs HFS+ -format ULFO \
	  -srcfolder "ソースフォルダ" \
	  -volname "DISKIMAGE6" DISKIMAGE6
新卒のvim日記 day2【備忘録】

# はじめに
[day1](https://qiita.com/4geru/items/af50c425e85b042f6475)の記事を書いていて思ったのですが、こんな初歩的な記事を書いても読み手の人は多分すでに知っているしどうしよう...書こうか悩む...と思っていたのですが、悩んで後悔するよりやって後悔したい人なので、頑張ってみます。

今日は、昨日のコマンドに加えて入力・置換について勉強しました。

## 入力
Vimにはいくつかモードがあるようです。vimで文字を入力するためには、Insertモードまたは、Replaceモードになる必要があります。
最初にVimを開いた時はNormalモードで読み込まれます。
次のコマンドで文字を入力することができます。

|コマンド|機能|
|:--|:--|
|i|文字の先頭からInsertモードになる|
|a|文字の末尾からInsertモードになる|
|I|行の先頭からInsertモードになる|
|A|行の末尾からInsertモードになる|
|r|カーソル上の文字のみReplaceモードで他はInsertモード|
|R|カーソルより後ろの文字をReplaceモードで入力する|

## 置換
置換は文字を置き換える操作です。
コマンド的には、1行のみ変更の場合は`s/xx/yy/g`で、ファイル内では`%s/xx/yy/g`で置き換えることができます。

# 備忘録
← [day1](https://qiita.com/4geru/items/af50c425e85b042f6475) | <strong>day2</strong> | [day3](https://qiita.com/4geru/items/868674184b2064de9078)→

明日はモード・ファイル内検索について調べます。

# 参考文献
[viコマンド一覧表](http://yamabito.main.jp/linux/vi_commands.htm)
新卒のvim日記 day1【備忘録】

# はじめに
vim使いかっこいいですよね！
大学ではvimへの憧れを持ちながら授業でemacsを使っていました。
[新人達を1ヶ月でガチvimmerにした方法](https://qiita.com/nyantera/items/4bf29ca6f11bc797a9cb)の記事を読んで、新卒を気にvim入門しました。一日1コマンドを目標に頑張っていきたいです。
すでにvimを使える人は暖かく見守ってください。
研修で忙しく途切れるかもしませんが、少しずつできる範囲で頑張ります。
他にもオススメの方法があればコメントで教えてください。

今日は移動コマンド・ファイルオープン・ヤンク&ペーストを覚えました。
今日は移動コマンド・ファイルオープンについてまとめます。

## 移動コマンド
### カーソル移動
移動コマンドはCtrlを押しながら左上右下の順にh,k,l,jを押し、下の矢印の方向へ移動させます。

<img width="185" alt="スクリーンショット 2018-04-04 20.18.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/64677/375fd987-097d-a005-ed07-20bc818827bf.png">

移動のイメージがキーボードの配置とあっていなかったので、下のようにして考えるとすぐ移動コマンドで移動することができました。
<img width="196" alt="スクリーンショット 2018-04-04 20.11.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/64677/de1d1ed1-f6cd-4fd6-2ce5-46cdfe534941.png">

### 行の移動
行の先頭は`0`、`^`、行の末尾への移動は`$`で移動できる。

## ファイル操作
ファイルオープンは、`:e file_name`でできます。
ファイルの名前をつけて保存する場合は`:w file_name`

vimを終わる場合は`:q`、保存して終わる場合は`:wq`で終われます。

# 備忘録
<strong>day1</strong>| [day2](https://qiita.com/4geru/items/4da4691d92e9c9615ded) →

# 参考文献
[viコマンド一覧表](http://yamabito.main.jp/linux/vi_commands.htm)
Access VBA H29/03/04 というExcelの日付を日付として受け入れるための関数

Adodb.Recordsetなどを用いて、Excelからアクセスのテーブルへデータを受け入れることができます。
この時、Excelの日付表示が
H29/4/4 13：50

だとExcelが年月日として認識していてもうまくいきません。
この場合の方法は
a.Excelで表示形式を変換してからAccessに入れる
b.テキストとして受け入れ、フィールドの形式をDatetimeに変える。
C.関数を作り、変換する
という方法が考えられます。

今回はcを作りました。
fnGengoToDateTime ("H08/04/03 09:04")
fnGengoToDateTime ("H元/04/03 09:04")
こういう場合でも変換できます。
いうまでもなく改元を意識しています。


```visualbasic

'For Access VBA
'日本の元号を西暦に変換します

Function fnGengoToDateTime(str) As Date
Dim buf As String, buf1 As String
Dim y2 As Long
Const Showa = 1925
Const Heisei = 1988
Const Taisho = 1912
Const Meiji = 1868
Const cnsG2019 = 2018
Dim REG: Set REG = CreateObject("Vbscript.RegExp")
Dim MC, M, iMc As Long
Dim TransferParameteter As Long
REG.Global = True
REG.MultiLine = False
REG.IgnoreCase = True
REG.Pattern = "(元|[0-9]{1,2}\b)"
Set MC = REG.Execute(str)
If MC.Count > 0 Then Set M = MC(0)
buf = Mid(str, 1, 1)
Select Case buf
Case Is = "昭", Is = "S", Is = "s"
TransferParameteter = Showa
Case Is = "平", Is = "H", Is = "h"
TransferParameteter = Heisei
Case Is = "M", Is = "明"
TransferParameteter = Meiji
Case Is = "T", Is = "大"
TransferParameteter = Taisho
'Case Is = "X", Is = "新" '<<<決定したら入れる
'TransferParameteter = cnsG2019
Case Else
Exit Function
End Select
'元年かどうかの処理と変換
If M.Value = "元" Then
y2 = 1
buf = Replace(str, buf & "元", y2 + TransferParameteter, 1, 1, vbTextCompare)
Else
y2 = M.Value
buf = Replace(str, buf & y2, y2 + TransferParameteter, 1, 1, vbTextCompare)
End If
fnGengoToDateTime = CDate(buf)
End Function
```
Python での数値比較にisを使ってはいけない

#環境
 - Python 3.6.4

#結論

Pythonの数値比較ではisを使ってはいけません。

Pythonにおける`is`と`==`はそれぞれに用意されていてる用途に従って使いましょう。

 - is オブジェクトのidの比較
 - == オブジェクトの数値の比較 

<B>処理速度が速いからといってisで数値比較とかするのはNGです</B>。

# コード

例えば、大抵の環境では

```
>>> a = 1
>>> a is 1
>>> True
```
となるので、うまく行っているように見えますが
実はこれはPythonが[シングルトン](https://qiita.com/Shuuuuuuun/items/0d6f809e8c55fe898ebd)で確保してくれてるだけです。

```
for i in range(255, 260):
    a = i
    print '{}: {}'.format(i, a is i+1-1)

>>> 255: True
>>> 256: True
>>> 257: False
>>> 258: False
>>> 259: False
```

実際のobjectのidを出力する方はこっち

```
for i in range(255, 260):
    a = i
    print '{}: {}: {}'.format(i, id(i), id(a+1-1))

>>> 255: 4406286672: 4406286672
>>> 256: 4406286704: 4406286704
>>> 257: 4409913072: 4410306320
>>> 258: 4410306384: 4410306320
>>> 259: 4409913072: 4410306320

```
Pythonは-5~256の整数値をシングルトンで確保しているようで、これら以外の数値は比較で使われるべきではありません。
ガーベジコレクトもありますし、少なくとも<b>安全に使えるとはいえない</b>気がします。
(gccollectが行われた場合の挙動については詳しくないです(´・ω・｀))

# きっかけ
`is`で整数値判定をしてたら時々挙動がおかしくなったことで判明

# isの使い道
自分で生成したオブジェクトの同一性判定に使うべきだと思います。

巷でよく取り上げられる「`None`判定の時に`is`を使う方が良い」については経験的に多分正しいです。
ただ、例外的な使い方である気はします。

# よく分からないこと
```
a = None
a is None

b = True
b is True

c = False
c is False
```

これらが常に安全に`True`になるかはよく分かりません。。
分かる人いたら教えてください(´・ω・｀)
Socketの仕組みが分かり易いサイト

#[Socketの仕組みが分かり易いサイト](https://docs.python.org/3/howto/sockets.html)
[「SocketProgramming HOWTO」](https://docs.python.org/3/howto/sockets.html)が非常に分かり易かったです。
PythonのSocketの説明なのですが、Pythonを全然知らなくても理解できます。

##おまけ HTTPとTCPとsocketとthreadの関係
HTTPサーバーを建てるためはHTTPプロトコルの理解が必要です。
そして、HTTPの下にTCPのレイヤーがあるのでTCPを理解する必要があります。

TCPはメッセージの送受信を行うプロトコルですが、その処理の中でthreadとsocketが生成されます。

なので、知識の依存関係は「HTTP > TCP > socket, thread」となっています。

HTTPの分かり易いサイトに関しては[「HTTPプロトコルを体系的に理解するために最初に読むべきサイト」
](https://qiita.com/engineer-k/items/7b953f0df13b91f5718c)。
RaymarchingとGeometryを同一シーンにレンダーする

　やることは非常に単純で、シェーダー側（gl_FragDepth）でデプスを更新することである。

[ModernOpenGL-AdventCal2017/21-render_raymarching_and_geometory_at_the_same_time](https://github.com/yumataesu/ModernOpenGL-AdventCal2017/tree/master/21-render_raymarching_and_geometry_at_the_same_time)

## Feature
* GBuffer生成し、1パス目でGeometryをレンダーし、2パス目でRaymarchingをレンダーする
* 2パス目のRaymarchingで、1パス目と同じカメラ情報で、rayを定義する
* rayの衝突判定からシーンの深度を構築し、その値でgl_FragDepthを更新する

## GBuffer生成
GBufferは、特に変な設定はしない。
位置、法線、色（アルベド）をカラーバッファ、デプスバッファをレンダーバッファとして生成する。（ofFboではデフォルトで、レンダーバッファがデプスバッファになる）

```c++

    vector<GLint> formats = { GL_RGBA16F, GL_RGBA16F, GL_RGBA16F };
    ofFbo::Settings settings;
    settings.width = WIDTH;
    settings.height = HEIGHT;
    settings.textureTarget = GL_TEXTURE_2D;
    settings.wrapModeHorizontal = GL_CLAMP_TO_EDGE;
    settings.wrapModeVertical = GL_CLAMP_TO_EDGE;
    settings.minFilter = GL_NEAREST;
    settings.maxFilter = GL_NEAREST;
    settings.numColorbuffers = 3;
    settings.colorFormats = formats;
    settings.numSamples = 4;
    settings.useDepth = true;
    settings.useStencil = true;
    
    g_buffer.allocate(settings);
    g_buffer.checkStatus();
```


## 1パス目でジオメトリを普通にMRT
　1パス目のポリゴンのGBufferへのレンダリング。ここでも、特別なことは何にもしていない。
[source]
(https://github.com/yumataesu/ModernOpenGL-AdventCal2017/blob/7ece3a72d6d2e501221ae0417b851578946eedd0/21-render_raymarching_and_geometry_at_the_same_time/src/ofApp.cpp#L75-L94)


## 2パス目でRaymarchingのシーンを書き込む
　ここで重要なのは2つ
* 1パス目と同じカメラ情報で、rayを定義すること
* rayの衝突判定からシーンの深度を構築し、その値でgl_FragDepthを更新すること


　深度を更新しないと、適切な前後関係で、シーンがレンダーされない
しかし、RayMarchingは、ただの板ポリにfragment shaderで描画しているだけなので、深度値はつねに1である。
そのため自前で、Rayの衝突位置から深度値を計算する必要がある。
[source](https://github.com/yumataesu/ModernOpenGL-AdventCal2017/blob/7ece3a72d6d2e501221ae0417b851578946eedd0/21-render_raymarching_and_geometry_at_the_same_time/bin/data/shader/raymarch_shader.frag#L103)



## この深度値で、gl_FragDepthを更新する。
　2パス目ではglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);をせず、GBufferにレンダーする。
[source](https://github.com/yumataesu/ModernOpenGL-AdventCal2017/blob/7ece3a72d6d2e501221ae0417b851578946eedd0/21-render_raymarching_and_geometry_at_the_same_time/src/ofApp.cpp#L98-L115)



## これで、RayMarchingとofBoxPrimitiveが共存するGBufferができる。
![8月-24-2017 14-40-35.gif](https://qiita-image-store.s3.amazonaws.com/0/104234/1b7abae7-3047-fca8-b2e3-c64d63beb5a2.gif)
*GBufferの中身。正しい前後関係でレンダリングされていることが確認できる。*




## 後はライティングを行う
　ここまでくると、後は一般的な遅延シェーディング処理を行うだけ。
![8月-24-2017 13-50-24.gif](https://qiita-image-store.s3.amazonaws.com/0/104234/e54d4088-896a-b4e2-6692-03fcfbd39c54.gif)

*最終レンダリング結果 | 緑のSphereは、Raymarching。赤のCubeは、ofBoxPrimitive。
ライティングが一貫しているのが確認できる。*



## まとめ
　このテクニックを利用すれば、キャラクターアニメーションの後ろで、
フラクタルやトンネルがバキバキ動いているという複雑なシーンをレンダーすることができる。
　GBufferが生成できたので、スクリーンスペース系のテクニック（SSAOとか, SSRとか）も今まで通り使えるはず。
開発というプロセス

最初になにがしたい（プロセス）
![プロセス１.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/c0ade0eb-fcb9-c9b0-3e7e-37cf72f44fb7.jpeg)
各箇所で何がしたい（タスク）
![開発プロセス.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/4aa3c4b9-cbce-a407-eb7d-c964d8875dfb.jpeg)

全体があり、部署がある。

そして役割業務（作業）ケースがある

まずこの流れだと思うな。

ながれは適当がいい。自由とアイデアが大事。

また次へ
CakePHP3でdatepickerフォームの初期表示フォーマットでハマる

# 今回のお題
jQueryUIのdatepickerを設定しているinputフォームに対して
初期表示が上手くできなかったので備忘録として残します。

## 現象
データは以下のようになっています。
join_dateはdate形式です。


```select.sql
select
　　join_date
from
　　users;
```

+--------------+
|　  join_date  　|
+--------------+
| 　2018-04-06  |
+---------------+


```detail.ctp
 <?= $this->Form->input('join_date', [
    'type' => 'text',
    'class'=> 'date-picker',
    'label' => false,
  ]); ?>
```

これをブラウザで確認すると、

```detail.html
<input name="join_date" class="date-picker" id="join-date" value="2018/04/06" type="text">
```

htmlソースではyyyy/mm/dd形式なのに、画面上ではyy/mm/dd形式で表示されます。
datepicker.jsで日付を設定するにはsetDateを使うとのこと。
以下のソースコードを追加します。

```detail.ctp
<script>
    $(function () {
        // datepicker 初期表示日付フォーマット設定
        $(".date-picker").datepicker("option", "dateFormat", 'yy/mm/dd' );
        $('#join-date').datepicker('setDate', '<?= ($user['join_date']) ? $user['join_date']->format('Y/m/d') : "" ?>')
    });
</script>
```

これでyyyy/mm/dd表示されるようになりました。

join_dateが未設定の場合に当日の日付が初期表示として入ってしまうので
三項演算子を使って空文字を入れるように設定しています。
エクセルでセルの文字列固定長にしたい（文字列に対し固定長になるよう空白を埋める）

エクセルで文字列に対し後ろにスペースを追加して固定長にしたいということはありませんか？

(例)下記Ａ列の文字列に対しＢ列は空白を埋めて10文字にしたい
Ａ１＝"1234567"　　＝＞　　Ｂ１＝"1234567   "
Ａ２＝"12345"　　　＝＞　　Ｂ２＝"12345     "
Ａ３＝"123"　　　　＝＞　　Ｂ３＝"123       "

無論VBAを使えばできますが関数のみでもできます。
（以降B1セルの関数）
=if(ren(A1)=9,A1&" ",A1)
のような関数でもできますが、これは
長さの数だけifを作る必要があります。

おすすめはこの方法
=A1&rept(" ",10-len(A1))

rept関数は第１引数を第２引数だけ繰り返す関数です。
10-len(A1)とは10文字までの不足文字数を表します。
上記の例だとA1は7バイトのため、
10-len(A1)=3文字分スペースを繰り返す
よってＡ１セルの"1234567"に" "を３つ連結して10文字になります。

やり方はいろいろありますが、これが一番スマートな方法じゃないかと。
Cross points of a circle and a line in python

```python
def project(an,p10):
  p12=an[1]-an[0]
  norm = np.linalg.norm(p12)**2
  #print(norm)
  ret = np.dot(p10,p12)/norm
  #print(ret)
  return an[0]+p12*ret

def getCrossPoints(c, r, l): 
  #print(l)
  pr = project(l, c)
  #print(pr)
  e = (l[1]-l[0]) / (np.linalg.norm(l[1]-l[0]))
  mid = (r*r - np.linalg.norm(pr-c)**2)
  base = np.sqrt(mid)
  #print("==e,base==")
  #print(mid,e,base)
  return [pr-e*base, pr+e*base]

a = []
a.append(map(int, raw_input().split()))
for aa in a:
    cx = aa[0]
    cy = aa[1]
    r = aa[2]
    c = np.array([cx,cy])

n = input()
for i in range(n):
  a = []
  a.append(map(int, raw_input().split()))
  for aa in a:
    hn = np.array(aa).reshape(2,2)
    s1 = np.array([hn[0][0],hn[0][1]])
    s2 = np.array([hn[1][0],hn[1][1]])
    #print(c,r,s1,s2)
    gcp = getCrossPoints(c, r, [s1,s2])
    #print(gcp)
    out = ""
    for x in gcp:
        for xx in x:
            if (out):
                out = out + " " 
            out = out + str(xx)
    print(out)
```

```
2 1 1
2
0 1 4 1
1.0 1.0 3.0 1.0
3 0 3 3
3.0 1.0 3.0 1.0
```

# Refs.
* [projection](https://qiita.com/adad/items/2c5bd4262bee736f264f)
* [sqrt](https://www.tech-tech.xyz/archives/python_sqrt.html)
【PyOCR】画像から日本語の文字データを抽出する


## Tesseract OCR 導入

https://github.com/tesseract-ocr/tesseract

OCR = 光学文字認識 (Optical Character Recognition) 
Tesseract OCRは、Google製のOCRエンジン

各環境への導入の仕方（本記事はMac環境）
https://github.com/tesseract-ocr/tesseract/wiki


### 日本語の訓練データの取得

https://github.com/tesseract-ocr/tesseract/wiki/Data-Files
こちらから`tesseract-ocr-3.02.jpn.tar.gz`を取得する

解凍すると`jpn.traineddata`が得られるので、
`/usr/local/Cellar/tesseract/3.05.01/share/tessdata`へ移動
ここには`eng.traineddata`など、各言語の訓練データが格納されている



## PyOCR 導入

- ~~https://github.com/openpaperwork/pyocr~~

現在 GitHub のリポジトリはアーカイブされており、GitLab に移行した。

- [World / OpenPaperwork / pyocr · GitLab](https://gitlab.gnome.org/World/OpenPaperwork/pyocr)

PyOCRは、PythonでOCRを使えるようにするライブラリ

インストールする

```bash
$ sudo pip3 install pyocr
```

anacondaの場合
https://anaconda.org/auto/pyocr



## サンプル実行

画像から文字データを抽出する

https://github.com/openpaperwork/pyocr

```python:image2text.py
from PIL import Image
import sys
sys.path.append('/path/to/dir')

import pyocr
import pyocr.builders

tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)
tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))

langs = tool.get_available_languages()
print("Available languages: %s" % ", ".join(langs))

txt = tool.image_to_string(
    Image.open('test.png'),
    lang='jpn',
    builder=pyocr.builders.TextBuilder()
)
print(txt)
```

![test.png](https://qiita-image-store.s3.amazonaws.com/0/136286/4a11dba6-773c-7e78-8f58-9b57cd257974.png "test.png")

↑こちらのヤフーニュースのスクショを解析すると...

```bash
動画 鵬 ニユ一ス ー 経済

エン夕メ 〉 スポ一$



。時ー9分更新
・ 日報 問題文書と思わず未報告楓

・西部さん自殺ほう助 2人逮捕塵
・AT小型二輪の教習 最短2日に
・明石大橋20年 震災無傷の技術趣剛
・女性市長 土俵ぁいさっ断られ趣
・cc社 買収受け入れの方針】
・栄氏が伊調にパヮハラ 認定〔
・鬼奴あきれ顔 借金激減を訂正趣剛

もっと見る トピックス一覧
```

まあ、読めなくもないけど人間が手動で校正する必要はある。
手書きや飾り文字は壊滅。
デザイン性のないただ文字が羅列しているだけの画像には有効。


> 参考
[OCRツール「Tesseract OCR」をインストールしてPythonで使う](http://73spica.tech/blog/tesseract_for_python/)
[tesseract-ocrをMacで使ってみた](http://jprogramer.com/ocr/2003)
BUKURO.swift 2018-04

<p>22018年4月4日（水）の夜間、東京都豊島区の<a title="池袋コワーキングスペース OpenOffice FOREST" href="http://co-forest.com/">池袋コワーキングスペース OpenOffice FOREST</a>におきまして、「BUKURO.swift 2018-04」を開催致しました。</p>

<p>BUKURO.swiftも浸透して来たようで、先月と同様に多くの方が申し込まれました。<br />
初めて参加される方に、どうやってBUKURO.swiftを知ったのか伺ったところ、会社でmacOSプログラミングで悩んでいたところ、同様から紹介されたとのこと。<br />
ありがとうございます。<br />
これからもアプリケーション・プログラマの方々が役立つ勉強会になるよう精進いたします！<br />
そして、今回の発表はどれもプログラマの好奇心をくすぐるものでした。<br />
よし、自分も頑張ろう！という気持ちにさせていただきました！</p>

![IMG_1401.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/ffc8418d-fe27-a8f5-380a-0ce2135a34fe.jpeg)

イベント概要

<ul>
<li>東京 池袋で開催される Cocoa勉強会 と MOSA の合同勉強会です。</li>
<li>macOS/iOS/watchOS/tvOSプログラマーのための勉強会です。</li>
<li>初心者大歓迎です。</li>
<li>関連があれば、他の環境についてもOKです。</li>
<li>プログラマーが楽しくプログラミングできるようにサポートする場を提供したい
	<ul>
	<li>勉強会に参加された方全員が学びを得られる様にサポートします！</li>
	<li>勉強会に参加できない方にも学び得られるよう、勉強会の成果を可能な限りアウトプットします！</li>
	<li>プログラマの拠り所となる場を目指します！</li>
	</ul>
</li>
</ul>

<p>Cocoa勉強会 関東には、以下のFacebookグループから、ご参加ください。</p>
<a href="https://www.facebook.com/groups/cocoa.kanto/">https://www.facebook.com/groups/cocoa.kanto/</a><br />

<p>MOSAのconnpassグループには、以下から、ご参加ください。</p>
<a href="https://mosa.connpass.com/">https://mosa.connpass.com/</a><br />

<p>発表資料は<a href="https://cocoa-kanto.connpass.com/event/80016/">connpassページ</a>からどうぞ！<br />
また、会場の様子は、ハッシュタグ『#cocoastudy #mosa #bukuroswift』でtweetしています。</p>

矩形の移動

<p>NSMatrixが非推奨になっているそうです。そこで、代替機能として、同じ大きさの矩形を整列させるための支援コードの発表です！</p>

Swiftの文字列

<p>以前、Cocoa勉強会 関東で発表されましたが、その後の状況の変化を加味した発表でした。<br />
自分自身も、その後、経験を積み、前回と比較して理解度も上がり、プログラマの好奇心をくすぐる内容に楽しまさせていただきました。<br />
SwiftのStringがUnicodeに高い割合で準拠しているのは知っていたのですが、例えば、文字をどういう用語で扱っているのか説明できずもどかしかったのですが、拡張書記素クラスタ（CodePoint）というのですね。そして、例えば、RubyはUnicodeスカラーで、JavaはUTF-16、PythonはUTF-8で扱うため、得られる文字列長が異なるとか、macOSのファイルシステムでの文字列がModified NFDとなっている理由。そレから得られる日本語としての恩恵。文字の比較でUnicodeの一貫性のなさからNFDで比較すればいいという訳でない事。<br />
曖昧に理解していて事が再確認できて、とても有益でした。</p>

個人製作Unityゲームのデモ

<p>Unityを使った2Dと3DのWebGLアプリのデモです。十分遊べる完成度に驚かされました。やりますね！</p>

<p>本日は、ここで時間切れ。今回発表できなかった資料は次回の勉強会で！</p>

<p>次回は5月11日(金)開催を予定しています！<br />
また、4月12日(木)にエンジニア飲み会 <a href="https://mosa.connpass.com/event/82985/">PubHack.swift 2018-04</a> を開催しますので、ご都合が宜しければ是非！待ってます！</p>

【関連情報】
<a href="https://cocoa-kanto.connpass.com/">BUKURO.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="https://mosa.connpass.com/">MOSA</a><br />
<a href="http://www.bitz.co.jp/weblog/"> Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />
Petalinux 固定IP設定するまでの流れ

#目標
Petalinuxを固定IPで起動させる

#環境
+ Petalinux version　
Petalinux 2017.2

+ 動作環境
 Petalinux QEMU


#作業手順
下記Xilinxのページから、IPアドレス設定に用いるフォルダ、ファイルを作成する
https://japan.xilinx.com/support/answers/69119.html

<ol>
    <li>フォルダを作成</li>
<blockquote>mkdir -p <plnx-proj-root>/project-spec/meta-user/recipes-core/init-ifupdown/init-ifupdown</blockquote>

    <li> カスタム インターフェイス ファイルをコピー（ファイルは上記リンク先から取得可能）</li>
<blockquote>$ cp <custom_interface_file> <plnx-proj-root>/project-spec/meta-user/recipes-core/init-ifupdown/init-ifupdown/interfaces</blockquote>

    <li> bbappend ファイルを作成</li>
<blockquote>$ vim <plnx-proj-root>/project-spec/meta-user/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend</blockquote>

　　<li> init-ifupdown_1.0.bbappend ファイルに下記コードを追加</li> 
<blockquote>FILESEXTRAPATHS_prepend :="\${THISDIR}/${PN}:" </blockquote>

   <li> 次のコンテンツを<plnx-proj-root>/project-spec/meta-user/conf/petalinuxbsp.conf ファイルに追加</li> 
<blockquote>SIGGEN_UNLOCKED_RECIPES += "init-ifupdown" </blockquote>


1.～5.で設定用ファイルの作成は完了。次はIPの設定

最初に貼ったリンクの添付ファイル内容は下記の通り
<blockquote>auto eth0<p>
iface eth0 inet static <p>
address 192.168.0.100<p>
netmask 255.255.255.0<p>
gateway 192.168.0.1<p>
dns-nameservers 4.4.4.4<p>
dns-nameservers 8.8.8.8</blockquote>

この中身を自分の設定に変更し、保存する
<p>

   <li> すべて終わったら init-ifupdown レシピを再構築し、petalinux-buildを行う（プロジェクトファイルのルートディレクトリで行う）</li> 
<blockquote>\$ petalinux-build -c init-ifupdown
<p>
$ petalinux-build </blockquote>
</ol>


起動後のIPアドレス設定は完了。
以上、ただのメモ書き
第 2 回 AI・人工知能 EXPO 参加レポート

## はじめに

![IMG_6213のコピー.JPG](https://qiita-image-store.s3.amazonaws.com/0/19698/3cfcef06-4d40-0396-7ddc-6d8a0f784716.jpeg)

第 2 回 AI・人工知能 EXPO　に参加したレポートです。

- [イベント公式サイト](http://www.ai-expo.jp/)

*多分に個人的見解が入っておりますので、認識の齟齬があったらすみません* :bow: 

## ヤフー CSO 安宅さんの講演

- 私前職ヤフーでして、ヤフー時代から非常にお話が面白いと思ってたのですが、今回もピカイチに話が面白かった！
- 日本は AI 後進国で、その自覚がないと勝ち残っていけないという考えが非常に刺激になった。
- AI はデータに目的を与えて始めて活きる。
- テスラの AI 技術が衝撃的
    - 事故予測
    - https://youtu.be/DuIrjRAzNPQ

![スクリーンショット 2018-04-06 0.44.03.png](https://qiita-image-store.s3.amazonaws.com/0/19698/02ca757e-6d9b-fc18-76f6-64dfcadcbe96.png)


## ドワンド CTO 川上さんの講演

- 人間は AI に取って代わる存在
    - そのためベーシックインカムは必須な流れである
    - AI にはモラルが求められる時代が来る
- 視線をジャック
    - https://youtu.be/-tDaZk9V1Nw

![スクリーンショット 2018-04-06 0.45.04.png](https://qiita-image-store.s3.amazonaws.com/0/19698/a11c6e49-9c91-342f-dcf0-79b51cb020d0.png)


## お二方の講演を受けて

- 川上さんと安宅さんの話で決定的に違ったと感じたのは、お互いに AI という技術の可能性を信じていながら、AI が知性を持てるのか、という点だと感じた。
- 安宅さんは AI は目的に沿ってデータを活用する手段だと論じ、川上さんは人に完全に取って代わるものだという主張が興味深かった

## ブース

![IMG_6178.JPG](https://qiita-image-store.s3.amazonaws.com/0/19698/49e7992b-6b15-a9de-86af-d61f2218b4ca.jpeg)


### チャットボットについて
- チャットボットのブースが 20 個くらいあり、チャットボット戦国時代感が出ていた。その中で、自社で導入する場合にどの製品が生き残るか判断するのは難しそう。
- 他との差別化要因として、OKWave のチャットボットは、自社で過去の QA データが溜まっているので面白そう。
- チャットボットの実装自体は難しくないので、自社開発するのもありかも

### HR 系ブース
- 離職率を下げるための AI を 3 社が製品化していた
    - モチベーションを測定値としており、元データは以下の 3 パターン
        - 自己申告でモチベーションを入力させる
        - 過去の離職者データを利用
        - メールやチャットの中身から計測
    - 流石にメールの中身はプライバシー的に NG ではないかと思ったが、いろんなアプローチをしており、参考になった

![IMG_6150.JPG](https://qiita-image-store.s3.amazonaws.com/0/19698/eb6b2af9-2917-2f8e-ac5b-f8d2e7cf63f7.jpeg)
残業時間とモチベーションの相関

### 画像解析技術を用いたもの

- Google の Cloud Vision API など、画像解析技術を簡単に利用できるようになったため、画像解析系のブースも多かった
    - 人の性別、年齢をリアルタイムで解析
    - 衛星からの地上写真を解析
    - OCR 技術を使った RPA (Robotic Process Automation)
    - テスラの事故予測
    - 株価・為替予測



### センサー系

- 今回展示は少なかったが（自分の認識では 1 社のみ）、センサー技術は今後の可能性を秘めた技術だと思う
- Amazon の Alexa や Google の Google Home は、現状は AI スピーカーにとどまるが、今後センサー技術や IoT が進む上で、家庭内のセンサーをコントロールする中核部分になるはず。現状でセンサーに特化したアプローチをしているのは非常に面白い。

![IMG_6170.JPG](https://qiita-image-store.s3.amazonaws.com/0/19698/a37f1860-cf5d-7189-bcd4-0a9a2c7260f1.jpeg)


## ブースまとめ

- Python の AI・機械学習系ライブラリ、　OSS の Tensorflow、　AWS や GCP の ML 系　API の普及により、 AI 技術への参入障壁が非常に低くなった印象を受けた。
- 実際の製品としてのアウトプットが非常に多く、正解が難しい中で様々なアプローチを取っているのが面白かった。
- その中で何を目的として、どういった価値を提供できるかが鍵になってくる気がする。

## 全体まとめ

講演もブースも非常に面白く、刺激を受けました。自分でも色々触っていかねばという良い意味での焦燥感を得られました。
Python CSVで日付関連のデータを計算(sample)

pythonでCSV使って日付データを処理したい人いると思います。
sample残しておきます。

## データのサンプル
日付しか使いませんが...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205341/c52cb1d5-37d7-c438-0840-cac4e3bcd811.png)

## サンプルソースコード

```python:Csv.py
import csv
import datetime

class Csv:
    # コンストラクタ(最初だけの処理)
    def __init__(self,fname):
        self.list = []  # このリストにCSVのデータすべて入れる
        f = open(fname, 'r')
        reader = csv.reader(f)
        for row in reader:
            self.list.append(row)
        f.close()
    # 日付を文字列とdatetimeの型変更
    def date_change(self, date):
        if type(date) == str: #もし文字列ならdatetime型に
            change_date = datetime.datetime.strptime(date, '%Y/%m/%d')
            return change_date
        elif type(date) == datetime.datetime: # もしdatetime型なら文字列に
            change_date = str(date.year) + '/' + str(date.month) + '/' + str(date.day)
            return change_date
    # datetime型で日付の加算、減算を行う
    def day_calc(self, date, num):
        if type(date) == datetime.datetime:
            date_buf = datetime.timedelta(days=num)  # datetime型の数値を出す(計算するため)
            return date + date_buf  # ここで計算して返す
        else:
            print('day_calc: type err')
            return

# メイン
def main():
    # オブジェクト生成(ついでにCSVを渡してリストに登録しておく)
    csv = Csv('sample.csv')
    count = 0
    for row in csv.list:
        # 最初の日付の部分だけいらない。それと0~5まで表示
        if row[0] == '日付' or count > 4:
            count+=1
            continue
            
        print('before: '+row[0])
        # 日付をdatetime型に変更
        date = csv.date_change(row[0])
        # 日付に5加算
        new_date = csv.day_calc(date, 5)
        # もう一度型を文字列に戻す
        new_date = csv.date_change(new_date)
        print('new: '+ str(new_date))
        count+=1

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

## 出力結果

```:出力結果
before: 2018/4/1
new: 2018/4/6
before: 2018/4/2
new: 2018/4/7
before: 2018/4/3
new: 2018/4/8
before: 2018/4/4
new: 2018/4/9
```
Angular と Pug の設定の事例を参考にしました

# 参考

## [Using PUG (or Jade) templates with the Angular-CLI](https://medium.com/@MarkPieszak/using-pug-or-jade-templates-with-the-angular-cli-9e37334db5bc)

記載の通りに行ったところ Angular と Pug の連携ができました

# [Angular のプロジェクト作成](https://angular-ja.firebaseapp.com/guide/quickstart)

Node.js のインストール後

```
# Angular インストール
npm install -g @angular/cli
# Angular プロジェクト作成
ng new my-app
```

# NPM

## pug-cli

pug-cli についてのインストールの記載はなかったので[pug-cli インストール](
https://hackernoon.com/using-pug-jade-with-angular-with-cli-5592b7ee24e6#b75c)

```
npm install pug-cli --save-dev
```

## pug-loader

```
npm i --D apply-loader pug-loader
```

# スクリプト？

## pug-rule-insert.js

プロジェクトのルートに[pug-rule-insert.js](https://medium.com/@MarkPieszak/using-pug-or-jade-templates-with-the-angular-cli-9e37334db5bc#gist81191257)を用意して

```:とりあえず実行
node pug-rule-insert.js
```

# Pug のファイルを用意

## Angular の HTML のファイルを Pug 形式に

```:(app.component.pug)ng_new_したhtmlをpugに
<!--The content below is only a placeholder and can be replaced.-->
div(
  style="text-align:center"
)
  h1 Welcome to {{ title }}!
  img(
    width="300"
    alt="Angular Logo"
    src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTAgMjUwIj4KICAgIDxwYXRoIGZpbGw9IiNERDAwMzEiIGQ9Ik0xMjUgMzBMMzEuOSA2My4ybDE0LjIgMTIzLjFMMTI1IDIzMGw3OC45LTQzLjcgMTQuMi0xMjMuMXoiIC8+CiAgICA8cGF0aCBmaWxsPSIjQzMwMDJGIiBkPSJNMTI1IDMwdjIyLjItLjFWMjMwbDc4LjktNDMuNyAxNC4yLTEyMy4xTDEyNSAzMHoiIC8+CiAgICA8cGF0aCAgZmlsbD0iI0ZGRkZGRiIgZD0iTTEyNSA1Mi4xTDY2LjggMTgyLjZoMjEuN2wxMS43LTI5LjJoNDkuNGwxMS43IDI5LjJIMTgzTDEyNSA1Mi4xem0xNyA4My4zaC0zNGwxNy00MC45IDE3IDQwLjl6IiAvPgogIDwvc3ZnPg=="
  )
h2 Here are some links to help you start:
ul
  li
    h2
      a(
        target="_blank"
        rel="noopener"
        href="https://angular.io/tutorial"
      ) Tour of Heroes
  li
    h2
      a(
        target="_blank"
        rel="noopener"
        href="https://github.com/angular/angular-cli/wiki"
      ) CLI Documentation
  li
    h2
      a(
        target="_blank"
        rel="noopener"
        href="https://blog.angular.io/"
      ) Angular blog
```

```ts:app.component.ts(参照をhtmlから用意したpugへ)
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  //templateUrl: './app.component.html',
  templateUrl: './app.component.pug',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app';
}
```

# Angular の挙動確認

```
ng serve -o
```

いちおうかくにんしたものです
https://github.com/ysKuga/angular-nue
JavaScriptの !! (論理演算子)の取り扱いについて

## 当方スペック
- Railsエンジニア(Web業界歴ともに半年)
- JavaScriptが凄い苦手・・・
- 最近 `Vue.js` を勉強し始めている(普段は仕事で `AngularJS`を使用)

## 背景
JavaScriptを実務でいじっていた際に `!!変数` の形でコード上に記載があったのを発見！
とはいえ自分の実装範囲とは関係なかったので深く追いかけず...
しかし、数日経って気になり、
これってどういう時を想定して使うんだろ？？と思ったものの
ネットでググってもドンピシャな記事が出てこない！！困った...
そんな悩める自分のようなプログラミング初心者の助けになればと思い投稿しました:pencil:

## 検証環境
- Macのコンソールにてnodeを実行して検証
- nodeのバージョンは `v8.9.4`
- nodeが入っていない方は、Homebrewやnodebrewでnodeを入れて下さい！！

参考
https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09
https://qiita.com/takeshi81/items/805f504503cd93151ca6

## 検証(以下、ターミナルでnodeコマンド実行し、確認)

```
# nodeコマンドを実行

~/workspace  node

```

以下、nodeのコンソール
↓↓↓

```js

# undefined(初期化されていないオブジェクト)の場合

> let hoge
undefined

> !hoge
true

→ undefinedに対して ! を1つ付けると真偽値に変化する 

> !!hoge
false

→ undefinedに対して !! を付けると真偽値がさらに反転する

# nullの場合

> let fuga = null；
undefined
> fuga
null
> !fuga
true

→ ! でnullが真偽値のtrueに変化する

> !!fuga
false

→ !! でさらに真偽値が反転する

```

## どんな場合に使うのか？

- 必ず真偽値で判定を行いたいケースで使うみたいです  
→真偽値に変換することで意図しない挙動防止するため

## 想定される使い方サンプル

```javascript

# 値がnullやundefinedの場合はfalseにしたいが、そこに値が入っている場合はtrueにしたい時??

> hoge = null;
null
> !!hoge
false

> let foobar
undefined
> !!foobar
false

> hoge = 2;
2
> !!hoge
true

if(!!変数) {
  何らかの処理
}

```

↑↑↑

< 追記 >
`!!` は結局キャスト(型変換)するだけなので、値が `undefined` でも `null` だった場合でも `!!変数`とすることで値が `false` になります。
わざわざ `!!` を使わずに `true` の時だけ処理したい場合は以下の書き方で判定すれば良さそうです。

```js
if(変数)　{
 何らかの処理
}
```

## 最後に
今回はJavaScriptにおいて絶賛苦手克服中の自分のメモとして投稿させて頂きました。
記載内容に誤りなどありましたら、ご指摘いただければ幸いです。
Cプログラムの中でシェルコマンドを実行して結果を読み込む

popen関数の第1引数にコマンドの文字列を与える。
結果は戻り値に格納されファイルとして扱える。

```c
#define BUF 256

    FILE *fp;
    char *cmd = "ls";

    fp = popen(cmd, "r");

    while(fgets(buf, BUF, fp)) {
         fputs(buf, stdout);
    }

    pclose(fp);
```

[Man page of POPEN](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/popen.3.html)
カメラと写真の許可状態の取得をRxSwiftと絡める

開発中のアプリでカメラと写真の許可状態を取得しつつ、その状態に合わせてPickerを表示するor許可してくださいの画面を出し分けるというのをRxで組みたかったので小さいextensionを書いた。


```swift:写真の許可状態を取得する
extension Reactive where Base: PHPhotoLibrary {
    static func requestAuthorization() -> Single<PHAuthorizationStatus> {
        return .create { observer in
            let status = Base.authorizationStatus()
            switch status {
            case .notDetermined:
                PHPhotoLibrary.requestAuthorization { status in
                    DispatchQueue.main.async {
                        observer(.success(status))
                    }
                }
            default:
                observer(.success(status))
            }
            return Disposables.create()
        }
    }
}
```

```swift:カメラの許可状態を取得する
extension Reactive where Base: AVCaptureDevice {
    static func requestAuthorization(for mediaType: AVMediaType) -> Single<AVAuthorizationStatus> {
        return .create { observer in
            let status = Base.authorizationStatus(for: mediaType)
            switch status {
            case .notDetermined:
                AVCaptureDevice.requestAccess(for: mediaType) { authorized in
                    DispatchQueue.main.async {
                        observer(.success(authorized ? .authorized : .denied))
                    }
                }
            default:
                observer(.success(status))
            }
            return Disposables.create()
        }
    }
}
```

いずれも事前にstatusが取れるので、取得し、`notDetermined` ならrequestを行い、ユーザーに許可ダイアログを表示し、その結果を返すようにする。
それ以外の場合はすぐにobserverに値を流し込むようにしている。

## 利用例
ボタンのイベントなりと組み合わせて、それに応じてPickerを表示したり、許可してねというアラートを出しつつ設定画面に飛ばしたり、を実装している。

```swift
albumButton.rx.tap
    .flatMap { PHPhotoLibrary.rx.requestAuthorization() }
    .map { $0 == .authorized }
    .bind { authorized in
        if authorized {
            // pickerを表示
        } else {
            // アクセス許可してねというアラートなりを表示
        }
    }
    .disposed(by: disposeBag)
```