OmniAICreator/Qiita-1.07M huggingface dataset:
tmuxの色(が256色じゃなくて？)おかしくなるのを直した

### 環境

```
$ cat /etc/redhat-release 
CentOS release 6.4 (Final)

$ echo $TERM
xterm

$ tmux
$ cho $TERM
screen


```

vimで * colorscheme molokai * を利用。

結果... 白い。
![fff7b11dd55cc8912076284606feecf1.png](https://qiita-image-store.s3.amazonaws.com/0/25772/2b96e80c-2531-435f-6e96-54a3841cb928.png)

### 解決策？

実行時に-2を付ける。
しかし、毎回これを付けるのは面倒だ。

```

$ tmux -2

```
### 解決策

TERMの設定を変更することで解決

```shell-session:.bashrc

echo "export TERM=xterm-256color" >> .bashrc

```

綺麗に表示できた。


![e5d215b25ff35f401131781a51543198.png](https://qiita-image-store.s3.amazonaws.com/0/25772/211e8047-1788-9b74-89af-0bd7dea9465f.png)
SwiftでCoreGraphicsを使うときにちょっとハマった型変換



### DoubleとCGFloat

CoreGraphicsで定義されている変数やメソッドはCGFloatを利用することが多いので注意が必要になります。

ラジアンと度数の変換によく利用するM_PIなどの定数はDouble型で定義されているので、利用する際にCGFloatにする場合にはコンバージョンが必要になります。

```Swift
let endAngle:CGFloat =  CGFloat(2.0 * M_PI)
```


またObjective-Cで以下のように書いていた場合も、Swiftに移植する場合はfloorfではなくfloorを使いDoubleからCGFloatにコンバージョンするのが良さそうです。

```objc
_timerElementRect = CGRectInset(self.bounds, floorf(0.18 * frame.size.width),  floorf(0.18 * frame.size.height))
```
Objective-Cではfloorfを使っていますが、SwiftではDouble型を引数にしているfloorやceilを利用したほうが便利です。

```Swift
self.timerElementRect = CGRectInset(self.bounds, CGFloat(floor(0.18 * frame.size.width)),  CGFloat(floor(0.18 * frame.size.height)))
```

### UIColorとCGColor

CAShapeLayerのfillColorプロパティはCGColorにする必要があるので、下記のようにします。

```objc
self.minorShapeLayer.fillColor = [[UIColor clearColor] CGColor];
```

<del> [UIColor-Hex-Swift](https://github.com/yeahdongcn/UIColor-Hex-Swift)を利用すると下記のようになります。</del>
Objective-Cと同様に、UIColorからCGColorに変換できます。

```Swift
self.minorShapeLayer.fillColor = UIColor.clearColor().CGColor
```
CentOSでmysqlからmariadbに移行する際に気をつける事


mariadbはmysqlからforkしたプロジェクトだというのはご存知かと思いますが、mysqlとmariadbは同時には入りませんのでmariadbを入れたい場合はmysqlを削除してmariadbを入れる事になります。

具体的に言うと`mysql-libs`というパッケージを消さないとmariadbは入らない訳です。で、以下のようにコマンドを打つ訳ですが

```bash
sudo yum erase mysql-libs
```


削除後にmariadbのインストールを行うと問題なく成功して動作します。
ですがcronに登録してたjobが動かない！というかcrontabがcommand not foundと言われる。


なんでやねんとおもいつつ`/var/log/messages`を見てみると

```
Nov 16 03:08:04 host rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="999" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Nov 16 10:09:09 host yum[7289]: Erased: mysql-devel
Nov 16 10:09:19 host yum[7289]: Erased: mysql-server
Nov 16 10:09:21 host yum[7289]: Erased: mysql
Nov 16 10:09:22 host yum[7289]: Erased: perl-DBD-MySQL
Nov 16 10:09:23 host yum[7289]: Erased: sysstat
Nov 16 10:09:24 host yum[7289]: Erased: cronie
Nov 16 10:09:24 host yum[7289]: Erased: cronie-anacron
Nov 16 10:09:24 host yum[7289]: Erased: crontabs
Nov 16 10:09:25 host yum[7289]: Erased: postfix
Nov 16 10:09:26 host yum[7289]: Erased: mysql-libs
```

巻き添え食ってcrontabが居なくなっていたでござる。
ということで下記コマンドで解決。

```bash
sudo yum install cronie-anacron
```

念のための起動確認も。

```bash
sudo /etc/init.d/crond status
```
Tegra3を搭載した端末（？）で varying属性のmat4型変数が認識されない

Androidの端末でOpenGL ES 2.0の変な現象ではまりました。

```
varying mat4 x;
```

を使っていたのですが一部の機種で認識されずエラーになります。

```
varying vec4 x0;
varying vec4 x1;
varying vec4 x2;
varying vec4 x3;
```

同じ情報をvec4型４つで渡すと落ちなくなりました。

調べた感じ、Tegra3を搭載した端末でのみ発生するようです。
bottle.pyとOpenCVでカメラの前の人数を返すサーバ

前回はbottle.pyからJavaのプログラムを呼び出してみたが、同じ手法でブラウザでアクセスされたらWebカメラの画像を取得し、OpenCVで顔画像認識してカメラの前にいる人数を返すサーバを書いてみた。

前回はPython3で書いたが、今回はPython2.7なのと、import cv,cv2と書いてるのがダサい。。。

```py
from bottle import route, run, template
import cv,cv2
import time

@route('/cv')
def index():
    cnt = 0
    cap = cv2.VideoCapture(0)
    time.sleep(0.1)
    ret,im = cap.read()
    cv2.imwrite("camera.jpg",im)
    cap.release()
    cascade = cv.Load("haarcascade_frontalface_default.xml")
    cvim = cv.LoadImage("camera.jpg")
    faces = cv.HaarDetectObjects(cvim, cascade, cv.CreateMemStorage())
    for (x,y,w,h),n in faces:
        cnt = cnt + 1
        cv.Rectangle(cvim, (x,y), (x+w,y+h), 255)
    cv.SaveImage('dst.jpg',cvim)
    return template('{{cnt}}', cnt=cnt)
run(host='127.0.0.1', port=8080)
```
画面遷移時にUITabBarを隠す



1. Storyboardを開いて、遷移後のView Controllerを選択します。

2. 右側ペイン -> View Controller -> Layout -> "Hide Bottom Bar on Push"をONにします。

	![uitabbarhidden.png](https://qiita-image-store.s3.amazonaws.com/0/15414/b34d7053-961d-7908-7cfe-785f77ede40b.png "uitabbarhidden.png")


※ ```tabBar.hidden```など、コードで設定する方法が幾つかあるのですが、考慮すべき点が多く素直にGUIで設定する方がいいと思います。
Cloudfront-Origin間のHTTPS通信エラー原因と対策（502:Bad Gateway）



Cloudfrontの動作確認を行っていたところ、HTTPS通信周りでハマったのでメモ。


#1.ユースケース

今回の構成は以下の通りです。
　①：アプリケーションとしてのエンドポイントはCloudfrontに統一
　②：キャッシュさせたいbahavior、キャッシュさせたくないbehaviorを持つ
　③：CloudfrontとOrigin間の通信はHTTPSにする



このパターン自体はよくあるユースケースだと思います。


__■構成例__


![](https://s3-ap-northeast-1.amazonaws.com/kaojitario7/qiita-image/20141117/01_CF-arch.png)



この構成で問題となったのは、「キャッシュさせたくないbehavior」の設定です。


<br>




#2.キャッシュ対象外のbahavior設定（Forward Headers = ALL）

Cloudfrontでキャッシュさせたくない設定を実現する場合は、
`Forward Headers = All`にするのが手っ取り早い設定になります。

実際、アプリケーションがどんなheaderを使っているかを洗い出す作業は面倒ですし、
ある程度大きい組織やプロジェクトだと、アプリケーション側の挙動まで把握できていないことも多く、
アプリケーション側の担当者の協力が不可欠ですし、色々な政治的な理由も相まって、
`no-cache,no-store`ヘッダーを埋め込むこともできないこともあり、こうするケースが多いです。


![](https://s3-ap-northeast-1.amazonaws.com/kaojitario7/qiita-image/20141117/04_forward-headers-all.png)


この設定を行ったとき、CloudrontとOrigin間のHTTPS通信に罠がありました。


<br>




#3.SSLハンドシェイクに失敗する

Cloudfrontは、Defaultではhostヘッダーを削除しますが、
`Froward headers = All`にすると、当然hostヘッダーも透過させることになります。
この設定を行うと、Cloudfront経由でOriginにアクセスした場合、
CloudfrontはHostヘッダーにCloudfront自身のDNS名をセットしてOriginにアクセスすることになります。

この状態で通信すると、SSLハンドシェイクに失敗し、502:Bad Gatewayエラーが返されます。
Cloudfrontによる証明書の検証に失敗してしまうのです。。。





__■通信の流れ__
![](https://s3-ap-northeast-1.amazonaws.com/kaojitario7/qiita-image/20141117/02_https-failure.png)





<br>




#4.対応策

対処策は明白で「Hostヘッダーを透過させない」ということになります。

![](https://s3-ap-northeast-1.amazonaws.com/kaojitario7/qiita-image/20141117/03_https-success.png)




<br>




#5.Forward HeadersのBlack List設定はできない

ただ、`Forward Headers = All`にしていたせいで、
Hostヘッダーだけ透過させない、という設定が簡単にはできませんでした。。。
CloudfrontのForward HeadersはWhite Listしか設定できません。。。

![](https://s3-ap-northeast-1.amazonaws.com/kaojitario7/qiita-image/20141117/05_forward-headers-whitelist.png)

結果、必要なヘッダーを洗い出してWhite Listに設定するハメに。。。

安易に`Forward Headers = All`にしてしまうと、こんな状態に陥ってしまいますので、
アプリケーションとして透過すべきHeaderを明示的に洗い出す作業は、逃げずに事前にやっておいた方がよいですね
（当たり前と言えば当たり前なのですが）。。。

というか、CloudfrontのForward Headersの設定で、Black Listの設定ができればいいのにーーーー
と痛感しました（HostヘッダーだけBlack Listに登録できれば万事OKな事象なので）。


<br>




#6.まとめ

そもそも、キャッシュコンテンツとキャッシュ対象外コンテンツの両方をCloudfront経由にする
という構成自体が無しなのかもしれません。
キャッシュ対象だけCloudfrontを経由させるのが定石なので、それに倣った方が無難だということを痛感しました。
（CloudfrontとOrigin間の余計な通信が発生しないので、通信料も節約できるし。。。）

<br><br><br><br><br>

最後に、、、これはあくまで私的なメモですので、
特定の環境の情報を公開するものではありません（お約束）。
Macでport80でnginxを自動起動

brewでインストールしたnginxが、ターミナルからは起動できるのに、launchctlでの自動起動がなかなか起動できなかったので、メモ。

### plist ###
```xml:homebrew.mxcl.nginx.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>homebrew.mxcl.nginx</string>
    <key>KeepAlive</key>
    <false/>
    <key>NetworkState</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/nginx</string>
    </array>
    <key>Sockets</key>
    <dict>
      <key>Listeners</key>
      <dict>
        <key>SockNodeName</key>
        <string>127.0.0.1</string>
        <key>SockServiceName</key>
        <string>http</string>
      </dict>
    </dict>
  </dict>
</plist>
```
特に重要なのがSockets以下で、これがないと
```
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
```
が出ました。

### ファイルの設置場所 ###
/Library/LaunchDaemons

### 登録方法 ###
```shell-session
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
```

### やってみたけどダメ、または関係ないもの ###
```xml:plist
<key>UserName</key>
<string>root</string>
```
はなくても動きました。
sudoでlaunchctlすればいいみたいです。

plistを
~/Library/LaunchDaemons
に設置して、ownerをrootにしてsudoでlaunchctlしても動きませんでした。
NSImage をリサイズする


# 目的

OS X アプリで、NSImage 型で表現された画像データをリサイズした画像を、次のようにして作成してみました。

# ソースコード

```NSImage``` 型の変数 ```sourceImage``` に格納されている画像を、```NSSize``` 型の変数 ```newSize``` に格納したサイズにリサイズします。

```swift
// sourceImage から NSBitmapImageRep を取得して、そこから CGImage を取り出します。
let image = NSBitmapImageRep(data: sourceImage.TIFFRepresentation!)?.CGImage!

// 新しいサイズのビットマップを作成します。
let width = UInt(newSize.width)
let height = UInt(newSize.height)
let bitsPerComponent = UInt(8)
let bytesPerRow = UInt(4) * width
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedLast.rawValue)

let bitmapContext = CGBitmapContextCreate(nil, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo)!

// 元画像 (image) をビットマップに書き出します。
let bitmapRect = NSMakeRect(0.0, 0.0, newSize.width, newSize.height)

CGContextDrawImage(bitmapContext, bitmapRect, image)

// ビットマップを NSImage に変換します。
let newImageRef = CGBitmapContextCreateImage(bitmapContext)!
let newImage = NSImage(CGImage: newImageRef, size: newSize)
```

# コードの内容

新しいサイズの画像コンテキストを ```CGBitmapContextCreate``` 関数で作成して、そこに ```CGContextDrawImage``` 関数を使って元画像を書き出しています。

書き出した画像を ```CGBitmapContextCreateImage``` を使って ```CGImage``` 形式のデータに書き出し、それを使って ```NSImage``` を組み立てています。

---

[詳細] http://ez-net.jp/article/27/DY0R3-1O/SJQQ_0rAOV6B/

> ブログでは他のコードで実現しようとして失敗したお話も備忘録として記してあります。
less にパイプしても色が消えないようにする方法

# はじめに
Linux のコンソールで動くいまどきのユーティリティは、出力に色が付いていて見やすくなっているものが多いです。例えば `ls` コマンドや `git diff` など、色があるだけで視認性が大幅に向上するツールは色付きで使いたいですよね。ところが、こういった色付きの出力を行うツールはたいてい less と相性が悪い。

```bash
$ ls -al | less
```

のように出力をパイプに流した途端に色が付かなくなってしまいます。建前としては、出力がコンソールのときには最終的に出力を人間が見るので色を付けても構わないが、出力がパイプの時には下流のツールが正しくエスケープシーケンスを処理できるとは限らないので、色付けを無くしてエスケープシーケンスを出力することに起因する問題を未然に防ごう、ということです。

でも、less の場合には `-R` オプション付ければ色付けのエスケープシーケンスは正しく扱えるんですよね。だから、パイプの向こう側が `less` のときにはエスケープシーケンスもちゃんと出して欲しい。でも、プログラム側（例えば `/bin/ls`）から見て出力のパイプが `-R` 付きの `less` かどうかなんて判定するのはちょっと難しい。だから、GNU ls なんかだと色を付けるかどうかを手動で指定するオプションとかがあって、それを使うと less に色付きの出力を渡すことができます。

```bash
$ ls -al --color=always | less -R
```

でも、この方法は ls 以外で通用するとは限らないので ls 以外で色を付けたくなったら毎回 man を開いてオプション名を確認しなくてはならず面倒ですし、そもそもそういったオプションが用意されていないツール相手には無力です。

# 汎用的な方法

expect というソフトウェアパッケージに [unbuffer](http://expect.sourceforge.net/example/unbuffer.man.html) というツールが含まれていて、unbuffer を経由してプロセスを起動すると、標準入出力があたかもコンソールであるかのように偽装することができます。インストール方法は yum でも apt でもなんでも入るので割愛して、使い方から解説します。ls だったらこんな感じです。

```bash
$ unbuffer ls -al | less -R
```

git でも同じように使えます。

```bash
$ unbuffer git diff | less -R
```

ツールによっては存在しない `--color` オプションとは違って、この方法ならツール側の対応無しで出力に色を付けたまま less に渡すことができます。とっても便利。

# シェルの設定
unbuffer と less の組み合わせは毎回手でタイプしてももちろん良いのですが、面倒なので `.bash_profile` などにエイリアスを登録して楽をしています。

```bash
less_with_unbuffer () {
    unbuffer "$@" |& less -SR
}
alias ul=less_with_unbuffer
```

このように設定しておいて、使うときには `ul ` を頭に付けるだけ。

```bash
$ ul ls -al
```

とか、

```bash
$ ul git diff
```

とか、そんな感じです。本当は、

```bash
$ unbuffer git diff | grep --after=3 'Foo::' | less -SR
```

こんな感じで色々パイプを繋いで最後に `less -SR` するパターンをエイリアスで
綺麗に書けると良いのですが、私の shell 力だとすぐにはやり方を思いつかない。
Python で Project Euler #9「特別なピタゴラス数」

[Problem 9 「特別なピタゴラス数」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%209)

> ピタゴラス数(ピタゴラスの定理を満たす自然数)とは a < b < c で以下の式を満たす数の組である.
>
> ```math
> a^2 + b^2 = c^2
> ```
> 
> 例えば, 
> 
> ```math
> 3^2 + 4^2 = 9 + 16 = 25 = 5^2
> ```
>
> である.
> a + b + c = 1000 となるピタゴラスの三つ組が一つだけ存在する.
> これらの積 abc を計算しなさい.

```py:Python
n = 1000

seq = range(1, n+1)

def is_pythagorean(a, b, c):
  return a**2 + b**2 == c**2

pythagorean = None
for a in seq:
  if(pythagorean): break
  for b in range(a+1, n+1):
    c = n - b - a
    if(c > b and is_pythagorean(a, b, c)):
      pythagorean = (a, b, c)
      break

result = reduce(lambda x,y: x*y, pythagorean)

print result
print result == 31875000
print pythagorean
```

```:結果
31875000
True
(200, 375, 425)
```
Hubot起動時に"INFO [scriptのパス] is using depercated documentation syntax"が出力される理由と対応


#検証環境
OS X 10.9.5
Hubot 2.9.3

#状態
以下のようにbotスクリプトを作成して、Hubotを起動すると件のメッセージが出力される。

```coffeescript:example.coffee
module.exports = (robot) ->
  robot.respond /abc/i, (msg) ->
    msg.send 'xyz'
```

```bash
$ bin/hubot
...
[Mon Nov 17 2014 18:50:47 GMT+0900 (JST)] INFO /Users/stupiddog/hubot/example/scripts/example.coffee is using deprecated documentation syntax
...
Hubot>
```

#対応
ヘッダーコメントを追加して、commands セクションに使い方の説明を追加する。

```coffeescript:example.coffee
#Commands:
#  hubot abc - Returns the message 'xyz'
#
module.exports = (robot) ->
  robot.respond /abc/i, (msg) ->
    msg.send 'xyz'
```

#理由
Hubotはhelpコマンドで表示する情報をコメントから得ている。
このため、コメントにCommandsセクションが無い場合に「そのドキュメントの書き方は推奨しませんよ」ってメッセージが出力される。
公式ドキュメントの[Scripting - Documenting Scripts](https://github.com/github/hubot/blob/master/docs/scripting.md)に詳しい説明がある。

```coffeescript:example.coffee
#Commands:
#  hubot abc - Return a message "xyz"
#
module.exports = (robot) ->
  robot.respond /abc/i, (msg) ->
    msg.send 'xyz'
```

```bash
$ bin/hubot
...
Hubot> hubot help
Hubot> Hubot abc - Return a message "xyz"
Hubot help - Displays all of the help commands that Hubot knows about.
Hubot help <query> - Displays all help commands that match <query>.
Hubot>
... 
```

#おまけ
色々試してみたら、"hubot 〜"の行だけでもhelpコマンドに抽出される。
Commandsセクションを記述した場合は、それ以降の"hubot 〜"行が対象になる。
しかし、ひな形にヘッダーコメントも含まれているので横着しないで合わせる方がいいですな。
【覚書】unix timestamp -> date に変換するワンライナーいろいろ

```bash
php -r 'date_default_timezone_set("Asia/Tokyo"); echo date("Y-m-d H:i:s", 1416236400) . "\n";'
```

```bash
python -c "import datetime; print datetime.datetime.fromtimestamp(1416236400)"
```

```bash
ruby -e 'print(Time.at(1416236400), "\n")'
```

```bash
node -p "new Date(1416236400 * 1000)"
```

```bash
date -r 1416236400
```

最後のやつを最初に調べるべきだったわ。
三項条件演算子の小技

三項条件演算子というものがありますね。

`expr ? then : else;`

これは実に見にくいものです。
これだけならまだいいのですが、

`expr ? then : expr ? then : else;`

このようにネストさせると途端に見にくく、醜くなるものです。
じゃあ使わなけりゃいいじゃん、てまあ、それはそうなのですが、どうしても使いたいときもあるんです。
これを使う一番の利点は、この条件演算子は文、statementではなく、式、expressionであるという点です。
if 〜 elseは 文ですね。
式であるということは、
`int ary[sizeof(long) > 4 ? 8 : 4];`
のような使い方ができるということです。
この例はあまり実用的とは言えませんが、c++11のconstexpr関数など、重宝する場面も少なくありません。

そこで解法として、

```

#define IF_EXP( expr ) ( expr ) ?
#define ELSE_EXP : 

```

を使います。

```

IF_EXP( exp ) then
ELSE_EXP IF_EXP( exp ) then
ELSE_EXP else;


```

ま、多少は見やすくなったのではないでしょうか。
マクロの使用は忌み嫌うべきものなので、長い使いづらい名前を敢えて付け、決してライブラリから垂れ流すようなことはせず、必要最小限の使用に留めて、使い終わったらすぐに`#undef`することが大切です。少なくとも、マクロの使用されている画面からマクロの定義が見える範囲が許容範囲でしょう。

用法、容量を守ればマクロは強力な機能です。
可読性を損なわないように美しく使いましょう。
おさえておきたいffmpeg高速化のまとめ：CPU使用率100%、Load Averageがぁあぁぁぁというときに ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

みなさんこんにちは :smile: 日々やばい動画処理エンジンをつくっておりますがコマンドラインから動画処理ができるffmpegを使うことがかなりありまス :movie_camera: 

重い :bowling: 処理させるので、CPU使用率100%でLoad Averageは常に1を超えてるとかそんな感じです :scream: 

> わたし：「lachesis （ホスト名） のLoad Average がぁっぁぁ」
> lachesis：「マスター！」

そんな感じ :exclamation: にしても lachesis が馬名になってるなんて、そして、レディオスコーポレーションって・・・将来、馬主 :horse: になって、バッハトマコーポレーションとして、G Iで勝てる馬を買うんだ :money_with_wings:

> 「レディオスコーポレーションはボクが倒す」

この前はうっかり、連続処理をスケジュールした後、気づいたら Load Average が44とかになってました。4.4だったかもですが、いずれにせよ、ひどい。ラーメン屋 :ramen: の行列に並ぶ感じでなかなかログインできなくなります :sweat_drops:

ひとりで来たのに

> 店員：「お次の4名でお待ちの方お先にテーブル席にどうぞー」

とか言われたときの、何とも言えない感じ :broken_heart: で二度と来るかと思いつつ、翌日も並ぶわけです :ramen:

# 本題

ffmpeg には使えるオプションがありすぎです。使いこなせば、AdobeのPremireとかいう動画処理ソフトも不要 :yum: なんだけど、オプションの使い方で、結果は同じなのに、処理速度 :horse_racing: が全然違うことが良くあります

というわけで

## 高速になる事例をまとめます

役立つことがあるかわかりませんが、Load Averageと住まい :office: は低い方がいいよねということで

### :octopus: 動画を切り抜くときの -ss の場所

**用途：例えば、動画の20分のところから、1分切り出したいときとか**

ポイント：-i の前に -ss を書く

```
ffmpeg -ss 1200 -i input.mp4 -t 60 out.mp4
```

という感じがGood :+1:

-i より後に書くのは :-1:

```
ffmpeg -i input.mp4 -ss 1200 -t 60 out.mp4
```

-i より前に書くことで、ffmpegが該当箇所まで適当に読み込みをスキップします

### :octopus: 再エンコード、再サンプリングが不要な場合のコーデック指定

**用途：切り抜きとか、音はそのままとか、絵はそのままとか**

ポイント：コーデック指定に copy で -c:v copy -c:a copy

ffmpeg は頑張り屋で、何でもやります :ghost: でも、そのままでいい所は時間 :watch: の無駄

上の切り抜く場合だと

```
ffmpeg -ss 1200 -i input.mp4 -t 60 -c:v copy -c:a copy out.mp4
```

とすると速くなります（速くなるときがあります）

### :octopus: フレーム画像の抜き出し

http://qiita.com/scleen_x_x/items/0ba0bc8d34350c5e285b

↑にも書いたのですが、nフレーム毎に画像を抽出する処理をワンラインで書くと超遅いです

**用途：30秒ごとに画像を抽出したいときとか**

ポイント：ワンラインでできる（select）は使わず、1枚ごと別コマンドにする

遅い例：

```
ffmpeg -i input.mp4 -filter:v "select=not(mod(n\,1800)),setpts=N/(30*TB)" -qscale:v 2 -y thumbnail-%03d.png
```

速い例：

```
ffmpeg -ss 30 -i input.mp4 -r 1 -vframes 1 -f image2 thumbnail-001.png
ffmpeg -ss 90 -i input.mp4 -r 1 -vframes 1 -f image2 thumbnail-002.png
ffmpeg -ss 150 -i input.mp4 -r 1 -vframes 1 -f image2 thumbnail-003.png
```

## 随時更新予定

というわけで、 enjoy your ffmpeg life :beer:

# おまけ

## VPSでリセマラ

ソシャゲで初回ガチャで良い結果が出るまでリセットし続けるのがリセマラ

VPSで良いIPアドレスになるまで引き直すのもリセマラ
OSX で Mozart2 環境を構築する方法

OSX で Mozart2 環境を構築する方法

# 前提
- OS X 10.10 Yosemite
- Emacs 24.x
- Mozart2

# Emacs + Mozart2
基本的に Emacs と Mozart2 が入っていれば ok です。 Mozart2.app 起動時に /Applications に Aquamacs.app または Emacs.app がないと起動に失敗するので注意。

よほどこだわりがない限り、Homebrew + Homebrew Cask でインストールするのがオススメ。

## Homebrew install
[Homebrew公式](http://brew.sh/) を参考にインストールしてください。

## Emacs install
### Homebrew の場合

```
$ brew install emacs --cocoa
$ brew linkapps
```

これで /Applications/Emacs.app に symbolic link 張られます。

### dmg の場合
[Emacs For Mac OS X](http://emacsformacosx.com/) から dmg を DL して /Applications に入れよう。

### MacPorts の場合

```
$ sudo port install emacs-app
$ ln -s /Applications/MacPorts/Emacs.app /Applications/
```

でいいらしい。

## Mozart2 install
### Homebrew Cask の場合

```
$ export HOMEBREW_CASK_OPTS="--appdir=/Applications"
$ brew install caskroom/cask/brew-cask
$ brew tap caskroom/versions
$ brew cask install mozart2
```

### dmg の場合
[SourceForge の DL ページ](http://sourceforge.net/projects/mozart-oz/files/) から dmg を DL して /Applications に入れよう。

## 動作確認
1. /Applications/Mozart2.app 起動。
2. `C-. e` (ちなみに `Ctrl+.` を押したあと `e` を押す)と入力し、下のペインを Oz Emulator にする。
3. 上のペインに `{Show 'Hello world.'}` と入力。
4. ↑と同じ行で `C-. C-l` (ちなみに `Ctrl+.` を押したあと `Ctrl+l` を押す)と入力。
5. 下のペインに `'Hello world.'` と出力されれば確認完了。

# Emacs Evil
どーーーーーーしても Emacs keybind に慣れない方は Evil を入れて vim っぽくしてもいいかも。

## evil install
まず evil をインストールするための package.el の設定をする。

```~/.emacs.d/init.el
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)
```

Emacs 再起動後に `M-x package-install` (ちなみに `M-x` は `Esc` 押してから `x` を押す)して evil をインストールする。

## evil 設定
Emacs 起動時に evil-mode を使用するように。 また Mozart2 と Evil で `C-.` がコンフリクトしてしまうので、Evil側の keymap 設定の削除も行なう。

```~/.emacs.d/init.el
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)

(require 'evil)
(evil-mode 1)
(define-key evil-normal-state-map (kbd "C-.") nil)
```

Emacs 再起動して keybind が変わっていることを確認する。

# CLI
`ozc` や `ozengine` などの CLI を使う際には、

```
export PATH=$PATH:/Applications/Mozart2.app/Contents/Resources/bin
```

を .bashrc なり .zshrc に記載しておくと吉。
java学び直しメモ part3 ～if文～

##今回の内容
[前回](http://qiita.com/yuukieiu/items/7704b00178f39149c473)は演算子についてでした．
今回はプログラミングにおいて最重要要素の1つであるif文のお話です．

##if文とは
if文とは，条件によって異なる動作をしたいときに使う文です．
例えば，「*40人の生徒のテスト結果を見て，60点以上なら合格，60点未満なら不合格にしたい！*」みたいなときに，生徒の点数が60点以上かどうか判定しなければいけません．
こんなときに活躍するのがif文です．
if文によってプログラムの進む方向が2手（あるいはそれ以上）に分かれます．
例えば，60点以上の方と60点未満の方に…
このことを**条件分岐**と言います．

##構文
if文には3パターンほど書き方があります（記述が増えるだけですが）．
処理や条件によって使い分けましょう．

###ifのみ
まずは単純なif文で，これは条件に合う場合だけ処理を行います．
条件に合わない場合は何もしません．

```java:IfStatement1.java
if (条件式) {

    // ここに処理を書く

}
```

条件式には，比較演算子を用いた式（例：pointが60点以上→point >= 60）など，**結果が真偽値になる**ようなものが入ります．
条件式の結果がtrueになる場合のみ，「{}」内に記述された処理が行われます．
もちろん条件式には「true」を入れてもOKです（ただしその場合必ず処理されるのでif文の意味がない）．
このような「{}」で囲まれてできる部分のことを「ブロック」と呼んだりします．
if文以外でもブロックがあるので，区別するためにif文の場合は「ifブロック」って言います．

if文の基本形は以上で，派生として2パターン存在します．

###if-else
```java:IfStatement2.java
if (条件式) {

    // ここに処理1を書く

} else {

    // ここに処理2を書く

}
```

このように，「**else**」を使うことで，条件に合わなかった場合の処理を記述することができます．
条件式がtrueの場合は処理1が行われ，falseのときは処理2が行われます．
ただし，「else」は条件に合わなかった場合の処理を記述するため，1つのifに対して1つのelseという制約があります．
えー，もっと複雑な条件分岐がしたいです．
たくさんif文書くしかないんですか．
そんなときに使えるのが次の構文です．

###if-else if-else
```java:IfStatement3.java
if (条件式1) {

    // ここに処理1を書く

} else if (条件式2) {

    // ここに処理2を書く

} else {

    // ここに処理3を書く

}
```

このように書くと，上から順番に条件判定され，条件式1に合っていれば処理1を，条件式1に合ってないけど条件式2に合っていれば処理2を，条件式1にも条件式2にも合ってない場合は処理3を行うことができます．
さらに，else ifは無限に増やすことが可能です．

##入れ子構造
例えば，「*40人の生徒のテスト結果を見て，60点以上なら合格，60点未満なら不合格にしたい！さらに60点以上の子は10点刻みで分けたい！*」という状況になったとします．
この場合，60点以上かどうか判定した後に，10点刻みで分けるという処理をしなければなりません．
こんなときは**入れ子構造**を使います．
if文以外のブロック構造の文でも使うことができます．
例の通りに書いてみます．

```java:IfNest.java
if (60点以上) {

    // 合格の処理
    // 合格者の中でさらに条件分岐
    if (60点以上70点未満) {

        // 処理1

    } else if (70点以上80点未満) {

        // 処理2

    } else if (80点以上90点未満) {

        // 処理3

    } else if (90点以上) {

        // 処理4

    }

} else {

    // 不合格の処理

}
```

ifブロックの中にさらにifブロックがあります．
これが入れ子構造です．ネストとも言いますね．
ネストを使うことによって，より複雑な条件分岐でも判定が可能です．
記述するときは，例のプログラムのように**インデント**をしっかりすることが大事です．
インデントとは，行の先頭に空白を入れる字下げのことですが，これをすることによって，階層構造が見やすくなります．
インデントがしっかりしていなくても，javaはちゃんと動くように出来ていますが，他者があなたのソースコード読んだときに，インデントがしっかりしていたほうが理解しやすいです．
他者がソースコードを読んだときに理解しやすいかどうかの度合いのことを**可読性**と言いますが，プログラムを書くときは自分のためにも可読性を上げるような書き方をした方がいいです．
（過去に自分が書いたコードを見て可読性が低いと，なんのプログラムかわからなくなって過去の自分をぶん殴りたくなります…）
ちなみに，僕の大好きなPythonという言語は，インデントが同じ行を1つのブロックとして認識するので，インデントができないと正しく動きません．
可読性を上げるプログラミングを練習する言語としては最適だと思います．

##おわり
今回説明したif文はプログラミングの最重要要素の1つなので，必ずマスターして欲しいです．
前回ちょろっと紹介した三項演算子があればif文はいらないとか言い出す人もいるかもしれませんが，三項演算子はパッと見わかりにくいので僕は好きじゃないです（だから説明しなかったってわけじゃないです）．
if文をマスターして，どんな条件分岐も作れるようになりましょう！
SVNのログ編集のためのhook pre-revprop-changeが動かない場合

そこらへんにあるように「hooks/pre-revprop-changeを作成すればいい」というのを信じて作成してみたところ
それでもうまくいかず嵌っていたところに救世主がいたのでメモ。

結局はSELinuxが悪さ（？）をしていたということです。
下記コマンドで設定してあげれば筆者の環境では動きました。

```shell-session
$ chcon -t httpd_sys_script_exec_t pre-revprop-change
```

下記詳細にもある通り、環境によっては動かない場合もあるようなので、その場合は次のコマンドを試してみてください。

```shell-session
$ chcon -t httpd_exec_t pre-revprop-change
```

* * *

詳細は下記
http://stackoverflow.com/questions/10736505/svn-hook-pre-revprop-change-not-working
SpringのBean Validationで複数の入力項目にまたがってチェックする。

本当に何て事のない手法ですが、
知らないとカスタムバリデーターの作成とか、Controller内でバリデーション実行とかやっちゃいかねないのと、
検索しても中々簡単な方法見つからなかったので書いときます。

例えば、以下のように2つのフィールドがあり、
nameに何か値が入っている時のみ、nameKanaが必須入力だとします。

```lang:java
private String name;
private String nameKana;
```

この場合、getterを一個でっち上げて、そっちにバリデータをいれます。

```lang:java

/**
 * バリデーション用getter
 * special thanks to tag1216 
 */
@AssertTrue(message="名前を入れたらカナも入れてちゃぶ台")
public boolean isValidNameAndKana(){
 if(StringUtils.isEmpty(this.name)){
  return true;
 }
 if(StringUtils.isEmpty(this.nameKana)){
  return false;
 }
 return true;
}
```

で、JSP側には、上記のgetterに対応した名前で、エラーメッセージ表示用のタグを書きます。

```lang:jsp
<form:errors path="validNameAndKana" ... />
```

以上です。
UIPageViewControllerのPanGestureを無効にする


UITabBarを使わずにTabっぽいUIを実現するために
UIPageViewControllerを使いました。

その際に困ったのがUIPageViewControllerが持っているScrollViewがPanGestureに反応してしまって、
スワイプによるページ変更ができてしまうこと。　

この解決策として以下のようにして、PanGestureを無効にしました。

```objective-c:PanGestureを無効にする
	for (UIGestureRecognizer* gesture in self.gestureRecognizers) {
        if( [gesture isMemberOfClass:[UIPanGestureRecognizer class]] )
        gesture.enabled = NO;
    }
```

上記の方法でジェスチャーを無効にすることができましたが、
PageViewControllerのTransition Typeが「Scroll」になっていると出来ません。
ジェスチャーを無効にするにはTransition Typeを「Page Curl」にする必要があります。
これに気付くのに時間が掛かってしまいました。。
GITの通信プロトコルについて整理

Gitで使うことができるネットワーク・プロトコルは4つある。

* Localプロトコル
* SSHプロトコル
* Gitプロトコル
* HTTP/HTTPSプロトコル

# Localプロトコル
ローカルマシンにあるリポジトリをローカルマシンの別のディレクトリにクローンするときにはLocalプロトコルが使われる。 使い方は以下。

```
git clone /path/to/repository /path/to/local/directory
```

git clone パス名 パス名

# SSHを使ったGitリポジトリへのアクセス
SSHを使ってGitリポジトリにアクセスする方法は、基本的にはファイルシステムからリポジトリにアクセスする場合と同じ。

```
user_name@servername.com:repos_path/repo.git
```

ユーザー名@サーバー:リポジトリのパス
というURLでアクセスできる。

# Gitプロトコル
Git独自のスピード重視で設計されたこのGitプロトコルは、9418番ポートを使う。
gitプロトコルでは匿名であり、書き込みができる状態にするのは危険である。
gitプロトコルでプルできるようにして、変更をsshでプッシュできるようにすることが多い。

```
git://servername.com/hogerepo/repo.git
```

プロトコル://サーバー/リポジトリの構文で接続できる。

# プロトコルの選定基準
* 何より速度重視ならgitプロトコル
* 何よりセキュリティ重視ならhttpsプロトコル
* ファイアウォールの設定を変えたくないならhttp/https
GitやSVNでUnityプロジェクトを管理する方法

### 注記
* Unityプロジェクトを未だSVNやGitで管理していないチーム向けの記事です。


### 管理しないもの
* 基本的にプロジェクトTOPにあるファイル群は管理外。具体的には...
 * .csproj
 * .sln
 * .userprefs
 * Libraryディレクトリ


### 管理するもの
* それ以外。具体的には...
 * Assetsディレクトリ
 * ProjectSettingsディレクトリ


以上。（間違いがあればご指摘頂けると幸いです。）
IDCFクラウド③固定IPで外部インターネットにアクセスしてみる


## 外部アクセスするためのIPアドレスを取得

・リクエストを受け付けるIPアドレスとは別に１個IPアドレスを追加する。
※グローバルIPアドレス追加１個¥500-かかります。

|入力項目|設定値・説明|
|:------|:---------|
|IPアドレス名|任意の名称を設定|
|ゾーン|選択肢なし固定|
|ネットワーク|選択肢なし固定|

## NAT 設定

### スタティックNAT用のサーバを一台立てる

・用途は Mail (Postfixを起動させる)サーバなど
・内部IPアドレスを固定する

### NAT

・左メニュー「IPアドレス」→上記で追加した「IPアドレス名」をクリック
・ネットワークメニューから「NAT」を選択
・「スタティックNATを有効化します。」でスタティックNAT用のサーバを選択。
・「有効化」をクリック。

## 動作確認

### 外部に固定IPアドレスでアクセスできるか確認

・Apache Bench で公開しているサーバ（自分たちでアクセスログが見えるもの）にアクセスしてみる
・アクセスログ上IPアドレスがアクセスのたびに変わらなければOK
coreserverでwordmoveが動かない時の解決策


VCCWで開発、更新・修正したあとに、wordmoveでポイっとデプロイするのが最近の私のWordPress開発のキモとなりつつあるのですが、coreserverではmysqldumpのパスが違うのか、wordmoveでmysqldumpの処理でコケます。
パスやら色々設定してもダメだったので、諦めてファイルを書き換えることで解決しました。


**2015.06.06追記**

最初にvagrant sshしたあと、シンボリックリンクを貼る必要があります。（which mysqlなどしてパスを取得後、サーバー側と合わせる）


```

cd /usr/local && sudo mkdir mysql && cd mysql && sudo mkdir bin && cd bin && sudo ln -s /usr/local/bin/mysqldump mysqldump && ln -s /usr/local/bin/mysql mysql

```

**追記おわり**

その後、ファイルを変更する必要がります。

修正箇所は

```

/usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/wordmove-1.2.0/lib/wordmove/deployer/base.rb

```

内の、188行目と199行目をサーバー（リモート）のパスに変更してあげるだけです。viなどで変更します。

```
      def mysql_dump_command(options, save_to_path)
        arguments = [ "mysqldump" ]
        arguments << "--host=#{options[:host]}" if options[:host].present?
        arguments << "--port=#{options[:port]}" if options[:port].present?
        arguments << "--user=#{options[:user]}" if options[:user].present?
        arguments << "--password=#{options[:password]}" if options[:password].present?
        arguments << "--default-character-set=#{options[:charset]}" if options[:charset].present?
        arguments << options[:name]
        Escape.shell_command(arguments) + " > #{save_to_path}"
      end

      def mysql_import_command(dump_path, options)
        arguments = [ "mysql" ]
        arguments << "--host=#{options[:host]}" if options[:host].present?
        arguments << "--port=#{options[:port]}" if options[:port].present?
        arguments << "--user=#{options[:user]}" if options[:user].present?
        arguments << "--password=#{options[:password]}" if options[:password].present?
        arguments << "--database=#{options[:name]}"
        Escape.shell_command(arguments) + " < #{dump_path}"
      end

```
これを

```
      def mysql_dump_command(options, save_to_path)
        arguments = [ "/usr/local/mysql/bin/mysqldump" ]
        arguments << "--host=#{options[:host]}" if options[:host].present?
        arguments << "--port=#{options[:port]}" if options[:port].present?
        arguments << "--user=#{options[:user]}" if options[:user].present?
        arguments << "--password=#{options[:password]}" if options[:password].present?
        arguments << "--default-character-set=#{options[:charset]}" if options[:charset].present?
        arguments << options[:name]
        Escape.shell_command(arguments) + " > #{save_to_path}"
      end

      def mysql_import_command(dump_path, options)
        arguments = [ "/usr/local/mysql/bin/mysql" ]
        arguments << "--host=#{options[:host]}" if options[:host].present?
        arguments << "--port=#{options[:port]}" if options[:port].present?
        arguments << "--user=#{options[:user]}" if options[:user].present?
        arguments << "--password=#{options[:password]}" if options[:password].present?
        arguments << "--database=#{options[:name]}"
        Escape.shell_command(arguments) + " < #{dump_path}"
      end
```
coreserverの場合はこうするだけ。

仮想環境なのでぶっ壊れても平気ですね！
MySQLの処理負荷が上がるとLoad Averageも上がるのか

MySQLで待ちクエリが大量発生してもLoad Averageが上がることはないというようなことを聞いたので、その理由を考えてみました。自分なりに調べてみましたが、間違っていたらご指摘下さい。

# そもそもLoad Average（ロードアベレージ）とは
* 実行プロセス数(実行中プロセス数＋実行可能プロセス数)
※実行可能プロセス数とは、CPU割り当て待ちのプロセスで、CPUが割り当てられれば実行されるプロセスのこと。I/O待ちのプロセスはカウントされない。
* Load Average は1分あたりの実行プロセス数を表す。
例えば値が 0.5 だった場合、1プロセスが30秒稼働状態だったかもしれないし、2プロセスが15秒稼働状態だったかもしれない。
* Load Average <= CPU数であれば、処理負荷がかかっていないと一般的には言われている。
※CPU数の数え方については http://tweeeety.hateblo.jp/entry/20130422/1366637798 に詳しく記載されている。

# MySQLの処理負荷が上がるとLoad Averageも上がるのか？
* まず、MySQLはシングルプロセス／マルチスレッドのアプリケーションである。
* マルチスレッドとは

> 1つのアプリケーションソフトがスレッドと呼ばれる処理単位を複数生成し、並行して複数の処理を行うこと。いわばアプリケーションソフト内でのマルチタスク処理。マルチタスクと同じように、CPUの処理時間を非常に短い単位に分割し、複数のスレッドに順番に割り当てることによって、複数の処理を同時に行っているようにみせている。 
> http://e-words.jp/w/E3839EE383ABE38381E382B9E383ACE38383E38389.html

* つまり、クエリが大量に発行されても、MySQLのプロセスは1つのままであり、MySQLのプロセス内でクエリの実行待ちが増える。CPUの負荷率は高まるが、プロセス数は1のままとなる。
* で、MySQLのCPU使用率が高まるとMySQL以外のプロセスに影響が出る。その結果、Load Averageが上昇することは考えられる。
* ちなみに MySQL の 「show processlist」コマンドで表示されるデータは「プロセス」なのか？公式を見ると下記のこと。スレッドなんですね。

> SHOW PROCESSLIST shows you which threads are running.
> http://dev.mysql.com/doc/refman/5.5/en/show-processlist.html
Win7でSublimeText3を既存のプログラムに設定出来ない時は

既存のプログラムに設定できなくて困ったので、メモ

# 手順

## 1 Windowsキー + Rを押して
実行画面に「regedit」と入力しEnter。

## 2 レジストリエディタが起動
コンピュータ/HKEY_CLASSES_ROOT/Applicationsの中に sublime_text.exe を見つけて削除。

## 再び既存のプログラムに設定してみる
できた！

# 参考

LinkShare
http://photo.linkshare-net.com/2013/11/19/sublime-text-3/
IDCFクラウド②Webサーバを立てて負荷分散を設定してアクセスしてみる


## サーバ構築

### 任意のWebサーバ２台を構築する
ここでは、サーバ構築ではなくネットワーク設定を備忘に残したいのでWebサーバの手順はざっくり書きます。

### ざっくり
・light.S1 (最低)スペックのサーバを作成(スペックは任意)
・下記手順のファイアウォール、ポートフォワードにて ssh の穴開けを行う
・ローカルのターミナルで ssh 接続 ssh -l root [IDCFクラウドで取得したIPアドレス]:[ファイアウォールで開けたポート]
・Web サーバをインストール

```例：Apache
　$ yum -y install httpd
```

・Web サーバを起動

```例：Apache
  $ apachectl start
```

## IPアドレス取得
※一番最初は１IPアドレス無料で使用可能

・TOPメニュー「東日本リージョン」→「コンピューティング」→左メニュー「IPアドレス」ネットワークを作成する
（自分でやれてないのでざっくり記載します）

## ファイアウォール

### １サーバの１ポートにアクセスする毎に１つのファイアウォール設定値を設定します

・左メニュー「IPアドレス」→ネットワーク作成済みの場合「IPアドレス名」欄に設定したIPアドレス名がリンクで表示される
・作成したIPアドレス名リンクをクリック
・ネットワークメニューから「ファイアウォール」をクリック
・下表の情報を入力して「＋」をクリック

|入力項目|設定値・説明|
|:------|:---------|
|コメント|どのサーバのどのポート（サービス）にアクセスできるかわかる名称にする|
|ソースCIDR|My IP を選択|
|タイプ|Custom TCP|
|ポートレンジ|クラウド外部（インターネット）からクラウドにアクセスするためのポート番号。※httpなら80、sshなら22など|

・作成した目的とポートはメモしておく。

## ポートフォワード

### １つのファイアウォール設定値に対して１つのポートフォワードを設定します

・ネットワークメニューから「ファイアウォール」をクリック
・下表の情報を入力して「＋」をクリック

|入力項目|設定値・説明|
|:------|:---------|
|コメント|どのサーバのどのポート（サービス）にアクセスできるかわかる名称にする|
|プライベートポート|Custom TCP で任意の番号を指定可能。構築したサーバに対して外部からアクセスできるようにしたいポート番号。※httpなら80、sshなら22など|
|パブリックポート|クラウド外部（インターネット）からクラウドにアクセスするためのポート番号。（上記ファイアウォールで設定した「ポートレンジ」の値を入力）|
|仮想マシン|作成済みのサーバを選択|

## ロードバランサ

### ２つ以上の同目的サーバに負荷分散を設定します

・ネットワークメニューから「ファイアウォール」をクリック
・下表の情報を入力して「＋」をクリック

|入力項目|設定値・説明|
|:------|:---------|
|管理名|どのポート（サービス）の負荷分散であるか識別できるアルファベット名称|
|パブリックポート|クラウド外部（インターネット）からクラウドにアクセスするためのポート番号。（上記ファイアウォールで設定した「ポートレンジ」の値を入力）|
|プライベートポート|構築したサーバに対して外部からアクセスできるようにしたいポート番号。※httpなら80、sshなら22など|
|アルゴリズム|roundrobin：対象サーバを順番にアクセス（その他sourecとleastconn選択可）|
|接続維持|環境により選択してください。今回私達は「なし」で設定しました。|
|仮想マシン|LB対象のノード(サーバ)を２つ以上選択。|

### 負荷分散の確認方法

例：webサーバに対して負荷分散を経由して２つ以上のサーバにブラウザやリクエストを飛ばして通信できることを確認

#### webサーバ側の準備

・対象サーバの起動、サービスも起動している状態で２台以上の各々のサーバにコンソールで ssh 接続する。
・アクセスログなどWebサーバのアクセスログを tail する。

```（特に設定変更をしていないＡｐａｃｈｅなら以下のようなコマンドになるはず）
　$ tail -f /etc/htdocs/logs/access.log
```

・サービス起動

```（Ａｐａｃｈｅなら以下のようなコマンドになるはず）
　$ apachectl start
```

#### Web ブラウザからアクセスする

・http://[IDCFクラウドで割当られたグローバルIP]:[ファイアウォールで設定したポート番号（80なら省略可）
・１リクエストにつきリクエスト本体＋画像ファイル等静的コンテンツ含むアクセスがサーバのアクセスログに流れると思います。

#### Apache Bench でアクセスする

・ ab とコマンドを打って入ってなさそうなら
　　yum install httpd-tools
　　※Mac OS 10.新しいものならだいたい Apache Bench は入っていると思います。

```ファイアウォール＆負荷分散経由サーバにリクエストを10同時アクセス100回の例
　$ ab -n 100 -c 10 http://[IDCFクラウドで割当られたグローバルIP]:[ファイアウォールで設定したポート番号（80なら省略可）
```

・全サーバのアクセスログに対して均等にアクセスログが流れると思います。
IDCFクラウド①アカウントを作った後にすること


##アカウント
マスターユーザ　新規作成時メインアカウント
パワーユーザ　環境構築するための権限があるアカウント

###パワーユーザアカウントを作成する

・マスターアカウントでログイン 
・ログイン後画面右上アカウント名メニューから「ユーザ情報」を選択
・ユーザ情報画面左メニューから「マルチユーザ」を選択
・マルチユーザ画面から右上の「新規追加」をクリック
・新規追加画面にて必要事項を入力しプロファイルタイプ「パワーユーザ」を選択
・新規追加の右下「作成」をクリック

### 作成アカウントの初回ログインにすること

・マルチユーザ画面で新規追加したパワーユーザのログインIDとパスワードを使ってログイン
・ログイン後左メニューから「SSH Key」をクリック
・SSH Key 画面から「SSH Key 登録」をクリック
・「SSH Key 名」（任意）を入力し「作成する」をクリック
・SSH Key 画面メッセージ「SSH Key を作成しました」表示
・以下の鍵情報が表示されるので表示された全体をコピーする
　「-----BEGIN RSA PRIVATE KEY-----」
　　から
　「-----END RSA PRIVATE KEY-----」
　　まですべて

## クラウドサーバに環境構築等でアクセスするクライアントの設定

### 公開鍵の設定

・~/.ssh フォルダの権限 700 で作成
・ファイル名（任意なので例として）「idcf_rsa」で上記手順の SSH Key 作成でコピーした文字列を貼り付け。
・idcf_rsa ファイルの権限 600 で作成
※ここではまだクラウドにサーバがあっても ssh 接続はできません。後述手順でサーバ作成、ファイアウォール設定を行う必要があり、そのための準備作業になります。

### IDCFクラウド Getting Started やってみる

cloudstack-api というコマンドでサーバインスタンスの起動などできるようになります。

http://docs.idcf.jp/cloud/#getting_started
[windows]gemインストール時にでたエラーと対策

##Error “invalid switch in RUBYOPT: -F (RuntimeError)” 
参考：http://stackoverflow.com/questions/16898286/error-invalid-switch-in-rubyopt-f-runtimeerror-is-shown-while-install-gems

原因：rubyのインストールパスにスペースがあるから
対策：ruby再インストールによって改善。インストーラ：http://rubyinstaller.org/downloads/

##extconf.rb:104:in `makemakefiles': unhandled exception
参考：http://blog.saitouh.com/?p=304

原因：devkitがうまく設定されていない
対策：devkitの初期化でうまくいく

```language:ruby

$ruby dk.rb init
$ruby dk.rb install

```
Xamarin:  Visual Studio とプロジェクト共有 : パッケージディレクトリを共有する


- デフォルトで ソリューション/packages に作る
- 普通、packagesのフォルダはレポジトリに入れない
- ので、ソリューションに取り込まれる `*.csprojの<Reference><HintPath>`に存在しない参照ができてしまって、ビルドできない
- nuget.config に設定してpackagesフォルダを共有しましょう

#  レポジトリ

```
:connectsharp
├── Josse
│   └── Jose.csproj
├── Jose.Unit
│   └── Jose.Unit.csproj
├── XmJose
│   └── XmJose.sln
├── VsJose
│   ├── .nuget
│   └── VsJose.sln
```

# 共通パッケージフォルダ

- 作らなくてもいいです。 VS,Xamariが作ってくれる。

```
Peeko:connectsharp hide$ mkdir .packages
```

# ソリューション/.nuget/nuget.config 作成

- Xamarin 5.2 から

```
Peeko:connectsharp hide$ mkdir -p XmJose/.nuget
```

```
Peeko:connectsharp hide$ cat > XmJose/.nuget/nuget.config << EOF
> <configuration>
>   <config>
>      <add key="repositoryPath" value="../../.packages" />
>    </config>
>  </configuration>
> EOF
```

- VS側にもコピー

```
Peeko:connectsharp hide$ cp XmJose/.nuget/nuget.config  VsJose/.nuget/
```
Windows Movie Maker で音声が出なくなった時

問題
----
Windows ムービーメーカーで、音声やナレーションを追加したときに、
なぜかプレビューで音声が出なくなった。
ただし、波形は見えているし、動画を Export すると再生されるので、
読み込みに失敗しているわけではない。

解決
----
マシンごと再起動で解決。
デバイス周りの何かだろうか。
【javascript】やさしいクラスの作り方

* 勉強がてら。「TypeScript使えばいいじゃん」「ES6」とか言わないで。

# hogeクラスをつくるとき

## 1. 一般的なつくりかた
```javascript
// constructor
var hoge = function(arg) {
  this.x = 5;
  this.y = 10;
  this.z = arg;
};

// メソッド
hoge.prototype = {
  f1: function() {
    return true;
  },
  f2: function() {
    return false;
  }
};

var instance = new hoge(1);
// hoge {x: 5, y: 10, z: 1, f1: function, f2: function}
```


## 2. グレートなつくりかた
```javascript
var hoge = (function() {

  var FOOFOO = 777; // クラス内定数

  // constructor
  var hoge = function(arg) {
    this.x = 5;
    this.y = 10;
    this.z = arg;
  };

  var p = hoge.prototype;

  p.f1 = function() {
    return true;
  };

  p.f2 = function() {
    return false;
  };

  return hoge;
})();

var instance = new hoge(1);
// hoge {x: 5, y: 10, z: 1, f1: function, f2: function}
```


# 所感
* 個人的には１よりも２の方がまとまっていて好きです。
* 「2でクラスつくろうよ」と言いたかっただけ。
to_proc hack to access hash

```rb
class Array
  def to_proc
    ->(h) { length == 1 ? h[first] : h.values_at(*self) }
  end
end
```

```rb
[
  { name: "Ruby", "age" => 21 }, { name: "Common Lisp", "age" => 56 }
].map(&[:name, "age"])

# => [["Ruby", 21], ["Common Lisp", 56]]
```

But it is about 2.7 times slower than built-in way of doing this:

```rb
require 'benchmark/ips'

class Array
  def to_proc
    ->(h) { length == 1 ? h[first] : h.values_at(*self) }
  end
end

LANGUAGE_AND_AGE = [
  { name: "Ruby", "age" => 21 }, { name: "Common Lisp", "age" => 56 }
]

def built_in
  LANGUAGE_AND_AGE.map { |h| [h[:name], h['age']] }
end

def to_proc_hack
  LANGUAGE_AND_AGE.map(&[:name, "age"])
end

Benchmark.ips do |x|
  x.report('built_in')     { built_in }
  x.report('to_proc_hack') { to_proc_hack }
  x.compare!
end
```

```
$ ruby -v to-proc-hack.rb
ruby 2.2.0preview1 (2014-09-17 trunk 47616) [x86_64-darwin13]

Calculating -------------------------------------
            built_in     88340 i/100ms
        to_proc_hack     47669 i/100ms
-------------------------------------------------
            built_in  1806140.9 (±6.2%) i/s -    9010680 in   5.009917s
        to_proc_hack   665738.9 (±4.9%) i/s -    3336830 in   5.024990s

Comparison:
            built_in:  1806140.9 i/s
        to_proc_hack:   665738.9 i/s - 2.71x slower
```

Source: [Array#to_proc for hash access - The Pug Automatic](http://thepugautomatic.com/2014/11/array-to-proc-for-hash-access/)
【ownCloud】HelloWorldアプリの作り方


# ownCloudとは
* PHPベースのデュアルライセンスをサポートしたオープンソースプロダクト
* Dropboxのようなオンラインストレージを自前の環境に構築可能
* ブラウザの他、専用のWindows、Linux、Mac、Android、iPhone用クライアントから場所を選ばず接続可能
* アドオン機構があるため、独自アプリを実装することが可能
* 日本語公式サイト[ownCloud.jp](http://owncloud.jp)

# 今回やること 
* 上記に記載したアドオン機構を利用して簡単なHelloWorldアプリを作ります。
* Symfony2ベースの独自frameworkのテンプレートをScaffoldingで作ります。
* Scaffoldingするのにpython3が必要なんですが、ひと通りの環境はAWS Marketplaceのテンプレートに入ってるのでご安心ください。
* AWS Marketplaceからのデプロイ方法は[以前の記事](http://qiita.com/ukitiyan/items/f4113aeb4b56d76d3bc2)をご確認ください。

# HelloWorldアプリの作成

## １. ownCloudのデプロイ
* AWS Marketplaceからのデプロイします。デプロイ方法は[以前の記事](http://qiita.com/ukitiyan/items/f4113aeb4b56d76d3bc2)をご確認ください。
* セットアップ完了し、ログイン後のトップ画面が表示できることを確認してください。
![ファイル_-_ownCloud_と_1__root_ip-172-31-30-191____ssh_.png](https://qiita-image-store.s3.amazonaws.com/0/39596/eb2d9414-c76a-baef-c49f-fcd88fe125a1.png "ファイル_-_ownCloud_と_1__root_ip-172-31-30-191____ssh_.png")


## ２. Scaffoldingの実行

1. 1で構築したインスタンスにsshでコンソールログインしてください。
2. 以下のコマンドを叩きます。

		sudo su -
		cd /var/www/html/owncloud/apps
		ocdev startapp HelloWorld --mail hoge@example.com --author "hoge" --description "My first app" --owncloud 7
		chown -R apache:apache helloworld
ocdevの使い方 については、[こちら](https://github.com/owncloud/ocdev)を参照してください。
3. lsコマンドでhelloworldを確認すると以下の構成でアプリのテンプレートが作成されています。
![貼り付けた画像_2014_11_10_16_34.png](https://qiita-image-store.s3.amazonaws.com/0/39596/2dff30ff-788b-92f5-aeec-843d65ac388a.png "貼り付けた画像_2014_11_10_16_34.png")

## ３. HelloWorldアプリのアクティベーション

1. アプリのアクティベーションはブラウザの管理者メニューから行いますので、ブラウザでownCloudにアクセスしてください。
2. 画面左上のメニューから「＋アプリ」を選択してください。
![skitch.36.png](https://qiita-image-store.s3.amazonaws.com/0/39596/f277cb77-f2d3-fc2a-7422-145bcf8a3740.png "skitch.36.png")
3. 画面左のアプリリストからHelloWorldを探し、「有効にする」をクリックします。
![skitch.35.png](https://qiita-image-store.s3.amazonaws.com/0/39596/6c98bc71-f386-5977-03ac-b4379873f6bb.png "skitch.35.png")
4. 画面左上のメニューにHelloWorldが追加されますので、選択するとHelloWorldアプリ画面が表示されます。
![skitch.34.png](https://qiita-image-store.s3.amazonaws.com/0/39596/5afa619b-18e0-2c83-a107-23a7fa32bd31.png "skitch.34.png")

## ４．アプリの拡張
* Hooks、Background Jobs (Cron)、External API等 拡張要素ありますので、以下を参照して弄っていってください。
http://doc.owncloud.org/server/7.0/developer_manual/app/index.html
* といっても、Version7になってから書き方変わっちゃってて未だドキュメントも整備されてないので、細かいところは今後書いてきます。。

## その他
ownCloudの基本情報については、[ownCloudのホームページ](http://owncloud.jp/)を確認してください。
[日本語フォーラム](http://owncloud.jp/forum/)もあるので活用してください。
【Swift】【初心者向け】特定の文字列を置換するなどの覚えて損しないコードまとめ


デザイナーさんと一緒に開発をしたり、
開発スピードを上げるためにStoryBoardを使って
画像やボタンを配置するかと思うのですが、

<b>ある画像やボタンは表示したままにしたい！</b>
<b>ある画像やボタンは非表示にしたい！</b>

といった問題が発生するかと思います。

それだけでなく、

<b>ナビゲーションのタイトルを条件に合わせて変更したい！</b>
<b>特定の文字列を置換したい！</b>

といったように、

<b>難しくはないんだけど知らないとハマるコード</b>

があります。


その度、ググる⇄ハマるのループとなってしまうので、
これを機会に覚えて頂けると開発がよりスムーズになるかと思います。

(以降のコードは全てViewControllerで記述していることを前提にしています。)

<b>前提</b>

```Swift

	// 画像
    @IBOutlet var backImage: UIView!

	// ボタン
    @IBOutlet var decideButton: UIButton!

	// 文字列
	  var replaceStr: String = ""
	  var replaceStr: Int = 0

```


### ボタンや画像を表示/非表示にする

```Swift

	// self.type == 1では表示、それ以外では非表示
	if self.type == 1{

		// 表示
		self.backImage.hidden = false
		self.decidedButton.hidden = false
	}else{
		// 非表示
		self.backImage.hidden = true
		self.decidedButton.hidden = true
	}

```

### ナビゲーションのタイトルを条件に合わせて変更

```Swift

	// self.type == 1ならナビゲーションのタイトルを「g08m11」に変更
	if self.type == 1{
		// 表示
		self.navigationItem.title = "g08m11"
	}

```

pointはnavigationControllerではなく、
navigationItem.titleを使うことです。

### 特定の文字列を置換

```Swift

    // replaceStrに「全域」という文字列があったら削除("")
	self.replaceStr = "沖縄県全域"
    self.replaceStr = self. replaceStr.stringByReplacingOccurrencesOfString("全域", withString: "", options: nil, range: nil)

```



```実行結果

"沖縄県"

```
Yosemite で Java SE が原因で PhpStorm が起動しない際の対処

この問題は、今後JetBrains側で解消される事があると思います。

参考: 
https://laracasts.com/discuss/channels/general-discussion/phpstorm-does-not-work-in-yosemite-help

## 問題

PhpStorm 起動時に、
「PhpStorm を開くには、以前のJava SE 6 ランタイムをインストールする必要があります。」
と出て起動しない

## 原因

Yosemite は標準で JDK 1.7 が入っています。
PhpStorm(IntelliJ IDEA)は現時点で JDK 1.6 のみ対応しています。

## 解決: Apple提供 JDK 1.6 を入れる

http://support.apple.com/kb/DL1572

## 解決: OracleのJava SE 8 を無理矢理使う

/Applications/PhpStorm.app/Contents/Info.plist にて、JVMのバージョンが固定されているため、
1.6* から、以下の記述（やお好きなバージョン）で指定

```
<key>JVMVersion</key>
<string>1.*</string>
```
今さら聞けないjQuery.Deferred入門

# はじめに
* 何となくDeferredを知っているがちゃんと使ったことのない人向けの記事です。
* 本文中の `p` はPromiseオブジェクトを指します。（追記：Deferredオブジェクトを使うこともありますが、普通はPromiseに対して `.then()` や `.done()` をぶら下げます。）

# いきなり具体例

*1* が出力された1秒後に *2* と *done!* が同時に出力される。

```javascript:waterfall.js
function test_deferred() {
	var p = new $.Deferred().resolve().promise();

	p = p
	.then(function() {
		var d = new $.Deferred();
		setTimeout(function() {
			console.log(1);
			d.resolve();
		}, 1000);
		return d.promise();
	});

	p = p
	.then(function() {
		var d = new $.Deferred();
		setTimeout(function() {
			console.log(2);
			d.resolve();
		}, 1000);
		return d.promise();
	});

	return p;
}

test_deferred().done(function(){console.log("done!!")});
```

並列的に処理を実行させる場合は `$.when()` を用いる。

```javascript:parallel.js
// titleとcomment両方が取れるまでPUTを待つ
var title, comment;

var titleDeferred = (function() {
	var dInner = new $.Deferred();
	self.trigger('getTitle', todo, function(res) {
		title = res;
		dInner.resolve();
	});
	return dInner.promise();
})();

var commentDeferred = (function() {
	var dInner = new $.Deferred();
	self.trigger('getComment', todo, function(res) {
		comment = res;
		dInner.resolve();
	});
	return dInner.promise();
})();

$.when(titleDeferred, commentDeferred).done(function() {
	// PUT要求を送る（タイトルとコメント両方がとれたタイミングで）
	todo.save({ id: todo.get('id'), title: title, comment: comment });
});
```

（応用）可変数のDeferredを並列実行させたいときは `func.apply(ctx, argArr)` を用いる。

```javascript:parallelApply.js
var firstDeferred = (function() {
    var dInner = new $.Deferred();
    setTimeout(function() {
        console.log(1);
        dInner.resolve();
    }, 1000);
    return dInner.promise();
})();

var secondDeferred = (function() {
    var dInner = new $.Deferred();
    setTimeout(function() {
        console.log(2);
        dInner.resolve();
    }, 1500);
    return dInner.promise();
})();

// 配列に並列実行させるDeferredオブジェクト群をぶちこむ。
var deferredArray = [firstDeferred, secondDeferred];

// 可変数のDeferredを並列実行させる
$.when.apply($, deferredArray).done(function() {
    console.log('done');
});
```


# `.then()` と `.done()` の使い分け

### _Case1_ : p.then(callbackA).then(callbackB)...

* この場合は、callbackAで返す _Promiseオブジェクト_ が **_resolve()_** されるまで、次の.then()ブロックには入らない。
* `p.then(callback).then(callback).then(callback).done(callback)`  という流れをよく見る。
* thenでwaterfallにチェインしたい際は **必ず** callbackで _Promiseオブジェクト_ をreturnする必要がある。(追記：Deferredオブジェクトを返しても良いが普通はPromiseオブジェクトを返す。)
* returnしないとparallelにcallbackが実行されてしまう。正確には、ひとつ前のPromiseの状態を引き継ぐ挙動になる。


### _Case2_ : p.done(callbackA).done(callbackB)

* この場合は、大元の **_p_** がresolve()された際に、並列的にcallbackA, callbackBが走る。
* （当然だがdoneでチェインする際は、callbackで _Promiseオブジェクト_ をreturnする必要なし）

### _Case3_ : p.then(callbackA).done(callbackB).done(callbackC)

* この場合は、callbackAで返す _Promiseオブジェクト_ がresolve()された『後』にcallbackB、callbackCが並列的に走る。
Ubuntu 12.04 で Unable to locate package libopus-dev の対応 ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

変な動画解釈エンジンscleenをつくってます。一緒にごにょごにょするひと募集中です :smile:

:scream: ffmpeg インストール時に件名のエラーが出た時の対応

```
sudo apt-get install libopus-dev
```

これは見つからないと言われるので、検索対象のレポジトリを追加 :8ball:  します。

```
sudo add-apt-repository ppa:ubuntu-sdk-team/ppa
sudo apt-get update
sudo apt-get dist-upgrade
```

をしたいです。でも、add-apt-repository は無いです :cry: 入れます。

```
sudo apt-get install software-properties
```

何故かこれで入ります :smiley: 入れたらもう一度です :train2: これで、libopus-dev インストールできます。

```
sudo add-apt-repository ppa:ubuntu-sdk-team/ppa
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install libopus-dev
```

**libopus-dev 自体、今回は、ffmpegのコンパイル時のエラーですが、別にいらなければスキップできます** :+1: ffmpegのインストレーション手順をよく読んでね :book: 

# 参考資料

- https://github.com/irungentoo/toxcore/blob/master/INSTALL.md
- http://ubuntuforums.org/showthread.php?t=1971357
- https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu
Androidでposition:fixedとwidth:100%をかけた要素がlandscape(横向き)にしたときに100%にならない場合の対策

タイトルでは分かりづらいのですが、
ニュースサイトやブログなどでよく利用されている、固定配置されたソーシャルボタンなどの追従メニューのことです。

確認した環境はAndroid4.0ですが、恐らく他のバージョンでもなると思います。

タイトルに記載したとおり、スマートフォンサイトで`position:fixed`と`width:100%`をかけた要素があり、横向きにしたときにRepaintが起こらず、portrait(縦向き)のサイズのままとなりました。

対策としては下記のようになります。

## CSS

```css
.fixed-menu {
  position: fixed;
  width: 100%;
}
@media screen and (orientation:landscape) {
  .fixed-menu {
    width: 100%;
  }
}
```

Media Queriesを使用して、landscape時も`width: 100%;`をかけてあげることにより、再描画されます。子要素も`width: 100%;`を指定しているときには一緒に指定してあげましょう。
homebrewでjuliaのHEADのインストールに失敗した時にするといいこと


Yosemiteにあげたあととか、gccのアップデートがからんでjuliaのHEADのインストールが死ぬ時があります。

```bash
brew reinstall julia --HEAD
(...snip...)
==> make -C contrib -f repackage_system_suitesparse4.make prefix=/usr/local/Cellar/julia/HEAD USE_BLAS64=0 FC=/usr/local/bin/gfortran LLVM_CONFIG=llvm-config-3.3 USECLANG=1 LIBBLAS=-lopenblas LIBBLASNAME=libopenblas LIBLAPACK=-lopen
	clang++ -stdlib=libc++ -mmacosx-version-min=10.7 -m64 -shared -Xlinker -all_load /usr/local/opt/suite-sparse-julia/lib/libsuitesparseconfig.a /usr/local/opt/suite-sparse-julia/lib/libspqr.a   -o /private/tmp/julia-FrXHX4/usr/lib/libspqr.dylib -L/private/tmp/julia-FrXHX4/usr/lib -L/usr/local/opt/suite-sparse-julia/lib -L/usr/local/opt/arpack-julia/lib -L/usr/local/opt/openblas-julia/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/llvm33-julia/lib -L/usr/local/opt/libffi/lib -L/usr/local/opt/cloog018-julia/lib -L/usr/local/opt/isl011-julia/lib -L/usr/local/opt/gmp4-julia/lib -L/usr/local/lib -F/usr/local/Frameworks -Wl,-headerpad_max_install_names -headerpad_max_install_names -lcholmod -lcolamd -lamd -lopenblas -Wl,-rpath,'@loader_path/' && \
	install_name_tool -id @rpath/libspqr.dylib /private/tmp/julia-FrXHX4/usr/lib/libspqr.dylib
ld: file not found: /usr/local/lib/gcc/x86_64-apple-darwin13.4.0/4.9.1/libgfortran.3.dylib for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [default] Error 1
```

こういうときは、慌てず騒がずarpackとopenblasをsourceからインストールし直しましょう。

```
brew rm arpack-julia openblas-julia
brew install --build-from-source arpack-julia openblas-julia
brew reinstall julia --HEAD --with-accelerate
```

よくわからなくて、make distclean && makeしてたのに、これだけで十分とは...。

source: https://github.com/staticfloat/homebrew-julia/issues/123
iOSアプリ 64bit 対応メモ

アップルがiOSアプリ開発者向けて、2015年2月以降の新規アプリおよび更新には64bit対応および iOS 8 対応を義務付けることを宣言しました。
~~先日申請しようとした際に64bitに対応してないよと怒られたので、現段階でも申請するアプリには64bit対応が義務付けられているようです。~~いつかはくることがわかっていましたが、今回やっと64bit対応しました。
※(11/18更新)現在でも64bit対応が義務付けられていると書いてありますがおそらく間違いです。混乱させてしまい申し訳ありません。
私の場合、validateの時点でワーニングが表示され、64bit対応してから申請したため、64bit対応前に申請していないのですが、おそらく申請はできると思います。validateもあくまでワーニングであり、validateはpassしたと記憶しています。曖昧な記憶で申し訳ありません。


今回は、そのときにおこなった対応をまとめておきます。いろいろ調べていても情報が少なく、結構時間を取られたので同じ症状の方は参考にしてください。
正しい解決策かわからないので、間違っていることがあれば言っていただけると幸いです。

公式の移行ガイド
[Cocoa Touch 64ビット移行ガイド](https://developer.apple.com/jp/documentation/CocoaTouch64BitGuide.pdf)

## 公式ガイドを読む

バイト長が変わったり、関数呼び出しが変わったようです。
また、**実機でないと発生しない**ときもあるようなので、実機テストが必要とのことでした。

ここはガイドの通りに対応しました。

## その他におこなったこと

### Valid Architectureにarm64を追加

昔64bitが入っているとエラーが出たときに64bitを外すことで対応したので、今回64bitを追加しました。

Project > Build Settings > Architectures > Valid Architectures に arm64 を追加します。

### Apple Mach-O Linker Errorを解消

とりあえずこれで実行してみるとApple Mach-O Linker Errorが出ました。エラー文は以下の通りです。
ライブラリを使っていると起こるエラーだと思いますが、公式ドキュメントにはライブラリに関する話はもちろん無いので、ここで結構詰まりました。

```
ld: warning: directory not found for option '-L/Users/.../Pods/build/Debug-iphoneos'
ld: library not found for -lPods-AFNetworking
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

これを解消するために以下の操作をおこないました。

#### Build Active Architecture OnlyのDebugをNoにする

Pods > Build Settings > Architectures > Build Active Architecture Only のDebugをNoにすると動くようになりました。