OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 10 / 11 で入力言語を切り替えるホットキーを無効にする

# はじめに

不意に入力言語が EN とかになってウザい事この上ないので、入力言語切り替えのホットキーを無効にします。

Windows 10 になってからというもの、設定項目の場所がコロコロ変わるので**「どっから設定するんだったっけ...？」**となりがちです。

...そもそも、大型アップデートでホットキーの設定を元に戻すなって話ですけどね。

# かんたんなやりかた (Windows 10 Build 17134 以降)

1. 〔Win〕+〔R〕で **"ファイル名を指定して実行"** ダイアログを出す。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/50cafbc0-d178-be08-30ef-3aaababdf6a3.png)
 
2. 以下のように入力して [OK] ボタンを押す。 
　` control.exe input.dll,,{C07337D3-DB2C-4D0B-9A93-B722A6C106E2}{HOTKEYS} `

3. **[テキストサービスと入力言語]** ダイアログが [キーの詳細設定] タブで開く。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/0331e18e-324f-f669-f8c4-e1750e43a718.png)

4. "入力言語を切り替える" を選択し、[キーシーケンスの変更] ボタンを押す。

5. どちらも **"割り当てなし"** に設定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/3644073f-c89c-1143-d33a-c87746aac4fa.png)

# まどろっこしいやりかた

## Windows 10 Build 17134 以降

1. **[Windows の設定]** 画面を出す。
2. **[時刻と言語]** をクリック。
3. 左ペインで **[地域と言語]** をクリック。
4. ちょっと下にスクロールして **[キーボードの詳細設定]** をクリック。
5. **[言語バーのオプション]** をクリック。
6. **[テキストサービスと入力言語]** ダイアログが [言語バー] タブで開く。
7. **[キーの詳細設定]** タブをクリック。
8. "入力言語を切り替える" を選択し、**[キーシーケンスの変更]** ボタンを押す。
9. どちらも **"割り当てなし"** に設定する。

## Windows 11

1. **[Windows の設定]** 画面を出す。
2. **[時刻と言語]** をクリック。
3. **[言語と地域]** をクリック。
4. [関連設定] の **[入力]** をクリック。
5. **[キーボードの詳細設定]** をクリック。
6. **[入力言語のホットキー]** をクリック。
7. **[テキストサービスと入力言語]** ダイアログが [キーの詳細設定] タブで開く。
8. "入力言語を切り替える" を選択し、**[キーシーケンスの変更]** ボタンを押す。
9. どちらも **"割り当てなし"** に設定する。

過渡期だからだとは思うけど、ここまでクリックしないと辿り着けない UI にするくらいなら、ホットキーは最初から設定しないでほしい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/9cb166a4-e73a-eb62-16a4-40e3e6180e5d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/dd478ce0-b0f9-a872-be77-9a94b337df87.png)

**〔Win〕+〔Space〕で切り替えられるからホットキーは不要でしょ？**

# おわりに
**〔Alt〕+〔Shift〕+カーソルキーは Delphi の矩形選択開始キー**なので、入力言語のホットキーとカブってウザい事この上ないのです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/34b93e25-c073-436d-6fff-65da634d12c8.png)

今後の大型アップデートで、入力言語切替ホットキーをもう少し簡単に設定できるようになるといいですね。

**See Also:**

 - [デフォルトのキーボード ショートカット (Embarcadero)](http://docwiki.embarcadero.com/RADStudio/ja/%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89_%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88#.E3.82.B3.E3.83.BC.E3.83.89_.E3.82.A8.E3.83.87.E3.82.A3.E3.82.BF.E3.81.AE.E3.82.AD.E3.83.BC.E3.83.9C.E3.83.BC.E3.83.89_.E3.82.B7.E3.83.A7.E3.83.BC.E3.83.88.E3.82.AB.E3.83.83.E3.83.88)
【ShellScript】vagrant sshするときに同時にvagrant rsync-autoを実行するスクリプトを作成する

#【ShellScript】vagrant sshするときに同時にvagrant rsync-autoを実行するスクリプトを作成する。


表題のとおり、vagrant sshするときに、localの変更をキャッチしたらその更新をvagrantで適用するために必要な、vagrant rsync-autoをvagrant sshと同時に一つのコマンドで実行したい際にシェルスクリプトを書いたので、そちらを共有したいと思います。

##コード
実際に同時に実行するシェルを書く前に、今回の内容ではvagrant sshを行うターミナルのタブもしくはウィンドウとvagrant auto-rsyncを行うタブもしくはウィンドウは別のものを使用する必要があるので、コマンドから新しいwindowを開くことができるためのシェルから記載します。

```sh:new_tab.sh
#!/bin/sh
test $# -eq 0 && set -- :
	osascript - "$(pwd)" "$@" <<\EOF
	on run args
	  set dir to quoted form of (first item of args)
	  set cmd_strs to {}
	  repeat with cmd_str in rest of args
	    set end of cmd_strs to quoted form of cmd_str
	  end
	  set text item delimiters to " "
	  set cmd to cmd_strs as Unicode text
	  tell app "Terminal" to do script "cd " & dir & " && " & cmd
	end
```

このスクリプトによって、コマンドラインで次のように実行することで新規タブを開くことができます。

```
$ ./new_tab 
```

では、本題である「同時にvagrant sshとvagrant auto-rsyncを別々のタブで同時実行をする」スクリプトを書いていきます。

```bash:vagrantSSH.sh
#!/bin/bash

./new_tab.sh vagrant rsync-auto
vagrant up
vagrant ssh
```

このスクリプトを実行することで、同時に実行することができます。
注意点としては、new_tab.shとvagrantSSH.shファイルがVagrantfileのあるディレクトリと同じディレクトリにある必要があることだけ注意してください。

実行する際には、```$ ./vagrantSSH```で実行することができます。
[自分メモ]AWS CLI使うならタブ補完を有効に

# はじめに
普段からAWS CLI使ってるくせに、恥ずかしながら[AWS Summit Tokyo 2018](https://www.awssummit.tokyo/tokyo/)で聞いたセッションで初めて知りました。
自分メモとして残しておきます。

# 概要
- AWS CLIはインストールしただけではタブ補完が有効にならない
- `complete`で設定する
- `.bashrc`にも書く
- 本手順はOSX(10.12.6)のbash前提です（自分メモなので）

# 手順
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-command-completion.html)の通りやればＯＫ

## AWSコンプリータのパスを確認
```bash:
$ which aws_completer
/usr/local/bin/aws_completer
```

## タブ補完を有効化
```bash:
$ complete -C '/usr/local/bin/aws_completer' aws
```

## `~/.bashrc`
```bash:~/.bashrc
#aws cli
complete -C '/usr/local/bin/aws_completer' aws
```

# 補足
`.bashrc`と`.bash_profile`、どっちに書くの？という疑問についてはこちらの記事で納得。
https://qiita.com/magicant/items/d3bb7ea1192e63fba850
Amazon Linux2にDockerをインストールする

## Amazon Linux2 とは

> Amazon Linux 2 は、アマゾン ウェブ サービス (AWS) が提供する Linux サーバーオペレーティングシステムである Amazon Linux の次世代バージョンです。安定性に優れ、セキュアで高性能な実行環境であり、さまざまなクラウドアプリケーションおよびエンタープライズアプリケーションの開発や実行に使用されます。Amazon Linux 2 のアプリケーション環境では、長期サポートを受けることができ、Linux コミュニティで最新のイノベーションを利用することもできます。Amazon Linux 2 は追加料金なしで利用できます。

> Amazon Linux 2 LTS Candidate は、Amazon Elastic Compute Cloud (Amazon EC2) で使用する Amazon Machine Image (AMI) として提供されます。また、Docker コンテナイメージとして提供されるほか、VMware、Oracle VM VirtualBox、Microsoft Hyper-V の仮想化ソリューションで使用する仮想マシンイメージとしても提供されます。仮想マシンイメージは、オンプレミスでのデプロイとテストに使用できます。Amazon Linux 2 は Amazon EC2 の最新の機能をサポートしており、AWS と簡単に統合できるパッケージが含まれています。Amazon Linux 2 のセキュリティアップデートとメンテナンスアップデートは継続的に提供されます。

[Amazon Linux 2リリースノート](https://aws.amazon.com/jp/amazon-linux-2/release-notes/)

Amazon Linux 2は各仮想化環境のイメージや、[Dockerイメージ](https://hub.docker.com/_/amazonlinux/)も提供されていてローカルの実行環境を簡単に用意することができます。

各仮想化環境用のイメージ

* [VMWare](https://cdn.amazonlinux.com/os-images/2017.12.0.20180330/vmware/)
* [KVM](https://cdn.amazonlinux.com/os-images/2017.12.0.20180330/kvm/)
* [Oracle VirtualBox](https://cdn.amazonlinux.com/os-images/2017.12.0.20180330/virtualbox/)
* [Microsoft Hyper-V](https://cdn.amazonlinux.com/os-images/2017.12.0.20180330/hyperv/)

本ドキュメントではAmazon Linux 2のインスタンスでDockerを使えるようにセットアップする方法を説明します。

## Dockerのインストール

2021年3月時点では、Docker 19.03-ce がインストールされます。

```
sudo yum install -y docker
sudo systemctl start docker
sudo usermod -a -G docker ec2-user
```
※ec2-userの場合を想定

### 自動起動を有効にする

```
sudo systemctl enable docker
```

## docker-composeのインストール

2021年3月時点での最新のDocker Composeは1.28.5なので、これをインストールします。

```
sudo curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```

## 参照

* [Amazon Linux 2 の登場と、Amazon Linux との違い、移行方法などをQ&Aから抜粋したメモ](https://qiita.com/michimani/items/146d1f986d78e06d510e)
* [Amazon Linux2とAmazon Linuxの違いについて（メモ）](https://qiita.com/akira345/items/2a09c4d06d2e3415bc8d)
Laravel チェックボックスのchecked="checked"はどうやって表示させるの？

#結論
これ↓

```html:blade
<input type="checkbox" name="fluits[]" value="1"
{{ is_array(old("fluits")) && in_array("1", old("fluits"), true)? 'checked="checked"' : '' }}
>
```

#以下結論に至った流れ

#### はじめに
・laravelのview(~~~.blade.php)です
・どうしてもinputタグを使って今回の問題をクリアしたい
・Form::checkbox()メソッドは使いたくない
・チェックボックスは複数選択されるものとする

## リダイレクトした際にチェックされない
```html:blade

<input type="checkbox" name="fluits[]" value="1" {{ old("fluits") === "1"? 'checked="checked"' : '' }}>
<!-- nameを配列[]にすることで、複数選択された場合でも値が全て取得できる -->
```

####{{}}の中は三項演算子
```html:blade

{{ old("fluits") === "1"? 'checked="checked"' : '' }}
<!-- ↑はつまりこういう↓こと -->
@if(old("fluits") === "1")
  checked='checked'
@else

@endif
<!-- old()で直前の入力値を取得して値と比較し、trueならchecked="checked"を返す -->
```

しかし取得した値は配列なのでこれじゃうまくいかない；


### in_array()で配列に値があるかチェックする

```html:blade

<input type="checkbox" name="fluits[]" value="1" {{ in_array("1", old("fluits"), true)? 'checked="checked"' : '' }}>
```


これだとold()で取得した値がNULLのとき怒られる；
【in_array() expects parameter 2 to be array, null given】



## is_array()、in_array()を併用して解決
```html:blade
<input type="checkbox" name="fluits[]" value="1" {{ is_array(old("fluits")) && in_array("1", old("fluits"), true)? 'checked="checked"' : '' }}>
```

今のところこれしか思いつかないよ(´・ω・`)
Ansible systemdモジュールの起動時自動開始が有効にならない時の対処法

# 概要

~~Amazon Linux2.xでsystemdモジュールとserviceモジュールでサービスの起動時自動開始を設定しても、有効にならない現象に遭遇したので、その対処法を残したいと思います~~


# easy missでした（2018.6.6追加）

systemdのnameにサービスのフルネームを記述しなければならないが、
`.service`を含めない名前で記述していた

```yaml
# ***** NG case *****
- name: Enable my service
  systemd:
    name: myservice
    enabled: yes

# ***** OK case *****
- name: Enable my service
  systemd:
    name: myservice.service
    enabled: yes
```

# 対処法

## systemdを使わずにserviceモジュールに **use: service** を追加します

```yaml:service.yml

- name: Enable my service
  service:
    name: myservice
    enabled: yes
    use: service
```

## systemdのnameにサービスのフルネームを記述

```yaml:systemd.yml
# ***** OK case *****
- name: Enable my service
  systemd:
    name: myservice.service
    enabled: yes
```


# 確認方法

```
> systemctl list-unit-files
```

# 情報源

https://github.com/ansible/ansible-modules-core/issues/3764
de:code18で知ったPWA(Progressive Web Apps)の概要の備忘録

# まとめ
de:code18でのセッションで知った、PWAのことの備忘録です。
間違ってたりしてたら教えてください。

![1_JcxO284S51FGR3tSriBqBg.png](https://qiita-image-store.s3.amazonaws.com/0/91558/72266c40-aada-8d21-7d1f-1c52b6844196.png)

# PWAとは?
簡単にいうと「Webによるネイティブアプリっぽいもの」

これまでにWebではネイティブアプリができてWebで実装できなかったから**新しくAPIとかmanifest.jsonを使ってできるようにしようぜ**っていう話

### PWAで使うAPI
- オフラインのサポート (Cashe API)
- プッシュ通知 (Push API)
- バッググラウンド処理 (Background Sync)
- スマートフォンへのトップへのアイコン追加 (manifest.json)

## ハイブリットアプリとの違いは?

ハイブリットアプリは無理やりそれぞれのOSでWeb View上からNativeの機能を使っている。

それに対して、**PWAは普通のWebコンテンツの延長線上のもの。**

PWAは普通のWebと同じようにWebサーバからコンテンツが配信される。**(ここでサーバが端末によって処理を変えるようなことはしない)**

PWA非対応のブラウザで、もしPWAに対応したサイトにアクセスした場合、普通のWebサイトと同じように動く。

## いままでのWebの実装と違うところは?

**あんまない**
違うのはmetaタグにmanifest.json(アイコン情報とかアプリ名とかのメタファイル)の記述が増えたり、Push APIとかCashe APIとか必要な場合にjsの記述をするだけ。

## メリット
PWAは普通のWebに機能を追加したものなので、Webの利点とNativeアプリの利点を持てる。

- **発見性**
    - GoogleなどのWeb検索エンジンに引っかかる
    - アプリ検索エンジンにも自動で引っかかるように...(?)
- **インストール可能**
    - アプリがトップ画面に追加できる
    - ストアの審査がいらない
- **再エンゲージ可能**
    - プッシュ通知ができる　
    - ユーザを離さない仕組みとかができる。強い。
- ネットワーク非依存
    - オフラインでもアプリとして動かすことができる
    - 柔軟なキャッシュができる。※注意が必要
- プログレッシブ
    - Webサーバからコンテンツ配信のみで、高機能なブラウザであればアプリとしてみることも可能。低機能なブラウザであればいままで通り普通のWebサイトとして見れる。
- レスポンシブ
    - メディアクエリ等でさまざまな端末サイズに対応できる
    - いわゆるレスポンシブサイトがそのままレスポンシブアプリに
- 安全
    - httpsで安全
- リンク可能
    - Webの最大の利点がそのまま持ってこれる

# 実装方法

先ほどの4つの機能は以下のように実装する。

- Service Worker(sw.jsを使う)
    - オフラインのサポート (Cashe API)
    - プッシュ通知 (Push API)
    - バッググラウンド処理 (Background Sync)
- manifest.json(メタタグに記述)
    - スマートフォンへのトップへのアイコン追加




# bing(検索エンジン)がやろうとしていること(?)

以上の話はググればだいたいわかる話です。
de:code18のセッションではここが訴求ポイントだったと思います。

**bingはPWA対応しているサイトを引っ張ってきてMicrosoftストアに自動的に追加しているらしい(予定?)です。**

自動的に追加された場合はMicrosoftにメールを送れば解除してくれるらしいです。
また、ストアに追加してほしい場合もいくつかステップを踏んで承認してもらえれば追加してくれるらしいです。

記憶が曖昧なので、現在今やっていることか、やる予定だったかは不明です。

# 知っておくと捗るツール
## sonarwhal
![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/56b4884e-6d28-49b4-675d-3a6219cbf350.png)
https://sonarwhal.com/
オープンソースのウェブスキャンツール
**PWAちゃんと対応できているかのチェックもできる**


## PWABuilder
![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/a88d6ba8-64d0-1cc8-0027-377cb85e95da.png)
https://www.pwabuilder.com/
既存のサイトをPWA対応に簡単にできちゃうWebのツール

# まとめ なんでPWAがすげぇのか
- 学習コストが少ない(らしい)から
    - 追加で書くことがそこまでない
    - うれしい
    - キャッシュだけするアプリとかだったらいますぐに作れちゃう
- 以下の技術が**熱い**から
    - CSS3
    - WebAssembly
    - WebVR
    - Web Payments
- わざわざアプリにしていたものをアプリにしなくてよくなる
    - 「プッシュ通知」「パフォーマンス(ページ遷移)」だけが欲しいだけでスマホアプリを開発してあることがわりと多い。それを簡単に解決できる。
- ユーザがわざわざアプリを入れなくてよくなる
- その他いろいろあるはず

# その他
この記事を投稿する前にこんな記事がありました。

Googleフォトのウェブ版がPWAに対応。今のところ機能は限定的 - Engadget 日本版
https://japanese.engadget.com/2018/06/04/google-pwa/

MS先生もGoogle先生もPWAには前向きな感じがあるので、今後当たり前の技術になっていくといいなぁ
ターミナルのプロンプトを変更して、コンピュータ名とかを消す

# なぜ消したのか
`hogehoge-MBP:Desktop hogeo$`のようなプロンプトの表示形式。
ターミナルの毎行ごとにコンピュータ名やユーザー名が毎度表示されるので必要ないと思っていました。誰かにとっては必要なのかもしれませんが、少なくとも今の私にはいらないので消すことにしました。

その代わり、いつ処理を実行したのかがわかるように時間を表示したい。あと、過去の処理がみっちり詰まっていると見辛いので、処理ごとに改行も入れたいです。

# やったこと
`$PS1`という環境変数を編集することで、表示形式を変えられるらしいです。とりあえず`echo $PS1`で現在の設定を見てみると

`'\h:\W \u$'`

となっていました。`\h`がコンピュータ名`\W`がカレントディレクトリ名`\u`がユーザー名だと思われます。

こちらを編集するには`~/.bash_profile` このファイルを編集しましょう。ターミナルの起動時にこちらに設定した表示形式が反映されます。

`vi ~/.bash_profile`でファイルを開き、

```~/.bash_profile
export PS1='\n\[\033[1;36m\]\W/ \[\033[0m\]\t\[\033[1;32m\] $\[\033[0m\] '
```

のように追記しました。

頭の`\n`は改行です。`[\033[40;0;33m\]`はそのあとに続くテキストの色を指定しています。
`\W`でカレントディレクトリ名`\t`で実行した時間を表示しています。

ファイルを保存したら、`source ~/.bash_profile`で設定を反映しましょう。

![Screen Shot 2018-06-05 at 14.30.31.png](https://qiita-image-store.s3.amazonaws.com/0/197409/c93165b4-f76e-ffd8-807a-1aa96b667795.png)
なかなかのもんです。
セカンドディスプレイの導入　xubuntu　AOC USB

# 画面のサイズを大きくしよう
ノートパソコンで作業している時にこまるのは画面のサイズが小さいことである。
ワーキングスペースが小さいと当然作業効率が悪くなる
ubuntuなどではそれをある程度補うためにワーキングスペースの拡大をおこなってくれているのでその活用もぜひ取り組んでみたいと思うが
つまり新しく立ち上がる可能性があるのはワーキングスペース拡大プロジェクトである。これは面白そうかな
難しいもんかものしれないからすぐにできるようになるかわからないがまずはメモだけ残しておこう。現在の進行中プロジェクトとその進捗状況を把握する作業は絶対的に必要である。

<iframe width="560" height="315" src="https://www.youtube.com/embed/QBNbGRh1cAY" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
というわけでとりあえずグーグルキープにメモをしておきましょう。
現在つかっているセカンドディスプライのブランドはAOCである

このブランド[AOC USB](http://us.aoc.com/product_feature.php?id=62)はこちらです。hはこちらになります。

## ドラバーを入れましょう
AOC USB ディスプレイをDetected 検出するためにはドライバーを入れる必要があります。こちらが[リンク](http://www.displaylink.com/downloads/ubuntu)です。現在使っているOS環境はxubuntu 16.04なので選択できるものはLatest DisplayLink Software Releaseができると思います。
どこかにインストラクションがあるはずですね。
##フォルダーをダウンロードしたら展開をしてRunをする
展開をするにはコマンドでextractで処理すればいいでしょう。
```
how to extract a zip file in linux
```
このような英語表現でコマンドの方法は調べることができるでしょう。

```フォルダを展開する方法
sudo apt-get install unzip
unzip file.zip -d destination_folder
```
##あとはこのインストラクションに従っていく
こちらの[公式サイト](https://support.displaylink.com/knowledgebase/articles/684649)をしたがってパーミッションの状態をととえて、
```SDKを入れる
sudo apt-get install dkms
```
それで最後にrunファイルを実行してあげれば良い
```インストールしたものによってバージョンが違う
sudo ./displaylink-driver-xxxxx.run 
```
これで問題がなければ
どういう状態でセカンドモニターを使いたいのか問われて無事に映しだされる


##今回浮かび上がった新たな問題
展開させる場所の指定はどうするのか
[Go]スライスとかマップとかの要素の数だけ何か実行したい時

# なんだこれ
ポイントはいつも`for hoge, piyo := range huga{...}`を`for range huga{...}`と書くところ

```golang
package main

import (
	"fmt"
)

func main() {
	var kagoSlice []string = []string{"banana", "apple", "orange", "grape"}
	var kagoMap map[int]string = map[int]string{1:"banana", 2:"apple", 3:"orange", 4:"grape"}
	
	fmt.Println("[スライス]\n")
	
	for range kagoSlice {
		fmt.Println("スライス製のカゴから１個果物をとりました。")
	}
	
	fmt.Println("\n[マップ]\n")
	
	for range kagoMap {
		fmt.Println("マップ製のカゴから１個果物をとりました。")
	}
	/*
	[スライス]

	スライス製のカゴから１個果物をとりました。
	スライス製のカゴから１個果物をとりました。
	スライス製のカゴから１個果物をとりました。
	スライス製のカゴから１個果物をとりました。

	[マップ]

	マップ製のカゴから１個果物をとりました。
	マップ製のカゴから１個果物をとりました。
	マップ製のカゴから１個果物をとりました。
	マップ製のカゴから１個果物をとりました。
	*/
}
```
https://play.golang.org/p/6I0imxCLgMC

# いつ使うのこんなの？
スライスとかマップとかの参照系の要素数だけ何か実行したいけど、別に中の要素は代入もしないとか興味がないとき。
サービス化されたアプリケーションを介してWindows認証のサーバに接続できない

#問題
Windows環境であるサービス化されたアプリケーションを介して
MSSQLServerに接続する必要があったが、接続できない。

#切り分け
　・SQLServerは外部からの接続は可能なことは確認済。
　・該当のアプリケーションからのみ接続ができない。
　・MSSQLServerはWindows認証で構築されている。

#原因
　・サービスの起動ユーザがMSSQLServerのログインアカウントと一致していなかった。
　・サービスのプロパティでユーザを固定して復旧。

即気が付かなかった屈辱に身を焼かれる。
trackman ball

#トラックマン　ロジテック　スクロールができない
購入したばかりのトラックマンを使うとなんとスクロールができない問題が発生する。
問題が、発生するということはとってもいいことでより、プログラムの勉強になる。ウィンドウズでこの問題を発生すると炊いてのばあいはコマンドを入力して解決するよりもなにかソフトを入れて解決することが多いので、あまり勉強にならない。積極的に不便な環境、たとえば、Ubuntuなどをつかっていくと、必然的にコマンド　ターミナルをつかっていくので非常に良い勉強になる。
では早速、どうすればいいのか考えてみよう。まずは次のページがオフィシャルサイトである。
[wikiトラックマン](https://help.ubuntu.com/community/Logitech_Marblemouse_USB)
このページによると、どうやら、x10とかコンフィグファイルを編集すればいいことがわかる。とういわけで編集しようと思うが、そのファイルがどこにあるのかがわからない。
それを調べるために次のように考える。

英語検索
```英語検索
where is xorg.conf.d
```

たとえばここでこのような文章を売って次の答えをよる事になる。

## まずはconfig fileの場所を確認する

いかの順番でディレクトリを進んでいけば
/usr/share/X11/xorg.conf.d

たとえば以下のようなものが並んでいます。

10-evdev.conf
11-evdev-quirks.conf
50-vmmouse.conf
50-wacom.conf
51-synaptics-quirks.conf

このなかのどれかにマウスの設定を入れていけばいいわけです。
たとえば以下の設定をそのまま使っていいでしょう
[github参考マウス](https://gist.github.com/adrianp/a5458eeb2038a6240282b0d898e0391d)
## 　あとはconfigファイルを編集
当然、その参考文献をさがすには　

**how to edit a config file**

とかが無難だとおもう
とりあえず答えが出てきたので共有します。

```
sudo nano /etc/lightdm/lightdm.conf
sudo -H gedit /etc/lightdm/lightdm.conf
```
まぁnanoかgeditってのを使うんだったなー
これはデフォルトで入っているかどうか不明なので調査をする。
この参考文献は[こちら](https://askubuntu.com/questions/438524/how-can-i-edit-the-lightdm-conf-file-and-save-it)です。

##このプロジェクト問題点
トラックマン専用のコンフィグファイルがないから適当に雰囲気大丈夫そうなところに入りつけただけ。
しかし、オフィシャルページでは当然　トラックマン　マーブルコンフィグなどというファイルが存在していて、それをどうやって解くのかは不明である。
解くべき問題のかもわからない。
これを今後改善していこうと思う。
Web Audio APIを使ったユーザー音声の録音

Web Audio APIを使えば音声データをブラウザ上で流したり、それにフィルタをかけたり色々なことができます。録音ももちろんできますがファイルとして保存したり、`ArrayBuffer`にしてバックエンドに渡したい場合などは少々手順が必要です。なので、TypeScriptで書いた`MediaRecorder`のWrapperクラスをここにまとめておきます。

```typescript
declare const MediaRecorder: any; // 2018年6月5日現在では型宣言が自前で必要

class Recorder {
    // インスタンス作成時にMediaRecorderを初期化
    private recorder = navigator.mediaDevices.getUserMedia({
        audio: true,
        video: false,
    }).then((stream) => new MediaRecorder(stream));

    public startRecording = async (): Promise<void> => {
        const recorder = await this.recorder;

        if (recorder.state === "recording") {
            throw new Error("duplicate recording");
        }

        recorder.start();
    }

    public stopRecording = async (): Promise<AudioBuffer> => {
        const recorder = await this.recorder;

        const blob: Promise<Blob> = new Promise((resolve) =>
            recorder.ondataavailable = ({ data }) => resolve(data));

        recorder.stop(); // この時点でrecorder.ondataavailableコールバックが呼ばれる

        // Blob -> ArrayBuffer

        const reader = new FileReader();
        const buffer: Promise<ArrayBuffer> = new Promise((resolve) =>
            reader.onload = () => resolve(reader.result));

        reader.readAsArrayBuffer(await blob); // loadイベントが発動しreader.resultにblobの中身が書き込まれる

        // ArrayBuffer -> AudioBuffer

        return await (new AudioContext()).decodeAudioData(await buffer);
    }
}
```

因みに、録音した音声を再生したいというだけであればもっと簡単です。`MediaRecorder`を使用せず`navigator.mediaDevices.getUserMedia()`から返された`MediaStream`を引数に`AudioContext.createMediaStreamSource`からSourceNodeを作るだけです。詳細は[ここ](https://developers.google.com/web/fundamentals/media/recording-audio/)。
virtualbox guest addtions

いやー、vagrant使えよ、とかいやいやコンテナっしょとか色々あるけどね。
そういうのは全部忘れよう。

virtual boxでguest addions image のｲﾝｽｺがうまくいかない場合について。
ゲストosはcent7。恐らくvirtualbox側のverがどうであっても、エラーが同じである場合は解決策は同じになるんじゃないかな。多分。もし違っても俺が言ってたとか言わないでね。

ゲストos側でimageに入ってるbootのシェル起動させると通常はそのままｲﾝｽｺが始まると思うんだけど、kernel-develのversionと喧嘩してる場合ビルドに失敗する。
(この場合、yumでdevel入れなさいなってメッセージ出てくるはず。違うメッセージだった場合は多分原因が違います)
が、素直にyum installで入れようとしても「それ利用できんで」と言われてしまう場合の解決策でございます。

まずcentのverを確認します。自分の場合は7.3.1611でした。

```
cat /etc/redhat-release
```

次に、centos vaultリポジトリの参照設定を追記して有効にします。
base/updatesだけで問題ないかと。
もし既に記載があった場合は

```
enabled=1
```

にするだけで良いです。
自分の場合はなかったので

```
vi /etc/yum.repos.d/CentOS-Vault.repo
```

```
[C7.3.1611-base]
name=CentOS-7.3.1611 - Base
baseurl=http://vault.centos.org/7.3.1611/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1

[C7.3.1611-updates]
name=CentOS-7.3.1611 - Updates
baseurl=http://vault.centos.org/7.3.1611/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1

```

こいつを追記。
で、既に入ってるkernel-develを吹っ飛ばします。

```
rpm -qa | grep kernel-devel
```

念のため、これで表示されるバージョンが最初に入れなさいなって言われたのと同じでないかどうか確認。
問題なければ

```
rpm -e --nodeps [[さっきの結果]]
```

で、あとは最初に指定されたyum installコマンドを実行すりゃ良いです。

おわり。
配列内のパッケージをOS問わず自動でインストールするShellScript

ShellScriptの入門として、
配列内のパッケージをインストールするスクリプトを書いてみました。

各OSに対応するために、一致するパッケージマネージャにてインストールを試みます。

```sh
#!/bin/bash

# 必要なパッケージ名; ()内を変更する。
required=(foo bar)
# パッケージマネージャ一覧
pm=(brew apt yum port pacman)

# パッケージごとにチェック
for r in ${required[@]}; do
  # パッケージが存在しなければインストールする
  if ! type ${r} >/dev/null 2>&1; then
    for p in ${pm[@]}; do
      # 一致するパッケージマネージャでインストールを試みる。
      if type ${p} >/dev/null 2>&1; then
        echo "Not installed ${r}, will be installed."
        yes | sudo ${p} install ${r}
        break
      fi
    done
  fi

  # 確認をし、インストールに失敗していた場合はループを抜ける。
  if ! type ${r} >/dev/null 2>&1; then
    echo "Error: Required ${r}"
    exit 1
  fi
done

echo "Completed!"
```

## 解説

| キーワード | 解説 |
|:---:|:---:|
| ${foo} | 変数fooの利用 |
| 2>&1; | 標準エラー出力 |
| > /dev/null | 書き込まれたデータを破棄する |
| > /dev/null 2>&1 | [参考](https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea) |

typeで一致したパッケージマネージャコマンドを利用してインストールを行うことで，有効なパッケージマネージャを利用してインストールを行うことができます。
インストールに失敗した場合や，`sudo`を拒否した場合は`exit 1`にて処理が中断されます。

## 補足

dash(`$ sh foo.sh`)では`Syntax error: "(" unexpected`となったため、
エラーが発生する方は`bash foo.sh`で実行すると良いでしょう。

## 参考

[これだけ覚えておけばOK！シェルスクリプトで冪等性を担保するためのTips集](https://qiita.com/yn-misaki/items/3ec0605cba228a7d5c9a)
[意外な理由（？）で「Shell script arrays Syntax error: “(” unexpected」](https://pc.casey.jp/archives/153904527)
[いい加減覚えよう。 `command > /dev/null 2>&1`の意味](https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea)
Model.find(params[:id]) を丁寧に調べた（Rails入門）

# はじめに

Rails製のWebアプリケーションの中で、`Controller`ファイル内でよく見る

```ruby
def show
  @instance = Model.find(params[:id])
end
```

こういうやつ。いままで、何の気なしに書いてみましたが、断片的な知識をまとめたらいろんな気づきがあったので、丁寧に調べたことを書いて行きます。結構当たり前な内容なので、本記事対象者は最近Railsをはじめた人向けです。

## 上のコードの概要


これに関して、色々な疑問が湧いたので、それについて調べてみました。

## なぜ`@`を先頭に付けたものに代入するのか

まず、代入されているものは**インスタンス変数**です。

では、なぜインスタンス変数は、先頭に`@`をつけるかというと、ruby言語文法の決まりで、インスタンス変数は先頭は`@`から始める約束ごとなので、としか言えません。

### なぜインスタンス変数に代入するのか

ではなぜ、普通の変数ではなく、インスタンス変数に代入するのかというと、インスタンスメソッドを利用したいからだと思います（他にも様々な理由はあると思います）。インスタンス変数を経由することで`Controller`から`View`へ変数を渡すことができます。

今回のインスタンス変数に代入されているデータは、イコール（`=`）の右側を見ればわかりますが、モデルのインスタンスです。モデルのインスタンスとは、１つのオブジェクト、またはデータベースの一つのレコードと言い換えてもいいかもしれません。

あまり関係ないデータですが、`Rails console`を使用して、あるモデル（`Message`）の、ある1つのオブジェクトをみて見ると以下のようになります。

```console
> Message.find(2)
  Message Load (0.3ms)  SELECT  `messages`.* FROM `messages` WHERE `messages`.`id` = 2 LIMIT 1
 => #<Message id: 2, content: "samlple1", created_at: "2018-06-04 03:28:06", updated_at: "2018-06-04 03:28:06"> 
```

下記が、1つのオブジェクトであり、データベースの一つのレコードと言い換えてもいいかものやつです。

`#<Message id: 2, content: "samlple1", created_at: "2018-06-04 03:28:06", updated_at: "2018-06-04 03:28:06">`

インスタンス変数に代入する理由に戻りますが、例えば、このコントローラーのアクションに対応するViewで上記のオブジェクトを、部分的にでも使いたいとします。そんな時に、メソッドを使用すれば簡単に使えるのでインスタンス変数を用いるのだと思います。

## findとは

`find`はモデルの検索機能を持つメソッドです。モデルと紐づいているデータベースのテーブルから、レコードを1つ取り出す場合に、`find`メソッドを使います。

## paramsとは

> paramsとはRailsで送られてきた値を受け取るためのメソッドです。送られてくる情報(リクエストパラメータ)は主に、getのクエリパラメータとPostでformを使って送信されるデータの2つです。

```ruby
params[:カラム名]
```

で値を受け取ることができます。

https://www.sejuku.net/blog/29763#params

### コロン記号（`:`）について

> コロン記号（`:`）はシンボルの意味です。シンボルはオブジェクトの一つで、ハッシュのキーとしてよく使用されます。シンボルのメリットとして、メモリを消費せず、可読性があがり、処理が高速になる。

https://www.sejuku.net/blog/13094#i

以上です。ありがとうございました。

# 参考
- https://railsguides.jp/active_record_basics.html
- http://railsdoc.com/references/find
- https://udemy.benesse.co.jp/development/rails-find.html
- https://www.sejuku.net/blog/29763#params
- https://www.sejuku.net/blog/13094
Jupyter上のPythonとRの間でデータをやり取りする

Jupyterのブログ[I Python, You R, We Julia](https://blog.jupyter.org/i-python-you-r-we-julia-baf064ca1fb6)に書いてあります。

## 必要なモジュールをインストール
pandasがないと叱られます。tzlocalがなくてもpandasがないという同じエラーが出ます。ついでにcffiも先にインストールしておきましょう。

モジュールの管理はお好みですが，私はMacPortsとpipを併用しています。cffi_magicはMacPortsにないので，`--user`をつけて`pip`でインストールします。`sudo port select pip pip36`してない人は，`pip`でなく`pip-3.6`としてください。

```bash
sudo port install py36-pandas py36-tzlocal py36-cffi
pip install --user cffi_magic
```

## RのデータをPythonに送る
ブログでは`coefs.T[0:2]`ですが，`T`はないというエラーが出ました。`T`を取るとうまく動きました。

```python
coefs = %Rget val
y0,k = coefs[0:2]
y0,k
```
日本語の入力を許可する　xubuntu

#英語設定にしてからの日本語のキーボード許可の方法
ターミナルでの処理のことを考えたら当然デフォルトは英語設定のほうが何かと都合がいい。例えば、Ruby on Railsをインストールするときにはすんなりできないことがあるので、いろいろなバグができる。その都度表示されている指示に従って、ネットでコピペして行けばだんだん求めている状態に近づいてくる。
ただしその作業は最短ルートでできているかどうかわからないので後でログを辿ったりしてどうやったらうまく行ったのか、このながれで最短だったのかをフィードバックすることが必要である。
できれば、だれかのブログで書いているものをコピペするのではなく、公式サイトをきちんと当たるということは原点を当たる作業でとても大切。
これを繰り返していくことで専門用にもだんだん慣れていく。

なるべくターミナルからコマンドを入力する形式にするとプログラムの中身がどうなっているかがよくわかるだろう。
この作業はとっても時間がかかるのでそんなに急がなくてもよい。
時間がないときには、コマンド入力系のものはすぐにやめて、このやめ時が大事なのだが、すぐに、直感的にわかる作業でどんどん進めていく。プログラムを書くときには全体像を把握することも時には大事なのである。直感的にわかりやすいゴールが見えればモチベーションも上がりやすくなる。さてでは本題の日本語入力の方法に進みましょう。
## システム　設定　言語の追加へ
まずはxubuntuからランゲージサポートを開いて、デフォルトの言語が英語だけになっているので、日本語を入れましょう。インストールにしばらく時間がかるので少々待ちましょう。
すると、日本語が入ったら、インプットタイプが現在noneになっていると思うので、そこを変更すると今まででていなかったfcikみたいな文字が出てくる。
このfcikとかmozcとかここららへんが言語パッケージのところのポイントになります。
おそらく昔はそれぞれに良さがあって、使い分けられていたのだろうが、今は大して変わらない。
### 変換するときに変換案ウィンドウが邪魔である
エバーノートやブログなどを書いてタイピングしていると変換ウィンドウが文字と被って邪魔な時がある。それはどんどん書いていくと自分の書く位置が画面中央から画面下の方へどんどん移動していくからだと思うが、これが自動的にかぶらないようにする方法はよくわからない。
改めて、ウィンドウズとかのOSって本当にこまかいところまで、よく作っていたのだと感心するね。

この参考文献を提示しようかとおもったけど、残念ながら今回は言語パックをターミナルからいれていないのでありません。
sudo apt updateでGPGエラー

# 概要
sudo apt updateでエラー

```
~$ sudo apt update
...
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: http://storage.googleapis.com/bazel-apt stable InRelease: 以下の署名が無効です: KEYEXPIRED 1527185977  KEYEXPIRED 1527185977  KEYEXPIRED 1527185977
W: http://storage.googleapis.com/bazel-apt/dists/stable/InRelease の取得に失敗しました  以下の署名が無効です: KEYEXPIRED 1527185977  KEYEXPIRED 1527185977  KEYEXPIRED 1527185977
W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。
```

# 確認
エラー通り何か期限切れであることを確認
[https://qiita.com/abetomo/items/682c51092b659b197e63](https://qiita.com/abetomo/items/682c51092b659b197e63)

```
~$ apt-key list
...
pub   4096R/48457EE0 2016-05-24 [期限切れ: 2018-05-24]
uid                  Bazel Developer (Bazel APT repository key) <bazel-dev@googlegroups.com>
...
```

# 対応
[https://github.com/bazelbuild/bazel/issues/5261](https://github.com/bazelbuild/bazel/issues/5261)

```
~$ curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
```

sudo apt updateを確認．エラー無し．
gitリポジトリのrootディレクトリから相対パスでファイルにアクセスできるようにする

## 何ができるようになるか

```zsh
 % git init
Initialized empty Git repository
 % mkdir -p dir_1/dir_2
 % echo 'abc' > file_1
 % tree
.
├── dir_1
│   └── dir_2
└── file_1

2 directories, 1 file
 % cat file_1
abc
 % cd dir_1
 % cat $GIT_ROOT/file_1
abc
 % cd dir_2
 % cat $GIT_ROOT/file_1
abc
 % cd $GIT_ROOT
```

このようにgitのサブディレクトリにいても環境変数`GIT_ROOT`を通してgitのrootディレクトリからの相対パスでファイルを指定・アクセスできるようになる。

## やり方

.zshrcに以下を書く

```zsh
function precmd_set_git_root_variable() {
  GIT_ROOT=$(git rev-parse --show-toplevel 2> /dev/null)
}
autoload -Uz add-zsh-hook
add-zsh-hook precmd precmd_set_git_root_variable
```

## 参考記事

* [zshでhook関数を登録する \- Qiita](https://qiita.com/mollifier/items/558712f1a93ee07e22e2)
* [Gitのルートディレクトリへ簡単に移動できるようにする関数 \- Qiita](https://qiita.com/ponko2/items/d5f45b2cf2326100cdbc)
よく使うkubectlコマンドまとめ

## この記事は？
業務でKubernetesを使っていて、kubectlコマンドをちょいちょい忘れるので自分用にまとめました。

## kubectlのインストール
GCloudやkubectlがインストールされていない場合は、こちらが分かりやすかったので以下を参考にkubectlを使えるようにしてください
[macosにgcloudとkubectlのインストール](https://qiita.com/sakamossan/items/8ff74ed377dc77325b80)

## kubectlまとめ
### 情報を取得する
```bash
# フォーマット
kubectl get <リソース名>

# Podの情報を取得
kubectl get pods

# Deploymentの情報を取得
kubectl get deployment

# Serviceの情報を取得
kubectl get services

# Podの詳細な情報を取得
kubectl get pods -o wide

# Podの詳細な情報をJSONで取得
kubectl get pods -o json

# Podの詳細な情報をYAMLで取得
kubectl get pods -o yaml
```

### リソースとオブジェクトを指定して詳細な情報を取得する
```bash
# フォーマット
kubectl describe <リソース名> <オブジェクト名>

# 例: fooというPodの詳細な情報を取得
kubectl describe pods foo
```

### 動かす
```bash
# フォーマット
kubectl apply -f <YAMLファイル>
# 例: YAMLの設定でPodを動かす
kubectl apply -f sample.yaml
```

### 編集する
```bash
# フォーマット
kuectl edit <リソース名> <オブジェクト名>

# 例: fooというPodを編集する
kubectl edit pods foo
```

### 削除する
```bash
# フォーマット
kubectl delete <リソース名>/<オブジェクト名>

# 例: fooというPodを削除する
kubectl delete pods/foo
```

### ポートフォワードを使う
```bash
# フォーマット
kubectl port-forward <オブジェクト名>　<ポート番号>

# 例: localhost:9000からfooというPodにアクセスできるようにする
kubectl port-forward foo 9000
```

## 参考資料
[macosにgcloudとkubectlのインストール](https://qiita.com/sakamossan/items/8ff74ed377dc77325b80)
[入門 Kubernetes](https://www.oreilly.co.jp/books/9784873118406/)
10分でできるReact+FirebaseのGoogleAuth

やりたいこと
------
Reactを使って
FirebaseのAuthenticationの
Googleログイン、ログアウトの
ボタンを作る

### Firebase Google Authenticationドキュメント
https://firebase.google.com/docs/auth/web/google-signin

Firebaseの設定
---------

1. Firebaseの管理画面でAuthenticationでGoogleのログインを有効にする
2. 後述のReactのFirebaseの設定のためにAPIキー一覧を取得しておく
    - ※最近のバージョン(2018年６月)だと右上の「ウェブ設定」ボタンから

※参考: https://qiita.com/cyokodog@github/items/eeedc5c94477602ec9f3 の記事のgoogleアカウントで認証できるように設定するまで

React環境作成
-----

$ npx create-react-app react-firebase
$ npm install firebase

### Firebaseの設定を読み込むjsを作成
$ cd react-firebase
$ vi firebase.js

```js:firebase.js
import firebase from 'firebase/app'
import 'firebase/auth'

const config = {
  apiKey: 'xxxxx',
  authDomain: 'xxxxx.firebaseapp.com',
  databaseURL: 'https://xxxxx.firebaseio.com',
  projectId: 'xxxxx',
  storageBucket: '',
  messagingSenderId: 'xxxxx'
}

firebase.initializeApp(config)

export default firebase
```
### ユーザー情報を持ってない場合はログインボタンを表示、持っている場合はUIDとログアウトボタンを表示する画面の作成

$ vi App.js

```js:App.js
import React, { Component } from 'react'
import firebase from './firebase'
import './App.css'

class App extends Component {
  state = {
    user: null
  }

  componentDidMount() {
    firebase.auth().onAuthStateChanged(user => {
      this.setState({ user })
    })
  }

  login() {
    const provider = new firebase.auth.GoogleAuthProvider()
    firebase.auth().signInWithRedirect(provider)
  }

  logout() {
    firebase.auth().signOut()
  }

  render() {
    return (
      <div className="App">
        <p className="App-intro">
          UID: {this.state.user && this.state.user.uid}
        </p>

        {this.state.user ? (
          <button onClick={this.logout}>Google Logout</button>
        ) : (
          <button onClick={this.login}>Google Login</button>
        )}
      </div>
    )
  }
}

export default App
```

### 動作確認

$ npm start

補足：FirebaseのAPIキーを隠しファイル(.env)で管理
----

### package.jsonがある階層に下記のような.envファイルを作成

```:.env
REACT_APP_FIREBASE_APIKEY=XXXXXXXXXX
REACT_APP_FIREBASE_MESSAGING_SENDER_ID=XXXXXXXXXX
```

### firebase.jsを下記のように修正

```js:firebase.js
import firebase from 'firebase/app'
import 'firebase/auth'

const config = {
  apiKey: process.env.REACT_APP_FIREBASE_APIKEY,
  authDomain: 'xxxxx.firebaseapp.com',
  databaseURL: 'https://xxxxx.firebaseio.com',
  projectId: 'xxxxx',
  storageBucket: '',
  messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID
}

firebase.initializeApp(config)

export default firebase
```

実際のサンプルコード
----
https://github.com/HorieH/sandbox-react-firebase-googleauth
google chrome installation in ubuntu

 Markdown記法のヒント
見出し
# 見出し 1
## 見出し 2
### 見出し 3
強調
**強調**
リンク
[リンク](https://askubuntu.com/questions/79280/how-to-install-chrome-browser-properly-via-command-line)
[official page](https://www.ubuntuupdates.org/ppa/google_chrome)


```terminal
sudo apt-get install libxss1 libappindicator1 libindicator7
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome*.deb
```
リスト
- リスト 1
- リスト 2
    - リスト 2-1
1. 番号付きリスト 1
2. 番号付きリスト 2
3. 番号付きリスト 3
- [ ] チェックボックス 1
- [ ] チェックボックス 2
- [x] チェックボックス 3
golang balance threads

![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/ccff5181-0a3d-9bce-5815-197010d0a9fe.png)


```golang
type job struct {
    conn     net.Conn
    opcode   int
    data     []byte
    result   chan ResultType //結果を他のchannelに渡すため
}
type jobPair struct {
    key   string
    value *job
}


type worker struct {
    jobqueue  map[string]*job // key:UserName
    broadcast chan DataType
    jobadd    chan *jobPair
    jobdel    chan string
    pending   safepending
    index     int
    done      chan struct{}
}

func NewWorker(idx int, queue_limit int, source_limit int, jobreq_limit int) *worker {
    return &worker{
        jobqueue:  make(map[string]*job, queue_limit),
        broadcast: make(chan DataType, source_limit), 
        jobadd:    make(chan jobPair, jobreq_limit),
        jobdel:    make(chan string, jobreq_limit),
        pending:   safepending{0, sync.RWMutex{}},
        index:     idx,
        done:      make(chan struct{}),
    }
}

func (w *worker) PushJob(user string, job *job) {
    pair := jobPair{
        key:   user,
        value: job,
    }
    w.jobadd <- pair
}

func (w *worker) RemoveJob(user string) {
    w.jobdel <- user
}

func (w *worker) Run(wg *sync.WaitGroup) {
    wg.Add(1)
    go func() {
        log.Println("new goroutine, worker index:", w.index)
        defer wg.Done()
        ticker := time.NewTicker(time.Second * 60)
        for {
            select {
            case data := <-w.broadcast:
                for _, job := range w.jobqueue {
                    log.Println(job, data)
                }
            case jobpair := <-w.jobadd:
                w.insertJob(jobpair.key, jobpair.value)
            case delkey := <-w.jobdel:
                w.deleteJob(delkey)
            case <-ticker.C:
                w.loadInfo()
            case <-w.done:
                log.Println("worker", w.index, "exit")
                break
            }
        }
    }()
}

func (w *worker) Stop() {
    go func() {
        w.done <- struct{}{}
    }()
}
func (w *worker) insertJob(key string, value *job) error {
    w.jobqueue[key] = value
    w.pending.Inc()
    return nil
}

func (w *worker) deleteJob(key string) {
    delete(w.jobqueue, key)
    w.pending.Dec()
}
```
作者：https://www.jianshu.com/p/215510810c59
AtCoder Beginner Contest 098 解説備忘録

#前書き
AtCoder Beginner Contest 098 を解いてみた．解けなかった問題の備忘録．

#B問題
[[問題はこちら]](https://abc098.contest.atcoder.jp/tasks/abc098_b)

**[ポイント]**

・文字列でもfor文は使える．`for(char c='a';c<='z';c++)`の要領である．

・文字列にある文字が含まれているかどうか確認するには`s.find("hoge")`
**含む場合は文字列が最初に出現する位置**，**含まない場合は**`string::npos`**と出力**される．

[参考]-(http://marycore.jp/prog/cpp/std-string-find-search/)

以下はACのコード：

```main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cmath>
#include <set>
#include <sstream>
#include <bitset>

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

typedef long long ll;

using namespace std;

int main() {
    
    int n;
    cin >> n;
    string s;
    cin >> s;
    
    vector<int> cnt(n-1,0);
    
    FOR(i, 1, n){
        string l = s.substr(0,i);
        string r = s.substr(i,n-i);
        for(char c='a';c<='z';c++){
            if ((l.find(c) != string::npos)&&(r.find(c) != string::npos)) {
                cnt[i-1]++;
            }
        }
    }
    
    int max = *max_element(cnt.begin(),cnt.end());
    
    cout << max << endl;
    
    return 0;
}

```

#D問題
[[問題はこちら]](https://abc098.contest.atcoder.jp/tasks/arc098_b)

**[ポイント]**
・XORとは...同じだったら0，違ったら1を出力する．`a^b`で表現．

| 入力1 | 入力2 | 出力3 |
|:-:|:-:|:-:|
|   0| 0  | 0  |
|  0 | 1  | 1  |
|  1 |  0 |  1 |
|  1 | 1  | 0  |

 **※(0,0),(0,1),(1,0)はxorも+も同じ結果になる！**

・ある範囲で題意を満たす → その範囲に含まれる範囲(部分集合？)も題意を満たす
 
・「尺取り虫」方式で探索するとループが一つなので速い．

```main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cmath>
#include <set>
#include <sstream>
#include <bitset>

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

typedef long long ll;

using namespace std;

int main() {
    
    ll n;
    cin >> n;
    vector<ll> a(n);
    FOR(i, 0, n){
        cin >> a[i];
    }
    
    ll cnt=0;
    ll l=0,r=0;
    ll tmp=0;
    while (r<n) {
        if((tmp+a[r]) == (tmp^a[r])){
            tmp += a[r];
            r++;
            cnt += r-l;
        }else{
            tmp = tmp - a[l];
            l++;
        }
    }
    
    cout << cnt << endl;
    return 0;
}

```

#あとがき
*高速化のため，for文/while文はとにかく減らせ！！！！*
[js] Array(配列)とObject(連想配列)を混在するアレ

> この記事は `Nodejs:V8.9.1`で検証した結果をもとに書いています

javascriptのArrayには連想配列的な添字を充てる事ができます。

```javascript
var arr = new Array(1, 2, 3);
arr['text1'] = 'test';
```
この時点での`arr`オブジェクトは以下の様になります。

```javascript

t.log(arr.length);
// ℹ 3

t.log(Object.keys(arr));
// ℹ ['0','1','2','text1',]

t.log(arr instanceof Array);
// ℹ true

t.log(arr);
/* ℹ [
        1,
        2,
        3,
        ---
        text1: 'test',
      ]
*/
```

このオブジェクトでイテレートした時にどのような挙動になるのか調べてみます。

## forEach

```javascript
arr.forEach(function(s, i) {
  t.log(i, s);
});
/// result 
ℹ 0 1
ℹ 1 2
ℹ 2 3
```
`arr.text1`は無視されています。

## for

```javascript

for (j = 0, len = arr.length; j < len; j++) {
  s = arr[j];
  t.log(`for: ${s}`);
}
/// result
ℹ for: 1
ℹ for: 2
ℹ for: 3
```
やはり`arr.text1`は無視されています。というよりも`arr.length`は`3`なのでイテレートされるはずがありません。

## for in
```javascript

for (key in arr) {
  value = arr[key];
  t.log(`for in {${key}: ${value}}`);
}
///
ℹ for in {0: 1}
ℹ for in {1: 2}
ℹ for in {2: 3}
ℹ for in {text1: test}
```
`arr.text1`がイテレートされています。

そもそもこの挙動が公式に認められてるモノなのか、いつかシレっとなくなってしまうものなのかわかりません。
便利だから使いたいんだけどええんやろか。。。
🔰HTML&CSS Lv2 - HTML編 ~よく使う要素を覚えよう~


Googleで調べながら暗記していく。
推奨: [HTML&CSSの逆引き&ABC順](http://www.htmq.com/) など

>TIPS💡
- 同意語: タグ、要素、element
- ここで挙げたもの以外は覚えなくて良い（都度調べて使えばOK）

## 基本構成要素

- html
- head
- body

## headタグ内に書く要素

- meta[content, name, charset]
- link: 外部(CSS)のファイルを読み込むためのタグ[rel, href]
- script: 外部(Js)のファイルを読み込むためのタグ[src]
- style

## bodyタグ内に書く要素

### ブロック要素

- h1~h6
- p
- hr
- ul, ol この2つの違いを把握する
- li
- article
- side
- section
- dl, dr, dd セットで覚える
- div

### インライン要素

- a: リンクを貼るためのタグ[href, target]
- b, strong: 太字
- i, em: 斜体
- span
- img[src, alt, title, width] 単一タグ
- br 単一タグ
- iframe[src] 単一タグ

### テーブル構成要素

- table[border]
- tr
- th
- td
- thead
- tbody

※ `[]`の中身: セットで覚えておきたい"属性"とその使い方。

>TIPS: 調べて知っておきたい用語
- 単一タグ
- ブロック要素
- インライン要素

## その他

### 毎回使うテンプレート

💡Tips: SublimeTextに"Emmet"プラグインを入れるなど、エディタの設定によっては`!`と打ったあとTabキーで自動挿入される。

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>xxxxxxxx</title>
  </head>
  <body>
  </body>
</html>
```
かんたん・キレイ・速いがそろった陸海空アセット

セットアップが簡単にできて、美しくて、高速に動作するUnityの地形・海・空アセットです。
いくつか試した中では、これらが最適でした。
どれもちょっとお値段が高めですが、その価値はお値段以上だと思います。

※イメージです。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/44912/646fc7ab-1b94-88f6-cd5c-f4f1cf767459.png)

上のイメージではのっぺらな地形になっていますが、木とか草とかぼうぼうに生やせます。ぼうぼうに生やしても性能もあまり落ちません。
空は太陽や月の動きに応じて変わります。雲も動きます。
海には潜れます。

# Gaia
https://www.assetstore.unity3d.com/jp/#!/content/42618

1. Gaiaをインポートします。

    Window -> Gaia -> Show Gaia Manager ...

2. Gaia ManagerのADVANCEDで、1.2.3.を実行します。
![gaia.png](https://qiita-image-store.s3.amazonaws.com/0/44912/e1ecbf72-fade-2a7b-33d1-f6332a5037b2.png)
3. シーンでGaiaのSession Managerを開きます。
4. Add Stampsを押します。
5. Flatten TerrainかSmooth Terrainを選びます。
6. Play Sessionを押します。

Reset Sessionして、やり直すこともできます。

# AQUAS Water Set
https://www.assetstore.unity3d.com/jp/#!/content/52103

1. AQUASをインポートします。

    Window -> AQUAS -> Quick Setup

2. Water Levelを50にします。(Gaiaに合わせます)
3. TerrainにGaia EnvironmentのTerrainをセットします。
4. Main Cameraをセットします。
5. Add Water
6. Add Underwater Effects

UnderwaterのWaterLensのMesh ColliderとMesh Rendererを外します。
これがあると、Unity5ではnon-kinematic Rigidbodyにつけられない、とエラーになります。
これを外すと、水に入ったときに視界がぐにゃぐにゃする効果がなくなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44912/27df3265-6b01-1be7-04c8-eb4cf9f3236d.png)

Underwaterを入れると、Post Processingは、UnderWaterCameraEffectsの中にあるDefault Profileが利用されます。
Post Processingを変更したい場合は、ここを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44912/307c6903-1e7a-8a3f-85cc-70b621b0007a.png)


# Time of Day
https://assetstore.unity.com/packages/tools/particles-effects/time-of-day-7316

Prefabs/Sky Domeをシーンに追加します。
Main Cameraに、Time of Day -> Camera Main Scriptを追加します。
その他のTime of Dayのスクリプトをお好みで入れます。（重くなります）
JISキーボードユーザーが最短でUSキーボードに慣れるために

# 状況
- 会社で貸与されているPCがUSキーボードになってて、少しだけ困ってしまっている人。
- Happy Hacking Keyboard (Bluetooth)、とかでUSキーボード。[`][|][/]とかのキーの位置に慣れてない人のための記事。

# 環境：USキーボード
Happy Hacking Keyboard (Bluetooth)とか？
![95E97833-EB57-4E8C-A219-333D59900E7C.jpeg](https://qiita-image-store.s3.amazonaws.com/0/254038/e43ee811-4b69-f2c4-131f-6f5b8cd05187.jpeg)


# 練習サイト
https://corocn.github.io/symbol-typing/
<img width="1112" alt="781C54BC-97A1-41DA-B4DC-8B191814E6E2.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/254038/a72bf575-e6dc-3a56-f10d-4a758c1f4337.jpeg">

ローマ字打ちなどのJISキーボードユーザーに慣れ親しんだ部分は全部省略してくれている点。

# 結果
練習サイトで、1分程度で打てるようになり、ブラインドタッチも難なくクリアできるようになる。
WWDC 2018 - ARKit 2

#<b>INTRODUCTION</b>
Well, As we all know ,​ Apple announced ARKit a year ago at WWDC 2017 and shipped it in September 2017​ and yesterday They have announced the new update of ARKit which is ARKit 2.

#<b>What's New in ARKit 2?</b>


###<b>1. Share Experiences</b>
Multiple users can use their iOS devices to view the same virtual environment, each from their own view at the same time.

<b>Example : Lego Game</b>
![lego-ed.jpg](https://qiita-image-store.s3.amazonaws.com/0/211896/1d1dac5b-0848-b866-5f07-eea8767ffaf8.jpeg)

###<b>2. Persistent tracking</b>
With ARKit 2 , you can save AR spaces and objects that are linked to physical objects (like toys) or physical spaces (like classrooms), so you can pick up where you left off later. 

###<b>3. Improved face tracking</b>
well, Apple didn't explain much but I think the name itself has speak it all. The face tracking will be better.
 
###<b>4. Realistic rendering</b>
The rendering of augmented reality objects is already quite good. Apple didn’t say exactly how rendering has improved, but we expect more accurate lighting is key.

###<b>5. 3D Object detection</b>
ARKit detects flat rectangle objects like posters or book covers, but ARKit 2 lets developers detect fully 3D objects. That’s going to be huge.


###<b>6. New AR Format</b>
Apple is partnered with Pixar to develop the AR file format name <b>Universal Scene Description (USDZ)</b> to streamline the process of sharing and accessing augmented reality files. USDZ will be compatible with tools like Adobe, Autodesk, Sketchfab, PTC, and Quixel. Adobe CTO Abhay Parasnis spoke briefly on stage about how the file format will have native Adobe Creative Cloud support, and described it as the first time “you’ll be able to have what you see is what you get (WYSIWYG) editing” for AR objects.










<b></b>
Metal 2 Update Announcement in WWDC 2018

#WWDC 2018 deprecated OpenGL ES
Yesterday Apple has conducted their WWDC 2018 at San Jose, CA. They announced lots of major update such as iOS 12 and etc. Along with that, they also introduce metal 2.1 (core graphics programming for iOS). It's designed to provide the best access to the modern GPU on iOS, MacOS and tvOS. Check out these following documentations for metal:
<a href="https://developer.apple.com/documentation/metal">Metal</a>
<a href="https://developer.apple.com/documentation/metalperformanceshaders">Metal Performance Shaders</a>
<a href="https://developer.apple.com/documentation/metalkit">MetalKit</a>

OpenGL is announced as deprecated in iOS 12. Games and Apps that built using openGL should now adopt Metal. It doesn't mean that any apps that built using openGL will not run in iOS 12. They still working fine, but in a very short period of time. As a developer we always try to avoid writing deprecated code. If you apps is developed using openGL, I recommend you to update your code to adopt Metal as soon as possible since It might be remove entirely from the operating system.

This year, Apple has announced that they are working on metal to bring the highest performance on GPU. They recently added support for external GPU as well. Now GPU also enable mac to achieve new high performance in 3D rendering and gaming.

#Metal and CreateML
Usually developer used third-party library to train their model like <b>Tensorflow</b>. We can use metal with GPU to train the model which give us 20 times speed up than running on the CPU. As mention earlier, Apple has announced a new feature for developer call <a href="https://developer.apple.com/documentation/create_ml">CreateML</a>. With createML we have the capability to train our model and when the model is trained well enough, we are ready to integrate it with our app using <a href="https://developer.apple.com/documentation/coreml">CoreML</a>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211892/08a45075-fd30-50ae-5c99-96e5e0519953.png).
We can train vision, natural language model and we also can bring our own custom data to train as well. All of the training is GPU accelerated, so It's incredibly fast.
With CreateML, developers can train an AI model on 20000 photos in less than an hour on a MacBook Pro according to Apple.
[Vue.js]祖先のイベントを孫から叩くには

# やりたかったこと
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165355/11750c59-f89e-92c2-8b67-b8f073ac3767.png)

こんな感じで孫から祖先の関数を叩きたかった。

# 結論から先に
![001.png](https://qiita-image-store.s3.amazonaws.com/0/165355/c5267dbc-6496-b188-e92b-59a46748d787.png)
こんな感じで階層ごとに親へ`$emit`してやる必要があるみたい。
あくまでも親－子の関係しか存在し得ないので、祖先に渡す場合は一旦親を経由する必要がある。

## Code
<p data-height="600" data-theme-id="0" data-slug-hash="dKMNxY" data-default-tab="js,result" data-user="tosite" data-embed-version="2" data-pen-title="Vue - grandchild-emit" class="codepen">See the Pen <a href="https://codepen.io/tosite/pen/dKMNxY/">Vue - grandchild-emit</a> by tosite (<a href="https://codepen.io/tosite">@tosite</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 試してみたこと
（実際のコードとは違いますが、やらんとすることは伝わるかと思います。）

```vue
<parent @parent-method="parentMethod">
  <child @parent-method="parentMethod">
    <grand-child @parent-method="parentMethod">
    </grand-child>
  </child>
</parent>

<parent @parent-method="parentMethod">
  <child @parent-method="$parent.parentMethod">
    <grand-child @parent-method="$parent.parentMethod">
    </grand-child>
  </child>
</parent>
```

# こんなことするなら...
[**Event Bus**](http://www.ie-kau.net/entry/communication_between_components_without_parent-child_relation_in_vuejs)機能を利用する方がいいのでは。
あるいは `Vuex` で状態管理するべきか。
Vue、便利なんだけど難しい。
SQL serverと開発環境を接続 windows編

前提：アプリ側の設定は完了している。


①sqlサーバーをインストール
②portを確認
 →cmdでnetstat -naoを打ち込む
 　※おそらく1433　or 1434になってる
 ※アプリ側にポートを設定してあげるため。
③Microsoft SQL Server Management toolを使用
④DBインスタンス上で右クリック　→　プロパティを選択
⑤セキュリティ
⑥SQL Server認証モードとWindows認証モード(S)にチェックを入れる
⑦OK　※OKを押すと再起動してくださいとでるので再起動してください

これでOK!

※サーバーの認証モードを変更することに関して詳しくはここをご参照ください。
https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/change-server-authentication-mode?view=sql-server-2017
Smartyを便利に使おう！基本的な使い方

#Smartyを便利に使おう！

　コードを見ていて、知らないPHPのような書き方が出てきて戸惑いました。
調べるとSmartyというものを使ってるみたいです。
　覚えたら便利そうなので、使い方を覚えて活用していこうと思い、この記事を作成しました。

##そもそもSmartyとは何か

　簡単にいうと、PHP用のテンプレートエンジンのことです。  

* テンプレートエンジン  
PHPとHTML(CSS)を分けることができ、分割する理由として同じ処理で別の内容を表示したいとき、表示内容だけ変えればいい。



##Smartyを使い方
###用意
　まずSmartyを使うためには、公式のHPからダウンロードする必要があります。  
ダウンロードしたら、保存をしPHPのファイルからrequireでSmarty.class.phpというファイルを呼びます。

###基本的な構文
 基本的に{}でを使ってタグに埋め込みます。
 
 コメントは、  
{* ここにコメントを書く *}

 このようにして書けます。
 
 
| 説明                     	| 構文                               	|
|--------------------------	|------------------------------------	|
| 標準の変数               	| {$foo}                             	|
| 配列                     	| {$foo[]}                           	|
| 連想配列                 	| {$foo.bar}                         	|
| オブジェクトのプロパティ 	| {$foo->bar}                        	|
| オブジェクトのメソッド   	| {$foo->bar()}                      	|
| configファイル変数       	| {#foo#}                            	|
| {assign}関数             	| {assign var=foo value='baa'}{$foo} 	|


##関数

　関数を組み込みで入れることもできます。今回はよく使う関数だけ説明します。


###foreach


下のような簡単は配列を表示したとき、

```
<?php
$arr = array('red', 'green', 'blue');
$smarty->assign('myColors', $arr);
?>
```

HTMLのタグにこのように書けば、表示されます。

```
<ul>
{foreach $myColors as $color}
    <li>{$color}</li>
{/foreach}
</ul>
```

出力はこのようになります。

```
<ul>
    <li>red</li>
    <li>green</li>
    <li>blue</li>
</ul>
```


###if構文

**演算子**  
PHPと同じ演算子も使えますが、代替することも出来ます。

| PHP 	| Smarty 	|
|-----	|--------	|
| ==  	| eq     	|
| !=  	| ne,neq 	|
| >   	| gt     	|
| <   	| lt     	|
| >=  	| gte,ge 	|
| <=  	| lte,le 	|
| === 	| なし   	|
| !   	| not    	|
| %   	| mod    	|


例えばこのように使います。

```
 {if $name eq 'Fred'}
    Welcome Sir.
{elseif $name eq 'Wilma'}
    Welcome Ma'am.
{else}
    Welcome, whatever you are.
{/if}
```

またこのようなORの文は、このように書きます。

```
{if $name eq 'Fred' or $name eq 'Wilma'}
   ...
{/if}
```
上と同じです。

```
{if $name == 'Fred' || $name == 'Wilma'}
   ...
{/if}
```



このようにPHP関数も組み込むことが出来ます。


```
{if isset($foo) }
   .....
{/if}
```

他にもたくさんあるので公式ドキュメントを見てください。


##まとめ
　今回は初心者向けに説明をしましたが、いろいろ機能を使えば、素早く構築や追加などが素早くできます。  
また、バージョンによって形式が変わることもあるので時々バージョンアップもしてみてください。


　
　
##参考文献
[Smarty公式ホームページ](https://www.smarty.net/)
PostgreSQLのReturning句について

# PostgreSQLのReturning句について
調査したことをメモ代わりに残す。

## Returing句
Postgresqlの独自拡張で、insert,update,deleteの結果を返す機能。Postgresqlの8.2から利用可能。
DMLの最後（文の末尾に）returningを記載することで利用可能。

```sql
insert into temp (code,name,create_date) values ('11','test',current_date) returning code,name,create_date
```
結果として、

|code|name|create_date|
|:--- |:--- |:--- |
|11|test|システム日付|

が返ってくる。

## 利用シーン
テーブルに登録されている条件にマッチしたデータを取得し、CSV出力する。
CSV出力したデータには、出力済みのフラグを立てる。
・・・なんていう場合に便利に使えるかな？（試してないけど）

## Javaで使う場合
statementを利用してReturning句付きのDMLを実行する場合、executeUpdateを利用するとRetruning句の結果が取得出来ないので、executeを使うと良いみたい。