OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 16.04 LTS Dockerをインストール

Ubuntu 16.04 LTSにDockerをインストールします。
Dockerはコンテナ型の仮想化技術です。詳しくは目的から逸れてしまうため、省略します。

# 事前準備
Dockerをインストールするためにcurlコマンドを利用します。
事前準備として、curlの存在確認からインストールまでを行います。
sudoを利用するか、root権限を持つユーザで実行してください。（以降はrootで実行したと想定して記載します）

```
# curlが利用できることを確認（curlのパスが返れば利用できます）
$ which curl

# （curlが利用できない場合）apt-getを使用。パッケージ更新後にcurlをインストールします。
$ apt-get update
$ apt-get install -y curl
```

# Dockerのインストール
準備が整ったので、Dockerをインストール～確認を行います。

```
# Dockerをインストール
$ curl https://get.docker.com | sh

# インストール確認（必要があれば、再ログインを行ってください。）
$ docker version
```

誤記についてのご指摘や、よりよい方法のご提案などは歓迎します！
以上です。お疲れ様でしたー。
condaによるサーバ上への仮想環境(pyenv:anaconda)上へのkeras導入(tensorflowバックエンド)


pyenvでanaconda2,3の仮想環境は導入済み。
　
##Tensorflowの導入


			
 - tensorflowインストール
Anaconda install を使用
(https://www.tensorflow.org/versions/r0.11/get_started/os_setup.html#pip-installation)


		$ conda create -n tf-cpu python=3.5
		$ conda install -c conda-forge tensorflow

　
　

 - anaconda仮想環境の確認
	
		$ conda env list
		tf-cpu                *  ~/pyenv/versions/anaconda3-4.1.0/envs/tf-cpu
		root					 ~/.pyenv/versions/anaconda3-4.1.0
		
		$ conda create -n tf-cpu python=3.5
		$ conda install -c conda-forge tensorflow
　
　

 - 確認
pythonシェルではインポート出来たが、ipythonでは読み込めない。condaの仮想環境ではなく、pyenv上の仮想環境のディレクトリを参照している模様。よく考えれば、そもそもconda上でipython入れてないのにipython動いてる時点で分かるのだが・・・
		
		$ ipython
		In [1]: import numpy
		In [2]: import tensorflow	
		error	
　		
　		

 - 環境変数の追加
`.ipython/profile_default/startup/`に適当なコードを書いておくと、起動時に自動で実行される模様。`hoge.py`に以下を記載して追加
		
		> import sys
		> sys.path.append('~.pyenv/versions/anaconda3-4.1.0/envs/tf-cpu/lib/python3.5/site-packages/')
　
　
　		
 - kerasの導入
一行だけ。超簡単
（https://keras.io/ja/#_2）

		> pip install keras

　
　

 - 通常は`source activate tf-cpu`で環境切り替えられるが、pyenv上だと絶対パスで指定しなければいけないらしく、面倒なのでailias化。バックエンドの変更などは、まだやってないし他に書かれている方もいたので略。

		$ tf-cpu
		$ ipython
		In [1]: import tensorflow
		In [2]: import keras
		Using TensorFlow backend.
		In [3]: 
　
　

おｋ。

##pyenvとvurtialenvとpyenv-virtualenvとconda
（http://dackdive.hateblo.jp/entry/2015/12/12/163400）
に詳しく載っていたのでメモ
　
####pyenv:
pythonのバージョン管理、バージョンごとに仮想環境を1つしかもてない
　
####vurtialenv:
同一バージョンでの仮想環境を作れる
　
####pyenv-virtualenv：
pyenvに任意の名前をつけれるようになったもの（らしい）
　
####conda：
忘れたけど、どっかでcondaがpyenvの上位互換って見た気がするので、当面はこれを使用する予定。
Macでスクリーンショットを撮ろうとすると「タイプ文字列を作成できません。」とアラートが出て保存できない

どうも、さ犬🐶です。

実は、Macで開発環境を作った後にスクリーンショットを撮ると以下のようなアラートが出てスクリーンショットが撮れないという事態が起こるようになって困っていたのですが、解決方法がわかったので記事にしました！

ググってもこの症状自体まれらしく、ちゃんとまとまってる記事がなくてしばらく諦めてGyazo使ってたけど、やっぱりローカルの時はmacのスクショを使いたかった...

# 再現手順

1. 「Command + Shift + 3」や「Command + Shift + 4」を押す
2. 以下のようなアラートが出てスクリーンショットが保存されない

![アラート](https://i.gyazo.com/2da85bf01346e327c7a7c9c4428ab0a8.png)

# 前提

よく

>「システム環境設定>キーボード>ショートカット>スクリーンショット」にあるチェックボックスにチェックがついていないのでは？

という回答があるけど、それで解決できたら困ってないし、そもそも事象と解決方法に何も関連性がないのでそれはないですね。
それならそもそもスクリーンショットすら起動しないはずなので、こんなアラートはでないはずです。

そこで、このアラートの文章を読むと、どうやら以下のようなことが起こっていると予測できます。

# 原因

**画像データを特定の拡張子で保存したいんだけど、その拡張子が画像のものではないから保存ができない**

つまり、スクリーンショットの保存形式が **png, jpg, pdf** などのような画像を表示できるものではないということ。

Macではスクリーンショットの保存形式はデフォルトで、pngになっているので普通ならこんなことは起きないです。しかし起きてしまった。。。

調べると、macのスクリーンショットの設定が書かれたファイルがあってそれを変更すると治る感じだったので、まずは設定ファイルを色々書き換えるコマンドを紹介します。

# スクリーンショットの設定方法

Macのスクリーンショットの設定を行うコマンドが用意されているので紹介します。<a href="https://goo.gl/Nv0mq" target="_blank">参考</a>

## 設定を確認

**defaults read com.apple.screencapture**
json形式で設定を確認できます。

## 設定をデフォルトに戻す
以下のコマンドでスクリーンショットの全設定をデフォルトに戻せます。

**defaults delete com.apple.screencapture**

ただし、特定の属性のみをデフォルトに戻すには以下のようにします。

**defaults delete com.apple.screencapture {属性の識別子}**

ex) defaults delete com.apple.screencapture type

属性 | 識別子
:-: | :-:
保存形式 | type
保存場所 | location
ウィンドウの影 | disable-shadow

## 設定の反映

**killall SystemUIServer**

## 保存形式を変更

**defaults write com.apple.screencapture type {保存形式}**

ex) defaults write com.apple.screencapture type png

保存形式一覧

* png
* gif
* jpg
* jp2 (JPEG2000)
* bmp
* exr (OpenEXR)
* pdf
* psd (Photoshop 形式)
* pct (PICT)
* sgi
* tga
* tif

## 保存場所を変更

**defaults write com.apple.screencapture location {保存先フォルダ}**

ex) defaults delete com.apple.screencapture location ~/Desktop/Screenshot

## ウインドウの影が無い状態のスクリーンショットを撮る

**defaults write com.apple.screencapture disable-shadow -bool true**

# 解決方法

おそらく開発環境を構築する際に何らかの操作でスクリーンショットの保存形式が変わってしまっているので、デフォルトに戻してあげれば良いです。

1. コンソールを開く（ターミナル.appまたはiTerm.app)
2. 以下のコマンドをを実行する

```
$ defaults delete com.apple.screencapture type
$ killall SystemUIServer
```

これでCommand + Shift + 4が復活しました :tada:
unreal engineでleap motionを使う(初心者)

# 用意
- unreal engine 4.12以上

# 準備
- 編集>pluginsからleap motionを有効にする

# 作業

- ブループリント作成>ゲームモード選択
- classesをleapに帰る
- project設定を開いてゲームモードを上で作ったやつに変える


自分用メモ
MKMapViewで指定した緯度経度を中央表示

##MKMapViewで指定した緯度経度を中央表示
指定した緯度、経度を中央表示したい場合があるかと思います。
地図上に、現在地ボタンがあり、タップすると現在地を中央表示するなど。

##実現方法
UIButtonのイベント等の処理で以下のコードを実行

```swift:
        //中心座標
        let center = CLLocationCoordinate2DMake(任意の緯度, 任意の経度)
        //表示範囲
        let span = MKCoordinateSpanMake(0.01, 0.01)
        
        //中心座標と表示範囲をマップに登録する。
        let region = MKCoordinateRegionMake(center, span)
        MapView.setRegion(region, animated:true)
```

上記の方法で、実現可能です。
他に方法があれば、教えてください!!
Laravel 5.3 パスワードリセット後にログイン画面にリダイレクトする

## 概要

* Laravel5.3のmake:authで自動生成されるパスワードリセットの処理を修正する

## 目的

* パスワードリセット時にログインさせずにログイン画面にリダイレクト

## 手順

* ResetPasswordControllerの内容を修正する

## やったこと

* ~~ResetPasswordControllerで使われてるResetsPasswordsを継承したクラスを使う~~
    * traitのメソッドをオーバーライドできないのでエラーが出る
* 変更したい処理(ResetsPasswords)のメソッドをResetPasswordControllerに定義する

```php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
use Illuminate\Support\Str;

class ResetPasswordController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Password Reset Controller
    |--------------------------------------------------------------------------
    |
    | This controller is responsible for handling password reset requests
    | and uses a simple trait to include this behavior. You're free to
    | explore this trait and override any methods you wish to tweak.
    |
    */

    use ResetsPasswords;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }
    
    /* ResetsPasswordsのメソッドを定義する */
    protected function resetPassword($user, $password) {
        $user->forceFill([
            'password' => bcrypt($password),
            'remember_token' => Str::random(60),
        ])->save();

        return redirect('/login');
    }
}
```

* 優先度的には親クラスのメソッド < trait < 定義してあるメソッド らしい
* traitぱっと見わかりづらいけどうまく使えば便利そう
接続者のリモートアドレスを取得する

`req.connection.remoteAddress`から取得することが可能です。
なお、サブネットも含まれていますので、IPアドレスのみを取得する場合は、
以下のように抜きだすと良いでしょう

```js
 app.get('/', function(req, res) {
    const remoteAddress = req.connection.remoteAddress;

    const splittedAddress = remoteAddress.split(':');
    const ipAddress = splittedAddress[splittedAddress.length - 1];
  
    res.json({yourIP: ipAddress});
  });
```
fx0にCyanogenModを入れる

# Fx0 (LGL25)のCyanogenModインストールとストレージ拡張について
日本語の記事が少なかったので自分のメモもかねてまとめています。
(注) 現状のまとめではebay等で売っている開発者向けのOSが入ったFx0について扱っています。国内販売されている物でも少し別の方法を行えばできるとの情報もありますが、未確認です。
(注) やる際はすべて自己責任でお願いします。

# 1.前準備
- fx0に対してadbコマンドが通るようにしておく。それぞれデバイスマネージャーから手動でインストールするか、[公式サイト](http://www.lg.com/jp/support/support-mobile/lg-LGL25)からインストーラーをダウンロードしてインストールします。  
私の場合はwindowsで試したので手動でandroid-sdk\extras\google\usb_driverにあるドライバをadbとfastboot両方インストールしました。
- 端末側の操作で「端末情報」→「その他の情報」→「開発者メニュー」でadbコマンドが使えるようにします。

# 2.Download Modeに入れるようにする
Download Modeに入るためにはlafパーティションを消さなければならないので消します。
PCとスマホをつないで
`adb shell`
`su -`
`dd if=/dev/block/platform/msm_sdcc.1/by-name/laf of=/sdcard/laf.img`
とコマンドを打って/sdcard/直下にパーティションごとバックアップします。
その後
`adb pull /sdcard/laf.img`
やMTP接続等でパーティションをPCにバックアップしておきます。
これで電源を切った状態から 音量+ボタン を押しながらMicroUSBをつなぐとDownload Modeに入ると思います。

# 3.Download ModeからTWRPを起動してROMを入れる
[redditのスレッド](https://www.reddit.com/r/fx0/comments/4s6us1/cyanogenmod_110_b3_stays_the_course/)にtwrpのダウンロードリンクがあるのでダウンロードし、Download Modeの状態で
`fastboot boot ./path/to/twrp`
でtwrpを読み込みます。
いきなりROMを焼くと失敗したときのショックが大きいのでbackupから一通りのデータをバックアップしておきます。バックアップデータは端末内に保存されるのでadb pullやMTPでマウントしてバックアップしておきます。

バックアップが終わったら、先程の[redditのスレッド](https://www.reddit.com/r/fx0/comments/4s6us1/cyanogenmod_110_b3_stays_the_course/)からROMとGappsをダウンロードし、デバイス内に転送。twrpからインストールすればROM焼きは完了です。

# ROM容量を増やす
そのままROMを焼くとなぜか容量が4GB程しか存在しないので増やします。
redditの[この投稿](https://www.reddit.com/r/fx0/comments/4pfvwt/repartitioning_internal_sd_card_to_a_proper_size/)を参考にしています。
作業を行う上で、上記ではバックアップのためにtwrpをインストールしていませんでしたが、今度は
`fastboot flash recovery ./path/to/twrp`
でインストールしておくと作業が楽になります。
また、[ここ](http://code.metager.de/source/raw/CyanogenMod/android/bootable/recovery/utilities/parted)からpartedをダウンロードし端末内に入れておきます。
その後は以下の通りです
パソコンから
`adb shell`
と入力しshellにつなぎ
`cd /path/to/parted/`
でpartedを入れたフォルダまで移動します。
その後
`cp parted /sbin/`
で/sbin/内にコピーし
`chmod +x parted`
で権限をつけます。
その後
`cd`
コマンドでrootまで戻り、
`parted /dev/block/mmcblk0`
と入力します。一応パーティションを確認するため、
`print`
と入力しパーティション一覧を確認します。
恐らく37がuserdata、38がsdcardになっています。
それらをパーティションごと消します。重要なデータがある場合はバックアップしてください。
パーティションを削除する際は
`rm 37`
`rm 38`
と番号指定で消します。
その後新しくパーティションを作るため、以下のコマンドを入れます。(ext4で作ることができないのでext2で作り、後でフォーマットします。)
`mkpartfs primary ext2 2210MB`
endの場所を聞いてくるので
`15.6GB`
と入力します。
最後に
`name 37 userdata`
というように作成したパーティションに名前を付け、リカバリーを再起動します。(twrpで操作できます)
再起動したらwipe→change file systemでdata領域をext4に変更して終了です。

# 参考サイトなど
最新版のROM含めてFx0についてはredditで議論されています。
https://www.reddit.com/r/fx0/
Zabbixでログファイルを監視する

# 1.はじめに
ほぼ自分のメモ用です。習熟してきたら整理して書き直すかも。

# 2.環境
Zabbix 3.0 on CentOS7 on AWS。
環境構築は今回は対象外。
Zabbixサーバ自身に/var/log/jinnai73というログファイルを作って監視してみる。

# 3.実践
## 3-1.監視対象ログファイルを作成する

```
[root@ip-10-0-128-4 ~]# touch /var/log/jinnai73
[root@ip-10-0-128-4 ~]# ls /var/log/jinnai73
/var/log/jinnai73
```

できました。

## 3-2.アイテムを設定する

```
Name: Log
Type: Zabbix agent(active)
Key: log[/var/log/jinnai73]
Type of information: Log
```

![Pic00.png](https://qiita-image-store.s3.amazonaws.com/0/126284/947ffcc8-fd0f-1e3b-1f5a-f5959cc11682.png)
できました。

Nameは適当につけてOKです。
TypeはZabbix agent(active)、passiveではログ監視ができません。
Keyはlog[ファイル名]。
Typeはlogに。
間違っていたらエラーが出るので、表示を見て直しましょう。

作成したらテストをします。
echoで適当な文字列「Test」などを書き込みましょう。
`date`しておくと、複数回書き込んだ時の見分けがつきやすいのでオススメです。

```
[root@ip-10-0-128-4 ~]# echo `date` Test > /var/log/jinnai73
[root@ip-10-0-128-4 ~]# cat /var/log/jinnai73
Thu Oct 27 22:51:22 JST 2016 Test
```

ログファイルに書き込まれたことを確認したらZabbix Webに戻って。
Monitoring>Latest dataを選択。
![Pic01.png](https://qiita-image-store.s3.amazonaws.com/0/126284/5836e745-d800-cc2a-e977-0347381c6ccf.png)

Logの行のLast valueに、さきほど書き込んだTestが入っています。
Historyを選択して詳細も見ちゃいましょう。
![Pic02.png](https://qiita-image-store.s3.amazonaws.com/0/126284/72083558-2e76-d8d5-1550-2a5f68b7add0.png)

できました。

余談ですが、テストもせずに「できました」というエンジニアがたまにいます。
~~滅べばいいのにと思います。~~
変更とテストは必ずセットで。
いやむしろ、テストと変更は必ずセットで。
先にテストを考えてから、テストを満たす変更方法を考えましょう。

## 3-3.トリガーを設定する
ログファイルに特定の文字列が出力された時に、Zabbix webに出力が出るようにしましょう。

```
Name: Log error detected
Expression: {Zabbix server:log[/var/log/jinnai73].regexp(error)}=1
Severity: Warning
```

![Pic03.png](https://qiita-image-store.s3.amazonaws.com/0/126284/3c466c42-0191-611d-8e6b-283730f08790.png)
できました。
NameやSeverityは適当に。
Expressionは全体で条件式となっており、条件を満たすとトリガーが発動します。
条件式の左辺はアイテムのキー.トリガー関数という書式になっています。
今回はregexp関数を使っていますね。
これはアイテムの最新の値の中にregexp()の引数が含まれていたら1を返す関数です。

全体として、アイテムlog[/var/log/jinnai73]の最新値にerrorが含まれていたらトリガーが発動します。

では試してみましょう。

```
[root@ip-10-0-128-4 ~]# echo `date` error >> /var/log/jinnai73
[root@ip-10-0-128-4 ~]# cat /var/log/jinnai73
Thu Oct 27 23:32:45 JST 2016 Test
Thu Oct 27 23:32:49 JST 2016 error
[root@ip-10-0-128-4 ~]#
```

ログファイルにerrorを追記します。
（途中で間違えて上書きしてしまったため、時間が少し変わっています。。。）

Zabbixを見てみましょう。
![Pic04.png](https://qiita-image-store.s3.amazonaws.com/0/126284/069506c3-1be6-b661-cbd7-f890f332b9aa.png)
しっかりとトリガーが発動していますね。
ログに追記してトリガーを解消してみます。

```
[root@ip-10-0-128-4 ~]# cat /var/log/jinnai73
Thu Oct 27 23:32:45 JST 2016 Test
Thu Oct 27 23:32:49 JST 2016 error
Thu Oct 27 23:36:24 JST 2016 fixed
[root@ip-10-0-128-4 ~]#
```

最新のログをfixedにしました。

![Pic05.png](https://qiita-image-store.s3.amazonaws.com/0/126284/e694c2f1-e76e-8a30-f690-d4b359565069.png)
トリガーも解消されていますね。

# 4.おわりに
インフラ構築部隊を外れて運用側の人間になったため、しばらくはzabbix等で遊んでいこうと思います。
Swift3でAVplayerLayerをUIViewのレイヤーとする時

```swift

final class AVPlayerView : UIView {
  override public class var layerClass: Swift.AnyClass {
    get {
      return AVPlayerLayer.self
    }
  }
  
  private var playerLayer: AVPlayerLayer {
    return self.layer as! AVPlayerLayer
  }
  
  func player() -> AVPlayer {
    return playerLayer.player!
  }
  
  func setPlayer(player: AVPlayer) {
    playerLayer.player = player
  }
  
  func setVideoFillMode(fillMode: String) {
    playerLayer.videoGravity = fillMode
  }
  
  func videoFillMode() -> String {
    return playerLayer.videoGravity
  }
}
```

こんな感じ。
layerClassのoverrideが出来なくなってた。
jarファイルの中身を調べる

最近、Javaでクラスファイルをしてしてコンパイラしたときに、
エラーが出た。

その時に出たエラーはjarファイルの読み込みエラーでした。
jarファイルが実際にあるかを調べるためのコマンドを調べたところ以下のコマンドがあるとのこと。

jar tf <対象jarファイル>

Windows環境で環境変数にjdkが指定されているならば、
コマンドプロンプトで使うことが出来ます。
【備忘録】バックエンドから渡されたrailsファイルを扱う【フロントエンド】


# 手順

## gem(ライブラリ)をインストール

`bundle install --path vendor/bundle`

- 初回はpathをつけないとグローバルにインストールされてしまう

- 以降は、サブコマンド以下省略で`bundle`だけでもよい

- `Gemfile.lock`（ない場合は`Gemfile`）をもとにインストール


## 環境変数の設定

`vim .env`
AWSのkeyなど諸々

## mysql起動

`mysql.server start`


## dbを作成

`bundle exec rake db:create`
`bundle exec rake db:migrate`


## seedデータを作成

`bundle exec rake db:seed`
(２回め以降は rake db:reset)

※dbを作成とseedデータを作成をまとめて`bin/rake db:setup`

## railsサーバ起動

`bundle exec rails s`

もしくは

`bundle exec rails s -b ${IPアドレス}`


# おまけ

## エラー

### nokogiriがインストールできない

#### オプションをつけてみる

`bundle config build.nokogiri --use-system-libraries`

> 参考
[bundle install で nokogiri をインストールしろと言われる解決方法](http://qiita.com/pugiemonn/items/4b23a709ed194b02be6d)

#### libxml2のエラー

```bash
ERROR: cannot discover where libxml2 is located on your system. please make sure `pkg-config` is
installed.
```

```bash:対策
brew link --force libxml2
```

> 参考
[OSX への nokogiri 1.6.8.rc3 の install でハマって解決したメモ](http://qiita.com/south37/items/63c938474bf35b30c988)

### ポートが使用中

`Address already in use - bind(2)`

プロセスを殺す
`lsof -i:3000`
`kill -9 xxxxxx`

[RailsでWARN TCPServer Error: Address already in use – bind(2)がでたときの対処法](http://blog.be-open.net/ruby_on_rails/rails-webrick-error/)

### Gemfile.lockに書かれているバージョンよりBundlerが古い

`gem install bundler`でアップグレード
Laravel 5.3 でメールを送る

# きっかけ
* Laravelのドキュメントを読んでいたら [Laravel 5.3](http://laravel.com/docs/5.3/mail) と [Laravel 5.2](http://laravel.com/docs/5.2/mail) のメール関連のページ内容が全く違うことに気づいて、おう変わったんやな？　と思いサンプル通りにやってみた。
* Mailables？ なんて訳せばいいのこれ（という感じなので本文はMailablesで押し通します）

# Mailablesを作る
```bash
php artisan make:mail HogeShipped
```

# Mailablesを書く
## メモ
* build メソッド内で各種設定をする感じっぽい。
* HTMLメールの場合は view メソッド、プレーンテキストの場合は text メソッドを使う
    * ※今回はテキストメールを送りたいので text メソッドを利用
* from メソッドは 1つ目の引数がメールアドレス、2つ目が表示名っぽい
* このクラスの public なプロパティが view に渡るっぽいので、呼び出し側から渡せるようにコンストラクタの引数を設定

## コード
```php:app/Mail/HogeShipped.php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class HogeShipped extends Mailable
{
    use Queueable, SerializesModels;
    
    public $options;
    public $data;
    
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($options, $data)
    {
        $this->options = $options;
        $this->data = $data;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from($this->options['from'], $this->options['from_jp'])
            ->subject($this->options['subject'])
            ->text($this->options['template']);
    }
}
```

# 送信部分を書く
## メモ
* オプションとデータを上のクラスに渡してあげる

## コード
```php:app/Http/Controllers/HogeController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Mail\HogeShipped;
use Mail;

class HogeController extends Controller
{
    public function send()
    {
        $options = [
            'from' => 'hoge@hogehogehogehoge.hoge',
            'from_jp' => 'ほげほげ',
            'to' => 'fuga@fugafugafugafuga.fuga',
            'subject' => 'テストメール',
            'template' => 'emails.hoge.mail', // resources/views/emails/hoge/mail.blade.php
        ];
        
        $data = [
            'hoge' => 'hogehoge',
        ];
        Mail::to($options['to'])->send(new HogeShipped($options, $data));
    }
}
```

# メールテンプレートを書く
```php:resources/views/emails/hoge/mail.blade.php
{{ $data['hoge'] }}
```

以上でたぶん送信できるはず。
P2インスタンスにpip3でTensorFlowを入れる

p2インスタンスにPython3を入れてpipでTensorFlowを入れるだけです。
Tesla K80で遊ぼう。

# 要件

TensorFlowは例によって

* Python 2.7 and Python 3.3+
* Cuda toolkit >= 7.0
* cuDNN >= v3

compute capabilityもTesla K80は3.7あるので安心。
[CUDA GPUs | NVIDIA Developer](https://developer.nvidia.com/cuda-gpus)

# 導入方法

## インスタンスを立てる

TensorFlowはUbuntuがお好きのようなのでUbuntu公式からAMIを探してきた。
[Ubuntu Amazon EC2 AMI Finder](https://cloud-images.ubuntu.com/locator/ec2/)

わたしはUbuntu16.10のhvm:ebs-ssdのやつにしてみた。

## 必要なものを入れる

定番

```sh
sudo apt-get update
sudo apt-get upgrade
```

Python3(3.5.2+が入った)

```sh
sudo apt-get install python3-pip python3-dev
```

CUDAは最新が8。wgetで持って来れるしコマンドは[CUDA 8.0 Downloads | NVIDIA Developer](https://developer.nvidia.com/cuda-downloads)のフローに従えばわかる。

```sh
sudo apt-get wget
wget https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64-deb
sudo dpkg -i cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64-deb
sudo apt-get update
rm cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64-deb
sudo apt-get install cuda
```

cuDNNはアカウントつくって[cuDNN Download | NVIDIA Developer](https://developer.nvidia.com/rdp/cudnn-download)からcuDNN Library for Linuxを持ってきてアップしないといけない。

```sh
tar xvzf cudnn-8.0-linux-x64-v5.1-tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

cd /usr/local/cuda/lib64
sudo ln -s libcudart.so libcudart.so.7.5
```

最後の2行は `ImportError: libcudart.so.7.5: cannot open shared object file: No such file or directory` がでてしまったときの対策。[CUDA 7.5 fails with pip install and docker (Ubuntu 14.04) · Issue #20 · tensorflow/tensorflow](https://github.com/tensorflow/tensorflow/issues/20)の下の方。

パスを通しておく。

```sh
export CUDA_HOME=/usr/local/cuda
export CUDA_ROOT=/usr/local/cuda
export PATH=$PATH:$CUDA_ROOT/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_ROOT/lib64
```

GPUありのほうのTensorFlow本体を入れておしまい。

```sh
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.11.0rc0-cp35-cp35m-linux_x86_64.whl
pip3 install --ignore-installed --upgrade $TF_BINARY_URL
```

# 参考文献

[Installing TensorFlow on an AWS EC2 P2 GPU Instance - ExpressionFlowExpressionFlow](http://expressionflow.com/2016/10/09/installing-tensorflow-on-an-aws-ec2-p2-gpu-instance/)
ソースコードから入れるならこっち。
【Swift】App Store ランキング表示アプリのサンプルコード

# 概要
App Store ランキングのTop30を表示するアプリのサンプルコードです。
[PureLayout](https://github.com/PureLayout/PureLayout)を利用し、今回もStoryboardは未使用です。

# ATS許可設定
API自体はhttps対応ですが、画像URLがhttpのため
App Transport Security(ATS) を許可しないと画像が取得できません。
Info.plist → 右クリック → Opne As → Source Code で以下設定追加が必要です。

```
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
```

# github
https://github.com/menomoto/Sample_Apps/tree/master/iosAppRanking

# 結果
![サンプル](http://i.imgur.com/gVxPlUV.gif)
newrelicの不要になったサーバーのレポートを削除

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/e5a9ef4f-03ab-69e2-3bff-2d441facac53.png)


## そもそも消さなくていい
別にじゃまにならないし、検索のときに引っかかる数がすくなるくらいのメリットしかないです。
監査的なものがあるなら、むしろ消してはだめかも。
利用する時は自己責任で。

## 経緯
数年くらいまえに、これきになるから消す方法ないかな？って言われて書捨てスクリプトを書いたのが、
PC整理していたらでてきたので、共有しとこうと。

`ruby clean_newrelic.rb`で実行できる。(自己責任で！！)

```clean_newrelic.rb
require 'net/http'
require 'uri'
require 'json'

BASE_URI = 'https://api.newrelic.com/v2/servers.json'.freeze
API_KEY = 'user_api_key'.freeze


def get_json(uri)
  req = Net::HTTP::Get.new uri
  req['X-Api-Key'] = API_KEY
  response =
    Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
      http.open_timeout = 5
      http.read_timeout = 10
      http.request req
    end
  json = response.body
  JSON.parse(json)
end

def delete_server(server_id)
  %x(curl -s -X DELETE "https://api.newrelic.com/v2/servers/#{server_id}.json" -H "X-Api-Key:#{API_KEY}" -i)
end

# 一回に取得できるサーバー情報が200で,
# limitを増やすやり方が分からなかったので、loopしてます。
# filter的なパラメータで絞っても効かなかった。
# 参考 https://docs.newrelic.com/docs/apis/rest-api-v2/requirements/new-relic-rest-api-v2-getting-started
2.times do
  results = get_json(URI.parse(BASE_URI))
  Array(results['servers']).each do |server|
    if !server['reporting'] && server['id']
      delete_server server['id']
      print '.'
    else
      print 'F'
    end
  end
end

```
シングルノードApache Sparkの有用性について

[Apache Spark](http://spark.apache.org/)をご存知でしょうか。
去年くらいからとても流行っている分散処理フレームワークです。
大量のデータを集計・分析することができます。
公式サイトによれば、インメモリで動作する場合、Hadoop MapReduceより100倍早いそうです。

分散処理は、基本的には１台のマシンでは処理しきれない規模の集計や分析が必要となる場合に必要となります。
Sparkは分散処理のフレームワークなわけです。大量のマシンをクラスターとして扱うことに長けています。
そして当たり前ですが分散処理にはどうしてもオーバーヘッドが発生します。
いくらSparkが高速といっても、シングルノードで実現可能な集計処理をSparkで動かせば遅くなります。
では、シングルノードで計算できるようなデータしか持たないシステムではSparkを使うことにメリットはないのかというと、そんなことはありません。
私は実際に分散処理を必要としない規模のデータにSparkを適用しています。そしてとてもSparkに助けられています。
非分散処理(シングルノード)で使うSparkのメリットについて自分なりに思っていることを書き連ねていきたいと思います。

## JSONをSQLでテーブルのように扱える

NginxのアクセスログをJSON形式で出力したものを集計したいとします。
Sparkならこんな感じでアクセスログを集計できます。

```
val accesses = spark.read.json("paht-to/access.log")
accesses.createOrReplaceTempView("accesses")
spark.sql("SELECT request_uri,COUNT(*) AS cnt FROM accesses GROUP BY request_uri ORDER BY cnt LIMIT 10").show()
```

リクエストが多かったURIのTOP10を表示するプログラムです。
JSONをSQLを使うことで簡単に集計できています。
超便利ですね。

## CPUコア数があれば自前のシングルスレッド処理よりはたぶん早い

Sparkを使えば自分でマルチスレッド処理を実装しなくても勝手にマルチスレッドで処理してくれます。
これを考慮すると、自分でシングルスレッドな集計処理を書くのと比べたらむしろSparkの方が速いのではないでしょうか。

Sparkと同系統の分散処理フレームワークで行っていた処理をマルチスレッドのJavaコードとしてスクラッチで書き直したことがあります。
少なくとも１０倍以上は早くなることを想定していたけれど、4～5倍程度しか高速化しませんでした。これは２コアでの結果です。
Sparkはそのフレームワークと同等もしくはそれより速いと仮定すると、自分でシングルスレッドの集計処理を書くのとSparkで集計処理するのとでは、４コア以上あればSparkの方が速いことになります。

## Parquetを使うことができる

Parquetというカラム指向のデータフォーマットがあります。
JSONよりも読み込みの効率がよく、集計に向いています。
SparkではParquetを直接扱うことができ、簡単にJSONと相互に変換できます。

## 色々なデータソースを同時に扱える

Sparkが扱えるのはJSONやCSV、テキストなどのファイルだけでなく、MySQLやHBaseなどのデータベースも扱えます。
SQLでJSONとMySQLのテーブルをJOINしたりできるわけです。
大量のデータ同士でJOINさせるのはあまり現実的ではないかもしれませんが、集計結果をレポート用の
データにまとめるような場合にはかなり便利です。

## 複雑な集計をすばやく実装できる

色々なデータソースを扱えて、SQLで集計できるため、すべて手続き型言語で集計処理を書くより遥かに早く実装できます。
もしマルチスレッドで書こうと思ったらさらに時間がかかるでしょう。

# まとめ

これを見てシングルノードでもSparkが便利だと思っていただけたでしょうか。
頑張ってスクラッチで集計処理を書いたところでSparkとくらべてべらぼうに早くなるわけでもなく、上記のメリットがちょっとしたパフォーマンスの劣化で得られるのであればSparkを使った方がよいのではないかというのが、私の考えです。たいしたデータ量ではなくてもSparkは有用です。
少しでもこれでSparkに興味を持ってくれる人が増えれば幸いです。
【GitHub】に載せたくない環境変数の書き方 Python

# 概要
Railsでは外部に見せたくない環境変数の記載は多くあるが，
Pythonは少ないのでPythonにおける環境変数の記載方法を記載する．

# dotenvとは
・環境変数(API keyなど)を見せずにGitHubにアップロードする方法
・テンプレートを指定でき，API keyを入れ込めばすぐ使える

# Pythonでのdotenv
Pythonのdotenvは，python-dotenvと少し名前が違っている．
https://github.com/theskumar/python-dotenv

# 実際の使用方法例
## Install
```
$ pip install python-dotenv
```
pip installの使い方は他のサイトを参照してください

## 環境変数の記入方法
```c:.env
API_KEY = "XXXXXXXXX"
```
環境変数を**.env**というファイル名で記入する．
この**.env**ファイルにはAPI KEYの情報が入っているので**.gitignore**の対象にする
また，GitHubでcloneしたときに.envのテンプレートを知るために，
**.env.sample**というものを用意しておくと良い．
.env.sampleを参考にし

```c:.env.sample
API_KEY = "<API_KEY>"
```
当然だが，.env.sampleにはAPI keyの記入は控える．
.env.sampleはテンプレートとなるのでGitHubにpushする．

## dotenvを用いた.envからのAPI keyの読み出し

```python:settings.py
# coding: UTF-8
import os
from os.path import join, dirname
from dotenv import load_dotenv

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

AP = os.environ.get("API_KEY") # 環境変数の値をAPに代入
```

## 環境変数を使用する
settings.pyに環境変数の値を代入した変数APがあるので，settings.pyをimportする．

```python:sample.py
# coding: UTF-8
import settings

API_KEY = settings.AP

## 以降ソースコード
```

# あとがき
今回の記事はサンプルが少ないので，実際に筆者が作った
Twitterのつぶやきが出来るソースコードを貼っておく．
https://github.com/CrowCrowzard/tweet

# 参考文献
[python-dotenv](https://github.com/theskumar/python-dotenv)
AndroidのGradleビルドでProguardのバージョンを指定する方法


### Proguardのバグはつらい

Androidの開発中にうっかり特定バージョンのProguardのバグを踏んでしまい、痛い目を見ることがあります
バグっている箇所の特定もつらいし、回避する方法を探すのにも一苦労です

### そんな時は

以下のようにProguardのバージョンを指定してあげると幸せになれます

```gradle:build.gradle
buildscript {
    configurations.all {
        resolutionStrategy {
            force 'net.sf.proguard:proguard-gradle:6.1.0beta2'
        }
    }
}
```

以上です。
ChromeのデベロッパーツールでCSSのソースを追うメモ

#概要
自分で作ったCSSならまだしも、他人の（今回はWordPressの任意のテーマの）CSSを追うこともある。
そのときの修正箇所を見つけやすくするためのメモ。
これに気づくまではソース直追いしてたんだ...　つら。

#行動開始
#余計なエリアを「詰めたい」
どうするか？？この時点で修正すべきWebページが初見でも大丈夫だ。
![image](https://qiita-image-store.s3.amazonaws.com/0/94562/89037f65-3b4f-5c98-dcfb-34fdf92e64c6.png)

##デベロッパーツールの起動
右クリックで「検証」
![image](https://qiita-image-store.s3.amazonaws.com/0/94562/3a82f146-ba50-0edb-b65c-abdc288cc438.png)

##編集したいエリアをざっと探す
デベロッパーツールが起動するので、ソースを追って編集したいエリアのあたりを探し当てると、なにやら３つにカラーリングされた。
![image](https://qiita-image-store.s3.amazonaws.com/0/94562/1af853d3-1fa9-fdf1-4976-f6a4042c4730.png)

##編集したいエリアの名前が判明
編集したいエリアをポイントすると緑のエリアは「padding」である、ということがわかった。
「Computed」タブ<font color="lightgray">（タブの名前書いてないけどpaddingだと突き詰めた絵が描いてある場所がComputedタブです）</font>で padding がつくようなところの数字（今回はpadding-topの 4% のやつ）の右のリンクをクリックするとソースに飛べる。
![image](https://qiita-image-store.s3.amazonaws.com/0/94562/1c50e28a-81c7-0f5d-af45-a8c0ccfca204.png)

###値の一時的な増減もできる
なお、「Computed」タブの「4%」のところをクリックすると「Styles」タブの「4%」のところが黄色になって、さらに「Styles」タブの「4%」のところをクリックすると「↑」「↓」で値が変わるので上下してみて、より詳細に場所を突き詰めることもできる。
そして、「Styles」タブでもすぐ横にソースへのリンクがあるので click!
![image](https://qiita-image-store.s3.amazonaws.com/0/94562/ebd288e7-4cb2-6442-c64b-5e3ca6f60fed.png)


##ソースの位置が判明
リンクをクリックすると、「Sources」タブに勝手に移って、ソースの場所へ行ってくれる。
同じ要領で好きなだけ編集してくれ。もう何千行ものCSSソースがあっても大丈夫だ！
![image](https://qiita-image-store.s3.amazonaws.com/0/94562/a2c3e4df-3882-4a2a-91e9-e0ffdd9c8698.png)

##おまけ
WordPressはタブレット用、とかiPhone用、とかのCSSも書いてあるので、切り替えて表示をチェックできる！
![image](https://qiita-image-store.s3.amazonaws.com/0/94562/df5ca405-fd66-f561-ecca-31dc0b075b1a.png)
javascript で fadeOut() したい

opacityだけじゃなく、display:noneにもしたいのだ。
jQueryだとものすごく簡単にできるが、jQueryが使用できない場面とか、ふとjQueryじゃなくjsだけで書いてみようかな気持ちのときに。

# まずはjQueryのfadeOut
これだけで、ふわっと消えるってほんと便利ですよね。

```html:inedx.html
<p id="text">This is a pen.</p>
```

```javascript:app.js
$('#text').click(function() {
  $('#text').fadeOut();
});
```

# JavaScript + CSS3
ふわっとの部分をCSS３で実現。
クリック時にクラスをつけcssでopacityを、display:noneはjs側で。

```html:inedx.html
<p id="text">This is a pen.</p>
```

```css:style.css
.fadeout {
  animation : fadeOut 1s;
  animation-fill-mode: both;
}
@keyframes fadeOut {
  0% {
    opacity: 1;
  }
  100% {
    opacity: 0;
  }
}
```

```javascript:app.js
var text = document.getElementById('text');
text.addEventListener('click', function(){
  text.classList.add('fadeout');
  setTimeout(function(){ 
    text.style.display = "none"; 
  }, 1000);
}, false);
 
```

サンプルはこちら（CodePen）
https://codepen.io/snjssk/pen/EgRGGp
抽象メソッドをsuper経由で使う ~ abstract override ~ 

よくあることですがあるメソッド overrideする時に元のメソッドをoverrideしたメソッドを呼び出すことがありますね

```scala
trait Fuge {
  def doSomething(): Unit = println("hello");
}

trait Hoge extends Fuge {
  override def doSomething(): Unit = super.doSomething()
}
```


ところでsuper経由で呼び出すメソッドが抽象メソッドだとこういう場合コンパイルが通りません

```scala
trait Test {
  def doTest(): Unit
}

trait BeforAndAfterTest extends Test {
  override def doTest(): Unit = {
    println("befor");
    super.doTest();
    println("after");
  }
}
```

こういう時にoverrideと一緒にabstractもつけるとコンパイルが通ります

```scala
trait Test {
  def doTest(): Unit
}

trait BeforAndAfterTest extends Test {
  abstract override def doTest(): Unit = {
    println("befor");
    super.doTest();
    println("after");
  }
}
```

abstract override　それほど使うケースがないのであまり知られていませんね
それでは快適なscala lifeを
GitHubにPushしようとしたらCould not read from remote repository と怒られた

#Could not read from remote repository

このエラーはローカルにクローン（落としてきた）してきたリポジトリがリモートとつながっていないため現れるエラーです

何処にpushすればいいんすか？と迷ってる状態です。だから、ローカルのリポジトリをリモートに登録しましょう。ここに送ってね！とパソコンに教えてあげるのです。


#クローンしてきたURLを使う

私的なスクショで大変申し訳ありません。気にしないでください。下記パブリック（公開）なリポジトリ画面ですが、ここのクローンするときに使った画面のURLを指定してあげれば、リモートに登録できます



<img width="1054" alt="スクリーンショット 2016-10-27 20.49.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/1eefcd83-831f-aebf-05f5-a158decbe40b.png">


#コマンド

```shell-session

git remote add master URL

```

masterはブランチの名前ですから、あなたのブランチがoriginなら

```shell-session

git remote add origin URL

```

みたいにそれぞれやってください
これで、originというブランチのURLに送ってねと登録することができます

#最後にpushする

登録したブランチ名(master）でpushすれば完了です

```shell-session

git push master

```
mysql5.6 では暗黙のインデックスが削除されるようになっている

# mysql5.6 では暗黙のインデックスが削除されるようになっている

mysql では外部キー制約を作成すると暗黙のうちにインデックスが作成されますが、どうもバージョンによってそのインデックスの挙動が異なるようです。

```sql:mysql5.6
# 何度も実行したいので掃除
DROP TABLE IF EXISTS t_child;
DROP TABLE IF EXISTS t_parent;

# 親子テーブルを作成
CREATE TABLE t_parent (
    parent_id INT(11) NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (parent_id)
);
CREATE TABLE t_child (
  child_id INT(11) NOT NULL AUTO_INCREMENT,
  parent_id INT(11) NOT NULL,
  PRIMARY KEY (child_id)
);

# インデックスを確認
SHOW INDEX FROM t_child;

# 外部キーを作成
ALTER TABLE t_child ADD CONSTRAINT fk_PrentChild FOREIGN KEY (parent_id) REFERENCES t_parent (parent_id);

# 外部キーを作成したので fk_PrentChild というインデックスが作られている
SHOW INDEX FROM t_child;

# ↑で見たインデックスと全く同じインデックスを作ってみる
CREATE INDEX fk_PrentChild ON t_child (parent_id);
/* Affected rows: 0  Found rows: 0  注意: 0  Duration for 1 query: 0.015 sec. */
# 何故か通った

# インデックスを確認（増えてない）
SHOW INDEX FROM t_child;

# もう一度作ってみる
CREATE INDEX fk_PrentChild ON t_child (parent_id);
/* SQL エラー  (1061): Duplicate key name 'fk_PrentChild' */
# 今度は怒られた
```

mysql5.5 だと1回目の `CREATE INDEX fk_PrentChild ON t_child (parent_id)` は実行できず、 `Incorrect index name` と言われます。
mysql5.6 だと上記の通り、全く同じインデックスを明示的に作っても1回目は通ります。そして2回目でエラーになります。
また、 5.6 でも`CREATE INDEX fk_hogera ON t_child (parent_id)` のようにすると最終的なインデックス数は2個（PRIMARY, fk_hogera）となり、fk_PrentChild が消えています。

これらのことと、下記の公式マニュアルの記述：

https://dev.mysql.com/doc/refman/5.6/ja/innodb-foreign-key-constraints.html
> このインデックスは、外部キー制約を適用するために使用できる別のインデックスを作成した場合、あとで暗黙のうちに削除される可能性があります。

とあるので、5.6 からこのような挙動になったようです。
間違っていたら誰かご教示ください。
ChromeDeveloperToolの便利さを説明する会(社内LT用)


ChromeやIEやFirefoxにはそれぞれ「開発者ツール」「検証ツール」といった名前のツールが付属しています。

WEBエンジニアにとっては当たり前の様に使うツールですが、
それ以外の方に対しては知名度が低いです。（と思ってます。）

WEBに携わらないとまず使う必要はないわけですが、開発用途以外でも出番はきっとあると思うので、「こんな使い方があるんだよ。」程度に覚えて置いていただけると幸いです。

# 前提
- 使用するブラウザはGoogleChromeです。
- GoogleChromeに付属するChromeDeveloperToolを例として記載します。

# そもそもなんなのこれ

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/e8087254-8385-eb53-715f-4838972700ae.png)

このスクリーンショットの右側にあるのがChromeDeveloperツールです。
Windowsの場合、Chromeを開いた状態で「F12」を押すことで出てきます。

# 何ができるの

- HTML/CSS/JSの定義を確認できます。
- その定義を編集できます。

要は、**WEB画面を、見た目だけ捏造できます**
※それだけのツールではありませんが…。

# いつ役に立つの？

## 例えば資料作成時

個人的には、資料作成の際によく使ってます。

- WEBアプリの紹介資料作成時
    - WEBアプリケーションの機能を説明する資料を作るとき。
- 手順書の作成時
    - 操作マニュアルを作るとき。
- 画面案の作成時
    - 既存の画面を変更した案を作成するとき。

例えば、WEB画面のスクリーンショットを撮影する時に、
個人情報が邪魔でそのままでは使えない時がありますね。
ペイントツールで潰すのも手間だし、データを投稿しなおすのはもっと手間です

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/97c05aab-4f50-6d0a-1cf5-b249b3268d4f.png)

そんなとき、Developerツールを使えばコンテンツの中身を直に書き換える事ができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/f02dbb94-f893-ab10-a5c4-f409702041c7.png)


↓このように。

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/4fbe75fe-701c-caf7-73cc-4559b73960ab.png)


資料作成用にわざわざ文章を投稿し直したり、修正する必要は無いんですね。

WEBアプリの開発者でなくても、お客様の現場にて業務をしている場合、既存のアプリの手順書を作成する機会もあるかと思います。

そんなときにこの機能を知っておけば、労力を大幅に削減できます。
多分。

## 例えば騙されずに済む（かもしれない）

twitterのダイレクトメッセージのスクリーンショットが公開されて炎上するケースをしばしば見かけますが、WEB画面なんて簡単に捏造できることを知っておけば、鵜呑みにできないことは容易にわかるわけです。

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/1ae6f9fd-3cbb-0d9b-e20c-b503947edfe3.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/f62edf7b-c08c-528e-734a-bf1b62284365.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/45099f44-7bcb-3124-24f5-4fe0954e2f8c.png)

捏造されたら…と思うと恐ろしいですが、HTTPの仕組み上どうしようもないですね。

## 例えばWEBデザインに関して的確に依頼を出せる

開発者でなくても、他社の作成したWEBアプリケーションの受け入れを行う場合があるかと思います。
（発注者の方とか、多分そうですね。）

その時にデザインに多少の不満があるとしましょう。
「ここの色がもうちょっと淡ければいいのに」

WEB画面のデザインは基本的には「CSS」という構文で表現されているわけですが、DeveloperToolを使用すればやはり容易に修正できてしまいます。


**例えば以下の画面の「右上のフォントのサイズが気に食わないんだ私は。」**という場合
![image](https://qiita-image-store.s3.amazonaws.com/0/50872/8c389a58-d4f9-d8cb-8f6d-0179e53b4347.png)


デザインを変更したい箇所に矢印を重ねれば…

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/5d008a47-c9c9-3db3-47fc-bf50797d4015.png)

↓適用されているデザインが見えます。

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/d23c0566-12d6-231c-23ad-669e26f6a30d.png)

こんな感じ。
CSSを変更してみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/55e9c2d6-1da2-0927-516d-7f18d58b77b7.png)

↓こんなことになりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/efd717cd-66c7-0dbe-e9ef-8b31d2ec71d8.png)

でかいですね。文字が。

![image](https://qiita-image-store.s3.amazonaws.com/0/50872/4145c79e-76b7-8bd4-260c-49e2540e9f9b.png)
色とかも変更できちゃいます。

このままDeveloperToolでデザインを調整することで、
最終的に「font-size: 30pxにしてくれませんか？」と
具体的なお願いをする事ができます。 
 
 開発者の立場でなくても、「受入れ」を担当する方であれば知っておいて損は無いツールかと思います。
 
# 結局
 
基本的にはWEB開発の支援ツールなのでWEBエンジニア以外の方はなかなか使う機会は無いかと思いますが、便利なツールではあるので知っておいて損はないかなと考えてます。どうぞご利用下さい。
Laravel5でAmazon S3からファイルをダウンロードする方法

## クラウドストレージが便利

[Laravel 5.2 ファイルシステム／クラウドストレージ](https://readouble.com/laravel/5.2/ja/filesystem.html)

ローカルのpublic下にあるファイルはこれで取得できる。

```php
Storage::disk('local')->get(public_path().'/ファイル名');
```

## Amazon S3のドライバを設定する

confgi下のfilesystems.phpにアクセスキーやバケット名を設定する。
ベタ書きはありえないので.envから取得する。

```php:config\filesystems.php
'cloud' => 's3',

'disks' => [
    's3' => [
        'driver' => 's3',
        'key'    => env('S3_ACCESS_KEY'),
        'secret' => env('S3_SECRET_KEY'),
        'region' => env('S3_REGION'),
        'bucket' => env('S3_BUCKET'),
    ],
],
```

## composer.jsonでパッケージをインストールする

composer.jsonのrequireに追加して``` composer update ```する

```json:composer.json
"require": {
    "aws/aws-sdk-php": "~3.0",
    "league/flysystem-aws-s3-v3": "~1.0",
}

```

## ドライバをS3にしてファイル取得してみる

```php:SampleController
$file = Storage::disk('s3')->get('ファイルパス') 
return response()->download($file);
```

結果：
``` is_file() expects parameter 1 to be a valid path, string given ```

ファイルの内容のバイナリ文字列をダウンロードしようとしてるためと思われる。

## こうしたらできた

```php:SampleController
$result = Storage::disk('s3')->getAdapter()->getClient()->getObject(['Bucket' => 'バケット名', 'Key' => 'キー']);
header('Content-Type: application/octet-stream');
$filename = '適当につけてください'
header("Content-Disposition: attachment; filename={$filename}");

// これで指定したファイル名で自動的にダウンロードされる
print($result['Body']);

// 画面遷移させない場合はnullを返しておく
return null;
```

## 補足① 存在チェックはしよう

``` Storage::disk('s3')->exists('ファイル名') ```
true/falseで返ってきます。


## 補足② 取得したいファイルの拡張子が分からないとき

```php

// これでMIMEが分かる
$contentType = $result['ContentType'];

// こんな感じで拡張子を返すメソッドを作っておくと便利
switch($contentType) {
    case 'image/png':
        return '.png';
    case 'image/jpeg':
        return '.jpg';
    case 'image/gif':
        return '.gif';
    case 'application/pdf':
        return '.pdf';
    default:
        return '.dat';
}
```

▼参考
[拡張子（Content-type）一覧](http://renoji.com/IT.php?Contents=Basic/Basic_Contents-Type.html)
[MIMEタイプ一覧](http://www.geocities.co.jp/Hollywood/9752/mime.html)

## 補足③ 現在日時をファイル名にしてダウンロードする

```php

// 拡張子
$extension = '.png'
$filename = strftime('%Y%m%d%H%M%S').$extension
```

20161027095602.png みたいになる。
Rubyでオブジェクトの中身を調べたい時によく使うメソッド

# Rubyでオブジェクトの中身を調べたい時によく使うメソッド
Rubyはクラスの定義やメソッドの定義の情報を実行時に持っているので、
`pry` などを使用してオブジェクトが今どういう状態なのか簡単に確認できる。
知っておくと便利な確認方法をメモとしてあげておく。

テスト用のコード

```ruby
class Sample
   @val = ""
   @@val2 = "class_variable"

   def initialize
     @val = "instance_variable"
   end

   def show
     puts @val
   end
end

sample = Sample.new

```


## インスタンス変数一覧を取得したい
インスタンスオブジェクトから、一覧が取得できる。

```ruby
[5] pry(main)> sample.instance_variables
=> [:@val]
```

## クラス変数一覧を取得したい
クラス変数はクラスオブジェクトから取得する。

```
[6] pry(main)> Sample.class_variables
=> [:@@val2]
[7] pry(main)> sample.class.class_variables
=> [:@@val2]
```

## インスタンスメソッド一覧を取得したい
メソッドの情報は、インスタンスオブジェクトではなく、クラスオブジェクトが情報を持っているので、
こちらから呼び出す。

```
[9] pry(main)> Sample.instance_methods(false)
=> [:show]
```

引数に与えるbool値をfalseにすると、そのクラスで定義されたメソッドのみを出力し、
trueなら親から継承したメソッドも含めて返す。

出力が大量にあるときは、以下のようにgrepを使うと便利。
```
[15] pry(main)> Sample.instance_methods(true).grep(/^to/)
=> [:to_json, :to_yaml, :to_yaml_properties, :to_param, :to_query, :to_enum, :to_s]
```

`method_missing`が定義されているクラスの場合、メソッド一覧にないものでも、何かしら使用されている場合があるので、注意が必要。

## クラスの親、祖先が知りたい
`Module#ancestors` を使う。

```ruby
[27] pry(main)> Sample.ancestors
=> [Sample,
 ActiveSupport::ToJsonWithActiveSupportEncoder,
 Object,
 PP::ObjectMixin,
 ActiveSupport::Dependencies::Loadable,
 JSON::Ext::Generator::GeneratorMethods::Object,
 ActiveSupport::Tryable,
 Kernel,
 BasicObject]
```

## メソッドの定義されている場所、内容が知りたい
Methodオブジェクトのsource_locationを使えば、メソッドが定義されている場所と行数が得られる。

```ruby
23] pry(main)> 1.method(:to_s).source_location
=> ["..(略)/gems/activesupport-5.0.0/lib/active_support/core_ext/numeric/conversions.rb", 103]
```

`pry`を使っているなら、以下のようにコメントと定義を得ることができて便利。

```ruby
[26] pry(main)> ? 1.to_s
 # コメントを表示・・・
[27] pry(main)> $ 1.to_s
 # ソースを表示・・・
```

他にも色々あるけど、とりあえずよく使いそうなのは以上。
また適宜追予定。
ES6 + babel + browserifyでjQueryプラグイン的なものを作りたかった

Gakuです。
JavaScriptのES6が本当に楽しくて毎日ガリガリやっています。

今回はjQueryプラグインちっくなものをES6で書いたところ、絶賛ハマったのでその解決方法を記載したいと思います。
# jQueryプラグインとは
[jquery プラグイン/作成](http://qiita.com/k4zzk/items/11e5dbd53cb93edb8b4d "jquery プラグイン/作成")
こちらの記事を参照して頂ければと思います。
jQuery撲滅運動支持者の僕としては、こんなコード書きたくないっす見たくないっす！。

要はjQueryを使用せずともブラウザJSで値を設定して、その値を元にコードが動けばいいわけです。
jQueryなんて使用せずに簡単に作れる！ｗｗｗそう思っていて時期も僕にはありました。

# 動くと思っていたコードが動かない
さて、jQueryプラグインちっくな物を作成しだした僕ですが、当初こんなコードを記述しました。

```js:index.js
'use strict';

class Index{
	hello(str) {
		console.log(str);
	}
}

module.exports = Index;
```

これをbabel+browserifyでES6→ES5へ変換し、「app.js」を作成します。
そのjsファイルを読み込み、下記のようなコードを記述しました。

```html:index.html
<html>
<head>
    <title>TestApp</title>
</head>
<body>
	<script type="text/javascript" src="./dist/app.js"></script>
	<script type="text/javascript">
		var index = new Index();
		index.hello("testaaaaaaa");
	</script>
</body>
</html>
```

めっちゃ動きそうですね。ただ、これ「Index is not defined(…)」でエラーになります。
ブラウザjsでIndexクラスを読み込めないためエラーが発生します。

# 問題はbrowserify
この問題はbrowserifyでjsファイルを読み出す際は必ず、[require]しないといけないために発生しています。
本来はこう書かなければいけないはずです。

```html:index.html
<html>
<head>
    <title>TestApp</title>
</head>
<body>
	<script type="text/javascript" src="./dist/app.js"></script>
	<script type="text/javascript">
        var Index = require('Index.js');
		var index = new Index();
		index.hello("testaaaaaaa");
	</script>
</body>
</html>
```

これであれば正しく動きそうです！
ただここで問題があります。
そう、今の各種ブラウザではES6をサポートしていないので[require]構文が存在しません。
よって、この書き方では「require is not defined(…)」でエラーが発生します＼(^o^)／

# 解決方法
解決方法は3パターンあると思われます。
## [手法1]
browserifyを使わない手です。
こうすればrequireを使用しない(使用できない)のでこの問題は発生しないと思います。
ただ、複数ファイルになると管理が面倒になるので、この手は使わないようにしました。
(簡単なプラグインですし、この方法もありっちゃありです。ただ、大きくなるときつくなると思われます。)

## [手法2]
2つ目がブラウザJSでrequireをサポートする手です。
これはいろいろ探したのですが良い方法が見つからず断念しました。
(※何か良い方法があれば教えて下さい(´・ω・`))
## [手法3]
3つ目が公開するjsファイルだけグローバルにする手です。
今回はこの手法で解決しました。
具体的にはindex.jsをグローバルにする記述を一文加える方法です。

```js:index.js
'use strict';

class Index{
	hello(str) {
		console.log(str);
	}
}

window.Index = Index; //module.exports = Index;からこの文へ変更
```

こうすることでindex.jsはグローバルとなり、index.htmlのブラウザJSからアクセス出来るようになります。

# おわりに
う～ん。何とも嫌な感じですが、今はこれが精一杯な気がします。
できればブラウザJSにrequireを使用できるようにする方法が一番良いと思います。
ただ、ES6は本当に書きやすいし、保守しやすい(これまでのjsと比べて)ので、jQueryを使うこと考えたらこの書き方でも十分ではないかと思っています。(jQueryなんて全部グローバルなわけですしｗ)

ってことで、この手法でこんなものを作ってみました。

![image.gif](https://qiita-image-store.s3.amazonaws.com/0/47132/54e83b3e-56cf-063b-1e64-302df628288d.gif)
[gaku3601/image-upload.js](https://github.com/gaku3601/image-upload.js "gaku3601/image-upload.js")
よかったらご活用下さい(´・ω・`)
sidekiq jid

https://www.snip2code.com/Snippet/210256/Sidekiq-find-schedule-job-by-jid-and-del

http://stackoverflow.com/questions/17109856/best-way-to-find-a-job-anywhere-in-sidekiq


http://stackoverflow.com/questions/12683222/are-there-console-commands-to-look-at-whats-in-the-queue-and-to-clear-the-queue

http://stackoverflow.com/questions/16416950/how-to-find-sidekiq-is-running-or-not

https://rubygems.org/gems/sidekiq-running/versions/0.0.4
CentOSにVLCをインストール

初めての投稿なので、投稿テストとしてCentOSにVLCをインストールする方法を投稿

現在CentOSのレポジトリに標準ではVLCをインストールできないので追加のレポジトリを登録します

1.nux-desktopをインストール

```ruby:nux-desktop
yum -y install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
```

2.VLCのインストール

```ruby:VLC
yum install vlc
```

これでインストールきない場合はご連絡くださいm(_ _ )m
[Unity]オブジェクトの座標の取得と変更

座標取得しようとしたら、うまくいかなかったのでその方法をメモ

#環境
・Unity 5.4.0f3

#コード
```:間違ってるコード
GameObject.Find("hogehoge").transform.position.x += 100;
```

こんな感じで、シーンからhogehogeオブジェクトを探して、そのx座標に100を加算したかった。
でも、これだとエラーが出たのでNG


```:正解のコード
Vector3 tmp = GameObject.Find("hogehoge").transform.position;
GameObject.Find("hogehoge").transform.position = new Vector3(tmp.x + 100, tmp.y, tmp.z);
```

うーん面倒臭い。
一度座標を取り出してから、再度代入という形にしないといけないみたい。

個別の座標を取るには、

```
float x = tmp.x;
float y = tmp.y;
float z = tmp.z;
```
でできる。
R de 『カーネル多変量解析』

[『カーネル多変量解析』](https://www.amazon.co.jp/dp/4000069713) 赤穂昭太郎 (岩波書店)

手を動かして図を再現するのは初学者の常套手段として。
とりあえず1章の図4枚をRで作ってみる。

私は、手を動かす時はネチネチ泥臭く組んでみるようにしています。
解析に今すぐ使いたい方は、格好良く`{kernlab}`を使った例が↓。
http://www.slideshare.net/yokkuns/tokyor45


# カーネル関数の例
先に図1.2からいきます。

```math
k(x, x')=exp(-\beta\ ||x-x'||^2)
```
このカーネル関数を、x-x'を横軸に取って描画する。

<img width=350 src=https://qiita-image-store.s3.amazonaws.com/0/92401/b82c99e4-5b39-39ad-d054-8b812d075fa0.png>

```r
# x座標
a <- seq(-3,3, length=100)

# 色の準備
N <- 10
Col <- colorRamp(c("Red","Green","Blue"))
Col1 <- rgb(Col(seq(0, 1, length=N))/255)

plot(a, exp(-a^2), type="n")
for(b in 1:N)
  lines(a, exp(-b * a^2), col=Col1[b], lwd=2)
```
β依存的にトンガっていくのが分かります。

#サンプルデータ
続いて図1.1。
見栄えのするサンプルデータの準備は結構ツライ(あるある?)。

こんな風にしました。
最後に`round`入れて丸めておくのが後々効きます。

```R
set.seed(1)
N <- 18
x <- runif(N,-2,2)      # X座標
e <- rnorm(N, 0, 0.03)  # 正規誤差

A <- 0.7  # 定義域の真ん中だけ凸にしたい
y <- rep(0, N)
  y[abs(x)<A] <- -0.5*x[abs(x) < A]^2+0.3
  y <- round(y -0.05*x + e, 3)
```
<img width=350 src=https://qiita-image-store.s3.amazonaws.com/0/92401/54540c27-285d-c191-4e00-4de321ac3c11.png>


#カーネル関数を使った近似
超短縮版で要約します。

線形回帰と同じイメージから入ります。
所与のデータ集合`(X, Y)`に対して、関数`y=f(x)`で近似する。
そのために誤差`Y-f(X)`の2乗の総和を最小化できる回帰係数を求める。

カーネル関数を使った近似では、この`f(x)`が特殊な形をしている。
回帰係数を`α_1~n`として、

```math
f(x)=\sum_{j=1}^n α_j\ k(X_j, x)
```
N個$全て$を考慮している、というのがミソです。

2乗誤差の総和は、

```math
\begin{eqnarray}
R_k(α)&=&\sum_{i=1}^n\Big(Y_i-\sum_{j=1}^n α_j\ k(X_j, X_i)\Big)^2 \\
&=&(Y-Kα)^T(Y-Kα)
\end{eqnarray}
```

ただし、

```math
K_{ij}=k(X_i, X_j)
```

この2乗誤差の総和を最小化する`α`は、

```math
α=(K^TK)^{-1}K^TY=K^{-1}Y
```

と書ける。ので、これを元に`f(x)`を描けばよろしい。

ただしこれだと、`(X, Y)`を100%フィットさせた関数になるので、過学習になりがち。なので、$正則化$項目を入れる。

```math
α=(K+λE)^{-1}Y
```
Eは単位行列。λで調整する。

行列Kを求める。
`Y`を丸めておかないと、`solve`でラリる。
データ点の数が`18`という微妙な数なのも、このせい。

```R
K <- matrix(0, N, N)
for(i in 1:N)
  for(j in 1:N)
    K[i, j] <- exp(-(x[i] - x[j])^2)
```

λを決めればαが決まる。

```R
lamda <- `hoge`
alpha <- solve(K+ lambda*diag(N)) %*% y
```

回帰曲線を構成する(x_k,y_k)は、こんな感じになる。

```R 
x_k <- seq(-2, 2, length=200)
y_k <- 0
for(i in 1:N){
  y_k <- y_k + alpha[i] * exp(-(x[i] - x_k[k])^2)
}
```

あとはfor文でお絵描き。(図1.3と1.4ですね)
<img width="600" alt="スクリーンショット 2016-10-27 20.10.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/92401/5614a9b6-e2fd-94d8-253e-09974e0d1ef4.png">

手を動かすと、大分イメージが湧くと思います。


enjoy!!
Typescriptで、Object[key]とすると出るIndex signature of object type implicitly has an 'any' type.を正しく回避する

#はじめに
Typescriptで、 ```Object[key]``` と書くと出る
```Index signature of object type implicitly has an 'any' type.``` を正しく回避したい時の一つの方法
参考urlを読めば分かるのだが、検索してもなかなか見つけられなかったのでここに記す

筆者は、redux-formでチェックボックスを作る際にハマった

## Compilerに型を教えてやる

```
interface pokemon {
  PIKACHU: boolean,
  RAICHU: boolean,
  YADORAN: boolean
  \[key: string]: boolean
}

let key: string = 'PIKACHU';
let pikachu: string = pokemon[key];
```

さらに、booleanではないvalueを定義すると、Compilerが怒ってくれる

```
Property 'PIDHION' of type 'number' is not assignable to string index type 'boolean'.
```

補足: \\[key: string]: boolean <= 先頭の"\"は、不要なのだが、code-block内ではこうするしかなかった

## おまけ: よく見つかる解法
コンパイラのオプションに以下を渡す
```
--suppressImplicitAnyIndexErrors
```
....だが、これは使いたくない

###参考
http://stackoverflow.com/questions/32968332/how-do-i-prevent-the-error-index-signature-of-object-type-implicitly-has-an-an
Windows Server 2016評価版をインターネット非接続環境で使う

とりあえず、Storage Space Directは試してみたほうがよろしいだろうなという事で仮想環境上で構築施行中・・（略称はS2Dで統一されている様、SSDだと確かにSolid State Driveと混同する）

Hardware options for evaluating Storage Spaces Direct in Technical Preview 4
https://blogs.technet.microsoft.com/clausjor/2015/11/23/hardware-options-for-evaluating-storage-spaces-direct-in-technical-preview-4/

とかを見るとメモリ128GBがミニマムだとかそんなことが書いてありげんなりするのだけど、以下のBlog記事では32GBメモリの一台あたり$1,101のマシンが２台あれば（ADドメコンは別途必要だろうけども）、ハード的にはS2DでHyper-convergedシナリオが実現可能だぜとかまあ、そういうことらしいので実際にそれほどメモリを食うわけでは無いのだろう。

Windows Server Blog - Microsoft and Intel squeezed hyper-convergence into the overhead bin
https://blogs.technet.microsoft.com/windowsserver/2016/10/24/microsoft-and-intel-squeezed-hyper-convergence-into-the-overhead-bin/


そんなわけでまずは評価版を入手してインストールから始めているわけですが、2012 R2のときはインターネット非接続環境で評価版を使おうとしても何か１日ぐらいで有効期限が切れてシャットダウンしてしまうので実質使い物にならなかったのですが、さすがに評判が悪かったのかWindows Server 2016の評価版ではとりあえず10日は未アクティベーションのままでも使えるようになったみたいです。
「slmgr /rearm」コマンドで猶予期間のリセットが６回まで使えるらしいので、計７０日使える？

以下は、slmgr /rearm を実行＆再起動した直後に slmgr /dlv を実行して猶予期間を確認して見たの図（残り時間が10日で、残りの猶予リセット可能回数が5回に減っている）
![slmgr-dlv.png](https://qiita-image-store.s3.amazonaws.com/0/146381/55df46b4-b793-c6f0-6173-ecc2a5141eef.png)
任意のURLを指定してHTMLを取得する方法


[他のページのHTMLを取得する方法](http://qiita.com/taishi41228/items/b6bcf974e8056afbdd2c)

[クロスドメインで他のページを取得する方法](http://qiita.com/taishi41228/items/b3827f48542ae231dff8)

\> 任意のURLを指定してHTMLを取得する方法

[Ajaxで取得したHTMLからタイトルを取得する方法](http://qiita.com/taishi41228/items/6e0772122d6c80f12fa6)

index.html

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

<head>
  <meta charset="UTF-8">
  <title>Hello!</title>
</head>

<body>
  <input id="url" type="text">
  <button id="send">送信</button>
  <script src="js/jquery.min.js"></script>
</body>

</html>
```

index.js

```
var url = '';
var data = {};
$('#send').click(function(){
  url = $('#url').val();
  data = {
    url: url
  };
  $.ajax({
    url: 'http://localhost/test/',
    type: 'GET',
    data: data,
    success: function(data) {
      console.log(data);
    }
  });
});
```

PHP

```
echo file_get_contents($_GET['url']);
```