OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidとiOSでアプリの動画をチャットツールに気軽にシェアしたい【スクリーンレコード】

AndroidとiOSの画面を動画にしてそのmp4やmovをgifにするだけの話です。

# 環境

|Device | Version|
|-------|--------|
| Mac   | Yosemite以降 |
| Android   | KitKat(4.4)以降 |
| iOS   | 8.0以降 |

# ffmpegを入れる(下準備)

```
brew install ffmpeg
```

使用例

```
ffmpeg -i [movie file] -r [frame rate] [output file]

ex.
ffmpeg -i hoge.mp4 -r 10 hoge.gif
```
* frameレートを上げすぎると容量が大きくなってチャットツールの上限にひっかかったりするので注意してください

# Android

* 撮影...

```
adb shell screenrecord sdcard/hoge.mp4
```
* 撮影した動画をカレントディレクトリにコピー

```
adb pull sdcard/hoge.mp4 ./
```

* ffmpegでgif変換

```
ffmpeg -i hoge.mp4 -r 10 hoge.gif
```

# iOS

* QuickTimeで動画撮影

 * 「QuickTime Player」を開く
 * 「ファイル」=>「新規画面収録」
 * 画面中央下部の録音マークの右にあるプルダウンから接続しているiOS端末を選択(*画像参照)
 * 録画する
* ffmpegでgif変換(movもイケる)

```
ffmpeg -i hoge.mov -r 10 hoge.gif
```

※参照画像(iPhone端末の名前が「ちょこめろん」なので選択)

![スクリーンショット 2015-07-14 19.53.53.png](https://qiita-image-store.s3.amazonaws.com/0/26265/16a997a7-1bb3-d1d8-f9e7-4a30603face3.png)


# 出力

![hoge.gif](https://qiita-image-store.s3.amazonaws.com/0/26265/34adceb7-d351-e765-eb74-488036e21cb0.gif)

# 余談

チームでやっているとアプリの画面をシェアしたいときが多々あります。
ちょっと前まではスクショで共有していたのですが、動画で共有したら大分ウケがよかったので続けていました。ですが、動画共有だとdropboxや社内サーバにあげることになるので、見る方も上げる方も面倒くさい。

Slackなどのチャットツールだとmp4はダメだけどgifならinline展開されるので上げる方も見る方もかなり楽です。動くものの方がイメージがつかみやすいので、皆さんもgifとかを積極的に使っていってほしいです。

（もっとgifめっちゃ簡単にとれるのがあったら教えて下さい。）
The view hierarchy is not prepared for the constraintが出たら見るページ

#addSubViewしてからaddConstraints
「The view hierarchy is not prepared for the constraint」が出たら順番が実装の順番を確認してください。

**addSubViewしてからaddConstraints**をしましょう。


```swift
//viewを作成
let myView = UIView()
//autolayoutを使用
myView.translatesAutoresizingMaskIntoConstraints = false

self.view.addSubView(myView)

//NSLayoutConstraintの配列をセット
self.view.addConstraints([NSLayoutConstraint])
```

・参考
[Xcode6][Swift][iOS]雑記3 | た～みなるねんど
http://w.terminal-end.net/?p=955
Excel VBAのショートカットとTips

仕事で少しVBAを組むことになったので、参考情報をまとめます。

# ショートカット

## 全般

コマンド|説明
----|----
Alt + F11 | VBE(Visual Basic Editor)起動。VBAにロックがかかっている場合でもエディタを起動でき、エディタからロックを解除できる。

## デバッグ

コマンド|説明
----|----
F8 | ステップイン
(変数を選択して）Shift + F9 | クイックウォッチ(変数の内容を確認）

# Tips

### 隠しシートを表示
ホームタブ  > 書式 > 非表示/再表示 > シートの再表示

### データの入力規則が設定されたセルを強調表示する

[ドラフト: データの入力規則が設定されたセルを検索する](https://support.office.com/ja-jp/article/%E3%83%89%E3%83%A9%E3%83%95%E3%83%88-%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%85%A5%E5%8A%9B%E8%A6%8F%E5%89%87%E3%81%8C%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E3%82%BB%E3%83%AB%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B-f9ac75b6-1092-4250-b2e7-13f5857ad075?ui=ja-JP&rs=ja-JP&ad=JP)

### クラスモジュールを使う 

http://qiita.com/lazynick/items/cce87d3194d737441161

### 連想配列を使う

http://www.niji.or.jp/home/toru/notes/17.html

### エクセル列番号対応表

http://bicycle.life.coocan.jp/takamints/index.php/techtips/xlsColNumMap

# 参考

http://excelnavi.livedoor.biz/archives/3682160.html
Mac標準搭載を使ってApacheを設定する

参考になるページ
[MacでApache+PHPの環境を構築する](http://qiita.com/is0me/items/72fcb5d8ac2c8f1c6247)
[Mac でバーチャルホストを XAMPP や MAMP に頼らず設定する方法]
(http://weble.org/2010/06/20/mac-virtualhost)


＜mac搭載apache＞
よく使うコマンド
・sudo /usr/sbin/apachectl start　：起動
・sudo /usr/sbin/apachectl stop　：停止
・ps agx | grep httpd　：起動確認

**＜流れ＞**
### Apacheを設定する
- Apacheを起動させる  
=>起動確認をしてすでに起動されていれば(http://localhost) ブラウザに何か表示されてる。  
それでも無理やり起動をかければ、すでに起動しているコメントが返ってくる。  

```
$ sudo /usr/sbin/apachectl start
/System/Library/LaunchDaemons/org.apache.httpd.plist: Operation already in progress
```

-  /etc/apache2/httpd.confの設定
・ PHP5モジュールを有効化: php5_moduleのコメントをはずす
・ バーチャルホスト設定を有効化：Virtual hostsのコメントをはずす

- /etc/hostsの設定
・「127.0.0.1 ＊＊＊.localhost」　みたいにドメインを追加すると「＊＊＊.localhost」でブラウザアクセスできるようになる

- /etc/apache2/extra/httpd-vhosts.confの設定
・追加した名前でアクセスした時のドキュメントルートを追加するのだが、Apacheのバージョンの違いで思わぬとこではまった
>
**＜はまったところ＞**
自分Mac環境は Apache/2.4.10 (Unix) PHP/5.5.20
参考にしていたURLの書き方と違う事が判明した。
たとえば、ドメイン名を「＊＊＊.localhost」として、ドキュメントルートをデフォルトのパス（/Library/WebServer/Documents）以外の場所からアクセスしたい場合
「require all granted」　が必要

```
<VirtualHost *:80>
    DocumentRoot "/Users/＊＊＊/Dev/www"
    ServerName ＊＊＊.localhost
    ErrorLog "/private/var/log/apache2/sandbox-error_log"
    CustomLog "/private/var/log/apache2/sandbox-access_log" common
    DirectoryIndex index.php index.html
</VirtualHost>
<Directory "/Users/＊＊＊/Dev/www">
    Options Includes ExecCGI FollowSymLinks
    AllowOverride Al
    order deny,allow
    allow from All
    require all granted
</Directory>
```

- Apacheを再起動する

これで
http://＊＊＊.localhost/　にアクセスできるようになりました。
npm v3.x 試してみた & 注意する点


ふと思い立って `npm install -g npm@3` した。3.1.2 は VERY BETA とのこと(ニュアンスがよくわからん。アルファとの対比なのか、アルファ相当なのか) ので、そのうち出るでしょう。

## node_modulesのフラットな展開

npm@3 だとnode_modulesの依存がパッケージ間のバージョンが衝突しない限り、トップレベルのnode_modulesにフラットに展開される。これによって同一のモジュールを依存ツリー間でモジュールが重複した時にnode_modules以下のサイズが膨らむのを抑えることができる。

衝突した場合はそのモジュールの子のnode_modulesに格納されて衝突は回避される。

## 気になるrequireの仕様

とはいえ、requireの仕様が変わってるわけじゃないので、トップレベルから子だけじゃなく孫モジュールも直接requireできてしまう。手元でたとえば a -> b な依存のときに、今までは `require('b')` できなかったのができるようになる。

これはある時点でrequireできたモジュールが何の依存だったのかあとでわからないという、将来的に禍根になる可能性があるケースがあるのではないか。怖い。

## 壊れるケース

気にしないといけないのが一点。

子と孫で同じバージョンの場合はrequireキャッシュに引っかかって同一参照になる。依存自身からみた場合に子が孫をシングルトンだと想定してグローバルオプションをセットしている場合npm3にしたことで壊れる。

ちょうどmarkedが判りやすく壊れそうだったので、例に出す。


gfm-marked/gfm-marked.js

```
var marked = require('marked');
marked.setOptions({
  renderer: new marked.Renderer(),
  gfm: true
});
module.exports = marked
```

not-gfm-marked/not-gfm-marked.js

```
var marked = require('marked');
marked.setOptions({
  renderer: new marked.Renderer(),
  gfm: false
});
module.exports = marked
```

index.js

```
var notGfm = require('not-gfm-marked');
var gfm = require('gfm-marked');
notGfm('```aaa```'); // fenced code block はgfmでないと存在しないが、参照が同一な為あとで読み込んだsetOptionsで有効になってしまう。
```

まあ意図しないとなかなか起こせないとは思うんだけど、ハマった時の根は深そう。他に気づいた点としてはbrowserifyが対応してなかったので、browserify使っている人も対応待ちになるはず。

そういえば es modules と commonjs の関係ってどうなるか話進んでるんだろうか。
TableViewの指定行だけを更新

# タップした行だけを更新する

```lang:swift
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath)
{
　// *** ここで行に表示するデータを更新する ***

  // 指定行のみ更新
  self.myTable.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
}
```

# 指定の行を更新する

カスタムセル内のボタンをタップして、同セルのラベルに表示された数字をインクリメントしたときに、その行だけを更新したい。

```lang:swift
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell
{
  // カスタムセル内ボタンのtagに行番号を設定 
  // カスタムセル内ボタンにaddTargetで「cellButton_Click」を追加
}

@IBAction func cellButton_Click(myButton: UIButton)
{
  // カスタムセルに紐付いてる情報を更新

  // カスタムセル内ボタンのtagから行番号を取得
  let row = myButton.tag
  // 対象行だけ更新
  let row = NSIndexPath(forRow: self._currentRow, inSection: 0)
  self.myTable.reloadRowsAtIndexPaths([row], withRowAnimation: UITableViewRowAnimation.Fade)
}

```
SSHでどうしても鍵認証できないときに見るもの

仕事の中で鍵交換する必要が出てきたので、いつものように公開鍵をauthorized_keysへ保存して、認証を試みるもできない事があった。

鍵は正しいものを使っている。
authorized_keysや.sshのパーミッションは特に間違っていない。

何がなにやら原因がわからず、色々調べていくとこちらのサイトで解決しました。

・SSHが鍵認証されないとき、パーミッションを疑え。
http://takuya-1st.hatenablog.jp/entry/20090216/1234742055

やはり、原因はパーミッションでした。
authorized_keysや.sshのパーミッションは見ていたけど、さらに上位のフォルダのパーミッションが775になってしまっていたのが原因でした。

chmod で権限を変更。
```
chmod 755 /home/fukusuke/ 
```

変更すると問題なく、ssh通りました。


パーミッションエラーのログは下記に出ているみたいですね。

```
/var/log/secure
```

わかってみるとなんて事ない問題なんですが、ハマってしまうとなかなか抜け出せ何ですよね。。。

一つ勉強になりました。
dlvr.itでfacebookのthumbnailが正しく表示できない

## dlvr.itで「Thumbnail Style」を「Auto-Detected by Facebook」に設定

これでog:imageをfacebook側で検出してサムネイル表示してくれるはず・・・が、サムネイルが表示されない。

## なんで？？

facebookのサムネイル表示はfacebookクローラがキャッシュしないと表示しない仕組みらしい。なので、初めてfacebookに食べさせるURLはサムネイルが表示されない。

## どうするか？

通常、facebookデバッグツールで手動でスクレイピングさせるが、自動でやるなら、このURLを事前にポストしてやる

> https://graph.facebook.com?id={url}&scrape=true
[perl]ヒア文字列で躓くところ

自分が躓いたところ。メモ。

#ちゃんと動作する書き方


```pl:index.cgi
$test = << "EOL";
aaa
bbb
ccc
EOL

print $test;
```

#こう書くと動作しない
1. セミコロンの位置の間違い

```pl:index.cgi
$test = << "EOL"
aaa
bbb
ccc
EOL;

print $test;
```

2.終指定文字の前にスペースやタブなどがある

```pl:index.cgi
$test = << "EOL";
aaa
bbb
ccc
    EOL

print $test;
```

3.シングルクオーテーションで変数展開している
※ヒア文字列に限らず、perlでは、
""内には変数を入れられますが、''内には入れられません。

```pl:index.cgi
$b = 'bbb';
$test = << 'EOL';
aaa
$b
ccc
EOL

print $test;
```
Atomに入れておきたいPackage

別途でatom環境を構築することになったら思い出す用のメモ。完全自分仕様なので異論は無しで。

# project-manager
各種プロジェクトフォルダごとに管理。

# atom-beautify
コード整形ツール

# git-plus
atom上からgitのファイル操作。基本CUIですが一応いれとく。

# merge-conflicts
atom版mergetool。

# atom-html-view
htmlファイルのプレビュー。

# atom-typescript
typescript関係便利ツール。

# pain-split
ペインを区切るときファイル表示ダブらせず、空き状態で分割してくれる。

# pane-move-plus
分割したタブの移動

# docblockr
ドキュメント用スニペット

# file-icons
ファイルアイコンがわかりやすくなる。

# langauge-glsl
GLSLカラースキーマ。

# autocomplete-glsl
GLSLのautocomplete対応。

# atom-processing
atomからprocessingのビルドコマンドを叩く。俺製。
unixコマンド、役立ちメモ

unixコマンドのメモで書きためているリスト集

- [unix系でaccesslogのデータを解析したい](http://qiita.com/tagosaku324/items/744d9c129f8775c6b4ba)
- [unix系で一気にファイルの中身をかきかえたい]
(http://qiita.com/tagosaku324/items/6131da0b51a70794d005)
- [unix系でファイルの数、容量を知りたい](http://qiita.com/tagosaku324/items/7370eccec74384ea3b5c)
- [unix系でディレクトリ階層状態を知りたい](http://qiita.com/tagosaku324/items/d71bfbd466cb4bd56bf1)

env設定関係
・.bash_profile を書き換えたらターミナルを閉じずに更新させたいとき

```
$ . .bash_profile
```
unix系でファイルの数、容量を知りたい

unixコマンドのメモ

<追記 2015/7/16>
・ du/xargs/awk　でなんでファイルサイズが変わってしまうのかについて記載

# 1.ファイル生成時刻の期間で抽出したい
たとえば、「2015-01-01」〜「2015-08-01」までで作成されたファイルの一覧がほしいとした場合、findコマンドを使用します。

### 期間抽出1つ目の方法
```
find . -type f -newermt "2015-01-01" ! -newermt "2015-08-01" 
```
>
-type f：ファイルだけに限定
-newerXY：（X=m）ファイルが更新された時間（Y=t）直接的な時刻指定として解釈
　=>「！」や「-not」といれれば　終点を見てくれる（-olderっていうのはない）

ただし、-newerXY　の期間を直接書くことができる引数が使えるのはどうやらFreeBSD系。CentOSとか使えない場合はその期間用のダミーファイルを作って判定するしか無いみたいです。

### 期間抽出の2つ目の方法
```
touch -t 201501010000.00 /tmp/find_20150401 
touch -t 201508010000.00 /tmp/find_20150801
find . -type f -newer /tmp/find_20150401 ! -newer /tmp/find_20150801 
```
>
touchで空ファイルを時間指定して作る
-newer 時間指定したファイル名　で期間抽出する

# 2.ファイルの数を知りたい
findで実行した結果のファイル数を知りたい場合　wcコマンドを使います。

```
find . -type f -newermt "2015-01-01" ! -newermt "2015-08-01" | wc
```

# 3.ファイル全容量を知りたい
findで実行した結果のファイル容量を知りたい場合 awkやxargsなんかで容量を知ることができます。

### awkで容量を計算してみる
こっちの方が安心して容量がわかります。

```
find . -type f -newermt "2015-01-01" ! -newermt "2015-08-01" -ls | awk '{sum +=$7;} END {printf("%d \n",sum)}'
```
>
-ls：find抽出結果をlsの形で表示してくれる
　＝＞容量は7番目に記載されている
|：パイプでつなげて、抽出結果を利用する
{sum +=$7;}：抽出結果の表示7番目をsum変数に加算していく
END {printf("%d \n",sum)}：最後にsumを表示させる

これで容量の総合計が出てきます！

### xargsで容量を計算してみる
**＜注意＞　抽出結果が多い場合はまります！！**

```
find . -type f -newermt "2015-01-01" ! -newermt "2015-08-01" | xargs wc
```
xargsで実行した場合、ファイルごとに容量が標準出力に表示されます。
終わったと思ったときに出てくる「total」
「  1036184   6958743 305922107 total」＜＝こんな感じのやつ
awkの結果と同じになるはずなのに、ファイル数が多いと標準出力で出てきた結果が何故か違う気がする。
これ、何か少ないと感じた場合、見逃した「total」があるはずです。
実は複数回実行されているようなのです。

**＜確認してみる＞**

```
env LANG=C find . -type f -newermt "2015-01-01" ! -newermt "2015-08-01" |xargs env LANG=C wc > /tmp/ooooo
grep total /tmp/ooooo
```
>
env LANG=C：文字コードがおかしくないか統一させてみた
　> /tmp/ooooo：結果をファイルにおとしてみた
grep結果を見ると「total」が何回か出てくるはず。。。


**私の結論！！**
ファイルの容量を調べるときはawkを使おう

##du/xargs/awk　でなんでファイルサイズが変わってしまうのか
duを使う方法での前置き
>
findの結果を利用して容量計算のコマンドduを使いたい時、
man find を調べると  -exec command {} + がありました！
この中の説明に
The command line is built in much the same way that xargs builds  its  command lines.
こんな記述がありました。結局xargsと同じ結果になるようです。

**本題**

```
$find . -type f -newermt "2015-01-01" ! -newermt "2015-08-01" -ls | awk '{sum +=$7;} END {printf("%d \n",sum)}'
$find . -type f -newermt "2015-01-01" ! -newermt "2015-08-01" | xargs wc
$ find . -type f -newermt "2015-01-01" ! -newermt "2015-08-01" -exec du -ch {} + 
```
上記の結果は一見全部同じようになるんじゃないかと思ってしまいましたが、
ファイルが沢山ころがっているようなフォルダ内で実行してみると結果がかなり違うことがわかります。

duやxargsはファイルのブロック数を表示しています。
なので、単純にファイル容量を計算したい場合は正しい結果がでません。

例）2byteのファイルを作ったから、lsやwcは2byteで表示されるけど、
duだと4kbになっちゃってるのを確認

```
$ echo a > /tmp/test
$ls -l /tmp/test
-rw-rw-r-- 1 user group 2 Jul 16 15:02 /tmp/1
$wc -c /tmp/test
2 /tmp/1
$du -ch /tmp/test
4.0K	/tmp/test
4.0K	total
```

これが積み重なったら、確かに容量数はくずれますよね。
また、「xargsで実行した場合に複数回実行されているみたい。」と記載しましたが、
この複数回実行されちゃうことも容量が正しく計算されない要因になります。
（複数回実行されちゃうのがわかるのは totalが複数回でてくるから）

ということで私の結論はやっぱり
**「ファイルの容量を調べるときはawkを使おう」**
です。

ただし、awkを使用する場合も、lsで表示されている7番目の列の数字を計算させています。
これが、権限がない場合やデバイスファイル(Character special file.やBlock special file.)の場合、容量の部分が表示されていなかったり、0になっていたりしています。
そうなると計算出来ないから意図しない容量数が出てしまうでしょう。
そこは気をつけましょう。。
Vagrant で VirtualBox 5.0 の準仮想化を有効にする

# 要旨

[VirtualBox](https://www.virtualbox.org/) 5.0 で準仮想化が利用できるようになったので [Vagrant](https://www.vagrantup.com/) で VM を作るときに有効にする設定の紹介。

# 前提

- Vagrant 1.7.3+
- VirtualBox 5.0+

Vagrant のバージョンが古いとそもそも VM が立ち上がらないので注意。

# 設定

VirtualBox provider の `customize` メソッドは `VBoxManage` コマンドのラッパーなので、`modifyvm` で新しく追加された準仮想化オプションを設定するように書けば良い:

```ruby:Vagrantfile
Vagrant.configure(2) do |config|
  # とりあえず VagrantCloud にある CentOS 7.0 イメージを使う
  config.vm.box = "chef/centos-7.0"
  config.vm.provider "virtualbox" do |provider|
    provider.customize [ 'modifyvm', :id, '--paravirtprovider', 'kvm' ]
  end
end
```

既存の VM がある場合は `config.vm.provider "virtualbox" ...` だけ追記して `vagrant reload` すれば反映される。

# 参考

- https://docs.vagrantup.com/v2/virtualbox/configuration.html
- http://www.virtualbox.org/manual/ch08.html
デバイスの空き容量をゴミファイルで埋める


ディスク書き込みエラーが発生するような状況のiOSデバイスをデバッグしたいので、以下のように作業をします。

`mkfile`コマンドでゴミファイルを作ります。

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/mkfile.8.html

```bash
mkfile -n 11g gomi.dat

```

サイズはデバイスの「使用可能」な空き容量以上にします。

![Screen Shot 2015-07-14 at 5.35.19 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/5bbe3fff-c6f5-fe8b-d241-64966a2614ec.png "Screen Shot 2015-07-14 at 5.35.19 PM.png")


iTunesやiFunBoxなどでこのファイルを転送します
http://www.i-funbox.com/

以下のように転送している最中に「 0 バイト」になり「空き容量がありません」というアラートが出ます。

![Screen Shot 2015-07-14 at 5.40.25 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/7d9a6e01-9721-94b3-9863-b4e8972fea58.png "Screen Shot 2015-07-14 at 5.40.25 PM.png")
yum が "UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 15: ordinal not in range(128)" エラーを投げる

#環境情報
RedHat Enterprise Linux 7.1

#事象
```:bash
[root@aaaa yum.repos.d]# yum search zsh
読み込んだプラグイン:langpacks, product-id, subscription-manager
'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
============================================ N/S matched: zsh ============================================
zsh-html.x86_64 : Zsh shell manual in html format
zsh.x86_64 : Powerful interactive shell

  Name and summary matches only, use "search all" for everything.
```

なんか出てきた

```:bash
'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128) 
```

#公式サイトの対応法
https://access.redhat.com/solutions/284023


#原因

* yumdb が破損している可能性がある
* 言語環境がUTF-8になっていない


#対策

1やってだめなら、2をやりましょう

##1. yumdbを消す

```:bash
mv /var/lib/yum/yumdb/ /tmp
yumdb sync
```

##2. pythonデフォルトエンコーディングの変更

どうやらyumはpythonスクリプトのようです。

```bash:
vi /usr/lib/python2.7/site-packages/sitecustomize.py

import sys
sys.setdefaultencoding("utf-8")
```

#結論
CentOSではならなかったので、RedHatが悪い。
pymongoでhintを指定する

indexが増えてしまい、意図しないindexが先に当たって遅くなることがあったので、hintを与えてindexを指定する必要が出てきた。
データ構造を変えられないのでこれからお世話になるであろう為メモ
ｃ⌒っﾟдﾟ)っφ　ﾒﾓﾒﾓ...

            spec = {
                'user_id': {'$in': user_id_list},
                'type': 'a',
                'status': 0,
                'at': {'$lte': datetime.datetime.utcnow()}
            }
            cursor = db.collection.find(spec)
            cursor.sort('at', -1).limit(500)
            cursor.hint([
                ('at', pymongo.DESCENDING),
                ('user_id', pymongo.ASCENDING),
                ('type', pymongo.ASCENDING),
                ('status', pymongo.ASCENDING),
                ('_id', pymongo.DESCENDING),
            ])
JavaのArrayListの<総称型>とは何か？

JavaのArrayListは、多数のオブジェクトをまとめて管理できる。
これは、複数の型のインスタンスを混在させて格納できることを意味する。
たとえば、下記のような実装があるとする。

    ArrayList hoge = new ArrayList();
    String name = "ほげたろうさん";
    hoge.add(name);
    String s = (String)hoge.get(0);
    java.lang.System.out.println("Oh! Java yamatoken 1648: " + s);						

コンソールには下記のように表示される。

    Oh! Java yamatoken 1648: ほげたろうさん

ArrayList型 の hoge に、String型の name を格納している。
取り出す際は、(String)でキャストしないと、例外が発生する。

ここで、hoge に String型しか格納しないことが明確であれば、
下記のように総称型で宣言したほうがよい。

    ArrayList<String> hoge = new ArrayList<String>();
    String name = "ほげたろうさん";
    hoge.add(name);
    String s = hoge.get(0);
    java.lang.System.out.println("Oh! Java yamatoken 1649: " + s);						

コンソールには下記のように表示される。

    Oh! Java yamatoken 1649: ほげたろうさん

総称型は ArrayList のあとに <> で定義する。
総称型にすると、取り出す際に、Stringでキャストしなくてよくなる。
（キャストしなくても例外が発生しなくなる）。
初めてのAWS

EC2を利用してapacheをインストールしてみる

# セキュリティ設定
[[AWS 1]AWSアカウント取得後にする大切なこと！先ずIAMへ行け！ - Qiita](http://qiita.com/HOKARI_Yutaka/items/df34941c4db0fcde9e8d)
ここを参考にSecurity Statusの項目を全て完了させる

# EC2インスタンスの作成
用途別に様々なインスタンスタイプが用意されている[インスタンスタイプ - Amazon EC2](http://aws.amazon.com/jp/ec2/instance-types/)
とりあえず今回は無料利用枠で利用したいので、_Amazon Linux_の_t2.micro_を使用する

1. インスタンスの作成
コンソールホームからEC2のダッシュボードへ移動し__インスタンスの作成__をクリック
2. Amazon マシンイメージ（AMI）の選択
Amazon Linuxを選択
3. インスタンスタイプの選択
タイプ：__t2.micro__を選択し、__確認と作成__をクリック
4. セキュリティグループの編集
_ステップ 7: インスタンス作成の確認_で、__セキュリティグループの編集__をクリック
セキュリティグループの割り当て：新しいセキュリティグループを作成する
ルールの追加でルールを追加し、HTTPタイプを選択
__確認と作成__をクリック
5. 鍵の作成
_ステップ 7: インスタンス作成の確認_で、__作成__をクリック
キーペア作成画面になるので、__新しいキーペアの作成__を選択
任意のキーペア名を記入して__キーペアのダウンロード__

__インスタンスの作成__をクリックするとインスタンスが作成されます

# インスタンスへの接続
## パブリックDNS／IPの確認
EC2ダッシュボードでインスタンスを選択
作成したインスタンスの状態が__running__になっていることを確認
下部の説明タブにパブリックDNSとIPが表示されているのでメモ

## 接続
* Windowsの場合
teraterm
```
ホスト：パブリックIP
ポート：22
ユーザ名：ec2-user
鍵を使う：ダウンロードしたキーペア（.pem）ファイルを参照
```
* Macの場合
```bash
ssh -i [ダウンロードしたキーペア] ec2-user@[パブリックIP]
```

# apacheのインストール・起動
```bash
$ sudo yum -y install httpd
~~
Complete!
$ httpd -v
Server version: Apache/2.2.29 (Unix)
Server built:   Mar 12 2015 03:50:17
$ sudo service httpd start
Starting httpd:                                            [  OK  ]
```

# アクセス確認
パブリックDNSにブラウザからアクセスし、__Amazon Linux AMI Test Page__が表示されることを確認
/var/www/html/にHTMLファイルを作成してみて遊ぶ

# 後始末
EC2のダッシュボードで作成したインスタンスを選択
[アクション]-[インスタンスの状態]-[停止]または[削除]
停止後にもう一度起動すると、インスタンス作成の初期状態（apacheは未インストール）となる
パブリックDNS／IPも再度払い出される

# 参考
> [[AWS]AWS(Amazon Web Services)を使え！メリットあるけど簡単じゃないよ！覚悟ある？ - Qiita](http://qiita.com/HOKARI_Yutaka/items/7263a49d943d23a549c0)
YBIのTD agent、fluentdを使ったデータインポート


###前提条件
1)Apache2をVM上に構築すること
2)ruby,gemなどのインストール
：td agentを使うために必要である！


###手順
#####1.apache2のインストール
$yum -y install httpd
：httpdインストール
$yum -y install php php-mbstring
：php、php-mbstringインストール
ps)PHP は、オープンソースの汎用スクリプト言語です。 特に、サーバサイドで動作する Web アプリケーションの開発に適しています。php-mbstring、mbstringは拡張モジュールを意味する

$vi /etc/httpd/conf/httpd.confでhttpdの基本的な設定をする
主にやったのはCGI,SSIの許可、.htaccessの許可など。

基本的に自分のVMのIP addressを入力すると、apacheのテストページが見れる
だったらWebは構築された。

今から、やることは、このIp-addressに接続して生じるログをYBIへ自動的に入れるようにしたい！
そのとき、そのログをYBIへ運ぶのがtd agent、fluentd

#####2.fluentd(td-agent)をインストールする！
$ curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-precise.sh | sh
$ sudo td-agent --version
：バージョンの確認

#####3. /etc/td-agent/td-agent.confを編集する
：ここがメイン、生じるログのtailを取ってYBIに送るための設定する

 #Tailing the Apache Log
 ＜source＞
  　　type tail
  　　path /var/log/httpd/access_log
  　　pos_file /var/log/td-agent/httpd-access.pos
  　　tag td.my_db.my_tbl
  　　format apache2
＜/source＞

 #Treasure Data Input and Output
＜match td.*.*＞
  　　type tdlog
  　　endpoint ybi.jp-east.idcfcloud.com
  　　apikey 自分のAPI KEY
  　　auto_create_table
  　　buffer_type file
  　　buffer_path /var/log/td-agent/buffer/td
  　　use_ssl true
＜/match＞

#####*設定ファイルの説明
source
1)sourceはログが溜まる場所の意味
：ログの置き場所をちゃんとちぇっくして入力すること！
2)typeはtailで取って来ます！一番最新のログを取る
3)pos_fileを入力しないと、、
'pos_file PATH' parameter is not set to a 'tail' source.
this parameter is highly recommended to save the position to resume tailing.
とエラーが出る
4)tag td.my_db（データベース名）.my_tbl（テーブル名）
5)format apache2
：apache2形式
match
6)endpointはybi.jp-east.idcfcloud.comを設定する
：YBIのデータはIDCFオブジェクトに保管される
7)apikey 自分のAPI-key
：自分のAPI入力する（自分のアカウントに送るためでしょう）
8)buffer_path
：ログを取って短い間蓄積する場所。その後、ログを送って削除する
9)use_ssl true
：SSL（Secure Sockets Layer）とは、インターネット上で通信を暗号化する技術である

#####4. apache2を起動しよう！
$systemctl start httpd

#####5. td-agentを起動する！起動中なら再起動
$sudo /etc/init.d/td-agent start(restart)

#####6. td-agentの/var/log/httpd/access_logへのアクセス権限を与える
：td-agentはuser権限を持っている
$ls -ld /var/log/httpd
：たぶん、こちから権限がなかった、、ディレクトリから権限あげよう
$ll /var/log/httpd/access_log
：ここにアクセス権限や、読み込み権限がないとだめ！確認するべき
：ファイルにアクセスするためにはX（実行）の権限が必要
$chmod a+rx /var/log/httpd/
：ディレクトリに権限を与える
$chmod a+rx /var/log/httpd/access_log
：ログファイルにアクセスするため全てのユーザに対してこの権限を与える


#####7. 自分のWebにログを残せる
$curl http://localhost

#####8. webログがちゃんと自分のファイルに入っているのか確認しよう、一応確認する
$more /var/log/httpd/access_log
：viよりはmoreで確認するのがいいです。編集したくないなら、、

#####9.YBIのテーブル上にちゃんと入っているのか確認しよう
$td tables

#####10.多分はいっているはずだが、なんか問題があったらtd-agentのログを確認しよう
$more /var/log/td-agent/td-agent.log
GitHub Flow でのリポジトリ運用手順 (Shared repository model)

チーム内の Git リポジトリを GitHub Flow で運用することになったので説明用に手順を書き出してみました。
Fork & pull でない運用モデル ([Shared repository model](https://help.github.com/articles/using-pull-requests/#shared-repository-model)) の想定です。

## 1. git clone \<repository\>

まず、リポジトリをリモートからローカルにクローンします。

```bash
$ git clone hoge
```

## 2. git checkout -b \<topic-branch\> master

次に、作業を行うためトピックブランチを作成しチェックアウトします。
ブランチ名は説明的な名前にします。

```bash
$ git checkout -b new-feature master
```

`-b` はブランチの作成を同時に行うためのオプションで、以下のコマンドと同じ挙動になります。

```bash
$ git branch new-feature  # ブランチの作成
$ git checkout new-feature  # ブランチのチェックアウト
```

## 3. Edit files

ファイルの修正を行います。

## 4. git add

修正したファイルをステージングエリアに追加します。

```bash
$ git add -A
```

`-A` で追加、修正、削除したすべてのファイルがステージングされます。

## 5. git commit -m \<msg\>

コミットします。

```bash
$ git commit -m 'Add a new feature'
```

## 6. git checkout master

トピックブランチでの作業が終わったので master をチェックアウトします。

```bash
$ git checkout master
```

## 7. git pull origin master

`pull` して master を最新化します。

```bash
$ git pull origin master
```

## 8. git checkout \<topic-branch\>

再度トピックブランチをチェックアウト。

```bash
$ git checkout new-feature
```

## 9. git rebase master

master でリベースします。

```bash
$ git rebase master
```

自動マージできた場合は以下のようなメッセージが出力されます。次のステップに進みましょう。

```bash
First, rewinding head to replay your work on top of it...
Applying: Add a new feature
```

自動マージに失敗した場合はコンフリクトした旨が表示されます。

```bash
First, rewinding head to replay your work on top of it...
Applying: Change a message
Using index info to reconstruct a base tree...
M       main.go
Falling back to patching base and 3-way merge...
Auto-merging main.go
CONFLICT (content): Merge conflict in main.go
Failed to merge in the changes.
Patch failed at 0001 Change a message
The copy of the patch that failed is found in:
   /hoge/.git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
```

main.go でコンフリクトが起きているようです。

```
CONFLICT (content): Merge conflict in main.go
```

ファイルを修正したら `git add` して `git rebase --continue` でリベースを完了します。

## 10. git push origin \<topic-branch\>

リベースし終わったトピックブランチをリモートにプッシュします。

```bash
$ git push origin new-feature
```

## 11. Create pull request on GitHub

プッシュしたことで GitHub のリポジトリに *Your recently pushed branches* としてトピックブランチが表示されているはずです。 

![1_mini.jpg](https://qiita-image-store.s3.amazonaws.com/0/83093/b0acbf2d-f801-8773-004a-c66994a0e637.jpeg)

`Compare & pull request` を選択します。

![2_mini.jpg](https://qiita-image-store.s3.amazonaws.com/0/83093/a1fd3f4a-dbe9-46d4-c5ec-3df1082ca6b9.jpeg)

プルリクエストの作成画面に遷移するので、必要であればコメントや Asignee (レビュアーのアサイン) を入力して `Create pull request` を選択。

![3_mini.jpg](https://qiita-image-store.s3.amazonaws.com/0/83093/e5a58146-338f-751d-e4bb-938d4456b9d6.jpeg)

プルリクエストが作成されました。レビュアーからのアクション (マージかリジェクト) されるのを待ちます。
[Android]apkから証明書のfingerprintを表示する

Androidの署名済みapkからfingerprintを表示したくて調べたことをメモしておきます。

`jarsigner -verify`で取り出した証明書のCAで判別できればいいのですが、そうではない場合や、GCMやfacebookのAPIなどに登録したい場合に証明書のfingerprintを表示したいと思うので調べました。

↓こんなのが表示したいです。

```
     MD5:  B3:4F:BE:07:AA:78:24:DC:CA:92:36:FF:AE:8C:17:DB
     SHA1: 16:59:E7:E3:0C:AA:7A:0D:F2:0D:05:20:12:A8:85:0B:32:C5:4F:68
     Signature algorithm name: SHA1withRSA
```

## keystoreから取り出す場合

```
keytool -list -keystore my-signing-key.keystore
```

署名前などわかっている場合はkeytoolで普通に確認できます。
通常はこれで十分なはずです。

## apkから取り出す場合
### Java7以上なら

```
keytool -list -printcert -jarfile app.apk
```

### Java6以下なら

`-jarfile`というオプションがJava7環境からしか使えないようなので、それ以前の場合はapkファイルをunzipして.RSAファイルを取り出して以下を行います。

.RSAファイルはビルド環境などによるかと思いますが、`META-INF/CERT.RSA`などにあるかと思います。

```
keytool -printcert -file ANDROID_.RSA
```

## 参考(元ネタ)

[How to find out which key was used to sign an app?](http://stackoverflow.com/questions/11331469/how-to-find-out-which-key-was-used-to-sign-an-app)
ActiveAdminで日付＋時刻検索する

悶絶したのでメモ。DBはPostgresです

例えばcreated_atのようにtimestampsのフィールドを日付と時刻それぞれで条件かけて検索したい場合を考える。

```.rb
filter :created_at
```

↑の書き方だとデータ型のおかげでdate_rangeであることは認識してくれるがこれだけだと時刻で検索ができない。
考え方としては、

- 日付と時刻を別々にfilterすることを考える
- 日付・時刻検索用のRansackerを定義する
- filterにRansackerを適用する

というアプローチが必要になる。

```model.rb
  ransacker :created_date do
    Arel.sql("to_char(created_at, 'YYYY-MM-DD')")
  end

  ransacker :created_time do
    Arel.sql("to_char(created_at, 'HH24-MI-SS')")
  end
```

↑モデルにransackerを定義する。
ransackerは検索条件が複雑な場合や、もともとカラムに入っていないものを検索したい場合に定義するとよいとのこと。この場合はcreated_dateとcreated_timeで日付と時刻を別々に定義する。
ちなみに、ブロックの中はArelで書かなければならないらしい。試しにsqueelで書いたら動作しなかった。

```activeadmin_model.rb
#created_times = -> { 日付の文字列形式の配列を返す }

filter :created_date, label: "作成日付", as: :date_range
filter :created_time_gteq, label: "作成時刻（最小）", as: :select, collection: created_times
filter :created_time_lteq, label: "作成時刻（最大）", as: :select, collection: created_times
```

↑ActiveAdmin側の例。日付に関してはcreated_dateのfilterで同名のransackerを引っ張ってきてdate_rangeの形で表示する。

時刻のフィルタリングに関しては`created_time_gteq`と`created_time_lteq`の2つのフィルターで範囲を定義する。
`created_time_gteq`のfilterはプルダウンの表示項目にはcreated_timesという名前でラムダ式を使用している。
マスターから引っ張ってくるなりRubyでロジック書くなりして"0:00"から"23:30"までの文字列を配列で返す式を書けば良い。
プルダウンの値はフィルタリングする際の検索条件になる。
この場合`created_time_gteq`のプルダウンに`"8:00"`と書けばモデルの検索条件に`created_time >= '8:00'`が追加される。もちろん、created_timeの定義はransackerから与えられて勝手に補ってくれる。
filter名の接尾辞で検索条件を指定できる。この場合gteqで≧、lteqで≦であり、他にもパターンがありそう。

このフィルターを使うと以下のようなSQLが発行される。

```.sql
SELECT  "tables".* FROM "tables" 
WHERE  (to_char(created_at, 'YYYY-MM-DD') >= '2015-06-01' 
AND to_char(created_at, 'YYYY-MM-DD') <= '2015-07-01' 
AND to_char(created_at, 'HH24-MI-SS') >= '04:30' 
AND to_char(created_at, 'HH24-MI-SS') <= '08:30')  
ORDER BY "tables"."id" desc LIMIT 30 OFFSET 0
```

ransackerは作りがかなりメタいうえにfilterとどう関連づくのかを理解するのが大変だった。ドキュメントの記述がいまいち理解できなかったため試行錯誤で強引に辿り着いたところがある。

公式にも様々な例があり、複雑なのでちょっと目を通しただけだとわけわからないが使いこなすと色々できそうである。

https://github.com/activerecord-hackery/ransack/wiki/Using-Ransackers
UIButtonの文字列の取得方法

```lang:swift
self.myButton.currentTitle
```

titleLabelプロパティとか、そのあたりから取得できるのかと思ってたら
全然違うかったorz

ちなみに文字列の設定はこれ

```lang:swift
self.myButton.setTitle("ボタン文字列", forState: UIControlState.Normal)
```
windows > 日付と時刻設定画面 > インターネット時刻タブが表示されない > Active Directory参加中は表示されない

http://d.hatena.ne.jp/replication/20130813/1376320313

> Active Directoryに参加するとインターネット時刻タブは表示されない。

知らずに日付と時刻設定画面を探しても、該当タブが見つからず、時間を浪費した。
ドラッグされた画像をcanvasでリサイズする

# ドラッグされた画像をcanvasでリサイズする

クライアント側だけで画像をリサイズするやつ。

`Chromium 43.0.2357.130 Ubuntu 14.04 (64-bit)` で試した。
chromeでもたぶん大丈夫。

* (1) `data uri scheme`
* (2) `Image`
* (3) `canvas`
* (4) `data uri scheme`
* (5) `Image`

の流れ。

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

  <script type="text/javascript">

$(function() {
  var droppable = $("#droppable");

  droppable
    .bind("dragenter", function(e) { return false; })
    .bind("dragover", function(e) { return false; })
    .bind("drop", function(e) {
      droppable.empty();

      var file = e.originalEvent.dataTransfer.files[0];   // 最初のファイル

      var fileReader = new FileReader();
      fileReader.onload = function(e) {
        var img = new Image();
        img.src = e.target.result;  // (1), (2)

        var canvas = document.createElement("canvas");

        var imgs = _.map([
          // width, height
          [100, 200],
          [200, 300],
          [300, 150],
          [1500, 1500],
        ], function (size) {
          canvas.width  = size[0];
          canvas.height = size[1];
          var ctx = canvas.getContext("2d");
          ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);  // (3)
          var data = ctx.canvas.toDataURL();   // (4)

          var img2 = new Image();
          img2.src = data;  // (5)
          return img2;
        });

        droppable.append(imgs);
      }
      fileReader.readAsDataURL(file);

      return false;
    });
});

  </script>
</head>

<body>
  <div id="droppable" style="border: gray solid 1em; padding: 2em;"></div>
</body>
</html>
```
サルでもできるCodeCommit コピペでgit cloneするまで

# CodeCommitにリポジトリを作成

1. バージニアリージョンでCodeCommitにアクセス→Get Started->リポジトリ名：sample_ripoを入力

# リポジトリにアクセス出来るIAMユーザを作る

1. IAMユーザ:codecommitを作成してアクセスキーID:XXXとシークレットアクセスキー:YYYをメモる。
1. ポリシーのアタッチ→検索窓にcodecommitと入力→ポリシータイプ:AWSCodeCommitFullAccessを選択

# ec2インスタンスにログインして、リポジトリにアクセスする

1. ec2にec2-userでログインした後に初期設定をするスクリプト init_codecommit.shを作成して実行します。
 
```file:init_codecommit.sh
#!/bin/bash

# aws cliを最新にアップデート
sudo pip install --upgrade awscli

# aws cliのconfig設定をします
mkdir ~/.aws
cat <<\_EOT_ > ~/.aws/config
[default]
region = us-east-1
_EOT_

# XXX,YYYはIAMユーザのID
cat <<\_EOT_ > ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
_EOT_

# gitのconfigを設定。name,email,aliasは各自の設定してください
# 以下のコマンドで設定するのと同じ事を記述
# git config --global user.name "ec2-user"
# git config --global user.email ec2-user@example.com
# git config --global credential.helper '!aws codecommit credential-helper $@'
# git config --global credential.UseHttpPath true

cat <<\_EOT_ > ~/.gitconfig
[user]
  name = ec2-user
  email = ec2-user@example.com
[credential]
  helper = !aws codecommit credential-helper $@
  UseHttpPath = true
[alias]
  co = checkout
  cm = commit
  ce = commit -v --amend
  st = status
  ss = status --branch --short
  si = status --ignored --short
  br = branch
  branches = branch -a
  remotes = remote -v
  tags = tag -l
  lg = log --graph --all --decorate --abbrev-commit --branches --date=short --pretty=format:\"%C(red)%h%C(reset) %C(green)[%ad]%C(res
et) %s %C(cyan)@%an%C(reset) %C(yellow)%d%C(reset)\"
  fp = fetch --prune
  dh = diff --histogram
  dw = diff --word-diff
  dc = diff --cached
  wc = whatchanged
[push]
  default = current
_EOT_

# testリポジトリをcloneしてみる
git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/sample_ripo ~/samlpe_ripo
```

* git リポジトリが使えるか軽く確認

```
リポジトリのディレクトリ確認
$ ls

移動
$ cd test_ripo

ステータス
$ git status

hogeファイルを作成
$ echo hoge > hoge

ステータス確認
$ git status

hogeファイルを追加
$ git add hoge

hogeファイルをコミット
$ git commit -m 'add hoge'

ログ表示
$ git log

りモートリポジトリへプッシュ
$ git push origin master
```

無事にgitが動いていれば成功だね！

# 関連するページ
[サルでもできるCodeCommit ssh接続でgit cloneするまで](http://qiita.com/shojimotio/items/8e5f9e0616bb5a67275d)
squidで特定のサイトでタイムアウトする問題

#squidでgoolgeが見れない
でもyahoo.co.jpは見れる。
こんな事象に陥ったのならsquidのversionを3.1.16以上に上げよう。

##原因はDNS
squidは独自にDNSに問い合わせてる
しかもデフォでIPv6のDNSを先に求める
そしてIPv6の環境を整えていないサーバだとこのDNS結果に答えることが出来ずにタイムアウトしてしまう

##rpmでインストール
はじめに今まで使っていたsquidのconfgを別な場所にバックアップ
squidをyumでインストールしていた人はアンインストール
そのあとrpmをDLしてインストールする(自分に環境にあったRPMはここから探すhttp://rpmfind.net/linux/rpm2html/search.php?query=chromium)
作業は全てrootで行う

```bash
cp /etc/squid/squid.conf ~/squid.conf.bac
/etc/rc.d/init.d/squid stop
yum remove squid
wget ftp://rpmfind.net/linux/sourceforge/a/an/angelimus/squid-3.5.5-1.el6.x86_64.rpm
rpm -ivh  squid-3.5.5-1.el6.x86_64.rpm
```
コンフィグの設定

```bash
vim /etc/squid/squid.conf

#以下の設定を追加
dns_v4_first on

```
自動起動設定とcacheクリア

```bash
chkconfig --level 35 squid on
chkconfig --list squid
squid -z
/etc/rc.d/init.d/squid start

```

この時起動に失敗する
その場合は失敗している箇所を全てコメントアウトすると動くはず

```bash
#acl manager
#acl localhost
#acl to_localhost
```

---

追記2017年3月15日

##openvz環境で新たに構築しようとしたら死んだ

logを追う

```
2017/03/15 15:53:21.557| storeDirWriteCleanLogs: Starting...
2017/03/15 15:53:21.557|   Finished.  Wrote 0 entries.
2017/03/15 15:53:21.557|   Took 0.00 seconds (  0.00 entries/sec).
FATAL: Ipc::Mem::Segment::create failed to shm_open(/squid-cf__metadata.shm): (13) Permission denied

```

##原因究明

```
# ll /dev/shm/
合計 0
```

~~だいたいデバイスやメモリ系のエラーはコンテナ形のVPSのせいと言う固定観念のせいで解決が手間取る~~

##解決

```
# df
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/simfs     209552532 165507240  33559740  84% /
none             1048576         4   1048572   1% /dev
#
# umount /dev/shm
umount: /dev/shm: マウントされていません
#
# mount -t tmpfs -o size=384m tmpfs /dev/shm
#
# ls -ld /dev/shm
drwxrwxrwt 2 root root 40  3月 15 15:57 2017 /dev/shm
#
# df
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/simfs     209552532 165507240  33559740  84% /
none             1048576         4   1048572   1% /dev
tmpfs             393216         0    393216   0% /dev/shm
#
#
# squid -z
2017/03/15 15:58:23| Squid is already running!  Process ID 898


```

どうも`/dev/shm`がないとコケるらしい
[tmlib.js] strictモードでクラス作るとエラーになる対策

# ダメな例
[runstant](http://goo.gl/6odAHP)
superInitでエラーが出ます。('use strict'をなくせば動きます)

# 改造
tm.createClassをこのように書き換えてください。

```js

tm.createClass = (function(){

    var superInit = function () {
        this._classTree[this._initCount++]
            .prototype
            .init
            .apply(this, arguments);
    }; 
    return function(prop) {
        // デフォルト値
        prop.init = prop.init || function() {};
        prop.superClass = prop.superClass || null;
    
        // クラス作成
        var tm_class = function() {
            var temp = new tm_class.prototype.creator();
            tm_class.prototype.init.apply(temp, arguments);
            return temp
        };
        prop._initCount = 0;

        var _classTree = {
            0: prop.superClass || Object,
        };
        for (var i = 0, temp; temp = _classTree[i].prototype.superClass;) {
            _classTree[++i] = temp;
        }
        prop._classTree = _classTree;
    
        // 継承
        if (prop.superClass) {
            prop.init.owner = tm_class;
            tm_class.prototype = Object.create(prop.superClass.prototype);
            tm_class.prototype.superInit = superInit;
            
            tm_class.prototype.constructor = tm_class;
        }
    
        tm_class.prototype.selfClass = tm_class;
    
        // プロパティを追加
        for (var key in prop) {
            tm_class.prototype[key] = prop[key];
        }
    
        // クリエイタの生成
        tm_class.prototype.creator = function() { return this; };
        // クリエイタの継承
        tm_class.prototype.creator.prototype = tm_class.prototype;
    
        tm_class._class = true;
    
        return tm_class;
    };
})();
```

これでできます。
[runstant](http://goo.gl/BpEjft)

# 注意
検証していませんが、プログラム的に、
tm.defineを使って文字列でsuperClassを指定するときに、superClassがその時点で未定義だと、うまく動きません。
DeepDream のローカル実行環境をさくっと構築させてもらった


以下を使用。自分では何もイチから作ってません。
[Dhar/image-dreamer](https://github.com/Dhar/image-dreamer)

README.md のInstallとUsageの通りにやれば超簡単。
ただし、新しいMacBookとか、スペックが強くないマシンではつらい可能性があります。
VirtualBoxとVagrantはあらかじめインストールしておく。
以下、Vagrant+VirtualBoxを使用し、他にVagrantで仮想マシンを起動していなくてローカルのポート2222が未使用の想定。
InstallとUsageを参考にした手順。

```Shell
cd
git clone https://github.com/Dhar/image-dreamer.git
cd image-dreamer
vi Vagrantfile # 必要ならv.memoryの値に入っているメモリサイズを変更する。
vagrant up # caffe のビルドに数十分かかると思うので、ここで放置する。
# 夢を見させたい画像をコピーしてくる
cp -p ~/test.jpg ~/image-dreamer/
# 仮想マシンに入る
ssh vagrant@127.0.0.1 -p 2222 -i .vagrant/machines/default/virtualbox/private_key
# ホストとの共有ディレクトリに移動。画像がコピーされている。
cd /vagrant/
# 実行
ipython dreamify.py test.jpg test_dreamed.jpg
# enjoy!
exit
open test.jpg test_dreamed.jpg
```

注意点としては、初期の仮想環境メモリ割り当てが2GBなので、あまり大きいサイズの画像を dreamify しようとすると、途中でプロセスが落ちる。
8GBほどメモリを割り当てても、フルHDくらいの画像で精一杯ではないでしょうか。メモリ重要。

いろいろな画像を試してみた結果、
陸の物より海産物(明太子とかホヤとか)、
フラットなやつより色数が多い画像、
屋外風景より室内風景(洋館画像がホラーっぽくなる)、
が良い感じに悪夢見てるようです。
もともとかなりフラクタルっぽいやつはドラスティックな変化は多くない、という印象です。
CakePHP 3.xをGAE/PHPで使う

CakePHP 3.0.8で確認しました。

## app.yaml

CakePHP 2.xとほぼ同じです。

```yaml:app.yaml
application: <プロジェクト名>
version: 1
runtime: php55
api_version: 1
threadsafe: true

skip_files:
- ^(.*/)?composer\.(phar|lock|json)$

handlers:
- url: /css
  static_dir: webroot/css

- url: /img
  static_dir: webroot/img

- url: /js
  static_dir: webroot/js

- url: /favicon.ico
  static_files: webroot/favicon.ico
  upload: webroot/favicon.ico

- url: /.*
  script: webroot/index.php
```

## php.ini

```ini:php.ini
google_app_engine.enable_functions = "php_sapi_name"
extension = "intl.so"
```

intl.soはドキュメントには記載がありませんが(2015/7/14現在)、機能拡張として読み込み可能です。
https://code.google.com/p/googleappengine/issues/detail?id=10080

## config/app.php

### キャッシュ

キャッシュの保管先を、FileからMemcachedに変更する。

```php
    'Cache' => [
        'default' => [
            'className' => 'Memcached',
        ],

        '_cake_core_' => [
            'className' => 'Memcached',
            'prefix' => 'myapp_cake_core_',
            'duration' => '+2 minutes',
        ],

        '_cake_model_' => [
            'className' => 'Memcached',
            'prefix' => 'myapp_cake_model_',
            'duration' => '+2 minutes',
        ],
    ],
```

### データベース

hostを削除し、unix_socketを追加。
GAEからDB接続する場合のusernameはroot固定です。

```php
    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'unix_socket' => '/cloudsql/<インスタンスID>',
            'username' => 'root',
            'password' => '',
            'database' => '<データベース名>',
            'encoding' => 'utf8',
            'timezone' => '+09:00',
            'cacheMetadata' => true,
        ],
    ],
```

### ログ

classNameをFileLogからSyslogLogに変更。
これでGAEのログビューアでログを確認できます。

```php
    'Log' => [
        'debug' => [
            'className' => 'Cake\Log\Engine\SyslogLog',
            'prefix' => 'debug',
            'levels' => ['notice', 'info', 'debug'],
        ],
        'error' => [
            'className' => 'Cake\Log\Engine\SyslogLog',
            'prefix' => 'error',
            'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
        ],
    ],
```


## 注意点

### composer.jsonのrequireにgoogle/appengine-php-sdkを入れてはいけない

AppEndine PHP SDKはGAEのインスタンス起動時に自動読み込みされるので、composer.jsonに含めてはいけません。入れてしまうと以下のエラーが出て止まります。

    PHP Fatal error:  Cannot redeclare class google\appengine\runtime\ClassLoader
MiddlemanにBourbonを突っ込んで、高速でティザー・静的サイトを作る

新規[Middleman]('https://middlemanapp.com/jp/')プロジェクトを立ち上げて、話題の[Bourbon]('http://bourbon.io/'), [Neat]('http://neat.bourbon.io/'), [Bitters]('http://bitters.bourbon.io/'),[Refills]('http://refills.bourbon.io/')を導入したら革命的だった。

## 導入背景

最近、高速でティザーサイトをアップして間髪入れずに大量の静的ページを作成するっていう無茶な案件が多い。

デザイン提案からリリースまで弾丸速度で、コンテンツが後手にまわりやすい案件だと、後工程のコーディングがマジでしんどい。WordPressやBootstrapも悪くないけど、運用的なことを考えると属人的になりがちで、何よりHTMLがスパゲッチになる。いっその事、静的サイトジェネレーター＋フレームワークで、インブラウザデザインの型にはめてしまえば楽なんじゃね？...ってのが発端

> *開発の速さで、お客様や営業のド肝を抜いてやろうじゃないか。：D*

本当に大事な部分（広告戦略）にリソースを費やせるなら、きっとみんな幸せだよ。


## MidlemanとBourbon Projectのインストール


### ＜手順＞

#### 1. 作りかけの、サイトのディレクトリをプロジェクト化

任意のプロジェクトに cd ｓし、以下を実行

```
$ middleman init
```

config.rbとか、sourceとかのfileができていたらOK

#### 2. Gemfileを編集してインストールの準備

```lang:Gemfile

# For css.scss
gem 'bourbon'
gem 'neat'
gem 'bitters'
gem "refills", require: false

```
※ `require: false`がないと怒られる。

#### 3. 必要なgemをインストール

```
$ bundle install
```

#### 4. 指定のhtml,cssに[refills]('http://refills.bourbon.io/')のsampleコードをコピペ
※css→scssにするのを忘れずに

##### 5. scssにborrbonのstyleを呼び出す `@import` を追記

```lang:sample.css.scss

@import 'bourbon';
@import 'neat';
body {
}

```
#### 6. テストでコンパイル

```
$ midleman build
```

#### 7. 確認
buildディレクトリに展開されたcssができていれば成功


## Refillesがやばい

* イマドキの「よくあるやつ」がほぼ揃ってる
* 手作りだと面倒くさいレスポンシブが全部適用される
* サンプルのimgを差し替えるだけでそれっぽいサイトができる

## 実現できること

* インブラウザデザイン
 * ワイヤーフレーム＋デザインカンプ+コンテンツ発注が同時並行
 * 修正に強い→デザイン・コーディングがパラレルで回せる
 * そのままコンテンツを流し込めるので誤植・修正が楽

## 更に効率化

* Slim化
 * html → erb → slim で直してしまえばほぼマークアップ不要
 * リテラシーの低い営業やクライアントにもとりあえずコピペで使えるプレーンなテキストを用意してもらえればOK。
* minifyhtml,optimagesでfileの圧縮を自動化
* 内部関係者→ngrok　外部関係者→heroku stagingで確認依頼

***

# まとめ

かなりライフチェンジング！スピードはモチベーションアップに繋がるとしみじみ。

作業ののスピードが上がらないと、いろんな「信用」がなくなることありますよね。通る案も通らなくなったり、満足度につながらない。

何にせよ、作り手が、後手に回って全く良いことはないので、「例のアレ」ってやつを早く提示してあげるのが、プロジェクト全体の進捗をスムーズにするコツなのかなーと最近思う。

---

# 2017/11/30追記（振り返り）

### middlemanのアップデート→要件規模に対してのツールの適正を考える
middlemanがAsset pipeline非採用になったのでかなり弁が悪くなり。
諸々のアップデートが追いつかなくなってきたので、静的なサイト作るだけならnuxt.jsに移管することが増えた。

正直ツールのアップデートをリアルタイムで追うことが難しい。作って終わりの案件を除き、運用性を考えるならある程度普遍的な技術を採用する必要がある。

### フレームワークへの依存性はよくない
そうするとBourbonに頼っていた部分が、セットアップ面かなり障害になってきたので、更新性を求めるサイトに関しては、その工程を鑑みた事前設計が大事だったなとしみじみ。

複数人への作業分担・引き継ぎ、自分自身がPC乗り換えた際のmiddlemanとBourbonのセットアップ、ここらへんでつまずく。

CSS周りの移管は苦労する。

学習曲線的にはかなりストレスだし、突発的にやすやすと対応できるものではなかったのでしんどかった。

### 現時点での総括
案件自体の事前設計やスケールの予測は重要である。

フェーズに応じて技術の選定を行うべき。その際は、移管する際の設計（引き継ぎやチーム規模、習熟度など）を考慮する。

ミニマルスタートで後の運用性を考えるとnuxtが最近イケてる。nuxtというよりvue.jsか。
日本の野球選手の出身高校を列挙するクエリの例

http://ja.dbpedia.org/sparql

```
PREFIX dbp-owl: <http://dbpedia.org/ontology/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dbpprop-ja: <http://ja.dbpedia.org/property/>
PREFIX dbp-category: <http://ja.dbpedia.org/resource/Category:>
PREFIX dbp-template: <http://ja.dbpedia.org/resource/Template:>

select distinct ?label ?team_label
where {

    #対象は日本人の野球選手
    {
        ?person dcterms:subject dbp-category:日本の野球選手 .
    } union {
        ?person dcterms:subject dbp-category:MLBの日本人選手 .
    } union {
        ?person dcterms:subject dbp-category:在日外国人の野球選手 .
    } union {
        ?person dcterms:subject dbp-category:日系人の野球選手 .
    }


    ?person rdfs:label ?label ;
        dbp-owl:team ?team.
    # リダイレクトページの可能性を疑う
    {
        ?team dbp-owl:wikiPageRedirects ?redirects .
        ?redirects dbpprop-ja:wikiPageUsesTemplate dbp-template:日本の高等学校 ;
            rdfs:label ?team_label .
    } union {
        ?team dbpprop-ja:wikiPageUsesTemplate dbp-template:日本の高等学校 ;
            rdfs:label ?team_label .
    }
}
```

http://innen-search.com/
Git で untracked のものだけ削除する方法　

IntelliJ で開発をしていて、TypeScript をトランスパイルするプラグインが動いきました。それによって無駄な JS と map の untracked ができてしまったのでプラグインを止めました。しかしこれらの untracked のファイルだけを消したかったのでいろいろと調べたら以下の方法で解決出来ました。

```
$ git clean -f
```

http://stackoverflow.com/a/64966/2248060
YBIのバルクインポート（CGV,Mysql）

既存のデータをアップロードするときに使用するアップロード
サポートする形式としては、CSV,TSV,JSON,Mysql

###やること
1.CSVファイルのバルクインポート
2.Mysqlからのバルクインポート

###1.CSVからのバルクインポート
####●前提条件
#####JAVAでの実行環境が必要
:バルクインポートの処理は高速化のため、JAVAで実装されている

$yum search openjdk(javaがあるのか確認）
$yum install java -1.7.0 -openjdk
$yum install java -1.7.0 -openjdk -devel（開発者用）
$java -version (version確認）

#####1.YBI account ログイン
$td account -f

#####2.DB作成
$td db:create my_db（データベース名）

#####3.テーブル作成
$td table:create my_db（データベース名） my_tbl（テーブル名）


#####4.ローカル環境のファイルを自分のVMに伝送する
（自分のVM上にCSVのファイルがないから、、、）
$scp /Users/N1504A009/Downloads/1065542\ \(1\).csv root@**.***.**.***:/home/dir1

ps)scpコマンド使用
$scp [オプション] コピー元 コピー先
ipアドレスとコピー先ディレクトリの間は、コロン「:」で区切る

#####5.いよいよCSVのバルクインポートする！

$td import:auto --format csv --auto-create apache_sample.access --parallel 8 --prepare-parallel 8 --column-header -o ./dir --time-column 'time' --time-format "%Y-%m-%d %H:%M:%S" ./temp

#####*コマンドの意味
1)import:auto
：TD-CLIのアップロードにはいくつかのステップがありautoオプションを指定することでその全てのステップを自動的に実行してくれる。
2)format csv(形式）
：ファイルの形式を書く。TSVならTSV,mysqlならmysqlなど
3)　--auto-create
：データを置く場所の指定？調べる必要ある
4) --parallel 8
；データアプロードの並行スレッド数
5) --prepare-parallel 8
：データをMessagePack形式に加工する際の並行スレッド数
6)　--column-header
：TreasureData上でのカラム名をアップロード対象ファイルの一行目の値を利用するように指定する。
7)  -o ./dir 
：MessagePack形式ファイルの出力先Directory
8)　--time-column 'time'
：自分のデータのtime columnを指定すること
ps)YBIは時系列のデータを分析するための分析エンジン、この指定は必須である！
　　YBIは時系列のデータのtime column部分を取って、（indexがつけられるため）高速に分析できる
　　IoT時代では、時系列のデータは重要になる
9)　--time-format "%Y-%m-%d %H:%M:%S"
：指定した時刻カラムのフォーマット
10) ./temp
：アップロードの対象ファイル　　

#####*注意する点
1.自分がアップロードするファイルの位置をちゃんと把握するして絶対パスや相対パスを指定すること
2.結果を排出するディレクトリを指定すること

###2.mysqlからのバルクインポート

####●前提条件
−mysqlクライアントを実行してデータをインポート済であること！
$mysql -u root -ppassword < sample.dump

#####1.上記と流れは一緒
YBIログイン→DB作成→テーブル作成
今回の場合　DB:my_db
          Table:my_tbl
          format:mysql

#####2.mysqlからバルクインポート！

$td import:auto --auto-create my_db.my_tbl --format mysql --db-url jdbc:mysql://localhost/sample --db-user root --db-password '******' --time-value 1436770937 sample21

#####*コマンドの意味
1)　--format mysql
:mysql形式のデータ
ここからのコマンドはmysql上のDBに接続するために！探せるように指定すること
2) --db-url jdbc:mysql://localhost/sample
:自分のVM上でアップロードする場合localhostで登録すること、IPアドレスでもいい、ホスト名でもいい
:jdbcはJava とリレーショナルデータベースの接続のためのAPIする。ここではjdbcを通じて私のmysqlに接続する事を意味する
:/sampleは自分のmysql上にあるDBの名前！
3)--db user root
:ここでuser名はrootであるから
4)--db-password '*******'
:mysqlに入るためのパスワード
5)--time-value
:YBIは時系列データだから元々は--time-column date_timeを入れるべき！しかし、自分のtableはtime columnがないから--time-valueを入れた（timeカラムがない場合こうする）また、数値としては、
コマンド使ってUNIX時間を取得して入力すること
ps)$date +%s
6)sample21
最後はmysql上にあるDBにあるテーブル名（一つ選んで入力した）


以上！
Ubuntu 環境で sSMTP を利用して Gmail を送信してみる

# Ubuntu 環境で sSMTP を利用して Gmail を送信してみる


## 手順

### インストール

```bash

sudo apt-get install ssmtp

```

### 認証設定

```bash

sudo vi /etc/ssmtp/ssmtp.conf

# 下記追記 or 変更
root=hoge@gmail.com
mailhub=smtp.gmail.com:587
rewriteDomain=gmail.com
hostname=gmail.com
AuthUser=hoge@gmail.com
AuthPass=password
AuthMethod=LOGIN
UseSTARTTLS=YES
FromLineOverride=YES
```

### テストメール送信

以下の内容のファイルを作成

```bash:test-mail

To:hoge@gmail.com
From:hoge@gmail.com
Subject:test-mail

test-mail

```

送信

```bash

sudo /usr/sbin/sendmail -t < test-mail

```
phpPgAdmin操作で躓いたところ

自分用の備忘録。随時追加予定

# テーブル作成時
### Q.データ型左セレクトボックスにvarcharが無い！
A.character varyingでvarcharと同じ意味になる。
参考：[PostgreSQL のデータ型](http://lets.postgresql.jp/documents/technical/text-processing/1)
### Q.データ型右セレクトボックスの[]ってなんぞ？
A. []を選択すると配列になるらしい
参考：[phpPgAdminでのテーブルやカラムの操作メモ](http://kayakuguri.github.io/blog/2013/12/18/phppgadmin-memo/)
Railsで多対多関連先のテーブルのカラムを指定する方法


調べてみたところ、見当たらなかったので個人的メモも兼ねて書きました。

特に、多対多関連先のテーブルのカラムを条件に指定してwhereしたい場合についての記述がなかったので、個人的に詰まりました。

ActiveRecordで多対多のアソシエーションを結ぶには`has_many_and_belongs_to`と`has_many :through`の２つの方法がありますが、今回は`has_many :through`で確認しているので、`has_many_and_belong_to`で同じように動くかは分かりません。

## Modelの定義

Modelを以下のように定義します。

```ruby
# app/models/order.rb
class Order < ActiveRecord::Base
  has_many :customers_orders
  has_many :customers, through: :custormers_orders
end

# app/models/customer.rb
class Customer < ActiveRecord::Base
  has_many :customers_orders
  has_many :orders, through: :custormers_orders
end

# app/models/customers_order.rb
class CustomersOrder < ActiveRecord::Base
  belongs_to :customer
  belongs_to :order
end
```

ordersとcustomersが多対多関連で、中間テーブルとしてcustomers_ordersがあります。

## 多対多関連先のテーブルの値を指定して一緒に保存したい場合

保存する場合は`customer_ids: [1, 2]`という指定ができ、簡単に指定ができます。

customer_idが1, 2のデータをインサートする。

```ruby
> Order.create(customer_ids: [1, 2])
```

## 多対多関連先のテーブルのカラムを条件文に指定してデータを取得する場合

取得する場合は、`customer_ids: [1, 2]`といった指定の仕方はできませんので、以下のような書き方になります。

customer_idが1の時のorderを取得する。

```ruby
> order = Order.includes(:customers).where(customer: { id: 1 })
```