OmniAICreator/Qiita-1.07M huggingface dataset:
SQL Server Express 2016 LocalDBにサンプルデータベースを作成

SQL Server Express 2016 LocalDBにサンプルデータベースを作成してみました。
開発用に簡単なデータベースを用意したかったので公式のサンプルデータベースを使いました。

今回はVisual Studioを使ってスクリプトファイルからデータベースを作成しています。

#環境
Windows 10 April 2018 Update バージョン 1803
Visual Studio Community 2017 Version 15.6.7

#サンプルデータベースを選択
SQL Serverのサンプルデータベースはこちらの記事の通りいくつかあるようです。

サンプル用のデータベース・ファイル（.mdfファイル）を入手するには？
http://www.atmarkit.co.jp/fdotnet/dotnettips/941sampledb/sampledb.html

現在は「WideWorldImporters」というサンプルデータベースもあるようです。

新しいサンプルデータベース 『 WideWorldImporters 』 の中身を見てみる
http://ryuchan.hatenablog.com/entry/2016/06/26/110742

今回は開発用でテーブル数もあまり必要ないので「AdventureWorks 2012 LT」を使うことにしました。
.mdfファイルから作成する方法がわからなかったので今回はスクリプトファイルから作成します。

#AdventureWorksダウンロード

こちらから「adventure-works-2012-oltp-lt-script.zip」をダウンロードします。
https://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks2012

ダウンロードしたファイルを解凍してCドライブへ移動します。

今回は次のようなフォルダ構成を前提に説明します。

```
データベースファイルの保存先 → C:\AdventureWorks\
スクリプトファイルの保存先 → C:\AdventureWorks 2012 LT Script\
```

#AdventureWorksデータベース作成

Visual Studioからスクリプトファイル「C:\AdventureWorks 2012 LT Script\instawltdb.sql」を開きます。

![a.png](https://qiita-image-store.s3.amazonaws.com/0/112075/9af04cdc-41d1-53fd-c148-841141dac76d.png)

![b.png](https://qiita-image-store.s3.amazonaws.com/0/112075/3d8768d5-956b-0de2-580b-c9383f7dac71.png)

ファイル開くと構文エラーになるので「SQLCMD Mode」に変更します。

![c.png](https://qiita-image-store.s3.amazonaws.com/0/112075/3eaba538-1f47-69f8-36e3-9978224f1558.png)

スクリプトファイルを次のように修正します。

```:instawltdb.sql(修正前)
:setvar SqlSamplesDatabasePath   "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\";
:setvar SqlSamplesSourceDataPath "C:\Samples\AdventureWorks\AdventureWorks 2012 LT Script\";
```

フォルダを変更して行末のセミコロン(;)を削除します。

```:instawltdb.sql(修正後)
:setvar SqlSamplesDatabasePath   "C:\AdventureWorks\"
:setvar SqlSamplesSourceDataPath "C:\AdventureWorks 2012 LT Script\"
```

LocalDBに接続します。

![d.png](https://qiita-image-store.s3.amazonaws.com/0/112075/45ab0186-9d51-9201-0c47-1003326a4e8b.png)

ローカルの「MSSQLLocalDB」を選択して接続します。

![e.png](https://qiita-image-store.s3.amazonaws.com/0/112075/7af393c7-1c1f-12c1-e51e-77232a90c724.png)

スクリプトを実行します。

![f.png](https://qiita-image-store.s3.amazonaws.com/0/112075/fba8b39f-4c84-fbc4-5a44-a036898066dd.png)

正常に終了すると「AdventureWorksLT2012」データベースが作成されます。

![g.png](https://qiita-image-store.s3.amazonaws.com/0/112075/fe68eb97-cc1c-20f7-72b2-0232c3cbe20a.png)
【Tips】Google Colaboratory でPythonのファイル入出力演習

# 問題：Google Colaboratory における「ローカル」の扱い
　Python初学者が最初に触れるファイル入出力のコードは「ローカル」のファイルを操作するものになることが多いが、Google Colaboratory ではその「ローカル」が Google Drive のルートのような初学者にとっての直感的位置にはなく、ある種の工夫をする必要がある。

# 解決方法：`files.upload()`と`files.download()`
## 概要
- 入力準備
    * `files.upload()`
- 出力確認
    * `files.download()`

## 詳細
### 入力準備
　Colaboratory にアップロードした`.ipynb`ファイルは Google Drive のルート（直下の場所）に置かれるが、その場所がそのまま Colaboratory 実行時のローカルの参照先ということには残念ながらならない。Colaboratory のローカルにファイルを置くには別途コード上からファイルのアップロードが必要となる。ファイルアップロードには以下のコードを実行する。

```python:upload.py
from google.colab import files
files.upload()
```
これを実行するとアップロードファイルの選択ボタンが出現する。あとはその選択ボタンを利用して通常のWebサイトにファイルをアップロードするのと同じ要領で上げたいファイルを選択、決定すればアップロードが完了する。アップロードされたファイルは以後のセルで利用可能となる。この状態で

```python:input.py
with open("【入力ファイル名】", 'r') as f:
    print(f.read())
```
などとやればエラーなく実行できる。

### 出力確認
　ローカルへのファイルの出力は、通常通り

```python:output.py
with open("【出力ファイル名】", "w") as f:
    f.write("【出力内容】")
```
などとすれば Colaboratory のローカルに書き込まれる。正常に書き込まれたかどうかの確認は改めて read で読み込んで表示するなどしても良いが、より直感的にファイルとして作成されたことを確認するには、ローカルに作成されたファイルをダウンロードするのが良い。

```download.py
from google.colab import files
files.download("【出力ファイル名】")
```
上記コードをセルにして実行すればダウンロードが行われる。もちろん import 文は以前行っている場合には不要である。

# 参考文献
- [google Colaboratoryでファイルを読み込む方法](https://qiita.com/uni-3/items/201aaa2708260cc790b8)
- [Google Colaboratoryでファイルを読み込む](http://uepon.hatenadiary.com/entry/2018/03/21/180329)
- [Colaboratoryのデータの入出力まとめ](https://qiita.com/5at00001040/items/d7867974d2fd1d21dbbf)
github 勉強メモ

プロゲートを使用して、学習した内容を自分で見返す用にまとめてます。
#基本的な操作方法

##１.共有したいファイルの選択
```
git add ファイル名
```

##2.選択したファイルの記録（コミット）
```
git commit -m "メッセージ"
```

##3.リモートへの登録
```
git remote add リモート名　リモートURL
```

##4.リモートへのアップロード
```
git push リモート名 master
```
##5ダウンロード
```
git pull リモート名　master 
```
#応用的な操作方法

##1.変更したファイルの把握
```
git status
```
→`変更があったファイル=赤色`　`変更がありaddされたファイル=緑色`で表示される

##2.変更内容の把握
```
git diff
```
→`変更前のコード=赤色`　`変更後のコード=緑色`で表示される

##他の人のコミットを確認する
```
git log
```

↓変更内容を確認

```
git log -p
```
IntelliJ IDEAでJulia用プラグインを入れたときのメモ

# はじめに

最近、自分の周囲で、科学技術計算を用途とすることを目的として、Juliaが使われる機会が増えています。
そこで、自分も使ってみようと思って開発環境としてIntelliJ IdeaにJulia pluginを導入することにしました。

公式のドキュメントを参考に導入し、簡単なコードが確かに動くことを確認しました。

（やってみたら、特別なことが何もなかった。公式説明通りにやればよいです。）

## やったことの概要
プラグインの公式ドキュメント(https://julia-intellij.readthedocs.io/en/latest/ )を参考にして下記を実行した。

1. 既にダウンロードされたIntelliJ IdeaにJulia用のプラグインを導入した。
2. 1.で導入されたプラグインを用いて簡単なJuliaのコードが動作することを確認した。

## 環境
* OS
    * MacOS High Sierra 10.13.3

* [Julia](https://julialang.org/)
    * Version 0.6.0 

* [IntelliJ Idea](https://www.jetbrains.com/idea/)
    * Version 2017.2

* [Jullia plugin](https://plugins.jetbrains.com/plugin/10413-julia)
    * Version: 0.2.2
    * コードリポジトリは[こちら](https://github.com/ice1000/julia-intellij)

# 導入方法

とても簡単で、公式ドキュメントどおりに下記のステップを踏めばよい。
（ここまで書いてから実際に導入したのだけれど、あまりにもやることが少ないので一度書くのをやめたくらい。）

1. IntelliJ Ideaを起動
2. Preferences -> Plugins -> Browse repositories...と辿って、検索画面を開く
3. Juliaで検索すると、一意にプラグインが定まるので（2018/05/02時点）、これをダウンロードする。
![スクリーンショット 2018-05-02 11.29.06.png](https://qiita-image-store.s3.amazonaws.com/0/149061/18e626eb-6627-eaf4-be2c-f621dbf9d311.png)
4. 再起動

# Julia Projectの作成

下記のステップを踏めば簡単にできる

1. Juliaのexecutableのpathを確認する。例えば、whichとかで見れば良いと思う。

```sh
which julia
```

2. New Project -> Juliaを選択 -> Select Julia executable内に上で調べたpathを入れる
![スクリーンショット 2018-05-02 11.32.45.png](https://qiita-image-store.s3.amazonaws.com/0/149061/151e9fd2-641e-8e2a-e353-952a825e6afd.png)

3. Nextを押下して、プロジェクト名指定し、Finishを押下
    - もちろん、その他設定したいことがあればやればよい
4. 適当にファイルをつくればおｋ. 実行できる。
![スクリーンショット 2018-05-02 13.52.57.png](https://qiita-image-store.s3.amazonaws.com/0/149061/79e863a7-830c-a6a2-db19-0b019b313cb1.png)



# まとめ
* IntelliJ IdeaにJuliaプラグインを入れて、簡単なファイルを動かした
* 公式ドキュメント通り、他のプラグインと同様に、Preferencesから導入すればよい
LINQのメソッド構文を使って「いずれか含む」検索を実装する

# はじめに
不慣れな .NET 環境での開発で小一時間悩んでしまったので記録。
「LINQてなに？」な方は [この記事](https://qiita.com/nskydiving/items/c9c47c1e48ea365f8995) を読むと幸せになれます。

# やりたいこと
- JSON文字列のリストから、特定のプロパティに指定の値が設定されているレコードを取得したい。
- 指定の値は複数なので、条件を「いずれか含む」としたい。
- レコード毎のJSON Deserializeはしない。
- LINQを使って簡潔に記述したい（for文とか✖）

# やってみた

```C#:sample.cs
using System;
using System.Linq;
using System.Collections.Generic;

namespace workspace
{
    class Program
    {
        static void Main(string[] args)
        {
            var requests = new List<string>
            {
                "{\"Code\":1,\"test\":\"value\"}",
                "{\"Code\":2,\"test\":\"value\"}",
                "{\"Code\":3,\"test\":\"value\"}",
                "{\"Code\":4,\"test\":\"value\"}"
            };

            var patterns = new List<string>()
            {
                "\"Code\":1,",
                "\"Code\":2,",
                "\"Code\":5,",
                "\"Code\":6,"
            };

            var results = requests.Where(r => patterns.Any(p => r.Contains(p)));
            foreach (var result in results)
                Console.WriteLine(result);
        }
    }
}

```

## 結果
意図したとおりのデータが取得できました。
[▶デモはこちら](https://dotnetfiddle.net/nFqGU3)

ポイントは ~~Where メソッドの入れ子。~~ WhereメソッドにAnyメソッドを入れ子。
思いつくのに時間がかかりましたが、LINQ 構文は出来上がりがスッキリなので好きです。

もっと良い書き方があれば教えてくださいませ。

# 参考
- [はじめての LINQ - Qiita](https://qiita.com/nskydiving/items/c9c47c1e48ea365f8995)
- [LINQ：文字列コレクションで「LIKE検索」（部分一致検索）をするには？ - @IT](http://www.atmarkit.co.jp/ait/articles/1412/02/news129.html)
rustとgolangに類似する特徴

# はじめに

Golangは登場したときから注目していました。この一年くらいで仕事のプロジェクトでも使っています。
rustはまだ勉強し始めたばかり。
この記事は一種のポエムです。

# rustとgolangに類似な特徴

rustとgolangはメモリ管理に関して異なるアプローチをとっています。違う言語なので、相違点があるのは当然のことですが、不思議といくつかの類似点があるのが興味深いです。
別々の道をたどって結局同じ結論に達したのか、どちらかが他方の影響を受けたのかは、勉強不足なのでわかりません。

## 型を後ろに書く

構文解析上、型を後ろに書くのはいまや常識らしいです。

## if文の構文

```
  if cond {
    do_something
  }
```

cond を()でくくる必要はない。
{}は必須。
Cではif文の中身が単文のときは{}を省略可能でした。Linuxカーネルのコード規約では単文のときには{}をつけてはいけないことになっています。
でも私は常に{}をつけるのを習慣にしていました。{}必須は歓迎。

また、rustもgolangも型に厳しくてcondはbooleanでなくてはなりません。Cのように整数型から暗黙の変換はしてくれません。

## structのメンバ参照

Cの場合はstructのメンバ参照のときにstructの実体かポインタかによって '.' と '->' を使い分ける必要がありました。
golangとrustではstructへの参照のデリファレンスは暗黙でやってくれるので '.' で統一されています。

## slice

配列(またはベクター)を間接的に使用するものとしてslice がある。
golangではsliceは使い勝手がよいです。rustでも同じ結論になっているのが興味深いです。

## 例外が無い

C++を使っているプロジェクトでも、プロジェクト独自のコード規約で例外の使用を禁止しているところがありました。
やはり例外はよくないというのが共有認識のようです。

## class が無い

structにメソッドを生やすことはできる。

## 無効な変数として '_' (アンダースコア) を使用する

# いまのところは以上

rustはまだ勉強中なので、気がついたら追記するかも。
ESP32のBLEを使うための環境のセットアップ

#ESP32開発ボード
秋月電子の[ESP32-DevKitC ESP-WROOM-32開発ボード](http://akizukidenshi.com/catalog/g/gM-11819/ "")とAliExpressで購入した[Wemos Lolin32](https://wiki.wemos.cc/products:lolin32:lolin32 "")を使用します。
Wemos Lolin32のページ見たら「Retired」ってありました。購入したのは2017年秋頃なので古いボードですね。
秋月電子のボードメインで記載していこうと思います。

#Arduino IDEへのセットアップ
自分はESP-WROOM-02やArduino nano, pro mini, pro microも使用しているので、ESP32も同じ環境で使用したいのでArduino IDEで使用できるようにします。プラットフォームはWindows 10です。

#Arduino core for the ESP32のダウンロード
[Arduino core for the ESP32]
(https://github.com/espressif/arduino-esp32 "")ライブラリをgitから入手します。
cloneするかZIPファイルをダウンロードして展開します。


#Arduino core for the ESP32の配置
今回はZIPファイルをダウンロードしました。展開する前にArduino IDEのユーザファイルが保存されているディレクトリを確認します。
自分の場合は下記ディレクトに配置しています。

```
C:\Users\UserName\Documents\Arduino
```
上記ディレクトリの「hardware」の下に「espressif」を作成し、更に「espressif」の下に「esp32」を作成します。
先程ダウンロードしたArduino core for the ESP32ライブラリを「esp32」フォルダ配下に展開します。ZIPファイルを展開するとフォルダ「arduino-esp32-master」ができますが、このフォルダ内のファイルを「esp32」の配下に配置します。

#BLEライブラリのダウンロードと配置
Arduino core for the ESP32と同様にBLEライブラリ[ESP32 BLE for Arduino]
(https://github.com/nkolban/ESP32_BLE_Arduino "")をcloneかZIPファイルをダウンロードします。
展開先は先ほど配置したArduino core for the ESP32配下にある「libraries」フォルダの下の「BLE」フォルダです。

#get.exeの実行
「esp32」フォルダ配下の「tools」フォルダにget.exeファイルがあります。「管理者として実行(A)」で実行します。
実行すると、ターミナル画面が表示され、ファイルの取得や更新処理が行われます。

#Arduino IDEの起動と確認
Arduino IDEを起動し、ボードとしてESP32が選択できようになっている確認します。
「ESP32 Arduino」というグループに各種ボードが表示されていればOKです。
次に、「スケッチ例」を確認します。「ESP32」と「ESP32 BLE Arduino」が表示されていればOKです。

#今後の予定
温度・気圧センサ(BMP280)や超音波距離センサ(HC-SR04)で取得したデータをBLE Notifyで通知し、取得できるようにしたいと思います。
Centre側で値を取得できた後、デバッグではターミナルにprint、その後はgoogle spread sheetに保存し、google data studioで可視化できればと思います。
Goでポインタが指す構造体をコピーしたい時

よく忘れるのでメモ。入れ物作って値代入でいける。

```go
fuga := &A{}
*fuga = *hoge
```

Go Playground

```go
package main

import (
	"fmt"
)

type A struct {
	X int
	Y string
	Z []float64
}

func main() {
	var (
		hoge *A
		fuga *A
	)
	
	hoge = &A{
		X: 1,
		Y: "test",
		Z: []float64{0, 1, 2, 3, 4},
	}

	fuga = &A{}
	*fuga = *hoge

	hoge.X = 3
	hoge.Y = "TEST"
	hoge.Z = []float64{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
	
	fmt.Printf("%#v\n", hoge)
	fmt.Printf("%#v\n", fuga)
}
```

```
&main.A{X:3, Y:"TEST", Z:[]float64{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}}
&main.A{X:1, Y:"test", Z:[]float64{0, 1, 2, 3, 4}}
```

https://play.golang.org/p/0Ry9AnAAySP
フロント周り 必要となる知識を広く浅く学ぶ05

##目的
フロント周りで必要となる知識を広く浅く学び、実務に生かす。

##Git
**分散型バージョン管理システム**
ソースコードの変更履歴を記録・追跡・保存したりするバージョンを管理するシステムで
ソースコードが開発者PCのGitによって構成管理される。
構成管理の主体がサーバーだけでなく、独立して開発者のPCでも行なうことが可能。 


###分散型バージョン管理システムの種類
[Git](https://git-scm.com/)
[mercurial](https://www.mercurial-scm.org/)
[bazaar](http://bazaar.canonical.com/en/)
[veracity](http://veracity-scm.com/)

##Github
**Gitを利用したwebサービス**
「Git」の「ハブ：拠点・中心・集まり」
GitHub Enterpriseというのもあり、これは社内にGitHubを構築できるサービス


###Gitを利用したwebサービスの種類（違いは、機能や金額）
[Github](https://github.com/)
[GitLab](https://about.gitlab.com/)
[GitBucket](https://gitbucket.github.io/)
[Gitblit](http://gitblit.com/)
[Gogs](https://gogs.io/)
[Bitbucket](https://bitbucket.org/)


##バージョン管理システムとその背景
バージョン管理システムができる前はどうだったのか？
集中型、分散型があるが、なぜ分散型が主流になったのか？
以下、資料に目を通してざっくり理解できたので参考資料として残す

1-1、バージョン管理システムとは？
[はじめの一歩！ソースコード管理に必要なバージョン管理とは](http://tracpath.com/bootcamp/learning_rivision_control_system.html)

1-2　バージョン管理システムの歴史
[バージョン管理のススメ](https://www.slideshare.net/ken1flan/ss-41845887)

2-3、集中型と分散型の比較
[Subversion 対 Git：どちらを使うべきなのか？いろいろな観点から比較してみた](http://tracpath.com/works/development/subversion_vs_git/)
[バージョン管理システムの比較（という名のポエム）](http://dblog.athome.co.jp/entry/2017/09/04/120000)
Web上からEthereumトランザクション発行する際の問題点について

Webシステムのような中央集権型（クライアント-サーバシステム）にて、例えば、

・会員登録画面にて、ユーザウォレットアドレス等の情報を入力して、ボタンをクリック
→自動的に指定したウォレットのアドレスにトークンが送付される

のようなシステムを構築する場合、下記①~⑧の処理が考えられます。

①【ユーザ】名前、メールアドレス、walletアドレスを入力し登録ボタンをクリック
②【メールサーバ】ユーザから送付された情報を確認し、登録完了確認メールを送付
③【ユーザ】登録完了確認メールに記載されているURLから登録完了手続きを行う
④【DBサーバ】①で入力された情報をDBに保存
⑤【Webサーバ】登録完了画面を生成
⑥【ユーザ】登録完了画面を表示
**⑦【ローカルサーバ】オーナーの（プライベート）キーを使用しオーナーwalletのアドレスからユーザwalletアドレスへトークンを転送するようコントラクトを実行しトランザクションを発生させユーザwalletにトークンを送付**
⑧【ユーザ】ユーザwalletにトークンが転送されているか確認

このシステムのセキュリティ上の問題点及び疑問点として、
・サーバ上からgeth経由でスマートコントラクトを動作させようとする場合、キーは何処に保存するか？
・トランザクションを発生させる際、上記のようにgethを用いる方法で問題はないか？
（代替方針としては、infuraを用いる、独自にjson-rpcサーバ構築する）
・このシステムにおけるマルチシグウォレットの適用の可能か？

等が考えられます。

![svr_20180509.jpg](https://qiita-image-store.s3.amazonaws.com/0/249987/19f6b3d9-0ba2-e030-0a72-351e2a995d8b.jpeg)

#####**提案**
・サーバ上からgeth経由でスマートコントラクトを動作させようとする場合、キーは何処に保存するか？
　→内部ネットワークからのみアクセス可能なサーバ(ローカルサーバ)に保存する。

・トランザクションを発生させる際、上記のようにgethを用いる方法で問題はないか？
　→[infura](https://infura.io/)経由では（[アカウントを格納しない為](https://github.com/INFURA/infura/wiki/FAQ)）トランザクションの発行がややこしい。
　また、外部サーバの為、ダウンタイムや外部からの攻撃の可能性がある。
　よって、gethを用いるのが無難。

・このシステムにおけるマルチシグウォレットの適用の可能性及び必要性は？
　→マルチシグウォレットはSolidityのモジュール([gnosis MultiSigWallet](https://github.com/gnosis/MultiSigWallet))を適用する。
　→更にセキュリティ性を高める為に、[スクリプトレススクリプト](https://download.wpsoftware.net/bitcoin/wizardry/mw-slides/2017-03-mit-bitcoin-expo/slides.pdf)でマルチシグウォレットを実現する方法(論文)が公開されている
(下記論文はBitcoinに関する技術であるが、Ethereumにも応用可能)
https://lists.linuxfoundation.org/pipermail/lightning-dev/attachments/20180426/fe978423/attachment-0001.pdf
https://eprint.iacr.org/2017/552.pdf

> 上記論文の概要(google翻訳適用)：
Andrew Poelstraは、Bitcoinスクリプティング言語を必要としないスマートコントラクトを実現する方法として、スクリプトレススクリプトという概念を導入しました。 Bitcoinのコントラクトは、スマートコントラクトを構築するための標準的なツールとして浮上してきましたが、Bitcoinスクリプトにはいくつかの欠点があります：まず、Bitcoinネットワーク内のすべてのノードが、トランザクションに含まれる署名とは別にBitcoinスクリプトを解析して検証する必要があります。
第二に、Bitcoinスクリプトには、それらを集約するために必要な内部構造がありません。最後に、Bitcoinスクリプトはブロックチェーン内に不定期に追加され、プライバシーと代替性を妨げる可能性があります。
スクリプトレススクリプトでは、トランザクションには不可欠なデジタル署名スキームの機能しか必要としませんが、ブロックチェーンに表示される要素は公開キーと署名だけです。この状態では、Mimblewimble、Adapter SignaturesまたはScriptlessバージョンのLightning Networkプロトコルなど、スクリプトレススクリプトのいくつかのアプリケーションが提案されています。これまで提案されたアプリケーションはすべて、Schnorr署名方式に依存しています。
一言で言えば、それらはSchnorr署名の線形構造を利用しています。これはECDSAにはありません。そのため、ECDSAベースのスクリプトレススクリプトの構築が利用できないため、SchnorrシグネチャをBitcoinに含めることを多くの人々が主張しています。この論文では、ECDSAに基づいたスクリプトレススクリプトを構築することが可能であることを示します。最も重要な利点は、BitcoinトランザクションがECDSA署名で署名されているため、現在のBitcoinプロトコルと完全に互換性があることです。したがって、ECDSAベースの構造により、Bitcoinで現在Scriptless Scriptアプリケーションを適用できます。

他に問題点及び提案例があれば追記・修正する予定です。

この問題点に関する質問に回答をしていただいた[Hi-Ether]
(https://qiita.com/amachino/items/605ff76209d7193dc92c)コミュニティメンバーに感謝致します。
CSSはこう書く

# CSSはこう書く

「こう書く」、というより「こう書いてほしい」という個人の価値観の押し付けです。
が、それでも誰かの役に立てば幸いです。
ご意見もどんどん下さい！

## 伝えたいこと

- **何も考えずにスタイルの追加をしないで！**
- **何も考えずに数値を決めないで！**
- **後先考えずにスタイルを当てないで！**
- **少しでも疑問に思ったら聞いて！**

## 何も考えずにスタイルの追加をしないで！

私がCSSを書く時は、大まかに以下のような順で書いています。

```
セレクタ {
  外枠
  配置
  余白
  見た目
  機能
}
```

外側から内へ内へと当てていくイメージです。
ダミーで書いてみると

``` css
.btn {
  display: block;
  width: 100%;
  position: fixed;
  left: 0;
  bottom: 0;
  z-index: 10;
  padding: 15px 0;
  border-radius: 3px;
  background-color: #069;
  color: #fff;
  font-size: 24px;
  font-weight: bold;
  text-align: center;
  transition: opacity 150ms linear;
  cursor: pointer;
}
```

こんな感じです。

見た目の部分は更に細かく分けることができますが、大まかな順が意識されていればそんなには気になりません。

これがチーム内の共通意識としてあれば、修正するときに目的のプロパティがどこにあるのか、すぐに見つけることができます。

が、実際これは個人の感覚に依存するもので、難しい場合はアルファベット順にしておくのが無難かと思います。
[CSScomb](https://csscomb.com/)で自動化してしまえば楽です。

ここで伝えたいのは、何も考えずに**スタイルを下に追加する**のはやめてね！ということです。

## 何も考えずに数値を決めないで！

最近はデザインツールからCSSを抽出できたり、簡単に余白やサイズを知れるようになりました。
それをそのまま使えば見た目通りにブラウザで表示されます。

が、ちょっと待ってください。
余白、サイズが半端な数値になっていませんか？

経験上、デザイナーさんが**５の倍数以外の数値**を余白やサイズに使用するということはあまりありません。
もしも５の倍数以外の数値になっている場合は、どこかが綺麗な数値で指定されていないかを確認してみてください。

例えば、ボタンの上余白が23px、下余白が22pxだった場合、高さが60pxなどの綺麗な数値になっていませんか？
この場合は`line-height: 60px;`でスタイルを当てた方が良いです。（改行されないことが明確な場合に限る）

半端な数値に遭遇した場合はそれを疑う癖を付けてください。
（単にデザイナーさんが急いでいてそこまで拘れていなかった・・・というパターンもあると思います）

## 後先考えずにスタイルを当てないで！

WEBサイトの運営をしていると、**トルツメ**や**想定外の改行**は十分に起こり得ます。
これを考えずにスタイルを当ててしまうと

- 「このパターンの場合はこの要素は消しますねー」　→　「なんか要素がくっついてるんですけど・・・」
- 「この項目は文字列最大長60文字かー」　→　「なんかすっごい行間空いてるんですけど・・・」

なんてことが起こります。

これをできるだけ回避するために

- `margin`は常に下（または上）に取るようにして、トルツまっても常に余白が確保される
- 高さ固定だけど改行が想定される場合は`line-height`で高さを取らず、`padding`で調整したり`flex`を使った中央揃えをする

などと考えてスタイルを当てていきます。

これは経験によって変わるもので、完全に防ぐことも難しいのですが、できるだけ配慮したいです。
とにかく、その場限りの「見た目が整えばいいやー」でスタイルを当てないでください。

## 少しでも疑問に思ったら聞いて！

エンジニアは（少なくとも私は）技術系の話をするのが好きです。
知識を見せびらかすのが好きです。（少なくとも、私は！）
なので、少しでも疑問に思ったら聞いてください。

ただごめんなさい、丸投げの質問は嫌います。
なので

「これって方した方がいいですかね？」

といった感じで、自分で予め考えをまとめたり、調べたりした上で聞いてみてください。
気持ちよく教えてくれると思います。
（~~それでもムッとする人はきっとそもそものコミュニケーションが苦手な人なので、好きにやりましょう~~）

## おわりに

本投稿は個人の価値観の押し付けだと言われればそこまでだなーと思っています。
そうならないために、実際の現場ではコーディングガイドラインをチーム全員で決めておきたいですね。
そうしたらコードレビューも捗ります。
Nimで言語処理100本ノック 01. 「パタトクカシーー」

#　問題

[言語処理100本ノック 2015#sec01](http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec01)

>「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ．

# 解答

最初は1,3,5,7を列挙しようとしましたが、よく考えると奇数字を取り出す問題ですね。

```nim1.nim
import unicode

const str = "パタトクカシーー"
const rstr = toRunes(str)

var newStr: seq[Rune] = @[]

## for i in 0..rstr.len -1 から改善。インデックスが最初、値が2番めになる
for i, c in rstr :
  if (i + 1) mod 2 == 1:
    newStr.add(c)

echo newStr # パトカー
```

はい出ましたRune型です。
GoやPythonで挫折したポイントでもありますマルチバイト文字が簡単にStringとして扱えない問題(浅学)です。
そのままでは`str[0] == パ`にならなかったので変換するひと手間をかけました。

[nim文字列操作(unicode) - Qiita](https://qiita.com/6in/items/f47e44ee243aed47898c)
を見るに`runeAtPos`を使えば`toRunes`は不要で変数を減らせそうです。[^1]

[^1]: いやinにわたすときに変換すればもともと不要だったか

引っかかりポイントは

`var newStr: seq[Rune]`だけで`newStr.add(c)`できない問題。
型宣言だけで空になる、操作できるとやや勘違い。ちゃんと` = @[]`で初期化しなければダメでした。

剰余は`%`ではなく`mod`。加算は`+`でいけるのでちょっとつまづき。

for でインデックスのみではなくvalueも取得する方法は、
[Nim Tutorial Part Iを日本語訳してみた（前編） - Qiita#for文 For statement](https://qiita.com/KTakahiro1729/items/f4776f3a072c01f9086b#for%E6%96%87-for-statement)
で訳されておらず「ないのか！？」と焦った。
公式の方やいくつかのコードを漁って、発見。
勘で`for i c in`と書いて動かなかったのでニアミス。
後から調べてPython,Goと同じ形式だったので経験の差が出たような形に。

# 前回

[Nimで言語処理100本ノック 00. 文字列の逆順 - Qiita](https://qiita.com/khsk/items/e43878008c6c039b33ef)

***

コメントの改善前forの書き方
`0..hoge.len -1`
は
`0..<hoge.len`
と書けるみたい。覚えておこう。
[Nimでコーディング面接に立ち向かう-第１章 - Qiita#コメント](https://qiita.com/dotharaai/items/8c8519471bcd1486a81e#comment-0ac0265be72cd6926091)
GitHub Pages でカスタムドメインが HTTPS に対応した!

詳しくは [公式のブログ](https://blog.github.com/2018-05-01-github-pages-custom-domains-https/) を見ればわかりますが GitHub Pages でカスタムドメインを使用してる場合でも Let’s Encrypt を使用して HTTPS に対応しました

## 設定方法
今まで GitHub Pages を使っていた方はリポジトリの `settings` を開き `Enforce HTTPS` という項目が追加されていますのでそこをクリックするだけです!

<img width="760" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/96420/6bbc5885-a4eb-b83f-d2fa-381ec91d73f8.png">

Let’s Encrypt がどんどん浸透してきていい感じですね!
[Review] CRF Applications

## Preface
This article aims at my personal review for CRF applications.

## Languages
First priority: Java
Second: Python


## Libraries
1. [CRF/original, IIT bombay](http://crf.sourceforge.net/introduction/index.html): this seems original implementation of CRF in Java,,, there is no info regard to training data or example usage...
2. [Sequence Tagging](http://mallet.cs.umass.edu/sequences.php): I haven't tried though, it's got an introduction and looks nice!
3. [CRF/ahser-stern](https://github.com/asher-stern/CRF): quite similar to CRF/original, maven project.... but again, there is no demo or some tutorial stuff...
4. [CRF/witgo](https://github.com/witgo/CRF): compared to others, it has less stars.... there is an introduction though,, "couldn't find main class" error caught me.
5. [python-crf-named-entity-recognition](https://github.com/albertauyeung/python-crf-named-entity-recognition): the author assumes collects data from the net, like scraping. so this doesn't match my objective.
6. [NER with DNNs](https://github.com/deepmipt/ner): this looks good, I am trying right now. he is following [a Hybrid Bi-LSTM-CRF](https://arxiv.org/pdf/1709.09686.pdf). but he tested in Russian, so I need to evaluate the model in Japanese.
7. [Sequence-Tagging](https://github.com/guillaumegenthial/sequence_tagging): this guy has nice blog regarding to [Sequence-tagging with Tensorflow](https://guillaumegenthial.github.io/sequence-tagging-with-tensorflow.html). So I would like to read that and try demo as well.
8. [tagger/glample](https://github.com/glample/tagger): I need to try this maybe, this has nice amount of stars.
IDE

###IDE
- 統合開発環境
- Integrated Development Environment の略
- ソースコードエディタ、コンパイラ、デバッガなど、プログラミングに必要なツールが一つのインターフェースで統合して扱えるようなソフトウェアのこと
- JavaのEclipceが代表例

あ、Eclipseか。よく知ってました。

おしまい。
コマンドラインでMFA

```
oathtool -b --totp [token]
```

少し先まで出す（zshの場合）

```
MFA_DATA=$(oathtool -b -w 1 --totp [token]); MFA_NOW=$(echo $MFA_DATA | head -1); MFA_NEXT=$(echo $MFA_DATA | tail -1); echo $MFA_NOW and $MFA_NEXT after $((30 - $(date +%s) % 30)) seconds
```
~/.ssh/configが便利なのでまとめてみた



１．~/.ssh/configとは
SSHの接続情報をまとめておけます。

２．基本的な記述
Host 接続名
HostName ホスト名orIPアドレス
User ユーザー名
Port ポート番号
IdentityFile 鍵へのPATH

２．サンプル
Host myaws
HostName xxx.xxx.xxx.xxx
Port 22
IdentityFile  ~/.ssh/hoge_rsa
User ec2-user
TCPKeepAlive yes
ServerAliveInterval 60
IdentitiesOnly yes

３．テスト
ssh myaws
で問題なければキー登録、パスフレーズで接続できます。

４．プロキシサーバとしての設定
  ProxyCommand ssh ssh -W %h:%p
を追記すれば接続先をプロキシとしてシームレスに別のサーバにSSHできます。
※事前に接続先（myawsとmyaws2）で公開キー認証の設定が必要です


５．プロキシのサンプル
※やっている事イメージ
![image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/254481/86dfc578-7645-25de-2834-c5b94a751499.jpeg)

Host myaws2
   Hostname xxx.xxx.xxx.xxx <-最終的に接続したいサーバのIP
   Port 22
   IdentityFile  ~/.ssh/hoge_rsa
   User ec2-user
   IdentitiesOnly yes
   ProxyCommand ssh myaws -W %h:%p
Android TCP クライアント

android での　ソケット通信についてです。
現在、android端末から、センサーの値を100msおきに
TCPで送信するプログラムを作成中ですが、
処理の方法により、送信速度が違います。

処理１・接続要求ループと、データ送信ループに分ける。
接続要求ループでサーバーに接続、
(soket _soket = new soket(ipaddr,portno);)
接続完了時に、outputstreamwriter,bufferwriterをインスタンス化し
送信ループ移行
送信ループで write -> flush -> sleep(100) 
送信ループのみを繰り返す。

処理２・処理１の２つのループを一体化
サーバーに接続、
接続完了時に、outputstreamwriter,bufferwriterをインスタンス化
 write -> flush -> close() -> sleep(100) 
サーバーに接続から繰り返す。

処理１の場合、送信周期　300ms 
処理２の場合、送信周期　100ms (ping応答とほぼ同時間まで可能)

ざっくりな説明で申し訳ありませんが
お分かりの方がいらっしゃいましたら、ご回答お待ちしております。

送信データ数は、10バイト
サーバー側は、ソケットデバッガー
送信状況は、ワイヤーシャーク
で確認しています。
WOWHoneypotの追加設定(2)

Drupalgeddon3（CVE-2018-7602）の御訪問を最後までご案内する方法を考えた。
もっといい方法があると思うけど、みなさんどうやってるんですかね。

#PoCの確認
色々なサイトでPoCが公開されているけど、有名な[exploit-db](https://www.exploit-db.com/exploits/44557/)から検証コードを確認します。

本当はDrupalを動かして、検証コードを使って通信内容を確認するのが良いでしょうが、今回は低燃費で頑張ります。
検証コードを確認すると、通信は3段階に分かれているみたいです。

1．対象サーバの特定パスにアクセスし、レスポンスのソースコードに含まれるform_tokenの値を取得する。

2．form_tokenの値を使って、ペイロードを流し込み、ソースコードに含まれるform_build_idの値を取得する。

3．form_build_idの値を使って、実行結果を取得しに行く。

#WOWHoneypotの設定
1.と2.にはどちらとも「node/」と「/delete」が含まれているので、これをトリガーにします。
正規表現が使えたら1行で済みそうですが、書けるんですかね。
「PoCの確認」で得た情報から、最低限以下を返すdrupal_delete.txtをart配下に作成します。

```drupal_delete.txt
<input type="hidden" name="form_build_id" value="form-Tn-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" />
<input type="hidden" name="form_token" value="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  />
```

最後にmrrules_local.xmlに検知トリガー等を記載する。

```mrrules_local.xml
  <mrr>
    <meta>
      <mrrid>30016</mrrid>
      <enable>True</enable>
      <note>Drupal delete</note>
    </meta>
    <trigger>
　　　<uri>node/</uri>
      <uri>/delete</uri>
    </trigger>
    <response>
      <status>200</status>
      <body filename="drupal_delete.txt"></body>
    </response>
  </mrr>
```

#最後に
本脆弱性はコンテンツの削除権限がないと成功しないみたいなので、5/2現在、deleteを含んだアクセスはほとんどありません。
お勉強ということで作ってみました。
HTTP method

# What is HTTP
HTTP is a protocol used when web server is in communicating information like documents written by HTML with client.

# HTTP method
## `GET`
The `GET` method requests resource specified URI.
If URI is file name, return contents of that file.
If URI is program name, return output of program.

## `POST`
The `POST` send data of set of name and value pairs from client.
Use when it send form data in HTML.

## `HEAD`
The `HEAD` method is same as `GET` method, but return only HTTP header and no document body.

## `PUT`
The `PUT` method replace file on server specified URI.

## `DELETE` 
The `DELETE` method delete file on server specified URI.

## `OPTION`
The `OPTION` method return the HTTP methods that the server supports.

## `CONNECT`
The `CONNECT` method converts the request connection to a transparent TCP/IP tunnel.
JSP

参考サイトが分かりやすいです。
以下自分用にまとめ。

##JSP ( Java Server Pages )
- 画面表示とJava処理を行う橋渡しのjavaファイル
- 独自タグでJava処理と組み合わせることが可能
- HTML内にJavaプログラムが書ける
<br> = つまりJSPもJavaファイル
<br> = コンパイルされ.classファイルができる

##サーバ側の処理手順例
ユーザからJSPファイル(ここではindex.jsp)へリクエストがきた例だとこうなる

1. index.jsp → index_jsp.java
<br>・javaファイル(Servlet)へ変換
2. index_jsp.java → index_jsp.class
<br>・コンパイルされclassファイルが生成
3. classファイルからJava処理実行
<br>→　出力するHTMLを生成
4. 出力するHTMLをレスポンスとして返す

##JSP構文
|名称|説明|構文|
|:--|:--|:--|
|テンプレート|HTMLで書かれた場所|<!DOCTYPE html>|
|Pageディレクティブ|JSPの設定を定義する場所|<%@page %>|
|スクリプトレット|Javaプログラムを記入する場所|<% %>|
|スクリプト式|変数の値やメソッドの戻り値を出力する場所|<%= %>|
|JSPコメント|JSP内のコメントを記入する場所|<%-- --%>|

**Pageディレクティブ**
<%@page で始まり、 %> で終わる。 JSPで使用する言語や JSPページの設定（文字コードなど）を指定する。importするライブラリを書く。
**スクリプトレット**
<% %> の中にJavaコードを書く。 複数行も書ける。HTMLと組み合わせて 跨いで書くこともできる。
**スクリプト式**
<%= で始まり、 %> で終わる。出力関数無しで式を評価して表示できる。

```html:例

<%-- Pageディレクティブ --%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.util.ArrayList" %>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    
    <body>
        <% 
            ArrayList<String> list = new ArrayList<String>(); 
            list.add("はしくれ");
            list.add("エンジニア");
            list.add("もどきの");
            list.add("メモ");
        %>
        
        <h1>
            <% for(int i = 0; i<list.size(); i++){ %>
            <%-- スクリプト式 --%>
            <%= list.get(i) %>
            <% } %>  
        </h1>
    </body>
</html>
```

>参考
http://cartman0.hatenablog.com/entry/2015/12/01/205220
名前空間を取り除いたクラス名を取得する ( ActiveSupport::Inflector.demodulize )

# 例

```rb
require 'active_support/inflector'

module A
  class B
  end
end

p A::B.to_s.demodulize # B
```

# 環境

- ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]
- activesupport (5.1.5)

# 参考

- http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-demodulize








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SSH公開鍵認証設定


クライアントにLinux環境(Cygwin)＆OpenSSLがインストールされている前提

１．クライアントでキーペア作成
    cd ~/.ssh/
    ssh-keygen -t rsa -f hoge_rsa
    scp ./hoge_rsa.pub myaws:~/.ssh/
    ※myawsは、.ssh/config で定義。

２．サーバで公開鍵の登録
    cd ~
    chmod 700 .ssh
    cd .ssh
    cat hoge_rsa.pub >> authorized_keys
    chmod 600 authorized_keys
    rm -fv hoge_rsa.pub

３．テスト
    ssh -i  ~/.ssh/hoge_rsa ec2-user@HOSTNAME

４．configに登録
    vi ./ssh/config
    Host myaws
    HostName xxxx.xxxx.xxxx.xxxx
    Port 22
    IdentityFile ~/.ssh/hoge_rsa
    User ec2-user
    TCPKeepAlive yes
    ServerAliveInterval 60
    IdentitiesOnly yes

５．再度テスト
    ssh myaws
PX4 Development Guide 翻訳(2)

#Getting Started

* 初期セットアップ
* ツールチェインのインストール
* コードのビルド方法
* アプリケーションの作成

#初期セットアップ

###初期セットアップと設定
開発者は以下にある基本的な機器構成あるいは類似を入手し、デフォルトの機体構成を使用してください。

###推奨される開発環境

>PX4はここに書かれた機器よりも広範囲の機器で使用できます。
>しかし、新人開発者は標準的な設定のいずれかを使用することで恩恵を受けることができます。
>Taranis PlusとSamsung Note 4で非常に安価なフィールド環境を構築できます。

以下の機器を推奨します：

* Safety pilotかそれと同等用のTaranis Plusリモートコントローラー（プロポ）
* 開発用のPC:
 * Macbook pro(early 2015以降) OSX10.13以降
 * Lenovo Thinkpad 450 (i5) Ubunutu16.04以降
* 地上管制用のデバイス:
 * ipad (WiFiテレメトリアダプタが必要)
 * すべてのMacbookかUbuntu LinuxのラップトップPC（開発用PC）
 * Samsung Note 4かそれと同等のもの（QGroundControlを実行するのに十分な大きさの画面を有するAndoroidタブレットかスマートフォン）
* 完全メガネ
* マルチコプター向け - より危険なテストのためのテザーケーブル

#機体の構成
機体を設定するためには:

>機体の設定にはデスクトップ用のQGroundControlが必須です。
>PX４の最新機能を使用するためにはdaily buildを（定期的に更新し）使用する必要があります。

1. 開発プラットフォームのための[QGroundControl Daily Bild](https://docs.qgroundcontrol.com/en/releases/daily_builds.html)をダウンロードしてください。
2. [基本構成](https://docs.px4.io/en/config/) (PX4 User Guide)では、基本構成の実行方法について説明します。
3.  [パラメータの設定](https://docs.px4.io/en/advanced_config/parameters.html) (PX4 User Guide)では、個々のパラメータの検索と変更方法について説明します。
Ethereum の秘密鍵から公開鍵を取得 (JavaScript)

JavaScript で Ethereum の秘密鍵から公開鍵を取得する方法のメモです。
さまざまな方法がありますが、今回は比較的簡単なライブラリを使用した方法を共有します。

# 今回使用するライブラリ
- [ethereumjs-util](https://github.com/ethereumjs/ethereumjs-util)
- [ethereumjs-wallet](https://github.com/ethereumjs/ethereumjs-wallet)

# ライブラリのインストール

```
$ npm install ethereumjs-wallet --save
$ npm install ethereumjs-util --save
```

# 公開鍵から秘密鍵を取得するコード

```javascript
var Wallet = require('ethereumjs-wallet');
var EthUtil = require('ethereumjs-util');

// 秘密鍵を使用して、wallet インスタンスを取得
const privateKeyBuffer = EthUtil.toBuffer('0x61ce8b95ca5fd6f55cd97ac60817777bdf64f1670e903758ce53efc32c3dffeb');
const wallet = Wallet.fromPrivateKey(privateKeyBuffer);

// ウォレットの公開鍵を取得
const publicKey = wallet.getPublicKeyString();                                                                                                                                                                                                                                                               
console.log(publicKey);
```

# 参考
- http://blog.playground.io/entry/2018/05/02/092340

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。

https://scrapbox.io/sushiether/Ethereum_%E3%81%AE%E7%A7%98%E5%AF%86%E9%8D%B5%E3%81%8B%E3%82%89%E5%85%AC%E9%96%8B%E9%8D%B5%E3%82%92%E5%8F%96%E5%BE%97_(JavaScript)
GIMP2の起動に時間がかかる問題の対処手順

GIMPを使っていたところ、なぜか起動のたびにフォント読み込みの部分で時間がかかり起動がめちゃ遅くなって困っていた。自分の環境では以下の方法で改善したのでメモとして残しておく。

## 環境
* Windows10 Pro 1709 64bit
* GIMP for Windows 2.8.22

## 手順
### GIMPを起動する
とりあえず遅いのを我慢してGIMPを起動する。


### フォントフォルダ設定を修正する
ツールバーにある"編集"から、"設定"を開く。
![open-preference.png](https://qiita-image-store.s3.amazonaws.com/0/97774/a8dd7d3e-08ab-59a6-c013-323856dfb28f.png)

設定画面の左ツリーから、"フォルダー"を展開して"フォント"を選択する。その後、なぜか存在しないフォルダ(`C:\Program Files\GIMP\ 2\share\gimp\2.0\fonts`)のエントリを削除する。

また、残ったエントリ(`C:\Users\{ユーザー名}\.gimp-2.8\fonts`)を選択し、`C:\Users\{ユーザー名}\AppData\Local\fontconfig\cache`に書き換えて保存する。

![fix-fontdirectory.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/5437a933-f656-54a5-a09b-cf06eecae053.jpeg)

あとはGIMPを再起動し、起動が早くなったことを確認する。
ROS講座01 コンセプト

# 概要
ROSはロボット製作のための便利なツールです。以下に書くようにROSは広い範囲をカバーしています。ROSの利点はruntimeの物が重視しがちですが、install、build、runtimeのそれぞれでメリットがあります。

## install  
* インストールが簡単  
aptリポジトリの形で公開されていて多少のコマンドだけでインストールを完了できます。
* ロボットプログラムに必要なライブラリ一式の一緒にバージョン管理されている。  
OpenCVやEigen等のロボットプログラムに必要なライブラリも一緒にインストールすることができます。わざわざ個別に苦労してインストールする必要はありません。またrosのバージョンによってこれらのライブラリのバージョンも対応しているので、個別のライブラリのバージョンを気にする必要はありません。
* packageという単位でプログラムが分割されている  
プログラムがpackageという単位で区切られているので、ユーザーがgithubで公開たり、リポジトリとしてアップロードしているものを簡単に取り込めます。またすべてのパッケージがではないですがaptでインストールできるので、すぐにプログラムを試すことが出来ます。

## build  
* catkin  
Cmakeベースのビルドシステムであるcatkinを持っています。OpenCVなどの外部のライブラリとのリンクもこれが一手に担っています。依存関係などもcatkinが一手に引き受けます。

## runtime  
* pub、sub通信  
ros_commがあるので、プログラムをプロセスで分離した疎結合にできます。
* ロボット用の可視化ツールが豊富  
rostopic通信はコマンドラインで盗み見ることが簡単にできます。rosbagというログツールもあります。  
難しい3D可視化専用のrvizや、汎用GUI表示用のrqtというように既にロボット専用のツールがそろっています。自分でpluginsを書いて追加することもできます。
* シミュレーションはgazebo、
* roslaunchという起動スクリプトがある  
roslaunchを使うと簡単に複雑な起動オプションを記述して、起動することができます。またroslaunchの機能によって、ロボットの各プログラムを汎用的に書くことができます。

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)
SICP読書録 #12 1.3.2 lambdaを使って手続きを構築する

[hiroshi-manabe様の日本語訳](https://github.com/hiroshi-manabe/sicp-pdf)を使わせてもらいます。
練習問題等は[Gauche](http://practical-scheme.net/gauche/index-j.html)で実行。

[前回はこちら](https://qiita.com/shuetsu@github/items/a3d8eb55f7f86bc59b85)

# 1.3.2 lambdaを使って手続きを構築する

lambdaによって無名の手続きを作ることができる。
これで、以下の手続きを作り直してみよう。

```_.scm
(define (pi-sum a b)
  (define (pi-term x)
    (/ 1.0 (* x (+ x 2))))
  (define (pi-next x)
    (+ x 4))
  (sum pi-term a pi-next b))

(define (integral f a b dx)
  (define (add-dx x)
    (+ x dx))
  (* (sum f (+ a (/ dx 2.0)) add-dx b) dx))
```

pi-term, pi-next, add-dx は内部でのみ利用される手続きだ。いちいちdefineで名前を付ける必要はない。

```_.scm
(define (pi-sum a b)
  (sum (lambda (x) (/ 1.0 (* x (+ x 2))))
    a
    (lambda (x) (+ x 4))
    b))

(define (integral f a b dx)
  (* (sum f
          (+ a (/ dx 2.0))
          (lambda (x) (+ x dx))
          b)
      dx))
```

### letを使って局所変数を作る

次の式を計算したい。

```math
f(x,y)=x(x+xy)^2+y(1-y)+(1+xy)(1-y)
```

これを、以下のように表現しよう。

```math
\begin{align}
a&=1+xy \\
b&=1-y \\
f(x,y)&=xa^2+yb+ab
\end{align}
```

letを使うと、局所変数を定義できる。これで、以下のように定義できる。

```_.scm
(define (f x y)
  (let ((a (+ 1 (* x y)))
        (b (- 1 y)))
    (+ (* x (square a))
       (* y b)
       (* a b))))
```

### 練習問題 1.34

次の手続きを定義する。

```_.scm
(define (f g) (g 2))
```

実行してみよう。

```_.scm
gosh> (f square)
4 ; (square 2)
gosh> (f (lambda (z) (* z (+ z 1))))
6 ; ((lambda (z) (* z (+ z 1))) 2)
```

ここで、`(f f)`という手続きを実行したらどうなるか？
展開してみよう。

```_.scm
(f f)
> ((lambda (f g) (g 2) f) 
> (f 2)
> ((lambda (f g) (g 2) 2)
> (2 2)
```

というわけで、以下のような結果となる。

```_.scm
gosh> (f f)
*** ERROR: invalid application: (2 2)
```
Pubsを用いたコマンドライン論文管理

# Motivation

今までは論文はReadCubeやMendeleyといったGUIアプリケーションを用いて管理していた。これらは、便利だが、PC間で共有するにはストレージ制限があるし、MendeleyはMac OS Xへの最新版への対応に時間がかかる等、少し厄介なところがある。今回は、GitHubで見つけたコマンドライン論文管理ツールPubsの使い方をまとめて、この面倒を少しでも緩和することを目指す。


# Environment
今回はMacに元から入っているPython3.6下で。

# Installation
[PubsのGitHubページ](https://github.com/pubs/pubs)
導入は簡単

```
$ pip install pubs
```

# Usage
### Pubsの起動

```
$ pubs init
```
デフォルトでは、pubsのリポジトリは `~/.pubs/`に置かれる。
この場所をDropbox等のクラウドに設定すればPC間でライブラリを共有できる。

```
$ pubs init --pubsdir path/to/dir/
```


### Pubsへの論文の追加
`pubs add`コマンドを使用。
このときにDOI, ISBN, bibファイルをメタ情報として一緒に投げる必要がある。

DOIを用いて(`-D`)

```
$ pubs add -D 10.1007/s00422-012-0514-6 -d article.pdf
```

ISBNを用いて(`-I`)

```
$ pubs add -I 978-0822324669 -d article.pdf
```


bibファイルを用いて(あんまり使用頻度多くないかも)

```
$ pubs add reference.bib -d article.pdf 
```


### 論文へcitekeyの割当
論文をリポジトリに追加すると、デフォルトでは"[Author]_[Year]"というcitekeyが割り当てられる。

```
$ pubs rename citekey new_citekey
```

### リポジトリにある論文一覧表示

```
$ pubs list
```


# 使用指針
このツールだけで論文を全て管理するのは、

- 1つ1つ論文を管理する必要があること
- 検索ができないこと

を考えると、不十分。MendleyやReadCube、Evernoteといったアプリと使い分けをうまく行う必要がありそう。
【追記あり】WSL(Windows Subsystem for Linux)ではトースト通知が送信できない件

#追記(2020/03/19)
　WSL側からexeをうまく起動させれば全然実行可能なようです。私が無学でした…。詳しくはコメント欄を参照してください。
　参考のため、この記事自体は残しておきます。

#1.事象
　Windows10から利用可能になったWSL(Windows Subsystem for Linux)で、notify-send/notify-osdを利用してトースト通知(デスクトップ通知)を送信しようとしたが上手くいかなかった。

#2.原因
　どうやらWSLはWindows NTのウィンドウマネージャにアクセスできないため、通知を送信することもできないらしい。要はサポートされてない。
　参照元：https://github.com/Microsoft/WSL/issues/2180

　このため、例えばbashでgulpを回す時にgulp-notifyを使いたいと思っても、gulp-notify(の元になっているnode-notifier)がnotify-osdを使おうとしてしまうため、トースト通知は出てこない(コマンドラインの方にはエラーログが出る)。

#3.対応
　今のところはサポートを待つしかなさそう。

※User Voice Page
　https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/15403401-pop-up-notifications-like-notify-send)
　ここにそれなりの票数が集まればやってくれるかも…？とはいえ、2018/05/02現在22票で、inotifyが929票集めてやっと導入されたくらいなので、まだまだ先は長そう。


　或いは、MacのGrowlのLinux版も作成されているようなので、そちらを使ってみるのは一つの手かも。
　http://mattn.kaoriya.net/software/growl4linux.htm
Laravelのインストール方法(Windows7)

#はじめに
この記事ではPHPのフレームワークとして人気のLaravelをインストールする方法を書いています。LaravelのインストールにはComposerを用いるのが楽です。Composerをインストールされていない方は[こちら](https://qiita.com/rebi/items/e22365e63705afaa3ee2)の記事を参考にインストールしてみてください。

また、インストールする際にはウイルス対策ソフト特にAvastはオフにしておいた方がよさそうです。インストール後、ウェルカムページにアクセスできない場合があります。詳細は[こちらの記事](https://qiita.com/rebi/items/6a1b2d37aabed471d726)に書きましたので、参考にしてください。

#Laravelのインストールと環境変数の設定

さっそくですが、コマンドプロンプトを開き、インストールしましょう。

*composer global require "laravel/installer=~1.1"*

と入力し、エンターキーを押します。そうするとインストールが始まります。少し時間がかかりますが、「Generating autoload files」と出るまで待ちましょう。

![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/239294/23af1e34-fc01-184f-3d42-de46a4230730.png)


インストールが終わったら環境変数を編集します。詳細な編集の仕方は[こちら](https://qiita.com/rebi/items/577a18241236c66b983f)を参照してください。

環境変数はユーザーの方ではなく、「システム環境変数」の「Path」を編集します。例えばユーザー名がtaroでしたら末尾に

;C:\Users\taro\AppData\Roaming\Composer\vender\bin

と追加してください。

#プロジェクトの作成

これでLaravelを用いる準備が完了しました。さっそく試しにデスクトップに「test」という名前のプロジェクトを作成してみましょう。

コマンドプロンプトを開き、「cd Desktop」と入力し、その後「laravel new test」と入力します。お察しの通り、「new」の 後に続く部分がファイル名になります。

また少し時間がかかりますが、「Application ready! Build something amazing.」と表示されたら作成が終了です。

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/239294/056296f4-292f-57cc-4c0f-d9412f7d88b0.png)

"laravel"コマンドが認識されない場合はパスが書き間違っている場合や指定した「bin」フォルダの中に"laravel.bat"ファイルが無い場合があります。

ファイルがなかった場合は、一旦デスクトップなどに作成したフォルダに中身を移すなどしてbinフォルダを空にし、もう一度インストールのコマンドを打つとファイルが生成されると思います。

#アプリケーションの実行

最後にアプリケーションを実行してみましょう。「cd test」と入力し、エンターキーを押し、ディレクトリを移動します。その後「php artisan serve」と入力し、サーバーを実行します。

これを行うと「Laravel development server started」の文字と共にhttpから始まるアドレスが表示されます。

適当なブラウザを開き、このアドレスにアクセスしてみてください。以下の画像のような画面が出れば、成功です。

![fig3.png](https://qiita-image-store.s3.amazonaws.com/0/239294/3d4012d7-70ac-9ead-c448-2567e65518fe.png)


#ローカルホストに接続できない場合

詳細はこの[記事](https://qiita.com/rebi/items/6a1b2d37aabed471d726)に書きましたが、「Laravel development server started」と出ているにも関わらず、アドレスにアクセスしても応答を待っている状態が続きつながらない場合、ウイルス対策ソフトの影響が考えられます。リンク先の記事を参考にもう一度つないでみてください。


別の可能性としてブラウザのプロキシ設定が関連している場合があります。各自が使用しているブラウザのプロキシを使用しないように設定してから、再接続してみてください。

また、[こちら](https://qiita.com/kshimadutsu/items/3e7ea97f39145da7be09)の記事で紹介されている方法も参考になりそうです。

"--host 0.0.0.0"のオプションをつけると、以下の画像のようなウインドウが出てくるので、アクセスを許可すると上手くつなげるかもしれません。

![fig4.png](https://qiita-image-store.s3.amazonaws.com/0/239294/c43a474f-e63e-0ef7-dad2-3c394cd8676e.png)



#おわりに

このようにしてLaravelのプロジェクトを作り、そこからWebサイトやサービスを作っていくことになります。今回はその足掛かりについて書きました。だれかのお役にたてれば幸いです。

#参考文献

###ローカルホストに接続できない場合

[http://localhost に接続できない](https://msdn.microsoft.com/ja-jp/library/ee251335(v=bts.10).aspx)
これはインターネットエクスプローラーについての記事ですが、他のブラウザに対しても考え方は同じだと思います。
chainerの作法

#概要
chainerの作法を調べてみた。
分類。

#インポート


```
import numpy as np
import chainer
from chainer import cuda, Function, gradient_check, report, training, utils, Variable
from chainer import datasets, iterators, optimizers, serializers
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
from chainer.training import extensions

```

#訓練データセットのイテレーション
データは、np.array
基本は、Variableなので、datasetsを使って、np.arrayをVariableにする。
TupleDatasetは、分類で使う。ラベルは、1次で与える。int32。ohe_hotかは、不明。


```
def make_data():
	X = np.array([[0, 0], [1, 1], [0, 1], [1, 0]], dtype = np.float32)
	T = np.array([0, 0, 1, 1], dtype = np.int32)
	return chainer.datasets.TupleDataset(X, T)

test = make_data()
train = make_data()

```

#ミニバッチに対する前処理
ミニバッチを使う為のiterators
trainerに、流し込む。


```
epoch = 500
batchsize = 4
train_iter = chainer.iterators.SerialIterator(train, batchsize)
test_iter = chainer.iterators.SerialIterator(test, batchsize, repeat = False, shuffle = False)

```

#ニューラルネットワークのForward/backward計算
モデルをつくる。
マルチレイヤーパーセプトロンを構築。
Linerは、全結合。
分類なので、Classifierを使う。


```
class MLP(chainer.Chain):
	def __init__(self, n_units, n_out):
		super(MLP, self).__init__(l1 = L.Linear(None, n_units), l2 = L.Linear(None, n_out))
	def __call__(self, x):
		return self.l2(F.relu(self.l1(x)))

model = L.Classifier(MLP(8, 2))

```

#パラメータの更新
オプチマイザーに、Adamを使う。
trainingでトレーニング。

```
optimizer = chainer.optimizers.Adam()
optimizer.setup(model)
updater = training.StandardUpdater(train_iter, optimizer)
trainer = training.Trainer(updater, (epoch, 'epoch'), out = 'result')
trainer.run()

```

#評価データセットにおける現在のパラメータの評価
argmax使ってるので、one_hot?


```
x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype = np.float32)
y = model.predictor(x).data
for i in range(4):
	print (x[i], np.argmax(y[i]), y[i])

```

#中間結果をログに残す
プログレスバーを表示する。

```
trainer.extend(extensions.ProgressBar())

```

以上。
SnapでDockerインストール

# はじめに
Ubuntu18.04 LTSでは、snapdがデフォルトでインストールされているとのこと。
Snap未経験ですが、SnapでDockerをインストールしてみました。

# インストール
Ubuntu18.04 LTSインストール後、下記コマンドを実行しました。

```bash:インストール
$ sudo snap install docker
```

```bash:確認
$ docker --version

Command 'docker' not found, ...
```
dockerコマンドが見つかりません...
どうやらsnap.docker.dockerdをrestartしないといけないとのこと。


```bash:dockerd再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart snap.docker.dockerd
```
```bash:確認
$ docker --version
Docker version 17.06.2-ce, build a04f55b
$ docker.compose --version
docker-compose version 1.16.1, build unknown
```

できた！
Intel H310 chipset のオンボードグラフィックで LinuxMint 18.3 を 1920 x 1080 で使用する

# 初めに
一応書いておきますが、この記事を読んで実行される場合は自己責任にてお願いします。
ぶっちゃけトラブルシューティング出来ません。
良い子は標準で対応されるまで待ちましょう。
本記事は、以下の手順にも書いてありますが、アルファサポートのものを突っ込みますので。

# 手順
基本的には[こちら](https://ubuntuforums.org/showthread.php?t=2377324&p=13720009#post13720009)に書いてある通りの手順ですが、1箇所だけ追記。

## 1. 最新のビデオドライバのインストール
ppa追加時のメッセージは英語ですが、きちんと全て読みましょう。

```shell
sudo add-apt-repository ppa:oibaf/graphics-drivers
sudo apt-get update
```
（追記開始）
の後で、OSのアップデートマネージャで xserver-xorg-video-intel をインストール。
その後で、アップデートマネージャで更新をクリックし、チェックが入ったものを全てインストール。
（追記終了）

## 2. カーネルのパラメータ変更
自分はソースと同じく grub-customizer を使いましたが、Grub設定ファイルを直接編集出来るスキルがあればそちらにて。

```shell
sudo add-apt-repository ppa:danielrichter2007/grub-customizer 
sudo apt-get update 
sudo apt-get install grub-customizer
```
grub customizer を起動し、「一般」タブの「カーネル・パラメーター」に i915.alpha_support=1 を追記して「保存」。

## OSリブート
正座して待ちましょう。

# おまけ
* 自分は最初「追記」を実施しなかったので、ブート途中でハングするようになってしまい、リカバリのために完徹しました。~~GW中で良かった。~~
* タイトルで 18.3 と書いていますが、18以上であれば多分出来るんじゃないかな、と思います。理由はppa追加時のメッセージを読んでください。
Amazon Cloud9 で .NET Core を動かしてみた

# Amazon Cloud9 で .NET Core を動かしてみた

## Cloud9 とは

Cloud9 とは Webブラウザだけで使用できる Web IDE というやつです。2016年に Amazon に買収され、AWS Cloud9 として AWS に統合されました。
個人的な感想としてはちょっとした Lambda や CLIツールなどを開発するのには良いかもしれません。あと、コードやターミナルの共有がリッチなのでチャットしながらコードレビューとかの使いようもあるかも。
不満な所は [対応言語](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/language-support.html) の表にあるように、実行からデバッグまでフルサポートされている言語は C++, Go, Node.js, PHP, Python のみというのと、せっかく Lambda と相性抜群なのに Lambda連携が同リージョンしかサポートされておらず、日本リージョンとは連携できない所とかですね。

## Cloud9環境に .NET Core をインストールする

Cloud9 は実際の所 Amazon Linux の EC2インスタンスにフロントエンドとして乗っかっている形で、普通にターミナルからインストールできると思いましたが・・・
[ここ](https://www.microsoft.com/net/learn/get-started/linux/centos) に載っている方法だと途中でエラーが出ます。

```bash
$ sudo yum install dotnet-sdk-2.1.105
...
Error: Package: dotnet-runtime-2.0.7-2.0.7-1.x86_64 (packages-microsoft-com-prod)
           Requires: openssl-libs
Error: Package: dotnet-runtime-deps-2.1.0-preview2-26406-04-2.1.0_preview2_26406_04-1.x86_64 (packages-microsoft-com-prod)
```

https://github.com/dotnet/core/issues/930

AMI はサポート対象に入っていないらしい・・・
tar.gz を直接落としてきて入れると大丈夫らしいので結局インストール方法は以下のような手順になります。

```bash
$ sudo yum install libunwind libicu libcurl

$ wget https://download.microsoft.com/download/2/E/C/2EC018A0-A0FC-40A2-849D-AA692F68349E/dotnet-sdk-2.1.105-linux-x64.tar.gz
$ mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-2.1.105-linux-x64.tar.gz -C $HOME/dotnet
```

ターミナルで ~/dotnet/dotnet -v とやってバージョン情報が出ればOKです。

## Runner を作成する

![new-runner.png](https://qiita-image-store.s3.amazonaws.com/0/246831/058c79d4-26aa-0599-0030-3017a08f13c9.png)

一度適当なプログラムを書いて Run を実行すると実行ペインが出現します。
実行ペインの Runner を押すと有効な Runner の一覧と作成・編集のメニューが出るので、"New Runner" を選択します。

```json
{
  "cmd": [
    "dotnet",
    "run",
    "$file_path",
    "$args"
  ],
  "info": "Started $project_path$file_name",
  "env": {
    "PATH": "$PATH:~/dotnet"
  },
  "selector": "source.cs"
}
```

こんな感じで Runner を作成し、CSharp.runとでも名前を付けて保存しましょう。

## 試してみる

コンソールを開いて C# のコンソールアプリをテンプレートから作成します。

```
$ ~/dotnet/dotnet new console
```

Program.cs を開き、Run ボタンを押します。

![cs-run.png](https://qiita-image-store.s3.amazonaws.com/0/246831/6bfd1f24-2290-e844-ce50-a0be3e3869de.png)

動きました。これでブラウザしか使えない環境でもC#のプログラムが書き放題ですね！(そもそもAzureでAppEditor使えよとかいうのはナシでお願いします)
gitlab移行後のremoteの変え方と二段階認証の再設定手順

コスト的な都合で環境を移したので。

####[gitlab移行](https://qiita.com/smallpalace/items/711107b580cd4be5d2af)後に生じること
・ドメインが変わる場合remoteの設定を変える必要がある
・おなじく二段階認証を初期化してあるので再設定が必要となる
・CI連携でWebhookを設定してる場合は関連接続設定とurlの設定を変える必要がある

（SSH鍵認証の再設定は不要）

####remoteの変え方
gitコマンドを用いる場合

```
git remote -v
new_gitlab_url='git://新gitlabサーバのurl/namespace/reponame.git'
git remote set-url origin ${new_gitlab_url}
git remote -v
```
urlはhttpsではなくgitから始まるものです。

または以下のように直接設定ファイルを編集する

```
cd ${my_gitrepo_root}
vi .git/config
url = git@${old_gitlab_url}:namespace/reponame.git
↓
url = git@${new_gitlab_url}:namespace/reponame.git

git remote -v
```
変更後に`git push/pull`する

やたらリポジトリが多い人はfind＋sedがべんり(変数にみえるURLはリテラルに置換してください）

```
find /path_to_git_repositorys/*/.git -type f -name "config"|xargs grep ${old_gitlab_url}
find /path_to_git_repositorys/*/.git -type f -name "config"|xargs sed -i 's/${old_gitlab_url}/${new_gitlab_url}/g'
```

visualstudioは、以下URLにあるように、チームエキスプローラーにて、設定タブを表示、remoteの設定をする
https://opcdiary.net/?p=34613

tortoisegitは以下URLの画像を参考にドメインの部分を変更する
https://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html#tgit-dug-settings-git-remote





####2要素認証の再設定

・管理者は移行後に全ユーザの2要素認証の設定を無効化する
http://vamview.hatenablog.com/entry/2016/08/25/232914

・ユーザは初回と同様に右上のアイコン＞ProfileSettings＞Accontから2要素認証の再設定をおこなう
http://jildin.hatenablog.com/entry/2017/03/20/033736

webUIのログインはスマホアプリのAuthenticatorをつかいますが、
コンテナレジストリにdocker loginする場合はいつもの自分のgitlabのログインパスワードのかわりに生成したトークンをつかいます。

####Webhookを設定してある場合、通信先通信元の接続URLとファイアーウォールの設定を更新する

・管理者は移行後に移行前に許可されていた接続元(SSH)を新gitサーバにも許可する

・gitサーバが接続元となるCIサーバなどのファイアウォール設定については個人管理となる

####SSHの設定ファイル・hostsなどを更新する

以下はもし必要だった場合に。
hostsの設定は通常は不要(DNSの設定を上書きして検証時など内部DNSが存在しないか優先したい事情がある、グローバルなDNSの設定を制御したい時などに利用)です。
sshはhostの指定だけで鍵オプション書かなくてよくなるので少し便利です。

Unix/Linuxの場合(変数にみえるURLはリテラルに置換してください）

```
vi ~/.ssh/config
Host ${new_gitlab_url}
    HostName ${new_gitlab_url}
    IdentityFile ~/.ssh/id_rsa
```

```
sudo vi /etc/hosts
```

winのhostsの場所は以下なのでメモ帳やテキストエディタで必要に応じて編集する
`C:\Windows\System32\drivers\etc\hosts`

Macのhostsの場所は`/private/etc/hosts`にあるようです。

hostsの編集をするには管理者・root権限が要ります。

https://ja.wikipedia.org/wiki/Hosts

以上
メモ: Thinkpad X1Carbon(2018)をWindows10とUbuntu18.04のデュアルブートにした

まあそこそこすんなりいったが、初心者的には躓くこともあったので多少メモ。
一応ubuntu,Windows双方で暗号化も行った。
# なぜ18.04か
まず16.04がThinkpad X1 carbon上ではドライバーなどをうまく認識しなかった。17.10は動くもののLenovo系のPCのBIOSに不具合を起こすバグがあったなこと（修正済み）に加え、おそらく今後あまり広く使われないであろうことも踏まえて使わないことにした。色々とトラブルを起こしているうちに18.04がリリースされたのでせっかくなので使うことにした

#　手順
以下の手順に従った。
https://www.abten.net/2017/02/925/
これはUbuntu16.04向けでWindows側をBitlockerで暗号化、ubuntu側のディスクもOS側の機能で暗号化する方法である。
Windows10 ProfessionalでないとBitlocker機能は使えないので注意。
上記の手順に従ったが、grub経由でwindows boot manager を呼んだとき、TPMを使ってbitlockerを解除することに失敗してしまう。（というより毎回構成の変更を検知してしまうため、毎回bitlockerの解除キーを要求されてしまう。）結局windowsをデフォルトでブート,ubuntuを使うときはF12でブートメニューに入ってgrubを起動という形にした。
トラックポイントも、タッチパッドもキーボードもデフォルトのインストールですべて問題なく入った。（ゆとり世代）


# 躓いた点
1. BIOSが日本語配列キーボードを英字配列で認識していた．
2. WQHDを使用したら、インストーラーのウインドウが画面内に収まらなかった（設定から表示サイズを200％→100％に変更したら見えるようになった）(追記：自分で書いたのだが，表示サイズの変更のやり方を忘れてしまった．Alt + F7を押すと画面外までウインドウを動かせるようになるので，それで対処できる（参考：https://smdn.jp/softwares/ubuntu/installation-lts-desktop/）)
3. 結局grub経由のwindowsの起動には失敗した点。grub経由だと毎回bitlockerの暗号化解除キーを要求されてしまう。

# その他にやったこと
* 日本語でインストールしてしまったのでドキュメント・ダウンロード周りの名前を変更した

```bash
LANG=C xdg-user-dirs-gtk-update
```
* エラーなどで日本語が出るとググラビリティが下がるので、英語でメッセージを出すように以下を.bashrcに追加

```bash
export LC_ALL=en_US.UTF-8
```

* Windows側の時刻がずれるので以下のコマンドを実行

```
sudo timedatectl set-local-rtc 1
```
# できなかったこと・そのうち試したいこと

1. Windows10 ProfessionalにはHyper-Vなるハイパーバイザ機能がついているのでいつか試したい。

2. 1passwordを使おうとしたがubuntu上では使えない。Ubuntu16.04ではwine上で動板との報告があったが、18.04で軽く試した感じでは動かなかった。うまく動かしたい。
3. 画面の表示サイズが（1oo%,200%,300%）からしか選べないので組み込みのディスプレイがやや見にくい。１００％表示で1920*1080で使ってしまっている。
4. grubから起動してもbitlockerでいちいち回復キーを要求されないようにしたい




# おまけSSDの換装
デュアルブートだと何かと容量を使うのでSSDを1TBのものに換装した
[ここ](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjiituRjOXaAhWEJJQKHQv4AcsQFggrMAA&url=http%3A%2F%2Fthinkpad-x1yoga.hatenablog.com%2Fentry%2F2018%2F03%2F15%2FThinkPad_X1_Carbon%25282018%25E5%25B9%25B4%25E5%259E%258B%25E3%2580%2581%25E7%25AC%25AC6%25E4%25B8%2596%25E4%25BB%25A3%2529%25E3%2581%25AESSD%25E3%2582%2592%25E4%25BA%25A4%25E6%258F%259B%25E3%2582%2592%25E3%2581%2599%25E3%2582%258B&usg=AOvVaw3oewvTB7XXgMlDXGFDmLz3)を参照した。1TBのSSDはもはや３万円で買える時代になってしまった。

# 参考
https://qiita.com/take5249/items/13ada73bbd01ee12a2c3
http://yukihane.hatenablog.com/entry/201605/ubuntu16.04-datetime


ツッコミ指摘などいただけるとありがたいです。