OmniAICreator/Qiita-1.07M huggingface dataset:
C#で順列と組み合わせを求める

[Project Euler](https://projecteuler.net/) を解いていたら、すごい勢いで使うので作りました。

# 順列 (Permutation)

例えば `[ 1, 2, 3 ]` から以下のような結果が欲しい。※ P(n=3, k=3)で6通り

`[ [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1] ]`

## こんなメソッドを用意する

シーケンス(IEnumerable&lt;T&gt;)の拡張メソッドとして定義してみます。

```csharp
public static IEnumerable<IEnumerable<T>> Perm<T>(this IEnumerable<T> items, int? k = null)
{
	if (k == null)
		k = items.Count();

	if (k == 0)
	{
		yield return Enumerable.Empty<T>();
	}
	else
	{
		var i = 0;
		foreach (var x in items)
		{
			var xs = items.Where((_, index) => i != index);
			foreach (var c in Perm(xs, k - 1))
				yield return c.Before(x);

			i++;
		}
	}
}

// 要素をシーケンスに追加するユーティリティ
public static IEnumerable<T> Before<T>(this IEnumerable<T> items, T first)
{
	yield return first;

	foreach (var i in items)
		yield return i;
}
```

## こんな風に使う

```csharp
// P(n=3, k=3)の例
var source = new int[] { 1, 2, 3 };
var perm = source.Perm();
var result = perm.Select(x => x.ToArray()).ToArray();
// result => [ [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1] ]
```

引数`k`に順列の項数を与えることができます。(省略すると元のシーケンスと同じ項数になる)

```csharp
// P(n=3, k=2)の例
var source = new int[] { 1, 2, 3 };
var perm = source.Perm(2); // k = 2
var result = perm.Select(x => x.ToArray()).ToArray();
// result => [ [1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2] ]
```

# 組み合わせ (Combination)

例えば `[ 1, 2, 3 ]` から項数2の組み合わせを求める場合、以下のような結果が欲しい。※ C(n=3, r=2)で3通り

`[ [1, 2], [1, 3], [2, 3] ]`

## こんなメソッドを用意する

順列と大体同じです。
組み合わせの場合は既に列挙した要素を含めてはいけないので、`Skip(i)`で列挙済み要素を飛ばします。

```csharp
public static IEnumerable<IEnumerable<T>> Comb<T>(this IEnumerable<T> items, int r)
{
	if (r == 0)
	{
		yield return Enumerable.Empty<T>();
	}
	else
	{
		var i = 1;
		foreach (var x in items)
		{
			var xs = items.Skip(i);
			foreach (var c in Comb(xs, r - 1))
				yield return c.Before(x);

			i++;
		}
	}

}
```

## こんな風に使う

```csharp
// C(n=3, r=2)の例
var source = new int[] { 1, 2, 3 };
var comb = source.Comb(2);
var result = comb.Select(x => x.ToArray()).ToArray();
// result => [ [1, 2], [1, 3], [2, 3] ]
```
jQuery を使ったログイン画面

次のページを参考にしました。
[はじめてのAjax(jQuery) 2018年版](http://qiita.com/zakiyamaaaaa/items/bdda422db2ccbaea60d9)

![login_jun09.png](https://qiita-image-store.s3.amazonaws.com/0/179446/71887c6f-cead-69a6-19ab-09c3a5ce6170.png)


```html:login.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<link href="login.css" rel="stylesheet">
<title>Login</title>
</head>
<body>
<div class="center">
<h2>ログイン画面</h2>
<table>
<tr><td>名前</td><td><input type="text" name ="userid" id ="userid"></td></tr>
<tr><td>パスワード&nbsp;</td><td><input type="text" name ="password" id="password"></td></tr>
</table>
<p />
<button id="submit">submit</button>
</div>
<p />
<div class="result"></div>
<p />
Jun/13/2021<p />
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="login.js"></script>
</body>
</html>
```

```css:login.css
.center
{
	width: 80%;
	margin: 0 auto;
}
```

```js:login.js
// ---------------------------------------------------------------
//	login.js
//
//						Jun/09/2017
// ---------------------------------------------------------------
jQuery(function()
{
	jQuery('#submit').on('click',function()
		{
                jQuery.ajax({
                    url:'request.php',
                    type:'POST',
                    data:{
                        'userid': jQuery('#userid').val(),
                        'password': jQuery('#password').val()
			}
                })
                .done(function(data){
                    jQuery('.result').html(data)
                    console.log(data)

                })
                .fail(function(data){
                    jQuery('.result').html(data)
                    console.log(data)
                })
	})
})

// ---------------------------------------------------------------
```


```php:request.php
<?php
// --------------------------------------------------------------------
/*
	request.php

					Jun/09/2017
*/
// --------------------------------------------------------------------
function password_gen ()
{
	$password = array ();
	$password['scott'] = 'tiger';
	$password['jack'] = 'jones';
	$password['betty'] = 'smith';

	return	$password;
}

// --------------------------------------------------------------------
header('Content-type: text/plain; charset= UTF-8');

$password= password_gen ();

if(isset($_POST['userid']) && isset($_POST['password']))
	{
	$id = $_POST['userid'];
	$pass = $_POST['password'];
	if (isset ($password[$id]))
		{
		if ($pass == $password[$id])
			{
			echo 'OK' . '<br />';
			}
		else
			{
			echo 'NG' .'<br />';
			}
		echo 'userid: ' . $id .'<br />';
		echo 'password: ' . $pass . '<br />';
		}
	else
		{
		echo 'NG' .'<br />';
		}
	}
else
	{
	echo 'NO' .'<br />';
	}
// --------------------------------------------------------------------
?>
```
IOオブジェクトでtake_whileするときは副作用に注意

`Enumerable#take_while`は、[公式リファレンス](https://docs.ruby-lang.org/ja/latest/class/Enumerable.html#I_TAKE_WHILE)によると
>Enumerable オブジェクトの要素を順に偽になるまでブロックで評価します。 最初に偽になった要素の手前の要素までを配列として返します。

というメソッドです。
つまり、たとえば戻り値が長さ4の配列だった場合、5つ目の要素までeachで評価しているということになるわけです。

普通はそれで問題ないわけですが、IOオブジェクトのようにeachメソッドに副作用があると少し変わってきます。
`IO#each`は1行ごとに読んでポインタを進めますから、以下のようなことが起こります。

```shell-session
$ seq 1 10 | ruby -e 'p $stdin.take_while {|i| i.to_i < 5}; p $stdin.gets'
["1\n", "2\n", "3\n", "4\n"]
"6\n"
```

`seq 1 10`で1から10までの数字を1行ずつRubyの標準入力に渡しています。
最初のtake_whileで1から4までを取ったので、次のgetsでは5が得られるような気がするんですが、5はtake_whileで読み込まれて捨てられているので、次の6が出力されます。
psqlコマンドのオプションをすべて省略してデーターベースへ接続【メモ】

少しつまずいたことをメモ

mysqlだと`~/.my.cnf`に接続情報書き込むだけで、オプションを省略してDBに入ることができる。
そのせいか、postgresqlも同じだと勘違いしていました。てっきり、`~/.pgpass`に接続情報を書き込むだけでオプションを省略できるものだと思ってた。
何回も`~/.pgpass`の中に`hostname:port:database:username:password`の情報を書き込み`chmod 600 ~/.pgpass`と権限を変えて、いざコマンド実行

```
#psql
psql: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
```

何回も.pgpassの設定を変えても同じ結果。。。

何回もググってた結果「.pgpassはおそらく**passwordだけ**省略してくれる」と予想。。。
`#psql -h hoge.com -u user`で見事パスワードだけ省略して入れました。



結論としては、`.pgpass`は使用せずにすべて環境変数に登録
常時環境変数が消えないため`~/.bashrc`に登録

```bash:.bashrc
#postgresqlオプション省略
export PGHOST=hoge.com
export PGPORT=5432
export PGDATABASE=hoge
export PGUSER=user
export PGPASSWORD=password
```

これで、`psql`だけでは入れるようになりました。
MATLABのカラースキームを変更する

「MATLABのカラースキームをかっちょよくしたいんや！」

Visual Studioとか他の統合開発環境だとエディタ部分の背景の色を工夫してかっちょよくしている人が多いですが，なぜかMATLABになるとデフォルトのまま使ってる人が多い気がします．

カラースキームを１から自分で変更しようとすると大変ですが，Scott Lowe氏が作った [MATLAB Schemer] (https://github.com/scottclowe/matlab-schemer) を使えば一瞬でかっちょよくできます．

ここでは以下の環境でカラースキームを変更する例を示しますが，他のOSでももちろんできます．
OS: macOS Sierra
MATLAB: MATLAB R2016b

---

まず，MATLAB Schemerの[githubリポジトリ](https://github.com/scottclowe/matlab-schemer)からパッケージをダウンロードします．

ダウンロードしたパッケージは以下のようなわかりやすい場所にコピーしておくとよいでしょう．
`/Users/masahirodll/Documents/MATLAB/matlab-schemer-master`

次にMATLABを起動し，ダウンロードしたパッケージにパスを通します．
（参考までにMATLABでのパスの通し方は，ウィンドウ上部にある「ホーム」タブから「パスの設定」に行き，「フォルダーを追加...」からダウンロードしたパッケージを指定するだけです．）

あとは，MATLABのコンソールで
`>> schemer_import`
と叩くとカラースキームの設定ファイルの選択画面が出てくるので，[利用できるスキームの一覧](https://github.com/scottclowe/matlab-schemes)を参考に気に入ったやつを選ぶだけです．

ためしに，monokaiを選んでみました．

![sc1](https://qiita-image-store.s3.amazonaws.com/0/87637/8865d448-d110-0882-dfdd-66be202236b0.png)


お試しあれ！

---
ただ，この方法はエディタ部分の色を変えるだけなので，全体のバランスは少し悪いかも？！

![sc2](https://qiita-image-store.s3.amazonaws.com/0/87637/eb6e0ada-bd00-65a3-2d9b-c0868db11faa.png)
Netbeans scssのコンパイルができないときに注意する点

##毎回忘れるのでメモ

#Netbeansの最近のバージョンだけかもしれないけどログの見方とSCSSエラー時の対処方法

SCSSの設定で、保存時に自動でcssを作成ってやってできないとき。エラーも何も出ないのでログをみるといいのだけどログもなかなかわからない。

Windowsだと「（ユーザのフォルダ）\AppData\Roaming\NetBeans\8.2\var\log」
ここの「messages.log」このファイル。

これみても、
scss not matched within current mappings [Pair[/scss,/css]]
ってエラーだなってわかるけど、どうしたらいいかわからない。

って、よく見ると/scss /css。ルートからの指定なのですね。webroot（webルート）。
ということで以下の画像みると設定されてないわけで。設定するとうまくいきます。

![scss_check.png](https://qiita-image-store.s3.amazonaws.com/0/84965/247d8f3d-59ec-3a75-4ff8-432ec54095c8.png)
Markdown記法

###いきさつ
マークダウンを勉強しようと思ったわけは、職場の尊敬する先輩が、よくマークダウンを使っていたからです。

#マークダウンとは
Markdown（マークダウン）は、文書を記述するための軽量マークアップ言語のひとつである。本来はプレーンテキスト形式で手軽に書いた文書からHTMLを生成するために開発されたものである。しかし、現在ではHTMLのほかパワーポイント形式やLaTeX形式のファイルへ変換するソフトウェア（コンバータ）も開発されている。各コンバータの開発者によって多様な拡張が施されるため、各種の方言が存在する。
（Wikiより）

ということですが、難しいことはよくわからないので、**HTMLより簡単に書ける言語。タグとか必要ないし。**
という認識です。


#記述法
**1. 見出し**  

```
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6
```


* \#が1つ増えるごとに、小さくなっていく
* \#は最大6つ

># 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6  
  
**2. 強調**　　

```
**太字**　　
*斜体*
```

* 左右を囲むこと

>**太字**　　
*斜体*

**3. 箇条書き**　

```
* （アスタリスク）番号なし箇条書き　　　
1. （数字+「.」）番号付き箇条書き
```

* 記号と文字の間に**半角スペース**を入れること！

>* 番号なし箇条書き  

>1. 番号付き箇条書き

**4. 引用文**

```
>引用
>>引用
```
* 入れ子にすることも可能

>引用
>>引用

**5. 表**

```
左寄せ|中央寄せ|右寄せ|指定なし  
:---|:---:|---:|---
a|b|100|ab  
c|d|200|cd　　
```

* 1行目に列のタイトルを記入（**｜**で区切る）
* 2行目に列の数 「**‐--**」 を記入（**｜**で区切る）　　
* 「**:**」の位置で、右寄せや中央寄せなどを指定できる  
(右に付けたら右寄せ、左右に付けたら中央寄せ）
* 3行目以降に値を記入していく（**｜**で区切る）

左寄せ|中央寄せ|右寄せ|指定なし  
:---|:---:|---:|---
a|b|100|ab  
c|d|200|cd

**6. 改行**　

マークダウン形式は普通に改行しても、反映されない。
スペースを入れた後に改行すると、反映される。

```
あいう(半角スペース)(半角スペース)　(改行)

えお
```

>あいう  

>えお  

**7. エスケープ**  
見出しじゃなくて「\#」を表示させたいとき。
(マークダウン言語をそのまま表示させたい）

```
 \#エスケープ
```

>\#エスケープ  


**8. ソースコード**

```
```HelloWorld.java
public class HelloWorld {
    public static void main (String[] args) {
        System.out.println("Hello World !!");
    }
}
\```
```
* ```と本文の間は改行する  

```HelloWorld.java
public class HelloWorld {
    public static void main (String[] args) {
        System.out.println("Hello World");
    }
}
```


他にも色々あるみたいなので、今後も追加予定です。
Realmと使うAndroid Architecture Components ver2

* [Realmと使うAndroid Architecture Components](https://news.realm.io/jp/news/android-architecture-components-and-realm/) という素晴らしい記事を読んで、<font color="#6ab244">**Android Architecture Components**</font>の理解が進んだので、[そちらのサンプル](https://github.com/ericmaxwell2003/android-persistence)では使っていなかったFine-grainedな通知機能を使って実装してみたかったので、以下の三画面構成の[シンプルなサンプル](https://github.com/u-nation/arch-components-realm)をKotlinで作ってみました。

1. 記事一覧のリスト
2. いいねを押した記事のリスト
3. 記事詳細画面

* 各々の画面に*いいねボタン*があり、それを画面間で状態を反映させるようなメディア系のアプリでよく見る機能を実現しました。また、画面回転しても状態を保つようにしました。

<img src=https://qiita-image-store.s3.amazonaws.com/0/58939/1706b379-61eb-8dfa-c4d4-52a1e5f762c2.gif width=400px title="サンプル"> <img src=https://qiita-image-store.s3.amazonaws.com/0/58939/49dd902d-1987-a709-1a52-d4bcaf47f680.gif width=400px title="サンプル"> 

* 大きな違いはViewModelにOrderedRealmCollectionChangeListenerを持たせ、そこでの変更通知をLiveDataに伝えている点です。
* 今回サンプルを作ってみて、Room以外の既存のORMでも十分に活用できるほど、それぞれのコンポーネントは独立している機能だということがわかりました。

まだalpha版ですが、正式にリリースされたら積極的に使っていきたいです。

## お世話になった記事
[Realmと使うAndroid Architecture Components](https://news.realm.io/jp/news/android-architecture-components-and-realm/)
[Android Architecture Components Lifecycle, LiveData and ViewModel 詳解](https://tech.recruit-mp.co.jp/mobile/post-12285/#ViewModel-8211-Activity)
[Android Architecture Components 感想](http://starzero.hatenablog.com/entry/2017/05/19/005437)
[Android Architecture Components ViewModel 和訳](http://qiita.com/aroe_lemon/items/9aa80042e6fc10d32d49)
Ionic覚え書き


## 目次
1. コマンド
2. MVC
3. データの入力
4. DBの作成

## コマンド
```
$ ionic start _project_name_
$ cd _project_name_
# ブラウザ上でアプリの起動
$ ionic serve 

# エミュレータで起動(iOS, Android
https://stackoverflow.com/questions/42711120/how-do-i-run-an-ionic-app-in-android-studio-emulator
```

[ionicコマンドメモ](http://qiita.com/mana-bin/items/e647ef3cb6ebc873464a)いい感じ
【git】コミットが存在するのに「error: src refspec HEA does not match any.」が出る

```
error: src refspec HEA does not match any.
error: failed to push some refs to 'http://************'
``` 
みたいなエラー。

error: src refspec HEA does not match any.

でぐぐるとひたすら「コミットしてない」を推してくるページばっか出て嫌気が差す。

push先のリポジトリ名を間違えてもこれが出るから確認した方がいい。
Docker + Ruby on Railsの開発環境作成の最短構成


dockerのインストールが終わっている前提


```
# コンテナを作る。
$ docker pull ruby:2.4.1
$ docker run -it -v /PATH/TO/LOCAL/RAILS_DIR:/usr/src/rails_app -w /usr/src/rails_app -p 3000:3000 ruby:2.4.1 /bin/bash

# 以下docker内部での作業
# 最近のrailsはnode必要だから、node入れる
apt-get update \
    && apt-get install -y --no-install-recommends \
        nodejs npm \
    && rm -rf /var/lib/apt/lists/*

npm install n -g
n stable


# 新規にrailsアプリを作る場合
gem install rails
gem new .
rails s -b 0.0.0.0

# すでにrailsアプリが作成済みの場合
bundle install
rails s -b 0.0.0.0

```
[Swift]タプルっていつ使うのか

<h1>タプルとは</h1>
クラスやストラクチャを作るまでもないレベルで、配列のように複数の値を一つにまとめられるものであるが、普通の配列と違う点がこれ。↓
"いろんな型の複数の値を一つとしてまとめられるもの。"

普通の配列だと型を統一しなくてはならないので、タプルにはメリットがありそうですねぇ！

```swift:I_am_hentai.swift
let love=("山本彩",23,"女性");
```
みたいな感じ。



で、これいつ使うの？？ってなった。

<h1>結論</h1>
関数の戻り値をタプルにすれば、複数の値を返すことができる！
そういったことから、タプルは関数の戻り値に利用されることがほとんどみたい。

<h1>感想</h1>
タプルは関数の戻り値を複数返したい時だけ使おうかな〜(他にも良い使い方あれば教えてください。)
Rails 5でconfig.cache_classes = falseにしているとメモリリークする

# 環境

- Rails 5.1.1
- Ruby 2.3.0p0

Rails 4.2.6ではこの問題は発生しなかった。

# cache_classes とは

```rb
config.cache_classes = false    # falseのとき、ソースに変更を加えると次回リクエスト処理時に変更が反映される（ソースがリロードされる）
config.cache_classes = true     # trueのとき、反映されない。

# developmentでのデフォルトはfalse
# productionでのデフォルトはtrue
```

# 問題

`config.cache_classes = false`にしているとリクエストの度にRubyプロセスの使用メモリが際限なく増え続ける。

おそらくこのissueが関連している：
[Memory leak in development · Issue #27273 · rails/rails](https://github.com/rails/rails/issues/27273)
[Fix memory leak in action view by printercu · Pull Request #27296 · rails/rails](
https://github.com/rails/rails/pull/27296)
rootにmountされているEBSを、mountしたまま拡張する手順


# 前提

* Amazon Linux 利用
* ファイルシステムは ext4

# Modify Volume でEBS拡張

AWSコンソールで操作


![スクリーンショット 2017-06-09 17.44.31.png](https://qiita-image-store.s3.amazonaws.com/0/65326/d063680d-b0d1-9a52-7560-720ea8c5a970.png "スクリーンショット 2017-06-09 17.44.31.png")

Modify Volumeを行っただけでは、ディスクのサイズが変更されるだけなので、
OS上でパーティションの拡張を行う。

# OSでパーティション拡張


Modify Volume前

```console
# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
```


Modify Volume後

```console
# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  15G  0 disk
└─xvda1 202:1    0   8G  0 part /
```


growpart（cloud-utils-growpart）実行。

```console
# growpart /dev/xvda 1
CHANGED: disk=/dev/xvda partition=1: start=4096 old: size=16773086,end=16777182 new: size=31453150,end=31457246
``` 

reseize2fs でパーティションを拡張

```console
# resize2fs /dev/xvda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/xvda1 is now 3931643 (4k) blocks long.
```

```console
# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        236M   56K  236M   1% /dev
tmpfs           245M     0  245M   0% /dev/shm
/dev/xvda1       15G  974M   14G   7% /
```

増えた！


# できないこと

縮小不可！
WPFアプリケーション上のWebBrowserでreactjs等が動かない場合の対処

##理由

内部で使用されているIEのエンジンが古い

##対処方法

##Chromeを使用するようにする(推奨)
the open source version of Google Chrome
https://cefsharp.github.io/

これを使用することで何でもありな状態にもっていけます。
(IEとかWindowsのバージョンとか気にしなくてよくなる)


###meta情報をWebPage側に追加する

```
<meta http-equiv="X-UA-Compatible" content="IE=10">
```
のようにブラウザーの指定を入れる

####例
```
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=10">
    <title>Wpf Webview</title>
</head>
```


##おまけ

###スクリプトエラーを抑制したい場合
```
var axIWebBrowser2 = typeof(WebBrowser).GetProperty("AxIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
var comObj = axIWebBrowser2.GetValue(webview, null);
comObj.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, comObj, new object[] { true });
```

InitializeComponent以降のどこかで設定をする
上記でwebviewとなっている所をWebBrowserに付けたNameで置き換える
HoloLens上でスクリプトを用いて外部ファイルの読み込みをしたい

# 目的
スクリプトでの外部ファイル(画像)の読み込み 
######どうやら常識のようですがHoloLensにビルドする際のファイルの扱い方を知らなかったのでメモ

# 前提

- [ ] ドラッグ&ドロップで読み込み
- [x] スクリプトで読み込み

上記の前提のため、シーンに予め画像を埋め込んでおくなどは想定していません。

Windows Storeアプリケーションでは`.CLose()`メソッド使えないため`StreamReader`は`.Dispose()`メソッドで閉じる。

画像読み込みの際、`BinaryReader`も使えなかった為、`Resourse.Load()`で代用（こっちのほうがシンプル）

##失敗例


 
```csharp:ReadFile.cs
FileInfo file = new FileInfo(Application.dataPath + "PATH");
```

## 問題
**`FileInfo`の際の`Application.dataPath`の参照位置**
Unity内で走らせる分には問題ないが、HoloLens上で走らせるとHoloLens内のストレージを探してしまうため読み取りが正常に行われない。

##解決策
**streamingAssetsPath**を使う

スクリプトリファレンス Application.streamingAssetsPath
[Streaming Assets Path (docs.unity3d)](https://docs.unity3d.com/jp/540/ScriptReference/Application-streamingAssetsPath.html)

```bash:tree
.
└── Assets
    └── StreamingAssets
        └──Data
           └──example.png
```

###そして

```csharp:ReadFile.cs
FileInfo file = new FileInfo(Application.streamingAssetsPath + "PATH");
```



`Assets/StreamingAssets`に欲しいファイルを格納するとビルド時に彼らをHoloLens内まで連れてってくれる模様。
スクリプトリファレンスによるとプラットフォームによっては他の対応をしなければならないみたいだけどとりあえずのところHoloLensでは大丈夫。
同時に*JsonOBJECT*の動作も確認。

# 結論
安心

#HoloLens開発記事一覧
[こちら](http://qiita.com/gshirato/items/6c026f2c67dc332f829b)から
Windows環境で静的解析Inferを動かす

facebookのOSS静的解析ツール「infer」
http://fbinfer.com/
javaではぬるぽが発生する(する可能性のある)箇所とメモリリークについて解析してくれる。
ぬるぽの解析ではfindbugsとかより断然つよそうだから入れてみたい感があったのだけど、いかんせんWindows非対応。
とりあえずdockerがあったのでdocker-toolboxで何とか動かしてみたっていうあれです。

## 前提
* javaでしか動確してない
* 2017/6/9現在

## docker-toolboxの導入

https://www.docker.com/products/docker-toolbox
ここから取得

## Dockerfileの取得

C直下にinferディレクトリを作っておく(別にどこでもOK)

Docker Quickstart Terminalを起動する。

Dockerfileと起動シェルを取得する。

```bash
$ curl https://raw.githubusercontent.com/facebook/infer/master/docker/Dockerfile > /c/infer/Dockerfile
$ curl https://raw.githubusercontent.com/facebook/infer/master/docker/run.sh > /c/infer/run.sh
```

そのままシェルを叩くとDockerfileがバグってて？(2017/6/9現在)失敗するのでDockerfileにちょっと手を入れる。
下記のように修正

```bash
# Base image
FROM buildpack-deps:xenial-curl

MAINTAINER I2

# Debian config
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
            aspcud \
            autoconf \
            automake \
            gcc \
            g++ \
            git \
            groff-base \
            libc6-dev \
            libgmp-dev \
            libmpc-dev \
            libmpfr-dev \
            m4 \
            make \
            ncurses-dev \
            ocaml \
            opam \
            openjdk-8-jdk-headless \
            pkg-config \
            python2.7 \
            rsync \
            unzip \
            zlib1g-dev && \
    rm -rf /var/lib/apt/lists/*

# Download the latest Infer release
RUN git clone https://github.com/facebook/infer.git

RUN cd infer && ./build-infer.sh java

ENV PATH $PATH:/infer/infer/bin
```

## docker-imageの作成・起動

シェルを叩く

```bash
$ cd /c/infer
$ ./run.sh
```

かなり待つ。動くようになる。

exampleに通すのもいいけどgitからクローンしてくれば既存プロジェクトに対しても解析できる。

## これからやること

ぬるぽの解析がどうすごいのか別記事で書きたい
ssh トンネル　

トンネル用の ssh_config の雛形　自分用のだけど、探すとき、便利なんで公開です。

```
# port forward 用
Host hoge_remote
HostName hoge_remote.com
User hoge_user
IdentitiesOnly yes
IdentityFile ~/.ssh/hoge_host_key
PasswordAuthentication no
Port 22



# hoge_remote -> hoge_target
Host           hoge_target
HostName       hoge_target.com
User           hoge_target_user
IdentityFile   ~/.ssh/hoge_target_key
Port 22
ProxyCommand   ssh -CW %h:%p hoge_remote
```
crontab入門

#crontabとは

crontabとはコマンドの定時実行のスケジュール管理を行うために用いられるコマンドである。
どの時間にどのようなコマンドを実行するか設定することで指定の時間が来る度に指定のコマンドを自動で実行してくれる。


#利用方法
`$crontab -l` //現在設定されているcrontabがあるか確認
`$crontab -e` //crontab編集・設定
/*---エディタ（vim）が開く---*/
`* * * * * echo "test" >> cron.txt　` //設定するcronを書き込む
/*---エディタ（vim）を閉じる---*/


#入力例
`* * * * * echo "test" >> cron.txt`　
分時日月曜日　　　　　　　内容　　　　　　　　　追記　　出力先(ログ)


#削除するとき
`$crontab -r`
cronを全て削除してしまうので、-eでエディタ内で消すのが○
Macでrailsプロジェクト立ち上げ

## はじめに
これは忘れっぽい自分用にメモを作ってみようと思い書いてみました。
今回はruby on railsのプロジェクト立ち上げの手順を書こうと思います。

開発環境はMacでDBはMySQLを使用します。

## rbenv インストール
rbenv はhomebrewでインストールします。
`$ brew install rbenv ruby-build`
rbenvがinstallされたか確認

```
$ rbenv -v
rbenv 1.1.0
```
バージョンが表示されることを確認

## ruby インストール
次にrubyのインストールを行います。
まず、インストール可能バージョンを確認します。

```
$ rbenv install --list
  ...
  2.4.0-rc1
  2.4.0
  2.4.1
  2.5.0-dev
  jruby-1.5.6
  ...
```

インストールしたいバージョンが存在するか確認しインストールを行います。
今回は2.4.1をインストールして確認

```
$ rbenv install 2.4.1
$ ruby -v
  ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
```

インストールしたバージョンをrbenvのデフォルトバージョンに設定

```
$ rbenv global 2.4.1
$ rbenv versions
  system (set by /Users/user_name/.rbenv/version)
* 2.4.1
```

bundlerだけグローバルにインストール
`$ gem install bundler`

## rails プロジェクト準備
既存プロジェクトはすでにGemfileが存在するのでここを飛ばしてください。
`$ bundler init`
Gemfileが作成されます。
今回はrailsプロジェクト立ち上げまで手順を記載しようと思いますのでGemfileを修正して`gem "rails"`のコメントアウトを削除し、今回はmysqlを使用しますので`gem "mysql2"`を追加します。

ここは既存も共通でgemインストールになります。

`$ bundle install --path vendor/bundle`

この時にpathを設定すると現在のカレントディレクトリから`vendor/bundle`ディレクトリを作成して、そこにgemをインストールしてくれるのでプロジェクト毎にgemを管理できて便利です。
既存のプロジェクトはここからDB作成の項目までスキップしてください。

## rails プロジェクト作成
railsプロジェクトを作成するには
`$ bundle exec rails new .  -B -d mysql`

上記で新しいrailsプロジェクトを作成できます
ちなみにオプションの-Bはbundle installをスキップします。
(`$ bundle exec rails new -h`でオプション詳細が見れます。)

続いて画面を作成します。
railsには簡単に画面を作成させるコマンドが存在します。
とりあえずUsersテーブルのnameカラムを作成します。
`$ bundle exec rails generate scaffold User name:string`


これで、画面などのテンプレートが作成されました。

<details><summary>エラーになったら</summary>エラー内容を確認し`Add gem 'listen'`のような文言があったらGemfileにgem 'listen' を記載してbundle installを行ってください。</details>

## DB作成 
今回はmysqlを使用します。
デフォルトではDB接続のpasswordが空なので設定してあるのであれば先に入力します。
ちなみにrootでアクセスします。

```yml:config/database.yml
 default: &default
   adapter: mysql2
   encoding: utf8
   pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
   username: root
   password: # ここにパスワード入力
   socket: /tmp/mysql.sock
```

モデルを作成したのでこれでDBを作成できます。
`$ bundle exec rails db:create`
上記でDBを作成できます。

ここで作成されるのはdevelop環境とtest環境のDBになります。
ここからテーブルを作成していきます。
`$ bundle exec rails db:migrate`

これでmodelで作成した項目がDBのcolumnとなります。
実際にmysqlコマンドで確認してみるのもいいかもしれないですね。

## 検証

`$ bundle exec rails s`

エラーなく実行されたら
http://localhost:3000
にアクセスして画面が正常に出力されるか確認します。

新規でプロジェクト作成した場合下記を参照してみてください。
http://localhost:3000/users
先ほど作成した画面が見れると思います。

<details><summary>エラーになったら</summary>
Sprockets::FileNotFound in Users#indexというエラーが発生した場合
app/assets/javascripts/application.js
ファイルの
`//= require turbolinks`
を削除して再度試してみてください。
</details>

以上で完了です！
ドキュメント共有ツール Crowi をAmazonLinuxで構築する

# ドキュメント共有ツール Crowi をAmazonLinuxで構築する

- [Crowi](http://site.crowi.wiki/)

Crowiとはオープンソースで、ドキュメントを色々溜め込むことができるツールです。
ずっと、RedmineのWikiを使っていましたが、どうしても好きになれなかったんですよね・・
（マークダウンで書けない、タグサーチができなくて検索不便等々・・・）
おそらくプラグインをいれたら上記は解決できるかと思いますが、そこまでやるのは面倒だということで、他にないか探していたらCrowiを発見しました！

今回は、導入と設定らへんを書いていきたいと思います。

## 構築準備

- AmazonLinux
- Node.js v8.0
- Mongo v3.4.2
- Nginx v1.6.2

## 構築方法

まずはサクッとNode.jsとNginxのインストールをおこないます。

### Node.jsのインストール

こちらを参考にしてインストールしてみてください。
http://qiita.com/sinmetal/items/154e81823f386279b33c

### Nginxのインストール

```
$ sudo yum install -y nginx
```

こちらでサクッとインストール&起動しておきましょう！

### MongoDBのインストール

```/etc/yum.repos.d/mongodb-org-3.4.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
```

このファイルを作成しておきます。
作成が完了したら、

```
$ sudo yum install -y mongodb-org
```

```
$ sudo service mongod start
```

これで、起動が完了です。

### 各設定

- Nginxの設定

3001番ポートにプロキシする設定を書きます。

```/etc/nginx/vhost.d/crowi.conf
server {
  listen   *:80;
  server_name crowi.hoge.com;

  access_log /opt/nginx/logs/crowi_access.log;
  error_log  /opt/nginx/logs/crowi_error.log;

  location / {
    proxy_pass http://127.0.0.1:3001;
  }
}
```

- Mongoの設定

```
$ mongo
> use crowidb
switched to db crowidb
>  db.createUser({user: "crowi", pwd: "crowi", roles: [{role: "userAdmin", db: "crowidb"}]})
Successfully added user: {
    "user" : "crowi",
    "roles" : [
        {
            "role" : "userAdmin",
            "db" : "crowidb"
        }
    ]
}
```

## Crowiをインストールする

```
$ git clone --depth 1 https://github.com/crowi/crowi.git
$ cd crowi
$ git checkout v1.6.0
$ sudo npm install
```

これで、Crowiの設定は完了です。

次に、プロセスを起動しますが、ここはforeverを用いて、プロセスを常に起動できるようにしておきます。
その前に、環境変数の設定をしておきます。

```
$ export PASSWORD_SEED=なんでもOK
$ export MONGO_URI=mongodb://crowi:パスワード@localhost/crowidb
$ export PORT=3001
$ export NODE_ENV=production
```

```
$ npm install forever -g
```

foreverのインストールが完了したので、プロセスを起動していきます。

```
$ forever start app.js
$ forever list
ここにプロセスの起動情報が書いてある
```

これでプロセスの起動が完了したので、設定したドメインにアクセスすればCrowiが表示されると思います。

## その他設定

他にもCrowiにはこういった機能があります

- 画像やファイルをアップロードできるようにする
- 認証をGoogleアカウント認証に変更できる
- 全文検索ができるようになる

ここはまたのちほど紹介していきたいと思います。

では、よいドキュメント共有ライフを！
【問題】アスペクト比を維持して画像を表示【JavaScript,Canvas】

# 問題
画像をアスペクト比を維持しながら引き延ばしてcanvasの中央に描画しなさい。
また、画像が表示されない箇所は黒く塗りつぶしなさい。
※画像はcanvasとはアスペクト比が異なるものを用意してください。

![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/163605/e5344f25-19c1-38fa-b5f9-bf60c4105f5d.png)


#解答例

```js
function onLoadBody() {
    var ctx = document.getElementById('canvas').getContext('2d'),
        img = new Image();
    img.src = "img/test1.png";
    img.onload = function() {
        var canvasAspect = ctx.canvas.width / ctx.canvas.height, // canvasのアスペクト比
            imgAspect = img.width / img.height, // 画像のアスペクト比
            left, top, width, height;
 
        ctx.fillStyle = "black";
        ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
 
        if(imgAspect >= canvasAspect) {// 画像が横長
            left = 0;
            width = ctx.canvas.width;
            height = ctx.canvas.width / imgAspect;
            top = (ctx.canvas.height - height) / 2;
        } else {// 画像が縦長
            top = 0;
            height = ctx.canvas.height;
            width = ctx.canvas.height * imgAspect;
            left = (ctx.canvas.width - width) / 2;
        }
        ctx.drawImage(img, 0, 0, img.width, img.height, 
            left, top, width, height);
    };
}
```

#解説
canvasのアスペクト比と画像のアスペクト比を求めます。
画像の方が横長の場合、canvasの上下に隙間ができますよね。
その隙間を計算します。
画像のほうが縦長の場合、canvasの左右に隙間ができますよね。
その隙間を計算します。
【C#】eventやDelegateまわりを理解するために必要そうな知識４つをメモ

PHPやJSを通して、第一級関数の考え方や、JQueryの.on()と.trigger()といったイベント処理にも慣れているつもりの状態でC#のイベント処理実装をした。
公式やエンジニアのブログのサンプルをコピペして動かすことは出来たが、何がどうなって動いているのかがわからなかった。
きちんと理解するために情報を整理していく中で、断片的であるが以下のことを学んだ。

##①DelegateとEventHandlerとActionはみんな仲間。EventHandlerとActionはDelegateの派生クラスなので。

>https://docs.microsoft.com/en-us/dotnet/api/system.delegate?view=netframework-4.7
>https://docs.microsoft.com/en-us/dotnet/api/system.eventhandler?view=netframework-4.7
>https://docs.microsoft.com/en-us/dotnet/api/system.action?view=netframework-4.7

より、
Object->Delegate
Object->Delegate->EventHandler
Object->Delegate->Action
とそれぞれ派生している。EventHandlerとActionもみんなDelegate。

##②Delegate とは "静的メソッドまたはクラス インスタンスとそのクラスのインスタンス メソッドを参照するデータ構造体"
そもそもDelegateってなんだっけ、ということで用語の確認。
https://msdn.microsoft.com/ja-jp/library/system.delegate(v=vs.110).aspx より。
Delegateは関数(メソッド)を参照しているものなんですね、という確認。
普通に関数を実行するように、Delegate型のインスタンスにも、 delegateInstance(); ってカッコ付けて書くことで、参照先の関数が実行されるというイメージ。多分。


##③EventArgsクラスはObjectクラスから直接派生している小さなクラス
・Object->Delegate と派生している（https://docs.microsoft.com/en-us/dotnet/api/system.eventargs?view=netframework-4.7）
・EventArgsクラスにはコンストラクタ引数やデータをセット/保持するためのメソッド/フィールドが無い（https://msdn.microsoft.com/ja-jp/library/system.eventargs(v=vs.110).aspx）

EventArgsクラス自体は多くの役割を持ってなさそうだとドキュメントからわかったので、
「EventHandlerに渡されてきたEventArgsインスタンスがEventArgsクラスから派生してないままなら、イベント固有のデータが無いことがわかる」という役割だけを果たすクラスと考えてよさそう
だから逆に「EventArgsが派生された状態でEventHandlerに渡されてきたら、イベント固有のデータがある」ともいえる

まあなんというか結局 https://msdn.microsoft.com/ja-jp/library/5z57dxz2(v=vs.110).aspx のとおり。

##④eventキーワードは、Delegateにラッパーをかけるように使う。
雑に言うと、eventキーワードは、delegateを特殊なdelegateにさせるためのキーワードっぽい。
「+=演算子での使用を強制」「宣言元からしか呼び出せない」という特殊なdelegate（＝イベント）に。

eventキーワードの使い方を紹介するサンプルでは

```C#
public event EventHandler CountdownCompleted;
```
```C#
public event AlarmEventHandler Alarm;
```

の２パターンをよく見るが、このときEventHandlerもAlarmEventHandlerも、Delegateクラスである。
"AlarmEventHandler"Delegateが、引数に(object sender, EventArgs e)をとる形じゃない場合はどうなるのかが、ドキュメントから見つけられなかった。コンパイルエラーになるのか、別に問題ないのか。
[swift]deprecated 非推奨

deprecated 非推奨

Swift の書き方

~~~swift 
@available(*, unavailable, deprecated: 3.0)
~~~

---

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
【postgress】pg_dumpでバックアップを定期的に保存

条件
データーベースごとのバックアップ
シェルスクリプトを記述してcronで定期的にバックアップ
バックアップしたものは圧縮して保存
バックアップで一週間過ぎたものは削除される

#シェルスクリプト
シェルスクリプトの処理
pg_dumpでダンプファイルの取得
tarコマンドで圧縮
保存期間のすぎたファイルの削除


バックアップ場所の作成(`/var/backup/`へ作成します)

```
#mkdir -p /var/backup/
#chmod 777 /var/backup/
```

シェルスクリプトの作成

```
#mkdir -p /var/backup_sh/
#vi /var/backup_sh/pg_backup.sh
```


```text:pg_backup.sh
#!/bin/bash

# バックアップファイルを残しておく日数
PERIOD='+7'

# 日付
DATE=`date '+%Y%m%d'`

# バックアップ先ディレクトリ
SAVEPATH='/var/backup/'

# 先頭文字
PREFIX='project-'

# 拡張子
EXT='.sql'

# データーベース名
USER='user'
DBNAME='sampledb'


# バックアップ実行
pg_dump -U $USER $DBNAME > $SAVEPATH$PREFIX$DATE$EXT

# tar圧縮
tar --remove-files -P -zcvf $SAVEPATH$PREFIX$DATE$EXT.tar.gz $SAVEPATH$PREFIX$DATE$EXT

# 保存期間が過ぎたファイルの削除
find $SAVEPATH -type f -daystart -mtime $PERIOD -exec rm {} \;
```

#シェルスクリプトが実行できるように実行権限付与
`#chmod u+x  /var/backup_sh/pg_backup.sh`

#cronで定期的に実行
毎日深夜2時に実行する例。

`#crontab -e`

```cron:crontab
00  2  *  *  * /var/backup_sh/pg_backup.sh
```


#参考サイト
[PostgreSQLのバックアップをcronで定期的におこなう方法](http://vdeep.net/postgres-backup)
【CSS3学習】CSSについて

#CSSとは#

**Cascading Style Sheet(カスケーティングスタイルシート)**の略。
HTMLに対して色、大きさ、配置などを指定してページをデザインするための言語で、**どこの、何を、どうするか**を指定できる。

概要 : ホームページ＝HTML(構造的な文書)+ **CSS(見た目)**
範囲：CSS3
仕様 :w3c という団体が策定している。
(caniuse.com:どの機能がどのブラウザに対応しているかを調べられるサイトが便利)

###CSSを使うメリット###
CSSで文書の見栄えを指定することで、文書構造とスタイルを分けて管理でき、様々なメリットが生まれる。

**・文書構造を保ったままスタイルを指定できる**
HTMLで文書のスタイルを指定してしまうと、文書構造が分からなくなる問題が起こってしまう。CSSを使うことで文書構造に影響を与えずにスタイルを指定できるようになる。

**・メンテナンス性が向上する**
HTMLでスタイルを指定する場合、見出しの色やサイズを変えようとすると、見出しが使用されている全ての箇所を変更する必要があるが、CSSではこうしたスタイルを一括で管理できる。
また、複数の文書でスタイルを共有できるため、格段にメンテナンス性が向上する。

**・SEO効果やアクセシビリティ向上が期待できる**
HTMLによるスタイルの指定をやめて情報を適切にマークアップすることで、検索エンジンに正しく解釈されるウェブページになる。
またCSSでスタイル指定することで、文書から余分なマークアップを排除して、スタイルに関する記述を一箇所にまとめ、ウェブページを軽量化することができる。
これらの改善で、多くの場合SEO効果やアクセシビリティ向上が期待できる。

**・メディアごとにスタイル指定できる**
CSSではPC,スマホなど様々なメディアごとに適用するスタイルを指定し、分けることができる。
メディアごとにスタイルを指定することで、それぞれのメディアに合ったスタイルでウェブページを表示させることができるようになる。

##基本の記述方法##

**セレクタ　{ プロパティ : 値 ; }**

セレクタ : スタイルを適用する対象(要素名)
プロパティ : スタイルの内容

```css 
h1 {
    color: #000;
    font-size:10px;
} 
```

###コメントの書き方###

/&lowast;から&lowast;/で囲んだ範囲はコメントとなり、ブラウザには無視されるので。一時的にCSSを無効にしたり、CSSソース内にメモを残す際に使用する。

```css 
/*色を黒にして、フォントサイズを10pxにする*/
h1 {
    color: #000;
    font-size:10px;
} 
```

##HTMLにCSSを適用する##

**・&lt;link&gt;要素で外部CSSファイルを呼び出して適用する。**

>スタイルシートを記述したCSSファイルをHTMLファイルとは別に作成し、HTMLファイル内から呼び出す。 
呼び出しには、HTML文書の&lt;head&gt;要素内に<link>要素を記述して、外部CSSファイルを指定。 
適用されるスタイルがCSSによるものであることをブラウザなどに知らせるために、**&lt;head&gt;要素のtype属性の値にはtext/cssを指定する。 
スタイルの修正のしやすさなどを考慮すると、この方法でスタイルシートを設定するのがおすすめ。**

>```html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<link rel="text/css" href="xxx.css">
	<title></title>
</head>
```

・要素にstyle属性を追加して局所的に適用する
>要素にstyle属性を追加して、HTMLソース中に直接スタイル指定を記述する。 style属性によるスタイル指定をする場合には、 文書内で使用されるスタイルシートがCSSによるものであることをブラウザなどに知らせるために、 &lt;head&gt;要素内に&lt;meta&gt;要素を記述してスタイル言語の値にtext/cssを指定する。 多くの場合、この指定をしなくてもブラウザによって自動的に判断されますが、誤動作を避けるためにも記述したほうが○。
style属性によるスタイル指定は、部分的にスタイルを優先指定する際などには便利ですが、 HTMLソースが複雑になってスタイル管理が煩雑になりがち。**効率の良いスタイル管理を目指す場合には、 CSS部分を外部ファイル化するのが一般的。**

・&lt;style&gt;要素で文書単位に適用する

>HTML文書の&lt;style&gt;要素内に&lt;style&gt;要素を記述し、文書単位にスタイルシートを設定する。 適用されるスタイルがCSSによるものであることをブラウザなどに知らせるために&lt;style&gt;要素のtype属性の値にはtext/cssを指定する。





今回はここまで。
次回はセレクタについてまとめていきたいと思います^^

[cssセレクタについて](http://qiita.com/natsukan/items/c1656e2ea1c1ae65ffc9)
[Unity]子オブジェクトをTransformで取得

オブジェクトの子を取得する方法は検索すれば色々な方法が出てくると思いますが、メモとして。
今回はMeshRendererを持つ子オブジェクトにBoxColliderコンポーネントを追加するスクリプトを作成します。

# 子オブジェクトの取得

    var childTransform = GameObject.Find("RootObject").transform;

    foreach (Transform child in childTransform.transform)
    {
        if (null != child.GetComponent<MeshRenderer>())
        {
            if(null == child.GetComponent<BoxCollider>())
            {
                Debug.Log(child.name);
                child.gameObject.AddComponent<BoxCollider>();
            }
        }
    }
        
GameObject.Find("RootObject")の所は

    public Transform rootObject;
    
のようにして、インスペクタからアタッチしても良いです。
FindとForeachを使用しているので、処理時間はかかるかもしれません。


## 全ての子(孫)オブジェクトを取得
    var childTransform = GameObject.Find("RootObject").GetComponentsInChildren<Transform>();

    foreach (Transform child in childTransform)
    {
        if (null != child.GetComponent<MeshRenderer>())
        {
            if(null == child.GetComponent<BoxCollider>())
            {
                Debug.Log(child.name);
                child.gameObject.AddComponent<BoxCollider>();
            }
        }
    }

GetComponentsInChildrenですべての子コンポーネントを取得します。    
childTransformは配列で受け取ります。
openpyxlでExcelを読む

openpyxlというモジュールがあります。

これは、PythonでExcelを読み書きできるものです。とりあえず今回はこのモジュールを使って、既存のExcelファイルを読んでみました。

なお、openpyxlを使ってExcelファイルを作成する方法については、Qiitaで記事を書いている方がいらっしゃるようです。気になる方はそちらをどうぞ。

# まずは基本(インストール、import、ファイル読み込み)

## インストール
```bat
  > easy_install openpyxl
```

## インポート
```py
  import openpyxl
```

## ファイルの読み込み
```py
  book = openpyxl.load_workbook(filename)
  sheet = book.active # アクティブなシートオブジェクトを取得
```

# セルへのアクセス、forで回す

## セルへのアクセス
```py
  print(sheet.cell("A1").value)
```

## forで回す
```py
  for row in sheet.rows:
    for cell in row:
      print(cell.value, end=" ")
    print("")
```

# 使用上の注意点

## Excelワークシート内に書かれているテーブルは利用できる？
**使用できません**。

ドキュメントを読むとテーブルの作成はできるようですが、そこで作成したテーブル以外は操作できないようです。

### テーブルが使えなければ、forループで回した場合の端はどこになる？
**値が書き込まれている一番右下のセル**になるようです。

## 行結合・列結合されたセルはどう読む？
セルが行結合/列結合されているかどうかをopenpyxlから知ることは**できません**。

ただし、行結合/列結合すると、結合したセルの左上セル以外の値は全てNoneになります。なので、それを元にセルに設定されている値を推測することはできるのではないでしょうか？

### たとえば
たとえば次のような列があった場合…。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/14499/3376a4ca-2c18-7730-825e-793dd41fca42.png)

```py
  for row in sheet.rows:
    for cell in row:
      print(cell.value, end=" ")
    print("")
```
を実行すると、出力は次にようになります。

```
A 1 2
B 3 None
None 5 6
C 7 8
None 9 0
```
このへんから結合されたセルに何が書かれていたのかを推測する形になるでしょう。
python初心者の備忘録　関数について

pythonについて勉強したことをまとめていきます。
#関数
##キーワード引数
```python
def test(a,b,c):
    return {"a" : a ,'b' : b, 'c' : c}
    
print(test(b=3,c=3,a=66))
```
この場合は```{'a': 66, 'b': 3, 'c': 3}```と出力される
このように引数の名前を指定して実行できる。
（わかりづらくてスマン）

##デフォルト引数
引数を指定し忘れたときのためにデフォルト引数を指定できる

```python
def test(a=0,b=1,c=2):
    return {"a" : a ,'b' : b, 'c' : c}
print(test())

>>> {'a': 0, 'b': 1, 'c': 2}
```

##*による位置引数のタプル化
仮引数の一部として*を使うと可変個の位置引数をタプルにまとめて仮引数にセットする。

```python
def test(*args):
    print(args)
test(1,4,22,'hell')

>>> (1, 4, 22, 'hell')
```

*を使うときに仮引数をargsと呼ぶ必要はないが __argsとするのが一般的になっている__
##**によるキーワード引数の辞書化
**を使うとキーワード引数を一つの辞書にまとめることが出来る。

```python
ef test(**kwargs):
    print(kwargs)
test(akb=48,nogizaka=46,kkk="hello")

>>>{'akb': 48, 'nogizaka': 46, 'kkk': 'hello'}
```
位置引数をまとめる*argsと**kwargsを併用する場合、この２つはこの順序で並べなくてはいけない。

##docstring
関数本体の先頭に文字列をつけると関数定義にドキュメントをつけることが出来る。

```python3
def test(s):
    '引数をそのまま返す'
    return s
print(test.__doc__)

>>>引数をそのまま返す
```
アンダースコアの意味はまだわからない。
##クロージャ
クロージャが何なのかはよくわからないが少しまとめておく

```python3
def circle_area_func(pi):
    """円の面積を求める関数を返す"""
    def circle_area(radius):
        return pi * radius ** 2 #このpiは、circle_area_func()の引数に指定された値

    return circle_area #関数を返り値として返す

#円周率を 3.14 に設定した場合の面積を計算する関数を生成
ca1 = circle_area_func(3.14)

#次に、円周率を3.141592に設定した場合の関数を生成
ca2 = circle_area_func(3.141592)

#上記で作成した２つの関数に、半径=1 を引数に与えて、演算結果を取得
ca1(1)  #>>>3,14
ca2(1)  #>>>3.141592
```
> このようにクロージャの特徴を使えば、関数を生成して返す関数をひとつ作っておくだけで「ロジックは同じだけどその内部で使用するパラメータが異なる関数」を動的に作成することができます。この仕組みにより、「変数だけでなく処理（=関数）を部品化し使いまわせる」という特徴（関数型言語的特徴）が言語に加わります。

だそうです、、、
イメージはつかめた気がします。
ただ使えるとは言ってない
##ラムダ関数
Pythonでは、「lambda式」を使って無名関数を作ることができます。

```python3
myfunc = lambda x: x ** 2 

myfunc(5)  # 25
myfunc(6)  # 36
```
これは、「def」を使って

```python3
def myfunc(x):
    return x ** 2
```
と定義したときと同じ処理となります。つまり、「lambda x: y」という形のうち、xが引数、yが戻り値となります。
python初心者の備忘録　内包表記について

pythonを学びにあたって大事だと思ったことをメモしていく.

#内包表記
##リスト内包表記
```python
number_list=[]
for number in range(1,6):
	number_list.append(number)
```
このコードで1~5までの数字のリストが作れる。
しかし、このような書き方でも出来る

```python
number_list=[number for number in range(1,6)]
```
こっちのほうがスマートだ

条件式の追加もできる

```
a_list=[number for number in range(1,6) if number % 2 == 1 ]
```
このコードで1~5までの奇数のリストをつくれる
内包表記を使わない書き方と見比べてみよう

```
a_list=[]
for number in range(1,6):
	if number % 2 ==1:
		a_list.append(number)
```
内包表記のほうがかなりコンパクトだ

また多重ループも内包表記を使うことが出来る

```python
for i in range(1,4):
	for k in range(1,6):
    	print(i,k)
```
内包表記ver

```python
S =[[i,k] for i in range(2,4) for k in range(1,5)]
print(S)
```

##辞書包括表記
辞書にも内包表記がある。本には包括表記とあった
基本的にはリスト内包表記と同じ書き方。

```python
di={key:key**2 for key in range(1,5)}
```
こんな辞書が出来る　{1: 1, 2: 4, 3: 9, 4: 16}

##ジェネレータ内包表記
タプルには内包表記がなく

```python
num=(i for i in range(1,4))
```
のようにするとジェネレータオブジェクトが出来る。
**ジェネレータが何かは今は知らない。**
Visual Studio Code の表示言語を日本語に変更する方法

Visual Studio Codeをアップデートしたら、勝手に表示言語が英語に変わってしまい、
日本語に戻す方法がわからなかったので調べてみた。

# 言語設定の変更方法

1. [F1] キーでコマンドパレットを表示。
2. 「Configure Language」と入力して、「locale.json」を開く
3. jsonファイル内の項目を以下のように変更

```json:locale.json
"locale":"en"
↓
"locale":"ja"
```

サポートしている言語設定は以下のサイトで確認できます。

[https://go.microsoft.com/fwlink/?LinkId=761051](https://go.microsoft.com/fwlink/?LinkId=761051)
【SublimeText2】 置換するときエスケープしなきゃいけない文字


こちらの記事を参考に、一括置換しようとしたが、上手くいかない、、
http://qiita.com/miupink/items/9fda800b4bb5ef0bc731

原因は検索対象がjQueryの記述で
$や(などエスケープしなきゃいけない文字があったからだ。。

```js:hoge.js
// こいつを検索したい
$(function(){
    var boderHeight = $("#linkArea").height();
});
```

そこでエスケープしなきゃいけない文字一覧をメモ

<pre>
エスケープが必要な文字（必要ない場合や処理系もあり）
\\
\.
\*
\^
\$
\+
\|
\?
\(
\)
\[
\]
\{
\}
</pre>

こんな感じで検索かけたら上手くいった。

```js:hoge.js
// こいつを検索したい
\$\(function\(\)\{
    var boderHeight = \$\("#linkArea"\).height\(\);
\}\);
```

参考
http://yoshikawaweb.com/regex-cheat-sheet-for-text-editor.html

おわり。
Go言語でアルゴリズムレッスンやってみるヅラ（再帰呼び出しとか）part1

# 再帰呼出しとは
[Wikipedia-再帰](https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0)
簡単に言うと関数内で自分自身の関数を呼び出すこと
for文とかWhile文の代わりに使える

```go:example.go
func example() {
    // somethig
    example()
}
```

# 題材
順列問題を題材にしましょう
[Wikipedia-順列](https://ja.wikipedia.org/wiki/%E9%A0%86%E5%88%97)
> 区別可能な特定の元から有限個を選んで作られる重複の無い有限列をいう
アナグラムは順列の具体的な例なのでこれを求めるプログラムを書いてみよう

とあるファイルにアルファベットの文字列がたくさんはいってます。
この中からアナグラムの関係にある文字列を全て探し出しましょう。

一番最初に思いつくのは順列全パターン探しだして、
ファイルの上から順に探していくアルゴリズム。
まあ、理論上いけるはずなのでやってみよう。

N文字のアナグラムはNの階乗個存在しうるので、
単純なプログラムで書いた場合、計算時間は

```math
(計算時間) = O(n!)
```
になります。

しかもメモリ上に13文字のアナグラムを全てのっけようとすると、
単純に

```math
13!(bytes)=6.2270208(GB)
```
うーん。。僕の手元のマシンがメモリ8ギガなのでギリギリです。
14文字のアナグラムだと当然アウトです。
ファイルから14文字以降の文字列は予め消しておきます。

一旦再帰呼出しでアナグラムを全て求めよう。

# やってみた
[ソースコードはこちら](https://github.com/miumiu0917/anagram-search/blob/master/anagram.go)

```go:anagram.go
func anagramList(word string) []string {
  if len(word) == 1 {
    return []string {word}
  }

  ret := []string {}
  for i := 0; i < len(word); i++ {
    words := anagramList(word[0:i] + word[i+1:len(word)])
    for _, w := range(words) {
      ret = append(ret, word[i:i+1] + w)
    }
  }
  return ret
}
```

この部分が実際にアナグラムの候補を全パターン探し出す関数です。
引数にはアナグラムの元となる文字列をとります。

### 関数が何をしているのか

1.引数の文字列の長さをチェックし、1文字の場合、それ自身を配列に格納し返却
2.引数が2文字以上だった場合、文字列のi番目を取り除いたものを自分自身の関数に渡す
3.2の返却結果配列の要素全てについて2で取り除いたi番目の文字を先頭として文字列を結合し返却

これでアナグラムの候補が全て求まります。
2,3文字くらいで紙などに書いて試してみるとよくわかると思います。
ポイントは
1.1文字のアナグラム候補は自分自身1通りしかないこと
2.1文字取り除いて、残りの文字列でアナグラム候補を作り、先頭に取り除いた文字をくっつける、を全文字に対して処理することで求める全パターンが手に入る
ex) 'abc'のアナグラム候補は
'a' + アナグラム候補('bc') = 'a' + 'bc' or 'a' + 'cb'
'b' + アナグラム候補('ac') = 'b' + 'ac' or 'b' + 'ca'
'c' + アナグラム候補('ab') = 'c' + 'ab' or 'c' + 'ba'
∴('abc', 'acb', 'bac', 'bca', 'cab', 'cba')

これを文字数が増えても同じことをどんどん繰り返していく、ということです。

# 感想
再帰は難しいですが、使いこなせると非常に強力ですね。
リポジトリのコードはGo ver1.8で動作確認しているので動かしてみてください。
※めちゃくちゃ遅いです。

part2ではもっと速くアナグラム候補を探し出すアルゴリズムを実装します。
最新Linux環境で古いRubyをビルドする

## はじめに
古いRuby(2.3) * 最新のLinux環境 = ビルドエラー
の方程式にハマったので、メモ。2017年6月現在の状況であり、半年過ぎたら確実に状況が変わっているとおもわれる。

## 動作確認環境
- ArchLinux
- rbenv(+ruby-build)
- Ruby2.3.1

## GCC
Rubyをビルドするとき、gcc7.1.1が良く分からないけどあらゆるところでエラーする。素直に6.x系に落とす。

ArchLinuxでは、

https://wiki.archlinuxjp.org/index.php/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89

ここを参考にしてダウングレードを行う。自分は6.3.1を `downgrader` を使って引っ張ってきて、一旦gccとgcc-libsをアンインストール、 `pacman -U` コマンドで古いバージョンを選択的にインストールしたあと `/etc/pacman.conf` の `IgnorePkg` に `gcc gcc-libs` を追加した。

## OpenSSL
Ruby2.3系はOpenSSLの最新版との問題がつきまとう。ネットにパッチが転がったりしているので、それで解決できそうならそれでも良い。今回はOpenSSL側で解決する方法を見つけたのでそれでやる。

まず、AURに古いOpenSSLのパッケージ `openssl-1.0` があるのでそれを落とす。次に

```
PKG_CONFIG_PATH=/usr/lib/openssl-1.0/pkgconfig
```

を環境変数にセットしてRubyをコンパイルすれば良い。

(参考にしたstackoverflow) https://stackoverflow.com/questions/44116005/openssl-error-installing-ruby-2-1-x-and-2-3-x-on-archlinux-with-ruby-install-rub

補足：OpenSSL1.0->1.1の非互換はとてもでかいらしく、また殆んどのディストリが1.0を同時にインスコできるのでバックポートしてないという話を伺ったので、開発者サイドが想定している解はこちららしい(常に正しいと言うつもりもないが

## 補足 Ruby2.2.6
Ruby2.2.6も2.3系と同様にインストールできた。
ファイルのコピーができない時(Permission denied)の対処方法

### **ファイル権限の確認**
***
コピー対象のファイル名 `test1`
ファイルの所有者でない。

**使用コマンド**
`ls -al 対象パス` 

**標準出力**

```
-rw-------  1 root root  1768  4月  7 18:42 2017 test1
-rwxrw-rw-  1 root root  1768  4月  7 18:42 2017 test2
drwxrw-rw-  1 root root  1768  4月  7 18:42 2017 old
```

結果の頭10桁が権限を表している

**結果の見方**
・先頭1桁目

    - ファイル
    d ディレクトリ
    l シンボリックリンク

・残り9桁
　2文字目から4文字目はファイルの所有者に対する権限を表し、
　5文字目から7文字目はファイルの所有グループに対する権限を表し、
　8文字目から10文字目はその他に対する権限を表しています。

```
r 読み取り
w 書き込み
x 実行
- 権限なし
```

**パーミッションの意味**
・ファイル

    r: 読める
    w: 編集して上書き保存できる
    x: コマンドとして実行できる ex) /bin/ls

・ディレクトリ

    r: ファイル一覧が表示できる(lsが打てる)
    w: ファイル一覧を修正できる(rm, touch, mvとか)
    x: ディレクトリ内にcdできる。ディレクトリ内のfind, touch, rmはできない

コピーであれば `r` が付いていれば可能。
test1にはその他のユーザーに対して読み取り権限が付いていないため、コピーすることができない。

### **権限の変更**
***
`chmod`コマンドを使用して読み取り権限をつける
上記の方法をとることでコピーは可能となるが、複数人で共有している場合、権限の変更は厳禁。
今回はこの方法の説明は省略する。この方法を取る場合は以下のURLを参照
http://qiita.com/shisama/items/5f4c4fa768642aad9e06

### **コピーの作成**
***
**サイズの確認**
・コマンド
`du -sm ファイルパス`

・標準出力
`3 ファイルパス`

このファイルまたはディレクトリが3MBであることがわかる

**コピーの実行**
`cp -pr コピー元 新規名`
※`-pr`の意味を検索

**バックアップの追加**
tarコマンドでファイルをまとめる
`tar -cvf 新規名.tar ファイル名`
圧縮する場合は、`-zcvf`
解凍は `-xcvf` `-zxvf`

**コピーしたファイルに対してパーミッションの変更**
chmod -R ディレクトリ名
※ -R の意味を調べる
アプリにチャートを入れる方法

![wfc20161109000.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/51169d6b-8fc4-8fad-9622-f36d170d6b60.jpeg)

SaaSForceで作るアプリはデーターベースに関するものなので、チャートを入れることができます。

それには3つの要素が必要と言うことで、今回は｢猫の名前｣、｢日付｣、そして、｢体重」を使ってみたいと思います。

このようなテーブルで、とりあえず、『画面項目定義』まで終了してください。

![wfc20161109001.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/83e18b63-9618-6198-72ee-61ea61fe955c.jpeg)

画面レイアウト設計から、「編集」をクリックして画面デザイン画面を別画面で開きます。

![wfc20161109002.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/42b9817c-3e26-d586-d81b-8ff0523e2c2c.jpeg)

そして、「チャート」のアイコンをクリックすると次のようなパーツが出てきます。

![wfc20161109003.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/5926b573-4fb4-a146-f306-2f724547f58c.jpeg)

このパーツを移動させてから、右クリックでリストを表示させます。

![wfc20161109004.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/8285b2a5-5c4b-017b-94f8-8cbd4bd444ad.jpeg)

「チャート設定｣を選ぶと、次の画面がポップアップされます。

![wfc20161109005.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/6bafe2bb-583a-fea3-35ee-a907706fe16b.jpeg)

｢図形｣で折れ線グラフを選び、｢分析対象｣を｢猫の名前｣、｢対象横軸｣を｢日付」、「対象縦軸」を｢体重｣を選び、｢保存して閉じる｣を押します。

そして、この画面全体を保存して、一度開発環境からログアウトし、再びテストサーバーにIDとパスワードを使ってログインします。

![wfc20161109007.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/b3057507-fdf7-93b3-587a-cd5c4b1f3b53.jpeg)

確認すると、このような感じでグラフが出ます。

おそらく、やり方によっては複数の対象についてのデーターを人目で見られるグラフも作れると思うのですが、私ではこれが今精一杯です。
composer install/update/require等で404 not foundが出る場合

どうやら、packagistがhttpsのみ受け付けるようになったようです。

従来からcomposerを使っている場合、
config.jsonのrepositories.packagist.urlに
http://packagist.org
が設定されていることがあります。

そうすると、

The "http://packagist.org/xxxx.json" file could not be downloaded (HTTP/1.1 404 Not Found)

のような出力が出て正常に処理が進みません。

そこで、
config.jsonファイルを修正するか、
composer config -g repositories.packagist composer https://packagist.org
上記コマンドで対応可能です。
※グローバル設定の場合
pythonで日付計算する方法


こんにちはsekitakaです。

pythonのdatetimeモジュールのtimedeltaオブジェクトを使うと日時の加減算や、2つのdatetimeの差を求める計算を簡単に行う事ができます。

# 使用例
```python
# coding:utf-8
# !/usr/bin/python
from datetime import datetime,timedelta
import pytz

# 現在時刻を元に加減算する
timezone = pytz.timezone('Asia/Tokyo')
now = datetime.now(tz=timezone)
delta = timedelta(days=+1)
tomorrow = now + delta
print "今は{0}".format(now)
print "今の1日後は{0}".format(tomorrow)

# ２つの日付の差を算出する
delta = tomorrow - now
print "差は{0}日".format(delta.days)
```

より詳細な使い方は[公式ドキュメント](https://docs.python.jp/2/library/datetime.html#timedelta-objects)を参考にしてください。
matplotlib で日本語表示

# 設定方法

環境は、Ubuntu 14.04, anaconda3-4.1.1。

1. デフォルトの設定ファイル `matplotlibrc` を `~/.config/matplotlib/` 以下にコピー。
2. 1. で `font.family : TakaoPGothic` と指定。

たったこれだけでグラフに日本語を表示できた。

デフォルトの matplotlibrc は、

```python
import matplotlib
matplotlib.matplotlib_fname()
```
で見つけることができる。

ただ環境によっては動作が違うかもしれない。上の方法でうまく行くとはかぎらないかも。参考までに。

# 参考

http://kaisk.hatenadiary.com/entry/2015/02/15/215831
http://qiita.com/canard0328/items/a859bffc9c9e11368f37
http://qiita.com/kshigeru/items/0cfc0778bab197687967
HerokuでFFmpegを使う[Laravel]

###概要
・LaravelでFFmpegを使用する時に設定がらみで苦労したので、備忘録として残します。

###環境
・Heroku
・Laravel（5.2）
が既に構築済み。


###laravel-ffmpegをインストールする
LaravelでFFmpegを使うライブラリは検索すれば色々出てくるが今回は[laravel-ffmpeg](https://github.com/pascalbaljetmedia/laravel-ffmpeg
 "laravel-ffmpeg")をインストールした。

①composer経由でlaravel-ffmpegをインストール
```
composer require pbmedia/laravel-ffmpeg
```
②config/app.phpに以下のコードを追記

```php:config/app.php
'providers' => [
    ...
    Pbmedia\LaravelFFMpeg\FFMpegServiceProvider::class,
    ...
];

'aliases' => [
    ...
    'FFMpeg' => Pbmedia\LaravelFFMpeg\FFMpegFacade::class
    ...
];
```

③以下のコマンドで設定ファイル「config/laravel-ffmpeg.php」を作成
```
php artisan vendor:publish --provider="Pbmedia\LaravelFFMpeg\FFMpegServiceProvider"
```


###HerokuにFFmpegをインストール
①.buildpacksに以下を追記

```.buildpacks
https://github.com/laddhadhiraj/heroku-buildpack-ffmpeg
```

②commitしてgit push heroku master


###Heroku用にconfig/laravel-ffmpeg.phpの設定を変更する
①以下のコマンドを実行。
```
    heroku run "which ffmpeg"
```
HerokuにFFmpegが無事にインストールされていれば以下の結果が返ってくるのでメモする（環境によって返ってくるパスが異なるかもしれません）。
```
/app/vendor/bin/ffmpeg
```
②続いて以下のコマンドを入力。

```
heroku run "which ffprobe"
```
以下の結果が返ってくるのでメモを残す（こちらも上記のコマンド同様に環境によって返ってくるパスが異なるかもしれません）。
```
    /app/vendor/bin/ffprobe
```

③config/laravel-ffmpeg.phpの設定を以下の通りに変更する。

```php:config/laravel-ffmpeg.php
　　...
    'ffmpeg.binaries' => '/app/vendor/bin/ffmpeg',//heroku run "which ffmpeg"で返ってきたパスを入力
　　...
    'ffprobe.binaries' => '/app/vendor/bin/ffprobe',//heroku run "which ffprobe"で返ってきたパスを入力
```
④commitしてgit push heroku master
以上でHerokuでもFFmpegが使用できるようになる。

###参考
[laravel-ffmpeg](https://github.com/pascalbaljetmedia/laravel-ffmpeg
 "laravel-ffmpeg")
[heroku-buildpack-ffmpeg](https://elements.heroku.com/buildpacks/detourhub/heroku-buildpack-ffmpeg
 "heroku-buildpack-ffmpeg")