OmniAICreator/Qiita-1.07M huggingface dataset:
Wordpressを他ドメインに丸ごとコピーした後修正する箇所

* http://web1.wordpress.to/ から http://web2.wordpress.to にコピーしたかった。
* /srv/web1.wordpress.to/ をまるごと /srv/web2.wordpress.to/ にコピーした。
* database wp1_wordpress_to を wp2_wordpress_to にコピーした。

## 不具合

* http://web2.wordpress.to/ にアクセスすると各リンク先が http://web1.wordpress.to/ になっていた。
* wordpressの管理画面にログインを試みると web1 の方にページが遷移する

## 修正方法

```diff:/srv/web1.wordpress.com/wp-config.php
- define('DB_NAME', 'wp1_wordpress_to');
+ define('DB_NAME', 'wp2_wordpress_to');

- define( 'WPCACHEHOME', '/srv/wp1.wordpress.to/wp-content/plugins/wp-super-cache/' ); //Added by WP-Cache Manager
+ define( 'WPCACHEHOME', '/srv/wp2.wordpress.to/wp-content/plugins/wp-super-cache/' ); //Added by WP-Cache Manager
```

* wp_options テーブルの siteurl, homeカラム
* wordpressの管理画面に入り
    * メニュー -> URL にて、 http://web1.wordprss.com から / に変更する。
C++11をつかったElixirのEnumモジュールのmapの実装

# 
<a href="http://qiita.com/naoya@github/items/df267d3b951b47767b22" target="_blank">『Programming Elixir』より &quot;Think Different(ly)&quot; - Qiita</a>を読み、`Elixir`という言語に関心がわいてきた。

>これは Ruby の Enumerable#map のような機能です。 コレクションの各要素に関数を適用し、 その結果を集めた新しいコレクションを返します。
<a href="http://yohshiy.blog.fc2.com/blog-entry-235.html" target="_blank">Elixir ： Erlang VM 上で動作する Ruby 風味の関数型言語 | プログラマーズ雑記帳</a>

```ex
Enum.map([1,2,3], fn(x) -> x * 2 end) #=> [2,4,6]
```
Enumモジュールにmap関数があるとな？ふむふむ。

# 最終的にこんなかんじで呼び出せる

``` cpp
std::vector<int> src; // [10, 20, 30]

std::vector<int> changed = Enum::map<int>( src, [](int& x){ return x*=2; });

changed; // [20, 40, 60]
```

# 実装してみた（テストつき）

- VisualStudio 2012 使用


```cpp
#include "stdafx.h"
#include "CppUnitTest.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;


#include <vector>
#include <algorithm>
#include <functional>

class Enum
{
public:
	template<class T, class Clojure>
	static std::vector<T> map(const std::vector<T>& src, Clojure op)
	{
		std::vector<T> dest = src;
		std::transform( std::begin(dest), std::end(dest), std::begin(dest), op );
		return dest;
	}
};

namespace UnitTest_Elixir_Enum
{		
	TEST_CLASS(UnitTest_Elixir_Enum)
	{
	public:
		
		TEST_METHOD(test_int_map)
		{
			std::vector<int> src = [](){
				std::vector<int> s;
				s.push_back(10);
				s.push_back(20);
				s.push_back(30);
				return (s);
			}();
			std::vector<int> changed = Enum::map<int>( src, [](int& x){ return x*=2; });
			Assert::AreEqual( 20, changed.at(0));
		}

		TEST_METHOD(test_string_map)
		{
			std::vector<std::string> src = [](){
				std::vector<std::string> s;
				s.push_back("ruby");
				s.push_back("elixir");
				s.push_back("c++");
				return (s);
			}();
			std::vector<std::string> changed = Enum::map<std::string>( src, [](std::string& x){ x.insert(0, "hello, "); return x; });
			Assert::AreEqual( std::string("hello, ruby"), changed.at(0));
		}

	};
}
```

たのしいですね！
JavaCCで入力した文字を取得する


JavaCCを使って入力文字の制限はできたが，入力した文字の取得方法で躓いたのでメモ．
JavaCCの詳しい使い方は[ここ](http://qiita.com/nbkn/items/aea7201d94d98d29a95a)を参照．

#parserの定義(JJTreeファイルの作成)
今回は，整数とアルファベットのみの入力を受け付けるparserを作った．

```java:test1.jjt
/** Parserクラスの定義 */
PARSER_BEGIN(MyParser)
package parser;
public class MyParser {
}
PARSER_END(MyParser)

/** 無視する文字を定義 */
SKIP:
{
    " " | "\r" | "\t" | "\n"
}

/** 出現するトークンを定義 */
TOKEN:
{
        <DIGIT: (["0"-"9"])>
       	| <LOWERCASE_LETTER: (["a"-"z"])>
        | <UPPERCASE_LETTER: (["A"-"Z"])>  
}

/** 入力文字列を取得 */
String getInputString() :
{
	/* ここで使う変数を宣言 */
	Token t;
	String str = "";
}
{
	/* 上で定義したトークンのいずれかにマッチすれば入力を受け付ける */
	 ( (t = <DIGIT> | t = <LOWERCASE_LETTER> | t = <UPPERCASE_LETTER>)
	 {
	 	str += t.image;
	 })+
	 {
	 	return str;
	 }
}
```

ポイントは

```
( (t = <DIGIT> | t = <LOWERCASE_LETTER> | t = <UPPERCASE_LETTER>)
{
	str += t.image;
})+
```
として，入力のたびに文字を判定し，strに追加しているところ．

メインクラスで`getInputString()`を呼び出してあげれば，戻り値として入力した文字を受け取れる．
GMockでオブジェクトを返す場合の期待値の書き方について


```cpp
EXPECT_CALL(mock_object, method(matchers))
  .WiilRepeatedly(Return(new someClass()));
```
と書くと期待値をキャッシュしてしまうため、二重開放が発生してしまう。
そのため、

```cpp
EXPECT_CALL(mock_object, method(matchers))
  .WiilRepeatedly(ReturnNEW<somClass>()));
```
と書かなければならない。

もちろん、mock_objectにオブジェクト開放の責務がある場合、ReturnNewではダメ。
つうか、こんなテストコードを書かなければならないようなコードはファクトリークラスなどの一部の例外を除いて書いてはいけない。。。
ActiveAdmin 出力されるCSVをShift_JISにする

どうしても、CSVを**Shift_JIS**にしてくれ！！
という熱い要望に答えるために、色々頑張った末辿り着いた方法です。

encodeのオプションを渡せる作りにはなっているっぽいのですが
実際オプションを渡しても実際出てくるファイルはUTF-8でした。

##試した方法たち
1. オプション渡してみる

```rb
ActiveAdmin.register RfmReport do
  csv encoding: 'Shift_JIS' do
    column :id
    column :name
  end
end
```

2. 設定ファイルに書いてみる

```rb:config/initializers/active_admin.rb
# == CSV options
#
# Set the CSV builder separator
# config.csv_options = { :col_sep => ';' }
#
# Force the use of quotes
# config.csv_options = { :force_quotes => true }
config.csv_options = { encoding: 'Shift_JIS' }
```

うーんおかしいなぁ・・・githubに上がってるコード読んで・・・あ！
作業しているprojectに入っているActiveAdminの`csv_builder.rb`を確認してみると
**0.6？！！　なんか古くね？！！！**
でも、これ最新に上げて動作確認してる暇ないよぉ(´・ω・`)
というわけで、一旦付け焼き刃的方法で対処することに。

##で、結局・・・
色々調べてみると、*CSV出力部分を自作して既存のCSV出力リンクと置き換える*という手法が多かったのですが
それだと各レポート毎に追加しなくてはならないので面倒くさい。

なので、CSV出力させるところを強制的に**Shift_JIS**にするようにしてしまいました。

`activeadmin`の`app/views/active_admin/resource/index.csv.erb`を
自分のproject配下にコピーし、csv_outputの文字コードをShift_JISに変更するようにしました。

```rb:app/views/active_admin/resource/index.csv.erb
<%-
  csv_lib = if RUBY_VERSION =~ /^1.8/
              require 'fastercsv'
              FasterCSV
            else
              require 'csv'
              CSV
            end

  default = active_admin_application.csv_options
  options = default.merge active_admin_config.csv_builder.options
  columns = active_admin_config.csv_builder.columns

  csv_output = csv_lib.generate(options) do |csv|
    csv << columns.map(&:name)
    collection.each do |resource|
      csv << columns.map do |column|
        call_method_or_proc_on resource, column.data
      end
    end
  end
  csv_output.encode!(Encoding::SJIS, :invalid => :replace, :undef => :replace) #ここで強制的に書き換え
%>
<%= csv_output.html_safe %>
```

ああ、切ない。。。
今日はActiveAdminを最新にあげて、動作の確認から始めましょう。
case classとList/Map/Tupleの相互変換

```scala
scala> case class Foo(i: Int, s: String)
defined class Foo

scala> val f = Foo(1, "bar")
f: Foo = Foo(1,bar)

// case class -> List
scala> val l = f.productIterator.toList
l: List[Any] = List(1, bar)

// List -> case class
scala> Foo.getClass.getMethods.find(_.getName == "apply").get.invoke(Foo, l.map(_.asInstanceOf[AnyRef]):_*).asInstanceOf[Foo]
res1: Foo = Foo(1,bar)

// case class -> Map
scala> val m = f.getClass.getDeclaredFields.map(_.getName).zip(f.productIterator.toList).toMap
m: scala.collection.immutable.Map[java.lang.String,Any] = Map(i -> 1, s -> bar)

// Map -> case class
scala> Foo.getClass.getMethods.find(_.getName == "apply").get.invoke(Foo, m.values.toList.map(_.asInstanceOf[AnyRef]):_*).asInstanceOf[Foo]
res2: Foo = Foo(1,bar)

// case class -> Tuple
scala> val t = Foo.unapply(f).get
t: (Int, String) = (1,bar)

// Tuple -> case class
scala> Foo.tupled(t)
res3: Foo = Foo(1,bar)

```
Unity C#  HttpwebRequestでhttps通信(オレオレ証明書エラーを回避)

■普通にHttpsありのURLを書くと下記エラーになる。

```
　TlsException: Invalid certificate received from server. Error code: 0xffffffff800b010f
```


# ■.Net新しいバージョン用
こちらのページを参考にしました。
http://www.atmarkit.co.jp/fdotnet/dotnettips/867sslavoidverify/sslavoidverify.html


■usingを追加

```
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
```

■SSL証明書のコールバック用の関数

```
    // 信頼できないSSL証明書を「問題なし」にするメソッド
    private bool OnRemoteCertificateValidationCallback(
      Object sender,
      X509Certificate certificate,
      X509Chain chain,
      SslPolicyErrors sslPolicyErrors)
    {
        return true;  // 「SSL証明書の使用は問題なし」と示す
    }
```

■SSL証明書のバリデーションに先ほど作ったメソッドをコールバック登録

```
ServicePointManager.ServerCertificateValidationCallback =
　　　　　new RemoteCertificateValidationCallback(OnRemoteCertificateValidationCallback);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URLをここに書く);

```



# ■.Net古いバージョン用

こちらのページを参考にしました。
http://masa795.hatenablog.jp/entry/2013/07/08/214336


■強制的にTrueを返すクラスを作成

```C#:TrustAllCertificatePolicy.cs
using UnityEngine;
using System.Collections;

public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy {

    public TrustAllCertificatePolicy() { }
    public bool CheckValidationResult(System.Net.ServicePoint sp,
        System.Security.Cryptography.X509Certificates.X509Certificate cert,
        System.Net.WebRequest req,
        int problem)
    {
        return true;
    }
}
```

■Createの前に設定しておく

```
System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URLをここに書く);
```
Rails × Bootstrapで出来ること

Railstutrialで登場するBootstrap関連のメモ
随時更新

# Gems
－bootstrap-sass 
　bootstrapをSassで使うためのおまじない
－Sprockets
　LESSをSassに変換するためのおまじない

## bootstrap-sassの効能の一部
－LESSの変数を自発的にSassの変数に置き換えてくれるのでLESSの変数をそのまま使える
　[Using LESS with Bootstrap](http://bootstrapdocs.com/v2.0.4/docs/less.html)

# カスタムCSSファイルを作る
－場所とファイル名
　app/assets/stylesheets/custom.css.scss
－内容

```scss:custom.css.scss
@import "bootstrap";
```

# Bootstrap JavaScriptライブラリをapplication.jsに追加する
```js:app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require turbolinks
//= require_tree .
```

# HTMLの配色
－カラーネーム
 [HTML Color Names](http://www.w3schools.com/html/html_colornames.asp)

# Asset Pipelineがやってくれること
－本番環境において、CSS,Javascriptの不要な空白などを取り除いてファイルを最小化し、複数のファイルを1つにまとめてくれる
FullCalendarで特定のカレンダーのみ編集不可にしたい


月表示は、ドラッグしてイベントの移動ができないようにしたい場合、

```Javascript:

$('#calendar').fullCalendar({ 
	views:
      month:
        editable: false
      agendaWeek:
        editable: true
      agendaDay:
        editable: true
});

```

で `views`を使ってカレンダーごとに設定を変更することができる。
進化したPostman


![Kobito.fkoVgl.png](https://qiita-image-store.s3.amazonaws.com/0/32701/f5b78d54-1f5b-21e4-6551-c9cb3de07f49.png "Kobito.fkoVgl.png")



APIのテストなどでよく使っているGoogleChromeのアドオン『Postman』。ついこの間使おうとしたらインターフェイスが一新されていて驚いたのですが、インターフェイスだけではなく機能も進化していたようなので調べてみました。



# 代表的な機能

![Kobito.aast3q.png](https://qiita-image-store.s3.amazonaws.com/0/32701/d764fc84-fd2f-ca33-1fdd-8ba1516e9406.png "Kobito.aast3q.png")

- HTTPリクエストを生成して送信できる
- リクエストをコレクションとして管理できる
- リクエストの履歴を保存して再利用できる
- 復数の環境にすぐに切り替えられる
- カスタムスクリプトでリクエストの内容を変えられる
- テストケースを書いてレスポンスの検証ができる
- コレクションを1クリックで実行でき、テスト結果を表示できる

これまで私が使っていたのは1つ目と3つ目の機能だけでした。他の機能が今まであったのか追加されたのかは分かりませんが、この他にも機能は全部で80以上あるそうです。

[Postman | 80+ features](https://www.getpostman.com/all_features)

# 進化した3つの機能

![Kobito.yjLNt1.png](https://qiita-image-store.s3.amazonaws.com/0/32701/3de69dc3-2ff9-20c5-ac67-ed4e959ea050.png "Kobito.yjLNt1.png")

- JETPACKS
- NEWMAN
- INTERCEPTOR

見慣れない3つの機能がありましたので、1つずつ見ていきます。

## JETPACKS

- JavaScriptでレスポンスのテストケースを記述できる
- レスポンスで受け取ったデータを、リクエストに動的にセットできる
- リクエストのデータをCSVやJSONに記述できる
- テストのコレクションを繰り返し(指定した回数だけ)実行できる

なお、JETPACKSは有料（$9.99）となっています。14日間のFreeTrialもあります。

![Kobito.zXu3OJ.png](https://qiita-image-store.s3.amazonaws.com/0/32701/f4046bd3-9dd4-06d7-625f-7a54f1ce1151.png "Kobito.zXu3OJ.png")

## NEWMAN

Postmanのコマンドラインツールです。npmとして提供されています。

[newman](https://www.npmjs.com/package/newman)

## INTERCEPTOR

ブラウザでリクエストした履歴をPostmanのhistoryに記録してくれるアドオンです。

[Postman Interceptor - Chrome Web Store](https://chrome.google.com/webstore/detail/postman-interceptor/aicmkgpgakddgnaphhhpliifpcfhicfo?hl=en)

# まとめ

自分でAPIを開発していてテストフレームワークがあるのであればそれを使うのが一番良いと思いますが、そうでない場合はPostmanを使ってみるのも1つの選択肢ではないでしょうか。

# 参考

- [迅速安全なAPI開発のためのプラットホームPostmanがシードで$1Mを調達…登録ユーザ数150万に | TechCrunch Japan](http://jp.techcrunch.com/2015/05/27/20150526postman-api-platform-1-million/)
c++ builder XE4, 10.2 Tokyo > TComboBoxの選択解除 > BackSpace入力時に解除する / Ctrl-Delete入力時に解除する

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

https://groups.google.com/forum/#!topic/borland.public.delphi.vcl.components.using/85snFfhvhTI
にある実装例
>- I often look for the backspace (#8) key in an OnKeyPress handler and set the ItemIndex to -1 if I see it.


backspaceでの実装例

```cpp
void __fastcall TItem_options::ComboBox1KeyPress(TObject *Sender, System::WideChar &Key)

{
	// Backspaceキーによる選択解除

	TComboBox *cbPtr = (TComboBox *)Sender;

	if (Key == VK_BACK) {
		SendMessageA(cbPtr->Handle, CB_SHOWDROPDOWN, 0, 0); // Close ComboBox
		cbPtr->ItemIndex = -1; // deselect
	}
}
```

ItemIndex = -1にするだけではコンボボックスが開いたままとなり、閉じる時に再度選択されてしまう。

閉じる処理の参考 http://www.geocities.jp/asumaroyuumaro/program/tips/ComboBoxMessage.html

<hr>
Ctrl-deleteで選択解除する場合

```cpp
void __fastcall TItem_options::ComboBox1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{
	if (Shift.Contains(ssCtrl) && Key == VK_DELETE) {
		SendMessageA(ComboBox1->Handle, CB_SHOWDROPDOWN, 0, 0); // Close ComboBox
		ComboBox1->ItemIndex = -1; // deselect
	}
}
```

Ctrl-Deleteの参考 http://bcbjournal.org/forums/viewtopic.php?f=10&t=2587

Shift == ssCtrlではエラーがでた。Contains()を使う。


### 追記
(2017/12/26)

> ItemIndex = -1にするだけではコンボボックスが開いたままとなり、閉じる時に再度選択されてしまう。


この状況が再現しなくなっている?
jQueryを使って、FORMでsubmitする時にconfirmする

記事を大幅に修正しました
@naga3 さん、ご指摘ありがとうございます

```js
;(function($) {
    $(function() {
        $('form').submit(function() {
            return confirm("Are you sure to submit?");
        });
    });
})(jQuery);
```
Nginx環境でconcrete5をサブディレクトリに配置して、プリティーURLを有効にする

# 概要
Nginx環境で、サブディレクトリにconcrete5が配置してある際に、プリティーURLを有効にする設定の覚え書き

```bash:ディレクトリ構造
/rootdir/
+ /subdir/ (←ここにconcrete5をインストール)
```

# 要点
+ PHP-FPMの設定
+ リライトの設定

# SampleConfig（nginx.conf）
```bash:nginx.conf
http {
     
    server {
        root         /var/www/html;

        location / {
            index  index.html;
        }

# サブディレクトリにアクセスがあった際に index.php をURLから除外する設定
        location /subdir {
            index  index.php;
            if (!-e $request_filename) {
            rewrite ^/subdir/ /subdir/index.php last; 
            }
        }   

# サブディレクトリにある 拡張子が .php ファイルを php-fpm に処理を回す設定
        location ~ ^/subdir/\.php($|/)  {
             include       fastcgi_params;
             fastcgi_pass  127.0.0.1:9000;
             fastcgi_index index.php;
             fastcgi_param URI $uri;
             fastcgi_param SERVER_NAME $host;
             fastcgi_param REQUEST_METHOD $request_method;
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
             fastcgi_read_timeout 30;
        }

    }
}
```
# 備考
この設定をすれば、Wordpressでも、CakePHPでもNginx環境のサブディレクトリでも可能のはず。
smallbasicでilasm

#画像
![ilasm.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/727b2579-4b43-061c-9645-e5d4b2e19e68.png)
#コード
```
C = Text.GetCharacter(34)
R = Text.GetCharacter(13) + Text.GetCharacter(10)
code = ""
GraphicsWindow.BackgroundColor = "skyblue"
button1 = Controls.AddButton("caption", 350, 400)
Controls.SetButtonCaption(button1, "clr")
button0 = Controls.AddButton("caption", 300, 400)
Controls.SetButtonCaption(button0, "ilasm")
textbox = Controls.AddTextBox(10, 400)
Controls.SetTextBoxText(textbox, "main.il")
mtextbox = Controls.AddMultiLineTextBox(0, 0)
Controls.HideControl(mtextbox)
Controls.SetSize(mtextbox, 580, 380) 
Controls.SetTextBoxText(mtextbox, code)
Controls.Move(mtextbox, 10, 10)
Controls.ShowControl(mtextbox)
Controls.ButtonClicked = output
Sub output
  button = Controls.LastClickedButton
  If (button = button1) Then
    Controls.SetTextBoxText(mtextbox, "")
  ElseIf (button = button0) Then
    file = "c:\il\" + Controls.GetTextBoxText(textbox)
    text = Controls.GetTextBoxText(mtextbox)
    File.WriteContents(file, text)
    csc = "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\ilasm.exe"
    code = ""
    code = code + "Function setup(a)" + R 
    code = code + "Set obj = CreateObject(" + C + "WScript.Shell" + C + ")" + R
    code = code + "  obj.run " + C + "cmd /K CD c:\il & " + csc + " " + file + " & main.exe" + C + R
    code = code + "setup = "  + C + C + R
    code = code + "End Function" + R
    a = Class1.VBSrun(code)
  endif
EndSub
```
##サンプルコード
```
.assembly 
extern mscorlib 
{ 
}
.assembly 
main 
{ 
}
.method static void main() cil managed 
{
    .entrypoint
    .maxstack 2
    ldstr "1 + 2 ="
    call void [mscorlib] System.Console::WriteLine(string)
    ldc.i4 1
    ldc.i4 2
    add
    call void [mscorlib]System.Console::WriteLine(int32)
    ldstr "1 - 2 ="
    call void [mscorlib] System.Console::WriteLine(string)
    ldc.i4 1
    ldc.i4 2
    sub
    call void [mscorlib]System.Console::WriteLine(int32)
    ldstr "5 * 3 ="
    call void [mscorlib] System.Console::WriteLine(string)
    ldc.i4 5
    ldc.i4 3
    mul
    call void [mscorlib]System.Console::WriteLine(int32)
    ldstr "10 / 2 ="
    call void [mscorlib] System.Console::WriteLine(string)
    ldc.i4 10
    ldc.i4 2
    div
    call void [mscorlib]System.Console::WriteLine(int32)
    ldstr "10 % 3 ="
    call void [mscorlib] System.Console::WriteLine(string)
    ldc.i4 10
    ldc.i4 3
    rem
    call void [mscorlib]System.Console::WriteLine(int32)
    ret
}
```
Python で gRPC を試す


## gRPC をインストール

まずは gRPC をインストールします。
gRPCと共に、RPCのシリアライゼーションを担う Protocol Buffers もインストールされるようです。

```bash
$ curl -fsSL https://goo.gl/getgrpc | bash -s python
```

もし、インストール中に以下のようなエラーが出た場合は homebrew が古いので `brew update` を試してみてください。(Macの場合)

```
Error: undefined method `desc' for Grpc:Class
Please report this bug:
    http://git.io/brew-troubleshooting
/usr/local/Library/Taps/grpc/homebrew-grpc/Formula/grpc.rb:2:in `<class:Grpc>'
・・・
```

## .proto(IDL)を書く

Protocol Buffers のIDLを書きます。
以下の例ではサーボを動かすRPCを定義しています。

gRPC 自体は Protocol Buffers のプラグインとなっています。
(gRPC 以外にも [RPC 実装はたくさんあります](https://github.com/google/protobuf/wiki/Third-Party-Add-ons#rpc-implementations))

```gateway.proto
syntax = "proto3";

package gateway;

message MoveServoRequest {
  int32 servo_id = 1;
  int32 position = 2;
}

message MoveServoResponse {
  int32 current_position = 1;
}

service AVRGateway {
  rpc MoveServo (MoveServoRequest) returns (MoveServoResponse) {}
}
```

## IDLをコンパイルしてgRPCのpythonスクリプトを生成

以下の `protoc` コマンドで、`gateway_pb2.py` が生成されます。

```bash
$ protoc --python_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_python_plugin` gateway.proto
```

## gRPC用のサーバ/クライアントのコードを書く
上記のコマンドで生成されたPythonスクリプトをインポートすれば簡単にサーバ／クライアントが書けます。
gRPCのPythonライブラリ自体[まだAlpha版](https://github.com/grpc/grpc/tree/master/src/python)なので、いろんなメソッドにearly_adopter_*というプレフィックスがついています。

```gateway_server.py
import time
import gateway_pb2

class AVRGateway(gateway_pb2.EarlyAdopterAVRGatewayServicer):
  def MoveServo(self, request, context):
    print 'servo_id: %d, position: %d' % (request.servo_id, request.position)
    return gateway_pb2.MoveServoResponse(current_position=150)

def serve():
  server = gateway_pb2.early_adopter_create_AVRGateway_server(AVRGateway(), 9494, None, None)
  server.start()
  try:
    while True:
      time.sleep(100000)
  except KeyboardInterrupt:
    server.stop()

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

```gateway_client.py
import gateway_pb2

def run():
  with gateway_pb2.early_adopter_create_AVRGateway_stub('localhost', 9494) as stub:
    response = stub.MoveServo(gateway_pb2.MoveServoRequest(servo_id=1, position=200), 10) 
    print "current position: " + str(response.current_position)

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

## 実行

まずサーバを立ち上げます。

```bash
$ ls
gateway.proto      gateway_client.py  gateway_pb2.py      gateway_server.py
$ python gateway_server.py
```

そして別のターミナルでクライアントを。

```bash
$ python gateway_client.py
current position: 150
D0729 10:42:14.835677000 140735135564544 iomgr.c:119] Waiting for 1 iomgr objects to be destroyed and executing final callbacks
```

サーバのほうでは

```bash
$ python gateway_server.py 
servo_id: 1, position: 200
```

という感じで出力されていればOK。
スクショして特定箇所をモザイクする方法

これからよく使うのと、忘れそうなのでメモっておきます。

## 1.スクリーンショットを撮る

Windows

|キー |効果 |
|:--|:--|
|[PrintScreen]|全画面スクリーンショット|
|[Alt] + [PrintScreen]|アクティブなウィンドウのスクリーンショット|

Mac（[参考](https://cyberduck.io/index.ja.html?l=ja))

|キー |効果 |
|:--|:--|
|[Command] + [Shift] + [3]|全画面スクリーンショット|
|[Command] + [Shift] + [4]|指定した範囲のスクリーンショット|
|[Command] + [Shift] + [4] <br>後に [Space]|選択したウィンドウのスクリーンショット|

## 2.Photoshopでモザイクをかける
ツールのバージョンは「Photoshop CC 2015」です。

### 2-1.モザイクをかけたい画像のレイヤーを指定する
地味に重要な手順です。

### 2-1.モザイクをかけたい範囲を指定する
ショートカットキー「M」か、以下アイコンをメニューから選択。
![スクリーンショット 2015-07-29 10.27.27.png](https://qiita-image-store.s3.amazonaws.com/0/85214/a15166f3-ee64-8b18-019b-056c5ffbf082.png "スクリーンショット 2015-07-29 10.27.27.png")


### 2-2.モザイク処理
ショートカットキー「Command + F」か、
フィルタ > ピクセレータ > モザイク　からモザイク処理。

モザイクの粒度はフィルタメニューからしか設定できないので注意。
一度変更したらその後はショートカットキーからでもクイックにモザイクかけられるので便利です。

![スクリーンショット 2015-07-29 10.30.41.png](https://qiita-image-store.s3.amazonaws.com/0/85214/002a109a-10be-fb8f-4288-910ab006605b.png "スクリーンショット 2015-07-29 10.30.41.png")


以上です！
お疲れ様でした。
EC-CUBE のブロックで商品リストを利用する

# 概要
EC-CUBE のトップページにて、「あるカテゴリの商品リストの一部を抽出」ということを複数のカテゴリに対してやりたかったので、その方法を調べてみた。
PHP 側でリストを作って Smarty 側で整形をする（おすすめ商品とかランキングとかのやり方）というのが筋なのだろうけれど、その方法だと抽出したいカテゴリを指定できないので。
# やりたいこと
管理画面のブロックにて、カテゴリID・並び順・抽出件数などを指定すると、そのカテゴリの商品リストを抽出出来るようにする。
PHPプログラマーは一切稼働せず、サイト運営者のみで完結出来るようにする。
# できること
トップページに「7月のセール」「8月のセール」「贈答品」などのカテゴリに登録されている商品の一覧を表示させ、そこから各カテゴリページへの誘導を促せる。
# できないこと
見せ方に関してはコーディングが必要なので、純粋なサイト運営者だけではそれぞれの用途に適した見せ方にするのは難しい。
ただし、毎回同じ見せ方でいいのであれば、初回だけコーダーが作ってしまえば問題は発生しない。
# 動作確認バージョン
EC-CUBE 2.13.3
# 結局のところ・・・
元々の EC-CUBE にその機能があるので、その使い方に気づくのに時間がかかっただけだった・・・。
もっとスマートなやり方があるような気がする・・・。
# 手順
管理画面にて「セール」「贈答品」などのカテゴリを作成し、該当商品をそのカテゴリに所属させる。
管理画面 -> デザイン管理 -> [PC|スマートフォン] -> ブロックにて新規ブロックを作成する
ブロック名：2015年7月のセール
ファイル名：sale201507
本文：

```smarty
<!--{php}-->
// SITE_URL に該当の URL を設定
// mode=json にすることで json 形式でデータを取得
// category_id に取得したいカテゴリを指定
// orderby で指定できるのは date（新着順）, price（価格の安い順）の2つ
// disp_number で取得したい件数を指定
$arrProducts = json_decode(file_get_contents("https://SITE_URL/products/list.php?mode=json&category_id=1&orderby=date&disp_number=3"), true);
$this->assign('arrProducts', $arrProducts);
<!--{/php}-->

<!--{* 利用できる変数は下記を true にすると確認できる *}-->
<!--{if false}-->
<pre>
<!--{$arrProducts|@var_dump}-->
</pre>
<!--{/if}-->

<!--{* 下記のループ内を好きな形でコーディング *}-->
<!--{foreach from=$arrProducts item=arrProduct name=arrProducts}-->
<!--{* 一緒に productStatus というのが取得されてしまうので、商品情報のみを対象とする *}-->
<!--{if $arrProduct.product_id}-->
<pre>
    <!--{$arrProduct.name}--><br />
    <!--{$arrProduct.price02_min}--><br />
    <!--{$arrProduct.main_list_image}--><br />
</pre>
<!--{/if}-->
<!--{/foreach}-->
<a href="/products/list.php?category_id=1">続きはコチラ</a>
```
PHP Documentorを使う


phpdocumentorをいまさらながら使うので、メモ。
環境はMac(yosemite)です。

##インストール
インストールは、pearかcomposer。基本はcomposerかな？と思うも、pearがrecommendedとなっている。

###pear

pearは基本sudoが必要。インストールできたかは、phpdoc -Vで確認。

```bash
sudo pear channel-discover pear.phpdoc.org
sudo pear install phpdoc/phpDocumentor
phpdoc -V
```
執筆時点では2.8.5のようです。

####pear upgradeの確認

忘れるのでもメモ。

```bash
sudo pear list-upgrades
```
で確認。
実際のUpgradeは、

```bash
sudo pear upgrade <package>
```

とする。


###Composer

今どきはComposer。

```bash
composer require --dev phpdocumentor/phpdocumentor
```
でよいみたい。
利用の際は、

```bash
php vendor/bin/phpdoc
```
で動く。

##利用（コマンド）

基本は

```bash
phpdoc run -d /コード -t /出力先
```
テンプレートも指定できる。

```bash
phpdoc run -d /コード -t /出力先 --template=clean
```

テンプレートの種類は、

```bash
phpdoc template:list
```
で確認できる。気分転換が必要なときはいいだろう。もちろん、オリジナルのテンプレートを作ることもできる。

##利用（コード）

出力用の最低限度のサンプル。

例えば、テストフォルダに下記のようなtest.phpを作る。

```php
<?php

/**
 * ファイル自体のサマリを書く。書かないと怒られる。
 */


/**
 * 加算機能（概要を書く）。
 *
 * 2つのパラーメータを受け取り加算して返す（詳細を書く）。
 *
 * @param int $x 足し算用パラメータ。
 * @param int $y 足し算用パラメータ。
 *
 * @return int $ans 返り値。
 *
 */
function add($x,$y)
{
	$ans = $x + $y;
	return $ans;
}

/**
 * 減算機能（概要を書く）
 *
 * 2つのパラーメータを受け取り減算して返す（詳細を書く）。
 *
 * @param int $x 引き算用パラメータ。
 * @param int $y 引き算用パラメータ。
 *
 * @return int $ans 返り値。
 *
 */
function sub($x,$y)
{
	$ans = $x + $y;
	return $ans;
}
```
それで、

```bash
phpdoc -d test -t out
```
とすると、outにドキュメントが出力される。out/index.htmlを開くと、

![phpdoc](http://www.bluecode.jp/qiita/phpdoc001.png)

となる。

基本は、機能概要と引数、返り値くらいを書けばいいだろう。
詳しい情報は、[本家サイト](http://phpdoc.org/)のDocumentを必要に応じて見る。
browserify + npmでReactを使う場合はNODE_ENVを設定するとよい

Reactの内部には次のようなコードがいたるところにある。

```js
if ("production" !== process.env.NODE_ENV) {
  console.log('debug message');
}
```

あらかじめビルド済みのreact.min.jsとかを使う場合はすでにproductionモードでビルドされてるので気にしなくていいけど、browserifyで自分でReactをビルドする場合は`NODE_ENV`を設定する必要がある。

のでproductionでは次のように環境変数を設定して実行するとよい。

```
$ NODE_ENV=production browserify src/app.js -o bundle.js
```

このようにしてビルドすると、Reactが[envify](https://github.com/hughsk/envify)というtransform packageを使っているため、次のように変換される。

```js
if ("production" !== "production") {
  console.log('debug message');
}
```

さらにこれを[uglify](https://github.com/mishoo/UglifyJS2)にかけてminifyするとここに到達することはないdead codeということでコード自体を削ってくれる。
AWSインスタンスにSFTP接続する

以前、FTP接続はしたんですが、
かなり簡単な方法でSFTP接続できたのでメモしておきます。

## 0.前提
私はAWSのインスタンスをbitnamiのredmineインスタンスで作成しました。
しかし、Linuxであればほぼ同じ方法で可能だと思います。

## 1.SSH接続するキーを用意する
これはインスタンス作成時に作成しているはずです。
SSH接続するときに必要な鍵（.pem）を用意します。

## 2.FTP接続ソフトでSFTP接続する
私が使ったのは[Cyberduck](https://cyberduck.io/index.ja.html?l=ja)というやつです。

あとは立ち上げて、SFTP接続を行います。
接続時に以下を指定することに注意してください。
> ユーザ名：SSH接続するときのユーザ名
> SSHキー：手順１で用意したキーを指定

![スクリーンショット 2015-07-29 9.57.23のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/85214/757d3656-0849-3724-ea91-380599aadc33.png "スクリーンショット 2015-07-29 9.57.23のコピー.png")

これで接続できるはずです。
お疲れ様でした！
phpenvでphp-fpmのバージョン切り替わらないのめどい

のでこんなシェルスクリプト書いた。

bash_profileなどのファイルに書けば`php-fpm`コマンドで今有効化されているPHPバージョンのphp-fpmが立ち上がってくれると思います。

```bash:php-fpm-alias
function php-fpm() {
    local version=`cat $HOME/.phpenv/version`
    local fpmpath="$HOME/.phpenv/versions/$version/sbin/php-fpm"
    eval "$fpmpath $@"
}
```

phpenvは現在有効化されているPHPのバージョンを`.phpenv/version`に書き出してくれます。
このファイル内容を使って`.phpenv/versions/{バージョン}/sbin/php-fpm`というパスを組んで呼び出して上げれば動く仕組みです。

最後のeval内の`$@`で関数に与えられた引数をそのままphp-fpmに横流ししてます。

### 参考
- [http://shellscript.sunone.me/function.html](http://shellscript.sunone.me/function.html)
- [http://shellscript.sunone.me/parameter.html](http://shellscript.sunone.me/parameter.html)
Spring Bootでtaskを定期実行する方法

# 概要

Spring Bootでtaskを定期的に実行する方法

**環境**

下記の環境で動作確認を行いました。

* Windows7 (64bit)
* Java 1.8.0_45
* Spring Boot 1.2.4
* Maven 3.3.3

**参考**

下記のサイトを参考にさせて頂きました。

Spring

* [GETTING STARTED - Scheduling Tasks] (http://spring.io/guides/gs/scheduling-tasks/)


## 設定

### EnableSchedulingアノテーション

スケジュールを有効にするにはEnableSchedulingを使用します。

```java:App.java
package com.example.actor;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class App {
  public static void main(String[] args) {
    SpringApplication.run(App.class, args);
  }
}
```

### Scheduledアノテーション

定期実行したいtaskに実行周期をScheduledアノテーションで指定します。
このアノテーションが指定できるのは引数を取らないメソッドだけです。（コンパイルエラーにはなりませんが実行時に例外が発生します。）

|field        |description |
|:------------|:-----------|
|fixedDelay   |taskの実行完了時点から指定時間後に次のtaskを実行する. 単位はms. |
|fixedRate    |taskの実行開始時点から指定時間後に次のtaskを実行する. 単位はms. |
|initialDelay |指定時間後に最初のtaskを開始する.  単位はms. fixedDelay又はfixedRateと組み合わせて使用する. |
|cron         |cronで指定した周期でtaskを実行する. |
|zone         |cronの起動時間のタイムゾーンを指定する. 未指定時はデフォルトのtimezoneを使用する.|

do()の実行完了の5秒後に次のdo()を実行する。

```java:fixedDelay
@Scheduled(fixedDelay = 5000)
public void do() {
  //...
}
```

doSomething()の実行開始の5秒後に次のdoSomething()を実行する。

```java:fixedRate
@Scheduled(fixedRate = 5000)
public void doSomething() {
  //...
}
```

spring bootの起動から60秒経過後にdoSomething()を実行する。

```java:initialDelay
@Scheduled(initialDelay = 60000, fixedRate = 5000)
public void doSomething() {
  //...
}
```

毎分0秒時にdoSomething()を実行する。

```java:cron
@Scheduled(cron = "0 * * * * *", zone = "Asia/Tokyo")
public void doSomething() {
  //...
}
```

#### 実行スケジュールを設定ファイルから取得する

cronの実行スケジュールを設定ファイルに記述し、それをプログラムから参照するようにします。

下記のように設定ファイル(application.yml)に実行スケジュールを定義します。
この例ではキー名を`cron`としました。（名前は任意です。）

```text:application.yml
cron:
  cron1: 0 * * * * MON-FRI
  cron2: 0 */2 * * * *
```

Scheduledアノテーションのcronフィールドに、設定値をspelで記述します。

```java:ScheduledTasks.java
@Component
public class ScheduledTasks {

  @Scheduled(cron = "${cron.cron1}")
  public void doSomething() {
    //...
  }

}
```

**cronメモ**

左から秒(0-59)、分(0-59)、時(0-23)、日(1-31)、月(1-12)、曜日(0:日,1:月,2:火,3:水,4:木,5:金,6:土,7:日)を設定する。月、曜日は英語で3文字の短縮形が使用できる。

例

|cron                |description               |
|:-------------------|:-------------------------|
|`0 0 * * * *`       |毎時、0分0秒時に実行.       |
|`0 0 0 * * *`       |毎日、0時0分0秒に実行.      |
|`0 0 0 1 * *`       |毎月、1日0時0分0秒に実行.   |
|`0 0 12 */5 * *`    |毎月、5の倍数の日の12時0分0秒に実行.   |
|`0 0 9-18 * * 1-5`  |月から金曜日の9時から18時の0分0秒時に実行. |
Bootstrap - checkboxとlabelを水平に一直線にするCSS

![Screenshot 2015-07-28 21.35.06.png](https://qiita-image-store.s3.amazonaws.com/0/82804/28b3a7f5-7260-b12e-8217-e57979bdd4cd.png)

#やりたいこと

- よく見ると微妙に揃っていないcheckboxとlabelを水平に一直線にしたい。
- 簡単そうで簡単に出来なかったのでメモ。

#環境
- Ruby 2.2.1
- Rails 4.2.3
- bootstrap
- 他

###Before
![Screenshot 2015-07-28 20.38.44.png](https://qiita-image-store.s3.amazonaws.com/0/82804/74632605-d8bc-4e7e-6191-5db7e976a605.png)
labelの文字が少し上方向にズレている。
###After
![Screenshot 2015-07-28 20.38.29.png](https://qiita-image-store.s3.amazonaws.com/0/82804/c831b854-73ee-e1b4-6aa9-a195a601f8dd.png)

#Viewの成功例

```haml
.form-inline
  .checkbox
    %label
      = f.check_box :rooms, options, checked_value, unchecked_value
      = room_name
```
```haml
# Deviseのフォーム
- if devise_mapping.rememberable?
  .field.form-group
    .form-inline
      .checkbox
        = f.check_box :remember_me
        = f.label :remember_me
```

#問題解決CSS

```scss

@media (min-width: 768px) {
  .form-inline .radio input[type="radio"],
  .form-inline .checkbox input[type="checkbox"] {
    float: left;
    margin-right: 5px;
    label {
      font-weight: normal;
    }
  }
}
```

#参考文献

問題解決CSSは以下のStackOverflowから学びました。
[Bootstrap 3 form checkbox label doesn't align with checkbox input in Chromium + Firefox](http://stackoverflow.com/questions/24398901/bootstrap-3-form-checkbox-label-doesnt-align-with-checkbox-input-in-chromium)
ネットワーク レイヤ1

# レイヤ1

# 信号と回線

## 信号

- 信号の形式
  - 銅線: 電気信号
  - 光ファイバ: 光信号
  - 無線LAN: 電波
- 信号の種類 - 回線の種類によって使われる種類が決まる
  - アナログ - 波。従来の電話線も波。
  ーデジタル - ON/OFF。CD-DAやコンピュータ内部

## 回線
- 回線の種類と接続の方式
  - 一般回線 - パソコンのシリアルポート - EIA/TIA-232 ケーブル - コンピュータの手前に 'モデム' を置いてアナログ信号をデジタルに変換
  - ISDN - パソコンのシリアルポート - EIA/TIA-232 ケーブル - TA/DSU と挟む
  - CATV - NIC - LANケーブル - ケーブルモデム と挟む
  - ADSL - NIC - LANケーブル - ADSLモデム - スプリッタ と挟む

## 信号に起きる障害
- 減衰 - 信号が弱くなる。銅線なら抵抗、光ファイバなら拡散
- ノイズ - 信号の形が崩れる。
- 衝突 - ２つの信号が同時に回線を流れると、電圧が変になり元と違う形になる

# ネットワーキングメディア
- 影響のある３つの規格団体
   - IEEE(Institute of Electrical and Electronic Engineers)
   - EIA/TIA(Electronic Industries Association / Telecommunication Industries Association)
   - UL(Underwriters Laboratories)

## 種類
  - 同軸ケーブル
    - 中央の導体がが１本、絶縁体、網状のシールド、最外のプラスティック皮膜
    - 干渉に強く、長距離まで信号が届く
    - 堅く、効果。LANには推奨されていない
  - ツイストペアケーブル
    - ２本１組をより合わせ、それをさらに４本より合わせてまとまっている。
    - キャンセレーション - 銅線同士の磁場が互いに打ち消し合い消滅することで干渉を消滅させられる
    - 柔らかく、安価
    - シールドほど防御力が高くなく、長距離は届かない
  - 光ファイバーケーブル
    - 中央に反射率の高いガラスの導体があり、周りをプラスティックの干渉保護剤で覆っている
    - 電磁的な干渉を一切受けず、高速
    - 効果であり、扱うのに技術的な難易度がある

## ネットワークメディアの規格
  - 規格の種類
    - 規格名	ケーブルの種類	備考
    - 10BASE5 同軸 別名：Thicknet(シックネット)
    - 10BASE2 同軸 別名：Thinnet(シンネット)
    - 10BASE-T UTP 最長距離：100m
    - 100BASE-TX UTP 最長距離：100m
    - 1000BASE-T UTP 最長距離：100m
    - 100BASE-FX 光ファイバ 最長距離：ﾏﾙﾁﾓｰﾄﾞ412m または2Km
　　 　　　　ｼﾝｸﾞﾙﾓｰﾄﾞ20km
    - 1000BASE-SX 光ファイバ 最長距離：ﾏﾙﾁﾓｰﾄﾞ550m
    - 1000BASE-LX	光ファイバ 長距離：ﾏﾙﾁﾓｰﾄﾞ･ｼﾝｸﾞﾙﾓｰﾄﾞﾞ5Km
  - 規格名の意味
    - 頭の数値 - データ転送量(Mbps)
    - BASE - データ転送方式のベースバンド伝送。信号を直接多重化せずに送る。信号の強弱で送る方式に、同時に銅線上に流せない。装置が簡易でLANの主流な方法
    - お尻の数値、アルファベット - 通信の最長距離、ケーブルタイプ(Tが着くとツイストペア、ほかは光)
  - UTP のカテゴリ
    - 転送速度別で5段階に分けられている

# ネットワーキングデバイス
- リピータ - 信号を増幅・整形して通信距離を伸ばす
- ハブ
  - 別名：マルチポートリピータ。多くの機器を同時につなげるリピータ。
  - きた信号をそのまま繋がっている全ての機器に流す
- レイヤ1のネットワーキングデバイスの特徴として、流す信号を制御しない

- 衝突ドメイン
  - 衝突する可能性がある範囲のこと。ツイストペアなら複数経路あるが、ハブで繋ぐとその中は１本道なので衝突が起きる。なので、ハブは種取るドメインを広げてしまう
  - ハブをつなげらえる数は、10BASE-Tなら４つ、100BASE-Tなら２つ。ハブをつなげすぎるとオーバヘッドの時間が多くなり、機器同士の送受信のタイミングに差が出て、相互通信で衝突が起きやすくなる

# ネットワーク構成図
- トポロジ
 - ノードとリンクを使ってネットワークの配置を表現する
- 種類
  - バス型 - 母線と側線でつないだ形式
  - リング型 - ノードを円形につなぐ形式。胃方向に流れる。冗長性を考慮した２重リング型もある
  - スター型 - 中央の一つのノードから周りに広がっていく。現在のLANトポロジは大体これらしい。ハブでスターを拡大すつ拡張スター型もある
  - ツリー型 - 階層構造にネットワークがつながる
  - メッシュ型 - 一つのノードがほかの全てのノードと繋がっている。絶対に切れてはいけないネットワークが必要な際に必要
- 部分メッシュと完全メッシュ
  - 完全メッシュだと管理もコストも大変なので、必要に応じてそれぞれのトポロジを使い分けて全体のネットワーク形成する。その際に、部分的に重要なところはメッシュ型にした時に部分メッシュと呼ばれる

- 物理トポロジと論理トポロジ
  - 物理 - 物理的なノードとリンクの配置
  - 論理 - データの流れ方という観点から見たトポロジ。論理と物理は必ずしも一致しない
  - バス型 - データは各ノードを一方方向に流れるので論理トポロジはリング型
  - スター型 - 論理的にはバス型で動く
Elixir on PhoenixでReact.jsを動かしてみる

##Elixir on Phoenixのインストール

まず、`Elixir`という言語があります。そのWeb Frameworkが`Phoenix`ですが、とても使いやすいし、分かりやすいのでお勧めです。`Ruby on Rails`に似ていると公式では説明があります。

`Elixir`がインストールされていない場合は、そこからインストールします。

```bash
$ brew install elixir

$ mix local.hex

$ mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v0.14.0/phoenix_new-0.14.0.ez
```

##Hello Workd

使い方はいたって簡単です。`mix phoenix.new`コマンドで必要なものをインストールして、`mix phoneix.server`でプレビューします。

```bash
$ mkdir phoenix

$ cd phoenix

$ mix phoenix.new ./hello_phoenix

$ cd hello_phoenix

$ mix phoenix.server
----------------------------
$ curl 127.0.0.1:4000
```

##React.js

```bash
$ mix phoenix.new react_phonenix

$ cd react_phonenix

$ mix phoenix.server

$ npm install -g bower

$ bower init
```

```json:bower.json
{
  "name": "react_phoenix",
  "version": "0.0.0",
  "license": "MIT",
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components",
    "test",
    "tests"
  ],
+  "dependencies": {
+    "jquery": "~2.1.4",
+    "react": "~0.13.3"
+   }
}
```

```bash
$ bower install

$ bower install react --save

$ tree
web
├── channels
├── controllers
│   └── page_controller.ex
├── models
├── router.ex
├── static
│   ├── css
│   │   └── app.scss
│   ├── js
│   │   └── app.js
│   └── vendor
│       └── phoenix.js
├── templates
│   ├── layout
│   │   └── application.html.eex
│   └── page
│       └── index.html.eex
├── views
│   ├── error_view.ex
│   ├── layout_view.ex
│   └── page_view.ex
└── web.ex
```

```js:web/static/js/app.js
import {Socket} from "phoenix"

// let socket = new Socket("/ws")
// socket.connect()
// let chan = socket.chan("topic:subtopic", {})
// chan.join().receive("ok", chan => {
//   console.log("Success!")
// })

let App = {
}
var HelloWorld = React.createClass({  
  render() {
    return (<h1>Hello React</h1>)
  }
})

window.onload = () => {  
  var element = document.getElementById("app")
  React.render(<HelloWorld />, element)
}
export default App
```

```html:web/templates/page/index.html.eex
<div id="app"></div>
```

```bash:
$ mix phoenix.server
----------------------------
$ curl 127.0.0.1:4000
```

https://facebook.github.io/react/docs/tutorial.html
AllJoynメモ


https://ms-iot.github.io/content/en-US/win10/AllJoyn.htm　を見てかいた自分用のメモです。

* AllJoynでは中間サーバ無しにノード間で通信ができる仕様
* OS/Transport層フリー
* 全てのノードと通信できるノードをRouting Note(RN:Router)と呼び、端末間で通信するノードをLeaf Nodes(LF:Application)と呼ぶ。Leaf NodesはRNを通じてLNと通信する。


![AllJoyn_Routers_Apps.png](https://qiita-image-store.s3.amazonaws.com/0/54785/ac37a1b1-0f78-8bbc-3ec7-5139cbc6b628.png "AllJoyn_Routers_Apps.png")

https://ms-iot.github.io/content/images/AllJoyn/AllJoyn_Routers_Apps.png


AllJoynのソフトウエアはこのような構成

* AllJoyn App Layer
* AllJoyn Service Frameworks デバイス間の相互接続のための共通インタフェース定義
* AllJoyn Core Libs RNとデバイス間をセキュアに接続させるためのコアライブラリ群
* AllJoyn Router デバイスとアプリケーション間の通信レイヤ

![AllJoyn_Architecture.png](https://qiita-image-store.s3.amazonaws.com/0/54785/cad23d1d-4b4f-8d1b-ae82-e0c54a653cd3.png "AllJoyn_Architecture.png")


https://ms-iot.github.io/content/images/AllJoyn/AllJoyn_Routers_Apps.png

またフレームワークは以下の２種類

* Standard 非組み込み機器(PC?）向けでコアライブラリを全てサポート
* Thin 組み込み機器向けでリソースの制約やルータとの接続機能のみサポート

AllJoynはethernet, Wi-Fi, Serial, PLCなどでも通信可能。しかし実装があるかどうかは別。
さらに、AllJoynのフレームワークを他のシステムとブリジッジするようなシステムを組むことも可能。(Zigbee, Z-wave, クラウドなど）MSからのAllSeenアライアンスへのコントリビューションをチェックするとサンプルや詳細がわかる。

![AllJoyn_Frameworks.png](https://qiita-image-store.s3.amazonaws.com/0/54785/a506ae8a-d121-f925-e620-f18ec3f38c17.png "AllJoyn_Frameworks.png")

https://ms-iot.github.io/content/images/AllJoyn/AllJoyn_Frameworks.png


# AllJoyn Device System Bridge

AllJoynへの他のシステム（デバイス）をブリッジさせる仕組みの紹介

デバイスシステムブリッジ(DSBs)が既存の他システムとAllJoynをつなげる仕組みを提供する。基本的にはDSBsの提供するAPIを実装するアダプタとして、デバイスプロトコルプラグインを実装する。AllJoyn側には仮想デバイスとして検出／通信が可能となる。

![AllJoyn_DSBArch.png](https://qiita-image-store.s3.amazonaws.com/0/54785/2daafc59-c909-e54a-6b5d-73610bae7923.png "AllJoyn_DSBArch.png")


https://ms-iot.github.io/content/images/AllJoyn/AllJoyn_DSBArch.png
VB 2015 の新機能まとめ

Visual Studio 2015 が利用できるようになりましたが、VB 2015 の新機能について試してみました。

## Nothing 判別演算子 ?.

演算子 ?. が追加になりました。これは、ある変数の値が Nothing でない場合のみ ?. に続くメソッドを実行します。

```vbnet
Dim n As Integer? = 1000
Console.WriteLine(n?.ToString())
n = Nothing
Console.WriteLine(n?.ToString())
```

## 変数の埋め込み

$ を先頭に付けた文字列の中では、{ } で囲まれた文字列は変数とみなされて、その変数の値が文字列に埋め込まれます。

```vbnet
Dim a1 = If(args.Length > 1, args(1), "undefined")
Console.WriteLine($"Args(1) = {a1}")
```

## 改行を含む文字列 (ヒアドキュメント)

従来のバージョンでは改行を含む文字列は & 演算子などを使って記述し、直接記述できませんでした (C# は可能)。VB 2015 ではそれが可能になりました。

```vbnet
Dim mlstr = "{
 id:100,
 name:'Apple',
 amount:5
}"
Console.WriteLine(mlstr)
```

## LINQ でのコメント

従来のバージョンでは LINQ 文の途中にコメントを入れることはできませんでした。このバージョンからは可能になったので、長い LINQ 文でも見やすく記述できます。

```vbnet
Dim Range As Integer() = { 1, 3, 5, 7, 9, 11, 13 }
' LINQ でのコメント。LINQ 文の途中にコメントを入れることが可能。
Dim col As IEnumerable(Of Int32) = From i In Range  ' Range から
                              Where i > 5  ' 5 より大きい要素を
                              Select i  ' 選びます。
' 結果を表示
For Each i In col
    Console.WriteLine(i)
Next
```

## NameOf 演算子

通常のアプリケーションではあまり使い道がなさそうですが、変数の名前自体を得ることができるようです。Roslyn などで使用するらしい。

```vbnet
Dim sample As String = ""
Console.WriteLine(NameOf(sample))  ' sample と表示される。
```


MSDN Magazine 
　[Visual Basic .NET - 14 Top Improvements in Visual Basic 14](https://msdn.microsoft.com/en-us/magazine/dn890368.aspx)

Channel9 MSDN
 [What's New in Visual Basic 14](https://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Whats-New-in-Visual-Basic-14)
ネットワークとは？

# ネットワークとは？
- リソースを共有すること

- スニーカーネット
  - もっとも原始的なネットワーク。ケーブルでなく人がデータを持ってコンピュータを回る
- LAN
  - 狭い範囲(local area network)。高速かつ高品質。10mbps くらいが速さの目安。
 - WAN
  - 広い範囲(wide area network)。低速かつ、低品質。LANより劣る

# プロトコルと帯域幅
- プロトコル - 通信で使うルール
  - TCP/IP
- 帯域幅 - データ転送速度
  - 1秒間に何bit送ることが可能か。幅 = 流量で、データがどれくらい流れるか、また、どれくらい。ブロードバンド、ナローバンドなどの表現はここから

# ネットワーク・モデルが必要なわけ
- 多弁他動詞が相互通信可能にするために従う共通のモデルが必要
- OSI参照モデル - 現在使われているモデル
  - アプリケーション層
    - ネットワークというサービスを提供する。ネットワークの入り口で、ネットワーク可能かどうか判断する層
  - プレゼンテーション層
    - データ形式を決定する層。送信元と送信先の言語を揃えるようなイメージ
  - セッション層
    - セッションを管理する層。繰り返しの通信のやりとりを管理する
  - トランスポート層
    - 信頼性の高い通信サービスを保証する層。
  - ネットワーク層
    - データの伝送・運ぶルート。宛先の決定などを行う。
  - データリンク層
    - 近くの機器とのデータの伝送制御。ケーブルで直に接続された機器とのデータのやりとり、制御
  - 物理層
    - 電気的・機械的なルールを決めた層

# OSI参照モデルでのデータの流れ
- データ - 運びたいもの
- データユニット - データを梱包するもの
  - 宛先、送信元アドレス、通信制御用データなど、運びたいもの以外のデータ
- TCP/IP - OSIモデルのネットワークのプロトコルで、インターネットではアドレスは IP アドレスが使われる
- カプセル化
  - データに制御データをつくて行ってデータgを作ること
  - OSI参照モデルに沿ってこう方されて行き送信され、逆に受信時は外から外されていく
  - セグメント - レイヤ4(トランスポート層)で制御情報がついた状態のデータユニット
  - パケット - レイヤ3(セットワーク)
  - フレーム - レイヤ2(データリンク)

#  LAN の機器
- ネットワーキングメディア - ケーブルなどホストをつなぐもの
- ホスト - PCやプリンタなどサービスを提供するもの
- NIC(Network Interface Card) - ホストとネットワーキングメディアをつなぐもの。パソコンならマザーボードのPCIスロットに差し込むLANボード、PCならPCMCIAカード
- ネットワーキングデバイス - LAN内のデータの流れを制御する
 - リピータ・ハブ - レイヤ1。増幅・分配する
 - ブリッジとスイッチ - レイヤ2。データを通す・通さないの制御
 - ルータ - レイヤ3。宛先までのルートを決定する
c++11 > ラムダ式の使用前と使用後 > id==PLAYERのplayer探索

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

```cpp:使用前
iter player = actors.end();
for (iter i = actors.begin(); i != actors.end(); ++i) {
  if ((*i)->id() == PLAYER) {
     player = i;
     break;
  }
}
if (player != actors.end()) {
  attack(*player);
}
```

```cpp:使用後
auto player = std::find_if(actors.begin(), actors.end(), [](Actor *actor) { return actor->id() == PLAYER;});
if (player != actors.end()) {
  attack(*player);
}
```

使用前のコードの方が可読性が高いと感じるのはラムダ式にまだ慣れてないためだろうか？

7行のコードが2行になるのは1スクリーン内の情報量が増し、いいのかもしれないが、一方でラムダ式をソース共有する人全てが理解できるようにならないといけなくなる。
c++ > accumulate

参考: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

表1-1 STLのアルゴリズム関数一覧 (比較的使用頻度の高いものを抜粋)
より

> accumulate : 全要素の集計を求める

集計の時、sumを使うのを度々見るが、accumulateとsumの使い分けは未勉強。

人によっては、以下のような使い方もしているようだ
http://rosettacode.org/wiki/Sum_and_product_of_an_array
> int sum  = std::accumulate(arg, arg+5, 0, std::plus<int>());

sumの場合、動詞(sum)と名詞(sum)が同じ形なので、関数名としては混乱をまねくのだろうか？

自分が「何かの合計を求める」関数を作る時、sum()にするのがいいかaccumulate()にするのがいいか、まだはっきりとはしていない。

<hr>
(追記 2015/07/30)
[Understanding std::accumulate @ SO](http://stackoverflow.com/questions/12633950/understanding-stdaccumulate)
c++11 > all_of / none_of / any_of

参考: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

表1-1 STLのアルゴリズム関数一覧 (比較的使用頻度の高いものを抜粋)
より

all_of : ...
none_of : ...
any_of : 全要素のどれか１つでも指定した条件を満たせばtrueを返す

複数の要素の条件の適合性をチェックするのに使う関数。
OPアンプ > 非反転増幅回路 > 抵抗比の広がりを抑制した正相増幅器

引用: オペアンプ基礎回路再入門 by 岡山努さん

> 図3.5に示す方法で反転増幅器で用いた手法と同じように抵抗比の広がりを抑制することもできます。

![schemeit-project.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cbcdd448-5f20-bf5c-8e48-7af652f7a298.png)

> この回路定数で約1000倍の電圧増幅率を得ることができます。しかし、上図においては、反転増幅器とは異なり、R1の値は低くても回路の入力抵抗が低くなるなどの影響がありませんのでR3, R4を省いてR1=100Ωにしても構いません。
技術英語 > reasonably [contrastive] for imaging

http://www.tricorderproject.org/blog/developing-a-parallel-detector-for-the-open-source-ct-2/

> Barium-133 has strong x-ray peaks around 31kEv and 81kEv, which are low enough energy that organic water-containing materials (like apples and bell peppers) <font color=red>are reasonably contrastive</font> for imaging.

<hr>
http://ejje.weblio.jp/content/Contrastive
> 対照的な、対比する

<hr>
含水有機物ならはっきりと画像化できる、ということのようだ。
『Programming Elixir』より "Think Different(ly)"


あの Dave Thomas が書いた『Programming Elixir』を買ったのでぼちぼち読んでいる。

Chapter 1. に Elixir の特徴を巧みに表現した文章があってカッとなったので、引用しておきたい。

# Think Different(ly)

- Object orientation is not the only way to design code
- Functional Programming need not be complex or mathematical.
- The foundations of programming are not assignments, if statements, and loops.
- Concurrency does not need locks,semaphores, monitors, and the like.
- Processes are not necessarily expensive resources.
- Metaprogramming is not just something tacked onto a language.
- Even if it is work, programming should be fun.

## 意訳

簡単に意訳しておこう。若干超訳

- オブジェクト指向が、唯一のコードのデザイン手法ではない
- 関数型プログラミングは必ずしも複雑でもないし、数学的である必要もない
- プログラミングの基礎はいつも「代入、if文、ループ」というわけじゃない
- 並行処理はロック、セマフォ、モニタとかを必要としない
- 「プロセス」って高価なリソースではないよ
- メタプログラミングは言語におまけ程度に付け加えられたものってわけじゃないぜ
- <del>こんな感じでもプログラミングは楽しいよ</del><ins>たとえそれが仕事だとしても、プログラミングは楽しくなくっちゃ</ins>

プログラミングについての常識感というかありがちな先入観を否定する形で Elixir の特徴を述べてて、巧い。

# それぞれ何を言っているのか

個人的見解も交えてそれぞれ何のことを言ってるか補足してみよう。

## オブジェクト指向が、唯一のコードのデザイン手法ではない

Elixir が関数型言語であることを言ってる。

Elixir にはオブジェクトの仕組みはない、けど、プログラムを構造的にデザインすることはもちろんできる。Elixir on Rails な Phoenix なんかを見ていると、Rails ライクな MVC フレームワークを構成するのにもオブジェクト指向が必要だったわけじゃない、というのがわかる。

## 関数型プログラミングは必ずしも複雑でもないし、数学的である必要もない

Elixir は関数型だけれども、自分程度でも使えているし、決して複雑ではない。また、実際使って見るとかなりプラクティカルな言語であり理論的な背景をきちんと理解しないと使いこなせないかというとそんなことはない。実際、自分は他の関数型言語でまともに使えるものはない程度のスキルだが何とかなってる。

このところ Elixir を触っていて、むしろ関数型とは何かを Elixir を通じてだんだんと実感できているような、個人的にはそういう感じ。

## プログラミングの基礎はいつも「代入、if文、ループ」というわけじゃない

- Elixir の変数は代入ではなく、束縛
- Elixir での条件分岐的な処理は if 文ではなく、パターンマッチを使って書く方がより Elixir らしい (参照: [Elixir のパターンマッチを攻略しよう](http://qiita.com/naoya@github/items/9da982febe89d83cb5b5))
- Elixir にループはない。再帰で書くとか、Enum 使おうぜ

ということ。

はじめは代入も、if 文も、ループもあまり使わない/使うな、と言われると面食らう感じはあるが、実際には Elixir を使って書いてると「あれ、気づいたら if 文使ってなかったわ」みたいな感じになる。言語の制約がうまくプログラマを導いてくれる。

## 並行処理はロック、セマフォ、モニタとかを必要としない

Elixir の並行処理はアクターモデルによる "Shared Nothing" 戦略である。

軽量プロセスを作って、プロセスとプロセスは何もデータを共有せず、お互いのやりとりはメッセージパッシングのみに限定される。メッセージでは任意の値を送受信できるが、送受信に際してそれらの値はコピーされ、共有はされない。

結果、並行して動いているそれぞれのプロセスは何も共有してないのでロックもセマフォも要らない。

もちろん、アクターモデルが苦手で従来型 (e.g. マルチスレッド) の方が得意とする並行処理もあるはあるので銀の弾丸ではないが、多くの場面では、この戦略でうまくいく。

## 「プロセス」って高価なリソースではないよ

Elixir の並行処理の基礎は、軽量プロセスによって成立している。

Elixir におけるプロセスは OS のプロセスではなくて、Elixir 内における小さな実行コンテキストのこと。プロセスをたくさん作って並行処理させて、いらなくなったら捨てる。エラー処理だけのためにプロセスを作ったりとかカジュアルにやる。

Elixir 上のプロセスは、Erlang VM (BEAM) によりスケジューリングされて OS 観点ではマルチスレッド + スレッドプールで動いている。従って、マルチコア CPU もうまく活用できる。

OS のプロセスはリソース的に高価なので fork とかは躊躇があったけれども、Elixir のそれは 300 ワードとかその程度なんでがんがん作ってがんがん活用すべし、みたいなものである。

## メタプログラミングは言語におまけ程度に付け加えられたものってわけじゃないぜ

あまりメタプログラミング詳しくないけど、Elixir はすべての文法をマクロで変更できちゃう。lisp みたいなもの。

なので、おまけじゃないよってことが言いたいのかな。

## こんな感じでもプログラミングは楽しいよ

Elixir 楽しい。久々にプログラミングって楽しいな、と思いながら触ってる。
InnoSetupでMutex

InnoSetupでsetup.exeの同時起動を排他するにはMutexを使います。
コードはこんなところでしょうか。

```
[Code]
const
  MySetupMutex = 'MySetupsMutexName';

function InitializeSetup: Boolean;
begin
  Result := not CheckForMutexes(MySetupMutex);
  if Result then begin
    CreateMutex(MySetupMutex)
  end else begin
    MsgBox('Another instance is running. Setup will exit.', mbError, MB_OK);
  end;
end;
```


InnoSetup 5.5.6 からは[Setup]セクションに1行書けばOK.

```
[Setup]
SetupMutex=MySetupsMutexName,Global\MySetupsMutexName
```
【JAWS-UG関西女子会】#4 viの使い方

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-65307172-1', 'auto');
  ga('send', 'pageview');

</script>

#はじめに
この記事はJAWS-UG関西女子会「はじめて女子応援企画！事例から学ぶもくもく＆もぐもぐ会」で
 ~~もぐもぐ~~ [^1] もくもくする際のテキストとなります。
[^1]: 節子！それは懇親会や！！


#本記事での目標
viとはLinuxでファイルに入力する際に使用するテキストエディターです。
LinuxにSSH接続をする場合、操作はすべてコマンドでマウスを使用しません。
保存やファイルを閉じる操作などのすべてをviのコマンドで実行するため、よく使うコマンドをここでご紹介します。

#viコマンド

##viエディターを開く

```
# vi <ファイル名>
```

viでファイルを開くとこのような表示がされます。
新しくファイルを作る場合、ファイル名の部分を保存したいファイル名でviエディターを開くとそのファイル名で作成されます。
画像は新規ファイル名でviエディターを開いた状態です。(一番下に[New File]と表示)
![ELB000302.png](https://qiita-image-store.s3.amazonaws.com/0/85659/45ed6639-8a12-021c-5905-95d3973c9093.png)

##入力モード変更
ファイルを開いた直後はコマンドモードとなり、文字の入力ができません。
「i」キーを押すと「--INSERT--」と表示され、入力モードに切り替わります。
![ELB000303.png](https://qiita-image-store.s3.amazonaws.com/0/85659/d40d4fee-a30c-0e26-603a-15f1d6f48315.png)

「Esc」キーを押すと入力モードからコマンドモードに切り替わります。
![ELB000304.png](https://qiita-image-store.s3.amazonaws.com/0/85659/22812369-2fda-b741-f7e5-e675ba2005db.png)


##よく使うコマンド
以下のコマンドはよく使うコマンドです。
ファイル内のカーソル移動はキーボードの矢印キーで行います。

|コマンド|意味|
|:-----:|:-----:|
| :q! | 保存せずにファイルを閉じる |
| :wq | 保存してファイルを閉じる |
| /検索文字列 | 文字列の検索をする |
| o | カーソルの一行下に挿入 |
| G | ファイルの最終行へ移動 |
| dd | カーソルがあたっている行を削除 |
| x | カーソルがあたっている文字を1文字削除 ｜
RevelでFormの配列を扱う

# Structの配列初期化
```
type Book struct {
	Name []string
}
```

```
bookNum := 2
books := Book{Name: make([]string, bookNum)}
```

```
books := Book{
	Name: []string{"hoge", "fuga"},
}
```

# RevelのTemplateでFormを作る
```
{{if gt .bookNum 2 }}
{{$sa := index .books.Name 2}}
{{with $field := field "books.Name[2]" .}}
<p class="{{$field.ErrorClass}}">
    <strong>Check In Date:</strong>
    <input type="text" size="10" name="{{$field.Name}}" class="datepicker" value="{{firstof $field.Flash $sa}}">
    * <span class="error">{{$field.Error}}</span>
</p>
{{end}}
{{end}}
```

# RevelでValidationしてみる
```
for index, book := range books.Name {
	keyName := "books.Name[" + strconv.Itoa(index) + "]"
	c.Validation.Required(book).Key(keyName).Message("Your name is required!")
	c.Validation.MinSize(book, 3).Key(keyName).Message("Your name is not long enough!")
}
```
Eddystone, iBeaconに対応したiOSライブラリを作った話

# Eddystone対応のiOS向けライブラリ

ざっくり言うとEddystoneとiBeacon両方に対応したライブラリを作りました。
というより元々作っていたiOS向けiBeacon,ジオフェンスでのRegion MonitoringのライブラリにEddystoneを対応させました。

## 前置き

[前回Eddystoneの概要](http://qiita.com/koutalou/items/b44b87960ac63c5fd23e) を調べたので、Githubで公開されている本家の[Eddystoneの受信サンプル](https://github.com/google/eddystone/tree/master/tools/ios-eddystone-scanner-sample)を触ってみました。

触っていて気づいたのですが、Eddystone-URLのBeacon情報を通知させてもUnsupported frame typeとなってしまい受信できませんでした。
ソースを確認したところ、現在Eddystone-UID,-TLMは対応しているがEddystone-URLには対応していなかったようです。

ということでEddystone-UID,-URL,-TLM全てに対応したEddystone受信ライブラリを作りました。

# Beacon Region Monitoring

とりあえずBeacon Region Monitoring という名前で公開しています。
(Github: https://github.com/koutalou/BeaconRegionManager)

まだ整合性があってないところや、直したいところも沢山あるのですが、iBeaconライクにEddystone BeaconのRegion Enter/ExitとRangingには対応させています。

サンプルコードも入れているので、動作確認は簡単にできると思います。

細かいところは今後コードにアップしていきたいと思います。