OmniAICreator/Qiita-1.07M huggingface dataset:
【Atom】git diffで判明した不可視文字（タブ・スペース）の対処方法

# Atomとは
有名なテキストエディタです。宇宙服のOctocatかわいい。
> [Atom公式サイト](https://atom.io)

# 記事を書いたきっかけ
``git diff``で差分をチェックしたら、コードを全く変更していないはずの箇所が表示されたから。こんな感じ。
![qiita01.png](https://qiita-image-store.s3.amazonaws.com/0/201515/39306d67-57b7-8b8e-cca2-e8d4a13c4c6b.png)

その後、今回紹介するのAtomの機能を使い、不可視文字（タブ・スペース）が原因と判明。さらに、勝手に不可視文字が除去されていたことが分かった。

スマートに解決できたわけではありませんが、忘れないうちに書き記しておこうと思った次第です。

# 不可視文字は、目には見えない

初期設定のままだと不可視文字が表示されません。それを変更します。

## タブと半角スペースの表示
メインメニューから``Preferences``を選択
![qiita02.png](https://qiita-image-store.s3.amazonaws.com/0/201515/a8e3ec1d-07b0-e634-15eb-4e3d78867051.png)

``Settings``が開くので``Editorタブ``を選択し、``Show Invisibles``をチェックする。
![qiita03.png](https://qiita-image-store.s3.amazonaws.com/0/201515/2cd6317e-c61b-9f3d-795c-06f9cdb37b13.png)

これで``タブと半角スペース``が視覚的に表示されます。

## タブと半角スペースの区別

初期設定のままでは、タブと半角スペースの表示が同じになってしまいました。

しかし、これについては決定的な解決策が見つかりませんでした。本来は以下のように区別して表示されるはずなんですが・・・
![qiita04.png](https://qiita-image-store.s3.amazonaws.com/0/201515/30de1650-7d9e-b876-b35f-c9012395d978.png)

ここでちょっと気になる機能があったので、ご紹介します。

``shift+command+P(Mac)``または``Shift+Ctrl+P(Windows)``で``コマンドパレット``を開き、``convert``と入力します。

``Whitespace:Convert Spaces To Tabs``を選択し、``Enter``で確定します。これ以降、タブと半角スペースの表示が区別されます。
![qiita05.png](https://qiita-image-store.s3.amazonaws.com/0/201515/0c8981a6-a3ae-2457-752a-1e394c31fa92.png)

しかし、この方法ではAtomを再起動した時に設定が元に戻ってしまいます。しかもファイルごとに実行する必要があります。

さらにメニュー自体が``スペースをタブに一括して変更する機能``なので、スペースのままにしておきたい部分もタブに変更されてしまいます。

あくまで参考に・・・

## 全角スペースの表示
全角スペースは上記の方法では表示できません。そのため``show-ideographic-space``
というパッケージをインストールして表示させます。

``Settings``の``Installタブ``から検索し、インストールします。
![qiita06.png](https://qiita-image-store.s3.amazonaws.com/0/201515/3b4f1ea4-a30d-ec7c-c1e1-aebaea65727b.png)

これで作業完了です。全角スペースが``□``で表示されるようになります。

## 注意点
phpファイルではタブと半角スペースの表示が区別されましたが、htmlファイルでは区別がされませんでした。

自分が見落としている機能もあると思いますが、無ければ別の方法を考えた方が良いかもしれませんね・・・。

個人的には``EditorConfig``を試したい。以下、参考記事です。
> [ATOM Editor をそろそろ始めようか](https://qiita.com/spiegel-im-spiegel/items/3d41d98dacc107d73431)

# 不可視文字は、残したい
不可視文字の箇所は分かりました。しかし``git diff``でまだ表示されてしまう。

これはAtomの不可視文字除去機能（？）が原因でした。ちなみに除去される瞬間は、保存のタイミングで一瞬確認できます。

以下の記事を参考にしました。
> [Atomで保存時の処理の設定を変更する](http://takezoe.hatenablog.com/entry/2015/06/21/021254)

この機能が必要な場合もあるかもしれませんが、今回の作業は既存のコードの修正だったので、機能そのものを停止しました。

``Settings``の``Packages``を選択し、``whitespace``と入力。``Settings``をクリックする。
![qiita07.png](https://qiita-image-store.s3.amazonaws.com/0/201515/aeb33ce1-2ce2-14ea-6176-b54f65c447ea.png)

``Remove Trailing Whitespace``のチェックを外す。
![qiita08.png](https://qiita-image-store.s3.amazonaws.com/0/201515/d9b02f6f-cd17-2e4e-086f-201fe4040de1.png)

これで不可視文字はそのまま残ります。

# タブVSスペース

どちらを使用するか、あらかじめ職場内・プロジェクト内で確認しておいた方が良いです。ちなみに自分の周辺はスペース派多し。

仮にタブ・スペースが入り混じったファイルがあったとしても、修正すれば``git diff``で全て表示されてしまいます。ファイルをそのままにしておくか、もし修正するならそのタイミングはどうするか、これも要相談だと思います。

# ちょっとした疑問

タブ、スペースは正確には何と言うのでしょうか？（今回は不可視文字で統一しましたが。）

不可視文字？制御文字？空白？whitespace？

# まとめ

今回の件は、自分一人の作業であればさほど気にする必要はないかもしれません。しかし、コードレビューなど他人に見られる状況であれば、無視できないことだと思います。加えて、不可視文字が予期しない動作を引き起こす可能性もあります。

防げるものは防ぎ、円滑な作業を目指しましょう〜（＾ω＾）
[素因数分解] Trial Division / 試し割り法

こんちくわ。試し割り法は素因数分解の一番愚直なアルゴリズムです。

この解説をします。



## Method

ある合成数$N$の素因数$p$を求めたい時に、このアルゴリズムは小さい数から割り切れるかどうかを調べていきます。[^1]

小さい数から調べるので、この方法で見つかるであろう$p$は$N$の素因数の中でも最小のものであるはずですよね。$p$が$N$の最小の素因数なら、

$2 \le p \le \lfloor \sqrt{N} \rfloor $

であるので[^2]、この範囲を調べて見つからなければその数は素数ということになります[^3]。



## Implementation in C++

```c++
vector<ll> trial_division(const ll& n) {
    ll result = n;
    for (ll i = 2, m = (ll)sqrt(n); i <= m; ++i)
    {
        if (n % i == 0) {
            result = i;
            break;
        }
    }

    if (result == n) {
        return { n };
    } else {
        vector<ll> v1 = { result };
        vector<ll> v2 = trial_division(n / result);
        v1.insert(v1.end(), v2.begin(), v2.end());
        return v1;
    }
}
```

## Implementation in Rust

```rust
fn trivial_division(n: u64) -> Vec<u64> {
    let mut result = n;
    for i in 2..((n as f64).sqrt() as u64)+1 {
        if n % i == 0 {
            result = i;
            break;
        }
    }

    if result == n {
        return vec![n];
    } else {
        let mut v1 = vec![result];
        let mut v2 = trivial_division(n / result);

        v1.append(&mut v2);

        return v1;
    }
}

fn main() {
    println!("{:?}", trivial_division(238528));
}
```



[^1]: 素因数が2である確率は3である確率より大きいですよね？ 範囲aからb（$a, b \in \mathbb{Z}$）の中に、素因数が$x$の数は大体$(b-a)/x$くらいあるので、一般的に$x < y$なら素因数が$x$である確率は$y$である確率より大きいのです。なので、小さい方から探したほうが効率が良いのです。
[^2]: $N$の素因数は$\sqrt{N}$を超えることもありますが、**最小の**素因数は$\sqrt{N}$以下です。なぜなら、$\sqrt{N}$より大きい素因数$p$が存在すれば$N$が合成数であることから他の因数$\mathrm{f} = N / p$が存在するはずで、これは$\sqrt{N}$以下であるからです。
[^3]: $N$は合成数って言って話進めてますので、は$2 \le p \le \lfloor \sqrt{N} \rfloor $で割り切れない場合は上の話では存在しません。（だから、ん？？？ってなった人に向けてこの注釈を書いてます）実際のアルゴリズムでは$N$は自然数なので、その範囲になかった場合は素数だということです。なんかうまい書き方が見つからなかったorz
laravelの開発環境をhomesteadで構築する

#homesteadを使う意味
homesteadはlaravelの開発環境を構築するためのツールです。お使いのmacやwindowsに
`Git、PHP 7.2、PHP 7.1、PHP 7.0、PHP 5.6、Nginx、Apache (オプション)、MySQL、MariaDB (オプション)、Sqlite3、PostgreSQL、Composer、Node (Yarn、Bower、Bower、Grunt、Gulpを含む)、Redis、Memcached、Beanstalkd、Mailhog、Neo4j (Optional)、MongoDB (Optional)、Elasticsearch (オプション)、ngrok、wp-cli、Zend Z-Ray、Go、Minio`
などを何か機能を追加したいと思うたびにインストールするのはまじでめんどい
ので一括でインストールできたら**楽!**

#環境
mac os 10.13.6
Vagrant 2.1.1
virtualBox 5.2.16
##virtualBoxとvagrnatを入れてない人
virtualBoxとvagrantはインストールしましょう
virtualBoxは[こちら](https://www.virtualbox.org/)
virtualBoxは[こちら](https://www.vagrantup.com/)
からインストールしておいてください
##vagrant boxにHomesteadを追加しよう
vagrantはboxというosを入れることができるようになっています。
macでターミナルを開いてコマンドを入力してください

```
vagrant box add laravel/homestead
```

boxをインストールするのに少し時間がかかるので待ちましょう。
##homesteadをインストール
gitでhomesteadをクローンします。自分がわかりやすい位置にディレクトリを移動してcloneしましょう。今回は~/にしておきます。

```
cd ~/
git clone https://github.com/laravel/homestead.git ~/Homestead
```

クローンが完了したら、homesteadに移動します。

```
cd ~/Homestead
```
homestead.yamlを作成します。
macとlinuxの方は
``` bash init.sh ```
windowsの方は
``` init.bat　```
##Hometead.yamlの編集
lsコマンドでHometeadを確認してみるとHometead.yamlが入っていると思います。こちらを編集して行きましょう。テキストエディタでもvimでもいいので開いてみると何やらたくさん英語が並んでいますが!
、今は全てを理解しなくても大丈夫です。
sitesだけを編集して行きます。

```
sites:
  #一つ目のプロジェクト
    - map: homestead.test
      to: /home/vagrant/code/project1/public
```
今回はこのようにしておいてください
mapの部分をhostsファイルに記述することでmacのブラウザからアクセスすることができます。
ドメインは変更できますが**.test**にしておくのがおすすめです。chromeからアクセスするときにssl証明書がないとプライバシーエラーになりアクセスできません。
##hostsファイルの編集
hostsファイルはmacまたはlinuxの場合**/etc/hosts**にあります。windowsの方は**C:\Windows\System32\drivers\etc\hosts**にありますので編集して行きます。
僕はmacなので```vim /etc/hosts```をコマンドに入力して
```192.168.10.10  homestead.test```
を追加しました。
##さあ起動しよう
Hometeadのディレクトリに移動して、```vagrant up```をして起動したら```vagrant ssh```をします。接続したら、```/codeに移動して```、```composer create-project --prefer-dist laravel/laravel project1```をコマンドに打ち込む。
時間がかかって```project1```が入っていると思います。
##ブラウザで確認してみよう
お使いのブラウザで```http://homestead.test```にアクセスしてみよう
![FireShot Capture 12 - Laravel - http___homestead.test_.png](https://qiita-image-store.s3.amazonaws.com/0/264684/593402d9-c97d-d327-ab66-8bf2d84e941e.png)

できた！最後説明がだるくなって適当になりました笑
公式でチェックもしてみてください
[Homestead](https://readouble.com/laravel/5.6/ja/homestead.html)
VR調べ物（3Dファイルの取扱と、VRデバイス）

#Blender講座
https://www.youtube.com/watch?v=7oNfgOOcKm8

#3Dモデルの取扱
3D制作ソフト（前記事であげたもの）に加えて、
Unityの基本操作を知ることでVRCや生放送に使えるようになるようです。
ただトラックして動かして動画作るだけならいらないかもしれないのかな？
何にせよ覚えたほうが得なのは間違いないでしょう。プログラミングでいう統合環境みたいなものだろうか。
・Unityの基本操作
http://vrchatjp.playing.wiki/d/Unity%a4%ce%b4%f0%cb%dc%a4%f2%b3%d8%bd%ac%a4%b9%a4%eb
・Vroidで作ったモデルをUnityに取り込む
http://fantom1x.blog130.fc2.com/blog-entry-308.html
・Vroid→Unity→VRC
http://mayorum.hatenablog.com/entry/2018/08/05/155839
・Blenderで作ったモデルをUnityに取り込む
http://mayorum.hatenablog.com/entry/2018/01/07/161755
・VRMファイルをBlenderに取り込む
http://netziten.net/archives/25340914.html
・MMDファイルをBlenderに取り込む
http://korechi.hatenablog.com/entry/2017/03/08/211821

#3Dモデルを動かすやつ
・Wakaruの使い方（台湾発？のフリーウェア）
http://www.nicovideo.jp/watch/sm33325797
・3teneの使い方（Pro登場予定）
https://vrmizunana.hatenablog.com/entry/2018/06/26/215954
・Hitogataの使い方
https://sites.google.com/site/vhitogata/manual

#VRChatガイド
http://vrchatjp.playing.wiki/d/%bd%e9%bf%b4%bc%d4%a5%ac%a5%a4%a5%c9%20%28%a4%e4%a4%eb%bb%f6%a4%de%a4%c8%a4%e1%29
##VRCアバター制作指南（3Dモデリング知らない人向け）
https://scrapbox.io/motoso/VRChat%E3%81%AE%E3%82%A2%E3%83%90%E3%82%BF%E3%83%BC%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B
http://kumanoya.blogspot.com/2017/12/3dcgvrchat.html?spref=tw

#VRデバイスいろいろ
##総論
・総合指南（VRC初心者ユーザー向け、PCスペックからHMDまで。これが一番わかりやすかった）
https://spec-diy.blogspot.com/2018/02/20182-vrchat.html
・ハイエンドHMD比較、ハイエンドHMDとスマホVRの違い（総論的でわかりやすい）
https://www.moguravr.com/high-end-vr-headset-matome-2018-2/
##各論
・Oculus Rift＋Kinectで全身トラッキング
https://vrinside.jp/news/kinect-let-oculus-rift-users-track-full-body/
・Kinectの使用法
https://vrcworld.wiki.fc2.com/wiki/Kinect
##番外
・番外：スマホVRなどのスタンドアロン系VRデバイス
https://kazunoko.xyz/hqing-vr-glass/
https://www.amazon.co.jp/dp/B07CZ77C7K/ref=sspa_dk_detail_2?psc=1&pd_rd_i=B07CZ77C7K&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=4227b51a-caef-4371-98ae-1a3e0fefe4f2&pf_rd_r=9V82RXSF012EJ7XK5395&pd_rd_wg=0SkdU&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&pd_rd_w=cBIqc&pf_rd_i=desktop-dp-sims&pd_rd_r=dd99939c-9d1a-11e8-91ab-01b83c9151cd
安い。今は動画とソシャゲくらいしかコンテンツがないけど、万一、VRCがこれからスマホ対応したら参加層はだいぶ変わるだろうな・・・・・・
・番外２：いらすとや、VRの「3DoF」「6DoF」に関するイラストを公開
https://www.moguravr.com/irasutoya-vr/
わかりやすすぎて吹いた
CUDA v8.0をMacOSX High Sierraから削除する

NVIDIAのGPUが搭載されていたMacから新しいMacに移行したのですが、CUDAが使えなくなったため以前使っていたCUDAのアンインストールをしました。

## 1.uninstall用のscriptを走らせる & ディレクトリの削除

```zsh
% sudo /usr/local/cuda/uninstall_cuda_8.0.pl 
% sudo rm -rf /usr/local/cuda
% sudo rm -rf /Library/Frameworks/CUDA.framework/
```

## 2. System PreferenceからCUDAを削除
![image.png](https://qiita-image-store.s3.amazonaws.com/0/4644/b8deb214-de1e-870b-3471-e6b17a53cce6.png)
elasticsearch + Kibana BulkAPIを使ってみる



簡単です。

##Index
※2018/8/11追記
同一_idのドキュメント有無によって、Insert or updateになりますのでご注意を。

###kibana
POST /product/default/_bulk
{ "index":{ "_id" : "100" } }
{ "price": 100}
{ "index":{ "_id" : "101" } }
{ "price": 101}

###Curl
curl -XPOST "http://localhost:9200/product/default/_bulk" -H 'Content-Type: application/json' -d'
{ "index":{ "_id" : "100" } }
{ "price": 100}
{ "index":{ "_id" : "101" } }
{ "price": 101}
'


##Update&Delete

###kibana
POST /product/default/_bulk
{"update":{"_id": "100"}}
{"doc":{"price": "1000"}}
{"delete":{"_id": "101"}}

###Curl
curl -XPOST "http://localhost:9200/product/default/_bulk" -H 'Content-Type: application/json' -d'
{"update":{"_id": "100"}}
{"doc":{"price": "1000"}}
{"delete":{"_id": "101"}}
'



##JSONデータをCurlで登録

事前にjson形式のファイルを、curl実行するディレクトリに置く
<img width="662" alt="スクリーンショット 2018-08-11 12.55.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/210201/e2854226-d498-e2ac-18f6-81991fbfa2db.png">

実行

```
$ curl -H "Content-Type: application/json" -XPOST "http://localhost:9200/product/default/_bulk?pretty" --data-binary "@products-bulk.json"

```
周辺機器不要でラズパイ のセットアップ

##作業環境
PC: macOS 10.13.4
ラズパイ本体: Raspberry Pi 3 Model B

あと必要なものはmicro USBケーブル（ラズパイの電源供給）くらいです。
モニタ、マウス、キーボード、LANケーブルなど不要のセットアップしていきます。

##PCでのセットアップ
FAT32でフォーマットされたmicroSDにラズパイをインストールします。
ラズパイのOSはここからダウンロードして、どこかに解凍してください。
https://www.raspberrypi.org/downloads/raspbian/
（LITEだとデスクトップ環境を別途インストール必要です。）

まずはmicroSDの名前を調べます。

```
$diskutil list
(一部略)
/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *31.4 GB    disk2
   1:             Windows_FAT_32                         31.4 GB    disk2s1
```

アンマウントします。

```
$sudo diskutil umount /dev/disk2s1
$sudo dd bs=1m if=/解凍した場所/imgファイル名.img of=/dev/disk2
```
`of=/dev/disk2` のdisk2は、先ほどdiskutilコマンドで調べたものになります。
ここ間違えると大変ぽいので気をつけてください。

ctr+Tで進行具合の確認できます。

```
load: 2.53  cmd: dd 10026 uninterruptible 0.01u 33.66s
2134+0 records in
2133+0 records out
2236612608 bytes transferred in 2427.882855 secs (921219 bytes/sec)
```

microSDにOSが入ったので、ラズパイ本体に入れて電源を入れてください。


##ネットワーク接続
ここをPC側でやればssh接続できるので、周辺機器が不要です。
ここら辺を参考にしました。
https://qiita.com/mascii/items/0d1a280ac58ed8f6f999

###平文のWPAパスフレーズの場合
root（Macから見ると`/Volumes/boot`）に`wpa_supplicant.conf`ファイルを作ります。

```wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="ネットワーク名"
    psk="パスワード"
}
```
このファイルをrootに置くことで、起動時に`/etc/wpa_supplicant/wpa_supplicant.conf`を上書きするようです。



##SSH接続
ssh接続可能にするために、rootにsshファイルを作成します。

```
$touch /Volumes/boot/ssh
```
次にラズパイ本体にmicroSD突っ込んで起動させます。

しばらくしたら勝手にネットワークに繋がってると思います。
PCからssh接続を試しましょう。詳しい条件はわからないですが、IPでなくても`raspberrypi.local`で繋がるようです。
デフォルトのパスワードは`raspberry`です。
```$ssh pi@raspberrypi.local
```

##デスクトップ共有（VNC接続）
ssh接続までで十分使えるかと思いますが、GUIの環境欲しかったので、PCにラズパイの画面を持ってきます。sshで接続状態で以下を実行します。
```pi@raspberrypi ~ $sudo apt-get install tightvncserver
```

起動しないと使えません。
```pi@raspberrypi ~ $tightvncserver 
```
Macの場合Finderで`cmd+K`を押し、sever addressに`vnc://raspberrypi.local:5901 `と入力します。
`PWD: raspberry`で画面が共有されるはずです。
<img width="598" alt="Screen Shot 2018-08-10 at 17.51.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/212730/adaa3517-16d5-977a-231b-dae7d2c1b75a.png">

![Screen Shot 2018-08-11 at 12.31.46.png](https://qiita-image-store.s3.amazonaws.com/0/212730/3cfdb5ed-7f05-985c-4350-fbab2b43d7be.png)







<br><br>


あとは各自好きなように設定してラズパイライフを！


参考
https://qiita.com/ttyokoyama/items/7afe6404fd8d3e910d09
https://qiita.com/mascii/items/0d1a280ac58ed8f6f999
PHPのZipArchiveで空のzipファイルを作成する

# はじめに

中身が入っていないzipファイルが必要になった時にちょっと戸惑った。

## 方法

add〜を呼び出さずにopen/closeするだけだとzipファイルは生成されません。
そこで、下記のように`addEmptyDir()` で相対パスでカレントディレクトリを指定します。

```php
$zip = new \ZipArchive();
$zip->open('/foo/bar.zip', \ZipArchive::CREATE);
$zip->addEmptyDir('.');
$zip->close()
```
UPIC調べ中

UPIC調べはじめた。

UPICのwiki
https://ja.wikipedia.org/wiki/UPIC
はほとんど参照がない。

ヤニス・クセナキス
https://ja.wikipedia.org/wiki/ヤニス・クセナキス
は参照が多い。

IanniX
https://www.iannix.org/en/

CCMIX
http://ccmixter.org/files/airtone/47623

MetaSynth
http://www.uisoftware.com/MetaSynth/
ファイル末尾の改行有無を判定するには

# 結論

```
test -z "$(tail -c 1 ${file})"
```

が成功(EXIT STATUS 0)なら改行有り、失敗なら改行無しと判定できる

参考: https://stackoverflow.com/questions/38746/how-to-detect-file-ends-in-newline

# 疑問

`tail -c 1` で末尾1バイトを切り出し、空文字列かの判定をしている

```
$ test -z "$(echo bar | tail -c 1)"
$ echo $?
0
$ test -z "$(echo -n bar | tail -c 1)"
$ echo $?
1
```

現象論的にはうまく判定できてることはわかるけど、改行文字の場合に空文字列になるのはちゃんと理解できていない

```
$ X="$(echo bar)"
$ echo $X
bar
$ X="$(echo -n bar)"
$ echo $X
bar
```

が同じになるので、末尾の改行をシェルが捨てている？

# 動機

crontabの内容をSCMで管理して自動で適用するということを考えたときに、Ubuntu環境のcrontab(1)に末尾に改行のないファイルを食わせるとエラーになることがわかったので、commit hookやCIで事前に検証しておく方法を知りたかった。

```
$ crontab crontab.txt
new crontab file is missing newline before EOF, can't install.
```
Android Studio Shortcut Keys (Mac  OS X 10.5+)

## 修飾キー

Command : ⌘  Option : ⌥  Control : ⌃  Shift : ⇧  Capslock : ⇪  Tab : ⇥  Esc : ⎋  Return : ⏎  Delete : ⌫  Backspace : ⌦ (fn ⌫)
## 全般

| Command | Name |
|:-----------:|:------------:|
|⌘ S| すべて保存 |
|⌘ ⌥ Y| 同期 |
|⌃ ⌘ F12| エディタの最大化/最小化 |
|⌥ ⇧ F| お気に入りに追加 |
|⌥ ⇧ I| 現在のプロファイルを使用して現在のファイルのインスペクションを実施 |
|^ `| クイックスイッチ |
|⌘ ,| 設定ダイアログを開く |
|⌘ ;| プロジェクト構造のダイアログを開く |
|⌃ ⇥| タブとツール ウィンドウの切り替え |

## Studio 内の移動と検索

| Command | Name |
|:-----------:|:------------:|
|⇧ ⇧| すべてを検索 （コードとメニューを含む） |
|⌘ F| 検索 |
|⌘ G| 次を検索 |
|⌘ ⇧ G|	前を検索 |
|⌘ R| 置換 |
|⌘ ⇧ A|	操作を検索 |
|⌘ ⌥ O|	シンボル名で検索 |
|⌘ O| クラスを検索 |
|⌘ ⇧ O|	（クラスではなく）ファイルを検索 |
|⌘ ⇧ F|	パス内を検索 |
|⌘ F12|	ファイル構造のポップアップを開く |
|⌃ →/←|	開いているエディタタブの切り替え |
|F4 / ⌘ ↓| ソースにジャンプ |
|⇧ F4| 現在のエディタタブを新しいウィンドウで開く |
|⌘ E| 最近開いたファイルのポップアップを表示 |
|⌘ ⇧ E|	最近編集したファイルのポップアップを表示 |
|⌘ ⇧ ⌦|	最後に編集した場所に移動 |
|⌘ W| アクティブなエディタタブを閉じる |
|⎋| ツール ウィンドウからエディタ ウィンドウに戻る |
|⇧ ⎋| アクティブなツール ウィンドウまたは最後のアクティブなツール ウィンドウを非表示にする |
|⌘ L| 行に移動 |
|⌃ H| 型階層を開く |
|⌘ ⇧ H|	メソッド階層を開く |
|⌃ ⌥ H|	呼び出し階層を開く |

## コードの記述

| Command | Name |
|:-----------:|:------------:|
|⌃ ⇧ T | 新しいターミナルのインスタンスを作成 |
|⌘ N | コード（getters、setters、constructors、hashCode/equals、toString、new file、new class）を生成 |
|⌃ O| メソッドをオーバーライド |
|⌃ I| メソッドを実装 |
|⌘ ⌥ T|	（if...else / try...catch / など）で囲む |
|⌘ ⌦| キャレットで示す行を削除 |
|⌘ -/+|	現在のコードブロックを折りたたむ/展開する |
|⌘ ⇧ -/+| すべてのコードブロックを折りたたむ/展開する |
|⌘ D| 現在の行または選択範囲を複製 |
|⌃ Space| 基本コード補完 |
|⌃ ⇧ Space| スマートコード補完（型予測によりメソッドと変数のリストをフィルタにかける） |
|⌘ ⇧ ⏎|	ステートメントを補完 |
|⌘ ⇧ U|	（アルファベットの）大文字小文字切り替え |
|⌃ J| ドキュメントのクイック検索 |
|⌘ P| 選択したメソッドのパラメータを表示 |
|⌘ J| ライブテンプレートを挿入 |
|⌘ B / ⌘ Click|	宣言に（直接）移動 |
|⌘ ⌥ B|	実装に移動 |
|⌘ U| super メソッド/super クラスに移動 |
|⌘ Y| 定義のクイック検索を開く |
|⌘ 1| プロジェクトのツール ウィンドウの表示/非表示の切り替え |
|F3| ブックマークの切り替え |
|⌥ F3| ニーモニックでブックマークの切り替え |
|⌘ /| 行コメントでコメント/コメント解除 |
|⌘ ⌥ /| ブロック コメントでコメント/コメント解除 |
|⌥ ↑| コードブロックの選択範囲を広げる |
|⌥ ↓| 現在の選択範囲を前の状態まで縮小する |
|⌥ ⌘ [| コードブロックの起点に移動 |
|⌥ ⌘ ]| コードブロックの終端に移動 |
|⌥ ⌘ ⇧ [| コードブロックの起点まで選択 |
|⌥ ⌘ ⇧ ]| コードブロックの終端まで選択 |
|⌥ ⌫| 語尾まで削除 |
|⌥ ⌦| 語頭まで削除 |
|⌃ ⌥ O| インポートを最適化 |
|⌥ ⏎| プロジェクトのクイック修正（目的のアクションとクイック修正案の表示） |
|⌘ ⌥ L| コードの再フォーマット |
|⌃ ⌥ I| 行のオートインデント |
|⇥/⇧ ⇥| 行のインデント/インデント解除 |
|⌃ ⇧ J| スマート行結合 |
|⌘ ⏎| スマート行分割 |
|⇧ ⏎| 新しい行を開始 |
|F2 / ⇧ F2| 次の/前のハイライト表示されたエラーに移動 |
|⌥ ⇧ ↑↓|  選択行を上下に移動 |
|⌘ ⌥ ⇧ ↑↓|  選択行を他の行と入れ替える |
|⌥ ⇧ mouse click| マルチカーソル |

## ビルドと実行

| Command | Name |
|:-----------:|:------------:|
|⌘ F9| ビルド |
|⌃ R| ビルドして実行 |

## デバッグ

| Command | Name |
|:-----------:|:------------:|
|⌃ D| デバッグ |
|F8| ステップ オーバー |
|F7| ステップイン |
|⇧ F7| スマート ステップイン |
|⇧ F8| ステップアウト |
|⌥ F9| カーソル位置まで実行 |
|⌥ F8| 式を評価 |
|⌘ ⌥ R| プログラムを再開 |
|⌘ F8| ブレークポイントの切り替え |
|⌘ ⇧ F8| ブレークポイントを表示 |

## リファクタリング

| Command | Name |
|:-----------|:------------:|
|⌃ T| リファクタリングメニュー表示 |
|F5| コピー |
|F6| 移動 |
|⌘ ⌫| 安全な削除 |
|⇧ F6| 名前の変更 |
|⌘ F6| 署名の変更 |
|⌘ ⌥ N|	インライン |
|⌘ ⌥ M|	メソッドの抽出 |
|⌘ ⌥ V|	変数の抽出 |
|⌘ ⌥ F|	フィールドの抽出 |
|⌘ ⌥ C|	定数の抽出 |
|⌘ ⌥ P|	パラメータの抽出 |

## バージョン管理/ローカル履歴

| Command | Name |
|:-----------|:------------:|
|⌘ K| VCS にプロジェクトをコミット |
|⌘ T| VCS からプロジェクトを更新 |
|⌥ ⇧ C|	最近の変更を表示 |
|⌃ V| VCS ポップアップを開く |
Androidのエミュレータでネットワークにつながらない場合の対処法

エミュレータでネットワークにつながらない場合の対処法。
マシンのDNSが参照できない事が原因らしい。

## 環境
MacOS High Sierra 10.13.6
Android SDK emulator 27.3.9

## 解決策

```bash
# 仮想デバイスを一覧する
cd (SDKの場所)/sdk/emulator
./emulator -list-avds

# 仮想デバイスのDNSを設定する
# この場合は Nexus_5X_API_25 の仮想デバイスでDNSサーバー 8.8.8.8 を利用する
./emulator -avd Nexus_5X_API_25 -dns-server 8.8.8.8
# エミュレータが起動中はこのコマンドは戻って来ないので、無応答っぽく見えても問題は無い
```


## 参考
- [emulation - Android emulator not able to access the internet - Stack Overflow](https://stackoverflow.com/questions/42736038/android-emulator-not-able-to-access-the-internet)
valet install で 「Unable to determine linked PHP.」と言われたら

# 環境
- Mac OS
- Laravel Valet 2.0.12

# 遭遇したエラー
`$ valet install`時に下記のエラーが発生

```
$ valet install
Stopping nginx...
Installing nginx configuration...
Installing nginx directory...
Updating PHP configuration...

In Brew.php line 182:

  Unable to determine linked PHP.


install
```

つまり、`Unable to determine linked PHP.`と言われている。

# 解決法
homebrewでPHPへのリンクをきちんと貼る。

僕の場合、
`$ brew install php71`で7系をインストールしていたので、
`$ brew link php71 --force`によって、PHPへのリンクを貼りました。

すると…

```
$ valet install
Stopping nginx...
Installing nginx configuration...
Installing nginx directory...
Updating PHP configuration...
Restarting php@7.1...
Installing dnsmasq...
[dnsmasq] is not installed, installing it now via Brew... 🍻
Restarting dnsmasq...
Restarting nginx...

Valet installed successfully!
```

インストール完了しました！
[Alexa] ask-sdk v2でのプログレッシブ応答の実装 

建前
つまずいてしまったことがあったので同じことで悩んでる人のために紹介しよう！

本音
Qiitaに投稿してみたかった
##ことのあらまし
Amazon Echo Spot購入をきっかけにAlexaスキルを作り始めました。
最初はスキル開発トレーニングを参考にコツコツと作っていたのですが、ask-sdk v2なるものがあることを知りまして。
(追記：スキル開発トレーニングが2018/10/16にv2に対応したようです。）
公式も「今後はv2を使え！」とアナウンスしてるので~~渋々と~~v1のコードをv2に書き直していました。

##ところがどっこい
v1ではプログレッシブ応答があるのに、[v2のドキュメント](https://ask-sdk-for-nodejs.readthedocs.io/ja/latest/index.html)を見ても見当たらない。どういうことなの。。。
[ASK関連ドキュメント](https://developer.amazon.com/ja/docs/custom-skills/send-the-user-a-progressive-response.html#send-directive)を見ながら仕方なく自前で作るしかないかなーと思っていたところ、

##友よ、ありがとう
世界には同じことで困っている方がいるらしく、[Amazonのフォーラム](https://forums.developer.amazon.com/questions/170300/progressive-response-in-nodejs-sdk-v2.html)にv2版プログレッシブ応答のコードを見つけました。
###[フォーラム](https://forums.developer.amazon.com/questions/170300/progressive-response-in-nodejs-sdk-v2.html)から転載
```javascript:
function callDirectiveService(handlerInput, speech) {
    const { requestEnvelope } = handlerInput;
    const directiveServiceClient = handlerInput.serviceClientFactory.getDirectiveServiceClient();
    
    const directive = {
      header: {
        requestId: requestEnvelope.request.requestId
      },
      directive: {
        type: 'VoicePlayer.Speak',
        speech: speech
      }
    }
    return directiveServiceClient.enqueue(
      directive, 
      requestEnvelope.context.System.apiEndpoint, 
      requestEnvelope.context.System.apiAccessToken
    );
}
```

あらなんと簡単。
もう少しv2関連のドキュメント充実してほしいなと思いつつも、
まぁ、割と最近リリースされたみたいだから仕方無いのか。。。

スキルも公開できるレベルまで一旦作れたので、審査してもらってます。
公開されるのが楽しみ
ndenv環境にグローバルコマンドをインストールしたときの落とし穴

多分、数ヶ月経って忘れた頃に悩むと思うので、メモメモ。

最近、手元のNode.js環境を、nodebrewからndenvに置き換えました。そこで、ちょっとprettierなるものが話題になっているらしいと聞き、試してみようと思いました。

```shell
npm install -g prettier
```
として、

```shell
prettier ./src/index.js
```

あれ？、、、そんなコマンドないって言われる。

```shell
which prettier
```

ってやってみても何も出てこない。試しに別のコマンドのパスを調べてみると

```shell
which gulp
```

ってやると

```shell
{ホームディレクトリ}/.anyenv/envs/ndenv/shims/gulp
```

ちゃんとある。`gulp`は普通に動く、、、

ところで`.anyenv/envs/ndenv/shims/`って何だ？？？多分、Node.jsのグローバルバージョンを管理してるフォルダっぽいけど、、、

と色々調べてましたが、次のコマンドで解決することがわかりました。

```shell
ndenv rehash
```

これやらないと`.anyenv/envs/ndenv/shims/`にグローバルコマンドが追加されないようです。

めでたし、めでたし。
HDDなどのクローンを同時複数台作成

ハードディスクやsdカードをクローン。

PC とか RaspberryPi の設定を行ったものをまるまるクローンするということはよくあるけれども、時間がかかる。同時に複数台を時間をかけずにできないか？

クローンツールはいろいろあるが、プリミティブな操作が自由にできるものとなるとLinuxベースのddとか、ddrescueとか。

まずは、速度のリミットが高いハードディスクで調査。その後、sdカードなどにも応用予定（記事はまだ）。

# 環境
Fujitsu MX1310 M1
Ubuntu 17.04 インストーラをUSBメモリに入れて起動
HDD TOSHIBA DT01ACA050 
SSD Colorful SL300 160G

# ddrescue で 1台に書き込む

まずは、１台に書き込む場合のテスト。

dd よりも ddrescue が高速だし、表示もいろいろ出る。

コピー元：SSD Colorful SL300 160G
コピー先：HDD TOSHIBA DT01ACA050 （もしかしたらSSDだったかも？）


![Screenshot from 2018-08-08 11-02-00.png](https://qiita-image-store.s3.amazonaws.com/0/139524/c472c629-5005-4444-df3b-382cca4f4927.png)

これで130~140MB/secぐらい。

# ddrescue で複数台に書き込む

同時に4台に書き込んでみる。

![Screenshot from 2018-08-08 11-06-40.png](https://qiita-image-store.s3.amazonaws.com/0/139524/1deacae9-1e8a-a6c6-b44e-f282167e491a.png)

30MBytes/Secぐらいになる。大体1/4ですね。


ちなみに、一番上のaverage rate が 83MBytes/Secになっているのは、最初に一番上のターミナルでコピーを始め、２番目、３番目、４番目のコピーが始まるまでに140MBytes/Secぐらいで先行してコピーをしていたため。

# ddrescue で同期しながら複数台に書き込む

ここで、コピーのタイミングを4台合わせ、同じ箇所をコピーするようにする。そうすればメモリキャッシュに残ったコピー元イメージを有効に活用できる。


![Screenshot from 2018-08-08 11-13-00.png](https://qiita-image-store.s3.amazonaws.com/0/139524/df33f54d-266d-d0a6-79e6-60b74b174f22.png)

かなり向上。130~140MBytes/Secにかなり近い値となる。
純粋に、4倍の効率でクローンを作成できることになる。

このことから、律速段階はCPUや書込バスの飽和などではないことがわかる。適切な書込環境を設定すれば、実質500MBytes/Sec以上で書込ができることになる。

なお、タイミングを合わせるためには、先行しているコピーを　Ctrl+Sでポーズ、Ctrl+Qで再開をして、手動で合わせるようにした。

なお、コピー先のストレージデバイスの種類やロットを合わせると、一旦タイミングを同期させるとそのまま何十分も乱れずにコピーしてくれるが、HDD/SSD混在、また同じ型番のHDD同士でもロットが違うとタイミングがどんどんずれていくので度々タイミングを取り直す必要がある。

# teeを使用して同期書込

元々、ddrescue は 1対1でのコピーツール。複数台同時コピーなどの機能は無いみたい。
複数台同時コピーを自動で行うには？

こういう時には tee を使うことが多い。標準出力を分岐することができるので、dd を使った同時複数台書込などに応用できる。

しかしながら ddrescue は対象がブロックデバイスなので、キャラクタデバイス対象の tee はうまく使えない。

ということで、ddrescue ではなく dd を使って試してみた。

```

dd bs=512 if=$SOURCE | tee /dev/sda /dev/sdb /dev/sdc > /dev/sde
```

($SOURCE は /dev/sdd )


![Screenshot from 2018-08-08 12-36-33.png](https://qiita-image-store.s3.amazonaws.com/0/139524/c472d072-7c03-d867-0dd4-1bc488e7694e.png)


同時にコピーできているが・・・遅い！！ ひと桁遅いとは・・・。


# ddrescue を複数同期して動かす

ddrescue の速度を活かしたやりかたを工夫してみた。

- ddrescue の --size オプションで、1GByteだけコピーする
- 同時に4スレッド ddrescue を動かす
- ddrescue の -i オプションで、コピー開始位置を指定
- コピー開始位置を1GBytesずつインクリメントしながらループ


```

#!/bin/bash
SOURCE=/dev/sde
DIST1=/dev/sdb
DIST2=/dev/sdc
DIST3=/dev/sdd
DIST4=/dev/sda
COPYSIZE=130
SIZEPREFIX=Gi
for ((i=0;i<$COPYSIZE;i++));do
  date
  ddrescue $SOURCE $DIST1 -i $i$SIZEPREFIX --size=1$SIZEPREFIX --force -q &
  ddrescue $SOURCE $DIST2 -i $i$SIZEPREFIX --size=1$SIZEPREFIX --force -q &
  ddrescue $SOURCE $DIST3 -i $i$SIZEPREFIX --size=1$SIZEPREFIX --force -q &
  ddrescue $SOURCE $DIST4 -i $i$SIZEPREFIX --size=1$SIZEPREFIX --force &
  wait
  date
done
sync
sync
sync
```

いろいろハードコーディングなのでキケンなスクリプトですが、あくまでテストということで。

## 動かした結果

ゆらぎがあるけど先程よりは速いです。

![Screenshot from 2018-08-08 13-45-30.png](https://qiita-image-store.s3.amazonaws.com/0/139524/8e10ef22-a7e9-f18e-8be8-a39894841636.png)

130GBytesのコピー４台が、55分程度で終了しました。大体、40GBytes/Sec.

140GBytes には程遠いので、もうちょっと工夫の余地がありますね。
Emacs のカッコの色を抵抗のカラーコードにしてみる

チップ抵抗全盛のこの時代、
カラーコードを覚えててもなかなか使いどころがなくなってきました。

そこで、こんな使い方はいかがでしょうか。

<img width="453" alt="screenshot_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/30474/31218ef6-922f-cde6-6e48-81e08b39a097.png">

# インストール

カッコを色付けする[rainbow-delimiters.el](https://github.com/Fanael/rainbow-delimiters)を入れます。
Emacs24以降なら下記で完了です。

```
M-x package-install rainbow-delimiters
```

# 設定

下記を`init.el`に書きます。

```el
(require 'cl-lib)
(require 'color)

(rainbow-delimiters-mode 1)
(setq rainbow-delimiters-outermost-only-face-count 1)

(set-face-foreground 'rainbow-delimiters-depth-1-face "#9a4040")
(set-face-foreground 'rainbow-delimiters-depth-2-face "#ff5e5e")
(set-face-foreground 'rainbow-delimiters-depth-3-face "#ffaa77")
(set-face-foreground 'rainbow-delimiters-depth-4-face "#dddd77")
(set-face-foreground 'rainbow-delimiters-depth-5-face "#80ee80")
(set-face-foreground 'rainbow-delimiters-depth-6-face "#66bbff")
(set-face-foreground 'rainbow-delimiters-depth-7-face "#da6bda")
(set-face-foreground 'rainbow-delimiters-depth-8-face "#afafaf")
(set-face-foreground 'rainbow-delimiters-depth-9-face "#f0f0f0")

;; 使いたいモードはお好みで
(add-hook 'emacs-lisp-mode-hook 'rainbow-delimiters-mode)
(add-hook 'c-mode-hook 'rainbow-delimiters-mode)
```

# 実用的？

カラーコードに馴染んでいれば、カッコの色で直感的にネストの深さがわかるので実用的に感じました。

ちなみに、上の設定のように `rainbow-delimiters-outermost-only-face-count`を`1`にしておくと、10個目以降のカッコを色づけが茶色を飛ばして 灰 白 赤 橙 黄 …となります。

こうしておくと、ネストの深い関数であっても茶色のカッコは常に関数の先頭/末尾を表すので、長いコードを読むときは便利かもです。

もし、1番の茶色と3番のオレンジが紛らわしい場合は、1番の茶色と9番の白あたりを入れ替えてみるといいかもしれません。

# 参考
[抵抗のカラーコード（抵抗値）の読み方](http://www.jarl.org/Japanese/7_Technical/lib1/teikou.htm)
[Adobe Color CC カラーホイール](https://color.adobe.com/ja/create/color-wheel)
[rainbow-delimiters.el の括弧の色を強調する方法 (たぶん) 決定版](https://qiita.com/megane42/items/ee71f1ff8652dbf94cf7)
【Python】Tkinterを使ってGUIツールをつくってみた


どのプラットフォーム(OS)でも使えるということで、身の回りのツール類をPythonに移行しようと思ってる。
とはいえ、VBSなどで作ってるツールは入力画面などGUI使ったりもしている。
手始めに、PythonでGUI系ライブラリの使い方などについて備忘がてらまとめてみる。

なお、今回は以下のサイトを参考に進める。
[Tkinter による GUI プログラミング](http://python.keicode.com/advanced/tkinter.php)

また、私はmacOSを使用しているので、動作確認等はmacOSで実施している。
<font color="Red">※時間があれば、WindowsやLinuxなどでも動作検証させたいという思いはある</font>


# 1.PythonのGUIライブラリ

GUIライブラリといってもたくさんある。
※情報ソース：[Python、GUIライブラリの紹介](https://www.capa.co.jp/archives/7754)

- [kivy](https://kivy.org/#download)
- [wxPython](https://wxpython.org/download.php#msw)
- [PyQt](https://riverbankcomputing.com/software/pyqt/download)
- [PyGTK](https://wiki.gnome.org/Projects/PyGObject)
- [Flexx](pip install flexx)
- tkinter

どれで試そうか迷った結果、 <font color="Red">**Tkinter**</font> でやることにした。
選んだ理由としては、

1. よくPythonの参考書で見かけるから
1. Pythonに標準で付属されているGUIライブラリだから


ただし、見た目が良くないなどのコメントも見るので、
後々他のライブラリも触ってみようかと思っている。
とりあえず今回は、<font color="Red">**Tkinter**</font> にしました。


## 2. Tkinterとは

Tkinter は Tk を Python から使うためのモジュール。
<font color="Red">※Tkは、GUIを作成するためのツールキット</font>
Tkinterは、Pythonの標準で付属されている。
Windows、macOS、Linuxなど様々なプラットフォーム上で利用することができる。


## 3. Tkinterの導入方法

Tkinterは、標準にPythonに付属されているので、Pythonさえ使える環境であれば使用できる。
<font color="Red">※今回は、Pythonの導入方法までは触れない</font>


私の使用しているPythonのVersion。

```
(env001) Hoge-MBA:bin Hoge$ python --version
Python 3.6.4
```

モジュールが含まれていることを確認。

```
(env001) Hoge-MBA:bin Hoge$ python
Python 3.6.4 (default, Jan  6 2018, 11:51:59) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> help('modules')

Please wait a moment while I gather a list of all available modules...

(中略)

_multibytecodec     csv                 parser              threading
_multiprocessing    ctypes              pathlib             time
_opcode             curses              pdb                 timeit
_operator           datetime            pickle              tkinter  <=== ★含まれている
_osx_support        dateutil            pickletools         token
_pickle             dbm                 pip                 tokenize

(中略)

_warnings           gzip                s3transfer          zlib
_weakref            hashlib             sched               

Enter any module name to get more help.  Or, type "modules spam" to search
for modules whose name or summary contain the string "spam".

>>> 
>>> 
```

念のため、ちゃんど動作するかも確認。

```
(env001) Hoge-MBA:bin Hoge$ python
Python 3.6.4 (default, Jan  6 2018, 11:51:59) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import tkinter
>>> tkinter._test()
>>> 

```

実行すると以下が表示された。

![スクリーンショット 2018-06-09 13.38.31.png](https://qiita-image-store.s3.amazonaws.com/0/33479/f18eb233-906e-b06b-fd1f-5058038f5570.png "スクリーンショット 2018-06-09 13.38.31.png")
CSS 3 快速入門 By 彭彭

➀ CSS3 快速入門

1.1 關於 W3C 技術規格的定制和實踐
w3c:http://w3schools.wang/
caniuse: https://caniuse.com/

1.2 簡單的常用設定介紹
opacity         透明度
border-radius   圓角
box-shadow      陰影
text-shadow     文本陰影

```ruby:qiita.rb
    <style type = "text/css">
        .box {
            width: 250px; height: 150px; background-color: pink;
            opacity: 1;
            border-radius: 10px;
            box-shadow: 7px 7px 0 #C0C0C0;
            text-shadow: 2px 0 0 #ffffff;
        }
    </style>
```


➁ CSS3 綫性轉換
2.1 位移，縮放，旋轉，歪斜

```ruby:qiita.rb
    <style type = "text/css">
		.box {
			width: 100px; height: 100px; background-color: pink;
			transform: 位移 translate(100px, 50px)
			transform: 縮放 scale(2.5, 1)
			transform: 旋轉 rotate(50deg)
			transform: 歪斜 skew(0deg, 30deg)			
			transform: translate(100px, 50px) rotate(45deg);
		}
    </style>

```

2.2 使用綫性轉換畫一個在平面上的立方體

```ruby:qiita.rb
     /* CUBE 立方體 */
     <style type= "text/css">
		.cube > .top {
			width: 240px; height: 60px; background-color: #dddddd;
			transform: skew(-45deg, 0deg) translate(30px,0px)
		}
		.cube > .center {
			width: 240px; height: 240px; background-color: #aaaaaa;
			display:inline-block;
		}
		.cube > .right {
			width: 60px; height: 240px; background-color: #888888;
			display: inline-block;
			transform: skew(0deg, -45deg) translate(0px,-30px)
		}
    </style>

```
bitcoin関連ワード一言メモ

すぐ忘れるんでメモ書きます

## 暗号学的Hash関数
bitcoinで使われているものを軽く紹介
1.[SHA256](https://csrc.nist.gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2.pdf) 
出力は256bit 
2.RIPEND-160
 出力は160bit OpenSSLにも使われているらしい

address作るときにはRIPEND-160(SHA256(pubkey))をつかう

## base64
バイナリを文字を0-9の数字と大/小文字alphabetと+,/で置き換えるencoding手法. 16進数表示のつよいやつみたいな

## base58
base64だと0とoとか見分けつかなくて困るからそいつらをなくしたり, 特殊文字である+と/をなくした版. 2のべきになっていないのでbase64より非効率.

## base58Check encoding
bitcoinで採用されているencoding形式. P2SHとかP2PKHとかで使われている 中身は↓
>base58-encode: [one-byte version][20-byte hash][4-byte checksum]

\[one-byte version]: testnetかmainnetか書いてある. mainnetだと0x00, testnetだと0x03.
\[20-byte hash]: utxoを使えるようにするためのscriptのhashが書いてある. 
\[4-byte checksum]: 上の２つを合わせたものにSHA256で2回Hashを取ったもののはじめの4byteが書いてある.

### 問題点
1. QRコードにしたら大きくなりすぎる. それを作るときにalphanumeric mode encodingが使えない
2. 大文字小文字が混ざってると人が書いたり読み上げたりするときに不便
3. SHA256で二回HASHとる処理は重く, チェックサムを確認してもエラーをdetectできるとは限らない
4. ほとんどの研究によるとエラーをdetectできるのはencodeされたときのcharacterの数が素数のべきになっているときだが, 58はそうでない
5. decodeが煩雑で遅い

全部[ここ](https://en.bitcoin.it/Base58Check_encoding)にかいてある


## bech32
segwitのAddressのフォーマット. base32のchecksumの問題点をいくつか解消したもの [BIP173](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#Abstract)で提案された. 

後で書き足します
一歩先を行く厨二病Rubyスニペット

# まえがき
あまり一般的な書き方ではない(かもしれない)けどオシャレなRubyの書き方集です。
場合によっては有用ですが、濫用すると可読性を損なうのでチーム開発等他の人が読む場面では避けたほうがよさそうです。

「そんなの関係ないから俺は俺のオレオレコードを書く」っていう厨二病の人のためのスニペット。

## 変数代入時のArray#firstをやめる

```ruby
array = [3, 2, 1]

elm = array.first
p elm # => 3

elm, = array
p elm # => 3

```

二つ目以降の要素は捨てられる。

```ruby
elm, _, _ = 3, 2, 1
```

 と同じ



## Proc#callをやめる

```ruby
hoge = ->(str) { str.upcase }

hoge.call('fuga')   # => "FUGA"
hoge.('fuga')       # => "FUGA"
hoge.yield('fuga')  # => "FUGA"
hoge['fuga']        # => "FUGA"
hoge === 'fuga'     # => "FUGA"

```

`.call`や `.()`はよく使われるけど、
`hoge['fuga']`や `hoge === 'fuga'`でprocを呼ぶのは知らないと誤解をうめる。



## String#to_symをしない

文字列リテラルの前に `:`(コロン)でシンボルになる

```ruby
'hoge'.to_sym # => :hoge
:'hoge' # => :hoge
```



もちろん変数展開もできる

```ruby
fuga = 'fuga'
:"hoge_#{fuga}" #=> :hoge_fuga
```

## Array#joinをしない

`Array#*`で代替できる

```ruby
['a', 'b', 'c'].join('/') # => "a/b/c" 
['a', 'b', 'c']*'/' # => "a/b/c" 
```

## 真偽値をひっくり返すには前置の!ではなくBasicObject#!で

```ruby
!true # => false
true.! # => false
```

前置の!と同様にnilかfalseじゃなければfalseが返る

```ruby
''.! # => false
''.!.!.! # => false
```



## Range#to_aをやめる

配列式の中でrangeを展開する

```ruby
(1..5).to_a # => [1, 2, 3, 4, 5]
[*(1..5)] # => [1, 2, 3, 4, 5]
```

## String#uptoを使う

○回ループしたい場合に、安易に

```ruby
3.times { p 'hello' }
# => "hello"
# => "hello" 
# => "hello"
```

とか

```ruby
1.upto(3) { p 'hello' }
# => "hello"
# => "hello" 
# => "hello"
```
せずに、 `String#upto`を使う

```ruby
'a'.upto('c') { p 'hello' }
# => "hello"
# => "hello" 
# => "hello"
```

もちろん値もとれる

```ruby
'a'.upto('c') { |char| p char }
# => "a"
# => "b"
# => "c"
```

`#upto`がStringクラスでも使えるのはあまり知られていないかも。
ループごとにレシーバの文字列から `String#succ`が呼ばれる。
100回まわしたいときは `'a'.upto('cv')`。


## 文字列中の変数展開を使わない
String#<<　を使う。

```ruby
text = 'hoge'
html = "<span>#{text}</span>" # => "<span>hoge</span>"
```

↑辟易する↓シブい

```ruby
text = 'hoge'
html = '<span>'<<text<<'</span>' # => "<span>hoge</span>"
```
無事読みにくくなった

## コード全体をヒアドキュメントにしてevalで実行する

```ruby
eval(<<-EOS)
  p 'hoge'.upcase
  p 'FUGA'.downcase
EOS

# => "HOGE"
# => "fuga"
```
意味はない



## おわり
みなさんの厨二病スニペットおしえてください
【Android】BottomSheetDialogFragmentを使った際、NavigationBarの色、テキストカラーを変更する方法


# `BottomSheetDialogFragment`が表示された際の`NavigationBar`の色、テキストカラーを変更する方法

## 1 :  NavigationBarの色変更を設定

```values-v27/themes.xml
<!-- 
android:navigationBarDividerColor　　NavigationBarとアプリレイアウトとの境界線の色
android:navigationBarColor 　NavigationBarの色
android:windowLightNavigationBar　　NavigationBarの色が白色に近いならNavigationIconの色を濃くする
 -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
　　　　...
    <item name="android:navigationBarDividerColor">お好きな色</item>
    <item name="android:navigationBarColor">お好きな色</item>
    <item name="android:windowLightNavigationBar">true</item>
</style> 
```

## 2 : BottomSheetDialogのThemeを設定
このとき、`statusBarColor`の色を透明色に設定
`style`に`backgroundColor`などを設定しておく。

```values-v27/themes.xml
<!-- 
android:navigationBarDividerColor　　NavigationBarとアプリレイアウトとの境界線の色
android:navigationBarColor 　NavigationBarの色
android:windowLightNavigationBar　　NavigationBarの色が白色に近いならNavigationIconの色を濃くする
 -->
<style name="BaseBottomSheetDialogTheme" parent="Theme.Design.BottomSheetDialog">
　　　　...
    <item name="bottomSheetStyle">@style/BaseBottomSheetStyle</item>
    <item name="android:statusBarColor">@color/colorTransparent</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowLightStatusBar">false</item>
    <item name="android:navigationBarDividerColor">お好きな色</item>
    <item name="android:navigationBarColor">お好きな色</item>
    <item name="android:windowLightNavigationBar">true</item>
</style> 
```

## 3 : BottomSheetDialogFragmentのベースクラスなどに`getTheme`で上記のThemeを設定

```BaseBottomSheetDialogFragment.kt
abstract class BaseBottomSheetDialogFragment : BottomSheetDialogFragment() {

    ...

    override fun getTheme(): Int {
        return R.style.BaseBottomSheetDialogTheme
    }

    ...

}
```

おしまい📓
Linuxの設定ファイルの中身を部分的に書き換える方法

IoT等で外部のイベントを契機にして、サーバやデバイス上にあるOSの設定ファイルを書き換えたり、
AWSのUser Dataにスクリプトを仕込み、EC2起動時にOS上の設定ファイルを書き換えたい時があります。

viやvim等の対話型エディタを開いて編集するのではなく「コマンド一発で設定ファイルの一部を書き換える」ために
sedコマンドで正規表現を指定し、Linuxの設定ファイルの中身を書き換えてみました。

以下は、Zabbixの設定ファイルをsedコマンドで書き換えるサンプルです。
(CentOS7、RHEL7で動作確認)

# before確認
まずは現状を確認します。

```bash:before
# 元々コメントアウトされている場合
sudo grep "^ *# php_value date.timezone" /etc/httpd/conf.d/zabbix.conf
# コメントアウトされていない場合
sudo grep "^ *php_value date.timezone" /etc/httpd/conf.d/zabbix.conf
```

初期状態で1番目のコマンドを実行すると、以下のようになっていました。
ここから、viやvimを使わずに、タイムゾーンをAsia/Tokyoに書き換えます。

```text:実行結果
        # php_value date.timezone Europe/Riga
```

# 置換処理
sedコマンドで置換箇所を特定するパターンを正規表現で書いた後、c\の後ろに置換後の文字列を書くと、
その行ごと置換できます。
設定ファイルのバックアップを取ってから、以下を実行します。

```bash:replace
# 元々コメントアウトされている場合
sudo sed -i -e "/^ *# php_value date.timezone/c\        php_value date.timezone Asia/Tokyo" /etc/httpd/conf.d/zabbix.conf
# コメントアウトされていない場合
sudo sed -i -e "/^ *php_value date.timezone/c\        php_value date.timezone Asia/Tokyo" /etc/httpd/conf.d/zabbix.conf
```
例えば、「USER=aaa」の行を「USER=abc」と編集したいときは
「/^USER=/c\USER=abc」と書けば良いです。
そして、後ろに設定ファイルのパスを書けばOK。
簡単ですね。

雑な言い方をすると、このやり方であれば、何とでもなります。捗りますよ。

# after確認
結果も以下のコマンドで確認します。

```bash:after
# コメントアウトされている行がないことの確認
sudo grep "^ *# php_value date.timezone" /etc/httpd/conf.d/zabbix.conf 
# 想定通り置換されたことの確認
sudo grep "^ *php_value date.timezone" /etc/httpd/conf.d/zabbix.conf 
```

2番目のコマンドを実行すると、以下のようになり、設定が書き換わっていることを確認できます。

```text:実行結果
        php_value date.timezone Asia/Tokyo
```

<br>
この方法を使えば、コマンドだけでは変更できない設定も、
自動で変更できるようになり、いろいろと捗るようになります。

# 2018/8/14追記: sedもエディタである
お恥ずかしながら「sed」=「stream editor」という由来を全く知らずに、記事を書いておりました。(無学がバレてしまいます。。。)
「対話型エディタを使わないで編集する」という意図で、ご理解いただけますと幸いです。
ご指導いただきました全ての方に、感謝申し上げます。
Qiitaに記事を書く動機は「ググりにくい記事を、ググりやすく」するためでOK

世の中にはプログラミング情報が溢れている。
だがすべてのキーワードでGoogle検索をカバーしているとは限らない。

「あー、あれなんだっけ」という時とか、もしくは何も分かっていない時。
たやすくググれないとちょっと困る。

## ググれない時

それはQiitaに記事を書くチャンス。

QiitaはGoogleに強いので、記事をひとつ書いておくと、少なくとも「将来の自分」に役立つ可能性はかなり高い。

「なんだこいつ、俺と同じような問題で悩んでるな」
「い、いや、よく見ると昔の俺じゃないか‥！」
「昔の俺、本当にありがとう‥！」

っていう案件が発生したりする。

## たとえば

`Ruby 標準出力 リアルタイム` でググっても特にほしそうなものが引っかからない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d6d8e6f6-9cd7-5743-7cc6-60bf6eafa116.png)

だがこれはQiitaに記事を書くチャンス。

[Ruby—標準出力をリアルタイムで表示させる - Qiita](https://qiita.com/YumaInaura/items/41a8bdfd69f0960dd618)

## ネットを張る

「自分のググり方が間違っている」というのはさておいて、「ググり方を間違った人のため」にも、日本語の検索結果を用意しておきたい。

そもそも自分が分からないことだからこそググるのでは？

実際、英語で `Ruby realtime stdout` とかググると、ちゃんとヒットするしね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9d12c52b-0093-82fb-af06-523b08db251e.png)

[shell - Running a command from Ruby displaying output in realtime - Stack Overflow](https://stackoverflow.com/questions/34021953/running-a-command-from-ruby-displaying-output-in-realtime)

## 予想不可能性

ところで、自分が書いた記事が役立つ度合いというのは、自分では予測できない部分がある。

「こんなところで引っかかるの、自分ぐらいだろうな」と思って記事を書いたら、わりとたくさん読まれるパターンもある。

[Docker — docker コンテナの中で vim が使えない場合 - Qiita](https://qiita.com/YumaInaura/items/3432cc3f8a8553e05a6e)

## あわせて読みたい？

- [Qiitaのタイトルは「ググりやすさ」で決めなさい - Qiita](https://qiita.com/YumaInaura/items/09a6dfae85d8b4c4f2d8)
- [拝啓 本当は Qiita を書きたいのに、まだ迷っているあなたへ。 - Qiita](https://qiita.com/YumaInaura/items/4d2c602d59c62daa9344)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ruby—標準出力をリアルタイムで表示させる

## こう

```rb
STDOUT.sync = true
```

## こうすると

```rb
STDOUT.sync = true

puts :OK
sleep 1
puts :OK
sleep 1
puts :OK
```

## こうなる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ac80a0d3-f6fd-ff59-3699-28729c7776e5.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a8c4b345-0334-388d-4cd6-d096ecc266da.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/703af756-a804-60b2-9220-aaed74cb4380.png)


## バージョン

- ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
- GNU bash, version 4.4.23(1)-release (x86_64-apple-darwin17.5.0)

## あわせて読みたい？

- [Qiitaに記事を書く動機は「ググりにくい記事を、ググりやすく」 - Qiita](https://qiita.com/YumaInaura/items/e83df9a45836f7b2929b)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
アドホック (ad hock) とは

ad hockとは

## 一般的な意味
>特にこのために、その場しのぎに、特別に

## IT関連の文脈で

### アドホック・モード
>「ピア・ツー・ピアモード」あるいは「インディペンデントモード」とも言う。無線LANクライアント同士が、アクセスポイントを介さず、直接通信を行う。インフラストラクチャー・モードに比べて電波使用効率が良い。このようにして構成されたネットワークは「アドホックネットワーク」と呼ばれる。


### アドホック・クエリ
>その場限りで使い捨てのクエリ。アドホック・クエリを使えば、カスタマイズされたクエリを簡単に作成することが可能になる。通常、データベースの原理やSQL文を深く理解していなくても、GUIを使って行うことができる環境が提供されている。ただし、このような方式のクエリが多用されるとデータベースシステム全体のパフォーマンスにも影響が出かねないため、直接に"生"のデータベースを対象とするのではなく、"生"のデータベースを定期的に複製したものを対象にクエリを作成する、というようなことも行われる。

``` 
アドホック・クエリ例
SELECT * FROM Person WHERE id = 9;

アドホックではないクエリ例
@id=9;
SELECT * FROM Person WHERE id = @id;

```

メリット・デメリットについて

https://dk521123.hatenablog.com/entry/30669342


### アドホック分析
>アドホック分析とは、市場調査やビックデータ処理の際に用いられる分析手法。定期的に行われるデータ分析や、項目も内容も決まっているデータ分析と違って、その都度単発的に行われるというのが特徴。データ分析には「調査の設計、対象者の選択、調査、集計、分析」といった過程が必要だが、それらいずれもが1回完結で行われる。



TableauなどのセルフサービスBIで行う探索型データ分析
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64293/f14a2f1a-d70a-aba7-0665-3f091a5b06d2.png)

> Tableau は、次にとるべきアクションにつながるインサイトを、お客様がデータから引き出せるように支援しています。ビジュアル分析によって、制限なくデータを探索できます。ダッシュボードを作成し、数回のクリックでアドホックな分析を実行できるようになります。分析は誰とでも共有でき、大きなインパクトをビジネスにもたらすことができます。グローバルな大企業から、中小企業やスタートアップまで、あらゆる場所で多くのお客様が Tableau を使いデータを見て理解しています。

https://www.tableau.com/ja-jp/trial/data-mining?utm_campaign_id=2017049&utm_campaign=Prospecting-ANLYTDASH-ALL-ALL-ALL-ALL&utm_medium=Paid+Search&utm_source=Google+Search&utm_language=JP&utm_country=JPN&kw=%E3%83%87%E3%83%BC%E3%82%BF%20%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0%20%E3%83%84%E3%83%BC%E3%83%AB&adgroup=CTX-Data+Analysis-Data+Mining-JP-E&adused=482835026843&matchtype=e&placement=&gclsrc=aw.ds&gclid=CjwKCAjw9aiIBhA1EiwAJ_GTSlhFMuUdoCm8GDeIELVrPnYZ9dcwGmQTrfeRRBmQU-YxHsThkTbUJRoC_gQQAvD_BwE
JavaのデスクトップをWEBと共通のフロントエンドで。

Seleniumを使用してChromeをUIに使うサンプルプログラムです。

下記の動画を参考にして下さい。

https://www.useloom.com/share/8bd47a42fa40401aa61bba7a3a37521c

デモは簡単に見ることができます。

新規フォルダに下記のリンクのGoogle Driveから２つのファイルをダウンロードして、javadesktop.exeをクリックして下さい。

https://drive.google.com/drive/folders/1C3UQThGltkmd3o5kgP0YVAc2spyaTwGG?usp=sharing

https://github.com/mikeshimura/javadesktop
GoのデスクトップをWEBと共通のフロントエンドで。

Seleniumを使用してChromeをUIに使うサンプルプログラムです。

下記の動画を参考にして下さい。

https://www.useloom.com/share/e77ee6c495914f808336ca8d26bb524c

デモは簡単に見ることができます。

新規フォルダに下記のリンクのGoogle Driveから２つのファイルをダウンロードして、godesktop.exeをクリックして下さい。

https://drive.google.com/drive/folders/10D6f1XQk6rzkhJudAojGY8LjQjqN3BfL?usp=sharing

https://github.com/mikeshimura/godesktop
Markdownを使おうと思ったが始め方が分からない時の方法

# Markdownの導入について

使い方は結構載ってるけど、どう使い始めるのかが分からず始めるのに苦戦したのでまとめました。

# Markdownを使おうと思った理由

今までは、エディタにコメント補足してまとめていた。
あとは、メモ帳とかに書いてましたがコードも見づらいしあとでまとめ直すのが面倒だった。
特にコードを改行とかめんどくさいけど、そのまま右揃えになってたら自分も見づらいし・・・。

まとめてないから忘れてしまいがちな事を、Markdownで残してアウトプットして自分の記録として活用していきたいと思いました。

# Markdownとは
- Githubで提供しているMarkdown。チートシートはこちら↓
https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet
- エディタに書いたものがテキストにまとめられるようになるのですごく便利！！
- Atom専用なのでサブライムテキストでは使えない。

# 導入の仕方

- Atomにパッケージとしてすでに入ってるmarkdown。
最初はこれをどうしていいか分からなくて迷いましたw

**インストールされていれば**

- 環境設定＞パッケージ＞Markdown-previewを設定すればオッケー！

**インストールがされてない場合は**

- 環境＞＋インストール＞Search packagesからMarkdownを検索しましょう！


# Markdownには拡張子が必要

Markdownにする際は拡張子を`md`にする。

使い始めに`html`でまとめたものを作ろうと思ったのにこのようにうまく表示されなかった。


なんでかと思ったら、Markdownを使う時には拡張子を`md`にする必要があったのだ！

おかげで、簡単に記入しただけでまとめられるようになりました！

# まとめ

ぜひ、プログラミングのまとめに使って効率よくアウトプットしていきましょう！

参考Qiita
https://qiita.com/kouichi-c-nakamura/items/5b04fb1a127aac8ba3b0
https://qiita.com/tbpgr/items/989c6badefff69377da7
どんな言語でも使用できる、簡単プログラムインストーラー　および 自動　プログラム　アップデーター

デスクトッププログラムを、配布するのが非常に簡単になります。
また、インストール後、次回起動時には自動的にアップデートが無いかチェックしてあれば、ダウンロードして更新後起動します。

2つのファイルをユーザーに渡すだけで、インストールできます。

https://github.com/mikeshimura/mike_launcher

例えば、javadesktopというアプリケーションの場合。

$javadesktop.ini と javadesktop.exe（windowsの場合）または  javadesktop （Macの場合）

Zipファイルとその他の更新用ファイルは Amazon S3に入れておきます。

初回インストール時、Zipファイルがダウンロードされ解凍されます。
そして、更新用ファイルがダウンロードされます。

その後、プログラムがコマンドを実行して、実際のプログラムが稼働します。

次回起動時は、S3　リポジトリを更新用ファイルが最新かチェックして、もし更新されていればダウンロードします。

その後、プログラムがコマンドを実行して、実際のプログラムが稼働します。

$godesktop.ini の内容は下記の様になっています。

```
[default]
OS = WIN
REGION = us-east-1
AWS_ACCESS_KEY_ID = AKIAXXXXxXX
AWS_SECRET_ACCESS_KEY = XXXXXXXXXXXXXXXXXXXX
BUCKET =desktoptool
ZIP = $javadesktop.zip
WATCH= $javadesktop-watch.txt
HIS = $his.json
UNZIP = classes.zip
CMD = java -cp lib/*;classes com.mssoftech.javadesktop.Application
```
OS は WINかMAC

HISは　ヒストリー（更新記録）用ファイルの名前。

UNZIP = classes.zip　これは、必要があればダウンロード後、自動的に解凍されます。

AWSのキーは IAMで作成して、 S3の読み込み権限のみあたえて下さい。

$godesktop-watch.txtの内容は下記の様なものです。

```
assets/tag/index.tag
assets/tag/tagcommon.js
godesktopwin.exe
```

下記から　mike_launcher.exe または mike_launcher　をダウンロードして、自分のアプリケーションの名前に変更して使用して下さい。

https://drive.google.com/open?id=1tIh_Ye-6uCAvrXBI7OWG_L7LFq_2ukKs
MacのVilvaldiでタブを閉じるボタンを右にする

## やりたいこと

MacのVivaldiでは、タブを閉じるボタン✖がタブ左側に配置されます。

![before.png](https://qiita-image-store.s3.amazonaws.com/0/91520/07a97e8f-5125-2b2d-abcc-fd283826b191.png)


ChromeやFirefoxあるいはWindowsでのVivaldiではタブ閉じるボタン✖は右側に配置されています。OSやブラウザを複数種類使う場合、ユーザインタフェースが統一されず、使いにくくなってしまいます。そこで、タブの閉じるボタン✖を右に移す方法を調べました。

## 調べた内容

[mac vivlid close button right](https://www.google.com/search?q=mac%20vivaldi%20close%20button%20right)などとググると、やりかたはいろいろ出てきます。

カスタムCSSを用意してそこにスタイルを書きなさい、というのが多いのですが、特にすごくカスタマイズしたいわけではないので、一番簡単な方法として`commmon.css`の末尾にスタイルを追加するという方法をとります。


`/Applications/Vivaldi.app/Contents/Versions/<バージョン番号>/Vivaldi Framework.framework/Resources/vivaldi/style/common.css`


追加する内容は以下の通り。

https://www.reddit.com/r/vivaldibrowser/comments/82fo7p/change_position_of_the_close_tab_button/

``` css
/* Move tab close button to the right */
.tab .close {
  order: 0 !important;
  margin-right: 6px;
}

/* Show tab favicon when mouse over */
.favicon {
  display: flex !important;
}
```

common.cssをエディタで編集するなどしてVivaldiを再起動すると、タブの閉じるボタン✖がタブの右側に配置されます。

![after.png](https://qiita-image-store.s3.amazonaws.com/0/91520/df6318d3-8c97-f424-897a-796b3f03b7d0.png)

## スクリプトにする

ただし、Vivaldiのバージョンを上げると、この作業をやり直すことになります。
毎回やり方をググって修正するのが面倒になったのでスクリプトを書きました。

``` groovy

// Vivaldiのバージョンディレクトリを探す
def versionsDir = new File('/Applications/Vivaldi.app/Contents/Versions/')
def files = versionsDir.listFiles()
assert files.length == 1
def versionDir = files[0]

// common.cssに書き込み
def commonCss = new File(versionDir,'/Vivaldi Framework.framework/Resources/vivaldi/style/common.css')
assert commonCss.exists()
// https://www.reddit.com/r/vivaldibrowser/comments/82fo7p/change_position_of_the_close_tab_button/
commonCss.withWriterAppend { out ->
  out.println('''
/* Move tab close button to the right */
.tab .close {
  order: 0 !important;
  margin-right: 6px;
}

/* Show tab favicon when mouse over */
.favicon {
  display: flex !important;
}
'''
  )
}
```

Groovyで書きましたが、やってることはかんたんなので、自分の使いやすい言語に移してもいいと思います。
ElasticSearchで java.lang.ClassNotFoundExceptionが発生した場合の対応策

Spring BootとElasticsearchを連携したアプリケーションを作成中し、Document APIを叩いたところ、
`java.lang.ClassNotFoundException: org.elasticsearch.common.xcontent.LoggingDeprecationHandler`
が発生したので解決策をメモしておきます。

## 根本原因

エラーの内容の通り、原因はLoggingDeprecationHandlerというクラスが存在していないためですが、
なぜClassが存在しないかというと、依存性が不足しているからです。

当初mavenの依存性にはElasticsearchの依存性として次のように記述していました。

```
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.3.2</version>
        </dependency>
```

しかしこの`org.elasticsearch.client`には`LoggingDeprecationHandler`が含まれておらず、
正常動作のためには`org.elasticsearch`も依存性に含める必要がありました。

## 解決策 

以下のようにpomファイルを修正することで、上記のExceptionが発生せずに動作させることができるようになりました。

```
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.3.2</version>
        </dependency>
```

## 参考

[Github: java.lang.ClassNotFoundException: org.elasticsearch.common.xcontent.NamedXContentRegistry #26959 ](https://github.com/elastic/elasticsearch/issues/26959)