OmniAICreator/Qiita-1.07M huggingface dataset:
nyagosでpushd/popd/dirsする

nyaos3000では内臓のpushd/popd/dirsがありましたが、~~nyagosでは無いので~~内蔵コマンドとして実装されたようです[`8b6d643`](https://github.com/zetamatta/nyagos/commit/8b6d64341d8c8146df4219c5144a82d08b108917)
luaスクリプトで実装してみます。

気を付けるのは`alias cd=pushd`とエイリアスしても、再帰呼び出しにならないよう事前に`alias _cd=cd`しておく位でしょうか[以前の記事](http://qiita.com/nocd5/items/be69928401489da1c107)と同じですね。

```lua:.nyagos
directory_stack = {}
------------------------------------------------
-- pushd/popd/dirsの実装
------------------------------------------------
-- pushd
function nocd5_pushd(args)
    local old = chomp(nyagos.eval('pwd'))
    r, err = nyagos.exec("_cd " .. args[1])
    if (err == nil) then
        table.insert(directory_stack, 1, old)
    else
        return r, err
    end
end
------------------------------------------------
-- popd
function nocd5_popd(args)
    if (#directory_stack ~= 0) then
        local num = 0
        if #args == 0 then
            num = 1
        else
            num = tonumber(args[1])
        end
        nyagos.exec("_cd " .. directory_stack[num])
        table.remove(directory_stack, num)
    else
        print ('popd: dir stack is empty.')
    end
end
------------------------------------------------
-- dirs
function nocd5_dirs()
    max_len = string.len(tostring(#directory_stack))
    for i, e in ipairs(directory_stack) do
        len = string.len(tostring(i))
        print(string.rep(' ', max_len - len) .. i .. ' : ' .. e)
    end
end
------------------------------------------------

------------------------------------------------
-- alias
------------------------------------------------
alias{
    _cd='cd', -- cdコマンドの再帰呼び出しを回避
    cd=nocd5_pushd,
    pushd=nocd5_pushd,
    popd=nocd5_popd,
    dirs=nocd5_dirs,
    pu=nocd5_pushd,
    po=nocd5_popd,
    di=nocd5_dirs
}
------------------------------------------------
```

自分の環境ではさらにmigemoを使ったディレクトリ移動など、
ごちゃごちゃしてますので興味があればこちらも([nocd5/nyagosfiles](https://github.com/nocd5/nyagosfiles))
WPFで実行ファイルとDLLを一つにまとめる（VB.NET編）

##その１ プロジェクトファイルにコマンドを追加
VBプロジェクトファイルの

```xml
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
```

のあとに以下の文字列を挿入します

```xml
<Target Name="AfterResolveReferences">
  <ItemGroup>
    <EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'">
      <LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
</Target>
```

##その２ EXEからアセンブリをロードするコードを追加
以下のコードをソースファイルにしてプロジェクトに追加してください。

```vbnet:startup.vb
<System.STAThreadAttribute(), _
System.Diagnostics.DebuggerNonUserCodeAttribute()> _
Public Sub Main()
    AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf OnResolveAssembly
    Dim app As Application = New Application()
    Dim oMain As New MainWindow
    app.Run(oMain)
End Sub 

Private Function OnResolveAssembly(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
    Dim executingAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()
    Dim assemblyName As New System.Reflection.AssemblyName(args.Name) Dim path As String = assemblyName.Name + ".dll"
    If assemblyName.CultureInfo.Equals(System.Globalization.CultureInfo.InvariantCulture) = False Then
path = [String].Format("{0}\{1}", assemblyName.CultureInfo, path)
    End If 
    Using stream As System.IO.Stream = executingAssembly.GetManifestResourceStream(path)
        If stream Is Nothing Then
            Return Nothing
        End If 
    Dim assemblyRawBytes As Byte() = New Byte(stream.Length - 1) {}
stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length)
        Return System.Reflection.Assembly.Load(assemblyRawBytes)
    End Using
End Function
End Module
```

##その３ プロジェクト設定を変更
プロジェクト設定を変更して、スタートアップオブジェクトをその２で追加したソースに変更する。
すべて終了したらビルドすればEXE単独で起動できるようになります。

ただし、WPFToolkitのグラフのようにDLLからDLLの関数を呼んでいたりすると動かない場合があるので１００％とはいきませんが９９％くらいはこれでいけます。

WPFプロジェクトじゃなくても使えるので意外に便利です。

今回の記事は次のサイトの日本語訳だったりする
[DLL embedding in a WPF or WinForm application (VB.NET and C#)](http://www.kastory.net/index.php?option=com_content&view=article&id=8:dll-embedding-in-a-wpf-or-winform-application-vbnet-and-c&catid=11&Itemid=126&showall=1&limitstart=)
はじめてのパターン認識　第１章

#第1章	はじめに
####学習内容
・パターン認識の流れについて
・パターン認識に用いられる特徴の種類とその性質
##1.1 パターン認識とは
　広辞苑的な意味でパターン認識とは**「物事の類型を知るはたらき、およびその内容」**ということになる。
　これは具体的な例に落としこむとわかりやすくなる。例えば、自動販売機や券売機などにおいては、投入された紙幣や硬貨の識別がパターン認識の処理を行っている。硬貨の識別に注目すると、まず投入された硬貨の重さやサイズ、穴の有無など**識別の手がかりとなる特徴**を測定する。これをパターン認識の分野では**特徴抽出**とよぶ。これらの抽出された特徴をベクトル形にまとめたものを**特徴ベクトル**とよび、特徴ベクトルを用いて投入された硬貨が、10円、50円、100円500円、その他、偽物(識別不能)など、**クラス**として分類される。この分類するための規則は**識別規則**と呼ばれる。これらをまとめたのが以下の図である。

![名称未設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/56672/6fdb2870-ddd9-b8dc-de38-a3fac7324e36.png)

　本書の主題となっている、特徴ベクトルを入力データとみなし、クラス分けを行うための**識別規則**とその**学習に**関してと、未知の入力データに対して識別を行うための**汎化能力**がパターン認識の鍵となる。
#####cf. 身近にあるパターン認識装置
自動販売機(硬貨,紙幣)、音声認識(単語,文法など)、カメラの顔画像認識など…
##1.2 特徴の型
　識別に有効な特徴は大きく分けて4つに分類される。以下にそれをまとめる。
######定性的特徴
* 名義尺度:クラス名など分類のための名前。
* 順序尺度:順序関係を表し、比較はできるが、相対的、絶対的な数値としての意味はもたない。

######定量的特徴
* 間隔尺度:一定の単位で図られた尺度で相対的な数値の意味をもつ。
* 比例尺度:原点が定まっている量で、絶対的な数値の意味をもつ。

##1.3 特徴ベクトルと次元の呪い
パターン認識では**特徴ベクトルを入力として識別を行う**。特徴数を$d$とすると、特徴量は$d$次元空間を張る。さらにその$d$個の特徴がいくつかの階調をもって入力される場合、特徴ベクトルのもつ階調を次元に対して指数関数的に増加させた数だけの入力値が存在することになる。
　例えば、$16×16=256$画素の画像データに対し、各画素に16段階のグレイスケールをもつ場合、$16^{256}$の膨大な数の数値データが存在することになる。このように空間の次元が増えるのに対応して問題の算法が指数関数的に大きくなることを**次元の呪い**という。
#####cf.　d次元単位超立方体
　*$d$次元超立方体は、後章に登場する近似最近傍探索と决定木において重要な役割を果たす。*
　単位超立方体とは各次元に一般化した正多胞体であり、0次元で点、1次元で直線、2次元で正方形、3次元で立方体、4次元で正八胞体となる。
　我々の生活している世界の物理法則では3次元単位超立方体までしか正確に図示できないが、$d$次元の単位超立方体では各頂点から$d$方向に伸びる辺の長さはすべて等しく、角も直角であると定義され、単位超立方体における面は各軸の直交する$d-1$次元超平面で構成されており、全部で$2d$個の面をもつ。つまり、3次元超立方体では6つの2次限長平面(これは立方体と面の関係と同様)、4次元超立方体では8つの3次元超平面(≒立方体)を面とした正八胞体として定義されている。また、超平面においては0次元における点や1次元における線も超平面として定義される。
[値型]と[参照型]、[値渡し]と[参照渡し]がそろってる言語で実行例を出す

これで値の値渡しと値の参照渡しと参照の値渡しと参照の参照渡しの違いが分かっただろう

## 実行コード

```csharp
using System;

class Program {
    struct ValWrap { public int value; }
    class RefWrap { public int value; }

    static void swapAndEdit(ValWrap left, ValWrap right) {
        var tmp = left;
        left = right;
        right = tmp;
        tmp.value *= 100;
    }
    static void swapAndEdit(RefWrap left, RefWrap right) {
        var tmp = left;
        left = right;
        right = tmp;
        tmp.value *= 100;
    }
    static void swapAndEdit(ref ValWrap left, ref ValWrap right) {
        var tmp = left;
        left = right;
        right = tmp;
        tmp.value *= 100;
    }
    static void swapAndEdit(ref RefWrap left, ref RefWrap right) {
        var tmp = left;
        left = right;
        right = tmp;
        tmp.value *= 100;
    }

    static void Main() {
        {
            Console.WriteLine("値の値渡し");
            var left = new ValWrap();
            left.value = 1;
            var right = new ValWrap();
            right.value = 2;
            swapAndEdit(left, right);
            Console.WriteLine(left.value + ", " + right.value);
        }
        {
            Console.WriteLine("参照の値渡し");
            var left = new RefWrap();
            left.value = 1;
            var right = new RefWrap();
            right.value = 2;
            swapAndEdit(left, right);
            Console.WriteLine(left.value + ", " + right.value);
        }
        {
            Console.WriteLine("値の参照渡し");
            var left = new ValWrap();
            left.value = 1;
            var right = new ValWrap();
            right.value = 2;
            swapAndEdit(ref left, ref right);
            Console.WriteLine(left.value + ", " + right.value);
        }
        {
            Console.WriteLine("参照の参照渡し");
            var left = new RefWrap();
            left.value = 1;
            var right = new RefWrap();
            right.value = 2;
            swapAndEdit(ref left, ref right);
            Console.WriteLine(left.value + ", " + right.value);
        }
    }
}
```

## 実行結果

```text
値の値渡し
1, 2
参照の値渡し
100, 2
値の参照渡し
2, 1
参照の参照渡し
2, 100
```
Elixir Sigils

# Elixir Sigils

## 概要
Elixir の Sigils について。

Sigil: 印, 印鑑, 魔力を持つしるし.

Elixir の文字列表現には、ダブルクォートやシングルクォートの文字リスト表現などがありますが、
もう一つの表現方法として Sigils があります。

Elixir のゴールの一つは ドメインに特化した記述が柔軟にできるような拡張性を持つことです。

※Rubyに詳しい方は %記法 の文法に近い話だと思えばいいです

## Siglis
基本的な文法は、チルダ＋1文字＋セパレータです。
例えば、正規表現は チルダ＋r＋セパレータです。

~~~
iex> hogex = ~r/h.ge/
~r/h.ge/
iex> "hoge" =~ hogex
true
iex> "hige" =~ hogex
true
iex> "hage" =~ hogex
true
iex> "hagee" =~ hogex
true
iex> "hag" =~ hogex
false
~~~

セパレータは、他の言語の正規表現で一般的であるスラッシュを利用しているが、
全部で8種類の記述方法がある。

~~~
~r/h.ge/
~r|h.ge|
~r"h.ge"
~r'h.ge'
~r(h.ge)
~r[h.ge]
~r{h.ge}
~r<h.ge>
~~~

## 文字列（ダブルクォート代替）
~s / ~S でダブルクォートを代替します。
小文字はエスケープ・変数展開可、大文字はエスケープ・変数展開不可。

~~~
iex> var = "@@@"
"@@@"
iex> ~s(hoge hige hage) |> String.upcase
"HOGE HIGE HAGE"
iex> ~s(hoge hige hage #{var}) |> String.upcase
"HOGE HIGE HAGE @@@"
iex> ~S(hoge hige hage #{var}) |> String.upcase
"HOGE HIGE HAGE \#{VAR}"
~~~

## 文字列（シングルクォート代替）
~c / ~C でシングルクォートを代替します。
小文字はエスケープ・変数展開可、大文字はエスケープ・変数展開不可。

~~~
iex> var = "@@@"
"@@@"
iex> ~c(hoge hige hage) |> Enum.take(6)
'hoge h'
iex> ~c(#{var} hoge hige hage) |> Enum.take(6)
'@@@ ho
iex> ~C(#{var} hoge hige hage) |> Enum.take(6)
'\#{var}'
~~~

## 文字列配列
~w で文字列配列を代替します。
小文字はエスケープ・変数展開可、大文字はエスケープ・変数展開不可。

modifier として
s : ダブルクォート
c : シングルクォート
a : Atom
がある。
デフォルトはダブルクォーオトです。
modifier の大文字小文字については既出のルールと同じ

~~~
iex> 
iex> ~w(hoge hige hage) |> Enum.take(2)
["hoge", "hige"]
iex> ~w(hoge hige hage)s |> Enum.take(2)
["hoge", "hige"]
iex> ~w(hoge hige hage)s |> Enum.take(2)
["hoge", "hige"]
iex> ~w(hoge hige hage)c |> Enum.take(2)
['hoge', 'hige']
iex> ~w(hoge hige hage)a |> Enum.take(2)
[:hoge, :hige]
~~~

## ヒアドキュメント

~~~
iex> var = "@@@"
"@@@"
iex> ~s"""
...> line1
...> #{var}
...> line3
...> """
"line1\n@@@\nline3\n"

iex> var = "@@@"
"@@@"
iex> ~S"""
...> line1
...> #{var}
...> line3
...> """
"line1\n\#{var}\nline3\n"

iex> var = "@@@"
"@@@"
iex> chars = ~c"""
...> line1
...> #{var}
...> line3
...> """
'line1\n@@@\nline3\n'
iex> chars |> Enum.take(10)
'line1\n@@@\n'
~~~

### カスタム Sigil
* sigil_r
Sigil を呼び出すのと同等のことができます

~~~
iex> regexp = sigil_r(<<"h.ge">>, 'i')
~r/h.ge/i
iex> "hoge"=~regexp
true
iex> "hge"=~regexp
false
~~~

* custom sigit

~~~
iex> defmodule UpDownSigils do
...>   def sigil_u(string, []), do: String.upcase(string)
...>   def sigil_d(string, []), do: String.downcase(string)
...> end
{:module, UpDownSigils,
 <<70, 79, 82, 49, 0, 0, 5, 152, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 213, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 2, 104, 2, ...>>,
 {:sigil_d, 2}}
iex> import UpDownSigils
nil
iex> ~u(hOgE)
"HOGE"
iex> ~d(hOgE)
"hoge"
~~~

## 参照
http://elixir-lang.org/docs/stable/elixir/Regex.html
http://elixir-lang.org/getting_started/19.html
nyagosでヒストリ補完する

※一部修正
=========
ヒストリのリストの範囲外を参照してしまっている所がありましたので修正しました

```diff
-    for i = 0, hist_len do
+    for i = 1, hist_len do
```

nyagosには実装されていません
=========================
nyaos3000では`vzlike-previous-history`と`vzlike-next-history`のヒストリ補完がありましたが、
nyagosは「本体はコンパクトに、機能拡張はLuaで！」という設計思想のもと、これらのファンクションは実装されていません。
しかし、nyagosにはLuaで書いた機能をキーバインドに設定ためのインターフェイス`nyagos.bindkey("キー名",function(this) ... end)`があります。この機能を使うことでLuaスクリプトで実装しましょう。

nyaos3000のそれとの違い
=====================
nyaos3000の`vzlike-previous-history`, `vzlike-next-history`は単語単位の補間という感じでしたが、
今回の実装はtcshの補完に近く、行単位の補完となっています。

また、補完元の検索ワードを判別するため、カーソル位置を元あった場所に戻しているので慣れるまで違和感があるかもしれません。
なお、補完元の検索ワードに日本語などのマルチバイト文字が入っているとズレていきますが、
そこは仕様ということでお願いします(補完先の文字列にマルチバイト文字が混じっている場合は大丈夫です)。

実装例
=====
```lua:.nyagos
nyagos.bindkey("C_N",
    function(this)
        search_history(this, false)
    end
)

nyagos.bindkey("C_P",
    function(this)
        search_history(this, true)
    end
)

function search_history(this, is_prev)
    -- カーソル位置が一番左の場合は通常のnext/prev
    if this.pos == 1 then
        if is_prev == true then
            this:call("PREVIOUS_HISTORY")
        else
            this:call("NEXT_HISTORY")
        end
        this:call("BEGINNING_OF_LINE")
        return nil
    end

    -- 検索キーワード
    local search_string = this.text:sub(1, this.pos - 1)

    -- 重複を除いたhistoryリストの取得
    local history_uniq = {}
    local is_duplicated = false
    local hist_len = nyagos.gethistory()
    for i = 1, hist_len do
        local history
        -- 新しい履歴がリスト後ろに残るよう末尾からサーチ
        history = nyagos.gethistory(hist_len - i)
        for i, e in ipairs(history_uniq) do
            if history == e or history == search_string then
                is_duplicated = true
            end
        end
        if is_duplicated == false then
            if is_prev == true then
                table.insert(history_uniq, history)
            else
                table.insert(history_uniq, 1, history)
            end
        end
        is_duplicated = false
    end

    -- 入力と完全一致する履歴を探す
    -- 完全一致する履歴を起点にすることで
    -- (見かけ上)インクリメンタルな検索にする
    local hist_pos = 0
    for i, e in ipairs(history_uniq) do
        if e == this.text then
            hist_pos = i
            break
        end
    end

    -- 前方一致する履歴を探す
    local matched_string = nil
    for i = hist_pos + 1, #history_uniq do
        if history_uniq[i]:match('^' .. search_string .. '.*') then
            matched_string = history_uniq[i]
            break
        end
    end

    -- 見つかった履歴を出力
    -- 見つからなければ、検索キーワードを出力
    this:call("KILL_WHOLE_LINE")
    if (matched_string ~= nil) then
        this:insert(matched_string)
    else
        this:insert(search_string)
    end
    this:call("BEGINNING_OF_LINE")
    for i = 1, this.pos - 1 do
        this:call("FORWARD_CHAR")
    end
end
```
ffmpegで動画上にテキストを描画する

## 最小限のコマンド

```bash
ffmpeg -i input.mp4 -filter_complex "drawtext=fontfile=/path/to/fontfile:text=My Text" output.mp4
```

または

```bash
ffmpeg -i input.mp4 -vf drawtext="fontfile=/path/to/fontfile:text=My Text" output.mp4
```

`input.mp4`, `/path/to/fontfile.ttc`, `MyText`, `output.mp4`は必要に応じて書き換えてください。
この状態では、動画の左上に黒い文字でサイズ16のテキストが描画されます。必要に応じて`drawtext`の部分のオプションを追加します。

※`-vf`と`-filter_complex`の使い分けについては[ffmpegのドキュメント](https://www.ffmpeg.org/ffmpeg.html#Filtering)を参照。以下の説明では全て`-filter_complex`を使用します。


## 描画位置を指定する

```bash
ffmpeg -i input.mp4 -filter_complex "drawtext=fontfile=/path/to/fontfile:text=MyText:x=100:y=100" output.mp4
```
`x=???:y=???`のところに座標を指定します。左上が0,0です。
座標の指定は数値だけでなく、`main_w`, `main_h`, `text_w`, `text_h`という変数が使えます。
動画の中央にテキストを描画するには`x=(w-text_w)/2:y=(h-text_h-line_h)/2`と指定します。
詳細は[ffmpegのドキュメント](https://www.ffmpeg.org/ffmpeg-filters.html#Syntax)を参照。

## 文字色を指定する

```bash
ffmpeg -i input.mp4 -filter_complex "drawtext=fontfile=/path/to/fontfile:text=My Text:fontcolor=white" output.mp4
```

`fontcolor=色`で文字色を指定します。色の指定方法は`white`,`yellow`などの色名か、`#ff9988`のようにRGBカラーコードで行う。
詳細は[ffmpegのドキュメント](https://www.ffmpeg.org/ffmpeg-utils.html#Color)を参照。

## 一定期間だけ文字を表示する

```bash
ffmpeg -i input.mp4 -filter_complex "drawtext=fontfile=/path/to/fontfile:text=My Text:enable='between(t,3,5)'" output.mp4
```
`enable='式'`オプションを付けると、`式`が0以外の値を返す場合のみフィルター(今回の場合は`drawtext`)が有効になります。
`t`は動画の再生時間を表す変数で、`'between(t,3,5)'`だと3秒～5秒の間のみテキストが描画されます。
詳細は[ffmpegのドキュメント](https://www.ffmpeg.org/ffmpeg-filters.html#Timeline-editing)を参照。

## 文字をフェードインさせる

```bash
ffmpeg -i input.mp4 -filter_complex "drawtext=fontfile=/path/to/fontfile:text=My Text:enable='between(t,2,5)' [subtitles]; [subtitles][0:v] blend=all_expr='A*(if(between(T,2,3), (T-2), 1)) + B*(1-(if(between(T,2,3), (T-2), 1)))' [out]" -map [out] -map 0:a output.mp4
```
一気にややこしくなりましたが、ここで行っているのは文字を重ねた後の動画フレームと元のフレームを合成(blend)する処理です。
合成の割合は`all_expr=式`の式で指定します。式が`A`だと文字を重ねた後のフレーム、`B`だと元のフレーム、`A * 0.5 + B * 0.5`だと半々の合成になります。
フェードインをするということは、`A * 1 + B * 0`→`A * 0.9 + B * 0.1`→`A * 0.8 + B * 0.2`→...`A * 0.1 + B * 0.9`→`A * 0 + B * 1`のように時間ごとにAとBの係数を変化させれば良いのです。
上記の例では2秒地点で`A * 0 + B * 1` 、3秒地点で`A * 1 + B * 0`となるように想定していて、その間が滑らかに繋がるようになっています。`T`が2.1, 2.2, 2.3, ... と増えていく時に上記の式がどのような結果になるかを考えてみてください。

## フェードイン・フェードアウトさせる

```bash
ffmpeg -y -i input.mp4 -filter_complex "drawtext=fontfile=/path/to/fontfile:text=My Text:x=(w-text_w)/2:y=(h-text_h-line_h)/2:box=1:enable='between(t,2,5)' [subtitles]; [subtitles][0:v] blend=all_expr='A * (if(between(T, 2, 3), (T-2), if(between(T, 4, 5), (5-T), 1))) + B * (1 - (if(between(T, 2, 3), (T-2), if(between(T, 4, 5), (5-T), 1))))' [out]" -map [out] -map 0:a output.mp4
```

2～3秒でフェードインして、4～5秒でフェードアウトするコマンド。
UITableView の tableHeaderView の高さをアニメーションつきで変更する

## UITableView の tableHeaderView の高さをアニメーションつきで変更する

### 問題点

UITableView の tableHeaderView は、単純に

```swift
self.tableView.tableHeaderView.frame.size.height = 500
```

としても値は変更されません。

### 対応策

下記のように、いったん別Viewに代入し、tableHeaderViewに再び代入すれば変更できる。

```swift
let headerView = self.tableView.tableHeaderView as UIView!

headerView.frame.size.height = 500
self.tableView.tableHeaderView = headerView
```

### アニメーションつきで変更する

```swift
let headerView = self.tableView.tableHeaderView as UIView!
UIView.animateWithDuration(1.0, delay: 0.0, options: nil,
  animations: { () -> Void in
    headerView.frame.size.height = 500
    self.tableView.tableHeaderView = headerView
  }, completion: { (finished) -> Void in
    // do something
})
```

アニメーションつきで消す場合はこんな感じになるかと思います。
クライアントがどのSSLプロトコルでアクセスしてきているか確認する(nginx)

POODLE対応とかでSSLv3を無効にする前に実際にSSLv3でアクセスしてきているクライアントがどれくらいいるのか確認したい場合、nginxだと$ssl_protocolという変数があるのでこれをlog_formatに入れるとよい。

```nginx
    log_format  main  '$remote_addr'
                      '$request'
                      '$http_user_agent $http_x_forwarded_for'
                      '$ssl_protocol';

```

これでログにSSLv3とかTLSv1とか出力されるようになる。
iOS でデバイスの向きを取得するときの罠

## よくやるやつ
デバイスの向きを取得する場合、下記のようなコードをよく見かけます。

```objc
UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
switch (orientation) {
    case UIInterfaceOrientationPortrait:
        break;
    default:
        break;
}
```

一見大丈夫そうなんですが、実はこれだとenum の値が0で返ってくることがあります。
手元で確認した限りでは、シミュレータとテーブルの上に水平においたデバイスの両方で再現しました。
つまり上の例だと、実際はPortraitとして認識してほしいのにdefaultの方に処理が流れちゃうことがあります。

おーこわ。

## [[UIApplication sharedApplication] statusBarOrientation] を使おう
```objc
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
switch (orientation) {
    case UIInterfaceOrientationPortrait:
        break;
    default:
        break;
}
```

詳しいことはわかりませんが、これで無事、正しい向きが取得できました。

## 参考
 - [iOS 画面の回転状態を調べる](http://blog.livedoor.jp/arumisoft/archives/6688430.html)
 - [UIDeviceOrientation と UIInterfaceOrientation](http://qiita.com/CarmineScarlet/items/26ab954cd10c291bf0ae)

# 2022/12/02 追記

`statusBarOrientation` は非推奨になっています。
https://developer.apple.com/documentation/uikit/uiapplication/1623026-statusbarorientation


> Use the interfaceOrientation property of the window scene instead.

とあるので、そっちを使いましょう。（未確認）
(覚え書き) col ユーザ追加とrootのssh禁止

2013/03/19　ごろの作業

# パスワードポリシー

* 有効期限：  
設定しない。設定したい場合はchageコマンドを全員に適用（Pマーク対策に）。
* 強度：  
pam_cracklib を利用すると良いのですが特に設定していません。設定が必要な場合は /etc/pam.d/system-auth の 「password requisite 」 の部分に以下の設定を記述。

```
  difok=N     現在のパスワードと N文字以上異なれば許可。
  minlen=N    パスワードが N文字以上だと許可。
  dcredit=-N  数字が N文字以上含まれていれば許可。
  ucredit=-N  大文字が N文字以上含まれていれば許可。
  lcredit=-N  小文字が N文字以上含まれていれば許可。
  ocredit=-N  その他の文字が N文字以上含まれていれば許可。
```

# ユーザ追加

* ユーザ名  
適当に
* ユーザID  
社員番号＋2000 にしたいが社員番号がまだきまっていないので1000から適当に。サービス用アカウントは600から順に。
* プライマリグループ  
users
* セカンダリグループ  
特になし
* homeディレクトリ  
標準
* ログインシェル  
標準
* 有効期限  
標準（なし）
* パスワードの使用期限が切れてからアカウントが有効期限が無効になるまでの日数  
標準（-1）
* 初期パスワード  
適当に

```
# useradd -u 1053 -g users masashi
# passwd masashi
(xxx)
# id maashi
uid=1053(masashi) gid=100(users) 所属グループ=100(users)
```

```
# useradd -u 600 -g users shift-web
# passwd shift-web
(xxx) 
```

# rootのssh禁止

```/etc/ssh/sshd_config``` を修正

```
# more /etc/ssh/sshd_config
#       $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $
#
...(中略)
# Authentication:

#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
...(略)
```

PermitRootLoginがコメントアウトされているので以下に修正

```
#       $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $
#
...(中略)
# Authentication:

#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
...(略)
```

設定変更が完了したらsshdを再起動

```shell-session
# service sshd restart
```

rootでsshできないことを確認

# sudoの設定

```shell-session
# visudo
masashi ALL=(ALL) ALL
```

# SELINUXの解除

```shell-session
$ sudo vi /etc/sysconfig/selinux
    SELINUX=enforcing
        ↓
    SELINUX=disabled
...(保存)

$ sudo reboot
...(再起動後)
$ getenforce
Disabled
```
GenymotionでVagrant(LAN環境)のホスト名を解決する方法

Macbook内のVagrantで立てたサーバに、Genymotion上のエミュレータでホスト名を解決する方法を書いておきます。仮想端末は起動した状態で作業してください。

こちらの方のエントリにすべてが書いてあったが英語だったので。

http://okamuuu.hatenablog.com/entry/2014/01/31/231307

```lang:shell
adb pull /system/etc/hosts /tmp/hosts
echo "192.168.57.1 test.example.com" >> /tmp/hosts
adb remount
adb push /tmp/hosts /system/etc
```

192.168.57.1とtest.example.comはご自身の環境に置き換えてください。

やってることは単純でマウントしたAndroidデバイスのホストファイルをMac側で書き換えて上書きしているだけ。簡単でした！
google maps sdkとamazon maps sdk

SupportMapFragment継承したクラスだけproduct flavorで分離すれば何とかなるだろうという甘い気持ちで調査した結果

### 結論（2014/10現在）

- 安易に対応するのは不可能
 - 元々両方対応する前提で設計しておく必要がある
- Map使用部分以外も影響が出る場合がある
- **極めてシンプルな用途（特定の場所にマーカー出すだけとか）の場合は別**
- クオリティ的にはWebViewからgoogle maps javascript api v3使ったほうが圧倒的に高い
 - 要JavascriptInterface
 - (Javaコード内にJavascriptコードが混在することにより)メンテナンス性が落ちる 

#### 個人的に推奨する対応

1. Kindle版が本当に必要かを考える**（超重要）**
2. 多少機能やUX/UIを落としてWebViewとJavascriptで頑張れるところまで頑張る（どっちかといえばお勧め）
3. Amazon maps sdkで頑張る（お勧めしません）

### 致命的な制約

#### com.amazon.geo.maps.MapActivity を継承しなければならない

- ActionBarActivityが使えない 
 - 2.3でActionBar, Fragmentサポートしてると詰むor全体に影響する
- 4.0以降であっても影響が大きい場合がある
 - google版をMapFragmentベースで設計している
 - Activityに継承関係がある
 - etc...

フォーラムの関連スレッド
http://forums.developer.amazon.com/forums/thread.jspa?threadID=3673&tstart=0

#### （日本の）詳細な位置情報がサポートされていない

- 都道府県・市レベルならまあ使える
- 区町村以上拡大すると、ひどい

#### google maps api v1相当の機能しか提供されていない

 - 元々v1使ってる場合は何とかなるかもしれない

### 場合によってはかなりきつい制約

- android-maps-util相当のライブラリがない
 - https://github.com/googlemaps/android-maps-utils
- その他地図関連のライブラリ使用している場合も同様 
 
### 何とかなるレベルの制約

#### 緯度・経度の表現
- google
 - com.google.android.gms.maps.model.LatLng
 - double型
 - degree (10^6掛ければ同じになるはず)
- amazon
 - com.amazon.geo.maps.GeoPoint
 - int型
 - micro degree

#### ズーム値の表現
- google : float型
- amazon : int型

同じ数値で見た目的にも同じズーム状態になるかは不明
(覚え書き) VMの自動起動

# VM自動起動

以下Xenサーバ側のコンソール上にて。

```shell-session
xe pool-list
```

poolのuuidを確認

```shell-session
xe pool-param-set uuid=(上記uuid) other-config:auto_poweron=true
```

Xen Centerにて自動起動したいVMのuuidを確認。

```shell-session
xe vm-param-set uuid=(VMのuuid) other-config:auto_poweron=true
```

これできっと大丈夫なはず・・・でもシャットダウンしていないので動作未確認。
(覚え書き) CentOS6.4のVM作成

2013/03/18 ごろの作業

# VM作成

* 困ったことにフルDVDからのインストールはできない（パッチを当てればできるかもしれないらしいが面倒なので試していない）
* netinstall版からならインストールできるのでこちらのISOをもってくる  
``` \\nas\public\ISO\CentOS-6.4-x86_64-netinstall.iso ```
* XenCenterの「New Storage」ボタンをクリック
 + Type選択画面で「Windows File Sharing(CIFS)」を選択
 + Nameは適当にわかりやすいものに
 + Locationの「Share Name」に```\\nas\public\ISO```といったように上記のISOがあるフォルダへのフルパスを指定
* XenCenterの「New VM」ボタンをクリック
 + Template では 「CentOS 6 (64bit)」を選択
 + Name はホスト名を付けておけばわかりやすいか
 + Installation Media では上記で作ったStorageにある```CentOS-6.4-x86_64-netinstall.iso```を選択
 + Home Serverは複数台ある場合は適切なものを選択
 + CPU&Memoryは適当に
 + Storageは8GBが初期値になっているのでPropertiesボタンから128GB等適切な容量に変更
 + NetworkingはNICが1枚なら選択の余地無し

以上でISOをマウントした状態でBOOTが始まります。

# インストール開始

以下はテキストモードでインストールしましたが、実際にはVNCを利用してminimumセットのインストールを利用しています（たぶん同じ？）。

* Media Test  
[Skip]
* Choose a Language  
[Japanese]
* Installation Method  
[URL]
* Configure TCP/IP  
[Enable IPv4 support] - [Dynamic IP configuration]  
[Enable IPv6 support] - [Automatic]  
* URL Setup  
http://ftp.iij.ad.jp/pub/linux/centos/6.4/os/x86_64
* Would you like to use VNC  
[Use text mode]
* Warning - Error processing drive...  
[Re-initialize all]
* Time Zone Selection  
[System clock use UTC]
[Asia/Tokyo]
* Root Password  
適当に設定
* Partition Type  
[Use entire drive]
* Write storage configuration to disk  
[Write changes to disk]
* Complete  
[Reboot]

これで最小限のインストールは完了

# パフォーマンスアップのためのXenServer Toolsのインストール

* インスタンスが起動している状態でXenCenterにてインスタンスを右クリックして「Install XenServer Tools...」を選択(★)
* コンソールでrootでログインして以下を実行

```shell-session
# mount /dev/xvdd /mnt
# /mnt/Linux/install.sh
```

インストールして良いか聞いてくるので[y]を選択
* 再起動

★一度インストールするとメニューには現れなくなり、XenCenterのインスタンスを選択し[General] タブの部分に
```Virtualizeation state: Optimized (version 6.1 installed)```
と表示される。
(覚え書き) XenServer 6.1のセットアップ

2013/03/18 ごろの作業

# XenServer 6.1 のインストール

* 普通通りにやればよい
* HDDの割当がおかしい。  
256GB SSD, 2TB HDD, 2TB HDDをわりあてたのに660GBしか使えない、とかあったので2TB×2台のみをまずは割り当てる(ディスクスペースが3.6TB程度になる)。
* ネットワークはひとまずDHCP
* セットアップ完了後の起動にやたらと時間がかかる（HDDのせいか？）が放置していればそのうち立ち上がる

# XenCenterのインストール

* XenServerのCDからWindowsにインストール  
→インストール後起動するとアラートがでる
* XenCenter自体をWebからダウンロードして再インストール（ここのURLが不明）
* XenServer側のアラートがいっぱい出るのでそれらのパッチをWebからダウンロード  
→zipを展開するとXenServer用パッチファイルがふくまれているのでそれをXenCenterの「Tools」「Install Update...」でインストール
Jpmobileでビュー自動切り替えのon/off

まだプログラム作ってないけど、これでできそう(な気がする)
ちなみにrails 3.0、jpmobileは1.0。
　
　

***

###目的
タブレットで見るときPCとかスマホで見たい。
(任意で切り替えたい)
　

###こんな感じでやる
```lang:まだ書いてないから動作確認してないヨ
if request.mobile.tablet?
  register_mobile if [onにする条件]
  disable_mobile_view! if [offにする条件] 
end
```
これをビューをsp_controller.rb辺りに仕込む。
上のメソッドはjpmobileに組み込まれてるもので、

* register_mobile:自動機能on
* disable_mobile_view!:自動機能off

(ちなみにReadmeにはdisable_mobile_view!しか書いてない)

　
***

###分岐の条件
分岐の条件はredisで実施する予定。

ビューにjavascriptで[PC/スマホ]を表示切替ボタンを作り、
ボタンが押されたらredisにon/off条件となるようなフラグをセット。
そのフラグによって上に書いたみたいなプログラムが自動判定する。
※そのフラグがない場合はデフォルト、みたいな一文があってもいいかも。

```lang:まだ書いてないから動作確認してないヨ・改変
def ﾅﾝﾄｶー
  if [redisに値入ってない?] //1回通れば(ほぼ)通らないはず。
    [redisに値入れる処理(onにする条件をセット)]
    register_mobile
  end
  if request.mobile.tablet?
    register_mobile if [onにする条件]
    disable_mobile_view! if [offにする条件] 
  end
end
```

みたいな？


***

###最終的にこれ使った


```lang:これ
prepend_view_path(Rails.root + 'app/views' + path)
```

pathに条件ごとにroot以下のディレクトリを入れた。
これをビュー表示時に設定するようにして対応。
Rails3でも動いたのでそのまま使ってます。
カスタムフィールドの範囲指定での絞込

query_postやget_postを使って、絞り込む時に、
カスタムフィールドの値を絞り込むときの書き方

#####大きい小さい
``query_posts(
	array(
		'meta_query' => array(
			array(	'key'=>'price',
				'value'=>'500',
				'compare'=>'>',
				'type'=>'NUMERIC'
				)
			)
		)
	);``
#####の間
``query_posts(
	array(
		'meta_query' => array(
			array(	'key'=>'wakeup__at',
				'value'=>array( '05:00:00', '07:00:00' ),
				'compare'=>'BETWEEN',
				'type'=>'TIME'
				)
			)
		)
	);``
betweenが使えるのは便利。
WPFで実行ファイルとDLLを一つにまとめる（C#編）

##その１ プロジェクトファイルにコマンドを追加
C#プロジェクトファイルの

```xml
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets"/>
```

のあとに以下の文字列を挿入します

```xml
<Target Name="AfterResolveReferences">
  <ItemGroup>
    <EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'">
      <LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
</Target>
```

##その２ EXEからアセンブリをロードするコードを追加

以下のコードをソースファイルにしてプロジェクトに追加してください。

```csharp:startup.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.IO;

namespace StartUpCode //名前空間は使いやすいものに変えてください
{
	public class StartUp
	{
		[STAThread]
		public static void Main()
		{
			AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;

			App.Main(); // Run WPF startup code.
		}

		private static Assembly OnResolveAssembly(object sender, ResolveEventArgs e)
		{
			var thisAssembly = Assembly.GetExecutingAssembly();

			// Get the Name of the AssemblyFile
			var assemblyName = new AssemblyName(e.Name);
			var dllName = assemblyName.Name + ".dll";

			// Load from Embedded Resources - This function is not called if the Assembly is already
			// in the same folder as the app.
			var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(dllName));
			if (resources.Any())
			{

				// 99% of cases will only have one matching item, but if you don't,
				// you will have to change the logic to handle those cases.
				var resourceName = resources.First();
				using (var stream = thisAssembly.GetManifestResourceStream(resourceName))
				{
					if (stream == null) return null;
					var block = new byte[stream.Length];

					// Safely try to load the assembly.
					try
					{
						stream.Read(block, 0, block.Length);
						return Assembly.Load(block);
					}
					catch (IOException)
					{
						return null;
					}
					catch (BadImageFormatException)
					{
						return null;
					}
				}
			}
			// in the case the resource doesn't exist, return null.
			return null;
		}
	}
}

```

##その３ プロジェクト設定を変更

プロジェクト設定を変更して、スタートアップオブジェクトをその２で追加したソースに変更する。
すべて終了したらビルドすればEXE単独で起動できるようになります。

ただし、WPFToolkitのグラフのようにDLLからDLLの関数を呼んでいたりすると動かない場合があるので１００％とはいきませんが９９％くらいはこれでいけます。

WPFプロジェクトじゃなくても使えるので意外に便利です。

 

今回の記事は次のサイトの日本語訳だったりする
http://blogs.interknowlogy.com/2011/07/13/merging-a-wpf-application-into-a-single-exe/
Chef Container - DockerとChefの機能棲み分け？

**Chef-Container**かーなるほどー
[Release: Chef Container 0.2.0 (beta)]
(https://www.getchef.com/blog/2014/07/15/release-chef-container-0-2-0-beta/)
[Dockerに対応した「Chef Container」β版リリース](http://www.atmarkit.co.jp/ait/articles/1407/17/news104.html)

DockerfileにはOS依存コマンド（yumやapt-get）書くし、設定ファイルの書き換えもechoとかsedだから、そういうとこはchefに任せるのがベターということと解釈。既存資産（Cookbook）も有効活用できるし（間違えていたらご指摘お願いします！）
DockerとChefの機能棲み分け問題に対する一解候補の提示とみた (-ω☆)キラリ
/etc/sudoersの#includedirの#はコメントアウトじゃない

コンフィグを整理する時にコメントアウトを全部消しちゃうクセがあるのですが、
(だってApacheのコンフィグとか8割がたコメントじゃないですか・・・）
AmazonLinuxの/etc/sudoersのコメントを消したらなんかec2-userからsudoできなくなった・・・

```
[ec2-user@xxx ~]$ sudo su -
[sudo] password for ec2-user: 
```

AmazonLinuxにはrootユーザのパスワードが設定されてなくて、ec2-userからsudoするのですが、その設定は/etc/sudoers.d/cloud-initに書いてあります。

```
ec2-user ALL = NOPASSWD: ALL

# User rules for ec2-user
ec2-user ALL=(ALL) NOPASSWD:ALL
```

これをincludeする/etc/sudoersの設定を見てみると、

```
...
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
```

『#include』の#はコメントじゃなかったんですね・・・
ミスって消しちゃったよ＼(^o^)／
よく見ると直上のコメントに『この#はコメントじゃないぞ！絶対消すなよ！』って書いてあった・・・
dotfilesの初期化用スクリプト

#はじめに
dotfiles、便利ですよね。
でも環境が変わるごとにシンボリックリンク貼ったり、大変ですよね。
しかも環境が変わるってのは普通はあんまりないですし、何すればいいんだっけ？ってなりますよね。よね？？
**私はなります。**

##対象者
- すでにdotfilesを運用してるひと
- NeoBundleでVimプラグインを管理しているひと
- **毎回いちいち設定するのめんどくせえ**ってひと

#一括処理しよう
一度、バッチ処理するシェルプログラム書いておけば安心ですね。
はい、書きました。

```bash:init_dotfiles.sh
#!/bin/sh

# current dir
cd $(dirname $0)

# download neobundle files
if [ -e ~/dotfiles/vimfiles/bundle/neobundle.vim ]; then
    echo "neobundle found"
    is_existed=true
else
    echo "install neobundle"
    mkdir -p ~/dotfiles/vimfiles/bundle/
    git clone https://github.com/Shougo/neobundle.vim ~/dotfiles/vimfiles/bundle/neobundle.vim
    is_existed=false
fi

# make symlink
for dotfiles in .?*; do
    case $dotfiles in 
        ..)
            continue;;
        .git)
            continue;;
        *)
            ln -Fis "$PWD/$dotfiles" $HOME;;
    esac
done
if [ -e ~/.vim ]; then
    echo ".vim found. rename .vim dir"
else
    ln -vFis ~/dotfiles/vimfiles ~/.vim;
fi

# install & update NeoBundle plugins
if [ "${is_existed}" == true ]; then
    echo "running NeoBundleUpdate...\n"
    vim -u ~/.vimrc -i NONE -c "try | NeoBundleUpdate! | finally | q! | endtry" -e -s -V1
else
    echo "running NeoBundleInstall...\n"
    vim -u ~/.vimrc -i NONE -c "try | NeoBundleInstall! | finally | q! | endtry" -e -s -V1
fi
echo "\ncompleted!"
```

#動作環境
CentOS 6.5, OS X 10.9.5のみ確認済みです。
想定する構成は

```
dotfiles
  │  .vimrc
  │  .bashrc
  ~
  │  init_dotfiles.sh
  └─ vimfiles
      └─ bundle
```

のような感じです。

#運用
非常に簡単です。

```bash
$ cd ~
$ git clone https://github.com/your_account/dotfiles.git
$ sh init_dotfiles.sh
```
以上です。ね、簡単でしょ？
ちなみにすでに環境がある状態で

```bash
$ sh init_dotfiles.sh
```
とするとプラグインのアップデートがかかります(NeoBundleUpdate)

#おわりに
注意点がいくつかあります。

- Gitで2段階認証している場合はMacからだとPushできない可能性があります。
- vimfiles/bundle/以下がgitignoreされていない場合、何か良くないことが起こりそうな気もします
- ルートディレクトリの.vim/や.bashrcは事前に移動か削除しておく必要があると思います。

以上です。
Enjoy! XD
[苦戦中] dockerのイメージに既にあるファイルを起動時にホストにコピーしてから同期するには？

# やりたいこと: 
dockerコンテナで動作させたいアプリがsqliteを使っていて，そのファイルを永続化したい

# やってみて失敗したこと
```:noya/container(コンテナ)
/
-app/
  - hoge ← アプリケーション
  - database.sqlite3 ← hogeが参照しているsqliteのDB
```

なんて構成になっていて，

```
docker run -it -v ~/appdata:/app:rw noya/container /app/hoge
```

なんて感じに起動しようとすると，appdataの内容が/appにコピーされてから(同期されてから)/app/hogeを呼び出そうとする。
appdataが空のディレクトリだとすると，/app/hogeは存在しなくなるので，not foundになってしまう。
まぁ当然っちゃ当然。


# こんなことをしなきゃいけない？
```
docker run -it --name tmp noya/container echo "hoge"
docker cp tmp:/app ~/appdata
docker rm -f tmp
docker run -it -v ~/appdata:/app:rw noya/container /app/hoge
```

んー…きっとなにかいい方法があると思うんだけれども。。。
Write Fast Rubyというスライドをみて

先日[Writing Fast Ruby](https://speakerdeck.com/sferik/writing-fast-ruby)というスライドをみて、その後にRailsのコミットログを眺めていたら、gsubメソッドをtrに置き換えたというのがあったので、実際どうなのか自分でもみるために試しに以下のように処理の計測を行ってみました。

```ruby:test_bench.rb
require 'benchmark'

hoge = 'aaaaaabbbbbceerwrrweqgaga123rgurwfkja'

n = 50
Benchmark.bm do |x|
  # fast
  x.report { n.times { hoge.tr('aa', 'xx') } }
  # slow
  x.report { n.times { hoge.gsub('aa', 'xx') } }
end
```

で、何回か流したのですが、結果は以下のようにtrの方が確かに早いですね。

<pre>
1回目
       user     system      total        real
   0.000000   0.000000   0.000000 (  0.000039)
   0.000000   0.000000   0.000000 (  0.000166)
2回目
       user     system      total        real
   0.000000   0.000000   0.000000 (  0.000041)
   0.000000   0.000000   0.000000 (  0.000153)
3回目
       user     system      total        real
   0.000000   0.000000   0.000000 (  0.000038)
   0.000000   0.000000   0.000000 (  0.000134)
4回目
       user     system      total        real
   0.000000   0.000000   0.000000 (  0.000037)
   0.000000   0.000000   0.000000 (  0.000113)
</pre>

一番左の値が実際の計測時間になります。
で、それ以外にも書き方によっては速い遅いがあるということで、以下のようにコードを書き換えて幾つか検証してみました

```ruby:test_bench2.rb
require 'benchmark'

hoge = 'aaaaaabbbbbceerwrrweqgaga123rgurwfkja'

n = 50
Benchmark.bm do |x|
  # fast
  x.report('fast') { n.times { hoge.tr('aa', 'xx') } }
  # slow
  x.report('slow') { n.times { hoge.gsub('aa', 'xx') } }
end

Benchmark.bm do |x|
  # fast
  x.report('fast') { n.times { hoge.sub('aa', 'xx') } }
  # slow
  x.report('slow') { n.times { hoge.gsub('aa', 'xx') } }
end

h = { a: 1, b: 2, c: 3 }
Benchmark.bm do |x|
  # fast
  x.report('fast') { n.times { h.each_key { |k| k } } }
  # slow
  x.report('slow') { n.times { h.keys.each { |k| k } } }
end

Benchmark.bm do |x|
  # fast
  x.report('fast') { n.times { a = 1; b =  2  } }
  # slow
  x.report('slow') { n.times {  a, b = 1, 2  } }
end
```

結果は
<pre>
       user     system      total        real
fast  0.000000   0.000000   0.000000 (  0.000092)
slow  0.000000   0.000000   0.000000 (  0.000132)
       user     system      total        real
fast  0.000000   0.000000   0.000000 (  0.000058)
slow  0.000000   0.000000   0.000000 (  0.000134)
       user     system      total        real
fast  0.000000   0.000000   0.000000 (  0.000018)
slow  0.000000   0.000000   0.000000 (  0.000019)
       user     system      total        real
fast  0.000000   0.000000   0.000000 (  0.000005)
slow  0.000000   0.000000   0.000000 (  0.000034)
</pre>

なるほど、勉強になります。
まだまだ他にもあるので、実装する時の参考情報としてナレッジをもっと蓄積していければと思っています。
参照の値渡しとか呼ぶのを辞めたい

何度も話されている話だけど。

[JavaScriptはオブジェクトについて参照渡しだなんて、信じない - Qiita](http://qiita.com/warotasan/items/1b9d4bf5a1bb341dd354)

個人的にこの挙動への理解を無駄に混乱させて参照の値渡しとかやたら周りくどい呼ばれ方をするのは、値渡しという考え方を元にしている為、もっと踏み込んでいえば変数=箱のイメージが邪魔をしている為と思ってる。

変数=箱では変数が主体であって、値はある変数の所有物であるという印象がある。けどJavascript等では実際には変数自身は値（オブジェクト）の利用権しか主張しない。逆に言えばオブジェクトの存在は特定の変数に縛られない。逆にオブジェクトが主体であって変数は従属するものと考えたほうが良いのかも。

ということで変数=箱的であるC/C++での代入演算とは＝の意味合いが違っている。動的確保+ポインタによる参照に確かに似ているがそういった理解の仕方は概念の抽象度を無駄に下げていると思う。個人的には変数=オブジェクトに貼るラベルという認識を持っている。

でも参照の値渡しに代わる良い呼び名が無いのが現状で、共有渡しという呼び方もあるらしいが余り広まっているようには感じないのが悲しい。

結論：共有渡し広まれ
既存のrailsアプリケーションにcontrollerのrspecテストを追加する場合のひな形サッと作る奴

既存のrailsアプリケーションにcontrollerのrspecテストを追加する場合のひな形サッと作る奴

```bash
# hugeコントローラ
rails g rspec:controller huge `rake routes | grep 'huge#' | sed -e 's/^.*huge#\([a-z0-9_]*\).*$/\1/g' | xargs`
```

作成したいコントローラ羅列して実行するコマンド一気に出力する奴
(Dir.chdirとかしてexecすればそのまま実行出来そう(そこまでやらなくても良いけど))

```ruby
%w|
amagi
log/horaizun
shirobako
nanatsu_no/taizai
denkigai/no/honyasan
ino_battle
|.each do |controller|
  puts "rails g rspec:controller #{controller} `rake routes | grep '#{controller}#' | sed -e 's/^.*#{controller.gsub('/', '\/')}#\\([a-z0-9_]*\\).*$/\\1/g' | xargs`"
end
```


`rails g rspec:controller huge`
でひな形作れるんだけどアクション毎の行毎回書きたくない and 書きたくない

アクション名指定すれば作ってくれるんだけど
(`index`アクション `rails g rspec:controller huge index`)

アクション毎回指定するの面倒くさい and 面倒くさい なのでコマンドでそのままやるやつ
Retina HDディスプレイのUITableViewCellのセパレータの高さはどうなっているのか調べてみた


Retina HDディスプレイになって、1pxの線を描画するのに割り切れなくなってしまったので
UITableViewのView構造をログ出力してみました。

```
<UITableView: 0x7f9fc481c600; frame = (0 0; 414 736); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x7f9fc3f1d300>; layer = <CALayer: 0x7f9fc3f15580>; contentOffset: {0, 0}; contentSize: {414, 0}>
   | <UITableViewWrapperView: 0x7f9fc3f1e490; frame = (0 0; 414 736); gestureRecognizers = <NSArray: 0x7f9fc3f1ef00>; layer = <CALayer: 0x7f9fc3f1ea00>; contentOffset: {0, 0}; contentSize: {414, 736}>
   | <UIImageView: 0x7f9fc3e11530; frame = (0 729; 414 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x7f9fc3e114b0>>
   | <_UITableViewCellSeparatorView: 0x7f9fc3c0eea0; frame = (20 43.6667; 394 0.333333); autoresize = W; layer = <CALayer: 0x7f9fc3c0ef90>>
   | <_UITableViewCellSeparatorView: 0x7f9fc3c18050; frame = (20 87.6667; 394 0.333333); autoresize = W; layer = <CALayer: 0x7f9fc3c09e20>>
   | <_UITableViewCellSeparatorView: 0x7f9fc3c6a000; frame = (20 131.667; 394 0.333333); autoresize = W; layer = <CALayer: 0x7f9fc3c17090>>
	・
	・
	省略
	・
	・
   | <UIImageView: 0x7f9fc3e11e00; frame = (407 729; 7 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x7f9fc3e11cc0>>
```

ログを見てみると、UITableViewCellSeparatorViewのHeightは **0.333333** となっていました。
awkで特定の条件にマッチした行を表示


例えばアクセスログに出力されているレスポンスタイム（ms）が1000ms以上のものを表示する場合。
（レスポンスタイムが4column目に出されている場合）

```
$ awk '{FS="\t"; if($4 > 1000){print $0}}' target.log
```

タブ区切りでなければFS="\t"は除去してOK。
$0は行全体を表示。
JScript 事始め

最近、Windows上で気軽に実行できるスクリプトを知った。結構前からあるようだ。
とりあえず、簡単に動作したので覚え書き。

```hellow.jse
var fs = new ActiveXObject("Scripting.FileSystemObject");
var file = fs.getFile("readme.txt");

var MODE = {
	READING: 1,
	WRITING: 2,
	APPENDING: 8
};
var stream = file.OpenAsTextStream(MODE.READING);
var buf = "";
while(!stream.atEndOfStream)
{
	buf += stream.readLine() + "\n";
}
/*
    var stream = fs.openTextFile("text.txt", MODE.READING);
*/
stream.close();
WScript.echo("Hello!!" + buf);
WScript.quit(0);
```

```readme.txt
こんにちは。私はたぢです。
これから新宿の勉強会へ行く予定です。

もう仕事は完了しているので、このスクリプトを書き終えたら、PCをシャットダウンして帰ります。

お疲れ様でした。また明日。
```

jseファイルをダブルクリックすると、テキストファイルを読み込んでWidowsダイアログがポップアップします。
tmuxでvimのcolorscheme（というか.tmux.conf）が反映されない場合の対処法


##はじめに
`tmux`上で`vim`を使う時`colorsheme`が反映されない時があります。
その対処方法を紹介します。

##.tmux.confの設定
`colorscheme`が反映されない原因として256色表示が出来ていないことが考えられます。
対処としては`.tmux.conf`で以下のコードを追記しすればokです。

```bash:.tmux.conf
set-option -g default-terminal screen-256color
```

もしこれでもうまくいかない場合は以下のコードを追記しましょう。

```bash:.tmux.conf
set -g terminal-overrides 'xterm:colors=256'
```

##.tmux.confを設定が反映されない
`.tmuc.conf`を設定したのに反映されない！と思うことが私は多々あります。
原因としては、`tmux`のプロセスが残っており次回の`tmux`起動時に前回の`tmux`プロセスが起動してしまうことが考えられます。
なのでまずプロセスを確認。

```bash:入力コマンド
$ ps ax | grep tmux
```

すると例えばこんな感じになるかと思います。（`tmux`のプロセスが残っている場合）

```bash:出力結果
18937 pts/8    S+     0:00 grep tmux
25718 ?        Ss     1:37 tmux
```


残ってるプロセスは削除しましょう。今回はプロセス番号 *25718* を削除します。
**※このとき、プロセスを削除するということは`tmux`のセッションが消えることになりますので注意してください。**

```bash:入力コマンド
$ kill -9 25718  #kill -9 プロセス番号　で指定プロセスの削除
```

これで`tmux`を再起動すれば`.tmux.conf`の設定が読み込まれているはずです。

##おわりに
設定が反映されないときはプロセスを確認するようにしましょう！

今回は以下の記事を参考にさせて頂きました。ありがとうございます。

>[tmux]tmuxの設定ファイルtmux.confの設定情報を変更して反映されない場合の対応
>http://to-developer.com/blog/?p=1099

>tmuxでvimのカラースキームを使用する
>http://alice345.hatenablog.com/entry/2013/12/23/133902
vimでファイルを開かずexコマンド実行だけ行う方法

タイトルの通りです。調べても分かんね、という声を耳にしたので共有メモ

例えばプラグインの管理にneobundleを使っていて、プラグインの一括更新を`:NeoBundleInstall!`で行いたい(けどいちいちファイルは開きたくない)って場合はこんな感じ

* exコマンドを羅列したファイルを用意する。このとき最終行は`q`(もしくは`q!`)にしてvimが終了するようにしておく

```
$ vim excmd.txt

NeoBundleInstall!
q!
```

* vimを`-e -S`オプション付きで実行する。この時に`-S`の引数として先ほどのexコマンド羅列ファイルを指定する

```bash
% vim -e -S excmd.txt
 : (ズラズラと更新ログが表示される)

%
```

* `-e`と`-S`オプションについて

```
       -e          Start Vim in Ex mode, just like the executable  was  called
                   "ex".

       -S {file}   {file}  will be sourced after the first file has been read.
                   This is equivalent to -c "source  {file}".   {file}  cannot
                   start with '-'.  If {file} is omitted "Session.vim" is used
                   (only works when -S is the last argument).
```
foreverでシェルをデーモン化

linuxサーバでhubotをデーモン化して動かしたかったのですが、
環境変数にいろいろ設定したかったので、起動シェルスクリプトを作成しました。

なので、foreverでシェルスクリプトをデーモン化しました。
簡単にできました。

[ここを参考にしました](http://the.nyarla.net/post/50888927710)


```lang:インストール
# forever インストール
$ npm install -g forever

# シェル起動
$ forever -c sh start daemon_runner.sh
Photos Framework - PHAssetをfetchするとimageが重複して取得できる（ように見える）

## Photos Frameworkとは

iOS8以降で利用できるALAssetLibraryに変わるPhoto Libraryを取り扱うAPI群。
概要は @ainameの日記が分かりやすい。

http://ainame.hateblo.jp/entry/2014/08/04/084717

詳細はReferenceを参照。

https://developer.apple.com/library/ios/documentation/Photos/Reference/Photos_Framework/index.html#//apple_ref/doc/uid/TP40014408

## この記事で解決したい問題

Photos FrameworkのPHAssetクラスを利用するとPhoto Libraryから写真・動画のモデルオブジェクトを効率よく取得できる。

```objc
PHFetchOptions *fetchOptions = [PHFetchOptions new];
fetchOptions.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO], ]; // ソートしたりとか楽勝
PHFetchResult *result = [PHAsset fetchAssetsWithOptions:fetchOptions];
```

上記のように取得したPHFetchResultをもとにPHAssetからサムネイルを取得してたとえばUIColloctionViewにimageを並べて表示するようなアプリケーションを作るとする。

このときに何も考えずにFetchした結果を描画すると「画像が重複して表示されてしまう」ことがあった。

iOS8対応直後のInstagramのアップロードメディア選択画面でも同様の事象が起こっていた記憶が…。

## 解決

いろいろ調べているとどうやらiCloudフォトストリームを使って自動的にアップロードしているのが原因。Photos FrameworkはiCloud上のメディアリソースも端末内と差異無く取り扱ってしまう（取り扱うことが出来る）。iCloud上のメディアは、元が同じ画像でも別のIDがふられた別リソースとして取り扱われる。

問題というより実際はそういう仕様なので、どこにAssetが保存されているかを意識して各Assetを取り扱えば「画像が重複して表示されてしまう」ことはなくなる。

で、PHFetchOptionにわたせるPredicateで指定出来るのかと思いきや、どうやらassetSourceは検索キーとして利用できないっぽい。

https://developer.apple.com/library/IOs/documentation/Photos/Reference/PHFetchOptions_Class/index.html#//apple_ref/doc/uid/TP40014396-CH1-SW5

なので、取得してきたPHFetchResultから "assetSource=3" のレコードを間引くしかいまのところなさそう。

```objc
NSArray *array = [result objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, result.count)]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"description contains %@", @"assetSource=3"];
NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate];
```

## 参考

同じような悩みを抱えてる人がいて参考になりました。

http://stackoverflow.com/questions/25730830/how-to-get-only-images-in-the-camera-roll-using-photos-framework
acts-as-taggable-onでオーナーを設定してタグを登録する

Railsでそれらしくタグが作れるgem「acts-as-taggable-on」のご紹介。

https://github.com/mbleigh/acts-as-taggable-on

今回はタグをオーナーを設定して作る方法を紹介します。オーナーの設定は「ユーザーがお気に入りの記事をタグで分類」みたいなときに使うと便利です。本家のドキュメントにも記載されているのですが、特にtaggingについての説明が不十分と感じたので、その辺を盛り込みながら説明していまきす。

#### acts-as-taggable-onの登場人物4名
1. tag: タグの本体
2. taggable: タグの対象（ニコニコ動画であれば動画）
3. tagger： タグのオーナー（タグを付けた人）
4. tagging: tag, taggable, taggerのリレーションモデル

##### タグの対象（taggable）の設定。モデルに記載。

```lang:blog.rb
class Blog < ActiveRecord::Base
  acts_as_taggable #「acts_as_taggable_on :tags」と同じ
end
```

##### タグのオーナー（tagger）の設定。モデルに記載。
```lang:user.rb
class User < ActiveRecord::Base
  acts_as_tagger
end
```

### タグの作成と削除
タグの作成と削除について共通する点なんですが、公式のドキュメントで紹介されている方法通りに単純に行うと、タグの「追加」ではなく「置き換え」になってしまいます。

```lang:Ruby
@some_user.tag(@some_photo, :with => "paris, normandy", :on => :locations, :skip_save => true)
@some_photo.owner_tags_on(@some_user,:tags) # => ["paris", "normandy"]
@some_user.tag(@some_photo, :with => "練馬", :on => :locations, :skip_save => true)
@some_photo.owner_tags_on(@some_user,:tags) # => ["練馬"] 
```

上のコードだと「練馬」に書き換えられている。
そこで、一度taggerとtaggableと関連付けられたtag_listを呼び出し、addメソッドとremoveメソッドで追加、削除の処理をしたうえで、tagメソッドで状態を保存するという手順を紹介します（tagメソッド内でsaveが呼ばれている）。
つまり、

1.既存のタグリストの取り出し
2.既存のタグリストに新規タグの追加（この時点では保存されていない）
3.「既存タグ＋新規タグ」のタグリストを保存

という流れ。

##### タグの作成手順
タグ本体の作成とリレーション（タグ、対象、オーナー）の構築を目指します。

```lang:Ruby
tag_list = blog.tags_from(user) #一度 ActsAsTaggableOn::TagListを呼ぶ
tag_list.add('hoge')
user.tag(blog, with: tag_list, on: :tags)
```

##### タグの削除手順
```lang:Ruby
tag_list = blog.tags_from(user)
tag_list.remove('hoge')
self.tag(blog, with: tag_list, on: :tags)
```

削除手順で特筆すべきなのは、この手順で行うとtaggingの削除とtaggings_countのデクリメントが行われている点です。単純にリレーションモデルであるtaggingを引っ張って来て削除しても良いのですが、その場合、tagのtaggings_countは反映されません。タグクラウドが多分使えなくなります。

##### タグの表示（view）
taggerのowner_tags_onメソッドの返り値は「ActiveRecord::AssociationRelation」なので、よくある感じに表示していきます

```lang:Ruby
<% blog.owner_tags_on(current_user, :tags).each do |tag| %>
  <%= tag.name %>
<% end %>
```

##### タグ（tag, tagging）の取得
```lang:Ruby
ActsAsTaggableOn::Tag.find(:id)
ActsAsTaggableOn::Tagging.find(:id).tag # tagging.tag
blog.tags
blog.taggings #タグではなく、tagging
```

##### オーナーの取得
```lang:Ruby
ActsAsTaggableOn::Tagging.find(:id).tagger
tagging.tagger
```

##### タグの対象の取得
```lang:Ruby
ActsAsTaggableOn::Tagging.find(:id).taggable
tagging.taggable
```


以上です。
個人的にオーナーを設定するなら、taggingを取得して操作すると捗ると思います。
Twitterでログインしたあとuser_idを取得する

```[PFUser username]```で取得できるのはParse.comで管理するユーザ名なのでtwitterのuser_idは別の方法で取得します。

```objc
[PFTwitterUtils logInWithBlock:^(PFUser *user, NSError *error) {
    if (!error && user) {
        NSString *userId = [PFTwitterUtils twitter].userId;
    }
}];
```
同様にscreen_nameなども取れます。宣言は以下のとおり。

```objc:PF_Twitter.h
@property (nonatomic, copy) NSString *consumerKey;
@property (nonatomic, copy) NSString *consumerSecret;
@property (nonatomic, copy) NSString *authToken;
@property (nonatomic, copy) NSString *authTokenSecret;
@property (nonatomic, copy) NSString *userId;
@property (nonatomic, copy) NSString *screenName;
```
パーティション分けされたディスクイメージのマウント

参考:

* [HDDイメージファイルをマウントして使う方法 - adsaria mood](http://d.hatena.ne.jp/adsaria/20080724/1216865687)

## イメージ化

手元に瀕死のUSBメモリがあったとして、ddでとりあえずイメージ化。

```bash:
$ sudo dd if=/dev/sda of=sda.img
```

## イメージのパーティション調査

```bash:
$ sudo fdisk -l sda.img
Disk sdc.img: 3.6 GiB, 3883925504 bytes, 7585792 sectors
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x3af42a49

Device     Boot Start     End Sectors  Size Id Type
sdc.img1         2048 7585791 7583744  3.6G  b W95 FAT32
```

> 単位: セクタ (1 * 512 = 512 バイト)

ということなので、`2048セクタ * 512バイト`の結果が第一パーティションの始まるバイト位置。

## マウント

```bash:
$ sudo mount -t vfat -o loop,offset=1048576 sdc.img /mnt/
```
EC2上にfitbit環境をつくる

EC2上のrubyやphpからfitbitのデータを取得できる環境を構築するまでのメモ。

fitbitとは
http://www.fitbit.com/jp/home

# 0. instance立ち上げ〜ruby gem準備まで

EC2上にinstanceを立ち上げる。
とりあえず、お試しならt2.microでも良いかも。

rubyのバージョンを確認し、必要ならgemの環境を整える。

# ■ Ruby環境
1. fitgem

```bash
$ gem install fitgem
```

2. Set Up a Config File to Hold OAuth Tokens

```bash
$ curl https://gist.githubusercontent.com/whazzmaster/5322902/raw/aa4293a9eb288d2096840a05b35a1ecf829defc1/.fitgem.yml > .fitgem.yml
```

.fitgem.ymlの以下の場所を書き換える
```rb:.fitgem.yml
oauth:
  consumer_key: "your consumer key here"
  consumer_secret: "your consumer secret here"
```

3. Login and Get OAuth Tokens

```bash
$ curl https://gist.githubusercontent.com/whazzmaster/5322902/raw/4439e2d577567d280856a2d77cef7b824a851cd1/test-fitgem.rb > test-fitgem.rb
$ chmod +x test-fitgem.rb

$ ./test-fitgem.rb
```

アプリのアクセス許可を聞かれるので、指定のURLをひらいてアクセスを許可する

# ■ PHP環境

```bash
$ sudo yum install php-common php-devel php-cli php-pear
$ sudo yum install pcre-devel
$ sudo yum install libcurl-devel 
$ sudo pecl channel-update pecl.php.net
$ sudo pecl install oauth-0.99.9

$ sudo vim /etc/php.d/oauth.ini
$ cat /etc/php.d/oauth.ini
; Enable oauth extension module
extension=oauth.so
```

○example source(dev.fitbit.com)

```bash
$ curl https://wiki.fitbit.com/download/attachments/884784/completeAuthorization.php?version=2&modificationDate=1297797897000&api=v2 >  completeAuthorization.php
```

○ FitbitPHP

```bash
$ git clone https://github.com/heyitspavel/fitbitphp.git
```