OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 10 April 2018 Update の後に Guest 共有ができなくなった

# 環境
共有元：Windows10 Professional
共有先：Ubuntu 16.04

元々、Guest共有を有効にしていたもの。
本来Windows10は当初よりパスワード無しでのGuest共有はできないが、あれこれ設定して実現していた。

# エラー
Windows 10 April 2018 Update 後にエラー。
Linuxから接続しようとすると、

```

root@LATITUDE:~# mount -t cifs //192.168.42.100/201801 /mnt/201801 -o username=Guest
Password for Guest@//192.168.42.100/201801:  
mount error(127): Key has expired
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
```

と出て接続できなくなった

# グローバルポリシーエディタで設定する（これだけではNG）

http://holic.hateblo.jp/entry/2018/05/06/212551 を基に、設定してみた。しかしながらこれだけでは解決しなかった。しかしながら恐らく下記の設定と両方しないといけないのだろうが、未検証。

「ファイル名を指定して実行」で "gpedit.msc" と入力し「グループポリシー エディター」を開く。

「コンピューターの構成」→「管理用テンプレート」→「ネットワーク」→「Lanman ワークステーション」→「安全でないゲスト ログオンを有効にする」

これを「未構成」から「有効」に変更する。

しかしながらこれだけでは改善しなかった

# ユーザマネジャで設定する

あれれーと思って、共有資源上でプロパティから確認してみたら、Guestアイコンに赤×印が付いている。

![screenshot201805251.png](https://qiita-image-store.s3.amazonaws.com/0/139524/4646cd95-56c1-bc69-054f-559d72eb9516.png)

「コンピュータの管理」の「ローカルユーザーとグループ」の「ユーザー」の「Guest」を見てみると「アカウントを無効にする」にチェックが入っていた。
![screenshot201805252.png](https://qiita-image-store.s3.amazonaws.com/0/139524/561084b6-1560-d020-5719-003928ff2d53.png)

チェックを外すとOKとなった。
graphene-djangoで範囲指定検索する

## 背景
`graphene-django`で範囲指定検索したい。あまり日付指定に関するメモを見なかったので残しておく。

## 動作環境
* Python3
* django 2.0.1
* graphene-django 2.0.0
* django-filter 1.1.0

## コード
基本方針は `django_filter`を使って、`gte`, `lte`を指定するだけ。

```models.py
from django.db import models

## 対象のモデル. なんでも大丈夫
class Articles(models.Model):
    created_at = models.DateTimeField()
    title = models.CharField(max_length=128, blank=True, null=True)
    content = models.TextField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'articles'
```

```schema.py
from graphene import Schema, ObjectType, Node
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField

from . import models

class Article(DjangoObjectType):
    class Meta:
        model = models.Articles
        interfaces = (Node, )
        filter_fields = {
            "title": ["icontains"],
            "content": ["icontains"],
            # ここで"gte"と"lte"を指定するだけ
            "created_at": ["gte", "lte"]
        }

class Query(ObjectType):
    article =  Node.Field(Article)
    all_articles = DjangoFilterConnectionField(Article)

schema = Schema(query=Query)
```

## クエリ例
`createdAt_Gte`と`createdAt_Lte`を指定すれば範囲検索ができる。
両方指定するとAnd条件、片方だけ指定することもできる。

```
# 2018年2月の全Articleを取得する例
query {
  allArticles(createdAt_Gte:"2018-02-01", createdAt_Lte:"2018-02-28) {
    edges {
      node {
        title
        content
        created_at
      }
    }
  }
}
```

```
# 2月1日10時〜１８時までのArticleを取得する例
query {
  allArticles(createdAt_Gte:"2018-02-01 10:00:00", createdAt_Lte:"2018-02-01 18:00:00) {
    edges {
      node {
        title
        content
        created_at
      }
    }
  }
}
```


```
# 2018年より前の全Articleを取得する例
query {
  allArticles(createdAt_Lte:"2017-12-31 23:59:59) {
    edges {
      node {
        title
        content
        created_at
      }
    }
  }
}
```
hyperターミナルを最新ソースでbuild & run

[こちら](https://qiita.com/rspepe/items/e4be7af2be733625476b)で書きましたがhyperというターミナルをいじっています。

hyperlineというプラグインを入れたものの何故か動きませんでした。
なんでだろう？って検索するとgithubでもissueで報告されていましたがcloseされていました。

ということは最新ソースだと動作する可能性があるということで自分でビルドしてみました。

latestだと上手くビルドできなかったので2.1.1でビルド。

```
brew install yarn
git clone git@github.com:zeit/hyper.git
git checkout refs/tags/2.1.1
cd hyper
yarn
yarn run app
```

で実行したところhyperlineが動作しました。

<img width="741" alt="スクリーンショット 2018-05-27 4.04.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/250158/1b59fe28-0683-fb3e-78d8-e49b40e5713f.png">

.hyper.jsは以下の状態です。

```js:.hyper.js
  hyperline: {                                                                 
    plugins: [                                                             
      "cpu",                                                                   
      "memory",                                                                   
      "network",                                                                   
      "battery",                                                                   
      "spotify"                                                                
    ]                                                                          
  },
```

このままだとyarn run appコマンドを止めるとアプリが死ぬのでappファイルを作成

```
yarn run dist
```

dist/macディレクトリにHyper.appファイルができているのでこれをアプリケーションディレクトリにコピーしておしまい。
MongoDBのベストプラクティスのPDFを読んだメモ


https://webassets.mongodb.com/_com_assets/collateral/MongoDB-Performance-Best-Practices.pdf

掲題の通り、MongoDBのベストプラクティスのPDFを読んだメモです。

### Linuxの設定系
---

- ファイルシステムのatime設定（アクセス時間機能）を無効にすること
- WiredTigerの場合、xfsのファイルシステムがストロングレコメンド
- raid組むなら0 or 10を推奨
- LinuxのHugepageの機能はオフにすること

### Mongo系
---

- ジャーナルファイルとデータファイルを別々のストレージに保存すると、パフォーマンスアップする
  - GCPでは通常のSSDを使う場合は一緒で良いと言っています（おそらく容量によってストレージパフォーマンスが変わるため、分けないほうがコスパが良くなるのかと。）
- インデックスとコレクションを別々のストレージに保存できる
- [Zone機能](https://docs.mongodb.com/master/core/zone-sharding/)でシャーディング分割できるから、RDBMSのパーティション的なことを出来る
- directoryPerDBを使えば、DBごとに使うディスクを変更できる
- MongoDB Compassを使うとアナライズが捗るよ（自社の宣伝かな）
- WiredTigerの場合、ReadAhead（先読み）のサイズは0に設定してね
  - blockdev -setra <value>コマンドで、readaheadblockのサイズを0に設定出来る
- WiredTigerの使用可能なRAMは、デフォルト60％に設定されている
  - WiredTigerは、ファイルシステムのキャッシュが減るとパフォーマンスが低下する可能性があるから、メモリ使用量をデフォルトから上げる場合は注意すること

### アプリケーション側
---

- 配列の更新を、v3.6から強化したよ。
- ドライバは、2ヶ月に一回更新してるから、可能な限り最新を使ってね。
- MongoDBは、ドキュメントレベルでACID準拠を提供するよ。だから、すべてのデータを1つのドキュメントに保存してね。
  - 16MBがMAXサイズだから、超えそうなら仕方ないね。
- ビデオや画像などのバイナリデータを保存する場合は、GridFSの使用を検討してね。
  - バイナリデータを多数の小さな文書に自動的に格納する機能だよ。
- MMAP MAPv1エンジンを使っている場合は、ドキュメントが後から増加しないようにパディングデータを入れるなど検討してね。
  - WiredTigerの場合は、圧縮するからパディングは必要ないよ。
- 不必要に長いフィールド名は使用しないでね。WiredTigerの場合圧縮するからディスクには影響が少ないけど、RAMには影響するからね。

### 感想
---

最後のフィールド名を短縮する話だが、あまりに短い名称は、何を格納しているのか？コードまで追わないとわからないため、短すぎるのもどうかと思う。

※追記　↑に関しては、各コレクション単位で簡単なドキュメントを用意するようにすれば良いから、短いのが推奨かもと最近は思います。

あと、RDBMSやっている人ならインデックス関係とかは、すっと入ってくる内容だと思う。

マルチマスターでレプリカセット増やせば良いじゃんという、ゆるふわMongoDBだけど、ちゃんとパフォーマンスを意識した使い方をしたい。


### 追加でGCPのMongoDBの話
---

https://cloud.google.com/solutions/deploy-mongodb?hl=ja

```bash
# ■TCP キープアライブ時間を短縮する（推奨120秒）
sysctl net.ipv4.tcp_keepalive_time
sudo sysctl -w net.ipv4.tcp_keepalive_time=<value>

# ■ulimit設定（推奨設定）
$ ulimit -a

$ limit fsize unlimited unlimited    # (file size)
$ limit cpu unlimited unlimited      # (cpu time)
$ limit as unlimited unlimited       # (virtual memory size)
$ limit memlock unlimited unlimited  # (locked-in-memory size)
$ limit nofile 64000 64000           # (open files)
$ limit nproc 64000 64000            # (processes/threads)

# ■swappinessの設定変更
$ cat /proc/sys/vm/swappiness
$ sysctl vm.swappiness=1

# ■ファイルシステムは、XFSを推奨

# ■ファイルシステムのReadAhead（先読みサイズ）変更
$ sudo blockdev --getra /dev/sda1
$ sudo blockdev --setra /dev/sda1 0

# ■ファイルシステムのatime（ファイルアクセス時間）設定をオフにする
$ sudo vi /etc/fstab
...
#/dev/mapper/VolGroup-lv_root  /    ext4    defaults          1 1    ← コメントアウトして
/dev/mapper/VolGroup-lv_root   /    ext4    defaults,noatime  1 1    ← これを追記 (noatime)
...
$ sudo reboot
$ mount | grep " / "
/dev/mapper/VolGroup-lv_root on / type ext4 (rw,noatime)  ← noatimeが設定されました

# ■現在のI/O量の確認
$ iostat -xmt 1

# ■huge-pagesのオフ設定（設定値が多いので下記を参照）
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
```






### 他にも、ガイドあります（登録が必要だけど。。）
---

https://www.mongodb.com/collateral/mongodb-architecture-guide
https://www.mongodb.com/collateral/mongodb-operations-best-practices
WPF+MVVMでドラッグ&ドロップの実装

## はじめに
WPF+MVVMでリストにドラッグ&ドロップを実装するための方法です。

## 方法
実装にあたっては、MVVMの作法に則るために、コードビハインド(`xaml.cs`)には何も書きたくありません。
このためには、[GongSolutions.WPF.DragDrop](https://github.com/punker76/gong-wpf-dragdrop)を利用するのが楽です。
これは[Nugetから](https://www.nuget.org/packages/gong-wpf-dragdrop/)インストールすることもできます。

## 使い方
### View側
まず、xamlの名前空間に下記を追加します。

```C#:SampleWindow.xaml
xmlns:dd="urn:gong-wpf-dragdrop"
```

さらに、ドラッグアンドドロップをしたい `ListBox` などに対して、次のプロパティを追加します。

```C#:SampleWindow.xaml
<ListBox ItemsSource="{Binding Files}" 
         dd:DragDrop.IsDropTarget="True" 
         dd:DragDrop.DropHandler="{Binding}"/>
```

* 注意
    * `Files` は、ViewModelの定義に応じて適切なプロパティ名に変更する
    * `DropHandler="{Binding}"` は、`DropHandler` に現在の `DataContext` をバインドするという意味

### ViewModel側
ViewModel では `GongSolutions.Wpf.DragDrop.IDropTarget` インターフェースを実装すればOKです。
下記の例では、リストにzipファイルのパスを列挙する機能を実装しています。

```C#:SampleWindowViewModel.cs
using GongSolutions.Wpf.DragDrop;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;

class SampleWindowViewModel : IDropTarget
{
    public ObservableCollection<string> Files { get; } = new ObservableCollection<string>();

    public void DragOver(IDropInfo dropInfo)
    {
        var files = ((DataObject)dropInfo.Data).GetFileDropList().Cast<string>();
        dropInfo.Effects = files.Any(fname => fname.EndsWith(".zip"))
            ? DragDropEffects.Copy : DragDropEffects.None;
    }

    public void Drop(IDropInfo dropInfo)
    {
        var files = ((DataObject)dropInfo.Data).GetFileDropList().Cast<string>()
            .Where(fname => fname.EndsWith(".zip")).ToList();

        if (files.Count == 0) return;

        foreach (var file in files)
            Files.Add(file);
    }
}
```

* 注意
    * `IDropTarget` は `System.Windows.Forms` にも同名のインターフェースが存在するため、参照先を間違えないようにする
    * `DragOver` はドラッグした状態でリストにマウスオーバーしたときに実行されるメソッド
    * `Drop` は `DragOver` 状態でマウスボタンを離したときに実行されるメソッド

以上で、ドラッグ&ドロップ機能を持つ `ListBox` の実装が完了しました。

## まとめ
[GongSolutions.WPF.DragDrop](https://github.com/punker76/gong-wpf-dragdrop)を利用すれば、MVVMの作法で簡単にドラッグ&ドロップを実装できます。
cloud9での開発用webサーバの起動  2018/5/27時点

#環境
AWS cloud9
環境作成時の設定値は全てデフォルトのまま

#起動方法
cloud9がAWSに統合されてから、
webサーバの起動が楽チンになりました。

1. まずはIDEを起動

2. RubyOnRailsでアプリ開発環境作成のため、
   IDEのコンソール上で` rails new アプリ名` 実行

3. アプリが作成された場所へ移動` cd アプリ名`

4. 続いて`rails s `実行

4. 下図の様にPreview Running Applicationクリック

5. 下図に新しいタブが開き、アドレスバーをコピー、ブラウザに貼り付け！

![スクリーンショット 2018-05-27 17.21.55.png](https://qiita-image-store.s3.amazonaws.com/0/260257/7f30ef73-5f61-18ca-1475-99688b8dfb62.png)

下記の画面が見れたら完了！

![スクリーンショット 2018-05-27 17.26.01.png](https://qiita-image-store.s3.amazonaws.com/0/260257/1ce6ac17-6dbe-364f-5f8f-2b860f7915ab.png)
dialogflowをV2 APIにしたらWebhookのレスポンスで文字化けに遭遇した話。

# 問題概要
DialogflowでV2 APIが公式になったということでV2 APIに切り替えたら、Webhookからのレスポンスが文字化けするようになりました。

![mojibake.png](https://qiita-image-store.s3.amazonaws.com/0/233144/3f3226fe-58c5-4a69-5108-a9f3474410f0.png)

# 構成
Google Assistant → Dialogflow → AWS API Gateway → AWS Lambda

# 解決
Lambdaで設定するレスポンスのヘッダに"charset=UTF8"を追加したら解決した。[^1]

[^1]: なお、API Gatewayの設定でヘッダに追加してみても解決できず、原因を見つけるまでに随分時間がかかってしまった。


```javascript:Lambdaのindex.js(before)
    var response_json = {
        fulfillmentText:"こんにちは"
    };
    var response = {
        statusCode: 200,
        headers: { "Content-type": "application/json" },
        body: JSON.stringify(response_json)
    };
    context.succeed(response);
```

```javascript:Lambdaのindex.js(after)
    var response_json = {
        fulfillmentText:"こんにちは"
    };
    var response = {
        statusCode: 200,
        headers: { "Content-type": "application/json; charset=UTF-8" },
        body: JSON.stringify(response_json)
    };
    context.succeed(response);
```

![mojibaketenai.png](https://qiita-image-store.s3.amazonaws.com/0/233144/a03038f0-3cd5-41fc-77b7-24b35076901c.png)
RPROMPT（の表示を）を消す [簡易]

# 環境

- Mac
- zsh
- homebrew

# 問題
<img width="269" alt="スクリーンショット 2018-05-27 16.24.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/23248/b20b4fcf-b3a0-912e-9027-83e1522f3e8d.png">

`git`管理しているディレクトリだとデフォルトでプロンプト右側に表示されるっぽいやつ「 **(git)-[master]** 」
これがあるとコピペの際にいちいち文字列を消して整形する手間がかかり面倒。とてもメンドイ。

なので

- `RPROMPT`に何も表示させない
- gitプロジェクトの際は認識できるように`PROMPT`に表示させる
- `zsh`シェルで

ということをしたい。


#作業
[gitの状態表示用プラグイン](https://github.com/olivierverdier/zsh-git-prompt)を入れる（**見栄え**の問題なので正直これは無くても良い）

```zsh
brew install zsh-git-prompt
```

`.zshrc`に`RPROMPT`の設定を追記。
（何も表示しないように空白を設定）

```~/.zshrc
RPROMPT=''
```
あとは`PROMPT`の表示を設定。
`$(git_super_status)`は、~~gitプロジェクト以外のディレクトリでは
何も表示されない。~~
→ いつの間にか`(:|✔)`みたいなデフォルト表記が表示されるようになってました。。。

（下記の設定は簡易なので、好みの設定に`$(git_super_status)`を追記する形で適宜組み合わせる）

```~/.zshrc
source "/usr/local/opt/zsh-git-prompt/zshrc.sh"

PROMPT='$(git_super_status)'
```

---

ちなみに当たり前だが、プロンプト系の設定は
`.zshrc`の最下部に来るように記述しないと反映されない可能性があるので注意。
（`PROMPT` `RPROMPT` の**他の記述と比較して最下段に**来るように記述する。他の設定記述の方が下に来ると今回設定したものが上書きされてうまく反映されない場合があるので）

#結果
コピペが楽になった。


#参考
>[zsh-git-prompt を使って git リポジトリの状態を表示する方法 | IssueOverflow](https://issueoverflow.com/articles/2017/03/14/how-to-display-the-repository-status-with-zsh-git-prompt/)
[カレントディレクトリがGitリポジトリ下か否か判定する - すぎゃーんメモ](http://memo.sugyan.com/entry/20120323/1332507609)
[zshの設定ファイルの読み込み順序と使い方Tipsまとめ](https://qiita.com/muran001/items/7b104d33f5ea3f75353f)
[zshでログイン・ログアウト時に実行されるファイル](https://qiita.com/yuku_t/items/40bcc63bb8ad94f083f1)
オフラインリアルタイムどう書く E24 の実装例（速いやつ）


問題 : http://nabetani.sakura.ne.jp/hena/orde24tancho/
実装リンク集 : https://qiita.com/Nabetani/items/928d6a94d83c21ef64d7

で。

腕力版 https://qiita.com/Nabetani/items/e979f3575f82916960c6 とは違って、だいぶ速いやつを。

まずは、会場で示したまあまあ速いやつ。
まあまあ速いけど、 ciel さんの示した( https://qiita.com/Nabetani/items/928d6a94d83c21ef64d7#comment-a5648154dce0a67301e4 ) 100 番目のテストデータは無理。

```ruby:ruby
require "benchmark"

def inc(dig, b)
  if dig[0] < b-1
    return [dig[0]+1] + dig[1..-1]
  end
  if dig==[b-1]
    return b==2 ? nil : [2,1]
  end
  head = inc(dig[1..-1], b-1)
  return nil unless head
  [head[0]+1]+head
end

def undigits(dig, b)
  r=0
  dig.reverse.each do |d|
    r*=b
    r+=d
  end
  r
end

def nextnum( num, b )
  dig = num.digits(b)
  nn = inc( dig, b)
  nn && undigits(nn, b)
end

def impl( b, n )
  num=1
  (n-1).times do 
    num = nextnum( num, b )
    return nil unless num
  end
  num
end

def solve(src)
  b,n = src.split(",").map(&:to_i)
  impl( b, n )&.to_s(b) || "-"
end

if $0==__FILE__
  DATA.each do |s|
    num, src, expected = s.split(/\s+/)
    actual = nil;
    tick = Benchmark.realtime{ actual = solve(src) }
    res = actual == expected ? "ok" : "***NG***"
    p [ res, num, src, actual, expected, "%.3f" % tick ]
  end
end

__END__
0	16,333	38e
1	2,100	-
2	2,1	1
56	36,44811	abpu
```

「次の単調増加数」という計算が簡単にできるので、それで一つ一つ進めるという実装。
「次の単調増加数」は「`inc`」で、再帰呼び出しになっている。

ruby には `digits` という便利関数があって今回も役に立っているんだけど、逆関数がないのがちょっと不便というかなんでないんだよ、という感じ。

これだけだと出題者としてはちょっとしまらないので、もっと速いのを書いた。
これなら 36進数までならどんなに大きな数でも終わる。

```ruby:ruby
require "benchmark"

# 階乗
def fact( n )
  return 1 if n<2
  n * fact(n-1)
end

# num 種類の数字を使った keta 桁の単調増加数の個数
def count(num, keta)
  return 0 if num<keta
  fact( num ) / fact(num-keta) / fact(keta)
end

# keta 桁の単調増加数の中で、 t+1 番目
def find( b, keta, t )
  return (t+1).to_s(36) if keta==1
  (1..(b-keta)).each do |head|
    tail_d = b - 1 - head
    c = count(tail_d, keta-1)
    if c<=t
      t-=c
    else
      tail0 = find(tail_d+1, keta-1, t)
      tail = tail0.chars.map{ |c| (c.to_i(36)+head).to_s(36) }.join
      return head.to_s(36)+tail
    end
  end
end

def impl( b, m )
  t = m-1
  (1..(b-1)).each do |keta|
    c = count( b-1, keta )
    if c<=t
      t-=c
    else
      return find( b, keta, t )
    end
  end
  nil
end


def solve(src)
  b,m = src.split(",").map(&:to_i)
  impl( b, m ) || "-"
end

DATA.each do |s|
  num, src, expected = s.split(/\s+/)
  next unless expected
  actual = nil;
  tick = Benchmark.realtime{ actual = solve(src) }
  res = actual == expected ? "ok" : "***NG***"
  p [ res, num, src, actual, expected, "%.3f" % tick ]
end

__END__
0	16,333	38e
1	2,100	-
2	2,1	1
56	36,44811	abpu
100	36,30000000000	134689bdefhijkrstuwyz
```

ruby なので、オーバーフローを気にしなくていいのは楽だね。36の階乗とか平気で計算できる。

戦略としては。
1. まず桁数を決める。
2. 頭の数字を決める ( `find` の `head` )
3. 残りの数字を `find` で決めて、頭の数字の後につなげる
という感じ。 

書くまでは面倒になりそうだと思っていたんだけど、意外に短くなった。
form_forにおいて、データベースにある項目から選択させる。

form_forにおいて、カテゴリを選択させる場合、ユーザーは既存のものからカテゴリを選ぶと言う行為をします。その場合、すでにあるCategoryモデルからひとつを選ばせたいと言うわけですが、そのための方法をまとめました。

ズバリ、collection_selectメソッドを使いましょう！！

view

```ruby:new.html.erb
<%= form_for(@post) do |f| %>
   <%= f.label:title %>
   <%= f.text_field:title %>
   
   <%= f.label:content %>
   <%= f.text_field:content,size:50 %>
   
   <%= fields_for :category ,(@categroy) do |category| %>
   
   <%= category.label:category %>
   <%= category.collection_select :category, Category.all, :id, :category %>
   
   <% end %>
   
   <%= f.submit "提出する" %>
   
   
   
   <% end %>
```

これは少しややこしくなっていますが、注目すべきは

```ruby:new.html.erb
   <%= fields_for :category ,(@categroy) do |category| %>
   
   <%= category.label:category %>
   <%= category.collection_select :category, Category.all, :id, :category %>

```

上記のところです。HTMLにすると下記のようになります。

```Html

<label for="category_category">Category</label> 
 <select name="category[category]" id="category_category">
<option value="5">Ruby</option> 
<option value="6">Html</option> 
<option value="7">bootstrap</option> 
<option value="8">学習法</option></select> 
```
collectionメソッドのリファレンスは下記です。
collection_select(オブジェクト名, プロパティ名, オブジェクトの配列, value属性の項目, テキストの項目 [, オプション])

ここで言うと、fields_forの下にあるので、すでにオブジェクト名は不要です。よって、プロパティ名の設定ですが、上記だと間違ってます（これでもいけるかもですが)。実際に渡したいのは、idのところなので、select nameもcategory[id]となるのがbestですよね。

そこで、

```ruby:new.html.erb
   <%= fields_for :category ,(@categroy) do |category| %>
   
   <%= category.label:category %>
   <%= category.collection_select :id, Category.all, :id, :category %>

```

```Html

<label for="category_category">Category</label> 
 <select name="category[id]" id="category_id">
<option value="5">Ruby</option> 
<option value="6">Html</option> 
<option value="7">bootstrap</option> 
<option value="8">学習法</option></select> 
```
に変更しました。プロパティ名とは、formで送る箱の中でのプロパティって意味です。
今回だと、[:category]という箱の中で、どの配列に入れて送るかということでした。

次に選択肢に関する配列を渡してあげます。今回でいうと、Categoryモデルにある配列ですね。その中から、渡す項目と表示させる項目を選ぶイメージです。
今回でいうと、categortyプロパティを表示させて、実際にPostで送る際はidを送りたいので上記のような順番になりました。

```
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"cIqdAA0MBoYcwzFPItmGZ21tLFdxsJB2lWmkNYQccn7rg8uhO/xImAA1h8+rf4/XC7KtEx4WBdmislBNzcsdcddA==", "post"=>{"title"=>"vf", "content"=>"vffv"}, "category"=>{"id"=>"7"}, "commit"=>"提出する"
```

パラメーターでは、実際に[:category][:id]->7が送られていますね。面白い。
実際の選択肢は下記になります。

![スクリーンショット 2018-05-27 16.15.56.png](https://qiita-image-store.s3.amazonaws.com/0/255589/9377b30f-6323-d8f8-b30a-10b4b11244fa.png)

このようにして、
1.選択肢と実際に送る値を変更できる
2.collection_selectによって、選択肢をデータベースから引っ張れる

ということでした。
以上です。
個人開発者におすすめ　さくらVPSとLXDを使ったコンテナ運用

# ご注意いただきたいこと
- 個人で行っている趣味レベルサービスで運用している構成となります。業務で運用している構成などではないので、ご了承ください。

- 構成についてお話していますが、実際に構築する手順は書いていません。 需要ありそうなら書いていこうかと思います。

- カッコいい自動デプロイとかオートスケーリングとかの話はありません。。。

# VPSでLXD使うと、便利だよ！というお話です
個人でサービス立ち上げるとき、、、
・AWSで立てるほどでもない……
・だけどRedisとかいろいろミドルウェアがほしい……
なんてことがあるかと思います。（私だけ？）

そんなとき、VPSを借りていると自分でなんでも入れられるので便利なのですが
「１サービスに１VPS使っていると、お金が……」ということになってしまいます。
そもそもとりあえず作ってみたサービス毎にVPS借りるなんてできません。

そこで登場するのがLXDです。

# そもそもLXDって？
## LXD（https://linuxcontainers.org/ja/lxd/introduction/）
> LXD は次世代のシステムコンテナマネージャです。 仮想マシンと同じようなユーザ体験を提供しますが、仮想マシンではなく Linux コンテナを使います。

LXDを使うことで１ホスト内にサービスを集約でき、「CPUやメモリといったリソースを無駄なく利用することができる」というメリットが得られます。
（同時にホストが落ちたとき、サービスがまるっと落ちるというデメリットもありますが）


コンテナならDockerもありますが、Dockerの「アプリケーションコンテナ（１コンテナ１プロセス）」に対して、LXDは「システムコンテナ」です。
１コンテナに１プロセスでも良し、１コンテナにNGINX+PHP-FPM+MYSQL+REDISとまとめても良しと自由にできます。
（Dockerでもまとめることができますが、Dockerの思想から外れてしまいます）

DockerとLXDの違いについて、まとめてくださっている方がいらっしゃいました。
（https://qiita.com/takaaki_kurihara/items/41bfc2b3253eb8b6a98e）

# 構成図
今運用しているの構成図です。
![2018-05-27_141819_2.png](https://qiita-image-store.s3.amazonaws.com/0/108431/327b1df0-4f6c-a28b-7d2a-3de9c4ab4a0a.png)


## LBホスト（nginx）
スペック：さくらVPS メモリ512MB SSD 20 GB 1仮想コア
OS：CentOS7

ロードバランサと書いていますが、実際のところ各LXDサーバ内のコンテナ（サービス）に振り分けるだけのリバースプロキシです。
コンテナサーバを外部にそのまま公開しちゃうのは不安……と思い利用しています。
SSL証明書もこのLBホストに集約されています。
（LXDホストを2台用意して、それぞれに同じコンテナ立ち上げて負荷分散みたいなこともできます）
LXDサーバ内にnginxサーバ立ち上げて利用、でも問題ないと思います。

なお、振り分けはサブドメインを利用して行っています。

## LXDホスト
スペック：さくらVPS メモリ 2GB HDD 200 GB 仮想3コア
OS：Ubuntu16.04

今回の本題、LXDが稼働するサーバです。
ここにいろんなサービスを載せます。


# サービス立ち上げまでのざっくりした流れ

- アプリケーションコード書く
- LXDコンテナを立ち上げる

```
lxc launch ubuntu:16.04 new_service
```
- 作成したコンテナの中に入って環境構築（内容はシステムに応じて。 PHPならPHPインストールなど）

```
lxc launch new_service bash → 指定したコンテナにbashでログインします
```
- WEBサーバから作成したコンテナへのプロキシ設定を行う（→これで外部にシステムが公開される）

# 実際にどう使っている？
先程の構成で以下のサイトを運営しています。（航空系趣味のサイトです）

- https://status.sora-riku.com

※その他にも（非公開ですが）ZabbixやJenkins、身内だけで運営しているMastodonなど。。。

# まとめ
## メリット
- サーバの高集積化。余ってしまうリソースを有効活用することができる
- サービスが大きくなってきたら新しいホストを借りて、コンテナを移行と柔軟な対応もできる
- 不要になったサービスのコンテナはすぐに消してリソース開放することができる（しかもホストは汚さない）

## デメリット
- １ホストに複数サービスが集まるので、特定のサービスにアクセスが集中してしまうと他のサービスにも影響が出る
- ホストが止まるとすべてのサービスが停止してしまう
- 完全な仮想化ではないため、LXD特有の不具合が発生してしまう可能性もある

# 最後に
初めてまともに自分のやっていることをアウトプットしているので、うまく伝わる記事になっているかは不安ですが。。。
LXDも便利だよ！というのが伝えられるよう今後も記事を増やしていきたいと思います。
ccxtのbitmex.fitchtickerが使えない時の代用コード

#fitchtickerの代用

ccxtでbitmex.fitchtickerを使おうとしたらエラーが発生した。
どうやら最近bitmexの仕様変更で使用できなくなったらしい
**※Bitmex TestNetではなぜか使用可能**

そこでCryptoWatchのAPIを使用した代用コードを書いてみた

```python:fitchticker.py
    r = requests.get("https://api.cryptowat.ch/markets/bitmex/btcusd-perpetual-futures/price")
    ticker = r.json()["result"]["price"]
```


これで最新の価格が取得できる
ただCryptoWatchは反映が遅いので速度を求めるトレードには向かない
nvm-windows でwindows上のnode.jsのバージョンを切り替えて利用する

# そもそも

Firebaseを使いたいのだが、Cloud functionsが対応するNode.jsが「v6.11.5」だった。

![2018-05-27_11h13_06.png](https://qiita-image-store.s3.amazonaws.com/0/133291/88d89cea-2be5-8ef1-b02a-bdbac10dfb38.png)


※画像は2018/05/27現在
※参考URL: https://cloud.google.com/functions/docs/writing/

新しもの好きの人は、「v8」を使っていて、こちらでアプリ開発もしているだろうから、わざわざ入れ替えるのは面倒というもの。

そうすると切り替える方法があるだろうなぁ。。。。ということで、
「node.js windows バージョン 切替」でぐぐってみたら 
nodelist( https://github.com/marcelklehr/nodist ) が人気みたいで出てくる。

インストーラーを落とそうとする、古い古い古い！！！
![2018-05-27_11h19_41.png](https://qiita-image-store.s3.amazonaws.com/0/133291/2b58106c-c0a9-460e-5fef-03bf7e1cfb90.png)


しかも、メンテナーを探しているとか(汗)
![2018-05-27_11h18_37.png](https://qiita-image-store.s3.amazonaws.com/0/133291/666cfb70-c8e6-e8e5-1e1f-cd8d90308e0e.png)

気を取り直して「node.js windows version change」と英語でぐぐってみたら、
「nvm-windows( https://github.com/coreybutler/nvm-windows )」がでてきました。

こちらは、最新リリースが2017年5月31日で、3ヶ月前にも更新がされているのでメンテナンスが生きているみたい。

![2018-05-27_14h46_01.png](https://qiita-image-store.s3.amazonaws.com/0/133291/ac33e81a-2f88-554c-8d62-3f20aca63798.png)

![2018-05-27_15h23_20.png](https://qiita-image-store.s3.amazonaws.com/0/133291/42048c71-5a6e-7157-4836-8cab6ce305b8.png)

# nvm-windowsのインストール

ダウンロードサイト： https://github.com/coreybutler/nvm-windows/releases
![2018-05-27_15h26_19.png](https://qiita-image-store.s3.amazonaws.com/0/133291/fb945569-941c-e7bb-6e9e-8f5275ca227e.png)

nvm-setup.zipをダウンロードして展開すると、「nvm-setup.exe」がでてきます。
これダブルクリックしてインストールします。


インストール手順の中で、node.jsをインストールするフォルダを指定します。
そして、すでにnode.jsがインストールされている場合は、それをnvm-windowsの管理下に置くかを確認してきます。

![2018-05-27_15h28_16.png](https://qiita-image-store.s3.amazonaws.com/0/133291/0e28c691-e800-fe6d-ec7d-3e6596da09d4.png)


# インストール確認

コマンドプロンプトまたは、PowerShellを起動します。私はPowerShellを起動しました。
nvmとうつと、バージョンとヘルプが表示されます。
※古い記事だと、パスを通すとかあるけど、最新だとインストーラがよしなにしてくれるみたいです。

![2018-05-27_15h38_58.png](https://qiita-image-store.s3.amazonaws.com/0/133291/c49bbc59-ae64-b540-a216-fc7d953d63c9.png)

きちんとインストールされたようです。

# 使い方

## ヘルプ

```bash
nvm
```
# インストール済みのnode.jsを見る
```bash
nvm list
```
すると、以下のようにインストールされたnode.jsのバージョンと、選択されているバージョンが表示されました。
![2018-05-27_15h43_19.png](https://qiita-image-store.s3.amazonaws.com/0/133291/f685c9e4-28f8-d9d7-70b3-19e137341f9e.png)


# Firebase対応のバージョンのnode.jsをインストールする

```bash
nvm install 6.11.5
```
こんな感じでインストールされました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/133291/2e68fd5b-0e01-759e-162f-2f42a0d501e9.png)

# node.jsのバージョンを切り替える

```bash
nvm use 6.11.5
```

PowerShellを管理者モードで起動していませんでしたので、
2回ほど、アプリのインストール時に表示されるようなUACの確認ダイアログが表示されました。
その後、切替完了の表示がされました。
※UACが聞いてくるのが嫌な人は、コマンドプロンプトやPowerShellを管理者モードで起動しましょう。

![2018-05-27_15h57_08.png](https://qiita-image-store.s3.amazonaws.com/0/133291/bb3a73b3-9632-e0da-9359-4e8b4ff67feb.png)

node.jsのバージョンもきちんと変わっていますね。
Google I/O 2018で聞いたFlutter関連の質問

Google I/O 2018でOffice HourやAsk FlutterのブースでGooglerに事前募集した質問を聞いてきたのでそれの質問及び回答メモです。

## Q&A
- Q. ReactNativeのCode Pushのような機能を実装する予定はありますか？
    - A. 需要が多ければ実装することも検討します。
- Q. いつ頃Stableになりますか？
    -  A. 来年予定です。
- Q. 「Flutter for iOS devs」のドキュメントはありますか？
    - A. 作成予定です。ほとんど出来ています。
        - 5/22に公開されました
        - Doc: https://flutter.io/flutter-for-ios/
        - PR: https://github.com/flutter/website/pull/993
- Q. Googleが公式に提供しているモバイルアプリでFlutterで開発された実績、もしくはその計画・予定はありますか？
    - A. はい、AdSenseはFlutterで作っていています。また、まだ公開していないアプリに関してもいくつかFlutterで作っているものがあります。
- Q. React NativeにおけるExpo相当つまりダイナミックなコードローディングを前提とした汎用のFlutterアプリプレイヤーは実装できますか？
    - A. 現時点ではそのような機能を作る予定はありません。
- Q. AndroidのFlutterアプリ実行系でJavaでホストしないコンフィグレーションが登場する可能性はありますか(ライセンス係争などの関係でAndroidからJava APIを完全に除去しなければならない状況を想定していますか)
    - （聞けませんでしたmm）
- Q. android architecture components の用な フレームワークの提供の計画はありますか？
    - A. いくつかライブラリがあるが公式で提供するようなものは今のところありません。
- Q. flutter_reduxを使用するとWidgetがStatelessになるが、利用する際に懸念はないか？Flutterの今後のバージョンアップで問題は発生しないか？
    - A. 問題ないです。
- Q. https://github.com/google/flutter_flux が存在したり他ではflutter_reduxなど色々なアーキテクチャが提案されているが、flutterアプリ開発におけるおすすめなアーキテクチャはあるか？
    - A. 個人的におすすめなのはReduxです。 https://github.com/brianegan/flutter_architecture_samples が参考になります。

## リンク
- 質問募集ツイート: https://twitter.com/rkowase/status/991214389175840768
- 質問フォーム:  https://docs.google.com/forms/d/e/1FAIpQLSfRlApWWDtCkaqyxJGCSnHBoNV8OeHAChLAgUhnI2tsKKy95g/viewform
- 質問一覧: https://docs.google.com/spreadsheets/d/1OH7XMNxNLi3dY9ACK2tqN2QRAtG6mNp6jvEN90FWQk8/edit#gid=923029485
高専生がPC NETの閉店セールで朝5時半から並んで買ったノパソにUbuntuを突っ込んで遊んだ話

# 単なる日記です
去る2018年の5月20日に秋葉原のジャンク屋で6000円で2012年ぐらいのダイナブックを買って自分がどう使ったか、使おうとしているかということを初投稿がてらメモも兼ねたものです
・どうして買おうと思ったのか
　　Linux環境を手元に安価に構築したかったから.
・なんで仮想マシンにしなかったのか
　　手持ちのノートPCがお世辞にもハイスペックとは言えず実際動かしたら重かったから

でPC NETのジャンク通り店の最終日である5月20日に朝5時半から並んで11時開店と同時に入店しACアタプタ付きだったこれを買いました。

#買ったPCの概要
TOSHIBA dyna book R731/C 6000円　＋PC3-10600 8GB 1700×2円に換装
![Screenshot from 2018-05-27 14-59-34.png](https://qiita-image-store.s3.amazonaws.com/0/232732/74800fa2-cfe1-fc0c-e8a7-d1645bc20d10.png)
図1.1 スペック
まあまあだなあと言った所ですね.ツイッターやらgccでカチャカチャするぐらいなら十分使えます.

・なぜubuntu 16.04LSTなのか
 たまたまUSBメモリにisoがライティングされていたというのもありますがもっとも普及しているバージョンであることからこれでいいかなと思った

#買ってからやったこと
・apt-get update ,apt-get upgradeを一通りやった
・vim,nano(プリインストールだった）,emacsあたりを入れた
・VS codeも一応突っ込んだ
・gnu plotやngraphとかのグラフ環境も整えた

これぐらいやればあとはプリインストールのソフトでわりとなんでもできます
あとは好みでスカイプとかのSNSアプリを導入するあたりが地味なハードルですが
ググればわりと出てきます.
まあUbuntu導入系の記事はめちゃくちゃもっと詳しいのがたくさんあるのでそちらを見たほうがためになると思います．

・これからする予定のこと
・Latex環境の構築　これが一番大変だと思う
#学生がジャンクノートを買う際の簡単な心構え
・ACアタプタの有無を確認する.
・キーボードが打てるかどうかを軽く確認する
・バッテリーを考慮する（保つかどうかだけではなく互換品が入手可能かどうか）
・学校の課題や実験がどんなものか必ず把握しておく.

最後の学校の課題がなんの関係があるんだよと思われるかもしれませんが学校においてノパソが一番活躍するシーンはレポートや実験です,ミスマッチをやらかすと大爆死します.

・よくある死亡例
・実験でVS2015を使って実験しているのにMacbookを買ったのでわざわざ仮想環境でWinを動かしてやっている
・イキってゲーミングノートや15型ノートをスペックだけ見て買ったら重くて持ってくるのが辛い
・糞高いWordやExcelがプリイントールされたノパソを買ったが実際はlatex必須だった
・なんかタブレットPC買ったら画面部ばっか重くてめちゃくちゃバランスが悪くて膝の上で作業しずらい

このような残念な死亡例は高等専門学校においては非常によくみられます注意しましょう.

　具体的なレポート用PCとして個人的におすすめなのは13型のワイドモニターを保つIntel 第二世代以降のCoreiアーキテクチャかつRAM 4GB以上のノパソです。
有名なところではThink pad x240,220あたりでしょうか
 OSは場合によりますがlatexやGドキュメントなどをメインで使うならLinuxでも無問題ですが
Officeをメインで使わされる場合は互換性の面でWinのほうが無難かもですね.


こんな所でしょうか。
高専生がレポートを書く程度なら何万もするようなペラペラの最新鋭PCは無用です.親に買ってもらえないというお悩みの全国の学生のみなさん中古PCも検討してみましょう。
　ただボッタクリPCも多く存在します、ヤフオクやメルカリなどのC to C取引の相場をリサーチしつつ自らの要求定義とコスパをすり合わせながらいいのを見つけてみてください.
Windows10でReactNative環境を構築する

まずPowerShellを起動
実行ポリシーを変更し、パッケージマネージャとしてscoopをインストール

```
set-executionpolicy unrestricted -s cu
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```

最新版のnodejsをインストール

```
scoop install nodejs
```

お好みでyarnをインストール

```
scoop install yarn
```

react-nativeをインストール

```
npm install -g react-native-cli
```

プロジェクトを作成

```
mkdir react-native-project
cd react-native-project
react-native init FirstProject
```

JDKをインストールしていない場合はOracleのサイトからダウンロードするか、
以下の手順でインストール

管理者権限でPowerShellを立ち上げ直してchocolateyをインストール

```
iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex
```

JDKをインストール

```
choco install jdk8
```

Androidアプリのビルドに必要なパスを通す

ユーザー環境変数に以下を追加
※パスは自身の環境によって書き換えてください

JAVA_HOME
C:\Program Files\Java\jdk(バージョン)

ANDROID_HOME
C:\Users\ユーザー名\AppData\Local\Android\sdk

別ターミナルを立ち上げてサーバーを起動

```
cd FirstProject
npm start
```

実機またはエミュレーターを接続して起動

```
react-native run-android
```

ホットリロードを有効にする場合は、
Androidならエミュレータ上でCtrl+Mを押すor実機ならアプリ起動状態で端末を何回か振るとポップアップメニューが表示されるので、Enable Hot Reloading を選択すると、ホットリロードされるようになる。
OpenCVで画像処理してたら実行中の途中で、OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor,みたいなエラーがでた場合

<h1>何が起こったか</h1>
フォルダの中の画像全てを対象に、画像処理のプログラムをいつも通り実行したら何枚か実行中に途中で
「OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor,」とエラーがでた。
途中でエラーがでるってどういうことなんですかねぇ、、、って思いました。

ググったら色々記事が出たが、私の場合の解決方法とはならなかった。

プログラムの部分には問題はないはず、、、って思ってフォルダの中とか色々見てたら、気づいてしまった。
それは、、、

<img width="421" alt="スクリーンショット 2018-05-27 15.18.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/179803/cf77a3af-614f-ff1f-36de-d48fd3137928.png">

処理対象の画像の中に、一枚だけ壊れている画像があった。
プログラムの実行中に途中でエラーがでた原因がこれではっきり納得できた。
なので、自動収集した場合、問題のある画像があるかどうかを意識する

この画像を取り除いたら、うまく最後まで処理できました。

なので、プログラムの実行途中にこのエラーがでた場合は、これも原因の一つかもしれません。
WordPressをGitで管理

サイト全体をWordPressで管理することは多いですが、その内容をGitで管理しようとすると

・WordPressのコアファイルも管理対象になり、リポジトリが巨大になる
・管理画面からWordPressをアップデートすると、リポジトリとの内容に差異ができる

という問題があります。
よって自作テーマ部分のみ管理するといいですが、その際の `.gitignore` の書き方をメモ。

```
Thumbs.db
.DS_Store

/wp-config.php
/.htaccess
/.htpasswd
/index.php
/license.txt
/readme.html
/wp-*.php
/xmlrpc.php
/wp-admin/*
/wp-content/*
!/wp-content/themes
/wp-content/themes/*
!/wp-content/themes/sample
/wp-includes/*
```

これで `sample` テーマのみをGitで管理できます。

もしくはもっと単純に、/wp-content/themes/sample 内がルートフォルダになるようにGit管理するのもアリだと思います。
中小規模のWordPressサイトは、クライアントが管理画面からテーマを編集することも多いので、あまり厳密な管理を目指しても徒労に終わることが多いです。
サイトの規模によっては、テーマのみ適度に緩く管理するほうがスムーズに進められると思います。
Rails5の勉強 : render textについて

#**注意:この記事はガチの初心者がとりあえずの解決法を書いてるだけです．参考にはなりませんからね**

これくらい堂々と注意書きすれば大丈夫でしょう．
以下の記事はRuby2.5.0,Rails5.2.0での話です．

#1. 今回のエラー
パラメータの取得について勉強しようと思ったので，「名前をパラメータで取得して返答する」という簡単なやつから始めたよ．一瞬で躓いたよ...

Lesson_Controller.rbで以下の記述をしてブラウザでアクセスしたよ．

```ruby:Lesson_controller.rb
class LessonController < ApplicationController
  def step1
    render text: "こんにちは，#{params[:name]}さん"
  end
end
```

routes.rbにも記述は加えてあるよ．

```ruby:routes.rb
Rails.application.routes.draw do
  #中略
  get "lesson/:action(/:name)" => "lesson"
  #中略
end
```

アクセスしたURL
`http://127.0.0.1:3000/lesson/step1?name=Floym`

期待した返答
`こんにちは，Floymさん`

結果
`Template is missing`

#2. 原因
参考にしている本がRails4.2で書かれているので，バージョンで変わってしまったと推測する．
[こちら](https://qiita.com/kenchan0130/items/f5ae55a6e23268238a44)を参考にしました．やっぱりバージョンが上がったことで非推奨になったみたい．

#3. 変更
以下のように変更したよ．

`render text`を`render plain`へ

```ruby:Lesson_controller.rb
class LessonController < ApplicationController
  def step1
    #render text: "こんにちは，#{params[:name]}さん"
    render plain: "こんにちは，#{params[:name]}さん"
  end
end
```

#4. 結果
無事に返答がきました！
`こんにちは，Floymさん`
Pytorch test時にメモリが溢れてしまう

学習したネットワークにtrain時より大きなデータ(画像等)をtest時に投入するとメモリが溢れてしまうことがある．

## TrainとTestについて
pytorchではtrain時，forward計算時に勾配計算用のパラメータを保存しておくことでbackward計算の高速化を行っているらしい．
これは，`model.eval()`で行っていてもパラメータが保存されているようなので，下記対策が必要になる．

## with torch.no_grad()
pytorch 0.4.0に追加された`torch.no_grad()`を使用してパラメータの保存を止める

[pytorch-MNIST](https://github.com/pytorch/examples/tree/master/mnist)サンプルより一部抜粋

```python:sample.py
def test(args, model, device, test_loader):
    model.eval()
    with torch.no_grad():
        model(data) # forward実行
```

## 参考
https://discuss.pytorch.org/t/torch-no-grad/12296
Ruby on Rails を勉強してみる

#1. 経緯
研究でウェブアプリケーションを作ろうと思った．国産の言語であるRubyをかねがね触ってみたいと思っていた．
絶対に必要だったわけではないけど，やってみたかった．めちゃめちゃ適当ですが，始めるときって大概そんなもんだよね．

#2. 現在のスキル
高専でCとJavaの基本だけ学んだよ．オブジェクト指向は苦手だけどなんとかプログラムはできる状態．
そして何より致命的なのがMVCの構成がよくわかってない．今回はそこを鍛え直すつもりでもあるよ．

---

今はRuby2.3.1，Rails4.2.7.1で書かれた本をもとにRuby2.5.0，Rails5.2.0で勉強してます．なんでこんな面倒なことしてるのかというと，単純に時間がない，でも最新のバージョンを勉強したい．本は分かりやすく信頼のできるものがいい，的なあれこれが重なった結果です．

そして順当にバージョンによる違いにぶつかっているので今後の忘備録を兼ねてここで恥さらししていこうと思ってます．
「プログラムはCとJavaは軽く触っただけ」みたいな人が陥りやすいミスの解決法なんか書いていけたらなあ...なんて思ってたり．
formで二つのモデルを送信する方法。

formで２つのモデルを送信する方法について書く。
これは自分用のメモである。

結論から言うと、form_forにネストして、fields_forを使う。

1.view

```ruby:new.html.erb
<%= form_for(@post) do |f| %>
   <%= f.label:title %>
   <%= f.text_field:title %>
   
   <%= f.label:content %>
   <%= f.text_field:content,size:50 %>
   
<%= fields_for :category ,(@categroy) do |category| %>
   
   <%= category.label:category %>
   <%= category.text_field:category %>
   <% end %>
   
   <%= f.submit "提出する" %> 
   <% end %>
```

上記のように、field_forを書けば、

```
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"JxEgfX0JBqa9LyqTMtGPN/L20XcLJTL0AznQgIdpaWK8GHbcS/lIuKHZnBO7d4aHlClQM2SDp1s04iT4zyfeji==", "post"=>{"title"=>"もしやこれは...", "content"=>"gegt"}, "category"=>{"category"=>"プログラミング"}, "commit"=>"提出する"
```

上記のように、送信される。なおわかりにくいが、categoryモデルにはcategoryと言うカラムがある。
注意点として、field_forを書く時は、:categoryと言う引数が必要になる。これは、views/posts/new.html.erbのため、postリソースの文脈にあるからだ。categoryをformで送る際は、入れる箱を明示しないといけない。なぜなら、文脈外の行動だからである。
このようにして、２つのモデルを扱ってformの送信ができた！

2.controller

```ruby:PostsController.rb
class PostsController < ApplicationController
  def show
    @post=Post.find(params[:id])
  end

  def new
    @post=Post.new
    @category=Category.new
  end
  
  def create
    category=Category.find_by(category_params)
    @post=category.posts.build(post_params)
    if @post.save
      render 'normal/home'
    
  else
    redirect_to root_url
  end
end

  private
  
  def category_params
    params.require(:category).permit(:category)
  end
  
  def post_params
    params.require(:post).permit(:title,:content)
  end
  
end
```

上記には２つ注意点があり。
1.newメソッドでは２つのインスタンス変数を作ること。
2.ストロングパラメーターも２つ作る。

なお、ストロングパラメーターは、
"post"=>{"title"=>"もしやこれは...", "content"=>"gegt"},
"category"=>{"category"=>"プログラミング"}

のように、ハッシュで渡されるので注意が必要。値だけが渡されるものではない。

以上です。
ワンアクションでリクエストが2度実行されてしまったらやってみるべき事あれこれ


# お願いだから Don't Repeat Yourself

開発中のAzure上のWebサービスで
大きな不具合を出してしまい
色々と探っていくうちに気が狂いそうになったが
やっぱりこの壁はぶつかっておくべきだったと思い
備忘録。

環境は以下。
 - lang:node 8.00 + Typescript2.7.1
 - FW:Koa2.5.0 + TypeOrm等
 - DB:CosmosDB(MongoDB)
 - cloud:Azure App Service

事の発端はazureのCosmosDBでnode上からTypeOrmのupdateOneを
試みようとしたが例外発生。
原因は更新対象が複数件データベース上にあったようで
Azureサポート様のご協力で特定することができた。
調べていくうちに一意であるはずのデータが複数件登録されていたのは
リクエストの二重送信（二重起動）が原因

改めてリクエストが複数回起動してしまう原因を探ってみた、
がこの件多くのシステムで発生しがちと思うのだが意外と資料が少ない。
諸先輩方の血と汗の結晶を下記にまとめてみた。

今回リクエストの二重送信（起動）の原因を大別すると二つ。
 **1.タグの属性またはjsの引数が設定されていない（いづれもURL関連）**
 **2.フレームワークのリクエストのデフォルトタイムアウトにやられている。**

## 1.タグの属性またはjsの引数が設定されていない件
下記で申し上げたいのは、この件ググるとfavicon.icoに関する記述が多いが
どうやらそれだけではないらしいと言うこと。
firefox特有でもなくChromeでも再現されている。

##### ■favicon.icoへのアクセス他
[ページにアクセスするとリクエストが2回飛んでしまう現象にハマった](https://blog.hello-world.jp.net/ruby/2867/)
[複数回呼び出しの問題を調査する](https://qiita.com/akmiyoshi/items/07ee58de550fd6dcfb26#5-%E8%A4%87%E6%95%B0%E5%9B%9E%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%AE%E5%95%8F%E9%A1%8C%E3%82%92%E8%AA%BF%E6%9F%BB%E3%81%99%E3%82%8B)

##### ■background-image: url()で引数urlが設定されていない
[ページアクセスでリクエストが2回発生する](https://qiita.com/ISLA/items/7aa43b16c149e488295e)

##### ■上記以外の属性の設定不備
[src=""とhref=""で無駄リクエストが発生する問題、ブラウザ対応状況](https://news.mynavi.jp/article/20100715-no-url-on-src-and-href-issue/)

##### ■その他参考リンク
[Koa is being executed twice per request?](https://stackoverflow.com/questions/46014028/koa-is-being-executed-twice-per-request)
いい事をコメントしては頂いていたが私の場合これではなかった。
以下参考コメント
>There are two reasons why this could happen:
First is - as already mentioned in the comments that browsers also fire a request for favicon.ico Second: some browsers do a prefentching, so before you even hit the return key, they prefetch the url when entering.

## 2.フレームワークのリクエストタイムアウトのデフォルト値にやられている件
結論から言うとkoaであれば、

`ctx.req.connection.setTimeout( 1000 * 60 * 10 ); // 10分`

とタイムアウトの時間を長めに設定することで回避できた。
一度のデバッグの時間が長くなりデフォルトの時間を越えてしまったため
この現象に出くわすこともあった。

##### ■expressのデフォルトタイムアウトの設定1
今回解決の糸口となったコメント
このコメントにうなづいた。
>I was going crazy with this duplicate request until I found this post.

https://github.com/expressjs/express/issues/2512

##### ■expressのデフォルトタイムアウトの設定2
https://stackoverflow.com/questions/13150277/express-request-is-called-twice

##### ■koaのデフォルトタイムアウトの設定
https://stackoverflow.com/questions/31176869/how-could-i-handle-timeout-request-in-koa
Miniconda Tips

自分用Minicondaメモ

環境立ち上げについては[こちら](https://qiita.com/sennbei/items/c305ee6a6cf7c69aaa88)

## Tips
### 環境の新規作成
python 3.6で環境作成するケース

```sh
conda create -n [Env name] python=3.6
```
### 既存の環境を立ち上げ
```sh
source activate [Env name]
```
### 現在の環境から離脱
```sh
source deactivate
```
### CondaそのもののUpdate
```sh
conda update -n base conda
```

### 作成したConda環境にパッケージを追加
conda, pipどちらでインストールしてもよい．

```sh:conda
conda install **
```

```sh:pip
pip install **
```
Ubuntu に npm をインストールする

#UbuntuにNode.jsをインストールする

LTS版
```curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs```

最新のバージョンがほしい方は
```curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs```

最後に、npmをアップデート
```sudo npm update -g npm
```

#参考リンク

https://nodejs.org/en/download/package-manager/
Miniconda 環境構築

MinicondaをUbuntu 16.04に導入する
Tipsメモは[こちら](https://qiita.com/sennbei/items/92b068884bbb0d47e2ce)

## 環境
Ubuntu 16.04

## Minicondaとは？
開発環境の異なる複数プロジェクトを1マシンで回したいとき，環境を簡単に切り替えるためのツール．
また，特定のマシンの環境を他に移行/共有したい時に便利なので，特に並行開発の予定がなくても使用しておくと急な環境移行にも役立つ．

### なぜMinicondaか？
別途触ったことがあったため，とりあえずこれを使用した．
Anacondaとの住み分けについては別途調査したい．

## インストール
[Miniconda](https://conda.io/miniconda.html)の公式ページよりMiniconda*-latest-Linux-**.shを取得
下記コマンドでインストール．

```sh
cd [Download Dir]
chmod +x ./Miniconda3-latest-Linux-x86_64.sh
./Miniconda3-latest-Linux-x86_64.sh
```

## Condaの環境作成 + 起動

```sh
conda create -n [Env name] python=3.6
source activate [Env name]
```
[WIP]５月の知らなかった横文字&知ってたけど曖昧だった言葉

わからない言葉や曖昧な言葉をよく調べますが、結局忘れることが多いので、備忘録として残しておきます。
言葉の意味がわかる程度を目標としています。

間違いがあれば優しく教えてください:kissing_heart:

#インフラ関連主にAWS
##プロビジョンド IOPS
##I/O
Input/Outputの略で「入出力」を意味している。
何かしらのinputに対して、何かのoutputをする処理の総称。

##HBase
  NoSQLの一つ。
　正式には「Apache HBase」でIOT関連のDBとして注目されている。

##Vertica
  ビックデータに特化したDB。
　高い検索パフォーマンスを発揮する

##Cassandra
  Nosqlの一つ。
　単一故障点がないのが特徴

##レイテンシー
　特定の処理において生じる時間的な遅延

##EC2 ルートデバイスボリューム
  EC2起動のためのテンプレみたいなもの。
　AMIなどで作られたテンプレ。

##プライマリDB
  ≒ マスターDB
set("a.b", 10) のようなダサい API をやめるライブラリを書いた

## tl;dr

- Immutable で Pure Functional なスタイルでネストの深いオブジェクトの一部分を簡単に更新するためのライブラリを作った
- [GitHub](https://github.com/KoharaKazuya/pickpatch)

## 作った経緯

JavaScript のライブラリを眺めていると、オブジェクトのネストの深い一部分を取得/更新するために `obj.set("hoge.fuga", newValue)` のような API に出会うことがある。
(私もその手の API を作ったことがある)

これは文字列として JavaScript オブジェクトキー列を与えることで操作の対象を指定する API だ。
[lodash get](https://lodash.com/docs/4.17.10#get) と言えば伝わりやすいかもしれない。
ここからは便宜上 *キーパス指定形式* と呼ぶ。

キーパス指定形式の API はこうしなければならない or こうしたほうがいい からそうなっているんだろうが、ダサい。
メタプログラミングが表に出ているので、ミスや悪い設計を引き起こす。

どうにかできないか考えてみた。

例えば **全て Immutable という前提** の環境下で更新操作を素直に書いてみよう。

```javascript
const newObj = { ...oldObj, hoge: { ...oldObj.hoge, fuga: newValue } };
```

このようになり、ネストが深いと辛い。

これに対する一つの回答して、メタプログラミングを裏に持ち、素直な API を提供するライブラリが [Immer](https://github.com/mweststrate/immer) だ。

```javascript
const newObj = produce(oldObj, draft => {
  draft.hoge.fuga = newValue;
});
```

このように書ける。
大半の状況で Immer を使えばキーパス指定形式の API は必要ないと思う。

しかし純粋関数型至上主義の過激派にとってこのスタイルは受け入れられない。
(この言い回しは冗談だが、例えば tslint-immutable で再代入を禁止しているプロジェクトではこのスタイルは問題になる)

そこで Immer を参考にし、Immutable で Pure Functional なスタイルでも書けるような API を提供するライブラリを作った。

[GitHub -- KoharaKazuya/pickpatch](https://github.com/KoharaKazuya/pickpatch)

pickpatch を使うとこのようなスタイルで更新操作を書ける。

```javascript
const obj = { a: { b: 1 }, c: 2, d: 3 };
const newObj = pickpatch(
  _ => [_.a.b, _.c], // picker defines partial to update
)(
  ([b, c]) => [b * 10, c + 5], // patcher defines new values
)(
  obj, // old object
);
// -> { a: { b: 10 }, c: 7, d: 3 }
```

更新する対象を指定する picker 関数と更新後の値を定義する patcher 関数を組み合わせて使用する。
ポイントは picker 関数は自由な形でオブジェクトの一部を指定でき、その形で patcher が受け取れるところだ。これによりオブジェクトのどの部分に興味があるか、それらがどう遷移するか、を素直に表現できる。

---

私自身は Immutable で Pure Functional なスタイルに特別なこだわりがないので Immer でいいや、と思うのだがこのような形でも書けるんじゃないか？というアイデアが降ってきたので形にした。
Adobe Acrobat proでJavaScriptを使って自動でPDFをExcelに変換した話

## 要件
* Adobe Acrobat proで200件くらいあるpdfファイルをxlsxに変換してほしい
* JSがかけるみたいなので、それで自動でいけるのでは？

## 実際のコードがこちら
```js
for (var i=1; i <= 232; i++) {
	try {
    	//pdfファイルを開く
		var myDoc = app.openDoc("/Users/ユーザー名/Downloads/pdf/"+i+".pdf");

    	//Excelファイルに変換するして保存
		myDoc.saveAs("/Users/ユーザー名/Downloads/xlsx/"+i+".xlsx", "com.adobe.acrobat.xlsx");

    	//XMLファイルに変換するして保存（オプション）
		//myDoc.saveAs("/Users/itayayuichiro/Downloads/xls/"+i+".xml","com.adobe.acrobat.spreadsheet");

		//pdfファイルを閉じる
		myDoc.closeDoc(true);

	}catch (e) {
	}
}
```
各ディレクトリの場所は自分に合うように調整してください。

## 注意点
Adobe Acrobatのコンソールで動かすと、自分のパソコンでは50件程度処理すると、止まってしまったので、そこからfor文を回し直すということをしました。

## 苦戦しまくり...
### 苦戦ポイント「どこでJS動かすねん」
JSを動かそうにも、そもそもコンソールがなかなか見当たらず、文献を漁っても古いのしかなくて、そんなタブ無いんですけど...って感じでした。
「その他のツール」というところを押すと、各種アクション・ツール開発・JavaScript等があったので、ここでOkです。
<img width="1105" alt="スクリーンショット 2018-05-27 13.51.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/83409/268e5fba-988c-ed33-0646-dddc627d38e3.png">
これ
<img width="185" alt="スクリーンショット 2018-05-27 13.51.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/83409/b4b335b6-ea86-bd26-1716-f3ecd494d94a.png">

### 苦戦ポイント「どうやってJS動かすねん」
なんとなく実行はできそうな環境は整ったが、実際の実行方法がわからん...
少し調べてみたところ「デバッガー」のコンソールにJSのソースコードを入力して、範囲選択して、command + Enterで実行される。
<img width="130" alt="スクリーンショット 2018-05-27 13.59.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/83409/cfd0400f-f409-de96-37d9-888ae0466888.png">
ここをクリックして
<img width="584" alt="スクリーンショット 2018-05-27 13.59.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/83409/ac714ab4-3bdb-b56f-4d33-fd1ca3c3be45.png">
範囲選択して、command+Eneter

### 苦戦ポイント「リファレンスが...」
ネットの情報が古いので、文献とか探すのに困りましたが、このリンクが公式が出してるAPIの仕様書のようなので、ここで検索するのが良さそうでした。（自分はそうしました。）
[](https://helpx.adobe.com/content/dam/help/jp/acrobat/kb/511/511727/attachments/511727_js_api_reference.pdf)
ctf4b 2018 write up

# RSA is Power
問題文として下記が与えられる

```python
N = 97139961312384239075080721131188244842051515305572003521287545456189235939577
E = 65537
C = 77361455127455996572404451221401510145575776233122006907198858022042920987316
```

# N　=　p * q を求める
https://factordb.com/
にNを入れてあげる

```python
p = 299681192390656691733849646142066664329
q = 324144336644773773047359441106332937713
```
p,q長いから16進数に変換

```python
p = 0xe1747f8b4fe5236cec869cd855de2389
q = 0xf3dbedad3eeac8f64d1c6b4fde21edf1
```

# dを求める

```python
from Crypto.Util.number import inverse

p = 0xe1747f8b4fe5236cec869cd855de2389
q = 0xf3dbedad3eeac8f64d1c6b4fde21edf1
e = 0x10001 #eも一応16進数に変換しておく
n = p * q
d = inverse(e, (p-1)*(q-1))
print(d)
```

# こうなる
```python
q = 0xe1747f8b4fe5236cec869cd855de2389
p = 0xf3dbedad3eeac8f64d1c6b4fde21edf1
n = p * q
e = 0x10001
c = 0xab09082bd950ae6f62502c9bfeb948d48a45d00afae58a064864d00c53faaab4
d = 0xc3ae54812ff39e5dc840ace1e2026032b2534e89f14d21db76d812b3046ccf01
```
値が長いから16進数に変換した.

# 復号
[よっちんのブログ](http://yocchin.hatenablog.com/category/CTF?page=1486990800)
をもとにコードを組んでいく

```python
def decrypt(p, q, e, c):
    n = p * q
    pt = pow(c, d, n)
    return hex(pt)[2:-1].decode('hex')

plaintext = decrypt(p, q, e, c)
print(plaintext) # ctf4b{5imple_rs4_1s_3asy_f0r_u}
```
# 参考
- [よっちんのブログ](http://yocchin.hatenablog.com/category/CTF?page=1486990800)

# 最後に

```python
def decrypt(p, q, e, c):
    n = p * q
    pt = pow(c, d, n)
    return hex(pt)[2:-1].decode('hex')

plaintext = decrypt(p, q, e, c)
print(plaintext)
```
はpython2だから3では実行できない.
私は[paiza](https://paiza.io)に投げた.
DNS over HTTPS について

こないだ初めて聞いたのでちょっとまとめてみる:frowning2:
~~ネットワークよくわからない~~

## DNS over HTTPS とは？
DNSで通信している内容を、json形式にマッピングしたデータにしてHTTPS通信を行う手法。
つまり通信プロトコルはHTTPS(TLS)なので、**DNSの代わりにHTTPSで通信するよって話。**

## なんでDNS over HTTPS を使うの？
逆に言うとなんでDNSではダメなのかというと、DNSはUDPをベースにしたプロトコルであり、通信内容は平文で行われる。そのため通信内容を盗聴されたり、内容の改竄が可能となってしまう。
そこでプロトコルをHTTPSにして通信することで、通信内容の暗号化を行い秘匿性の向上を図るのが理由。

## DNSだってセキュリティプロトコルあるでしょ？DNSSECでいいじゃん
カバーしている通信範囲が違う。
DNSの仕組みとして
> クライアントPC　→　キャッシュサーバ　→　権威サーバ

という流れで通信を行うが、DNSSECはこの
> キャッシュサーバ　→　権威サーバ

の通信内容を電子署名によって保護する。
つまりキャッシュサーバが受け取った問い合わせ内容が、正規の権威サーバのものであり、かつDNSレコードの改竄がされていないか確かめるもの。
これによってDNSキャッシュポイズニングなどの攻撃にも対応ができる。

そしてDNS over HTTPS がカバーしている範囲が
> クライアントPC　→　キャッシュサーバ

である。こちらの目的はクライアントPCから投げる問い合わせ内容の改竄防止と秘匿化、DNSサーバのなりすまし防止が目的である。

そのため結論としては、**DNS over HTTPS は必要。もちろんDNSSECも**


## 具体的にどこで試せるの？
Google public DNS(8.8.8.8)
Cloudflare DNS(1.1.1.1)

この辺で試せます:open_hands:


## まとめ
すごいなと思いました。（小並感）
そもそもDNSについてもよく知らなかったんで、ネットワークについてちゃんと勉強します・・・

~~余談ですが、某海賊版サイトの件でDNSブロッキングがどうこうありました。
プロバイダレベルでDNSブロッキングをされる場合、DNS over HTTPSで接続すれば、技術的にはDNSブロッキングを回避できるんですかね？~~

[参考サイト様](http://eng-blog.iij.ad.jp/archives/85)
ProgateでRubyを勉強した

#はじめに
PorgateでRubyの学習コースを受講したので感想をまとめます。
https://prog-8.com/languages/ruby
私は、C++, Pythonがそれなりに扱った経験はあるのですが、rubyに関しては初めて学ぶということで、はじめの一歩として受講していみました。

#ProgateのRuby学習コースの概要
Progate全体の話については、いくらでも情報があると思うので割愛します。(やったほうが早い)
全5コースに分かれていて、1コースだいたい(1-2時間)程度です。ただし、プログラミング初心者向けなので、Ruby以外にプログラミング経験のある方は、半分くらいの時間ですむとおもいます。(私もそうした。)
## 各コースの概要
- Ruby学習コースⅠ  
- Ruby学習コースⅡ  
- Ruby学習コースⅡ  
- Ruby学習コースⅣ  
- Ruby学習コースⅤ  

## 印象的だった記述
### eachメソッド

オブジェクト.each do |変数|
  実行する処理1
  実行する処理2
}

### ハッシュの記述
PythonでいうDictionaryです。
記述で注意すること。":"との間に余計なスペースが入っているとエラーにあります。

```ruby
exam = {subject: "Math", score: 80} #(正)
exam = {subject : "Math", score : 80} #(誤)
```

### スコープ
Rubyは流儀として、スコープの終わりにendを書くのが流儀らしい。

```ruby
class SampleC
 def self.hello
   puts "Hello World"
 end
end
```


#終わりに
非常にわかりやすい内容で、初心者が入り口に立つ(まさに、ProのGateに立つ)という意味で非常に良い学習教材と思います。
Rubyは、Pythonを経験している人に取っては非常に学習コストの低い言語といえるでしょう。
ちなみに、Rubyの公式ドキュメントには、RubyとPythonについて以下のように書かれている。

```
Pythonは、Rubyと同様、とてもよくできた汎用的なプログラミング言語です。 PythonからRubyへやってきたなら、Pythonよりもほんの少しだけ構文が多いことに気づくでしょう。
(原文まま)
https://www.ruby-lang.org/ja/documentation/ruby-from-other-languages/to-ruby-from-python/
```
いろいろ書きましたが、Rubyはとにかくなんでも良いからまずプログラミング言語を習得したいという方には非常に向いているといえます。
gitコンフリクト解消【意味を理解する】

gitでよく起こるコンフリクト、そしてそのコンフリクトを解消する手法ですが、裏で何が起こっているのかよく理解していなかったので、備忘録の為に残しておきます

#コンフリクト解消の順番

1.Fetch
2.masterを現在のブランチにマージ
3.競合箇所の修正
4.add-commit-push
5.リモートであるGituhbでマージする


#それぞれで起こっていること

##1.Fetch
github上でのmasterの更新をローカルに持ってくること。
自分がローカルのブランチを更新している間に、Githubのmasterはどんどん進んでいます。
そもそも競合というのはブランチがmasterでどのような更新が行われているのかを知らず、全くお互い（masterとブランチ）がお互いを知らないから起こることです。
なので、まずは自分のブランチに現状の更新を教えてあげます。そのためにGithubのmasterから情報を取ってくる必要があります。それがFetchです。ちなみにDBを扱う時にも利用される用語なので知っておいて損はないです。

##2.masterを現在のブランチにマージ
上でも書いてありますが、ブランチにmasterの更新を教えてあげる必要があります。教えてあげる行為がマージになります。
自分が対象ブランチにいるときに、masterを対象ブランチにマージします。


##3.競合箇所の修正
もちろんすでに競合しているので、ここで修正が必要になります。競合部分を実際のコードで修正していきます。
競合箇所を全て消すのか、両方残すのか、決して二者択一ではありません。

##4.add-commit-push
修正し終わったら、コミット対象にし（add）、コミット、そしてリモートにpushします。
こうすればリモートにあるブランチもローカルと同じようにmasterのコードを知っており、かつマージできる状態にあります。

##5.リモートであるGithubでマージする
リモートでマージします。これで競合は解決します。


#コマンドでもgitはいじれた方がいい
sourcetreeとか非常に便利です。自分も利用中です。
他のエンジニアとコミュニケーションする時に、addとかfetchとかgitコマンドの用語は使うので、自分が今行っている行為がコマンドでいうなんなのかは常に理解しておいたほうが良いかと。。。
コマンドのタブ補完時にビープ音を鳴らさない


# 概要

Linuxのコマンドライン操作で、タブ補完のときに音が鳴るのを止めたい。

検証した環境は、Ubuntu 18.04。

# 設定
## グルーバルな設定

全ユーザに適用する場合。この設定ファイルは、Ubuntu 18.04ではあらかじめ用意されている。

```text:/etc/inputrc
set bell-style none
```

## 各ユーザの設定

```text:~/.inputrc
set bell-style none
```

--- 

# 追記

lessやvimでも音が鳴るのが鬱陶しい。個別に設定してもいいが、ターミナル側の設定で無効にしてしまうのが、手っ取り早い。

GNOME端末なら、Preferencesから設定可能。

「Sound 端末ベルを鳴らす」のチェックを外す。