OmniAICreator/Qiita-1.07M huggingface dataset:
ErgoDoxEZによる確定と交代する

キーボード操作で、エンターキー押下は重要ながら打ち続ける事は無い。
1回の押下で事は済む。
その1回押下のために、キーボードに重鎮させるのはもったいない。
その部分に他に重要なキーを割り当てた方が節約になろう。
(キーボードのキー数が少なければ、必然的な思考だろう)


# 押下でエンターキー・押し続けでShiftキー
押下(タップ)でエンターキーになり、押し続ければShiftキーになる。
このShiftキーは右側のShiftキー固定だ。

## キーコード：KC_SFTENT
今まで同様普通にキーコードとして設定すれば使えるようになる。

```ErgoDoxEZ:keymap.c
[BASEPlate] = LAYOUT_ergodox(  // layer 0 : default
       // left hand
		KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,			/* 7桁	*/
		KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,			/* 7桁	*/
		KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,			/* 6桁	*/
		KC_SFTENT,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,					/* 7桁	*/
		KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,			/* 5桁	*/

																KC_NO,	KC_NO,
```

当たり前だが、(上記で説明通り)右用のShiftキーのため、右側に配置した方が良いようだ。
しかし、私はエンターキーを左側に置きたい。

なかなか上手くいかないもんだ。

## 別の宣言：mkファイル
いつも通りrules.mkファイルへの宣言で使えるようになるらしいのだが、未検証だ。

```ErgoDoxEZ:rules.mk
COMMAND_ENABLE = no
```

このファイルの存在は何のためにあるのだろう。
キーコードとして配置するだけでは~~不満なの~~ 不都合があるのかな。


# エンターキーの拒否
どうしてもエンターキーはいやだ。
しかし、Shiftキーとは組みあわせたい。
そんなときは、そうすればいい。
それがQMKのいいところ。

タップでエンターキーになるのは、デフォルトの動き。
それを変更すれば良いだけ。

```ErgoDoxEZ:config.h
#define SFTENT_KEY KC_TAB
```

この宣言により、タップはタブキーだが、押し続ければRShiftキーになる。
もちろん、キーコードとして`keymap.c`に使うキー名は、**KC_SFTENT**だ。
(混乱する名前になってしまうが、仕方ない)


# 欠点(エンターキーのつもり)
便利そうだが、難点が有り、テキストエディタで空行を数十行作りたい場合は、その数分タップしなければならない。
非常に面倒だ。
(当然、エンターキーをタブキーに割り当てても同じ挙動をする)





以上だ。
Array.prototype.findIndex() - 配列から条件を満たす値のインデックス番号を取得する

Array.prototype.findIndex()は、配列から条件を満たす要素のインデックス番号を取得するメソッドです。前方から後方にかけて検索し、条件を満たす一番最初の要素だけが返ります。条件を満たす要素が1つもない場合、undefinedが返ります。なお、find()は、値ではなく、インデックス番号が返ります。

概要
名前
findIndex
所属
Array.prototype
仕様書
https://tc39.github.io/ecma262/#sec-array.prototype.findindex
説明
Array.prototype.findIndex ( predicate [ , thisArg ] )
第1引数(predicate)にコールバック関数を指定します。このコールバック関数がtrueを返せばその要素のインデックス番号が検索にヒットした値として返されます。それ以外なら条件を満たしていないと判断され、次の要素のチェックに移ります。配列の全ての要素がこのコールバック関数にかけられます。コールバック関数は、値、インデックス番号、配列そのもの、の3つの引数を受け取ります。

第2引数(thisArg)を指定すると、それがコールバック関数内におけるthisの値となります。省略した場合、thisの値はundefinedです。

function predicate ( value, index, array ) {
	return true ;
}
チュートリアル
例えば、配列から6より大きい値のインデックス番号を検索したい、というテーマでArray.prototype.findIndex()を利用してみます。コールバック関数は、引数で受け取った値(value)が6より大きければ条件を満たすのでtrue、それ以外なら条件を満たさないのでfalseを返すようになっています。

var array = [ 3, 6, 9, 4, 7, 8 ] ;

var predicate = function ( value, index, sourceArray ) {
	if( value >= 6 ) {
		return true ;

	} else {
		return false ;

	}
}

array.findIndex( predicate ) ;	// 2
処理は内部で次のように繰り返されます。trueが返った時点でその値のインデックス番号がメソッドの返り値に決定して処理は終了します。

predicate( 3, 0, array ) ;	// false
predicate( 6, 1, array ) ;	// false
predicate( 9, 2, array ) ;	// true (この時点で処理を終了)
predicate( 4, 3, array ) ;	// false
predicate( 7, 4, array ) ;	// true
predicate( 8, 5, array ) ;	// true

参考https://lab.syncer.jp/Web/JavaScript/Reference/Global_Object/Array/prototype/findIndex/
iOSプログラミングでの事前知識を経ずにmacアプリを開発する記事を書きたい

#第一回 環境構築とswiftの基本
##そもそもこの記事を書くにあたって
 　私自身が未だにGUIアプリを作ったことがなく，5年ほど前からiPhoneのアプリを作りたいと思っていたこと，そういえばmacのアプリ作ってみたいなってふと思い立ったこと，そしてmacアプリを作りたいという記事がほとんどの人がiOSプログラミングの知識が前提で書かれていたことで私が嘆いたところなら自分で記事書けばいいのかってなったことなどいろいろあります．
私の個人的事情などどうでもいいのでとりあえずswiftの基本から見ていきましょう．ほかの言語をある程度触ったことがある人向けなので最初に私の記事を読んだ人には厳しいかもしれません．

##Swiftとは
2014年にAppleが発表したプログラミング言語である．
基本的にiOSやMac向けのアプリの開発はSwiftかObjective-Cを使う．
現在でもObjective-Cを使ったアプリケーションの開発は可能ですが今から学習するのであれば学習コストが低くなり言語としても新しいSwiftを勉強するのが無難だと思われる．

##Swiftの強み
- WindowsやLinuxでも動く様になった(らしい)
- Objective-Cよりも簡単
- コンパイラが高速(やっぱりC++には勝てないけど割と早い)
- だけどスクリプト言語の様に扱える．
- クロージャ，タプル，ジェネリクスなどが実装されたモダンな「言語」

##Swiftの弱点
- 新しい言語のため仕様変更が多い(私の開発環境は4.0以降ですが参考文献は3.1をターゲットとしているので100%の動作保証はできないです．)
- 情報が少ない(少しずつ増えてはいるけど)
- XCodeが英語だから英語読めないと厳しい
- 結局ubuntuとかだとiosとかのapiは使えないからguiの開発ができない(実際に私もmacを使って開発を進めます．)

##環境構築
MacであればappstoreからXcodeをDLする．
get started with a plyagroundを選択する．![スクリーンショット 2018-10-23 16.01.21.png](https://qiita-image-store.s3.amazonaws.com/0/304432/2d9c3f8a-3b96-3ce8-3bb8-d2e16ed5fe87.png)
macOSの欄からBlancを選択し，playground環境を作る．
Swiftに慣れるまではplaygroundを使ってCUIで行う．

##Swiftの文法的特徴
- 文末のセミコロンは必要ない
- 変数宣言時に型の宣言はしなくてよい
- 暗黙的な型変換は行わない．
- コメントの書き方はCなどと同じく"//"と”/**/”
- 範囲演算子なるものがある
- nilとオプショナル型という物がある

ざっとこんな感じでまとめられます．
とりあえずhelloworldを書いて見ましょう
###ソースコード
 
    var hw="helloworld" //変数宣言と代入
    let lang="Swift" //定数宣言
    print(hw)
    print(lang)

###実行結果

    helloworld
    Swift

## 次回予告
次回はSwiftの基本構文についてまとめたのちXcodeについても多少まとめられればと思います．
なるべく早めに進捗出します．

## 参考文献
> プログラミング経験者のためのSwit最速入門(著天田士郎)
シンボリックリンクの貼り方

シンボリックリンクを貼るのが苦手で、いつもなかなかうまく貼れずに苦戦するのでメモ。

# シンボリックリンクを貼るコマンド
```bash:シンボリックリンクを貼る
$ ln -s リンクしたい実際のdir そのdirを呼び出す際のリンク名
```

# 例えばこんな場合
ローカルでテストする時に、ローカル環境をサーバーと同じディレクトリ構成にしたい。

下記のようなディレクトリ構成だったとして、
`/var/project/conf`で`/Users/tamorieeeen/test/project/conf`を呼び出したい場合。

```bash:Dir構成
$ pwd
/Users/tamorieeeen/test
$ tree
.
└── project
    ├── conf
    │   ├── local_conf.xml
    │   └── test.xml
    ├── sql
    │   └── test
    │       └── test.sql
    └── tmp
```

## 絶対パスで貼る場合
絶対パスで指定する場合は、どこでコマンドを実行しても一緒なのでどこにいてもOK。

```bash:絶対パスの場合
$ ln -s /Users/tamorieeeen/test/project /var/project
```

## 相対パスで貼る場合
シンボリックリンクを貼りたいディレクトリに移動してからコマンドを実行。
今回の場合`/var`に`project`という名称でシンボリックリンクを貼りたいので`/var`に移動。

```bash:相対パスの場合
$ cd /var
$ ln -s /Users/tamorieeeen/test/project project
```

## 確認方法
シンボリックリンクを貼ったディレクトリを`ls -l`して、権限の頭に`l`がついてればシンボリックリンクが貼れてることがわかる。

```bash:確認方法
$ ls -l /var/project
lrwxr-xr-x  /var/project -> /Users/tamorieeeen/test/project
```

# シンボリックリンクを削除する方法
どちらでもOKですが、個人的には`rm`は緊張するので`unlink`の方が好きです。

```bash:シンボリックリンクを消すコマンド1
$ unlink /var/project
```

```bash:シンボリックリンクを消すコマンド2
$ rm /var/project
```
ちなみにディレクトリを削除する場合は`rm -r`ですが、シンボリックリンクを削除する場合は`-r`は不要です。

# シンボリックリンクを変更する方法
変更する場合は`-f`の上書きオプションをつける。
ここで注意なのは、ディレクトリのシンボリックリンクの場合は`-n`オプションも必要なこと。

```bash:シンボリックリンクを変更する場合
$ ln -nfs /Users/tamorieeeen/test_2/project /var/project
```

# 参考
lnコマンドのオプション詳細は下記参照
[【 ln 】コマンド――ファイルのハードリンクとシンボリックリンクを作る](https://www.atmarkit.co.jp/ait/articles/1605/30/news022.html)
未経験エンジニアのSQLコマンド備忘録

#CREATEコマンド
- データベースを作成する<br>`CREATE DATABASE データベース名;`
- テーブルを作成する<br>`CREATE TABLE テーブル名 (カラム名1 データ型1, カラム名2 データ型2, ……);`

#SHOWコマンド
- データベースの情報を確認する<br>`SHOW DATABASES;`
- すべてのテーブルを表示する<br>`SHOW TABLES;`

#useコマンド
- 使いたいデータベースを指定する<br>`use データベース名`<br>※文末にセミコロンは不要

#INSERT INTOコマンド
- テーブルにデータを挿入する<br>`INSERT INTO テーブル名 VALUES(データ1, データ2, ……);`

#SELECTコマンド
- 現在使っているデータベースを表示する<br>`SELECT DATABASE();`
- カラムごとのデータを表示する<br>`SELECT カラム名1, カラム名2, …… FROM テーブル名;`<br>※すべてのレコードを表示させる場合は、カラム名の所を*にする。
- カラム名をエイリアス（ユーザが分かりやすい名前）にする<br>`SELECT カラム名 AS エイリアス FROM テーブル名;`
- 条件に一致したレコードだけを表示する<br>`SELECT カラム名 FROM テーブル名 WHERE 条件;`
    - あるカラムがmin以上max以下の範囲にあるレコードを表示したいとき<br>`SELECT カラム名 FROM テーブル名 WHERE カラム名 BETWEEN min AND max;`
    - あるカラムがmin以上max以下の範囲にないレコードを表示したいとき<br>`SELECT カラム名 FROM テーブル名 WHERE カラム名 NOT BETWEEN min AND max;`
    - あるカラムがaかbのどちらかであるレコードを表示したいとき<br>`SELECT カラム名 FROM テーブル名 WHERE IN (a, b);`
- レコードを昇順に表示させる<br>`SELECT カラム名 FROM テーブル名 ORDER BY キーとなるカラム;`

#WHERE、GROUP BY、ORDER BYの順序
WHERE　→　GROUP BY　→　ORDER BYの順でかく。
Rails の ActiveStorage を S3 で使ったらPublicなURLが取れなかった

# ActiveStorageの必要性

長年愛用していたRailsのファイルアップロードgemである[paperclip](https://github.com/thoughtbot/paperclip)がDeprecationとなってしまったため、仕方なくActiveStorageを使ってみたところ、PublicなURL(S3への直接のURL)が取得できませんでした。
仕方なく別途S3用のクラウドサービスを追加して対応しました。

# 環境

- Rails 5.2.1
- ActiveStorage 5.2.1

# 問題点
ActiveStorageではデフォルトでクラウドサービスへのアップロードに対応しており
- AWS S3
- GCP Cloud Storage
- Azure Storage
へのファイルアップロードは設定ファイルを書くだけで対応できます。
ただし、ファイルアップロードの際にアクセス権限を指定することができずS3ではprivateでのファイルアップロードとなります。  

下記がgem内のS3サービスのファイルです。
ファイルアップロード処理(put)で渡しているoptionにacl(アクセス権限)が含まれていません。
``@upload_options`` への設定の渡し方を調べればなんとかなるとは思っていましたが、次に調べたURLの取得でファイル自体を変更しないといけないことが判明しました。

~~~activestorage-5.2.1/lib/active_storage/service/s3_service.rb
    def initialize(bucket:, upload: {}, **options)
      @client = Aws::S3::Resource.new(**options)
      @bucket = @client.bucket(bucket)

      @upload_options = upload
    end

    def upload(key, io, checksum: nil)
      instrument :upload, key: key, checksum: checksum do
        begin
          object_for(key).put(upload_options.merge(body: io, content_md5: checksum))
        rescue Aws::S3::Errors::BadDigest
          raise ActiveStorage::IntegrityError
        end
      end
    end
~~~

ファイルのURLを取得するときに事前署名URL``presigned_url``となり、URLを使い回すことや長期間使用することが想定されていません。

~~~activestorage-5.2.1/lib/active_storage/service/s3_service.rb
    def url(key, expires_in:, filename:, disposition:, content_type:)
      instrument :url, key: key do |payload|
        generated_url = object_for(key).presigned_url :get, expires_in: expires_in.to_i,
          response_content_disposition: content_disposition_with(type: disposition, filename: filename),
          response_content_type: content_type

        payload[:url] = generated_url

        generated_url
      end
    end
~~~

ちなみに、``expires_in``は最大1週間指定できるようですが、今回はOGPのog:imageに指定するURLに使用したかったのでPublicなURLじゃないと駄目です。

# 新S3サービスのファイルを作成

以下に既存の3サービスファイルからの修正点を記載します。

~~~app/lib/active_storage/service/s3_service.rb
    def upload(key, io, checksum: nil)
      instrument :upload, key: key, checksum: checksum do
        begin
          # aclでpublic-readを指定して必ず公開設定に変更.
          object_for(key).put(upload_options.merge(body: io, content_md5: checksum, acl: 'public-read'))
        rescue Aws::S3::Errors::BadDigest
          raise ActiveStorage::IntegrityError
        end
      end
    end

# ... 略

   def url(key, expires_in:, filename:, disposition:, content_type:)
      instrument :url, key: key do |payload|
        # public_url で署名なしのPublic URLを取得.
        generated_url = object_for(key).public_url
        payload[:url] = generated_url
        generated_url
      end
    end
~~~

# 注意点
- S3へアップロードするファイルすべてが``public-read``になります。``private``にアップロードするファイルとの共存はできなくなります。
- ActiveStorage gemをアップデートする場合は、互換性がなくなる可能性があるため、ベースのS3ファイルとの差分をチェックすること

はやくActiveStorage自体でPublic URLの対応をしてくれないだろうか…
Ubuntu 16.04.5で有線LANが繋がらない

# はじめに
初めて自作PCを作成した。
マザボは [GIGABYTE H370 AORUS GAMING 3 WIFI ATX ゲーミングマザーボード [Intel H370チップセット搭載] MB4342](https://amzn.to/2ys0MOp)を購入。

しかし、ifconfigを打っても `lo` しか表示されず、ドライバーをインストールしようにも、makeや依存関係のdebがないなどで途方に暮れていた。
サポートにお電話したところ、本マザボはWindows用で、Linuxについてはよくわからない、とのことでした。

# 対応
USBは認識するため、ドライバ内蔵のUSB有線LANアダプタを購入。
[PLANEX Windows/Mac/Linux対応 USB3.0 ギガビット有線LANアダプタ (ドライバ内蔵型で設定不要) USB-LAN1000R](https://amzn.to/2NQT3OR)

上記を刺してもすぐには繋がらない。


```
sudo lshw -c Network
```
とすると`*-network DISABLED`となってるものがある。
これの`logical name`をメモ。

```
sudo ifconfig 上でメモしたlogical_name up
```

`ifconfig`を打つと、`lo`以外にもう1つ表示される。

`sudo vi /etc/network/interfaces`とする

おそらく8行ぐらいのみ表示される。
`iface lo inet loopback`の下に下記追加

```
auto 先ほどメモしたlogical_name
iface 先ほどメモしたlogical_name inet dhcp
dns-nameservers 8.8.8.8 8.8.4.4
```

保存。

`sudo /etc/init.d/networking restart`とする。

pingを打ってネットワークにつながっていることを確認。

# 参考資料
[12.10 - ping: unknown host google.com in UBUNTU SERVER - Ask Ubuntu](https://askubuntu.com/questions/465729/ping-unknown-host-google-com-in-ubuntu-server)

[12.04 - How to change IP when /etc/network/interface file is missing? - Ask Ubuntu](https://askubuntu.com/questions/196640/how-to-change-ip-when-etc-network-interface-file-is-missing)

[drivers - Ethernet *-network DISABLED - Ask Ubuntu](https://askubuntu.com/questions/341690/ethernet-network-disabled)
react-native > Tab navigation




https://infinitered.github.io/ionicons-version-3-search/

[Tab navigation · React Navigation](https://reactnavigation.org/docs/en/tab-based-navigation.html)



```

// You can import Ionicons from @expo/vector-icons if you use Expo or
// react-native-vector-icons/Ionicons otherwise.
import Ionicons from 'react-native-vector-icons/Ionicons';
import { createBottomTabNavigator } from 'react-navigation';

export default createBottomTabNavigator(
  {
    Home: HomeScreen,
    Settings: SettingsScreen,
  },
  {
    navigationOptions: ({ navigation }) => ({
      tabBarIcon: ({ focused, horizontal, tintColor }) => {
        const { routeName } = navigation.state;
        let iconName;
        if (routeName === 'Home') {
          iconName = `ios-information-circle${focused ? '' : '-outline'}`;
        } else if (routeName === 'Settings') {
          iconName = `ios-options${focused ? '' : '-outline'}`;
        }

        // You can return any component that you like here! We usually use an
        // icon component from react-native-vector-icons
        return <Ionicons name={iconName} size={horizontal ? 20 : 25} color={tintColor} />;
      },
    }),
    tabBarOptions: {
      activeTintColor: 'tomato',
      inactiveTintColor: 'gray',
    },
  }
);

```
配列の中から条件に一致する要素を抜き出す(filter)

配列の中から条件に一致する要素を抜き出す(filter)

配列の中で条件に一致する要素を抜き出したい

var array = [1, 2, 3, 4, 5];
の中から
3よりも大きい数値だけを抜き出して
新たな配列を作ってみる

コード.gsを実行すると以下のようなログが出ます





コード.gs 
function get_filtered() {
  var array = [1, 2, 3, 4, 5];
  var filtered = array.filter(judge);
  Logger.log(filtered);
}

function judge(value) {
  var result = value > 3;
  return result;
}
意訳
この機能がやること
1から5までの数値を入れた配列を用意する
arrayの中身をjudgeで処理した結果を取得して
ログに出す


この機能がやること
valueが3より大きければ
返す



文字列を正規表現で探す

var array = [];
の中に12星座の英語名を入れておいて
us を含む要素だけを抜き出して
新たな配列を作ってみる

コード.gsを実行すると以下のようなログが出ます




コード.gs
var array = [
  "Aries", 
  "Taurus",
  "Gemini",
  "Cancer",
  "Leo",
  "Virgo",
  "Libra",
  "Scorpius",
  "Sagittarius",
  "Capriconus",
  "Aquarius",
  "Pisces"
]

function get_filtered() {
  var filtered = array.filter(judge);
  Logger.log(filtered);
}

function judge(value) {
  var pattern = /us/
  var result = pattern.test(value);
  return result;
}
意訳
星座名を英語名の配列で用意しておく














この機能がやること
arrayの中身をjudgeで処理した結果を取得して
ログに出す


この機能がやること
見つけたいパターンを決めて
見つかれば
返す


参考

JavaScript Array filter() Method
https://www.w3schools.com/jsref/jsref_filter.asp


http://www.pre-practice.net/2018/01/filter.html
gen-flow-filesの使い方と注意点

# あらすじ

何時もgen-flow-filesで型自動生成してたのに、急に動かなくなった。
コンポーネントに型定義してるだけなのに何が悪いかわからない。
ただ、見た目を整えたかったから`.scss`をimportした。←動かない原因だった。

*先ずはざっくり使い方を書いて、最後に注意点を書きました。*


# gen-flow-filesの使い方

目的はライブラリとして、publishした時に型定義がしっかり効くこと。

詳しくは[テストファイル](https://github.com/facebook/flow/blob/master/newtests/gen_flow_files_command/test.js)を読む。

### 前準備

先ずは、`flow stop`で稼働中のflow serverを停止。

### コマンド実行

`flow gen-flow-files index.js --out-dir type-definitions`

### コマンド実行結果

index.jsに記述されたflowの型定義が、「type-definitions」ディレクトリに「index.js.flow」として吐き出されている。

### 後処理

index.jsとindex.js.flowを同じ階層に置いて、publishする。
(package.jsonの**files**にきちんとpublish出来るようにファイル、あるいはディレクトリを列挙しておくこと)
https://docs.npmjs.com/files/package.json#files

# 注意点

- `// @flow`で型定義したファイルに`js` `jsx` `mjs` `json`以外の物を含めないこと。
- `.flowconfig`で`.css` `.scss`を**ignore**したからって、flowは**無視してくれない**。
- `.css` `.scss`をimportしたければ、**suppress_comment**を適用しなければいけない。(.flowconfigでカスタマイズ可能)
- エディタを開きっぱなしで、`gen-flow-files`を実行しても動作しない可能性が高い。(エディターと`gen-flow-files`で、どちらかが`flow server`を占拠している??)
Rails バリデーションのまとめ

忘れがちなのでRails バリデーションをまとめました。

##チェックボックスのオン・オフ
**acceptance**

```ruby

validates :terms_of_service, acceptance: true
```


##関連付けされている両方のモデルでバリデーションを実行する
**validates_associated**

```ruby

class Library < ApplicationRecord
  has_many :books
  validates_associated :books
end
```
##2つのテキストフィールドの完全一致
**confirmation**

```ruby

class Person < ApplicationRecord
  validates :email, confirmation: true
end

<%= text_field :person, :email %>
<%= text_field :person, :email_confirmation %>
```

##指定した値が含まれていない
**exclusion**

```ruby

validates :subdomain, exclusion: { in: %w(www us ca jp),
    message: "%{value}は予約済みです" }

```

##指定した値が含まれている
**inclusion**

```ruby

  validates :size, inclusion: { in: %w(small medium large),
message: "%{value} のサイズは無効です" }
```

##正規表現の一致
**format**

```ruby

  validates :legacy_code, format: { with: /\A[a-zA-Z]+\z/,
    message: "英文字のみが使用できます" }
```

##長さ
**length**

```ruby

  validates :name, length: { minimum: 2 }
  validates :bio, length: { maximum: 500 }
  validates :password, length: { in: 6..20 }
  validates :registration_number, length: { is: 6 }
```

##整数か浮動小数が使用されている
**numericality**

```ruby

  validates :points, numericality: true
```


##空でない

**presence**

```ruby

validates :name, :login, :email, presence: true
```

##boolean属性で空でない
**inclusion: { in: [true, false] }**

```ruby

validates :boolean_field_name, inclusion: { in: [true, false] }
```

##値が重複しない
**uniqueness**

```ruby

  validates :email, uniqueness: true
```

##バリデーションが実行される条件を指定する
**:if**

```ruby

 validates :card_number, presence: true, if: :paid_with_card?
```

##バリデーションが実行される条件を指定してまとめて実行する
**with_options**


```ruby

  with_options if: :is_admin? do |admin|
    admin.validates :password, length: { minimum: 10 }
    admin.validates :email, presence: true
```

##バリデーションのタイミング
バリデーションはnewやsaveで保存された時に実行されるので、
newでインスタンス化されたオブジェクトではエラーは報告されない

##バリデーションが通るか手動で確認
**valid? invalid**

```ruby
Person.create(name: "John Doe").valid? # => true
Person.create(name: nil).valid? # => false
```

##エラーメッセージの配列を取得する
**errors.messages**

```ruby
person = Person.new
person.valid? # => false
person.errors.messages
# {:name=>["空欄にはできません", "短すぎます (最小3文字)"]}
```

##エラーの属性名を最初に追加して、見やすい形でエラーメッセージを表示する
**errors.full_messages（errors.to_a）**

```ruby
person.errors[:name]
# => ["は以下の文字を含むことができません !@#%*()_-+="]
 
person.errors.full_messages
# => ["Name は以下の文字を含むことができません !@#%*()_-+="]
```

##オブジェクトの状態全体に関連するエラーメッセージを追加する
**errors[:base]**

```ruby
 errors[:base] << "この人物は以下の理由で無効です..."
```

## 参照
[Active Record バリデーション](https://railsguides.jp/active_record_validations.html#%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B)
カオスで知られるLorenz方程式の可視化

p5.js 楽しい

　webeditor で作ったのものはブログなどで
そのまま公開できるよ(iframeが使えれば）

これはカオスで知られるLorenzの微分方程式
わずかに初期値の異なる解が途中から別れていく様子が見て取れます

![lorenz.gif](https://qiita-image-store.s3.amazonaws.com/0/22001/c4244ab7-ab68-6ecf-d7fd-c086a35edd9b.gif)

https://editor.p5js.org/wittyfool/sketches/BkxbPwKoQ
「Introduction to Machine Learning with R」By Scott Burger。dockerで機械学習(74) with R (4)

# 1.すぐに利用したい方へ(as soon as)

「Introduction to Machine Learning with R」By Scott Burger


https://www.oreilly.co.jp/books/9784873118574/

 <この項は書きかけです。順次追記します。>


## docker
dockerを導入し、Windows, Macではdockerを起動しておいてください。
Windowsでは、BiosでIntel Virtualizationをenableにしないとdockerが起動しない場合があります。
また、セキュリティの警告などが出ることがあります。


## docker pull and run

```
$ docker pull kaizenjapan/r-scott

$ docker run -it kaizenjapan/r-scott /bin/bash
```

以下のshell sessionでは
(base) root@473fc1bb505d:/#は入力促進記号(comman prompt)です。実際には数字の部分が違うかもしれません。この行の#の右側を入力してください。
それ以外の行は出力です。出力にエラー、違いがあれば、コメント欄などでご連絡くださると幸いです。
それぞれの章のフォルダに移動します。

dockerの中と、dockerを起動したOSのシェルとが表示が似ている場合には、どちらで捜査しているか間違えることがあります。dockerの入力促進記号(comman prompt)に気をつけてください。

## ファイル共有または複写

dockerとdockerを起動したOSでは、ファイル共有をするか、ファイル複写するかして、生成したファイルをブラウザ等表示させてください。参考文献欄にやり方のURLを記載しています。

複写の場合は、dockerを起動したOS側コマンドを実行しました。お使いのdockerの番号で置き換えてください。複写したファイルをブラウザで表示し内容確認しました。


# docker hubへの登録
```
$ docker ps

$ docker commit       kaizenjapan/r-scott

$ docker push kaizenjapan/r-scott

```

#2. dockerを自力で構築する方へ

ここから下は、上記のpullしていただいたdockerをどういう方針で、どういう手順で作ったかを記録します。
上記のdockerを利用する上での参考資料です。本の続きを実行する上では必要ありません。
自力でdocker/anacondaを構築する場合の手順になります。
dockerfileを作る方法ではありません。ごめんなさい。
##docker

ubuntu, debianなどのLinuxを、linux, windows, mac osから共通に利用できる仕組み。
利用するOSの設定を変更せずに利用できるのがよい。
同じ仕様で、大量の人が利用することができる。
ソフトウェアの開発元が公式に対応しているものと、利用者が便利に仕立てたものの両方が利用可能である。今回は、公式に配布しているものを、自分で仕立てて、他の人にも利用できるようにする。

### docker pull

docker公式配布の利用は、URLからpullすることで実現する。


## apt

```shell-session
(base) root@473fc1bb505d:/# apt update

(base) root@473fc1bb505d:/# apt install -y procps

(base) root@473fc1bb505d:/# apt install -y vim

(base) root@473fc1bb505d:/# apt install -y apt-utils

(base) root@473fc1bb505d:/# apt install -y r-base

(base) root@473fc1bb505d:/# apt install -y r-cran-hmisc
```

# 参考文献(reference)
R ScriptやR Markdownからinstall.packages()を呼び出す場合はレポジトリを指定しないとエラーになる
https://qiita.com/maech/items/03b9566fb0fe940e1736

Rでtrying to use CRAN without setting a mirrorと言われたら
https://qiita.com/manabuishiirb/items/88fb9d5207e6802da4b7

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.10 初稿 20181014
ver. 0.11 番号変更、参考文献追記 20181029 
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
ESP-WROOM-02にEsp-Linkを導入する

[ブログ](https://moker-minecraft.blogspot.com/2018/10/esp-wroom-02esp-link.html)を書き写しました。ぜひ元の方もどうぞ。
# esp-linkシリーズ
セットアップ編：いまここ
使ってみる編：後で書く
# 注意
ESPのファームウェア書き換えは電波法に抵触する可能性も指摘されています。
以下全ての内容は自己責任でどうぞ。
# Esp-Linkについて
レポジトリ：[Github](https://github.com/jeelabs/esp-link)
次のようなことができるそうです。

- ESPのシリアルをwifi経由でいじる。
- Wifiを用いて、ESPのシリアル経由でAVRなどにプログラムを書き込む。
- HTTP経由でアップロードしたプログラムをESPに接続されたAVRに書き込む。
- 接続されたマイコンをインターネットへ接続させる。
- 接続されたマイコンをwifi経由で、操作するUIとなる。

今回は、ArduinoIDEで製作したスケッチをESP経由でArduinoへと書き込むのが最終目標です。

全体としては、ドキュメントもしっかりしている上に、バイナリも提供されていて初心者でも扱いやすいと思います。
ただ開発環境がオフィシャルの提供してるやつで、ArduinoIDEベースではないので、プログラムをいじろうとすると結構大変かもです。
# 書き込んでみる
基本的には[FLASHING.md](https://github.com/jeelabs/esp-link/blob/master/FLASHING.md)を読んでその通りに実行すればうまくいくと思います。
ファームウェアの書き換えができる方は[5.書き込み](#5書き込み)まで読み飛ばしてください。
## 検証環境
Windows10 x64
## 1.ダウンロード
[リリース](https://github.com/jeelabs/esp-link/releases)からバイナリをダウンロードします（[編集時最新の安定板](http://s3.voneicken.com/esp-link/esp-link-v3.0.14-g963ffbb.tgz)）。
ダウンロードするのは、source codeではなく、esp-link-v3.x.xx-xxxx.tgzみたいなやつです（ビルド面倒なので）。
編集時点ではトップに上がってるのはアルファリリースなので気を付けて確認してください。
## 2.展開
Windowsでtgzを扱う際に何が正攻法なのかは分かりませんが、僕は7zip使いました。
展開できればなんでもいいと思います。
## 3.ESPの接続
ESPをシリアル・アップロードモード(実行モードではなく)に設定したうえで、PCに接続します。詳しくは[https://ht-deko.com/arduino/esp-wroom-02.html](https://ht-deko.com/arduino/esp-wroom-02.html)
## 4.書き込みソフトの立ち上げ
ArduinoIDEにESPをインストールしている以上、どこかにesptool.pyがあると思うので、そちらを利用してもいいと思います。
今回は、GUIツールを公式からダウンロードしてきます。
公式HPの[ダウンロードページ](https://www.espressif.com/en/support/download/other-tools)から「Flash Download Tool」をダウンロードし、ダブルクリックで起動します。
メニュー画面からesp8266を選択し、書き込み画面を立ち上げます。
## 5.書き込み
[FLASHING.md](https://github.com/jeelabs/esp-link/blob/master/FLASHING.md)を参考にオプションを入力していきます。
ファイルと番地は次の通り。

- boot_v1.x.bin : 0x00000
- blank.bin : 0x3FE000
- esp_init_data_default.bin : 0x3FC000
- user1.bin : 0x01000

後はFlashsizeを自分のやつにして（僕は32mbit-c1としました）、STARTをクリック。
<img width="217" alt="flash-esp-link-blur.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/244929/08ba4453-8871-f40b-7fd1-8384797cfbff.png">
## 6.再起動
espを実行モードにして、再起動します。
WifiのAPとしてespが出てくるはずです（なぜか僕の場合は前回書きこんだWifiの設定がそのまま残っていてパスワードかかってました）。
APに接続して、ipconfigなどでAPのIPアドレスを調べ、そのアドレスをwebブラウザで開きます。
esp-linkという名前のページが立ち上がればオッケー。
#おわりに
使ってみた編をあとで書きます（今絶賛基板製作中です）。
具体的には、シリアルのやり取り、ArduinoIDEから書き込みなど。
[ブログ](https://moker-minecraft.blogspot.com/)の方もよろしくお願いします。
【はやわかり＋保存版】Google Colaboratoryチートシート

# TL;DR

- [【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory - Qiita](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)の内容がふくれあがってきた
    - 12,000字超ある。さすがに長い
- 一目で把握できるものが欲しい
- ちょっと作ってみた(beta)

# Google Colaboratoryチートシート
## おもて面

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64608/d08bc35e-f624-2397-0171-c393e64156b3.png)


## 裏面

- 時系列でのTips
    - 90min/ 12hrルールとその対応
    - 並行で複数ノートブックを立ち上げたときの動き
- をまとめるつもり

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64608/52d074a0-e3aa-62e6-0bb7-bc6bdf347d2a.png)
[Unity]AR(Vuforia)でオブジェクトがズレる問題の対処法

VuforiaでARマーカーを使ってAR表示させた場合に動きを伴うオブジェクトが徐々にずれていく場合の対処方法です。

#仮想世界の起点を設定する
AR上でのズレ問題はARCameraのインスペクターで『DeviceTracker』が選択されているのが原因です。ARマーカーの座標が常に動くため付随して他のオブジェクトの座標がずれます。
<img width="1384" alt="スクリーンショット 2018-10-21 21.34.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/259333/1b64cb80-29f8-71c6-0b58-14a5092ed357.png">
※Vuforia configurationの設定で『Device Tracker』にチェック→スマホで実機確認する場合にはPC場ではズレていても端末上ではキチンとトラッキングしていたりします。

###ARカメラの設定を変更
World Center Modeの設定をFirst_Target、またはSpecific_Targetに変更します。
<img width="754" alt="スクリーンショット 2018-10-21 21.33.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/259333/fac2b719-dcb9-28ab-d452-429a37dcfdd5.png">
ARマーカーが座標起点になり、オブジェクトの動きが安定します。
<img width="1383" alt="スクリーンショット 2018-10-21 21.32.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/259333/5bdb986d-77f7-4651-a258-52f781c4810b.png">


参考URL
>Unity＋Vuforiaで複数のマーカーを認識させる
>http://shiro-izu.hateblo.jp/entry/2016/03/02/144044
[android studio, Flask] エミュレータからlocalhostのAPIを実行するのに必要なこと

Kotlin coroutines + Retrofit 2 で APIを叩くのに当たって、エミュレータとWebサーバーの設定をしなければならなかったのでメモ
#1.ネットワーク・セキュリティの設定
##1. ネットワーク・セキュリティの設定を記述した xml を作る
以下の xml を app/res/xml に作成します。ここでは network_security_config.xml とします。
普段Web開発をしている方ですと、接続先のホスト名をlocalhost 又は 127.0.0.1 としてしまいそうですが、これだと接続でしません。
というのも、ローカルPCには、10.0.2.2　というIPが割り当てられているようです。なのでdomainは10.0.2.2と指定する必要があります。

```xml:app/res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">http://10.0.2.2</domain>
    </domain-config>
</network-security-config>
```
##2. network_security_config.xml を AndroidManifest.xml から読み込まれるようにする
applicationにandroid:networkSecurityConfig="@xml/network_security_config"を追加する

```xml:app/manifests/AndroidManifest.xml
<manifest>
    <application
        android:networkSecurityConfig="@xml/network_security_config"
    >
    </application>
</manifest>
```
#2. Webサーバー(Flask)のポートを変更する
Flaskはデフォルトでhttp://127.0.0.1:5000 にサーバーが立つのですが、エミュレータからは80番でアクセスされるため、ポート番号を変更する必要があります。
app.run()となっているところを下記のように変更しましょう！
###注意点
・ポートを80番に変更する際に、127.0.0.1から0.0.0.0に変更すること
・サーバーを起動する際に、管理者権限で起動すること

```python:server.py
if __name__ == '__main__':
    app.run(debug=False, host='0.0.0.0', port=80)
```

#3. 参考記事
https://qiita.com/notona/items/8faf62872a032b2d728d
http://blog.ceed.jp/?p=298
Google Earth EngineのPython APIを使おう - その１：Python実行環境をローカルに構築

# はじめに
Google Earth Engineにカスタムデータを200GBアップロードできると聞いたので、このくらいあれば実用的に使えるかな、と思って使ってみることにしました。自分はJavaScript使いではないので、WebのJaveScriptのIDEではなくローカルのPythonからEarth Engineを使いたいと思ったのですが、PythonからGoogle Earth Engineを操作する日本語情報がほとんどなかったので、自分メモを兼ねての覚え書きです。GoogleおすすめのDockerでもなく、あえて普通のPython環境を構築してみました。

# 実行環境
使った環境はAnaconda on macOS Mojaveです。パッケージマネージャーはconda 4.5.11でした。

# 仮想環境構築
https://developers.google.com/earth-engine/python_install_manual
を参考にPythonと必要なパッケージをインストールしていきます。公式情報では「Python 2.6 or 2.7を使え」って書いてありますが、あえてPython 3.7を使ってみます（今更Python 2系はなんだかなぁと思うので・・・）。とりあえずインストールまではうまくいったのですが、完全に互換性があるのかはわかりません（詳しい人教えてください）。不安な人は普通に2.6か2.7をインストールしてください。

まずは`conda`でEarth Engine用の環境（ここでは`ee`）を作りPython 3.7をインストールします。必要なパッケージを`conda`からインストールするには`conda-forge`レポジトリが必要なので、バイナリ互換性問題を避けるため、レポジトリには`conda-forge`を指定しておきます。

```shell
conda create -n ee python=3.7 -c conda-forge
```

インストールが終わったら環境をアクティブにします。

```shell
# Mac/Linuxなどの人
source activate ee

# Windowsの人
activate ee
```

# 必要なパッケージのインストール

次に必要なパッケージをインストールします。まずは`google-api-python-client`を。

```shell
conda install google-api-python-client -c conda-forge
```

インストール手順に従ってcryptが使用可能かをテストします。

```shell
python -c "from oauth2client import crypt"
```

とりあえず自分の環境では問題がなかったので次に`earthengine-api`をインストールします。

```shell
conda install earthengine-api -c conda-forge
```

# アクセス許可

インストールしたローカルのクライアントにEarth Engineへのアクセス許可を与えるため、認証を行います。ターミナルに以下のコマンドを打ち込むと、ブラウザで認証を要求されるのでGoogleアカウントでログインし、「許可」ボタンを押してアクセス許可を与えます。Google Earth Engineへの登録はもう済んでいると仮定しています。登録済みではない人は登録しましょう。

```shell
earthengine authenticate
```

ブラウザで許可ボタンを押すと画面にアクセスコードが表示されるので、コマンドを実行したターミナルにコードをコピペします。

# 確認

最後にインストールがうまくいったかを確認します。

```shell
python -c "import ee; ee.Initialize()"
```

インストールがうまくいっていれば、エラーメッセージが表示されず、コマンドが実行できるはずです。
【要約】Ten simple rules for scientists: Improving your writing productivity

自分用のメモです
原文：[Ten simple rules for scientists: Improving your writing productivity](https://journals.plos.org/ploscompbiol/article?id=10.1371%2Fjournal.pcbi.1006379&utm_campaign=piqcy&utm_medium=email&utm_source=Revue%20newsletter)

## Introduction
書き言葉によるコミュニケーションは科学者として成功するための喫緊の課題である.学位をもらうため,自分の発見を共有するため,資金を得るために書くことは必要不可欠であるからだ.しかし我々はしばしば締め切りが差し迫ってくるまで書くことを遅らせたり,自分の原稿を共有することをためらったりする.これは聞き手がピアレビューアー、財団や出版社だけだと勘違いしているから起こることで、我々は自分たちにとって最も重要な聞き手の存在を忘れている.そう,自分自身である.

自分自身に従事するための最も良い方法は書く週間を確立してしまうことである.いかに短い時間であれ,毎日書くことは科学者としての自分の思考と生産性を上げる.スコット・モントゴメリーが言ったように「明確な思考は明確な記述から生まれる」.多くの場合,書くことに酔って科学者は現実を理解し,自身の研究の示唆を得る.しかし書く習慣を確立することは骨の折れる行為でもある.以下にそのハードルの一部を記す.

1. 評価：「この原稿は糞だ」
2. ひらめき：「まだアイデアが浮かばないんだ」
3. モチベーション：「今はやりたくないんだよね」
4. 最適化：「この文を完璧にしなければならない」
5. 怠慢：「明日からやろう」
6. 分離：「書くためには時間と静かな環境が必要だ」
7. 誘惑：「研究室が汚いので綺麗にしよう」

そこで,我々はあなたの執筆生産性をあげるための10の簡単なルールを提示することにする.

## ルール１：書く時間を決める
他の予定と衝突しなさそうな時間を15分とか30分だけで良いので選ぼう.例えば「平日の8時半から9時半」のように.その時間は書くためのもので,他になにもしてはいけない.
決めたらメモ帳に書いていつも見えるところに貼っておこう.カレンダーのリマインダー機能を使っても良い.

## ルール2：作業に集中できる環境を作る
落ち着いて外乱なく書くことに集中できそうな場所はあるだろうか？　カフェがそうだという人もいれば機内や図書館がそうだという人もいるだろう.
そして一度場所を決めたなら外乱を制御する術を身につけなければならない.メールを書いたりするような小さな作業であっても,それらは執筆を遅らせるだけである.それでも連絡してくる人に対しては「この時間は執筆することにしているので、終わったら折り返します」と言おう.場合に酔ってはインターネットを遮断するのも良い.

## ルール３：早く書いて後で編集する
書いている途中で筆が泊まってしまったら,最初の５分間で思いついたことを何でも書いてみよう.完璧にする必要はない.編集や推敲のプロセスが後に入るからである.

## ルール４：書く習慣をつけるためのトリガーを決める
書く習慣を確かなものにするために生活の中に「トリガー」を決めよう。例えば書く前には必ず散歩するとか好きな紅茶を淹れるとか、毎週のミーティングの後に書くとか、作業に差し障りのない音楽を聴くとか。毎朝の歯磨きと同じように、習慣が確立してしまえばあなたは書きたいと思う前にもう書いている。

## ルール５：職務を全うしよう
どのようにしたら自分が書く習慣を続けられるだろうか？　書き終えたら好きな本を読むとかコーヒーを2杯飲むとかの報酬を設定するのも良い。もしくは一緒に取り組む友人を見つけることだ。作業を始めたら「今からやるよ」と連絡して終わったらまた連絡する。簡単なコミュニケーションも習慣を持続させるには十分である。

## ルール６：フィードバックを求めてほしいものを聞こう
草稿を見せてフィードバックをもらうことは怖いことだが、原稿を洗練させるためには不可欠なプロセスである.アドバイスは同じ大学院生やポスドク、その他の共同研究者、メンターなど分野を問わず誰にでも求めることができるし、そうすべきだ.その際は今自分が聞きたいことは何かをはっきりさせてから訊くようにしよう.読み手にもアドバイスに優先順位を決めさせてその中の上位３つを教えてもらうようにすれば,このプロセスが単なる文法チェックに陥るのを避けられる.

## ルール７：決められた時間外にも自分が書いているものについて考えよう
日常の雑用をしている途中に重要な考えが浮かぶということはままある.したがって書いている時間の他に自分の研究について考える時間を持つことは効果的な執筆にとって重要である.それはなにより書くことのモチベーションにつながる.

## ルール８：とにかく練習
他のすべての技術と同様に練習することによってあなたの執筆能力は高くなる.新しいアプローチを学ぶことも重要だ.おすすめはスタンフォードの[Writing in the Sciences](https://lagunita.stanford.edu/courses/course-v1:Medicine+SciWrite+Ongoing/about)と,少し昔の本だが[Element of Style](http://www.jlakes.org/ch/web/The-elements-of-style.pdf)である.自分の分野の著名な論文を読んで著者の効果的な表現を学ぶことも役に立つ.

## ルール９：頭の中のひとりごとを制御する
ネガティブな考え事は執筆活動には有害である.「やることがありすぎて時間がない」なんて思わずに「今日一時間書いて進捗を生む」というようなポジティブな考えを発しよう.塵も積もれば山となるということを自分に言いきかせることだ.

## ルール１０：自分の習慣を再評価する
自分の執筆習慣を記録してどのくらい達成できたかを頻繁に振り返ろう.何日かできなかった日があっても落ち込まないことだ.みんな習慣を守れる日もあれば守れない日もある.そして不十分だと感じたなら書くための障壁とモチベーションを上げるメッセージを読もう.書く生産性を保つ方法は,書き続けることしかありえないのだから.
[Unity]Unity,Blenderでオリジナルコンテンツを作りたい場合の入門書紹介

Unityでコンテンツ制作・モデルをコントロール、Blenderで3DCGモデリングを検討している方向けの入門書を挙げてみました。
#Unity
[『Unityの教科書』](https://www.amazon.co.jp/Unity%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-Unity-2018%E5%AE%8C%E5%85%A8%E5%AF%BE%E5%BF%9C%E7%89%88-3D%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%A0%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-Entertainment/dp/4797397659/ref=sr_1_1?s=books&ie=UTF8&qid=1540099550&sr=1-1&refinements=p_27%3A%E5%8C%97%E6%9D%91+%E6%84%9B%E5%AE%9F)
猫本(Vue.jsの猫本とは別)。
1通りやればUnityでの仕組みがわかります。簡単なゲームであればこの本で十分です。
また著者の北村愛実さんの技術ブログは非常に参考になります。
http://nn-hokuson.hatenablog.com/

### (補足)Unityのバージョン
私はUnity 2017.4.9を使用しています。
現在、Unity LTS版(Long Term Support)でUnity 2018は無いようです(2018.10.27記載)。
[LTS版確認ページへ](https://unity3d.com/jp/unity/qa/lts-releases)
ただし、Unityの教科書は2018年版を購入したとしてもUnity 2017で動かす上で充分参考になります。

#Blender
Blenderは機能が多岐に渡るため技術書1冊では入門書と言えどさわりの部分はカバーできません。Blenderで使える機能毎に技術書を挙げてみました。

### モデリング入門
[『Blender CGイラストテクニック』](https://www.amazon.co.jp/%E7%84%A1%E6%96%99%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BBlender-CG%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-3DCG%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9%E3%81%A8%E3%81%97%E3%81%8F%E3%81%BF%E3%81%8C%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E3%82%8F%E3%81%8B%E3%82%8B-%E5%A4%A7%E6%BE%A4-%E9%BE%8D%E4%B8%80/dp/4774182788/ref=sr_1_7?s=books&ie=UTF8&qid=1540099664&sr=1-7&keywords=blender)
前半でのモデリング部分を参考にするだけでも動物くらいのモデリングはできるようになります。

### アニメーションを作りたい(キャラクターを動かしたい)
[『ブレンダーからはじめよう!』](https://www.amazon.co.jp/%E7%84%A1%E6%96%99%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B3D%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%83%96%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86-%E5%8E%9F%E7%94%B0-%E5%A4%A7%E8%BC%94/dp/4774151513/ref=pd_lpo_sbs_14_img_2?_encoding=UTF8&psc=1&refRID=FK3W6J8RQ7FNBCXE2B9D)
アニメーション制作の参考になりました。
前半にモデリングの解説はありますが上に挙げた「Blender CGイラストテクニック」の方が参考になります。

### ボーン(リグ)を入れる参考(キャラクターを動かしたい)
[『MikuMikuDance キャラクターモデルメイキング講座』](https://www.amazon.co.jp/dp/B00V9M5SA0/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
ボーン(別名:リグ、アーマチュア)を入れる細かな参考になります。MMDを謳っていますが中身はBlenderの本です。大まかな作業は「ブレンダーからはじめよう！」でできますがモデルを動かした場合に生じるひしゃげ、シワなどコントロールするためウェイトを自分で設定する場合に参考になります。

---
Unityのみで簡単なコンテンツを作りたいというのであれば「Unityの教科書」をやって３Dデータはアセットストアやフリー素材などを流用すれば作ることが出来ます。
ただ自分でモデリングしたモノ動かすのは楽しいので是非Blenderや他の3DCGツール(Maya,Cinema4D等)を使ってみてください。
[Unity]BlenderからUnityへfbxデータをインポートする時の注意点

Blenderで作成した3DCGデータをUnityへインポートした場合に直面しそうな問題点を以下に挙げました。
1. Blender：正常に見えているモデル→Unity：崩れている
2. Blender：色を指定している→Unity：真っ白になっている
3. Blender：アニメーションを作る→Unity:サイズ感がおかしい

#1.モデルが崩れる場合
Blenderでエクスポート(.fbx)してUnityへインポートするとモデルが崩れている場合があります。
上記の場合はBlender側の法線をチェック
Blenderで「編集モード」→[ツール]シェルフ(画面左側)のシェーディング/UV内：法線『再計算』をクリックすればUnityでもモデルが崩れなくなります(法線設定の画面位置は画像２枚目を参照)。
![比較.jpg](https://qiita-image-store.s3.amazonaws.com/0/259333/3d3233c3-64c4-9817-a1af-9f172fe52e3f.jpeg)

#2.色が真っ白になってしまう場合
BlenderでMeshの色を指定→Unityへインポートするとモデルが真っ白になっています。
fbxモデルではBlenderの色指定が含まれないそうです。
UV設定でテクスチャを貼るかUnity側でMaterialを付ければ(単色になりますが)解決します。
<img width="1440" alt="スクリーンショット 2018-10-21 22.12.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/259333/1e82f08b-b3e5-f0dc-bcff-572625ea7c97.png">
↓UVでテクスチャを作成し、UnityではMaterialで作成したUVデータを指定
<img width="1148" alt="スクリーンショット 2018-10-21 22.22.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/259333/9205a187-9704-f8d9-a83a-c9e5f10d163a.png">


#3.アニメーションのサイズがおかしい場合
Blenderで作成したアニメーションをUnityで再生するとサイズがおかしくて急に顔が大きくなった！みたいな現象が発生します。これはBlenderでのエクスポートの設定を修正すれば直ります。
Blenderエクスポート時の設定で『すべてFBX』を選択し、エクスポート。
これで正常にアニメーションを再生することが出来ます。
<img width="232" alt="スクリーンショット 2018-10-21 22.25.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/259333/772b063f-8b4d-8549-93da-22587f4a7dc1.png">
↑Blenderをfbxでエクスポートする時の設定画面

---
参考URL
>Blenderで作成した3DモデルをUnityに取り込む その１
>http://bluebirdofoz.hatenablog.com/entry/2017/07/29/185937
Vue環境でJestを採用してみた

# Vueって？
webフロントエンドのMVCフレームワークです。
公式ドキュメントで「はじめに見るページ」がこちらに用意されていますので、知らないよって方は見てみてね。

Vue公式ドキュメント：はじめに
https://jp.vuejs.org/v2/guide/index.html

Vueの制作者エヴァンさん
https://github.com/yyx990803
（※以前はmeteorも開発されていたらしい！meteorって日本では活発じゃないですね。フロントエンドから離れるのでここら辺で・・）



# Vueって何がいいの？

でもさ、フロントエンドフレームワークって沢山あるよね？有名なものだと、React、Angularだけど、そこら辺の比較がご丁寧にVueの公式で丁寧に書かれているよ。ちなみに私は前職までAngular使いでした。そこら辺の違いも書きたいけど、今日はJestについてだけかくね。（**この記事にいいねが多かったら気力で書けるかもしれない**）

Vue公式ドキュメント：他のフレームワークとの比較
https://jp.vuejs.org/v2/guide/comparison.html



# Jestって？

Facebookが開発している、webフロントエンド上で動くプログラム（JavaScriptやTypeScript）ユニットテスト用のテストフレームワークです。
シェル上でテスト結果を見る事が出来ます。



公式ドキュメント（日本語）：https://jestjs.io/ja/


# どうやって使うの？

Jest単体で入れる場合はこちら参照ください。
https://jestjs.io/docs/ja/getting-started.html

私はVue-CLIを使っているので、ユニットテストフレームワークはVue-CLIをインストールする際に設定しました。

設定方法は、Vue-CLIインストール時に「ユニットテストは何にする？」と聞かれるので、Jestを選びます。それだけ。
Pick a test runnerって所ですね。

<img width="306" alt="20171207215853.png" src="https://qiita-image-store.s3.amazonaws.com/0/28662/7ccb3856-8215-c97d-1c16-7cbc39fa6019.png">
※このスクリーンショットは個人アプリの初期設定をした際に撮ったものです。半年前なのでスタイルが変わっているやもしれません。

Vue-CLI：https://cli.vuejs.org/



#Jestを選んだ理由

以前Jasmineを使っていたのですが、書き方が似ていて入りやすそうだなって思ったから。
Jasmine：https://jasmine.github.io/

互換性もあるのでこれまで作ったアプリの移行も容易にできるとの事です。
https://jestjs.io/docs/ja/migration-guide


# 良い所
まだ書き始めてから間もないので多くを語れないですが・・

- カバレッジがとってもわかりやすい。しかも行数まで出る。これらの行の処理に対してテストが書かれていないと指摘されるのです。笑
- モック関数もJasmineに似ていて使いやすい。
（mockの使い安さはAPI通信が入る機能テストをする際、重要だと思うので。事前準備の簡易さという意味合いで。）
https://jestjs.io/docs/ja/mock-functions


Uncovered Line に行数が表示されます。基本的に業務ではアプリ全体＆個別で80％を超えればOKだと思っています。
![feature-coverage.png](https://qiita-image-store.s3.amazonaws.com/0/28662/54d672bd-ee7c-74a1-1f17-2d881298a44c.png)

画像引用元：https://jestjs.io/

# 悪い所
今のところみつかりません。
Jasmineの時はテスト時間が長くてイラっとしていたのですが、まだ多くのテストを書いていませんので、今後開発しながら様子を見ていこうと思います。




# 導入を迷っている方へ
公式ドキュメントも日本語対応＆充実しているので、個人的には安心出来るフレームワークだと思ってるのでおすすめです。特にjasmineとかmochaとか使っていた人はスラスラと書けるはず。違いが分からないくらい（言い過ぎ）ヽ(^o^)丿
muttを設定して使う！！ [WIP]

メモ記事みたいなものなので、すっ飛ばしてるとこもありますが悪しからず...
後にしっかり書き直すかもしれません。
正直 [archlinuxの記事](https://wiki.archlinux.jp/index.php/Mutt)がすごくまとまってるのでどうぞ

---

# muttとは

> Mutt は強力な機能を持っていることで知られているテキストベースのメールクライアントです。
> 20年以上前に作られたメールクライアントでありながら、Mutt は今でも多くのパワーユーザーから愛用されています。
> 
> Mutt は主にメールユーザエージェント (MUA) として開発されており、最初はメールを読むために書かれました。
> 他のメールアプリケーションと比べて後の実装 (メールの取得・送信・フィルタリングの追加) はシンプルとなっており、ユーザーは外部のアプリケーションを使って Mutt の機能を拡張できます。
>
> 引用: https://wiki.archlinux.jp/index.php/Mutt

CLIerにとっては絶好のクライアントですね。
TwitterもQiitaもmailもCLIからできる... ~~これでw3mとかがJS/CSS対応すればいうことないんだけど~~

# muttの設定

muttでは、設定ファイルは`~/.muttrc`と`~/.mutt/muttrc`に書けるようです。

## Gmailの設定をする

Gmailユーザーなので、Gmailの設定をします。
今回はIMAPで取得しようと思います(ただ単にこっちの例が先に出てきたため)

### 1. メアド/パスワード設定

メアドとパスワードを設定します。

```muttrc
set imap_user=<yourname>@gmail.com
set imap_pass=<password>
```

*Gmailの場合のみ@以下も書かなくてはいけない模様*なので注意。
パスワードを平文で書きたくない場合、外部ファイルに書いて読み込むという手段があります

```bash
$ cat muttrc.pri
set imap_pass=<password>

$ cat .muttrc
source .muttrc.pri
set imap_user=<yourname>@gmail.com
```

ちなみに、この状態だと`.muttrc.pri`は平文ですが、GnuPGを使うことで暗号化させることができます
これに関しては試してないので、[archのwikiを参照してください](https://wiki.archlinux.jp/index.php/Mutt)

### 2. IMAPで見にいくフォルダを指定する

あまり理解してないです。
が、とりあえずIMAPプロトコルでメールを取りに行く先なのだと思う...

```muttrc
set folder=imap[s]://imap.server.domain[:port]/[folder/]
```

ちなみにGmailだとこんな感じ

```muttrc
set folder=imaps://<yourname>@imap.gmail.com:993
```

詳しくは[gmail/IMAP設定](https://support.google.com/mail/answer/7126229?hl=ja)


### 3. spoolfileの設定

archのwikiではなぜか英語...

意訳すると

> spoolfileは、フィルタリングを通ってきたメールが入ってるフォルダです。殆どのeメールサービスはINBOXと呼んでいます。
> '='もしくは'+'を、上記で設定された`folder`への完全パスとして使うことができます。

あまりわかってないのですがとりあえずINBOXを指定しています。後にしっかり調べる

```muttrc
set spoolfile=+INBOX
```

### 4. mailboxes

> Any imap folders that should be checked regularly for new mail should be listed here

新着メールが来ているかどうかを確かめるためにアクセスするフォルダのようです。
現在`=INBOX`しか、メール保存先として設定されたフォルダがないのでこれを読みに行かせます

```muttrc
mailboxes =INBOX
# 以下と同じ
mailboxes imaps://<yourname>@imap.gmail.com:993/INBOX
```

取り急ぎ、これで受信はできるはずです。

### 5. 送信の設定

SMTPで送信するので、設定をします。

[outlook/IMAP, SMTP設定](https://support.office.com/ja-jp/article/outlook-com-%E3%81%AE-pop%E3%80%81imap%E3%80%81%E3%81%8A%E3%82%88%E3%81%B3-smtp-%E3%81%AE%E8%A8%AD%E5%AE%9A-d088b986-291d-42b8-9564-9c414e2aa040#bkmk_beta)
RailsチュートリアルBitbucket 1.4.3でうまくいかない人へ

脱SIer本を読んで始めたRailsチュートリアルですが、最初の１章で早速つまりました。
意外と苦戦してしまったので、後発組が同じ轍を踏まずに済むようにつまりポイントを公開します。

なお、Railsチュートリアルで推奨している通り、AWSのCloud9をIDEとして使用している前提となります。

#公開鍵の作成
RailsチュートリアルでAWSのCloud9を始めたよ！という場合、サーバには公開鍵が存在していません。
チュートリアル内で紹介されているサイトやBitbucketの「SSH キーの生成方法について（ https://confluence.atlassian.com/bitbucket/set-up-an-ssh-key-728138079.html ）」に記載されている方法だけではうまくいきませんでした。

自分が実施した内容は以下の通りです。

```shell:
$ # SSH鍵の作成
$ ssh-keygen
$ # 最初の入力：/home/ec2-user/.ssh/id_rsa
$ # 2回目、3回目はEnterのみ
$ 
$ # 権限の設定
$ chmod 600 /home/ec2-user/.ssh/id_rsa
$ # SSH-Agentの起動
$ eval `ssh-agent` 
$ # 秘密鍵の登録
$ ssh-add ~/.ssh/id_rsa
$ # 登録の確認
$ ssh-add -l
```

これで鍵の作成は完了です。
鍵の登録はチュートリアルにある通りで問題ないです。

#リポジトリの作成
Railsチュートリアルでは「リポジトリの作成」を選んでバンバンすすめればいいよ！と書かれていますが、リポジトリの作成を選ぶ前に注意すべき点があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291428/414a4386-79cb-fcb8-54d9-c3d240891e07.png)

「READMEを含めますか？」のところを、デフォルトのまま作成してしまうといくらREADMEを消しても、チュートリアルにあるようなgitコマンドは表示されませんでした。
ここで「No」を選択すると「リポジトリの作成」を選ぶだけでお望みの画面にたどり着けます。

えーじゃあ作ったリポジトリはどうしたらいいの？という場合は
リポジトリの「設定」＞リポジトリの詳細画面下部にある「リポジトリの削除」＞「削除」でリポジトリが消せるので、新しく作り直せば大丈夫です。


#参考
- https://qiita.com/isaoshimizu/items/84ac5a0b1d42b9d355cf
- https://qiita.com/hikaru-light/items/be46dfab4e52ee55a134
Python スクレイピング/クローリングリファレンス

スクレイピング/クローリングする際によく利用するAPIのリファレンスです。

# スクレイピング基本動作

```python
# htmlパース用のオブジェクト作成
soup = BeautifulSoup(html, "html.parser")

# HTMLの中からAタグをすべて取得する(存在しなければNoneが返る)
soup.find_all("a")

# HTMLの中から1番目のAタグを取得する
soup.find("a")

# 条件を付けて取得
soup.find_all("a", class_="link", href="/link")
soup.find_all(class_="link", href="/link")

# テーブルを取得
table = soap.find_All("table",{"class":"tablesorter"})[0]

# URLから取
soup.find_all(href="http://zombie-hunting-club.com"))
```

# 正規表現を使ってタグ指定

``` python
import re

# BタグやBODYタグなどbで始まるタグをすべて取得
soup.find_all(re.compile("^b"))

# ”link”を含むhref属性を持っているタグをすべて取得するには
soup.find_all(href=re.compile("link"))

# タグの中の文字列に"hello"を含むAタグをすべて取得するには
soup.find_all("a", text=re.compile("hello"))
```

# 出力

prettifyを呼び出すことできれいに整形して文字列として出力が出来ます。

# その他関数

```
find_all_previous() と find_previous()

find_next_siblings() と find_next_sibling()

ind_previous_siblings() と find_previous_sibling()

find_parent() と find_parents()
```

# XPathについて

XPathはXML文章中の要素、属性値などを指定するための言語です。
XPathではXML文章をツリーとして捉えることで、要素や属性の位置を指定することができます。
HTMLもXMLの一種とみなすことができるため、XPathを使ってHTML文章中の要素を指定することができます。
VirtualBox で IE の仮想環境を構築する

VirtualBox で IE の仮想環境を構築する方法です。
自分の備忘録として記録します。

## やること
- [VirtualBox をインストールする](https://www.virtualbox.org/wiki/Downloads)
- [仮想マシン（旧 modern.IE）をダウンロードする](https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/)

## 参考
- [Mac+VirtualBox+仮想マシン（旧modern.IE）でIEとEdgeの確認を行う方法 - 情報系大学院生のWebメモ](http://webmem.hatenablog.com/entry/how-to-check-Microsoft-Edge-and-versions-of-IE6-throuth-IE11-using-VirtualBox-and-Windows-Virtual-Machines-on-Mac)
- [MacにVirtualBoxをインストールしてみた - VirtualBoxの使い方](https://pc-karuma.net/mac-virtualbox-install/)
[VirtualBox の使い方と設定 - PC設定のカルマ](https://pc-karuma.net/virtualbox/)
- [共有フォルダを設定してMac OS XとVirtualBoxのWindows間でファイル転送する方法 / Inforati](http://inforati.jp/apple/mac-tips-techniques/windows-hints/how-to-set-up-shared-folder-of-virtualbox-in-mac.html)
AtCoder の旧URLからbetaのURLに切り替えるブックマークレットを作った

便利リンク集の[AtCoder Scores](https://atcoder-scores.herokuapp.com/index.html)の問題リンクが旧URLで
betaの機能を使いたかったので。

愚直にURLを書き換えてるだけですが、、

```
javascript: (function () {
  var url = location.href;
  if (url.indexOf("contest.atcoder.jp") === -1) {
    return false;
  }
  var oldhost = location.host;
  var contest = oldhost.split('.')[0];
  var beta = `beta.atcoder.jp/contests/${contest}`;
  location.href = url.replace(oldhost, betahost);
})()
```
Item 25:Limit source files to a single top-level class

# 25.1ファイルあたり1つのトップレベルクラスに制限せよ

1ファイルに複数のトップレベルクラスを定義することは可能だが、メリットは何もなく、リスクは存在する。

## 1ファイルに複数のトップレベルクラスを定義することの問題点

リスクとは、1つのクラス定義を複数してしまうというものである。複数定義されたうちのどれが使われるかは、ソースファイルがコンパイラーに渡された順に影響を受ける。
以下のような、2つのトップレベルクラスを参照するMainクラスを考える。

```java
public class Main {
    public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert.NAME);
    }
}
```

Utensil.java という1つのファイルの中にUtensilクラスとDessertクラスを作る。

```java
class Utensil {
    static final String NAME = "pan";
}

class Dessert {
    static final String NAME = "cake";
}
```
この時Mainを実行すると、pancakeと表示が出る。

ここで、Dessert.java に以下のようなクラスを定義したとする。

```java
class Utensil {
    static final String NAME = "pot";
}

class Dessert {
    static final String NAME = "pie";
}
```

ここで、javac Main.java Dessert.java というコマンドでコンパイルを実行した場合、コンパイルは失敗し、UtensilとDessertというクラスが重複していることを教えてくれる。
この時、コンパイラはMain.javaをまず見に行き、Utensilへの参照を見たときに、Utensil.javaを見に行き、UtensilとDessertクラスを見つける。コンパイラーがDessert.javaを見に行くときには、再びUtensilとDessertの定義を見つける。
もし、javac Main.java または、javac Main.java Utensil.javaとした場合には、Dessert.javaを書く前と同様の結果（pancake表示）になる。
しかし、javac Dessert.java Main.javaとした場合には、potpieと表示される。

このように、プログラムの挙動はコンパイルされる順番に影響されてしまうようになる。

## 解決法
解決策としては、シンプルに1つのソースファイルには1つのトップレベルクラスしか定義しないようにすることである。

もしくは、staticなメンバクラス（Item24）として定義してやる。
そのクラスが他の1つのクラスへの補助的な役割をするものであるなら、staticなメンバークラスにすることによって、可読性が向上し、無駄なアクセスを抑制することができる（staticメンバクラスをprivateにする）。
以下がその具体例である。

```java
public class TestStaticMember {

    public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert.NAME);
    }

    private static class Utensil {
        static final String NAME = "pan";
    }

    private static class Dessert {
        static final String NAME = "cake";
    }
}
```
Raspbianの初期設定

# Raspbianの初期設定

ラズビアンインストール後の初期設定および軽量化がいつも分からなくなるので、備忘録。

* Raspbian 9.4 (stretch) Lite
* Raspberry Pi 3B

## ログイン
初起動時、最初にログインをしなければなりません。ユーザ名とパスワードはデフォルトで以下のようになっています。

```bash
raspberrypi login: pi
Password: raspberry
```

## 初期設定

### SSH接続の有効化  

キーボードやHDMIを接続して作業するのは、面倒なのでとりあえずこれを最優先。  

#### IPアドレスを固定化

```bash
$ sudo vim /etc/network/interfaces
# ファイルの一番下に追加
auto eth0
iface eth0 inet static
  address xxx.xxx.xxx.xxx
  netmask xxx.xxx.xxx.xxx
  gateway xxx.xxx.xxx.xxx
  dns-nameservers xxx.xxx.xxx.xxx
```

1行目から  
起動時にeth0を自動起動  
eth0の設定を静的に設定  
IPアドレス、サブネットマスク、デフォルトゲートウェイ、DNSサーバを設定  
基本的にデフォルトゲートウェイとネームサーバは同じIPアドレスなはず

#### raspbian側のSSHを有効化

```bash
# 初期設定画面を表示
$ sudo raspi-config
```

設定画面表示後以下の手順で設定

1. 5 Interfacing Options
2. P2 SSH
3. YES

#### rootでSSH接続できなくする

/etc/ssh/sshd_config内の一番下に以下を書く。

```bash
PermitRootLogin no
```

#### SSH再起動

```bash
sudo systemctl restart sshd
```

### 地域設定

言語・タイムゾーン・キーボードの設定を行う。

```bash
# 初期設定画面を表示
$ sudo raspi-config
```

#### 言語設定

1. 4 Localisation Options
2. I1 Change Locale
3. ja_JP.UTF-8 UTF-8(スペースで選択)
4. ja_JP.UTF-8

#### タイムゾーン設定

1. 4 Localisation Options
2. I2 Change Timezone
3. Asia
4. Tokyo

#### キーボード設定

1. 4 Localisation Locale
2. I3 Change Keyboard Layout
3. Generic 105-Key(Intel) PC
4. Other
5. Japanese
6. Japanese - Japanese(OADG 109A)
7. The default for the keyboard layout
8. No compose key

### VRAMの容量を変更

お好みで変更

```bash
# 初期設定画面を表示
$ sudo raspi-config
```

1. 7 Advanced Options
2. A3 Memory Split
3. 16,32,64,128,256から好きな数字を入力

### ファームウェアの更新

```bash
# ファームウェアのアップデート->再起動
$ sudo rpi-update
$ sudo reboot
```

### piユーザの名前変更

参考:[ユーザ名変更の個人的に「正しい」と思うやり方](https://jyn.jp/raspberrypi-username-change/)  
piユーザが作成したファイルがあった場合、piユーザを削除するとroot以外それを触ることができなくなるため、削除しないほうがいいらしい。

```bash
# 仮のユーザ(tmp)を作成
$ sudo useradd -M tmp
# tmpユーザをsudoグループに追加
$ sudo gpasswd -a tmp sudo
# tmpユーザのパスワードを設定
$ sudo passwd tmp
# ログアウト
$ exit

# tmpユーザでログイン
# usermod -lでユーザ名をpiからnewpi(任意)に変更
$ sudo usermod -l newpi pi
# usermod -dでホームディレクトリを/home/piから/home/newpiに変更
$ sudo usermod -d /home/newpi -m newpi
# groupmod -nでpiグループをnewpiに変更
$ sudo groupmod -n newpi pi
# ログアウト
$ exit

# 最後にパスワードを変更
# 仮ユーザを削除
$ sudo userdel tmp
# newpiユーザのパスワードを変更
$ sudo passwd newpi
```

### スワップ無効化

スワップファイルを作りたくない人はどうぞ

```bash
# スワップファイルを削除
$ sudo swapoff --all
# スワップを無効化
$ sudo systemctl disable  dphys-swapfile
```

## 軽量化

参考:[Raspbian Jessie Lite その他 設定](https://azriton.github.io/2017/03/19/Raspbian-Jessie-Lite%E3%81%9D%E3%81%AE%E4%BB%96%E8%A8%AD%E5%AE%9A/)  
  
必要のないパッケージを削除したり、デーモンを停止することで動作を軽くする。

### 不要なパッケージの削除

```bash
# 入っているパッケージ一覧を表示
$ dpkg -l
```

削除できそうなもの

* triggerhappy (ショートカットキー割り当て)
* alsa-utils (alsaはAdvanced Linux Sound Architectureの略　音楽関係のやつ)  
  (追記：削除するとraspi-configが削除される？)
* avahi-daemon (使用しているラズパイをホスト名で検索可能にする的な)

```bash
# パッケージの削除
$ sudo apt purge -y --auto-remove [パッケージ名]
```

### 不要なデーモンの停止

```bash
# 動いているデーモン一覧を表示
$ systemctl | grep running
```

パッケージは削除したくないけど、軽くしたい場合はデーモンを止めるのも有り

```bash
# デーモンの停止
$ sudo systemctl disable [停止するデーモン]
```
UNIXコマンドの使い方！

#フォルダ操作
・フォルダ作成　→ mkdir
・ホームディレクトリに移動　→ cd
・ひとつ上のディレクトリに移動　→ cd -

```
[vagrant@localhost ~]$ mkdir lessons
[vagrant@localhost ~]$ cd lessons
[vagrant@localhost lessons]$ cd
[vagrant@localhost ~]$ 
```

#ファイル操作
・ファイルの中身を見る　→ cat
・ファイルをコピー（現在のファイルはドット（.）で表現できる）→ cp

```
[vagrant@localhost lessons]$ cat hello.txt
[vagrant@localhost lessons]$ cp hello.txt .
```

#コマンド履歴の活用
・履歴一覧表示　→ history
・履歴にあるコマンドを使用　→ ! + 履歴番号
・直前のコマンド使用　→ !!

```
[vagrant@localhost ~]$ history
[vagrant@localhost ~]$ !551
[vagrant@localhost ~]$ !!
```

#シンボリックリンク
・シンボリックリンク（よくアクセスするようになったものに別名をつけること）
　→ ln -s  パス　シンボリックリンク名

・シンボリックリンクの消し方　→ unlink シンボリックリンク名

```
[vagrant@localhost myapp]$ ln -s config/production/database/ dbconfig

[vagrant@localhost myapp]$ unlink dbconfig
```

#管理者ユーザー
・管理者ユーザーにログイン　→ su -
・特定のコマンドのみを管理者ユーザーとして実行　→ sudo

※rootユーザー（管理者）になって作業すると、重大なミスを犯してしまう可能性があるので、基本的にはsudoを使って作業するようにしましょう。

```
[vagrant@localhost lessons]$ su -
[root@localhost ~]#
[root@localhost ~]# exit
[vagrant@localhost lessons]$ sudo 特定のコマンド
```


#便利機能
・tabキー　→ 補完
・コマンドキャンセル　→ Control + C
・コマンド履歴　→ 矢印の上下