OmniAICreator/Qiita-1.07M huggingface dataset:
iOSの音声認識(SFSpeechRecognizer)をObjective-Cで

# iOSの音声認識をObjective-Cで

Swiftの記事は見つかるが、Objective-Cで書いてある記事がみつからなかったので書いておきます。

Swiftはこちら
http://dev.classmethod.jp/smartphone/iphone/try-ios10-speech-recognizer/

ユーザに許可を求める

```objc:hoge.m
  [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) {
  }];
```

変数定義

```objc:SpeechRecognizerManager.m
@interface SpeechRecognizerManager()
{
  SFSpeechRecognizer* speechRecognizer;
  SFSpeechAudioBufferRecognitionRequest* speechRequest;
  SFSpeechRecognitionTask* recognazationTask;
  AVAudioEngine *audioEngine;
}
@end
```

各種メソッド

```objc:SpeechRecognizerManager.m
-(SpeechRecognizerManagerIOS*)init
{
  audioEngine = [[AVAudioEngine alloc]init];
  if( audioEngine.inputNode ){
    [audioEngine.inputNode installTapOnBus:0 bufferSize:1024 format:nil block:^(AVAudioPCMBuffer* buffer, AVAudioTime* when) {
      [speechRequest appendAudioPCMBuffer:buffer];
    }];
  }
  speechRecognizer = [[SFSpeechRecognizer alloc]initWithLocale:[NSLocale localeWithLocaleIdentifier:@"ja-JP"]];
  speechRecognizer.delegate = self;
  speechRequest = [[SFSpeechAudioBufferRecognitionRequest alloc]init];
  speechRequest.shouldReportPartialResults = YES;

  return self;
}

-(void)start
{
  [audioEngine prepare];
  [audioEngine startAndReturnError:nil];
  
  recognazationTask = [speechRecognizer recognitionTaskWithRequest:speechRequest resultHandler:^(SFSpeechRecognitionResult *result, NSError * error) {
    if( result ){
      // ここで認識できた文字列が取得できる
      NSLog(@"%@", result.bestTranscription.formattedString);
    }
  }];
  
}
-(void)stop
{
  [audioEngine stop];
  [speechRequest endAudio];
  
  [recognazationTask cancel];
  recognazationTask = nil;
}
```
Raspberry Pi / I2C > i2cgetではオシロの波形は見られず、i2cdumpでは波形が見られる状態

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Tektronix TDS 2024C (200 MHz, 2GS/s)
とあるI2Cセンサ
```

デバイスアドレスが0x28のセンサからデータを読もうとしている。

[i2cget](https://linux.die.net/man/8/i2cget)を実行してみるが、オシロに波形が見られず、立ち上がりエッジの検出でも何も引っかからない。

その一方で[i2cdump](https://linux.die.net/man/8/i2cdump)ではSCL, SDAともに矩形波が見られる。

i2cdumpにはアドレス範囲を指定するオプションがあるようなので、それを使ってみた。

### 波形が見えるケース

```
$ sudo i2cdump -y -r 0x03-0x18 1 0x28
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00:          b8 b8 b8 b8 b8 b8 38 38 38 38 38 38 38       ??????8888888
10: b8 38 38 38 b8 b8 b8 b8 b8                         ?888?????       
```

### 波形が見えないケース

```
$ sudo i2cdump -y -r 0x03-0x07 1 0x28
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00:          b8 b8 b8 38 b8                               ???8?        
```

### 上記の違い

アドレス範囲を広くとった場合はSCL, SDAに矩形波が見られ、アドレス範囲が狭い場合は矩形波が見られない。

原因の切り分けはできていない。
vimを使っていて便利だったコマンド

vimを使っていて、便利だったコマンドをまとめます

## よく使うやつをデフォルト設定にする

```
$ vi ~/.vimrc

" 行数を表示する
set number

" 色をつける
syntax on
```

## 移動する
^ 先頭の文字へ
$ 終端の文字へ
ローカルではエラーにならないのにheroku上ではエラーになったときの話


Laravelを使って、部品として作った `testUnit.blade.php` を `order.blade.php` というファイル中で `@include` していた時の話。

ローカルでは特に問題もなかったのでそのままHerokuにあげたところ、なぜか以下のようなエラーが出た。

```
View [admin.order.testUnit] not found. (View: /app/resources/views/admin/order.blade.php)
```

何度見直してもおかしなところがない。。。と思っていたけど。

#原因

herokuをgit連携していたのですが、そのgit上に上がっている `testUnit.blade.php` が大文字なしの `testunit.blade.php` になっていた。
なんかMacだと大文字小文字を区別せずパスが通るが、herokuを動かしているLinux上では大文字小文字が区別されないためにエラーが起こったらしい。

##解決策

```
git rm testunit.blade.php —-cached
```

でファイルを残したまま、まずはファイルをgitの管理対象から外し
名前を変更してから改めて `add` `commit` `push` すればOK。

ちなみにIDEはPhpStormを使っているんですが、今回の挙げ直しのときにPhpStormのGUIからは `commit` がやり直せずターミナルから `commit` しました。
kaminariで次ページ前ページのURLだけ欲しいんだお

#kaminari
kaminariが使える状態になってることが前提
詳しく知りたい場合はソースを読む → [【Github】 Kaminari](https://github.com/kaminari/kaminari)
カスタマイズは色々できるみたいだけど、正直面倒くさい（自分だけ？）
戻る、進むにテキスト以外を使いたかったので、他にやり方あると思うけど

#とりあえず[進む][戻る]がしたいだけ
```ruby:qiita.rb
path_to_prev_page(scope, options) # 前ページへのパスが返る
path_to_next_page(scope, options) # 次ページへのパスが返る
```
第二引数は省略して問題ない

##大雑把な例
```ruby:controller.rb
# kaminariが使える状態になっているのが大前提
@posts = Post.all
```

```ruby:view.rb
<a href="<%= path_to_prev_page(@posts) %>">
 戻る
</a>
<a href="<%= path_to_next_page(@posts) %>">
 進む
</a>
```

個人的にはこっちの方がカスタマイズしやすい
Android Studio 2.3にてgradle 2.3にするとandroid-aptではまる

# gradle 2.3以降ではandroid-aptはdeprecated
Android Studio2.2からAndroid Studio 2.3にプロジェクトをMigradeしたら
gradle:2.3.0にしろと言われて上げたら軒並みandroid-aptでハマりました。


```
dependencies {
    classpath 'com.android.tools.build:gradle:2.3.0'
    // classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
```

そもそもandroid-apt自体がdeprecatedのようです。
https://bitbucket.org/hvisser/android-apt/wiki/Migration
以下、メジャーなライブラリのアノテーションはannotationProcessorで書き直されているようです。

## Dagger2

追記：
android-aptのmigrationガイドでは2.0が使われていましたが、Dagger2公式では2.9になっていましたのでこちらが正しいです。
https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2

```
dependencies {
    compile "com.google.dagger:dagger:2.9"
    annotationProcessor "com.google.dagger:dagger-compiler:2.9"
    provided 'javax.annotation:jsr250-api:1.0'
}
```

## FragmentArgs

```
dependencies {
    compile 'com.hannesdorfmann.fragmentargs:annotation:3.0.2'
    annotationProcessor 'com.hannesdorfmann.fragmentargs:processor:3.0.2'
    compile 'com.hannesdorfmann.fragmentargs:bundler-parceler:3.0.2'
}
```

## Parceler

```
dependencies {
    compile 'org.parceler:parceler-api:1.1.6'
　　　　　　　　annotationProcessor 'org.parceler:parceler:1.1.6'
}
```
Django【自分用】

###cloud9環境構築
http://qiita.com/rmiyamoto/items/4143c6081fb664208e06


###ローカルサーバ起動

```
python manage.py runserver $IP:$PORT
```
###モデルのデータベース作成

```
python manage.py makemigrations polls
```


###プロジェクト作成

```
django-admin startproject hello
```

###エラー

```
ImportError: No module named 'hello.urls'
```

【setting.py】

```
import sys
sys.path.append('/path/to/hello')
import hello
```

参考
http://yuzatakujp1013.hatenablog.com/entry/2016/01/28/162051

###データベース作成

```
python manage.py makemigrations
python manage.py migrate
```


###コンソール表示

```
python manage.py shell
```


###Djangoバージョン確認

```
>>> import django
>>> django.get_version()
'1.6.1'
```


###アプリの作成

```
python manage.py startapp polls
```

###base.htmlが読み込まれない時

base.htmlのディレクトリを一つ上にあげる


###フィールド追加
http://blog.yuku-t.com/entry/20100508/1273259928
Raspberry Pi / I2C > SCL, SDAの波形が見られない場合の対処 > sudo modprobe -r i2c-bcm2708 / sudo modprobe i2c-bcm2708 baudrate=50000

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Tektronix TDS 2024C (200 MHz, 2GS/s)
```

I2Cのセンサを使うコードを実装中。
MSP430ではACK応答後のデータ読込で0xFFしか得られない。

こういう場合は別のツールを使うのが良い。ということでRPiを使用。

http://qiita.com/dz_/items/ead14b05879c9acc3507
などを参考にi2cdetectでまずはアドレスを取得する。

```
$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --         
```

何も表示されない。

センサを外した状態でオシロ(2024C)でSCL, SDAの波形を見たところ、そもそもSCLすら矩形波が表示されない状態だった。

http://blog.xe.bz/archives/51736276.html
を参考に以下を実行した。

```
$ sudo modprobe -r i2c-bcm2708
$ sudo modprobe i2c-bcm2708 baudrate=50000
```

これで波形がでるようになった。
オレンジがSCL, 水色がSDAのライン。
![F0001TEK.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2d857e19-f1cb-a57e-abf2-8c1e7d343cb3.png)

センサーを付け戻してi2cdetectしてみたところ、認識した。

```
$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- 28 -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --     
```

アドレスは0x28で合っている。

コマンドを実行しながらオシロを調整するのは面倒なので、以下のコマンドでアドレス問合せ作業が2秒置きに実行されるようにする。

```
$ watch -n 2 sudo i2cdetect -y 1
```


### 関連

- [Raspberry Pi | I2C > I2Cセンサーの接続確認まで > 使用品 | 配線 | i2cdetect | link:Rasberry PIのI2Cコマンド詳解](https://qiita.com/7of9/items/c693244b65ecaf82c9f5)
UMLツールメモ


http://argouml.tigris.org/


AtomとPlantUMLで爆速UMLモデリング
http://qiita.com/nakahashi/items/3d88655f055ca6a2617c


PlantUML - Visual Studio Marketplace
https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml

Visual Studio Codeで自由自在にUMLを描こう
http://blog.okazuki.jp/entry/2016/09/01/215508
メモ　日時項目の取り扱い

# 以下のような日時項目をRで扱う場合

Nitiji
"2016-10-13 12:14:20.8830000"

`as.POSIXct(Nitiji, format = "%Y-%m-%d %H:%M:%OS")`


# plot

`
g <- ggplot(
  g,                           # 作成したデータフレームを指定
  aes (
    x = as.POSIXct(seirituNitiji, format = "%Y-%m-%d %H:%M:%OS"),
    y = seirituSP
  )
)

g <- g + geom_line(
  colour = "magenta",           # 線の色
  linetype = 2,                 # 線のタイプ
  size = 0.5                    # 線の太さ
)

g <- g + xlab("x axis")         # x座標
g <- g + ylab("y axis")         # y座標
g <- g + ggtitle("Sample")      # グラフタイトル
g <- g + theme_bw()


plot(g)
`

![image](https://qiita-image-store.s3.amazonaws.com/0/151919/71df15b0-07b1-df84-816c-3f4bf1e04fbf.png)
Ansible の pre_tasksについて


Ansible 実践ガイドによると，ansibleが次のような順番で実行していく．

> 1. 変数の読み込み
2. ファクト収集
3. 事前タスク(pre_tasks)の実行
4. 事前タスク(pre_tasks)の実行による通知ハンドラ処理
5. ロールの実行
6. タスクの実行
7. ロールやタスクの実行による通知ハンドラ処理
8. 事後タスク(post_tasks)の実行
9. 事後タスク(post_tasks)の実行による通知ハンドラ処理

3番のpre_tasksに対して，タグ指定でも実行されるという期待が外れた．

なので，always タグと組合せて，次のように利用している．

```
  pre_tasks:
    - name: check target hostname
      local_action: command test {{ inventory_hostname }} = {{ ansible_hostname }}
      become: false
      tags: always
```

taskが始まる前に，インベントリに書いている名前とターゲットホスト名を照らす．
これで，少し人的ミスが防げる．
TensorFlow > link > v0.11 API

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

v0.11のAPIを見ようとしたら、v1.0のAPIになっており、そこで見た関数はdeprecated扱いだった。

v0.11のAPIは以下から見ることができる。
https://www.tensorflow.org/versions/r0.11/api_docs/python/
キーワード検索するとv1.0のAPIに飛んでしまうので、左のメニューから辿るのが良さそう。

v1.0にアップデートするのはいつ頃がいいか。
Rubyでdid_you_meanを使ってtypoしても頑張って動くプログラムにする

did_you_meanを使ってtypoしても動くようにしています。

```rb:fuzzy_ruby.rb
# require RUBY_VERSION >= '2.3.0'
class Object
  Ex = Struct.new(:name, :receiver, :args)

  def method_missing(name, *args, &block)
    methods = DidYouMean::MethodNameChecker.new(Ex.new(name.to_s, self, [])).corrections

    if methods.empty?
      super
    else
      self.send(methods.first, *args, &block)
    end
  end
end

# "hello".chars.join.upcase を全部typoしても動く
p "hello".chas.jooin.upcas
```

出力

```
"HELLO"
```


## 説明

did_you_meanはRuby2.3から標準で組み込まれたライブラリで、typoしたときに正しそうなメソッド名や変数名等を教えてくれます。

上のコードでは `method_missing` を使ってtypoしたときの情報を取り出し、それを `MethodNameChecker` に渡して上げることで正しそうなメソッド名の一覧を取得しています。もし、候補が存在する場合は `send` メソッドを使って再度実行します。（複数候補がある場合は一番最初のものを選択）

## 注意

出力に `p` ではなく `puts` を使う場合は下記のようなエラーが出ることがあると思うので、そのときは methods から `:to_r` を外してください。

```
`puts': can't convert Integer to Array (Integer#to_ary gives Rational) (TypeError)
```

`:to_r` を外して対処

```
methods -= [:to_r]
```

もうちょっと細かく話すと、puts は文字列と配列以外のオブジェクトが渡された時に、最初は `to_ary` を使って配列への変換を試みるのですが、その時に `to_ary` を持っていない場合は今回のコードによって `to_r` がサジェストされ、それを実行してしまいます。`to_ary` は内部的には配列以外の戻り値を認めていないので、それによってエラーが発生します。


## 参考サイト

[did_you_mean (Github)](https://github.com/yuki24/did_you_mean)
[module Kernel](https://docs.ruby-lang.org/ja/latest/class/Kernel.html#M_PUTS)
TensorFlow > link > a square root in your loss. That's known to be very unstable numerically for very small values.

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

関連 http://qiita.com/7of9/items/172694e1a61cfe0fe8d9
入力データの絶対値範囲の違いによる学習過程の違いについて調査中。

異なるlearning rateでのErrorの変化は以下に図示されている。
https://github.com/tensorflow/tensorflow/issues/323

そのやりとりの中で気になったのは以下の文章。
> vincentvanhoucke commented on 25 Nov 2015
> @jpiabrantes One thing that stands out here is that you use **a square root in your loss. That's known to be very unstable numerically for very small values**. Can you try 1) not taking the square root or 2) adding a small constant, e.g.: tf.sqrt(1e-4 + ...).


http://qiita.com/7of9/items/53729c6bbfd7bf3871df
の最後の図において、入力データの絶対値が小さい方では学習の様子が見られなかった。
これが`very unstable numerically for very small values`と関係あるのかどうか。

> jpiabrantes commented on 25 Nov 2015
> @vincentvanhoucke You were right. My problem was due to the loss function being RMS. If I use the loss functions you proposed everything works fine. Thank you for the help.

vincentvanhouckeさんのコメントが毎回示唆に富んでいる。

他の気になったやりとり。
> vincentvanhoucke commented on 25 Nov 2015
> 2) adding a small constant, e.g.: tf.sqrt(1e-4 + ...).
>...
> Muaazbinsaeed commented on 19 Dec 2015
> cross_entropy = -tf.reduce_sum(y*tf.log(yconv+ 1e-9))
> This works fine

...
> @ yaroslavvb commented on 17 Jan • edited
> @edgarriba that's not an issue with precision of tf.sqrt -- square root operation in general is unstable for small values. The bigger underlying issue is that SGD-like algorithms are fundamentally unstable and can produce NaN/Infinity during normal functioning. A stable algorithm would need to do some sanity checks before taking a step, and none of the tf built-in optimizers are doing that.
技術英語 > to verify that the previous for loop [ran to completion],

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2205 / 12833)

> to verify that the previous for loop [ran to completion],

意訳「直前のforループが最後まで処理されたかを確認するには」

forを使ったイテレータにてelseを使う処理についての文章。

<hr>
最後まで処理されない例は以下。

[Win Defender has never ran on its own to completion. Schedules says process terminated unexpectedly (0x8007042B)](https://answers.microsoft.com/en-us/windows/forum/windows_10-security/win-defender-has-never-ran-on-its-own-to/98876a14-0f6c-4687-887e-2843f60810ec?page=2)

on its ownで強調する必要があるかは未消化。
AWSにrailsをデプロイしたときのメモ

##背景
先日AWSにrailsアプリケーションをデプロイする機会がありました。
そのときの作業内容をメモ的に残しておきたいと思います。

##構成
railsをデプロイするとき、
**nginx + unicorn + rails**
という構成にする事が多いようです。

**1. nginx　とは**
apacheのようなwebサーバです。
webサーバはユーザからのリクエストが来ると最初に対応してくれます。受付のようなものです。
自分だけでリクエストを処理することもあれば、他にリクエストを渡して処理をさせることもあります。
・静的ファイルを返すだけの時などは、自分で処理をしてくれます。
・railsの処理を必要とするリクエストの場合はアプリケーションサーバに処理を渡します。


**2. unicorn　とは**
アプリケーションサーバです。今回で言えば、railsのアプリケーションを動かしているサーバです。
railsアプリケーションを動かすのであれば、アプリケーションサーバだけでも動きます。（しかし、webサーバだけでは動きません。nginxだけではrailsは動かせません。）
これは開発環境の時にやっていることです。
ただ、本番環境では通常はwebサーバとアプリケーションサーバを用意します。
処理するリクエストの数が違うからです。

###Rack
unicornを検索してみるとRackという単語に遭遇する事が多いので、これについて少し調べてみました。

Rackはwebサーバとフレームワークをつなぐ橋渡し的なものです。
以前はwebサーバそれぞれをサポートするために、フレームワーク側でコードを記述する必要がありました（？）
そのため、このフレームワークではこのサーバしか使えないという状況があったようです。

それを解消するのがRackというわけです。
Rackに対応する事でwebサーバ、フレームワークの両者は個別具体的な対応をする必要がなくなりました。
という事で、どのフレームワークを使っていてもwebサーバの選択に対する制約がなくなりました（逆もまた然り）。


リクエストの流れは、以下のようになっています。（レスポンスが返る時はこの逆順に返されます。）
nginx -> unicorn -> rack -> rails -> routes.rb -> 適当なcontroller

##設定
設定する時にちょっとハマったところをメモ書き程度に書いておきます。
nginx と　unicornをつなぐための記述は以下の二つのファイルの**unicorn.sock**のパスを合わせます。

```/etc/nginx/conf.d/アプリケーション名.conf
upstream unicorn {
  server unix:/home/ec2-user/projects/tmp/unicorn.sock;
}

```

```config/unicorn.rb
  $app_dir = "/home/ec2-user/projects"
  $listen  = File.expand_path 'tmp/unicorn.sock', $app_dir
  listen $listen
```

これで基本的にはnginxとunicornはコミュニケーションを取れるようになったというわけです。
カスタムブループリントクラスをNewする #UE4Study

# ブループリントクラスをNewする

## カスタムブループリントクラスがNewできない
Actorクラスを継承していれば、SpawnActor From Classで動的に生成できるが、処理だけを描いたカスタムブループリントをブループリント内で動的に作成したい。

ソースコードで記述すると以下のような書き方でカスタムブループリントクラスをNewしたい。
BP_Object bp = new BP_Object();

一通りNew出来そうな単語で検索したが見つからなかった
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/93b8013e-9d22-f7f9-5dca-b2243050f8b6.png)

AnswerHubにそれらしき対応方法を見つけたので試してみた

Instantiating Instance of Blueprint Class
https://answers.unrealengine.com/questions/206017/instantiating-instance-of-blueprint-class.html

Blueprint Node: Create Object from Blueprint
https://wiki.unrealengine.com/Blueprint_Node:_Create_Object_from_Blueprint

## ObjectクラスをNewするC++ BlueprintFunctionを作成する

File -> New C++ Class...
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/9a0e52c4-2427-0dcb-1c8c-d52929c9885c.png)

Show All Classes -> BlueprintFunctionLibraryを選択 -> Next
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/9a992d68-8fd1-00b1-4334-856eab28b982.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/9f2ad360-8d14-4057-52a9-7c82005dc4ab.png)

```cpp:BPCreator.h
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "Kismet/BlueprintFunctionLibrary.h"
#include "BPCreator.generated.h"

/**
 * 
 */
UCLASS()
class BP_CPP_API UBPCreator : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

	UFUNCTION(BlueprintCallable, Category = "Object")
	static void Create(UClass *ObjectClass, UObject* &CreatedObject);
	
};

```

```cpp:BPCreator.cpp

// Fill out your copyright notice in the Description page of Project Settings.

#include "BP_CPP.h"
#include "BPCreator.h"

 void UBPCreator::Create(UClass *ObjectClass, UObject* &CreatedObject)
 {
     //NewNode = new ObjectType();
     CreatedObject = NewObject<UObject>((UObject*)GetTransientPackage(), ObjectClass);
 }


```

## ブループリント：BP_Objectを作成する
Blueprint Classを作成する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/5a1571df-f721-dfae-a5a3-08df871faefc.png)

親クラスにObjectを選択する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/dbc961b8-f386-da6b-503e-73fdc5162540.png)

名前をBP_Objectに設定する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/9d177f50-d594-11c0-cdc4-80fb02c06826.png)

変数を追加する

|変数名  |変数の型  |デフォルト値 |
|---|---|---|
|Name |String |CustomBPClass |

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/c894cd9c-2d44-3fb7-7101-36895a3921f0.png)


## カスタムブループリントクラスをブループリントでNewすることができる

レベルブループリントにBP_Objectを動的に作成するコードを記述する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/8bdbbd21-699b-eee1-0113-a574a10d4548.png)

変数に設定したデフォルト値が表示できた
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/ca098841-a4c2-072a-48f9-d32ce62ec299.png)
自分のブラウザ履歴からQiitaのWordCloudを作ってみる

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/110715/dd8cfd2a-5f49-e1eb-794c-10a23996a82c.png)

こんな感じの Word Cloud を作ってみました。
単にブラウザ履歴から qiita.com のタイトルだけを抜き出し、そのタイトルを Mecab で分割、名詞だけを Word Cloud化して僕が興味を持っている分野、調べた分野などを可視化しました。自分の履歴を可視化してなかなか興味深かったので、皆様も是非試してみてください。

可視化のための Word Cloud ライブラリとして [https://github.com/amueller/word_cloud](https://github.com/amueller/word_cloud) を。形態素解析は Mecab を [Python3で形態素解析エンジンMeCabを使えるようにする(2016年3月版)](http://qiita.com/grachro/items/4fbc9bf8174c5abb7bdd) を参考に用意。

ブラウザ履歴は、MacOSなら Safari が `~/Library/Safari/History.db` に、Chrome が `~/Library/Application\ Support/Google/Chrome/Default/History` にあるので、それぞれコピーして以下のスクリプトと同じところへ。コピーせずこのpathを直接 db のpathに指定しても、読み込みエラーで読めなかったりするので、操作で db 破損のリスクも考えてコピーしておくのが無難です。

さて、ブラウザ履歴からQiitaのWordCloudを作るスクリプトは以下のようになります。

```py3
import sqlite3
from enum import Enum
import MeCab
from wordcloud import WordCloud

# dbは元をコピーして使う
# Safari History
# => ~/Library/Safari/History.db
# Chrome History
# => ~/Library/Application\ Support/Google/Chrome/Default/History
SAFARI_HISTORY = 'History.db'
CHROME_HISTORY = 'History'


class Browser(Enum):
    Safari = 1
    Chrome = 2


MECAB = MeCab.Tagger('-Ochasen')
MECAB.parse('') # 開放されないように
def get_nouns(text):
    nouns = []
    node = MECAB.parseToNode(text)
    while node:
        if '名詞' in node.feature:
            nouns.append(node.surface)
        node = node.next
        if node is None:
            break
    return nouns


def get_db_config(browser):
    if browser == Browser.Safari:
        dbname = SAFARI_HISTORY
        sql = 'select v.title from history_items i join history_visits v on v.history_item = i.id and i.url like "http://qiita.com%"  group by i.url'
    elif browser == Browser.Chrome:
        dbname = CHROME_HISTORY
        sql = 'select u.title from urls u where u.url like "http://qiita.com%" group by u.url'
    else:
        raise ValueError('invalid argument')
    return (dbname, sql)


def get_qiitas(browser):
    qiitas = []
    (dbname, sql) = get_db_config(browser)
    for row in sqlite3.connect(dbname).cursor().execute(sql):
        if row[0]:
            qiitas.append(row[0].strip())
    return qiitas


def create_wordcloud(text, output):
    fpath = '/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc'
    stop_words = ['こと', 'これ', 'ため', 'とき', 'よう']
    wordcloud = WordCloud(background_color='white', font_path=fpath, width=900, height=500,
                          stopwords=set(stop_words)).generate(text)
    wordcloud.to_file(output)


def main():
    qiita_nouns = []
    for browser in [Browser.Chrome, Browser.Safari, ]:
        for title in get_qiitas(browser):
            qiita_nouns.extend(get_nouns(title))
    create_wordcloud(','.join(qiita_nouns), 'qiita.png')


if __name__ == '__main__':
    main()
```

こんな感じになりました。
Safari も Chrome も履歴は sqlite3 で保存されているので、適当にデータを引っ張り出しています。残念なことに schema が両者ぜんぜん違うので sql は別にする必要があります。
また、Qiita の記事のタイトルの最後には必ず "Qiita" という文字列が含まれてしまうため、Word Cloud で Qiita が非常に強く表示されてしまうので stop_words に小文字で "qiita" と追加してやれば取り除くことが出来ます。個人的には Qiita とはっきりわかるので残しています。

繰り返しになりますが、自分の履歴を可視化してなかなか興味深かったので、皆様も是非試してみてください！
CSSだけでレスポンシブデザインに対応したテーブルレイアウト2017

#やりたいこと
シンプルなテーブルをCSSのみでレスポンシブデザインに対応する。
<img width="1001" alt="スクリーンショット 2017-03-07 1.32.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/96444/2ff2f7ba-c351-91ac-39c0-9c7e74d97026.png">
↓
<img width="368" alt="スクリーンショット 2017-03-07 1.34.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/96444/0896d895-9735-50af-ac5d-477e106b682d.png">
横に並んでいる項目を縦に並べて、スマホでも見やすいテーブルを作る。
flexboxを使うので、IE9とかは非対応。まぁスマホ向けなので問題はないかと。
Android4系の標準ブラウザにも対応するためにboxも併用する。
→[デモ](http://codepen.io/bass-inu/pen/oZzYQQ)

#まずHTMLでテーブルを作る
見出しとなる部分はTHEADタグで囲んで、ウインドウ幅で変化させたい部分はTBODYタグで囲む。

```html:html
<table>
  <thead>
    <tr>
      <th colspan="6">果物</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>&nbsp;</td>
      <td>りんご</td>
      <td>ばなな</td>
      <td>ぶどう</td>
      <td>すいか</td>
      <td>めろん</td>
    </tr>

    <tr>
      <td>A</td>
      <td>&yen;100</td>
      <td>&yen;150</td>
      <td>&yen;200</td>
      <td>&yen;300</td>
      <td>&yen;400</td>
    </tr>

    <tr>
      <td>B</td>
      <td>&yen;90</td>
      <td>&yen;120</td>
      <td>&yen;250</td>
      <td>&yen;300</td>
      <td>&yen;450</td>
    </tr>
  </tbody>
</table>
```

#CSSでメディアクエリを使ってレスポンシブ対応
まずは普通にテーブルのデザインする。

```css:css
table,
th,
td {
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}

table {
  border-collapse: collapse;
  border-spacing: 0;
}

table {
  width: 100%;
  text-align: center;
}

th,
td {
  border: 1px solid #666;
  padding: 10px 20px;
  white-space: nowrap;
}

th {
  background-color: #333;
  color: #fff;
}

tr:nth-child(2n+1) {
  background-color: #f8f8f8;
}
```

メディアクエリの部分。ブレークポイントは適宜変更を。

```css:css
@media screen and (max-width: 768px) {
/* tbodyにflexboxしてtrを横並びにする */
  tbody {
    display: -webkit-box;
    display: -webkit-flex;
    display: flex;
  }
/* 各セルが横いっぱいになるようにする */
  tbody tr {
    -webkit-box-flex: 1;
    -webkit-flex-grow: 1;
    flex-grow: 1;
/* (Android4用)tdを縦並びにする */
    -webkit-box-orient:vertical;
    -webkit-flex-direction: column;
    flex-direction: column;
  }
/* borderが二重になるので消す */
  tbody td {
    border-top: none;
    border-right: none;
/* tdを縦並びにし、高さを指定して揃える */
    display: block;
    height: 40px;
  }
/* 一番右端のborderが消えちゃうのでborder-rightで復活 */
  tr:last-child {
    border-right: 1px solid #666;
  }
/* 垂直方向のズレがあればpadding-topで適当に微調整 */
  tr:first-child td {
    padding-top: 8px;
  }
}
```
SCSSバージョン

```scss:css(scss)
@media screen and (max-width: 768px) {
  tbody {
    display: -webkit-box;
    display: -webkit-flex;
    display: flex;
    td {
      border-top: none;
      border-right: none;
      display: block;
      height: 40px;
    }
    tr {
      -webkit-box-flex: 1;
      -webkit-flex-grow: 1;
      flex-grow: 1;
      -webkit-box-orient:vertical;
      -webkit-flex-direction: column;
      flex-direction: column;
      &:first-child td {
        padding-top: 8px;
      }
      &:last-child {
        border-right: 1px solid #666;
      }
    }
  }
}
```
Salesforce 標準オブジェクト早見表

はじめに
===


備忘録がてら、Salesforce標準オブジェクト一覧、Salesforce標準オブジェクト早見表を作成しました。

参考資料
===

以下を参考にさせて頂きました。

[Salesforce SOAP API 開発者ガイド](https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_objects_list.htm "Salesforce SOAP API 開発者ガイド")

標準オブジェクト早見表
===

| 標準オブジェクト名 | 英語表記 (API参照名) | 標準オブジェクトの利用用途、オブジェクトに保存するデータの例 |
|--------------|---------|--------|
| 取引先        | Account | 取引先の企業情報、競合会社、パートナーなどのビジネスに関係する組織や個人に関係する情報を保存します。|
| 取引先責任者   | Contact | 取引先の担当者や顧客の個人情報を保存します。|
| リード | Lead | 見込み顧客情報、見込み商談情報を保存します。 |
| ケース | Case | 顧客からお問い合わせ、質問等を保存します。|
| キャンペーン | Campaign | ダイレクトメールによる販売促進、Web セミナー、展示会など、マーケティングキャンペーン情報を保存します。| 
| 活動予定 | OpenActivity | オブジェクトに関連する活動予定(将来の行動や未完了のToDo)を保存します。 |
| 商談 | Opportunity | 販売または保留中の取引である商談情報を保存します。|
| 商談商品 | OpportunityLineItem | 商談対象の商品情報を保存します。|
| 納入商品 | Asset | 商談が成立し、顧客へ納入した商品情報を保存します。|
| 契約 | Contract | 取引先に関連付けられた契約情報、業務上の合意情報を保存します。 |
| 注文 | Order | 契約または取引先に関連付けられた注文情報を保存します。|
| ソリューション | Solution | 顧客の問題とその問題の解決策についての詳細な情報を保存します。|
| 商品 | Product2 | Salesforce組織で販売している商品情報を保存します。|
| 価格表 | Pricebook2 | Salesforce組織が販売する商品のリストを記載した価格情報を保存します。|
| アイデア | Idea | 既存の商品またはプロセスに対する拡張の提案など、ユーザがコメントまたは投票できるアイデア情報を保存します。|
| アイデアのテーマ | IdeaTheme | アイデア(Idea)の大まかな主題を定義します。例えば、商品に対する改善要望、システムの操作方法に対する改善要望といった、アイデア投稿時のテーマを定義します。|
| 投票 | Vote | アイデア(Idea)に投票したアイデアタイトルをはじめ、投票情報が保存されます。投票オブジェクトの参照関係から、アイデアに投票したSalesforceユーザ情報の参照などを行えます。|
| 納入商品 | Asset | 顧客が購入してインストールした商業価値のある項目(会社または競合他社が販売した商品等)の情報を保存します。|
| ユーザ | User | Salesforce組織のユーザアカウント情報を保存します。|
| ToDo | Task | 営業活動などのToDo情報を保存します。|
| 行動 | Event | 営業活動などの日々の行動情報を保存します。|
| オブジェクト共有設定 | {オブジェクト名}Share (例: AccountShare, ContactShare等) | オブジェクトの共有設定を格納しているオブジェクトです。オブジェクト単位でShareオブジェクトが存在します。カスタムオブジェクトを作成した場合、自動的に{カスタムオブジェクト名}Shareオブジェクトが作成される。 |
| ナレッジ | Knowledge__kav | 各種FAQやナレッジを登録します。|
| 添付ファイル情報(ContentDocument) | ContentDocument | Salesforceの取引先などの「ファイル」に添付した添付ファイル名などの情報が登録されます。|
| 添付ファイル情報(ContentVersion) | ContentVersion | Salesforceの取引先などの「ファイル」に添付した添付ファイルのバージョン情報などが登録されます。|
| 添付ファイル情報(ContentVersion) | ContentDocumentLink | Salesforceの取引先などの「ファイル」に添付した添付ファイルのリンク情報などが登録されます。|
| 組織の送信元メールアドレス(OrgWideEmailAddress) | OrgWideEmailAddress | Salesforce「設定」→「メール」→「組織のアドレス」に登録したメールアドレス情報が登録されます。|


***

以上になります。
bashのコマンドラインでのあれこれ(カーソル移動や履歴利用など)

どんな仕事をするにせよ、速度というものは大切です。
例えそれが1秒の違いでも、28800回繰り返せば、1人日の差になります。

そんなわけで、bashのコマンドラインでの作業速度を上げるためのあれこれです。
かなり色々あるのですが、今回は普段私が使う(使いたい…)ものをピックアップしました。

尚、TeraTermの場合は、「設定」→「キーボード」でMetaキーをonにしておくと、
以降の「Esc」キーを押す部分が「Alt」キーで代用できます。

## カーソル移動
|動作|キー|覚え方|
|:--|:--|:--|
|行頭に行く|**Ctrl + a**|alpha|
|行末に行く|**Ctrl + e**|end|
|次の単語の最後に行く|**Esc + f**|forward|
|現在 or 直前の単語の先頭に行く|**Esc + b**|backward|

## 挿入
|動作|キー|
|:--|:--|
|前のコマンドの最初の引数を挿入|**Ctrl + Esc + y**|
|前のコマンドの2番目の引数を挿入|**Esc + 2 後 Ctrl + Esc + y**|
|コマンドラインでタブ文字挿入|**Ctrl + v 後 TAB**|

## 削除
|動作|キー|
|:--|:--|
|カーソル位置の文字を削除|**Ctrl + d**|
|カーソル位置から行末まで削除|**Ctrl + k**|
|カーソル位置の前の単語を削除|**Ctrl + w**|
|カーソル位置の後の単語を削除|**Esc + d**|

## コマンド履歴の利用
|動作|キー|
|:--|:--|
|直前のコマンドの再利用|**!!**|
|stringで始まる最新のコマンド履歴を利用|**!string**|
|直前のコマンドの最初のstring1をstring2に置換して実行|**^string1^string2**|
|直前のコマンドの全てのstring1をstring2に置換して実行|**!!:gs/string1/string2**|

`^hoge^fuga`だと最初にマッチした部分しか置換されないので、やらかし注意。
全部置換する場合は、`!!:gs/hoge/fuga`を使いましょう。

```bash
$ echo "hogehoge"
hogehoge

$ ^hoge^fuga
echo "fugahoge"
fugahoge

$ !-2:gs/hoge/fuga
echo "fugafuga"
fugafuga
```

## 【おまけ】やばい、端末が固まった！という時
かなり高確率で「**Ctrl + s**」を押してしまっていて、画面の更新が止まっています。
電プチする前に、冷静に「**Ctrl + q**」を押しましょう。
多分、焦って打った文字たちが出現します。

## あとがき
カーソル移動や削除は、作業効率が結構変わるので、覚えておいて損はないです。(特に描画の遅いターミナルなら尚更)
ヤンクは使ったことないのですっ飛ばしました。効率良くなるんだろうか。
引数挿入は…やったことありません。TABの挿入は何かと便利かも。
履歴の置換もなかなか便利です。サーバー1-9号に順に同じ処理するときとか。
2点見積もりを実践してみて良かった点、失敗した点

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/2%E7%82%B9%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%E3%82%92%E5%AE%9F%E8%B7%B5%E3%81%97%E3%81%A6%E3%81%BF%E3%81%A6%E8%89%AF%E3%81%8B%E3%81%A3%E3%81%9F%E7%82%B9-%E5%A4%B1%E6%95%97%E3%81%97%E3%81%9F%E7%82%B9/)をご覧ください😀

見積もりって毎回悩みますよね。

スプリント計画で各タスクの作業時間を出すといった細かいものならまだしも、人日ベースの大きな見積もりは未だ難しいです。（正確には出せないと思っている）
それでも、概算スケジュールがー！全体工数がー！とか言われて、何とか見積を提出しないといけないとき、あると思います。

## 今までの見積もりの問題点（1点見積もり）

タスクごとにリスクや難易度を考慮して算出しますが、自分の首を絞める可能性もあるので、慎重になり時間がかかります。
「最終的にこれくらいかな、いやもうちょっとバッファ積んでおこう！いや待て待て…」といった数字遊びになりがち。

## 2点見積もりとは

簡単に言うと、各タスクを
- すごく順調にいけばこれくらいで終わる！（最小工数）
- 万一ハマってしまったらこれだけかかりそう。。（最大工数）
の2パターンで算出する方法です。

※[2点見積もりが意外とうまくいった話](http://developers.mobage.jp/blog/2-point-estimate)で出会いました。ステキ記事。

## 実践してみた

記事にある通り、

- 最小工数
- バッファ（＝(最大工数 - 最小工数) / 2）

で算出していきました。
以下、数回実践してみて感じたことです。

## 良かった点

- 見積もりがサクサク進む！

最短でこのくらい、ハマってもこれくらいあれば、といった感じでスムーズに見積もれます。
1点見積もりで数字調整に悩んでいた時間はなくなりました。

- 遅延に早く気づける！

最小工数でタスクが完了していないということは少なくとも超順調にはいかなかったということです。
あと少しで終わりそうなのか、何か問題が発生しているのか、最小工数消化時に担当者に確認するといいでしょう。

## 悪かった点

特にないです。
強いて言うなら「2点見積もりって何？」と聞かれたときに、説明する＆理解してもらう必要があるといったところでしょうか。

ただ、失敗したなと思うことはありました。

## 失敗した点

### 最小工数に余裕を持たせてしまいがち。

「最小工数が最小ではない！」と感じたことが多かったです。
今までの保守的な見積り経験が無意識にそうさせるのでしょうか。
もっと攻めなければ！と思いました。

### バッファを含めた1本の線にしてしまった。

スケジュールを作る際、最小工数とバッファを合わせた工数で線を引いてしまいました。
これは、上司やクライアントに見せる際に仕方ないときもあると思っています。

ただ、このスケジュールを開発チームの日々の進捗確認で使用してしまうと、最小工数とバッファの境目がわからなくなり、2点見積もりのメリットはなくなります。

![2ten.png](https://qiita-image-store.s3.amazonaws.com/0/56789/ee5594a9-0b77-278a-427d-83c80c4d8185.png)

素早く遅延に気付くためにも、きちんとバッファの線を引くことをお勧めします。

## さいごに
2点見積もりオススメです。個人的にはサクサク見積もれるのが嬉しい。
是非試してみてください。

また、今回実践したのは数人月規模の案件でしたが、スプリント計画などの数時間単位の見積でも利点はあると感じています。
プランニングポーカーの代替品としてもいいかもしれません。

それではステキな見積りライフを。
【Rails】rails5.1betaでvuejsを試すための備忘録

# Install

nodeがないと怒られるのでnodejsをインストールする。

```
$ nvm install <version>
$ npm install -g yarn
```

`5.1.0.beta1`をインストールし、`rails new`する。

```
$ gem install rails -v 5.1.0.beta1
$ rails new rails-vue-sample --webpack=vue -O
```

# いらないファイル消す

```
$ rm -rf app/assets/javascripts/
$ rm -rf app/assets/stylesheets/
```

```diff
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -3,9 +3,6 @@
   <head>
     <title>RailsVueSample</title>
     <%= csrf_meta_tags %>
-
-    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
-    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
   </head>

   <body>
```

```diff
--- a/config/application.rb
+++ b/config/application.rb
@@ -21,5 +21,10 @@ module RailsVueSample
     # Settings in config/environments/* take precedence over those specified here.
     # Application configuration should go into files in config/initializers
     # -- all .rb files in that directory are automatically loaded.
+
+    config.generators do |g|
+      g.assets false
+      g.jbuilder false
+    end
   end
 end
```

# webpackのセットアップ

```
$ bin/rails webpacker:install
$ bin/rails webpacker:install:vue
```
オフラインリアルタイムどう書く E12 を python で解いてみた

問題：http://mtsmfm.github.io/2017/03/04/doukaku-e12.html
解答リンク集：http://qiita.com/mtsmfm/items/d307c7b884cd86621262

他の方々と同じロジックになってしまいました。

```py
import re

shapes = { 'I': ((0,), (4,)),
           'L': ((0, 0), (3, 1)),
           'O': ((0, 0), (2, 2)),
           'S': ((0, 0, 1), (1, 2, 2)),
           'T': ((1, 0, 1), (2, 2, 2)) }

def solve(data):
    board = {}
    for shift, tetromino in re.findall('(\\d+)(.)', data):
        bottom_gaps, heights = shapes[tetromino]
        y = max(board.get(x, 0) - gap
                for x, gap in enumerate(bottom_gaps, int(shift)))
        for x, height in enumerate(heights, int(shift)):
            board[x] = y + height
    return str(max(board.values()))

def test(data, correct):
    answer = solve(data)
    print("%s %s : %s %s" % (("NG", "OK")[answer == correct], answer, correct, data))

test("1O3L0I0T", "5")
test("0I", "4")
test("0I0I", "8")
test("0I1I2I3I4I", "4")
test("0S0I", "5")
test("0I0S", "6")
test("2S0T2O3I", "8")
test("4O4T1T0S4L1L3L", "10")
test("0S2S4S6S8S10S12S14S", "16")
test("14S12S10S8S6S4S2S0S", "2")
test("5I2O10I0O4L10T9T11L8I2I10I12O7L12T12T12S11T9O10O13I12O10O7I9I7O0S1O2S0L1L", "23")
test("9T14L10L8T4I1T3S5I8T12O3S7L9O7L14T2I7O3S6S2L0L13T10O4I9T7L8S0I12O9S11L11T14T", "27")
test("9S9S7O11O16I2T9O12L10T9O0O13I9O1I2T14S7O9S11T5L7I14T13O0T12I3S10L10O7I15I6S2L12S8I16I3L", "23")
test("11T13I16S15T7O10L12S1I5I8S5I13I15O8S9I1T12I1S5S0L14I12L16T2S2S8L2S14L16O4I13L15L13S11S9T13S9S3L6O", "22")
test("12L10S7I5L14T12S9L1T14I0I5L1T2O18T9L0I15I16L10S1O15I0L17O5L18T4I18L7L7I13I3I12I2S3T5T3S16L14S14O11O15T14S", "17")
test("0S18S2S19I14T7L14L2L6I9I0L4I5L13L15I8S8T2I5I7O18T3S1T7I2L8O0S20T9I14T5L5I1T4L9O8T19T5S12O16T19L4O10O10T14L", "24")
test("7T5L6S4S8T6S10I19O20L14I18L21S7I11S11O1L13T20O9I7L2T8L2S20L3O14L9T17I8L8S14I6T2O11T21O18O6T15T1S3L6O19S18O20S19O16T6S14T", "26")
test("18S2I4S16L13S17I21O8I17T8I14O12T20I20S19S16S13T12T20I22I15O2I2I8I2S18I9I9T6O13O13L17I2L20L2L4I9I19O11T3S10O2S18T12I5O11S19O21S6I17T17S", "26")
test("11L5S0T22S18O13T2O22S15I12I21T16I3I1I22L11L11L22O13S24S15L13T15S19L10O15T7S24T19L0T13O11I12T13S4I24L15O3S19O10L19O0S20L7O11L21I22S18T19T23O8I22S24L0S", "21")
test("7L7I11T7S18O17L8S15L9I3O24S3O1O5O14L9T13S2O25S22T10T8L24S18S13T1O1L6I10I4S13O3S7L10T1T4L17S20I18O15S25S23S21I19T6O24S9L2O2O15L12L8L8O18I18L0T5O", "31")
test("999I999I999I999I999I999I999I999I999I999I999I", "44")
```
build.gradleでcommit logを取得してたりする時にハマった話

デバッグモードのアプリとかで最後のコミットの内容をアプリ内でも分かるようにするためとかに下記のようにbuild.gradleに書いてたりしますが、コミットコメントのダブルクォートのせいでbuildができない事案にぶち当たったので残しておきます。

昨今、aptやらkaptやらDataBindingやら使ってると謎エラーにやられることが多いのですが、今回これにやられましたorz

最新のコミットのログが`Revert "Fix hoge"`の場合

### before

buildで死ぬ

```build.gradle
def getCommitLog() {
    final String commitLog = 'git log -n 1 --oneline'.execute().text
    return commitLog
}

android {
  buildTypes {	
    debug {
      debuggable true
      buildConfigField "String", "COMMIT_LOG", "\"${getCommitLog()}\""
    }
  }
}
```

### after

buildで死なない

```build.gradle
def getCommitLog() {
    final String commitLog = 'git log -n 1 --oneline | sed "s/\"/'/g"'.execute().text
    return commitLog
}

android {
  buildTypes {	
    debug {
      debuggable true
      buildConfigField "String", "COMMIT_LOG", "\"${getCommitLog()}\""
    }
  }
}
```

以上です。
「配列の要素のうち、条件に一致する最初の要素の位置」をワンライナーで求めたい(Python3)


```rb
numbers = [3, 5, 4, 2, 1]
numbers.index{|val| val % 2 == 0} #=> 2
```

__配列の要素を先頭から見ていき、条件に一致する最初の要素の位置がほしい__ということがよくあります。例として整数が格納された配列のうち、偶数となる最初の要素の位置を求めることを考えましょう。Rubyだと上記のようなワンライナーにより求めることができますが、Pythonではどのように書くべきでしょうか?

```py
numbers = [3, 5, 4, 2, 1]
min((i for i in range(len(numbers)) if numbers[i] % 2 == 0), default=-1) #=> 2
```

与えられた条件を満たす要素のうち、添え字が最も小さいものを返すイメージですね。なお__組み込み関数`min`は与えられたイテレータが空のとき、例外を投げます。__上記の例でいえば配列`numbers`の中に偶数がない場合、`i for i in range(len(numbers)) if numbers[i] % 2 == 0`が空になり、例外扱いとなります。ただし__キーワード引数`default`を指定すると、イテーレタが空でも例外にはならず、代わりに`default`に指定した値を返します。__要するに`numbers`に偶数が存在する場合は最初の偶数の要素の位置、存在しない場合は`-1`を返すわけです。

ちなみに内包記法を使わないとなると次のようになりますが、Pythonらしいかどうかといわれると首をひねらざるを得ない見た目になってしまいます。そもそも可読性が高いとも思いません。またPythonの無名関数は特有の癖があるため、あまり使いたくないというのが本音だったりします。

```py
numbers = [3, 5, 4, 2, 1]
min(filter(lambda i : numbers[i] % 2 == 0, range(len(numbers))), default=-1) #=> 2
```

余談: 最初にあげたRubyの例ですが、次のように書くこともできます。

```rb
numbers = [3, 5, 4, 2, 1]
numbers.index(&:even?) #=> 2
```
[JAWS-UG 磐田] EC2サーバの作成

# ◆[JAWS-UG 磐田] ハンズオンの補足資料 EC2編 #3
### EC2サーバを作成します。
#### **◆コンソールを使用してEC2サーバを作成するには**
**１．**[Amazon EC2コンソール](https://ap-northeast-1.console.aws.amazon.com/ec2)を開きます。
　※リンク先をクリックすると、東京リージョンのコンソールに接続します。
- - -
**２．**ナビゲーションペインで[インスタンス]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/df79a4a1-7961-9020-f5f0-8a7273cbfcb1.png)
- - -
**３．**[新しいインスタンスの作成]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/751fb96d-a044-8f85-acc3-e05c552394d8.png)
- - -
**４．**インスタンス作成ウイザードのステップ１で、[Amazon Linux AMI xxx]を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/ad22c9df-0a56-41c9-5d77-f6b8d54952c2.png)
- - -
**５．**ステップ２はデフォルトのまま、[次の手順：インスタンスの詳細の手順]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/a0d2bb59-d969-5817-70b1-f9196e6f4360.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/038bc9f3-c67d-95f2-992f-0596edbe888d.png)
　※ブラウザ画面の右下にあります。
- - -
**６．**ステップ３の[IAMロール]で作成したロールを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/626b0871-3a51-e880-a8c2-2c32b2c9a8f6.png)
- - -
**７．**[高度な詳細]をクリックして、ユーザーデータを設定します。
　※設定内容は、ハンズオン資料を参照願います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/cb22e7ab-fdcb-d3fa-7a37-c06ca27b26f9.png)
- - -
**８．**[次の手順：ストレージの追加]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/98ec1880-cf0b-d583-2b10-547512e06f6a.png)
　※ブラウザ画面の右下にあります。
- - -
**９．**ステップ４はデフォルトのまま、[次の手順：Add Tags]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/76df06ed-7372-7c52-9b25-fed4caff0aed.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/b4d4f75a-f896-f326-ddd0-a3d919d017d4.png)
　※ブラウザ画面の右下にあります。
- - -
**１０．**ステップ５で[値]にNameキーの値を入力して、[次の手順：セキュリティグループの設定]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/f696f278-53cd-56d9-15cc-c482167c13a3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/c7141db3-04cb-eb5a-9f51-a020a902f050.png)
　※ブラウザ画面の右下にあります。
- - -
**１１．**ステップ６で[セキュリティグループの割り当て]で既存のセキュリティグループを選択後、作成したセキュリティグループをチェックして、[確認と作成]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/fbdb5473-a480-e508-4418-f3954cd3fc61.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/9d4bee3e-8b00-1c86-638a-c571626ac3fa.png)
　※ブラウザ画面の右下にあります。
- - -
**１２．**ステップ７で内容を確認後、[作成]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/709e3226-e404-1275-ecb8-6dd664848843.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/f4bceb4e-4f35-beca-4f18-4854ae04cb9f.png)
　※ブラウザ画面の右下にあります。
- - -
**１３．**キーペアの設定画面で、[既存のキーペアの選択]=>作成したキーペアを選択、チェックボックスをチェックし、[インスタンスの作成]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/297bc0dc-e2e7-2f9d-c9e8-ea4e36bd06f2.png)

・作成に成功すると下記画面を表示します。
　※EC2サーバ作成に数分程度かかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/59313a4c-ca1d-efc3-8e37-644e11bef738.png)
- - -
**※公式マニュアルから抜粋**
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EC2_GetStarted.html
EAIをクラウドで利用することで得られる3つの利点

EAIツールをクラウドで利用するサービスが増えてきました。
オンプレではなくクラウドで利用することで得られる利点まとめてみました。
 (1)Asteria Warp Core
　　(EAIツール国内シェア1位のAsteriaWarpのソフトウェアライセンスをサブスクリプション提供するもの)
 (2)Data Spider Cloud
　　(EAIツール国内シェア2位のDataSpiderをSaaS提供するもの)
 (3)PolarisGate
　　(EAIツール国内シェア3位のMagic xpiをSaaS提供するもの)

#1.初期費用を抑えられる
　クラウドサービス共通の特徴ですが、EAIも安いツールではありません。
　初期で〇百万円、インテグレーションを含めると〇千万円になるケースもあります。
　サブスクリプション方式で、初期費用を均すことにより、導入のハードルを下げることが可能となります。
　但し、5年程度のランニング費用も踏まえると、総額ではクラウドサービスの方が高くなるケースがほとんどです。



#2.SaaSサービス間のデータ連携が容易になる
　EAIツールは、必ず自サーバにデータを一旦経由して、取得元から送信先にデータを連携します。
　社内LANの中にEAIツールがある場合は、一度社内環境にデータを引っ張ってくる必要があります。
　一方、社外(クラウド)にEAIツールがある場合は、外の世界でデータ連携が完結することが可能となります。
　基幹システムや情報系システムのサーバも、パブリッククラウドで構築している企業においては、EAIツールを中（社内LAN）で持つ必要はないのです。
![オンプレ、クラウド.png](https://qiita-image-store.s3.amazonaws.com/0/168883/6fde93b3-2f2f-54c6-5948-f408cf5d4d54.png)



#3.他社とのデータ連携も可能となる
　「EAIは、社内システムのデータ連携を行なうもの、社外のデータ連携はEDI」というのが一般的でした。
　EAIとEDIの両方のシステムを有する企業は一部の大手企業であり、殆どの会社がCSVファイルに落として、メールでの連携を行なっていました。
　クラウドのEAIを使うことで、CSVに落とす作業、メールを送付する作業、CSVデータをインポートする作業は不要となのです。
新人用Linuxの仮想環境管理メモ3（Oracleインストール)

#やりたいこと
前回Linuxがインストールできたため、OracleをインストールしてインストールコマンドとOracleの設定を理解する。

##課題1　スナップショット作成
スナップショットを作成し、インストール後の状態を保存する。
SSH等設定をぶっ壊す可能性があるため、また仮想化のメリットを理解するため。

#回答例１
![Screenshot from 2017-03-05 11-23-26.png.png](https://qiita-image-store.s3.amazonaws.com/0/81968/6fc89991-6278-0334-615b-c24169a18a43.png)

仮想マシンを選択し、右側のスナップショットボタンからスナップショットを作成する。

##課題２　Oracleのインストール
以下から、インストールバイナリを取得してインストールする。
https://oss.oracle.com/debian/dists/unstable/non-free/binary-i386/
※32bit版は10gしかなかったので・・・

#回答２
最終的には以下となる。
sudo dpkg -i oracle-xe-universal_10.2.0.1-1.1_i386.deb 

問題１SWAPがたりない
デフォルト設定でUbuntuをインストールしたのでSWAPがたりない900MB必要なのに500MBしかないと怒られる。
SWAP領域を拡張

```

# スワップ用フォルダの作成
sudo mkdir /var/swap

# 1Gのスワップ用のファイル作成
sudo dd if=/dev/zero of=/var/swap/swap0 bs=1M count=1024

# パーミッションの設定
sudo chmod 600 /var/swap/swap0

# スワップ割り当て
sudo mkswap /var/swap/swap0
sudo swapon /var/swap/swap0

# 起動時に自動でスワップが割り当てられるように設定
sudo echo '/var/swap/swap0 swap swap defaults 0 0' >> /etc/fstab

```


問題２以下のライブラリがないと怒られる
  パッケージ libaio はまだインストールされていません。
  パッケージ libaio1 はまだインストールされていません。

前回のHTTPプロキシを利用してインストール
※ホストOSのポートフォワードを開始してください。
sudo apt-get install libaio1


##課題３　Oracleの設定
インストーラの通知にしたがって設定を行う。

#回答3
sudo /etc/init.d/oracle-xe configure

Specify the HTTP port that will be used for Oracle Application Express [8080]:
→エンター
Specify a port that will be used for the database listener [1521]:
→エンター
Specify a password to be used for database accounts.  Note that the same
password will be used for SYS and SYSTEM.  Oracle recommends the use of 

different passwords for each database account.  This can be done after 
initial configuration:
→パスワード入力
Confirm the password:
→同じパスワード入力

##課題４　OracleのWEBコンソールを利用
ゲストの8080ポートでWEBコンソールが起動しているため、ホストからアクセスする。

#回答４
最終的には以下のURLでホストから参照できる。
http://192.168.99.100:8080/apex/

問題１　外部ホストから接続できない
ubuntuのWFやポートの問題ではなく、Oracleの設定が必要

SQLPLUSで接続　{PASSWORD}　は先程設定したパスワード

```
export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/
export ORACLE_SID=XE
cd /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/
 ./sqlplus sys/{PASSWORD}@XE as sysdba

```


実行するSQL

```
EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);
```

#所感
業務でよく使うOracleをインストールするための流れが理解できればうれしい。
Windows版をインストールすると起動が遅くなったり、ポートを塞いだりしますが、
仮想環境ならそのあたりの管理が楽になる。っと理解して貰えれば嬉しいな。
A server is already running 対処方法【Rails】

Railsでサーバー起動したら以下エラーが発生しました。
昨日までは問題なかったのに～。。なんでだ！といっても始まらないので調べてみました。

## **環境**
* windows 8 64bit
* Rails 4.1.16
* Ruby 2.3.3

## **エラー**

サーバー起動したら以下のエラーが発生しました。

```bash
$ C:\rails_book\devise> rails s
=> Booting WEBrick
=> Rails 4.1.16 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
A server is already running. Check C:/rails_book/devise/tmp/pids/server.pid.
Exiting
```

一番最後の英語をみると
「サーバーはすでに実行中です。C：/rails_book/devise/tmp/pids/server.pidを確認してください。」

となっている。
もしかして、昨日サーバー立ち上げたままPCの電源落としたからかな？（適当ｗ）

## **解決方法**

いくつか方法はある模様

### ①ターミナルを再起動（私はこれで治った。）

ターミナルを全部閉じて、再起動すれば解決しました。
偉大なり、再起動！

<br>

### ②server.pidファイルを削除

以下のパスにあるファイルを削除します。

` [Railsプロジェクトフォルダ]\tmp\pids\server.pid `

これがサーバー起動する際に使用しているIDっぽい。
サーバー終了すると削除されるようですが、エラー発生時は残ったままでした。

実際、サーバー起動と終了をしてみるとserver.pidが作られたり、削除されたり
しているのが確認できます。
【JavaScript】ライブラリなしでパララックス（視差効果）背景を作る

## TL;DR
この記事で解説するパララックスは[こんなの（CodePen）](http://codepen.io/ygkn/pen/oZvxvw)です。

## まえがき

パララックス、素敵ですよね。
オサレなサイトに行くとたまに背景や要素に適用されていて、思わず「おっ」と見入ってしまいます。

僕もあるサイトの背景に当ててみようと思い立ち、偉大なる Google 先生にお尋ね申し上げましたが、検索結果にあったのは主に手前の要素を動かすパララックス（こちらは[Rellax](https://dixonandmoe.com/rellax/)というライブラリがオススメです）で、背景のみをゆっくりスクロールさせる僕の求めていたパララックスはありませんでした。

そこで自分で作ってみたら意外と簡単だったので記事を書いてみた次第です。

## `background-attachment` ?
背景画像をパララックスと聞いて最初に思いつくのはCSSの`background-attachment`プロパティです。
これに`fixed`という値を設定すると、要素をスクロールしても背景はスクロールせず、パララックスのようなものを演出できます。

意気揚々と[このコード](http://codepen.io/ygkn/pen/VpKppp)を書いた僕を待っていたのは悲しき運命~~（さだめ）~~でした。

![image](https://qiita-image-store.s3.amazonaws.com/0/104663/2292a35c-a436-170b-9431-33b675ee58c7.png)

悲しみの画像

そうです。もはや僕達現代人の臓器になりつつあるスマホで、背景画像を要素いっぱいに表示する`background-size: cover`と先述の`background-attachment`はサポートされていないのです。

そんな悲しみにくれていた僕に話しかけたのはある一つのMDNの記事でした。

## `object-fit` !
彼は、[`object-fit`](https://developer.mozilla.org/ja/docs/Web/CSS/object-fit)プロパティと我らが`<img>`要素で`background-size: cover`と同じようなことができるよ、というのです。

あとは、`background-attachment`ですが、これは`JavaScript`でなんとかするとしましょう。

viewport（ドキュメントの表示領域）の上端からの距離を取得して`transform`でその分移動させています。

`top`にしなかったのはパフォーマンスを考えてです。

そうしてできたのが[こちら](http://codepen.io/ygkn/pen/QpKvbL)です。しかし結構がくつきます……。

## `requestAnimationFrame` !
困り果てた僕は先ほどちょろっと話した[Rellax](https://dixonandmoe.com/rellax/)のソースコードを呼んでみました。するとソースのどこにも`addEventListener`や`onscroll`（これは論外ですね）の文字はありませんでした。

どうやら [`requestAnimationFrame`](https://developer.mozilla.org/ja/docs/Web/API/Window/requestAnimationFrame) というものを使ってるようです。調べてみたところ、これはマシンの性能やタブの状態（バックグラウンドかフォアグラウンドかといったもの）によりFPSが変わる`setTimeout`のようなものだそう。

特にFPSは関係ない今回のようなケースにはぴったりですね！

以上を踏まえてできたコードが[こちら](http://codepen.io/ygkn/pen/PpGzpG)です。

## ゆっくり動かす
さて、ここまでCSSでできることをわざわざJavaScriptでやってきたのはスマホに対応させる以外にも理由があります。

それは、CSSのみだったら背景画像を固定することはできてもゆっくり動かすことはできません。

しかし、JavaScriptならできます。

分かりやすく図をかいてみると以下のようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/104663/2a5a950d-2dc2-d37c-eae9-5939ede74dfc.png)

確かにゆっくり動いているように見えます。

☆の部分は、要素が画面に見え始めた時点で0、見え終わった時点ではみ出した部分の全体となります。

つまり、`(viewportの高さ - 要素のviewport上端からの距離) / (画面の高さ + 要素の高さ)`が移動する割合になるので、背景画像のviewportからはみ出た部分にかけて、`(viewportの高さ - 要素のviewport上端からの距離) / (画面の高さ + 要素の高さ) * (背景画像の高さ - viewportの高さ)`となります。

それをコードにしたのが[これ](http://codepen.io/ygkn/pen/oZvxvw)というわけですね。

## あとがき
式を立てるのが難しかったです……。

ほかは結構簡単でした。

Macやスマホで少々がたついちゃうのですがしょうがないんでしょうか……。
phpMyAdmin の blowfish_secret が短すぎます問題解消

Ubuntu 14.04.5 LTS サーバ内のデータベースを MySQL から MariaDB にしたついでに phpMyAdmin もアップデートした。すると……

> 設定ファイルの中に記述されているパスフレーズ（blowfish_secret）が短すぎます。

と phpMyAdmin に怒られてしまい。以下、解決までの道のり。

## 環境

* Ubuntu 14.04.5 LTS
* MariaDB 10.1.21
* phpMyAdmin 4.6.6

## ここを弄る

「phpMyAdmin blowfish_secret」とかでググると /usr/share/phpmyadmin 内のconfig.sample.inc.php を config.inc.php にリネームした上で $cfg['blowfish_secret'] に任意の文字列を設定するという情報がちょこちょこ出てくるが、これちょっと古い。

/etc/phpmyadmin/config.inc.php 

```
// Load secret generated on postinst
if (check_file_access('/var/lib/phpmyadmin/blowfish_secret.inc.php')) {
    require('/var/lib/phpmyadmin/blowfish_secret.inc.php');
}
```

ということで、弄るのは /var/lib/phpmyadmin/blowfish_secret.inc.php の方。ここに任意の文字列32文字以上を設定する。