OmniAICreator/Qiita-1.07M huggingface dataset:
rbenv, bundler, rspec を使った素の（非Railsの）Rubyプロジェクトをサクッと立ち上げる手順 ※gitignoreも作る

## 環境・前提
- macOS
- rbenv は homebrew でインストール済み

## rbenv でRubyをインストールする
新しくRubyプロジェクトを立ち上げる時、ついでにRubyもバージョンアップしたくなることが多いので、rbenvで新しいRubyをサクッとインストールする。

まずはrbenvでインストールできるRuby一覧を更新。

```bash
$ brew update
$ brew upgrade ruby-build

$ ruby-build --version
ruby-build 20190130

$ rbenv install -l
Available versions:
  1.8.5-p52
  1.8.5-p113
  1.8.5-p114
  :
```

次にRuby, bundlerをインストール。

```bash
$ rbenv install 2.6.1

# ruby2.6以降、bundlerがデフォルトで含まれるようになったので、これは不要に
$ rbenv exec gem install bundler

$ rbenv rehash
```

## Rubyプロジェクト用ディレクトリを整備する

```bash
$ mkdir new_proj
$ cd new_proj

$ rbenv local 2.6.1

$ bundle init
```

Gemfileが出来るので、以下の行を追記する。他にも必要なgemがあれば追記する。

```ruby:Gemfile
gem "rspec"
```

bundle で gem をインストール。
さらにrpsec環境をセットアップ。(.rspec, spec_helper.rb などが生成される。）

```bash
$ bundle install
$ bundle exec rspec --init
  create   .rspec
  create   spec/spec_helper.rb
```

## .gitignoreを作る

giboがインストールされていることが前提。
※macOSへのインストールについては [気付いたら.gitignoreはgiboで自動生成する時代になっていた - Qiita](https://qiita.com/tmknom/items/c4bcebe17d25381fa45d) を参照

```bash
# templateを更新
$ gibo -u

# templateのリストを表示
$ gibo -l

# .gitignoreを生成 ※開発環境依存の部分は適宜変更のこと
$ gibo Ruby Linux macOS Windows JetBrains > .gitignore
```

## 参考サイト
[rbenv install -l のリストを更新する - nafuruby’s diary](http://nafuruby.hatenablog.com/entry/2014/10/11/195016)
[Rails開発環境の構築（rbenvでRuby導入からBundler、Rails導入まで）（Macport編） - Qiita](https://qiita.com/emadurandal/items/a60886152a4c99ce1017)
[RailsじゃないRspec3環境を構築する方法 - Qiita](https://qiita.com/yusabana/items/db44b81bdddf6ed0e9f5)
【iOS】カメラロールから選択した画像の正確な容量を取得する

# 環境
Xcode9.2
swift3.2

# 方法
PhotosとUIImagePickerControllerを使っています。

```swift
// MARK: - UIImagePickerControllerDelegate
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
  let asset: PHAsset? = {
    if #available(iOS 11.0, *) {
      return info[UIImagePickerControllerPHAsset] as? PHAsset
    } else {
      guard let url = info[UIImagePickerControllerReferenceURL] as? URL else { return nil }
      return PHAsset.fetchAssets(withALAssetURLs: [url], options: nil).firstObject
    }
  }()

  asset?.requestContentEditingInput(with: PHContentEditingInputRequestOptions()) { (contentEditingInput, _) in
    guard let path = contentEditingInput?.fullSizeImageURL?.path,
        let fileDictionary = try? FileManager.default.attributesOfItem(atPath: path),
        let fileSizeString = fileDictionary[FileAttributeKey.size],
        let fileSize = file as? Float
        else { return }
    print(fileSize)
  }
}
```

# まとめ
初投稿です。。。
もっといいやり方あったら教えてください。

# 参考
[iOSで画像のファイルサイズを取得する](https://qiita.com/RINDO/items/9f6753f6a01ee828aac4)
R: summary(df) の出力を tbl_df に変換するスマートな方法

`summary(df)`は`df`を要約してくれる便利な関数ですが、
出力が`table`なのでそのままでは使いにくいことがあります。

以外に面倒な`tbl_df`(or `data.frame`) への変換方法をメモしておきます。

`as.matrix()`では`table`を`matrix`に変換できないので、
手っ取り早い方法として`rbind()`を使っています。
(これは、`class(table_obj) <- NULL` と同義です)。


```r
library(tidyverse)

iris %>%
  summary() %>%                       # なにはともあれsummary()
  rbind() %>%                         # matrix化
  magrittr::set_rownames(NULL) %>%    # 行名""を削除
  as.tibble() %>%                     # tbl_df化
  map_dfr(~ str_trim(.)) %>%          # 要素の前後空白を削除
  set_names(str_trim(names(.)))       # 列名の前後空白を削除
```

割とよく使うので私は関数化しています。

```r
summary2tbl <- function(summary_table) {
  summary_table %>% 
    rbind() %>% 
    magrittr::set_rownames(NULL) %>% 
    as.tibble() %>% 
    map_dfr(~ str_trim(.)) %>% 
    set_names(str_trim(names(.)))
}
```

```r
iris %>% 
  summary() %>% 
  summary2tbl()
```

|Sepal.Length  |Sepal.Width   |Petal.Length  |Petal.Width   |Species       |
|:-------------|:-------------|:-------------|:-------------|:-------------|
|Min.   :4.300 |Min.   :2.000 |Min.   :1.000 |Min.   :0.100 |setosa    :50 |
|1st Qu.:5.100 |1st Qu.:2.800 |1st Qu.:1.600 |1st Qu.:0.300 |versicolor:50 |
|Median :5.800 |Median :3.000 |Median :4.350 |Median :1.300 |virginica :50 |
|Mean   :5.843 |Mean   :3.057 |Mean   :3.758 |Mean   :1.199 |NA            |
|3rd Qu.:6.400 |3rd Qu.:3.300 |3rd Qu.:5.100 |3rd Qu.:1.800 |NA            |
|Max.   :7.900 |Max.   :4.400 |Max.   :6.900 |Max.   :2.500 |NA            |


Let's enjoy !!
Unityでデフォルトのフォントを好きなフォントに変更する_Unity-design#01

#始めに
##対象
この記事は、**Unityで作ったゲームのデザインを手軽にかっこ可愛く見せよう**と言うものです。私の持っている生徒（男子高校生女子中学生）向けに書いています。
##例）ゲームタイトルを作成する
例えば「BallGame」というゲームのタイトル画面を作るとします。
使用している文字のフォントだけを変更して３パターン作成しました。
###デフォルト（使用フォント：Arial）
普通というかダサい
<img width="546" alt="スクリーンショット 2018-01-14 16.08.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/198475/ba6296f5-dd7b-7e32-4d9b-f8aced4e0429.png">
###ゴージャスな雰囲気（使用フォント：Geotica）
エレガント〜〜
<img width="552" alt="スクリーンショット 2018-01-14 16.08.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/198475/aba41844-48cb-3fc4-ee95-5a591377abd4.png">
###宇宙っぽい雰囲気（使用フォント：Navia）
なんかロゴだけで楽しそう
<img width="542" alt="スクリーンショット 2018-01-14 16.08.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/198475/6b0e3d0e-9071-be58-bb9b-65d6a2542cd1.png">



**フォントを変えるだけで一気にゲームの完成度が上がる**
#フォントを用意
まず使用したいフォントを探しましょう〜！
##フォントの形式
Unityで使えるフォントの形式は**.ttf(TrueType)**と**.otf(OpenType)**
（使用したいフォントのファイルの語尾にこの２つのどっちかがついてたらおうけいだよん）
もしTrueTypeもOpenTypeどちらも用意されていたら…**OpenTypeを選ぶべき**
理由は簡単にいうとOpenTypeの方が新しくフォントしての性能が有能だからです。（具体的には文字詰めなど）
詳しく知りたければ下の参考サイトをご覧ください。
##フリーフォントを使用する場合の注意点
###**利用規約を必ず読む**
フリーフォントであっても、ゲームに使用するのは禁止とされている場合もあります。
***Unity内のアセットストアで探すのが確実だけれどそんなに種類がない、、***
###使用したい文字が含まれているのか確認する
ゲームで使った文字がフォントの中になかった場合、ビルドしたら困ったことが起きます。仮に文字が無くても、Unity上では文字を置き換えをしてくれて読めるのですが、**ビルドした時文字が消える現象**が起きます。例えば、Unityでデフォルトで入っているArialは日本語には対応してなくて、ビルドしたら日本語が消えてしまうという現象が起きてしまいます。
##ゲーム開発でのフォント選びのコツ
###パッと見てすぐわかるフォントを選ぶ
例えばゲーム画面にスコアなどを表示する場合、すぐに今の状態がわからないと意味がないですよね。
なので**フォントを選ぶ時は、視認性.可読性.判読性の３つを意識**してください。
文字と認識することができ（視認性）、すぐに内容が理解でき（可読性）、わかりやすいもの（判読性）を選ぶように心がけて見てください。

###世界観にあったフォントを選ぶ
最初で示したように、どのフォントを選ぶかでゲームのイメージはかなり変わります。
検索する時に「フォント　ふんわり」「フォント　かっこいい」などイメージで検索するのがオススメです。

#用意したフォントをUnityで使用する
##用意したフォントをUnityに読み込む
Projectの画面で右クリックしてImportNewAsset...を押します。そして、必要なファイルを選択します。
<img width="525" alt="スクリーンショット 2018-01-14 15.42.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/198475/529237e9-1964-71a1-b8c7-f5542ca7a45e.png">

##用意したフォントに変更する
Hierarchyでフォントを変えたいテキストを選択します。InspectorのTextのFontに使用したいフォントを引っ張ってきます。
<img width="541" alt="スクリーンショット 2018-01-14 15.49.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/198475/2c69f0f3-0501-d74b-e2ce-7edca8fb59a5.png">
#最後に
何かこうしたらいいんやない？違うよ〜！てのがありましたら教えてくださいまし。
##参考にさせていただいたサイト
###fontnavi　TrueTypeとOpenType、どう選べばいい?
http://fontnavi.jp/zakkuri/202-truetype_opentype.aspx
###Bigmac inc. 今日から使えるフォント選びのルール
https://big-mac.jp/recommend/design/font-selection-of-rules-that-can-be-used-from-today/
javascipt(jQuery)  $(this)の代入値について

#$(this)の値の移り変わりに関して

javascrpt(jQuery)でコールバックして式が長くなると$（this）値に入っているものが変わってきます。


```html
<!DOCTYPE html>
<html lang="ja">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<script src='https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.2/vue.js'></script>
<title>documentwrite</title>
</head>
<body>

<p id="panel1">パネル１</p>
<p id="panel2">パネル2</p>
<p id="panel3">パネル3</p>




<script src="/js/jquery-2.2.4.min.js"></script>
<script>

$(function(){
	$("p").on("click",function(e){
		let E = $(this);
		let D;
		$("#panel1,#panel2,#panel3").each(function(){
			if(e.target === $(this).context){
				D = $(this);
				$(this).text("ヒットしました。");
			}
		})
		console.log(E);
		console.log(D);
	})
});


</script>
</body>
</html>
```


```javascript
	$("p").on("click",function(e){
		let E = $(this);
		let D;
```
このときの$(this)にはクリックされた"p"が代入されている。

```javascript
        $("#panel1,#panel2,#panel3").each(function(){
            if(e.target === $(this).context){
                D = $(this);
                $(this).text("ヒットしました。");
```
このときの$(this)にはeach関数でそれぞれの("#panel1,#panel2,#panel3")を見ていっている状態です。
("#panel1")を見ているときはそれが$(this)になります。
Windows用のemacs（NTEmacs）でewwを使う。

**※現在は、MSYS2ではなくvcpkgのlibxml2利用を検討中 ⇒ Visual Studioのインストールができず中断。インストールでき次第、検討再開（2018/01/28）**

MSYS2のターミナルでlibxml2をインストール。

    pacman -S mingw-w64-x86_64-libxml2

C:\msys64\mingw64\binにパスを通す。

    set Path=C:\msys64\mingw64\bin;%Path%

これで、ewwを起動しても`libxml2 library not found`と怒られなくなる。


## 参考
- [microsoft windows - eww ---> libxml2 library not found - Emacs Stack Exchange](https://emacs.stackexchange.com/questions/34007/eww-libxml2-library-not-found)
Unity備忘録、STG制作5:タッチパネル操作その１

※この記事は2016年当時に在籍していた某社内での（略）、ある日、UnityでVRアプリを作って商売しようという話になった。だがちょっと待って欲しい、俺（達）は趣味でUnityを使っているわけであって、とてもじゃないが商業アプリなんか作れるレベルじゃないぞ！？　まず本業を安定させてからやるべきじゃないのか？　皆がそう思っていた。。。（続く）


#背景
スマホでゲームをする場合、当然だがタッチおよびタッチ座標を検出しなければならない。
PC用のゲームだったら十字キーで簡単に操作出来たのにね。
とりあえず今回は簡単だと思われる方法で、タッチ操作によるキャラ移動方法を記載する。

#タッチ有無を検出する
以下のメソッドを使うことでタッチしたかどうかを検出できる。
Input.GetMouseButtonDown(0)  //タッチした瞬間のみTRUEを返す
Input.GetMouseButton(0)  //タッチしている間はTRUEを返す
Input.GetMouseButtonUp(0)  //離した瞬間にTRUEを返す

ちなみに名前からも分かる通り、本来はマウスボタン押下の検出に使うメソッドなのだが、実はシングルタッチにも使える。２点タッチやドラッグなどを検出したい場合はタッチパネル専用のメソッドを使うこと。

#タッチ座標を検出する
例えば自分のスマホ(SHARPのSHV31)の解像度は1920x1080のFullHDである。
なので座標としては下記図のようになる。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/162164/7bf2a5f6-e99f-88e4-2897-67292f72d861.png)


この座標を取得する場合は下記のメソッドを使えばよい。これもマウス用のメソッドだが、シングルタッチでも同様に使用可能。
Input.mousePosition;

#タッチ座標をワールド座標に変換する
さて、タッチ座標は上記のメソッドで取得できるようになるが、実はこれだけでは不十分である。
例として、下記図の設定でのカメラ座標は(0, 0, -10)だと分かるが、これはワールド座標系での座標を意味している。
カメラを中心とした座標はこんな感じになっており、タッチパネルと明らかに異なることが分かる。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/162164/476e8178-247e-c042-5b95-e4542cfc27a3.png)

つまりタッチ座標をワールド座標に変換しなければならない。変換は下記のメソッドを使えばよい。
Camera.main.ScreenToWorldPoint(Vector3 position);

#サンプルコード
このコードは、
　(1)タッチを検出
　(2)タッチ座標を検出
　(3)タッチ座標をワールド座標に変換
　(4)キャラ位置とタッチ位置から移動方向ベクトルを計算
　(5)(4)の計算値をvelocityにセットしてキャラを移動させる
　(6)指を離したときはキャラを停止する
という処理となっている。

```cs:moveTest.cs
using UnityEngine;
using System.Collections;

public class MoveTest : MonoBehaviour {
	public static Vector2 screenPos; 
	public static Vector2 worldPos;

	// Update is called once per frame
	void Update () {
		if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0)) {
			screenPos = Input.mousePosition;
			worldPos = Camera.main.ScreenToWorldPoint(screenPos);

			//指で隠れないようにタッチ座標の少し上を移動地点に設定する
			Vector3 fixWorldPos = worldPos;
			fixWorldPos.y += 0.7f;

			//タッチ位置からキャラ位置を引くことで、移動方向のベクトルが求められる。
			//距離が離れているほど移動速度が早くなり、近づくにつれて減速する。
			//あとは適度に係数を掛けることで移動速度を調整することもできる。
			GetComponent<Rigidbody2D>().velocity = (fixWorldPos - transform.position) * 10;

			//ちなみに移動速度を一定にしたい場合はnormalizedプロパティを用いて単位ベクトルに変換すればよい
			//GetComponent<Rigidbody2D>().velocity = (fixWorldPos - transform.position).normalized * 3;
		}

		if (Input.GetMouseButtonUp (0)) {
			GetComponent<Rigidbody2D>().velocity = Vector3.zero;

		}
	
	}
}
```

#実行結果
タッチ座標(screenPos)がワールド座標(worldPos)に変換され、かつタッチ位置にキャラが移動することを確認できた。
毎フレームでタッチ検出してるので、ドラッグ操作も一応できる。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/162164/fc846560-820e-d291-c561-5fc311a4c41d.png)


#今後の課題
色々タッチして気づいたのだが、スマホ上ではワールド座標の左右が切れていることが分かった。Y座標については-5～5をカバーしており問題なし。
（Unityエディタ上では、ワールド座標のX座標は-3.125～3.125まであるはずなのに、スマホ上では-2.8～2.8くらいになっている）
試しにスマホを横置きにしてみたところ、Y座標は-5～5を保っており問題ないが、X座標は逆に範囲が拡大してしまった。
おそらくY座標の設定を優先しているからだと思われる。これはスマホのアスペクト比によって画面表示範囲が異なることを意味している。左右端がカットされるor拡大されると問題があるゲームの場合は要検討である。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/162164/a4841e56-f815-d5f8-6a1d-c6f12f680d70.png)

以上
PyTorch の DataLoader でミニバッチを生成すると CUDA テンソルではなくなる

# 現象

`DataLoader` で CUDA 指定した1次元テンソルからミニバッチを生成すると、生成されたミニバッチから CUDA 指定が外れます。

```py:検証コード
import torch

print(torch.__version__)

x = torch.FloatTensor([[1, 2], [3, 4], [5, 6], [7, 8]]).cuda()
y = torch.LongTensor([0, 0, 1, 1]).cuda()

dataset = torch.utils.data.TensorDataset(x, y)
dataloader = DataLoader(dataset, batch_size = 2, shuffle = True)

for batch_x, batch_y in dataloader:
    print("x: {0}, y: {1}".format(type(batch_x), type(batch_y)))
```
```:実行結果
0.3.0b0+591e73e
x: <class 'torch.cuda.FloatTensor'>, y: <class 'torch.LongTensor'>  # 本当は y も torch.cuda.FloatTensor になってほしい
x: <class 'torch.cuda.FloatTensor'>, y: <class 'torch.LongTensor'>
```

# 原因

[`DataLoader` のソースコード](https://github.com/pytorch/pytorch/blob/master/torch/utils/data/dataloader.py)を見ると、ミニバッチのひとつひとつの要素を取り出してリストに格納し、それらを再結合しミニバッチとして返す、という実装になっています。

[ミニバッチとして返すデータを選び](https://github.com/pytorch/pytorch/blob/master/torch/utils/data/dataloader.py#L250)、

```py
indices = next(self.sample_iter)  # may raise StopIteration
```

[ミニバッチのひとつひとつの要素を取り出してリストに格納し](https://github.com/pytorch/pytorch/blob/master/torch/utils/data/dataloader.py#L251)、

```py
batch = self.collate_fn([self.dataset[i] for i in indices])
```

[それらを再結合しミニバッチとして返す](https://github.com/pytorch/pytorch/blob/master/torch/utils/data/dataloader.py#L100-L138)。

```py
if torch.is_tensor(batch[0]):
    return torch.stack(batch, 0, out=out)
elif isinstance(batch[0], int_classes):
    return torch.LongTensor(batch)
```

上記実装の「ミニバッチのひとつひとつの要素を取り出して」の部分が曲者です。

テンソルは要素を一つ取り出すと次元が一つ下がります。2次元テンソルである `x` は次元が一つ下がっても1次元テンソルになるだけでテンソルのままですが、1次元テンソルである `y` は次元が一つ下がるとだたの `int` 型の数値になってしまい、テンソルではなくなります。

しかし、`DataLoader` が最終的に返す値はテンソルでなければならないので「それらを再結合しミニバッチとして返す」の中で `int` 型の値を集めてテンソルを作り直しているのですが、その際に `torch.LongTensor` が使われています。そのため、結果として `DataLoader` で1次元テンソルからミニバッチを生成すると、生成されたミニバッチから CUDA 指定が外れてしまいます。

# 対策

CUDA 指定を外したミニバッチを返す、という実装になっている以上、もう一度 `cuda()` を呼ぶしかありません。

```py:検証コード
for batch_x, batch_y in dataloader:
    print("x: {0}, y: {1}".format(type(batch_x), type(batch_y.cuda())))
```

```:実行結果
x: <class 'torch.cuda.FloatTensor'>, y: <class 'torch.cuda.LongTensor'>
x: <class 'torch.cuda.FloatTensor'>, y: <class 'torch.cuda.LongTensor'>
```

もしくは、`DataLoader` は[「それらを再結合しミニバッチとして返す」を実行する関数を `collate_fn` で指定できる](http://pytorch.org/docs/master/data.html?highlight=dataloader#torch.utils.data.DataLoader)ので、CUDA 指定を外さずにミニバッチを返す関数を自分で定義して指定することもできます。

微妙に気が利かない実装だな……
Firefoxで検索バーの結果を新しいタブで開く方法

標準設定では検索バーにキーワードを入力し、エンターを押すとカレントのタブに検索結果が表示されます。
しかし、下記の手順を行うだけで、検索バーからの検索結果が新しいタブで表示されるようになります。

＊注意＊　下記の操作は全て自己責任で行ってください

1. Firefoxを起動
2. アドレスバーに「about:config」と入力し、エンター
3. 「危険性を承知の上で使用する」をクリック
4. 設定名「browser.search.openintab」を検索
5. 値を「true」に変更 

画像付きの解説はブログに載せていますので、良ければ見てください。
<a href="https://tsukasa-labz.hateblo.jp/entry/2018/01/27/152148" target="_blank">つかさラボのBlog@hatena</a>

2023/07/17時点でも有効なことを確認。
Firefox 115.0.2 (64 ビット)
クラス変数とクラスインスタンス変数を理解する

## クラス変数とは
クラス変数とはクラスで定義する変数である。クラス変数はクラスメソッド内とクラス定義内、またはそのサブクラスがアクセスでき共有される。
### 定義方法
``` ruby
class A
  # @@プレフィックスを使用
  @@value = 1
  def self.value; @@value; end
end
```

### クラス変数と継承
クラスAが変数```@@value```を定義する場合、そのすべてのサブクラスが```@@value```を使える。これは<b>継承のように見えるが、実際は違う。</b>どこかのサブクラスがクラス変数```@@value```に値を代入すると、クラス変数のプライベートコピーは作成されず、スーパークラスから見える値がすべて変更される。

``` ruby
class A
  @@value = 1  
  def self.value
    @@value
  end  
end  
A.value　# 1

class B < A
  @@value = 2
end
A.value # 2
B.value # 2

class C < A
  @@value = 3
end
# すべての値が変わる
A.value # 3
B.value # 3
C.value # 3
```

## クラスインスタンス変数とは
Rubyにおいてクラスもオブジェクトである。そのため他のオブジェクトと同じようにインスタンス変数を持つことができ、それをクラスインスタンス変数と呼ぶ。クラスインスタンス変数とインスタンス変数でプレフィックス記号に違いがないため、インスタンスメソッド内では使用できない。

### 定義方法
``` ruby
class A
  # @プレフィックスを使用
  @value = 1
  def self.value; @value; end
end
```

### クラスインスタンス変数と継承
クラスインスタンス変数は、Classオブジェクトのインスタンス変数にすぎない。
AクラスはClassのインスタンスであり、Aクラスを継承したBクラスもまたClassのインスタンスである。クラスが継承関係であろうと、それぞれのAクラス,Bクラスのクラスインスタンス変数は、何も関係ない。それぞれで違う値をセットしても他には影響がない。

``` ruby
class A
  @value = 1  
  def self.value
    @value
  end  
end  
A.value

class B < A
  @value = 2
end
A.value
B.value

class C < A
  @value = 3
end
# 値を変更しても影響を受けていない。
A.value # 1
B.value # 2
C.value # 3
```
texファイルを開くときに文字化けしてしまったら（Mac）

Macでの話になります。
ネットからダウンロードしたtexファイルをTeXShopで開こうとしたら、

>このファイルは IsoLatin9 エンコーディングで開かれました。
エンコーディングが違うため、ファイルを Unicode（UTF-8） エンコーディングで開くことができませんでした。ファイルを他のエンコーディングで開きたい場合は、ウインドウを閉じてもう一度開いて下さい。

というエラーが出ました。

このような時は、texファイルの文字コードを変換してしまいましょう。

まず、MacPortsがインストールされていなければ、インストールします。
その後のやり方も含めて、こちらのサイトが参考になります。ターミナルでコマンドを入力して操作することになるので、その辺が分からない方は調べてください。

教授でもできる、Mac OS XへのMacPortsのインストレーション
http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/install_macports.html

例えば、euc.texというファイルの文字コードをEUC-JPからUTF-8へ変換したい時には、
```
nkf -w --overwrite euc.tex
```
とターミナルで実行すればできます。
当然、euc.texが保存されているディレクトリ内で実行してください。

これの後、TeXShopでこのファイルを開くと、文字化けは解消されていることと思います。
画像認識技術の評価時の留意点

 画像認識技術の評価時の留意点をメモしてみました。

世の中画像認識技術は多数あります。使えるはずと思ってみたものが使い物にならないこともあります。
使い物にならないことに気づくの遅れると、製品開発のスケジュールを台無しにしてしまうことが起こります。
そのならないように、以下のメモを記します。

## レイテンシ(遅延)がどれだけ小さいかが重要。
- 動いている対象にフィードバックをかけようとしたらレイテンシをどう少なく設計してあるか大切。
- 例：ドローンの姿勢制御
- フレームレートが高くてもレイテンシが大きいことがある。
- レイテンシを小さくするには、圧縮・展開するデータ形式を使わない。
    - Motion jpeg よりは、YUV422。
   
## fps の値が低いと追跡処理は困難（あるいは不可能）

- 被写体の画像上の動きが大きいと追跡不能になることが多い。長方形の枠の重なりを使ってフレーム間での位置を比較していることが多いため。
- 撮影された画像の歪み補正、cropping処理が重要
    - 撮影した画像の一部を取り出して、歪み補正をかけて、認識をさせやすくできること。
        - 画像認識部分に入力できる画像サイズには限りがあります。またDNN系では、一定のサイズにリサイズして入力します。そのときに探索しなくていい部分を除いてあって、縮小前の画像領域が小さくなっていることが（＝リサイズ時の縮小の変化量が少ないようにしておくこと）が検出をさせやすくすることにつながります。

- 輝度値の補正、ノイズ処理
    - 逆光時の画像、夜間の画像などは、昼間の順光時の画像とは見え方が異なります。
    - 信号値が小さくなりがちで、しかもノイズが大きくなりがちなときは、その影響を低減できるようにシステムを設計します。
 
- 検出処理結果と元データとの対応とが可能な状況が保たれているか（時刻情報の取り扱いはどうなっているか）
    - 画像バッファの扱いしだいでは、時刻情報が失われてしまっていて、検出結果の枠と対応付けていい画像上の位置とが一致しないことがあります。
    - 描画される枠は、表示している画像の??msec 前のデータというシステムも聞いたことがあります。
・画素数が高ければ十分なわけではない。レンスの性能が無視できないことがある。

　画像信号のハードウェアの性能が向上してきていて、fullHD以上の画素数の画像入力に対して
　画像認識を動作させたい時がある。

## 画素数だけあげれば高解像度になるわけではない。

　　その画像の細部で画像認識をさせようとする。その細部を拡大して見ると、画素数の割には、画像がボケボケになっていることに気づくこともあるだろう。

　　画像は、レンズの特性で、見える鮮明さには限界がある。NTSC時代のレンズでは、fullHDの画像の細部にわたって鮮明さを維持することができない。

- JPEG圧縮の影響受けた画像と、受ける前の画像との違い
    JPEG圧縮の影響を受けた画像では、アルゴリズムによっては劣化を生じます。暗い画像ほど影響を受けやすくなります。

- 画像サイズとフレームレートでどのような組み合わせまでが実現可能かということ
- 検出対象の数が多い時に、処理時間がどうなるのか？
    - 処理時間に打ち切りを加えるときには、どのような打ち切り方法になるのか
    - 大きなオブジェクトの側から検出されるのかどうか

そのため、Ａという装置の目的では十分でも、Ｂという装置の目的では不十分ということが起こりえます。
ですから、これらの評価時の留意点について、開発の早めの段階で気にかけておいてください。

## 被写体の動きと明るさとシャッター速度

使用しているカメラ（レンズ＋イメージセンサ＋撮影のための制御）によって、画像は違ってくる。



##  設置条件での見え方を確かめよう

- カメラの配置と被写体との距離、レンズの画角でどう見えるか
    - 設置環境で得られる画像は違ってくる。
    - 設置場所の明るさは、自由にコントロールできないことが多い。


----
追記：

検討している画像認識技術が、単独で評価するときにはうまくいくものでも、複数の処理が同一のマシン上で動作している時には、うまくいかなくなることがある。


## 学習依存の問題を見極めること

- 学習依存の問題は、学習が不足している時点で、学習次第でどれくらいどれくらい良くなりうるのかを見極める力量が必要だ。
    - 間違いやすいこと：　学習データを追加すれば改善することなのに手法の限界と早合点する可能性。
    - 間違えやすいこと：　本質的な手法の限界があるのにもかかわらず、データさえ追加すればなんとかなる思い込んでしまうこと。
   
　このように、両方の間違え方がある。いま、自分が抱えている課題に対する状況はどちらなのかを見極めるのは、それなりの技術者としての勘が必要になってしまうと言わざるをえない。
機械学習の機械ってなんだ？

# 背景


私と専門が異なる人と会話をするとき、機械という言葉がうまく伝わらないことがありました。

* 製造業の人に機械学習の研究を紹介したら「ロボットの研究をされているんですね」と言われた（仕事柄「機械＝動力を持った装置」だと思い込んでいる）
* 飲み会で文系の友人に「研究室のマシンが壊れちゃったんだよね」という話をしたら「パソコンのことマシンってｗｗｗ」と大爆笑された（普通の人はコンピュータのことをマシンと呼ぶことに違和感を覚える）

機械ではありませんが、製造業のお客さんに「機械学習を使って不良品判定をする分類 "器" を作れば、検査工程を省力化できるかもしれませんよ」という提案をしたら「製造ラインに組み込む "装置" の開発までやってくれるんですね！」と認識されてしまい、慌てて修正したという話もあります。機械という言葉の指すものが人によって違うということを認識しておかないと危ないなー、と思いました。

一方で、情報処理の分野において「機械」は便利ワードで、いろいろなものを機械と呼びます。便利に使いすぎて自分でもどう使い分けているのか分からなくなってしまったので、改めて整理してみました。

# 機械という言葉が指すもの

機械という言葉を使う人に応じて、3段階に分けられそうです。

|対象者|機械が指すもの|機械が指す用語|
|:--|:--|--:|
|一般人|動力を持った装置|machine|
|ITに強い人|コンピュータ|(computing) machine|
|ITの専門家|コンピュータの抽象的なモデル|(abstract (computing)) machine|

## 普通の人がイメージする機械

![machine_jidou_seisan_line.png](https://qiita-image-store.s3.amazonaws.com/0/51798/58609911-5e49-d0d9-08ca-66a10fd42448.png)
[自動生産ラインのイラスト](http://www.irasutoya.com/2015/09/blog-post_504.html)

普通の人にとって、機械は「ウィンウィン動く大掛かりな装置」というイメージではないでしょうか。少なくとも、パソコンやスマホを見て「機械だ」と思う人は少ないと思います。

フィンテックとかインダストリー4.0とかマテリアルズ・インフォマティクスとか「IT 業界じゃないけど、とりあえず AI 使ってイノベーション起こすぜ」的な流れで非 IT 企業のシステム部門じゃない人たちと機械学習の会話をする機会もあると思いますが、そういった人たちが「機械」と聞いて何をイメージするか意識しておかないと認識が食い違うので注意が必要です。

## ITに強い人がイメージする機械

![computer_desktop_document.png](https://qiita-image-store.s3.amazonaws.com/0/51798/ff5a94e7-0c5f-340a-5617-2b6635cf7f1c.png)![computer_supercomputer_red.png](https://qiita-image-store.s3.amazonaws.com/0/51798/3a261e3c-2522-3cb4-0b3d-02ca0ffc869c.png)
[デスクトップコンピュータのイラスト](http://www.irasutoya.com/2017/07/blog-post_878.html) / [スーパーコンピューターのイラスト](http://www.irasutoya.com/2014/02/blog-post_2205.html)

一方で、パソコンやスマホ以外のコンピュータと接する機会のある人にとっては、機械やマシンという言葉はコンピュータを指します。コンピュータの文脈であることが明らかなので、computing machine の computing を省略して話すわけです。

理系の学生が「研究室のマシンが～」などと言うのは、研究室で使っているのがパーソナルじゃないコンピュータなのでパソコンという表現が不適切だからです（コンピュータって言えばいいような……）。

## ITの専門家がイメージする機械

![図5.png](https://qiita-image-store.s3.amazonaws.com/0/51798/6afde593-2c1c-7a4e-1346-8136a3576927.png)

そして、ITを専門とする学生やエンジニアにとって、機械という言葉はもはや物理的な何かを指してはおらず、コンピュータを抽象化した机上の数理モデルを指します。abstract machine（この時点で既に computing machine の computing が省略されている）の abstract を省略して話すわけです。コンピュータは「データを入力すると、何らかの計算を行い、結果を出力する装置」なので、上の図のように表せます。ITの専門家にとって、この図で表せるものは全部機械です（言いすぎかな……）。

機械学習の機械も、この図のことを指しているようです（私はそう理解しました）。機械学習という言葉は「**機械**が（自身の構成要素である操作を）**学習**する方法」という意味なのだと考えています（本当は「機械を学習する」のかもしれないし「機械的に学習する」のかもしれませんが、真意は解明できず……）。

機械学習関連の文献を読むときは、機械を「入力・出力・操作から成る数理モデル」に置き換えて読んでも意味が通じることが多いです。例えば support vector machine、初めて見たときは「このアルゴリズムの一体どこが machine なんだ……」と思いましたが、最近は「サポートベクターを用いた数理モデル」くらいのノリで名前つけたんだろうなーと思っています。

# 参考

* [機械 -Wikipedia](https://ja.wikipedia.org/wiki/%E6%A9%9F%E6%A2%B0)
* [抽象機械 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%8A%BD%E8%B1%A1%E6%A9%9F%E6%A2%B0)
* [機械学習 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92)
さくらのレンタルサーバライトに写真ギャラリーを設置した

# プログラムの選定

いくつか試してみて、[PhotoShow](http://www.photoshow-gallery.com/)に決定。

理由は:
- フリー(GPL3)
- PC、Android、iPhoneからそれなりに見られる。
- EXIFを見て天地を合わせてくれる。
- ブラウザから複数ファイルのアップロードが可能。
- データベースなしで動くのでレンタルサーバーライトでも動かせる。
- githubのプロジェクトが活動中。

Thibaud Rohmer氏作のPhotoShow自体の説明は[GitHub](https://github.com/thibaud-rohmer/PhotoShow)と[紹介ページ](http://www.photoshow-gallery.com/)を参照。[デモページ](http://www.photoshow-gallery.com/demo
)のスクリーンショットだけ貼っておく。
![photoshow_demo.png](https://qiita-image-store.s3.amazonaws.com/0/231039/3a68b87e-6d7e-e8d3-b018-ad762c94a940.png)

# レンタルサーバへのインストール

最低限だと、チェックアウトして権限設定して、設定ファイルを編集してアップロードするだけ。

```
git clone https://github.com/thibaud-rohmer/PhotoShow.git
cd PhotoShow

# さくらではPHPスクリプトとそのディレクトリは705か755にしないといけない。
chmod -v -R a=rX,u+w ./
chmod 755 ./**/*.php

# 写真と生成されたサムネイルのディレクトリを作成。
mkdir --mode=755 Photos Generated

# 生成したディレクトリに合わせて設定を編集
emacs config.php
```
```config.php``` の変更点はとりあえず2箇所。今作ったディレクトリとPhotoShowを設置するサーバー上の場所に合わせてパスを設定。

```
$config->photos_dir   = "/home/YOUR_DOMAIN/www/photoshow/Photos";
$config->ps_generated   = "/home/YOUR_DOMAIN/www/photoshow/Generated";
```

で、あとは全部FTPでアップロードして、ファイルマネージャでファイルやディレクトリの権限を確認。

ブラウザで http://YOUR_DOMAIN/photoshow/ を開けばアカウント設定が始まるはず。

# 日本語化
~~日本語設定が選べなかったので、自分で作った。[このフォーク](https://github.com/ttk-kstn/PhotoShow/tree/japanese)の[inc/loc/japanese.ini](https://github.com/ttk-kstn/PhotoShow/blob/japanese/inc/loc/japanese.ini)を置くだけで設定から選べるようになる。作者には[プルリクエスト済み](https://github.com/thibaud-rohmer/PhotoShow/pull/361)なので、マージされれば何もしなくても日本語が選べるようになるはず。~~

と、書いて数時間後にはマージしてもらえたので、最新版なら設定から日本語化できるはず。ただ、日本語の内容までレビューされたとは思えないので、ここを見ている方がレビューしてくれると嬉しいです。
Ruby技術者認定試験Silver 合格体験記

#はじめに
先日（18/01/13）、Ruby技術者認定試験Silverに合格しました。
80点でギリギリ受かった感じですので、今後も努力を続けたいと思います。
勉強時間、勉強方法などを書いておきます。
これから受験する方の参考になれば幸いです。

#勉強開始前のスキル
　Ruby は普段の仕事で用いるため、基本的な文法は一通り押さえていました。しかし、特殊なライブラリを中心に使っているため、組み込み関数のメソッドはほとんど知りませんでした。おそらく頻出メソッドのうち２割も知らなかったのではないかと思います。
　他に使えるプログラミング言語はFortranとC言語がありました。この二つも一通りの文法はわかる程度の実力です。

#のべ勉強時間と勉強期間
のべ勉強時間：40 h 弱
勉強期間　　：1.5ヶ月（7週間）

平均すると１日１時間弱ということになりますが、最初の１週間にスタートダッシュで１０時間、最後の一週間に詰め込みで１０時間と言う感じで、偏った配分になっています。期間中盤は仕事が忙しかったこともありますが、最初の１週間～１０日で詰め込んでから模擬問題を解いたら６割弱とれたため、「何だ、イケそうだな」と慢心してしまったことも原因の一つです。

#勉強に使ったサイト、本
[公式ガイド（旧）](https://www.amazon.co.jp/gp/product/4822234304/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1)
　　[最新版の公式対策本](https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-Ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-Silver-Gold%E5%AF%BE%E5%BF%9C-Ruby%E5%85%AC%E5%BC%8F%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8/dp/4774191949/ref=dp_ob_title_bk)は4000円弱と貧乏人には二の足を踏む価格でした。
　　こっちの古い方は中古の送料込で1200円くらいだったため、
　　差額分は手間をかける覚悟でこちらを選びました。
　　お金に余裕があるなら素直に最新版を購入した方がよいと思います。
　　巻末の模擬問題100問は 3周して、八割がた暗記しました。
[Rubyがミニツク内の対策問題集](http://www.minituku.net/courses/1049510743/contents/775230600.html)
　　教科書を一通り読んでから、まずはこちらをやり込みました。
　　僕の購入した古い教科書同様、Rubyのバージョンが 1.8.x で古く、
　　2.1では異なる内容や抜けている内容があるのですが、
　　一問解くごとに解答・解説が出てくる、勉強中には嬉しい形式です。
　　４周以上して完璧にしました。
[Rubyリファレンスマニュアル（2.1）](https://docs.ruby-lang.org/ja/2.1.0/doc/index.html)
　　公式リファレンス
　　メインにしている教科書、サイトは古いバージョンだけど、
　　こっちで最新版の記述を確認すれば問題ない、
　　と思っていたのですが、このサイトの形式が僕には合わず、
　　読んでいても全然内容が頭に入ってこなくて困りました。
合格体験記など
　　GoogleやQiita内で検索すればたくさん出てきます。
　　頻出分野・問題をまとめている記事も多いため、
　　勉強の優先順位をつける際に助かりました
　　（Arrayが最優先、次いでHash, String など）。
[まつもと ゆきひろのRuby検定](http://itpro.nikkeibp.co.jp/article/COLUMN/20080115/291042/)（解説を見るにはITプロの無料アカウントが必要）
　　合格体験記を読んでいて見つけた記事です。
　　これも旧版（Ruby 1.8）の内容ですね。
　　試験10日前に挑戦して結構間違えてしまい、ショックを受けました。
[RExオンライン模擬問題](https://rex.libertyfish.co.jp/)（要 githubアカウント）
　　一通り勉強した時点（＊）で挑戦し、５８点を取れたことを確認して、
　　一ヶ月後の 1/13に受験予約を入れました。
　　　（＊）公式ガイドを２周、ミニツクの対策問題を１周、
　　　　　　公式ガイドの模擬問題を１周
　　試験一週間前に再挑戦して５６点だったときは血の気が引きましたが、
　　最後の一週間で必死に勉強する動機づけになりました。

#おわりに
　今回の受験勉強は自分のRubyスキルを見直す良い機会でした。勉強の進め方に反省はあるものの、合格できたことは大きな自信に繋がりました。これからも慢心することなく、勉強を続けていきたいと思います。

さぁ、次はゴールドだ…
日本語でtexを書く時に使ってるpre-commit

# pre-commitとは

gitでcommit処理をする直前に呼び出す処理のことです

# texでpre-commitを使う理由

よく論文作成などで、句読点の「。」を「．」に「、」を「，」にするように注意されます
しかし普段使いを考えると設定などで句読点を変更したくない

そんな時にせっかくだからtexの論文をgitで管理してるのだったら、git hooksをうまく使ってこの辺を解消しようと思いやってみました

# やり方

以下のコードを、texのレポジトリ配下の`.git/hooks/pre-commit`に追加し、`chmod +x .git/hooks/pre-commit`とするだけです

```shell:pre-commit

#!/bin/sh
if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

LIST=$(git diff-index --name-status $against -- | grep -E '^[AUM].*\.tex$'| cut -c3-)
echo $LIST
for file in $LIST
do
        sed -i -e "s/。/．/g" $file
        sed -i -e "s/、/，/g" $file
        git add $file
done

```

コード内で行なっている処理は
コミット対象に`.tex`ファイルがある場合、`sed -i -e "s/。/．/g"`と`sed -i -e "s/、/，/g"`で句読点を書き換えているだけです

ちなみに`4b825dc642cb6eb9a060e54bf8d69288fbee4904`というハッシュ値はempty treeを表す特殊なハッシュ値だそうです
CMakeなんてCPackでRPM化してしまえ!

CPack のことをずっと無視してたんですが、じつはこれ、CMakeプロジェクトをパッケージ化するのに超便利なんですよね! というワケで、CMake自身をCPackでパッケージ化してしまいます。

CMake ビルドディレクトリでビルド完了したら以下のコマンドで一発!

```$ cpack -G RPM CPackConfig.cmake```

今回は私が主に使用しているのがCentOS6なのでRPMを作成していますが、deb等他のパッケージも同様にイケるんではないでしょうか。

> 11251984 Jan 14 17:42 cmake-3.9.6-Linux-x86_64.rpm

こんな感じにパッケージができあがるのであとは`rpm -i`でインストールしてしまえます。

CMakeLists.txt を編集した際には`cmake .`で再コンフィグしないとCPackConfig.cmakeが更新されないので、それだけは気をつけてください。

次回はいよいよClang,libc++などをパッケージ化してしまいます。じつはいま調整中で、もうちょっとこねくり回せたら表に出せるとおもいます。
rebuild.fm をGCP speech APIで文字起こし

Rebuild.fm を後で聞くときに、shownoteと突き合わせてピンポイントでシークして聞きたい。
→これをやりたいけど。。とりあえず
文字起こしをやった。

1.GCPの設定
ここを参照
https://qiita.com/knyrc/items/7aab521edfc9bfb06625
2.スクリプトの準備
ここを参照
https://qiita.com/knyrc/items/7aab521edfc9bfb06625
3.躓いた点
mp3はだめ。flacに変換。あとモノラルじゃないとダメ？モノラルに変換必要。
3.結果
http://rebuild.fm/197a/
を文字にして
11341文字
NDL Authoritiesでの上位語、下位語、関連語、同義語、同義語から標目、参考を検索するためのSPARQLクエリチートシート

# はじめに
## この記事のポイント
Web Authorities Endpointにおける典拠データの上位語・下位語・関連語・同義語・同義語から標目・参考を検索する際の、
SPARQLのクエリを掲載します。

##Web Authorities、典拠データとは
国立国会図書館の運営する典拠データの検索サイトです。
https://id.ndl.go.jp/auth/ndla

「典拠データとは何か、その利便性」についてはこちらの記事を参照して下さい。
https://qiita.com/Avocado/items/1270612179fac82ac187

##SPARQLとは
WEB APIでエンドポイントを呼び出し、データベースへのアクセスを行う際に
必要となる言語です。
クエリは、このページでテストすることが可能です。
また、詳細な仕様も掲載されています。
http://id.ndl.go.jp/information/sparql/


# SPARQLクエリ

例として、「インターネット」、関連語として「Internet」を検索語に使っています。
## 上位語の検索
```sparql:query
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?label WHERE{
   ?uri1 rdfs:label "インターネット"; skos:broader ?uri2.
   ?uri2 rdfs:label ?label.
}
```
###result
|label|
|-----|
|コンピュータネットワーク|

## 下位語の検索
```sparql:query
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?label WHERE{
   ?uri1 rdfs:label "インターネット"; skos:narrower ?uri2.
   ?uri2 rdfs:label ?label.
}
```

###result
|label|
|-----|
|セマンティックウェブ|
|イントラネット|
|バーチャルプライベートネットワーク|

## 関連語の検索
```sparql:query
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?label WHERE {
   ?uri1 rdfs:label "インターネット"; skos:related ?uri2.
    OPTIONAL{
?uri2 rdfs:label ?label
}}
```

###result
|label|
|-----|
|IP電話
|情報活動 (インターネット)
|チャット
|インターネット放送
|ウェブアプリケーション
|ドメイン名
|インターネットプロバイダー
|インターネット広告
|ホームページ
|ネットワークゲーム
|クロール (インターネット)
|インターネット選挙運動
|ソーシャルメディア
|インターネットショッピング
|検索エンジン
|ネット犯罪
|インターネット依存症|

## 同義語の検索
```sparql:query
PREFIX xl: <http://www.w3.org/2008/05/skos-xl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?literal WHERE {
   ?uri1 rdfs:label "インターネット"; xl:altLabel ?uri2.
    OPTIONAL{
?uri2 xl:literalForm ?literal
}}
```

###result
|literal|
|-------|
|Internet|

## 同義語から標目の検索
```sparql:query
PREFIX xl: <http://www.w3.org/2008/05/skos-xl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?label WHERE {
?uri1 rdfs:label ?label; xl:altLabel ?uri2.
?uri2 xl:literalForm "Internet" .
}
```

###result
|label|
|-----|
|インターネット|

## 参考の検索
```sparql:query
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT DISTINCT ?label WHERE{
?uri1 rdfs:seeAlso ?uri2; rdfs:seeAlso ?uri5.
?uri3 owl:sameAs ?uri2; rdfs:label ?label.
?uri4 owl:sameAs ?uri5; rdfs:label "インターネット".
}
```
###result
|label|
|-----|
|インターネット|
|判例|
|法令|
|辞書|
|歴史|
|会議録|
|統計|
|論文集|
|特許|
|世論|
サンプルコードのpackage名には例示用ドメインを使おう

## 概要
Qiitなどに掲載するサンプルコードのpackage名はなにがよいかという小ネタ。
例示用ドメインを使うのが良さそうです。

## Javaのpackage命名方法
すっかりおなじみなので、わざわざ言うまでもないかも知れませんが一応。
Javaのpackage名は、FQCNの重複を避けるためドメイン名を逆順にしたものを先頭に付与するのが慣例となっています。
[The Java Language Specification](https://docs.oracle.com/javase/specs/jls/se9/html/index.html)では、「Example 6.1-1. Unique Package Names」として以下が挙げられています[^jspec]。

```:package名の例
com.nighthacks.java.jag.scrabble
org.openjdk.tools.compiler
net.jcip.annotations
edu.cmu.cs.bovik.cheese
gov.whitehouse.socks.mousefinder
```

## サンプルコードのpackage名
### ドメイン名ベースの命名はちょっと大げさ
とはいえ、サンプルコードに上記のルールを適用するのは、ちょっと大げさな気がします。
サンプルコードのpackage名の要件について簡単に纏めてみました。

- FQCNの重複を気にする必要が無い
- サンプルなので簡潔に書きたい
- サンプルであることを明確にしたい
- そもそも、自分専用のドメイン名を持っていない
- かといって、余所のドメイン名を勝手に使うのも気が引ける

### 予約済みドメインを流用した命名ですっきり
そこで、予約済みドメインを流用することを思いつきました。
予約済みドメインはIANAで管理されており[^iana]、用途に沿ってドキュメントなどで自由に使うことができます。
予約済みのトップレベルドメイン(TLD)は4つあります。

| 予約済みTLD   | 用途                      |
|--------------|--------------------------|
|.test         |テスト用のドメイン             |
|.example      |例示用のドメイン              |
|.localhost    |ループバックアドレス用のドメイン   |
|.invalid      |無効であることを示すためのドメイン |

exampleやinvalidは、サンプルコードのpackage名に使うのにも丁度よいのではないでしょうか。

```java:例
package example

public class SampleClass {
  // ...
}
```

## おわりに
これまでは、`com.example`[^example-com]をpackage名に使ってましたが、これからは`example`でいこうと思います。4文字も減らせます。


[^jspec]: https://docs.oracle.com/javase/specs/jls/se9/html/jls-6.html#d5e8089
[^iana]: https://www.iana.org/domains/reserved
[^example-com]: これも例示用ドメインの[example.com](http://example.com)から命名
xcodebuildでmacOS向けappファイルをエクスポートすると「破損しているか不完全である可能性があるため開けません」となる場合の確認事項


## 環境

* Xcode 9.2
* macOS 10.12.6/10.12.7 (Sierra/High Sierra)

## 現象

自動化のためにxcodebuildを使い，アーカイブとmacOS向けのappファイルのエクスポートをしたところ，appファイルを開いた時に「アプリケーション"XXX.app"は、破損してるか不完全である可能性があるため開けません。」とエラーダイアログが表示されました．（言語設定が英語の場合「You can't open the application "XXX.app" because it may be damaged or incomplete.」）

![error-dialog.png](https://qiita-image-store.s3.amazonaws.com/0/35592/c895f10f-8e5a-b236-33ed-6db2a2c1f810.png "error-dialog.png")



コマンドは[こちら](http://nantekottai.com/2016/10/11/mac-app-ci-5/)を参考に，次のように行っていました．


```bash:
$ xcodebuild -scheme ExportTest archive -archivePath build/ExportTest.xcarchive
$ xcodebuild -exportArchive -archivePath build/ExportTest.xcarchive -exportPath build/ExportTest.app -exportOptionsPlist export-options.plist
```

できあがったappファイルはアイコンに一時停止アイコンがかかったような感じで壊れていることがわかります．

![finder.png](https://qiita-image-store.s3.amazonaws.com/0/35592/5ba735ec-2e67-3f61-b26a-77d17e8616ef.png "finder.png")


## 原因

xcodebuildコマンドの`-exportPath`にappファイルのパスを指定していたのが問題でした（素直に参考元のコマンドを使わず勝手に変更してしまっていました・・・．）
このパラメタは **エクスポート先ディレクトリ名** を指定する必要がありました．
つまり，上記の間違ったコマンドでエクスポートしたことで，次のようなディレクトリ構成になってしまっていました（`ExportTest.app`ディレクトリの下に`ExportTest.app`がエクスポートされた．）

```bash:
$ tree build
build
├── ExportTest.app
│   └── ExportTest.app
│       └── Contents
└── ExportTest.xcarchive
    ├── Info.plist
    ├── Products
    │   └── Applications
    ├── SwiftSupport
    │   └── macosx
    └── dSYMs
        └── ExportTest.app.dSYM
```

## 解決法

そこで，`-exportPath`に正しくディレクトリのパスを渡してあげると，その下にアーカイブファイル名＋`.app`というファイル名でアプリケーションファイルがエクスポートされ，開くとちゃんとアプリケーションが起動しました．

```bash:
$ xcodebuild -exportArchive -archivePath build/ExportTest.xcarchive -exportPath build/pkg -exportOptionsPlist export-options.plist

$ tree build
build
├── ExportTest.xcarchive
│  ├── Info.plist
│  ├── Products
│  │   └── Applications
│  ├── SwiftSupport
│  │   └── macosx
│  └── dSYMs
│      └── ExportTest.app.dSYM
└── pkg
    └── ExportTest.app
        └── Contents
```

## まとめ

ディレクトリ名が`.app`になっているのでFinderでは入れ子で`.app`が内包されていることになかなか気づかず原因特定が困難でした．
xcodebuildを使う場合は`-exportPath`にエクスポートするappファイルのパスではなく，出力先ディレクトリパスを指定する必要がある点，注意してください．
Netlify + Hugo でサイト作る手順メモ

[Netlify](https://www.netlify.com/) を使えば GitHub に Hugo のファイル push すれば自動でビルドしてくれる。

## 用意するもの
- [Hugo](https://gohugo.io/) ファイル一式
  参照 : [Quick Start](https://gohugo.io/getting-started/quick-start/)
- [GitHub](https://github.com/) のアカウント
- [Netlify](https://www.netlify.com/) のアカウント
  - GitHub アカウントでサインインできる


## 手順
- 適当な GitHub repository をつくる
- Hugo のファイル一式を push する

```git clone :URL: https://github.com/shirokuro331/netlify-blog.git
cd :categoryname:
git add -A
git commit -m "commitlog"
git push origin master```

- Netlify から GitHub の repository を選択する
- Netlify で build の設定をする
  - Bransh : master
  - Build command : hugo --theme=:themename: --buildDrafts
  - Publish directory : public/
  - うまくいかない場合 : [Netlify 上で使う Hugo のバージョンを指定する](https://monaural.net/post/201707/set-hugo-version-on-netlify/)
画面白黒になったでぇぇ(汗) for Windows10

はい。タイトルの通りです(笑)

今日おうちでコードガリガリ書いていたら、突然画面が白黒に(;'∀')
『え？何？故障？それとも変なキー押した？！』とまぁ、結構テンパりました(笑)

#どんな状況？
こんな状況。

- Googleも。
 
<img width="600" alt="白黒_00.png" src="https://qiita-image-store.s3.amazonaws.com/0/148396/46d95981-a7dd-9e11-8615-50f0723bab23.png">
　

- Twitterも。
 
<img width="636" alt="白黒_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/148396/c0482569-ecd1-d96e-32d4-89985e41ce24.png">

うん。なんかこれはこれで面白い(笑)

#調べてみた
やっぱり同じ道を辿っておられる先人さんがいらっしゃって。
> [Windows10で画面が白黒になった時](http://d.hatena.ne.jp/y3b5/20171121/1511225303)

Windows10では、**[Ctrl]+[Windowsキー]+[C]**で切り替わるとのこと。
（はてブは良い記事多いなぁ。。）
そしてウチのSurface3のキー配置はというと。
<img width="600" alt="白黒_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/148396/f9b6260a-889c-a44a-5c07-6e7b445e5637.png">
そりゃあ、コピペの時押しちゃうこともあるよ！
誰だ、こんな紛らわしいショートカットにしたのo(*≧д≦)o))

#Windows10だけなのか？
> [ハイコントラストのショートカットキーについて - マイクロソフト コミュニティ](https://answers.microsoft.com/ja-jp/windows/forum/windows8_1-desktop/%E3%83%8F%E3%82%A4%E3%82%B3%E3%83%B3%E3%83%88/668f8843-30aa-45be-865e-285e796a5bc0?auth=1)

回答の記載に
> 「ハイコントラスト」の「左ALT＋左SHIFT＋PrintScreenキーでハイコントラストを切り替えます」にチェックがついているのを確認してから「ハイコントラストのテーマを選択します」をクリック。

とある所みると、Windows8とかでは、やっぱりショートカット違ってたみたい。
Windows10にはそんなチェックボックスなさそうだし（下図）。
<img width="619" alt="白黒_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/148396/e3266318-f68f-0dde-2c8e-353f51e12726.png">

#直してみた
直すには単純にもう一度**[Ctrl]+[Windowsキー]+[C]**を押すだけだとのこと。
実際に直してみた。

おぉ～。
<img width="635" alt="白黒_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/148396/e7e30925-c767-66a3-75d0-ca47c961da1c.png">

#直してみて
- 直ってみるとあっけなかった
- 意外とハイコントラスト（白黒）もイケてた
- 同じ轍を先に踏んでくれた先人に感謝
- 直って良かったぁ(安堵)
railsにcsvをインポートする

# 目的

railsにcsvデータをインポートする。バルクインサートで一度に複数のデータを追加したい。定期的に行いたいがここでは自動化せず手動で。

# 仕様

rails 5.1.4
db postgres
サーバー heroku

# CSVメソッドについて

ここにCSVメソッドについてはまとめる

https://qiita.com/you88/items/3238ced3b6b5640ef3d2

# activerecord-importが便利そう

* ２つのモデル modelAとmodelBを作る
* modelBにmodelAを繰り返し処理でデータを入れていく
* modelBのデータを配列でまとめてimport arrayでインポート
* csvデータをdbフォルダ直下に置く
* rails consoleでimportを実行

下記をmodel/application_record.rbに記載。

```ruby:import.rb
  def self.simple_import(path: '', col_sep: ',')
    a = []
    CSV.foreach(path, headers: true, col_sep: col_sep) do |r|
      a << self.new(get_import_params(r))
    end
    import a # activerecord-importのメソッドです。
  end

private
  def self.get_import_params(row)
    headers = row.headers & self.column_names # 存在するカラム名のみに限定する
    headers.each_with_object({}) do |c, h|
      h[c.to_sym] = row.field(c)
    end
  end
```

# railsconsoleにて下記をうつ

```
Post.simple_import(path: 'db/input.csv', col_sep: ',')
```
Post部分は対象のmodelに変換

# herokuの場合

```
heroku run rails c
```

でconsoleを立ち上げて上記のコマンドを打つ

# 参考にした記事

https://qiita.com/junara/items/183aaff5e5b77ec1c679
nRF52832搭載BLEモジュールをArduinoで開発するためにするアレ

##概要
技適取得済みのこういうモジュールを自作ボードに乗せてArduinoでゆるふわに開発するためのアレです。
![DPdDvzcVwAALA_E.jpg](https://qiita-image-store.s3.amazonaws.com/0/21846/9e5ed358-ad2e-6291-de25-65ef8a693ebd.jpeg)

Arduino化についてはなんパターンかありますが今回はAdafruit Feather nRF52のファームウェアを利用します。
このボードはBLEライブラリを1からちゃんと作ってる(Mbedの流用とかじゃない)、中身が実はFreeRTOSで動いているという特徴があります。

ボードをそのまま使えれば楽なのですが自分で設計したボードを使いたいときもまぁあるかと思います、サイズ的な問題だったり、リチウムイオン電池じゃなくエネループ使いたいとか、色々余計なものが付いていて消費電流高いとか……
でも特に理由がない場合は製品を買うのが良いです、圧倒的に楽です。

##ブートローダー
Feather nRF52はブートローダーがリセット後数秒間はシリアルピンからスケッチが送られて来ないか監視して有ればスケッチを書き込み、無ければ普通にプログラムを起動します、Arduinoですね。要するにブートローダーを1回書き込んでしまえば後はusbシリアル変換モジュール+Arduino IDEで開発できるというわけです。

ブートローダーはここからダウンロードできます。
https://github.com/adafruit/Adafruit_nRF52_Arduino

2018/1/13日現在では2つありますが
bin/bootloader/feather52/5.1.0/dual/feather52_bootloader_5.1.0_s132_dual.hex
の方で良いと思います、ダウンロードしときましょう。

##書き込み

###BLE Nanoの書き込み器

入手性の高いBLE Nanoの下の書き込み器が利用できます、BLEに興味がある、あった人はすでに持ってるかもしれません、書き込み器のファームウェアを下記リンクの奴にアップグレードします、持っているのがnano2用の物ならアップグレードの必要は無いはずです。

https://github.com/redbear/nRF5x/tree/master/nRF52832/daplink

配線は

| 書き込み器 | <=> | BLE Module |
|:--:|:--:|:--:|
| VDD | <=> | VDD |
| GND | <=> | GND |
| SCLK | <=> | SWDCLK |
| SDIO | <=> | SWDIO |

のように繋ぎます注意点としてはVINではなくVDDです。
これでさっきダウンロードしたfeather52_bootloader_5.1.0_s132_dual.hexファイルをドライブにドラッグアンドドロップすれば書き込んでくれます。

イメージ画像
![DTVS0YtUMAAW3fp.jpg](https://qiita-image-store.s3.amazonaws.com/0/21846/0cf1296c-145a-3520-0737-069f8ed33fd6.jpeg)


###11U35マイコンボード+DAPLink

BLE Nanoを持ってない人向けにもう1つのやり方としてそこそこ安価に書き込み器を作るやり方を書いておきます。

書き込み器に秋月電子の[ＬＰＣ１１Ｕ３５マイコンボードキット](http://akizukidenshi.com/catalog/g/gK-12144/)を利用します。
このボードに書き込み器側が11U35でターゲット側がnRF52832なDAPLinkのファームウェアを書き込みます、純正Mbedには無さそうですがオープンソースのボードでファームウェアまで公開してくれている人がいるのでこれを利用させてもらいます。
https://github.com/makerdiary/nrf52832-mdk

bin/lpc11u35_nrf52832mdk_if_crc_latest.bin
が書き込み器側のファームウェアです、このファイルをマイコンボードキットに書き込みます。11U35はPC側からはドライブに見えてそこにドラッグアンドドロップするだけプログラムを書き込めるので説明書を見ながら書き込みましょう。書き込んだ後にリセットするとドライブ名がDAPLINKになるはずです。

配線は

| 書き込み器 | <=> | BLE Module |
|:--:|:--:|:--:|
| 3.3V | <=> | VDD |
| GND | <=> | GND |
| 0_7 | <=> | SWDCLK |
| 0_8 | <=> | SWDIO |

のようにつなぎます、つないだらfeather52_bootloader_5.1.0_s132_dual.hexをドライブにドラッグアンドドロップで書き込みができます。

イメージ画像
![IMG_0346.jpg](https://qiita-image-store.s3.amazonaws.com/0/21846/703fa1e6-5c12-3530-ff2b-202557e66fdb.jpeg)

##まとめ
というわけでブートローダーの書き込み方でした、みなさんもオレオレBLE基板を作ってみてはいかがでしょうか？
ちなみにイメージ画像に登場した基板のソースは[ここ](https://github.com/ogatatsu/BL652-breakout)に置いてあります。
以上です。
OpenCVを利用して画像を圧縮（encode→decode）する

画像を任意の圧縮率で圧縮したいときのメモ。複数の画像をまとめて処理したいことが多いので入力値は画像のリストになっていることに注意。

# 動作環境

- Ubuntu 16.04
- Python 3.5.2
- numpy 1.13.3
- opencv-python 3.2

# 概要

とりあえず使用したい場合は以下を利用

```python

import cv2

def imgEncodeDecode(in_imgs, ch, quality=5):
    """
    入力された画像リストを圧縮する
    [in]  in_imgs:  入力画像リスト
    [in]  ch:       出力画像リストのチャンネル数 （OpenCV形式）
    [in]  quality:  圧縮する品質 (1-100)
    [out] out_imgs: 出力画像リスト
    """

    encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), quality]
    out_imgs = []

    for img in in_imgs:
        result, encimg = cv2.imencode('.jpg', img, encode_param)
        if False == result:
            print('could not encode image!')
            exit()

        decimg = cv2.imdecode(encimg, ch)
        out_imgs.append(decimg)

    return out_imgs
```

# 画像をメモリ上で圧縮する（encode）

```python3
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), quality]
result, encimg = cv2.imencode('.jpg', img, encode_param)
```
qualityには1-100の数値を入力する。高いほど高品質で、低いほど高圧縮になる。詳細は[ドキュメント](https://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html#imencode)を参照されたい。

# 圧縮されたメモリ上の画像を復元する（decode）

```python3
decimg = cv2.imdecode(encimg, ch)
```
encimgはencodeで作成されたオブジェクト、chにはOpenCV形式の画像チャンネルフラグ（`CV_LOAD_IMAGE_*`や`IMREAD_*`）を使用する。詳細は[ドキュメント](https://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html#imdecode)を参照されたい。

# 使用例

```python3
img = cv2.imread(args.jpeg[0])
img = imgEncodeDecode([img], ch, 95)
cv2.imwrite('test.jpg', img[0])
```

## quality=95

![test95.jpg](https://qiita-image-store.s3.amazonaws.com/0/227399/07f07c0e-dda3-1831-72e3-90844bd0c523.jpeg)

ファイルサイズは580kB。画像の劣化はみられない。

## quality=50

![test50.jpg](https://qiita-image-store.s3.amazonaws.com/0/227399/a4edfa38-05d1-c210-e52e-ece2f0d13d27.jpeg)

ファイルサイズは324kB。まだ画像の劣化はみられず。

## quality=25

![test25.jpg](https://qiita-image-store.s3.amazonaws.com/0/227399/62e0cb5b-68f2-34a0-8957-bf53f59602e5.jpeg)

ファイルサイズは253kB。若干ノイズが出てきたか？

## quality=5

![test5.jpg](https://qiita-image-store.s3.amazonaws.com/0/227399/7a955c7b-9349-6251-8882-11f1147736bf.jpeg)

ファイルサイズは134kB。かなりノイズがきつい感じ。
arduinoでi2c

#概要
arduinoでi2cやってみる。
フルスクラッチでやる。

#i2cの作法

![i20.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/6aec770c-3f25-7070-3449-19f4ae943d60.jpeg)
![i21.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/0468773c-5f28-e5ee-bab0-bb000e67bb33.jpeg)
![i22.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/3b0dce43-7d68-9bfd-2fd0-6e9b326b84d5.jpeg)

```
fscl frequency 100 kHz
tsch min 4 us
tscl min 4.7 us
tsp  max 100 ns
tsds min 250 ns
tsdh min 0 ns
ticr max 1 us
ticf max 0.3 us
tocf max 300 ns
tbuf min 4.7 us
tsts min 4.7 us
tsth min 4 us
tsps min 4 us
tvd max 3.4 us
tpv max 4 us
tsu min 0 us
th min 4 us
tiv max 4 us
tir max 4 us
```
SCLは、100KHzなので、一山は、5usくらい。
SCLが、HでSDAがLなら、start condition。
SCLが、HでSDAがHなら、bus freee。
start conditionの後は、アドレスとread/writeの８ビットを送出。
msbが最初、read/writeが最後。論理は、正論理。
slaveが、受け取るとSDAにLをSCLのタイミングで送出。(アクノリッジ)
writeなら、masterがSCLのタイミングでSDAを８ビットを送出。
slaveは、SCLの立上りで読み込む。
masterがSCL,LでSDA,Hして、stop condition。
readなら、slaveがSCLのタイミングでSDAを８ビットを送出。
masterは、SCLの立上りで読み込む。
masterが、SCLを支配する。


#i2cスキャナー

アドレス０から１２７までスキャンする。
アドレスを送出して、アクノリッジ（slaveが、受け取るとSDAにLをSCLのタイミングで送出。）で生存を判断する。

#フローチャート

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/7844d21b-e2c2-8152-4650-e829297e6449.png)

#ハードウェア

masterとslaveが、SDA,SCL共に、かち合うので、プルアップとオープンコレクタ、オープンドレインで辻褄が合う。
なので、使えるポートは、SDA、SCLの表示のある、A4とA5のみ、後はあやしい。


以上。
Learn from SAP Documentation


### *2018-1-14(日) learned*
 1.[ABAP プログラムユニットの実行](https://help.sap.com/saphelp_nw70/helpdata/JA/9f/db99fa35c111d1829f0000e829fbfe/frameset.htm)
 2.[ABAP プログラム内の処理ブロック](https://help.sap.com/saphelp_nw70/helpdata/JA/9f/db99fa35c111d1829f0000e829fbfe/frameset.htm)
 3.[実行可能プログラムのイベントブロック](https://help.sap.com/saphelp_nw70/helpdata/JA/9f/db99fa35c111d1829f0000e829fbfe/frameset.htm)
 4.[処理ロジックの構造 ](https://help.sap.com/saphelp_nw70/helpdata/JA/9f/db99fa35c111d1829f0000e829fbfe/frameset.htm)
 5.[選択画面の定義](https://help.sap.com/doc/saphelp_nw70/7.0.12/ja-JP/56/1eb6c705ad11d2952f0000e8353423/frameset.htm)

- [動的ディクショナリ参照](https://help.sap.com/doc/saphelp_nw70/7.0.12/ja-JP/56/1eb6c705ad11d2952f0000e8353423/frameset.htm)
- [表示長の縮小](https://help.sap.com/doc/saphelp_nw70/7.0.12/ja-JP/56/1eb6c705ad11d2952f0000e8353423/frameset.htm)
- [パラメータの検索ヘルプ](https://help.sap.com/doc/saphelp_nw70/7.0.12/ja-JP/56/1eb6c705ad11d2952f0000e8353423/frameset.htm)
- [入力項目の非表示](https://help.sap.com/doc/saphelp_nw70/7.0.12/ja-JP/56/1eb6c705ad11d2952f0000e8353423/frameset.htm)
- [選択基準の基本書式](https://help.sap.com/doc/saphelp_nw70/7.0.12/ja-JP/56/1eb6c705ad11d2952f0000e8353423/frameset.htm)
    - リスト
ubuntuで内蔵HDDを自動マウントする

内蔵HDDを起動毎に自動でマウントしたいと思うことがある.
備忘録として簡単にまとめる.

#内蔵HDDの情報確認

`$ sudo blkid`でUUIDやフォーマット方法を確認する.

![範囲を選択_001.png](https://qiita-image-store.s3.amazonaws.com/0/215782/98fb7158-0416-ba7e-2d7d-fcb31f3d3239.png)

ここで必要なのは,UUIDとTYPE.
今回は/dev/sdb3を常時マウントしたいので,sdb3のUUIDとTYPEを使う.

#自動マウントしたいパーティションを書き込む

/etc/fstabに追記
`sudo vi /etc/fstab`

```
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda6 during installation
UUID=5b9726db-9f59-470f-9272-2476153e5c35 /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/sda1 during installation
UUID=6AE4-9387  /boot/efi       vfat    umask=0077      0       1
# swap was on /dev/sda7 during installation
UUID=e20e3ebc-fb16-4e86-96d0-039ed1c416ed none            swap    sw              0       0

UUID=2832585D325831D4   /mnt/dataset    ntfs    defaults        0       0

```

上記のように,マウントしたいパーティションの情報を追記する.
今回はoptionsをdefaults,dump,passをそれぞれ0,マウント先のディレクトリを/mnt/datasetに設定した.

#マウントの確認

`sudo mount -a`でマウントされているか確認.
バックグラウンド起動したRailsサーバプロセスをコマンド1発で終了させるalias

## はじめに
railsのサーバ起動は `rails s -d` とすることでバックグラウンド起動ができる。
ところが、バックグラウンドで起動したrailsサーバを終わらすには、プロセス番号を指定してkillしないといけない。
それをalias指定して1コマンドで実現するところが今回のゴール。

## コード

最短は下記コマンドで可能。

```bash:.bashrc
$ cat tmp/pids/server.pid | xargs kill -9
```

これにちょっと成功 or 失敗メッセージとかを書き足すと下記。
（メッセージとかはお好みにブレンドしてください。）

```bash:.bashrc
alias rails-server-kill="cat tmp/pids/server.pid > /dev/null 2>/dev/null && (cat tmp/pids/server.pid 2> /dev/null | xargs kill -9 2> /dev/null && echo \"[OK] Rails server was killed...\" || echo \"[NG] Already exit...\") || echo \"[NG] Move to rails root directory path.\""
```

## 解説
Railsをバックグラウンド起動した際のプロセス番号は `tmp/pids/server.pid` に書いてあるので、その番号を `kill` すればいいらしい（正式な方法とかあれば教えてください…）。

ただ、最短コマンドだと成功時に何も言わなかったり、失敗時にはcatやkillコマンドのエラーメッセージとかがが出て不親切なので、色々コネコネして、下記仕様に。

* 成功時は成功メッセージ
* 失敗時はエラーメッセージ
    * プロセスがすでに死んでいる場合はその旨を表記
    * 現ディレクトリがrailsルートじゃない場合は移動を促すメッセージを表記

`||` とか `&&` とか `2> /dev/null` とかが何かは後記している参考文献を見ていただければ。 

## あとがき
小さなネタで申し訳ないけれど、このような細かい工夫が生産性向上につながると信じてます……。

## 参考文献
* [Ruby on Railsのサーバーをバックグラウンドで動かしたり止めたり - Qiita](https://qiita.com/ginpei/items/7a3b230a51e9dbd1aa72)
* [標準出力・標準エラー出力、/dev/nullについて。 - Qiita](https://qiita.com/i35_267/items/158cd20ed26f73a3d894)
* [bashでちょっと高度なシェルスクリプトを書くときの Tips - ぴょぴょぴょ？ - Linuxとかプログラミングの覚え書き -](http://d.hatena.ne.jp/pyopyopyo/20140830/p1)
Bitcoin Coreとは何か

#はじめに
Bitcoinの技術周りを理解するために実際にソフトウェアをいじろうと思ってBitcoin Coreをインストールしたけれど、「そもそもBitcoin Coreってなに？」という壁にぶち当たったのでこちらにまとめておきます。

#Bitcoin Coreとは
Bitcoin Coreとは、ビットコインを利用するために必要なオープンソースソフトウェアのことです。ビットコインを利用するとは、マイニングをしたり、取引を行ったりするという意味です。
ビットコインネットワーク上でどのような仕様やルールが適用されているのかは、このソフトウェアに依存しています。

#誰が作っているのか
もともとBitcoin Coreは、Satoshi Nakamotoの論文を元に集まった有志たちが開発を行ったソフトウェアです。
現在でも日々改善が進められており、コードは[GitHub](https://github.com/bitcoin/bitcoin)で公開されています。実際にコードを修正できるのは選ばれしもののみとなっています。

このように書くと、「非中央集権を目指しているのに結局は限られた人にしか修正の権限がないのでは意味がないではないか」と言われそうですが、実際にはBIP(Bitcoin Improve Proposals)といって、改善の提案は誰でも行うことができます。
提案が反映されるかどうかは、ビットコインネットワーク関係者が参加する[メーリングリスト](https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev)内での議論をもとに決められます。誰でも参加できるので、興味のある方は入ってみるのもいいでしょう。
実際の意思決定プロセスや、コードの反映プロセスは[こちらのリンク](https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md)に詳しく記述があります。

#まとめ
Bitcoin Coreのシステムはまだまだ課題が山積していて発展途上の段階で変化が激しいため、これからも注意深くウォッチしていきたいと思います。

#参考サイト
- https://github.com/bitcoin/bitcoin
- [ビットコインコア（Bitcoin Core）開発者の役割とルール決定](http://www.tottemoyasashiibitcoin.net/entry/2017/07/24/120950)