OmniAICreator/Qiita-1.07M huggingface dataset:
background-image よく使うパターンをメモ

#目的
background-imageで、よく使うパターンをメモ

##sample01
<img width="614" alt="スクリーンショット 2018-04-28 0.25.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/46ad494b-808d-2886-e6ed-ac2912e377ba.png">


```slim:slim
  .pra
    h1 NIKE NIKE NIKE
```

```scss:sass
h1 {
  border-bottom: 1px solid black;
  background-repeat: no-repeat;
  background-size: contain;
  background-image: image-url("lego.jpg");
  background-position: right bottom;
}
```

##sample02
<img width="615" alt="スクリーンショット 2018-04-28 0.25.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/6660795c-9411-73de-883a-bb2f07c2a99f.png">



```slim:slim
  .pra
    h2 NIKE NIKE NIKE
```

```scss:sass
h2 {
  text-align: center;
  border-bottom: 1px solid black;
  background-repeat: no-repeat;
  background-size: contain;
  background-image:
    image-url('lego.jpg'),
    image-url('lego.jpg');
  background-position:
    left bottom,
    right bottom;
}
```

##sample03
<img width="562" alt="スクリーンショット 2018-04-28 0.25.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/dff6f7af-68ac-ec45-6c85-35f9a85de39f.png">



```slim:slim
  .pra
    .contain
      h3 NIKE NIKE NIKE NIKE NIKE NIKE
      p
        | Just Do It Just Do It Just Do It Just Do It Just Do It Just Do It
        br
        | Just Do It Just Do It Just Do It Just Do It Just Do It Just Do It
        br
        | Just Do It Just Do It Just Do It Just Do It Just Do It Just Do It
        br
        | Just Do It Just Do It Just Do It Just Do It Just Do It Just Do It
        br
        | Just Do It Just Do It Just Do It Just Do It Just Do It Just Do It
        br
        | Just Do It Just Do It Just Do It Just Do It Just Do It Just Do It
        br
        | Just Do It Just Do It Just Do It Just Do It Just Do It Just Do It
        br
        | Just Do It Just Do It Just Do It Just Do It Just Do It Just Do It
        br
        | Just Do It Just Do It Just Do It Just Do It Just Do It Just Do It
```

```scss:sass
.contain {
  background-image: image-url('lego.jpg');
  background-position: left top;
  background-repeat: no-repeat;
  background-size: 40px;
  padding-left: 60px;
  h3 {
    padding-bottom: 10px;
    width: 150px;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
  p {
    color: blue;
  }
}

```
スポーツ等の競技に向けて作っているWebサービス

#初めに
@aocory さんの保育園落ちたアラフォーがプログラミングを学び、2か月でWebサービスを作った話
を見て、自分も何に取り組んだ上でQiitaに投稿しているのかを表明しようと思いました。この場を借りてお礼申し上げます

#自己紹介
はじめまして、piyoonと申します。
20年ゲーム制作を生業としていましたが、3年前に引退。


#作っているサービス
p4match
https://p4match.com

#きっかけ
失業保険が出る間は趣味の卓球に明け暮れ楽しもう！
と、思い練習はもちろん大会にもたくさん参加しました。

たくさん大会に参加して思ったのは**楽しくない**
趣味の卓球で楽しい1日になるはずなのに楽しくないことが多いんです。
理由は明確でした。
参加者の人数制限を設けず試合の進行が非常に遅くなり、1日使って出来る試合数は2試合とかザラ。さらに、対戦の組み合わせも強い人と弱い人がごちゃまぜで試合結果はする前からわかっている試合があちこちに。
そんな試合を2試合とか、、、いい大人が1日使って楽しもうと思った結果がこれでは楽しい訳がない。

しかし、どうしてそうなるかも理解できました。
・参加者募集手段
　はがき、FAX、メール、電話、口頭
・参加者集計
　複数の人がエクセル等に手打ち
・組み合わせ作成
　運営者数名が話し合いながら手作業で作成
　(運営者が応募者全員を把握できるわけがない)
　参加者リストを入力すると自動で出力されるエクセルマクロ使用
・大会当日試合進行
　すべてのコート割り振り呼び出しをマイクコール

####**すべて人の手**

現状以上のことは**出来るはずがない**

と思うのと同時に、これ全部スマホ（Web）で**出来る**な
と思ってしまいました。

#使用している技術
PHP
MySQL
Bootstrap3
jQuery
javascript

MySQL以外はいじったことなかったのですが、すぐに形にすることができそうなもの、資料が多いものという条件で至って一昔前の普通の環境で作り始めました。

#サービスを作ってみて
自分のサービスを使って大会を開いてみました。
今まで自分が参加してきた大会とは別物、自分自身がちゃんと楽しめました。
これはきちんと世に広めていきたい！と、考えるようになり就職活動するのやめました。

作れば作るほど作りたいものが増えて止まらなくなっています。
それと同時に初めてのWeb制作で基本ができていないくせに規模はどんどん大きくなる。
新しい知識が身につくたびに今まで作ったところを直したくなる衝動にかられながらそれをやると進まなくなるのでやらない我慢が結構難しいですね。

実際気づいていないだけでまずい作りのところも多々あると思いますが、頑張っていこうと思います。

#技術的、、、？
今まで様々な言語を扱ってきたせいか、PHP,Javascriptそれぞれ書いていると初歩的なことですら間違った書き方をしてあれれ？となることが多々。
同じことを何度もググってその度同じページにお世話になる毎日です。
Qiitaがその回数を減らすツールになればなと思っています。

よろしくお願いします。
Teensy 3.6を買ったので遊んでみる

# Teensy 3.6
僕の推しマイコンボードになりました。

- FreeScale社のCortex-M4Fボード
- Arduino対応

M4ボードはSTMに多いですが、あちらはMbedメインなので、Arduinoメインの物は珍しいのではないでしょうか。

高性能かつ$30という価格も魅力。

[Teensy 3.6 - PJRC](https://www.pjrc.com/store/teensy36.html)
![Teensy 3.6](https://www.pjrc.com/store/teensy36.jpg)


# 動かしてみる
こいつ、オーバークロック出来る･･･!?
定格でも高性能ですが、伸び代があると分かったら、試したくなりますよね。

## CPU
Arduino IDEから設定できます。
(Menubar > Tool > CPU Speed)

- 180MHz - 定格
- 192MHz
- 216MHz
- 240MHz - 最大

結構熱くなるので、ヒートシンク推奨です。
動作自体は安定していました。

216MHz/240MHzでI2Sを使用する場合は、I2S PLLテーブルを修正する必要があります。

```cpp:libraries/Audio/output_i2s.cpp(output_i2s_quad.cpp)
// --- Before ---
// #elif F_CPU == 216000000
//   #define MCLK_MULT 8
//   #define MCLK_DIV  153
//   #define MCLK_SRC  0
// #elif F_CPU == 240000000
//   #define MCLK_MULT 4
//   #define MCLK_DIV  85

// --- After ---
#elif F_CPU == 216000000
  #define MCLK_MULT 36
  #define MCLK_DIV  153
#elif F_CPU == 240000000
  #define MCLK_MULT 2
  #define MCLK_DIV  85
  #define MCLK_SRC  0
```
引用: [Teensy 3.6 overclocked to 216-240MHz and audio adapter board -> LRCLK jitter - PJRC Forum](https://forum.pjrc.com/threads/48032-Teensy-3-6-overclocked-to-216-240MHz-and-audio-adapter-board-gt-LRCLK-jitter)

## SDIO
SdFatライブラリをダウンロードし数値を変更後、プロジェクトにインクルードします。

[SdFat-beta - GitHub](https://github.com/greiman/SdFat-beta)

- 50MHz - 標準
- 80MHz - 最大

```cpp:/src/SdCard/SdioTeensy.cpp
// kHzSdClk = 50000;
kHzSdClk = 80000;
```
引用: [microSD slot on teensy 3.6 - PJRC Forum](https://forum.pjrc.com/threads/37652-microSD-slot-on-teensy-3-6)


# ベンチマーク
## MicroSD Read/Write
Read: 31.4MB/s
Write: 25.9MB/s
![teensy36sdio.png](https://qiita-image-store.s3.amazonaws.com/0/253070/50d0fbf6-af51-7935-1dea-802345bee686.png)

かなり速いですね。
下手するとRaspberry Piに匹敵するレベルかも。


# まとめ
自作PCオタクはす～ぐオーバークロックしたがる。
今後Arduino系で色々やってみる時は、このボードがメインになると思います。
ユーザー情報にタグ付けできるの？？RubyOnRails

#前説 
本日は一日中ライブ参戦なのでQiita毎日投稿は今までのストックからひねりだします。タイトルはふざけていますが、多少調子に乗るといいらしい。

#やったこと
前回、Railsのact-as-taggableを用いてタグ機能を実装しました。今回はUser情報にTag機能(userに対する趣味の情報のタグ付けなど)を追加していきたいと思います。

#前提
Rails 4.2
タグ付けに関する基本操作、タグ付けgem act-as-taggableに関する記事は[こちら](https://qiita.com/networkyohan69/items/ad17870e921f8f0a6232)
前回の続きになりますので、不明な点は上記の記事を参照してください。
ご指摘あればご連絡ください。

#Deviseとは・・・？
Deviseというgemは皆さんご存知でしょうか。ユーザー情報を扱うには、ログインやログアウト、ユーザー登録など面倒な処理を行いますが、このgemさえ使えば簡単に扱える超有名なgemです。しかし、初心者にとってはこの中身はまるでブラックボックス。Deviseを使ったタグ付けはできるのでしょうか。

##Answer::できます
###Model

```ruby:user.rb
acts_as_taggable
```

###Viewファイルの入力画面

```html:new.html.erb
 <div class="row center">
   <h5 class="input-field col s12 center">
    <label>Your Favorite Field</label>
      <div class="field">
       <%= f.label :tag_list, "分野" %><br>
       <%= text_field_tag 'user[tag_list]', @user.tag_list.join(',') %>
      </div>
   </h5>
  </div>
```

###Viewファイルの出力画面

```html:edit.html.erb
   <div class="collapsible-body"><span>
     <div class="label"><%= f.label :tag_list %><br/>
       <%= f.text_field :tag_list %>
     </div>
</span></div>
```

###Controller

```ruby:application_controller.rb
protect_from_forgery with: :exception
before_action :configure_permitted_parameters, if: :devise_controller?

def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:account_update) do |u|
      u.permit(:email, :password,:password_confirmation, :nickname, :avatar, :birth,:current_password,:tag_list, {:tag_list => []})
    end
    devise_parameter_sanitizer.permit(:sign_up) do |u|
      u.permit(:email, :password,:password_confirmation, :nickname, :avatar, :birth, :tag_list, {:tag_list => []})
    end
  end
```

devise_parameter_sanitizerはDeviseにおけるパラメータ追加のメソッドです。ユーザー情報の優先度はかなり高く、親クラスのコントローラーapplication_controller.rbにおいて、:configure_permitted_parametersの実行が先に行われるべきと書いてあります。tag_listは様々な情報を格納している配列としています。:sign_up時と:update時のそれぞれでタグ情報をデータベースに保存しています。

#最後に
一応Deviseを用いたユーザーにも趣味などのタグ付けを行うことができました！Qiitaにもユーザタグをつけれますね。
【Python】SeleniumでHeadless Chromeを使おう


# 目次
- [準備](#準備)
- [コード例](#コード例)
- [Chromeオプション](#chromeオプション)
- [Chromeが開かなくなったときの対処法](#chromeが開かなくなったときの対処法)
- [その他のヘッドレスブラウザ](#その他のヘッドレスブラウザ)


# 準備
- selenium
- ~~Chrome（通常版）~~
- Chrome Canary
- Chrome driver

＜追記＞
Chrome（通常版）でもできますが，プログラムミスで簡単にChromeが起動しなくなるので，普段使いする人はCanaryを使うことをおすすめします。Chromeが起動しなくなった場合の対処法は最後に載せておきます。

## selenium
pipでもcondaでもインストール可能です。

```
>> pip install selenium
```
```
>> conda install selenium
```

## Chromedriver
pipまたはcondaで導入すれば，pythonパッケージと同様にバージョン管理ができるほか，`import chromedriver_binary`でパスを通すことができるのでおすすめです。別の方法としては，brewでインストールすることもできます。

```
>> pip install chromedriver-binary
```
```
>> conda install python-chromedriver-binary
```
```
>> brew install chromedriver
```

# コード例
Google検索画面のHTMLを取得し表示します。Chromedriverはpipまたはcondaでインストールしていることを想定しています。

```python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary

# ブラウザーを起動
options = Options()
options.binary_location = '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)

# Google検索画面にアクセス
driver.get('https://www.google.co.jp/')

# htmlを取得・表示
html = driver.page_source
print(html)

# ブラウザーを終了
driver.quit()
```

# Chromeオプション
`headless`以外にもChromeオプションはいろいろあるので，その中から私がよく使うものを紹介します。

- `headless`：ヘッドレス指定
- `hide-scrollbars`：スクロールバーを隠す
- `incognito`：シークレットモード。拡張機能がオフになったり，履歴が残らなくなる。
- `window-size`：ウィンドウサイズ指定


# Chromeが開かなくなったときの対処法
一応，私が試した対処法を載せておきます。
PC再起動以外は，治ったり治んなかったりでした。

- 起動しているChromeのタスクをすべて消去
- 'headless'オプションを外してプログラム実行
- PC再起動


# その他のヘッドレスブラウザ
- Firefox → https://qiita.com/derodero24/items/9b38bc4ca99bfd8d5ea3
- Splash → https://qiita.com/derodero24/items/a181cd34b081bee055c7
AWSでVPNを立ち上げる

## 背景
友達に聞かれて、中国に帰国するから、おすすめのVPNとか有りますか？皆さんご存知の通り、GFWのせいで中国に行ったら、Google, Youtube, Facebook, Twitterなどのアクセスができなくなっちゃう。

以前自分も自分専用のVPNを作ったことがあるので、「じゃ、作ってあげようか」って言ってしまった。

## 作成
以前のこの[サイト](https://www.webdigi.co.uk/blog/2015/how-to-setup-your-own-private-secure-free-vpn-on-the-amazon-aws-cloud-in-10-minutes/
)の通り作りました。

ただ、今回その[GithubのREADME](https://github.com/webdigi/AWS-VPN-Server-Setup)を従い、作ろうとしたら、以下のエラーになってしまった。

```bash
$ lono generate
Generating CloudFormation templates, parameters, and scripts
ERROR: The app/definitions does not exist in this project.  Are you sure you are in lono project?
```

なんかものが足りないに気がしますね。まあ、jsonファイルを生成するためのものですから、直接に自分で生成ではなく、直接にjsonを使っても動くんじゃないと思って、[`src/output/Unified-Cloud-Formation-Key-Name.json`](https://github.com/webdigi/AWS-VPN-Server-Setup/blob/master/src/output/Unified-Cloud-Formation-Key-Name.json)を使ってみました。

## 接続
#### Macbook Pro
VPNの作成が完了したら、早速自分のmacbook proでテストして見ましょう

System Preferences -> NetWork -> +

<img width="411" alt="Screen Shot 2018-04-27 at 23.21.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/37718/a3348e59-15a3-d337-c05d-196c36cf2d00.png">

認証設定

<img width="362" alt="Screen Shot 2018-04-27 at 23.21.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/37718/b2fada38-14ec-e67f-3b2a-eac958935c3c.png">

VPN使用設定

<img width="649" alt="Screen Shot 2018-04-27 at 23.21.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/37718/02b5a2b1-0cd5-5cca-7f72-fe6159913234.png">

ホストとアカウント設定
<img width="535" alt="Screen Shot 2018-04-27 at 23.22.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/37718/20077d16-ff20-43f1-97aa-3219b593079f.png">


でも、だめでした！

<img width="421" alt="Screen Shot 2018-04-27 at 10.50.52 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/37718/2ee1da68-228d-ad6b-b39d-6efedb78c91e.png">

認証はうまくいってるっぽいですね。何回試しても同じエラーでした。

もしかしたら、ポートですかな、別の記事を参照して、OpenVPNのポートを設定してるようです、こっちのセキュリティーグループを確認したら

<img width="538" alt="Screen Shot 2018-04-27 at 23.03.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/37718/5560a3de-da7d-d6d5-8993-7b72891bf7ac.png">

OpenVPNのポートが入ってないです。**試しに1194ポートを入れてみたら、行けました！**

<img width="1107" alt="Screen Shot 2018-04-27 at 23.05.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/37718/549fae53-bcf3-2b7a-4148-6c9286e19b85.png">

でもよく考えたら、Macbook proで使っているVPNタイプはL2TPなので、UDP:1701とTCP:1707があれば動くはずですが、謎！

#### iPhone
Settings -> General -> VPN -> Add VPN Configuration

![IMG_7393.PNG](https://qiita-image-store.s3.amazonaws.com/0/37718/4f4f8fe4-259d-4305-c1f4-439ae1f0f446.png)
  
## 参照
- https://www.webdigi.co.uk/blog/2015/how-to-setup-your-own-private-secure-free-vpn-on-the-amazon-aws-cloud-in-10-minutes/
- https://github.com/webdigi/AWS-VPN-Server-Setup
- https://www.comparitech.com/blog/vpn-privacy/how-to-make-your-own-free-vpn-using-amazon-web-services/
- https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7
javaで特性関数的に文字列をソート

やりたいこととしては```"insert", "create", "drop"```という文字列のリストがあるとき、自然順序ではなく、自分の好きな順序でソートしたい。具体的に言うと、```"drop", "create", "insert" ```という順序にソートしたい。

この場合、集合の要素が限定されているため、SQLだと特性関数で```case```によるソートをすれば良い。同じようなことをjavaでもやりたい。

# 環境
java 1.8

# コード
## 特性関数をMapで持つ
特性関数に相当するものを```Map```で持つ。keyが集合の要素でvalueがソート順序の整数。

```java
Map<String, Integer> map = new HashMap<>();
map.put("drop", 1);
map.put("create", 2);
map.put("insert", 3);

List<String> list = Arrays.asList("insert", "create", "drop");
list.stream()
	.sorted((s1, s2) -> map.get(s1).compareTo(map.get(s2)))
	.forEach(System.out::println);
```

出力結果。

```java
drop
create
insert
```

## ファイル名を任意の順番でソート
これが必要になった状況としては、ある特定の順序でファイルをソートしたかった。たとえば、こんな感じのファイル群があるとする。

```
0001_create.sql
0001_drop.sql
0001_insert.sql
0002_create.sql
0002_drop.sql
0002_insert.sql
```

prefixの順番＋suffixは前述の[drop -> create -> insert]、という順番でファイル一覧を取得したかった。

というわけでソースコード。

```java
Map<String, Integer> map = new HashMap<>();
map.put("drop.sql", 1);
map.put("create.sql", 2);
map.put("insert.sql", 3);

Files.walk(Paths.get("files"))
	.filter(Files::isRegularFile)
	.sorted((p1, p2) -> {
		String[] sp1 = p1.getFileName().toString().split("_");
		String[] sp2 = p2.getFileName().toString().split("_");

		String pp1 = sp1[0] + map.get(sp1[1]);
		String pp2 = sp2[0] + map.get(sp2[1]);
		return pp1.compareTo(pp2);})
	.forEach(System.out::println);
```

出力結果。

```
files\0001_drop.sql
files\0001_create.sql
files\0001_insert.sql
files\0002_drop.sql
files\0002_create.sql
files\0002_insert.sql
```

といってもやることはそんな変わんない。ファイル名をセパレータで区切って、suffix部分を特性関数的なmapでソート順序の整数に変換。それをprefixの順番にくっつけると、```"00013", "00012", "00011"```という文字列になるので、あとは```compareTo```するだけ。
オフラインリアルタイムどう書く F08 の実装例(Go)

オフラインリアルタイムどう書く F08 の実装例
問題：http://nabetani.sakura.ne.jp/hena/ordf07chairs/
実装リンク集：https://qiita.com/Nabetani/items/de5b9d3230603033ed74

Go の練習で書いてみた。
まだ全然手に馴染んでいない。

```go:実装
package f08

import (
	"fmt"
	"math"
	"strings"
)

var order = []int{1, 3, 5, 7, 9, 8, 6, 4, 2}

func mapInt(src []int, pred func(int) int) []int {
	dest := make([]int, len(src))
	for i := 0; i < len(src); i++ {
		dest[i] = pred(src[i])
	}
	return dest
}

var revorder = mapInt(order, func(x int) int { return -x })

func minpos(a []int) int {
	p := 0
	minval := int(math.MaxInt32)
	for pos, val := range a {
		if val < minval {
			minval = val
			p = pos
		}
	}
	return p
}

func index(chairs []string, ord []int) int {
	scores := make([]int, len(chairs))
	for i := range chairs {
		if chairs[i] != "-" {
			scores[i] += 10000
		}
		if chairs[(i+1)%len(chairs)] == "-" {
			scores[i] -= 100
		}
		if chairs[(i+len(chairs)-1)%len(chairs)] == "-" {
			scores[i] -= 100
		}
		scores[i] += ord[i]
	}
	return minpos(scores)
}

func process(chairs []string, cmd rune) {
	switch {
	case 'a' <= cmd && cmd <= 'z':
		for n := range chairs {
			if chairs[n] == strings.ToUpper(fmt.Sprintf("%c", cmd)) {
				chairs[n] = "-"
				break
			}
		}
	case 'A' <= cmd && cmd <= 'Z':
		var ord []int
		if cmd < 'N' {
			ord = order
		} else {
			ord = revorder
		}
		ix := index(chairs, ord)
		chairs[ix] = fmt.Sprintf("%c", cmd)
	}
}

func solve(src string) string {
	chairs := make([]string, len(order))
	for i := range chairs {
		chairs[i] = "-"
	}
	for _, cmd := range src {
		process(chairs, cmd)
	}
	return strings.Join(chairs, "")
}
```

```go:テスト
package f08

import (
	"testing"
)

func Test(t *testing.T) {
	var tests = []struct {
		name  string
		input string
		want  string
	}{
		{"0", "NABETanI", "I-E--T-B-"},
		{"1", "A", "A--------"},
		{"2", "Aa", "---------"},
		// 中略
		{"48", "WFNwBfbSAXCZzMDJUcKx", "AM-JSUNDK"},
	}
	for _, test := range tests {
		got := solve(test.input)
		if got != test.want {
			t.Errorf("%v: solve(%q)=%q, want %q\n", test.name, test.input, got, test.want)
		}
	}
}
```

評価関数で「座りたくなさ」を表現し、「座りたくなさ」が最小である席を見つけるという順当な実装なのだが。が。

* `minpos` という関数を書いてしまった。
* ruby の `map` に相当する関数を書いてしまった。

辺りが不満。ライブラリにないのかなぁ。
テンプレート（のようなもの）がないから書きようがないのかなぁ。

あと。 `rune` である `cmd` を `string` に変換する方法がわからなかったので `Sprintf` してしまった。`strconv` 辺りにありそうなんだけど、見つけられなかった。
くやしい。

ちなみに、`chairs` が `[]string` なのは、最後に `Join` したいから。最初は `[]rune` で書いていたんだけど、`Join` 出来なかったので `[]string` に変更した。

そんなところかな。
JavaでElementからClassを取得する方法

**Annotation Processing中は対象のクラスはプロセッサー側のClassLoaderに読み込まれていないので、この方法でClassを取得することはできません**

~~# ElementからClassを取得する~~

~~- [Type Element](https://docs.oracle.com/javase/jp/8/docs/api/javax/lang/model/element/TypeElement.html)(クラスのElement)ならそのElementのClass~~
~~- [Variable Element](https://docs.oracle.com/javase/jp/8/docs/api/javax/lang/model/element/VariableElement.html)(フィールド/enum定数等の変数)ならその変数の型のClass~~

~~を取得します。
他にも3種類ほどElementがありますが、未検証&そこからClass<T>を取得する必要が無さそうなので書いていません。~~

~~仕組みなんてどうでもいい、とりあえず動けばいい！って人はこちらのコードをどうぞ。
適当なところにコピペして使ってください。~~

```kotlin
fun Element.getDeclaredClass(): Class<*> = ((asType() as DeclaredType).asElement() as TypeElement).qualifiedName.let { name -> ClassLoader.getSystemClassLoader().loadClass(name.toString())}
```

~~Elementの拡張関数なので、`roundEnv.getElementsAnnotatedWith()`あたりから取ってきたElementからそのままgetDeclaredClass()を呼び出して使います。~~

~~## ElementからClassを取得するためのプロセス~~

~~1. `Element#asType()`を呼び出して型のTypeMirrorを取得する。
2. 取得した値をDeclaredTypeにキャストする。
3. `DeclaredType#asElement()`を呼び出して型のElementを取得する。
4. 取得した値をTypeElementにキャストする
5. TypeElementからクラスのバイナリ名(完全修飾名)を取得する
6. ClassLoaderからバイナリ名を用いてClassを取得する~~

~~結局Elementから直接Classに変換出来ないんですよね。
ClassLoaderを通してClassを取得することになります。~~

~~`Element#asType`について。[JavaDoc](https://docs.oracle.com/javase/jp/8/docs/api/javax/lang/model/element/Element.html#asType--)には~~

~~> この要素で定義された型を返します。~~

~~と書いてあります。
これは、Variable Elementならその変数の型、Type ElementならそのElement自身が表す型を返します。
ちなみに3で取得したElementは最初のElementと同一のものなので、Type Elementの場合は1~4をすっ飛ばして5,6だけで十分でしょう。
1~4がVariable Elementから型のType Elementを取得する方法
5~6がType ElementからClassを取得する方法
になりますね。~~

## コードにしてみる
~~実際に書いたコードがこちら~~

```kotlin
fun Element.getDeclaredClass(): Class<*> {
    return ((asType() as DeclaredType).asElement() as TypeElement).qualifiedName.let { name ->
        ClassLoader.getSystemClassLoader().loadClass(name.toString())
    }
}
```

~~Javaで書くならこうでしょうか。~~

```java
public Class<?> getDEclaredClass(Element element) {
    String name = ((TypeElement)((DeclaredType)element.asType()).asElement()).getQualifiedName().toString()
    return ClassLoader.getSystemClassLoader().loadClass(name)
}
```
.bash_profile追記時のホームディレクトリの表示について

``.bash_profile``に環境変数を追加したのだが、ホームディレクトリの表示に疑問を感じたのでメモしておく。コマンドの書き方がブログ記事や技術本によって様々だったので、気になってしまった。

## 今回登録したい環境変数

```
~/.composer/vendor/bin
```
Laravelをコマンドとして認識させるためだ。

## export以降をダブルクオーテーションで囲んで実行

```
$ echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile
```

実際に追記されたのはこちら。ホームディレクトリまでのパスが``~/``のままになっている。

```sh
export PATH=~/.composer/vendor/bin:＜今まで登録した環境変数＞
```

## 次はダブルクオーテーションなしで実行

```
$ echo export PATH=~/.composer/vendor/bin:$PATH >> ~/.bash_profile
```

今回はホームディレクトリまでのパスが展開されている。

```sh
export PATH=/Users/ユーザー名/.composer/vendor/bin:＜今まで登録した環境変数＞
```

## .bash_profileの理想の書き方とは

自分としてはセミコロンで延々とつないでいきたかったのだが・・・（これも長すぎると見辛いが。）どちらにしても``export``がもう一文追加されてしまうようだ。

``.bash_profile``をスマートにしたければ、現状では自分で直接編集するしかないと感じた。

``$PATH``自体は、ダブルクオーテーションの有無にかかわらず変数展開されるようだ。``$PATH``のまま表示されて変数として扱われれば、少しはコードが短くなると思ったのだが。

パスとしては変わらないが、``.bash_profile``のホームディレクトリの表記には3種の方法があることもメモしておく。自分としては、$HOMEが視覚的にわかりやすい。

- ~（チルダ）
- $HOME
- /Users/ユーザー名

## 結局こうした

自分の手で``.bash_profile``を編集し、セミコロンで繋ぐことにした。

あ、最後にこれを忘れずに！実行しないとせっかく作ったPATHが反映されない。

```
$ source ~/.bash_profile
```

このコマンドで変数の内容も確認！こちらは実行するとホームディレクトリが全て展開された状態で表示される。

```
$ echo $PATH
```

今日はここまで。
Cloud9をFire HD 10で動かす

## 追記

2019.3.31 時点で本記事を訂正し、環境構築が可能になりました！

~~2019.3.1 時点で、本記事の方法では環境構築ができないことを確認しています。
参考程度にご覧ください。~~

# 前提

`Termux`がFire HD 10にインストールされていること。

## インストール

```sh
pkg i -y git nodejs-lts tmux clang
npm i -g npm@4.6.1
install ~/../usr/bin/tmux ~/.c9/bin/tmux -D
git clone https://github.com/c9/core.git
cd core
npm i
```

## 実行

```sh
cd ~/c9
./server.js
```

`127.0.0.1:8181`にブラウザからアクセスすると、~~terminalが使える状態で~~Cloud9が起動します。

### '20.02.08 追記

下記記事にて、共同編集のための設定方法を記載しています。併せてご確認ください。
[Docker に立てた Cloud9 で共同編集する方法](https://qiita.com/hidao/items/da30b4ab9706d012ac5d)

### '19.09.01 追記

terminal が使えないようです…
`pty.js` というライブラリが必要なのですが、これのビルドに失敗するようです。現在対策を調査中です。

また、起動のコマンドを`./server.js -l 0.0.0.0 -a :`とすると、同一LAN上の別の端末からも使用できるようになります！
`-a user:pass`とすると、BASIC認証でユーザ名`user`、パスワード`pass`を求めることができます。
同一LAN上の別のユーザに使用されたくない場合に利用しましょう。

## ‘18/04/29 追記

@yyano さんのトゥートより、

> Fire HD 7(2017)でも動いた！

そうです。ご参考まで。
Spring Data JPAでSpecificationを使ったexists

こんな構造のテーブルがあるとする。

![ER.png](https://qiita-image-store.s3.amazonaws.com/0/253760/4920ccb3-8cd1-fdd6-0c8d-c54f58ee07a1.png)

Spring Data JPAを使ってちょっと複雑なクエリを発行したい場合にSpecificationを使うが、existsを使う場合は、次のようなEntity構造だと、問題が発生した。（setter/getterは省略）
ちなみに、Spring Bootのバージョンは1.5.4.RELEASE。

```java:User.java

@Entity
public class User {
    @Id
    private String userId;

    private String name;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<Phone> services;
}
```

```java:Phone.java
@Entity
public class Phone {
    @Id
    private Integer phoneId;

    @ManyToOne
    @JoinColumn(name = "USER_ID")
    private User user;

    private Integer type;

    private String number;
}
```

これらのEntityを用いて、「Phoneが1つでもあるUserを取得」するためのexists句を

```java
public interface UserRepository extends CrudRepository<User, Integer>, JpaSpecificationExecutor<User> {

    static Specification<User> existsPhone() {
        return (root, query, cb) -> {
            Subquery<Integer> subquery = query.subquery(Integer.class);
            Root<Phone> subRoot = subquery.from(Phone.class);
            return cb.exists(subquery.select(cb.literal(1)).where(
                    cb.equal(root, subRoot.get("user").get("userId")));
        };
    }

}
```

のように作って

```java
userRepository.findAll(Specifications.where(UserRepository.existsPhone()));
```

と実行したところ、StackOverflowErrorが発生した。

どうやら、User→Phone→User→Phone→・・・と循環参照してしまっているらしい。。


で、次のようにPhoneからのUser参照を無くせば、エラーは出なくなった。

```java:User.java

@Entity
public class User {
    @Id
    private String userId;

    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "userId")
    private List<Phone> services;
}
```

```java:Phone.java
@Entity
public class Phone {
    @Id
    private Integer phoneId;

    private String userId;

    private Integer type;

    private String number;
}
```

```java
public interface UserRepository extends CrudRepository<User, Integer>, JpaSpecificationExecutor<User> {

    static Specification<User> existsPhone() {
        return (root, query, cb) -> {
            Subquery<Integer> subquery = query.subquery(Integer.class);
            Root<Phone> subRoot = subquery.from(Phone.class);
            return cb.exists(subquery.select(cb.literal(1)).where(
                    cb.equal(root, subRoot.get("userId")));
        };
    }

}
```

PhoneからUserを参照することもないので、これでいいっか。
DBをPostgreSQLで勉強!! 文系学生がやってみた!!

##はじめに
インターン先でプログラミングを勉強中の文系学生。
インターン先ではPostgreSQLを使っているとのこと。
この機会に勉強しておきますか!!

##PostgreSQLとは
まぁ、さすがにSQLだし、データベースを取り扱うのはわかる。
でも、どういう特徴があるんだろう?

社員さんの話やインターネットで調べてみると、コストパフォーマンスが良いみたい。
ほとんどのことには対応できるみたいだしね。
それなら使いたくもなるか。
それじゃあ、やっていきますか!!

##データベースの勉強
プログラミングをしてるんだから、ある程度の知識はあるよ。
まぁ、知識不足も否めないけど…
それなら勉強すれば良いんだよね!!

このサイトを見ながら勉強しよう!!
[PostgreSQLではじめるDB入門](http://db-study.com/archives/6)

###データと情報の違い
データ・・・客観的な事実や数値を視覚にしたもの
情報・・・データを加工して、目的に使用できるようにしたもの

###データの品質
完全性・・・データに不備がないこと
正確性・・・データが正確であること
妥当性・・・データが正確な条件から導き出されていること
一貫性・・・データに矛盾がないこと
適時性・・・データを使用するタイミングがふさわしいこと

###DBMSについて
DBMS(Database Management System)・・・データーベースを管理し、アクセス要求に応えるソフトウェア

###データベースの種類
RDB(リレーショナルデータベース)・・・二次元表で管理されるデータベース
OODB(オブジェクト指向データベース)・・・オブジェクト指向のプログラミング言語のオブジェクトを管理するデータベース
XMLDB(XMLデータベース)・・・XML形式のデータを扱えるデータベース
階層型データベース・・・ツリーで表現されるデータベース
ネットワーク型データベース・・・網目状にデータが管理されるデータベース

###スキーマについて
データベースにおけるスキーマは、データの構造や関連性、ルールや表現法を指す。
スキーマは3つの層に分かれる。
1,外部スキーマ・・・取り出されるデータ。
2,概念スキーマ・・・データベースに保存されているデータ。
3,内部スキーマ・・・データベースに保存されるデータ。

###データベースの障害
論理障害・・・電磁的記録の障害
物理障害・・・ハードウェアの障害

###バックアップの方法
フルバックアップ・・・すべてのデータをバックアップする。バックアップ、復元の両方で時間がかかる
差分バックアップ・・・フルバック以降、変更されたデータのみをバックアップする。運用しにくい。
増分バックアップ・・・変更されたデータのみをバックアップする。時間が短くなる。

###リストアとリカバリ
リストア・・・データを物理的に復元
リカバリ・・・リストア後の変更内容を反映させて、最新の状態に戻すこと


##PostgreSQLのインストール
せっかく勉強するんだし、インストールしたほうが良いよね。
後々使う事にもなるだろうし。
インストールの仕方を教えてくれるのはこのサイト。
[【初心者向け】PostgreSQLのダウンロード及びインストール方法](https://eng-entrance.com/postgresql-download-install)

この手順通りに進めていけば問題はないでしょ。

##PostgreSQLの使い方
さてさて、PostgreSQLを使っていきますか!!
勉強させてもらうのはいつも通りのドットインストール先生!!
[PostgreSQL入門 (全16回)-プログラミングならドットインストール](https://dotinstall.com/lessons/basic_postgresql)

簡単に使ったコードをまとめておこう

```
　$psql --version
　--バージョン確認
　$pspl -l
　--データベースリスト
　$createdb データベース名
　--データベース生成
　$psql データベース名
　--接続
　$　\l
　--データベースリスト
　$ \q
　--接続終了
　$create table(カラム名、属性);
　--テーブル作成
　$ \d (テーブル名)
　--テーブルの確認(テーブルの中身確認)
　$alter table 前のテーブル名 rename to 変更するテーブル名;
　--テーブル名変更
　$drop table (テーブル名)
　--テーブルの削除
  $\i (ファイル名)
  --ファイル読み込み
　$insert into テーブル名(カラム) values (データ)
　--データの挿入
  $select * from (テーブル名);
  --テーブルの表示
　$ \x
　--拡張表示の切り替え(データが縦になる)
　$update テーブル名　set 更新したいデータ　where 更新するデータ
　--更新
　$delete from テーブル名 where 削除するデータ
　--削除
　$alter table テーブル名 alter name データ 制約
　--データ型の変更
　$create index インデックス名 on ユーザー名(フィールド名)
　--インデックス作成
　$drop index インデックス名
　--インデックス削除
　$ create view view名 as
　--viewの作成
　$drop view view名
　--viewの削除
　$begin
　--トランザクション(複数処理)開始
　$commit
　--トランザクション実行
　$rollback
　--トランザクションの中止
```

##まとめ
今回はProstgreSQLの勉強をしました!!
SQL構文を覚えて、マスターを目指す!!


##参考記事
[PostgreSQLではじめるDB入門](http://db-study.com/archives/6)
[【初心者向け】PostgreSQLのダウンロード及びインストール方法](https://eng-entrance.com/postgresql-download-install)
[PostgreSQL入門 (全16回)-プログラミングならドットインストール](https://dotinstall.com/lessons/basic_postgresql)
【Pythonメモ】pandas-profilingが探索的データ解析にめちゃめちゃ便利だった件

当たり前の話だったら超恥ずかしいのですが、初めて知って驚愕したのでご紹介。

タイトルのとおり、`pandas-profiling`が探索的データ解析（EDA）にめちゃめちゃ便利だったのでご紹介するだけの記事です。

pandas-profilingの詳細はこちらからご確認を。
[pandas-profiling](https://github.com/pandas-profiling/pandas-profiling)



# 準備
pipやAnacondaを使うなどして、適宜ご自身の環境にインストール。

```
pip install pandas-profiling
```

あとはインポートするだけ。

```python
import pandas as pd
import pandas_profiling as pdp
```


# 実行

みんな大好きTitanicのtrainデータを使用。
なんの前処理もかけずに実行してみる。

```python
df = pd.read_csv('train.csv')
pdp.ProfileReport(df)
```



# Output

こんな感じでデータの全体像をHTMLで出力してくれます。便利。

**画像**
![pandas-profiling01.jpg](https://qiita-image-store.s3.amazonaws.com/0/165789/4aef4e02-c225-9c4c-9af5-b9ca0cd167a1.jpeg)

<br>

![pandas-profiling02.jpg](https://qiita-image-store.s3.amazonaws.com/0/165789/7557ae0b-ebd8-3bb4-3783-4ba5a006b206.jpeg)

<br>

![pandas-profiling03.jpg](https://qiita-image-store.s3.amazonaws.com/0/165789/f8326719-1d89-5bae-29f6-0eb8587c82b3.jpeg)





**gif**

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/165789/5b145604-7273-d04c-975e-199dc1eccbbd.gif)

データフレームの構造に、データ型別の基本統計量とグラフ、
数値データはピアソンの積率相関とスピアマンの順位相関といったところでしょうか。

膨大な説明変数があると大変そうですが、
1行のコードでここまで出してくれるのはEDAが捗りそうですねぇ。

また、以下でHTMLファイルの作成も可能。

```python
profile = pdp.ProfileReport(df)
profile.to_file(outputfile="myoutputfile.html")
```


# 注意

Colaboratoryでやると表示、挙動が不安定でした。
Kaggle KernelはOK。

Colaboratoryでは何か方法があるかもしれません。
IT詳しい方、ご存知でしたら教えてください。


# 補足(2018/05/06追記)
プロフェッショナルの方がcolaboratory挙動の解決策記事を書いてくれています！
HTMLファイルを生成して、埋め込む感じでうまくいくようです！

[pandas-profilingが探索的データ解析にめちゃめちゃ便利だった件 - GoogleColab編](https://qiita.com/wakamezake/items/39faf5d91e20a5cf5772#_reference-a12e589891bdd7bf36e5)
Composerインストールでhomebrew/php deprecatedになるとき

# インストールしようとしたらはじかれた

```
brew install homebrew/php/composer
=> Error: homebrew/php was deprecated. This tap is now empty as all its formulae were migrated.
```


# 今はコアにmergeされたよう.

```
brew install homebrew/core/composer
```
これでインストールできた。
PrimeNGを触ってみた

## PrimeNGとは

JSF の実装の一つである PrimeFaces と同じところが作っている Angular 用の Rich UI Componentsのこと。
基本無料で利用でき、70個以上のコンポーネントが簡単に利用出来る（有料のデザインテンプレートなども提供している）

・公式：https://www.primefaces.org/primeng/  
・Angularについては[こちら](https://www.sejuku.net/blog/9019#GoogleJavaScript)が参考になります。

こんなのとか
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/206219/bec15ddf-1ad6-2e9b-9026-736a23253bab.png)

こんなのが  
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/206219/b9fcfaaf-0d57-7d2f-613d-ee61b8497bb2.png)

簡単に実現できるようになります。

## 実際に触ってみた

※今回はAngular導入～プロジェクトの作成については割愛します。

#### PrimeNGのインストール

プロジェクトフォルダで下記コマンドを実施します。

```
$ npm install primeng --save
```

#### CSSの適用

`src/style.css`に下記を追加することでPrimeNGのcssが読み込まれます。

```css
@import url('../node_modules/primeng/resources/themes/omega/theme.css');
@import url('../node_modules/primeng/resources/primeng.min.css');
```
※今回はomegaというテーマを使いますが他にも無料で使えるcssが同ディレクトリに多数用意されています。  
ここで注意が必要で、ここまでの手順だとPrimeNGが使用しているアイコンが存在せずアイコンが表示されません！

こんな感じ（ボタン左側の空白にアイコンが表示されるはず）  
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/206219/fb474f8f-ce07-2b38-8cd8-108d074513af.png)

そこでPrimeNGが使用しているFont Awesomeをダウンロードしてやる必要があります。  
また、Font Awesomeの最新バージョンである5.0.10では表示できないアイコンがあるため一つ前のバージョンである4.7.0をダウンロードする必要があります。(2018年4月現在)  
ダウンロードページは[こちら](https://fontawesome.com/v4.7.0/)  
何度も「最新のバージョンがあるよ！」と言ってきますが心を鬼にしてNo Thanksを選択します。  
展開したフォルダからcssフォルダとfontsフォルダを`src/resources`配下に配置します。  
そして先ほどの`src/style.css`に下記を追記することでアイコンが読み込まれるようになります。

```css
@import url('./resources/css/font-awesome.min.css');
```

Font Awesomeについては[こちら](https://saruwakakun.com/html-css/basic/font-awesome)が参考になります。  
単体でも十分使えそうですね。

このあたりの小細工が公式は端折っているので辛かった。。。

#### コンポーネントの適用

さて、これでPrimeNGを使用する準備が整ったので実際にコンポーネントを使用していきます。  
今回はファイルをアップロードするためのFileUploadModuleを使ってみます。

各component.tsには利用するモジュールをimportするだけです。  

```ts
import { FileUploadModule } from 'primeng/components/fileupload/fileupload';
```

各HTMLはこんな感じ

```html
<p>
  ファイルアップロード
</p>

<p-fileUpload name="myfile[]" url="./upload.php"></p-fileUpload>
```  

※primeNGのhtmlタグを使用する場合はapp.module.tsにもインポートが必要です。  

```ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { FileUploadModule } from 'primeng/fileupload';
import { AppComponent } from './app.component';
import { MainComponent } from './main/main.component';

@NgModule({
  declarations: [
    MainComponent,
    AppComponent,
  ],
  imports: [
    BrowserModule,
    FormsModule,
    FileUploadModule,
  ],
  providers: [
    FileUploadModule,
  ],
  bootstrap: [AppComponent]
})

export class AppModule { }
```

簡単ですね :smile:  
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/206219/afdbb3e0-ae05-78d8-f35c-3d050311a0a1.png)

プレビューもいい感じ  
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/206219/98417b8d-b6ce-0c44-7f5d-60b56ed3bfd8.png)

デフォルトでドラッグ＆ドロップでのアップロードも実装されています。

## まとめ

以上のように使う際には非常に簡単にリッチなUIが基本無料で実現できます。  
しかし、導入の際に少しハマったので今回記事にさせていただきました。  
私もまだまだ触り始めたばかりなのでこれからガンガン使ってナレッジをアップデートできたらと思います。
さくらのVPSを使って最速でUbuntu18.04LTSのインストールを行う


# さくらのVPSを使って最速でUbuntu18.04LTSのインストールを行う
## 概要
昨日(2018/4/26)、Ubutnu18.04 LTSがリリースされました。
http://releases.ubuntu.com/18.04/

元々、Betaのときから遊んでたりしましたが、どうせならVPSで利用したいと考えまして、「さくらのVPS」が まだ対応していなかったので、インストールしてみるまでの手順をまとめました。

対応していないのにどうやってインストールするのかというと、さくらのVPSでは ISOイメージをアップロードして、そこからOSを入れることが可能となっています。
詳細は、以下の公式ドキュメントをご参考ください。
https://help.sakura.ad.jp/hc/ja/articles/206055662


で、このISOイメージアップロード、4GBとかのイメージをアップロードすると疲れちゃうので、できるだけ小さいイメージを持ってくることで、「最速」のインストールをしたいと思います。

Ubuntu18.04 LTSの最小イメージは netboot でインストールを行うmini.isoを使います。
http://jp.archive.ubuntu.com/ubuntu/dists/bionic/main/installer-amd64/current/images/netboot/mini.iso



## イメージアップロード
ISOイメージのアップロードは公式に詳細な手順がありますので、ご参考ください
https://help.sakura.ad.jp/hc/ja/articles/206055662

```
・コンパネにログイン
・インストールを実施したいVMを選択
・画面右上の[*各種設定]より、「OSインストール」を選択
・デフォルトだと「標準OSインストール」となっているので、「ISOイメージ」を選択する
・SFTPアカウントを発行する
・Winscp　でSFTP接続でアップロード (数秒で終わります。早い！！ 4GBとかのイメージアップしてると時間かかっちゃう。)
・再びコンパネに戻ると、アップロードした「mini.iso」 を認識しているので、「設定内容を確認する」を選択
・別windowsがでるので、内容が間違っていない事を確認して「インストールを実行する」を選択
・「VNCコンソール接続」 を選ぶ
```

## インストール
```
・language  : お好みで。日本語だとnetworkの手動設定できなかったので気をつけてください
・Location  : お好みで
・Keybord   : お好みで
・Network :  ens3を選びましょう さくらのVPSの場合、1つ目のインターフェースのみグローバル接続が可能です。
  → デフォルトだとDHCPが走りますが失敗しますので、「ネットワークを手動で設定」を選択し コンパネの「詳細」画面を見ながら `ens3` に情報を入れてください。
  → netbootしてるので、ネットワーク疎通がなかったらインストールできないです。
  → jp.archive.ubuntu.comがIPv6に対応していないっぽいので、jp.archive.ubuntu.comを利用する場合は IPv4で接続しましょう。 
  → 日本語でやるとなぜかIPの設定ができなかったです。
・mirror  : お好みで jp.archive.ubuntu.comに接続に行くと、パッケージの整合性エラー（？）がでたので、私は「台湾」に接続に行きました。
・Partition : お好みで
```

## インストールが終わったら
コンパネから、「強制停止」・「起動」


## コンフィグ設定。
### TSOの無効化
https://help.sakura.ad.jp/hc/ja/articles/115000045522
さくらのVPSではTSOの無効化が推奨されています。Ubuntu16.04の設定を真似して以下のものを入れます。

```/etc/udev/rules.d/50-eth_tso.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/sbin/ethtool -K %k tso off"
ACTION=="add", SUBSYSTEM=="net", KERNEL=="ens*", RUN+="/sbin/ethtool -K %k tso off"
```


### シリアルコンソールの有効化・他
VNCコンソールが有るので不要ですが、Ubuntu16.04でもGRUBを弄って有効化してあったので、合わせて修正します。
また、そのほか、さくらのVPS環境に沿った設定であろう設定に変更します。


```/etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1"
GRUB_CMDLINE_LINUX_DEFAULT="noresume nomodeset consoleblank=0 elevator=noop console=tty0 console=ttyS0,115200n8"
```

以下のコマンドを実行するのを忘れずに

```
# update-grub2 
# reboot
```




## そのほか　セキュリティなど
この状態だと、セキュリティってなに？？　っていうくらいノーガードです。まぁ、SSHやNTPも入っていない環境ですが、最低限 `ufw` と `fail2ban` 位は入れておくことをお勧めいたします。



```
# apt install -y ufw fail2ban
```

とりあえず、これで Ubutnu18.04で遊ぶ事が出来ました。
なぜNANDなのか

どれくらい低抽象度の話までは認められるのか探ってみる意味も込めて。
#疑問
　よく、最近のプロセッサはNANDで作られていると聞いていたが、なぜかよくわからなかったので教授に聞いてみた。
#答え
wikipedeiaの図を使うとNAND回路は以下のように示される。
![CMOS_NAND.svg.png](https://qiita-image-store.s3.amazonaws.com/0/251439/c1f2ea96-0761-1147-440a-2858804564f8.png)
By JustinForce - 投稿者自身による作品, CC 表示-継承 3.0, https://commons.wikimedia.org/w/index.php?curid=2593317
　これを見ると、PchMOSが並列に、NchMOSが直列に並べられている。
　一般にNchMOSに比して、PchMOSは特性が悪いことはよく知られている。(もちろん、高級なPchMOSのほうが安価なNchMOSより性能はよいだろうからあくまで原則であるが)
 そのため、比較的特性の良いNchMOSを直列に(直列の場合は全体としてのそれぞれの性能が最も悪いものに引っ張られてしまう)、悪いPchMOSを並列にすることで全体の性能を高めようとしているようである。
#余談
バイポーラトランジスタで論理を組んでいたころはNOR回路が基本だったらしい。バイポーラはFETと違って電流が流れないと動作しないため、CMOSみたいな回路は組めなかったという事情があるようだ。
敵（障害物）を追加する

# 概要
[前回の記事](https://qiita.com/ayaseya/items/e233d84dce1df668ad2a)のプロジェクトをベースに敵を追加します。
次回以降にプレイヤーのライフゲージを作成するため、簡単なダメージ処理も同時に追加します。

![Enemy.gif](https://qiita-image-store.s3.amazonaws.com/0/55307/995e8348-0496-1aba-ed1f-dab74ddde1f7.gif)

この環境で追加した内容を以下の通りです。

- 敵（障害物）オブジェクトの追加
- 敵との接触時にプレイヤーのライフを減算する処理
- 敵との接触時にプレイヤーを後方に弾く処理
- 敵との接触時にプレイヤーを白く点滅させ被弾状況を知らせる処理

# 手順
1. 空のゲームオブジェクト（Enemy）を追加
1. Enemy配下にCubeオブジェクト（EnemyObject）を追加<br><img width="255" src="https://qiita-image-store.s3.amazonaws.com/0/55307/cb75c598-b356-6f80-1fda-c8bc4ebef2b2.png">
1. EnemyObjectのRotation、Scaleを変更する<br>
<img width="275" src="https://qiita-image-store.s3.amazonaws.com/0/55307/57f38ee0-e15b-4025-0c75-4c41ebc9319c.png">
1. EnemyObjectにマテリアルを追加し赤色に変更する
1. EnemyObjectにスクリプトを追加する

# ソースコード
```c#:Enemy.cs
public class Enemy : MonoBehaviour
{
	void Update ()
	{
		// 親オブジェクトを取得してY軸回転させる
		GameObject parent = transform.root.gameObject;
		parent.transform.Rotate (new Vector3 (0, 45, 0) * Time.deltaTime);
	}

	void OnTriggerEnter (Collider other)
	{
		// プレイヤーだった場合、ダメージ処理を呼び出す
		if (other.gameObject.CompareTag ("Player"))
		{
			Player player = other.gameObject.GetComponent<Player> ();
			player.TakeDamage (10);
		}
	}
}
```

```c#:Player.cs
public class Player : MonoBehaviour
{
	// 変更がない箇所は省略
	
	Renderer m_Renderer;

	int hp = 100;				// ライフ

	void Awake ()
	{
		m_Renderer = GetComponentInChildren<Renderer> ();
	}

	public void TakeDamage (int damage)
	{
		// ライフ減算
		hp -= damage;

		// プレイヤーの進行方向とは逆に弾く処理
		// 仮の値なので反発係数はマジックナンバーとして許容する
		m_Rigidbody.AddForce (transform.forward * -60f, ForceMode.Impulse);

		// 点滅によるダメージ演出
		StartCoroutine (Blink ());
	}

	private IEnumerator Blink ()
	{
		// 変更前のマテリアルのコピーを保存
		var original = new Material (m_Renderer.material);

		// キーワードの有効化する
		m_Renderer.material.EnableKeyword ("_EMISSION");

		// 白色に光らせる
		m_Renderer.material.SetColor ("_EmissionColor", new Color (1, 1, 1));

		// 0.1秒待機して元の色に戻す
		yield return new WaitForSeconds (0.1f);
		m_Renderer.material = original;
	}
}
```

# まとめ
0.1秒後にプレイヤーの色を白から元の色に戻す処理でコルーチンを使用しています。
Java(≒Android)では標準で用意されていないので、初めて使用しましたが本当に便利ですね。

今回は実装に至っていませんが、以下の拡張の余地を残しています。

- 敵（障害物）オブジェクトの移動処理
- 敵の自動ポップ処理
- 敵の攻撃処理

ソースコードは[GitHub](https://github.com/ayaseya/SimpleTestGround)にアップロードしています。
docker exec のターミナルサイズを補正するワークアラウンド

#はじめに

docker exec するとターミナルサイズが適切に設定されないようです。
取り急ぎ、理由は調べていませんが、ワークアラウンドを用意したのでメモします。

#ちなみに

端末サイズの変更には追従してくれます。最初だけ、です。

#現象の確認

先んじて現象の確認方法を示します。もし現象が再現しないようならワークアラウンドは不要ということです。

###docker run は問題ない

```
$ stty size
24 80
$ docker run --rm -t -i hogehoge bash -l
[inner-prompt]$ stty size
24 80
```

###docker exec だとダメ

```
$ stty size
24 80
$ docker exec -t -i foobar bash -l
[inner-prompt]$ stty size
0 0
```

#ワークアラウンド

今のターミナルサイズを stty を使って能動的にセットします。
ただ手打ちはダルさんなので（半）自動化します。

###自動設定コマンドライン生成スクリプトを用意

```setuptty.sh
#!/bin/sh

val=$(stty size)

rows=$(echo $val | cut -d ' ' -f 1)
cols=$(echo $val | cut -d ' ' -f 2)

echo "stty rows $rows cols $cols"
```

###docker exec を工夫する

```
$ stty size
24 80
$ docker exec -t -i foobar sh -c "$(setuptty.sh); exec bash -l"
[inner-prompt]$ stty size
24 80
```

```
$ stty size
24 80
$ docker-compose exec zervize sh -c "$(setuptty.sh); exec bash -l"
[inner-prompt]$ stty size
24 80
```

私は貧乏性なので ```exec hoge``` してプロセス数を減らします。
"; exec" までスクリプトで echo しても良いのですけれど、構文が汚くなるので我慢します。exec したくないケースもあるかも知れませんし。

#おわりに

個人的にはコンテナに ssh するのが好きなので（他の仮想化と対照的で良い）、あんまり exec bash しないです。
docker-ce for Ubuntu 18.04 早く出ないかなー。
ActiveStorageでアップロードされたファイルのうちブラウザで表示できる画像のみサムネイル表示させる

# はじめに

## 問題点
Rails5.2から追加されたActiveStorageを利用することで手軽にファイルをアップロードすることができるようになったけど、ブラウザで表示できない画像をimgタグを利用して表示してしまうとちょっとかっこ悪い。

![ActiveStorage04.png](https://qiita-image-store.s3.amazonaws.com/0/141934/d9ae0ac8-d990-45ca-0013-5ae0c92968ca.png)

## 解決案

1. ブラウザで表示できる画像ファイルのみアップロード可能にする 
2. ブラウザで表示できる画像ファイルのみサムネイル表示する

# 解決案

## 1. ブラウザで表示できる画像ファイルのみアップロード可能にする

（ActiveStorageとは関係ないけど、）ファイル選択ダイアログで選択可能にさせるファイル拡張子は`accept`タグで指定できる。`accept`タグで指定されてないファイルは選択不可になる。

```erb:app/views/users/_form.html.erb
<div class="field">
  <%= form.label :avatar %>
  <%= form.file_field :avatar, accept: '.jpeg, .jpg, .gif, .png, .bmp' %>
</div>
```

![ActiveStorage01.png](https://qiita-image-store.s3.amazonaws.com/0/141934/8ec35379-5e9c-7bd8-2723-371e7a6c50a2.png)

> 補足：
> acceptタグに`image/*`を指定すると、ブラウザで表示できない画像ファイル(tiffなど)も選択可能になってしまう。

## 2. ブラウザで表示できる画像ファイルのみサムネイル表示する

ActiveStorageを利用してアップロードされたファイル名の末尾を正規表現でチェックして、ブラウザがサポートしている画像ファイルの場合はサムネイル表示する。それ以外の場合はサムネイル表示しない。

```html+erb:app/views/users/show.html.erb
<%# ファイルが添付されてるか？ %>
<% if @user.avatar.attached? %>
  <p>
    <strong>Avatar:</strong>
    <%# ファイル名を表示 %>
    <%= @user.avatar.filename %>

    <%# ファイルがの拡張子がjpeg,jpg,gif,png,bmpか？ %>
    <% if @user.avatar.filename.to_s =~ /\.jpeg$|\.jpg$|\.gif$|\.png$|\.bmp$/ %>
    　　 <p>
       <%# 画像ファイルを表示 %>
       <%= image_tag @user.avatar, height: '100' %>
      </p>
    <% end %>

  </p>
<% end %>
```

![ActiveStorage02.png](https://qiita-image-store.s3.amazonaws.com/0/141934/c04e2f27-006f-60b0-f016-d35b5719f531.png)
![ActiveStorage03.png](https://qiita-image-store.s3.amazonaws.com/0/141934/5575f79e-4147-26f0-8fea-11d8e67a08f8.png)


# 補足

今回の投稿でサムネイルの表示対象にする画像ファイルの拡張子はwikipediaの下記ページを参考にしました。

- [Comparison of web browsers \- Wikipedia](https://en.wikipedia.org/wiki/Comparison_of_web_browsers#Image_format_support)
AdMobの広告をCordovaを使って掲載することができない場合

私は、CordovaでAndroidアプリを作っています。
先日は、有料版でアプリを公開しました。
このアプリに広告を掲載して、無料公開しようと試みています。
ようやく広告を掲載できました。

今回は、このプラグインを使いました。
https://github.com/ratson/cordova-plugin-admob-free

実は、ネットで有名なAdmobの広告を掲載するプラグインとして検索で見つかるcordova-plugin-admobproは、有料版なのです。
今回無料版を見つけましたので、採用しました。
無事に、ビルドできました。

Admobのプラグインは、こちらの無料版を使った方が良いかもしれません。
DNSブロッキングを回避する技術とその仕組み

どうも。先日はNTTがDNSブロッキングを開始したことが大きなニュースになりました。

![k.png](https://qiita-image-store.s3.amazonaws.com/0/154157/cfd1ab72-1194-74db-0acf-d29a736a647f.png)

そこで、今回はエンジニア向けの、DNSブロックに対応するための技術やツール、その仕組みを解説します。
**あくまで海賊版サイトの利用を推奨するものではありません。**

今回のDNSブロッキングでは、単純に国内のDNSサーバーから当該ホストのAレコード返答が帰ってこない種類のものでした。しかし、今後は国外DNSへの通信パケットをフィルタリングされたり、そもそも接続不可にされる可能性があります。
そのため、DNSリクエスト内容を暗号化したり、秘匿化する方法が有効になると考えられます。

# DNS-over-HTTPS, DNS-over-TLS, DNS-crypt

これらは、名前解決を、暗号化されたレイヤーの上で実行したり、DNSの通信自体に暗号化を施したものです。CloudflareやFacebook、有志のDNSが対応しています。

Android、iOS、Windows、Linuxなど、OSを選ばずにクライアントが公開されているので、難しいことをせずにすぐ利用wすることができます。

参考：[Cloudflareが1.1.1.1で超高性能DNS始めたし、いっちょ俺のパソコンもDNS over HTTPSしてみる
](https://qiita.com/onokatio/items/42fb4a2811600680591b)

# DNS-over-Proxy

従来のSOCKSプロキシを使用するDNS名前解決です。これは自力でサーバーを構築する必要がありますが、サーバー自体は普通のProxyサーバーで済むことができます。

SOCKS Proxyよりも強固な暗号化・秘匿化を求める場合には、ShadowSocksと呼ばれる技術があります。ShadowSocksは中国のグレートファイアウォールを回避するために作られたプロトコルで、JSONを使った軽量・高速な通信ができるとのことです。

# VPN

VPNは最も有名なブロッキング回避技術です。OpenVPNやIPsecなどがありますが、一番高性能なものはSoftEtherVPNです。通称VPN-over-HTTPSと呼ばれる、L2接続をHTTPS接続の上で使用できる（偽装できる）通信方式に対応しています。
その他にも、VPN-over-ICMPと呼ばれるPing通信の上にVPNを構築するもの、VPN-over-DNSと呼ばれるDNS通信の上にVPNを構築できるものなど、強固な通信方式をサポートしています。

# フルリゾルバの構築

これは、8.8.8.8や1.1.1.1などの、自身がキャッシュとなり、世界中のルートサーバー、権威サーバーへDNS問い合わせをするDNSサーバーです。上位サーバーなどが存在せず、本来の名前解決を提供しているサーバーへ問い合わせに行くため、ブロック対象になりません。

# OpenNIC

https://www.opennic.org/

OpenNICは、世界に13種類あるルートサーバーを勝手に増やして、自分たちで新しいトップレベルドメインを運営するプロジェクトです。ルートサーバーや、キャッシュサーバーが存在するため、設定するだけで使用できます。

# Namecoin

Namecoinは、DNS情報をブロックチェーンで管理するプロジェクトです。すでにあるドメインを登録することはできず、新しく「*.bit」ドメインを登録することになります。
P2Pで接続できるため、ブロッキングされた時用にサービス側が取得しておくのがいいかもしれません。

似たようなものに、Torのhidden service（.onionドメインが分散ハッシュテーブルで管理される）やI2Pのドメイン（hostsファイルを手動で共有する）、freenetが存在します。

#
pugの変数なんかをコンソールに表示して、デバッグする方法

sassの`@debug`的なことをpugでやりたかった時に、ちょっと迷ったので、メモ

pugでは変数やeach文などが色々と使えて便利だが、
複雑なものを書いていくとエラーが起こった時、なんでエラー…？
ってなることがある。
そんな時、
`- var test = "hoge"`
`- console.log(test)`
的な感じでやると
コンソールに
`hoge`
と出る。

まぁJSでコンパイルされているので、当たり前なんだけど…
Tableauのシートでできることまとめ※とりあえずTableau Desktopを試してみたい人向け

## ディメンションとメジャーについて

### ディメンション

「日付」や「文字列」といった型のデータがこっちに表示される。
行列の見出しとして利用したり、「メジャー > カウント」などで件数を数えたりに利用する

### メジャー

「数値」系がこっち。
集約関数(SUMとか)が使える。

それぞれ項目を「右クリック > メジャー(ディメンション)に変換」で切り替えることが可能

## 計算フィールドについて

https://onlinehelp.tableau.com/current/pro/desktop/ja-jp/calculations_calculatedfields.html

エクセルの関数のようなものを用意できる。
用意した計算フィールドは「メジャー」内に表示され、他の項目と同じように使用することができる。

ディメンションやメジャーの空きスペースで「右クリック > 計算フィールドの作成」
もしくは画面上部の「分析(A) > 計算フィールドの作成」

![1.png](https://qiita-image-store.s3.amazonaws.com/0/45170/98a0a85a-59ee-8161-13f6-7396f1b440c6.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/45170/96e2d286-1da1-739f-a0c0-762ddeae259e.png)



## パラメータについて

https://onlinehelp.tableau.com/current/pro/desktop/ja-jp/parameters_create.html

ユーザ(TableauServerとかでダッシュボードを見る人)が、好きに値を変えられるもの。
作成したパラメータを計算フィールドで利用して、集計結果に反映されるように作成する。

ディメンションやメジャーの空きスペースで「右クリック > パラメータの作成」
作成したパラメータが「メジャー」の下に表示されるので、そのパラメータを「右クリック > パラメータコントロールの表示」
画面右に表示されるので、ユーザはこの値を変更することで計算結果を可変させることができる

例)
パラメータ名：消費税
値：8%
計算フィールド名：売上(税込)
値：[売上]*[消費税]
→ユーザが消費税を変更すると、その消費税で計算した結果が表示される


## ビン(bin)について

https://onlinehelp.tableau.com/current/pro/desktop/ja-jp/calculations_bins.html

データのビニングのこと。
特定の値の範囲で表を作れる

メジャーの項目を「右クリック > 作成 > ビン」
ディメンションに項目名(ビン)というのが作成されるので、列や行にドラッグすると、
値ごとの数値で表を作成してくれる。


## 合計値から構成比を出したい

分析 > パーセンテージ > 行
※もしくはマークにドラッグしたメジャーを右クリック > 簡易表計算 > 合計に対する割合

で、その行の構成比を表示させることができる。

ただ構成比のみの表示になるので、値も出したければ
計算フィールドで同じ値を作成(customer_id(構成比用))
大本(custmer_id)はそのままでラベル
customer_id(構成比用)は上記で構成比表示にしてラベル
で2つを表示させることができる
Python 3.6でWebスクレイピングしてみました

Python3.6で「Beautiful Soup」と「Requests」の2つのライブラリを利用して
「[日本経済新聞](https://www.nikkei.com/)」のHPから「日経平均株価」を取得してみました。

#環境
Windows10(64bit)
Internet Explorer11
Python 3.6.4
pip 10.0.1

#使用するライブラリ
[Beautiful Soup](http://kondou.com/BS4/)
[Requests](http://requests-docs-ja.readthedocs.io/en/latest/)

#ライブラリインストール
```
pip install BeautifulSoup4
pip install Requests
```

#インストールの確認
```
Package        Version
-------------- ---------
beautifulsoup4 4.6.0
requests       2.18.4
```

#取得したい対象の確認
「[日本経済新聞](https://www.nikkei.com/)」のHPを開きます。

![nikkei_top.png](https://qiita-image-store.s3.amazonaws.com/0/253651/b1be396a-96b5-c769-ed7f-28c3ea908c48.png)

トップページの上に「日経平均」を確認できます。
Internet Explorerで「日経平均」のところで右クリックし「要素の検査」をクリックします。
すると「開発者ツール」が立ち上がり、今回取得したい対象が
span要素でClass="m-miH01C_rate"となっていることが分かります。

![heikinkabuka.png](https://qiita-image-store.s3.amazonaws.com/0/253651/15c9594b-f453-5d82-6037-e7bc1b9ca418.png)

#必要な処理の確認
①ライブラリのインポート
②requestsを利用してHTMLを取得
③取得したHTMLからBeautifulSoup4を利用してHTMLパースを取得
④取得したHTMLパースから「span」要素を取得する。
⑤「span」要素の中のclass「m-miH01C_rate」を取得する。

#コーディング
```kabuka.py
#日経平均平均株価
nikkei_heikin = ""

#①インポートします。
import requests
from bs4 import BeautifulSoup

#②HTMLを取得します。
url = 'https://www.nikkei.com/'
html = requests.get(url)

#③HTMLパース用のオブジェクトを作成します。
soup = BeautifulSoup(html.text,"html.parser")

#④「span」要素全て抽出します。
span = soup.find_all("span")

#⑤「span」要素をループします。
for tag in span:
	try:
		#⑥「span」要素から「class」をpopしていきます。
		string_ = tag.get("class").pop(0)
		#⑦摘出したclassの文字列にm-miH01C_rateが設定されているかチェックします。
		if string_ in "m-miH01C_rate":
			#⑧tagの文字列(日経平均株価)を取得します。
			nikkei_heikin = tag.string
			#⑨ループ処理を中断します。
			break
	except:
		#⑥'「span」要素から「class」をpopできなかった場合何もしません。
		pass

#⓾取得した日経平均株価を出力します。
print(nikkei_heikin)
```
#実行
```
C:\>python kabuka.py
22,467.87
```

「日経平均株価」を取得することができました。
Win10 英語配列 + SKK．

# Windows で 英語（米国）+ SKK を利用できるかもしれない方法．
## やりたい事
- 日本語配列のキーボードを英語配列に変更し，さらにそこから[SKK日本語入力FEP](http://coexe.web.fc2.com/skkfep.html)を利用したい．
- なおかつ日本語配列 + 日本語IME は残しておいて，直ぐに切り替えられるようにしたい．
- 具体的にはこんな感じ↓  
  ![やりたい事.png](https://qiita-image-store.s3.amazonaws.com/0/116312/26c11d78-2611-274c-6ff6-f10bfb79105a.png)

## 注意事項
- 毎度のことですが、自己責任でお願い致します．
- Win 7 Pro と Win 10 Home で試して成功したことはあるのですが、他の環境でも同じ方法が通用するかは分かりません．

## やる事
1. [SKK日本語入力FEP](http://coexe.web.fc2.com/skkfep.html)をインストール．
1. レジストリエディタで，
  レジストリ
  `コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\TIP\{C0DEDEC0-0000-0000-0000-534B4B464550}\LanguageProfile` 以下の，
  `LanguageProfile\0x00000411\{C0DEDEC0-0000-0000-0001-534B4B464550}` にある内容全てを，
  `LanguageProfile\0x00000409\{C0DEDEC0-0000-0000-0001-534B4B464550}` に作成＆コピーします．  
  以下の写真のような感じです．  
    - コピー元  
    ![レジストリその1.png](https://qiita-image-store.s3.amazonaws.com/0/116312/264f3c9a-cab7-0a43-80a8-ece5811508e3.png)
    - コピー先  
    ![レジストリその2.png](https://qiita-image-store.s3.amazonaws.com/0/116312/26f23896-4c06-4bd3-46ed-499b9a62089e.png)

1. 最後にログアウトor再起動し ログインすると，`[Win] + [Space]`キー（Win 10）で切り替えができてるかも．

できていたら完了です．お付き合いありがとうございました．  

Win XPの時代に，この方法が書かれているサイトがあったのですが、最近調べ直してみると見つけきれなくなってしまったので，備忘録も兼ねてこの記事を書きました．他にも方法がありましたら教えてください．
管理者権限を使わずにサーバに好きなコマンドを簡単にインストールできるようにするLinuxbrew

# Linuxbrewを使おう!

## 本記事の目的

管理者権限をもたないアカウントでサーバにさまざまなコマンドをインストールし使いやすくする

## まえがき

Linuxbrewは管理者権限なしでインストールすることができるパッケージマネージャだ!
http://linuxbrew.sh/

これを使うことで管理者権限を付与されていないアカウントでも、サーバにいろいろなコマンドをインストールできる。

でははじめよう!

## Linuxbrewのダウンロードと設定

### 環境変数をいじる

下記はtcshを使う場合である
bashを使っている場合は http://linuxbrew.sh/ に設定方法が書いてあるのでそちらを参考に設定してください。 　
下記を~/.tcshrcに書き込む
プロキシも設定しておく(optional)

```
# Linuxbrew
setenv PATH $HOME/.linuxbrew/bin:$PATH
setenv MANPATH $HOME/.linuxbrew/share/man
setenv INFOPATH $HOME/.linuxbrew/share/info

# SET PROXY
setenv http_proxy "your.proxy.com:8080"
setenv https_proxy "your.proxy.com:8080"
setenv ftp_proxy "your.proxy.com:8080"
setenv HTTP_PROXY "your.proxy.com:8080"
setenv HTTPS_PROXY "your.proxy.com:8080"
setenv FTP_PROXY "your.proxy.com:8080"
```

設定させた環境変数を反映させるために、
source ~/.tcshrcとするか、一度ログアウトして再ログインする。

### ダウンロード

```
$ git clone https://github.com/Linuxbrew/brew.git ~/.linuxbrew
```

### 確認
下記のように表示されればOK

```
$ brew doctor
Your system is ready to brew.
```

## さっそく使ってみる!

これで好きなコマンドをインストールできるようになった。

```
$ brew install pyenv tmux go htop coreutils
```

Vimは下記コマンドでインストールするのがおすすめだ。

```
$ brew install vim --with-lua
```

## おまけ　お掃除
ダウンロードしたソースコード等を除去する

```
$ brew cleanup
```

# まとめ

Linuxbrewを使えば、
- 面倒な依存解決が楽になる
- 管理者権限なしでいろいろなソフトをインストールできる
- たまに使えないパッケージがあるため注意が必要