OmniAICreator/Qiita-1.07M huggingface dataset:
netdataでアクティビティを監視する

# Abstract 
PCのアクティビティを監視するのは、多くのエンジニアにとって関心があることだと思う。
特に、CPUで激しい計算をする数値最適化問題を解く場合（以前の私だが）や深層学習を使った開発では、
CPUの挙動を確認したりしながら、計算効率化をはかりたくなるケースがある。

今回は、MacOSを使用し、ローカルのPCを監視するという内容を紹介する。
最終ゴールは以下のような感じ。

![スクリーンショット 2018-08-27 12.13.07.png](https://qiita-image-store.s3.amazonaws.com/0/182628/02c608be-6b0e-0a4a-f284-9934c742df41.png)


# インストール
今回は、netdataというツールを使って「ローカルPCの稼働状況を確認する」という課題に取り組んでみる。
netdataは、zabbixやhtopと同様、CPUやネットワークの監視をするためのツールである。

## 設定環境
```
ProductName:	Mac OS X (High Sierra)
ProductVersion:	10.13.5
BuildVersion:	17F77
```

# Installation
やることといえば、[こちら](https://github.com/firehol/netdata/wiki/Installation#macos)を見て、指示に従いながらコマンドを打つだけ。
ちゃんと読めば誰でもわかるくらいこのwikiは丁寧に書かれているので、わたしが追加で説明することは特にない。

公式のチュートリアルと一緒だが、

```common-lisp
> brew install netdata
> /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

> brew install ossp-uuid autoconf automake pkg-config
> git clone https://github.com/firehol/netdata.git --depth=1

> cd netdata
> sudo ./netdata-installer.sh --install /usr/local
```

で問題なく動く。

# インストールしたら
ブラウザでlocalhost:19999にアクセスすれば自分のローカル環境を確認できる。

なお、停止は以下のどちらかを実行すれば大丈夫

```common-lisp
> killall netdata 
> sudo killall netdata 
```

# Reference 
1. [netdata](http://my-netdata.io/)（デモが見れる）
パッケージの依存を分割して pip install する

# 概要

pip install する際、依存する外部パッケージを選択してインストールできる [extras_require](https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies) 書き方を記します。
次のような状況において必要な外部パッケージを選択してインストールする場合に有効です。

- インストールされる外部パッケージを最小限にしたい。
- テストコードを実行するために必要なパッケージを含めたインストールを行いたい。


# 問題点として

pip install には様々な便利機能があるものの、公式ドキュメントや pip のドキュメントをよく見ないと書き方がわかりづらい。


# setup.py の書き方

setup 関数の中に [extras_require](https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies) を加えます。

```
setup(
    name="example",
    ...
    install_requires=[        ← ここには必須となる外部パッケージを記載します。
        "requests"],
    extras_require={          ← ここにはオプション機能として、インストール時に追加したい機能向けの外部パッケージを辞書形式で記載します。
        'test':  ["nose"],
        'doc': ["sphinx"],
    }
)
```

## extras_require

- 必須ではないオプション機能で使用する外部パッケージを `extras_require` に辞書形式で指定します。
- これらのオプション機能で使う外部パッケージは、インストール時に明示的に指定することでインストールされます。
- この例ではテストを実行する場合のみに必要になる `nose` とドキュメント生成を実行したい場合のみに必要になる `sphinx` を指定しています。


# pip install の書き方

extras_require のパッケージを pip install する場合は `[]` で extras のキー名を指定します。

次のようになります。

```
pip install example[test]
pip install example[doc]
pip install example
```

- 1番目はテストで使用する外部パッケージ込みのインストールを行います。
- 2番目はドキュメント生成のための外部パッケージ込みのインストールを行います。
- 両方同時に指定することもできます `example[test, doc]`
- 3番目は必須外部パッケージ `requests` のみがインストールされます。

----


## (応用例1) Dask

広く使われているパッケージ [Dask](http://dask.pydata.org/en/latest/) ではこの仕組みを積極的に利用し、不要な外部パッケージを極力インストールしないような工夫がなされています。

[参考ドキュメント](http://dask.pydata.org/en/latest/install.html#pip)


開発中のアプリが扱う内容が多岐にわたり、それぞれ独立性が高い場合には、この手法で依存パッケージのインストールを最小限に抑えることができます。


## (応用例2) GitHub から直接 pip install する

GitHub 上のリポジトリから直接ローカルにインストールすることも可能です。

```
$ pip install "git+https://github.com/dask/dask.git#egg=dask"[complete]
```

クォーテーションマークの囲まれ方に注意が必要です。


# 参考

- [(公式) setupスクリプトを書く](https://docs.python.jp/3/distutils/setupscript.html)
- [pip user guide](https://pip.pypa.io/en/stable/user_guide/)
- [setuptools](https://setuptools.readthedocs.io/en/latest/setuptools.html)
- [Dask](http://dask.pydata.org/en/latest/docs.html)
GitHubリポジトリのブランチを指定して pip install する

# 概要
GitHub リポジトリのうち、作業ブランチで開発中のパッケージを直接ローカルに pip install するときのコマンドの書き方を記します。


# 問題点として
GitHub から直接 pip install できる便利機能があるものの、公式ドキュメントや pip のドキュメントをよく見ないと書き方がわかりづらい。


# pip install の書き方

| URLスキーム | pip コマンド |
|:--|:--|
| HTTPS | `pip install git+https://github.com/(アカウント名)/(リポジトリ名).git@(ブランチ名)` |
| SSH   | `pip install git+ssh://git@github.com/(アカウント名)/(リポジトリ名).git@(ブランチ名)` |


----


# インストール例

例として下記のような作業ブランチを持つ GitHub リポジトリのうち、 **develop ブランチの最新版をGitHubから直接インストールする**方法を記します。


## ブランチの構成

```
  d-------d  develop ブランチ
 /
o----------  master ブランチ
```


## setup.py の書き方

この場合の `setup.py` の内容は[通常のパッケージの書き方](https://docs.python.jp/3/distutils/setupscript.html)と同じです。


## サンプルプログラムの作業ブランチを GitHub から直接 pip install する

GitHub サプリディレクトリを直接 pip install が行える実験用の[サンプルプログラム](https://github.com/smn-ailab/tshimura_qiita/tree/master/weather_checker)を作成しました。

pip install コマンド

```bash
$ pip install "git+https://github.com/smn-ailab/tshimura_qiita.git@develop#egg=weather&subdirectory=weather_checker"
```

- リポジトリ名.git の後に `@ブランチ名` のかたちで指定します。
- ここではサブディレクトリを指定するための subdirectory を追加し、その場合に必要になるダブルクォーテーションマークを全体に囲っています。 サブディレクトリのインストールの詳細記事は[こちら](https://qiita.com/tshimura/items/64603dfb8f0d6eb35992)。
- なおアンインストールは `pip uninstall weather` です。


# 参考

- [(公式) setupスクリプトを書く](https://docs.python.jp/3/distutils/setupscript.html)
- [pip user guide](https://pip.pypa.io/en/stable/user_guide/)
macOSからUbuntu16.04にリモートアクセスする方法

##Ubuntu側
1. Ctrl+Alt+Tでターミナルを起動
2. dconfエディターのインストール [sudo apt-get install dconf-tools]
3. コンピューターを検索で「dconf-tools」と入力
4. 「dconfエディター」を起動
5. dconf > org > gnome > desktop > remote-access と進む
6. 「enabled」にチェック、「require-encryption」のチェックをはずす。
7. コンピューターを検索で「desk」まで入力する
8. 「デスクトップの共有」を起動
9. 下記項目のようにチェックを付ける(一番下は外す)

- [x] 「他のユーザーが自分のデスクトップを表示できる」
- [x] 「他のユーザーがデスクトップを操作できる」
- [x] 「パスワードの入力を要求する」
- [ ] 「このマシンへの接続を毎回確認する」

##macOS側
1. Finder で cmd+k
2. 「サーバへ接続」を起動
3. vnc://IPアドレス
2018-08-30 esa.io > 「タグやカテゴリで検索 + Star付き」記事を検索する >  UIの検討

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
Google Chrome バージョン: 68.0.3440.106（Official Build） （64 ビット）
```

### 希望

- タグやカテゴリで検索
- Star付き

上記の条件で記事を探したい。

### 関連

右上のハンバーガーメニュー(*1)にてStar付きの記事は探せるようです。

- [Starについて](https://docs.esa.io/posts/17)

*1) 参考: [ハンバーガーメニュー](https://qiita.com/shiraishiwataru/items/7728ffbc4dc390c92b06#-%E3%83%8F%E3%83%B3%E3%83%90%E3%83%BC%E3%82%AC%E3%83%BC%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC) by @shiraishiwataru さん

### 方法1

~~現在のシステムでは下記の手順となります。~~

~~1. ハンバーガーメニューでStarredを選択~~
~~2. 検索キーワードにてタグかカテゴリでさらに検索~~

(追記 2018-08-30)
上記、取消し線を付けた手順１と手順２はそれぞれ独立しているようです。そのため、手順１の効果は手順２実施時になくなるようです。

### 方法2
(追記 2018/08/30)

1. 検索キーワードにタグかカテゴリを入力
2. 検索キーワードにstarred:trueを追加
3. 検索する

キーボード使用を前提としたUIとしては検索可能です。

マウス操作だけでたどり着く方法はわかりませんでした。

### UI検討 > 別の流れ (未実装)

手順

1. タグかカテゴリをクリックして絞り込み (マウス使用)
    - あるいは、検索キーワードにてタグかカテゴリで検索 (キーボード使用)
2. 検索結果(一覧表示)の上部メニュー（下図)のAll右側にある「Star」をクリック (マウス使用)
   - **実際には機能はありません**

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e9f46a5d-1c40-74d6-160c-78abecc71b64.png)

### UIの検討理由

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e9f46a5d-1c40-74d6-160c-78abecc71b64.png)

「FlowやStock, Shippedでフィルタ追加できるのであれば、Starでもフィルタ追加できると、UIとしての振舞に類似性を持たせることができるのかなぁ」と思いました。
また、マウス操作だけで記事に到達しやすくすることで、タブレットでの閲覧などにも有用であるようにも考えました。

StarだけでなくWatchingも同様です。

StarとWatchingがUIの別の場所にあるのは、それなりの理由があるのでしょうね。
GitHubリポジトリのサブディレクトリにあるパッケージを pip install する

# 概要
GitHub リポジトリのサブディレクトリに入っているパッケージを直接ローカルに pip install するときの pip install コマンドの書き方を記します。


# 問題点として
GitHub から直接 pip install できる便利機能があるものの、公式ドキュメントや pip のドキュメントをよく見ないと書き方がわかりづらい。


# pip install の書き方

| URLスキーム | pip コマンド |
|:-----------------|:------------------|
| HTTPS | `pip install "git+https://github.com/(アカウント名)/(リポジトリ名).git#egg=(パッケージ名)&subdirectory=(ディレクトリ名)"` |
| SSH   | `pip install "git+ssh://git@github.com/(アカウント名)/(リポジトリ名).git#egg=(パッケージ名)&subdirectory=(ディレクトリ名)"` |

- egg=(パッケージ名)は `setup.py` の中にある関数 setup(name=○○○, ...) の引数 name に渡される名称です。


----


# インストール例

例として下記のようなディレクトリ構造をもつGitHubリポジトリのうち、 sub_package_1 にあるライブラリのみGitHubから直接インストールする方法を記します。


## ディレクトリ構造

```
.
|____sub_package_1    : リポジトリのルートの下に独立したパッケージがある.
| |____setup.py       : 独立したパッケージにはそれぞれ setup.py が存在する.
| |____package1
| | |______init__.py
| | |____util.py
|____sub_package_2    : 上記とは別の独立したパケージ
| |____setup.py       : 独立したパッケージにはそれぞれ setup.py が存在する.
| |____package2
| | |______init__.py
| | |____util.py
```


## setup.py について

この場合の `setup.py` の内容は[通常のパッケージの書き方](https://docs.python.jp/3/distutils/setupscript.html)と同じです。特にサブディレクトリのために必要な記述はありません。


## サンプルプログラムのサブディレクトリを GitHub から直接 pip install する

GitHub サプリディレクトリを直接 pip install できる[サンプルプログラム](https://github.com/smn-ailab/tshimura_qiita/tree/master/weather_checker)を用意しました。

pip install コマンド は次のようになります。

```bash
$ pip install "git+https://github.com/smn-ailab/tshimura_qiita.git#egg=weather&subdirectory=weather_checker"
```

- パッケージ名の後に `&subdirectory=(ディレクトリ名)`を指定します。
- ダブルクォーテーションマークで囲む点に注意してください。
- なおアンインストールは `pip uninstall weather` です。


# 参考

- [(公式) setupスクリプトを書く](https://docs.python.jp/3/distutils/setupscript.html)
- [pip user guide](https://pip.pypa.io/en/stable/user_guide/)
Ubuntuでlsyncがエラーを出さずに起動しない

Ubuntuでlsyncがエラーを出さずに起動しない場合がある。debugモードでログを吐いても何も表示しない。

# メッセージ
```bash
Starting lsyncd (via systemctl): lsyncd.serviceStarting lsyncd (via systemctl): lsyncd.serviceStarting lsyncd (via systemctl): lsyncd.serviceStarting lsyncd (via systemctl):
```

# 対応
一度lsyncをrestartすると解決する場合あり。(reloadではなく)

```bash
/etc/init.d/lsyncd restart
```

# 環境
- lsync: `2.1.5`
- Ubuntu: `16.4 LTS`
MACのファイル属性（パーミッション）に付与される「@」を削除する

環境：MacBookPro MacOS HighSierra ver10.13.6
AWS構築時にSSH用の.pemのファイルをダウンロードしたところ、ファイルのパーミッションの最後に@が付いていました。

```
[hoge:~/.ssh/authorized_key $ ls -la
total 56
drwxr-xr-x  9 hoge  CLARAONLINE\Domain Users   288 Aug 28 16:07 .
drwx------  8 hoge  CLARAONLINE\Domain Users   256 Aug 29 13:57 ..
-r--------@ 1 hoge  CLARAONLINE\Domain Users  1692 Aug 28 11:08 clara-test02.pem
-rw-------@ 1 hoge  CLARAONLINE\Domain Users  1688 Aug 28 16:06 clara-test03.pem
-rw-------  1 hoge  CLARAONLINE\Domain Users  1671 Aug 14 15:45 id_rsa_clara-test02.pem
```

これはMACの拡張属性（EA：Extended Attributes）のようで、詳細はls -l@で確認できます。

```
[hoge:~/.ssh/authorized_key $ ls -l@ clara-test02.pem
-r--------@ 1 hoge  CLARAONLINE\Domain Users  1692 Aug 28 11:08 clara-test02.pem
        com.apple.metadata:kMDItemWhereFroms     217
        com.apple.quarantine      57
```

2つappleの属性がついているのでxattrコマンドで削除します。

```
[hoge:~/.ssh/authorized_key $ sudo  xattr -d com.apple.metadata:kMDItemWhereFroms clara-test02.pem
[hoge:~/.ssh/authorized_key $ sudo  xattr -d com.apple.quarantine clara-test02.pem
```
「@」が消えました。

```
[hoge:~/.ssh/authorized_key $ ls -l;a
total 56
-r--------  1 hoge  CLARAONLINE\Domain Users  1692 Aug 28 11:08 clara-test02.pem
-rw-------@ 1 hoge  CLARAONLINE\Domain Users  1688 Aug 28 16:06 clara-test03.pem
```
directry指定の場合はこちらで一括削除ができるみたいです。


`% xattr -cr <directory>`
Rustのお勉強 - Cargoを使ってみる

[前回](https://qiita.com/toully/items/1b652bec2048eefd3130)、Rustの実行環境をDockerで作るところまでやりました。Rustには[Cargo](https://github.com/rust-lang/cargo)というパッケージマネージャーがあって、依存関係管理以外にもいろいろやってくれるようです。今回はCargoを使ってRustのお勉強ができるようにしていきたいと思います。


# Cargoでプロジェクトを作る

前回`rust-env`という名前でイメージをビルドしたので、それを使ってコンテナに入ります。その後、`cargo`コマンドでプロジェクトを作ります。

```
$ docker run --rm -it -v $PWD/share:/share -w /share rust-env:latest
root@7b1f977a0c05:/share# cargo new --bin hello
error: Failed to create project `hello` at `/share/hello`

Caused by:
  could not determine the current user, please set $USER
```

エラー出ましたね。$USERをセットしろと言われています。ここでいろいろ調べましたが、コンテナ起動の際にホストの`$USER`をセットすればいいようです。`/share`の中にはさっきのcargoコマンドでできた空の`hello`ディレクトリができているので事前に削除しておいて、コンテナを再起動します。

```
$ docker run --rm -e USER=$USER -it -v $PWD/share:/share -w /share rust-env:latest
root@4b713b34ecab:/share# echo $USER
mac側の$USER
root@4b713b34ecab:/share# cargo new --bin hello
     Created binary (application) `hello` project
```

できました。すでにファイルができているそうなので、コンパイルと実行が同時にできる`cargo run`してみます。

```
root@4b713b34ecab:/share# cd hello/
root@4b713b34ecab:/share/hello# ls
Cargo.toml  src
root@4b713b34ecab:/share/hello# cargo run
   Compiling hello v0.1.0 (file:///share/hello)
    Finished dev [unoptimized + debuginfo] target(s) in 6.28s
     Running `target/debug/hello`
Hello, world!
```

できました。とりあえず勉強中に`rustc`でいちいちコンパイルする作業がこれで不要になりそうです。次からやっとrustそのものの勉強に入れます。
IE で wbr を使う

`white-space: nowrap` と `<wbr>` 使ってる所が IE で崩れてたので調べました。

```
.nobreak { word-break: keep-all }
.nobreak wbr::before { content: "\200B" }
```

**参考記事**

- https://qiita.com/unarist/items/8b0e9941f340f26695eb
- https://css-tricks.com/forums/topic/zero-width-space-after-hyphen/


**追記 1**

`white-space: nowrap` は Firefox で wbr が効かない。
→ `word-break: keep-all` を利用

サラっと流しててまた同じ事？してハマったので追記。


**追記 2**

ブラウザ（Firefox と Google Chrome）で改行位置が異なったので、
有る程度ブラウザチェックもして置いた方が良いです。

具体的には括弧 `「」` 前後で発生していました。
恐らくブラウザ間での禁則処理の違いが原因。
// 解決方法など有りましたらシェアくださいませ。
ページのスクロール量を取得しようとしてハマった話

## 発生した問題
下記のコードで実装後ブラウザ間で動く動かない問題が生じた

```js

$(function () {
  $(window).scroll(function () {
    if ($(this).scrollTop() > 380) {
      $('.adsense').addClass('show');
    }
  });
});
```
`scrollTop()`を使いスクロール量を取得しようとしていたが、未対応ブラウザが多かった。
https://chaika.hatenablog.com/entry/2017/09/22/090000

## 解決策

`pageYOffset`を使う。
こっちの方が対応範囲が広い。
https://lab.syncer.jp/Web/API_Interface/Reference/IDL/Window/pageYOffset/
IE9以前はデフォルトで`addClass("show")`する。

```js
$(function() {
  $(window).scroll(function () {
    if (window.pageYOffset > 380) {
      $('.adsense').addClass('show');
    }
    // 未対応ブラウザ(ie9以前)の場合
    if (window.pageXOffset == undefined) {
      $(".adsense").addClass("show");
    }
  });
});
```
PowerAppsでデータソースからドロップダウンリストを作る

# 概要
PowerAppsで入力フォームを作成しようとしたときに困ったことメモ

# データソース
データソースとしてExcelのテーブルを用意し、OneDriveに置いておきます。
今回はテーブル名を「種類アイテム」としています。
![datasource.png](https://qiita-image-store.s3.amazonaws.com/0/147118/cc793ed9-d76d-3078-bd2a-e5f29ebbbecd.png)

そして、PowerAppsからデータソースを選択します。
「ビュー」タブ＞「データソース」＞「OneDrive」＞上で作成したExcel＞上で作成したExcelのテーブル＞接続
![selectdatasource.png](https://qiita-image-store.s3.amazonaws.com/0/147118/6c258ce3-2d4d-70ae-8c9a-391bbd001804.png)

# ドロップダウンコントロールの作成
データソースが用意できたら、ドロップダウンコントロールを作成します。
「新しい画面」を作成し、「コントロール」タブの「ドロップダウン」を選択します。
![createdropdowncontrol.png](https://qiita-image-store.s3.amazonaws.com/0/147118/d914ce6b-51c4-88ea-ca58-d72bdde269ca.png)

次に、ドロップダウンの中身をデータソースから取得します。
対象のドロップダウンコントロールを選択し、「Items」に`Distinct(種類アイテム,種類)`という式を入力します。
![settingdropdown.png](https://qiita-image-store.s3.amazonaws.com/0/147118/d11605a7-4760-60c2-d53f-a67726dae16f.png)


Distinct関数の引数の説明は以下の通りです。

Distinct([データソース], [操作対象となる値])

Distinct 関数 - PowerApps | Microsoft Docs
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-distinct

# 感想
こうやってみると簡単なんですが、どの関数使ったらいいのかなぁってところがいつも時間かかります。
マスターできれば爆速間違いなし！ですが･･･！

コントロールのUpdateで`[コントロール名].Selected.Value`とすれば、選択した値をSubmitForm時に送信することができるはず！
git で行がいつ「削除」されたのかを調べる

行が追加されたり、変更された時は `git blame` でいつ行われたか分かります。だが、削除されると分かりません。。**そのため、人は不要な行をコメントで残したり愚かな過ちを繰り返すのです**

それはおいといて、過去にあった（削除してはいけない）行がいつなくなったのか、マジで調べなくてはいけなくなりました。どうすればよいか「git blame 削除された行」でググったところ、分かりました。

* [git - Gitで行が削除されたコミット番号を知る方法 - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/21361/git%E3%81%A7%E8%A1%8C%E3%81%8C%E5%89%8A%E9%99%A4%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E7%95%AA%E5%8F%B7%E3%82%92%E7%9F%A5%E3%82%8B%E6%96%B9%E6%B3%95)

の最初の回答によると

```
git log -p -S'削除された文字列' ファイルパス 
```

でよいそうです。実際、これでいつ「うっかり、その行を削除してしまったか」分かりました。（でも、これ、その行がだいたいどういう内容か分かってる時しか分かりませんね…）

以上
CodenvyでJava開発: Consoleアプリdebug

##目的
Codenvyを使ってJava Consoleアプリケーションをdebugする方法の説明

##前提条件
Codenvy環境で「Hello World!実行」或いmaven Consoleプロジェクト作成ずみ

##内容
* pom.xmlファイルにmainClass追加
* debug コマンド作成
* debug 設定
* debug 実行

## pom.xmlファイルにmainClass追加
1. Projects Explorerからpom.xmlをダブルクリック
![WS000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/638133cf-25bf-38ad-5a1d-5b4627c616eb.jpeg)

2. maven-jar-pluginの設定追加
![WS000014.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/d5ce507b-4c2a-6572-422e-faf0832b5080.jpeg)


## debug コマンド作成
1. Commands ExplorerからDEBUGよこの「＋」クリック
![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/2effd642-24a8-fa4b-e8be-17c11a64d359.jpeg)

2. Javaを選択
![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/9ba20df4-b12b-5023-0995-2d9b91f68d0a.jpeg)

3. NameとCommand Lineを入力し、「SAVE」ボタンクリック
![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/14e1dbf9-0f91-42d0-2f3d-b8f009dd1f26.jpeg)


## debug 設定
1. 「Run」メニューの「Edit Debug Configurations」を選択
![WS000018.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/1e180686-e182-3b17-f4f0-e815f781dd03.jpeg)

2. JAVAよこの「＋」ボタンクリック
![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/7f239d5c-3b62-9813-72e1-5a62bc72cdd9.jpeg)

3. Nameを入力し、「Save」ボタンクリック
![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/fa6b11ef-60e9-c234-e9de-d4b0a2b4477c.jpeg)


## debug 実行
1. 行番号クリックでべれーくポイント追加
![WS000021.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/508e5782-b490-8227-09df-8a8c5007e893.jpeg)

2. 追加されたのが分かりずらいが、debug画面からも確認可能
![WS000022.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/7134ccac-870f-05be-aab4-1d9107dd25ea.jpeg)


3. debugボタンから追加したdebugコマンドを実行
![WS000023.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/a16e0d8b-63dd-f5f3-022c-9a90e3cf2008.jpeg)

4. [Listening for transport dt_socket at address:8000]が表示されたら、debug実行
![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/bf6071b4-c07f-310b-67df-80cad87586a9.jpeg)
![WS000025.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/e89e0200-60f1-51d0-6d66-50a66caae693.jpeg)
![WS000026.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/8cc34b3e-c4a9-dca5-fbd2-32b18443006f.jpeg)

5. 処理がブレークポイントでとまる
![WS000028.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/1529309e-940a-70c7-25b5-a71095421282.jpeg)


6. debugツール
![WS000027.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/f48f245c-5606-a272-4381-b41be724d304.jpeg)

7. debug実施
（Variablesから値変更）
値を選択し、編集ボタンクリック
![WS000029.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/c6e02bf2-65ca-119b-d2ed-8ba0d440bbe2.jpeg)

8. 値を修正
![WS000030.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/712469ce-6822-0dbf-04ae-39adedb44a08.jpeg)

9. 修正内容確認
![WS000031.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/6be039e9-c69e-570a-c137-065a839b135a.jpeg)

10. 実行結果確認
![WS000032.JPG](https://qiita-image-store.s3.amazonaws.com/0/281032/9d570a29-f5c5-ae3e-1e8b-1bef35f2167b.jpeg)

##参考内容
debugコマンド：https://codenvy.com/docs/user-guide/debug/index.html
mount_osxfuse:{path}: Input/output error


昼休みってパソコン起動させたままランチいきますよね？
ところがある日、戻ってくるとubuntu上のフォルダをマウントさせたsshfsが死んでました。

マウントしたフォルダのコードを編集して、保存すると、そんなファイルないよと怒られたので、頭にはてなマークを浮かべながらも、とりあえず再度接続コマンドを叩いてみる。

```console
$ sshfs username@host:{プロジェクトディレクトリ} {マウントディレクトリ} -o sshfs_sync -o sync_readdir
mount_osxfuse: {プロジェクトディレクトリ}: Input/output error
```

**ん？**

本当、なにこれ？

エラーでググっても、なんかHD壊れかけだのなんだの好き放題言ってくれる。

[Input/output errorでグーグル検索](https://www.google.co.jp/search?ei=HBlgW8mqMoiF8gXpxJTwAQ&q=+Input%2Foutput+error&oq=+Input%2Foutput+error&gs_l=psy-ab.3..0l3j0i7i30k1l5.11631.11631.0.11830.1.1.0.0.0.0.130.130.0j1.1.0....0...1c.1.64.psy-ab..0.1.129....0.KcxiouO_zbo)

~~まあ、これは調べ方が悪すぎr..~~

別に何も変なことしてないって！って感じだったので、とりあえずプロセスがいきてるか確認。


```console
$ ps aux | grep sshfs

name   901   0.0  0.2  3028684  32880   ??  Ss    9:18AM   1:26.05 sshfs {プロジェクトディレクトリ} {マウントディレクトリ} -o sshfs_sync -o sync_readdir
name  2154   0.0  0.0  2453628   1004 s004  S+    4:08PM   0:00.01 grep sshfs
```

つまりは特に問題ないってことですかね？

[psコマンドまとめ](https://qiita.com/shell/items/68ed71a7f018e5688f73)


なんで死んでるのかよくわからないので、一旦プロセスをkillして、アンマウントする。

```console
$ kill -QUIT 901
$ umount -f {プロジェクトディレクトリ}
umount: {プロジェクトディレクトリ}: not currently mounted
```

再度接続。

```console
$ sshfs username@host:{プロジェクトディレクトリ} {マウントディレクトリ} -o sshfs_sync -o sync_readdir
name@global_ip's password:
```


つながった。

**つ な が っ た。**

[fuse: bad mount pointが起きたときは](http://hideack.hatenablog.com/entry/2012/09/29/101926)

[sshfsの接続が切れた時のエラーの対処](https://qiita.com/nrainiero/items/3b1e5ddb19bb0f4a829d)

>sshfsでローカルにリモートのディレクトリをマウントしていたときに、回線が切れたりした場合、マウントした箇所に移動しようとすると、...

って言ってるけど、そういうことなのかな？
`bad mount point`って別に出ないし、エラーでぐぐるにしても `Input/output error`になるから、↑のサイト最初ヒットしなかった。

原因はよくわからないけど、とりあえず、プロセス殺して、再度つなぎ直せばいいのね。


[sshfs(1) - Linux man page](https://linux.die.net/man/1/sshfs)



# 
下書きと言う名のメモ欄が圧迫されてきたので、解放。
メモなのに一応見れるようにしないとって思う(えらい！褒めて！)から多少時間かかるし、大変なのでincrementsさん下書きの件数増やして...(切実)
Twitter の OGP 画像を変更しても更新されない場合は、Card Validator を使う

# OGP 画像を修正しても、シェア時に反映されない

ソーシャルサービスへシェアされるのを見越して、og: や fb: から始まるいわゆる OGP の設定をするわけですが、開発環境 › テスト環境 › ステージング環境 › 本番環境と、徐々に本番デプロイに近づいていく中、『シェアのテスト』が厳密に実施できるのは基本的には最後の本番環境のみ。  
いざ本番公開したあとでシェアしてみたら、OGP 画像のパスが間違っていた… ということがあるかどうかはともかく、OGP 画像は twitter 側のサーバでキャッシュされるようで、単に Web サイト側の OGP 画像を修正・変更しても、それが反映されるのには時間がかかります。  

# Twitter Developer › Card Validator を使う

https://cards-dev.twitter.com/validator

Twitter Developer には Card Validator というものがあります。
機能としては Twitter Card のプレビュー・エラーチェックができるものですが、ここに URL を投下することで、副次的にキャッシュのクリアもされる様子。

　　

という備忘録。  
しかし Twitter Card は、 twitter:title、twitter:description、twitter:image は不要で og: 側を参照するようになったんだなー… 知らなかった。
AndroidでのBitmap/JPEG/byte配列の相互変換

# 画像データの取り扱い
画像ファイルを読み込み、それを画像処理するようなアプリを作成していたときに、様々な画像フォーマット(jpeg,png,bmp等)をBitmapクラスに変換して扱いたいことがありました。
また逆に、Bitmapからjpeg・png圧縮したり、byte配列に変換したい場合もありました。
本記事では、それらの相互変換についてメモしておきます。

# 形式の相互変換の方法
本記事では、Android SDKの”**Bitmapクラス**”と”**画像フォーマットのbitmap**”を区別するために、前者は”**Bitmap**”、後者は”**bmp**”と表記します。

## byte配列(bmp) → Bitmap
Bitmap.createBitmap()に画像の縦横サイズ、bmpの形式を指定してBitmapを生成する。
生成したBitmapの中身に、ByteBuffer経由でbyte配列をコピーする。

```java:bmparr2bitmap.java
// bmparr(byte[])に、bmp形式で画像データが入っている前提
// width, height: 画像データのサイズ
Bitmap bitmap = Bitmap.createBitmap(width , height, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(bmparr));
```

## byte配列(jpeg,png等) → Bitmap
BitmapFactory.decodeByteArray()を用いる。
このメソッドは、jpegやpngなどで圧縮されたデータをBitmapにデコードする。
bmp形式はこちらでデコードできない様子。

```java:jpegarr2bitmap.java
// jpgarr(byte[])に、jpegやpngなどの圧縮形式で画像データが入っている前提
Bitmap bitmap = BitmapFactory.decodeByteArray(jpgarr, 0, jpgarr.length);
```

## Bitmap → byte配列(bmp形式)
Bitmap.copyPixelsToBuffer()でByteBufferに値をコピーし、ByteBufferからbyte配列を取り出す。

```java:bitmap2bmparr.java
// bitmap(Bitmap)に画像データが入っている前提
ByteBuffer byteBuffer = ByteBuffer.allocate(bitmap.getByteCount());
bitmap.copyPixelsToBuffer(byteBuffer);
byte[] bmparr = byteBuffer.array();
```

## Bitmap → byte配列(jpeg,png等)
Bitmap.compress()でBitmapからjpeg/png等の形式に圧縮し、ByteArrayOutputStreamに渡す。
ByteArrayOutputStreamからbyte配列を取り出す。

```java:bitmap2jpgarr.java
// bitmap(Bitmap)に画像データが入っている前提
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] jpgarr = baos.toByteArray();
```
社内でpython系の勉強会するならGoogle Colaboratoryを使おう

最近社内でpythonで機械学習系の勉強会を行うことになり、ツールを調べていたところ、[google colaboratory](https://colab.research.google.com/)というツールを見つけました。

google colaboratryは、jupyter notebookというコードとその実行結果やメモをノートブック形式で残せるツールをオンラインで提供したサービスです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221497/5b9c7ef8-2226-3138-5c26-12d91de2c59c.png)

詳細はこちらの記事が詳しいです！
> [**Google Colaboratory事始め**](https://qiita.com/kouki_outstand/items/cd24dccbaa92274be39e)
[**Google Colabの知っておくべき使い方 – Google Colaboratoryのメリット・デメリットや基本操作のまとめ**](https://www.codexa.net/how-to-use-google-colaboratory/)

試しに触れていくうちに、**これってpython系の勉強会に最適なサービスだな！**と思ったので利点をまとめます。

## 社内のpyhton勉強会で使うべき理由を３行で！！
* 環境構築がいらない
* 共有が容易
* コメントできる

## 環境構築がいらない
社内で勉強会となると、「普段はpythonに触ったことないけど機械学習に興味があるから参加してみようかな」というエンジニアの方や、「そもそもプログラミングに触れたことのないけどpythonって最近流行っているし、比較的簡単って聞くからやってみたい」というビジネスサイドの方も参加される機会があるかと思うのですが、そんなライトにやってみたい方々のハードルの１つになるのが環境構築だと思います。

でも、google colaboratryならgoogleアカウントさえ持っていれば、オンラインでpythonを実行できる環境が何のインストールもなく簡単に手に入ります。
事前準備が何もいらないので、ライトに勉強会に参加することができます。

## 共有が容易
普通pythonの勉強会をやるとなるとjupyter notebookファイルを事前or事後配布するという形になるかと思うのですが、これでは何か間違いを修正したり、コードを追加したりした時に再度ipynbファイルを配布し直したりという手間が生まれてしまいます。
かつ、回数を重ねるごとに参加者もファイルをダウンロードすることになり、参加者のフォルダも汚れてしまいます。

一方、colaboratryなら共有は他のgoogle appsと同じで範囲や権限などを設定することができ、更新があっても、リアルタイムで反映されるため、ファイルの再配布は必要ありません。かつ参加者もリンクにアクセスすれば良いので毎回ファイルをダウンロードする必要がなくなります。

## コメントができる
事前に用意されたコードに参加者個人個人のわからないところを対応するセルにコメントしておけば、勉強会のホスト側が事前にコメントされた疑問点を拾い、解決しながら勉強会を進めることができます。

また、進めて行く中でわからない部分が出てきた場合も、コメントとして残せば流れを止めることなく、疑問を残すことができます。

## 他にもまだまだ！

* マークダウン形式での目次の自動生成
* unixコマンド
* pip
* GPUの使用
* Googleドライブへの保存、Googleドライブからの読み取り

などなど、機能が豊富です。

## 終わりに
リロードしないとコメントが反映されなかったり、共同編集などの挙動に一部不便な面もありますが、楽にpython勉強会を運営する強力なツールとして今後も注目して行きたいと思います！！
check-logで気になってたことが解決

かなり以前から気になっていたが適当に使っていたcheck-logの仕様について確認する機会があったので
サポートにぶん投げたら普通に回答いただいたのでメモとして残しておきます。
スッキリした。

検証しとけよってのはごめんね。


> -w オプションを指定した場合と指定していない場合との挙動の違いですが、
こちらのオプションを指定した場合、1回のログ出力内容のチェックにおいて、
このオプションで指定した値よりも多くのエラー行が検出された場合に、
warningアラートとして発報するためのものとなります。
（出力行数がその値に満たない場合には、アラートとして発報されません。）

> オプションを指定しない場合は、1行でも該当行があればアラートとして発報されますが、
ご連絡いただきましたような「出力された行数分だけwarning通知がされる」といったことは
ありません。


> --state-dir オプションを指定した場合と指定していない場合でどのような違いがあるのか

>こちらですが、check-log ではチェック済みの行数を一時ファイルとして保管いたしますが、
その一時ファイルの保管場所を指定されたいときにご利用いただくオプションとなっており、
通常はご利用いただく必要はございません。
PHPでLeague/CSVによるCSV(SJIS-win)の読み込み

実際はLaravelでのお話。
本当はLaravel Excelを使いたかったのだけど、
Excelならうまくいく日本語処理が、CSVだとどうもうまくいかなかったので諦めて他のライブラリ探し。
PHPでCSVを扱うにはライブラリはいくつもあるし、厳密でなければ一から書くことも難しくはないが、今回はLeague/CSVを使うことに決定。

https://csv.thephpleague.com/

最新の安定版は、

```
PHP >= 7.0.10
```

composerでインストール。

```
composer require league/csv
```

公式サイトの情報が充実しているので、そこを読めばだいたいわかるはずですが、
CSVは英語前提なので、日本語を含むCSV、それもExcelで出力したようなSJIS-winのCSVだと単純に読み込もうとしてもうまくいきません。

```
<?php

use League\Csv\Reader;

$reader = Reader::createFromPath('/path/to/file.csv', 'r');
$reader->setHeaderOffset(0);
$header = $reader->getHeader();
$records = $reader->getRecords();
foreach ($records as $record) {
    //
}
```

公式サイトの最初に出てくる上記のコードだと、日本語(SJIS-win)は文字化けしてしまう。
そこで入力のエンコーディングを変更します。

https://csv.thephpleague.com/9.0/converter/charset/
http://memo.eightban.com/php/league-csv

```
<?php

use League\Csv\Reader;
use League\Csv\CharsetConverter;

$reader = Reader::createFromPath('/path/to/file.csv', 'r');
$encoder = (new CharsetConverter())->inputEncoding('SJIS-win');
$records = $encoder->convert($reader);
foreach ($records as $record) {
    //
}
```

これでSJIS-winのCSVを文字化けせずに読み込めます。
本当はCSV1行目の列名をキーにした連想配列で欲しいけど、そこは各自でなんとかしましょう:rolling_eyes:
先頭に - (ハイフン) が付いたファイルを削除する方法

vim などでちょっとした拍子に先頭に `-` が付いたファイルを作成してしまった場合の削除方法について。

```bash
$ ls
-rw-r--r--   1 hoge  hoge   5432  8 26 14:54 -h

$ rm -f '-h'
rm: illegal option -- h
usage: rm [-f | -i] [-dPRrvW] file ...
       unlink file

$ rm -f "¥-h"
rm: illegal option -- h
usage: rm [-f | -i] [-dPRrvW] file ...
       unlink file

$ # ちくしょう...
```

### A. `--` を使う

```bash
$ rm -f -- -h

$ ls
```

やったね！

#### `--` って何？

* https://linuxjm.osdn.jp/html/LDP_man-pages/man3/getopt.3.html

> "--" は特殊な引き数で、スキャンのモードによらず、 オプションのスキャンを強制的に終了させる。 

* コマンドライン引数に指定されたオプションの指定の最後を意味するものらしい
* getopt とかこれが機能するものもあれば、考慮されていないやつもある
* 呼び名不明
Laravel の illuminate/cache を単体で使用するときの設定

laravel のキャッシュ機構を、単体でも使いたい、というときの方法。

とりあえず今回はファイルキャッシュのみで。

## パッケージをインストール
`illuminate/cache` と、ファイル操作用に `illuminate/filesystem` を入れる

```
composer require illuminate/cache illuminate/filesystem
```

## 初期化

Filesystem と FileStoreを作って、そこからキャッシュリポジトリを作成。

```
$filestore = new \Illuminate\Cache\FileStore(new \Illuminate\Filesystem\Filesystem(), $cache_dir);
$cache = new \Illuminate\Cache\Repository($filestore);
```

## これで使える

```
$cache->put('key', $value, $minutes);
$value = $cache->get('key');
```

## 以上です

バージョン5.6 で確認しました

- https://github.com/illuminate/cache
- https://readouble.com/laravel/5.6/ja/cache.html
応急処置として、サーバーを再起動せずにボリューム(DISK)追加した


クラウドのサーバを使っていて、
いろんな用途で使っているCentOSサーバーが容量不足で、
ボリューム(DISK)を新規で追加しアタッチ。。

そして、**lsscsi**コマンドでデバイスを確認

```
# lsscsi
[0:0:0:0]    disk    VMware   Virtual disk     1.0   /dev/sda 
[1:0:0:0]    cd/dvd  NECVMWar VMware IDE CDR00 1.00  /dev/sr0 
```


あれ、lsscsiコマンドうっても対象のデバイスがでてこない。。。

ボリュームのアタッチ＆デタッチを繰り返しても変わらない。


ここを覗いてみると**host0**とか**host1**が存在した、、
よくわからんけど、それぞれscanってファイルが存在する。

```
# ls -la /sys/class/scsi_host/
合計 0
drwxr-xr-x  2 root root 0  8月 30 12:56 .
drwxr-xr-x 44 root root 0  8月  6 16:00 ..
lrwxrwxrwx  1 root root 0  8月 30 12:56 host0 -> ../../devices/pci0000:00/0000:00:10.0/host0/scsi_host/host0
lrwxrwxrwx  1 root root 0  8月 30 12:56 host1 -> ../../devices/pci0000:00/0000:00:07.1/ata1/host1/scsi_host/host1
lrwxrwxrwx  1 root root 0  8月 30 12:56 host2 -> ../../devices/pci0000:00/0000:00:07.1/ata2/host2/scsi_host/host2
lrwxrwxrwx  1 root root 0  8月 30 12:56 host3 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/host3/scsi_host/host3
lrwxrwxrwx  1 root root 0  8月 30 12:56 host4 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/host4/scsi_host/host4
lrwxrwxrwx  1 root root 0  8月 30 12:56 host5 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:02.0/host5/scsi_host/host5
```



```
# echo "- - -" > /sys/class/scsi_host/host0/scan
# echo "- - -" > /sys/class/scsi_host/host1/scan
# echo "- - -" > /sys/class/scsi_host/host2/scan
...
```

host0 host1 host2 ... を総当たりで叩いたら認識するようになった。。汗

なんだこれ。


ちゃんと再起動した方が安全だと思いますが、
停止できないサーバーや、緊急時や応急処置で必要になるケースがあるかも。


#### 参考にさせて頂いた記事
http://blog.idcf.jp/entry/cloud/diskcapacity/

https://www.faq.idcf.jp/app/answers/detail/a_id/828/c/15?_ga=2.178753572.169695212.1535332333-657515216.1519280909

https://www.ibm.com/support/knowledgecenter/ja/STXN8P/com.ibm.storage.ssic.help.doc/f2c_linlunprobe_1e69my.html
jsxでコメントアウトする

# jsxでコメントアウトする

以下で挟み込む

```
    {/* コメントアウト */} 
```

このような塩梅。tsxでも一緒。

``` jsx
class SugaClass extends React.Component {
    constructor(props) {
      super(props);
      this.state =  {data:[]}   
    }
    componentDidMount() {
        // コメントアウト
    }
    render() {
    // コメントアウト
    return (
      <div>
           {/* <div>コメントアウト</div> */} 
          <FugaClass/>
      </div>
      );
    }
  }
```
portaudioのビルド時のksguid.libエラー

# 概要
portaudioのプロジェクトをVSでビルドした際に以下のエラーがでる．
その場合の対処法を記述する．
>LINK : fatal error LNK1104: ファイル 'ksguid.lib' を開くことができません。

# 対処法1
追加のライブラリをインクルードする方法．以下記事を参照．
[https://so-zou.jp/software/tech/programming/cpp/misc-libraries/](https://so-zou.jp/software/tech/programming/cpp/misc-libraries/)

# 対処法2
プリプロセッサで該当ライブラリを使わないコンパイル設定にする方法．
プロジェクトのプロパティ -> C/C++ -> プリプロセッサ に次の項目を指定して再コンパイルする
`PA_WDMKS_NO_KSGUID_LIB`
以下記事を参照
[http://portaudio.music.columbia.narkive.com/88WPJvz4/ksguid-lib](http://portaudio.music.columbia.narkive.com/88WPJvz4/ksguid-lib)
Macから受け取った文字化けしたファイルをLinuxで解凍する

# Macから受け取った文字化けしたファイルをLinuxで解凍する

Windows環境等で、Macで作成した日本語を含むzipファイルを受け取ると文字化けして正常に解凍されないことが多々あります。
そういうときの治し方のメモです。

## Linuxでとりあえず解凍
UTF-8環境のLinuxへ持っていき、7zaコマンドで解凍します。

> $ 7za e mojibake.zip 

解凍すると、濁点が独立したUTF8のファイル名で解凍されます。
これはUTF-8をNFDという形でノーマライズしたものです。正確には異なりますがUTF8-macと言われているそうです。

## Linux,Windows形式にします。
WindowsやLinuxではNFCというというノーマライズが一般的なので、この形に変換をかけます。

NDFをNFC変換

> $ convmv -f utf8 --nfd -t utf8 --nfc -r [解凍されたトップディレクトリ]

変換結果がdry-runで表示されます。（実行されません）

--notestを付けると実行されます。
> $  convmv -f utf8 --nfd -t utf8 --nfc -r --notest [解凍されたトップディレクトリ]

# 7zで圧縮してWindowsに戻す
NFC形式に戻ったので、これをWindowsに転送して完了です。
この時の圧縮形式はzipではなく7zがよいです。
確実にUTF8として認識しますので、Windows側で解凍した際に文字化けしません。

> $ 7za a [修正したトップディレクトリ]
CentOS6.9でVNC server構築


よく忘れてしまうのでメモ書き。

##使用環境
CentOS 6.9

*CentOS 7の場合は[こちら](https://qiita.com/mecchi_99/items/4d8bf17717f52f21d6bd)

##vncserverパッケージのインストールから起動まで
＊root権限で行う

```
# yum install tigervnc-server
# vi /etc/sysconfig/vncservers
```

でコメントアウトしてある行の下に以下のように書き込む（使用するユーザー：hoge）
＊画面サイズは適当

```
# VNCSERVERS="2:myusername"
# VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -localhost"

VNCSERVERS="2:hoge"
VNCSERVERARGS[2]="-geometry 1920x1200 -nolisten tcp"
```

もし複数ユーザーを登録する場合は以下の通り。

```
VNCSERVERS="2:hoge 3:piyo"
VNCSERVERARGS[2]="-geometry 1920x1200 -nolisten tcp"
VNCSERVERARGS[3]="-geometry 1920x1200 -nolisten tcp"
```
5900+ディスプレイ番号がTCPのポート番号となる（この例ではhogeのポート番号は5902、piyoは5903）。
登録したいユーザーになって、VNC用のパスワードを作成する。

```
# su hoge
$ vncpasswd
  Password:
  Verify:
```
root権限に戻り、vncserverを起動する

```
# service vncserver start
```

##Firewallの設定

root権限で

```
# vi /etc/sysconfig/iptables

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
```
となっているので、以下の1行

```
-A INPUT -m state --state NEW -m tcp -p tcp --dport <ポート番号> -j ACCEPT
```

をiptablesの

```
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
```
のあとに挿入し、保存したらFirewallを再起動させる。

```
service iptables restart
```

## PCからアクセスする
VNCviewerなどのツールを用いて、IPアドレス:<ポート番号>を入力し、先ほど設定したパスワードを入れればOK。

![無題VNC.jpg](https://qiita-image-store.s3.amazonaws.com/0/285156/e9483507-b6d8-0e36-7bc8-8ab9c0c6238f.jpeg)
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/285156/04bebbb9-208e-74c4-d163-c4758ce57b86.png)



## パッケージのアンインストール
もしアンインストールしたい場合は

```
# yum remove tigervnc-server
```

で安全にアンインストールできる。
【ACCESS】登録されているテーブルやクエリの件数を取得する。

備忘録として残します。

てーぶるやクエリをわざわざRecordset等で呼び出してから条件を指定するのはコード量も増えるため、なんか美しくない。
とは言えカウントを取るだけのクエリを作成するのはナンセンス。

ということで、登録されているテーブルやクエリ（ビュー的なやつ）の登録件数を簡単に取得できる関数を紹介。
「DCount」関数です。
詳細は以下。

```VB
'第1引数：取得するカラム（第2引数で取得できるカラムを指定）
'第2引数：テーブル名 or クエリ名
'第3引数：条件
Dim cnt As Integer 
cnt = DCount("*", "tbl_テスト", "カラム <> ''")
```

いっつも、思うけどVBって癖がすごい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/424dfcb0-a6af-91e9-6bdd-5a9daa75c7ea.png)



以上です。
CSSで○と×かいてみた

# 動機
CSSで図形が描けるのでは？と思ったけど意外と見つからなかった。（探し方がわるいのかもしれないけど。）
また、borderを使えばマルを描くのはそう難しくはないけれど、バツを描くには2つの要素が必要になってしまったりする。別にこれで困ることは（そんなに）無いとは思うけど、できれば1つの要素で完結したい。
というわけで、円形グラデーション（radial-gradient）とか線形グラデーション（linear-gradient）とかを使って描いてみる。~~svg使えば？というのは言わないお約束。~~


#描いてみる
結果はこんな感じ
![batsu.png](https://qiita-image-store.s3.amazonaws.com/0/249727/ccb5b796-4f89-88eb-adb9-c50203c5f339.png) ![maru.png](https://qiita-image-store.s3.amazonaws.com/0/249727/06f969ef-d34a-dec3-3cf9-d1044e295020.png)
背景色なんかはお好みで。

##バツ
```
background-image: 
  linear-gradient(-45deg, 
    transparent calc(50% - 1px), #fff calc(50% - 1px), 
    #fff calc(50% + 1px), transparent calc(50% + 1px)
  ), 
  linear-gradient(45deg, 
    transparent calc(50% - 1px), #fff calc(50% - 1px), 
    #fff calc(50% + 1px), transparent calc(50% + 1px)
  );
```
ひとつめのliner-gradientで-45度の線を描き、ふたつめのliner-gradientで45度の線を描くだけ。

## マル
```
background-image: 
  radial-gradient(transparent 44%, #fff 47%, #fff 51%, transparent 55%);
```
透明にする開始地点（transparent XX%）と線を描く開始地点（#fff YY%）が近すぎるとChromeできれいに見えないので、少し離してあげるといいかんじ。
Paramsについてちょっとだけ理解が進んだので

    def show
     @post = Post.find_by(id: params[:id])
    end

これが意味不だったのがちょっとわかるようになったので記念に書く。

@post 
@をつけとくとこの変数をHTML（erb）ファイル内で呼び出せる。

Post
モデル名。投稿のひな型を呼び出してる。

find_by
メソッド。データベースのレコード（横）から、指定したカラム名の要素を探し出す。

(id:   〇〇 )
カラム名の指定をしてる。idカラムから〇〇のデータ探してこいということ。

(     params[ ])
~~paramsは変数で、~~[ ]内で指定したデータを拾ってくる。
(コメント欄で指摘いただきました)


[:id]
このとき指定してる[:id]はroutes.rbファイル内から探している。

    get "posts/:id" => "posts#show"

クエリパラメータとして:id があるので、その値を受け取っている。




逆から読みといていくと、

まずURLの ":id" の値を取得して
↓
データベース内からidカラムが ":id" に一致するものを探して
↓
Postモデルにそれを放り込んで生成したものを
↓
@postに代入してHTML上で使えるように

という流れ。だと思う。間違ってないと思いたい。
IE11でbootstrap4のModalの.modal-dialog-centered が効かない対策(CSSのみ）

本家でも把握されてるのでいつか対策されると思いますので、暫定的な対策としてCSSだけ解決する方法です

```css
.modal-dialog-centered {
  display:flex;
  flex-direction:row;
  justify-content:center;
  align-items:center;
  height: calc(100% - (.5rem * 2));
}

@media (min-width:576px) {
  .modal-dialog-centered {
    height: calc(100% - (1.75rem * 2));
  }
}

```

IE11のflexboxの縦方向が中央によらないバグに対応すれば直りました。
`min-height`の指定はそのまま残してても大丈夫です。

参考サイト）

- [Modal · Bootstrap](https://getbootstrap.com/docs/4.1/components/modal/)
- [Class modal\-dialog\-centered does not work on IE 11 · Issue \#25569 · twbs/bootstrap · GitHub](https://github.com/twbs/bootstrap/issues/25569)
- [IE11 の flexbox の中央揃えが難しい](http://var.blog.jp/archives/68883432.html)
ThinkPad + Windows10 + Chrome + VS Code タッチパッドジェスチャー＆ショートカット集

右手でマウスを操作して、左手でキーボードとタッチパッドを操作する。

# タッチパッドジェスチャー
* 拡大または縮小する
    * 2 本の指をタッチパッドに置き、つまむように操作する。
* 開いているすべてのウィンドウを表示する
    * 3 本の指をタッチパッドに置き、手前から奥にスワイプする。
* デスクトップ画面を表示する
    * 3 本の指をタッチパッドに置き、奥から手前にスワイプする。
* 開いているウィンドウを切り替える
    * 3 本の指をタッチパッドに置き、左右にスワイプする。
* Cortana を開く
    * 3 本の指でタッチパッドをタップする。

# ショートカット
## Windows
* ウィンドウを複数のディスプレイ間で移動する
    * 「Shiftキー」+「Windowsキー」+ 「←キー（→キー）」
* ウィンドウの最大化
    * 「Windowsキー」+ 「↑キー」
* ウィンドウを閉じる
    * 「Alt」+「F4」

## Chrome
* タブを移動する（左へ）
    * 「Ctrl」+「PgUp」
* タブを移動する（右へ）
    * 「Ctrl」+「PgDn」
* 新しいタブを開いて移動する
    * 「Ctrl」+「T」
* アドレスバーに移動する
    * 「Ctrl」+「L」
* 戻る
    * 「Alt」+「←」
* 検索する
    * 「Ctrl」+「K」
* デベロッパーツールを開く
    * 「F12」 

## VS Code
* 「''」で挟む（他の記号も同様）
    * 範囲選択してから「'」を入力する
* コメントタグを入力する
    * 「Ctrl」+「/」
* ブロックコメントタグを入力する
    * 「Shift」+「Alt」+「A」
* 同じ文字列を複数選択する
    * 「Ctrl」+「Shift」+「L」
* ラインをコピーする
    * 「Ctrl」+「C」（何も選択せずに）
* ラインを下にコピーにする
    * 「Shift」+「Alt」+「↓」
* ラインを上下に移動する
    * 「Alt」+「↑」or「↓」
* ラインを削除する
    * 「Ctrl」+「Shift」+「K」
* ターミナルの表示・非表示を切り替える
    * 「Ctrl」+「@」
* ウィンドウを閉じる
    * 「Ctrl」+「Shift」+「W」
* タブを閉じる
    * 「Ctrl」+「W」

## Googleスプレッドシート
* 列を選択する
    * 「Ctrl」+「Space」
* 行を選択する
    * 「Shift」+「Space」
* 左のシートに移動する
    * 「Ctrl」+「Shift」+「PgUp」
* 右のシートに移動する
    * 「Ctrl」+「Shift」+「PgDn」
* 最終行に移動する
    * 「Ctrl」+「End」
MercurialとGitを使って思うこと

# 何の話か
- Mercurialを業務で使ったので、これまでGitを使ったときとの所感をメモっておく
- Mercurialはチームのメンバーとして既にある運用ルールで使ったが、Gitは2人で使っていて割と独学で私がルールを作っていた

# MercurialとGitの違い
- Mercurialは間違ったマージの戻しはかなりつらい（らしい）
    - Gitの戻しも綺麗に戻すには結構つらいが、Mercurialで間違ったマージをプッシュした場合、「間違ったマージをプッシュしたら殺すｗ」と冗談めいて言われるレベルらしい
    - 理由としては、そういった操作をするためのコマンドがデフォルトで用意されていないからかな？と思っている
        - コミットをローカルで戻すのにも拡張コマンドを使えるようにしないといけないとかあったし
- Mercurialは単純、Gitは高機能な印象
    - Mercurialは現在のチームではほんとに次のコマンドしか使っていない
        - clone
        - up -C
        - commit
        - merge
        - diff
        - branch
        - pull
        - push
    - 単純にブランチに対して更新するだけの印象（チームでの運用がそうだからというだけの可能性もあり）
    - その分、戻しのコマンドはよくわからないため、間違った場合の処置がかなりきつそう（ググってもあまり情報がないし）
    - Gitでも同じようなコマンドだけでの運用も可能だと思うが、情報が多いので間違ったときの対処もなんだかんだ可能だったりする点でちょっと有利だと思う

# MercurialとGitの同じところ
- 次のコマンドはだいたい同じ
    - clone
    - commit
    - merge
    - diff
    - push
- pullについてはGitでの使い道があいまいな理解ではあるが使い勝手に違いを感じている
    - Gitのpullは、ローカルに反映してくれるまで全部やってくれる
    - Mercurialのpullは、リポジトリの情報を引っ張ってくるだけの様子※で次の順番で操作する（実はもっと単純で良いのかもだが、）
        - `hg up -C ブランチ名` でブランチの切り替えとローカルのクリーン
        - `hg pull` でリポジトリ情報の取得
        - `hg up -C` でローカル更新

※コメントもらっての通り、 `hg pull` = `git fetch` じゃん 

# 自分はどっち派か
なんだかかんだGit派。
Mercurialも使いこなせればアリだと思うが、以下の点で負けているかな。

- Gitがデファクトになっている風潮を感じている
- Mercurialは情報が少ない
centos6 or 7におけるsudoの追加

自分用のメモ書き。


1. root権限で `visudo` コマンドを実行

2.  以下の場所のコメントアウトを外す（自分の場合はなぜかすでに外れていた）</br>
\#\# Allows people in group wheel to run all commands
\#%wheel ALL=(ALL) ALL
↓
\#\# Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL

3.  `usermod -G wheel <ユーザ名>`を実行
Windows10にPyMOLをインストールする（2018年8月30日版）

#概要
PyMOLをWindows 10環境にインストールするときのメモです。
https://qiita.com/hnishi/items/5e5e1fd4902fbe809e73 を参考にしました。

#(1) Anacondaのインストール
PyMOLをビルドするために、Pythonをインストールします。
Anacondaを使ってPythonを入れるのが手っ取り早いのでAnacondaをインストールします。

https://www.anaconda.com/download/
![1.png](https://qiita-image-store.s3.amazonaws.com/0/57626/e3a516c5-1835-0fd6-a2c4-24226e019376.png)

`Anaconda3-5.2.0-Windows-x86_64.exe`という600MBくらいのファイルがダウンロードできます。これをインストール。
全部デフォルトのまま`Next`でOKです。最後にVScode入れますか？と聞かれますが`skip`でOK。

インストールされた場所を確認します。
たぶん `C:\Users\ユーザー名\Anaconda3\` に `python.exe` があります。
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/57626/66403251-0aed-0480-b55b-c265b55e2add.png)

#(2) pipをアップデートする
コマンドプロンプトを立ち上げます。
(2019.10.19 追記)  *管理者権限で実行* で立ち上げます。
```
C:\Users\ユーザー名> cd C:\Users\ユーザー名\Anaconda3
C:\Users\ユーザー名\Anaconda3> python.exe -m pip install --upgrade pip
```

を順に入力します。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/57626/dd750fcf-9a53-e7fb-f051-9366a6ecfc00.png)

#(3) PyMOLのビルドに必要なパッケージをダウンロード
`Pmw`、`numpy-mkl`、`pymol`、`pymol_launcher`の4つをインストールする必要があります。
wheel（.whlの拡張子）のパッケージが以下のURLにあるのでダウンロードします。
http://www.lfd.uci.edu/~gohlke/pythonlibs/

+ Pmw-2.0.1-py3-none-any.whl
+ numpy-1.15.1+mkl-cp36-cp36m-win_amd64.whl
+ pymol-2.2.0-cp36-cp36m-win_amd64.whl
+ pymol_launcher-2.1-cp36-cp36m-win_amd64.whl

を探してください。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/57626/fcdc03b1-1e34-516e-a82e-43a6527792da.png)
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/57626/00362b6b-2bcb-3261-358c-a394fca80bf9.png)

ダウンロードできたら、`python.exe` があったフォルダにぶちこんでおきましょう。
![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/57626/7d614c72-1349-1bb0-f5f5-d6801d572b3c.png)

#(4) PyMOLのインストール
コマンドプロンプトで以下を順に入力します。

```
C:\Users\ユーザー名>cd C:\Users\ユーザー名\Anaconda3
C:\Users\ユーザー名\Anaconda3>Scripts\pip.exe install Pmw-2.0.1-py3-none-any.whl
C:\Users\ユーザー名\Anaconda3>Scripts\pip.exe install numpy-1.15.1+mkl-cp36-cp36m-win_amd64.whl
C:\Users\ユーザー名\Anaconda3>Scripts\pip.exe install pymol-2.2.0-cp36-cp36m-win_amd64.whl
C:\Users\ユーザー名\Anaconda3>Scripts\pip.exe install pymol_launcher-2.1-cp36-cp36m-win_amd64.whl
```
 ![7.png](https://qiita-image-store.s3.amazonaws.com/0/57626/0e6f0bc9-5e84-230c-0e91-d568650c910f.png)

以上でインストール完了です。 `C:\Users\ユーザー名\Anaconda3` の下に `PyMOL.exe` ができているはずです。
![0.PNG](https://qiita-image-store.s3.amazonaws.com/0/57626/904a6b6d-f5a6-7ce2-3761-60be59bf291c.png)

ダブルクリックでPyMOLが立ち上がります。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/57626/06f59523-4d98-5d75-5563-4cfb9f9f721b.png)

おつかれさまでした。
Laravel Auth のUserモデルを別モデルに書き換えたい

ユーザー情報を保持し、それを閲覧する画面を作りたい時に困ったこと（Laravel5.5）
メモです。

<困ったこと>
:point_up:UserモデルをAdminに書き換えたい（Userはログインしない）
:v:Userモデルの時に作った認証機能を引き継ぎたい

<対処法>
1.
/config/auth.php

User ProvidersのモデルをApp\User::classからApp\Admin::classに書き換える

```
    /*
    |--------------------------------------------------------------------------
    | User Providers
    |--------------------------------------------------------------------------
    |
    | All authentication drivers have a user provider. This defines how the
    | users are actually retrieved out of your database or other storage
    | mechanisms used by this application to persist your user's data.
    |
    | If you have multiple user tables or models you may configure multiple
    | sources which represent each model / table. These sources may then
    | be assigned to any extra authentication guards you have defined.
    |
    | Supported: "database", "eloquent"
    |
    */

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],
    ],
```

<困ったこと>
1.でログイン・ログアウトはできたけど、新規登録が出来ない:dizzy_face:

<対処法>
2.
/app/Http/Controllers/Auth/RegisterController.php

validatorファンクションの
emailのunique:usersをunique:adminsに書き換える

``` 
    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:admins',
            'password' => 'required|string|min:6|confirmed',
        ]);
    }
```

ここはLaravel側でSQL叩いてるので、usersテーブルがないってエラーが出る
備忘録メモ：組み込み関数sumとnumpy.sumの違い

### 違いあるの？
答え：あるらしい
以下ブログで詳細ありますが、リストの数値和の場合は組み込み関数sumで、numpy.arrayの場合はnumpy.sumの方が早いらしい、、、
http://szdr.hatenablog.com/entry/2017/01/03/184013

あとnumpy.sumなら行毎,列毎の合計ができるので、ちょっと便利。
Amazon Aurora ServerlessとRDSの接続時間比較

AZ間の通信と、エンドポイント経由でAurora Serverlessへアクセスする際の接続時間の差も気になったので測って見ました。

# 前提条件
* VM-A(t2.micro/ap-northeast-1a)
* VM-C(t2.micro/ap-northeast-1c)
* VM-A/Cは同一AMIから作成
* RDS(Aurora MySQL 5.6/サーバーレス/最小・最大とも2 個のキャパシティーユニット)

# Perl-DBIによるアクセス

同じく、DBIを使用して、connect/disconnectだけを1000回ループ。

|     |  VM-A | VM-C |
|:----|:--:|:--:|
|１回目|13479|13542|
|２回目|13397|13733|
|３回目|14502|13764|
|平均|13793|13680|
(単位：msec)

## 結果
* EC2のゾーンによる、AuroraServerlessへの接続時間の差は見られない。
* 同一ゾーンのRDSへの接続時間に比べて、8倍程度遅い
* 異なるゾーンのRDSへの接続時間に比べて、1.6倍程度遅い


# mysqlコマンドによるアクセス

参考までに、mysqlコマンドでログイン／exitだけを1000回ループさせました。

|     |  VM-A | VM-C |
|:----|:--:|:--:|
|１回目|20819|20688|
|２回目|21814|21007|
|３回目|20720|21368|
|平均|21118|21021|
(単位：msec)

## 結果
* EC2のゾーンによる、AuroraServerlessへの接続時間の差は見られない。
* 同一ゾーンのRDSへの接続時間に比べて、4倍程度遅い
* 異なるゾーンのRDSへの接続時間に比べて、1.5倍程度遅い
Rubyでreturnを使って条件分岐をシンプルに書く方法

#はじめに

条件分岐のネストが深くなると可読性が落ちてしまいます。
しかし、returnを使って「早期復帰」させることで条件分岐をシンプルに書くことができます。

# 条件分岐でreturnを使う方法
まず、以下が`return`を使わずに書いたとき。ネストが深くてパッと見分かりにくいですよね。
`room.present?`じゃない時でも`true`を返すけど、`SPECIAL_ROOM_NUM`がある時だけは`false`を返すっていう処理です。

```ruby

class Room
  SPECIAL_ROOM_NUM = [104, 204, 304].freeze

  def stayable?(room)
    if room.present?
      if SPECIAL_ROOM_NUM.include?(room)
        false
      else
        true
      end
    else
      true
    end
  end
end
```

`return`を使って書いたのが以下。Rubyだと後置ifや後置unlessが使えるので一行で書くことができます。
`present?`の逆は`blank?`なので、`room.blank?`の時に`true`を返すよ、っていう処理にします。
さらに`SPECIAL_ROOM_NUM`を含んでいる時には`false`を返すようにという書き方もできて、さらにDRYなコードにできますね。

```ruby

class Room
  SPECIAL_ROOM_NUM = [104, 204, 304].freeze

  def stayable?(room)
    return true if room.blank?
    return false if SPECIAL_ROOM_NUM.include?(room)
    true
  end
end
```
パーミッションの一括変更

## 概要
グループに所属の他メンバーでも編集可能なようにパーミッションを一括変更するコマンドをメモしておく。

## 一括変更
chownのユーザーとグループの指定は任意に変更する。

```bash:ターミナル
# 対象フォルダを指定
export TARGET=/var/www/www.example.com/

# 所有者を変更する
sudo chown -R ec2-user:apache {$TARGET}

# パーミッションを変更する
sudo chmod 2775 {$TARGET}
find {$TARGET} -type d -exec sudo chmod 2775 {} \;
find {$TARGET} -type f -exec sudo chmod 0664 {} \;
```

以上

## 参考サイト
- [今さら聞きづらい「ファイルパーミッション」について](https://blog.fenrir-inc.com/jp/2012/02/file_permission.html)
- [特定ディレクトリを複数ユーザで作業できるようにする](http://www.84kure.com/blog/2015/12/08/unix-%E7%89%B9%E5%AE%9A%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E8%A4%87%E6%95%B0%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%A7%E4%BD%9C%E6%A5%AD%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88/)
- [GithubGist - lostandfound/ec2_www.sh](https://gist.github.com/lostandfound/4bee82837886902e1b14bbf548fe5d1e)
Linuxで4chのサウンドカードを2chにダウンミックスする

※2022-07-24追記 pactlの場合の記述を追加

## 環境

- elementary OS 0.4.1 Loki (Ubuntu 16.04.3 LTS)

## 困ったこと

LinuxでUSB接続で[Roland Quad Capture](https://www.roland.com/jp/products/QUAD-CAPTURE)から音声を出力する際、デフォルトだと4チャンネルの出力かつリア（後ろ）２つのスピーカーから出力するサラウンド設定になっており、またフロントのスピーカーからは出力されない設定になっている。
この時Linux版Steamの一部ゲーム (Steam Playで開始したゲーム) で音声を出力しようとするとフロント側2チャンネルから音声を出力しようとするため音声が出力されない場合があった。（ゲームによってリア側スピーカーでも出力する場合もあった）

## やったこと

サウンドカードの出力を4チャンネル→2チャンネルにダウンミックスしたらSteamからno soundな状態を解決出来るんじゃないかと推測し設定を変更したところ正常に音声が出力されるようになった。

## 設定方法

### PulseAudioの設定を変更

出力用のオーディオデバイスを確認する　

```bash
$ pacmd list-sinks | grep name:

    name: <alsa_output.pci-0000_09_00.1.hdmi-stereo-extra2>
	name: <alsa_output.usb-Roland_QUAD-CAPTURE_00009AA969A6A699620D9B2B2B8A81D8-00.analog-surround-40>
	name: <alsa_output.pci-0000_0b_00.3.analog-stereo>
```

※ pacmdが見つからない場合はpactlを使う

```bash
$ pactl list sinks | grep name:
```

上記で出力されたものの中からミックスダウンしたいデバイスの`name`をコピーしておく

`master`で先程取得した`name`を指定しremapする (指定されたオーディオデバイスを元に新しい設定でコピーするイメージ)

```bash
# channels=2でチャンネルの数を2チャンネルに変更した別のoutputデバイスを作成
$ pacmd load-module module-remap-sink sink_name=quad-capture-stereo master=alsa_output.usb-Roland_QUAD-CAPTURE_00009AA969A6A699620D9B2B2B8A81D8-00.analog-surround-40 channels=2 channel_map=front-left,front-right

# Windowsで言うデフォルトのサウンドデバイスとして先程 sink_name で指定した出力先を指定
$ pacmd set-default-sink quad-capture-stereo
```

※pactlの場合

```
$ pactl load-module module-remap-sink sink_name=quad-capture-stereo2 master=alsa_output.usb-Roland_QUAD-CAPTURE_00009AA969A6A699620D9B2B2B8A81D8-00.analog-surround-40 channels=2 channel_map=front-left,front-right master_channel_map=rear-left,rear-right

$ pactl set-default-sink quad-capture-stereo
```

※mappingがうまくいかない場合 `master_channel_map` でマッピング元のchannelを明示的に指定するとうまくいく場合がある

```
$ pactl load-module module-remap-sink sink_name=quad-capture-stereo2 master=alsa_output.usb-Roland_QUAD-CAPTURE_00009AA969A6A699620D9B2B2B8A81D8-00.analog-surround-40 channels=2 channel_map=front-left,front-right master_channel_map=rear-left,rear-right
```

pacmdはランタイムの一時的な設定の変更をするだけなので再起動したら元に戻る。
永続化するには `/etc/pulse/default.pa` に先程の `load-module` や `set-default-sink` コマンドを書き込む

```bash
$ sudo vim /etc/pulse/default.pa
〜中略〜
load-module module-remap-sink sink_name=quad-capture-stereo master=alsa_output.usb-Roland_QUAD-CAPTURE_00009AA969A6A699620D9B2B2B8A81D8-00.analog-surround-40 channels=2 channel_map=front-left,front-right
set-default-sink quad-capture-stereo
```