OmniAICreator/Qiita-1.07M huggingface dataset:
(21/04/20)LGTMをした記事を読み返したいが、ボタンの場所が分からない人に向けて

# 1.概要
元々この記事を記載したのが2020年4月辺りで、その時はLGTMした記事を読み返そうとしてもアクセスしやすい位置に「LGTMを読み返すよボタン」が分かりづらい場所にあったのでこの記事を記載しました。

しかし、2021年4月辺りにQiitaがリデザインされ、LGTMした記事を読み返しやすくなりました。よって、ボタンの場所がわからないという方は少ないと思いますが、万が一のために最新版を載せておきます。

# 2. 方法
## 2.1 マイページを開く。
右上のサムネイルボタンをクリックし、ドロップダウンの項目からマイページを開く。
![スクリーンショット 2021-04-20 19.52.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270132/70569b4c-ef02-8bbd-73b1-38d9f78385b4.png)

## 2.2 LGTMタブを押す。
LGTMタブを押す。すると「LGTMした記事」と出てくる。

![スクリーンショット 2021-04-20 19.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270132/820bb269-3e5f-e061-e1b0-dcac8f551895.png)

# 3 以上です。
コロナに負けず、頑張っていきましょう。ワクチンが行き渡って気兼ねなく外に出れるといいですね。



# 1.概要
※以下は20/04/01時点での情報です。

LGTMした記事を読み返したいと思いました。しかし、アクセスしやすい位置に「LGTMを読み返すよボタン」がないため、(マジか...どこにあるんだよ...)と思いながらボタンの位置を探しました。皆さんには私と同じ目に遭ってほしくないため、ダイイングメッセージとしてこの記事を残します。これ以外のよき方法があったらコメント欄に記載頂けると幸いです。

# 2.方法

## 2.1 マイページを開く。
右上のサムネイルボタンをクリックし、ドロップダウンの項目からマイページを開く。
<img width="1182" alt="スクリーンショット 2020-04-01 18.19.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270132/bdd30287-e748-6395-e132-f0ffdea655d3.png">

## 2.2 ・・・ボタンを押す。
プロフィールの右上の・・・ボタンを押す。すると一番上に「LGTMした記事」と出てくる。
<img width="1062" alt="スクリーンショット 2020-04-01 18.19.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270132/99cc325f-baed-7b3f-b6f0-16163dc185c8.png">


# 3 以上です。
コロナに負けず、頑張っていきましょう。
JP1のあれこれ

JP1Version 9マニュアルのクイックリファレンスがすごく前提条件がわかりずらすぎるので個人的なメモ
なお、一部クイックリファレンスと表現を変えてます。

#システム構成図例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/36ad75ce-d630-e59b-d1a7-ebbb01672f0b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/ccb1b82e-e02a-ea7a-57d1-28bd29cc6c71.png)
**各マシンにインストールされているモジュール**
管理サーバ(統合マネージャー):　JP1/IM-Manager　JP1/Base
業務サーバ1,2(拠点マネージャー): JP1/IM-Manager　 JP1/Base
ホスト: JP1/Base

#監視システムごとの権限の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/74f6cc4f-c4db-5b81-05d0-0b7aa2304a87.png)
#システム管理者の権限と業務システム管理者の権限
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/c25df903-eb8f-c4bb-4aa6-36f30cfb5cd6.png)

#JP1での各ユーザーごとの権限の割り当て方

JP1での各ユーザーごとの権限の割り当てはJP1/Baseのユーザー権限レベルファイルの書き込む。
例で下記の表の設定をする


| JP1ユーザー | JP1資源グループ名 | JP1権限レベル |
|:-:|:-:|:-:|
| Jp1admin  |  JP1_Console | JP1_Console_Admin  |
|  Jp1user1 |  Etius1 |  JP1_Console_Operator |

記載方法は、JP1ユーザー:JP1資源グループ名=JP1権限レベルで記載する
上記方法で表の設定する場合は以下の記述になる

```
Jp1admin: JP1_Console= JP1_Console_Admin
Jp1user1: Etius1= JP1_Console_Operator
```
**参照・操作権限権限の設定は下記の前提条件が必要**
<dl>
<dt>・IM構成管理DBが設定されている。</dt>
<dt>・統合監視DBが設定されている。</dt>
<dt>・業務グループの参照・操作制限が有効（jcoimdef -bizmonmode ON）である。</dt>
<dt>・発生元ホストのマッピングが有効（jcoimdef -hostmap ON）である。</dt>
</dl>

#各ホストでのコマンド実行について
JP1/IM – Managerではセントラルコンソールにて各ホストでコマンドを実行できる。
コマンドを実行する場合は各ホストのOSのユーザーと紐づける必要がある
概念としては以下のようになる
```
JP1Admin(JP1側)=root(サーバホスト名: ホストサーバー側管理ユーザー)
```
コマンドの場合が一番わかりやすいかも
```
Jbssetumap -u JP1Admin
	    -sh root
	    -o etius
```
コマンドオプション
-u :JP1ユーザーの指定
-sh :ホストサーバー側のユーザーの指定
-o :サーバーの指定
laravel-adminでeditorを使う

`laravel-admin`には

```php5
    protected function form()
    {
        $form = new Form(new Infomation());
        $form->text('title', __('タイトル'));
        $form->textarea('detail', __('詳細'));
        $form->date('yyyymmdd', __('日付'))->default(date('Y-m-d'));

        return $form;
    }
```

と普通のtextarea出力の代わりに

```php5
$form->editor('detail', __('詳細'));
```
とリッチテキストで書けるような機能がありますがこれをそのまま使うと
`Field type [editor] does not exist`と表示され使えません。

これを使うようにするには
`app/Admin/bootstrap.php`の

```php5:app/Admin/bootstrap.php
Encore\Admin\Form::forget(['map', 'editor']);
```
の部分を

```php5:app/Admin/bootstrap.php
//Encore\Admin\Form::forget(['map', 'editor']);
Encore\Admin\Form::extend('editor', Encore\Admin\Form\Field\Editor::class);
```

とするだけです
stripe-iosでクレジットカード情報のZIPを非表示にしたい


stripe-iosとは、クレジットカードで決済を行うiOSアプリを作成する上で、
必須と言っても過言ではない素晴らしいSDKです。

![](https://i.imgur.com/LUSf97S.png)

※stripe-ios githubページより。
https://github.com/stripe/stripe-ios

ただ現在、クレジットカードの情報として入力する項目が、

- 番号
- 有効期限
- セキュリティコード（CVC）
- ZIP

の4種類がデフォルトになっています。
ちょっと前までデフォルトはZIP以外の3つだったはずなのに。

**てかZIPってなに！！！！！？？？？？**

と無能な自分は思ってしまったので、これはそんな悩みを解決する記事です。

## ZIPとは

参考: https://www.shineray-ryokou.com/post/zip-code
参考記事をまとめると、以下です。

- ZIP Codeとは、「郵便番号」です。
- 別名、Postal Code。
- ZIP Codeの目的: セキュリティ強化のため。
- 日本のクレジットカードにはZIP Codeが存在しない。

## ZIP Codeを非表示に

iOSアプリの公開範囲が日本のみの場合、ZIP Codeは入力不要ですし、
入力項目として表示するのも不要です。
では非表示にしましょう。

```swift
var cardTextField = STPPaymentCardTextField(frame: CGRect(
            x: 0,
            y: 0,
            width: UIScreen.main.bounds.height,
            height: 44.0))

...

cardTextField.postalCodeEntryEnabled = false
```

以上です。ZIP Codeは別名Postal Codeなので。

## その他参考

https://qiita.com/k-boy/items/c99cc681c29a1b250b4a
Node.jsをChrome DevToolsでデバッグする方法

Node.js は標準で Chrome DevTools と接続しデバッグする機能が付いています
普段から使っている Chrome DevTools と同じ感覚で使えます
ヒープメモリのスナップショットも取れるためメモリリーク調査にとても便利だったのでやり方をまとめておきます

## 対応バージョン
- node v6.3.0以上

## やり方

### 1. node を `--inspect` オプションをつけて起動する
```shell
node --inspect index.js
``` 

### 2. Chrome で `chrome://inspect` を開く
こんな画面が開きます
うまく動いていると Remote Target の下に認識しているアプリケーションが表示されます
<img width="672" alt="スクリーンショット 2020-04-01 17.59.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49838/d1c81843-8d96-0f34-12c5-16f7f1d9849e.png">

### 3. `Open dedicated DevTools for Node` をクリック
いつもの Chrome DevTools が開きます

### 4. デバッグする
ヒープメモリのスナップショットをとったり色々できます

## 参考
https://nodejs.org/en/docs/guides/debugging-getting-started/
https://medium.com/@paul_irish/debugging-node-js-nightlies-with-chrome-devtools-7c4a1b95ae27
画像を二値化処理させる。さらに、二領域間の最短距離を算出できるようにした（Ver1.1）。

#はじめに

　今回は、前回記事二領域間の最短距離を求めるプログラムについて、修正を行った内容です。
　前回は、画像サイズをそのまま処理していたことと、必ずしも二領域間の最短距離を求めることができていなかった課題がありました。

>画像を二値化処理させる。さらに、二領域間の最短距離を算出できるようにした。
https://qiita.com/Fumio-eisan/items/05a6506da8cc88d89e49

要点は下記です。

+ 画像を小さくして処理しやすくする
+ 任意の領域を二値化させる
+ 領域間の距離を求め、そこから最短距離を求める


##画像を小さくして処理しやすくする

　今回はこちらの焼肉画像を用いて二つの肉の最短距離を求めたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/48b68612-d972-83e7-1d6a-652ff8b55528.png)



　前回の記事ではそのままの画像サイズで処理を行っていました。この場合、**画像サイズが大きくなると領域を囲む処理が重くなってしまいます。**従って、画像サイズを小さくして処理しやすくします。

　今回は、幅を300ピクセルに固定して同じアスペクト比（幅:高さ比）で縮小させます。

```python:img.ipynb

def scale_to_width(img, width):
    scale = width / img.shape[1]
    return cv2.resize(img, dsize=None, fx=scale, fy=scale)

img = scale_to_width(img, 300)#300ピクセルに固定
```

##画像を二値化させる

 次に、二値化により肉部分だけを色を抽出したいと思います。cv2.inRangeメソッドによって特定の色を白、特定の色を黒とします。


```python:img.ipynb
import numpy as np
bgrLower = np.array([0, 0, 130])    # 抽出する色の下限(BGR)
bgrUpper = np.array([120,120, 255])    # 抽出する色の上限(BGR)
img_mask = cv2.inRange(img, bgrLower, bgrUpper) 
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(1,1,1)
ax.imshow(img_mask)
ax.axis("off")
```

![niku_wb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/0176dee3-bf5b-aafd-f1c4-f7c6dcab4c31.jpeg)

　見事肉だけ白く表示させることができました。ただ、これは元画像の色合いによって**手動で抽出する色を調整する必要があるため、手間になります。**この表示させたい色だけを抽出して二値化させる手法は、別途まとめたいと思います。




##領域間の距離を求め、そこから最短距離を求める

　次に、領域間の距離を求めます。前回は、各領域のｘ座標最大値/最小値を取る座標を取得させてから距離を求めました。しかし、その求め方は必ずしも最短距離をとれるわけではありません（下右図の例）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/f3c14a0f-2a80-36a6-43b4-76b590deb378.png)


　対策としては、各領域を囲む点通しの組み合わせによる距離を全て求めて、それが最小値を取る座標を取得することです。
　この時、画像サイズを調整しないとかなり計算数が大きくなるため、前に示した画像サイズを縮小化させることが効いてきます。

```python:img.ipynb
import numpy as np
dd=np.array([300])#空白の配列だとif min(dd)> dでエラーが出るため
for i in range(len(contours[0])):
    x3 = contours[0][i][0][0]
    y3 = contours[0][i][0][1]
    for ii in range (len(contours[1])):
        x4 = contours[1][ii][0][0]
        y4 = contours[1][ii][0][1]
        d = get_distance(x3, y3, x4, y4)
        
        if min(dd) > d:
            x3min  =x3
            y3min  =y3
            x4min  =x4
            y4min  =y4
        dd = np.append(dd,d)

```

```
26.248809496813376
```
![niku_wb1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/7ff391ea-32a9-066b-466e-b1c3aa6c13b2.jpeg)


無事に最短距離を求めることができました。

#おわりに

　画像ファイルを小さくするだけで、処理がかなり早くなりました。一方、色の抽出は手動で行いますので、ここは改善の余地があります。二値化したいところだけ自在に分けられるような改造を検討したいと思います。


　簡単ですが改善しましたので、下記に格納しています（日付が新しいものがバージョンアップしたものです）。

https://github.com/Fumio-eisan/img_distance20200315
bashrcで複数の設定を読み込ませる

.bashrcや.bash_profileにいろいろな設定が混ざっているのが嫌なので、`.bashrc`の末尾に以下のようにして設定ファイルを読み込ませるようにする。

```bash
...

if [ -d "$HOME/.config/bash/rc.d" ] ; then
    . $HOME/.config/bash/rc.d/*
fi
```

`.bash_profile`には以下。必要があれば`.profile`の読み込みを先頭でやる。

```bash
if [ -f "$HOME/.profile" ] ; then
    . "$HOME/.profile"
fi
if [ -d "$HOME/.config/bash/profile.d" ] ; then
    . $HOME/.config/bash/profile.d/*
fi
```

あとは設定したディレクトリにスクリプトを置いて再読み込みすればよい。
ファイル名の昇順で読み込まれるので読み込むファイル名は気を付ける。

```console
source ~/.bashrc
```

# おまけ
Ubuntu18.04の`.profile`はこのようになっている。

```bash
# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi
 
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi
```
JavaScript : ブラウザ中央にポップアップウィンドウを開く

今どきポップアップウィンドウなんて時代でもないですが、TwitterやFacebookなどSNSのシェアボタンでは未だに使われており、それとよく併用するコードです。

`window.open()`は特定の位置を指定してウィンドウを開けます。
ブラウザの位置・広さをもとにブラウザの中央にウィンドウを配置するよう指定します。

```javascript
function popupWindow(url, name, w, h) {
  url = encodeURI(decodeURI(url));
  wTop = window.screenTop + (window.innerHeight / 2) - (h / 2);
  wLeft = window.screenLeft + (window.innerWidth / 2) - (w / 2);
  window.open(url, name, 'width=' + w + ', height=' + h + ', top=' + wTop + ', left=' + wLeft + ', personalbar=0, toolbar=0, scrollbars=1, resizable=!');
}

//popupWindowへ投げる変数
//url  : ウィンドウに出すURL
//name : ウィンドウ名
//w    : ウィンドウの横幅
//h    : ウィンドウの縦幅
//wTop : 配置する横位置
//wToop: 配置する縦位置
```
[超簡単]Gatsby.jsでカッコいいポートフォリオを作成する方法

# はじめに
今回は、Gatsby.jsを使って簡単にカッコいいポートフォリオを作る方法を共有したいと思います。

[こちら](https://my-portfolio-en.netlify.com)が、完成形の例になります。

## そもそもGatsbyとは？
> Gatsbyは、Reactに基づく無料のオープンソースフレームワークであり、開発者が非常に高速なWebサイトやアプリを構築するのに役立ちます
  
*[公式ドキュメント（英語）](https://www.gatsbyjs.org/)より

## 手順

1 . まずは、Gatsbyでの開発に必要な以下のツールを揃えましょう。

- Git
- Node.js（npmを使えているなら入っているはず）
- Gatsby CLI

もしもインストール方法がわからない場合は、[こちらの記事](https://qiita.com/wlcmty/items/67b6f51ddc646484d7bc)を参考にしてください。

2 . こちらの[Gatsby公式サイト](https://www.gatsbyjs.org/starters/?v=2)で、お好きなテンプレートを見つけましょう。

今回は、この[
gatsby-starter-portfolio-cara](https://www.gatsbyjs.org/starters/LekoArts/gatsby-starter-portfolio-cara/)というテンプレートを使用していきます。

<img width="1143" alt="Screen Shot 2020-04-01 at 17.21.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482472/9eb017c9-58a6-aaed-0c3f-64786dfcd90a.png">


3 . 作業用のディレクトリに`cd 開発をするディレクトリ名`で移動し、`gatsby new`する

先ほどのテンプレート詳細ページに下にスクロールしてもらうと、使い方が英語で載っています。

そこに、`gatsby new`のコマンドが載っているので、それを作業するディレクトリに移動して実行します。

```shell
cd ディレクトリ名
gatsby new gatsby-starter-portfolio-cara https://github.com/LekoArts/gatsby-starter-portfolio-cara
```

その後、`gatsby new`で生成したディレクトリに`cd`で移動し、次は`gatsby develop`します。

```shell
cd gatsby-starter-portfolio-cara
gatsby develop
```

はい、一応完成です！！
`gatsby develop`が成功したら、ブラウザでタブを開いて`localhost:8000`にアクセスしてみてください。

お洒落でカッコいいサイトができあがってますよね！！

<img width="1439" alt="Screen Shot 2020-04-01 at 17.34.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482472/b5a2c984-6202-32ec-e980-bd615e979e92.png">


使用するテンプレートによっても異なりますが、もちろん中身の編集も簡単にできます！

今回の[
gatsby-starter-portfolio-cara](https://www.gatsbyjs.org/starters/LekoArts/gatsby-starter-portfolio-cara/)というテンプレートの場合、作成されたフォルダの中の`src`の中に`intro.mdx`というファイルが入っており、ページのトップの部分はマークダウン式で中身を自由に編集できるようになっています。トップ以外の箇所も、`projects.mdx`、`about.mdx`、`contact.mdx`という風にそれぞれファイルを`src`の中に作成してマークダウン式で編集可能です。

# 最後に
今回は、Gatsby.jsを使用して簡単にカッコいいポートフォリオサイトを作成する方法をシェアしました！
とっても簡単なので、ぜひ皆さん試してみてくださいね！
[第0章：環境構築編] Gatsby公式ドキュメントを翻訳してみた。

# はじめに
このシリーズでは、英語ソースばかりで「Gatsby使ってみたいけど、よくわからない...」という方々のために、公式Docを翻訳（ところどころざっくり要約）していきます。

実際の公式ドキュメントは[こちら](https://www.gatsbyjs.org/tutorial/)

（この章では、Gatsby.jsを使って開発ができる環境の構築を済ませ、Hello world!と画面に表示させることがゴールです）

〜〜 以下、翻訳となります 〜〜

## 0. 開発に必要な環境を構築しよう

Gatsbyを使用したサイトを開発する前に、まずはあなたが次に挙げるようなウェブ開発における主要技術を使い慣れているか確認してください。

- **CLI(ターミナル)**  
（ある程度プログラミングをしている方には必要ないと思うので、ターミナルの説明は割愛します）
- **Node.js**  
Node.jsとは、JavaScirptのコードをブラウザの外でも実行できるようにするためのものです。GatsbyもNode.jsを使用して動いています。よって、Gatsbyを使って開発する際には、安定して動く最近のバージョンのNode.jsをインストールする必要があります。npmとNode.jsは基本的にセットでインストールされるので、もしnpmを使ったことがなければ、Node.jsもインストールされていない可能性が高いでしょう。

参考記事： [HomebrewでNode.jsとnpmをインストールする方法](https://fukatsu.tech/install-nodejs)

- **Git**  
Gitとは無料でオープンソースのバージョン管理システムです。Gatsbyでは、「starter」というページ作成のためのテンプレートのようなものを活用してSPAのサイトを高速で作ることができるのですが、その「starter」をインストールする際にGitを使用することになるので、Gitはあらかじめインストールしておいてください。  

参考記事： [最新のGitをインストールする方法](https://qiita.com/normalsalt/items/f200ba50363ebfd46df0)

### Gatsby CLIを使ってみよう

Gatsby CLIは、あなたが高速でGatsbyのサイトを開発するのをより簡単にしてくれるnpmパッケージです。  
以下のコマンドを実行して、インストールしてみましょう。

```shell
npm install -g gatsby-cli
```

インストールが完了したら、以下のコマンドで実行可能なコマンドを確認できます。

```shell
gatsby --help
```
![console-gatsby-help.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482472/0ab626a6-23d8-0683-12b2-797fdd0327f2.png)

### Gatsbyでサイトを作ってみよう
ここまできたら、もうGatsby CLIを使ってGatsbyのサイトを作成する準備は完了です。このツールを使って、前述した「starter」をダウンロードできます。今回使用する「Hello world starter」はGatsbyサイトを作るのに必要最低限のものだけが入っているstarterです。

1 . 　ターミナルを開く
2 . 　starterを利用して、gatsby newでサイトを作成

```shell
gatsby new hello-world https://github.com/gatsbyjs/gatsby-starter-hello-world
```
3 . 　作成したディレクトリに移動

```shell
cd hello-world
```

4 .  開発用サーバーを立ち上げる

```shell
gatsby develop
```
これだけで、今回の作業はおしまいです！！
### ローカル環境でサイトを見てみよう
それでは以下のURLにアクセスして、作ったサイトを見てみましょう。

http://localhost:8000/

![helloworld-home-page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482472/844f4868-f973-8f80-8999-d1319dd02875.png)

おめでとうございます🎉  
これで、あなたの最初のGatsbyサイトができました！
`gatsby develop`で立ち上げた開発用サーバーが動いている限り、あなたはいつでもこの`http://localhost:8000/`にアクセスできます。
もしサーバーを止めたければ`Ctrl + c`で止められますし、また立ち上げたければもう一度`gatsby develop`を実行してください。

*参考文献：[Gatsby公式ドキュメント](https://www.gatsbyjs.org/tutorial/)*

[次の章](https://qiita.com/wlcmty/items/dcfcdf36ed660fd94ad7)のテーマは、
「今回`gatsby new`で作成したgatsbyサイトがどんな構成で成り立っているのか理解する」です。

お楽しみに！！

[[第1章：Gatsbyサイトの理解 編] Gatsby公式ドキュメントを翻訳してみた。](https://qiita.com/wlcmty/items/dcfcdf36ed660fd94ad7)

[[第2章：Gatsbyにおけるスタイリング 編] Gatsby公式ドキュメントを翻訳してみた。](https://qiita.com/wlcmty/items/1ecf954b60a016d249a4)

[[第3章：Layoutコンポーネントを使ってみよう 編] Gatsby公式ドキュメントを翻訳してみた。](https://qiita.com/wlcmty/items/8302dcdc61debbd4132e)
M5Stackでセンサーライト作ってみた

今までデスクトップアプリやWeb開発に主に携わってきたので、組み込みとかハード系、特に電気系統が少しでも絡むと拒絶反応を起こしていた。
そんな自分を鍛えるべく、組み込みの初心者向けということでM5Stackなるものを触ってみた。

どうせ作るなら実用性があるものがいいので、PIRセンサーを使って**センサーライト**を作ってみることにした。

**完成図がこちら！！**
![DSC_0225.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504156/9133d7f6-a7d8-3303-314d-bf3dd92791fb.jpeg)

とってもシンプル。
M5Stack BasicとPIRセンサー、あと電源としてモバイルバッテリーを接続。

仕組みは簡単。PIRセンサー（平たく言うと人感センサー）から来るON/OFFの信号に合わせて画面を光らせたり暗くしたりするだけ。

試しにPIRセンサーを何かしらで覆ってみると画面が暗くなった。
![DSC_0226.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504156/4f28bf59-2c72-f999-eaa7-4fda9c355c60.jpeg)

PINアサインはこんな感じ。
![DSC_0227.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504156/274e3502-c7bd-7895-d442-9faaeb2f8700.jpeg)

そんでプログラムは以下。環境はArduino IDE。バージョンは1.8.10

``` .cpp
#include <M5Stack.h>

#define PIR_PIN 2

bool isPirOn = false;

void setup() {
  M5.begin();
  // スリープ状態にしておく
  M5.Lcd.sleep();
  M5.Lcd.setBrightness(0);
  // 画面を白くすることにより照明の代わりにする
  M5.Lcd.fillScreen(WHITE);
  pinMode(PIR_PIN, INPUT);// set pir sensor pin as input
}

void loop() {

  int value = digitalRead(2);// read the pin(0: not detectd 1: detected)
  
  if (value == 0)
  {
    if (isPirOn == true)
    {
      isPirOn = false;
      // スリープ状態にしておく
      M5.Lcd.sleep();
      M5.Lcd.setBrightness(0);
      M5.update();        
    }
  }
  else
  {
    if (isPirOn == false)
    {
      isPirOn = true;
      // スリープ状態を解除して点灯状態にする
      M5.Lcd.wakeup();
      M5.Lcd.setBrightness(255);
      M5.update();
    }
  }

  delay(500);
}
```

もう少し実用性を考えるなら、PIRセンサーがOFFになっても点灯を10秒くらい保持するとか入れた方が良いかも。
HTML スクロール時に背景画像を遅らせる

後でコピペできるように残しておきます。

↓わかりにくいですが一応GIF

![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165044/e25755ae-e3bc-58f1-348a-462ca4086e7d.gif)

#注意

スクロール時の背景画像の滑らかさはモニターのスペックに依存してしまうので、スペックの低いモニターだと結構カクツキます。
ゲーミングモニターだと滑らかに動くので良きですが...

下記のコードではScrollイベントを使って背景画像のポジションを弄っているのですが、カクツキを完全になくすためならrequestAnimationFrameやsetIntervalを使わないとダメかも。

#準備

背景に使用する画像を、```bg.png```という名前で準備しておきました。

#HTML

```html
  <div id="bg" class="ly_bg"></div>
```

#CSS

```css
  .ly_bg {
    position: fixed;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    z-index: -1;
    background-image: url('../images/bg.png');
    background-size: 100% auto;
    background-repeat: repeat-y;
    background-position-y: 0;
  }
```

#JS

```js
let bg = document.getElementById('bg')
const rate = 3

window.addEventListener('scroll', function () {
  let y = window.scrollY
  bg.style.backgroundPositionY = `-${y / rate}px`
})
```
【超初心者向け】RubyをインストールしたらRubyで遊んでみよう！！その５

※本記事はRubyがインストールされた前提の記事です。
Rubyをインストールしたあと、とにかくRubyをいろいろ触ってみて慣れていくための記事です。お役に立てば幸いです。

##環境
Ruby 2.5.1
MacOS Mojave Ver.10.14.6


[【超初心者向け】RubyをインストールしたらRubyで遊んでみよう！！その４](https://qiita.com/TOMARU4400/items/455faf979a6e82d88d26)の続きです。ここで少し難しくなります。

## #{変数名}で式展開
名前を引数にhiを再定義すれば特定の人にHelloが言えます。
2行目の#{name}は文字列に何か挿入するときのRubyのやり方です（式展開）。#{変数名} と記述すると、文字列の中に変数や定数を書き込むことができます。式展開を使用するためには、文字列を必ずダブルクォート（”）で囲います。

```irb:Tarminal
irb(main):015:0> def hi(name)
irb(main):016:1> puts "Hello #{name}!"
irb(main):017:1> end
=> :hi
irb(main):018:0> hi("Matt")
Hello Matt!
=> nil
```

上記のように表示されていれば成功です。お疲れ様でした。
DRF Django Rest Framework における独自のシリアライズ項目を返す

##シリアライズのオリジナル項目の設定方法

to_representation をオーバーライドすると独自の値を返せる。

```
# serializers.py

class TestDataSerializer(WritableNestedModelSerializer):
    hoge = serializers.IntegerField(read_only=True)
    fuga = serializers.CharField(read_only=True)

    class Meta:
        model = TestModel
        fields = ['hoge', 'fuga']

    def to_representation(self, instance):
        ret = super().to_representation(instance)
        # ここから好きなようにセットする
        ret["test"] = "test"
        return ret
```
instanceには、TestModelのデータが入っているので、これを自由に編集する。
切替要のボタンをきれいにだすやーつ

<p class="codepen" data-height="580" data-theme-id="dark" data-default-tab="css,result" data-user="pe-ta" data-slug-hash="WNvzdxa" style="height: 1200px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="トグルボタン">
  <span>See the Pen <a href="https://codepen.io/pe-ta/pen/WNvzdxa">
  トグルボタン</a> by Tadatsugu Sampei (<a href="https://codepen.io/pe-ta">@pe-ta</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
【超初心者向け】RubyをインストールしたらRubyで遊んでみよう！！その４

※本記事はRubyがインストールされた前提の記事です。
Rubyをインストールしたあと、とにかくRubyをいろいろ触ってみて慣れていくための記事です。お役に立てば幸いです。

##環境
Ruby 2.5.1
MacOS Mojave Ver.10.14.6


[【超初心者向け】RubyをインストールしたらRubyで遊んでみよう！！その３](https://qiita.com/TOMARU4400/items/f23443dd9f915c974114)の続きです。
何度も"Hello World"と表示させたい時は「メソッド」を定義します。

```irb:Tarminal
irb(main):010:0> def hi
irb(main):011:1> puts "Hello World!"
irb(main):012:1> end
=> :hi
```

def hi という部分でメソッドを定義しています。次の行はおなじみのputs "Hello World!"ですね。そして次の行は end でRubyにメソッド定義の終わりを意味します。最後の行はRubyがメソッド定義の終わりを理解したことを表すRubyのレスポンスです。
 

それでは先ほどのメソッドを繰り返してみましょう。

```irb:Tarminal
irb(main):013:0> hi
Hello World!
=> nil
irb(main):014:0> hi
Hello World!
=> nil
```

上記のように先ほど定義したhiメソッドの二文字だけを実行すれば "Hello World!" を簡単に表示させることができます。
ランダムソート

```
using System;
using System.Collections.Generic;
using System.Linq;

public class OrderMixer<T>
{
    private readonly T[] items;
    public T[] Result { get; private set; }

    public OrderMixer(IEnumerable<T> items)
    {
        this.items = items.ToArray();
    }

    public void Mix()
    {
        Result = items.OrderBy(i => Guid.NewGuid()).ToArray();
    }
}
```
Windows 10 で言語切り替えショートカットを無効にする方法【Windows 10 1909版～】

言語切り替えショートカットとは、「ctrl+shift」でIMEが切り替わるショートカットのことです。

Windows 10 で言語切り替えショートカットを無効にする方法【windows10 1803版】 - Qiita
https://qiita.com/ynott/items/5d8fde54e7c3a66b7af3

Windows 10 で言語切り替えショートカットを無効にする方法【Windows 10 1810版～】 - Qiita
https://qiita.com/ynott/items/5c97453fcc9bdf845636

を書いたのですが、1909では設定方法が変わっていたので再度書いてみました。

# 0. 前提条件

Windows 10は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/298ab9e1-4fbc-fd29-fc07-58e906337836.png)


## 1. コントロールパネルを開いて「時刻と言語」を選択(変更なし)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/5a930142-7a43-a88e-4143-88bdb6ba0913.png)

## 2. 時刻と言語で「言語」を選択(変更なし)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/06515293-6edc-3bf6-d413-1354bc10ea88.png)

## 3. 言語で「常に既定として使用する入力方式を選択する」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/e1e72122-b570-bc34-e64b-bf70b7520881.png)

## 4. キーボードの詳細設定で「入力言語のホットキー」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/daeb339b-bb67-791e-365d-8ec0adc41023.png)

## 5. キー詳細設定で「キーシーケンスを変更」をクリック(変更なし)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/6decf19b-f0cd-e1cb-2f30-2db73eed24c6.png)

## 6. キーシーケンス変更で「割り当てなし」をクリック(変更なし)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/675d69ab-f052-9d32-dce0-7e516be2a38d.png)

OKを押して終了

# どれぐらい変わったか

8画面必要だったのが、6画面で設定できるようになりました(私が気がついてなかっただけかも...。)
【非エンジニアが書く】WordPress開設直後に知っておきたいプラグイン

こんにちは。
エンジニアとして仕事はしておりませんが、
最近趣味でマーケティングやWordPressの勉強を始めました。

WordPressを開設し、プラグインはどれが良いか調べたりが面倒でしたので
WordPress開始直後にどのプラグインを導入するべきか、同じような方への役に立てばと記事を起こしてみました。
一部つまづいたポイントは一言添えて記載しているので、困った人の助けになればと思います。

##解説させていただくプラグインの皆さん
AddQuicktag
Akismet Anti-Spam
All In One SEO Pack
Broken Link Checker
Classic Editor
Contact Form 7
Crayon Syntax Highlighter
EWWW Image Optimizer
Google XML Sitemaps
Hello Dolly
Pretty Links
PS Auto Sitemap
PuSHPress
TypeSquare Webfonts for エックスサーバー
WordPress Ping Optimizer
WordPress Popular Posts
WP Multibyte Patch

##では解説に移ります
###AddQuicktag　[オススメ度：★★☆]
・テキスト編集時に使うコードを登録しておける
・記事を書く時間短縮したい方にはオススメ
・いつでも直で書くんじゃいという方には要らないかも

###Akismet Anti-Spam　[オススメ度：★★☆]
・コメントスパムを自動的に振り分けてくれる (アンチスパム)
・コメント開放している場合、必須
・有効化後、ちょっとした設定が必要

###All In One SEO Pack　[オススメ度：★★★]
・Google Analyticsとの連携に必要
・メタディスクリプション, パーマリンクの発行に必要
・基本的に入れない理由は無い

###Broken Link Checker　[オススメ度：★★★]
・記事内のリンク切れを教えてくれる
・プラグイン「Pretty Links」などとセットで使用すると良さそう

###Classic Editor　[オススメ度：★★☆]
・管理画面のエディターで、従来のテキストエディタを利用可能にしてくれる
・SEOを意識するのであれば、必須
・テキストコードをいじるのが面倒な人は要らないかも

###Contact Form 7　[オススメ度：★☆☆]
・お問い合わせフォームを簡単に作成できる
・お問い合わせフォームを作りたい場合、必須

###Crayon Syntax Highlighter　[オススメ度：★☆☆]
・ソースコードを記事上に綺麗に表示してくれる
・ソースコードの説明記事を書く場合、必須
・ソースコード書かない人には要らない機能

###EWWW Image Optimizer　[オススメ度：★★★]
・サイト内の画像をまとめて軽量化してくれる
・SEOやUXを意識するのであれば、必須
・ただし、これだけでは軽量化不十分な場合もあるので別の圧縮ツールを通してからの使用を推奨

###Google XML Sitemaps　[オススメ度：★★☆]
・記事を作成、更新する度に自動で最新のXMLサイトマップを生成して検索エンジンに送信してくれる
・SEOを意識するのであれば、必須
・プラグイン「PS Auto Sitemap」と合わせて使いたい

###Hello Dolly　[オススメ度：☆☆☆]
・初期プラグイン
・管理画面上にジャズミュージシャンであるLouis Armstrong代表曲「Hello, Dolly!」の歌詞を1節表示する
・不要なので削除しましょう

###Pretty Links　[オススメ度：★★☆]
・任意のURLに変更が発生した場合、そのURLが複数あるような場合は修正が楽
・同一URLを複数回記入するような場合は、入れておいた方が楽
・プラグイン「Broken Link Checker」などとセットで使用すると良さそう

###PS Auto Sitemap　[オススメ度：★★☆]
・記事を作成、更新する度に自動で最新のHTMLサイトマップを生成してユーザーに見つけやすくしてもらえる
・SEOを意識するのであれば、必須
・プラグイン「Google XML Sitemaps」と合わせて使いたい

###PuSHPress　[オススメ度：★★☆]
・検索エンジンのクローラーを呼び寄せてくれる
・SEOを意識するのであれば、必須

###WordPress Ping Optimizer　[オススメ度：★★★]
・記事更新や修正時のping送信を記事作成時の1回だけにしてくれる（スパム認定回避）
・エラーを起こしているpingを可視化してくれる
・SEOを意識するのであれば、必須

###WordPress Popular Posts　[オススメ度：★★★]
・「人気記事（良く読まれる記事）」の一覧をサイトバーや任意の位置に表示してくれる
・直帰率削減や巡回率向上を意識するなら、必須
・キャッシュ系のプラグインと相性悪くウィジェットで設定できない場合は以下を参考にどうぞ（私はなりました）
https://bazubu.com/how-to-add-popular-posts-23487.html

###WP Multibyte Patch　[オススメ度：★★☆]
・日本版WPの初期プラグイン
・日本語マルチバイト文字に関する問題を解決してくれる
・日本語で運営するのであれば有効化必須

###TypeSquare Webfonts for エックスサーバー　[オススメ度：☆☆☆]
・http://webfonts.xserver.jp にあるTypeSquareのフォントを読み込みに行く
・データ量が多い場合、表示速度が遅くなる可能性あり
・サイト表示速度が気になる場合は不要、使用予定なければ削除しましょう

##あとがき
基本的に★2つ以上は入れておいて良いと思っています。
ただ、WordPress初心者ですので、調べたりてないことも多いかと思います。
詳しい方は他のプラグインなども教えていただけると助かります。（コメントお待ちしております）

補足ですが、プラグインを導入する際の注意点です。
<b>・プラグインは安易に入れすぎない方が良い</b>
<b>・途中で削除はしない方が良い</b>

プラグインを入れすぎると、サイトの表示速度が遅くなる場合があり、そうなるとSEO的によろしくないからかな…と。
途中で削除をしてしまうと、プラグインを適応していた作成記事の表示崩れなどが起きるからかな…と。

以上、WordPressのプラグインについて解説してみました。
おうちハック Vol.4 廊下のライトを人感センサーでコントロールしてみた

[Vol.2](https://qiita.com/zrock/items/d86c0795e0880473ea76)、[Vol.3](https://qiita.com/zrock/items/1458236efd15f406a992)でやったのと同じように、今度は室内のライトをコントロールしてみた。

ココ↓
![IMG_20200401_113545.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/f5e3273b-4e43-35ed-7a6f-9a102ecc35e6.jpeg)
以前、IKEAで人感センサーもセットで売ってるのでそれでコントロールしてみようとしたのだけど、ライトに対して設定できる人感センサーはひとつだけ。つまり、この写真のように、１階から階段を上がるとき（赤い矢印）と２階の奥の部屋から来るとき（青い矢印）の両方を人感センサーでセンシングするのは無理なんです。

そこでGravio。Gravioだったら、２つのセンサーを同じレイヤーに登録しておけばどちらかが反応したときにライトを点けることができるんです。これ、結構ポイントです。

# 使ったもの
- Gravio Hub w/HubKit 3.7
- Gravio Studio
- 人感センサー ×2
- IKEA TRADFRI ライト

ライトはこちら。実は間違ってE17のライトを買ってきちゃって、一度返品してE26のものを買いに行ってきました。。。トホホ。。
![IMG_20200401_112847.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/864821e7-bc03-bd2a-a73e-3471e1ec0a8f.jpeg)

前述のように人感センサーを2つ使います。
![IMG_20200401_114632.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/6203576c-27ca-7099-d3f4-9f0a2dc0e4d1.jpeg)

# ポイント
基本は[Vol.2](https://qiita.com/zrock/items/d86c0795e0880473ea76)のときと同じなので、そちらを参考にしてください。
ポイントは、唯一、 **人感センサーを2つペアリングして同じレイヤーに入れる** ことです。
![autolight1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/7e6a4480-35cd-77c6-11c2-6fcadb781c56.png)
![autolight2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/1bf02007-3a66-4078-a08f-64f4e6c9c0d3.png)
あとはほぼ同じです。設定内容を貼っておきます。
ライトを点けるアクション
![autolight5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/a66c0e44-a8da-4ce1-c07e-e9ed3c6ac092.png)
ライトを消すアクション
![autolight6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/ef0f0dd8-7e64-bdd6-b8cb-168ee24bc627.png)
人がいないことをチェックするアクション
![autolight7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/0b5e6c7f-5f94-9721-c2d5-0ea6ed92e4c1.png)
例外処理も忘れずに
![autolight8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e00ba572-8338-f0d2-f1ba-5c3f5823ad79.png)
そして人が来たときにライトを付けるためのトリガー。ここでレイヤーとして指定しているので、どちらの人感センサーが反応してもライトが点くようにできるんです。もし片方だけ反応させたければ送信元IDを指定することもできますけど、どちらかというとエリア、レイヤーを分けたほうが取り回しやすいですね。
![autolight3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/1bd403c9-f93f-4220-9430-1e3e42efd990.png)
人がいないことをチェックするタイマーはこちら。
![autolight4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/0a072fcb-71d5-a87f-7aec-f3d1617fa35c.png)

# 課題・・・
で、とりあえず動くようにはなったんですけど、人感センサーって設置場所がシビア。最初に書いたように、両方向から人が来ることを想定すると2ヶ所に設置しなければいけません。
2ヶ所にざっくり設置してみたものの、最初は階段中程の上部につけていたため、階段下を横切るときにもライトが付いてしまう。そこで、階段の上からできるだけ階段下で反応しないように設置しました。
すると今度は2階でトラブル。あまり家の中を晒したくはないので写真は載せませんが、2階の廊下にはトイレ＋3部屋のドアがあります。全部同じ方向に開く、もしくは内開きならいいんですけど、外開きなのでドアに人が隠れてしまってうまく認識しないことが多々。位置によってはなかなか拾ってくれないんですね。精度あげようと思うとなんだかんだであと2つくらい欲しくなっちゃう。でも、それが簡単にできるのがGravioのいいところでもあります。ただ、今回は絶妙な位置に2つだけを設置し、とりあえず使えるレベルになりそうかなということで、これでしばらく様子見ることにしました。
Wannier90ことはじめ

# Wannier90
Wannier関数を計算するコード/ライブラリ
[Wannier90](http://www.wannier.org/)

Quantum ESPRESSO, Abinit, VASP, Siesta, Wien2k, Fleur, OpenMX and GPAW等で評価したLPPの重なり $M_{b\mathbf{k}}^{b'\mathbf{k}'}=\left\langle \left .u_{b\mathbf{k}} \right| u_{b'\mathbf{k}'} \right\rangle$ からWannier関数を構成できる。
## 動的ライブラリをインストールする
wannier90 v3.1.0を例に動的ライブラリをインストールするための、手続きをフォローする。

`$(wannier_root)`に移動して、`cp ./config/make.inc.gfort.dynlib ./make.inc`でGNU makeのインクルードファイルを準備する。
他に`make.inc.gfort`もあるが、こちらは静的ライブラリしか作ってくれない。`make.inc.gfort.dynlib`はgfortranのコンパイルオプションに`-fPIC`がついているのがポイント。
intel fortranを使う場合は、`make.inc.ifort`をベースに`FOPTS`に`-shared -fpic`を追加することで、動的ライブラリ`libwannier.so`が作られる。

`make`, `make lib`, `make dynlib`で、それぞれ実行ファイル(`postw90.x, wannier90.x`)、静的ライブラリ(`libwannier.a`)、動的ライブラリ(`libwannier.so`)が`$(wannier_root)`に出来る。 
ここで、出来たライブラリの名前はlibwannier90.a, libwannier90.so<font color='Red'>**ではない**</font>ことに注意。

```bash
make install PREFIX=/home/user/opt/wannier90-3.1.0
```
で、`PREFIX`に指定したディレクトリ下に、`${PREFIX}/bin/postw90.x, ${PREFIX}/bin/wannier90.x`と`${PREFIX}/lib/libwannier.a`がコピーされる。この時、`${PREFIX}/lib/libwannier.so`は生成されて<font color='Red'>**いない**</font>ことに注意が必要。

後々の目的(abinitへのリンク [Abinitビルドの備忘録 - Qiita](https://qiita.com/Yasushi-Shinohara/items/f2baf0d2c9a91c62a440#abinit-902%E3%81%AEbuild-with-libxcwannier90-on-kubuntu-1910))の為に、まず、`libwannier.so`も、`${PREFIX}/lib`にコピーする。abinitから呼び出す際のライブラリ名の都合(*なんと、二つのコードの間で、ライブラリ名の整合性がとれて解決できていないのだ*)で、`ln -s ${PREFIX}/lib/libwannier.so ${PREFIX}/lib/libwannier90.so`で、シンボリックリンクを作っておく。

## 使い方
使ったら書く
sshconfigを分けて管理する

いろいろな環境にsshの設定は煩雑になりがちなので、設定ファイルを分けて管理できるようにする。

```config
# Include conf.d directory configs
Include conf.d/*

# Common settings
Host *
  ServerAliveInterval 120
  ServerAliveCountMax 3
  ForwardAgent yes
```

あとは `.ssh/conf.d/` にファイルを置けば勝手に読み込まれる。読み込み順はファイル名で頑張る。

# 参考

http://manpages.ubuntu.com/manpages/trusty/man5/ssh_config.5.html
Rustのslabってなんなのさ

# この記事を書いたきっかけ
Rustのコードを読んでいたら

```rust
let mut connections = Slab::new();
```

このような記述が出てきて，ここ以外でもこの`Slab`がでてきたので今日はこの`Slab`について調べて，自分なりに理解できるようにまとめてみました。

まず，`slab`クレートについて
# `slab`クレート

[公式ドキュメント](https://docs.rs/slab/0.4.2/slab/)によると，
> Pre-allocated storage for a uniform data type.

> Slab provides pre-allocated storage for a single data type. If many values of a single type are being allocated, it can be more efficient to pre-allocate the necessary storage. Since the size of the type is uniform, memory fragmentation can be avoided. Storing, clearing, and lookup operations become very cheap.

> While Slab may look like other Rust collections, it is not intended to be used as a general purpose collection. The primary difference between Slab and Vec is that Slab returns the key when storing the value.

> It is important to note that keys may be reused. In other words, once a value associated with a given key is removed from a slab, that key may be returned from future calls to insert.

`slab`は，**ひとつの型に統一されたデータのための，プリアロケートされたストレージ**のことを指しているみたいです。
型の統一されたデータを管理する際はこの`slab`を用いると，メモリフラグメンテーションを避けることができるので効率的にメモリ割り当てができるようです。

# サンプルコード

公式ドキュメントに載っていたサンプルのコードです。

```rust
let mut slab = Slab::new();

let hello = slab.insert("hello");
let world = slab.insert("world");

assert_eq!(slab[hello], "hello");
assert_eq!(slab[world], "world");

slab[world] = "earth";
assert_eq!(slab[world], "earth");
```

最初に`Slab::new()`でインスタンスを作成します。
`slab.insert()`でデータを`slab`に登録します。このときの戻り値が**key**になり，`hello`変数や`world`変数に格納されるみたいな感じです。

これが`slab`の基本的な使い方です。

## `vacant_entry` API
**key**が`insert`よりも先に欲しい場合は，`Slab::vacant_entry()`という関数を用いることができる。

```rust
let mut slab = Slab::new();

let hello = {
    let entry = slab.vacant_entry();
    let key = entry.key();

    entry.insert((key, "hello"));
    key
};

assert_eq!(hello, slab[hello].0);
assert_eq!("hello", slab[hello].1);
```

最初に`slab.vacant_entry()`から返されたインスタンスを`entry`変数に格納します。
そして`entry.key()`でまず**key**を生成しておきます。
そのあと`entry.insert()`をする際に，先に取得しておいた**key**と一緒に値をメモリに割り当てて保管します。

## `Slab::with_capacity()`

```rust
let mut slab = Slab::with_capacity(1024);

// ... use the slab

if slab.len() == slab.capacity() {
    panic!("slab full");
}

slab.insert("the slab is not at capacity yet");
```
前もって`slab`に割り当てる領域の大きさを定義しておくこともできます。
このサンプルのように，あらかじめ必要な大きさをきめておき，保管しているデータの量がキャパシティに達したら`panic!()`を実行する，ということもできます。

# まとめ
`slab`クレートは個人的に`Poll`よりもとっかかりやすかったです。
型が絞られるなら可読性の向上にもつながると思ったので，積極的に使っていきたいです。


# 参考リンク
> https://docs.rs/slab/0.4.2/slab/
> https://raskr.hatenablog.com/entry/2018/04/22/175053
> https://stackoverflow.com/questions/3770457/what-is-memory-fragmentation
> https://k-onishi.hatenablog.jp/entry/2019/07/09/223222
ssh-agentを自動起動する

vscodeのドキュメントに良いまとめがあった。
https://code.visualstudio.com/docs/remote/troubleshooting#_setting-up-the-ssh-agent

Windowsの場合、管理者権限でPowerShellを起動して以下のコマンドを実行する。

```powershell
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent
```

*nuxの場合、`.bash_profile`などに書いておく。

```bash
if [ -z "$SSH_AUTH_SOCK" ]
then
  # Check for a currently running instance of the agent
  RUNNING_AGENT="`ps -ax | grep 'ssh-agent -s' | grep - grep | wc -l | tr -d '[:space:]'`"
  if [ "$RUNNING_AGENT" = "0" ]
  then
    # Launch a new instance of the agent
    ssh-agent -s &> .ssh/ssh-agent
  fi
  eval `cat .ssh/ssh-agent`
fi
```
データの入ったテーブルに対して外部キーが設定されたカラムを追加する

# やりたいこと

foosテーブルとbarsテーブルがあったとして
barsテーブルに`foo:references`のカラムを追加したい。
**ただし、システムは運用を始めておりbarsテーブルにはデータが入っている。**

普通に

```rb:db/migrate/YYYYMMDDhhmmss_add_foo_to_bars.rb
class AddFooToBars < ActiveRecord::Migration[6.0]
  def change
    add_reference :bars, :foo, null: false, foreign_key: true
  end
end
```

で`db:migrate`しようとすると、空の`foo_id`カラムが発生してしまうため、エラーになってしまう。

# 解決策

まずは初期値を設定してカラムを追加する。
default値はfoosテーブルに存在する`id`を指定する。

```rb:db/migrate/YYYYMMDDhhmmss_add_foo_to_bars.rb
class AddFooToBars < ActiveRecord::Migration[6.0]
  def change
    add_reference :bars, :foo, null: false, foreign_key: true, default: 1
  end
end
```

次にDEFAULTの定義を残しておくと気持ち悪いので消す。

```rb:db/migrate/YYYYMMDDhhmmss_change_foo_to_bars.rb
class ChangeFooToBars < ActiveRecord::Migration[6.0]
  def change
    change_column_default(:bars, :foo_id, nil)
  end
end
```

これでデータの入ったテーブルに外部キーが設定されたカラムを追加できます。
【超初心者向け】RubyをインストールしたらRubyで遊んでみよう！！その３


※本記事はRubyがインストールされた前提の記事です。
Rubyをインストールしたあと、とにかくRubyをいろいろ触ってみて慣れていくための記事です。お役に立てば幸いです。

##環境
Ruby 2.5.1
MacOS Mojave Ver.10.14.6
##計算機としてirbと遊んでみましょう！
[【超初心者向け】RubyをインストールしたらRubyで遊んでみよう！！その２](https://qiita.com/TOMARU4400/items/74f355545981ac8184ed)の続きです。以下のようにirbを計算機のように使用してみましょう。

```irb:Tarminal
irb(main):003:0> 2+2
=> 4
```
これは 2+2 の計算結果です。次に 2*3 を計算させたい場合は


```irb:Tarminal
irb(main):004:0> 2*3
=> 6
```

ちなみにキーボードの上矢印(↑)を押せば前回入力した2*3を呼び出すこともできます。


次は3を2乗してみましょう。

```irb:Tarminal
irb(main):005:0> 3**2
=> 9
```

上記のようになれば成功です。お疲れ様でした。
【惨劇回避】GoogleChromeのブックマークを1クリックでバックアップしてみた

Chromeのブックマークが突然消えた経験はありませんか。
私はあります。幾度となく。そのたびに「ブックマークを自動バックアップしたい」と思いました。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612099/478af090-1fcc-8e93-cf7c-35bbad124247.png)
(悲劇の声が聞こえますか・・・？)

ブックマネジャーから毎回エクスポートしてもいいのですが、
なんだかスタイリッシュさに欠けるなと思いました。


そこで、エンジニアさんにソフトを作ってもらいました。


DLは下記リンクよりどうぞ。
https://web-honpo.com/chrome-backup/


ブックマーク消滅に苦しむ
全ての方が救われますように。


よかったら他の記事も読んでみてください！


あと、「もっとこうしたら？」というご意見・ご要望もお願いいたします。
tar の使い方まとめ

# とりまこれで必要十分
急いで tar しなきゃいけないときは脳死してこれを使います

## 圧縮

```shell
% tar -czf <ファイル名>.tgz <ディレクトリ名>
```
## 解凍

```shell
% tar -xf <ファイル名>.tgz
```
## 備考
寡黙なデキるヤツ

# 以下はオプション
## 最高級版
### 圧縮

```shell
% tar -cvzf <ファイル名>.tgz <ディレクトリ名>
```
### 解凍

```shell
% tar -xvzf <ファイル名>.tgz
```
### 備考
逐一報告は有り難いけどファイルが多いとちょっとうるさいかも
あと解凍時の `-z` は実は不要

## 最軽量版
### まとめる

```shell
% tar -cf <ファイル名>.tar <ディレクトリ名>
```
### ばらす

```shell
% tar -xf <ファイル名>.tar 
```
### 備考
ミニマリストにオススメ
でも圧縮後はミニマルじゃない

## 一番普通版
### まとめる

```shell
% tar -cvf <ファイル名>.tar <ディレクトリ名>
```
### ばらす

```shell
% tar -xvf <ファイル名>.tar
```
### 備考
ノーマルなタイプ

# 解説
## 各フラグの役割

```
-c: Create archive
-f: path to Files or directories to archive
-v: Verbosely show the .tar file progress.
-x: eXtract
-z: Zip
```

- `-c` は束ねる (create)
- `-x` は元に戻す (extract)
- `-f` はファイル(かディレクトリ)指定 (file)
- `-v` はあってもなくても良い報告担当 (verbosely)
- `-z` は圧縮解凍

## なんとか暗記する
- 圧縮には create で c
- 解凍には extract で x
- なんか絶対に必要なやつあったな、file の f だ
- verboseなんとかみたいなうるさい単語あったな、けどサクッとやってほしいからいらない
- どうせなら zip しとくか、z だ
- 圧縮なら create で、file 指定して、zip しよか、`-czf` だ！うん、語感も記憶と近い気がする！
- 解凍なら extract で、file 指定して、zip 解除だな、あ、解凍で z フラグ使うのはオジサンだけとかいう話聞いたことあるな笑、じゃあ要らないや、よし `-xf` だ！うん、2文字くらいだった気がする

# 免責
フラグの順序に関する宗教戦争については、一切の責任を負いかねます。
Strong Parametersでネストする場合の注意点

```ruby
params = {
  title: "タイトル",
  content: {
    header: "見出し",
    body: "内容"
  },
  author: "太郎"
}
```

みたいなパラメータをpermitしてあげるときこの順番通りに実装しようとすると

```ruby
params.permit(:title, content: [:header, :body], :author)
```

となるが、これだとsyntax errorになる
理由はネストする場合はそのネストするパラメータを最後に持ってこないといけないため。
正解はこれ

```ruby
params.permit(:title, :author, content: [:header, :body])
```
【WPF】ComboBox上でマウスホイールを回した時に項目が変わらないようにする

# 動機
ComboBoxの標準の挙動って、フォーカスがある状態でマウスカーソルを乗せてホイールを回すと選択項目が順番に変わるんですよね。
これはこれで便利なのですが、無効化したいこともあると思います。なので、その方法を。

# Stack Overflowより
[Disable MouseWheel in editable ComboBox as ItemTemplate](https://stackoverflow.com/a/37079253)
この回答でほぼ解決なのですが、微妙に惜しいと思うので改良版を作ってみました。

ちなみに、`e.Handled = true;`以下の部分は親要素にホイールのイベントを発生させています。
これがないとComboBoxの上にカーソルがある時に、ホイールで親要素がスクロールしなくなります。

# 改良版
```C#
class ComboBoxHelper : Behavior<ComboBox>
{
    public static readonly DependencyProperty IsWheelDisabledProperty =
        DependencyProperty.RegisterAttached("IsWheelDisabled", typeof(bool), typeof(ComboBoxHelper), new PropertyMetadata(false, PropertyChanged));

    public static bool GetIsWheelDisabled(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsWheelDisabledProperty);
    }

    public static void SetIsWheelDisabled(DependencyObject obj, bool value)
    {
        obj.SetValue(IsWheelDisabledProperty, value);
    }

    private static void PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var comboBox = (ComboBox)d;

        if ((bool)e.NewValue)
        {
            comboBox.PreviewMouseWheel += ComboBox_PreviewMouseWheel;
        }
        else
        {
            comboBox.PreviewMouseWheel -= ComboBox_PreviewMouseWheel;
        }
    }

    private static void ComboBox_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        var comboBox = (ComboBox)sender;

        if (!comboBox.IsDropDownOpen)
        {
            e.Handled = true;

            var parent = (FrameworkElement)comboBox.Parent;
            var args = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
            {
                RoutedEvent = UIElement.MouseWheelEvent,
                Source = sender,
            };
            parent.RaiseEvent(args);
        }
    }
}
```

# 使い方
```xml
<ComboBox ComboBoxHelper.IsWheelDisabled="True" />
```
お手軽にホイールを無効化できますね。依存関係プロパティにしているのでバインディングもできます。便利！
【超初心者向け】RubyをインストールしたらRubyで遊んでみよう！！その２


※本記事はRubyがインストールされた前提の記事です。
Rubyをインストールしたあと、とにかくRubyをいろいろ触ってみて慣れていくための記事です。お役に立てば幸いです。

##環境
Ruby 2.5.1
MacOS Mojave Ver.10.14.6


【超初心者向け】[RubyをインストールしたらRubyで遊んでみよう！！その１](https://qiita.com/TOMARU4400/items/dd863d205828f18aa25e)で表示させた"Hello World"はプログラムを書いたわけではありません。irbが最後の式を実行した結果を教えてくれているのです。出力したい場合は以下のように puts の後に "Hello World" と記述します。


```irb:Tarminal
irb(main):002:0> puts "Hello World"
Hello World
=> nil
```


Rubyで何かを出力基本的なコマンドとしてputsがあります。後に続く => nil はコマンドの評価結果です。 puts は必ず nil を返します。 nil は「何もない」ことを返すRubyの「値」です。 



上記の通りに表示されれば成功です。お疲れ様でした。
『入門 機械学習による異常検知- Rによる実践ガイド -』関連リンク（コロナ社）

#『入門 機械学習による異常検知- Rによる実践ガイド -』関連Webサイトリンク
本書を取り上げていいただいた，Web上の関連記事をまとめました。

##内容梗概
機械学習技術を使って異常検知をやってみたい人のための実用ガイドである。異常検知にかかわる技術の断片をただ羅列せず，実問題を解く上でぶつかる困難に立ち向かうための方法を体系的に解説している。
[書籍詳細ページ（コロナ社）](http://www.coronasha.co.jp/np/isbn/9784339024913/)

##ご参考いただいているリンク一覧
- [Rで異常検知(1): これまで自分がやってきたことのおさらい](http://tjo.hatenablog.com/entry/2017/01/11/190000?_ga=2.141993330.1706695102.1517557777-659869595.1514449621)
　by　はてなid:TJO（はてなブログ）

- [Rで異常検知(2): 正規分布に従うデータからの異常検知（ホテリング理論・MT法）](http://tjo.hatenablog.com/entry/2017/02/08/190000?_ga=2.133483854.1706695102.1517557777-659869595.1514449621)
　by　はてなid:TJO（はてなブログ）

- [Rで異常検知(3): 非正規データからの異常検知（カーネル密度推定・EMアルゴリズム・K-means・1クラスSVM）](http://tjo.hatenablog.com/entry/2017/05/23/190000)
　by　はてなid:TJO（はてなブログ）

- [異常検知に用いられる1クラスSVMの決定境界をパラメータを変えながら描いてみた](https://tjo.hatenablog.com/entry/2017/05/28/135918)
　by　はてなid:TJO（はてなブログ）

- [Pythonでお手軽・異常検知 [ホテリング理論編]](https://qiita.com/Zepprix/items/f6a5de2e3f6689bd2c1f)
　by　@Zepprix（Qiita）

- [入門 機械学習による異常検知 3章 を読んで](https://qiita.com/SE96UoC5AfUt7uY/items/2552633b407e4f1211d1)
　by　@SE96UoC5AfUt7uY（Qiita）

- [ローカルレベルモデルを用いた時系列データに対する異常検知](https://qiita.com/hrkz_szk/items/ea082ca07460ab8b8813)
　by　@hrkz_szk （Qiita）

- [【時系列データ】カルマンフィルターで異常検知](https://qiita.com/shinmura0/items/8c1e83636291f10e0840)
　by　@shinmura0  （Qiita）

- [Fitbitから取得した心拍データで時系列の異常検知を試してみる](http://smrmkt.hatenablog.jp/entry/2016/10/19/211631)
　by　SAM猫 (はてなid:SAM)（はてなブログ）
最速レビュー：DingTalk Lite がリリース

観測したところによると、2020年4月1日現在、[DingTalk Lite](https://page.dingtalk.com/wow/dingtalk/act/jp-download)がリリースされてます。需要は無いかも知れませんが最速レビューして見ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/d56c06e7-2d98-91e1-8e52-2139fe367cd8.png)

DingTalkクライアントは中国向けのコンテンツが多いため、中国以外の国に向けたシンプルなメニューのクライアントを用意したようです。

DingTalk Liteの対象となる国は、 **日本、中国香港、中国マカオ、オーストラリア、マレーシア**のようです。

ちゃんと、 **iOS、Android、Mac、Windows** と4種類用意されてます。

DingTalkとDingTalk Liteは、別アプリなのでどちらもインストールすることは出来るみたいです。見分け方は、Liteだとアイコンに小さくLiteと記載されているみたいです。


## 特徴

１、メールアドレスによるログインが可能
２、​万人規模のライブ配信や302名のテレビ会議に対応 ​
３、機能の現地化とより多くのユーザー体験を実現

これまでのDingTalkクライアントは、SMS（電話番号）とQRコードでのログインだけでしたが、メールアドレスによるログインが出来るようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/2723d666-8195-bb8e-d751-716854e3c49c.png)


その他、2のライブ配信機能は、これまでのDingTalkクライアントでは、中国人以外ではホワイトリスト制でした。確認してませんが、Liteではホワイトリスト許可申請が要らないのかも知れません。僕のアカウントは既に許可されているので確認出来ていません。

そして、機能をローカライズしたという事ですが、メニュー画面を見比べてみると、だいぶ減ってます。
中国向けの機能や、ローカライズが終わっていない機能をはずして、シンプルにした感じです。


<img width="961" alt="DingTalk2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/763d1ec8-7a4e-427e-834f-eef22886b514.png">

<img width="963" alt="DingTalk_Lite2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/683f1d86-ba55-2355-3168-724735a9c407.png">

左側のメニューが大きく変わっていて

ドキュメント →　会議

になっていて、左下のメニューは、カレンダーと管理メニュー以外が削られています。

そして、チームに関する考え方が難しいので、Liteでは削られているようです。

強みの1つである、電話、ビデオ会議、ライブ配信などは問題なく出来そうです。

## おわりに

今日は、DingTalk Liteのリリースについてお伝えしました。

DingTalk Liteは、個人向け、ライトユーザー向け、
DingTalk は、フル機能で法人やチームを運用したい方向け、
となっているように感じました。

[DingTalk Lite](https://page.dingtalk.com/wow/dingtalk/act/jp-download) これからはじめる人にはやはり分かりやすいと思います。試してみてください。

[DingTalk Lite Download](https://page.dingtalk.com/wow/dingtalk/act/jp-download)
Pythonで毎日AtCoder #23

### はじめに
前回
今日もCです

### #23
[ABC154-C](https://atcoder.jp/contests/abc154/tasks/abc154_c)
41diff
len(set(A))=len(A)なら全ての要素が異なるので、setするだけ

```python
n = int(input())
a = list(map(int,input().split()))

a_s = set(a)
if len(a) == len(a_s):
    print('YES')
else:
    print('NO')
```

[ABC153-C](https://atcoder.jp/contests/abc153/tasks/abc153_c)
36diff
Hをsortする。必殺技は体力が多い順に使った方が攻撃回数は減るのでH[k:]から足していく

```python
n, k = map(int,input().split())
h = list(map(int,input().split()))
h.sort(reverse=True)
ans = 0
for i in range(k,n):
    ans += h[i]
print(ans)
```

[ABC152-C](https://atcoder.jp/contests/abc152/tasks/abc152_c)
119diff
そのまま(i,j)の組を全部試すとTLEするので、最小値を更新していく。そうすると$P_j \leq P_i$を満すかどうかを判定できる。

```python
n = int(input())
p = list(map(int,input().split()))

ans = 0
for i in range(n):
    if i == 0:
        ans += 1
        m = p[0]
        continue
    if p[i] <= m:
        ans += 1
        m = p[i]

print(ans)
```
[ABC151-C](https://atcoder.jp/contests/abc151/tasks/abc151_c)
239diff
正解した問題をboolで管理する。WAはACした時に足すだけ。

```python
n, m = map(int,input().split())
ps = list(list(map(str,input().split())) for _ in range(m))

check = [True] * (n+1)
wa = [0] * (n+1)
wa_ans = 0
for i in range(m):
    if ps[i][1] == 'AC' and check[int(ps[i][0])]:
        check[int(ps[i][0])] = False
        wa_ans += wa[int(ps[i][0])]
    if ps[i][1] == 'WA':
        wa[int(ps[i][0])] += 1
ans = 0
for i in check:
    if not i:
        ans += 1

print(ans,wa_ans)
```
[ABC150-C](https://atcoder.jp/contests/abc150/tasks/abc150_c)
94diff
itertools神。$N\le 8$なので組合せを全列挙する。

```python
import itertools
n = int(input())
p = tuple(((map(int,input().split()))))
q = tuple(((map(int,input().split()))))

num = []
for i in range(1,n+1):
    num.append(i)
ans = []
for i in itertools.permutations(num,n):
    ans.append(i)

print(abs(ans.index(p)-ans.index(q)))
```


### まとめ
まだ解ける。では、また
rbenv や pyenv の "command not found" で困っている人のための解説

対象読者： Ruby・Pythonなどの初心者で、こんなエラーメッセージが出てきて困っている人

```
$ fluentd
rbenv: fluentd: command not found

The `fluentd' command exists in these Ruby versions:
   2.6.3
```

rbenv や pyenv などの、`**env` を使っていると、このようなエラーメッセージが出てくることがあります。

この問題を解決するには`**env`の仕組みを理解する必要があります。

# `**env` の仕組み

そもそも、`**env`を使っていると、このようにディレクトリを移動しただけで、`ruby`や`python`のバージョンが自動で切り替わるようになりますが、これはどのように実現されているのでしょう？

```
$ ruby --version
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
$ cd my-project
$ cat .ruby-version
2.4.5
$ ruby --version
ruby 2.4.5p335 (2018-10-18 revision 65137) [x86_64-darwin18]
```

実はここで実行している `ruby` は、本物の`ruby`ではありません！`~/.rbenv/shims/` に置かれたスクリプトなのです。

```
$ which ruby
/Users/x-xxxxx/.rbenv/shims/ruby

$ cat ~/.rbenv/shims/ruby
#!/usr/bin/env bash
set -e
[ -n "$RBENV_DEBUG" ] && set -x

program="${0##*/}"
if [ "$program" = "ruby" ]; then
  for arg; do
    case "$arg" in
    -e* | -- ) break ;;
    */* )
      if [ -f "$arg" ]; then
        export RBENV_DIR="${arg%/*}"
        break
      fi
      ;;
    esac
  done
fi

export RBENV_ROOT="/Users/x-xxxxx/.rbenv"
exec "/Users/x-xxxxx/.rbenv/libexec/rbenv" exec "$program" "$@"
```

`bundler`, `gem` などの同梱コマンドや、Gemによって追加されるコマンドも同様です。

```
$ which gem
/Users/x-xxxxx/.rbenv/shims/gem

$ which bundle
/Users/x-xxxxx/.rbenv/shims/bundle

$ which fluentd
/Users/x-xxxxx/.rbenv/shims/fluentd
```

そして、普通に`rbenv init`でセットアップすると、$PATHの先頭に`~/.rbenv/shims/`が追加されて最優先で使用されます。

# エラーメッセージが表示されるまでの流れ

`~/.rbenv/shims/`のスクリプトは**現在使用中のバージョンのRuby**内の同名のコマンドを実行しようとします。

そのため、**現在使用中のバージョンのRuby**にコマンドがインストールされていなければ、エラーになります；

1. あなたが `fluentd`を実行する
2. `$PATH`が先頭から検索され、最初に見つかる`~/.rbenv/shims/fluentd`実行される
2. `~/.rbenv/shims/fluentd`は現在のディレクトリから .rbenv-version を検索し、Rubyのバージョンを決定する
3. そのバージョンのRuby内の`flunetd`を実行しようとするが`fluentd`が見つからない（別バージョンのRubyにはインストールされているが）
4. 下記のエラーメッセージを表示

```
$ fluentd
rbenv: fluentd: command not found

The `fluentd' command exists in these Ruby versions:
   2.6.3
```

# 対策

### コマンドを絶対パスで指定する

`~/.rbenv/shims/hoge`を経由せずに直接実行します。

```
~/.rbenv/versions/2.6.1/bin/ruby
```

### $PATHの先頭に追加する

~/.rbenv/shims より先にパスを追加します。

なお、RubyやPythonにはコマンドを、（インタープリターのディレクトリではなく）ホーム直下のディレクトリにインストールする機能があります。そのディレクトリを$PATHに追加すると良いでしょう。

```
$ export PYTHONUSERBASE=~/.local
$ pip3 install --user awscli
$ ls ~/.local/bin jupyter-notebook
$ ls ~/.local/bin/
jupyter
jupyter-bundlerextension
jupyter-console
jupyter-kernel
...
```

```
# ~/.bashrc
eval "$(pyenv init -)"
export PATH=$HOME/.local/bin:$PATH
```

### rbenv init を使わない

実は `rbenv init` を使わなくても、`rbenv install` でRubyをビルドすることはできます。

人によってはビルドできるだけで十分かもしれません。

### pipenv や bundler 経由で使う

RubyやPythonのコマンドをグローバルにインストールして使うというのが、そもそもトラブルの元です。常に pipenv や bundler 経由で使いましょう。
Next.jsでsvgを使用する


# 概要
- TypeScript × Next.jsでsvgを使う

# 手順

Next.jsのリポジトリに[svgを使用する例](https://github.com/zeit/next.js/tree/canary/examples/svg-components)があります。

これを参考に[babel-plugin-inline-react-svg](https://github.com/airbnb/babel-plugin-inline-react-svg)を追加

```zsh
yarn add -D babel-plugin-inline-react-svg
```

`.babelrc` に以下を追記

```json:.babelrc
{
  "presets": [ "next/babel" ],
  "plugins": [ "inline-react-svg" ]
}
```

これでNext.js上で、svgをそのままインポートして利用できます。



しかし、Typescriptを使用している場合、次のようなエラーが出ます。

`Cannot find module './logo.svg'.ts`

これは解決するには以下の宣言を追加します。

```typescript:index.d.ts
declare module '*.svg'
```

以上で問題なくsvgが使用できるはずです。
IISでDjangoプロジェクトにあるpydファイルがインポートできない問題への対応

## TL;DR
https://qrunch.net/@sugurunatsuno/entries/wF9aXWZ3x3PBarLR
PYTHONPATHに読み込みたいpydファイルがあるディレクトリを追加する。


## はじめに
IISを使ってDjangoのプロジェクトを実行したときにpydファイルが読み込めなくなった。　　
結果として環境変数のPYTHONPATHにpydファイルを参照できるディレクトリがなかったことが原因であった。
Djangoのrunserverでの実行時にはpydファイルがインポートできていた。
IISではpydファイルのインポート以外に関しては動作する前提。


## バージョン
| OS/ソフトウェア/ライブラリ名 | バージョン |
|----|----|
| Windows | 10 |
| IIS | 10 |
| Python | 3.8.0 |
| Django | 2.2.8 |
| Cython | 0.29.15 |


## IISで設定する場合
IISかPythonのどちらかで設定できればよい。  
IISではweb.configなどで環境変数を設定できる。
セミコロンで区切って複数のパスを設定できるので、pydファイルがあるパスを追加する。

```xml
<add key="PYTHONPATH" value="project_path;pyd_absolute_path" />
```
この場合のpydファイルのインポートはPYTHONPATHを参照するため、呼び出すpyファイルからの相対パスにならない。

```python
# 相対パスで参照できない
# from pyd_relative_path import target

# PYTHONPATHに設定しているためそのまま呼び出せる
import target
```

## Python上で設定する場合
IISかPythonのどちらかで設定できればよい。  
python上でも環境変数は設定できるので、pydファイルがあるディレクトリを設定できる。

```python
import os
import sys

current_dir = os.path.abspath(os.path.dirname(__file__))
sys.path += [os.path.join(current_dir, 'pyd_relative_path')]

import target
```