OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeの拡張：CalvaでClojureの開発環境を整える

そろそろ関数型やるかー、って感じでClojureを触り始めました。
VSCodeでやりたかったので環境構築手順についてまとめ。

# いれるもの
- Leiningen(いろいろやってくれるやつ)
- Joker(linter)
- Calva(VSCodeのClojure拡張)

VSCodeはインストール済みの前提です。

# インストール
## Leiningen
LeiningenはClojureのビルドツールです。
コンパイルとかREPLの起動とかいろいろやってくれます。
Windowsのインストーラが用意されているので、それを使います。
https://djpowell.github.io/leiningen-win-installer/

インストーラ使うと環境変数とかもろもろ設定してくれますが、プログラム本体のダウンロードはコマンドでやる必要があるようです。
PowerShell使って以下のコマンドを実行します。

```
lein self-install
```

環境によっては、PowerShellのダウンロードがうまくいかないようで、wgetかcurlを使えと言われます。
Leiningenインストールしたときにcurlも一緒に入ってきてたようなので、それを使うように環境変数`HTTP_CLIENT`に`curl -f -L -k -o`を設定します。
設定したら、再度`self-install`コマンドを実行してインストールをします。

以下のコマンドでバージョンが確認できれば問題なくインストールができています。

```
lein version
```

以下のコマンドでREPLが起動するので、とりあえずClojureを試してみるのもよいでしょう。

```
lein repl
```

## Joker
JokerはClojureのlinter(構文解析ツール)です。
GitHubで各OS向けのバイナリが公開されているのでダウンロードしてきて、パスが通っているところに入れます。
Leiningenのインストールフォルダのbinの中に突っ込むのがわかりやすいかと。
https://github.com/candid82/joker

## Calva
CalvaはVSCodeの拡張です。
今まで入れたLeiningenやJokerをVSCode上から動かすことができます。
Calvaを入れると、Calva Formatterという拡張もインストールされます。

Calva Formatterは改行時に自動でインデント入れてくれるやつです。
オプション見る限り、行末改行削除とかもできそうなんですがいまいち動かない(未実装?)ようです。
割とできたばかりのプロジェクトみたいなので、今後に期待。

# Calvaを使う
## REPLへ接続
Calvaの多くの機能を使うためにはまずReplに接続する必要があります。
`lein repl`コマンドであらかじめREPLを起動されていれば、`Ctrl+Alt+V` `C`で接続できます。
画面の左下に以下のように表示されていればREPLへ接続がされています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/115996/ba45c285-94d5-7b10-967d-1de5288e9ec0.png)

## 評価結果をVSCode上で表示する
評価したい式を選択して、`Ctrl+Alt+V` `E`でその式を評価することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/115996/06e3cb3e-03a4-0eec-2295-098c93315d22.png)

別ファイルのネームスペースを使いたい場合、使いたいファイルに移動して`Ctrl+Alt+V` `Alt+N`で現在のファイルをREPLに読み込めば使えるようになります。

## Jokerを使う
`Ctrl+Alt+V` `L`でJokerによる構文解析を実行することができます。
これだと、いちいち実行しないとないので、設定の`calva.lintOnSave`をtrueにしてあげると保存時に自動的に構文解析を行ってくれます。

# 解決したい疑問
定義された情報の参照がうまくできていません(右クリックメニューの`Peek Defenition`とか)。
バグなのか、設定がうまくいってないのか…。

(7/8追記)
あと、jokerのほうの問題っぽいんですが、:useでほかのネームスペースの関数を使うように宣言しても構文解析でエラーが出てしまいます。
:requireにすればエラーが出ないので、すべて:requireで書くようにすればとりあえず問題はないです。
laravelでClass 'App\Providers\Validator' not foundと出た場合の対処法

## エラー箇所を検討つける

laravelで

```
Class 'App\Providers\Validator' not found
```

というエラーが出た。

対処法ファイルは`app/Providers/ValidationServiceProvider.php`らしい
見てみると

```
13行目 return new Validator($translator, $data, $rules, $messages, $customAttributes);
```
のValidatorが適切に読み込まれていないらしい。
たぶんnamespaceが正しく読み込まれていないということだろう。

## とりあえずconfig/app.phpを確認
基本的なエイリアスの定義はここにあるので、まずは`config/app.php`の中から`Validator`を探す。

すると、239行目に

```
'Validator' => Illuminate\Support\Facades\Validator::class,
```
とある。


とりあえず`app/Providers/ValidationServiceProvider.php`に`use Validator`と入れてみる。

すると、次は以下のエラーがでる、、、

```
Call to undefined method Illuminate\Support\Facades\Validator::setPresenceVerifier()
```
対象ファイルは`vendor/laravel/framework/src/Illuminate/Validation/Factory.php`みたいなのでとりあえず開く。

どうやら、`$validator`が読み込まれていないみたいなのが原因らしい。

### 再び原因を探る
エラーをみると`setPresenceVerifier()`が定義されていないと出るので、`setPresenceVerifier()`が定義されているファイル`vendor/laravel/framework/src/Illuminate/Validation/Validator.php`を開く

すると、1054行目に`public function setPresenceVerifier(PresenceVerifierInterface $presenceVerifier)`があった。

ここがピンポイントというよりはValidator.php内の`class Validation`自体が上手く読み込まれていないらしい。
つまりは`use Illumintion\Validation\Validator`を`vendor/laravel/framework/src/Illuminate/Validation/Factory.php`に上手く読み込ませればいい。

ということで、
`vendor/laravel/framework/src/Illuminate/Validation/Factory.php`に`use Illumintion\Validation\Validator`を記述

駄目だ同様のエラーがでる、、、

もしやと思い、`app/Providers/ValidationServiceProvider.php`の`use Validator`を`use Illuminate\Support\Facades\Validator`に書き換えてみる。

解決

useする箇所を間違えてたらしい。
しかし、Validatorクラス多すぎだよ、、、


## 参照
https://qiita.com/niiyz/items/5b83ef5255a1ec64d9d6
ALVRとoculus go でbeat saber　やってみました

https://qiita.com/Hasshi7965/items/574eb9beece3b5e31b92
でセットアップしたPCとoculusgoがあったのでbeatsaberをやってみました。
そこで気づいたことを書いていきます。

## コントローラーが1個しかない
oculusgoのコントローラーは1個左右どちらかしかありません。なので遊べるモードは剣が1本のモードだけになります。

## 屈めない
oculusgoは現時点では位置まではトラッキングしてくれません。
壁を避けれません。

なので遊ぶときにはwithout failが必須です。

## コントローラーが向きしか変わらない
向きしか変わらないので手首のスナップで端っこにきたブロックを切ります。
爆弾が手前側に一緒に流れてきたら爆弾を避けてブロックを切る術はありません。

### 結論
割と3DOFが悪いのでちゃんと6DOFでできるヘッドセットを使いましょう(Mirage Soloみたいな?)
あとコントローラー2個使えればなー（先輩が後ろからお前がやるんだよって）

上の問題を気にしなければ雰囲気ぐらいは楽しめます。
ケーブルレスなので楽ですね。viveの太いケーブルに足が絡まることもないですし。
[Go]イオタクイズ

Go における定数識別子 `iota` の使い方を理解するためにクイズを10問用意しました！

あなたは果たして何問正解できるでしょうか？
数字や真偽値が出力されるので、その値を当ててみてください！

※ `package` 部と `import` 部は省略しています
※ コンパイルエラーの場合は「コンパイルエラー」とお答えください

## 問題
### 第１問
```go
const (
	a = iota
	b
)

func main() {
	fmt.Println(b)
}
```
### 第２問
```go
const (
	a = iota%2==1
	b
	c
)

func main() {
	fmt.Println(c)
}
```
### 第３問
```go
const (
	a =iota
	_
	b
)

func main() {
	fmt.Println(b)
}
```
### 第４問
```go
const (
	a, b = iota, 2
	c, d
)

func main() {
	fmt.Println(c*10+d)
}
```
### 第５問
```go
const (
	a, b = iota, iota+1
	c, d
)

func main() {
	fmt.Println(c*10+d)
}
```
### 第６問
```go
const (
	iota = 10
	a = iota
	b
)

func main() {
	fmt.Println(b)
}
```
### 第７問
```go
const (
	a = iota
	iota = iota
)

func main() {
	fmt.Println(a)
}
```
### 第８問
```go
const (
	a = 10
	b = iota
	c
	d = iota + 1
	e
)

func main() {
	fmt.Println(e)
}
```
### 第９問
```go
const (
	a = iota
	b
)

const (
	c = iota << 2
	d
	e
	f
)

func main() {
	fmt.Println(f)
}
```
### 第10問

```go
const (
	a = iota
	b
)

const (
	c = iota << 2
	d
	e
	f
)

const iota = 1

func main() {
	fmt.Println(f)
}
```

## 答え

|||
|:-:|:-:|
|第１問|`1`|
|第２問|`false`|
|第３問|`2`|
|第４問|`12`|
|第５問|`12`|
|第６問|`10`|
|第７問|コンパイルエラー|
|第８問|`5`|
|第９問|`12`|
|第10問|`4`|

あなたは何問正解できましたか？正解数を Twitter でシェアしてみよう！

:point_down:シェアコピペ用:bow:
「10問中＿問正解しました！」

## 元ネタ
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">今日はGoクイズを出題します！<br><br>「隠された式」<br>弊社エンジニア正答率 75% の問題です！<a href="https://t.co/mEBpy4FIXu">https://t.co/mEBpy4FIXu</a><br>Runすると何が表示されるでしょうか。Runせずに選んでみてください！<a href="https://twitter.com/hashtag/golang?src=hash&amp;ref_src=twsrc%5Etfw">#golang</a> <a href="https://twitter.com/hashtag/Go%E3%82%AF%E3%82%A4%E3%82%BA?src=hash&amp;ref_src=twsrc%5Etfw">#Goクイズ</a> <a href="https://twitter.com/hashtag/GROOVEX?src=hash&amp;ref_src=twsrc%5Etfw">#GROOVEX</a></p>&mdash; GROOVE X SWチーム (@GROOVEX_SW) <a href="https://twitter.com/GROOVEX_SW/status/1014672618144784384?ref_src=twsrc%5Etfw">July 5, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ALVRとOculusGOでVR chatやってみました

@hakoshiki さんのhttps://qiita.com/hakoshiki/items/8775672ccbfe5c90cfa5
を参考にしてOculusgoとALVRでVRchatをやってみました。
いくつか詰まったところを備忘録的に書いていきます。

### 環境
PC: razer blade stealth(2017)
外付けGPUドック: razer core v1
GPU: GTX1080

### ネットワーク
アクセスポイント Tp-link EAP245

## vc_redist.x64.exe
vc_redist.x64.exeはダウンロードするも別バージョンが既にインストールされていた旨の表示が出てインストール不要でした。

## ALVR clientとserverのバージョン
oculus store からインストールされるものは最新版ではないのでALVRクライアントとサーバーのバージョンを合わせる必要がありました。oculus storeからダウンロードしたバージョンは2.1.5でした。しかし、serverの最新版が2.2.2で、それを入れたままだとバージョン違いのエラーで接続されませんでした。そこで、server側のversionを2.1.5に合わせました。

## ネットワーク環境の話
当初はPCをUSB接続の無線LANアダプタ(I-O DATA WN-G150UMK)でアクセスポイントに接続し、同じアクセスポイントにOculusgoも接続していました。
Oculus上のclientとserverが繋がり画面は表示されましたが、画面の一部の更新が間に合わずにモザイクが掛かったように表示されました。

ここで、先輩にネットワークの帯域が足りないのではという指摘を受け、PC側をrazer core上のイーサネットポートから有線LAN接続しました。その結果、oculus側のモザイクが掛かったような状態は解決されました。

検証したのは深夜3時の研究室で誰も他に無線LANを使っている人はいませんでした。もし、昼間のような同じアクセスポイントに接続する機器が多い環境では別の問題が発生するかもしれないので、今後検証する予定です。

## ALVRのRecenter buttonの設定 (最新版では修正されている?)
ALVR server(v2.1.5)のc設定のontrollerのタブでは、trigger,Trackpad click,Recenter buttonのタイトルの横にプルダウンメニューがあり、recenterの機能をどのボタンに割り当てるかの設定になっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/199893/381680dc-ef94-d86e-68df-73bc6a16cece.png)
一見すると、左側側がoculusgoコントローラーで右側がそのキーにどの機能を割り当てるかに見えます。しかし、Recenter buttonだけはoculusgoコントローラーのどのボタンにrecenterb buttonの機能を割り当てるかの設定になっているようです。(v2.1.5)

当初はこれをtrackpad clickに設定していたので画面が回りまくりました。

最新版では修正されているらしいですがoculus storeからは落ちてこないんですよね(2018/07/07)

## コントローラーが足りない
コントローラーが1個しかない。
もう一個のコントローラーのポインタが視野の中心?になっています。しかし、このポインタでは何も操作することができません。ただ、ポインタは存在するのでoculusgoコントローラーのポインタと区別がつかなくて非常に紛らわしいです。

## 移動がキーボード
目の前にはoculusgoの画面があるので見えません。

要タッチタイピング

## vrchatのアバターの移動に視点が追従しない?
vrchatのアバターが移動しても視点がそのままの位置で動き回っている自分のアバターを眺める羽目になります。一応キーボードから手を離すとそのアバターの位置と視点は同期します。
クラスメソッドの使い方【Java】

#はじめに
クラスメソッドを、インスタンス変数とインスタンスメソッドと共に使用するときに注意すべき点をまとめました。

#クラスメソッドとは
クラスメソッドは、クラス変数にアクセスすることを主な役割としています。
宣言するときにstatic修飾子をつける必要があります。呼び出すときは以下のようにクラス名を使用します。

```
(クラス名).(クラスメソッド名)
```

#クラスメソッドと他の変数、メソッドとの関係
以下の説明は、Oracle社の[The Java<sup>TM</sup> Tutorials](https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html)を引用しています。

> * インスタンスメソッドはクラス変数とクラスメソッドに直接アクセスできる
> * クラスメソッドはクラス変数とクラスメソッドに直接アクセスできる
> * クラスメソッドはインスタンス変数とインスタンスメソッドに***直接アクセスできない***。アクセスする場合はオブジェクトを参照する必要がある。また、thisキーワードが示すオブジェクトがないため、thisキーワードを使うことができない。

上記の"直接アクセスできる"の意味は、メソッド内の処理において、変数名のみ、またはメソッド名のみで呼ぶことができるという意味です。

#具体例
クラスメソッドにて、インスタンスメソッドを呼び出す例を紹介します。

使用するクラスメソッドはmain、インスタンスメソッドはdisplayとします。
mainは文字列型のクラス変数に直接アクセスして、文字列の内容をコンソールに表示します。
displayはコンソールに整数型の引数を表示します。

```java:Test.java
public class Test{

	public static String str = "クラス変数が呼び出されました"; // クラス変数

	public static void main(String[] args){ // クラスメソッド
	
		System.out.println(str); // クラス変数に直接アクセス
		
		Test test = new Test(); // Test型のオブジェクトを生成
		
		test.display(5); 		// インスタンスメソッドにアクセスするために、Test型オブジェクトを参照
		
	}
	
	public void display(int num){ // インスタンスメソッド
		System.out.println("数字は" + num + "です");
	}

}
```

Test.javaを実行すると

```
クラス変数が呼び出されました
数字は5です
```

となりました。

mainはstatic修飾子がついているので、クラスメソッドです。
displayはstatic修飾子がついていないので、インスタンスメソッドです。
よって、mainからdisplayにアクセスするにはTest型のオブジェクトの参照が必要です。
同じクラスのメソッドを使用するときに、オブジェクトの参照が必要であるのは違和感があります、、、

#おわりに
本記事では、クラスメソッド自体の使い方というより、クラスメソッドとインスタンスメソッドの互いのアクセスについて調べました。

その結果、同じクラス内にて、クラスメソッド内でインスタンスメソッドを呼ぶ場合に少し注意が必要でした。

そして、クラスメソッド内でクラス変数に直接アクセス、またインスタンスメソッドを呼ぶ簡単なコードの例を紹介しました。
MacアプリがMove to Applications folderと出てが起動出来ない問題を解決

# ダウンロードしたMacアプリが、アラートが出て起動出来ない問題を解決

## 症状
- ダウンロードしたMacアプリが「Move to Applications folder...」などアラートが出て開けない
- いや、アプリケーションフォルダで解凍したから、ここに居るんだけど？
- 〇〇.app を 一回外に出して再度貼り付けたりしたが、同じだった。無限ループ

## 解決方法

今回、Figmaというアプリで発生し、ターミナルで以下コマンドで解決した
`$ xattr -dr com.apple.quarantine /Applications/Figma.app`

適宜自身のアプリ名でやってみてください
`$ xattr -dr com.apple.quarantine /Applications/◯◯.app`

---

## 追記： 2020-08-29
VisualStudio Codeなどアプリ名にスペースがある時はスペースをバックスラッシュでエスケープする必要があります。（これが分からなくてすっかりあきらめてましたが、直りました）
`$ xattr -dr com.apple.quarantine /Applications/Visual\ Studio\ Code.app`
参照：
[Code won't update on macOS #7426](https://github.com/Microsoft/vscode/issues/7426#issuecomment-425093469)
RaspbianのSDへの書き込み手順（シンプル）

## 1. OSイメージのダウンロード
下記のダウンロードページからRASPBIAN STRETCH LITE（右側）を選択。
https://www.raspberrypi.org/downloads/raspbian/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/208639/fd89f9a7-1d2e-33b0-e989-1864d9afcc96.png)
※ ダウンロードには時間がかかるので気長に待つべし

## 2. SDカードへの書き込み
### 2.1. SDの特定
下記コマンドでSDのデバイスへのパスを特定する。

```bash

% diskutil list
```

手元の環境では`/dev/disk3 (internal, physical)`となっているので、disk3だということが分かる。

### 2.2. アンマウントしてOSイメージを書き込む
上記2.1で特定したデバイスに`dd`コマンドで書き込む。この時、diskを`rdisk`とすることで書き込みが断然早くなる。

```bash

% diskutil unmountDisk /dev/disk3
% sudo dd bs=16m if=./2018-06-27-raspbian-stretch-lite.img of=/dev/rdisk3
```

### 2.3. 再度アンマウントして取り出して完了

```bash
diskutil unmountDisk /dev/disk3
```

次> [Raspbianをインストール直後にやること（超必要最低限）](https://qiita.com/yhoriuc1/items/d24d37a6690a6e412659)
Boostnoteアップデート後CSONファイルが存在するにも関わらずストレージ設定が消えてフォルダとドキュメントが表示されない障害原因と解消法

## 環境
OS X EI Capitan 10.11.6
Ubuntu16LTS
Boostnote バージョン 0.11.7 (0.11.7)

## 現象
先日、11.7に自動アップデートしてから、ストレージ設定が消えてしまいフォルダリストが表示されずドキュメントが参照できない状況に陥りました。
Dropboxで共有している対象フォルダ内にCSONファイルは残っている状態。
BoostnoteMobileでは正常に動作。

## 端的な障害要因と解消法
ドキュメントCSONファイル群の中に

```
'content': ''
```

だけのCSONファイルが含まれていた事が原因。
該当ファイルの削除で解消。

## 原因特定までの作業記録

設定から再度ストレージ登録を行うが、Addボタンを押しても設定追加されず。
Toggle Developer ToolsでAddボタンクリック時のコンソールを見ると、以下のエラーが発生していました。

```
main.js:5080 Uncaught (in promise) TypeError: Cannot read property 'forEach' of undefined
    at file:///Applications/Boostnote.app/Contents/Resources/app/compiled/main.js:5080:20
    at Array.forEach (<anonymous>:null:null)
    at data (file:///Applications/Boostnote.app/Contents/Resources/app/compiled/main.js:5061:21)
    at file:///Applications/Boostnote.app/Contents/Resources/app/node_modules/redux/dist/redux.min.js:1:4863
    at a (file:///Applications/Boostnote.app/Contents/Resources/app/node_modules/redux/dist/redux.min.js:1:1193)
    at file:///Applications/Boostnote.app/Contents/Resources/app/compiled/main.js:58845:10
    at <anonymous>:null:null
```

main.js:5080 行のコード。

```
note.tags.forEach(function (tag) {
```
note.tagsをArrayとして認識していないように見受けられました。 

過去の0.11台の全バージョン入れ替え、ドキュメント共有で使用しているDropBoxの入れ直しでも状況変わらず。

~/LibraryApplication\Support/Boostnote内の
Cache
Gouache
Local Storage
内のファイルクリア
Cookies
Cookies-journal
config.json

の削除でも状況変わらず。

ここまでで試した結果から、これはBoostnoteの問題では無くドキュメント内容の問題だと判断。
csonファイルをコピーして、タイムスタンプが新しいファイルをフォルダから外しては起動を繰り返し、特定のファイルが含まれていると現象が発生する事が分かりました。

対象ファイル
ファイル名
　41bfab30-14e6-4bfc-b4db-bba9ae4640cd.cson　（多分、これは私の環境だけの名称だと思います）
ファイルサイズ
　14バイト
内容

```json

'content': ''
```

## 考察

Addボタンで処理が滞った原因は上記csonファイルから生成されたオブジェクトにtagsフィールドが存在せず、ArrayのforEachメソッドが存在せずエラーが発生したことが原因のように見受けられました。
該当ファイルは意図的に作成した記憶は無いのですが思い当たるフシは、つい最近までiPhone5でBoostnoteMobileを使っていた際、それなりの数のフォルダとドキュメントを登録していたためメニューからDropboxを選択するとたどたどしくリストが更新されていたのですが、その最中に+ボタンでドキュメント追加するとタイミングによっては、意図しないフォルダに空のドキュメントが作成される事がありました。気づいた時は削除しましたがもしかしたら気づかず残った物があったのか、または悪いタイミングで想定外のファイルが出来てしまった事が原因では無いかと考えてます。

## 終りに

今後、ドキュメント構造などフォーマットに関するエラー情報がわかるようになると、より安定して使えるようになるかなと思いました。
あと全般的に私の各種環境が古くてお恥ずかしい...(iPhoneは5から8Plusにしました）
BoostnoteとBoostnoteMobileは今年になってから使わせていただくようになりましたが、テキストベースのメモを溜めては検索して過去の自分に助けてもらっている私には本当に便利なツールです、これは。:laughing:
同様の現象でお困りの方の参考になれば幸いです。
ソシャゲ自動ログインスクリプト

Qiitaへの投稿とか、普段のMACではなくWindows環境を整えるのとか、マークアップの書き方とかpythonのサラッとした復習とか兼ねていろいろ簡単作ったものをアップロード&説明

#作成背景
デ○ステとミリ○タの平行がつらい😖
イベント薄い期間はログイン忘れてしまうので防止する😖😖😖

###1.NOXをダウンロードしてアプリを入れ、アカウントと紐付ける
https://jp.bignox.com/

###2.コードを書く
[こんな感じに](https://github.com/coreattack22/scripts/tree/master/autologin)

###3.applist.jsonを新規に作って、起動したいアプリ名を書く。 
アプリ名の調べ方
Nox\binディレクトリまで移動して以下のコマンドを実行

```
adb shell pm list packages >C:\app.txt 
```
C直下に落ちるapp.txtを見てAppList.jsonにアプリ名を記述

```
{
"AppList": [ "APP01", "APP02", "APP03"]
 }
```
※アプリ名(パッケージ名)はjp.co.会社名..."みたいな感じになっているはず

※躓いたところ 
アプリの起動だけは
subprocess.Run()ではなく
subprocess.Popen(app_name, shell=True)
を使わないとずっと待機中になってスクリプトが進まなかった。
※popenはrunとは違い実行待ちをせずコマンドを実行するスクリプト

取り急ぎなのでもうちょっといろいろ自動化できるように調べてみたい
macでnslookupできるけどpingできない時の対処法

mac で nslookup できるけど ping できないことがあり、解決方法を調べたのでメモします。

# 結論

僕のケースでは、次のコマンドで直りました。

```
sudo killall -HUP mDNSResponder
```

# 症状

なにかコード書いて、いざ git push しようとするとエラーになることがしばしばありました。
再起動すればとりあえず直るんですが1時間に1回とか再起動するハメになり面倒です。

```
$ git push
ssh: Could not resolve hostname github.com: nodename nor servname provided, or not known
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

DNS の不具合かなーと思ったんですが DNS とは疎通できています。

```
$ nslookup github.com
Server:        8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
Name:    github.com
Address: 192.30.255.113
Name:    github.com
Address: 192.30.255.112
```

ただし git push の他に ping とか curl も動きません。

```
$ ping github.com
ping: cannot resolve github.com: Unknown host
```

# 調査内容

なぜ名前解決できるのに ping が疎通しないかを調べたところ、 nslookup や dig は DNS サーバに問い合わせるのに対し、 ping や curl は mDNSResponder に問い合わせるのが理由のようでした（[Ask Different: DNS Resolution Fails for ping and curl, but not dig](https://apple.stackexchange.com/questions/251678/dns-resolution-fails-for-ping-and-curl-but-not-dig)）。

解決方法としては mDNSResponder を再起動すればよいようです（[Ask Different: DNS not resolving on Mac OS X](https://apple.stackexchange.com/questions/26616/dns-not-resolving-on-mac-os-x)）。このQ&Aには再起動方法として次のコマンドが提案されています。

```
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
```

しかしこのコマンドを打つと `Operation not permitted while System Integrity Protection is engaged` というエラーメッセージとともに失敗します。

[Qiita: El CapitanのSystem Integrity Protection（rootless）の解除方法](https://qiita.com/tuckQ/items/26c0bebbdfa2e094dba8) にはエラーを回避する方法が書かれていますが、同記事によると

> System Integrity Protectionは、そもそもマルウェアからの攻撃をかわすためのセキュリティ機能のようなので不用意に設定をオフにするのは推奨されません。くれぐれも自己責任での実行をお願いします。

ということなのであまり気が進みません。

もう少し簡素な方法がないか調べたところ https://gist.github.com/mipmip/1844353 に mDNSResponder のプロセスにシグナルを送って再起動を行う方法があり、試してみたら症状から回復しました。

```
sudo killall -HUP mDNSResponder
```

本質的な原因は謎ですが、とりあえずこの対処療法で我慢中です。

# 関連記事

- [El CapitanのSystem Integrity Protection（rootless）の解除方法](https://qiita.com/tuckQ/items/26c0bebbdfa2e094dba8)
- [MacOS(El Capitan)でのDNSキャッシュの確認と消去](https://qiita.com/Hidehiko-Inoue/items/7b9d3bdb657c3d83095e)
- [いつも忘れるMacのDNSキャッシュを削除するやつ](https://qiita.com/luccafort/items/18712f0c2f453092b1c7)
作業アウトプット - Ruby on Rails Fri /Jury/ 9th 

<h2>Ruby,Rails初学者の私が今日悩んだ点、最近分かったことなど知識をまとめています:wink:</h2>

<p><strong>目的:</strong></p>
<ul>
<li>自己理解</li>
<li>情報共有:sweat:</li>
<li>情報整理</li>
</ul>

<p>トピックス<p>
<ul>
<li>ログイン、ログアウト時のviewの実装</li>
<li>toggleを使用した要素の表示、非表示の実装</li>
</ul>

<h2>
ログイン、ログアウト時のviewの実装
</h2>
<p>deviseでログイン機能が実装されており、ログインボタンを押すとログインボタンがユーザのアイコンになる仕様になる。
</p>
<ol><p>作業の過程</p>
<li>まずは取り掛かり安さでユーザアイコン用のhaml,scssを実装(ファイルは新しく作らず、ログイン機能ボタンのあるviewファイル内で作業をし、コメントアウトなどを活用しいつでも戻せる状態を保ちました。)</li>
<li>ユーザがログインしていない時は<code>unless user_signed_in?</code>をログインボタンの直前に実装、ログインしているときは<code>if user_signed_in?</code>を実装した。</li>
</ul>

<h2>toggleを使用した要素の表示、非表示の実装</h2>
<ol><p>ログインしているときのユーザアイコンをクリックした時にメッセージやログアウトなどのリンクが表示されるパネルをjQuerryのtoggleメソッドを使用し実装</p>
<li>アイコンの要素に対しクリックメソッドを追加した。</li>

```bash:index.html.haml

$(function(){
  $('img').click(function(){})
})

```

<li>クリックした時にパネルの要素が表示され、サイドクリックすると隠れる機能を<code>toggle</code>を使用し実装した。</li>

```bash:index.html.haml

$(function(){
  $('img').click(function(){
     $('.header__right-panel').toggle();
  })
})

```
</ul>


<h2>
実装の感想〜toggleにたどり着くまで
</h2>
<ul>
<li>実装自体は大したコードではないのですが、たどり着くまでにきづいたら1日費やしていました。:joy:</li>
<li>ログイン、ログアウトの実装はどこに対して何を変化させたいのかを改めて紙に書いたりして考えました。</li>
<li>jQueryを使った実装では、gemやっていファイルの記述、bundle install して、、など実装周りの調査、実装時のメソッドで<code>remove, append, hidden, unwrap... どれ使えばいいんだ</code>など。なのでtoggleを発見したときは凄いメソッドキタ！て思いました。。:disappointed:</li>

</ul>

<h2>
to be continued...
</h2>
<p>”この瞬間から集中する”みたいな集中する時間を意識的に作り、疲れるまで考え、休む。とことんできないことで落ち込んだりしてまた考える...といった風に効率よく作業をしていきたいです。:thinking: :) </p>
False PositiveとFalse Negative

#False PositiveとFalse Negativeについてのメモ
ややこしくなりがちな偽陽性と偽陰性について、備忘録を兼ねた解説になります。

まずTrueの方は自明なので覚えなくてかまいません。Falseの方だけ覚えましょう。
例えば、ある人がガンかどうかの検査をする場合、
まず本当はガンの人はTrue Positive(黒) , 本当はガンではない人はTrue Negative(白)になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/13318/0e072aff-dc97-d686-716d-b17aa4590cd9.png)

次に検査を行います。検査の精度は100％にはなりませんから、かならず**「誤検知」**が出てきます。
この誤検知は**「False Positive」**と**「False Negative」**の二つに分けられます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13318/e7d177ef-a895-6858-e36e-cf14a3c477bd.png)

テストによる判定で陽性＝ガンと判定されたのが赤い網ガケされたエリアです。
このとき
「テストでガンと判定されたけど、**実はガンじゃなかった＝False Positive**」と
「テストでガンと判定されなかったけど、**実はガンだった＝False Negative**」の誤検知が出てきます。

False Positiveは陽性の偽なので True Negative、
False Negativeは陰性の偽なので True Positiveです。

あなたがテストの設計者だった場合、テストの精度を上げるのに二つの方法があります。

1つはFalse Negative最小化です。
つまりテストで陽性判定が出なかった人がTrue Negativeに一致するよう、陽性判定の範囲を広げていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/13318/98f633dc-2616-fcb2-c694-10e3a2808bec.png)

2つめはFalse Positive最小化です。
テストで陽性判定が出た人はTrue Positiveになるよう、陽性判定の範囲を狭めていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/13318/7b9c9902-259f-f5c9-2c91-6d72ad1e9b69.png)

この二つの調整は用途が異なるのでどちらが良い、というものではありません。
シチュエーションによって使い分けることになります。

たとえば健康診断などではFalse Negative最小化が好ましいと言えます。
「実はガンだった＝False Negative」ケースをスルーしてしまうと、
その人は必要な治療にアクセスできないからです。

また、症状は出ているが何の病気なのか分からない、といった場合、
False Positive最小化したテストで確定診断することが考えられます。
強力な副作用を伴う抗ガン剤を「実はガンじゃなかった＝False Positive」の人に投与すると、
本来は必要ない処方で取り返しのつかないダメージを与えてしまうことになりかねないからです。

このように世の中のあらゆるテストは「False Positive」「False Negative」を含んでおり、
テストの精度を上げる場合、どちらを最小化するのかというトレードオフが頻繁に出てきます。

自動判定は真陽/真陰と一致する確率を上げるだけでなく、ニーズに応じて
「False Negative最小化＝偽陽が増えることを覚悟して、陽性を広く捕まえる」のか
「False Positive最小化＝偽陽を確実に潰して真陽を確定する」のか
判定の目的を定めておく必要があるのです。
[Angular] src, srcset を設定するカスタムDirectiveを作成する

カスタムコンポーネントは作っても、カスタムディレクティブは作ったことないという人も多いのではないでしょうか。

あんまり使う機会ってありませんが、例えば src, srcset を毎回Attributeに設定するのってだるいですよね。そういうときにカスタムディレクティブは役に立ちます


## HTMLコードの Before After

こんな感じになります↓

```.html
<img src="/assets/images/icons/test/test.png" srcset="/assets/images/icons/test/test@2x.png 2x, /assets/images/icons/test/test@3x.png 3x">
```

↓

```.html
<img appSrc="/assets/images/icons/test/test.png">
```

## 今回作成したDirective

``` .ts
import { Directive, ElementRef, Input } from '@angular/core';

@Directive({
  selector: '[appSrc]',
})
export class SrcDirective {
  constructor(
    private el: ElementRef,
  ) {}

  @Input() set appSrc(path: string) {
    this.el.nativeElement.setAttribute('src', path);
    const pathWithoutExtension = path.replace(/\.[^\.]*$/, '');
    const extension = path.substring(path.lastIndexOf('.'));
    this.el.nativeElement.setAttribute('srcset', `${pathWithoutExtension}@2${extension} 2x, ${pathWithoutExtension}@3${extension} 3x`);
  }
}
```

仕様として、必ず `2x`, `3x` のものは、〇〇@2x.png のようなファイル名にすることを義務付けていはいますが、これでめんどうな `src`, `srcset` を簡単に速くかけます。

## まとめ

Directive なんかよくわからないけど避けてきた人もいるのではないでしょうか。
今回の例のように、実は超簡単に強力なコードがかけます。
ディレクトリまるごとアーカイブ

shutil を使おうよ，なんて言わないで．

# 背景

shutil.make_archive() を使うと，なぜかアーカイブのルートが'.'になってしまい，気に食わないのであった．
ちょっとぐぐっただけだと，ディレクトリまるごと操作は固めるのも消すのもshutilを使えって風潮に一石を投じる，などということはなく，自分が使い易いような関数を書いただけ．

# src

短いので，多分ソースを見た方が圧倒的に早い．
https://github.com/hadacchi/archivedir

（7/7 修正)
個人的な好みにより，無圧縮zipになる．archivedir内のZIP_STOREDのとこを直せば圧縮されるはず．

```diff
--- a/archivedir/archivedir.py
+++ b/archivedir/archivedir.py
@@ -1,7 +1,7 @@
 from .listdir import listdirs,listfiles
 from os import remove, rmdir
 from os.path import isdir
-from zipfile import ZipFile, ZIP_STORED
+from zipfile import ZipFile, ZIP_STORED, ZIP_DEFLATED

 def archivedir(zipfilename,targetdir,mode='keep'):
     '''archive dir recursively
@@ -12,7 +12,7 @@ def archivedir(zipfilename,targetdir,mode='keep'):
     if not isdir(targetdir):
         raise Exception('No directory')
     flist = listfiles(targetdir)
-    with ZipFile(zipfilename,'w',ZIP_STORED) as zfile:
+    with ZipFile(zipfilename,'w',ZIP_DEFLATED) as zfile:
         for f in flist:
             zfile.write(f)
     if mode == 'remove':

```

ファイル名はソートされてなければならない！って人はarchivedirの14行目でsortedする．

```diff
--- a/archivedir/archivedir.py
+++ b/archivedir/archivedir.py
@@ -11,7 +11,7 @@ def archivedir(zipfilename,targetdir,mode='keep'):
     '''
     if not isdir(targetdir):
         raise Exception('No directory')
-    flist = listfiles(targetdir)
+    flist = sorted(listfiles(targetdir))
     with ZipFile(zipfilename,'w',ZIP_STORED) as zfile:
         for f in flist:
             zfile.write(f)
```

# 使い方

test.py がサンプルになっている．
簡単すぎて，ぐぅの音も出ない．

# 注意

アーカイブしたら消すオプションもつけてみた．
普通に消してくるので注意してね．

shutil.rmtree() を使おうよ，なんて言わないで．
圧縮まで書いた時点でほぼ必要なパーツは揃ってたから，ついでに書いた．
Nginxで簡単にライブストリーミングサーバ構築(ubuntu)

簡単にRTMPでライブストリーミング配信できるサーバを構築する方法を説明します。

# 環境
OS: Ubuntu 16.04.4 LTS

# 必要な物をインストール

```
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev -y
```

# スクリプトをダウンロード

簡単に構築するために、こちらの[スクリプト](https://github.com/losywee/rtmp-streaming-server-build-script)を使います。

```
$ git clone https://github.com/notaweelos/rtmp-streaming-server-build-script.git
```

# スクリプトを実行

```
$ cd rtmp-streaming-server-build-script
$ sudo bash ./build.sh
```
ディレクトリを移動し、実行します。

```
1. Nginx-with-rtmp
2. Tengine-with-rtmp
3. Openresty-with-rtmp
First: you must install PCRE library and wget
---------------------------------------------------------------------------------
CentOS: yum -y pcre-devel
Ubuntu: apt-get install libpcre3 libpcre3-dev
---------------------------------------------------------------------------------
Author: losywee@gmail.com
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Please Select build type ( 1 2 3 ) >
```

するとこのような画面になるので、1を選択。
構築が始まり、しばらく待ちます。

# confファイル設定

nginx.confファイルの最後に下記を追加

```/opt/local/nginx/conf/nginx.conf
rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            hls on;
            hls_path /opt/local/nginx/html;
            hls_fragment 5s;
            hls_type live;
        }
    }
}
```

追加後、confファイルが正常かテスト

```
$ sudo /opt/local/nginx/sbin/nginx -t
```

下記のように返ってきたら問題なし。

```
nginx: the configuration file /opt/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /opt/local/nginx/conf/nginx.conf test is successful
```

#Nginxを実行

```
$ sudo /opt/local/nginx/sbin/nginx
```

#配信設定

OBSなどの配信ソフトで下記のように設定

URL： `rtmp://{ipアドレス}/live`
ストリーミングキー： `自由`
※以降ストリーミングキーは{key}、ipアドレスは{ipアドレス}と記述

#WEBページ作成

index.htmlファイルを編集

```/opt/local/nginx/html/index.html
<!DOCTYPE html>
<html lang="en" class="">
<head>
  <link href="http://vjs.zencdn.net/4.2.0/video-js.css" rel="stylesheet">
  <script src="http://vjs.zencdn.net/4.2.0/video.js"></script>
</head>
<style type="text/css">
  #live {
    position: absolute;
    left: 0;
    top: 0;
    min-width: 100%;
    min-height: 100%;
    width: 100%;
    height: 100%;
    z-index: 1;
}
</style>
<body>
  <video id="live" class="video-js vjs-default-skin" controls autoplay fullc
   preload="auto" data-setup='{}'>
    <source src="{key}.m3u8" type='application/x-mpegURL'>
    <source src="rtmp://{ipアドレス}:1935/live/{key}" type='rtmp/mp4'>
    <p class="vjs-no-js">サポートしておりません</p>
  </video>
</body>
</html>
```

#Webページで鑑賞

`http://{ipアドレス}`にアクセスすると、HLSまたはRTMPで自動再生されます。


#VLCで鑑賞
Ctrl+VでURLを打ち込む画面になるので、下記を入力し再生

```
rtmp://{ipアドレス}:1935/live/{Key}
```


#参照元
http://www.hiroyuki.com/posts/615307/
https://qiita.com/nuxaxtu/items/250ca4fb4e102fa425d7
https://qiita.com/drasky1132/items/93ab71742175914e61cb
https://github.com/losywee/rtmp-streaming-server-build-script
pythonを使ってOpenWeatherMapから天気情報を取得

# 背景
Nature Remoで測定した室温と天気の気温を比較してみたい。
調べたらいろいろ方法出て来るけど、調べたのとは微妙に違うやりかたでjsonを表示してみた。

# 環境
- GCPの無償のVMインスタンス
- python 3.6.3

# やったこと
## OpenWeatherMap
OpenWeatherMapを登録。
Sign UpしてAPI Keysを確認。

[Сurrent weather and forecast - OpenWeatherMap](https://openweathermap.org/)

# Python
認証もなく、くせのないAPIなのでシンプル。

```python
import requests
import json

city_name = "Kobe" # 主要な都市名はいけるっぽい。
API_KEY = "xxx" # xxxに自分のAPI Keyを入力。
api = "http://api.openweathermap.org/data/2.5/weather?units=metric&q={city}&APPID={key}"

url = api.format(city = city_name, key = API_KEY)
print(url)
response = requests.get(url)
data = response.json()
jsonText = json.dumps(data, indent=4)
print(jsonText)
```

# 結果
いろんな情報入ってる。units=metricで聞いてるから、摂氏で温度見れる。

```json
{
    "coord": {
        "lon": 135.19,
        "lat": 34.69
    },
    "weather": [
        {
            "id": 803,
            "main": "Clouds",
            "description": "broken clouds",
            "icon": "04n"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 26,
        "pressure": 1006,
        "humidity": 83,
        "temp_min": 26,
        "temp_max": 26
    },
    "visibility": 10000,
    "wind": {
        "speed": 10.3,
        "deg": 190
    },
    "clouds": {
        "all": 75
    },
    "dt": 1530889200,
    "sys": {
        "type": 1,
        "id": 7514,
        "message": 0.1609,
        "country": "JP",
        "sunrise": 1530820333,
        "sunset": 1530872140
    },
    "id": 1855207,
    "name": "Kobe",
    "cod": 200
}
```

# 所感
簡単に情報とれて便利。
精度はどうなんやろ。
次、Nature Remoで取得した室温との違いを見れるようにしたい。

# 参考
[無料天気予報APIのOpenWeatherMapを使ってみる - Qiita](https://qiita.com/nownabe/items/aeac1ce0977be963a740)

[PythonでOpenWeatherMapから東京の天気を定期的に取得して保存する - 渋谷ほととぎす通信](http://www.shibuya24.info/entry/cron_openweathermap)

[OpenWeatherMap API v2.5から天気を取得する - Qiita](https://qiita.com/key/items/aad73fd6057484f20731)

[Nature Remoで測定した室温をThingSpeakに渡して表示。 - Qiita](https://qiita.com/iton/items/e88121525ddb6ad6e13a)
Rustで競技プログラミング用の標準入力関数を作った

# 自己紹介
- Rust歴: チュートリアルを読んだ
- 競技プログラミング歴: paizaがSランク行っただけ。その他経験なし。
- Qiita初投稿


#概要
「AtcoderでRust使ってブイブイ言わせたい」というモチベで作りました。色々調べたけど、同じ行に複数の数値が与えられた場合に対応した読み込み関数がなかった。(あったら教えて)
以下のread_line関数を呼び出すごとに、次の行にある任意の個数の数値をVec型に格納して返します。型はu32、f32とかなら動きます。速度に関しては何も調べてないです。

#ソースコード
```rust

use std::str::FromStr;
use std::fmt::Debug;

fn read_line<T>() -> Vec<T>
where T: FromStr, <T as FromStr>::Err : Debug{
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).unwrap();
    s.trim().split_whitespace().map(|c| T::from_str(c).unwrap()).collect()
}
```

#例
###入力テキスト例

```
2 3 4 5
4 3 5 6
10 12
13 20 34
```

###関数の使い方
```rust

fn main(){

    let x : Vec<u32> = read_line();
    let num = x[1];
    println!("num ={}", num);
    for _ in 0..num{
        let values: Vec<i32> = read_line();
        println!("{:?}", values);
    }
}

```
Gitを導入するために色々調べてみた ~Subversionとの比較編~

勤務先をSubversion(以下、SVN)からGitへの移行することを勝手な使命としている為、
移行のメリットをより説得力のある形で説明出来るように調べてみました。

移行経験がある方、是非コメントお願いします。

## GitとSubversionの違い

>Gitは分散型、SVNは集中型

Gitはローカルリポジトリを作成できるのに対し、SVNはリモートリポジトリのみ。

### Git(分散型)のメリット

![512px-Git-logo.svg.png](https://qiita-image-store.s3.amazonaws.com/0/199056/e343e11e-fb81-0401-8791-4b915aed452c.png)

* 全体で共有しなくても良い内容でも一時保存出来る  
→例えば、試しに２パターン作ってみてとりあえずローカルコミットし、比較することができる
* リモートリポジトリが死んでいてもローカルコミットができる
→サーバーがダウンしていたとしてもとりあえず保存できる。サーバーの可用性上げろってのは言わない約束で・・・  
  
* ブランチを切りやすい
→作業ごとにローカルブランチを切って作業ができる為、作業の中断が発生した場合にとても便利。
SVNの場合は別途チェックアウトするか、作業内容をコピーして一度リベートするかしか中断できない。

* ブランチ、マージが軽量
→SVNと比べてマージがとても早い。ブランチもささっと切れる。

* 各々がバックアップになる
→開発者がそれぞれのPCにリポジトリを持つことになる為、サーバーが死んでもリポジトリは残っている。

## SVN(集中型)のメリット

![200px-Subversion-logo-cropped.png](https://qiita-image-store.s3.amazonaws.com/0/199056/fe63ff87-199d-231d-4467-2498ff8e3b3f.png)


* 構造がシンプル  
→完了した作業をリモートリポジトリにコミットするだけの為、シンプル

個人的には慣れてしまえば構造のシンプルさは大したメリットではないし、
明確な運用ルールを決めてしまえば大丈夫だと思う。
これだけ確認のステップがあれば間違えてコミットする可能性も減る為、むしろメリットと言えそう。

* リビジョン番号がシンプル
SVNはリビジョンを数字で管理するが、Gitはハッシュ値で管理している。  
リビジョン番号○○見てください〜みたいな発言はしやすい。

# 手始めにgit-svn使ってみた
SVNのGit移行について調べるとよく見かけるので、職場で自分だけ導入してみた。

### 行った作業

* SVNユーザーとGitユーザーの紐付け
* 管理対象外ファイルの設定
* masterブランチとSVNブランチの紐付け  
→本来はtrunkと紐付けるがブランチで作業していた為、設定した
* リポジトリのクローン  
→ソースとログの取得を行う

### 所感

ローカルブランチがとても便利。タスクをRedmineで管理している為、
チケットごとにブランチを切ることで作業を中断して別ブランチで作業出来るのは本当に助かる。

デメリットは、操作に慣れていない為、コミットログを間違えた時や競合が発生した時にテンパってしまったこと。
ちゃんと勉強しろって話ですが。

## まとめ
SVNのメリットはシンプルさ（学習コスト）くらいなので、それならより高級な機能が使用できるGitを使用したい。
（希望になってしまいますが）  
大変な学習コストでも無いし、最近は連携するツールがかなり増えてきている為、Gitの方が何かと使い勝手も良い。

## 参考

以下、参考にさせていただきました。
ありがとうございます。

http://tracpath.com/works/development/subversion_vs_git/
http://programming-study.com/trouble/git-subversion-which-should-i-use-for-source-code-control/
https://qiita.com/sh-ogawa/items/0bac2516d85e3db4dfd8
メモ：Ubuntu 17.10のキーボード入力をMacに合わせる設定（一部だけ）

# 概要
会社ではMac、自宅ではLinux(Ubuntu17.10)を使っている。

コピペのショートカットが違ったり、Macでは使えるemacsライクな移動（Ctrl+aなど）がUbuntuではターミナル以外で使えずストレスなので、Macのほうに揃えるべく頑張る。

他にも違いはいろいろとあるだろうけど、個人的によく使うものだけ。

# 環境
 * OS: Ubuntu 17.10
 * キーボード: HHKB Professional2（Lite ext.モードで使用）

# できたこと
 * Ctrl+a, Ctrl+eあたりの移動をできるように
 * CtrlではなくSuper（windowsキー）をつかったコピペ（Ctrl+{x,c,v}から変更）
 * CtrlではなくSuperをつかった取り消し（Ctrl+zから変更）
 * 全選択をCtrl+aからSuper+aに変更
 * 検索（Ctrl+f）はSuper+fに変更

# やったこと
## emacsライクな移動、ターミナル外でのSuperをつかったコピペなど
xremapを使う。

 * Super+v、Super+aが別のショートカットと被っているので、システム設定のショートカットの設定を変える
 * GitHubのREADMEを参考にしてインストール
    * https://github.com/k0kubun/xremap#installation
 * configファイルの作成

```text:~/xremap_config
remap 'C-b', to: 'Left'
remap 'C-f', to: 'Right'
remap 'C-p', to: 'Up'
remap 'C-n', to: 'Down'

remap 'C-a', to: 'Home'
remap 'C-e', to: 'End'

remap 'Super-x', to: 'Ctrl-x'
remap 'Super-c', to: 'Ctrl-c'
remap 'Super-v', to: 'Ctrl-v'

remap 'Super-z', to: 'Ctrl-z'
remap 'Super-f', to: 'Ctrl-f'
remap 'Super-a', to: 'Ctrl-a'
```

 * systemdに登録
    * 下記のファイルを用意した上で、`systemctl --user enable  xremap.service`を実行。

```text:~/.config/systemd/user/xremap.service
[Unit]
Description=xremap

[Service]
KillMode=process
ExecStart=/home/xxx/bin/xremap /home/xxx/xremap_config
ExecStop=/usr/bin/killall xremap
Restart=always
Environment=DISPLAY=:0.0

[Install]
WantedBy=graphical.target
```

 * 本当はログイン時（起動時？）にxremap.serviceが起動するはずだけど、しなかったので下記を設定（ファイルの末尾に追加）

```text:~/.profile
systemctl --user start xremap.service
```

## ターミナルでのSuperをつかったコピペ

* ターミナルの設定から、ショートカットを変更する。（設定→ショートカット）
    * コピー：Super+c
    * ペースト:Super+v

# リンク
* xremap
    * https://k0kubun.hatenablog.com/entry/xkremap
    * https://github.com/k0kubun/xremap
【C#】フォームの最前面表示が効かない場合がある？とりあえずの対処法。

最前面ウィンドウ大好きでいろんなプログラム言語で書いてみていたんですが、C#のフォームでプロパティにTopMost = true;と指定しただけだと、なぜか時々、最前面表示が効かないことがあるんです。

んで「プロパティにTopMost = true;と指定」ってどういうことか考えてみると、フォームのコンストラクタ実行時にフォーム.Designer.cs の InitializeComponent() を実行してその中で指定してる、ってことなんですよね。

このタイミングでは早すぎてフォームを完全に表示しきる前にプロパティ指定をして結果的に空振りすることがあるのではないか…と**妄想してみました。**

なのでもう少し遅いタイミングでこの指定を実行してはどうかと。

と思って色々調べてて見つけたページ
<a href="https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/order-of-events-in-windows-forms">Windows フォームのイベントの順序 | Microsoft Docs</a>

これを見て、そうか、Form_Shownというイベントがあるのかー、と思ってイベントハンドラを追加してその中で指定するようにしたら、最前面表示が効かない不具合は、ほぼ起こらなくなりました。
2018年7月第1週　今週気になった記事まとめ

# 今週気になった記事まとめ
##■macOSマルウェア「OSX.Dummy」、仮想通貨関連のチャットで流通
http://www.itmedia.co.jp/enterprise/articles/1807/05/news078.html
Macはこの手のウィルス、マルウェア的な問題の印象があまり無かったので目に付いた。
また最近Slackを使い始めた中で、こういった攻撃のされ方があることも参考になった。

##■中小企業の45％は「Windows 7サポート終了を知らない」
http://www.itmedia.co.jp/pcuser/articles/1807/03/news055.html
本題よりもWindowsDefenderの能力の高さが印象的。もはやMcAfeeなどをわざわざ入れる必要はないのだろうか・・・。
50％以上の導入率は意外。個人的には昔ながらのウィルス対策ソフトがまだ猛威を振るっている印象だった。
本題についてはキッティングなどの駆け込み需要が直前になると出てくるだろうと思うので、一つのチャンスになる可能性はあるかなと思った。

##■身障者目線の話
■音声認識ソフトを使ってキーボードより速くプログラムをコーディングする実例
■Appleは盲目や弱視など視覚障害を持つ人々がイノベーションを加速させる重要な要素だと考えている
https://gigazine.net/news/20130816-code-by-voice/
https://gigazine.net/news/20160906-blind-apple-engineer/
当然だけど自分たちにはまず出せない観点から生まれるアイデアであり、この記事に出てくるアイデアは基本的に身障者向けのものが多いが、そのアイデアの先に身障者に限らず全体にヒットするものが隠れていたりするんじゃないかなと思った。

##■ガントチャートが作れるサービスを使ってみた【teamgantt編】
https://dev.classmethod.jp/project-management/ando-20180701/
ガントチャートに関する機能はかなり便利そうに感じるが、細かいタスク管理はできず連携サービスも少ないらしいので惜しい感が凄い。
どのツールを使っても片手落ち感があるのは致し方ないのか・・・？

##■インフラ勉強絡み
■何を見て勉強すればいいの？という方へ。
■AWS再入門2018 そもそもAWSって何？編
https://qiita.com/sax_/items/e0ff1e3358fed197d308?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items
https://dev.classmethod.jp/cloud/2018-aws-re-entering-what-aws/
今まで見たこういう系の記事の中で一番情報がまとまっていた印象。

##■社内の人間が「褒め合う」には、どうすればいいのか
http://www.itmedia.co.jp/business/articles/1807/06/news013_4.html
最後の方でほめるためのきっかけの話として出てくる社内報の部分が定例会で活用できたりしないかと思った。

##■Gitで直近のコミットをコミット前に戻すにはgit reset @~
https://qiita.com/suin/items/8c9862ca9d3bfe90c238?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items
度々困り、度々調べているはずなのに何故か知らなかった情報が入手できた。
JSで幅優先探索・深さ優先探索アルゴリズムを5行で実装してみた

## デモ
https://jsfiddle.net/kahirokunn/xfq3u9aj/1/

## 今回の対象データ構造
```js
const rootNode = {
	tag: 'html',
	children: [
		{
			tag: 'head',
			children: [
				{
					tag: 'meta',
					text: 'csrf-token: hogehoge',
				}
			],
		},
		{
			tag: 'body',
			children: [
				{
					tag: 'span',
					children: [
						{
							tag: 'h1',
							children: [
								{
									tag: 'text',
									text: 'Hello World',
								},
								{
									tag: 'text',
									text: '1',
								},
							],
						},
						{
							tag: 'p',
							text: 'Hello World',
						},
					],
				},
			],
		},
	],
};
```

## ログなしの解析コード
```js
const stack = [rootNode];
while (stack.length > 0) {
	const row = array.shift();
	if (row.children) row.children.forEach(childNode => stack.push(childNode));
}
```

## ログあり
```js
const stack = [rootNode];
const dequeue = array => {
	const item = array.shift();
	console.log(item);
	return item;
}
while (stack.length > 0) {
	const row = dequeue(stack);
	if (row.children) {
		row.children.forEach(childNode => stack.push(childNode));
	}
}
```

## 親子関係付き
```js
const stack = [rootNode];
const dequeue = array => {
	const item = array.shift();
	console.log(item);
	return item;
}
while (stack.length > 0) {
	const row = dequeue(stack);
	if (row.children) {
		row.children.forEach(childNode => stack.push(Object.assign(childNode, { parent: row.tag })));
	}
}
```

## 深さ優先探索アルゴリズム
`array.shift()`している箇所をただpopにするだけです。
理論としては、後入れ後出しで、最初にhtmlとbodyの2つのnodeを入れましたが、後ろのから取るからbody要素が取れます。
その次に、bodyの子を順番にpushしていって、後のやつからとるので、必ず次にbodyの小要素の探索がされます。
片方のツリーずつ順番に探索するイメージです。

## 最後に
次は深さ優先探索書いてみようかな。
Vue.jsの仮想DOMはどっちのアルゴリズムで探索して作ってるんだろう？
Laradock v7.2.0でLaravelの開発環境を構築する

# 内容
+ Laradock7.2.0でLaravelの開発環境を整えるまでの話です
+ 公式ドキュメントが古かったり、qiitaでもLaradockのバージョンごとに細かい設定の違いがあるのでLaradock v7.2.0版を書きました


# 環境

+ Mac OS X High Sierra 10.13.4
+ Docker for Mac
+ Laradock v7.2.0

# 環境構築

## Laradockの用意

```shell
# 作業場所を作る、自分がいつも作業に使っているディレクトリでよい
$ mkdir -p /path/to/your/working_dir
$ cd /path/to/your/working_dir
$ git clone https://github.com/LaraDock/laradock.git
$ cd laradock

# 環境変数のデフォルト設定
$ cp env-example .env
```

## コンテナ起動

```
$ docker-compose up -d nginx mysql redis beanstalkd
```

+ 起動しますが、まだこのままではLaravelは動きません(公式には動きそうな感じで書いていますが・・・)

## プロジェクト作成

+ 起動したコンテナを利用してlaravelのプロジェクトを作成します

```shell
# at /path/to/your/working_dir/laradock
$ docker-compose exec workspace composer create-project laravel/laravel test_app
$ ls ../
test_app laradock
```

## 環境変数設定

+ デフォルトでは `../` になっています
+ 先程作成したプロジェクト(今回ならば`test_app`)のパスを指定します

```shell:.env
APP_CODE_PATH_HOST=/path/to/your/working_dir/test_app
```

# 動作確認

```shell
$ docker-compose down
$ docker-compose up -d nginx mysql redis beanstalkd
```

この状態で http://localhost/ にアクセスしてLaravelのデフォルト画面が表示されます

# 注意

+ mysqlが最新版のときは認証が変更されていてmigrate時等にハマりがちなので、最新版が必要でない場合は以下のようにしておきましょう

```shell:.env
# 略
### MYSQL #################################################

MYSQL_VERSION=5.7
# 略
```

設定したあとに以下を実行してmsyqlイメージを作り直します

```shell
$ docker-compose build --no-cache mysql
```
[swift] Collectionの添字に演算子を渡す

```title:検証環境
$ swift --version
Apple Swift version 4.1 (swiftlang-902.0.48 clang-902.0.37.1)
Target: x86_64-apple-darwin17.6.0
```

# Collectionの添字に ... 演算子を渡す事ができる

一部のCollection型に、 `(UnboundedRange_)->()` という関数をサブスクリプトの引数に取るメソッドが実装されていることを知りました。

[Array\<Element\>](https://developer.apple.com/documentation/swift/array/3017548-subscript)

```class:Array\<Element\>
subscript(x: (UnboundedRange_) -> ()) -> ArraySlice<Element> { get }
```

[String](https://developer.apple.com/documentation/swift/string/2945732-subscript)

```class:String
subscript(x: (UnboundedRange_) -> ()) -> Substring { get }
```

これによって以下のように、添字に `...` 演算子を指定することで、
簡単にすべての要素を含むサブシーケンスを取得することができます。

```swift:サブシーケンスの取得
func count(_ sub: Substring) -> Int {
    return sub.count;
}

print(type(of: "hello"[...])) // Substring
print(count("hello"[...]))    // 5
```

# 添字に ... 演算子を指定できる理由

これは　**UnboundedRange_** 型内で、 `...` 演算子がオーバーロードされているためです。

```swift:UnboundedRange
public enum UnboundedRange_ {
  public static postfix func ... (_: UnboundedRange_) -> () {
    fatalError("uncallable")
  }
}
```

上記の `...` 演算子を呼び出すと、内部でfatalErrorが呼び出されてクラッシュします。
ここで重要なことは、`...` 演算子が **(UnboundedRange_) -> ()** 型であることです。

これによって呼び出し側の型で、`subscript (_: (UnboundedRange)->())` メソッドをオーバーロードすることによって、 `...` 演算子が引数に指定されると、オーバーロードしたメソッドが呼び出されるという寸法です。

実際には、Collectionでオーバーロードされています。

[github 実際の実装](https://github.com/apple/swift/blob/a4230ab2ad37e37edc9ed86cd1510b7c016a769d/stdlib/public/core/Range.swift#L839)

```swift:Range.swift
public typealias UnboundedRange = (UnboundedRange_)->()

extension Collection {
    public subscript(x: UnboundedRange) -> SubSequence {
        return self[startIndex...]
    }
}
```

ということは以下のように `(Int)->(Int)` を受け取るsubscriptをArray\<Element\>でオーバーロードするだけで、 `+` や `-` 演算子を引き渡すことによって、オーバーロードしたメソッドを呼び出せるはずです。

```swift:Array+.swift
extension Array where Element == Int {
    subscript (_ op: (Int) -> (Int)) -> [Int] {
        return self.map {
            return op($0)
        }
    }
}

let arr: [Int] = Array(1..<4)
print(arr[+]) // OK [1, 2, 3]
print(arr[-]) // OK [-1, -2, -3] 
```

問題なくオーバーロードしたメソッドが呼び出されました。

# カスタムの演算子を添え字に指定できるようにする

`...` 演算子と同様に、 添字に `..<` 演算子を指定すると、内部でdropLastを呼び出すsubscriptメソッドをオーバーロードいたしました。

```swift:DroppedLastRange.swift
postfix operator ..< // ①

enum DroppedLastRange_ {
    public static postfix func ..<(_: DroppedLastRange_) -> () {
        fatalError("uncallable")
    }
}

// ②
typealias DroppedLastRange = (DroppedLastRange_) -> ()

extension Array {
    // ③ subscriptメソッドをオーバーロード
    subscript (_ index: DroppedLastRange) -> ArraySlice<Element> {
        return self.dropLast()
    }

}

print(([] as [Int])[..<]) // [] 
print([0][..<])           // []
print([0,1][..<])         // [0]
print([0,1,2][..<])       // [0,1]
```

**Note:**

① `...` 演算子も postfix なので合わせました
② `UnboundedRange_ -> ()` も同様に `UnboundedRange` と型名がつけられています
③ subscriptメソッドをオーバーロードすることによって、添字に `..<` が指定されると呼び出されます

# まとめ

改めて **型** の使い方を勉強させていただきました。

# 参考サイト

[Swift] UnboundedRangeを“呼ぶ”
https://qiita.com/YOCKOW/items/dd409b9588f4be72f58f

Unbounded Ranges in Swift 4
https://tonisuter.com/blog/2017/08/unbounded-ranges-swift-4/
Vimiumの基本的な使い方

自分用のメモを兼ねたVimiumの使い方をまとめました.

#Vimiumとは
VimiumはGoogle Chromeの拡張機能です.
[Vimiumをインストール](http://vimium.github.io/)

# Vimiumを使う利点
- Chromeをマウスをなるべく使わずに操作することができます!

- ショートカットを好きに拡張することができます!!

# Vimiumコード一覧
よく使うショートカットをまとめました.
特に重要だと思うものは**太文字**で表示しています.
詳細は Shift+? で調べることができます.
スクロール
------
ページスクロールのためのショートカットを紹介します.

- 基本的なスクロール

|キー|操作|
|:--:|:--:|
|**k**|**上**|
|**j**|**下**|
|l|右|
|h|左|


- 大きなスクロール

|キー|操作|
|:--:|:--:|
|**u**|上(50%)|
|gg|上(100%)|
|**d**|下(50%)|
|G|下(100%)|

リンクを開く
------
リンクを様々な方法で操作したい時に,下記を使います.
これは **めちゃめちゃ使います.**

|キー|操作|
|:--:|:--:|
|**f**|**現在のタブで開く**|
|**F**|**新しいタブで開く**|
|o|現在のタブで検索|
|O(shift+o)|新しいタブで検索|

タブの操作
------
タブを操作するためのショートカットを紹介します.

- タブの移動

|キー|操作|
|:--:|:--:|
|**K**|右のタブに移動|
|**J**|左のタブに移動|

- タブを作成・閉じる・復元

|キー|操作|
|:--:|:--:|
|**t**|**作成**|
|**x**|**閉じる**|
|X|復元|




検索
------
文字列の検索を行いたいときに使います.(Insertモード)

|キー|操作|
|:--:|:--:|
|/|検索する|
|n|新しいタブで検索|
|N|現在のタブで検索|
|yy|URLのコピー|

# まとめ
Vimiumを使うことでブラウザの操作が格段に快適になりました.
ただウェブサイトが提供しているショートカットと競合し使えないこともあるので注意してください.
Vue.jsでEnumのようなモノを作る

#概要
javascriptにはEnum（列挙型）がありません。
ですが、SinglePageApplicationだとサーバーサイドで持っている列挙型の定義を
フロントエンド側でも使いたい場合があるので、Enumもどきを作ってみました。

#前提
Vue.jsで作られたアプリケーション内でEnumを使いたいと考えています。
なので、

```vuejs:App.vue
<template>
<div>
  <!-- 男性 -->
  <p>{{Enum.EnumSex.Male}}</p>
</div>
</template>

```

といった使い方を想定します。
TypeScriptにすれば列挙型を使うことができるのですが、
Vue.jsのTypescript化はなんかすごい大変なので・・・・割愛します。
またの機会に。

#詳細
##Enumもどきのオブジェクト
javascriptで列挙型を実現するにはObjectを使うしかありません。
前述の例だと

```javascript:sample
var EnumSex = {
  Male:"男性",
  Female:"女性"
}
```

という形で定義することができます。
ただ、これだとシステム的に「男性＝１」「女性＝２」といったコード定義を
判定することはできません。なので、さらにObjectを入れ子にして、
定義と表示用文字列を分けてみます。

```javascript:sample
const EnumSex = {
  Male:{
    val:1,
    text:"男性"
  },
  Female:{
    val:2,
    text:"女性"
  }
}
```

これであれば

```javascript:sample
EnumSex.Male.text //男性
```

と表現できます。

#import用ファイルにまとめ
定義しただけだと、Vue.jsのコンポーネント内で使えないので、
importしていく必要があります。
importするためのファイルを下記のように作成します。

```javascript:Enum.js
//商品一覧並び順
export const EnumItemListSort = {
  //価格の昇順
  PriceLowestFirst : {
    val:"1",
    text:"金額が安い順"
  }, 
  //新着順
  NewestFirst : {
    val:"2",
    text:"新着順"
  }
} 
//性別
export const EnumSex = {
  Male:{
    val:1,
    text:"男性"
  },
  Female:{
    val:2,
    text:"女性"
  }
}
```

列挙型は基本的に後から変更をしないのでconstで定義します。
同一ファイル内にexportで定義をしておきます。
export defaultだと任意の１つしか読み込まれないので注意ください。

#Vue.js単一ファイルコンポーネントへの読み込み
単一ファイルコンポーネント内でimportします。

```vuejs:App.vue
<template>
  <div>
<input type="radio" name="sex" :value="refEnum.EnumSex.Male.val">{{refEnum.EnumSex.Male.text}}
<input type="radio" name="sex" :value="refEnum.EnumSex.Female.val">{{refEnum.EnumSex.Female.text}}
  </div>
</template>

<script>
import * as Enum from '@/lib/definition/enum';
export default {
  name: 'sample',
  data: function(){
    return {
      //data内ではEnumの直接参照が可能
      hoge:Enum.EnumSex.Male.val
    }
  },
  computed:{
    //template内ではcomputedを介する必要がある
    refEnum:()=>Enum,
  }
}
</script>
<style scoped>
</style>
```

基本的にはimportするだけでいけますが、template内で使う場合は、
importしたものを直接利用することはできないので、一旦computedに別変数で格納して、
その変数経由で参照する必要があります。めんどくさいですね。

#あとがき
思った以上に列挙型っぽいことをさせるのが面倒で、いっそTypescript化したほうが
早いんじゃないか・・・とやってる最中におもったりもしました。
次は頑張って[vue-class-component](https://github.com/vuejs/vue-class-component)についてまとめたい次第です:sunglasses:
python3でurllibが使えなかった話

#なぜ書くことにしたか
僕はpython3で色々サービスを作っているのですが、その際にurllibがpython3で動かなかったので、
調べてなおすことにしたからです。

案外urllib3を知らない人が多かったw

#状態
mac os High Sierra　10.13.5
pythonの構築はpyenv

```terminal
Alioth:~ sizumita$ pyenv versions
  system
* 3.5.1 (set by /Users/sizumita/.pyenv/version)
```

##3.6.3をインストールしてみる
```terminal
Alioth:~ sizumita$ pyenv install 3.6.3
Downloading Python-3.6.3.tar.xz...
...
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
```
ｷﾞｬｯ

##あれっ？
Terminalから実行するとき、pyenv使ってるからpythonとpython3で実行できるよな？
###python3でやってみた
```python
"""Alioth:~ sizumita$ python3
Python 3.5.1 (default, Oct 13 2017, 20:28:35) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)] on darwin
Type "help", "copyright", "credits" or "license" for more information."""
>>> import urllib.request
>>> with urllib.request.urlopen('http://python-remrin.hatenadiary.jp/') as f:
...     print(f.read(40))
... 
b'<!DOCTYPE html>\n<html\n  lang="ja"\n\ndata-'
>>> 
```
できた！

#やってみての仮説と結果
・pyenvを使うとpythonとpython3の二つのコマンドでpython3を起動できる
・pythonだとpython2の方のライブラリが読み込まれる（と思ってる）
・コマンドラインからpython3でurllibを使うときは、python3コマンドで入るべし?

この謎を誰かわかるかたご教授ください。

それでは。

#追記　urlopenが使えない理由
参考 https://maku77.github.io/python/http-request-with-basic-auth.html
引用 
urllib.request モジュールを使って Basic 認証の設定された Web サイトにアクセスすると、デフォルトでは下記のようなエラーが発生します。

ということです。

~~なぜかpythonコマンドでも使えるようになってた..~~
連続して建物を生成する方法について (初心者必見)

#連続して建物を作成し続ける方法について

建物を連続して置きたい時に使える便利な方法を紹介したいと思います。

**まず、連続して置きたいものを設置します**

![bandicam 2018-07-05 22-22-33-113.jpg](https://qiita-image-store.s3.amazonaws.com/0/257079/4f39c6bf-fba6-b007-1451-55ffa5d0d3b0.jpeg)

**次に、Hierarchyの設置したものを右クリックしてDuplicateをクリック**


![bandicam 2018-07-05 22-26-07-814.jpg](https://qiita-image-store.s3.amazonaws.com/0/257079/47532dc8-9c59-ef3d-ccd7-4be0d263b981.jpeg)

![bandicam 2018-07-05 22-22-33-113.jpg](https://qiita-image-store.s3.amazonaws.com/0/257079/f297c433-e783-473b-395d-2ee02cb4f13b.jpeg)


同じ座標にObjectが生成されるので位置を調整すると
こんな感じになります。


そしたら、からの箱を一つにまとめましょう

![bandicam 2018-07-05 22-27-20-997.jpg](https://qiita-image-store.s3.amazonaws.com/0/257079/a73c1c6d-d692-c707-621c-b243351c7b38.jpeg)


まとめたら、**Street（親）を右クリックし、**Duplicateをクリック

そうすると、親であるStreetに入っているStreetすべてがコピーされましたか？

これで連続して建物を簡単に生成することができます。

#他の方法について

親に入れたりするのが面倒くさいという人向けにもう一つまとめてコピーできる方法を書いていきたいと思います。

Sceneを左クリックしながらコピーしたいObjectを囲むとHierarchy内の指定されたObjectが青くなるので、右クリックして、またDuplicateをするとコピーをすることができます。

#できるようになると．．．

![bandicam 2018-07-05 22-55-27-926.jpg](https://qiita-image-store.s3.amazonaws.com/0/257079/e98ddd1a-0099-6814-855f-ab00f593348d.jpeg)

活用すると簡単にこのような町（道）を作ることができます。

ぜひ活用してみてください。


#使用したObject


Simple City pack plain