OmniAICreator/Qiita-1.07M huggingface dataset:
UIAlertControllerにUIProgressViewを追加してKVO監視更新

データ変換をするクラスを作って、処理中にその中で変更される進捗度合いを、KVOで UIAlertController上のUIProgressViewに反映させます。

最初、進捗に応じた UIProgressView の表示更新ができなかったんですが、以下のように
表示側には ```DispatchQueue.main.async(flags: .barrier) {}```、
処理側には、 ```DispatchQueue.global(qos: .background).async {}```を入れることで解決できました。

```swift
// progressView と _observer はメンバ変数

let progressAlert = UIAlertController(title: "Please wait", message: "Converting from old to new", preferredStyle: .alert)
self.progressView.progress = 0.0
progressAlert.view.addSubview(self.progressView)

// UIAlertControllerの高さ変更とUIProgressViewの配置
let height:NSLayoutConstraint = NSLayoutConstraint(item: progressAlert.view!,
                                                   attribute: NSLayoutConstraint.Attribute.height,
                                                   relatedBy: NSLayoutConstraint.Relation.equal,
                                                   toItem: nil,
                                                   attribute: NSLayoutConstraint.Attribute.notAnAttribute,
                                                   multiplier: 1, constant: 100)
progressAlert.view.addConstraint(height)
self.progressView.translatesAutoresizingMaskIntoConstraints = false
self.progressView.leadingAnchor.constraint(equalTo: progressAlert.view.leadingAnchor, constant: 10.0).isActive = true
self.progressView.trailingAnchor.constraint(equalTo: progressAlert.view.trailingAnchor, constant: -10.0).isActive = true
self.progressView.topAnchor.constraint(equalTo: progressAlert.view.topAnchor, constant: 65.0).isActive = true
self.progressView.heightAnchor.constraint(equalToConstant: 2.0)

// present と observe 設定と終了処理
present(progressAlert, animated: true, completion: {
    let dataMigration = DataMigration()
    self._observer = dataMigration.observe(\.dataProgress, options: .new) { object, change in
         DispatchQueue.main.async(flags: .barrier) {
            self.progressView.setProgress(object.dataProgress, animated: true)
        }
    }
    dataMigration.convert(＜何かオプション＞, completionHandler: {(sucess)->Void in
        self._observer = nil
        if sucess {
            print("Convert Complete")
        } else {
            print("Error")
        }
        progressAlert.dismiss(animated: true, completion: {
            ... 終了時の処理 ...
        })
    })
})
```

observeをするためには、DataMigrationは NSObjectのサブクラスでなければなりません。

```swift
class DataMigration: NSObject {
    @objc dynamic var dataProgress: Float = 0.0

    func convert(options: [Any], compleationHandler:@escaping ((_ success: Bool) -> Void) ) {
        var numberOfData: Float = ...データの個数...
        var countData: Float = 0.0
        DispatchQueue.global(qos: .background).async {
            for ...numberOfData分の繰り返し... {
                ...何か処理...
                countData += 1
                self.dataProgress = countData / numberOfData
            }
            completionHandler(true)
        }
    }
}
```

参考にしたのは下記です。
[StackOverflow: Add Progress bar to UIAlertController with showing update](https://stackoverflow.com/questions/41898558/add-progress-bar-to-uialertcontroller-with-showing-update)
CWLで特定のタグがついたテストだけ実行する

# 概要

特定のタグがついたものだけをテストしたいときの方法について。
状況としては、ワークフローやコマンドラインツールのうち、
バージョンをあげたものだけ、テストしたいなど。

# まとめ

`--tags` で、指定すればよい。
いくつかテストを書いていて、そのなかの、 `samtools` だけをテストしたいなら
`--tags samtools`

```
$ cwltest --test cwltest.yml --tags samtools
Test [1/1] A test for samtools view
All tests passed
$
```

`samtools` と `bwa` の２つをテストしたいなら
`--tags samtools,bwa` で指定できる

```
$ cwltest --test cwltest.yml --tags samtools,bwa
Test [1/2] A test for bwa mem
Test [2/2] A test for samtools view
All tests passed
$
```
printf("%02d", "08") でエラー

Rubyの `printf` には次のような仕様があることを知りました。

```ruby
printf("%02d", "07") # "07"
printf("%02d", "08") # ArgumentError / invalid value for Integer(): "08"
```

数値を表す書式（この例の`"d"`）があるときに、埋め込まれるものが文字列だった場合は、数値に変換されるというものです。`"07"` は8進数の7です。`"08"` は0で始まっているのに8進数の書式としておかしいのでエラーになります。

C、Java、Pythonで試してみたところ、数値の書式に対応するものが文字列のときは必ずエラーになりました。PerlとPHPでは、数値の書式に対応する文字列は10進数として変換されます。

Rubyのソースコードでは、この仕様にあたる部分はsprintf.cの `rb_str_format` にありました（ver 2.5.2）。

```c
	switch (*p) {
（略）
	  case 'd':
（略）
	    {
		volatile VALUE val = GETARG();
（略）

		switch (TYPE(val)) {
（略）
		  case T_STRING:
		    val = rb_str_to_inum(val, 0, TRUE);
		    goto bin_retry;
```
javascript vue.js object 配列を検索

vue.jsで配列を検索したい。
しかし、なぜか find を使うと googlebot が エラーを吐く。
これはSEO的にまずい。

ということで、 filter を使って要素を取得したり、存在チェックしたりします。

# まずは元になるデータ

```

var arr = [
    {
        id:100,
        name: '一郎',
        age: 25
    },
    {
        id:102,
        name: '二郎',
        age: 21
    },
    {
        id:153,
        name: '三郎',
        age: 18
    }
];


```



# ID153のデータはある？

```

var tmp = arr.filter(e => e.id == 153);

if(tmp.length > 0){
    console.log("ID153のデータはあります");
} else {
    console.log("ユーザーが見つかりません");
}


```

# データを絞り込む

```

//指定した条件のデータを抽出
var tmp = arr.filter(e => e.age >= 20);

// 結果
// 0: {id: 100, name: "一郎", age: 25}
// 1: {id: 102, name: "二郎", age: 21}

```
C++ Builder 10.2 Tokyo > オンラインドキュメントから消されたSelectDirectory()構文 > 実行は可能

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3 
Windows 10 v1903 
```

### 参考

- [C++ Builder 10.2 Tokyo > [ilink32 エラー] Error: 未解決の外部シンボル '__fastcall Vcl::Filectrl::SelectDirectory(System::UnicodeString, System::WideString, System::UnicodeString&, ...)' が... > 対処: #include <Vcl.FileCtrl.hpp>にする](https://qiita.com/7of9/items/a819570bfecb089d0a21)

上記において以下のような実装をしている。

```cpp
if (SelectDirectory(L"フォルダを指定して下さい。", L"", dir))
...
```

### オンラインドキュメント(10.2 Tokyo)にはない

上記のSelectDirectory()構文は10.2 Tokyoのドキュメントには記載がない。
http://docwiki.embarcadero.com/Libraries/Tokyo/ja/Vcl.FileCtrl.SelectDirectory

```cpp
extern DELPHI_PACKAGE bool __fastcall SelectDirectory(System::UnicodeString &Directory, TSelectDirOpts Options, int HelpCtx)/* overload */;
```

2007のドキュメントにはある。
[FileCtrl.SelectDirectory 関数](http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/delphivclwin32/FileCtrl_SelectDirectory@string@TSelectDirOpts@Longint.html)

```cpp
Boolean SelectDirectory(AnsiString Directory, TSelectDirOpts Options, Longint HelpCtx);
Boolean SelectDirectory(const AnsiString Caption, const BSTR Root, AnsiString Directory, TSelectDirExtOpts Options = [sdNewUI], TWinControl * Parent = nil);
```

理由は不明であるが、２つあった構文のうち、２つ目の構文が10.2 Tokyo（や10.3 Rio)のドキュメントで消されているようだ。

10.2 Tokyoで実行はできる。

非推奨の関数なのだろうか。
jQueryでスクリーンキーボード

#動機
- Webアプリケーション内で、マウスだけで簡単なキーボード入力がしたい
- Windows標準のスクリーンキーボードはでかいし、クライアント全部に設定して回るのはしんどい
- QWERTY配列に苦手意識を覚える層のユーザーも居る
- せっかくjQueryとBootstrapを使っているので、なんとかならんのか

そういうわけで調べてみると、[Keyboard(Git Hub)](https://github.com/Mottie/Keyboard)ってのがあるらしい。これ使おう。

#インストール
公式サイトとかググればいくらでも出てくる

#カスタマイズ
デフォルトではQWERTY配列のスクリーンキーボードしか出ないので、自分でアルファベット順のものを作る。

```JavaScript:key.js
    $(function(){
        $('#input')
                .keyboard({
                        layout: 'custom',
                        customLayout: {
                                'normal' : [
                                        '1 2 3 4 5 6 7 8 9 0',
                                        'A B C D E F G H I J',
                                        'K L M N O P Q R S T',
                                        'U V W X Y Z - {bksp}',
                                        '{a} {c}',
                                ]
                        },
                        // Prevent keys not in the displayed keyboard from being typed in
                        restrictInput : true,
                        // don't use combos or A+E could become a ligature
                        useCombos : false,
                })
                .addTyping();
    });
```

#出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390159/d133412e-42ea-59c7-c054-ad32f3a361e1.png)

個人的には使いにくいと思うけど、QWERTY配列慣れていない人には便利かな？
Elm 0.18だとゼロ除算が実行例外になる

0.18だとこれ実行時例外になるので注意です

```elm
> 100 % 0
Error: Cannot perform mod 0. Division by zero error.
```
0.19ならOK

```elm
> remainderBy 0 100
NaN : Int
```
でも`NaN`かぁ...><
CoreData: warning: Multiple NSEntityDescriptions claim および CoreData: error: +[XXXX entity] Failed to find a unique match for an NSEntityDescription 

CoreDataで、デフォルトのオートマイグレーションを使うのではなく、自前で2つの `NSPersistentContainer` で `loadPersistentStores()` して、一方から読み込み、もう一方に書き込むということをしました。

このとき書き込み側で、
`CoreData: warning: Multiple NSEntityDescriptions claim ....`
あるいは
`CoreData: error: +[XXXX entity] Failed to find a unique match for an NSEntityDescription ...`
のような警告もしくはエラーが発生しました。

やっていたこと。

```swift
let object = Xxxx(context: moc)
...attrbuteに値を代入...
do {
    try moc.save()
} catch {
    print("Failed to save new note")
}
```
これを下記のようにすることで回避できました。

```swift
let discription = NSEntityDescription.entity(forEntityName: "Xxxx", in: moc)!
let object = Xxxx(entity: discription, insertInto: moc)
moc.insert(object)
...attrbuteに値を代入...
do {
    try moc.save()
} catch {
    print("Failed to save new note")
}
```

`moc` は `NSPersistentContainer` の`viewContext: NSManagedObjectContext` です。

参考記事は以下です。
[stackoverflow: Multiple NSEntityDescriptions Claim NSManagedObject Subclass
](https://stackoverflow.com/questions/51851485/multiple-nsentitydescriptions-claim-nsmanagedobject-subclass)
ESP8266MOD格闘記

#某Amazonで買った中華ガジェットESP8266 Lua
[Amazon | DiyStudio WiFi + Bluetooth開発ボード 開発ボード NodeMCU ESP8266 ESP-12E CP2102モジュール Lua WiFi | 基板 | 産業・研究開発用品 通販](https://www.amazon.co.jp/gp/product/B07N4MP87M/)
お値段なんと800円位。
これがWifi+Bluetooth付きのマイコンだから驚きだ。
#Lua版
商品名の通り、Luaが焼かれているらしく、ATコマンドが使えない。
ちょっとした実験がしてからarduinoスタイルに移行したかったのに。
ATコマンドでwifi接続や、その他いろいろ出来る便利デバイス、そこら辺を確認したかったので、
ATコマンドが使える様にファームウェアを焼き直す事にした。
※Lua版で行きたい人の為？ここを見るべし！
※[Overview - NodeMCU Documentation](https://nodemcu.readthedocs.io/en/master/)
#ファームを焼く方法
難儀しました。一番難儀した理由が

　　「Windows」

これ。
Flashライターがまずわからんし、開発キットとか理解してないし…。
##結論
結論から言うと、ダウンロードモードにして、焼けば良いって事なのですが…。
##手当たりしだいにググる
[ESP-WROOM-02(ESP8266)ファームウェアのアップデート手順 - Qiita](https://qiita.com/dobnezmi/items/ba936fa3695b1dd050ad)
キータユーザが書いていた。
最初にここを読んだがまるでちんぷんかんぷん…己の無能さに泣く。
ただpythonのライターがあり、その在り処がわかった。
早速ダウンロードして導入。確かにライトできそうな感じのヘルプが出た。
./esptool/esptool.py 
usage: esptool [-h] [--chip {auto,esp8266,esp32}] [--port PORT] [--baud BAUD]
               [--before {default_reset,no_reset,no_reset_no_sync}]
               [--after {hard_reset,soft_reset,no_reset}] [--no-stub]
               [--trace] [--override-vddsdio [{1.8V,1.9V,OFF}]]
               {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,version}
               ...
ファームウェアの入手先もあり、最新版をダウンロードした…が、あれ？
V3.0.0だと「eagle.flash.bin」と「eagle.irom0text.bin」がない？！
また、書き込みイメージらしき行もあり、書き込みの雰囲気は理解した。
問題は書き込むファームウェアがない…と悩む。
##調べ続ける
あっちこっち見たが、拉致があかず。ここにたどり着く。
[ESP8266のファームウェア更新 | ともの技術メモ](https://tomono.tokyo/2015/07/10/5602/)
そして内容のある部分で驚愕する。

　　「私のこれフラッシュメモリ何Ｍあるのだろう？」

中華製品最大の問題、「物の素性がいまいちはっきりしない病」発症だ。
Amazonの説明だと4Mっぽいがこれは単位がビット？バイト？
最悪を考えて、ビット(4Mbit)だと思い込む。つまり512KB(バイト)だ。
すると、ここに書いてある通りで良いはず…だがやはり文字化けだらけ。
##さらに続ける
ふとダウンロード＆解凍した内容を全て洗い直す。
すると…？
SDK2.0.0のbin/at/noboot配下に探していた「eagle.flash.bin」と「eagle.irom0text.bin」ファイルを見つける！？
しかしよく見ると、一番最初のキータアドバイス、これは32MB版だ…本当にこれ32MBだろうか？
##壊れてもいいや！
そんな事はないだろうが、万が一にも復帰不能になったらその時はその時って覚悟でえいっ！
##感動のフィナーレ
![Screenshot at 2019-07-30 14-32-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185494/66c458c9-d785-60fd-9d52-35f46f0e1778.png)
感無量である。
この後はArduino化して、少しソース(スケッチだっけ？)書いてみようと思います。
#謝辞
各所各所に参考のリンクをした。
それだけいろいろな情報に助けられた。
毎回本当にに感謝にたえない。

有難う

先人の知恵なくば行き着く所を見失うだろう。
TextMeshProのMaterial Presetに目的のMaterialが表示されない時の対処法

# 問題

TextMeshProのMaterial Presetに目的のMaterialが表示されない。

# 解決法

Materialの名前を`LiberationSans`から始まる名前にする。

少なくともこの方法で問題は解決しますが、この問題を引き起こしている原因が何なのかが理解できていないので、もっと根本的な解決法があるかもしれません。

# 例

試しにMaterial名を`Test`としてみます。
<img width="374" alt="スクリーンショット 2019-07-30 午後2.25.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/c4854420-6e6d-bfcc-c29b-1cd0c62bec04.png">

Material Presetを見ると、
<img width="411" alt="スクリーンショット 2019-07-30 午後2.25.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/e9b31bb6-77b4-9fd6-bd56-d205e84bc7eb.png">

このように`Test`という項目は表示されません。

次にMaterial名を`LiberationSans_Test`とします。

<img width="324" alt="スクリーンショット 2019-07-30 午後2.30.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/4937a0fb-191c-7701-4f8b-01700cfe1997.png">

するとこのように`LiberationSans_Test`が表示されます。

<img width="409" alt="スクリーンショット 2019-07-30 午後2.32.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/61145d8c-859f-8198-18f9-dd0ed987724b.png">

ちなみにMaterial名を`LiberationSans_Test`ではなく`LiberationSan_Test`とした場合(SansではなくSan)を見てみましょう。

<img width="318" alt="スクリーンショット 2019-07-30 午後2.35.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/58050667-67a0-29f9-ee22-81a157da6bfb.png">

この場合はMaterial Presetには`LiberationSan_Test`の項目は表示されません。

<img width="407" alt="スクリーンショット 2019-07-30 午後2.36.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/f36ca19d-a703-e886-1249-e5d9531af060.png">

つまりMaterial名は正確に`LiberationSans`から始める必要がある様です。
【Webエンジニア目指している方向け】HTML, CSS, JavaScriptが学べる解説動画129本(14時間超え)をまとめました！

この2週間で撮ってきたHTML, CSS, JavaScript(基本文法, フロントエンド, バックエンド)の解説動画全てを以下の記事にまとめました^^

https://tsuyopon.xyz/learning-contents/web-dev-movie-list/


# 動画本数


動画リスト数と解説動画本数は以下のとおりです。

- 動画リスト : **21本**
- 解説動画本数 : **129本**
- 解説動画の合計時間 : **14時間20分45秒**

一般公開している動画なので誰でも無料で観れます！
Webエンジニアを目指している方、参考にどうぞ！

https://tsuyopon.xyz/learning-contents/web-dev-movie-list/
Raspberry Pi上でbundle installをして無理だった話

#なぜRaspberry Piでrails？
家のPCがSurface Proなのだが、Surface ProはVirtual Boxが入らないので仮想環境でLinuxを動かせず、デュアルブートをするほどストレージに空き領域もないため仕方なくRaspberry Piで環境を構築したのである。

#発生したエラー
Gemfileに「gem install bcrypt」を追加し、
`>> bundle install`
を実行したとき

```Fetching bcrypt 3.1.13
Installing bcrypt 3.1.13 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
・
・
・
・
An error occurred while installing bcrypt (3.1.13), and Bundler cannot continue.
Make sure that `gem install bcrypt -v '3.1.13' --source 'https://rubygems.org/'` succeeds before
bundling.
```

となった。
エラーメッセージの通りに
```>> gem install bcrypt -v '3.1.13' --source 'https://rubygems.org/'```
を実行する
すると、、、

```Building native extensions. This could take a while...
ERROR:  Error installing bcrypt:
        ERROR: Failed to build gem native extension.
・
・
・
・
make "DESTDIR="
compiling bcrypt_ext.c
compiling crypt_blowfish.c
gcc  -D__SKIP_GNU -I/home/pi/.rbenv/versions/2.5.3/include  -D_FILE_OFFSET_BITS=64   -c -o x86.o x86.S
x86.S: Assembler messages:
x86.S:202: Error: junk at end of line, first unrecognized character is `,'
<builtin>: recipe for target 'x86.o' failed
make: *** [x86.o] Error 1
```
#原因
エラーを見てわかる人もいるかと思うが、どうやらgem installで落としてくるパッケージにはrubyで書かれておらずx86用のCPUのマシンで動作するc言語で書かれたネイティブコードがあるらしい。
今回は「bcrypt」がそれに該当、、、

さすがにこれをRaspberry PiのARM用にクロスコンパイルするパワーが無く断念

#解決策
本来はRaspberry Piの上で開発などする人がいないかと思うが、、、同じような人がいたら

解決策としては
①自分でRaspberry PiのARM用にクロスコンパイルする
②別の環境でinstallする（他のx86が載っているPC環境かクラウド環境）

組み込みエンジニアの見解としては断然②のほうが楽だと思われます笑
①でできた人がいたらそのファイルくださいね笑
疲れたエンジニアに聞いて欲しい昔のBUMP OF CHICKENの名曲で打線組んだ

#はじめに

BUMP OF CHICKENをご存知でありますでしょうか。
彼らの描く世界観、歌詞は我々エンジニアにとても響くものが多い。
音楽は恋愛について触れられることが多いが、BUMP OF CHICKENの歌詞は仕事や夢や自分と向き合うものが多く、また、失敗や迷いなどをテーマにすることが多い。

今回は、疲れたエンジニアを癒すために筆者の世代である以下のアルバム曲にて打線を組んだみた。

1999年 - 2000年:『FLAME VEIN』『THE LIVING DEAD』
2000年 - 2002年:『jupiter』
2002年 - 2004年:『ユグドラシル』
2005年 - 2007年:『orbital period』
1999年 - 2008年:『present from you』

# 1中　グングニル(from THE LIVING DEAD)

挑戦のうた。
新しいことをやろうとする時の周囲の批判を跳ねのけて、自分が信じた地図と武器をもって航海にでる。

歌詞：★★★★☆
曲調：★★★★★

>誰もが口々に彼を罵った
「でたらめの地図に目が眩んでいる」って
容易く人一人を値踏みしやがって
世界の神ですら彼を笑う権利なんてもたないのに。 



#2右　ホリデイ(from　present from you)

失敗したときに聴くのうた。
うまくいかないことが続き仕事にいきたくない。今日はホリデイと決めつけて休もうとするが、、、。
個人的に、共感度MAXのうた。

歌詞：★★★★★
曲調：★★★★☆

>君にもらった花、3日ともたず枯らしたよ
詳しい人に聞けば水のあげすぎらしい
うまくいかない日々が繋がっていっそ止めたくなって
それも出来ない

#3左　バトルクライ(from FLAME VEIN)

やる気をだす時に聴くうた。
まだやれると嘘をついて自分を追い込む、過酷なプロジェクトを担当したときや風呂敷を広げた企画を行うときの心境にぴったし。

歌詞：★★★★★
曲調：★★★★★

>自分にひとつ嘘をついた「まだ頑張れる」って嘘をついた
ところが嘘は本当になった「まだ頑張れる」って唄ってた
ずっとそうやってここまで来た

#4一　才悩人応援歌(from orbital period)

自信を失ったときに聴くうた
優秀な周囲のエンジニアどんどん追い抜かれる。新しい技術に追いつけない。
全盛期の自分から見劣りを実感したときに聴くと共感度UP。

歌詞：★★★★★
曲調：★★★★★

>隣人は立派将来有望才能人
そんな奴がさぁ「頑張れ」ってさぁ
怠けて見えたかい
そう聞いたら頷くかい？
死にたくなるよ。

#5三　夢の飼い主(from　present from you)

初心に戻る時に聴くうた。
誰しもが持つ夢をペットに見立てて唄ったうた。最初は「夢」を可愛がるが、、、、
エンジニアがお金や自分の事だけを考え始めてしまったときに聴いて欲しい。

歌詞：★★★★★
曲調：★★★★☆

>くだらなかった彼女の日々は大きく変わった
餌を与えて散歩にも行ってたくさん触った
首輪をまいて　服まで着せて　紐で繋いだ
～
既に名前とはかけ離れた姿にされていた
自分の色と動き方を忘れてしまった
彼女もいつかつけた名前を忘れてしまった。

#6二　ロストマン(from ユグドラシル)

昔の仲間を思い出す時に聴くうた。
退職やプロジェクトから離れた時に聴くと共感度UP

歌詞：★★★★☆
曲調：★★★★☆

>これが僕の望んだ世界だ　そして今も歩き続ける
不器用な旅路の果てに正しさを祈りながら
時間はあの日から止まったままなんだ　遠ざかった消えた背中
ああ、ロストマン気づいたろう

#7遊　ノーヒットノーラン(from FLAME VEIN)

自分を奮い立たせる時に聴くうた。
周囲の期待に応えなきゃいけない、本当の自分はとてもみんなの期待に応える器じゃない
そんな風に感じたときに聴くと共感度UP

歌詞：★★★★★
曲調：★★★★☆

>好きな時に好きなことをして時々やすみ
また適当に歩き出していた
それがいつの間にか誰かに何か求められて
だれにも甘えられない
～
この手よ今は震えないで　この足よ　ちゃんとぼくを支えて

#8捕　ベストピクチャー(from THE LIVING DEAD)

大事なものを見失った時に聴くうた。
最初はキラキラしたものを見ていたのに、それを手にした途端、何かに追われ恐れる。
成功を収めたエンジニアに聞いて欲しい一曲。

歌詞：★★★★☆
曲調：★★★★★

>宝物の電気スタンド・筆・机
空腹を忘れて　ひたすら絵を描く
こんな家に住み　こんな暮らしがしたいなんてことを
キャンパスに塗りたくる
～
宝物の地位と名誉と満足感
なくすことを恐れてひたすら絵を描く

#9投　プラネタリウム(from orbital period)

夢がかなわない時に聴くうた。
叶わない夢をなんとか手にしたくて、もがくうた。
どうしようもない現実、決して届かない何かを痛感したときに聴くことがおすすめ。

歌詞：★★★★☆
曲調：★★★★★

>やめておけば良かった当たり前だけど
本当に届いてしまった
この星は君じゃない僕の夢
本当に届くわけない光
でも消えてくれない光

#控　ラフメイカー(from　present from you)

悲しい時に聴くうた。
ラフメイカーが助けてくれる。仕事がつらいときに家族や友人が心の支えになってくれることを思い出させてくれるうた。

歌詞：★★★★☆
曲調：★★★★★

>「あんたに笑顔をもってきた　寒いからいれてくれ」
ラフメイカー？冗談じゃない！
そんなもの呼んだ覚えはない
構わず消えてくれ　そこに居たら泣けないだろう

#まとめ

いかがでしたでしょうか。
改めて聞いてみると本当に泣けてくるような情景が思い出されます。

その他にも「グロリアスレボリューション」「ギルド」「ベンチとコーヒー」など
おすすめの曲はありまくりますが、今回は厳選の１０曲とさせて頂きました。

それではご査収ください～(^－^)
C++ Builder 10.2 Tokyo >  [ilink32 エラー] Error: 未解決の外部シンボル '__fastcall Vcl::Filectrl::SelectDirectory(System::UnicodeString, System::WideString, System::UnicodeString&, ...)' が... > 対処: #include <Vcl.FileCtrl.hpp>にする

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3 
Windows 10 v1903 
```

### 参考

- [SelectDirectory関数でディレクトリ選択ダイアログを表示する](https://www.gesource.jp/programming/bcb/47.html)
    - 山本隆様

情報感謝です。

### 実装とエラー

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <FileCtrl.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	//

	String dir;

	if (SelectDirectory(L"フォルダを指定して下さい。", L"", dir))
	{
	  //フォルダを選択して[OK]ボタンが押されたとき
	  MessageDlg(dir + L"が選択されました。", mtInformation, TMsgDlgButtons() << mbOK, 0);
	}
}
//---------------------------------------------------------------------------
```

ビルドすると、下記のエラーとなる。

> [ilink32 エラー] Error: 未解決の外部シンボル '__fastcall Vcl::Filectrl::SelectDirectory(System::UnicodeString, System::WideString, System::UnicodeString&, System::Set<Vcl::Filectrl::TSelectDirExtOpt, 0, 5>, Vcl::Controls::TWinControl *)' が XXX\UNIT1.OBJ から参照されています


### 対処

`#include <FileCtrl.hpp>`
を
`#include <Vcl.FileCtrl.hpp>`
に変更する。

- [C++ Builder Tokyo > ProcessLogger > 指定の.exeファイルのプロセスIDをロギングする v0.1 (XE4からの移行対応)](https://qiita.com/7of9/items/1d062ab3059611c04e1b)

XE4から10.2 Tokyoへの移行などで同様のエラーが発生するようになる。

Web上の情報でIDEのバージョンが古い場合、同様の対処をすると解決するかもしれない。
GO言語で簡単なチャット機能の作成

##GO言語によるWEBアプリケーション開発
という、上記の書籍を見ながら２章まで進めると簡易的なチャットアプリが作成出来ました。
（とても良い本です！）

まず、１章まで進めると以下のようにさらに簡易的なチャットアプリを作成出来ます。

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378334/0b7a43a4-2ab4-0044-b097-863d99e18162.gif)

１章では正しいビルドの実行方法や、
並行処理の便利さや
ユニットテストの方法などなど１章だけでも私には十分すぎる内容でした！
１章でもエラーが出て苦戦したり、小一時間悶々とすることも多々ありました・・。
エラー内容としては単純な凡ミスばかりで気付いた時の爽快感を味わいつつ、
２章を進めて行くと、
先ほどのメッセージに加えて送信者の名前も表示されるようになり
他のユーザーと会話することも可能になります。

![スクリーンショット 2019-07-30 13.29.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378334/cd5c8327-006a-aac7-95a4-62f5f0140221.png)
＊一つが本名になるので青文字で消してます。


ユーザー名に関しては以下のように認証機能を追加して、
選択できるようにしてあります。

![サインイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378334/42bf6500-002d-87b8-899b-10a3fc10951d.png)

今回はGoogleアカウントを使用して、
先ほどの画像のようにテスト太郎アカウントと私（青文字）で認証して
メッセージの送受信が行えるようになりました。

複数のタブを開き（今回は２つでしたが）
**localhost:8080/login**　ページでサインインするユーザを選べば
何人とでも複数会話が実行が可能になります。


３章ではプロフィール画像追加について学んでいけるので、
１章・２章で躓いた部分、不明点などを復習してから
次に進んでいきたいと思います！
PHPで生のリクエストボディーを読む

PHPではリクエストからパラメータを取得する場合`$_GET`や`$_POST`が用意されていますが、これは`Content-Type`が`application/x-www-form-urlencoded`の場合の話です。

`JSON-RPC`のように`Content-Type`が`application/json`の場合にパラメーターを取得するにはPHPに頼らずリクエストボディーのJSONを自力でパースする必要があります。

# stream を使う

リクエストボディーを取得するにはWEBサーバとして動かす場合は `php://input` を使います。

```php
var_dump(file_get_contents('php://input'));
```

下記を短く書いています。

```php
$stream = fopen('php://input');
$data = stream_get_contents($stream);
fclose($stream);
var_dump($data);
```

## コード

リクエストボディーのJSONをパースしてダンプするスクリプトを `test.php` としてファイルにします。

```php:test.php
<?php

var_dump(json_decode(file_get_contents('php://input'), true));
```

## 動作確認

PHPのビルトインサーバでホストし、curlでtest.phpを呼び出します。

```console
$ php -S localhost:8080 # test.php の存在するディレクトリで実行する
$ curl -X POST \
    -d '{"hello":"world", "こんにちは":"世界"}' \
    -H "Content-Type: application/json" \
    http://localhost:8080/test.php

array(2) {
  ["hello"]=>
  string(5) "world"
  ["こんにちは"]=>
  string(6) "世界"
}
```

例では`application/json`が送られてくる場合を仮定しましたが、`application/x-www-form-urlencoded`でも、パースされていない生データを取得することができます。 (もちろんjson_decodeしてはいけません)

# ヒント

`php://input` と `php://stdin` の違いがよくわかっていなくて、 `php://stdin` を使用すると、ブロッキングしてしまってWEBサーバがレスポンスを返さなくなります。CLIだとエンターを押すまでブロッキングするからでしょうかね。

アプリケーションサーバとして使う場合は`php://input`を使いましょう。そしてブロッキングしてるWEBサーバは再起動しましょう。

CLIの場合は`STDIN`定数や`php://stdin` を使うのだと思います。

※ `STDIN`は`fopen('php://stdin')`と等価です

# $HTTP_RAW_POST_DATA 変数を使う

PHP7 より前は `$HTTP_RAW_POST_DATA` に生のPOSTデータがセットされていましたが、PHP7以降では使えません。
Laravel 5.8 primaryKeyをint(AUTO_INCREMENT)からUUIDに変える

## 外部ライブラリを使う
[webpatser/laravel-uuid](https://github.com/webpatser/laravel-uuid)

```bash
$ composer require webpatser/laravel-uuid
```

## Str::orderedUuidを使う(Laravel 5.6+)
Laravelのヘルパ関数だが外部ライブラリ`moontoast/math`が必要

```bash
$ composer require moontoast/math
```

### idの型を変える
こちらを参考に
[[Laravel] テーブルのプライマリキーにuuidを使う](https://xzxzyzyz.com/2018/02/laravel-primary-uuid/)

```php:databases/migrations/XXX_users_table.php

- $table->bigIncrements('id');
+ $table->uuid('id'); // string('id', 36)と同じ
+ $table->primary('id');
```

###モデルを修正
プライマリキーの名称を変える場合は、プロパティ`$primaryKey`で設定
型がデフォルトでintかつautoincrementのため、以下の定義を追加

```php:app/User.php
protected $primaryKey = 'hoge_id' // 任意設定
public $incrementing = false;  // AUTO_INCREMENT不可
protected $keyType = 'string'; // int -> string
```

レコード作成時にidを自動生成する処理を追加する。useを忘れないように。

```php:app/User.php

// webpatserの場合
use Illuminate\Database\Eloquent\Model;
use Webpatser\Uuid\Uuid;
// Str::orderedUuidの場合
use Illuminate\Support\Str;
(略)
    protected static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
// webpatserの場合
            $model->{$model->getKeyName()} = (string) Uuid::generate()->string;
// Str::orderedUuidの場合
            $model->{$model->getKeyName()} = (string) Str::orderedUuid();
        });
    }
```

### Seeder経由で追加する場合
そのままではINSERTで失敗するのでidも自前で定義する

```php:databases/seeders/UserTableSeeder.php
        DB::table('users')->insert([
+            'id' => (string) Str::orderedUuid(),
            'name' => 'admin',
        ]);
```
Docker のコマンド忘れやすいため

## Docker コンテナを実行する。
```
docker container run イメージ名:タグ名
docker container run -d -p 9000:8080 example/echo:latest
```
1. -i ：起動時に標準入力をつなげっぱなし。
2. -t ：疑似端末を有効にする
3. --rm ：終了時コンテナ破棄
4. -d ：バックグラウンド実行
5. -v ：ホストトコンテナでディレクトリ共有
6. -p ：ホスト側ポート（省略可）：コンテナ側ポート

## docker の一覧表示用
```
docker container ls -q                                    // IDのみ抽出
docker container ls --fileter "name"                      // 名前でフィルタ
docker container ls --fileter "ancestor=example/echo"     // イメージ抽出
docker container ls -a                                    // 終了したコンテナを取得
```

## 削除系
```
docker container rm コンテナIDorコンテナ名                // コンテナの破棄
docker container rm -f コンテナIDorコンテナ名             // 実行中のコンテナも削除可
docker container prune                                    // コンテナを一括削除
docker image prune                                        // イメージを一括削除
docker system prune                                       // 利用されていないすべてのリソースを削除
docker images -aq | xargs docker rmi　                   // prune で削除されてない場合は一個ずつ消す。
docker rmi -f イメージID                                 // prune で削除されてない場合は一個ずつ消す。   

```

##docker image コマンド
```
docker image ls -a                                                         // Docker のイメージ一覧
docker image pull イメージ名:タグ名                                         // Dockerのイメージを取得する。
docker image build -t イメージ名：タグ名  Dockerfile配置ディレクトリのパス
docker image build -t example/echo:latest .                                 // docker イメージをbuildする。
docker image tag example/echo:latest example/echo:0.1.0                     // docker イメージにタグをつける。
```

## Docker のコンテナへのログイン・実行
```
docker container exec -it コンテナIDorコンテナ名 sh       // 実行中コンテナでコマンド実行(shコマンド)
winpty docker exec -it コンテナID or コンテナ名 sh       // the input device is not a TTY.といったエラーが出る場合。


## その他
```
docker container restart コンテナIDorコンテナ名           // コンテナの再起動
docker container stop コンテナ名                          // コンテナの停止
docker container logs -f コンテナIDorコンテナ名           // 標準出力を取得し続ける( tail -f 的な)
docker container cp コンテナ名orコンテナID:ファイル名 .   // コンテナ上のファイルをホストにコピー
docker container cp ホストファイル名 コンテナ名:パス      // ホスト上のファイルをコンテナにコピー
docker container stats                                    // 利用状況の取得(top 的な)
```
【Vue.js】v-forの中で外部リンクと内部リンクを混ぜて表示する方法

## 本記事の内容
v-forを使って要素を繰り返して表示するのはわかったけど、その中身に外部リンクと内部リンクが混ざっている時の実装で少し悩んだので、同じような悩みを抱えている人の助けになる記事です。

## 前提
・Vue.jsとNuxt.jsを使ったアプリケーションでの実装
・Vuetifyを利用

です。

## 実装

大元のvueファイルの内容（一部抜粋）

```vue

（色々省略）

<v-btn
 v-for="link in links"
 :key="link"
 color="white"
 flat
 round
 :to="link.url"
>
 {{ link.name }}
</v-btn>

（色々省略）

<script>
  export default {
    data: () => ({
      links: [
        { url: 'hoge', name: '外部リンクへ' },
        { url: 'privacy-policy', name: 'プライバシーポリシー'},
        { url: 'service-policy', name: '利用規約'},
        { url: 'contact', name: 'お問い合わせ'},
        { url: 'for_user', name: '出品したい方'},
      ]
    })
  }
</script>

```
上記の内容では。:to="それぞれのurl"が入ってくる形になっていて、下の4つについてはそれで問題なかったのですが、hogeの部分を https://google.com のような外部リンクに飛ばしたかったので、ここの部分がちゃんと動作するように変更することにしました。

手順としては下記になります。

・もともとあった:to="link.url"を削除
・クリックした時にurlを判定して、特定のものについては外部リンクに遷移するように変更


この手順で実装したものが下記になります。

変更後のvueファイルの内容（一部抜粋）

```vue

（色々省略）
<v-btn
 v-for="link in links"
 :key="link"
 color="white"
 flat
 round
 @click="getCreateUrl(link.url)"
>
（色々省略）
<script>
  export default {
    data: () => ({
      links: [
        { url: 'hoge', name: '外部リンクへ' },
        { url: 'privacy-policy', name: 'プライバシーポリシー'},
        { url: 'service-policy', name: '利用規約'},
        { url: 'contact', name: 'お問い合わせ'},
        { url: 'for_user', name: '出品したい方'},
      ]
    }),
    methods: {
      getCreateUrl(url) {
        if(url==='hoge') {
          location.href="https://google.com/"
        } else {
          location.href=`${url}`
        }
      }
    }
  }
</script>
```

これで、無事に動いてくれました。

※他にいいやり方があったらご指摘ください。
Google News Rss(API)

  

# 概要
言わずと知れたGoogle Newsですが、URLをいじれば簡単に[RSS](https://news.google.com/rss)を取得することができます。 
ドキュメントはありませんが、通常の検索エンジンで使えるテクニックを駆使すればかなり遊べます。

## RSSの仕様
一つの記事について以下のような情報が返ってきます。

```
<item>
<title>
8人の孫持つポール・マッカートニーが絵本執筆、来年発売へ - ロイター (Reuters Japan)
</title>
<link>https://jp.reuters.com/article/paul-idJPKCN1M80CA</link>
<guid isPermaLink="false">
CAIiEGn2PujAqMvf_XBJneUMkFwqGQgEKhAIACoHCAowroX-CjDCyvYCMJrd3AU
</guid>
<pubDate>Thu, 27 Sep 2018 07:00:00 GMT</pubDate>
<description>
<a href="https://jp.reuters.com/article/paul-idJPKCN1M80CA" target="_blank">8人の孫持つポール・マッカートニーが絵本執筆、来年発売へ</a>&nbsp;&nbsp;<font color="#6f6f6f">ロイター (Reuters Japan)</font><p>英歌手のポール・マッカートニーさん（７６）が子供向けの絵本を書き、来年出版されることになった。</p>
</description>
<source url="https://jp.reuters.com">ロイター (Reuters Japan)</source>  
</item>
```
# クックブック
## Topic検索
指定したトピックに関するヘッドラインを返す

```
https://news.google.com/news/rss/headlines/section/topic/{TOPIC_NAME}
```

**TOPIC_NAMEに指定できる単語は以下の通り**

- WORLD
- NATION
- BUSINESS
- TECHNOLOGY
- ENTERTAINMENT
- SPORTS
- SCIENCE
- HEALTH

**これ以外の単語を指定するとエラーになります。**

国際ニュースが欲しい場合は以下のようにします。

https://news.google.com/news/rss/headlines/section/topic/WORLD


## 地理検索
```
https://news.google.com/news/rss/headlines/section/geo/{geo}
```

国や都市名をアルファベットで入れると、その地域に関するニュースを検索できます。
geoに指定できる単語はとりあえず国名や都市名はいけるみたいですが･･･詳しくはわかっていない模様。  
queryで指定して検索する場合は、関連する記事ならなんでも返って来ますが、こちらは硬い記事が多く返ってきます。

https://news.google.com/news/rss/headlines/section/geo/Vladivostok
上記のURLではウラジオストクについての記事が返ってきます。

___
## クエリーを使った検索


### query検索
これが一般的な検索方法ではないでしょうか。

```
https://news.google.com/rss/search?q={query}
```
指定したqueryに関連する記事が返ってきます。


### 期間を指定した検索
指定した期間の記事を検索したい場合、ついこの間実装されたafter、 before フィルターをqueryに追加します。
ただし、返ってくるpubDateは、**GMT表記**で日本時間とは9時間分の時差がありますのでご注意。  

```
before:2019-8-30 (or before:2019/8/30)
after:2019-7-29 (or after:2019/7/30)
```

下記のURLで、2019/8/30以前2019/7/29以降の記事が取得できます.  

https://news.google.com/rss/search?q=after:2019/7/29%20before:2019/8/30


### 特定のメディアの記事のみ検索

~~queryにsite:{site_domain}を付け足すことで、指定したメディアの記事のみを取得できます.~~
~~ここで指定するsite_domainはitemの中にあるsourceタグのurl属性を指定してあげればオッケーです.~~

~~https://news.google.com/rss/search?q=サッカ－%20site:https://www.sankei.com
上記では産経のサッカーについての記事が返ってきます.~~
**※ 2019-12-03現在、google newsのクエリー検索におけるsiteフィルターは効かなくなっているようです**  
通常の検索では普通に効くようですので、Google Newsにおける検索のみ制限がかけられているのだと思われます。

とはいっても上に政策あれば下に政策あり、代わりにinurlフィルターを利用しましょう。  

https://news.google.com/rss/search?q=サッカ－%20inurl:https://www.sankei.com

または、

https://news.google.com/rss/search?q=サッカ－%20inurl:sankei.com

これで産経のサッカーについての記事が返ってきます.

## 言語の指定

hl、ceid、glパラメーターで言語の指定ができます。
主な言語とパラメーターの対応は以下のようになっています。

|言語|Parameter|
|---|---|
|日本語| "hl=ja&gl=JP&ceid=JP:ja"|
|US英語| "hl=en-US&gl=US&ceid=US:en"|
|イギリス英語| "hl=en-GB&gl=GB&ceid=GB:en"|
|中国語| "hl=zh-CN&gl=CN&ceid=CN:zh-Hans"|
|ドイツ語| "hl=de&gl=DE&ceid=DE:de"|
|スペイン語| "hl=es-419&gl=US&ceid=US:es-419"|
|アラビア語| "hl=ar&gl=EG&ceid=EG:ar"|



https://news.google.com/rss/search?q=soccer&hl=en-US&gl=US&ceid=US:en
サッカーについてのアメリカ英語の記事が返ってきます.



## 参考
- https://rsscircus.com/url-format-for-google-news-rss-feed/
AWSのセキュリティエンジニアの認定試験

AWS認定セキュリティ専門知識の試験を受けようと思うので、その概要メモ

## 概要
>AWS プラットフォームのセキュリティ強化における技術的な専門知識を認定します。経験豊かなセキュリティ担当者が対象です。

![](https://d1.awsstatic.com/training-and-certification/Learning_Paths/path_security-specialty.5361d2b59d99f940b10d1fb30e20780943177182.png)


![Screenshot_2019-07-30 Learning Path - Specialty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166931/f65434c4-7111-3a24-07f4-b8effdc7aea8.png)


オフィシャルな情報は下記にまとまっている。

[AWS 認定セキュリティ – 専門知識 | AWS](https://aws.amazon.com/jp/certification/certified-security-specialty/)
[Learning Path - Specialty](https://aws.amazon.com/jp/training/paths-specialty/)
[AWS Security Documentation](https://docs.aws.amazon.com/security/?sc_channel=sm&sc_campaign=Docs&sc_publisher=TWITTER&sc_country=Global&sc_geo=GLOBAL&sc_outcome=awareness&trk=Docs_TWITTER&sc_content=Docs&linkId=70499613)
[AWS Security Blog](https://aws.amazon.com/jp/blogs/security/page/2/)



## 必要知識
- AWS ワークロードの保護に関する最低 2 年間の実践経験
- AWS でのワークロードのセキュリティコントロール
- IT セキュリティ分野でセキュリティソリューションの設計と実装に従事した最低 5 年間の経験


## 試験の注意点


- 選択式（択一回答・複数回答）
- 未回答の問題は不正解扱い
- 統計調査用の問題が混じっている（採点されないし、試験の合否に影響しない）
- 750/1000点で合格


## 試験内容

- インシデント対応
    - アクセスキー漏洩、インスタンス乗っ取りなど
    - インシデント対応計画に必要なAWSサービス
    - 自動アラートなど
- ログと監視
    - 設計、実装、トラブルシューティング
        - おそらくCloudTrail/CloudWatch/WAF/Configなどのログが出る
        - S3でのログの保管の仕方、分析の仕方なども出そう？
- インフラストラクチャのセキュリティ
    - AWSのエッジセキュリティ（よくわからない）
    - セキュアなネットワークインフラストラクチャ
        - VPCのアクセス制御など
    - ホストベースのセキュリティ
- IDおよびアクセス管理
    - IAM全般
- データ保護
    - キーの管理
    - KMS全般
    - その他S3,HSMなども出るか？



## 出そうなサービス

- CloudWatch
- CloudTrail
- Config
- Cognito
- KMS
- Lambda
- APIGateway
- IAM
- VPC全般
- WAF


下記は比較的新しいサービスなので出題されるかどうか不明なもの

- GuardDuty
- Macie
- SecurityHub
- ControllTower


## 気をつけること
- 各サービス間の連携を図で描けるように勉強する
- サーバレスのセキュリティを重点的に
    - S3でコンテンツを配信していて、サーバレスでどうやって認証するか？
- ”コストを考慮する”と言う条件が出てきそうなので、各サービスの料金も見ておく
- Blogを眺め読みする
Betternet Unlimited Free VPN Proxy:外国のipアドレスをchromeで簡単にテストできる拡張機能

<img width="1048" alt="スクリーンショット 2019-07-30 13.04.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163786/b4a1614c-88f4-0961-8a3d-b1760c791a6e.png">

[Betternet Unlimited Free VPN Proxy](https://chrome.google.com/webstore/detail/betternet-unlimited-free/gjknjjomckknofjidppipffbpoekiipm?hl=ja)はChromeで簡単にIPアドレスを偽造することができるプラグインです。

海外から運営しているサイトを見た時にエラーがでないかチェックする時に利用しました。

## 海外からアクセスできるか確認する

Xserverではwordpressに簡単にセキュリティーを設定できる機能があります。
<img width="737" alt="スクリーンショット 2019-07-30 13.03.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163786/01e05acd-1d64-fe47-ea6b-3785a4e73fff.png">

ここがONになっていると海外からのアクセスができないようになります。
※お使いのサーバーに海外からのアクセスを拒否する設定がないか確認してください。

## ipを偽造して海外から見た時にどう見えるか確認する
[Betternet Unlimited Free VPN Proxy](https://chrome.google.com/webstore/detail/betternet-unlimited-free/gjknjjomckknofjidppipffbpoekiipm?hl=ja)をダウンロードしてChromeに追加してください。

追加したら右上にアイコンが表示されるのでクリックしてください。
<img width="261" alt="スクリーンショット 2019-07-30 13.07.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163786/db63ffe6-fde3-fcb7-f61d-adb6f8cdb436.png">
このような表示がされます。

Select Virtual Locationをクリックしたらデフォルトでは
<img width="261" alt="スクリーンショット 2019-07-30 13.07.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163786/70491bfd-0fac-266d-9398-bb0be429512d.png">
- ロシア
- カナダ
- ドイツ
- オランダ
が設定できます。

好きな国を選択したら
「CONNECT」ボタンを押してください。
<img width="261" alt="スクリーンショット 2019-07-30 13.14.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163786/8c4954e5-b8b5-7cbc-4d2d-7d9a712ab003.png">

これで選択した国のipアドレスを偽造して海外からみた状況を再現できます。
※偽造ipアドレスをかけているときはサイトが少し重たくなります。

戻したいときは「DISCONNECT」ボタンを押せば戻すことができます。

macやwindows、アンドロイド、iosのにもアプリがあるようですし、
プレミアプランではもっといろんな国も使えるようです。
以上、偽造したipアドレスでサイトを確認したい時に利用できる便利な拡張機能でした。
curlコマンドでSSLクライアント認証を行うには

##概要

SSLクライアント証明書(p12ファイル)からPEMファイル(鍵付き証明書)を作成し、curlコマンドでSSLクライアント認証を行う。


##実行環境

CentOS Linux release 7.5.1804 (Core)


##手順

#### openssl インストール

opensslコマンドでPEMファイルを生成するので、opensslコマンドがない場合は下記手順を実行してください。

```
$ curl -O https://www.openssl.org/source/openssl-1.0.2n.tar.gz .
$ tar xvzf openssl-1.0.2n.tar.gz
$ cd openssl-1.0.2n
$ ./config -fPIC shared
$ make
$ make install
$ ln -sf /usr/local/ssl/bin/openssl /usr/local/bin/openssl
```


#### PEMファイル作成

opensslコマンドで鍵付き証明書を作成する。

```
$ openssl pkcs12 -in file.p12 -out cert.pem -nodes -clcerts
```

#### curlコマンドでSSLクライアント認証を行う

PEFファイルのパスは、その階層にいても相対パスまたは絶対パスで書く。

```
$ curl -E ./cert.pem URL
```

Authorization, Bearer トークンを使ったAPIがあった場合などは下記のようにヘッダにトークンを指定すれば認証できる。

```
$ curl -H "Authorization: xxxxxxxx" -E ./cert.pem URL
```

以上！
gradleでsrc/main/javaにresourceファイルを置きたい

# 背景

gradleでは

- javaファイルは `src/java` に
- それ以外のファイルは `src/resources` に

配置する構成が用意されていますが、java ファイルと関連が強いファイルを resources 側に置くと関連がわかりづらくなるという課題があります。
そういった、javaファイルのすぐ隣に関連するリソースファイルを配置したいというニーズにお答えします。
(例えば、java と fxml を隣に並べたいとか)

# 解法

build.gradle への記載はこれだけです。

```build.gradle
// java-libraryなどのpluginが適用されているとして

sourceSets {
    main {
        resources {
            srcDir "src/main/java"
        }
    }
}
```

## 補足

- ぱっと見では `src/main/resources` を上書きしてしまっているように思えますが、 `srcDir` は[追記](https://docs.gradle.org/4.4/dsl/org.gradle.api.file.SourceDirectorySet.html#org.gradle.api.file.SourceDirectorySet:srcDir(java.lang.Object))なので、デフォルトの `src/main/resources` は残ります。
  - この記述では、main resourcesに `src/main/resources` と `src/main/java` の2つを指定していることになります。
- \*.javaファイルがresources扱いされそうに見えますが、 \*.javaは [resourcesからexcludeされている](https://github.com/gradle/gradle/blob/v4.4.0/subprojects/plugins/src/main/java/org/gradle/api/internal/tasks/DefaultSourceSet.java#L64) ので、`src/main/java`内の\*.javaがリソースとして扱われることはありません。


gradle 4.4 で動作確認しています。
Bitcoin CoreでTestnetに接続する

#概要
Bitcoin Core でお手軽にTestnetに繋げる方法

#手順
1. Bitcoin Coreをダウンロード
2. Bitcoin Coreを起動
3. すぐに止める
4. bitcoin.confを編集する
5. Bitcoin Coreを起動

##1. Bitcoin Coreをダウンロード
[こちら](https://bitcoin.org/ja/download)からダウンロード
<img width="617" alt="スクリーンショット 2019-07-30 12.58.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/32fef59c-3f8e-557f-c8c7-21ae94141658.png">

##2. Bitcoin Coreを起動
<img width="482" alt="スクリーンショット 2019-07-30 13.03.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/017f7540-ce67-1b48-7804-641720013dd2.png">

##3. すぐに止める
すぐに停止する

##4. bitcoin.confを編集する
下記の場所にbitcoin.confが作成されているので下記のように編集する

- MacOS X : ~/Library/Application Support/Bitcoin/
- Linux   : ~/.bitcoin/
- Windows : C:\Users\Username\Appdata\Roaming\Bitcoin

```conf:bitcoin.conf
#testnet(3代目)を使う
testnet=3

#トランザクションIDを参照可能にする
txindex=1

#JSON RPCサーバーとして起動する
server=1

#RESTインターフェイスを有効にする
rest=1

#JSON RPCのためのユーザ名とパスワード
rpcuser=name
rpcpassword=pass

#JSON RPCのポート番号
rpcport=18332
```

##5. Bitcoin Coreを起動
緑色になってtestnetと書かれていればOK！
<img width="482" alt="スクリーンショット 2019-07-30 13.04.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/d9f78752-8ba5-77c9-0037-223524a96981.png">

#Happy Hacking :sunglasses: !

#参考
Bitcoin Core Download : https://bitcoin.org/ja/download
【UNIXコマンド自分用メモ】基本とよく使うコマンド

# UNIXコマンド記述方法

## UNIX概要
文字入力によってコンピュータに命令を与えて操作するインターフェイスをCLI（Command Line Interface）、あるいはCUI（Character User Interface）などと呼び、「コマンド」とはコンピュータに指示する命令であり、CLI上で用いるプログラム／アプリケーションのことを指します。UNIXに由来するコマンドを「UNIXコマンド」などと呼称します。
現在ではGUIがコンピュータを操作する手法として主流ですが、ある操作の結果を別の操作に用いたり、自動的に複数の操作を行ったりする場合など、CLIの方が適している作業が多く存在する。

### UNIXコマンドとシェルコマンドの違い
シェルコマンドは「内部コマンド」や「組み込みコマンド」とも言われるものです。
通常、シェルは人が入力したコマンド名を解釈してプログラムを起動するが、
プログラムを起動することはせずシェル自身が処理を行うものもあり、それがシェルコマンドです。Unixコマンドは、シェルコマンドを含んだコマンド全般を表します。
  
## 基本的な記述方法
### ディレクトリの中身を表示（ls）する
ターミナルを起動すると通常ユーザのホームディレクトリ（~）にログインした状態になる。
今いるディレクトリ（カレントディレクトリ（.））の中に何が置かれているかを見るには ls コマンドを使用する（List Segments）。この時、ls コマンドに -F オプションをつけて実行すると、名前の最後に付く記号で属性を見分けることができる。

```
$ ls
$ ls -F
```

### ディレクトリを移動（cd）する
ディレクトリの移動（Change Directory）にはcdコマンドを使用する。
cd の引数に行きたいディレクトリを入力すれば移動できる。また、現在位置を確認するにはpwdコマンドを使用する。

```
$ pwd
/Users/user_name 

$ cd Documents

$ pwd
/Users/user_name/Documents
```
移動したいフォルダをドラッグすれば長いディレクトリの入力を省略できる。

## よく使うコマンド一覧
### mkdir    ディレクトリ作成。
$ mkdir dir_name
### cp    ファイルをコピーする。
$ cp original copy
### mv    ファイルを移動する（リネームも同様）。
$ mv from to
### rm    ファイルを削除する。
$ rm remove_file
### head   
$ head -n 10 file とすると file の先頭から10行目までを表示。
### cat
$ cat file で file の中身を全て表示。
### tail
$ tail -n 10 file とすると file の末尾10行を表示。
### chmod    ファイルのモードを変更する。
### fgrep    ファイル内検索コマンドのひとつ。
### man    コマンドのマニュアルを表示する。
$ man Command
manページから元の画面に戻りたいときは q
### which    コマンドがインストールされている場所を確認する。
$ which Command
### ps     実行中のプロセス一覧を表示するコマンド。
### kill     プロセスを終了、あるいはシグナルを送信するコマンド。
### exit      シェルを終了するコマンド。
## 予備知識
- スクリプトを中止するには Ctrl + C
- 入力の終了を知らせたいときは Ctrl + D
- シェルでは大文字小文字が区別される。
- 半角スペースには入力を区切るという意味。
- 文字列は ‘ か ” で囲む。
- ターミナルで Command + Tab で新しいタブが開く。

## あとがき
今回は頻繁に使用するUNIXコマンドを自分でわかるようメモがてらまとめてみました。
使ってみて新しい発見などがあったらまた修正していきたいと思います:walking:
あなたは守ってる？ロゴを使用する際の条件。

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているerika_zです。

プログラミングの学習を始めて約１ヶ月半が経ちました。
HTMLとCSSで作成していた、簡易的な逆求人サイトがおおよそ完成しました。
少し修正して、GitHubにあげようとしている段階です！


逆求人サイトでSNSの埋め込みをした際に驚いたことがありました。
それは、SNSのロゴを使用するにはたくさんの条件があることです。

そこで今回は、主要なSNSのロゴを使用する際の条件について書きたいと思います。



#はじめに

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。


#SNSごとのロゴを使用する条件


###Twitter

・ロゴの色は青、または白（画像の上に配置する場合は必ず白）
・丸や四角で囲まれたロゴも使用できる。ただし、ロゴには囲みがないものが望ましい
・影をつけることは禁止
・ロゴの外枠だけでの使用は禁止
・ロゴにデザインを加えることは禁止

＜参照サイト＞
https://about.twitter.com/content/dam/about-twitter/company/brand-resources/en_us/Twitter_Brand_Guidelines_V2_0.pdf

###Facebook
・アイコンとして単体または他のソーシャルアイコンと一緒に使用でできる（サイズは隣接するアイコンと同じ大きさにする）
・「ｆ」のロゴは、アニメーションで動かしてはいけない
・ロゴにデザインを加えることは禁止
・色は正しい青色または、白黒のみ

＜参照サイト＞
https://ja.facebookbrand.com/assets/%E3%80%8Cf%E3%80%8D%E3%83%AD%E3%82%B4/?audience=landing

###Instagram

・ロゴの4方向全部に、最低ロゴの半分の幅の空白部分を作る
・1辺の幅が29px以上
・ロゴを変形させることは禁止
・白のロゴの背景には、単色を使用する

＜参照サイト＞
https://en.instagram-brand.com/assets/icons




#まとめ

主要なSNSのロゴを使用する際の条件についてご紹介しました。

みなさんそれぞれの条件に合った方法で使用していましたか？

サイトを作る際には、SNSの埋め込みは必要な工程でしょう。
しかし、定められているルールは守る必要があります。
ご紹介できていない条件もありますし、それそれのSNSによって条件が異なるためしっかり確認しましょう。
Google Testのテストケース名やテスト名にアンダースコアを使用してはいけない

# 題名そのままです。

最近[単体テストの記事](https://qiita.com/yumetodo/items/5886b2c0c421c24c909b)を見てGoogleTestの入門ガイドなんかを眺めていたとき...

[入門ガイド](http://opencv.jp/googletestdocs/primer.html)
> TEST() の引数は，全体そして詳細，の順序に並んでいます．
>最初の引数は，テストケースの名前です．
>2番目の引数は，テストケースに含まれるテストの名前です．
>両者とも有効な C++ の識別子でなければならず，アンダースコア（_）を含んではいけません．
>テストケースと個々のテスト名を合わせたものが，テストの完全な名前となります．
>属するテストケースが別ならば，個々のテスト名として同じ名前を付けることもできます．

とあり驚きました。
c++erの人はアンダースコア大好きだと思っているので(しらんけど)

自分もアンダースコアで命名することが多く、実際試しに書いていたテストもがっつりアンダースコア使ってました。

アンダースコアを使用してはいけない理由は

[ここ](http://opencv.jp/googletestdocs/FAQ.html#faq-why-should-not-test-case-names-and-test-names-contain-underscore)にあります。
githubの[リポジトリ](https://github.com/google/googletest/blob/master/googletest/docs/faq.md)にもあります。

GoogleTest界隈では常識なのかもしれないですが初めて知ったので記事にしました。

~~ちなみに、GoogleTestを使用しているとGoogleTestのREADME.mdにも書かれているヘッダーオンリーディープラーニングライブラリのtiny_dnnはアンダースコアを使用しています。
[リポジトリ](https://github.com/tiny-dnn/tiny-dnn/blob/master/test)~~

追記:どうでもいい情報

現在GoogleTestを使用してないと思われます。
Catch2とかいうイカしたヘッダーオンリーライブラリを使用しているっぽいです。
過去のリリースではGoogleTest使用しています。アンダースコアつきで...
福岡のコワーキングスペース探訪【fabbit編】

## 名称
* fabbit Global Gateway “ACROS Fukuoka”
* 2018年12月オープン
* 博多、北九州にもある
* 博多店は内装イケテナイ（ワンデーパスもない）

![fabbit_acros](https://tech.yellowrange.net/wp-content/uploads/2019/07/fabbit_acros.jpg)￼

## 場所
* アクロス福岡の１Fに立地する。
* 住所：福岡市中央区天神１丁目１−１
* 地下鉄天神駅から地下道でつながっており5分程度で到着可能

<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3323.530236509023!2d130.40023301584128!3d33.59154427470962!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x35419191896d566f%3A0x59fbb07d893e2d1c!2z44CSODEwLTAwMDEg56aP5bKh55yM56aP5bKh5biC5Lit5aSu5Yy65aSp56We77yR5LiB55uu77yR4oiS77yR!5e0!3m2!1sja!2sjp!4v1564389405912!5m2!1sja!2sjp" width="600" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>

## 料金・システム
* ワンデーパス2,000円
* クレジットカード払いのみ
* 09:00〜18:00
* 使用できない日・時間帯があるので注意
    * [【Unavailable dateを参照】](https://fabbit.co.jp/facility/global-gateway-acros-fukuoka/)
* 室内の出入りはカードキーか内部からのボタン操作による解錠が必要
    * 受付にあるカードキーを自由に利用可能

## 設備
* ワンデーパスの場合、フリースペースのみ使用可能
* ちょっとしたフリードリンクと電子レンジが使用可能
  
![](https://tech.yellowrange.net/wp-content/uploads/2019/07/15644009707439.jpg)￼


* 飲食可能
* 自販機あり
* トイレはアクロス福岡共用（1F有）
* Free WiFi有り
    * Wifiスピードテスト結果　上り94.5Mbps、下り35.5Mbps
* 一部ホワイトボード有

## 雰囲気
* ほぼ日本人が中心で20〜30歳台が中心だった。
* BGMは小さすぎず、うるさすぎずで問題ないレベルだった。
* 冷房がそこそこ効いているので長時間いる場合は長袖があるとよい。
* オシャレな家具と内装なのでテンションあがる。
* フロントエンドのエンジニア同士が質問しあっている光景が垣間見れた。

## 所感
* 福岡の芸術の中心であるアクロス福岡に立地しているので音楽や絵画を嗜みつつ作業を行うことができる。
* アクロス福岡では何かしらイベントが行われているので、待ち時間に作業やひと休みしたいときに便利そうだった。
* フリードリンクのカップが小さいのでたくさん飲みたい人はマイボトルを持参するといいかも。
Pythonで「中心極限定理」を確かめてみる

[Pythonで「中心極限定理」を確かめてみる](https://qiita.com/sand/items/5adfa593abe928bf266c)
[母平均の区間推定で「中心極限定理」を使う](https://qiita.com/sand/items/924e072f92ab1ae419db)

# 中心極限定理

統計において**正規分布**は重要な役割を果たしていますが、それは以下のような**中心極限定理**が成り立つからです。これにより、nを十分大きい数字として、n個の標本を取り出してその平均を調べる時、正規分布の特性を適用して調べることができます。

```math
\begin{align}
\\
&平均値\mu、分散\sigma^2 の分布に従う独立したn個の確率変数X_1、X_2、...、X_n について、\\
&次のように\bar{X}を定義する。\\
\\
&\bar{X} = \frac{X_1 + X_2 + ... + X_n}{n}\\
&nが大きいとき、この確率変数\bar{X}は平均値\mu、分散\frac{\sigma^2}{n}の正規分布に従う。\\
&\qquad \qquad  \qquad \qquad  \qquad \qquad  \qquad \qquad \qquad  \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad  \qquad  \\
\end{align}
```



# 例：一様分布の平均を正規分布で近似する

[Juliaで学ぶ確率変数(5) - 正規分布（連続型）](https://qiita.com/sand/items/4c3ef0b0504704074681)
[Juliaで学ぶ確率変数(6) - 一様分布（連続型）](https://qiita.com/sand/items/7c3c54ef82a1bf439cc4)



**中心極限定理**によって、次のことが言える

* n個の確率変数を取ってその平均を求める
* それを何回も繰り返せば、平均値（X)とその確率(Y)のグラフは正規分布で近似できる


以上のことを確かめるためにPythonプログラムを作ります。
プログラムの概要は以下の通りです。

* もととなる確率変数として、区間[0, 10]の**一様分布**を考えます。
n=10個の一様分布の平均を求めます。
* それを1000回繰り返し、同じ平均値の頻度（何回出現するか）をカウントします。
* 頻度を確率に変換して（1000で割って）、プロットします。


```
import numpy as np
import matplotlib.pyplot as plt
from decimal import Decimal

d={}
for i in range(1000):
    a=np.random.uniform(low=0.0,high=10, size=10)  # 任意の範囲の浮動小数点数
    b=np.mean(a)
    c=np.around(b, decimals=0)
    if c in d:
        d[c]=d[c]+1
    else:
        d[c]=1
ds = sorted(d.items(), key=lambda x:x[0])
print(ds)
xs=[x for (x,y) in  ds]
ys=[y/1000 for (x,y) in  ds]
print(xs)
print(ys)
plt.bar(xs, ys, 0.35, linewidth=0)
```


一応、プロットする数字を出力しました。

```
[(2.0, 3), (3.0, 52), (4.0, 227), (5.0, 422), (6.0, 245), (7.0, 48), (8.0, 3)]
[2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]
[0.003, 0.052, 0.227, 0.422, 0.245, 0.048, 0.003]
```


なるほど、プロットしたグラフは正規分布に近いようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61915/44ee4a42-f2fe-b274-f6b8-f9a976fd210f.png)



実際に正規分布で近似できているかを確認します。

中心極限定理の定理を使って、もとの**一様分布**の**平均値**と**分散**から、**正規分布**の**平均値**と**分散**を求めます。

* 平均値は一様分布と同じで5です。
* 分散は(10*10/12)/10です。

前のプログラムの最後尾に、以下のプログラムを追加して、再実行しプロットします。

```
from scipy.stats import norm

X = np.arange(0,10,1)
Y = norm.pdf(X, loc=5, scale=np.sqrt(10*10/12/10))
plt.plot(X,Y,color='r')
```

なるほど、確かに正規分布で近似できているようです。**中心極限定理**は魔法のような定理ですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61915/4e3a59c0-6588-6272-3030-37010e5b3365.png)


今回は以上です。
AWS Lambdaのランタイムサポート

AWS LambdaのランタイムサポートはランタイムのEOLと同時に新規作成ができなくなり、その後1～2ヵ月で更新もできなくなる。

Node.jsはメジャーバージョンアップが1年ごとで、EOLもリリースから2年半と短いため、頻繁なEOL対応が必要となる。（Pythonはリリースから5年間サポートされる。）

| ランタイム   | LTS開始    | EOL              | 廃止 (作成)      | 廃止 (更新)      |
| :----------- | ---------- | :--------------- | :--------------- | :--------------- |
| Python 2.7   | 2010/07/03 | 2020/01/01       | (未定)           | (未定)           |
| Python 3.5   | 2015/09/13 | 2020/09/13       | (サポート対象外) | (サポート対象外) |
| Python 3.6   | 2016/12/23 | 2021/12/23       | (未定)           | (未定)           |
| Python 3.7   | 2018/06/27 | 2023/06/27       | (未定)           | (未定)           |
| Node.js 0.10 | 2013/03/11 | 2016/10/31       | 2016/10/31       | 2016/10/31       |
| Node.js 4.3  | 2015/10/01 | 2018/04/30       | 2018/12/15       | 2019/4/30        |
| Node.js 6.10 | 2016/10/18 | 2019/04/30       | 2019/04/30       | 2019/6/30        |
| Node.js 8.10 | 2017/10/31 | 2019/12 (予定) ※ | (未定)           | (未定)           |
| Node.js 10.x | 2018/10/30 | 2021/04 (予定)   | (未定)           | (未定)           |
| Node.js 12.x | 2019/10/22 | 2022/04 (予定)   | (未定)           | (未定)           |

※ OpenSSL-1.0.2と同時のEOLとするため、通常よりも早く設定されている。

##### 参考

* [Node.jsリリーススケジュール](https://github.com/nodejs/Release)
* [Pythonリリーススケジュール](https://devguide.python.org/#status-of-python-branches)
* [AWS Lambda ランタイムサポートポリシー](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtime-support-policy.html)
* https://dev.classmethod.jp/cloud/aws/eol-for-node-js-610/