OmniAICreator/Qiita-1.07M huggingface dataset:
組み込みスクリプト言語として Lua をソースから CMake で扱う方法

# 背景

V8 あるいは spidermonky や libpython を組み込みスクリプトとして使いたい場合、環境がちょっと特殊だったりするとリンクやライブラリーのビルドが難しかったり、容量的に嵩張ったり実行時リソースもそれなりに消費したりします。

そんな時には Lua が有力な組み込み選択肢となります。幸いな事に、 Lua はバイナリーでも配布されているのでこの記事のようにソースから扱わなくても簡単に使用できるのですが、 CMake と併せて扱ったり、標準のコンパイルオプションではないビルドを使いたい場合にはソースから扱ってもビルド時間も短く用途によってはクロスプラットフォームなメタビルドルールを記述する際にも便利が良くなります。

そこで、組み込みスクリプト言語として Lua をソースから CMake で扱う方法を整理します。

# Lua のソースファイルのリストを生成

Lua のソースを展開する場所を `${lua_path}` として以下の具合でソースファイルのリストを生成する。

```cmake
file( GLOB_RECURSE lua_sources ${lua_path}/src/*.c )
list( REMOVE_ITEM lua_sources
  ${lua_path}/src/lua.c
  ${lua_path}/src/luac.c
)
```

あとは `${lua_sources}` をお好みの `add_executable` や `add_library` で使うだけです。

# アプリに直接リンクして使う

小規模なアプリで Lua を組み込むプロジェクトでは直接取り込む方法が最も単純です。

```cmake
include_directories( ${lua_path}/src )
add_executable( my_app my_app_main.cxx ${lua_sources} )
```

# バイナリーライブラリーを生成して使う

プロジェクトの規模やビルドの構成によってはバイナリーライブラリーを生成したい事も多いと思います。

```cmake
include_directories( ${lua_path}/src )
# 動的リンク用のライブラリー （ .so なり .dll なり ）
add_library( lua-shared SHARED ${lua_sources} )
# 静的リンク用のライブラリー （ .a なり .lib なり ）
add_library( lua-static STATIC ${lua_sources} )
```

# 付録: ExternalProject でソース回収から行う方法

ソースを拾って展開して CMakeLists.txt を捏造し（この部分 PATCH などで行っても良いが今回はそれほど煩雑でも無いため echo で生成）、 lua.a をビルドし、 ExternalProject を定義した元のプロジェクトのビルドディレクトリーの lib と include へそれぞれ生成物と必要最小限のヘッダーファイルを複製します。

```cmake
cmake_minimum_required( VERSION 3.2 )

project( lua_project )

include( ExternalProject )

set( lua_source_path ${CMAKE_CURRENT_BINARY_DIR}/external/lua/src/external_lua/ )
set( lua_cmake_file_path ${lua_source_path}/CMakeLists.txt )

ExternalProject_Add( external_lua
  PREFIX            ${CMAKE_CURRENT_BINARY_DIR}/external/lua
  INSTALL_DIR       ${CMAKE_CURRENT_BINARY_DIR}
  URL               http://www.lua.org/ftp/lua-5.3.2.tar.gz
  URL_HASH          SHA1=7a47adef554fdca7d0c5536148de34579134a973
  PATCH_COMMAND
    COMMAND echo cmake_minimum_required( VERSION 3.2 ) > ${lua_cmake_file_path}
    COMMAND echo file( GLOB_RECURSE lua_sources src/*.c ) >> ${lua_cmake_file_path}
    COMMAND echo list( REMOVE_ITEM lua_sources $\{CMAKE_CURRENT_SOURCE_DIR}/src/lua.c $\{CMAKE_CURRENT_SOURCE_DIR}/src/luac.c ) >> ${lua_cmake_file_path}
    COMMAND echo project( lua_project ) >> ${lua_cmake_file_path}
    COMMAND echo add_library( lua SHARED $\{lua_sources} ) >> ${lua_cmake_file_path}
    COMMAND echo install( TARGETS lua DESTINATION lib ) >> ${lua_cmake_file_path}
    COMMAND echo install( DIRECTORY src/ DESTINATION include FILES_MATCHING PATTERN "lua*.h*" ) >> ${lua_cmake_file_path}
    COMMAND echo install( DIRECTORY src/ DESTINATION include FILES_MATCHING PATTERN "lauxlib.h" ) >> ${lua_cmake_file_path}
  CMAKE_ARGS        -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}
                    -DCMAKE_COMPILER_IS_GNUCXX=${CMAKE_COMPILER_IS_GNUCXX}
                    -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
)
```

# References

- [Lua](http://www.lua.org/)
- [CMake - help - 3.2 - ExternalProject](https://cmake.org/cmake/help/v3.2/module/ExternalProject.html)
CinderのストレージにNFSを使う

### NFSサーバ側
- インストール

```
# yum -y install nfs-utils 
```

- /etc/idmapd.confを編集

``` bash:/etc/idmapd.conf
Domain = nova1.kccw.org
```

- 公開ディレクトリの設定

```
# mkdir /exports
# chown nfsnobody:nfsnobody /exports
```

``` bash:/etc/exports
/exports クライアントIP(rw,all_squash)
```

- デーモンの再起動

```
# systemctl restart rpcbind
# systemctl restart nfs-server
# systemctl restart nfs-lock
# systemctl restart nfs-idmap
```

- 確認

```
# exportfs -v
/exports
                クライアントIP(rw,wdelay,root_squash,all_squash,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)
```

### Cinder側

- マウント先の指定

``` bash:/etc/cinder/nfsshares
NFSサーバIP:/exports
```

```
# chown root:cinder /etc/cinder/nfsshares
# chmod 0640 /etc/cinder/nfsshares
```

- Cinder設定

```
# openstack-config --set /etc/cinder/cinder.conf DEFAULT nfs_shares_config /etc/cinder/nfsshares
# openstack-config --set /etc/cinder/cinder.conf DEFAULT volume_driver cinder.volume.drivers.nfs.NfsDriver
```

- Cinder再起動

```
# service openstack-cinder-volume restart
```

### 動作確認

```
# cinder create --display_name test 1
+---------------------+--------------------------------------+
|       Property      |                Value                 |
+---------------------+--------------------------------------+
|     attachments     |                  []                  |
|  availability_zone  |                 nova                 |
|       bootable      |                false                 |
|      created_at     |      2016-01-08T05:08:08.277880      |
| display_description |                 None                 |
|     display_name    |                 test                 |
|      encrypted      |                False                 |
|          id         | 3d6f7675-f354-4fad-9195-fd335311a53a |
|       metadata      |                  {}                  |
|         size        |                  1                   |
|     snapshot_id     |                 None                 |
|     source_volid    |                 None                 |
|        status       |               creating               |
|     volume_type     |                 None                 |
+---------------------+--------------------------------------+

# cinder list
+--------------------------------------+-----------+-------------------+------+-------------+----------+-------------+
|                  ID                  |   Status  |    Display Name   | Size | Volume Type | Bootable | Attached to |
+--------------------------------------+-----------+-------------------+------+-------------+----------+-------------+
| 3d6f7675-f354-4fad-9195-fd335311a53a | available |        test       |  1   |     None    |  false   |             |
+--------------------------------------+-----------+-------------------+------+-------------+----------+-------------+
```

http://docs.openstack.org/admin-guide-cloud/blockstorage_nfs_backend.html
SharpDX 3.0.0 での画像ファイルの読み込み


## SharpDX 3.0.0 での変更点

SharpDXのメジャーバージョンが3になり、様々な仕様に変更が加えられています。そのひとつに、DirectXSDKのD3DXで提供されていたユーティリティ関数を提供が削除されました。これにより、今まではSharpDXで画像ファイルからテクスチャを直接生成できていましたが、今後はできなくなります。

## なぜ画像ファイルの読み込みが削除されたのか

D3DXとして提供されていた画像ファイルの読み込みですが、本家DirectXSDKのほうでも削除される流れになっています。近年、ある機能を提供するライブラリは、その提供する機能に集中するべきである的な考えが広がっており、Direct3D11はGPUを操作し、GPUとの通信や命令の発行のみを担当するようになりました。結果、画像ファイルからテクスチャを生成する機能は削除されることになりました。

ちなみに、OpenGLではもとからテクスチャ読み込みの機能は提供されていませんでした。

## DirectXSDKでの代替手段

DirectXSDKから様々なユーティリティ関数が削除されました。その代替先がMicrosoftのブログで示されています。

http://blogs.msdn.com/b/chuckw/archive/2013/08/21/living-without-d3dx.aspx

このブログ記事によると、テクスチャ読み込みは[DirectXTex](https://github.com/Microsoft/DirectXTex)を使えとのことです。

## DirectXTexとは

DirectXTexは、DXUTのテクスチャに関する関数を提供するライブラリです。画像ファイルの読み書きや、ノーマルマップの生成、色の変換などのを行えます。

## SharpDX/C#ではどうするか

DirectXTexはC++で実装されているので、直接SharpDXから使うことはできません。

### SharpDXTexを使う

私の作成したライブラリの宣伝です、はい。

https://github.com/oguna/SharpDXTex/

SharpDXTexは、DirectXTexをC++/CLIでラップしたライブラリです。現在開発中ですのでまだ仕様は定まっていませんが、以下のように画像ファイルからテクスチャを生成することができます。

```csharp
TexMetadata metadata;
var image = ImageUtil.LoadFromWICFile("GeneticaMortarlessBlocks.jpg", WICFlags.None, out metadata);
var texture = TextureUtil.CreateTexture(device, image.GetImages(), image.GetMetadata());
var textureView = new ShaderResourceView(device, texture);
```

DirectXTexで提供されている全ての機能を提供するつもりです（実装中）。

### System.Drawing.Imageで読み込む

SharpDXTexはアーキテクチャに依存するので、ビルド対象のアーキテクチャを切り替える度にSharpDXTexのDLLを変更する必要があります。

もっと気軽に画像ファイルを読み込みたいという方はこの方法を使えばよいでしょう。

とりあえずサンプルコードを貼ります、ペタ。

```csharp
var image = new System.Drawing.Bitmap("GeneticaMortarlessBlocks.jpg");
var boundsRect = new System.Drawing.Rectangle(0, 0, image.Width, image.Height);
var bitmap = image.Clone(boundsRect, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
var mapSrc = bitmap.LockBits(boundsRect, System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat);
var databox = new[] { new DataBox(mapSrc.Scan0, bitmap.Width * 4, bitmap.Height) };
var textureDesc = new Texture2DDescription()
{
    ArraySize = 1,
    BindFlags = BindFlags.ShaderResource,
    CpuAccessFlags = CpuAccessFlags.None,
    Format =  Format.B8G8R8A8_UNorm,
    Height = bitmap.Height,
    Width = bitmap.Width,
    MipLevels = 1,
    OptionFlags = ResourceOptionFlags.None,
    SampleDescription = new SampleDescription(1, 0),
    Usage = ResourceUsage.Default
};
var texture = new Texture2D(device, textureDesc, databox);
bitmap.UnlockBits(mapSrc);
var textureView = new ShaderResourceView(device, texture);
```

もうちょっとまじめにSystem.Drawing.Imageを使いたい方は、DirectXTexのWICTextureLoaderのソースを見てください。画像ファイルのピクセルフォーマットに適したDXGIのフォーマットを選択したりする手法が載っています。

System.Drawing.ImageはBMP、GIF、JPEG、PNG、TIFFに対応します。D3DXと比較するとTGAやDDSがありません。もしTGAやDDSを使いたい場合は、この方法は諦めましょう。

*fin*
子フォームをメインフォームの中央に表示

子フォームをメインフォームの中央に表示したいのに
Position に poOwnerFormCenter を指定しても但し中央に表示されない場合の対処。  
（拡張デスクトップを使用している場合、サブディスプレイにてアプリを実行中に正しく表示されない等といった場合）

```Pascal
  // 子フォーム TFXXXForm にて、プロパティもしくは、コードにて
  // poOwnerFormCenter もしは poMainFormCenter を指定している。
  Self.Position := poOwnerFormCenter;
  
  // のに、、中央に表示されない時がある。(´・ω・`)
```

##### 仕方がないので、メインフォームの表示位置から計算して中央に表示されるようにしてみた例
```Pascal
procedure TFXXXForm.FormShow(Sender: TObject);
var
  r: TRect;
  x: Integer;
  y: Integer;
begin
  // フォームの表示は以下のプロパティを設定しておく
  // Form.Position := poDesigned;

  r := Application.MainForm.BoundsRect;

  x := r.Left + ((r.Right - r.Left) - Self.Width) div 2;
  y := r.Top + ((r.Bottom - r.Top) - Self.Height) div 2;
  Self.SetBounds(x, y, Self.Width, Self.Height);
end;
```


Mac、Windows では、上記で対処できていました。・ω・
Sphinx でPythonのAPIドキュメントを自動作成 

# Sphinx でPythonのAPIドキュメント作成

プログラムを作りながら、自分が作っているクラスのAPIドキュメントが見られたら便利
ということで、Sphinxを使ってPythonモジュールのAPIドキュメントを自動作成・閲覧する方法をまとめました。

## 環境

Linux（今回はCentOS 6.6でやりました）
Python 2.7 （pipインストール済み）


## Sphinxを入れる

Sphinxとは、ドキュメント作成ツールです。（ちなみに、Pythonで書かれています。）
要するに、「知的で美しいドキュメント」が簡単に作れるようになるツールです。
参考： http://docs.sphinx-users.jp/

pipがあれば、簡単にインストール可能です。

```
$ pip install sphinx
```

## APIドキュメントを自動生成する準備をする

私は、以下のようなディレクトリ構成でやりました。

```
- project # Pythonプロジェクト
   |
   |- src # APIドキュメントを自動生成したいPythonコードのディレクトリ
   |   |- __init__.pyとか
   |   |- hoge # サブモジュールとか
   |
   |- docs # Sphinxプロジェクトのディレクトリ
```

docsディレクトリにAPIドキュメント用のSphinxプロジェクトを作成します。
これはコマンド一発で作成可能です。

```
$ cd project
$ sphinx-apidoc -F -o docs/ src/
```

sphinx-apidocコマンドの「-o」オプションにSphinxプロジェクトを作成するディレクトリを、最後の引数に、APIドキュメントを生成したいPythonソースのディレクトリを指定します。
（「-F」オプションは、フル機能？のSphinxプロジェクトを作成するというオプションみたいです。とりあえず、つけておきます。）

これで、srcディレクトリ配下のPythonソースからAPIドキュメントを生成する準備が整いました。（早


## 自分が作ったPythonソースからAPIドキュメントを作成する。

docsディレクトリに入って、makeコマンドを実行します。

```
$ cd docs
$ make html
```

これで、PythonソースからAPIドキュメントが作成されます。
※dotstiringでコメントを書いておけば、それも反映されます。

ちなみに、ソースコードを更新したら
再度、「make html」をすれば、最新のAPIドキュメントになります。

## APIドキュメントを見る

docs/_build/html
配下に、HTMLファイルができています。
「index.html」がホームとなるページです。

ローカルで見れるなら、これをブラウザで開きましょう。


リモートのVMでGUIなんてないんじゃい！という人は


```
$ cd _build/html
$ python -m SimpleHTTPServer
```

で、簡易Webサーバ立てれば、リモートからみられると思います。
簡易だけあってキャッシュとか無いようなので、
HTMLファイル更新(make html)→ブラウザ更新（F5）
で最新の情報が見られました。

## 参考

書いている途中で見つけてしまった。

http://qiita.com/icoxfog417/items/9e2eb932b61aa9b9e427

より詳細が知りたい方は↑を見てください。
オンライン教育サイトまとめ

#注釈
「オンライン教育革命の最前線」
数年前（2013年頃）のWired誌の記事を切り抜いてたけど、紙の劣化が激しかった（扱いが悪すぎた）のでWEB化しました。

#オンライン教育サイト一覧
[KhanAcademy](https://www.khanacademy.org/)
MITで工学を修めたサルマン・カーンによって2006年に設立。
オンライン教育の先駆者

[Coursera](https://www.coursera.org/)
２人のスタンフォード大学の教授、ダフネ・コラーとアンドリュー・イングによって、2011年秋に3つのクラスがオンラインで公開された。
その後、サイトは成長し、16校もの大学が講義を無料で提供している。

[edX](https://www.edx.org/)
2011年12月MITが「MITx」としてスタート。
12年5月にハーバードが加わり「edX」として発足。
7月にはUCバークレーも参加。

[TED-Ed](http://ed.ted.com/)
TEDが教育の変革に挑み始めた。ほかとの違いは世界中の教師たちに優れた学習補助ツールを提供することを目的としていることだ。
特徴は、各レッスンを教師がカスタマイズできたり、学生の学習状況を記録したり、他の人も活用できるようにシェアしたりできるところ。

[Udacity](https://www.udacity.com/)
スタンフォードの教授セバスチャン・スランが、2011年に人工知能講座をオンラインでで無料公開したところ、190カ国から16万人の学生が集ってしまった。
実験成功を受けて、スランと２人のロボット工学者らは、営利目的のオンライン大学udacityを立ち上げた。

[edutopia](http://www.edutopia.org/)
映画監督のジョージ・ルーカスが、ITを効果的に取り入れた教室の事例をオンラインで広める活動を行っている。「ただ教室にコンピューターを設置して子どもたちにワードを２日間かけて教えても無駄です。むしろコンピューターを鉛筆のような道具として扱い、学びのプロセス自体を変えていくべきなのです。」（ルーカス）

[DimensionU](http://www.dimensionu.com/)
授業で使える学習機能付きビデオゲームを2007年に開発。以来、全米1500校以上に導入されるまでになった。

[The Minerva Project](https://www.minerva.kgi.edu/)
2014年開講予定（ということだったらしい）
Handlebars.javaで再利用するテンプレートの変数を基底クラスで解決

# きっかけ

メール本文のテンプレートで、署名の部分もテンプレートにしていたが、署名と本文のそれぞれを変数解決させるという形にしてしまったので、署名テンプレートの解決を何度も呼び出すことに…

冷静に考えると、テンプレート内で他のテンプレートを呼び出す（テンプレートの再利用）機能が、たいがいにテンプレートエンジンにあるはずなので、それを使う形に修正してみた

使っているのは[Handlebars.java](http://jknack.github.io/handlebars.java/reuse.html) です。

# やり方

main.hbsとsign.hbsの二つのテンプレートがあって、signの部分を、テンプレートを解決するためのDTOを基底クラスに持たせるという作戦です。


```lang:main.hbs

{{user.name}}　様

{{greeting}}

{{item.name}}　が　{{item.rate}} % 割引中です。

{{> sign}} // これでsign.hbsを呼び出し

```

```lang:sign.hbs

株式会社 XXX

担当: {{contact.name}}

連絡先アドレス：{{contact.email}} 

```

## テンプレート用DTOの基底クラス

まずは署名の部分を解決できるように基底クラスを作ります

```lang:BaseTemplateDto.java

public abstract class BaseTemplateDto {

   public final Contact contact

   BaseTemplateDto(Contact contact) {
     this.contact = contact;
   }

}

```

## テンプレート用DTO

次に、mail.hbsの変数を解決するためのDTOを、上記を継承して作成します。

```lang:MainTemplateDto.java

public class MainTemplateDto extends BaseTemplateDto {

   public final User user;

   public final String greeting;

   public final Item item;

   MainTemplateDto(User user, String greeting, Item item, Contact contact) {
        // 基底クラスが持つ担当者情報をそのコンストラクタに渡す 
        super(contact);
        /* 中略 */
   }

}

```

あとはこのインスタンスをテンプレートの変数解決のメソッドに渡してやればOKです。
テンプレートの変数解決の詳細は[こちら](http://qiita.com/n_slender/items/9cd77a37935e2e390789)

結果はこんな感じになります。

```
ユーザ1　様

こんにちは

商品A　が　10 % 割引中です。

株式会社 XXX

担当: 〇田△

連絡先アドレス：sample@example.com
```

定型文しかないフッターなどであれば、テンプレートにそれをべた書きして、それを呼び出すという形ももちろんできます。（公式サイトの例がもろにそれです。）
【Doma】バッチ更新時にSQLファイルを使用する

Domaのバージョンは2.5.0

バッチ更新時、ID以外の列をキーにしてアップデートかけたかったけど、どう書いていいのかドキュメントから見つけられなかったので、メモしておく

```java
@Entity
public Hoge {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  public Integer id;
  // fugaId, orderNum が複合キー
  public Integer fugaId;
  public Integer orderNum;
```

```java
@Dao
public interface HogeDao {
  @BatchUpdate(sqlFile=true)
  int updateHoges(List<Hoge> hoges);
}
```

とし、`fugaId`と`orderNum`で更新をかけにいきたいとする

その場合、更新用SQLは

```sql
UPDATE hoge SET /*%population*/ id = id
WHERE fuga_id = /*hoges.fugaId*/1 AND order_num = /*hoges.orderNum*/1
```

とすればいいっぽい

`hoges`は`List<Hoge>`ではなく`Hoge`のインスタンスになる
Recusive and Tail Recursive: factorial



## Recursive

```python
# Definiation of factorial
# 0! = 1
# n! = n * (n - 1)!
#
#|Call:1    │->│Call:2    │->│Call:3    │->│Call:4    │->│Call:5    │
#│n:4       │  │n:3       │  │n:2       │  │n:1       │  │n:0       │
#│value : 24│<-│value : 6 │<-│value : 2 │<-│value : 1 │<-│value : 1 │
#
#@profile
def fact(n):
    if n == 0: return 1
    return n * fact(n - 1)

fact(20)

```

## Tail Recursive

```python
# e.g
#fact(4, 1)
#  fact(3, 4)
#    fact(2, 12)
#      fact(1, 24)
#        fact(0, 24)
#        => return x: 24
#      => 24
#    => 24
#  => 24
#=> 24
#@profile
def fact(n, x=1):
    if n == 0: return x
    return fact(n - 1, n * x)

print(fact(4))

# it can be rewritten like this
# tail recursive optimization
def opt_fact(n):
    x = 1
    while n > 0:
        x *= n
        n -= 1
    return x

print(opt_fact(4))
```

再帰定義のなかで、最後に再帰呼び出しを行う場合を「末尾再帰 (tail recursion) 」といいます。

ref:
http://www.geocities.jp/m_hiroi/light/python03.html


tail recursive
http://melborne.github.io/2009/03/18/notitle/

http://rn4ru.com/blog/posts/2014/Feb/14/tail-recursion/
【Windows7＋VirtualBox】ホストOSの起動時に、仮想マシンを自動起動させる方法

# やりたいこと

ホストOS（Windows7）起動時に、仮想マシンを自動起動させる

# 検証環境

VirtualBox 5.0.2
ホストOS：Windows7（64bit）

# 設定手順

以下の内容のバッチファイルを作成して、ホストOSの任意の場所に保存します。

```
start "" /b "C:\Program Files\Oracle\VirtualBox\VirtualBox.exe" -startvm "仮想マシン名"
```
```/b``` オプションで、バッチ起動時にコマンドプロンプトウィンドウを表示させないようにします。
コマンド直後の ```""``` はウィンドウのタイトルバーの表示内容。今回は指定不要のためブランクにしています。
コマンドの詳細は ```help start``` で確認しましょう！

※VirtualBox.exe のパスは、お使いの環境に合わせてください
※仮想マシン名は、VirtualBox マネージャーの一覧から確認できます
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/49458/690f773d-e338-529c-cfe3-c5da3d031f8d.png)

Winキー＋R：ファイル名を指定して実行 ```shell:startup``` と入力して「OK」
![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/49458/f7e50c78-f879-9263-a24c-8d63aa459bf3.png)

Windows のスタートアップフォルダが表示されるので、作成したバッチファイルのショートカットを配置します。
![qiita3.png](https://qiita-image-store.s3.amazonaws.com/0/49458/98f1eb70-a739-4aeb-7e49-a7c7c7dd42d7.png)

Windows を再起動して、仮想マシンが自動起動されることを確認できれば完了！

# 雑記

毎回、手作業で仮想マシンを起動するのが手間だったので、自動起動の手順をまとめてみました。
CentOS6に Ruby On Rails をシェルで構築する方法

下記の2つのシェルを上から順に実行するだけです。

その後下記コマンドでプロジェクト作成してサーバー立ち上げます。

```
rails new myapp
cd myapp
rails s
```

「http://localhost:3000/」にアクセスすると
「Welcome aboard」ページが表示されます。

環境変数の反映の為、2つに分けてます
まとめる方法知ってる人がいればご指摘ください。

# setup_RoR_1.shの準備
```
rm -f setup_RoR_1.sh; touch setup_RoR_1.sh; chmod u+x setup_RoR_1.sh; vi setup_RoR_1.sh
```

```
#!/bin/bash

echo ;
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
echo "【必要なパッケージインストール】";
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
sudo yum install -y git
sudo yum install -y zlib zlib-devel openssl-devel sqlite-devel gcc-c++ glibc-headers libyaml-devel readline readline-devel zlib-devel libffi-devel


echo ;
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
echo "【 git （rbenv, ruby-build） を clone】";
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
rm -rf ~/.rbenv
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build


echo ;
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
echo "【rbenv動作設定】";
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
sed -i '$a\export PATH=$PATH:$HOME/.rbenv/bin:$HOME/.rbenv/shims' ~/.bash_profile
source ~/.bash_profile
exec $SHELL -l

```

# setup_RoR_2.shの準備
```
rm -f setup_RoR_2.sh; touch setup_RoR_2.sh; chmod u+x setup_RoR_2.sh; vi setup_RoR_2.sh
```


```
#!/bin/bash

echo ;
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
echo "【rubyインストール】";
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
rbenv install --list
rbenv install 2.2.2
rbenv global 2.2.2
rbenv -v
ruby -v

echo ;
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
echo "【コンフィグファイル(/etc/resolv.conf)の設定】";
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
sudo sed -i -e "1i options single-request-reopen" /etc/resolv.conf

# 【確認】
cat /etc/resolv.conf | grep "options single-request-reopen"

echo ;
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
echo "【Railsインストール】";
echo "□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□";
echo 'install: --no-ri --no-rdoc' > ~/.gemrc
echo 'update: --no-ri --no-rdoc' >> ~/.gemrc
echo 'gem: --no-ri --no-rdoc' >> ~/.gemrc

gem update --system
sudo yum install -y libxml2-devel libxslt-devel
gem install nokogiri -- --use-system-libraries
gem install --no-ri --no-rdoc rails

# デバッグ用
gem install ruby-debug-ide
gem install debase

rails -v

echo "＋------------------------------------------------------------------------------------------------------------＋";
echo "■確認";
echo "＋------------------------------------------------------------------------------------------------------------＋";
echo "[Linux]"
cat /etc/issue
echo ""
echo "[git]"
git --version
echo ""
echo "[rbenv]"
rbenv -v
echo ""
echo "[ruby]"
ruby -v
echo ""
echo "[rails]"
rails -v
echo ""
```
[#matlab] double型の数字が整数かどうか判定する

# intro
matlabでdouble型が基本的に出力されますがそれが整数なのかどうかを判定する関数を書きます。

地味に重要な気がする。

# method
eps関数がキモです。
epsironの略だと思うんですけど、許容誤差みたいなもんですね。
eps('double')はdoubleの最小誤差ってことだと思います。
double型のintegerなら、round(四捨五入)して差をとっても完全にゼロになるので、差がeps('double')より小さくなるということみたいです。

```matlabsession
IsInteger = @(x) (abs(round(x)-x)) <= eps('double');
a = 0.01;
b = 1.00;

isinteger(a)
isinteger(b)
IsInteger(a)
IsInteger(b)
% results below
% ans =
%      0
% ans =
%      0
% ans =
%      0
% ans =
%      1 % only `IsInteger` can tell if the number is integer or not
```

# reference

[MATLAB Central - Finding out if a floating point number is integer.](http://www.mathworks.com/matlabcentral/newsreader/view_thread/310384)
Grenning > 指示初期化子 (C99準拠)

@ テスト駆動開発による組み込みプログラミング by James Grenning

## 指示初期化子

> もしあなたがC99準拠のコンパイラを使っているなら、次のようなやり方も可能だ。

```t2/mocks/LightDriverSpy.c
static LightDriverInterfaceStruct interface = 
{
    .Destroy = destroy,
    .TurnOn = turnOn,
    .TurnOff = turnOff
};
```

> このやり方の利点は間違いにくいことだ

~~上記のような書き方を「インターフェイス構造体 c99」などで検索してもうまく見つけられない。
正式名称は違うのかもしれない。~~

<hr>
(追記 2016/01/09)
コメントにて指摘していただいた記事の間違いを修正しました。
Androidstudioで問題が解決できません。

最近プログラミングを始めたのですが、サンプルプログラムを作っていて

エラーがでてきて問題を解決できません。
このViewDtoで
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/108624/5add8891-13f8-9f20-13e2-b1f613bbc792.png)
Logには、エラーが
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.sampled.ViewDto.getName()' on a null object reference

と書かれていて一応検索してみたんですがわかりませんでした。
どうすればいいでしょうか?
ＲＥＭ（注釈）の代わりに使う「：：」の後ろに書けるのは全角２５４文字が限界

注釈を１行で２５４文字書く事は、まずないとしても
ＳＥＤ等のスクリプトで置換前１３０文字→置換後１３０文字の
置換プログラムを１行で書き、それを「::」で注釈にした場合
バッチが【止まる】ので、極力注釈はＲＥＭで書きましょう。

実際に止まる例で試してみて下さい。

::←全角２５４文字が限界→

動く.CMD
rem /; ::０１２３４５６７８９ＡＢＣＤＥＦＧＨＩＪＫＬＭを１１回書く＋０ ※ 最後の０が２５４文字目
::０１２３４５６７８９ＡＢＣＤＥＦＧＨＩＪＫＬＭ０１２３４５６７８・・・０
:LOOP
@ECHO;LOOP
@PAUSE
GOTO :LOOP

こちらは、GOTO :LOOP で止まります。

止まる.CMD
rem /; ::０１２３４５６７８９ＡＢＣＤＥＦＧＨＩＪＫＬＭを１１回書く＋０１ ※ 最後の１が２５５文字目
::０１２３４５６７８９ＡＢＣＤＥＦＧＨＩＪＫＬＭ０１２３４５６７８・・・０１
:LOOP
@ECHO;LOOP
@PAUSE
GOTO :LOOP
PHP 変数汚染 （グローバル変数）回避方法のいくつか


今の時点でグローバル変数だらけのプログラムを組む事はないと思いますが
変数汚染をさけるいくつかの方法をメモりました。

[X] 1 namespaceを使う? -> [クラス、インターフェイス、関数、const]には有効だが、[変数]ではダメＸ
[O] 2 call_user_funcで無名関数を使う。(※Closure)
[O] 3　メインフローなど、すべてclass内で処理

他には絶対初期化して使用する（）、変数を使用後破棄(unset)する等。
どのみち処理がわりこまれるとアウトですし、めんどくさいですけど。


``` test.php

<?php
namespace Test;
// エラー出力しない場合
ini_set( 'display_errors', 0 );

//const PHP_EOL = "<br>";



//0　このままでは$iは10の値のまま[ごみ変数]として残る。　（※こんなプログラムは組まないとは思うが　・・・
echo "変数汚染->".PHP_EOL;

	for($i=0;$i<10;$i++){

		echo $i.PHP_EOL;

	}


	echo "変数汚染 ->".PHP_EOL;
		echo $i.PHP_EOL;
		echo $i.PHP_EOL;


//2　namespaceを使う　------------------------------
//変数には適応されないので↑を引き継ぐ

echo "namespaceを使う->".PHP_EOL;

namespace Test2;
		echo $i.PHP_EOL;
		echo $i.PHP_EOL;




//2　call_user_funcを使う　------------------------------
//上の$iの影響はうけないので何も出力されない

echo "call_user_funcを使う->".PHP_EOL;

	call_user_func(function(){

		echo $i.PHP_EOL;

	});


//3 すべてclass内で処理
//上の$iの影響はうけないので何も出力されない

echo "すべてclass内で処理->".PHP_EOL;

class Main_Flow{

	public static function main(){

		echo $i.PHP_EOL;
	}
}


$main_flow = new Main_Flow();
$main_flow::main();



?>
```



------

※補足として

逆にclassなどの中でglobal変数にアクセスしたい時はglobal $iなどで宣言する。

php5.3以下だとregister_globalsがあり、これによりグローバル変数汚染やセキュリティ問題が起きる場合がある
http://php.net/manual/ja/security.globals.php

こんな時代もあったねと・・・
http://www.sound-uz.jp/php/note/registerGlobals

----
他参考

PHPでグローバル変数を閉じ込める
http://qiita.com/t_cyrill/items/15de4f841737f1381b48

グローバル変数を作らずにファイル間で値をやり取りする
http://qiita.com/Hiraku/items/551ba8bf15b6b23a12a6

----

他にもやり方はあるんでしょうかね？
オレオレ証明書とhttpsサーバーを3分で立ち上げる5つのステップ


opensslとnodeがあればなんのOSでもいけるかと思います。
(Amazon Linux ,CnetOSなら下記のようにyum で)

### 其の一 KEY作成
乱数でキーを作る　
※random state e is e is 65537 (0x10001)とかエラーみたいのがでてもできてたらいける

> openssl genrsa 2048 > mysslserver.key

### 其の二 CSR 作成
場所、組織名など登録 (Tokyo , Shibuya , Conpany Name , Company Dept としました)
> openssl req -new -key mysslserver.key -subj "/C=JP/ST=Tokyo-to/L=Shibuya/O=Company Name/OU=IT dept./CN=Company Dept CA" > mysslserver.csr

### 其の三　CRT作成
日数を指定(3650日　約10年)
> openssl x509 -days 3650 -req -signkey mysslserver.key < mysslserver.csr > mysslserver.crt

### 其の四　pfx作成、キーと証明書をパックする

> openssl pkcs12 -export -inkey mysslserver.key -in mysslserver.crt > mysslserver.pfx




### 其の五 nodeの組み込みだけでHTTPS


ファイルを下記のように用意したらサーバーを起動する

> sudo yum install -y node
> node https.js &

```js:https.js

https = require('https');
fs = require('fs');
host='127.0.0.1';
port=8443;
https.createServer({pfx: fs.readFileSync('mysslserver.pfx')}, function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(port, host);
console.log('Server running at https://' + host + ':' + port);
```

と、ここまでで終了


指定したポートでhttpsをたたいてみると(ブラウザでもよいです)

> curl -k https://127.0.0.1:8443/
Hello World

あ、はい、こんにちわ

curl は kをつけたらオレオレでもOK
`If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.`

hello world 以外は自分でアプリケーション書いてください。


### 其の六 静的サイトでいいならこちら

> npm install node-static
> node https-static.js &

```js:https-static.js
https = require('https');
statics = require('node-static');
fs = require('fs');
st =  new(statics.Server)('../htdocs/');
port=8443;

https.createServer({pfx: fs.readFileSync('mysslserver.pfx')}, function (req, res) {
  st.serve(req,res);
}).listen(port);

```

あくまで、エラーもなにもないので、あったらページがみれるんで。



### 其の七　HTTPS -> HTTP に串する

も少し、サーバーぽいのがすでにたってるからバインドしたいって場合は

> python -m SimpleHTTPServer &

これでhttp://127.0.0.1:8000/が立ち上がるので
(いや、普通にapacheでもいいです。。)

> yum install httpd
> service httpd start

てゆうか、もう、だったらnodeじゃなくていいから。。
apacheでhttpsしたらいいから。。

HTTPS -> HTTP にリダイレクトしてWEBページみれる

https://127.0.0.1:8443/ →
　http://127.0.0.1:8000/


> npm install http-proxy
> node https-proxy.js &


```js:https-proxy.js
httpProxy = require('http-proxy');
fs = require('fs');
httpProxy.createServer({
  ssl: {
    key: fs.readFileSync('mysslserver.key', 'utf8'),
    cert: fs.readFileSync('mysslserver.crt', 'utf8')
  },
   target: {
    host: '127.0.0.1',
    port: '8000'
  }
}).listen(8443);
```

なにって、いまそこにいるってだけで、作業しているフォルダでサーバーをたちあげて、ちょっと確認して、ほい、みたいなときにいいでしょ!
Forgery の mock を作る

## Forgery の Class は？

たとえば `Forgery(:basic).text` に対してモックを作りたいときは。
`Forgery::Basic` がクラスだ。なのでそれに対してモックを作る。

```rb:example_spec.rb
require 'spec_helper'

describe  do
  subject { Forgery(:basic).text }

  before do
    allow(Forgery::Basic).to receive(:text).and_return('mocked text')
  end

  it { should eq 'mocked text' }
end
```

## 結果

```
$ rspec example_spec.rb
```

テストが通る。

```
1 example, 0 failures
```



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
GnuCOBOLでHTML出力

* ubuntuにて確認

## 参考

* [GnuCOBOL FAQ and How To](http://opencobol.add1tocobol.com/gnucobol/)
* [コーディングルール | COBOLプログラミング入門](http://tallercolibri.com/archives/60)


## CGIサーバの準備

```bash:cgisrv.py
#!/usr/bin/python3

import http.server
http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler)
```

```bash:CGIサーバ起動
mkdir cgi-bin
python3 cgisrv.py
```

## コンパイラ

```bash:
apt-get install -y open-cobol
```

* `cobc`コマンドでコンパイルする。

## ソース

* 先頭8文字スペースが必要。タブではダメ
* コメントアウトは6文字目に`*`を書く。

```cobol:hello.cbl
        program-id.     cgitest.
        data division.
        working-storage section.
      * 改行の定義
        01 newline        pic x  value x'0a'.

      * main処理
        procedure       division.

      * HTML出力
        display
          'content-type: text/html'
          newline
          newline
          '<html>'
          '<head>'
          '<title>cobolcgi</title>'
          '</head>'
          '<body>'
          'hello world!!'
          '</body>'
          '</html>'
        end-display.
```

## コンパイル

```bash:コンパイル
cobc -x -o cgi-bin/hello.cgi hello.cbl
```

```bash:実行確認
cgi-bin/hello.cgi
```

* htmlが出力されることを確認。

## 表示確認

* http://localhost:8000/cgi-bin/hello.cgi
* にアクセスしHTML表示されることを確認。
プロトタイピングで使えるJavascript+CSSライブラリ集

昔片手間に作ったもの、追記予定

# CSS
## CSSフレームワーク
Bootstrap
http://getbootstrap.com/
Gumby - A Flexible, Responsive CSS Framework - Powered by Sass
http://gumbyframework.com/
UIkit
http://getuikit.com/
skelJS
http://getskel.com/
Responsable Framework
http://responsablecss.com/
Almost Flat UI
http://websymphony.net/almost-flat-ui/
Unsemantic CSS Framework
http://unsemantic.com/
Maxmertkit
http://www.maxmert.com/
Workless
http://workless.ikreativ.com/
Base
http://matthewhartman.github.io/base/
Simple Grid
http://thisisdallas.github.io/Simple-Grid/
Toast • The no-nonsense CSS grid
http://daneden.github.io/Toast/
HTML Kick start
http://www.99lime.com/elements/
Cascade
http://jslegers.github.io/cascadeframework/index.html
PURE
http://purecss.io/
Foundation
http://foundation.zurb.com/

## Javascript
### レイアウト
#### タイル
Masonry
http://masonry.desandro.com/
jQuery Nested
http://suprb.com/apps/nested/
Isotope
http://isotope.metafizzy.co/
Grid-A-Licious
http://suprb.com/apps/gridalicious/
Yannis Chatzikonstantinou / Freetile.js
http://yconst.com/web/freetile/
Wookmark jQuery Plugin
http://www.wookmark.com/jquery-plugin
Wookmark jQuery Plugin
http://www.wookmark.com/jquery-plugin
BlocksIt.js | Dynamic Grid Layout jQuery Plugin - Plugin Page
http://www.inwebson.com/demo/blocksit-js/
#### 縦書き
HTMLで縦書きは実現できるか - CSSでの実装とライブラリの活用
http://qiita.com/HieroglypH/items/37e384905bec0317a8ec
【2014】海外で話題のjsライブラリ/フレームワークまとめ76選
http://qiita.com/seiya1121/items/2bc256c0d8f4c1bb1de4
Open Shift + WordPreess + 独自ドメインでハマったこと

# OpenShiftでWordpress動かしてハマったこと。

## 何故か`/wp-admin/`に行こうとすると`https://****.rhcloud.com/wp-admin/`に飛ばされる。

どうやらSSLでアクセスすると`https://****.rhcloud.com/`にリダイレクトがかかる模様。

これを

```app-root/data/current/wp-config.php

...

define('FORCE_SSL_ADMIN', true);

...
```

こうしたら治りました。

```app-root/data/current/wp-config.php

...

define('FORCE_SSL_ADMIN', false);

...
```

これでいいのか…
git help -w ◯◯でエラーが出た時の対処

git help -w ◯◯を実行するとブラウザでそのコマンドの説明が見れる、という機能があります。
ただ、これを試した時に私の環境だと上手く動かなかったのでその辺りの対処方法を書いていきます。

# １つ目のエラー

最初に試した時に以下のエラーが表示されました。

````
$ git help -w ◯◯
fatal: HTML documentation is not provided by this distribution of git.
````

ん？と思い、とりあえずGitのバージョンを調べたらv1.9だったので一旦v2.6.4にアップデートしてみることにしてみました。

# ２つ目のエラー

アップデート後に再度実行してみた。

````
$ git help -w ◯◯
fatal: '/usr/local/git/share/doc/git-doc': not a documentation directory.
````

エラー内容が変わりましたね！
読むと指定されたパスにドキュメントが無い、ということがわかります。

確かに指定されたパスを見てみると`/usr/local/git/share`の下にdocがありませんでした。
なので、ドキュメントを追加する作業を行います。

````
$ cd /usr/local/git/share
$ sudo mkdir doc
$ sudo git clone git://git.kernel.org/pub/scm/git/git-htmldocs.git git-doc 
````

ドキュメントを設置したことによって、`git help -w ◯◯`を実行できるはずです。
supervisordで動かしたtd-agentで環境変数を参照する

dockerでタイトルの環境を構築しログを出力していて、ホスト単位ではなくサービス単位でtagをまとめようとしてハマったのでメモ。

コンテナを起動するとき環境変数（ココではSERVICE_NAME）を渡してtd-agent.confで指定すれば良いと思い、以下のように記述。
fluent-plugin-config-expanderでホスト名を参照するため${hostname}と書いていたところを環境変数を参照するように書き換えてみた。

```
<source>
  type tail
  path /var/log/hoge.log
  tag "docker.hoge-#{ENV['SERVICE_NAME']}"
  format none
  pos_file /var/log/td-agent/hoge.log.pos
</source>
```

が、環境変数を参照出来ていない（空になっている）。
試しに#{1+1}のような式を書けば2になるので、rubyが動作していないわけではない模様。

printenvで環境変数が設定出来ていることは確認済み、かつsupervisordではなく手動で起動するときちんと参照出来ている。
このため、supervisordで動かす方法に問題があると推測。
恥ずかしながら、この問題に遭遇するまでserviceと/etc/init.d/xxxで動かす場合の違いを知らなかった。
環境変数を参照出来るよう以下のようにDockerfileを書き換えることで、環境変数を参照出来るようになった。

```
#ENTRYPOINT ["service", "supervisord", "start"]
ENTRYPOINT ["/etc/init.d/supervisord", "start"]
```
Canvasの大きさを動的に変更する

[Canvasの大きさをCSSで指定](http://se35over.seesaa.net/article/272485013.html)したら見事にハマりましたよ．
キャンバスの大きさをデフォルト値からの倍率で変更したかったのですが，CSSでwidthとheightをピクセルで指定したところ，キャンバス内で描画される内容が引き伸ばされるようになりました．
描画内容が引き伸ばされないように工夫する必要が出てきてしまって，過去最悪のスパゲッティコード化する恐れがあったので，どうにかならないか調査しました．

canvasタグはwidth属性とheight属性で大きさを決めます．デフォルト値は300x150pxで，CSSでwidthとheightを指定すると，canvasが画像扱いになって引き伸ばされるようです．それならば，canvasタグのwidth属性とheight属性を直接変更してやることで，キャンバスの大きさを動的に変更できるのではないかと仮説を立てました．

```js:test.js
var elem = document.getElementById('map');
elem.setAttribute("width", this.width.toString());
elem.setAttribute("height", this.height.toString());
```

こんな感じで，直接属性を変更することで，キャンバスの大きさを変更することができるようになります．ただし，描画内容は全く保証されないので，キャンバスの中身を再描画する必要があります．
【Simulator 】Macでスマホ動作確認できるiOSシミュレーター

# Macユーザー必見！iOS系のスマホ動作確認できるiOSシミュレーター

## iOSシミュレータってなに？
Appleが配布している開発者向けのXcodeに含まれるシミュレータソフトになります。
Mac上で、iPhoneやiPadの表示など環境を確認することができ、Appleが正式に配布しているので動作が軽いと言われています。
実機に近い確認ができますが、100%差異が無いとはいえません。
最終的な実機確認をお勧めしますが、ローカル環境(XAMPP)などの確認も行えるので作業に便利です。

## iOSシミュレータを使うには？
Mac Apple StoreからXcodeのダウンロード、インストールで事前に落として置くことが必要です。
[https://itunes.apple.com/jp/app/xcode/id497799835](https://itunes.apple.com/jp/app/xcode/id497799835)

## iOSシミュレータを起動してみる
Xcode ＞ Open Developer Tool ＞ iOS Simulators
で使用可能です。
※よく使うようであればDockに追加しておくのが良いでしょう。

# 操作の仕方
## 基本操作
使い方は少し面倒くさいですが。
タップ:クリック
スワイプ：ドラッグ
スクロールするにはクリックしてマウスで移動になります。

## デバイス言語を切り替えてみる
Settings ＞ General ＞ Language & Region > iPhone Language > 日本語


設定など結構面倒くさいですが実機確認前の確認に使えるのと、
ブラウザの幅を変えたりユーザーエージェントを変更したりで確認してた方にはiphoneのバーション違いやipadなど確認出来るデバイス多いので役に立ちます。
細かいオプションなどもあります。（※ここは後日追加でもします。）
[Javascriptメモ] prototypeを使ってOOPっぽく書く

#問題
文字列がある｡この文字列を連続したものにするために加える必要がある文字を返せ｡

例えば

>abce -> b
abcdefghjklmno -> i
bcd -> undefined(連続してるので何も返さない)
yz -> undefined(上と同様)


jasmineのテストコードは以下

```js
describe('description', function() {
    it('description', function() {
        expect(fearNotLetter('abce')).toEqual('d');
        expect(fearNotLetter('abcdefghjklmno')).toEqual('i');
        expect(fearNotLetter('bcd')).toEqual(undefined);
        expect(fearNotLetter('yz')).toEqual(undefined);
    });
});
```


出展: [FreeCodeCamp](http://www.freecodecamp.com/)の[この](http://www.freecodecamp.com/challenges/bonfire-missing-letters)問題から

#pseudocode

1 文字列から文字配列を作製
2 文字配列の最初と最後の文字コードをとる
1-1 文字配列をすべて文字コードにした配列を作る
2-1 最初と最後の文字コードから連続した文字コードの配列を作る

1-1 と 2-1 を比較して片方にしか無い物を返す

(あんま効率よくないですね｡本当はもっといいやり方があるみたいです｡)

#解法1　ベタ書き

```js

var _ = require('underscore');

function fearNotLetter(str) {
    var strAr = _.toArray(str);
    var charFirst = strAr[0].charCodeAt();
    var charLast = _.last(strAr).charCodeAt();
    var charAr = _.map(strAr, function(value) {
        return value.charCodeAt();
    });
    var compareAr = _.range(charFirst, charLast + 1);
    var resultChar = _.difference(compareAr, charAr).join('');
    if (resultChar === '') {
        return undefined;
    }
    return String.fromCharCode(resultChar);
}
```

varだらけで見栄えが良くないですね｡
これだと例えば「underscoreを使わないで記述せよ」と言われた時にものすごくやりづらそうです｡

#解法2 prototypeを使ってみる

``` js
var _ = require('underscore');

function Runner(str) {
    this.strAr = _.toArray(str);
    this.charFirst = this.strAr[0].charCodeAt();
    this.charLast = _.last(this.strAr).charCodeAt();
    this.charAr = this.generateCharAr();
    this.compareAr = this.generateCompAr();
    this.resultChar = this.generateResuChar();
}

Runner.prototype.generateCharAr = function() {
    return _.map(this.strAr, function(value) {
        return value.charCodeAt();
    });
};

Runner.prototype.generateCompAr = function() {
    return _.range(this.charFirst, this.charLast);
};

Runner.prototype.generateResuChar = function() {
    return _.difference(this.compareAr, this.charAr).join('');
};

function fearNotLetter(str) {
    var doRun = new Runner(str);
    if (doRun.resultChar === '') {
        return undefined;
    }
    return String.fromCharCode(doRun.resultChar);
}
```

少しマシになったと思います｡

#補足
FreeCodeCampはHTMLとJSを学ぶのにとても素晴らしいサイトだと思います｡
CodeAcademy形式でCodeAcademyよりも難しい問題がたくさんあります｡
http://www.freecodecamp.com/
パスワード無しでSSHログイン ( Windows / Mac / Linux 各クライアントから)

クライアント側で鍵ペアを作成し、公開鍵をサーバに登録すれば、ログイン時にパスワードが不要になる。
毎度パスワードを入力する必要が無いため、安全面でのメリットも。

# 鍵ペア作成

### クライアントがLinux/Macの場合

クライアント側で、DSA鍵を作成する。実行後、~/.ssh配下に秘密鍵(id_dsa)と公開鍵(id_dsa.pub)が作成される。
<pre>
$ ssh-keygen
Generating public/private dsa key pair.
Enter file in which to save the key (/home/foo/.ssh/id_dsa): <- Enter
Created directory '/home/foo/.ssh'.
Enter passphrase (empty for no passphrase): <- Enter(パスフレーズなし)
Enter same passphrase again: <- Enter(パスフレーズなし)
Your identification has been saved in /home/foo/.ssh/id_dsa.
Your public key has been saved in /home/foo/.ssh/id_dsa.pub.
The key fingerprint is:
24:5a:b7:0b:4f:be:3a:e7:95:46:bd:54:23:04:20:55 foo@client
The key's randomart image is:
+--[ DSA 1024]----+
|      ..ooE..    |
|       .   .     |
|      o o   . o  |
|     o + . . o . |
|    . . S . o    |
|       = o o .   |
|        + + .    |
|      . .+       |
|      .=o        |
+-----------------+
</pre>

### クライアントがWindowsの場合

Gitをインストールすると、ssh-keygenのexeがあるのでそれを利用して、鍵を作る。
ssh-keygenにパスを通しておくこと。
以下、Git bash を利用。
<pre>
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (//.ssh/id_rsa): /c/Users/XXXXX/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in c:/Users/XXXXX/.ssh/id_rsa.
Your public key has been saved in c:/Users/XXXXX/.ssh/id_rsa.pub.
The key fingerprint is:
48:--:--:--:0b:bf:0a:fd:ff:--:--:--:--:--:--:-- XXXXX@YOUR SERVER NAME
The key's randomart image is:
+--[ RSA 2048]----+
|        略       |
+-----------------+
</pre>

# サーバへの登録

### クライアントがLinux/Macの場合

ssh-copy-id コマンドが使える端末（大抵のLinux）なら、以下のようにするだけでOK。-p はポートフォワード等のケースで必要。
<pre>
client$ ssh-copy-id -i ~/.ssh/id_dsa.pub -p 2205 user@server
</pre>

Macの場合、適当なLinuxマシンからssh-copy-idをコピーしてくると動く。
<pre>
hogelinux$ which ssh-copy-id
hogelinux$ scp {ssh-copy-idパス} user@mac:~/
mac$ mv ~/ssh-copy-id /usr/local/bin
</pre>

### クライアントがWindowsの場合

ssh-copy-id みたいな便利なやつが無いのでめんどくさい。
SSHクライアントからコピーした公開鍵を~/.ssh/authorized_keysに追加する。またauthorized_keysのパーミッションは600に変更する。
以下、WinSCP等で公開鍵をサーバのユーザホームにコピーしている前提。
<pre>
server% mkdir .ssh
server% chmod 700 .ssh
server% cd .ssh
server% cat ~/id_dsa.pub >> authorized_keys
server% chmod 600 authorized_keys
server% rm ~/id_dsa.pub
</pre>

# 参考サイト

"SSHサーバにパスワードなしでログインする方法":http://l-w-i.net/t/openssh/login_001.txt
"ssh-copy-idをmacで使う方法":http://qiita.com/narumi888/items/420cd97032500808af54
LinuxソフトウェアRAID mdadm使用方法

# ステータス確認
```
less /proc/mdstat
```
HDD損傷時は，
1) [UUUUU_U]のように，_が表示される．
2) md0:を構成しているパーティションの一つが(F)になる．
```
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid6 sdf1[4] sdc1[1] sdd1[2] sdg1[5](F) sdh1[6] sde1[3] sdb1[0]
      14650667520 blocks super 1.2 level 6, 512k chunk, algorithm 2 [7/6] [UUUUU_U]
```

# HDD取り外し方法
0) RAIDをアンマウントする．
1) 故障したパーティションを指定する．
```
madadm --manage [RAID名] --fail [故障したパーティション名]
```
(recoveryが終わるまで待つ)

2) 故障したパーティションを取り除く．
```
madadm --manage [RAID名] --remove [取り外すパーティション名]
```

3) 実際にHDDを取り新しくつける．

# HDD追加方法
1) partedでパーティションを切る．
2) mdadm [RAID名] -a [パーティション名]
3) マウント
RaspberryPi: TXD pin(GPIO14) を壊しました。- PCとUSB-UART接続時に電源をつなぐ場合、注意

RasPiをUSB-UARTでPCとつなぐと、そこから電源も取れたりして、らくちん。

しかし、間違えて一個ずれて(USB-UART-5Vを6番pin, GND-8番...と )、5V電源もつなぐと、らずぱいのTXDが<font color='red'>壊れます</font>。
RasPi1-B, RaspPi2-Bをそれぞれ１つづつ壊しました。

UARTで送信(PCで受信)できなくなった以外は、いまのところ、動いてるっぽい..
\# RXDは生きているので、PCから、文字をタイプするとうごく。(terminal上見えないけど、sudo rebootとか打つ)
\# SSHで入れば、つかえる。
\# 微妙にチップが<font color='red'>あったかい</font>ような..


## 注意しましょう。

...


- 正しい?接続

||ピン左列 | ピン右列 | | USB-UART |
|--:|:--:|:--:|:---|:--:|
|3.3V| 1 | 2 | 5V | |
|SDA| 3 | 4 | 5V | 5V |
|SCL| 5 | 6 | GND| GND |
|GPIO4| 7 | 8 | UART TX| RX |
|GND| 9 | 10| UART RX| TX |
|... | ... | ...| ... |...|




# GPIOとしてのテスト
- GPIO outputでは、電圧を測った。Lowで0V、HIghで3.3Vあたりがでてくる。
- TXDピン(GPIO14)は 基本的にLow(=0)になったままでした。RXDピン(GPIO15)はOK。

```
sudo su 

# TXD:GPIO14 Output High
echo 14 > /sys/class/gpio/export 
echo out > /sys/class/gpio/gpio14/direction
echo 1 > /sys/class/gpio/gpio14/value

# RXD:GPIO15 Output High
echo 15 > /sys/class/gpio/export 
echo out > /sys/class/gpio/gpio15/direction
echo 1 > /sys/class/gpio/gpio15/value

# TXD:GPIO14 Output Low
echo 14 > /sys/class/gpio/export 
echo out > /sys/class/gpio/gpio14/direction
echo 0 > /sys/class/gpio/gpio14/value

# RXD:GPIO15 Output Low
echo 15 > /sys/class/gpio/export 
echo out > /sys/class/gpio/gpio15/direction
echo 0 > /sys/class/gpio/gpio15/value

# TXD:GPIO14 Input - 3.3VまたはGNDとつないで確認
echo 14 > /sys/class/gpio/export 
echo in > /sys/class/gpio/gpio14/direction
cat /sys/class/gpio/gpio14/value
=> 0しかかえってこない

# RXD:GPIO15 Input　- 3.3VまたはGNDとつないで確認
echo 15 > /sys/class/gpio/export 
echo in > /sys/class/gpio/gpio15/direction
cat /sys/class/gpio/gpio15/value
=> GNDで0, 3.3Vで1がかえってくる。

```
ElasticBeanstalkで作成したRDSのタイムゾーンを日本時間に設定する方法

#概要

2015/12/21 より time_zone パラメータを用いて任意のタイムゾーンを設定することが出来るようになったので試してみたいと思います。

#関連記事

Amazon RDS (MySQL, MariaDB)がlocal time zoneをサポートしました
　http://aws.typepad.com/aws_japan/2015/12/amazon-rds-local-timezone-support.html

Local Time Zone for MySQL DB Instances
　http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_MySQL.html#MySQL.Concepts.LocalTimeZone


#Try
新しくパラメータグループを作成し、time_zone パラメータに "Asia/Tokyo" を選択して、変更を保存後に ElasticBeanstalk で使用している RDS DB インスタンスに適用する。
また、適用の方法としては、.ebextensions の定義ファイルを利用する。

設定例は以下の通り

　Resources:
　  AWSEBRDSDatabase:
　    Type: AWS::RDS::DBInstance
　    Properties:
　      DBParameterGroupName: "<Parameter Group Name>"



#参考文献
パラメータグループの作成方法や .ebextentions 定義ファイルへの設定方法については、以下をご参照させていただきました。

　AWS Elastic Beanstalk RDS の文字コードをutf-8に設定しなおす
　http://typea.info/blg/glob/2015/05/aws-elastic-beanstalk-rds-utf-8.html

　AWS Elastic Beanstalkで作成されるリソース（EC2, RDSなど）をカスタマイズする方法
　http://qiita.com/anoworl/items/4371924dc2ddae0b56f9
プログラムでテキストの色を背景色に応じた見やすい色に設定する


テキストの色は単純に白・黒のみで限定します。
色の明るさを計算するロジックはこちら。

参考 [Technique 2.2.1 [priority 3] Test the color attributes of the following elements for visibility:](http://www.w3.org/WAI/ER/WD-AERT/#color-contrast)

>Color brightness is determined by the following formula:
((Red value X 299) + (Green value X 587) + (Blue value X 114)) / 1000
Note: This algorithm is taken from a formula for converting RGB values to YIQ values. This brightness value gives a perceived brightness for a color.

>The rage for color brightness difference is 125.

125 が基準らしいですが、どちらがどうなのでしょうか？

参考2 [Check if UIColor is dark or bright?](http://stackoverflow.com/questions/2509443/check-if-uicolor-is-dark-or-bright)
> If it is below 125, use white text. If it is 125 or above, use black text.

125 より少ない場合は、背景色が暗いということですね。
上記の通りにやってみた例が下記です。

```swift
let red = 0.0, green = 0.0, blue = 0,0, alpha = 0.0

// それぞれの引数に指定した変数に値が返ります。
uiview.backGroundColor.getRed(&red, green: &green , blue: &blue, alpha: &alpha)

// red等の値は 0.0 - 1.0 で返るので * 255 して RGB にする
let delta = ((red * 255 * 299) + ( green * 255 * 587) + (blue * 255 * 114)) / 1000 

// 125 より少なければ背景色は濃い色なので、テキストの色は白く、逆は黒く
if delta < 125 {
    textColor = UIColor.whiteColor()
}else{
    textColor = UIColor.blackColor()
}
```

実際は delta の値を見て、様々な色を設定しても良さそうです。

当然ですがロジックは普遍的なものなので、 iOS だけでなく Web やその他様々な場面で利用できそうです。
python3xでassert statement

#assert statement

>Programmers use assert statements to verify expectations, such as the output of a function being tested.

boolean context。シンプルに`false`がでたらエラーを吐いて`""`を表示してくれる`statement`。`true`の場合は特に何も処理を行わない。
一般化すると`assert (conditional statement), "otherwise reason or exception says"`こういったテストは同じファイルの中で書くか、`_test.py`と名付け別のファイルとして保存するのが通例。

```
your_age = int(input("your age is?"))
assert your_age >= 0, "how is your age negative?" # age always has to be greater than equal 0, otherwise...
print("your age is:", your_age)
```

ただ`false`が出るとプログラム自体がクラッシュしてしまうのであまり好まれない。

ref:

- <a href="https://www.youtube.com/watch?v=0r8N0XwQSkk" target="_blank">Python Tutorial - 23 - Assert Try Raise Except Finally</a>
- <a href="http://composingprograms.com/pages/15-control.html#testing" target="_blank">Testing</a>
適当にGitクライアントを設定するcookbookを書いてみました。対話式コマンドも自動化

# はじめに

よく仮想マシンを立てたりするので、そのたびに`git config --`とか書くのが面倒なので、Chefの経験値を積むためにあえてcookbookを書いてみました。

`.gitconf`をコピーしたらいいじゃない？という真っ当なご意見を言われるとたぶん泣くのでやめてください！

## 今回のポイント

一応、オプションで`ssh-keygen`で、SSHの認証鍵を生成するのですが、ここをなんとか入力無しにしたいという思惑がありました。調べてみたところ`autoexpect`と`expect`というコマンドがあったので、利用してみました。

最初は、一時ファイルを`/tmp`ディレクトリで実行しようとしましたが、[foodcritic](http://www.foodcritic.io/)によると、`Chef::Config[:file_cache_path]`を使うと良いというので、素直に使用してみました。

参考URL:[Chefレシピ逆引きメモ](http://qiita.com/makoto_kw/items/53a84380559c087eb8fb)

## Chefのスタンドアローン実行

いちいち、Chef serverまでcookbookをアップロードして、実行させるのが面倒なわたしのような方は、`chef-solo'のようにローカルで実行できるのでご安心ください

```bash:chef-clientローカルモード
$ cd ~/chef-repo
$ sudo chef-client --local-mode --override-runlist git-client
```

`package`などrootの操作が必要な場合は、`sudo`で実行します。

## `autoexpect`で対話処理を自動化する

ubuntu 15.10は`sudo apt install expect`でインストールできます。
`ssh-keygen`を自動化したいわけなので、以下のようなコマンドを実行しました。

```bash:autoexpectを実行する
autoexpect ssh-keygen -t rsa -C "your@email.com" -f id_rsa.yourname
```

それで、生成されたのが`script.exp`というファイルです。
そして、それをテンプレート化して、`erb`ファイルにしたのが以下のコード（抜粋）です。

```bash:script.exp.erb
# この前の行はコメントだらけなので省略
set timeout -1
spawn ssh-keygen -t rsa -C \"<%= node['git-client']['email'] %>\" -f <%= node['git-client']['ssh-key-filename'] %>
match_max 100000
expect -exact "Generating public/private rsa key pair.\r
Enter passphrase (empty for no passphrase): "
send -- "\r"
expect -exact "\r
Enter same passphrase again: "
send -- "\r"
expect eof
```

といった感じになります。passphraseを空白で埋めていますが、改造すればなんとかなりそうです。

それで、cookbookの`recipes/default.rb`の中で、`template`で`Chef::Config[:file_cache_path]`ディレクトリに展開し、実行権限を与えて`script.exp'を実行します。
recipeの抜粋はこちらになります。

```ruby:ssh-keygenを自動実行する
template "#{Chef::Config[:file_cache_path]}/script.exp" do
  source 'script.exp.erb'
  owner  node['git-client']['unix-user']
  group  node['git-client']['group']
  mode   '0750'
  action :create
end

if node['git-client']['if-create-ssh-key'] then
  execute 'ssh-keygen' do
    cwd "#{node['git-client']['home-dir']}/.ssh"
    command <<-EOC
    /#{Chef::Config[:file_cache_path]}/script.exp
    chmod 0400 #{node['git-client']['ssh-key-filename']}
    EOC
    user  node['git-client']['unix-user']
    group node['git-client']['group']
  end
end
```

## 最後に

このcookbookの実質的なメリットは`~/.ssh`や秘密鍵の権限変更を忘れずしてくれることかも知れません…

## GitHubサイト

- https://github.com/nanopico-san/git-client

ご指摘等ありましたら、よろしくお願いたします。
最後まで、お読みいただきありがとうございました。
visualize insertion sort


```python
import random

def vs_insertion(l, i):
    n = l.copy()
    n.insert(i+1, "*")
    n.insert(i+1, "]")
    n.insert(0, "[")
    print(" ".join(map(lambda x: str(x), n)))


def insertion_sort(l):
    size = len(l)
    i = 1
    while i < size:
        tmp = l[i]
        j = i - 1
        while j >= 0 and tmp < l[j]:
            l[j + 1] = l[j]
            j -= 1
        l[j + 1] = tmp
        vs_insertion(l, i)
        i += 1


r = [random.choice([i for i in range(1000)]) for r in range(10)]
insertion_sort(r)
print(r)

```

Output

```
[ 169 170 ] * 579 477 707 108 884 393 172 447
[ 169 170 579 ] * 477 707 108 884 393 172 447
[ 169 170 477 579 ] * 707 108 884 393 172 447
[ 169 170 477 579 707 ] * 108 884 393 172 447
[ 108 169 170 477 579 707 ] * 884 393 172 447
[ 108 169 170 477 579 707 884 ] * 393 172 447
[ 108 169 170 393 477 579 707 884 ] * 172 447
[ 108 169 170 172 393 477 579 707 884 ] * 447
[ 108 169 170 172 393 447 477 579 707 884 ] *
[108, 169, 170, 172, 393, 447, 477, 579, 707, 884]
```

ref:
http://www.geocities.jp/m_hiroi/light/python02.html
IE9以降でダウンロード時file.exeがfile_exeにリネームされる件対処

## 参考

* [Why does internet explorer replace . with _ - Microsoft Community](http://answers.microsoft.com/en-us/ie/forum/ie9-windows_7/why-does-internet-explorer-replace-with/7cec07db-9392-4064-9eb0-f1be6a158a7b?page=1&tm=1336145673743#footer)
* [IE9 when downloading .exe files it changes them the _exe. - Microsoft Community](http://answers.microsoft.com/en-us/ie/forum/ie9-windows_7/ie9-when-downloading-exe-files-it-changes-them-the/a856c2d7-baca-431c-bf2f-4109a85be8e3?msgId=45c9f84d-4c2d-4b51-bbac-37590208bce7)

## 対処

* IE9以降で発生する様子。

![img.png](https://qiita-image-store.s3.amazonaws.com/0/25728/bb7a07c2-77e0-24de-f9ff-c5a273bbb7c2.png)

* 「暗号化されたページをディスクに保存しない」のチェックを外す。
* OS再起動

----

# Internet Explorer 10 をアンインストールすると Internet Explorer 8 や 9 でダウンロードができない

* https://support.microsoft.com/ja-jp/kb/2864931

IEのキャッシュリミットが「ゼロ」と認識しているため何も保存できない、
パッチにてその値を増やす
powershell 実行中に PATH 環境変数へカレントディレクトリーを追加する簡単な方法

# はじめに

記事を書いた後にコメントで他の方法や注意点など議論を寄せて頂いています。記事本体と併せてコメント欄もどうぞご覧下さい。

# 背景

`powershell` を実行中に PATH 環境変数へカレントディレクトリーを追加したくなった。しかし `powershell` 実行中の `pwd` エイリアスや `[System.IO.Directory]::GetCurrentDirectory()` はどうも使い勝手が悪い。そこで簡単な方法はどうしたら良いか考えたので整理したい。

# 簡単な方法

`cmd /c cd` の結果を linux 等で一般的な `pwd` 相当の実行結果として使い `$env:path` を更新する。

```ps1
$env:path = "$(cmd /c cd);" + $env:path
```

与えるものは単なる文字列なので適当な相対パスを与えたい場合は次のようにパスを追記すれば良い。

```ps1
$env:path = "$(cmd /c cd)\\some_path\\bin;" + $env:path
```

# 付録: トリックについて

カレントディレクトリーの取得を `cmd /c cd` で行うのは `powershell` をせっかく使っているのに何だか残念な気持ちになるかもしれない。これを「簡単な方法」として用いた理由は2つ。

理由 1. `powershell` の `pwd` は余計な表示が入って邪魔。

```ps1
PS C:\Users\usagi\tmp> pwd

Path
----
C:\Users\usagi\tmp


PS C:\Users\usagi\tmp>
```

理由 2. `powershell` で `[System.IO.Directory]::GetCurrentDirectory()` を直接呼んでも意図しないディレクトリーが得られる。（＋ついでに書くのだるい。）

以下は一見すると意図する `pwd` 的に近い結果が得られているが、致命的な事にカレントディレクトリーではない。

```ps1
PS C:\Users\usagi\tmp> [System.IO.Directory]::GetCurrentDirectory()
C:\Users\usagi
PS C:\Users\usagi\tmp>
```

# References

- [stackoverflow - Setting Windows PowerShell path variable](http://stackoverflow.com/questions/714877/setting-windows-powershell-path-variable)
- [素敵なおひげですね - PowerShellのロケーションについて](http://stknohg.hatenablog.jp/entry/2015/04/30/232255)
- [stackoverflow - Windows equivalent to UNIX pwd](http://stackoverflow.com/questions/921741/windows-equivalent-to-unix-pwd)