OmniAICreator/Qiita-1.07M huggingface dataset:
アプリ内で、外部リンクを張る方法

![wfc20161109013.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/e315dcea-113b-2e17-3c54-cfe475d526cc.jpeg)

SaaSForceでの内部リンクについては別の記事を見てください。

http://qiita.com/nekoatama/items/74df01547013475f2cd5

実は、この内部リンクを張る方法を少し変えれば外部リンクもはることができるのですが、それ以外の方法を今日はお見せしたいと思います。

それは、事前に「画面デザイン」の画面を使う前に登録作業をするやり方です。

｢便利リンク登録｣と言う画面を開き、検索条件を押すと、｢検索画面｣と言うものが出てきます。

ここで、｢新規」を押すと次の画面に切り替わります。

![wfc20161109014.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/165b1fb7-c5d2-6dbb-405f-f53947f0cf8a.jpeg)

ここで、必須のリンク名などを入力しURLをコピペで貼り付け、遷移元リンクを指定し、「外部URL」のラジオボックスを確認します。

通常、何もしないと「外部URL｣になっています。

![wfc20161109015.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/fd6a30bb-feb8-50b4-cc48-faff0855d35f.jpeg)

本当は、潮見表を表示しているホームページへリンクさせたかったのですが、リンクフリーかどうか見ていないので、今回はSaaSForceのホームページを利用させていただきました。

なお、気象庁の潮見表が掲載されているホームページはうまくリンクできませんでした。

![wfc20161109016.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/830d13d9-e23d-27dd-53ab-a496fcfcf1b6.jpeg)

登録と言う緑色のボタンを押すとこのような画面になり、完了です。

![wfc20161109017.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/31f12fcd-b878-3513-e016-d40019cdfd40.jpeg)

『画面項目定義』の作業を終えて、画面デザインの画面を開きます。

この作業も別の記事をご一読ください。

そして、アイコンを押してリンクのパーツを作り、右クリックでハイパーリンクを選択します。

ここで、｢リンク｣のところのドロップダウンリストが出ない場合は、設定のミスの可能性があります。

![wfc20161109018.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/c63340c0-8457-0a3e-ec69-0a09c410136e.jpeg)

この設定を忘れていると、ドロップダウンリストに表示されません、何も。

![wfc20161109019.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/debbee73-85c8-9ed9-25ce-930a01c20615.jpeg)

これを保存して、それから画面自体を保存して、それで作業は終わりです。

最後にテストサーバーで、実際のリンクを確認します。
Rails5でmodelやcontrollerの修正が反映されないやつ

## 環境
`docker for mac`
`rails5.0`
`Debian GNU/Linux 8`
`development`モード

## 困ったこと
modelやcontrollerの修正が反映されない。
Viewはすぐに反映される。

## 解決法１
`rails restart`したりコンテナを再起動すれば反映される
（面倒くさ）

## 解決法2
`development.rb`に以下を追加

```
  config.cache_classes = false
  config.reload_classes_only_on_change = false
```

## 結果
すぐに反映されるようになった。わーいヾ( ﾟдﾟ)人( ﾟдﾟ)ﾉﾞ
ラズパイに LCD をつける苦闘

RaspberryPi3 に https://amazon.co.jp/dp/B01LXM8NL4/ref=cm_sw_r_cp_ep_dp_6FMlzb8FXF410 の LCD ディスプレイをつけるまでの道のりです。
_私の環境でこれでうまく行ったという記録でしかありませんので、下記を行って出た損害に対して責任は負いません。自己責任でお願い致します。_

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61079/262b30d7-cac2-566d-0e69-162087e6c70d.png)


## ハマりどころ
- NOOBS 経由でインストールした OS では使えない
- ドライバインストールスクリプトを少しいじる必要がある

# セットアップ
## OS インストール
まず、 NOOBS を**使わず** OS をインストールしてください。
NOOBS とは、ラズパイに簡単に諸々の OS をインストールすることができるツールです。

### 1. img のダウンロード
https://www.raspberrypi.org/downloads/raspbian/ から　`RASPBIAN JESSIE WITH PIXEL` の zip をダウンロード。
mac で適当に解凍します。


### 2. img を SD カードに書き込む
参考にした情報： 

- http://qiita.com/ttyokoyama/items/7afe6404fd8d3e910d09
- http://ledsun.hatenablog.com/entry/2014/10/26/174712

SD を PC (Mac) に挿入し以下の手順

```zsh
# ストレージ一覧を見る
diskutil list

# SD カードと思しきもの（SD カードを突っ込むと増えるやつ。 external になってるやつ）の /dev/.. を調べておく。
# ここでは disk2 とする。これ間違えてると大惨事になるので注意。
# アンマウント
sudo diskutil unmountDisk /dev/disk2

# 書き込み (/dev/**r**disk2 といったように r をつけると早くなるらしいです)
sudo dd bs=1m if=/Users/harumitsu.nobuta/tmp/2017-04-10-raspbian-jessie.img of=/dev/rdisk2

# 進捗は Ctrl + T を叩くと表示できます。
```

SD をラズパイに刺して起動します。

## raspi-config の変更
以下は http://www.waveshare.com/wiki/3.5inch_RPi_LCD_(A) が元ドキュメントです。

```zsh
sudo raspi-config
```
としてコンフィグ画面を開きます。以下二点行います。

- Advanced Options -> Expand Filesystem
- Boot Options -> Desktop / CLI -> Desktop Autologin

## ドライバインストール
LCD を接続して以下を行います。
ドライバインストールで OS が起動しなくなることがおうおうにしてあるので、バックアップを取って行いましょう。

```zsh
# 最新版は上の元ドキュメントを参照してね。
wget http://www.waveshare.com/w/upload/7/74/LCD-show-170309.tar.gz
tar xzvf LCD-show-170309.tar.gz 
cd LCD-show/
chmod +x LCD35-show

# 後述する起動しなくなる問題を解決します
sed -i -e "s/^dtoverlay=ads7846/#dtoverlay=ads7846/" ./boot/config-35.txt*

# インストールと同時に再起動し LCD ディスプレイに切り替わります
./LCD35-show
```

**はまりどころ**： sed で置換をしているコマンドは、元ドキュメントの

> Note: this LCD won't work after apt-get upgrade, in such cases, please edit the config.txt file in the SD card and remove this statement: `dtoverlay=ads7846`

に対応します。 ./LCD-show を叩く度に config.txt が上書きされてしまい起動しなくなってしまうため、元の設定ファイルを修正しておきます。

これで OS が再起動して LCD が表示されれば成功です。

# LCD / HDMI の切り替え
切り替えは再起動をともないます。
## HDMI にする
```zsh
cd LCD-show/
./LCD-hdmi
```

## LCD にする
```zsh
cd LCD-show/
./LCD35-show
```

# トラブルシューティング
## 起動時まっくろな画面＋入力中のカーソルのみが表示され起動しない
SD カードを別の PC につけて、 `config.txt` を変更します。
`dtoverlay=ads7846` から始まる一行の先頭に `#` をつけてまるっとコメントアウトしてください。
（既にコメントアウトされていれば別の原因です）

## 起動時カーネルパニック
NOOBS 経由でインストールしたものにこのドライバをあてるとカーネルパニックで起動しなくなります。
NOOBS をつかわず OS をいれてください。
SaaSForceでテーブル項目定義をするときの、失敗しないやり方

![wfc20161109011.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/beb00df4-6849-6106-6ba7-ec9ac51d68ff.jpeg)


実は、SaaSForceを使い始めて間もない頃は、かなり悪戦苦闘をして、失敗して、理想通りには行かずにアプリを削除することがよくありました。

数多くの失敗の経験を踏まえて、ここでそれほど失敗しないための安全策を記録しておきたいと思います。

１．主キーは必ず作る、でも　｢デフォルト表示形式｣から「６．採番項目｣を選び、無意味なパーツにしておく。

こうすることで、対象について別の時点による情報を追加ができます。

なお、それほど変わらない物、変化のおきない物はこれをしなくても大丈夫と思います。

２．数字を入力するときでも、「データ型」で極力｢整数｣ではなく｢文字列」を選んだほうが無難。小数点が付く物など整数では無理だから。

また、余談ですが、「採番項目」を主キーとした場合、一番下に持っていくのがお勧めです。

![wfc20161109012.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/739f1fd9-f73b-5cb9-f30c-901820db4f43.jpeg)

こうしておくと、その後のパーツの並べ替えがとても楽になるので、手間が省けるとともに、このパーツ自体を｢非表示｣にすることで画面の余計な物を見えなくすることができます。
画像アップロード CarrierWaveを使ったmodelのRSpecを通す

備忘録です。
今までActionDispatchを使ってRSpecで画像アップロードのテストを行っていたのですが、今回はCarrierWaveを使っていたのでmodelを通さなければいけない、createアクションで画像アップロードのテストをしたいと思ったので、試しにやってみました。  

書き方はGitHubのwikiにありましたのでこちらを参考にしました。
URL: https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Use-test-factories

## 動作環境
* Mac OSX EI Capitan 10.11.6
* Ruby 2.3.4
* Rails 5.1.1

## FactoryGirl上で用意する

まずはbookモデルに対してFactoryで画像を用意する場合です。   
 
こちらは参考にしたGitHubと同じ書き方です。  

```spec/factory/book.rb
FactoryGirl.define do
  factory :book, class: Book do
    id '1'
    title 'たのしいRuby'
    content 'ここが内容です'
    image Rack::Test::UploadedFile.new(File.join(Rails.root, 'spec/fixtures/image.jpg'))
    created_at '2016-01-01T00:00:00Z'
    updated_at '2016-01-02T00:00:00Z'
  end
end
```
`spec/fixture`配下の画像ファイルを用意している前提です。ここでは`image.jpg`を読み込んでいます。  

作成した上記のfactoryをspec上で呼び出せばCarrierWaveで用意したImageUploaderモデルのカバレッジは通ると思います(未検証)。

## spec上で用意する
specのcreateアクションに対して用意する場合です。  

createなので基本的にはfactoryを用いずに直打ちでletを用意して行きます。  

```spec/book_spec.rb
describe 'POST create' do
  let(:image_path) { File.join(Rails.root, 'spec/fixtures/image.jpg') }
  let(:image) { Rack::Test::UploadedFile.new(image_path) }
  .
  .

  before do
    post :create, params: {
      book: {
        .
        .
        image: image
      }
    }
  end
.
.
.
```

こんな感じでいけます。

`before`以下は別として遅延評価`let`で用意するところだけを見れば良いです。  

createする際に`let`で用意したimageを渡してあげればImageUploaderのカバレッジは通ります。  

spec上で書いた場合はカバレッジ計測確認済です。  

困った方はぜひ試してみてください。

ではでは。
三角関数を使ってクリスマスツリー風のエフェクトをつくる

　
三角関数を習ったとき、こんなの人生のどこで使うんだよ！！！って思った方多いと思います。
なので今日は三角関数を使ってクリスマスツリー風のエフェクトを作ってみましょう。 

#まずはこんな感じの円運動を作ります

![01.gif](https://qiita-image-store.s3.amazonaws.com/0/110326/db6073eb-9072-eeb3-0875-9b3106e11bb6.gif)



Y軸は半径を半分にすれば楕円になります。

```as3
// 毎フレーム行われる処理
this.x = Math.cos(_angle) * _radius;
this.y = Math.sin(_angle) * (_radius / 2);
_angle += _speed;
```

#半径を段々小さくしながら、Y座標は段々上に行くようにする

![02.gif](https://qiita-image-store.s3.amazonaws.com/0/110326/d902a3ee-ca41-36b6-496c-cae75dbf5faf.gif)

#開始の角度をずらして4つ用意する
![03.gif](https://qiita-image-store.s3.amazonaws.com/0/110326/8f1b2121-10dc-a973-e71d-e573c4a8f62b.gif)


これをパーティクルのemitter（発生装置）として使うとXmasツリーみたいなエフェクトが作れます！


#完成例
![04_1.gif](https://qiita-image-store.s3.amazonaws.com/0/110326/180ae807-0424-2f89-5527-e872198a12d5.gif)

さらに色をXmasカラーにする

![05_1.gif](https://qiita-image-store.s3.amazonaws.com/0/110326/661b9914-7b46-bf8d-33e5-aaee9f018733.gif)
Ruby で任意の異なるクラスのオブジェクトを #uniq するときの注意

[ブログ記事](http://secret-garden.hatenablog.com/entry/2017/06/13/115836)からの転載です。

## 元ネタ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Rubyむずい…うむむむむむむむうむ<br>[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ <a href="https://t.co/buooxLKDHW">https://t.co/buooxLKDHW</a></p>&mdash; 異常者 (@h1manoa) <a href="https://twitter.com/h1manoa/status/872729931603517440">2017年6月8日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

と、いうことでちょっとやってみたら見事にハマったので覚書

## 元のコード

```ruby
class Hoge
    def initialize(num)
        @num = num
    end
    def ==(other)
        if @num == other
            true
        else
            false
        end
    end
end

p [Hoge.new(1), Hoge.new(2), 1, 2, 5 ,6].uniq
# => [#<Hoge:0x000000024871f8 @num=1>, #<Hoge:0x000000024871d0 @num=2>, 1, 2, 5, 6]
```

元のコードはユーザ定義クラスと `Integer` が入り混じった配列をいい感じに `#uniq` したいという内容でした。

## `#uniq` の条件

`#uniq` は要素の `Object#eql?` を使用して重複を判定します。
また、 `#eql?` を定義した場合は `Object#hash` も再定義する必要があります。
と、いうことでこれに沿って修正してみました。

```ruby
class Hoge
    def initialize(num)
        @num = num
    end

    def hash
        @num.hash
    end

    def eql?(other)
        if @num == other
            true
        else
            false
        end
    end
end

p [Hoge.new(1), Hoge.new(2), 1, 2, 5 ,6].uniq
# => [#<Hoge:0x000000024871f8 @num=1>, #<Hoge:0x000000024871d0 @num=2>, 1, 2, 5, 6]
```

しかし、これでもまだ意図した動作になりません。

## `#hash` と `#eql?` は双方向で `true` になる必要がある

調べていたらわかったんですが

```ruby
Hoge.new(1).eql? 1 # => true
```

だけではなくて

```ruby
1.eql? Hoge.new(1).eql? # => true
```

のように双方向で `true` になる必要があるみたいです（当然 `#hash` に関しても同様

## 完成

と、言うことで `Integer#eql?` を拡張することで無事に意図する動作になりました。

```ruby
class Hoge
    def initialize(num)
        @num = num
    end

    def hash
        @num.hash
    end

    def eql?(other)
        if @num == other
            true
        else
            false
        end
    end
end

class Integer
	def eql?(other)
		return super(other) unless Hoge === other
		other.eql? self
	end
end

_1 = Hoge.new(1)

# この条件をすべて満たす必要がある
p _1.hash == 1.hash
p _1.eql? 1
p 1.hash == _1.hash
p 1.eql? _1

p [Hoge.new(1), Hoge.new(2), 1, 2, 5 ,6].uniq
# => [#<Hoge:0x000000024871f8 @num=1>, #<Hoge:0x000000024871d0 @num=2>, 5, 6]
```

流石に `#uniq` のためだけに `Integer` をクラス拡張するのはツラいですね…。


## まとめ

* `#uniq` は `#eql?` を参照して重複のチェックを行う
* `#eql?` を書き換えた場合は `#hash` も書き換える必要がある
* `#uniq` は双方向でチェックするので要素すべてのオブジェクトに対して `#eql?` を考慮する必要がある
Rails + Materialize でCollapsibleの不具合を直した

## Rails + Materializeで不具合が起きた

Materializeの `collapsible` を使っていたのですが、
たまに開閉ができなくなる（開いても勝手にすぐ閉じて開けない）不具合が起きました。

## 解決

scriptタグを`<body>`の一番下から`<head>`に移動させた。

これ⬇︎

```
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
```

## 原因
おそらく`Rails`の`Turbolinks`が絡んでいたんだと思う。。

## 参考
[Turbolinksをオフしないためにやった事](http://qiita.com/saboyutaka/items/bcc0966313c6f7399a6e)
TensorFlow（v1.1.0）を立ち上げるたびに出てくるワーニングをなんとかする


Macの場合であれば`~/.bash_profile`に以下の一行を追加でOKです。

```bash:
export TF_CPP_MIN_LOG_LEVEL=2
```

Pythonスクリプトに以下のコードを埋め込んでもOKです。

```python:
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
```

TensorFlow（v1.1.0）を立ち上げるたびに以下のようなワーニングが出てきて目が潰れそうになってましたが、この方法でなんとかなりましたとさ。

```bash:
2017-06-14 10:09:04.651948: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2017-06-14 10:09:04.651968: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2017-06-14 10:09:04.651972: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2017-06-14 10:09:04.651976: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
2017-06-14 10:09:04.651979: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
```

参考資料: https://github.com/tensorflow/tensorflow/issues/7778
Liferay 7 / DXP ポートレット自動生成ツール、Damascus


# Damascusとは？
[Damascus(ダマスカス）](https://github.com/yasuflatland-lf/damascus)は、設定ファイルをベースに、Liferay DXP / 7.0用のCRUD機能を備えたポートレットを自動生成するツールです。これによりCRUD以外にも、以下の機能を自動生成してくれるので、開発時間の短縮に役立つツールです。

コード
https://github.com/yasuflatland-lf/damascus

ドキュメント
https://damascusweb.wedeploy.io/

Ruby on Rails, CakePHPなどの多言語のWebフレームワークでは、簡単なコマンドでCRUD機能を備えたスケルトンを生成する機能があります。Liferayは権限管理から検索、ワークフローなどをフレームワークが提供していますが、それを実際に自作するポートレットにどう組み込むかなどは、Liferayに詳しくないユーザーにとっては実装に時間がかかり、Liferay経験豊かなユーザーにとっても、繰り返し同じことを実装する時間がかかります。

実際自分がLiferayを使って仕事をしていく中で、他のSIerさんたちも直面していた問題を解決することを目指しています。

# 自動生成する機能
* CRUD機能
    * CRUD用のモデル操作用API (*LocalService)と、入力・編集画面(jsp)
    * ドキュメント＆ライブラリにデータを保存するためのフィールドも生成。
* ワークフロー
* ゴミ箱
* 検索(Indexer自動生成）
* コメント機能
* 関連するアセット
* レーティング
* アクティビティ（アクティビティポートレットに表示される内容の制御)
* 複数モデルに対して一括でポートレット・サービスを生成


# 環境要件
* JDK 1.8 以上
* Gradle 3.0以上がインストールされていること
* JPMがインストールされていること（以下のインストール手順でインストール方法を説明)

#インストール方法

**Mac**
```bash
curl https://raw.githubusercontent.com/yasuflatland-lf/damascus/master/installers/global | sudo sh
```

**Windows**
1. [JPM](https://raw.githubusercontent.com/jpm4j/jpm4j.installers/master/dist/jpm-setup.exe) をインストール
2. 以下のようにJPMを利用して、```damascus.jar``` をインストール。 ```jpm install https://github.com/yasuflatland-lf/damascus/raw/master/latest/damascus.jar```

# 使い方
ここでは簡単に、Damascusを使ってTodoポートレットを作成してみましょう。
1. Liferay IDE / Developer Studioか、Bladeツールを利用して、Liferay Workspaceを作成してください。Liferay Workspaceの作成方法、Bladeツールなどのツールの使い方は以下を参照してください。
https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/blade-cli
2. Liferay workspaceを作成した後、```modules``` フォルダに移動し、 ```damascus -init Todo -p com.liferay.sb.test -v 70```を実行してください。
3. すると```Todo``` フォルダが生成されるので、```Todo```フォルダに移動すると、設定ファイルの```base.json```が生成されています。詳細な設定方法に関しては、https://github.com/yasuflatland-lf/damascus/wiki
を確認してください。ここではデフォルトのままで進めます。
4. ```Todo```フォルダ内で、 ```damascus -create``` を実行します。すると*-service、*-api、*-webが自動生成されます。
5. Liferayサーバーを起動し、```Todo```フォルダ内で```blade deploy```を実行すると、立ちあがったLiferayサーバーに対してデプロイされ、管理者でログイン後、右ペインから```Todo-portlet```が配置できるようになります。

詳細な設定ファイルの設定方法や、使い方は[公式サイト](https://github.com/yasuflatland-lf/damascus)と[公式サイトのWiki](https://github.com/yasuflatland-lf/damascus/wiki)を参照してください。
postgresでEncodingがEUC_JPのデータベースを作る

どうも過去に何回もやったことがあるようだが忘れていていつも調べ直しているのでメモ。

postgresのバージョンが上がったからなのかもしれない。
シェルから

```
createdb -E EUC_JP my_db
```

というようにやると

```
createdb: database creation failed: ERROR:  encoding "EUC_JP" does not match locale "ja_JP.UTF-8"
DETAIL:  The chosen LC_CTYPE setting requires encoding "UTF8".
```

というように怒られる。

なので一旦psqlで入って、

```
psql
Password:
psql (9.6.3, server 9.4.1)
Type "help" for help.

myname=# CREATE DATABASE "my_db" WITH TEMPLATE="template0" ENCODING='EUC_JP' LC_COLLATE='C' LC_CTYPE='C';
```

とするといい。

参考：

http://wsjp.blogspot.jp/2012/04/postgresqlinitdbdb.html
macを購入してやったこと

### セットアップ手順

毎回めんどかったので簡単にできるようスクリプトを作成

* xcodeをapp storeからダウンロード
* あとは以下のsetup_osx.shファイルを作成して、コマンドを実行する。
* 参考にしたところではxcodeのinstallもこのファイルに含んでいる
* brewのところはbrew-bundleでもできるみたいだが、今回は省略。

```zsh:shell
chmod +x setup_osx.sh
./setup_osx.sh
```


```zsh:setup_osx.sh
#!/bin/bash

### special thanks...
### @see http://qiita.com/kibitan/items/d564248eeaebbf003edc
### execute this command
### chmod +x setup_osx.sh
### ./setup_osx.sh

ask() {
  printf "$* [y/n] "
  local answer
  read answer

  case $answer in
    "yes" ) return 0 ;;
    "y" )   return 0 ;;
    * )     return 1 ;;
  esac
}

set -e

## install brew
if ask 'Homebrew install?'; then
  ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  brew doctor
  brew install caskroom/cask/brew-cask
fi

if ask 'git install?'; then
  brew doctor
  brew update
  brew install git
fi

if ask 'tig install?'; then
  brew install tig
fi

if ask 'Alfred install?'; then
  brew cask install alfred
fi

if ask 'clipy install?'; then
  brew cask install clipy
fi

## mac setting
if ask "set 'locate' command?"; then
  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
fi

if ask 'set visible dotfiles in finder?'; then
  defaults write com.apple.finder AppleShowAllFiles TRUE
  killall Finder
fi

if ask 'set fullpath title at finder?'; then
  defaults write com.apple.finder _FXShowPosixPathInTitle -bool yes
  killall Finder
fi

if ask 'set always expand save dialog?'; then
  defaults write -g NSNavPanelExpandedStateForSaveMode -bool yes
fi

if ask 'set mute in mac booting sound?'; then
  sudo nvram SystemAudioVolume=%80
fi

# @see https://discussionsjapan.apple.com/thread/10153604
if ask 'set clamshell mode off? (for multi display sleep)'; then
  sudo nvram boot-args="niog=1"
fi

printf 'All setup is finished'
```

### special thanks!

こちらを参考にさせていただきました！
http://qiita.com/kibitan/items/d564248eeaebbf003edc

xcodeもコマンドから入れることができたらしい！
undefinundefined method `　' forの解決法

```ruby:環境
rails5.0
```
###エラーの内容
  上から三行目の @notification = current_user.notifications.build(notification_params)の所にundefinundefined method `　　' forが出る。


```ruby:notifications_controller.rb
  class NotificationsController < ApplicationController

  
  def create
    @notification = current_user.notifications.build(notification_params)
    
   if @notification.save
      redirect_to root_path, notice:"通知しました"
    else
       redirect_to new_book_path(@book), notice:"通知してない"
    end
  end

  private

  def notification_params
    params.require(:notification).permit(:book_id)
  end  
end
 
```



### エラーの原因
　インデントが悪いために、@notification = current_user.notifications.build(notification_params)が認識できていない。


三行目の@notification = current_user.notifications.build(notification_params)を消しても、undefinundefined method `　　' for同じエラーが出る。

```ruby:notifications_controller.rb
  class NotificationsController < ApplicationController

  
  def create
    
   if @notification.save
      redirect_to root_path, notice:"通知しました"
    else
       redirect_to new_book_path(@book), notice:"通知してない"
    end
  end

  private

  def notification_params
    params.require(:notification).permit(:book_id)
  end  
end
 
```

##解決法
インデントをしっかりきれいに書く

##感想
自分は、このエラーで４時間詰まったので、大変だった。
Unity5のインスペクタ＆エディタのカスタマイズ

Unityで使いやすいように色々**インスペクタ**を触るのですが、
毎回良く忘れるのでメモしていきます！

## inspectorにヘッダーを追加

### これ→``` [Header("表示文言")] ``` (日本語だと太文字がわかりずらいかも)

```GameManager.cs

public partial class GameManager : MonoBehaviour 
{
	[Header("DEBUG MENU")]
	public bool debugMode = false;
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/88b08d64-ef7c-2868-2491-bcea624a794c.png)

※ DEBUG MENUというヘッダー項目が追加されます。

## 少しスペースをあける

### これ→``` [Space(10)] ```

```GameManager.cs

[Space(10)]
public GameObject stageLoadPoint; 
public GameObject scaffoldObj; 
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/2ab18ab6-228f-297f-a49a-4ce7769f8e58.png)

## マウスを項目の上に乗せるとコメントを表示！

### これ→```[Tooltip("実行時にプレイ画面に切り替える事ができる")] ```

```GameManager.cs

[Tooltip("実行時にプレイ画面に切り替える事ができる")] 
public bool debugMode = false;

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/d71c9895-7360-cae0-78e0-a0def2f82884.png)

## インスペクタにpublic変数を表示しない

### これ→```[System.NonSerialized]```

```GameManager.cs
[System.NonSerialized]
public string hoge;
```

# Gizmo

## 指定スクリプトのオブジェクト名をScene上に表示

```
 void OnDrawGizmos()
    {
#if UNITY_EDITOR

        // このgameObjectの名前を表示
        UnityEditor.Handles.Label(transform.position, name);

#endif
    }

```

## 以後随時更新していきます！！m( _ _ )m
ジェネレータとイテレータでフィボナッチ数列を計算する

- yieldはジェネレータ関数のループの中に書く
- ジェネレータ関数のループ以外の部分は1回しか呼び出されない
- ジェネレータ関数はイテレータを返す
- イテレータからnextメソッドによって繰り返し要素を取得できる
- nextメソッドを呼べば呼ぶほど無限に値を生成できる

```py:fibonacci.py
#!/usr/bin/python

# ジェネレータを定義する
def fibonacci():
    a = 0 # 初期設定
    b = 1 # 初期設定

    while True:
        yield b # ジェネレータ関数のループの中にyieldを書く
        a, b = b, a + b

# ジェネレータはイテレータを返す
fib = fibonacci()

#リスト内包表記でイテレータの各要素を順に配列に入れる
fib_array = [fib.next() for i in range(10)] 

print fib_array
```

- 計算結果

```
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
```
TCP/IP(ARPリクエストとARP応答)

1-1 TCP/IP
TCP/IPはネットワークエンジニアだけでなくwebエンジニアやSEにとっても必須の知識ではないでしょうか。TCP/IPは通信において現在最も利用されているプロトコルです。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/161833/e2cc382c-8012-0f09-761f-8390256ccb8a.png)

上記の図はネットワークシステムを構築する際に非常に重要なOSI参照モデルとTCP/IPプロトコルスタックです。この図は暗記しましょう。

1-2 インターネット層
→パケットを送信する際の最適経路を決定するなど、ルーティング機能を司る。
(代表的なプロトコル)
・IP
・ARP
・ICMP
ARP(Address Resolution Protocol)について
IPアドレスからMACアドレス(物理アドレス)を取得するためのプロトコル。
なぜMACアドレスを知る必要があるのかというと、Ethernetフレームを作るためです。
下記の図はARPリクエストの図です。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/161833/9ab75d5a-4f11-49a2-c519-775f2a42dca0.png)

PC1はPC4のMACアドレスを得るため、ブロードキャストでリクエストする。

 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/161833/f7579ba6-8790-a200-9323-c46c9cc2117c.png)

PC1からのリクエストを受け、PC4は自分のMACアドレスをユニキャストで伝える。
これをARP応答という。

1-3 トランスポート層
トランスポート層は信頼性のある通信を提供する役割を担っています。
トランスポート層の代表的なプロトコルがTCPとUDPです。この2つはまた後日投稿します。
ポート番号について
通信を行う際に相手のアプリケーションを識別するために用いられる番号です。
Webサーバーと通信を行う際はHTTPの80番ポート、メールサーバーと通信を行う際はSMTPの25番、POP3の25番が使用されます。
Facebookの過去の記事・コメントをすべてぶっこ抜くjavascript(DeveloperTools活用版)

## 想定読者
 - Facebookグループの過去記事を読むのにいちいちスクロール読み込みをするのが面倒たと感じている人
 - 過去記事が多くてFacebookアプリだと読みづらいのでPDFReaderで読みたい人
 - 「続きを読む」とか「コメントを表示」をいちいちクリックするのが面倒な人
 - 過去の記事を一括で閲覧できるようにPDF化してグループメンバーに配布したいFacebookグループ管理人

## 経緯
とある技術系Facebookグループに参加したのだがなかなか議論が活発でたくさんの投稿があるのだが、Facebookに投稿されただけで過去記事はスレッドから流れてしまい検索しにくい・閲覧しにくい状態だった

Facebookページアプリで過去を追いやすくしたり、外部サイト（ブログなど）で過去記事をまとめたりすることを提案しようとも考えたが、自分が管理人のグループでもないので取り急ぎ自分が読みやすい形でFacebookページをぶっこ抜くことにした。


## 問題点（やりたいこと）
- Facebookのスクロール読み込みが面倒だから自動で読み込みたい
- 「続きを読む」とか「コメントを表示」でたたまれてるので自動で展開したい
- 上記畳まれた箇所にさらに「コメントを表示」などが含まれてる場合がある（ネストしてる場合がある）のでそれも表示
- 外部サイトのURLはリンクとしてぶっこ抜きたい（毎度URLコピペするとか面倒くさいので）

## アプローチ
以上を解決するために、一番最初まで自動でスクロール読み込みして、隠れている箇所は自動で展開するjavascriptを書き、出来上がった超縦長ページをPDFとしてエクスポートする

具体的にはChromeで対象のFacebookページを開いてDeveloperTools(F12)を開く

まずは一番最初の記事まで読み込み続けるためにDeveloperToolsのConsoleにて以下コードを実行する。以下コードでは十分大きいY座標までスクロールさせることで結果的にページの一番下までスクロールさせている。スクロール後に再帰的に`scrollBottom()`を呼び出すことで１秒ごとに画面最下にスクロールするようになる。このままだと無限ループなので、読み込めるページがなくなったらDeveloperToolsのConsoleで`stop = 0`を実行し、ループを完了させる。

``` javascript
setTimeout( scrollBottom = function(){
	document.body.scrollTop = 99999999;
	if( stop ){
		setTimeout(scrollBottom, 1000);
	}
}, 1000);
```



次に畳まれた箇所を展開する。
畳まれるパターンは記事本文、コメント、コメントへの返信の３パターン
対応するClassはそれぞれ　`a._5v47.fss`, `.see_more_link`, `.UFIPagerLink`

これらの要素をクリックするために以下を実行する
投稿数が多いと結構時間がかかるし操作がブロッキングされるので暫く待つ。
クリック処理が完了すると「続きを読む」などの箇所が展開される。

``` javascript 
function triggerEvent(element, event) {
       var evt = document.createEvent("HTMLEvents");
       evt.initEvent(event, true, true ); // event type, bubbling, cancelable
       return element.dispatchEvent(evt);
}

var more = document.querySelectorAll( "a._5v47.fss, .see_more_link, .UFIPagerLink, span.UFIReplySocialSentenceLinkText" );
for(var i = 0; i < more.length; i++){
  triggerEvent(more[i], 'click');
}

```


上記だとネストした「コメントを表示」などは展開されないので２～３回繰り返す

``` javascript
var more = document.querySelectorAll( "a._5v47.fss, .see_more_link, .UFIPagerLink" );
for(var i = 0; i < more.length; i++){
  triggerEvent(more[i], 'click');
}
```


最後に`Ctrl+P`で印刷プレビューを表示し、表示に問題がなければPDFとして保存する。PDFなのでURLはリンクの形で埋め込まれるし、テキストの選択なども可能。

PDF化するときに邪魔な要素はDeveloperToolsで邪魔なDOMを手動Deleteしてやると幸せになれるかもしれない。



### 感想
PDFをiPadに入れて読んでるけど想像以上に快適
Facebook側でPDFとして出力を実装して欲しいくらい
dynabook T75/NWでのCMOSクリア方法

#あらすじ
BIOSパスワードでロックされてしまったdynabook T75/NWが目の前に現れた。そのBIOSパスワードが何だったかは伝承されていないという。
どうして…どうしてこのようなことに…

#封印を解く方法
1. ノートパソコンを分解して基板を露出させ
2. ACアダプタを接続して

3. 写真赤枠のG2と書いてあるジャンパを
![IMG_1760m.JPG](https://qiita-image-store.s3.amazonaws.com/0/63695/04fe2c5c-8f27-a8c4-029b-5e63c0188aaf.jpeg)

4. 100オームの抵抗でショートさせた状態で電源投入（！）
![IMG_1759m.JPG](https://qiita-image-store.s3.amazonaws.com/0/63695/8bd3b96c-fd00-85e7-12fe-662faab03c3f.jpeg)

#解除のヒント
TOSHIBA SUPPORT FORUMSの投稿
https://forum.toshiba.eu/showthread.php?89213-Satellite-L50D-B-Bios-Password-Reset&p=342224&viewfull=1#post342224

#備考
  - 抵抗値がほとんど無いゼムクリップなどを利用するとCMOSクリアできない
  - フォーラムの投稿には100オームとあるが手元に無かったため300オームで代用
  - 海外名dynabook satellite L50-B？
Elixirで弱々しいAIを作る：番外編（LTエディション）

（この記事は [Elixir (その2)とPhoenix Advent Calendar 2016](http://qiita.com/advent-calendar/2016/elixir2_and_phoenix) 15日目の記事です）

6/14（水）、「[俺の話を聞け！！LT大会 #3](https://cdg.connpass.com/event/57050/)」で、LTしますが、テーマは、[「Elixirで弱々しいAIを作る」シリーズ](http://qiita.com/piacere/items/8576ff1079aa28eec804)の ”Qiitaには無いLTエディション” です

[![image.png](https://connpass-tokyo.s3.amazonaws.com/thumbs/b0/92/b09294db3e62add34b0242c507c25b61.png)](https://cdg.connpass.com/event/57050/)

チラ見すると．．．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/8084231c-01d9-a27f-9ddd-6d05f2c25fa5.png)

ナント、顔が付きました（大人の事情でモザイクかけてますが、本編ではモザイク無しでお楽しみいただけます） :confetti_ball:

感情表現も、5段階から7段階に増え、各段階での表現バリエーションも複数持てるようになりました

```elixir:lib/emotion.ex
defmodule Emotion do
　…
	def feel_pre do
		[
			[ "えー、", "ふぇぇ、", "えーん、" ], 
			[ "ふーん、" ], 
			[ "いやいや、", "えーと、", "んーと、" ], 
			[ "" ], 
			[ "あは、", "あはぁ、", "あーん、" ], 
			[ "うわー、", "うん", "やーん、", "うふふ、" ], 
			[ "アァーン、", "うぅぅ、", "わわわ、" ]
		]
	end
	def feel_post do
		[
			[ "(;_;)", "(TдT)", "(´；ω；｀)", "(´Д⊂ｸﾞｽﾝ" ], 
			[ "＿|￣|○", "．．．", "（しょぼん）", "（シクシク）" ], 
			[ "(´・ω・｀)", "（ため息）" ], 
			[ "" ], 
			[ "(*´∀｀*)", "wktk", "(>ω<)" ], 
			[ "(๑´ڡ`๑)", "(*´ω｀*)", "(｡>﹏<｡)", "❤(ӦｖӦ｡)" ], 
			[ "(TOT)", "＼(^o^)／", "ヽ(｀▽´)/" ], 
		]
	end
　…
	def face do
		[
			"nolook.gif", 
			"kanasii.gif", 
			"ikari.gif", 
			"ai.gif", 
			"akire.gif", 
			"egao.gif", 
			"hard.gif", 
		]
	end
　…
```

どんなリアクションになるかは、作った私もそろそろ予測付かない（笑）

ちなみに、語彙力／理解力も、そこそこアップしていて、たとえば他の娘（もしくは言語）の名を呼んだ日には、嫉妬されたり、ツッコミも入ります :scream:

こんな感じで、LTエディションのライブモーション、今晩開催です :clapper:

---

p.s.福岡でElixirをワイワイ盛り上げるコミュニティの発足記念MeetUp、[fukuoka.ex#1](https://techjin.connpass.com/event/56497/)、盛り上がりました :rocket:

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/c3969ff0-bf75-1ce9-5e74-12acae8dab17.png)](https://techjin.connpass.com/event/56497/)
gulp-sassの起動エラーメモ Error: Node Sass does not yet support your current environment


最近触ってなかったけど久々にさわったらエラーがでたのでメモ

```
/Users/n0bisuke/dotstudio/0_web/node_modules/node-sass/lib/binding.js:13
      throw new Error(errors.unsupportedEnvironment());
      ^

Error: Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (57)
For more information on which environments are supported please see:
https://github.com/sass/node-sass/releases/tag/v3.13.1
    at module.exports (/Users/n0bisuke/dotstudio/0_web/node_modules/node-sass/lib/binding.js:13:13)
```


node-sassの中でエラーがでてるみたいにエラーがでてますがアンインストールして入れ直したら通常起動しました。

参考: https://github.com/dlmanning/gulp-sass/wiki/Update-to-the-latest-Gulp-Sass

```
npm uninstall gulp-sass
npm install gulp-sass --save-dev
```
ランサムウェア

#最近流行っているマルウェア
最近ニュースでランサムウェアというマルウェアが話題になっています。これを受けてマルウェアのことをいろいろと調べてみました。
##  マルウェアとは？
そもそもマルウェアとはなんなのか。wikipediaでは「マルウェアとは不正かつ有害に動作させる意図で作成された悪意のあるソフトウェアや悪質なコードの総称で、コンピュータウイルスやワーム、バックドア、キーロガー、トロイの木馬、マクロウイルス、ブートセクタウイルス、スパイウェア、悪質なアドウェア（広告）、ランサムウェアがある」ということになっています。私自身混同していたのですがコンピュータウイルスやランサムウェアはすべてマルウェアの一種であり、両者はそれぞれ別のものなのですが、ウイルスという言葉が有名なため、ランサムウェアはコンピュータウイルスの一つと考える方もいるのでそれぞれの違いを説明しようと思います。
##  それぞれの違い
まずコンピュータウイルスとは「自立せず、動的に活動せず、プログラムファイルからプログラムファイルへと静的に感染するものを指す。」がwikipediaによる解説です。主な機能が３つあります。
- 自己伝染機能
    - 自らの機能によって他のプログラムや他のシステムにコピー（感染）
- 潜伏機能
    - 特定時刻、一定時間、処理回数といった条件により発症するまで、症状を出さない
- 発病機能
    - ファイルの破壊やユーザの意図しない動作を起こすなど
つづいてランサムウェアは「これに感染したコンピュータは、利用者のシステムへのアクセスを制限する。この制限を解除するため、被害者がマルウェアの作者に身代金（ransom、ランサム）を支払うよう要求する。数種類のランサムウェアは、システムのハードディスクドライブを暗号化し（暗号化ウイルス恐喝）、他の幾種類かは単純にシステムを使用不能にして、利用者が身代金を支払うように促すメッセージを表示する（スケアウェア）。」というものです。２つともPCに悪影響を与えるという点は共通しているのですがランサムウェアはソフトウェアであるためコンピュータウイルスが持つ他者への伝染がありません。このことが決定的に違う点でランサムウェアは削除してしまえば症状が悪化しないため、伝染を心配する必要はありません。
まとめるとコンピュータウイルスとランサムウェアを区別する点は他者への伝染があるかどうかであり、言い換えるとランサムウェアへの感染はセキュリティ上問題のあるプログラムを自分が受け取ってしまった場合ということです。
## ランサムウェアへの対策
いつ自分にマルウェアの脅威が降りかかるか分かりません。セキュリティソフトの導入、アップグレードやマルウェアによって表示される画面に従わず駆除方法を検索しましょう。
Moodleのおすすめ隠しconfig

# 隠しconfigとは？
とりあえずWebUIから設定を変更したり確認したり出来ないものを隠しconfigと呼ぶことにする。
これはconfig.phpの適当な部分に追記して設定を変更することになる。
config-dist.phpに記載があるので本当の意味での隠し設定を期待されていた方には予めお詫びしておきます。

# おすすめ設定項目
以下の項目についてconfig.phpに記載しておくと運用で便利だと思っている。

## $CFG->sslproxy = true;
PoundのようなSSLラッパ機能を持つリバースプロキシ配下にある場合は設定を有効にする必要がある。

## $CFG->disableusercreationonrestore = true;
（コースバックアップ時にユーザを含んでいた場合）コースリストア時にユーザ作成を抑制する。年度毎に別々にMoodleサイトを作成してるとき、コースを移行する際に変なユーザ名のユーザが自動作成されなくなる。

## $CFG->disableupdatenotifications = true;
Moodleの特定ページ閲覧時やcronの処理でアップデート通知メールが送られることを抑制する。サイト登録しておけばセキュリティアップデートなどの通知は来るのでそれで代替可能。

## $CFG->apacheloguser
Apache httpdでaccess_logにユーザ名などを記録することができる。[このへん](https://www.cccties.org/blog/zakki/moodle%e3%81%ae%e3%83%a6%e3%83%bc%e3%82%b6id%e3%82%92apache%e3%83%ad%e3%82%b0%e3%81%ab%e5%87%ba%e5%8a%9b%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b/)で苦労してるのを見たので追記。


* $CFG->apacheloguser = 0 : ユーザ情報を記録しない
* $CFG->apacheloguser = 1 : ユーザID（userテーブルのid）を記録
* $CFG->apacheloguser = 2 : ユーザ氏名を記録
* $CFG->apacheloguser = 3 : ユーザ名（ログイン名）を記録

config.phpの変更だけでは不足しており、httpd側の設定も一部変更する必要がある。

```:config-dist.php
// To get the values logged in Apache's log, add to your httpd.conf
// the following statements. In the General part put:
//     LogFormat "%h %l %{MOODLEUSER}n %t \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\"" moodleformat
```

## $CFG->doclang = 'en';
エラーが起きた時などにMoodleDocsを参照する「このエラーに関する詳細情報」のリンクが表示されるが、和訳されていないことが多いため英語の説明文が表示されるように指定する。
**実はこの設定はWebUIから設定可能だった…**

## $CFG->disableonclickaddoninstall = true;
サイト管理メニューで「プラグインインストーラ」を無効にする。Moodle管理者に勝手にプラグインを追加されたくないときに有効そう。

## $CFG->disableupdateautodeploy = true;
WebUIからのプラグイン等のアップデートが実行されないようになる。WebUIからだとプラグインアップデートに失敗してMoodleサイトが死ぬことが稀にあるので、確実にCLIからアップデートを実行したい場合に利用する。
```$CFG->disableonclickaddoninstall = true;``` だと自動的にtrueに設定される。

## $CFG->emailconnectionerrorsto = 'your@emailaddress.com';
DBサーバとの接続エラーが発生した際に、指定したメールアドレスにアラートメールを飛ばす。
ユーザに「昨日の夜アクセスしたらエラーが出て困った」とか言われてから調査を始めるケースが減るかもしれない。

## $CFG->session_update_timemodified_frequency = 120;
ここで指定された秒数以上が経過している場合は、sessionsテーブルの最終アクセス日時を更新する。デフォルトは20秒。
短時間に多数のユーザによるアクセスが集中して困っている場合、DBへの書き込みを減らすことが出来るかも知れない。

## $CFG->debugusers = '2';
特定のユーザがログインした場合にだけ、デバッグメッセージを表示する様にする。
運用中のサイトで問題が発生していて、トラブルシューティングを行いたい場合に使うのだろうか？
機械学習を学ぶ上で個人的に最強と思う教科書

## 動機

いわずもがなですが、機械学習の勉強にはとても時間が掛かります。

でも、**同じ勉強時間**を費やしたとしても、**教材の良し悪し**で捗り方が大きく変わってくることは、誰もが実感していることだと思います。

そこで、本記事ではテーマごとに**私が考える最強の教科書**をリストしていこうと思います。

## ディープラーニング（アルゴリズムの理解）
「Deep Learning」An MIT Press book, 2016/12 発行
http://www.deeplearningbook.org/

印刷本も売られてますが、上のWebページでいつでもタダで読めます。（版権上の問題でPDFの形では配布できない＆してないそうです）

この本は、ここ数年のディープラーニングの進歩のうち研究者の間ではメジャーとなっているであろうテーマはすべて書いてある、ともいえる内容の広さがありつつ、それぞれのテーマについて理論的背景と具体的な数式や実装面での留意事項といった内部詳細まで踏み込んだ話が書かれているのが特長です。

日進月歩で体系的にフォローするのが難しそうなディープラーニングについて、「とりあえず専門家の間で定番となっている話くらいは体系的に把握しておきたい」という場合は本書は絶好の教科書です。

(2018/2/23 追記)
本書の日本語訳プロジェクトが進められてて（現在は非公開ですが）、後日公開されるようです。とても楽しみですね。
https://www.deeplearningbook.me/

## ディープラーニング（実装の理解）
ディープラーニングを実装する際、何らかのフレームワークを使うと思いますが、2018年初頭現在、TensorFlow+Kerasがよく使われているようです。日本のPFN社のChainerも人気がありますね。

では「教科書・勉強法」という本記事の主旨にあうフレームワークは何でしょう？ それはPyTorchではないかと私は思います。というのも、最近はディープラーニングの研究者の多くがPyTorchを使って研究を行うようになっており、論文公開と同時にPyTorchで書かれたソースが公開されたり、また有志によってPyTorchによる実装が共有されたりする例がとても増えてきているのだそうです。

そうした情報をキュレーションしてくれているページがこちらです。
https://github.com/ritchieng/the-incredible-pytorch

論文よりもソースコードで示されたほうが理解しやすいタイプの人にとっては、そうした最新の動向をgithub上で共有されるPyTorchソースを読むことでキャッチアップしていく方法は合っているかもしれません。

## R言語を使った実践的なデータ探査
「R for Data Science」
http://r4ds.had.co.nz/

これも印刷本がオライリーから販売されてますが、上のWebページでいつでもタダで読めます。

この本はR言語のパッケージ開発の神的存在であるHadley Wickham氏らによって書かれたもので、機械学習によるモデリングを行う前のプレスタディや可視化といったいわゆる**データ探査（Data Exploration）**を最新のR言語のパッケージ群であるtidyverseを使ってサクっとやる方法について書かれた教科書です。

dplyr, tidyr, ggplot, etc.といったモダンなRパッケージとその実践的な使い方について体系的に学びたいときには決定版とも言える教科書です。

## 機械学習の実践事例
KaggleコンペティションにおけるWinner'sインタビュー集
http://blog.kaggle.com/category/winners-interviews/

機械学習はアカデミックな研究や理論的な知識の世界と、ノイズ混じりでドメイン知識依存も大きい実問題でどう実践するかのノウハウと、その２つの間に知識の隔たりがあると思いますが、後者の実践ノウハウを学ぶ上で上のWebページに掲載されているインタビュー集は絶好の教材です。


## 終わりに
本記事は随時更新予定です。良い勉強テーマとそれに対する良い教科書の組み合わせについて、情報ありましたらぜひコメントください。良さそうな教科書は（筆者の独断と偏見で）本リストに追加します。
環境変数について / ログインシェルの変更

# 始めに

これまで度々、「環境変数ってなんや？」って思う機会がありましたが、Linuxコマンドに慣れていなかったり、Vimの使い方がさっぱりだったりして全く手がつけられませんでした。

プログラミングを勉強し始めて6ヶ月弱、ようやく環境変数について少し分かったので、備忘録として書いておきます。

[参考にさせていただいたサイト]
http://qiita.com/soarflat/items/09be6ab9cd91d366bf71
http://qiita.com/soarflat/items/d5015bec37f8a8254380

# 環境変数とは？

「環境変数」＝「SHELLでコマンドとして打てる文字の一覧を示したパスの集合」と理解しています。
少しずれているかもですが、これが一番しっくりきた説明です。

JSとかでたまに `($this)` のような変数を見かけますが、それと同じで、 `$PATH` も変数で、コマンドとして使える文字（例えば `pip` とか `pyenv` , `rbenv`）などのような文字の一覧を書いた箇所までのパスの一覧です。

`$PATH` に何が入っているかをみるためには

```
$ echo $PATH
```

とすればよく、僕の環境では

```
/Users/username/.pyenv/shims:/Users/username/.pyenv/bin:/Library/Frameworks/Python.framework/Ver
sions/3.6/bin:/Users/username/anaconda/bin:/usr/local/share/npm/bin:/Users/username/.pyenv/shims
:/Users/username/.pyenv/bin:/usr/local/share/npm/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbi
n
```

と出力されました。

`:` を境にして、いくつかのパスが記述されているのがわかると思います。

試しに、 `Users/username/anaconda/bin` （これは `~/anaconda/bin` と同じ）をのぞいてみると...

<img width="1678" alt="スクリーンショット 2017-06-14 17.04.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/165023/d3ea8564-6d1c-86b6-2a14-7af6eff2dc80.png">

こんな感じで使えるコマンドの一覧が見えます。

Pythonユーザーは分かると思いますが、 `django-admin` とか `jupyter-notebook` とかよく使うコマンドが書いてありますね。


# Mac（に限らない？）のディレクトリ構成

もう一つ、これまで環境変数がわからなかった原因と
して、 `usr/bin` とかの `usr` ってどこやねん！って思っていたことが挙げられます。

これまでディレクトリは `Users` から始まると思っていたのですが、 `Users` 配下にいるときに恐る恐る 

```
$ cd ../
$ ls
```

をしてみると...


<img width="1126" alt="スクリーンショット 2017-06-14 0.21.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/165023/846b771a-7212-0d1a-d844-6f0aa7aaa06c.png">

ありました！！！！！

なんとここにあったのか `usr` よ！って感じですね。


# ログインシェルをZshに変更する

最後に、ログインシェルをZshに切り替える時の説明をして終わりたいと思います。

[参考にしたサイト]
http://ba-kgr.hatenablog.com/entry/2015/03/24/211031


Zshが何か正直よく分かってませんが、「なんか便利なシェル」って感じのやつです。笑

シェルをZshに変えることで、シェルでの作業がやりやすくなります。

```
$ brew update

$ brew install zsh
```

で、Zshをインストールしましょう！

インストールしたZshは `usr/local/bin/` に保存されます。


次に、Zshを便利にするため、設定ファイルをいじって行きます。

```
$ vi ~/.zshrc
```

Vimですね。僕は普段Atomしか使わないので、一時期こいつに苦しみました...今はようやく親みが湧いてきて、宗教戦争に参加しようかと考えたりしてます。笑 （Vim側で）

その場で `i` を押すと、 `INSERT MODE` となり、書き込めるようになります。

僕はインターン先のエンジニア先輩に設定ファイルをもらって、いらない部分を削ったり、いる部分を追加したりして書きました（公開していいやつかわからないので、いいやつだと分かったら公開します）。

[参考になるサイト]
http://d.hatena.ne.jp/oovu70/20120405/p1

こんな感じで設定を書きます。

書き終わったら、 `:wq` をその場で叩いて保存してVimを終了します。

```
$ source ~/.zshrc
```

と叩いて設定を反映します。

次に、

```
$ sudo vi /etc/shells
```

として、アクセス可能なシェル一覧に、先ほどインストールした `usr/local/bin/zsh` を追加しましょう。

`i` で `INSERT MODE` 、以下のように記述して、 `:wq` で保存して終了します。

<img width="452" alt="スクリーンショット 2017-06-14 0.50.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/165023/91ccec49-30a8-ec62-c2ad-1a6b53d76075.png">

ここでは重要な？ファイルに変更を加えるため、 `sudo` （superuser do）と、管理者権限で変更します。

最後に、ログインシェルを変更します。

```
$ chsh
```

と叩くと、パスワードが要求されるので、macにログインするパスワードを入力します。

<img width="348" alt="スクリーンショット 2017-06-14 0.50.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/165023/e42a1f06-03e8-f07d-e38d-b9f93062d967.png">

`INSERT MODE` にして、 `Shell` の欄を `/usr/local/bin/zsh` に変えましょう！

これで次からターミナルを起動した時はZshが起動するはずです！


ここまでやれば割と理解した気になれると思います（僕はなれました）。笑
再起動前のtmux環境を復活させる

再起動前のtmux環境を復活させる方法について記載

### 　1.Tmux Plugin Managerのインストール




リポジトリをクローン

```
$ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
```

.tmux.confに以下の内容を追加
（.tmux.confがなければ~/.tmux.confで作成）

```
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'

# Other examples:
# set -g @plugin 'github_username/plugin_name'
# set -g @plugin 'git@github.com/user/plugin'
# set -g @plugin 'git@bitbucket.com/user/plugin'

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
```

設定の反映

```
$ tmux source ~/.tmux.conf
```


### 　2.tmux-resurrectのインストール
.tmux.confに以下の内容を追加

```
# Plugins
set -g @plugin 'tmux-plugins/tmux-resurrect'
```

ターミナルで、tmux起動して、以下のコマンドでプラグインのインストール

```
(prefix) + I
```

アップデートは以下のコマンド

```
(prefix) + U
```

### 　3.tmux-resurrectの設定を追加
.tmux.confに以下の内容を追加

```
# resurrect
set -g @resurrect-strategy-vim 'session'
```

設定の反映

```
$ tmux source ~/.tmux.conf
```

### 　4.save、restore
以下のコマンドでsave

```
prefix + Ctrl-s
```

以下のコマンドでrestore

```
prefix + Ctrl-r
```

これで、再起動してもtmuxの設定が復活します。


捕捉
sshなどを表示していたコマンドをrestore時に再度行う場合は、
.tmux.confに以下の内容を追加

```
set -g @resurrect-processes 'mysql ssh php'
```

terminal起動時に、tmuxを起動する。
.bash_profileや.zshrcに以下を追記（nameは任意のsession名）

```
# 初回シェル時のみ tmux実行
if [ $SHLVL = 1 ]; then
  tmux a -t name
fi
```


参考
https://github.com/tmux-plugins/tpm
https://github.com/tmux-plugins/tmux-resurrect
nodejs: "TypeError: Invalid hex string"が起きた時に確認すること

`new Buffer()`の`"TypeError: Invalid hex string"`にハマったときのメモです。
結論、自分の場合は.envファイル内の各行末の`「余分な空白」を削除する`で解決しました。

# 環境
```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.5
BuildVersion:	16F73

$ node -v
7.10.0
```

# 問題点
```
var buf = new Buffer(process.env.FOO_KEY, 'hex'); // <= ここでエラー
```

# 解決方法
```
// vim .env
BAR_KEY = "abc"
FOO_KEY = "123456789abcdef" // <=　行末に余分な空白があったら削除
```
逆引きWebpackの使い方

cloudpack [あら便利カレンダー 2017](https://cloudpack.github.io/benri2017/) 10日目の記事です。

最近はもっぱらWebpackです。
gruntがあんまり好きになれず、その後にきたgulpでしばらくやってましたが、
昨年からはもっぱらWebpackを使うようになりました。

npmに公開されているライブラリをモジュールとして扱いやすかったり、
JSフレームワークをつかったSPAサイトのソースコンパイルがしやすかったりと最近のフロントエンド開発を行うにはなにかと便利なツールです。

ただ実際開発に利用するとなると何かとこれはどうするの？ってのが出てくるので逆引き的に使えるようなリストを書きました。
基本公式サイトにのってる内容になります。 [Webpack公式](https://webpack.js.org)
ざっくり知っときたいけど、英語の公式読むの面倒ってかたの役に立てばいいなーと思います。

## 出力するファイルをわける、名前を指定する

まずは基本編。

```js
const path = require('path');

module.exports = {
  entry: {
    app: './src/app.js',
    vendors: './src/vendors.js'
    },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js'
  }
};
```
`entry`のキーに指定した名前がファイル名になって出力されます。
全ページに利用するようなライブラリをvendor.jsとしてまとめたり、各ページのファイルを管理したりするときに利用します。

## Sassをコンパイルする
まずは `yarn add sass-loader css-loader style-loader node-sass --dev` でloaderを追加

```js
module.exports = {
…省略
devtool: "source-map",
module: {
    rules: [{
        test: /\.scss$/,
        use: [{
            loader: "style-loader"
        }, {
            loader: "css-loader", options: {
                sourceMap: true
            }
        }, {
            loader: "sass-loader", options: {
                sourceMap: true
            }
        }]
    }]
}
…省略
}
```
ソースマップがいらない場合はdevtool、optionsの部分は不要です。

## CSSファイルとして出力する
通常だとWebpackで出力されたCSSはimportされたJSファイルに組み込まれ、実行時に動的に `style`属性として生成されます。
個別にファイルとして出力するにはまず `yarn add extract-text-webpack-plugin --dev`でプラグインを追加。

```js
var webpack = require("webpack");
var ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
…省略
	plugins: [
		new ExtractTextPlugin({
			filename: "css/[name].css"
		})
	]
…省略  
};
```
ただし、entryポイントになるJSファイル(内容は `import "style.css"`）は空ファイルとして出力されてしまいます。

## ES6のコンパイルをbabelでする
まず `yarn add babel-loader babel-core babel-preset-env --dev`

```js
// rulesにbabel-loaderを追加
rules: [
  {
    test: /\.js$/,
    exclude: /(node_modules|bower_components)/,
    use: {
      loader: 'babel-loader',
      options: {
        presets: ['env'],
        plugins: [require('babel-plugin-transform-object-rest-spread')]
      }
    }
  }
]
```

## 開発時とプロダクションでコンパイルコードをわける
`yarn add cross-env --dev`

webpackコマンドの実行時に `cross-env NODE_ENV=production webpack` 環境変数に値を設定する。
webpack.config.js内に `if (process.env.NODE_ENV === 'production')` と書くことで設定された値によって分岐が出来ます。

## 開発用サーバをたてる（HMR）
`yarn add webpack-dev-server --dev`

package.jsonのscriptで `webpack-dev-server --open` を実行する。
webpackのエントリーファイルが更新されるとブラウザが自動更新されます。

他にもいろいろあるんですが、とりあえずこの辺を押さえておけばあとは必要に合わせて公式をみればわかるかなといったかんじ。
気が向いたら項目も随時更新していこうと思いますー
[WPF][Xaml] ListBoxの各コンテンツの幅をListBoxの横幅に合わせる

ListBoxの各コンテンツの幅をリストボックスに合わせたい場合の方法メモ

# 結論

`HorizontalContentAlignment="Stretch"` を指定する

# 指定前の状態

これをListBoxなどで指定しない場合、ListBoxのItemの横幅がコンテンツの内容の最大サイズになってしまう。
そうするとListBoxの右側に表示したいような場合に重なってしまって表示できない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/6fe272c9-d154-8297-0d9e-feb205ddb736.png)

この際に `HorizontalContentAlignment="Stretch"` を指定すると、以下のようにListBoxの横幅が最大サイズになる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/7aa11f18-7c46-dab2-a349-c01127800945.png)

# 画像の使用例

※上の画像は合わせてMaterialDesignToolKitを使用しています

```xml:XAML
<ListBox ItemsSource="{Binding Path=ItemList}"
         HorizontalContentAlignment="Stretch"
         VirtualizingPanel.ScrollUnit="Item"
         VirtualizingPanel.IsVirtualizing="True"
         VirtualizingPanel.VirtualizationMode="Recycling">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Background="LightBlue">
                <TextBlock Text="LeftItem"/>
                <TextBlock Text="RightItem" TextAlignment="Right"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
```
ウェブストレージを理解する

## ウェブストレージってなんね

ストレージ：　記憶装置
ローカル環境に保存可能


## ウェブストレージの種類
  - ローカルストレージ
    - 永続的にデータを保存可能
  - セッションストレージ
    - 一時的にデータを保存可能
    - ウィンドウを閉じるタイミングで消える

## 補足：記憶装置ってなんね

コンピュータの5大装置の1つ
記憶装置にも2種類あり、`主記憶装置`と`補助記憶装置`がある

- 主記憶装置
    - 動作するために必要なプログラムやデータを一時的に記憶する装置
    - 電源を切ると記憶した内容は消えてしまう
    - 代表的な例としてメモリ

- 補助記憶装置
    - プログラムやデータを長期に渡って保存可能
    - 電源を切っても記憶した内容は保存したまま
    - 代表的な例としてハードディスク・CD-ROMなど


### 参考にさせていただいたもの
- キタミ式イラストIT塾 基本情報技術者 きたみりゅうじ著
【MapKit】ユーザートラッキングモードでユーザの現在値を追いかける

## これは何

今更感はありますが、iOS 5 から使える `MKUserTrackingBarButtonItem ` を使って、ユーザーをトラッキングする（追いかける）方法を紹介します。

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/8292/d0d8ea8b-27d5-388b-8c1c-f920df21ba50.gif)

`MKUserTrackingBarButtonItem ` を使うと、上の例のように **トラッキングモード** を順に切り替えることができます。

### トラッキングモードとは

次の３種類が用意されています。

* MKUserTrackingModeNone - 地図がユーザーの位置を追いかけない
* MKUserTrackingModeFollow - 地図がユーザーの位置を追いかける
* MKUserTrackingModeFollowWithHeading - 地図がユーザーの位置を向きを変えながら追いかける

## 実装環境

* Xcode 9
* Swift 4

## 前提条件

* UIViewController のビューに `MapView` が配置されていること
* `self.mapView` で参照できること

## 実装方法

```
let userTrackingButton = MKUserTrackingBarButtonItem(mapView: mapView)
self.toolbarItems = [userTrackingButton]
```

以上です :innocent: 

トラッキングモード中に地図をちょっとでも動かすとトラッキングモードは終了し、`MKUserTrackingBarButtonItem` のアイコンも元に戻ります。

## リンク

* [MKUserTrackingMode \- MapKit \| Apple Developer Documentation](https://developer.apple.com/documentation/mapkit/mkusertrackingmode?language=objc)
* [MKUserTrackingBarButtonItem \- MapKit \| Apple Developer Documentation](https://developer.apple.com/documentation/mapkit/mkusertrackingbarbuttonitem)
AnsibleでJavaとTomcatをインストール

#環境
* RHEL 7.3
* Ansible 2.3

#スクリプト
```ini:inventory.ini
[test-servers]
localhost
#対象ホストを列挙する
```

```yaml:main.yml
---
# JDKとTOMCATをインストールする
- hosts: test-servers

  tasks:
  - name: JDKのインストーラを取得
    get_url:
      url: http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm
      dest: /tmp
      headers: "Cookie:' gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie'"
      validate_certs: no
      checksum: "sha256: 3d1e8cc66f4fd77acef6093329d5dd95bd06e4a03926c52df794f311a0c093f8"

  - name: JDKをインストール
    yum:
      name: /tmp/jdk-8u131-linux-x64.rpm
      state: present
    become: yes

  - name: インストーラを削除
    file:
      state: absent
      path: /tmp/jdk-8u131-linux-x64.rpm

  - name: TOMCATユーザの作成
    user:
      name: tomcat
    become: yes

  - name: TOMCATのインストーラを取得
    get_url:
      url: http://ftp.riken.jp/net/apache/tomcat/tomcat-8/v8.5.15/bin/apache-tomcat-8.5.15.tar.gz
      dest: ~/apache-tomcat-8.5.15.tar.gz
      checksum: "sha1:67650d6deda0c0ba9e8c7db7fe4006c35d6dc7db"
    become: yes
    become_user: tomcat

  - name: Tomcatをインストール
    unarchive:
      src: ~/apache-tomcat-8.5.15.tar.gz
      dest:  ~/
      remote_src: yes
    become: yes
    become_user: tomcat

  - name: インストーラを削除
    file:
      state: absent
      path: ~/apache-tomcat-8.5.15.tar.gz
    become: yes
    become_user: tomcat

  - name: FirewallでTomcatが使用するポートを空ける
    firewalld:
      port: 8080/tcp
      permanent: yes
      immediate: yes
      state: enabled
    become: yes
```

#実行

```bash:terminal
#以下のコマンドを実行する
ansible-playbook -i inventory.ini main.yml --ask-pass --ask-sudo-pass

#sshユーザを指定する場合は以下のコマンド
ansible-playbook -i inventory.ini main.yml -u <REMOTE-USER> --ask-pass --ask-sudo-pass

```