OmniAICreator/Qiita-1.07M huggingface dataset:
stm32の開発環境構築


#背景
STM32の開発環境構築(無償でなんとかなる範囲)でずっと悩んでいました。

mbedはオンラインでの開発が前提のため、ネットワークの関係でアクセスできない環境&デバッガを使用できないのでNG。(自分がmbedでデバッガを使用する方法を知らないだけかもしれませんが…)
EclipseにARMのToolChainを入れて、OpenOCDと連携させようとしても上手くいかない。。

色々と試して、ようやく開発環境ができたのでメモ。

#環境
OS:Windows10 64bit

#ソフト
ソフト名:Sytem Workbench for STM32
URL:www.st.com
Eclipseベースの統合開発環境です。


#参考サイト
参考にしたサイトは以下。
開発環境構築
　http://yuqlid.hatenablog.com/entry/2016/06/13/004001
OpenSTMの日本語化
　http://d.hatena.ne.jp/replication/20150703/1435928324

#手順
(1) インストール
以下のサイトにアクセス。
　http://www.openstm32.org/HomePage

ユーザ登録後に、環境に合うインストーラをダウンロード。Windows10用はないが、ひとまずWindows7用で動作する模様。
ファイル：install_sw4stm32_win_64bits-v1.14.0.exe 

System WorkbenchはEclipseベースのソフトなので、Javaのランタイムが必要。インストールされてない場合はSystem Workbenchのインストール最中にDLサイトに誘導してくれるのでJREをインストール。

(2) System Workbenchの日本語化
前述の通り、System WorkbenchはEclipseベースのソフトなのでPleiades適用で日本語化が可能。以下のサイトからダウンロードし、readmeの記載内容に従って適用する。(readmeを読めば分かる程度の簡単な手順なので詳細は割愛。)

Pleiadesダウンロードサイト
　http://mergedoc.osdn.jp/

(3) ST-LINK/V2-1のインストール
ST-LINK/V2-1のUSBドライバが必要なため、インストールされていなければ以下からダウンロードしてインストールする。
http://www.st.com/ja/embedded-software/stsw-link009.html

(4) プロジェクト作成
System Workbenchを起動。
初回起動はworkspaceをどこにするか聞いてくるので適当に指定(自分の場合はC:\Ac6\work)。

・「ファイル」→「新規」→「Cプロジェクト or C++プロジェクト」を選択。
プロジェクト名：適当に設定
プロジェクトタイプ：Ac6 STM32 MCU Project 
ツールチェーン：Ac6 STM32 MCU GCC
　「次へ」を選択。

・構成の選択で、Debug,Releaseを選択。
自分の場合はReleaseはしばらく使用予定ないのでDebugのみ選択。
　「次へ」を選択。

・MCUのコンフィグレーションを選択。
使用するチップを選択。公式に出ている開発ボードであればドロップダウンリストから選択。

今回使用する基板はNucleoのstm32f411reなので、以下の通り選択。
系列:STM32F4
Board:STM32F411RE

・ファームウェアを選択
以下の3つから選択する。
1. No firmware
2. Standard Peripheral Library(StdPeriph)
3. Hardware Abstraction Layer(Cube HAL)

2,3のどちらも最初はインターネットからファームウェアをPCにダウンロードするため少々時間がかかる。
以上でプロジェクト作成は完了。

参考までに。
3のCube HALはペリフェラルの抽象化を行い、移植性向上を狙ったドライバ。ペリフェラルの抽象化をしているだけあり、シンプルな使用方法では使いやすい。
→~~さらにRTOSやUSB,TCP/IPのミドルウェアを追加したのがCubeMXという話っぽいです。(間違っていれば指摘お願いします)~~　CubeMXの話は、コメントに@mt08さんの詳細解説があるので参照。

2のStdPeriphはペリフェラルを直接使用するドライバのみの提供。リファレンスマニュアルとドライバを見ながら実装するイメージ。

#動作確認
一定間隔でユーザLEDを点滅させ、デバッガで様子をみる。

(1) プロジェクトのファームウェアはStdPeriphで作成。Nucleoのstm32f411reは、ユーザLEDがPA5に接続されていることに気を付けてコーディングする。

```cpp:main.c
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"

int main(void)
{
	//GPIOにクロック供給
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

	//GPIOの設定
	GPIO_InitTypeDef pin_PA5;
	pin_PA5.GPIO_Pin = GPIO_Pin_5;
	pin_PA5.GPIO_Mode = GPIO_Mode_OUT;
	pin_PA5.GPIO_OType = GPIO_OType_PP;
	pin_PA5.GPIO_PuPd = GPIO_PuPd_DOWN;

	//GPIOの初期化
	GPIO_Init(GPIOA, &pin_PA5);

	for(;;){
		double i=0;
		while(1){
			i = i +1;
			if(i>100000){
				break;
			}
		}
		GPIO_ToggleBits(GPIOA,GPIO_Pin_5);
	}
}
```
(2) 「プロジェクト」→「プロジェクトのビルド」
(3) 「実行」→「デバッグの構成」
　・Ac6 STM32 Debuggingを右クリックし「新規」を選択。
　・分かりやすい名前を付けて「デバッグ」を押下。
(4) デバッグが開始される
　main関数の先頭で自動的にbreakされるので、「再開」ボタンを押して再開する。適当な箇所にbreak pointを設定し、breakされるか確認する。

以上で、stm32の開発環境構築は終わりです。
ある行数のファイルを均等に分割する場合の分け方を求める


行数がわかっているファイルを指定した数で分割する場合、どのように分割するかを求める。

```python:py
total=100 # 総行数
div = 7 #分割数

div_list = [ (total//div) + (1 if x <(total%div) else 0)  for x in range(div)]
# div_list = [15, 15, 14, 14, 14, 14, 14]
```
上記の例だと、１００行あるファイルを7つに分割すると、
１５行のファイル2つと１４行のファイル５つに分割すれば良い。
PagerDuty を使ってみる

# 目的
　最近っぽい SaaS の監視系サービス PagerDuty を試しに使ってみたのでメモ。

## アカウント作成
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/d1c15f4d-4677-371e-d92c-e2f96da5c8b9.png)

## エスカレーションポリシー作成
- Configuration > Escalation Policies > + Add New Policies
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/f2b2aa96-5211-6031-7373-f8d9fa13d398.png)

Integration Settings に Integrate via email を設定しましたが
Cloudwatch logs, Zabbix, Tivoli や API も設定できます。便利そうです。

## サービス作成
Configration > Services > + Add New Services
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/347a6481-1a32-0cb9-710f-4e32e8ff500f.png)

## メールを何通か送ってみる
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/698bdf62-1882-6ac2-7c9c-7da98c25beeb.png)

## 結果
Alerts
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/3a85fa2d-11d0-444e-b742-79182a2c12ce.png)
　見やすい。すごくよい。

# 感想
　様々な監視ツールに対応していてサクっと連携設定できるので非常に楽ちん。
　オンプレに載ってる Tivoli、IaaS に入れた Zabbix や Mackerel、AWS の CWLogs、DataDog の閾値超過とか様々なインシデントをとりあえず PagerDuty に集約して、Slackとかメールとか電話とかエスカレーションルートをここで設定するとバリ便利そう。
　もはや Zabbix Server 立ててる場合じゃないなぁ。
Rantly(property based testing tool)でテストデータ生成 - range

Rantly#range で特定の範囲内でランダムな数値データを作ります

## <i class='fa fa-question-circle'></i> 関連記事
[tbpgr の rantly 関連記事](http://qiita.com/search?utf8=%E2%9C%93&q=user%3Atbpgr%20tag%3Arantly)

## <i class='fa fa-flask'></i> サンプル

```ruby
# 引数を指定しないと INTEGER_MIN と INTEGER_MAX の範囲になる

Rantly(5){range}
# => [955873802895676542, -73831445360495690, -650533643963764624, 1819011983809745432, -931918409250267397]
Rantly(5){range}
# => [-288673784518865905, 1725913149165221655, -909904039256897699, 1826331295261411002, -894810853381165639]

# min と max を指定
Rantly(5){range(2, 5)}
# => [4, 4, 5, 3, 3]
Rantly(5){range(2, 5)}
# => [3, 4, 5, 4, 4]
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [abargnesi/rantly](https://github.com/abargnesi/rantly)
JIRAのチケット情報を取得する

API でチケット情報を取得する方法

Rubyは素人ですがとりあえず動いたので。

```ruby:jira_api.rb
require "base64"
require 'open-uri'

jira_uri='https://jira.uri'

＃ 入力
p 'JIRAのLoginIDを入力してください'
jira_user_id = gets
p 'JIRAのPasswordを入力してください'
jira_passwd = gets
p 'チケットIDを入れてください(ex. HOGE-128)'
ticket_id = gets

# 処理
auth_str = jira_user_id.chomp! + ':' + jira_passwd.chomp!
auth_base64 = Base64.encode64(auth_str)

res = open(jira_uri+'/rest/api/2/issue/' + ticket_id.chomp!,
    'Content-Type'=>'application/json',
    'Authorization'=> 'Basic ' + auth_base64
)
code, message = res.status

＃ 出力
puts(code + ':' + message);
puts(res.read)
```
MacにRubyをソースからインストールする

諸事情によりHomebrewが使えない環境のMacにRubyをソースからインストールしようとしたら地味にハマったので、手順を記録しておこうと思います。

# 環境

- Mac OS X 10.11.6 El Capitan
- Xcode 8.2.1
- Ruby 2.4.1
- OpenSSL 1.1.0e
- readline 7.0

# 手順

## OpenSSLのインストール

ソースをダウンロードして展開

```bash:コマンド
$ cd
$ curl https://www.openssl.org/source/openssl-1.1.0e.tar.gz -O
$ tar -zxvf openssl-1.1.0e.tar.gz
$ cd openssl-1.1.0e
```

設定、ビルド、インストール

```bash:コマンド
$ ./config --prefix=$HOME/openssl
$ make
$ make test
$ make install
```
※prefixは任意

## readlineのインストール

ソースをダウンロードして展開

```bash:コマンド
$ cd
$ curl http://git.savannah.gnu.org/cgit/readline.git/snapshot/readline-7.0.tar.gz -O
$ tar -zxvf readline-7.0.tar.gz
$ cd readline-7.0
```

設定、ビルド、インストール

```bash:コマンド
$ ./configure --prefix=$HOME/readline
$ make
$ make install
```
※prefixは任意

## Rubyのインストール

ソースをダウンロードして展開

```bash:コマンド
$ cd
$ curl https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.bz2 -O
$ tar -jxvf ruby-2.4.1.tar.bz2
$ cd ruby-2.4.1
```

設定、ビルド、インストール

```bash:コマンド
$ ./configure --prefix=$HOME/ruby \
  --with-openssl-dir=$HOME/openssl \
  --with-readline-dir=$HOME/readline \
  LDFLAGS="-L$HOME/openssl/lib -L$HOME/readline/lib" \
  CPPFLAGS="-I$HOME/openssl/include -I$HOME/readline/include"
$ make
$ make test
$ make install
```
※prefixは任意
※--with-openssl-dirなどの各ディレクトリは、前述の手順で指定したprefixに合わせる

パスを追加

```bash:コマンド
$ echo export PATH='$HOME/ruby/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
```
※パスはRubyのprefixに合わせる

## 動作確認

Rubyのバージョン確認

```bash:コマンド
$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin15]
```

gemの更新（※1）

```bash:コマンド
$ gem update --system
```

gemのバージョン確認

```bash:コマンド
$ gem -v
2.6.12
```

irbでの日本語入力確認（※2）

```bash:コマンド
$ irb
irb(main):001:0> 'てすと'
=> "てすと"
```

### 注釈
※1
Rubyのインストール時にOpenSSLを正しく指定していないと、`gem update --system` 実行時に以下のエラーになります。

```bash:コマンド
$ gem update --system
ERROR:  While executing gem ... (Gem::Exception)
    Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources
# 以下略
```

暫定策としては、gemのsourceをhttpサーバに変更する方法もあります。

```bash:コマンド
$ gem source --add http://rubygems.org/
$ gem source --remove https://rubygems.org/
```

※2
Rubyのインストール時にreadlineを正しく指定していないと、日本語の入力ができません。

```bash:コマンド
$ irb
irb(main):001:0> '\U+FFE3\U+FFA6\U+FFE3\U+FFE3\U+FFA8' # <= 'てすと'と入力できない
=> ""
```

以上です。
Swift3のDate で (時間・分・秒)を取得する方法

# 実装

```ViewController.swift
  override func viewDidLoad() {
        super.viewDidLoad()
   
        let date = Date()
        let calendar = Calendar.current
        
        let hour = calendar.component(.hour, from: date)
        let minutes = calendar.component(.minute, from: date)
        let seconds = calendar.component(.second, from: date)
        print("hours = \(hour):\(minutes):\(seconds)")
    
    }
```

# 参照

[How to get time (hour, minute, second) in Swift 3 using NSDate?](http://stackoverflow.com/questions/38248941/how-to-get-time-hour-minute-second-in-swift-3-using-nsdate)

[Swift3のDate で (時間・分・秒)を取得する方法]( http://off.tokyo/blog/2017/05/02/swift3-date/)
alias

##alias

すでに存在するメソッドに別の名前を割り当てたい場合がある。
そのような時にはaliasを使用する。
aliasの引数にはメソッド名かシンボル名を指定する

メソッド名をそのまま書く場合：　alias 別名　元の名前　
シンボルを使う場合：　　　　　alias :別名　:元の名前

以下の例はクラスC1とクラスC1を継承したクラスC2を定義している。
クラスC2ではhelloメソッドにold_helloという別名をつけた後にhelloメソッドを
再定義している。

```ruby:ruby

class C1 # C1クラスの定義

  def hello #helloを定義
    "Hello"
  end

end

class C2 < C1 #C1クラスを継承してC2クラスを定義

  alias old_hello hello　#別名old_helloを設定

  def hello #helloを再定義
    "#{old_hello},again"
  end

end


obj = C2.new
p obj.old_hello
p obj.hello


```
MT4 で 4109エラー

MT4 で kuchart のインジケーターを使って、対象７通貨の売買をしようと思ったら出たエラー。

> 4109 - trade is not allowed in the expert properties

Expert Advisor の 設定から自動売買を有効にする。

<img width="436" alt="スクリーンショット 2017-05-02 21.13.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/87900/8bac57c3-d45d-9649-2e5e-33c388fa5759.png">

<img width="619" alt="スクリーンショット 2017-05-02 21.14.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/87900/0cb10cad-28ed-7898-cde0-cd7cf85d87e4.png">

これだけでは駄目で、ツール→オプションの方でも自動売買を許可する。

<img width="600" alt="スクリーンショット 2017-05-02 21.15.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/87900/431c4992-da71-9a2f-c85e-e6256c99d9f1.png">

おしまい
Lineの標準スタンプ一覧PNGをダウンロードする

Line Notify や Messaging API では、スタンプ ( sticker ) が使えるのですが、そのスタンプ一覧が一枚の PDF で、全く再利用性が考慮されていない。通常、スタンプを送るアプリ等を開発する場合、sticker package id / sticker id などの数値だけでは、アプリ利用者から見れば、いったい自分は何のスタンプを送信しようとしているの分からないため非常に不便である。そこで、 Line Store から 標準スタンプを PNG 形式でダウンロード出来る URL を見つけたので、そちらを紹介。

基本的な URL 構成は、以下の通り
```http://dl.stickershop.line.naver.jp/products/0/0/{version}/{package id}/{platform}/stickers.zip
```
以下が、一覧PDFに載っているパッケージ #1 から #4 までのリンク
[パッケージ#1](http://dl.stickershop.line.naver.jp/products/0/0/100/1/android/stickers.zip)

[パッケージ#2](http://dl.stickershop.line.naver.jp/products/0/0/100/2/android/stickers.zip)

[パッケージ#3](http://dl.stickershop.line.naver.jp/products/0/0/100/3/android/stickers.zip)

[パッケージ#4](http://dl.stickershop.line.naver.jp/products/0/0/100/4/android/stickers.zip)
openframeoworks098+VS2015で疑似フルスクリーン


oopenframeowirks0.9.8使ってて、
・win環境だとフルスクリーンにすると変なティアリングとか入てどうもコマ落ちしてる感じがする時がある。
・vs2015でフルスクリーン時にアプリが落ちるとvsごと再起動しなくちゃいけないのでかったるい。
・プライマリ以外のモニターでフルスクリーンにしにくい。
辺りの問題を回避できそうな方法を見つけたのでメモ。

```
void Brunch::toggleWindowModeAsFullscreen()
{
	HMONITOR hMonitor;
	MONITORINFOEX  MonitorInfoEx;
	HDC glDc = wglGetCurrentDC();
	HWND hWnd = WindowFromDC(glDc);

	POINT pos = { ofGetWindowPositionX(), ofGetWindowPositionY() };

	hMonitor = MonitorFromPoint(pos, MONITOR_DEFAULTTONEAREST);
	// get
	MonitorInfoEx.cbSize = sizeof(MonitorInfoEx);
	GetMonitorInfo(hMonitor, &MonitorInfoEx);

	// Show
	cout << "WindowPos " << pos.x << ", " << pos.y << endl;
	cout << "Monitor.bottom = " << MonitorInfoEx.rcMonitor.bottom << endl;
	cout << "Monitor.left = " << MonitorInfoEx.rcMonitor.left << endl;
	cout << "Monitor.right = " << MonitorInfoEx.rcMonitor.right << endl;
	cout << "Monitor.top =  " << MonitorInfoEx.rcMonitor.top << endl;

	int scrW = MonitorInfoEx.rcMonitor.right - MonitorInfoEx.rcMonitor.left;
	int scrH = MonitorInfoEx.rcMonitor.bottom - MonitorInfoEx.rcMonitor.top;
	int monitorOriginX = MonitorInfoEx.rcMonitor.left;
	int monitorOriginY = MonitorInfoEx.rcMonitor.top;

	if (MonitorInfoEx.dwFlags == MONITORINFOF_PRIMARY)
	{
		puts("This is Primary Monitor");
	}
	else
	{
		puts("This is not Primary Monitor");
	}

	if (scrW == ofGetWidth() && scrH == ofGetHeight())
	{
		DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
		if (dwStyle & WS_CAPTION) {
			dwStyle &= ~WS_CAPTION;
		}
		else {
			dwStyle |= WS_CAPTION;
		}
		SetWindowLong(hWnd, GWL_STYLE, dwStyle);
		SetWindowPos(hWnd, HWND_TOP, monitorOriginX + 30, monitorOriginY + 30, scrW*.7, scrH*.7, SWP_SHOWWINDOW);
	}
	else
	{
		SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);
		SetWindowPos(hWnd, HWND_TOP, monitorOriginX, monitorOriginY, scrW, scrH, SWP_SHOWWINDOW);
	}
}
```


上の関数を作って実行すれば任意のモニターで疑似フルスクリーンになる。はず。
大きさとか後から再調整できないなくなるので、変えたい場合はSetWindowPosを適当な値を入れてもう一回呼ぶこと。とりあえずうごいてるようなので深追いはしない。

というか、of依存してるのofGetWindowPosition～だけなので、
ほぼof関係なかった。。。

追記
サンプルの動作をトグルっぽくなるようにした。

動作確認環境は
windows10
openframeworks 0.9.8
VisualStudio2015
たまに忘れてしまうMacでのキーボード入力まとめ(覚書)

#目的
あまり使わず、忘れてしまいがちな入力方法をまとめておく

#入力方法一覧

|文字|読み方|入力方法|
|:--|:--|:--|
|\|バックスラッシュ|optionキー+¥キー|
特別な変数selfについて(覚書)

##改訂履歴

- タイトル変更：タイトルを「特別な変数selfについて(覚書)」にしました。
- self(クラス)について頂戴したコメントと参考書を参考しながら加筆・修正しました。
- self(インスタンス)について頂戴したコメントと参考書を参考しながら修正しました。

##self(クラス)

- クラスメソッドはクラスそのもの(クラスオブジェクト)をレシーバとするメソッド。
- クラスメソッドは　`class　<< クラス名 ~ end`という特殊なクラス定義の中にインスタンスメソッドの形式で定義する。

```ruby:ruby

class << HelloWorld
  def hello(name)
    puts "#{name} said hello"
  end
end

HelloWorld.hello("John")

#=> "John said hello"

```

上記の方法ではなくクラス定義の中でクラスメソッドを追加することもできる。
クラス文の中のselfはそのクラス自身を参照するので次のように`class << self ~ end`として
その中にメソッドを記述する。こちらの方法が一般的に使われている。

```ruby:ruby

class HelloWorld

  class << self
    def hello(name)
      p "#{name} said hello"
    end

  end

end

HelloWorld.hello("John")

#=> "John said hello"

```

また、`class << self ~ end`を使わずに`def クラス名.メソッド名 ~ end`の形式で
クラスメソッドを定義することもできる。

```ruby:ruby

class HelloWorld

  def HelloWorld.hello(name)
    p "#{name} said hello"
  end

end

HelloWorld.hello("John")

#=> "John said hello"

```

上記形式の場合もselfを使って次のように書くことができる。

```ruby:ruby

class HelloWorld

  def self.hello(name)
    p "#{name} said hello"
  end

end

HelloWorld.hello("John")

#=> "John said hello"

```

###特異クラス

`class << self ~ end`という書き方のクラス定義を「特異クラス定義」という。
また、特異クラス定義で定義したメソッドを特異メソッドという。


##self(インスタンス)

~~1. selfはインスタンスメソッド内で使用するとそのメソッドを呼び出している**「インスタンス」**の事を指す。~~
~~2. 他のインスタンスメソッドを呼び出したい時にselfを使う~~

インスタンスメソッドの中で、メソッドのレシーバ自身を参照するには「self」を使う。
アクセスメソッドで作成したcolorメソッドを「別のインスタンスメソッドから呼ぶ」ことを以下で考えてみる。

```ruby:ruby

class Car

attr_accessor :name,:color

  def initialize(name,color)
    @name = name
    @color = color
  end

  def put_color
   puts "車の色は#{self.color}です" #このselfはCarインスタンスを指す。
  end

end

car = Car.new("vezel","black")
car.put_color

# =>　車の色はblackです

```

put_colorメソッドで利用している「self.name」は**put_colorメソッドを呼んだ時の「レシーバ」を参照している。**また、レシーバを省略してメソッドを呼ぶと暗黙に**selfをレシーバとする**。
そのため、次のようにselfを省略してもcolorメソッドが呼ばれることになる。

```ruby:ruby

class Car

attr_accessor :name,:color

  def initialize(name,color)
    @name = name
    @color = color
  end

  def put_color
   puts "車の色は#{color}です" #selfを省略しているがメソッドを呼ぶ時に暗黙にselfをレシーバとしてくれている
  end

end

car = Car.new("vezel","black")
car.put_color

#結果：　車の色はblackです

```
Ubuntu16.04　ネットワークの接続で躓いた事のメモ．

OSなしのデスクトップPCを買いUbuntuをインストールしたが付属のディスクがwin10のドライバだったので，ネットワークの接続に時間がかかった．

マザーボードはTUF Z270 MARK 2

ほとんどここに書いてある内容で解決．
http://webnetforce.net/ubuntu-on-kabylake-use-ethernet/

解凍したファイルの中にあるPRO1000のLinuxの下にe1000eがある．

あとは，
/etc/network/interfaces
とか
/etc/resolv.conf
をいじったりしてたがGUIでネットワーク接続の編集だけすれば十分だった．
WordPress メディアライブラリを使わずにサムネイル(アイキャッチ)を標準のテンプレートタグで表示してみた

#背景
WordPressで一般的にサムネイル(アイキャッチ)を表示する場合はメディアライブラリを利用します。
しかしながらメディアライブラリには通常の利用では表面化しませんが様々な制約が存在します。

#メディアライブラリの制約
メディアライブラリには以下の制約が存在します。

- WordPressが稼働するサーバに画像ファイルをアップロードする必要がある。
- (標準設定)自動で3種類のサムネイルファイルが自動生成される。
- 画像1ファイルにつきwp_postsに1レコード作成される。
- 記事にサムネイルを設定するとwp_postmetaに1レコード作成される。

それぞれ詳細に見ていきましょう。

##1.WordPressが稼働するサーバにファイルをアップロードする必要がある。
通常の利用方法であればメディアライブラリ機能で画像ファイルをアップロードします。サーバ負荷の低減や可用性向上のため異なるストレージに画像ファイルを配置することはできません。
AutoPostThumbnail等の自動でメディアライブラリに画像を設定するプラグインも存在しますがアップロード作業を自動化しているだけで画像ファイルの配置については変わりません。

##2.(標準設定)自動で3種類のサムネイルファイルが自動生成される。
標準設定では3種類のサムネイルが自動で生成されます。オリジナルサイズと合わせて4種類のサイズを使い分けるのであれば問題ありませんが利用しないサイズのファイルは無駄になります。

##3.画像1ファイルにつきwp_postsに1レコード作成される。
記事を投稿するとwp_postsに1レコード作成されますがメディアライブラリもこのテーブルで画像を管理してます。全記事にサムネイル画像を設定する場合はレコード数が記事数の2倍になります。

##4.記事にサムネイルを設定するとwp_postmetaに1レコード作成される。
記事にサムネイルを設定すると記事とサムネイルの関連付けの為にwp_postmetaに1レコード作成されます。ただでさえwp_postmetaには多くのレコードが登録されますがさらに上乗せされます。

#結局何が問題なの？
1日に1記事投稿するような一般な利用方法では問題ありません。しかしながらWEBをスクレイピングしてゴニョゴニョして鬼のように大量の記事を生成する場合は塵も積もって死活問題になります。
Herokuを無料プランで使う場合もリソースは節約したいですよね。
CloudFrontのように所定のストーレジにファイルを配置するCDNも存在します。

#どうすればいいの？
フィルターフックを使ってWordPressに対してあたかもメディアライブラリが設定されているかのように振る舞います。ある意味WordPressを騙します。

##1.get_post_metadata
get_post_metadataは指定のmeta_keyに対するpostmeta_idを返却する関数です。通常であればサムネイルを設定していないので0(またはnull)が返却されますが1以上の数値を返却することによってWordPressにサムネイルが設定されていると認識させます。
ここでは例としてpost_idを返却しています。
singleは呼び出し元で制御していたので無視して大丈夫です。

```php:function.php
add_filter('get_post_metadata', 'my_get_post_metadata', 10, 4);
function my_get_post_metadata($postmeta_id, $post_id, $meta_key, $single) {
    if ($meta_key == '_thumbnail_id') {
        return $post_id;
    }
    return $postmeta_id;
}
```

##2.image_downsize
image_downsizeは画像ファイルのURLとsizeに対する幅と高さを返却する関数です。通常であればサムネイルを設定していないので呼ばれることはありません。
前述のget_post_metadataで返却したpostmeta_idが使われます。例ではpost_idを設定したのでpost_idを条件に画像ファイルのURL、画像の幅、高さ、リサイズしているかを返却するようにします。
ここでは例として条件分岐せず固定の値を返却しています。

```php:function.php
add_filter('image_downsize', 'my_image_downsize', 99, 3);
function my_image_downsize($out, $postmeta_id, $size) {
    $out = array();
    $out[] = 'http://exsample.com/hoge.jpg';
    $out[] = 100;
    $out[] = 200;
    $out[] = false;
    return $out;
}
```

#この手法の良いところ
the_post_thumbnail等の標準のテンプレートタグがそのまま使えます。これが最大のメリットです。公開されているテンプレートやプラグインは標準のテンプレートタグを使うことが多いのでそのまま変更せずに使うことができます。
標準のテンプレートタグを使わない場合はこのような回りくどいことをせずにそのまま画像URLを記述する方が簡単です。

#免責
WordPressバージョン4.7系でテストしましたがすべての機能で正常に動作することまでは確認していません。
問題が発生した場合に自力で解決できる方以外はスルーされることをお勧めします。
UUID version4 をライブラリを使用せずに生成する

MediaStreamのインスタンスをコンストラクタから生成するとUUID version4で生成したidが割り振られる。これを利用すればversion4のみとなるがライブラリを使用しなくてもUUIDを生成することができる。

```js
var uuid = (new MediaStream()).id;
```

ただし、Firefoxの場合、"{}"に囲まれた文字列となり、また、Edgeの場合は英字は大文字となる。

```js:Chrome
console.log((new MediaStream()).id);
> "823bb111-3e86-46f8-a6f0-31abb78bcd2f"
```
```js:Edge
console.log((new MediaStream()).id);
> "CAD549F6-4C7B-4E7C-BF56-49BBE6A43F6D"
```
```js:Firefox
console.log((new MediaStream()).id);
> "{0adb6f2b-1ab2-4334-bdeb-49206694450c}"
```
c言語_文字列をソートする

```c:main.c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>


typedef int (*fptrOpe)(const char*, const char*);


char* stringToUpper(const char* string){
    char* tmp = (char*)malloc(strlen(string) + 1);
    char* msb = tmp;
    while(*string != 0){
        *(tmp++) = toupper(*(string++));
    }
    *tmp=0;
    return msb;
}


int cmp1(const char* str10, const char* str20){
    char* str12 = stringToUpper(str10);
    char* str22 = stringToUpper(str20);
    int result = strcmp(str12, str22);
    free(str12);
    free(str22);
    return result;
}


int cmp2(const char* str10, const char* str20){
    if(strlen(str10) > strlen(str20)){
        return 1;
    } else if(strlen(str10) == strlen(str20)){
        return 0;
    } else if(strlen(str10) < strlen(str20)){
        return -1;
    }
}


int cmp3(const char* str10, const char* str20){
    if(strlen(str10) < strlen(str20)){
        return 1;
    } else if(strlen(str10) == strlen(str20)){
        return 0;
    } else if(strlen(str10) < strlen(str20)){
        return -1;
    }
}


void sort(char* array[], int size, fptrOpe operation){
    int flag = 1;
    while(flag){
        flag = 0;
        for(int i=0; i<(size-1); i++){
            if(operation(array[i], array[i+1]) > 0){
                flag = 1;
                char* tmp = array[i];
                array[i] = array[i+1];
                array[i+1] = tmp;
            }
        }
    }
}


void disp(char* names[], int size){
    for(int i=0; i<size; i++){
        printf("%s    ", names[i]);
    }
    printf("\n");
}


int main(int argc, const char * argv[]) {

    printf("operation==cmp1\n");
    char* names1[] = {"Apple", "Orange", "Money", "Fish", "Unko"};
    disp(names1, 5);
    sort(names1, 5, cmp1);
    disp(names1, 5);
    printf("\n");

    printf("operation==cmp2\n");
    char* names2[] = {"Apple", "Orange", "Money", "Fish", "Unko"};
    disp(names2, 5);
    sort(names2, 5, cmp2);
    disp(names2, 5);
    printf("\n");

    printf("operation==cmp3\n");
    char* names3[] = {"Apple", "Orange", "Money", "Fish", "Unko"};
    disp(names3, 5);
    sort(names3, 5, cmp3);
    disp(names3, 5);
    printf("\n");

}
```

実行結果：

```c:main.o
operation==cmp1
Apple    Orange    Money    Fish    Unko    
Apple    Fish    Money    Orange    Unko    

operation==cmp2
Apple    Orange    Money    Fish    Unko    
Fish    Unko    Apple    Money    Orange    

operation==cmp3
Apple    Orange    Money    Fish    Unko    
Orange    Apple    Money    Fish    Unko 
```


入力文字列namesを関数stringToUpperで大文字にしてから
順番を入れ替えるというサンプルコードです。
文字列の入れ替えは、関数ポインタfptrOpeの指す関数cmpの機能に基づいて行われます。

関数cmp1, cmp2, cmp3のどれを使っても、文字列"Unko"が先頭にくることはありません。
ソートって難しい、、

参考：
>[詳説Cポインタ](https://www.oreilly.co.jp/books/9784873116563/)

　
　
　
　
　

どやっ！
UITabBarController の子 ViewController の初期化

# 概要
`UITabBarController`の子のViewControllerは、自身が表示されるまで初期化されないようなので、自分で初期化処理を呼ぶ必要があります。ここにその方法を書きます。


**環境**

* Xcode 8.2.1
* Swift 3.0.2
* iOS 10.2

# 方法

`UITabBarController`のサブクラスを作り、下記のように書きます。

```swift

class SampleTabBarController: UITabBarController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        for vc in self.viewControllers! {
            _ = vc.view
        }
    }
}
```

これで各ViewControllerの初期化処理（`loadView()`、`viewDidLoad()`）が呼ばれます。StoryboardのCustom class で関連づけるのをお忘れなく。

※ `UITabBarController`の中で`UINavigationController`を使っている場合は、さらに階層をたどる必要があります。↓は[TabBarControllerとNavigationControllerを同時に使う(Storyboard)](http://qiita.com/g-1/items/54061cb377fbeec30313)と同じStoryboardの構成で実装したときの例です。

```swift

class SampleTabBarController: UITabBarController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        for navViewController in self.viewControllers! {
            _ = navViewController.childViewControllers[0].view
        }
    }
}
```

# 参考
http://stackoverflow.com/questions/9202737/load-all-tabbar-views
画像のみで解説するmodern.IEの日本語化手順

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25609244/5aea0102-2f59-11e7-85be-192a91587e32.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25609257/6b668456-2f59-11e7-9e4d-f2656a1aabe3.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25609320/a60646b4-2f59-11e7-8457-46014f8ac5dc.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25609336/bd2ecfdc-2f59-11e7-8fcb-84baa30d3f64.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25611369/e69b2f84-2f61-11e7-935f-664a4c0da93e.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25610015/801cda0a-2f5c-11e7-846c-8e5a9bdef529.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25610063/aebe07a8-2f5c-11e7-9e1f-d999cc106356.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25610069/be5c22d0-2f5c-11e7-96d2-793ceb6107d4.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25610175/2953dc72-2f5d-11e7-9fdf-b4bc303281ca.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25610257/7b49954e-2f5d-11e7-9858-0a338bb7b568.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25611895/af9c6e06-2f63-11e7-8dfe-e6251c57e33f.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25612083/47a3375c-2f64-11e7-90d0-829970704f7b.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25612108/5e27ea04-2f64-11e7-8ee1-1f46ab7df58c.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25612270/fd537ff8-2f64-11e7-8dfa-11b661e4ad67.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25612316/1f7c012c-2f65-11e7-982d-2d702a5ffa27.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25612438/a8bad99a-2f65-11e7-9337-b5f72b3a1d39.png">

<img width="1024" alt="ie11_-_win7__running_" src="https://cloud.githubusercontent.com/assets/10899437/25612501/f09227d2-2f65-11e7-9dfb-6f23adc7c474.png">
[Resolved] SourceTree > v2.0 > bug > プッシュ時に2つのローカルブランチが表示されるようになった > masterとorigin/master

```txt:動作環境
Windows 7 Pro (32bit)
SourceTree v2.0.19.1
```

SourceTree v1.6.22の時は、プッシュをする時に表示されていたのは以下だった。

- ローカルブランチ: master、リモートブランチ:master

SourceTree v2.0.19.1でプッシュをする時に、以下のように複数表示されるようになっている。

- [x] ローカルブランチ: master、リモートブランチ:master
- [ ] ローカルブランチ: origin/master、リモートブランチ:

(チェックボックスは「対象」）

masterとorigin/masterの違いは以下に情報を見つけた。
[gitのふわっとした知識を調査してみた @ ねこブログさん](https://nekosoftware.wordpress.com/2015/02/03/git%E3%81%AE%E3%81%B5%E3%82%8F%E3%81%A3%E3%81%A8%E3%81%97%E3%81%9F%E7%9F%A5%E8%AD%98%E3%82%92%E8%AA%BF%E6%9F%BB%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/)

origin/masterはリモートのmasterが見えているだけなのだろうか？
v1.6.22でも左メニューに「リモート > origin > master」は表示されていたが、プッシュには出ていなかった。

参考2: [追跡ブランチ (tracking branch) というブランチが何なのか調べた @ snowlongの日記さん](http://snowlong.hatenablog.com/entry/2015/03/12/212455)
> git fetchを行った際に origin/masterは最新になるがmaster は更新されない。

### ブランチ

「ブランチ > ブランチを削除」で見えているもの

v1.6.22

- ブランチ: master、タイプ: ローカル
- ブランチ: origin/master、タイプ: リモート

v2.0.19

- ブランチ: master、タイプ: ローカル
- ブランチ: origin/master、タイプ: ローカル
- ブランチ: origin/master、タイプ: リモート

### bug

中の人にv2.0のバグと教えていただいた。
v2.1で対応予定とのこと。以下のチケットをwatchしておくと対応状況が分かる。

https://jira.atlassian.com/browse/SRCTREEWIN-7056?_ga=2.163945663.1272227572.1493764162-946105321.1493764086

### アップデート v2.0.20.1

v2.0.20.1が出た。
v2.0.19.1のSourceTreeを立ち上げると「updateしますか?」のようなメッセージが出るが、そこでYesを選択しても何も起きない。
SourceTreeのサイトから手動でv2.0.20.1を取得して、インストールした。

上記のバグは未対応のようだ。v2.1待ちのようだ。

### 対応済

v2.1.2.4で対応済。

http://qiita.com/7of9/items/6fdbd185f41fc59aed17
GCPでmastodonを公開する


## 基本的なところ
[Dockerで雑にMastodonを起動する方法](http://qiita.com/zembutsu/items/fd52a504321dd5d6f0b8)を参照。

### 注意点
- `.env.production`作る前に`docker-compose pull`すると`ERROR: Couldn't find env file: /home/docker/mastodon/.env.production`と出る
- メールのポートは2525などにしないと送信できない（）
- `sudo chmod 701 /home/docker`をしないとnginxごしにcss, jsが403（もしくは実行ユーザーを変えてもよさげ）
- メモリがたりなくなったらスワップ領域を拡張してあげる（[参考](http://tech-savvy.hatenablog.com/entry/2016/04/07/000102)）

## 公開にむけて
[ドキュメントのProduction guide](https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.md)を参考に、というかほぼまるぱくりでいけます。
Let's Encryptは[こちらの記事](http://qiita.com/HeRo/items/f9eb8d8a08d4d5b63ee9#nginx%E3%81%AE%E8%A8%AD%E5%AE%9A)を参考にさせていただきました。

### 注意点（主にnginx.conf）
- `ssl_dhparam`はコメントアウトしました
- `root /home/mastodon/live/public;`の`/live`は不要
Dockerでサーバーの開発環境を作ってみた

# Dockerでサーバーの開発環境を作ってみたけど、間違っているだろうか？

MacでPHP+MySQLな開発環境を構築したくて、いまどきな方法で環境構築しようと、Dockerに手を出したサーバーダンジョンルーキーのお話。

## 01) DockerでApache+PHP+MySQLな環境を作るために関連する記事を捜索する

macのdockerでLAMP環境を作る
http://qiita.com/74th/items/41393f506d223850f2c3

dockerのデータボリュームとそのバックアップ方法
http://qiita.com/saisai/items/ac8873d03e31b34c6209

DBはちゃんとしとかないと消えちゃうので、対策は必要だとして。。。
うーん。APP(OS+Apache+PHP)とDB(MySQL)とphpmyadminで、それぞれコンテナを分けたほうが良いの？よくわかんない。。。

Docker Hubのオフィシャルイメージを使ったLAMP環境(Apache+PHP+MySQL)構築
http://qiita.com/naga3/items/be1a062075db9339762d

とりあえず、お試しだし、まとめてズバット導入してみよう！

## 02) Dockerのコマンドとかも目を通しておく

いろんな記事を読んでてもよくわかんないことあるので、参照するページをメモ

Dockerの基本となるコマンド
http://uxmilk.jp/33906

## 03) で、結局どうすりゃいいの？
Dockerで、OS、Apatch+PHP、MySQLの３つのイメージをダウンロードしてきて、コンテナにすれば良いみたい。。。

PHPって、バージョンいくつで開発したら良いのかな？
とか考えながら、ネット漂流してたどり着いた先。。。

【超簡単】Docker でモダンな PHP 開発環境を作る (PHP, MySQL, PHP-FPM, nginx, memcached)
http://koni.hateblo.jp/entry/2017/01/28/150522

なになに、「Docker を使ってコマンド一発で作られるようにした」って書いてる！まじかー！

## 04) よくわかんないけど騙されたと思ってやってみよう！

https://github.com/koni/docker-php-nginx-mysql-memcached

上記のgithubからcloneしてきて、次のコマンドを実行する。
`
$ cd docker-php-nginx-mysql-memcached/docker
$ docker-compose up
`

次のようなログを出力して止まる（正直、インストールに失敗したのだと思って焦りました。。。
`
mysql        | 2017-05-02T08:38:10.156735Z 0 [Note] Beginning of list of non-natively partitioned tables
mysql        | 2017-05-02T08:38:10.846609Z 0 [Note] End of list of non-natively partitioned tables
`
ログの出力が止まったら、ブラウザを起動して http://localhost/ へアクセスする。
ブラウザに次のような表示が出たら成功です。
`
Hello! World!
array(2) { [0]=> string(1) "1" [1]=> string(19) "2017-05-02 08:49:30" }
`

# まとめ
## 僕にもできた
ほんとにコマンド一発で動く環境ができてしまった。。。Dockerすごーい！

## Apache+PHP+MySQLじゃなくて、nginx+PHP-FPM+MySQLじゃないか？
そうだね。俺も何を言われてるのか、どうしてこうなったのか、よく分かってないけど、動いたから良いんじゃないかな。。。

※PHP-FPMとは
http://php.net/manual/ja/install.fpm.php
2017/4に増えた Jenkins プラグイン

個人的に勢いのありそうな自動化系のものを探るために見てる。
試しているわけではないので間違っているかもしれません。

https://plugins.jenkins.io/viber-notification
viber と言うチャットアプリ(?)に通知するプラグイン

https://plugins.jenkins.io/consul
オーケストレーションツールの consul agentをjenkinsにインストールしてネットワークに入ってデータを読み取れるプラグインらしい。
メトリクス取って何かやるとかなんだろうか？

https://plugins.jenkins.io/keycloak
説明がないので不明

https://plugins.jenkins.io/ftp-rename
ftpでアーティファクトを転送するときにリネームするプラグイン

https://wiki.jenkins-ci.org/display/JENKINS/ElectricFlow+Plugin
ElectricFlow ていうリリース自動化プラットフォームのプラグイン
本体はここかな
http://electric-cloud.com/products/electricflow/

https://wiki.jenkins-ci.org/display/JENKINS/Views+Containing+Job+Plugin
詳細がないのでよく分からなかった…
ジョブに追加されてる一覧を追加するのかなぁ？

https://wiki.jenkins-ci.org/display/JENKINS/Nexus+Platform+Plugin
Nexus Repository ManagerとNexus LifecycleをJenkinsジョブに統合するためのプラグイン
端末のNexusじゃない。まだ見てないけど、これの事
https://www.sonatype.com/products-overview

https://wiki.jenkins-ci.org/display/JENKINS/Display+Console+Output+Plugin
コンソールの出力をジョブのトップに貼り付けるプラグイン

https://wiki.jenkins-ci.org/display/JENKINS/Build+Configurator+plugin
VS関連のプラグインのようだけどよく分からない…

https://wiki.jenkins-ci.org/display/JENKINS/Block+Same+Builds+Plugin
同じ構成パラメーターでジョブを走らせようとしたら止めるプラグイン
Vagrant の Box add で Error が発生したので 対処した


## 環境

OS X El Capitan 10.11.6
Vagrant 1.8.7

## エラー内容

boxにbento/centos-7.1を追加しようとするとエラーが発生した。

```
$ vagrant box add bento/centos-7.1
The box 'bento/centos-7.1' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Atlas, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://atlas.hashicorp.com/bento/centos-7.1"]
Error: 
```

## 原因
issueにあった
https://github.com/mitchellh/vagrant/issues/7969

Curlに問題があるよう。

## 対処法

```
$ sudo rm -rf /opt/vagrant/embedded/bin/curl
```

## 結果

```
$ vagrant box add bento/centos-7.1
==> box: Loading metadata for box 'bento/centos-7.1'
    box: URL: https://atlas.hashicorp.com/bento/centos-7.1
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) parallels
2) virtualbox
3) vmware_desktop

Enter your choice: 2
==> box: Adding box 'bento/centos-7.1' (v2.2.2) for provider: virtualbox
    box: Downloading: https://atlas.hashicorp.com/bento/boxes/centos-7.1/versions/2.2.2/providers/virtualbox.box
==> box: Successfully added box 'bento/centos-7.1' (v2.2.2) for 'virtualbox'!
```

でできた。
AE　.txtファイルから行毎にテキストレイヤーを作成

#やりたい事
外部のテキストファイルを一行毎にテキストレイヤーにしたい。

#用途
リリックビデオやテロップなどの量の多いテキスト編集時

＃コード

```js
function inport(){
    var fileName = File.openDialog("Select Text file","");
    var myFile = new File(fileName);

    if (myFile.open("r")){
        var myText = "";
            while(!myFile.eof){
            myText = myText + myFile.readln()  + String.fromCharCode(13);
            }
            var compName="Lyric"
            var creComp=app.project.items.addComp(compName,1920,1080,1.0,600,29.97)//コンポジションを作成
            var text_array=myText.split (String.fromCharCode(13));
            for(var i=0; i<(text_array.length-1); i++){
                       creComp.layers.addText(text_array[i]);
                }
    }
}

inport()
```


#2018/06/27 更新

最近また同じことをやる事があったので、少しプログラムを更新しました。
といってもやっている事は全く同じですが・・・
コッチの方がプログラム的には読みやすそうなので、更新しておきます。

```jsx
var lyric  = []; //歌詞を一行毎配列に入れる

//ファイルを読み込んで配列に入れる作業
function readToLyric(){
var fileName = File.openDialog("Select Text file","");
var myFile = new File(fileName);
    if (myFile.open("r")){
    var myText = "";
        while(!myFile.eof){
        var myText = myText + myFile.readln()  + String.fromCharCode(13);
        }
        var text_array=myText.split (String.fromCharCode(13));
            for(var i=0; i<(text_array.length-1); i++){
               lyric.push(text_array[i]);
            }
    }
myFile.close();
}

function addText(text){
        var myComp = app.project.activeItem;
        var cNText = myComp.layers.addText(text);
    }

readToLyric();



for (i =0; i<lyric.length; i++){
addText(lyric[i]);
}



```
rspecのControllerテストでNameError: uninitialized constant HogeControllerが出た際の解決方法

# rspecのControllerテストを書いていてコントローラが読み込まれない。
## ケアレスミスの場合は require rails_helperで治る
多くの場合は以下の様に記述すると解決すると思われます

1行目で　rails heplerを読み込みましょう。
バージョンが2系など古い場合は spec_helperを読み込みましょう。

```rb:hoge_spec.rb
require 'rails_helper'
```

## namespaceで区切っている場合
基本的にheplerのテストコードは **app/**ディレクトリ以下と同じ位置にファイルをおかないといけないため。

例えば　Admin::HogeControllerとしている場合は以下の様にdescribeの位置にController名を記述する必要があります。


```rb:spec/controllers/admin/hoge_spec.rb
require 'rails_helper'

describe Admin::OemsController do
end
```

テストコードのディレクトリが区切ったネームスペース以下に配置される様にしてください。
controllers/<font color="red">admin</font>/hoge_spec.rb
WebアプリでLINEログイン(Integrated Web Login)を実装した時に、ログインエラーになるときの対処法

結構ハマった（時間使った）ので、メモを残しておきます。

# Integrated Web Login
LINEログインと呼んでいるのはこれです↓
https://developers.line.me/web-api/integrating-web-login-v2#use_apis

# 一部の端末ではログインできるのに、一部の端末ではログインできない？

開発していると完全に忘れてしまうんですが、LINE Loginには、 `DEVELOPING` と `PUBLISHED` の２つの状態があります。
これを `PUBLISHED` にする必要があります

![スクリーンショット 2017-05-02 17.50.43.png](https://qiita-image-store.s3.amazonaws.com/0/67424/a5f1eb8c-d275-c6e6-61cb-2fc79bc0b29b.png)

もしこれが `DEVELOPING` になったままで、ログインしようとすると、下記のようなURLでエラーとなります（PCでログインしようとした場合）

```
https://access.line.me/dialog/oauth/weblogin?response_type=code&userId=&client_id=<client id>&response_mode=&showPermissionApproval=&displayType=M&otpId=&idProvider=1&scope=&redirect_uri=<redirect url>&state=84035fa3b47f2e45d475deb09c817393&lang=ja&errorMessage=AUTHENTICATION_FAIL&errorCode=401&error=server_error
```

つまり、 `AUTHENTICATION_FAIL` , `server_error` ということだけがわかりますので、原因が全然わからないです。
ご注意下さい。

# エラー内容が ACCOUNT_LOGIN_FAILED
URLでエラー内容が `ACCOUNT_LOGIN_FAILED` となっている場合、LINE Dzeveloper で設定している Redirect URL とサーバ側から指定したRedirect URLが一致していない場合があるようです。

# 自動ログインできないとき
下記URLにある、 `State` を設定していないと、自動ログインでは失敗します

```
https://developers.line.me/web-api/integrating-web-login-v2#guidance_to_login_screen
```

このときも、上記と同じく `AUTHENTICATION_FAIL` になったような気がしますのでご注意下さい

# その他の場合
アカウント設定に、 **ログイン許可** というチェックボックスがあります。もしかしたらONにするといけるかもしれません


LINEログインは、まだそれほど多くの情報が出回っておらず、エラーで検索しても全然でません。
誰かの役に立つと幸いです。
iOSアプリ開発でのTravis CIを試す

あちらこちらで目にする`CI`の経験がないので、今更ながら
[GitHub上のiOSプロジェクトでもTravis CI × CodecovでCIしたい!](http://qiita.com/KAGE_MIKU/items/727b9100c66a44b3a38c)
を参考にTravis CIを試してみた。

[サンプルプロジェクト](https://github.com/matsuda/CIWorkflowSample)

色々なサイトを調べて一番シンプルな`.travis.yml`はこんな感じになった。

```yaml:.travis.yml
language: objective-c
osx_image: xcode8.3

before_install:
  # - brew update
  # - brew install carthage
  - carthage bootstrap --platform ios

script:
  - xcodebuild test -scheme CIWorkflowSample -configuration Debug -destination 'platform=iOS Simulator,OS=10.3,name=iPhone 7 Plus' | bundle exec xcpretty -c
```

設定した内容は

* `Carthage`を利用
* `Carthage`を利用するための`Homebrew`の設定は不要

`brew install carthage`したらエラーになったので`brew`系コマンドは削除。もし必要なら`Carthage`をアップデートしてもよさそう。

```log
Error: carthage 0.20.1 is already installed
To upgrade to 0.22.0, run `brew upgrade carthage`
```

* Travis CIのログ制限に引っかかるということなので`xcpretty`を利用
* `xcpretty`をインストールするために`Bundler`を利用する。
* `Bundler`を利用していてプロジェクトのルートに`Gemfile`がある場合は

> If there is a Gemfile in your project’s root directory, the pod command is not executed, but instead Bundler is used as a wrapper to pod as follows:
`bundle exec pod install`

「`bundle exec`を利用しろ」とあるので（[Dependency Management](https://docs.travis-ci.com/user/languages/objective-c/#Dependency-Management)）、`xcpretty`も`bundle exec xcpretty `で実行する

* `-destination`に設定する内容は以下のようなコマンドを実行してエラーで一覧を表示させて調べる。  
`xcodebuild test -scheme CIWorkflowSample -destination 'foo=bar'`


## 参考

* [Travis CI User Documentation](https://docs.travis-ci.com)
* [GitHub上のiOSプロジェクトでもTravis CI × CodecovでCIしたい!](http://qiita.com/KAGE_MIKU/items/727b9100c66a44b3a38c)
* [iOSアプリ開発におけるTravis CIの設定](http://katoj.hatenablog.com/entry/2016/03/29/000517)
OCamlMakefileの使い方

##OCamlMakefileとは?
OCamlMakefileはOCamlのプロジェクトのビルドを助けてくれるツールの一種。
その名の通りではあるが、GNU makeで書かれており、GNU makeが導入されている環境なら使うことができる[^1]。

##使い方
上述の通り、GNU makeで書かれているので、自分のプロジェクトのMakefileにOCamlMakefileをincludeし、変数やルールを適切に設定することで使用することができる。
(GNU make自体に詳しくなくても使えますが、もしmakeを勉強したいなら[オライリーのpdf](https://www.oreilly.co.jp/library/4873112699/)が無料公開されているので、読んでみるといいといいと思います。[^2])

OCamlMakefile自体は[公式サイト](http://mmottl.github.io/ocaml-makefile)からダウンロードできる。

### 使用例1: hello world
まずは簡単のため

```ocaml:hello.ml
let () =
    Printf.printf "Hello, world!\n"
```
というファイルをビルドすることを考える。
同じディレクトリにダウンロードしてきたOCamlMakefileを配置し、以下のようにMakefileを書くと良い。

```makefile:Makefile
SOURCES = hello.ml
RESULT  = hello

-include OCamlMakefile
```

実行例は以下の通り。

```console:console
$ ls
Makefile       OCamlMakefile  hello.ml
$ make #デフォルトではバイトコードの実行ファイルを生成する。
$ ./hello
Hello, world!
$ make clean #生成された実行ファイルや.cmi,.cmoなどの中間ファイルを削除
```

###使用例2:ネイティブコードを生成する。
デフォルトではバイトコードの実行ファイルが生成されるが、これはbyte-codeターゲットがOCamlMakefile中で一番上に定義されていることによる。よって、OCamlMakefileをincludeする前に自分でルールを定義すればネイティブコード等他のターゲットを実行することができる。

例えば以下のようにMakefileを定義すればよい。

```makefile:Makefile
SOURCES = hello.ml
RESULT  = hello
# OCamlMakefileをインクルードする前に定義すること。
default: native-code 
-include OCamlMakefile
```

makefileに慣れ親しんだ人には当然かもしれないが、defaultというターゲット名に意味はないので、

```makefile:Makefile
SOURCES = hello.ml
RESULT  = hello
all: native-code 
-include OCamlMakefile
```

と定義しても意味は変わらない。
`byte-code`や`native-code`等はそれぞれ`bc`、`nc`にエイリアスされているため、Makefileを変更せずとも、

```console:console
$ make nc
```
等でもネイティブの実行ファイルを生成できる。

この他OCamlMakefileには以下のようなターゲットが定義されている。

```
byte-code                      (bc)
byte-code-nolink               (bcnl) - no linking stage
byte-code-library              (bcl)
native-code                    (nc)
native-code-nolink             (ncnl) - no linking stage
native-code-library            (ncl)
debug-code                     (dc)
debug-code-nolink              (dcnl) - no linking stage
debug-code-library             (dcl)
profiling-byte-code            (pbc)
profiling-byte-code-library    (pbcl)
profiling-native-code          (pnc)
profiling-native-code-library  (pncl)
byte-code-dll                  (bcd)
native-code-dll                (ncd)
pack-byte-code                 (pabc)
pack-native-code               (panc)
toplevel                       (top)
subprojs
```


###使用例3:異なるコンパイラを使う
たとえば、ネイティブコード生成にはデフォルトではocamloptが使われる。もしocamlopt.optを使いたい場合は以下のように定義すれば良い。

```makefile:Makefile
SOURCES = hello.ml
RESULT  = hello
OCAMLOPT= ocamlopt.opt
default: native-code
-include OCamlMakefile
```

なお、OCamlMakefileでデフォルトで使うコマンド等は
https://github.com/mmottl/ocaml-makefile/blob/master/OCamlMakefile#L225-L330
の辺りで定義されている。
GNU makeに詳しくない人も、この部分は比較的容易に読めるので、何が変更可能かは、OCamlMakefileのコードを直接読んで確認してみてください。

この他、公式サイトに書いてある通り、デバッグやプロファイル、ドキュメント生成向けの機能等もあるらしいので気になる人は直接読んでみてほしい。


##参考サイト
- 公式サイト:[Ocaml-makefile](http://mmottl.github.io/ocaml-makefile/)

[^1]: 検証はしていないが、BSD系のmakeでも使用できる可能性はある。
[^2]: 公式サイトだと章毎に別れているので、https://github.com/jr4qpv/GNU_Make_3rd_jp 等を使うと良いと思います。
SourceTree > v2.0 > v1.9より良い > 軽快な動作 / リポジトリ名正式表示機能 / リポジトリ検索

```txt:動作環境
Windows 7 Pro (32bit)
SourceTree v2.0.19.1
```

[SourceTree for Windows 2.0: New UI, faster performance, and Microsoft Git Virtual File System support](https://blog.sourcetreeapp.com/2017/04/27/sourcetree-for-windows-2-0-new-ui-faster-performance-and-microsoft-git-virtual-file-system-support/)


v2.0が2017年4月27日に発表されていた。
しかしながら、SourceTreeの「更新を確認」からはv1.9までしか見えないようだ。

v2.0使用には.NET Framework v4.5.2以降が必要となった。

v2.0の大きな特徴として「動作が軽快になった」ということのようだ。
実際に軽い感じがする。

また、以下の点でv1.9より良くなっているように思う。

- リポジトリ名の正式表示機能
    - リポジトリタブ上で`myReposit...`のように省略表示になっているが、マウスオーバーで`...`を展開した表示(myRepository)になる
    - この点はv1.9使用時に気になっていた部分だ
- リポジトリのタブ追加時の検索機能
    - キーワード検索できるようになっている
    - 一覧から選択するより早い

以下の点はv1.8以降から変化ない。慣れるしかない。

- stagingの仕方
- コミットメッセージのキャンセルボタンの削除

関連: [UI > SourceTree v1.8以降 > UIが悪くなったと感じた](http://qiita.com/7of9/items/73a8a1135d62dc05b450)
Azure Site Recovery に関するメモ

Azure であれこれ振り回され中... もとい、確認中のメモです。

Azure Site Recovery について、ちょっとした注意をメモしてみました。


Azure Site Recovery とは?
Microsoft のクラウドサービス、Azure に含まれるサービスのひとつで、Hyper-V や VMWare の仮想マシン、または物理サーバーのバックアップを Azure に保存する。

詳しくはこちら。
Site Recovery のドキュメント
https://docs.microsoft.com/ja-jp/azure/site-recovery/


FAQ から読んだほうが解り易かった。
Azure Site Recovery: よく寄せられる質問 (FAQ)
https://docs.microsoft.com/ja-jp/azure/site-recovery/site-recovery-faq


中々見つからなかった、ふとした疑問とその答え。


.リージョン越えのリストア
Q あるリージョン ( 例えば東日本 ) でバックアップした仮想マシンを、別のリージョン ( 例えば西日本 ) へリストア可能か?

A. NO. バックアップ取得したリージョンにだけリストア可能。直接別リージョンにはリストアできない。

ただし、ジオ冗長を設定し、別リージョンへバックアップデータを複製しておくことはできる。
元々のリージョンが災害になり、別のリージョンにフェールオーバーすると、フェールオーバー先で対象の Recovery Service からリストア可能。



.VM エージェントが無い???
Q Azure Site Recovery が利用する、VM エージェントが入っている仮想マシンと入っていない仮想マシンがある。何故 ?

A.理由の一つとして、物理環境から移行した仮想マシンかもしれません。
最初から Azure で作成した仮想マシンには VM エージェントが入っていますが、最初に物理環境で作成した仮想マシンは、後から手動で VM エージェントを追加します。

VM エージェントのインストールについてはこちら。
https://docs.microsoft.com/ja-jp/azure/backup/backup-azure-arm-vms-prepare
Resource Manager でデプロイされた仮想マシンをバックアップする環境の準備
Ruby で Unix time を変換

いつも忘れてしまうのでワンライナーをメモ

- Unix time to timezone

```bash
ruby -e "puts Time.at(1493650800)"
2017-05-02 00:00:00 +0900
```

- timezone to Unix time

```bash
$ ruby -e "require 'time';puts Time.parse('2017-05-02 00:00:00').to_i"
1493650800
```
Postfixのマルチインスタンス (multi-instance)構成についてメモ

チラ裏モード。ざっくり把握したら本家のドキュメントを読んで下さい。

Postfix 2.6 以降が対象。最近のディストロなら概ねクリアしているはず。
でも日本語リソースが少し不足気味かもしれない (よく見る和訳は 2.3まで)。

# インスタンス

Postfixにはインスタンスという概念があり、何も指定しなければシングルインスタンスモードで動作する。

ざっくり言えば1つのインスタンスにmain.cfとmaster.cfが設定できるイメージ。
正確にはconfig_directory, data_directory, queue_directory等も分かれる。
内部で共有しているTCP接続のキャッシュ等も全部分かれて管理される。

# シングルインスタンスモード

main.cfに ``multi_instance_enable = yes`` がなければ必須こちらになる。普通は設定されていない。

コンパイル時に埋め込まれるconfig_directory等を使う。事実上 /etc/postfix/main.cf とかを読むわけ。

# マルチインスタンスモード

multi_instance_directories の指定をすると、デフォルトの構成を元にしたデフォルトインスタンスに加えて別の構成のインスタンスを持てる。
/etc/postfix/ がある状態で、/etc/postfix-second/, /etc/postfix-third/ みたいに別のフォルダをこしらえることが出来る。

2つ目以上のインスタンスのディレクトリは、手動で作るのではなく ``postmulti`` コマンドを介して作成する。
``postmulti`` がマルチインスタンスモードの有効化、インスタンス管理を一手に引き受ける

なお、ローカル環境からのメールはデフォルトインスタンスが食う想定。 ``sendmail`` とか。そういう意味で、厳密にはデフォルトインスタンスと立場上完全に同格のインスタンスを生成するのではない。各コマンドは共有され、通常はデフォルトインスタンスのmain.cfとかが参照されるので、適宜 ``-C`` オプションで参照する設定ファイルを変更する。

デフォルトインスタンスがあって、そのmain.cf等を読み込んだ際に「あ、マルチインスタンスモードなのです！」とPostfixが認識して、以降の追加のインスタンスを読み込むというイメージ。

# 使い所

「論理的に見て2つのインスタンスである」という場合に使用すると良いと思う。

参考までにデーモンやキュー等を筆者がまとめてみた図があるのでここにも示しておく ([参考](https://mowa-net.jp/wiki/Mail))。 

![Postfix.png](https://qiita-image-store.s3.amazonaws.com/0/14365/572f85d7-33c7-844f-e6c4-5336e6e4c2cc.png)

マルチインスタンス構成では一連のプロセスも別となり、上図のプロセス、キューも全て別管理になる。全てを別立てで管理するほうがメリットがあればマルチインスタンスで、そこまでする必要がなければシングルインスタンスでがんばれば良い。

例えばnetstatで特定のポートを専有しているプロセス番号から、どちらのインスタンスがそのポートを使っているかを判断できる。例えば127.0.0.1:25をどちらがリッスンしているかが分かる。インターネットに接している複数のIPそれぞれに対して異なるバックエンドを用意したいかもしれないし、localhostに用途に応じて2つサブミッションポートを持つかもしれない (両方共筆者が実際に出会ったユースケース)。

master.cfにおいて特定のPostfix内のコンポーネントについて1〜2つオプションを追加するだけで容易に問題が解決するのなら、強いてマルチインスタンスにする必要はない。

master.cfを壮大にいじくり回して ``-o`` オプションを乱舞させるような事態になるなら考えた方が良い。一組のmain.cf, master.cfでそれぞれのポートに対してオプションを指定して異なる挙動を達成しようとすると、Postfixのどこかのプロセスでメールが「混ざる」症状に頭を悩ませることになる。上図の通り、smtpd(8)のオプションを少し捻った程度では「混ざる」症状は回避できない。当たり前だが、シングルインスタンス構成ではまず、キューが分離できない。

なお、マルチインスタンス構成をシングルインスタンス構成に戻すハードルは結構低い。マルチインスタンス化毎に作成される特定のディレクトリ3つ程度を削除して、/etc/postfix/main.cfに追加されたマルチインスタンス化オプションを消すだけ。

気軽に試してみてまずそうなら切り戻す、という態度でも行ける気がする。実際に試して動くことを確認してしまうと、おもったよりもマルチインスタンス化する敷居は低くなる気がした。

# 参考

以下を読めば使い方は分かる。

http://www.postfix.org/MULTI_INSTANCE_README.html

ただ、上の概要的な話がドキュメントの後半に出てくるので、まずチラ裏風の説明があると良いと思いこの記事が出来た。
AndroidStudioでjava.lang.ClassNotFoundException: Didn't find class on path: dexpathlistが出てしまったときの対処法

このエラーはコードに問題がなくても起こることがあるようです。IDEでのビルドパスの設定などに原因があるようです。

eclipseでの解決策はいっぱいヒットするがAndroidStudioでの解決方法でそれらしきものはなかなか見つからない・・・

# 解決策

プロジェクトを閉じ、terminalを開きプロジェクトのフォルダに行き以下のコマンドを実行します。

```bash
rm -rf .idea
```

そしてプロジェクトを再び開くと初回起動の時のように少し時間がかかり、プロジェクトの読み込みが完了するとこの問題は解決しているはずです。
Install Meshlab 2016 to Debian Wheezy


|Playing with Debian Wheezy|URL|
|:--|:--|
|Atom|http://qiita.com/cielavenir/items/7835e3d110d7ad79c407|
|VSCode OSS|http://qiita.com/cielavenir/items/8eb3f57373bac0f10d6f|
|Skype|http://qiita.com/cielavenir/items/1b1d733e4ede8593040f|
|Meshlab 2016|http://qiita.com/cielavenir/items/5e02ce18d162e17c8859|

1. Install clang-3.4 ( https://github.com/nodesource/distributions/blob/master/OLDER_DISTROS.md )
1. Download and extract http://ppa.launchpad.net/zarquon42/meshlab/ubuntu/pool/main/m/meshlab/meshlab_2016.12~trusty2.tar.xz
1. `debuild -uc -us`. This should show some package errors. Install them accordingly.
     - In my case, `sudo apt-get install libqt5xmlpatterns5-dev qtscript5-dev qtbase5-dev libqt5opengl5-dev qt5-default freeglut3-dev
`
1. Delete and re-extract the source package.
1. Search dh_shlibdeps in debian/rules and append `--dpkg-shlibdeps-params=--ignore-missing-info`
1. Make a temporary environment where g++ refers clang++ (perhaps `ln -s /usr/bin/clang++ ~/bin/g++` and **prepend** ~/bin to PATH)
1. `debuild -e PATH -uc -us`
1. `sudo -i meshlab_2016.12~trusty2_amd64.deb`
1. Enjoy meshlab command

Note: I have not checked whether eigen is required or not. If you see error, try `sudo apt-get install libeigen3-dev/wheezy-backports`.

deb: https://www.dropbox.com/s/hclib4xzwub19rj/meshlab_2016.12~trusty2-actuallywheezy_amd64.deb
GitLabでアカウント作成する手順

# はじめに
こちらは知り合いにGitLabの使い方を紹介するために作成したものになります。
口頭でのやりとりも含めた簡素な案内となっているため、参考にならない場合がありますので、ご注意ください。

#GitLabでアカウント作成する
GitHubと違い、無料アカウントでもprivateなリポジトリを作れるGitLabでアカウントを作る際の手順書です。
スクリーンショットは2017年05月現在のものとなります。

##GitLabのアカウント作成
###まずはここから
[GitLabのSign Inページ](https://gitlab.com/users/sign_in)から**Registerタブ**をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/02400f4b-6cda-37c6-a113-c0d384994b4f.png)

なお、GitLabをブックマークする場合は上記のページをお勧めします。（ログインするのにワンクリックで出来るため）

###必要事項の入力
Full name、Username(他人に公開されるID)、Email、Passwordを入力して、**Register**をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/2c6a060d-a649-4235-875c-55b788b506ea.png)

###メール確認画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/17e03527-4ca1-cd6f-5bb2-7f30f17d5571.png)

###確認メールが来る
「Confirmation instructions」という件名でこんなメールが来るので、**Confirm your account**をクリックしてアカウント作成完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/2363ed17-9b52-1bd3-2284-4de927020ab8.png)

これでアカウント作成は完了します。
CentOSでcp -fを実行する    

CentOSで強制上書きコピーのために`cp -f`を実行しようとすると

```
cp: `XXXXXX' を上書きしますか?
```

と確認が入ります。-fオプションが効いていません。
１つや２つのファイルならいいのですが、ディレクトリごと上書きコピーしたい時などは困ります。

これはaliasが設定されているためです。

```bash:CentOS7の場合
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
```

`cp`として`cp −i`が設定されていますね。

なので、バックスラッシュをつけて実行時にaliasを無効化しましょう。


##手順

```bash:コマンド
$ \cp -f FILE FILE
```