OmniAICreator/Qiita-1.07M huggingface dataset:
エンジニアとして知っておいてよかったSEO(=Google)のことと参考書籍まとめ(編集中)


ウェブサイトを実際にゼロから自分で構築する際に、ゼロからサイト設計をしたり構築するようになった今だからこそ、「知っておけばよかったな」「こういうことを作る前に意識しておけると良いんだな」と思うことがあったので整理。

というか、下記みたいに、Web上にサイト作るんだからGoogleは意識しておいた方が良かったね、という話に集約されてしまう。

* サイト設計上Googleは意識しておいた方がよかった
* SEOってなんか悪徳みたいな印象で毛嫌いしていたりしたのは間違っている
* SEOを考えることはGoogleの思想を通じてユーザを考えること
* Googleを考えてサイト設計をすることは、必然的にある程度Web標準を意識できる

これらのことは、エンジニアよりはディレクターやマーケターが詳しかったりする部分なので、ゼロからサービス開発・設計をする際に「エンジニア」が上記のような基礎知識を持っていると、開発からは他領域のディレクター・マーケターとの連携がなめらかにいくことが多いなと。

そんな中で、エンジニアとしても最低限知っておくことで良いなと思った部分に参考になった書籍のまとめ。


## SEOを意識したサイト設計に関する参考

### 1. [『いちばんやさしい新しいSEOの教本 人気講師が教える検索に強いサイトの作り方』](http://amzn.to/1QUPsgy)


すごくプリミティブな部分だが、SEOを考えることが「ユーザが何を目的にしているかを考えること」だという、非常に牧歌的だけど大事な部分をきちんとマインドセットしてくれる書籍。
その後、基礎的に必要な様々なテクニカルな部分も抑えてくれているけれど、サイトやサービスを考える上で、
* 全員が共通認識として「ユーザが何を目的にしているか」を考えるべきであること
* マーケターやディレクターも「ユーザ」を考えていること
	
などの、エンジニアとは違う観点における「ユーザ志向」への理解と、共通認識基盤の構築のキッカケを作ってくれる良い入門書。



### 2. 瀧内 賢[『これからはじめる SEO内部対策の教科書』](http://amzn.to/1NIiECf)

SEOを意識した上で、そもそもベースとなるSEOの考え方や、サイト内部のソースコードのチューニングを行う際にどういうことを意識しておくと良いのか、などの点に関して、ここまで簡潔に解説されている書籍はないのかも、というような書籍。

こういうことを開発者側やコーダー側で知っていると、ディレクターなどをしている人からするとかなり助かるというような内部のテクニカルな内容については網羅的に知ることができて良い。



### 3. 大本 あかね[『マーケティング/検索エンジンに強くなる Google Search Consoleの教科書』](http://amzn.to/1NIiXNv)

Google Search Console（以前の Web Master Tool）についての使い方を解説している本だが、全体感としては"Googleは何を意識して検索エンジンを作っているのか"という思想や歴史にも触れているので、そういう部分はむしろエンジニアの方が楽しめる要素が大きいのでは？と思ったりする書籍。
その上で、マーケターやディレクターが具体的に彼らの観点からの改善施策などをどう回せるのかという話が記載されているが、きちんと"Googleの思想"に寄り添いながらどうするべきかということを記述しているので、彼らの要求がエンジニアにとって時にめんどくさかったとしてもきちんと意味があるということを理解する情報を与えてくれる。
SEOを中心とした一部のウェブマーケティングが、ユーザや現在の技術環境、Googleというテクノロジーのトップの思想とどれだけ近しいものかを知ることができる。 
SEOを語るときに「ユーザという人間にとって良いウェブサイト」と「Google Botというマシンにとって良いウェブサイト」という、ユーザエクスペリエンスとマシンリーダビリティの合いの子のような議論はよくなされると思うが、こういう本を読むとエンジニアではない人たちも「ユーザ」と「マシン」のことを考えて仕事をしているんだなと思って、親近感が湧いてくるような書籍。
 
### 4. 畑岡大作[『実践 Google タグマネージャ入門 増補版』](http://amzn.to/1QURxsU)

### 5. 大倉 裕治ほか[『新版 プロが教える Googleアナリティクス 実践テクニック ユニバーサルアナリティクス対応』](http://amzn.to/219RKgv)

-----

## Others

### 1. 土居健太郎[『10年つかえるSEOの基本』](http://amzn.to/1QURPjx)

### 2. 渡辺 隆広[『検索にガンガンヒットさせるSEOの教科書』](http://amzn.to/219ROgj)

※ まだまだ、参考にすべき書籍はあるけど、一旦ここまで。


### おすすめできるスクールや学習サービス

オンライン方式
* Progate: https://prog-8.com/ （基礎プログラミングを良いコンテンツで独学可能）
* CodeCamp: https://codecamp.jp/ （独学では挫折しそうな人にビデオ通話でメンターが付く）
* Tech Academy: https://techacademy.jp/ （こちらはチャット＋ビデオメンター。経営陣もいけてる）

BootCamp方式
* Dive Into Code: https://diveintocode.jp/
* Tech Camp: https://tech-camp.in/
* フランジアのIT留学: http://framgia.com/study-abroad/
access vbaとか

サブフォームの高さを調節したいときは　親フォーム側でこれ書けばいいみたい。

```vbnet
Private Sub Form_Current()

    Application.Echo False


    'サブフォームの高さを調節
    With Me.サブフォーム名.Form
        Dim q As Integer: q = .Recordset.RecordCount
        Me.サブフォーム名.Height = (q + 1) * .Section(acDetail).Height + .Section(acHeader).Height + .Section(acFooter).Height + Me.サブフォーム名.Top
    End With

    Application.Echo True
End Sub
```

オートナンバーだと間違えて要素消しちゃった場合に困る　って場合はこちらを参考にする
http://hamachan.info/access/o-ton.html

レポートでヘッダをつけないようにする
https://support.office.com/ja-jp/article/%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%96%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%81%BE%E3%81%9F%E3%81%AF%E3%82%B5%E3%83%9E%E3%83%AA%E3%83%BC-%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-6a58e9ab-9f74-4689-83b6-c63cddb2c7f9
【Android】LoaderManagerを使い回す方法

#1. 概要
Androidで同じLoaderManagerを使い回す方法のメモ

#2. やりたかったこと

最初に定義したLoaderManagerとAsyncTaskLoaderは以下の通り。
文字列を受け取って非同期でログに出力するだけ。

```MyLoaderManager.java
public class MyLoaderManager implements LoaderManager.LoaderCallbacks<String> {
    private Activity activity;

    public MyLoaderManager(Activity _activity) {
        this.activity = _activity;
    }

    public void doTask(String text) {
        Bundle bundle = new Bundle();
        bundle.putString("text", text);
        activity.getLoaderManager().initLoader(1, bundle, this);
    }

    @Override
    public Loader<String> onCreateLoader(int id, Bundle args) {
        // TODO Auto-generated method stub
        MyLoader loader = new MyLoader(activity, args.getString("text"));
        loader.forceLoad();
        return loader;
    }

    @Override
    public void onLoadFinished(Loader<String> loader, String data) {
        // TODO Auto-generated method stub
        Log.d("TAG", data);
    }

    @Override
    public void onLoaderReset(Loader<String> loader) {
        // TODO Auto-generated method stub
    }
}

```

```.java
class MyLoader extends AsyncTaskLoader<String> {
    private String text;

    public MyLoader(Context _context, String _text) {
        super(_context);
        this.text = _text;
    }

    @Override
    public String loadInBackground() {
        // TODO Auto-generated method stub
        return text;
    }
}
```

やりたかったこととしては、下記のようにMyLoaderManagerのインスタンスを一つ作成し、何度も使い回ししたかった。


```MainActivity.java

public class MainActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyLoaderManager myLoaderManager = new MyLoaderManager(this);

        myLoaderManager.doTask("hogehoge");
        myLoaderManager.doTask("fugafuga");
        myLoaderManager.doTask("piyopiyo");
    }
}

```

#3. 問題点：二度目以降、onCreateLoaderが呼ばれない

どうやら上で定義したコードだと、onCreateLoaderが一回しか呼ばれないらしい。
したがって、

```.java
myLoaderManager.doTask("hogehoge");
myLoaderManager.doTask("fugafuga");
myLoaderManager.doTask("piyopiyo");
```

と呼び出しても、ログにはhogehogeしか出力されていなかった。

##3.1 対処法1：IDを設定する
原因はココ。

```.java
activity.getLoaderManager().initLoader(1, bundle, this);
```

どうやら`initLoader`は、指定したIDごとに一度しか呼ばれないらしい。
IDとは`initLoader`の第一引数のやつ。
そこで上記のコードを、

```.java
    public void doTask(int id, String text) {
        Bundle bundle = new Bundle();
        bundle.putString("text", text);
        activity.getLoaderManager().initLoader(id, bundle, this);
    }
```

と訂正し、呼び出しを

```.java
myLoaderManager.doTask(1, "hogehoge");
myLoaderManager.doTask(2, "fugafuga");
myLoaderManager.doTask(3, "piyopiyo");

```

として、IDを変更してあげればちゃんと全部呼ばれた。
ただ、毎回個別にIDを設定するのは面倒臭い。
そこで次のような修正をした。

##3.2 対処法2：restartLoaderを使う
同一のIDで使い回したいときは、`initLoader`の代わりに`restartLoader`を使う。

```.java
activity.getLoaderManager().restartLoader(id, bundle, this);
```

こうすることによってonCreateLoaderを再度呼び出すことができる。
しかし、上記の`MainActivity`のように連続でLoaderを呼んだとき、既存のLoaderの処理が終わってなかったら途中で破棄されて新しいLoaderの処理を始めてしまうっぽいので注意。

そういうときは、Callbackで前回のLoaderの終了を検知してやればいいかも。

#4. 参考
http://yuki312.blogspot.jp/2012/02/loadermanager.html
http://d.hatena.ne.jp/Kyakujin/20130528/1369729549
RubyをWindows上でVisual C++でビルドする 2016

## 序
あえて茨の道を行きたい人向けです。
## Ruby
Rubyをソースコードからビルドする場合、特にtarballからではなくリポジトリから取得した場合にはbisonやsed、rubyといったUnixツールが必要です。個別に調達すると大変なので、たとえVisual C++でビルドするのだとしても、[RubyInstaller](http://rubyinstaller.org/downloads/) 及びdevkitを取得すると一通り揃うので大変楽です。
なお、CRubyは現在Visual C++ 2015 (14) には対応していません。[動くブランチ](https://github.com/nurse/ruby/tree/msvc14)はありますが、[差分](https://github.com/ruby/ruby/compare/trunk...nurse:msvc14)を見ればわかるとおり、人様に使って頂けるような物にはなり得ません。

## 環境変数
ビルド用の環境変数。なお、VS2013 x64 Native Tools コマンド プロンプトなどを用いてコンパイラ等の環境変数はあらかじめ設定しているものとします。

```
set PATH=%PATH%;C:\Ruby22-x64\bin;C:\Program Files (x86)\Git\bin
set TERM=xterm
```
## OpenSSL
後述のLibreSSLでもいけます。
まず[OpenSSL Downloads](http://openssl.org/source/)から1.0.2dなどを取ってきます。devkitの付録のperlを使う場合、msysなためか外から来るパスが\になっているせいで、文字列に埋め込んだ際におかしくなるので以下の修正を当てます。(ActivePerlのperlだったら不要かもしれない)

```diff
--- ms\uplink-x86_64.pl.orig    2015-11-21 14:24:17 +0900
+++ ms\uplink-x86_64.pl 2015-11-21 14:25:02 +0900
@@ -1,7 +1,7 @@
 #!/usr/bin/env perl

 $output=shift;
-$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
+$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=quotemeta $1;
 open OUT,"| \"$^X\" ${dir}../crypto/perlasm/x86_64-xlate.pl $output";
 *STDOUT=*OUT;
 push(@INC,"${dir}.");
```
あとは以下の通りにビルドします。

```
perl Configure VC-WIN64A no-asm --prefix=/Users/naruse/local/ruby
ms\do_win64a
nmake -f ms\ntdll.mak
```
なお、no-asmをつけないと、少なくともさっきのパス変換の修正が大量に必要になります。

目当てのバイナリはout32dll\libeay32.dllとout32dll\ssleay32.dllです。
これをrubyをビルドするフォルダと、インストール先のbinフォルダにコピーします。

## LibreSSL
OpenSSLを用意した人は必要ありません。
[LibreSSL Download](http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/)に行き、libressl-2.2.4-windows.zipなどをダウンロードして解凍します。x64フォルダに入り、libcrypto-35.libとlibssl-35.libを、それぞれcrypto.libとssl.libにリネームします。また、libcrypto-35.dllとlibssl-35.dllをrubyをビルドするフォルダと、インストール先のbinフォルダにコピーします。
## zlib
http://zlib.net/zlib128.zip をダウンロードし、解凍して、`nmake -f win32/Makefile.msc`してできたzlib1.dllをrubyをビルドするフォルダと、インストール先のbinフォルダにコピー。

## Ruby
以下の通りでビルド・インストールできます。（パスは適当に読み替えてください）

```
win32\configure.bat --disable-install-doc --with-openssl-include=/Users/naruse/local/libressl-2.2.4-windows/include --with-openssl-lib=/Users/naruse/local/libressl-2.2.4-windows/x64 --with-zlib-include=/Users/naruse/local/zlib-1.2.8 --with-zlib-lib=/Users/naruse/local/zlib-1.2.8
nmake install
```

## 追記

Visual C++ではなくmingwを使いたいときは[Git for Windows SDKの話](http://naruse.hateblo.jp/entry/2015/12/27/200312)を読みましょう
オンデマンドなJupyter Notebook環境でいつでもどこでも機械学習を学習する

最近、機械学習にどっぷり浸かっていますが、[Jupyter Notebook](http://jupyter.org/)を使うと勉強が捗るので重宝しています。せっかくブラウザで利用できるので、ブラウザさえあればいつでもどこでも―自分のお気に入りノートPCが手元になくとも、自分の「ノート」を開けるような環境が欲しくて作ってみました。

-----

## 概要

[DigitalOcean](https://www.digitalocean.com/)上に[Docker](https://www.docker.com/)で[Jupyter Notebook](http://jupyter.org/)環境を構築します。

[DigitalOcean](https://www.digitalocean.com/)は格安のいわゆるIaaSです。時間単位の課金で、2015/11/21時点で0.86円/時($0.007/時)で利用できます。DigitalOceanのWebページ上でサーバの電源をOFFにしておけばお金がかからないので、勉強したい時だけ電源をONにするといった利用が可能です。

[Docker](https://www.docker.com/)は言わずと知れたコンテナ型のアプリケーションデプロイツールです、ここではJupyter Notebook環境の構築を簡便化するために用います。コンテナとしては[scikit-learn](http://scikit-learn.org/stable/)等がプリインストールされた[こちら](https://hub.docker.com/r/jupyter/datascience-notebook/)のコンテナを利用します。

※ 作成する環境ではJupyter Notebookにパスワード認証でログインします。credentialな内容を本環境に配置する場合は、より強固な認証機構の導入を検討してください。

## 環境構築

### Dropletの作成

DigitalOceanではDropletという単位でサーバを構築します。

前提として、DigitalOceanのアカウントを作成したら、[こちらの記事](https://www.digitalocean.com/community/tutorials/how-to-use-ssh-keys-with-digitalocean-droplets)に従って公開鍵を登録しておきます。

1. DigitalOceanにログインして、「Create Droplet」をクリックします

2. 以下内容でDropletを作成します(`Choose an image`はDockerを選択します)
    * Droplet Hostname: notebooks ※任意
    * Choose a sizze $5/mo ※任意
    * Choose a datacenter region: New York ※任意
    * Choose an image: Docker 1.9.1 on 14.04
    * Select additional options:
    * Add your SSH keys: <事前に登録してある公開鍵の名前>

### Jupyterコンテナのデプロイ

1. Dropletの作成が完了すると作成されたDropletのIPアドレスが表示されます。手元のPCからsshでDropletにログインします。

    ```bash
    $ ssh root@<IPアドレス>
    ```

2. 作業スペースのディレクトリを作成します [^1]

    ```bash
    $ mkdir /opt/notebooks # 場所は任意
    $ chmod a+w -R /opt/notebooks
    ```

3. `scikit-learn`等機械学習に必要なパッケージが含まれたJupyterコンテナを起動します

    ```bash
    $ docker run -d --restart always -p 8888:8888 -v /opt/notebooks:/home/jovyan/work -e PASSWORD=<任意のパスワード> jupyter/datascience-notebook
    ```

4. ブラウザで`http://<IPアドレス>:8888`にアクセスして確認します

[^1]: 自分は`/opt/notebooks`をgitで管理してみています

-----

後は、いつもの通りにJupyter Notebookを使用してみてください。一通り作業が終わったら、DigitalOceanのWeb上から「Power off」してみます。後で「Power on」すると、自動的にJupyter Notebookが立ち上がります。

昔、「`Emacs`の`org`モードって文章を書くには適しているが、もっと気軽にプログラムコード実行できないものか、さらにその結果も反映できないものか」って思ってた頃がありましたが、Jupyter Notebookはこれを叶えてくれるツールだなと思います。そういう意味で今の学生さんは幸せだと思うし、学校でもJupyter Notebookを積極的に導入したら良いのではと思う今日このごろです
.test()や.exec()で同じ引数に対して異なる結果が返る

### 起

ちょっと正規表現の処理を書いてたらこんなことが起きた。

```js
> var re = /^\d+$/g;
> var src = "1234";
> re.test(src);
true
> re.test(src);
false
> re.exec(src);
["1234"]
> re.exec(src);
null
```

な、なんと同じ正規表現に同じテキストソースを渡してやると異なる結果が返ってくる……
期待している動作と完全に違ったので脳内パニック。


### 承

ググってたらそれらしいものをみつけた。
参考：[why does my javascript regex.test() give alternating results - Stack Overflow](http://stackoverflow.com/questions/2851308/why-does-my-javascript-regex-test-give-alternating-results)
どうやらグローバルオプション(g)をつけると、lastIndexにstateが保存されるので初回とは違う動作になるとか。。。


### 結

```js
> var re = /^\d+$/;
> var src = "1234";
> re.test(src);
true
> re.test(src);
true
> re.exec(src);
["1234"]
> re.exec(src);
["1234"]
```

必要ない時はgフラグをつけないようにしよう。


### 追記

コメントで更に為になるページを戴きました。
[JavaScriptで正規表現を複数回実行する際の注意点](http://qiita.com/nanocloudx/items/079685599273f3805f77)
monoインストール(brewなし)メモ

Macで、unity(5.5.2f1)とVisualStudio Code(0.10.1)の連携がうまくいかなかったので、monoのバージョンを上げる。

brewだとなぜかうまくいかなかった。`brew uninstall mono`で、既に入っているmonoを一旦消す。
*Can't start Omnisharp because of mono version*
http://stackoverflow.com/questions/29959239/cant-start-omnisharp-because-of-mono-version

pkgでmonoをインストール。
*ダウンロードページ*
http://www.mono-project.com/download/
Redux入門 1日目  Reduxとは(公式ドキュメント和訳)

Redux初心者向けです。というか私が初心者です。
Reduxに触れてみようと思って、まずは公式のGithubのドキュメントでも読んでみるか、と自分へのメモも兼ねてざっくりとした和訳をして行きます。
[公式github](https://github.com/rackt/redux)

Redux入門 1日目~6日目までの部分を短くまとめた記事も書きました。
[ダイジェスト版](http://qiita.com/kiita312/items/49a1f03445b19cf407b7)

## 1.1 Motivation(背景)
http://rackt.org/redux/docs/introduction/Motivation.html
近年、Javascriptのシングルページアプリケーションは複雑になってきてstate(状態)を管理するのはしんどくなってきた。新機能開発するのもバグ修正するのもかなり辛い。
根本的に、「変化」と「非同期」を"同時"にコントロールするのは人間には無理がある。Reactはその問題に対してViewレイヤーで非同期と直接DOM操作を取り除くことで解決したけども、state(状態)の管理は開発者に委ねられたままなので、Reduxはそこを解決するためにある。
Reduxは3原則に則って状態変化の流れを制限することで、状態を管理できるようにしている。

## 1.2 Three Principles (3原則)
###1. Single source of truth(ソースは１つだけ)
アプリケーション全体の状態(state)はツリーの形で１つのオブジェクトで作られ、１つのストアに保存される

* stateが保存しやすいので、ユニバーサルアプリケーションがつくりやすい
* stateが一つだから、デバッグしやすい、開発しやすい

### 2. State is read-only(状態は読み取り専用)
状態を変更する手段は、変更内容をもったactionオブジェクトを発行して実行するだけ

* ビューやコールバックが状態を直接変更させることはできない
* 変更は一つずつ順番に行なわれる
* actionはオブジェクトなので、保存可能であり、テストしやすい

### 3. Mutations are written as pure functions(変更はすべてpureな関数で書かれる)
アクションがどのように状態を変更するかを「Reducer」で行う。

* 「Reducer」は状態とアクションを受けて、新しい状態を返す関数である。
* 現在のstateオブジェクトを変更することはせずに、新しいstateオブジェクトを作って返すというのがポイント。
* 開発するときは、最初はアプリケーションで一つのReducerを用意して、巨大化してきたらReducerを分割していく

# 1.3 Prior Art　(既存技術との比較)
## Flux
ReduxはFluxの実装かといればYesでもありNoでもある。
Fluxの要素を取り入れている部分も多い。

* 更新ロジックを一カ所にまとめている(FluxならStore, ReduxならReducer)
* アプリケーションが状態を直接変更することはなく、状態の変更はアクションですべておこなわれる

Fluxとは異なる点

* Reduxにはdispatcherがない。(Reducerで担う)
* Reduxでは状態のオブジェクトに変更を行なうことはない。新しい状態オブジェクトを作る。

※ 以下、割愛

続き [Redux入門 2日目 Reduxの基本・Actions](http://qiita.com/kiita312/items/8f8d047e5cbd87399ccb)
データがないのにfscanfで読み続けるとどうなるか

#概要
fscanfでファイルからデータを読む場面がある。
一般にどのくらいあるかは分からないがC言語の初学者は多いのではないだろうか。

さて、テキストデータを読むとしてデータ以上に読み込もうとしたらどうなるだろうか。
初学者であれば実行して確認して欲しいが、念のため私の環境下で結果も示す。

#ソースコードを見る。
以下に実行するソースコードとファイルの中身を示す。


```lang:test1.cpp
#include <stdio.h>

int main()
{
	FILE *fp;
	int tmp;

	if((fp=fopen("test1.txt","r"))==NULL)
	{
		printf("無。\n");
		return 0;
	}

	for(int i=0;i<10;i++)
	{
		fscanf(fp,"%d",&tmp);
		printf("%d\n",tmp);
	}

	fclose(fp);
	return 0;
}
```
```lang:test1.txt
1
2
3
4
5
```

#動作確認
実行すると以下の結果を得られた。

```
1
2
3
4
5
5
5
5
5
5
```

どうやら取得できないとバッファが出てしまうようだ。


#修正方法は？

>対処としては、scanf/fscanfの戻り値として、うまく代入できた個数、または、変換失敗でEOF(-1)が返ってくる。戻り値をチェックして、妥当な値が入ってるか、確認するとよいね。
例) int ret = fscanf(fp, "%d %d", &n1, &n2); 
に対し、
1 2 を入力 => ret = 2
1 a を入力 => ret = 1
...

@mt08さんよりコメントを頂いたので実際にやってみる。

成功/失敗を見分ける例として以下のように書き変えた。


```lang:test2.cpp
#include <stdio.h>

int main()
{
	FILE *fp;
	int tmp,ret;


	if((fp=fopen("test1.txt","r"))==NULL)
	{
		printf("無。\n");
		return 0;
	}

	for(int i=0;i<10;i++)
	{
		ret=0;
		ret=fscanf(fp,"%d",&tmp);
		printf("%d %d\n",tmp,ret);
	}

	fclose(fp);
	return 0;
}

```

結果は以下のとおり

```
1 1
2 1
3 1
4 1
5 1
5 -1
5 -1
5 -1
5 -1
5 -1
```

成功している部分では1,失敗している部分では-1を返していたことが確認できた。

次のデータの時はどうか

```lang:test2.txt
1 6
2 a
3 7
4 8
5 9
```
```lang:test3.cpp
#include <stdio.h>

int main()
{
	FILE *fp;
	int tmp[2],ret;


	if((fp=fopen("test2.txt","r"))==NULL)
	{
		printf("無。\n");
		return 0;
	}

	for(int i=0;i<10;i++)
	{
		ret=0;
		ret=fscanf(fp,"%d %d",&tmp[0],&tmp[1]);
		printf("%d %d %d\n",tmp[0],tmp[1],ret);
	}

	fclose(fp);
	return 0;
}
```

```
1 6 2
2 6 1
2 6 0
2 6 0
2 6 0
2 6 0
2 6 0
2 6 0
2 6 0
2 6 0
```

確かに2つの値が成功しているときは2,片方の時は1が出ている。
その後は文字を入れてしまったため処理が停止してるように見える。
事実データは入力ストリーム上に残ってしまっている。

そういった場合の事例はWikipediaに載っていたのでこちらも参照されたい。
https://ja.wikipedia.org/wiki/Scanf#.E7.95.B0.E5.B8.B8.E3.81.AA.E5.85.A5.E5.8A.9B.E3.81.8C.E8.A1.8C.E3.82.8F.E3.82.8C.E3.81.9F.E6.99.82.E3.81.AE.E5.87.A6.E7.90.86
Ubuntu on Docker で SSL/TLS 通信するとエラーになる問題の対処


[Docker](http://docker.com/) 用の [Ubuntu イメージ](https://hub.docker.com/_/ubuntu/) は最低限のパッケージがインストールされていない。そのため、SSL/TLS 通信を行おうとすると以下のメッセージが出るだろう。 (以下は curl の場合)

> curl: (60) SSL certificate problem: unable to get local issuer certificate

ここでは「その場しのぎのやり方」と「根本的な対処」と「なぜそんなことが起こりえるのか」の３つにわけて説明する。

# その場しのぎのやり方

ここでは SSL/TLS 通信の使用頻度が高い代表的なプログラムの３つを取り上げて説明する。

  - git
  - curl
  - wget

## git の場合

`http.sslVerify` を無効にする。

```bash
$ git config --global http.sslVerify false
$ git clone https://git.example.com/some/repository.git
```

元に戻す場合は `http.sslVerify` を `true` にする。

## curl の場合

`-k` をつけて実行する。

```
$ curl -k https://example.com
```

## wget の場合

`--no-check-certificate` をつけて実行する。

```
$ wget --no-check-certificate https://example.com
```

# 根本的な対処

そもそも今回のエラーは CA の証明書が入っていないことが原因のエラーであり、Ubuntu イメージには CA の証明書が入ってない。

Docker イメージの構築段階、あるいはイメージ上で実行するスクリプトに
CA の証明書のパッケージをインストールすればよい。

```
$ apt-get install ca-certificates
```

これで「その場しのぎのやり方」をせずとも通常に SSL/TLS 通信が可能になる。

# なぜそんなことが起こりえるのか？

通常 `ca-certificates` は推奨パッケージとして「その場しのぎのやり方」で取り上げたプログラムと共にインストールされる。

```
Recommended packages:
  ca-certificates
```

ところが `apt-get` に `--no-install-recommends` を明示的につけると `ca-certificates` がインストールされなくなる。そのために起こるエラーである。
line monitor > UI部分(v0.3) > 更新停止機能 / non-ASCII変換機能 / 秒.ミリ秒表示機能

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

```txt:環境
実装 Unity 5.1.3-f1 on MacOS X 10.8.5
動作 304SH
```

## プログラム

[v0.3 @ github](https://github.com/yasokada/unity-151117-linemonitor-UI/releases/tag/v0.3)

以下の機能を追加した。

- Updトグルボタン : 更新のON/OFF
- Ctrlトグルボタン : non-ASCII文字のASCII文字への変換 (e.g. <CR>)
  - 今のところ、`<CR>`, `<LF>`のみ変換
- Timトグルボタン : 受信時の`秒.ミリ秒`の付加

## 動作結果

304SHでの実行結果

<img width="350" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/32870/0a9fca82-2bc6-a707-430a-1b00f7f1ccca.png">

- UDP送信側はCentOSから2秒おきにdate情報を送信している
- `53.248`などの数字はその時の時刻が`53秒`,`248ミリ秒`を表す
  - ただし、RS-232Cの受信時刻ではなく、UDPの受信時刻
- Ctrlをオンにした時は`\n`を`<LF>`に変換している
- Updをオフにした間 (01.326から07.369）は受信テキストを廃棄
- Timをオンにした時には行頭に`53.248`などの数値がつく

## 今後

モニタ情報のログをどこで取ろうか検討中

- RPi2側のUSBメモリ
- RPi2側のmicroSD
- android側のmicroSD
Facebookのアイコン画像を地図のマーカーアイコンに使う

Node.jsの勉強がてら地図上でお話しできる[チャットアプリ](https://github.com/ynunokawa/machiawase-map-sub)を作成していたら、チャットルームの管理が面倒なので、FacebookのMessengerで管理しているグループと連動できないかと思ってやってみた雑記です。

一応、[Socket.ioを使ったチャットルーム ロジックの実装](http://qiita.com/ynunokawa/items/564757fe6dbe43d172f8)で完結してますが、おまけにFacebookのアイコン画像を地図上のマーカー アイコンとして表示する方法を簡単に紹介します。

というかとても簡単です。

![IMG_2884.jpg](https://qiita-image-store.s3.amazonaws.com/0/81547/5548a3c7-920f-89cd-1e63-dc3d5f5273c9.jpeg)

## アイコン画像URLの生成

`FB.api`関数のコールバックで`response.id`からFacebookのユーザーIDを取得できるので、以下のようにURL化すればよし。
これがユーザーIDに対応したFacebookのアイコン画像URLになります。

```js
profile_img_url = 'https://graph.facebook.com/' + response.id + '/picture';
```

## マーカーにアイコン画像を指定

さて、ここからが地図の話です。
地図はオープンソースのJavaScriptライブラリ[__Leaflet__](http://leafletjs.com) を使っています。
Webの地図はGoogle一択な人も使ってみてください。
楽しいですよ。

アイコンを定義するために`LeafIcon`クラスの`iconUrl`オプションに先ほどのアイコン画像URLを指定します。
ちなみに`LeafIcon`はLeaflet標準のアイコン生成クラスである`L.Icon`の拡張クラスです。わざわざ拡張している訳は次のセクションで説明します。

```js
locationIcon = new LeafIcon({iconUrl: profile_img_url});
```

`L.marker`クラスに上の`locationIcon`を指定して、`addTo(map)`で地図に追加します。
これで、地図の上にFacebookのアイコン画像がマーカーとして表示されます。

```js
var marker = L.marker([lat, long], { alt: 'people', title: myname, icon: locationIcon }).addTo(map);
```

## 地図アイコンをちょっと素敵に

上でも述べましたが、`LeafIcon`というクラスは`L.Icon`の拡張クラスです。
`LeafIcon`を`L.Icon`に差し替えても何の問題もないのですが、アイコン画像をそのままマーカーとして地図に貼り付けるのでは芸がないし、地図にベタッと貼りついた感じは良いUIとは言えないので、CSSとアイコンの位置を調整してカスタムアイコン化しています。

```css
.leaflet-marker-icon {
  border: 4px #fff solid; /* 白いボーダーライン */
  border-radius: 40px; /* 画像を円状に変形 */
  -webkit-border-radius: 40px;
  box-shadow: 0 0 0 2px #00D0CE, 0 8px 5px rgba(0,0,0,0.4); /* 緑のボーダーラインと影 */
  z-index: 999999999;
}
```

```js
var LeafIcon = L.Icon.extend({
  options: {
    iconSize: [80, 80], // プロフィール写真のサイズ
    iconAnchor: [40, 40], // プロフィール写真の相対位置
    popupAnchor: [0, -38] // ポップアップの相対位置
  }
});
```

デモとソースは[GitHubリポジトリ](https://github.com/ynunokawa/machiawase-map-sub)を見てみてください。
当たり前ですが、デモとはいえ自分の位置が他の人にばれちゃうので気をつけて使ってくださいね。
C++のVectorをクラスで使ってみる。

#概要
C++のSTLで与えられるVectorの機能をまとめる。
C言語を使っている人がわかるように心がける。

#クラスで使うことの違い
先にint型で使う例を示した。
http://qiita.com/kooka2525/items/b018916745d889814e43
ここではクラス型にしただけである。
少々使い方が異なるのでその点について説明する。

#ソースコードを見てみる

ソースコードを以下に示す。

```cpp

#include <iostream>
#include <vector>
using namespace std;

class test_vector
{
private:
	int Number;

public:
	test_vector() { Number = 0; };
	test_vector(int _Number) { this->Number = _Number; };
	void Set_Number(int _number) { this->Number = _number; };
	int Get_Number() { return this->Number; };
};


/*****************************************************************

test_vectorクラス
メンバ変数はint型のNumberしかない。
プライベートな変数なのでそれに対するSet,Getのみ。

*****************************************************************/


int main()
{
	vector<test_vector> test1(5);


	for (int i = 0; i < 5; i++)
		test1.at(i).Set_Number(i);		//test1.i番目に値を設定
		
	for (int i = 0; i < 5; i++)
	test1.push_back(1);					//末端から追加される

	for (int i = 0; i < 10; i++)
		cout << test1[i].Get_Number();	//test1.i番目の値を表示

	cout << endl;

	for (int i = 0; i < 5; i++)
		test1.pop_back();				//末端から削除される

	for (int i = 0; i < 5; i++)
		cout << test1[i].Get_Number();	//test1.i番目の値を表示


	cout << endl;

	return 0;
}

```

ソースコード中に

```
test1.at(i)
test1[i]

```

と言った表記があるが、これは同様のものである。
配列のように利用できる(クラスを配列で動的確保してるから当然といえば当然であるが)。

###【追記】

@yumetodoさんより、プログラムの修正リクエストを頂きました。
以下に示します。

この記事の下記のコメントを参考に、何が悪く何が良いのか読んでいただければと思います。
尚、こちらのプログラムは私の環境下で動作確認をしておりません。
また、書き換えたことによりどのように変わるかはこの記事の趣旨ではありませんので省くこととします。


```cpp

#include <iostream>
#include <vector>

class test_vector
{
private:
	int number_;

public:
	test_vector() : number_() {};
	test_vector(int number) : number_(number) {};
	void Set_Number(int number) { this->number_= number; };
	int Get_Number() { return this->number_; };
};


/*****************************************************************

test_vectorクラス
メンバ変数はint型のnumber_しかない。
プライベートな変数なのでそれに対するSet,Getのみ。

*****************************************************************/


int main()
{
	using std::cout;
	using std::endl;
	std::vector<test_vector> test1(5);


	for (int i = 0; i < 5; i++)
		test1.at(i).Set_Number(i);		//test1.i番目に値を設定
		
	for (int i = 0; i < 5; i++)
		test1.push_back(1);				//末端から追加される

	for (int i = 0; i < 10; i++)
		cout << test1[i].Get_Number();	//test1.i番目の値を表示

	cout << endl;

	for (int i = 0; i < 5; i++)
		test1.pop_back();				//末端から削除される

	for (int i = 0; i < 5; i++)
		cout << test1[i].Get_Number();	//test1.i番目の値を表示


	cout << endl;

	return 0;
}

```











##ソースコード中の狙い
コンストラクタでは0で初期化しているので最初に確保した5つでは0で確保されていて
新たに追加したものには1で追加されているはずである。
(コンストラクタをオーバーロードしてるのはそのため)

C++を学んでるものなら他の説明は不要であるように思えるので略す。

#動作確認
実際に実行すると

```
0123411111
01234
続行するには何かキーを押してください . . .
```

と表示することができた。
確かに末端にデータが追加され、末端からデータが削除されている。
C++のVectorをint型で使ってみる。

#概要
C++のSTLで与えられるVectorの機能をまとめる。
C言語を使っている人がわかるように心がける。

#Vectorってなに
VectorとはC++版、配列の動的確保と考えておけばいいと思う。
mallocと同じようなもんだ。
クラスが使えるというメリットがあるのではないだろうか。
構造体も同様に使える。
今回のようなint型の動的確保であればC言語を使っている人間はmallocで足りそうである。

#ソースコードを見てみる

ソースコードを以下に示す。

```cpp
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> test1(5);		//int型のVectorをtest1という名前で5つ確保


	for (int i = 1; i < 6; i++)
		test1.push_back(i);	//末端にiという数字を追加される

	for (int i = 0; i < 10;i++)
		cout << test1[i];	//表示をしてみる

	cout << endl;			//改行

	for (int i = 0; i < 5; i++)
		test1.pop_back();	//末端から削除される

	for (int i = 0; i < 5; i++)
		cout << test1[i];	//末端から削除されてるか確認する

	cout << endl;			//改行

	return 0;
}
```

ソースコード中に

```cpp
cout << test1[i];
cout << endl;

```

と言った表記があるが、これはCの以下の様なものと理解してほしい。

```c

printf("%d",test1[i]);
printf("\n");

```

概ねコメントアウトしてある。
ここでは以下の２つの関数が利用されている。

- push_back(); 末端にデータを追加する。
- pop_back();  末端のデータを削除する。


#動作確認

実際に実行すると

```
0000012345
00000
続行するには何かキーを押してください . . .
```

と表示することができた。
確かに末端にデータが追加され、末端からデータが削除されている。
The Programmer's Oath - プログラマの誓い



[Agile Manifesto](http://www.agilemanifesto.org/) などで有名な Robert C. Martin (a.k.a. Uncle Bob) のブログを訳してみました。

原著：[The Programmer's Oath](http://blog.cleancoder.com/uncle-bob/2015/11/18/TheProgrammersOath.html)

1. I will not produce harmful code.
    害を及ぼすようなコードは書きません。

1. The code that I produce will always be my best work.  I will not knowingly release code that is defective either in behavior or structure.
    自分が書くコードがもっとも良いものであることを誓います。振る舞いや構造が悪いコードをリリースしません。

1. I will produce, with each release, a quick, sure, and repeatable proof that every element of the code works as it should.
    リリースごとにコードのすべてが意図通りに動くことの、速く、確実で、再現可能な証明も併せて作ります。

1. I will make frequent, small, releases so that I do not impede the progress of others.
    他の人の進みを妨げないよう、コマ目に、小さいリリースを行います。

1. I will fearlessly and relentlessly improve the code at every opportunity.  I will never make the code worse.
    常にコードを躊躇なく、常に改善していきます。間違ってもコードを悪くしません。

1. I will do all that I can to keep the productivity of myself, and others, as high as possible.  I will do nothing that decreases that productivity.
    自分や他の人の生産性を最も高く保つようにします。生産性を下げるようなことはしません。

1. I will continuously ensure that others can cover for me, and that I can cover for them.
    他の人が自分をカバーできるよう、また、自分が他の人をカバーできるように保ちます。

1. I will produce estimates that are honest both in magnitude and precision.  I will not make promises without certainty.
    規模と正確性において正直な見積りを出します。確信のない約束はしません。

1. I will never stop learning and improving my craft.
    常に学び、自分の技術を磨き続けます。
MapKIT:  マップのアノテーションを移動する


- アノテーションを選択直後に選択解除すると再描画してくれる模様

~~~csharp

using System;

using UIKit;
using CoreGraphics;
using CoreLocation;

using Xamarin.Forms;
using Xamarin.Forms.Maps.iOS;
using Xamarin.Forms.Platform.iOS;

[assembly:ExportRenderer( // Xamarin.Forms Dependency Injection         
  typeof(HelloXamap.HelloMap),
  typeof(HelloXamap.iOS.HelloMapRenderer))
]
public class HelloMapRenderer : MapRenderer
{
  // MapKITのマップビュー
  private MKMapView _native_map {
    get { return (this.NativeView as MapRenderer).Control as MKMapView; } }

  // アノテーション(MKAnnotationサブクラス)
  public Bike _running_bike = new Bike (
    new CLLocationCoordinate2D(35.658987, 139.702776),
    "渋谷", "City of Light");

  // とりあえずタイマーをトリガーにする
  System.Timers.Timer _timer = new System.Timers.Timer (1000.0);

  public HelloMapRenderer():base(){

    _timer.Elapsed +=  (
      object sender,
      System.Timers.ElapsedEventArgs ev
    ) =>  {
      // 位置変更(北東に斜めに移動)
      _running_bike.SetCoordinate (new CLLocationCoordinate2D (
        _running_bike.Coordinate.Latitude + 0.001,
        _running_bike.Coordinate.Longitude + 0.001));

      BeginInvokeOnMainThread(delegate {  // UIの命令を呼ぶおまじない
        // 選択 & 解除　すると再描画される模様
        _native_map.SelectAnnotation(_running_bike, true);
        _native_map.DeselectAnnotation(_running_bike,true);
      });

    };
    _timer.Enabled = true;
    _timer.Start ();
  }
}
~~~
エクセルシート名の禁則文字を削除する

エクセルシート名には、命名規則がありまして、

Excel2003で空文字のシート名をつけようとするとダイアログが表示されて、
文字列長の制約と、下記禁則文字の仕様が表示される。

>・入力した名前に次の文字が含まれていないことを確認します: コロン(:)、円記号(\)、スラッシュ(/)、疑問符(?)、アスタリスク(*)、左角かっこ([)、右角かっこ(])

ネット上の公式な情報は下記URLくらいの様子？

> [XL2003]シート名に関する仕様および制限について
https://support.microsoft.com/ja-jp/kb/436482

* 禁則文字の全角文字もだめなんだそうだ。


以下、禁則文字を正規表現で削除するコードについて数種言語の実装をメモしておく。
※文字列長についてのチェックはしないです
※あと、ブック内で一意になるチェックとかも実際には要ると思う


## とりあえず正規表現

```regex
[:\\?\[\]/*：￥＼？［］／＊]
```
* 「履歴」というマジック的な禁止文字もあるらしいが、それは無視



## vb（.net）でエクセルシート名の禁則文字を削除する

```vbnet:ExcelSheetNameRegexSample.vb
Module Module1
    ReadOnly SheetNameForbiddenRegex As New System.Text.RegularExpressions.Regex("[:\\?\[\]/*：￥＼？［］／＊]")

    Sub Main()

        Dim origSheetName = "prefix<:\?[]/*：￥＼？［］／＊>suffix"

        Dim okSheetName = SheetNameForbiddenRegex.Replace(origSheetName, "")

        Console.WriteLine(okSheetName) 'prefix<>suffix

    End Sub

End Module
```
vbはエスケープシーケンス的なものが（他言語より）特殊なので、正規表現をそのまま書ける。


## C#でエクセルシート名の禁則文字を削除する

```csharp:ExcelSheetNameRegexSample.cs
using System;
using System.Text.RegularExpressions;

namespace ExcelSheetNameRegexSample
{
    class Program
    {
        static readonly Regex SheetNameForbiddenRegex = new Regex("[:\\\\?\\[\\]\\/*：￥＼？［］／＊]");

        static void Main(string[] args)
        {
            var origSheetName = "prefix<:\\?[]/*：￥＼？［］／＊>suffix";

            var okSheetName = SheetNameForbiddenRegex.Replace(origSheetName, "");

            Console.WriteLine(okSheetName); //prefix<>suffix

        }
    }
}
```

## javaでエクセルシート名の禁則文字を削除する

```java:ExcelSheetNameRegexSample.java
package sample;

import java.util.regex.Pattern;

public class ExcelSheetNameRegexSample {
	static final Pattern SHEET_NAME_FORBIDDEN_PATTERN = Pattern.compile("[:\\\\?\\[\\]\\/*：￥＼？［］／＊]");

	public static void main(String[] args) {
		String origSheetName = "prefix<:\\?[]/*：￥＼？［］／＊>suffix";

		String okSheetName = SHEET_NAME_FORBIDDEN_PATTERN.matcher(origSheetName).replaceAll("");

		System.out.println(okSheetName); //prefix<>suffix
	}
}

```

## rubyでエクセルシート名の禁則文字を削除する

```ruby:sheet_name_forbidden_regexp.rb

SHEET_NAME_FORBIDDEN_REGEXP = Regexp.new("[:\\\\?\\[\\]\\/*：￥＼？［］／＊]")

orig_sheet_name = 'prefix<:\?[]/*：￥＼？［］／＊>suffix'
ok_sheet_name = orig_sheet_name.gsub(SHEET_NAME_FORBIDDEN_REGEXP, '')

puts ok_sheet_name #prefix<>suffix

```
USBシリアルケーブル > 変換名人 > USB-RS232 > CentOSで認識した

```txt:動作確認
CentOS 6.5
```

近場で以下のUSBシリアル変換ケーブルを購入した。

- TFTEC JAPAN 変換名人
- 型番: USB-RS232
- 店頭価格 : 990円 (税抜き)

CentOS6.5に接続したら、以下のように認識した。

```
$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 004: ID 0e0f:0008 VMware, Inc. 
Bus 002 Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
```

接続後、`/dev/ttyUSB0`として認識した。

VE488(980円)は送料(500円)＋代引き手数料(?円)がかかる。
こちら(USB-RS232)は990円+電車代。
電子工作 > 欲しい > USB接続 / OLED / 16文字2行表示 / sysfsのようなもの

こういうのが欲しい。

- 対応OS: linux
- 形状はUSBメモリスティック
- OLEDか同等の文字表示機能がある (16文字 x 2行)
- SPIでもI2Cでもなく、USBマスストレージのような認識 
- linuxのGPIOのように、ファイルを作成したら、その文字列が表示される ([gpio/sysfs.txt](https://www.kernel.org/doc/Documentation/gpio/sysfs.txt))

line monitor作成に関してRPi2でIPアドレス表示用の物を物色して思いついた。


こういうのがある。形状はUSBメモリではないが、使い勝手はどうだろうか?
http://www.elefine.jp/SHOP/LCDLCB.html

<hr>
(追記 2016/03/04)
[OLEDモジュール（128x32/I2C）](http://www.aitendo.com/product/7276)
Hinemosトラブルシューティング


## [概要]

自分がこれまで、Hinemosで出会ったトラブルの対応方法をまとめます。
ちょっとでも、助けになればと思います。

## [事前準備]
Hinemos環境が整っていること

## [作業内容]

# トラブル1

## カスタム監視が使えない
カスタム監視とは、自分の作ったシェルとかコマンドの返り値を監視する機能

リポジトリのエージェントを確認し、Hinemosマネージャとエージェントの疎通を確認する。
このようにインストールしているはずなのに、いくらたっても表示されないし、矢印の更新ボタンを押しても表示されない
![Hinemos_クライアント_と_Hinemosトラブルシューティング.png](https://qiita-image-store.s3.amazonaws.com/0/43231/7f4833d9-d0a5-4739-f500-af528629a6b3.png "Hinemos_クライアント_と_Hinemosトラブルシューティング.png")


この場合は、HinemosマネージャとHinemosエージェント間で疎通ができていないということ
おそらくエージェントのインストール時に下記のようなコマンドでインストールしていないのが原因

```bash
HINEMOS_MANAGER=[マネージャサーバのホスト名またはIPアドレス] rpm -ivh hinemos-agent-5.0.x-1.el.noarch.rpm
```

## 対応方法
```bash
vi /opt/hinemos_agent/conf/Agent.properties
```

```/opt/hinemos_agent/conf/Agent.properties
### マネージャのIPを指定してあげるとおそらく繋がるようになる
(変更前)managerAddress=http://127.0.0.1:8081/HinemosWS/
(変更後)managerAddress=http://[マネージャサーバのホスト名またはIPアドレス]:8081/HinemosWS/
```



# トラブル2
トラブル1の対応をしたのに、表示されない

この場合は、リポジトリのノードを追加する際に入力が間違っていたため起こる
snmpを使った「Search」を使った場合は、おそらく問題はなく、て入力するときにおこりやすい。

ノードのプロパティのホスト名とIPが各コマンドの結果と同じかどうか
赤いカッコのところと、コマンドの結果が同じかどうか確認
![Hinemos_クライアント.png](https://qiita-image-store.s3.amazonaws.com/0/43231/63ac68fb-5b9c-8ad6-5d06-9c475fd44fdf.png "Hinemos_クライアント.png")

```bash
$ hostname
hinemos

$ ip a または ipconfig
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:00:1a:4a:59:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.172.12/24 brd 192.168.172.255 scope global dynamic eth0
       valid_lft 14204sec preferred_lft 14204sec
    inet6 2408:210:9320:8200:200:1aff:fe4a:5900/64 scope global dynamic
       valid_lft 2591925sec preferred_lft 604725sec
    inet6 fe80::200:1aff:fe4a:5900/64 scope link
       valid_lft forever preferred_lft forever 
```

この場合は、`192.168.172.12`と同じかどうか
## [事後確認・作業]

時間がって解消されたかどうか確認
Xamarin.Forms: iOSでアノテーションのドラッグドロップ


## Xamarin.Forms でマップを定義

~~~csharp
using System;
using Xamarin.Forms;
using Xamarin.Forms.Maps;

namespace HelloXamap
{
	public class HelloMap : Map
	...
}
~~~

## カスタムレンダラ定義

- iOS用のカスタムレンダラ

~~~csharp
[assembly:ExportRenderer(
	typeof(HelloXamap.HelloMap),
	typeof(HelloXamap.iOS.HelloMapRenderer))]

namespace HelloXamap.iOS
{
	public class HelloMapRenderer : MapRenderer
	{
		private MKMapView _native_map {
			get { return (this.NativeView as MapRenderer).Control as MKMapView; } }

  }
~~~  

## アノテーション

~~~csharp
using System;

using MapKit;
using CoreLocation;


namespace HelloXamap.iOS
{
	public class Bike : MKAnnotation{
	....
}
~~~

## カスタムレンダラでアノテーションを追加

~~~csharp
public class HelloMapRenderer : MapRenderer {
	protected override void OnElementChanged (ElementChangedEventArgs<View> e)
	{
			var location = new CLLocationCoordinate2D(35.658987, 139.702776);
			var bike = new Bike(location, "Shibuya", "City of Light");

			// 追加
			_native_map.AddAnnotation(bike);

			// 追加されたら、ドラッグ可能にする。
			// この時点でドラッグドロップのUI処理は勝手にやってくれます
			_native_map.DidAddAnnotationViews += (
					object sender,
					MKMapViewAnnotationEventArgs ae
			) => {
				foreach(var v in ae.Views){
					v.Draggable=true;
				}
			};

			// ドラッグイベントの検知
			_native_map.ChangedDragState += (
				object cs,
				MKMapViewDragStateEventArgs ce
			) => {
					if(ce.NewState == MKAnnotationViewDragState.Starting ){
							Console.WriteLine("dragging.....");
							return ;
					}
					if(ce.NewState == MKAnnotationViewDragState.Ending){
							Console.WriteLine("draged!!!!!");
							return ;
					}
			};
			//.....
	}
}
~~~
Web application  security 対策のまとめ

web セキュリティ対策について、忘れずにメッモします。
#出力に関するセキュリティ対策
## SQLインジェクション
● 静的プレースホルダ:「準備された文(Prepared Statement)」, データベースエンジン側がバインド処理します。
● 動的プレースホルダ : パラメータのバインド処理はアプリケーション側のライブラリ内で実行する。セキュリティの観点では、プレースホルダを用いたバインド処理によってパラメータの値の埋め込み。
● 他の: ストアドプロシージャ, すべてのユーザからの入力をエスケープ

## クロスサイト・スクリプティング(xss)
●　レスポンス内でHTMLタグなど要素をエスケープしてまたはダブルクォートで囲む、ファイルをダウンロードさせないように。
●　HTTP レスポンスヘッダ: Content- typeに文字コード(charset) を指定する。

## コマンドインジェクション
パラメータによって悪意なコマンドを実行する。
● OSコマンドがある関数を使わないことをチェックする。

## メールヘッダ・インジェクション
## HTTPヘッダ・インジェクション
## データ
パスワード やクレジットカード番号、個人情報、プライ バシー情報等は出力に不必要な重要情報が出ないか、キャッシュされないか、ソルトのハッシュ化し保存するか、input要素のautocomplete属性に”off”を 指定するか、オートコンプリートを無効化するか。
パラメータの取り扱いはGETメソッドを用いず,必ずPOSTで送信する。

## ログ
セキュリティインシデント発生時調査が行います。しかし、情報が詳しいすぎるとログファイルはセキュリティー問題になってしまうこともそれがあります。
## フィッシング
# 入力に関するセキュリティ対策
## 入力チェック
不正な文字エンコーディングをエラーにする。
力値チェックは必ずサーバ側でチェックする。
アップロードファイルの拡張子、サイズ、ヘッダ情報をチェックする。

# 処理（ロージク）に関するセキュリティ対策
## クロスサイト・リクエスト・フォージェリ(CSRF)
Cookie
Basic認証
クライアント認証
POSTメソッドでアクセスする
秘密情報にhiddenパラメータ」を挿入する。
ケースよりユーザを再認証する
## セッション管理
セッションidはユーザより区別する。
セッションidの長さは128bit以上指定する。
セッションはPOSTでhiddenパラメータに指定する。
要件よりセッション有効期限を設定する。
セッションが終了するとき、ログアウトを提供する。
## アクセス制御
機能により最小にアクセス制御を設定する。
## 情報の暗号
暗号アルゴリズムと鍵長を利用する。
## 脆弱性
プログラム言語より脆弱性があるコードを利用しないように。
汎用ライブラリを利用する場合は脆弱性をチェックする。


#参考
[安全なSQLの呼び出し方](http://www.ipa.go.jp/files/000017320.pdf)
[The Web Application Hacker's Handbook](https://www.amazon.com/Web-Application-Hackers-Handbook-Exploiting/dp/1118026470/ref=sr_1_4?ie=UTF8&qid=1466334011&sr=8-4&keywords=web+security)
[安全なWebアプリケーションの作り方](https://www.amazon.co.jp/%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6-%E5%AE%89%E5%85%A8%E3%81%AAWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%82%8B%E5%8E%9F%E7%90%86%E3%81%A8%E5%AF%BE%E7%AD%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E5%BE%B3%E4%B8%B8-%E6%B5%A9/dp/4797361190/ref=sr_1_1?ie=UTF8&qid=1466334279&sr=8-1&keywords=web+%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3)
角丸で枠線のUIButtonを作る

角丸で枠線なUIButtonを作る場合、画像をBackgroudImageかImageを設定することになるのだが、たかが角丸な枠線のボタンのために画像を作るのは手間がかかる。
または、コード内で

```objc
button.layer.cornerRadius = 2.0;
button.layer.borderWidth = [UIColor BlackColor];
button.borderWidth = 1.0;
```
と指定してもいいのだが、毎回やるのは手間がかかるし、Storyboard上での見た目と違ってくる。

そこで、角丸で枠線のボタンが簡単に作れるUIButtonのサブクラスを作る。
このように@interfaceの前にIB_DESIGNABLE、@propertyにIBInspectable を指定すれば Storyboard上でも思った通りに表示される。

```objc:BorderButton.h
#import <UIKit/UIKit.h>

IB_DESIGNABLE
@interface BorderButton : UIButton

@property (nonatomic) IBInspectable CGFloat cornerRadius;
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;

@end
```

```objc:BorderButton.m
#import "BorderButton.h"

@implementation BorderButton

- (void)drawRect:(CGRect)rect
{
    self.layer.cornerRadius = self.cornerRadius;
    self.layer.borderColor = self.borderColor.CGColor;
    self.layer.borderWidth = self.borderWidth;
    
    [super drawRect:rect];
}

@end
```

ストーリーボードでクラスを指定すると
![class指定.png](https://qiita-image-store.s3.amazonaws.com/0/2885/edb45770-5676-2bc1-8cda-505d81d7dca1.png)

追加したパラメーターが表示されるようになるので、これを指定すると
![パラメーター.png](https://qiita-image-store.s3.amazonaws.com/0/2885/a8c67141-40cb-fa44-e518-e42d3b6fe329.png)

思った通りの見た目で表示されます。
![見た目.png](https://qiita-image-store.s3.amazonaws.com/0/2885/8b3640c2-d87c-15a0-ca07-bef7036f21c4.png)



こちらを参考にしました
http://qiita.com/Kta-M/items/ae22fd0c78cb15faee0b
https://developer.apple.com/library/ios/recipes/xcode_help-IB_objects_media/Chapters/CreatingaLiveViewofaCustomObject.html
東プレRealForce > Mac上で漢字変換できるようにする設定

http://qiita.com/7of9/items/943f76c67385ec5fb2cc
にて設定したRealForce + KeyRemap4Macbookだが、漢字変換への切替がどうも動かない。

以下の設定で動いた。

1. MacOSX+RealForceというプロファイルを新たに作成
2. Change Key > For Japanese > Change Command_L Key > Use Command_L as KANA/EISUU (toggle)

これでWindowsキーを押すと漢字変換＜ー＞英数の切替ができるようになった。

本当はWindowsキー＋`(~)で切り替えられたら他の環境に似ていいのだが、やり方がわからない。

<hr>
Ctrl+Spaceでも漢字と英数の切替ができた。google日本語入力を使用している。
しかし時々spotlightが起動する。
Eclipseの実行結果について

お世話になります。
下記文章を入力して実行したら、printf表示されずに、数値入力したら、print文が出ました。Eclipseでやってるからでしょうか？

int main(void)
{
   int suti;   //入力されたデータを入れる箱

   printf("整数の入力＞＞\n");   //入力用のメッセージ

   //キーボードから入力されたデータを整数値として変数sutiに格納
   scanf(" %d",&suti);

   //変数sutiが格納されてる値を表示
   printf("入力された値が%dです。\n",suti);

   return 0;
}


↓実行結果----------------------------------------
5
整数の入力＞＞
入力された値が5です。
$form->inputのselect自動生成とSecurityComponentのチェックについて

CakePHPを使っていて、form->inputの自動生成が原因でSecurityComponentにブロックされてしまったので解決策をメモします。

#環境
- PHP 5.3.3
- CakePHP 1.3.13


#現象
CakePHPにおいて、HTMLのformを作るときには`FormHelper`がありますが、inputのフィールド名が`_id`で終わると強制的に`type="select"`にしてくれます。

```php:view.ctp
<?= $form->create('Post');?>
...
<?= $form->input('Post.comment_id');?> <!--ここ-->
...
<?= $form->end();?>
```

```html:自動的にselectになる

...
<div class="input select">
    <label for="PostCommentId">Comment</label>
    <select name="data[Post][comment_id]" id="PostCommentId"></select>
    <!--自動的にドロップダウンリストになる！(が、optionがない。。。)-->
</div>
...
```
# 問題
しかし、強制的にドロップダウンリストになってしまう影響で、SecurityComponentを使ったときにPostデータが正しく送れなくなりました。

原因としては、ドロップダウンリストの`option`が設定されていないため、SecurityComponentのPostデータチェック（改竄検知）に引っかかっていました。

# 解決策
inputのフィールド名が`_id`で終わっている項目に関して、`type`を直接指定することで正しくデータ送信ができました。

今回は`type="text"`を表示したかったので`'type'=>'text'`を記述します。

```php:new_view.ctp
<?= $form->create('Post');?>
...
<?= $form->input('Post.comment_id', $options => array('type' => 'text'));?> <!--今回はtype="text"を表示させたい-->
...
<?= $form->end();?>
```

```html:textを指定した結果
...
<input name="data[Post][comment_id]" type="text" id="PostCommentId"><!--正しくデータ送信できた。-->
...
```

これで正しくデータが送信されました。

# 振り返って
今回、フィールド名が`_id`で終わると自動的にドロップダウンリストを出力するのを初めて知りました。
しかし、基本`type`は指定したほうが良いと感じました。

# 参考資料
- [[CakePHP2] FormHelper::input(‘foo_id’)はアソシエーションの有無に関わらずドロップダウンになる](http://kanonji.info/blog/2014/01/30/cakephp2-formhelperinputfoo_id%E3%81%AF%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%9C%89%E7%84%A1%E3%81%AB%E9%96%A2%E3%82%8F%E3%82%89%E3%81%9A/)
- [極める！Security Component (CakePHP Advent Calendar 2010 24日目)](http://www.akiyan.com/blog/archives/2010/12/security-component-cakephp-advent-calendar-2010.html)
PHP:listを使って配列の順番を任意に入れ替える

タイトルの通りですが一応説明

```php
// これを
$x = ['PHP', 'Ruby', 'Perl'];

// こうしたい
$x = ['PHP', 'Perl', 'Ruby'];
```
普通にやってみます。

```php
// まともに入れ替える
$temp = $x[1];
$x[1] = $x[2];
$x[2] = $temp;

var_dump($x);
```
正しい結果になります。が、3つ以上任意に並べかえるのは辛いですね。

```
array(3) {
  [0]=>
  string(3) "PHP"
  [1]=>
  string(4) "Perl"
  [2]=>
  string(4) "Ruby"
}
```

もう少しなんとかならんのかなということで、`list()`を使ってみます。

```php
list($x[0], $x[2], $x[1]) = $x;
```

すると…！？

```
array(3) {
  [0] =>
  string(3) "PHP"
  [1] =>
  string(4) "Perl"
  [2] =>
  string(4) "Perl"
}
```

予想外の結果になってしまいます。

`list()`の説明ページ （ http://php.net/manual/ja/function.list.php ） を読んでみると丁寧に警告が出されていました。


>警告
PHP 5 では、list()は、最も右のパラメータから値を代入します。


なるほど…ん？ **"PHP5"** では？

>PHP 7 では、list()は、最も**"左"**のパラメータから値を代入します。

えっ。

```php
//PHP 7.0.0RC6
list($x[0], $x[2], $x[1]) = $x;
```

```
array(3) {
  [0] =>
  string(3) "PHP"
  [1] =>
  string(4) "Ruby"
  [2] =>
  string(4) "Ruby"
}
```

挙動がまるで違う罠ですね。ということなので、右辺に直接`$x`を渡すようなことはしないほうが賢明です。以下なら、どちらでも動きますね。


```php
list($x[0], $x[1], $x[2]) = [$x[0], $x[2], $x[1]];
// または
list($x[0], $x[2], $x[1]) = $x + [];
```

```
// PHP5, PHP7どちらでも同じ結果
array(3) {
  [0] =>
  string(3) "PHP"
  [1] =>
  string(4) "Perl"
  [2] =>
  string(4) "Ruby"
}
```

結局、わかりづらいので`list()`は使わない方がいいかも…。
他の言語にもある書き方で下のようにできたらいいんですが。

```php
// PHPではこういう書き方ができない
$x[0], $x[1], $x[2] = $x[0], $x[2], $x[1];
# => PHP Parse error:  syntax error, unexpected ','
```

あまりいい方法が思いつきませんでしたが、メモとして残しておきます。
tmuxでmouse関連のオプションが変更されていた


# 概要
tmuxを起動したら以下の様なエラーが出ていた。

```
/Users/izuku/.tmux.conf:9: unknown option: mode-mouse
/Users/izuku/.tmux.conf:10: unknown option: mouse-select-pane
/Users/izuku/.tmux.conf:11: unknown option: mouse-resize-pane
/Users/izuku/.tmux.conf:12: unknown option: mouse-select-window
```

どうやらtmux2.1でmouse関連のoptionが統合されたようだ。

# 解決方法
以下のオプションを追加すると良い。

```
set -g mouse on
```

他の端末でもこのtmux.confを使っているので両方の設定を使えるようにしておく。

```
if-shell "[[`tmux -V` == *2.0*]] || [[`tmux -V` == *1.*]]" "set-window-option -g mode-mouse on; set -g mouse-select-pane on; set -g mouse-resize-pane on; set -g mouse-select-window on;"
if-shell "[[`tmux -V` == *2.1* ]]" "set -g mouse on"
```

バージョンあがったら修正が必要だな。もう少し上手い事しないとダメそうだが、とりあえずはこれで動く！

# バグ?
スクロールなどは上手く動くのだが、paneのselectがmouseで出来ない。追加の設定がいるのだろうか？

[追記]
スクロールも上手くいっていない！
ペインを分割していると両方のペインが動いてしまう。
だめだこりゃ。誰か助けて。
C# > 参照型（クラス）のリストと配列の初期化と列挙

最近、参照型（クラス）の初期化とLinqや拡張メソッドを使った列挙について勉強しています。
これはその成果。
いや～、いろいろな方のブログを拝見し、やっと書けるようになりましたよ～(笑)。
ちなみにQiitaには祝初投稿!
ForEachメソッドは、ArrayにはStaticメソッドとして実装されてるんですね。

```Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication8
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> intList = new List<int>() { 1, 2, 3 };
            List<Employee> employees = new List<Employee>()
            {
                new Employee {Id = 1, Name = "ジョン" },
                new Employee {Id = 2, Name = "ジャック" }
            };
            Employee[] employees2 = new Employee[]
            {
                new Employee {Id = 3, Name = "ジョアンナ" },
                new Employee {Id = 4, Name = "ジュリア" }
            };

            foreach (var item in intList)
            {
                Console.WriteLine($"item={item}");
            }

            employees.ForEach(o => Console.WriteLine($"Id={o.Id}, Name={o.Name}"));

            employees2.ForEach(o => Console.WriteLine($"Id={o.Id}, Name={o.Name}"));
            // 拡張メソッドを定義しない場合はこちら
            //Array.ForEach(employees2, o => Console.WriteLine($"Id={o.Id}, Name={o.Name}"));

            Console.WriteLine("\n\nPush any key!");
            Console.ReadKey();
        }
    }
}
```
```Employee.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication8
{
    public class Employee
    {
        public int Id { set; get; }
        public string Name { set; get; }
    }
}
```
```ArrayExtension.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication8
{
    public static class ArrayExtension
    {

        public static void ForEach<T>(this T[] employees, Action<T> action)
        {
            Array.ForEach(employees, action);
        }
    }
}
```
#実行結果
item=1
item=2
item=3
Id=1, Name=ジョン
Id=2, Name=ジャック
Id=3, Name=ジョアンナ
Id=4, Name=ジュリア


Push any key!
Windows Nano Serverをvagrantで動かしてみた

## 起動方法

```bash:
vagrant plugin install winrm
vagrant plugin install winrm-fs
vagrant init mwrock/WindowsNano; vagrant up --provider virtualbox
```

![nano1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/60132bb2-1410-f66a-a1f7-b1c5559ad248.png)

* user: vagrant
* domain: 空欄
* Password: vagrant

![nano2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a7a6a84f-2d5b-50aa-1b1d-0205d84be17d.png)

* ここからは powershell での接続になるのかな。

## エラー

```text:
vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'mwrock/WindowsNano' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 5985 => 55985 (adapter 1)
    default: 5986 => 55986 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: WinRM address: 127.0.0.1:55985
    default: WinRM username: vagrant
    default: WinRM transport: plaintext
An error occurred executing a remote WinRM command.

Shell: powershell
Command: hostname
if ($?) { exit 0 } else { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }
Message: [WSMAN ERROR CODE: 2150859072]: <f:WSManFault Code='2150859072' Machine='127.0.0.1' xmlns:f='http://schemas.microsoft.com/wbem/wsman/1/wsmanfault'><f:Message><f:ProviderFault path='%systemroot%\system32\winrscmd.dll' provider='Shell cmd plugin'>The WinRS client cannot process the request. The server cannot set Code Page. You may want to use the CHCP command to change the client Code Page to 437 and receive the results in English. </f:ProviderFault></f:Message></f:WSManFault>
```
MSYS2でpacman -Suしたらtmuxが動かなくなった

http://sourceforge.net/p/msys2/discussion/general/thread/c3d22705/#9bcb で言ってる通りに、

```
$ cd /var/cache/pacman/pkg/
$ pacman -U tmux-git-2.0.198.g9a0ce98-1-x86_64.pkg.tar.xz
```

でいったんダウングレードして回避。
ELBでルートドメインを登録する


## 結論

Route 53 に CNAME で登録して Ailas を設定する流れ。そして ELB に EIP を
設定するのはダメなんだってことを知った。

> 注: LoadBalancer に関連付けられた IP アドレスのセットは時間が経過すると変わる可能性があるため、特定の IP アドレスを指定した "A" レコードを作成しないでください。ロードバランサーに対して Elastic Load Balancing サービスが生成した DNS 名の代わりに、わかりやすい DNS 名を使用する場合、LoadBalancer DNS 名に対する CNAME レコードを作成するか、Amazon Route 53 を使用してホストゾーンを作成します。詳細については、「[Elastic Load Balancing でのドメイン名の使用](https://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/using-domain-names-with-elb.html?console_help=true)」を参照してください。

- [Amazon Elastic Load Balancer on a root Domain (Route53) | Lisenet.com :: Linux | Security | Networking](https://www.lisenet.com/2014/amazon-elastic-load-balancer-on-a-root-domain-route53/)
- [営業でも簡単！Route 53の基本設定 « サーバーワークス エンジニアブログ](http://blog.serverworks.co.jp/tech/2013/03/08/route53_basic/)