OmniAICreator/Qiita-1.07M huggingface dataset:
シンボリックリンクの使い方と落とし穴

仕事でシンボリックリンクを使っているので、その覚書です。

この記事はあくまで「使い方」についての話です。
詳しい仕組みなどは他の解説されているサイトをご覧ください。

# シンボリックリンクとは？
簡単に言うとショートカットのようなもので、とあるフォルダやファイルのリンクを保持しているものです。

ショートカットとの大きな違いは、シンボリックリンクを辿った際のパスです。

例として、以下のフォルダ構成を挙げます。
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/7ff4388c-148e-7a35-8594-6a75129fc3fb.png)

アイコンは一緒ですが、**symlink がシンボリックリンク、shortcut がショートカット**です。
両方共 **C:\linksrc** フォルダへのリンクを持っています。

この時、ショートカットを使うと...
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/7125fa1b-de48-a50a-c807-af17c070d1df.png)

アドレスバーは **C:\linksrc** と表示されています。

次に、シンボリックリンクを使うと...
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/e713a9dd-5edd-27d5-2fbd-7c473b0ddecd.png)

なんと、アドレスバーは **D:\Workspace\link\symlink** を指しています。

これがショートカットとシンボリックリンクの大きな違いです。
シンボリックリンクの場合は、シンボリックリンクから辿ったパスを使ってリンク先に対してアクセスすることができます。
もちろん、コマンドラインからも同様にアクセスすることができます。

詳しい説明は[こちら](http://www.atmarkit.co.jp/ait/articles/1306/07/news111.html)を記事をご覧ください。

# シンボリックリンクの使い道
このシンボリックリンクですが、バッチファイルを使う場合に重宝します。
例として、以下の様なディレクトリ構成を挙げます。
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/e78190b6-0e2c-686a-3aec-376baaff360f.png)

そして、Resource はバッチファイルで参照されているとします。

この時...

* Resource フォルダを SSD に持っていって高速化を図りたい！！
* けど、人によっては SSD が増設されていないので、そういった人はこのままのディレクトリ構成にしておきたい。

このような要望があった場合、どう解決するか？
それは、シンボリックリンクを使えば簡単に解決できます。

* SSD を持っている人は、Resource フォルダをシンボリックリンクにして、リンク先を SSD に移動させた Resource フォルダにする。
* SSD を持っていない人は、そのまま。

こうすることで、バッチファイルを修正することなくこの要望に対応することができます。

# シンボリックリンクの落とし穴
このように便利に見えるシンボリックリンクですが、一つだけ落とし穴があります。
それは...

**ファイルダイアログを使ってシンボリックリンクをたどると、リンク元のパスになってしまう！**

ということです。

例として、先ほどの **C:\linksrc** のシンボリックリンクを挙げます。
このシンボリックリンクをペイントの「開く」ダイアログで辿ってみます。
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/37e498ae-504a-d3d3-4ea0-0c8fddc0873c.png)

エクスプローラでは、symlink に入ると **D:\Workspace\link\symlink** を指していましたが、ペイントの「開く」ダイアログで辿ると...
![image](https://qiita-image-store.s3.amazonaws.com/0/43814/8c4075b4-40dc-2a5b-ede4-f3ad8223894d.png)

なんと、 **C:\linksrc** を指してしまいました！

この場合、ダイアログから帰ってくるパスも **C:\linksrc～** になってしまうので、シンボリックリンクを使う意味がなくなってしまいます。

# ジャンクションを使って、落とし穴を回避する
では、この落とし穴をどうやって回避するか？

答えは**「ジャンクションを使う」**です。

ジャンクションとは、シンボリックリンクと同じ性質を持つ仕組みで、ファイルダイアログを使ってもジャンクションを介したパスが問題なく取得できます。

ただし、シンボリックリンクと比べて、ジャンクションのほうが機能的には劣っています。
具体的には以下のとおりです。

* 指定できるリンク先はフォルダのみ。
* ネットワーク上の共有フォルダなど、ローカルでないフォルダはリンク先に指定できない。
* リンク先に相対パスを指定しても、絶対パスに置換されて設定される。

もし、これらが問題になるのであれば、ジャンクションは使えません。

先の **C:\linksrc** へのシンボリックリンクの問題はこれらの違いを無視できますので、ジャンクションを使って解決することができました。

ジャンクションの詳しい説明は[こちら](http://www.atmarkit.co.jp/ait/articles/1306/07/news111.html)を記事をご覧ください。
getsを使って安全に入力を得る

一般に、C言語で`gets`を使うことは危険だと言われています。

危険なコードは書きたくないが、万が一課題などでどうしても`gets`を使わなければならないとしたら、どうすればいいでしょうか？

使えばいいのです。あくまで標準ライブラリの`gets`関数が危険なのであって、`gets`というトークン自体には何の危険性もありません。

以下に`gets`を使ったサンプルコードを示します。

```C:use_gets.c
#include <stdio.h>

/* 行を読み込んだら真、読み込めなかったら偽を返す */
int read_line(char *b, size_t s) {
    size_t gets = 0;
    if (s == 0) return 0; /* バッファが0バイトしかなかったら、読み込めない */
    for (;;) {
        int c = getchar();
        if (c == EOF) {
            b[gets] = '\0';
            return gets > 0; /* 1文字以上入力していたら有効な入力、0文字なら入力なしと判定する */
        } else if (c == '\n') {
            b[gets] = '\0';
            return 1;
        } else {
            b[gets++] = (char)c;
            if (gets + 1 >= s) {
                /* バッファがいっぱいになるので、その場で読み込みを打ち切る */
                b[gets] = '\0';
                return 1;
            }
        }
    }
}

int main(void) {
    char line[20];
    int count = 1;
    while (read_line(line, sizeof(line))) {
        printf("%d: %s\n", count++, line);
    }
    return 0;
}
```

入力例

```
0123456789012345678901234567890
abcdefg
hijklmnopqrstuvw
xyz
```

この入力例に対する出力

```
1: 0123456789012345678
2: 901234567890
3: abcdefg
4: hijklmnopqrstuvw
5: xyz
```

出力の内容はともかく、きちんとバッファオーバーランが回避できています。
Chrome Devtoolのconsole.インスタンスあれこれ

# ショートカットキー
https://developers.google.com/web/tools/chrome-devtools/iterate/inspect-styles/shortcuts
https://developers.google.com/web/tools/chrome-devtools/debug/command-line/command-line-reference


| Win/Linux| 挙動 |
| ------------ | --------- |
| Ctrl+Shift+I/F12 | そもそも開く/閉じる |
| Ctrl+Shift+C| 要素選択待機状態で開く|
|Ctrl+Shift+J|コンソールタブで開く|
|Ctrl+\] or Ctrl+\[ |左のor右のパネル|
|Ctrl+L(コンソールで)|コンソールクリア|

# コンソールで使える予約語
| コマンド | 説明 |
| --- | --- |
|\$_ or \$0 | Elementパネルで最後に選んだ要素|
|\$1～\$4|Elementパネルで1つ～4つ前に選択した要素|
|\$(query)|document.querySelector|
|\$\$(query)|document.querySelectorAll|
|console.debug<br>log<br>info<br>warn<br>error| ![](https://qiita-image-store.s3.amazonaws.com/0/5825/341b8f20-f3a9-b133-9d1a-f3edef9595fb.png)|
|console.dir(element)|DOM要素をDOMオブジェクトとして表示する|
|console.group(label)～<br>console.groupEnd()|グループで表示する|
|console.time(label)～<br>console.timeEnd()|経過時間を表示する|
|console.profile(label)～<br>console.profileEnd()|jsのプロファイルを表示する|
|console.getEventListeners(Element)|要素のイベントリスナを取得|
|console.monitor(func)|指定の関数が呼び出された時にログ表示|
|console.monitoeRvents(element,event)|条件付きでeventログ表示|
|console.clear()|コンソールをクリアする|
|console.count()|回数をカウントする|
|console.trace()|スタックトレース表示|

# console.logで使えるフォーマット
| フォーマット文字 | 意味 |
| --- | ---- |
|%s|文字として出力|
|%d or %i|数値として出力|
|%f|小数として出力|
|%o|DOMエレメントとして出力|
|%O|JSオブジェクトとして出力|
|%c|CSSで出力|
gtags.vimのGtagsCursorで、1件しか関数定義がないなら、quickfix-windowを開かないようにする

まずは、globalと、gtags.vimとをインストールする。

``` bash
$ yaourt -S global vim # 試していないが、UbuntuなどのDebian系なら、sudo apt-get install vim globalでうまく行くはず。
$ midir -p ~/.vim/plugin
$ cp /usr/share/gtags/gtags.vim ~/.vim/plugin
```

そして、~/.vimrcに以下のように書く。

```vim:~/.vimrc
function! GtagsCursor_()
  execute "GtagsCursor"

  if (len(getqflist()) <= 1)
    cclose
  endif
endfunction
nnoremap <C-j> :call GtagsCursor_()<CR>
```
もちろん、&lt;C-j&gt;以外のキーに割り当ててもよい。
yumでインストールしたパッケージを取り消す


本番環境のセキュリティ対策でパッケージの更新をすることがある。このときもし、問題が起きてパッケージを元に戻したいとしたときにどのようにすればいいか調べた。

例えば

```bash
$ sudo yum install screen
```

`yum`を使ってパッケージをインストールするとその実行履歴が記録される。

```bash
$ sudo yum history
読み込んだプラグイン:fastestmirror
ID     | ログイン ユーザー        | 日時             | 操作           | 変更
-------------------------------------------------------------------------------
     4 |  <vagrant>               | 2015-11-09 00:26 | Install        |    1
     3 | root <root>              | 2015-05-21 23:06 | Install        |   96
     2 | root <root>              | 2015-05-21 23:02 | I, U           |   39
     1 | システム <未設定>        | 2015-05-21 22:48 | Install        |  296
history list
```

実行履歴は`yum history`で確認できる。

インストールを元に戻すには

```bash
$ sudo yum history undo 4
読み込んだプラグイン:fastestmirror
Undoing transaction 4, from Mon Nov  9 00:26:17 2015
    インストール screen-4.1.0-0.19.20120314git3c2946.el7.x86_64 @base
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ screen.x86_64 0:4.1.0-0.19.20120314git3c2946.el7 を 削除
--> 依存性解決を終了しました。

依存性を解決しました

========================================================================================================================
 Package               アーキテクチャー      バージョン                                      リポジトリー          容量
========================================================================================================================
削除中:
 screen                x86_64                4.1.0-0.19.20120314git3c2946.el7                @base                914 k

トランザクションの要約
========================================================================================================================
削除  1 パッケージ

インストール容量: 914 k
上記の処理を行います。よろしいでしょうか？ [y/N]
```

`yum history undo`に履歴IDを指定して実行すると、指定したIDの履歴の逆を行う。

なお、この実行履歴も記録される。

```bash
$ sudo yum history
読み込んだプラグイン:fastestmirror
ID     | ログイン ユーザー        | 日時             | 操作           | 変更
-------------------------------------------------------------------------------
     5 |  <vagrant>               | 2015-11-09 00:26 | Erase          |    1
     4 |  <vagrant>               | 2015-11-09 00:26 | Install        |    1
     3 | root <root>              | 2015-05-21 23:06 | Install        |   96
     2 | root <root>              | 2015-05-21 23:02 | I, U           |   39
     1 | システム <未設定>        | 2015-05-21 22:48 | Install        |  296
history list
```

参考
====

- [How to use yum history to roll back an update in Red Hat Enterprise Linux 6 , 7? - Red Hat Customer Portal](https://access.redhat.com/node/64069)
Google Play services v8.3のDataApiでデータが直ぐに同期されなくなった


11/5 にGoogle Play services 8.3がリリースされました。

* [What’s new in Google Play services 8.3](http://android-developers.blogspot.jp/2015/11/whats-new-in-google-play-services-83.html)

このバージョンアップでは、既存のAndroid Wearアプリに影響がある変更がありました。

> Finally, if you are developing for wearables, you’ll know that battery life and optimization of power usage are critical in having a great user experience. With Google Play services 8.3, we’ve updated the DataApi to allow for urgency in how data items are synced. Now, a priority can be added to the data item to determine when it should be synced. For example, if you are building an app that requires immediate syncing, such as a remote control app, it can still be done immediately by calling setUrgent(), but for something such as updating your contacts, you could tolerate some delay. Non-urgent DataItems may be delayed for up to 30 minutes, but you can expect that in most cases they will be delivered within a few minutes. Low priority is now the default, so setUrgent() is needed to obtain the previous timing.

ざっとGoogle翻訳してみると、こんな感じでしょうか。
バッテリー持ちを良くするため、DataApiを使って同期するデータのうち優先度が低いものは数分（最大30分）で同期されるようになります。デフォルトでは優先度が低くく設定されるので、すぐに同期して欲しい場合は、`setUrgent()` を呼ぶ必要がある。

個人的に開発しているAndroid Wear向けの[Twitterクライアント](https://play.google.com/store/apps/details?id=com.droibit.looking)では、すぐにデータが同期されないと困るため修正する必要がありました。

バックグラウンドで同期するようなタイプのアプリでは、数分の遅延は気にならないと思いますので、修正しなくても問題ないと思います（バッテリーにも優しいでしょうし）。

## 対応方法

対応方法とても簡単で、`PutDataRequest.setUrgent()` を呼ぶだけです。
（主にスマートフォン側になるかと思います。）

```java
PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(PATH);

// 同期するデータの設定

PutDataRequest request = putDataMapRequest.asPutDataRequest();
// ↓これを呼ぶ！
request.setUrgent();

// データを同期する
Wearable.DataApi.putDataItem(mApiClient, request);

```

このように1行追加するだけですぐに同期されるようになります。
即時性が求められるアプリで v8.3以上を使用の際にはこの設定を追加するようにしましょう。
R言語でHadoop Streaming

Hadoop Streamingという技術を使ってR言語で並列分散処理をやって見たメモです。

# Hadoop Streamingとは
Hadoopの分散処理フレームワークMapReduceは基本的にJavaで記述して実行します。でも「Javaやだー」という人も安心、他言語で動かすことができる仕組みが提供されています。
MapReduceフーレムワークでは名前の通りMap処理とReduce処理が順に実行されるわけですが、そのデータのやり取りを標準入出力でやれば何の言語で書いてもいいじゃん！というのがHadoopStreamingです。

# ビッグデータとR言語
「ビッグデータ」とか「データマイニング」というキーワードとともにHadoopが登場することがよくあります。巨大データを効率よく処理しようというのがHadoopなのでまぁ当然です。
で、Hadoopと同様にR言語が取り上げられることがあります。データを分析する、という観点だとR言語が強いです。でもR言語って巨大データを扱うには秀でていないです。基本的にメモリー上にデータ読み込んで集計や分析を行うので、ビッグデータだとメモリーがパンクします。
それじゃぁ、HadoopStreamingで分散＆R言語で分析したらいいかも、というのが今回の動機です。

# 定番のワードカウント
ワードカウントの概要だけ。

```
Is this a pen?
No, this is a Map-Reduce.
```

のような訳の分からない英単語があった場合に

```
this,2
a,2
pen,1
・・・
```

のように単語ごとに出現回数をカウントする、というものです。

## Map処理

```bash
#!/usr/local/bin/Rscript
 
con = file(description="stdin",open="r")
 
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) {
  str<-unlist(strsplit(line," "))
  for(word in str){
    cat(sprintf("%s\t%s\r\n", word, 1),sep="")
  }
}
close(con)
```
標準入力から受け取り、標準出力に出力しています。
出力する際はタブ区切りでKeyとValueを指定しますが、今回はKeyを単語にし、Valueは数字の"1"にしています。
そうするとReduceには単語ごとに"1"が流れてくるので、合計すればOKという仕組みです。

## Reduce処理

```bash
#!/usr/local/bin/Rscript
 
con = file(description="stdin",open="r")
 
key<-""; key.old<-""; cnt<-0;
 
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) {
  str<-unlist(strsplit(line,"\t"))
  key<-str[1]
  v<-as.numeric(str[2])
 
  if(key!=key.old && cnt!=0){
    cat(sprintf("%s\t%s\n", key.old, cnt),sep="")
    cnt<-1
  }else{
    cnt<-cnt+v
  }
  key.old<-key
}
close(con)
if(cnt!=0){
  cat(sprintf("%s\t%s\n", key.old, cnt),sep="")
}
```
もう少しスマートに書けそうな気もしますが、Reduceはこんな感じです。Map処理の後はソートが走るのでKeyが変わるタイミングで出力しています。
ネット上のサンプルではHashMapや連想配列のようにKey-Valueで情報を保管できる仕組みに入れてカウントしているものも見かけますが、以下の理由からあまり好きじゃないです。

- ソートされた順番が崩れる
- ストリームなデータの処理なのでできるだけデータを溜めたくない

まぁやりたい処理次第ですが。

## 実行
Hadoop1.2.1で実行した例です。

```bash
hadoop jar /usr/share/hadoop/contrib/streaming/hadoop-streaming-1.2.1.jar \
-file map.R \ #読み込むファイルを列挙します
-file reduce.R \
-input /stream/input/input \ #HDFS上の入力パス指定
-output /stream/out/ \ #HDFS上の出力パス指定
-mapper map.R \ #Map処理として動かすプログラム指定
-reducer reduce.R #Reduce処理として動かすプログラム指定
```
プログラムの動作確認したい場合は以下のようにすると楽です。

```bash
cat input | Rscript map.R | sort | Rscript reduce.R
```

# 感想
正直、R言語でやるメリットがあまり感じられませんでした。
上記の通り、R言語が本領発揮するのはある程度データを読み込んだ状態で豊富な統計・分析機能を行うような場面なので、MapReduce上で実現しようと思うとそれなりにきっちり考えて作らないといけない印象。
それならデータの分割＆前処理はHadoop⇒その後R、で十分かなと。
しかしJavaに比べてテキスト周りの処理などは手軽にできるので、その点は良いですね。

…次HadoopStreamingするならPythonかな。
位置情報取得 swift2.0


- swift >= 2.0
- Deployment Target == 9.1

> corelocation.framework をLinked
info.plistに NSLocationAlwaysUsageDescription:String(アプリの説明文) を追加

```swift:ViewController.swift
import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

  var lm: CLLocationManager! = nil
  
  override func viewDidLoad() {
    super.viewDidLoad()

    lm = CLLocationManager()
    lm.delegate = self
    
    lm.requestAlwaysAuthorization()
    lm.desiredAccuracy = kCLLocationAccuracyBest
    lm.distanceFilter = 300
    lm.startUpdatingLocation()
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }

  /** 位置情報取得 成功 */
  func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation){
    
    print("緯度："+String(newLocation.coordinate.latitude))
    print("経度："+String(newLocation.coordinate.longitude))
  }
  
  /** 位置情報取得 失敗 */
  func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    print("Error")
  }
}
```
RaspberryPiで遊んでみたーその4 ScanSnapをWebから操作するための操作ページを作る


いよいよ仕上げです
操作ページは簡単なものにしていますが、もっと作りこんでもいいなーと思っています
コードは参考程度にどうぞ

#raspiscan.phpとindex.htmlの作成

以下のファイルを/usr/share/nginx/www/raspiscan/下に置く

```php:raspiscan.php
if($_GET["duplex"] != null) {
    $duplex = ($_GET["duplex"] == "0")? "ADF Front" : "ADF Duplex";
}

if($_GET["color"] != null) {
    $color = ($_GET["color"] == "0")? "Gray" : "Color";
}

if($_GET["location"] != null) {
    if($_GET["location"] == "ne-ne") {
        $location = "ne-ne";
    } else if($_GET["location"] == "chibi") {
        $location = "chibi";
    } else {
        $location = "other";
    }
}
?>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html">
<head lang="ja">
    <meta charset="UTF-8">
    <title>おてがみポスト</title>

</head>
<body>
<?php $result = shell_exec("sudo /home/raspiscan/raspiscan.sh \"$duplex\" $color $location"); ?>
<p><?php echo $result; ?></p>
<p><a href="index.html">もどる</a></p>
</body>
```

```html:index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html">
<head lang="ja">
    <meta charset="UTF-8">
    <title>おてがみポスト</title>

</head>
<body>
    <h1>えらんでね</h1>
    <span id="test"></span>
    <div id="main">
        <form action="raspiscan.php" method="get">
            <ul id="selectDuplexPrint">
                <li><input type="radio" name="duplex" value="0" checked="checked">かためん</li>
                <li><input type="radio" name="duplex" value="1">りょうめん</li>
            </ul>
            <ul id="selectColorMode">
                <li><input type="radio" name="color" value="0" checked="checked">しろくろ</li>
                <li><input type="radio" name="color" value="1">カラー</li>
            </ul>
            <ul id="selectSaveLocation">
                <li><input type="radio" name="location" value="ne-ne">おねえちゃん</li>
                <li><input type="radio" name="location" value="chibi">ちび</li>
            </ul>
            <input type="submit" value="スキャン">
        </form>
    </div>
</body>
</html>
```

#raspiscan.shを書き換える

/home/raspiscan/raspiscan.shを以下のように書き換える

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

SOURCE=$1
MODE=$2
LOCATION=$3

TMPDIR=/home/raspiscan/tmp
FILENAME=scan-`date "+%Y%m%d-%H%M%S"`

/bin/mkdir -p $TMPDIR
cd $TMPDIR

/usr/bin/scanimage --batch --source "$SOURCE" --mode $MODE --resolution=190 --y-resolution=190 --format=tiff

convert -compress JPEG -quality 85 -adjoin `ls -1 *.tif | sort -t t -k 2 -n` out.pdf

dropbox_uploader.sh upload /home/raspiscan/tmp/out.pdf $LOCATION/$FILENAME.pdf

rm -Rf $TMPDIR
```

参考サイト：
SANEのコマンドオプションなど
[SANE Scanner Access Now Easy](http://www.sane-project.org/man/sane-fujitsu.5.html)
org-modeからpdfに出力する時エラーが出た


## エラーの内容

org-modeからpdfに変換する時、

```
mapcar: Symbol's value as variable is void: compile
```

という感じでエラーが出た。


## 対処

org-modeをアップデートしましょう。あっという間に治されてた。。。

## 参考

https://lists.gnu.org/archive/html/emacs-orgmode/2015-10/msg00021.html

## 教訓

edebugでエラー箇所を特定してみたりすげー悩んでしまった。
自分で調べるのもいいけどググッてみよう。
ワークスペース指定でEclipseを起動する

Eclipseのワークスペースは、複数プロジェクトに共通のJDKや
コーディング静的解析ツール(CheckStyleやFindBugs)、
パースペクティブなどを管理、設定できます。
例えば、下記のように目的別にワークスペースを分けて設定することで、
ソースコードを効率的に管理することが可能です。

* 最新trunkではJDK1.8でビルドし、保守用ブランチではJDK1.7でビルドする
* 仕事用とプライベートで設定を分ける
* ....etc

ワークスペースの切り替えは、
Eclipse起動後のメニュー「ワークスペースの切り替え」から行えますが、
Eclipse起動時のオプション指定でも行えます。
目的別にワークスペースを整理できているのであれば、
Eclipseのメニュー操作の手間なくワークスペースを切り替えられる
Eclipse起動時のオプション指定をお勧めします。

## 動作環境
* Windows
* Eclipse 4.4.2 (Luna SR2)

## ワークスペース指定方法

```DOS
eclipse.exe -data ${workspace.dir}
```
ワークスペースがC://opt/src/trunkの場合は次のように指定します。

```DOS
eclipse.exe -data C://opt/src/trunk
```

## まとめ
* Eclipseのワークスペースは、プロジェクト共通設定を別々に管理できます。
* ワークスペースの切り替えは、Eclipse起動時のオプション指定がお勧めです。
* ワークスペースは「-data」オプションで指定します。
C言語でのMD5に関する覚書

#MD5について
・ハッシュキーは128bit
・暗号学的ハッシュ関数の１つ
・ファイルの破損チェックなどでよく使われている。
・現在(2015年)ではハッシュの衝突耐性の弱さからセキュリティ性が重視されるシステムでは使用非推奨である。

#C言語でMD5実装

1.OpenSSLライブラリの利用
>参考
>[MD5 hash functions - OpenSSL](https://www.openssl.org/docs/manmaster/crypto/md5.html)

2.RFC 1321ドキュメントに公開されたソースコードの利用
>参考
>[MD5 メッセージダイジェストアルゴリズム](http://srgia.com/docs/rfc1321j.html)
>[MD5のパフォーマンスに関する報告](http://srgia.com/docs/rfc1810j.html)
CakePHP で SQLSTATE[HY000]: General error: 8 attempt to write a readonly database と言われる解決方法

CakePHP3のディレクトリをブラウザからみたところエラーがでました。

# readonly database とエラーがでる

```
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
```
<img width="1014" alt="スクリーンショット 2015-11-08 23.55.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/d96310dd-3ed5-1a20-650d-f3938040f409.png">


# debug_kit.sqliteのpermissionを変える

```
chmod 777 app/tmp/debug_kit.sqlite
```

# ブラウザを更新
表示が直りました(☝ ՞ਊ ՞)
<img width="1002" alt="スクリーンショット 2015-11-08 22.51.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/b99fa00d-5de5-946b-50e9-a96f565d6ce7.png">
MongoDB の基本まとめ

#MongoDBとは
- ドキュメント志向のDBシステム
- MySQL等のRDBMSとは違い、NoSQLという分類
- NoSQLはあらかじめデータ構造を決めておく必要がない（スキーマレスという）
- 公式サイトhttps://www.mongodb.org/

#MongoDBのインストール
https://docs.mongodb.org/manual/
InstallationからOSを選択するとインストール方法が表示されます。

#MongoDBの用語
- Collection:RDBで言うtable
- Document:RDBでいうレコード
- Field:RDBでいうkey

#MongoDBの操作
MongoDBへのアクセス

```
$ mongo
```

データベース一覧表示

```
> show dbs
```

使用するデータベース(mydb)への切り替え&新規データベース作成

```
> use mydb
```

コレクションの作成
※MongoDBはコレクションが作られてからでないとデータベースが認識されないので注意！

```
> db.createCollection("users")
```

今使っているデータベースの情報を確認する

```
> db.stats();
```

今使っているデータベースを削除する

```
> db.dropDatabase();
```

MongoDBの操作を終了する

```
> exit
```
NYAGOSとconemuでキーボード操作の拡張

[Windows用コマンドラインシェル「NYAGOS」](https://github.com/zetamatta/nyagos)を使い始めたのですが、カーソルキーを多用する私の使い方だと、若干操作に悩ましい部分があったので、拡張してみました。

## やりたいこと
+ コマンドラインで１単語単位で左右に移動したい
+ 上記を「CTRL+←」、「CTRL+→」で実現したい
+ NYAGOS単体ではなくて、[conemu](https://conemu.github.io/)から動かすことを想定

## 参考にした解説記事
+ [ConEmu + nyagos で Windows ターミナル環境を作る](http://qiita.com/1000k/items/4a2f9419b19fdc9ed5f4)
+ [2015年版ぼくがかんがえたさいきょうのWindowsターミナル+シェル構成](http://blog.aotak.me/post/111270565911/strongest-terminal-for-win-2015)
+ [ようやく ConEmu と NYAGOS を導入した](http://text.baldanders.info/remark/2015/conemu-and-nyagos/)

## NYAGOSのマニュアルを見る
+ Lua拡張ができるとのことで、何ができるかを確認したところ、一文字単位の左右移動はLua側からできるようです。
+ 単語単位の情報は引数として渡ってきていないっぽいので、現在位置と動かしたい位置までを一文字ずつ移動させる手段が簡単そうです。文字列が多くなると重くなるかもしれませんが。
+ もう一つ問題は、バインド可能なキーの組み合わせが少なくて、CTRL＋矢印とかバインドできないことです。これは後でconemu側でフックさせます。

## NYAGOSでLua拡張
+ 左に動かす（戻る方向）は、現在位置から文字列を逆向きに調べて、最初に見つけたスペースまで移動できればいいのですが、Luaはrfind（逆向きサーチ）がなくて、まずそこで詰まりました。
+ [stackoverflow先生](http://stackoverflow.com/questions/17386792/how-to-implement-string-rfind-in-lua)によると、最長マッチでやりたいことができるよ！とのことで、なるほどと思いました。
+ 正規表現で()とすると、その位置をindex番号で戻すというのはLuaの仕様なんですね。
+ 右に動かす（進む方向）は簡単で、そのままfind使えばいけました。
+ スペースがない場合は、最初か最後まで進むことにしています。
+ バインドキーの割当は、私が使わないであろうキーとして「M_A(ALT+A)」,「M_B(ALT+B)」に割り当てています。

```lua:wordmove.lua
-- ref) http://stackoverflow.com/questions/17386792/how-to-implement-string-rfind-in-lua
nyagos.bindkey("M_A",
    function(this)
        local pos = (this.text:sub(1,this.pos-1)):match'.*() '
        if pos and (pos < this.pos) then
            for i = 1, this.pos-pos do
                this:call("BACKWARD_CHAR")
            end
        else
            this:call("BEGINNING_OF_LINE")
        end
        return nil
    end
)

nyagos.bindkey("M_B",
    function(this)
        local pos = this.text:find(' ',this.pos+1)
        if pos and (pos > this.pos) then
            for i = 1, pos-this.pos do
                this:call("FORWARD_CHAR")
            end
        else
            this:call("END_OF_LINE")
        end
        return nil
    end
)
```

## conemuでHotkeyマクロを使う
+ conemuのHotKeyを使えばNYAGOSで割り当てたバインドキーを、別のキーアサインで実現することができます。
+ conemuの「Keys & Macro」で、空いているところ（Macro01とか）にHotkeyを割り当てます。
+ Hotkeyを`ctrl+LEFT`として、GUI Macroに、`Keys("!a")`とします。`!a`=ALT+AでNYAGOSだと`M_A`に相当します。
+ Hotkeyを`ctrl+RIGHT`として、GUI Macroに、`Keys("!b")`とします。`!b`=ALT+BでNYAGOSだと`M_B`に相当します。
+ これで、conemuから「ctrl+←」と入力すると、ALT+AがNYAGOSに送られて、設定したバインドキーで動作するという流れになります。

![2015-11-08_224750.png](https://qiita-image-store.s3.amazonaws.com/0/32778/91775226-41f0-f913-61f8-04437b2203c5.png)
line monitor > コア部分 > RS-232C受信 > RS-232C送信 / UDP送信

```txt:動作確認
RS-232C送信 : Windows8.1 pro + TeraTerm [CR+LF送信設定済み]
RS-232C受信 / UDP送信 : RaspberyPi2 + raspbian
UDP受信 : CentOS 6.5 (32bit)
```

http://qiita.com/7of9/items/028556c5a819a6a8de96
でやりたいことを書いた。そのコア部分は以下で実装できたと思う。

```151108b2.py
import serial
import time
import socket

def main():
	print "Hello"
	dstip = "192.168.10.8"
	dstport = 6000
	sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
	con1=serial.Serial('/dev/ttyUSB1', 9600, timeout=10)
	con2=serial.Serial('/dev/ttyUSB0', 9600, timeout=10)

	str1=con1.readline()
	print "rcvd=", str1
	sock.sendto(str1, (dstip, dstport))
	con2.write(str1);
        	

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

RPi2上で以下を実行してから、Windows8.1のTeraTermで`linemonitor<CR><LF>`を送信してみた。

```
pi@raspberrypi ~/lineMonitor $ python -u 151108b2.py 
Hello
rcvd= linemonitor
```

こうすることで、RS-232C受信した文字列はRS-232C送信され、UDP送信もされる。
つまり、RS-232Cのリレー処理をしながら、その送受信文字列をモニターできる。

UDP受信側の様子は以下の通り。`linemonitor`の文字が受信できている。

```
# tcpdump -A -n udp portrange 6000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
22:44:27.881942 IP 192.168.10.5.38422 > 192.168.10.8.6000: UDP, length 9
E..%..@.@.....
...
....p..DLfrom RPi2.........
22:55:22.255909 IP 192.168.10.5.49532 > 192.168.10.8.6000: UDP, length 13
E..)z.@.@.*...
...
..|.p...Tlinemonitor
.....
```

##課題
今の実装では、ttyUSB1からの受信しかリレーできていない。ttyUSB0からの受信も処理するようにしないといけない。
ノンブロッキング処理をすることになるのだろうか。
Ruby on RailsチュートリアルのCIにwercker使いたい


Rails勉強中です。いつもお世話になっている[Ruby on Rails チュートリアル](http://railstutorial.jp/)で、CI使ったこと無いので勉強のために[wercker](http://wercker.com/)設定してみました。

色々参考にさせて頂き、とりあえずテストが動いてHerokuにデプロイするところまではたどり着いたのでいったんメモします。

* Ruby 2.2.0
* Rails 4.2.4
* PostgreSQL
* Bitbucket
* Heroku

# Deploy Target

今回Deploy先にHerokuを指定したかったけど (na) がついていて何故選択できないのかわからずハマってしまいました。

![wercker.png](https://qiita-image-store.s3.amazonaws.com/0/25059/7e9b02a1-1150-97d9-1705-74f7df723012.png "wercker.png")

custom deploy でデプロイできる事は分かったので、以下の環境変数とwercker.ymlファイルを設定し、取り急ぎ動くところまでは確認できました・・・

## 環境変数

wercker側で設定した環境変数(Deploy Targetの環境変数で追加しました)
なんか無駄なとこある気がする・・・

| 変数名 | 値 |
|:-----------|:------------|
| HEROKU_APP_NAME | Herokuアプリ名 |
| HEROKU_KEY | HerokuのAPI Key |
| HEROKU_USER | Herokuのユーザ名 |
| HEROKU_KEY_PAIR | SSH Keypairを選択してKeyを作成 → Herokuに登録 |


参考：http://devcenter.wercker.com/quickstarts/deployment/heroku.html

## wercker.yml

Todo:よくわからずに書いている所が多いので、調べてアップデート

```ruby:wercker.yml
box: ruby:2.2.0
services:
  - id: postgres
    env:
      POSTGRES_PASSWORD: $DATABASE_PASSWORD
build:
    steps:
        - bundle-install
        - rails-database-yml:
            service: postgresql-docker
        - script:
            name: db:schema:load
            code: RAILS_ENV=test bin/rake db:schema:load
        - script:
            name: minitest
            code: bundle exec rake test
deploy:
  steps:
    - heroku-deploy:
        key: $HEROKU_KEY
        key-name: HEROKU_KEY_PAIR
        user: $HEROKU_USER
        app-name: $HEROKU_APP_NAME

```
RPi2 / python > UDP送信

```txt:動作確認
送信側: RaspberryPi2 + raspbian
受信側: CentOS 6.5 (32bit) [IP: 192.168.10.8]
```

RPi2からpythonスクリプトでUDPポートでの送信をして、受信確認をCentOSでする。

RPi2のpythonスクリプトは以下。

参考 https://wiki.python.org/moin/UdpCommunication

```151108c.py
import socket

dstip = "192.168.10.8"
dstport = 6000
message = "from RPi2"

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(message, (dstip, dstport))
```

CentOS側の受信結果。

```
# tcpdump -A -n udp portrange 6000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
22:44:27.881942 IP 192.168.10.5.38422 > 192.168.10.8.6000: UDP, length 9
E..%..@.@.....
...
....p..DLfrom RPi2.........
```

`from RPi2`という文字列が受信できている。
composer install で the requested PHP extension intl is missing from your system と言われる解決方法

環境はMacです。

`composer install`できなくて困りました。

```
composer install
Loading composer repositories with package information
Installing dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - cakephp/cakephp 3.2.x-dev requires ext-intl * -> the requested PHP extension intl is missing from your system.
    - cakephp/cakephp 3.1.4 requires ext-intl * -> the requested PHP extension intl is missing from your system.
    - cakephp/cakephp 3.1.3 requires ext-intl * -> the requested PHP extension intl is missing from your system.
    - cakephp/cakephp 3.1.2 requires ext-intl * -> the requested PHP extension intl is missing from your system.
    - cakephp/cakephp 3.1.1 requires ext-intl * -> the requested PHP extension intl is missing from your system.
    - cakephp/cakephp 3.1.0-beta2 requires ext-intl * -> the requested PHP extension intl is missing from your system.
    - cakephp/cakephp 3.1.0-beta requires ext-intl * -> the requested PHP extension intl is missing from your system.
    - cakephp/cakephp 3.1.0-RC1 requires ext-intl * -> the requested PHP extension intl is missing from your system.
    - cakephp/cakephp 3.1.0 requires ext-intl * -> the requested PHP extension intl is missing from your system.
    - Installation request for cakephp/cakephp ~3.1 -> satisfiable by cakephp/cakephp[3.1.0, 3.1.0-RC1, 3.1.0-beta, 3.1.0-beta2, 3.1.1, 3.1.2, 3.1.3, 3.1.4, 3.2.x-dev].
```

# php56-intlをインストールします。
brewでphpをいれていたのでphp56-intlを入れます。

```
brew install php56-intl
```

# 再度composer install

```
composer install
```
今度はうまくいきました(☝ ՞ਊ ՞)☝

# 参考
http://qiita.com/pugiemonn/items/c83f5ce318a634e60e4f
http://qiita.com/ykirishima/items/646844d462ea39af0c69
再ビルドせずに設定を変える方法(iOS/Android)


ビルドしたiOSアプリやAndroidアプリの設定を少しだけ変えたいことは結構あったりします。
そこで再ビルドせずに設定をかえる方法をまとめてみました。

# iOSアプリの場合
## 事前準備
以下のものを用意する。

 - 対象となるipaファイル
    - 仮にtarget.ipaとする。
 - BundleIdentifierをかえる場合は、変更後のProvisioningProfile
   - 仮にtarget.mobileprovisionとする。

## 手順
#### 1) ipaファイルを展開する
```
unzip target.ipa
```

展開するとPayloadディレクトリができ、ディレクトリ内にappファイルが出来ている。


#### 2) appファイルを開く
 - 「パッケージの内容を表示」を選択。
 - 変更したい設定を変える。
    - info.plist内の値を変更することが一般的かと思う。


#### 3) entitlements.plistを用意する
```
codesign -d --entitlements - target.app
```
上記のコマンドをたたくと以下の様な値が表示されるので、必要な箇所のみ変更する。

```entitlements.plistの例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>application-identifier</key>
    <string>[アプリのappId]</string>
    <key>com.apple.developer.team-identifier</key>
    <string>[あなたのTeamID]</string>
    <key>get-task-allow</key>
    <true/>
    <key>keychain-access-groups</key>
    <array>
        <string>[アプリのappId]</string>
    </array>
</dict>
</plist>
```

[]で囲まれた箇所を変更する必要があれば変える。
※BundleIdentifierを変更する場合は、[アプリのappId]を変更する必要がある。


### [追加事項] BundleIdentifierを変更する場合
BundleIdentifierを変更する場合は、以下もおこなう。

#### 1) _Codesignatureディレクトリを削除する。

```
rm -r Payload/target.app/_Codesignature
```

#### 2) appファイル内にあるInfo.plistからBundle identifierを更新する。

```
appファイルを 「パッケージの内容を表示」から中身を見て、Info.plistを書きかえる。
```

#### 3) Provisioning Profileを新しいBundleIdentifierに合致するものに更新する。

```
cp target.mobileprovision sample.app/embedded.mobileprovision
```


### 4) 再署名

```
codesign -f -s "証明書の名前" --entitlements entitlements.plist $(PWD)/sample.app
```

証明書の名前は、キーチェーンアクセスから確認することが出来る(例：iPhone Developer: 名前(XXXXXX))。


### 5) appファイルからipaファイルを生成

```
xcrun -sdk iphoneos PackageApplication target.app -o $(PWD)/new.ipa
```




# Androidアプリの場合
## 事前準備
 - apktool
   - apktoolのダウンロードや詳細は[別サイト](http://ibotpeaches.github.io/Apktool/documentation/)を参照のこと。
 - 対象となるapkファイル
   - 仮にtarget.apkとする。

## 手順

### 1) デコード
```
apktool d target.apk
```

デコードが終わると、targetディレクトリが出来ています。

[補足]
デコードがうまくいかない場合は、framework.apkが古い場合がある。
その時は、Android端末を接続し以下のコマンドをおこない再度デコードをする。

```
adb pull /system/framework/framework-res.apk
apktool if framework-res.apk
```


### 2) ファイルの変更
変更したい箇所を変更する。
packagenameを変えたい場合は、「AndroidManifest.xml」から値を変更する。


### 3) ビルド
```
apktool b target
```

何も指定しないとtargetディレクトリのdistディレクトリにapkファイルが生成される。

### 4) 再署名
apkファイルが出来たら以下のコマンドで再署名をおこなう。

```
jarsigner -sigalg MD5withRSA -digestalg SHA1 -verbose -signedjar <署名後のapk名> -keystore <キーストアファイルへのパス> <署名前のapk名> <キーストアのエイリアス>
```
GitHubにssh接続できるようにする


## [概要]
GitHubのアカウントを作成したので、自身のMacBook Proからssh接続できるように公開鍵設定を行う。

### 公開鍵とは
公開鍵と秘密鍵の2つを用意して、通信を行う。
公開鍵は、暗号化するためだけに使うので、人にバレても通信の中身がバレることはない。
復号化するには、秘密鍵でしかできない。
* 公開鍵：暗号化するのに使用(中身がバレても影響は、ほぼなし）
* 秘密鍵：復号するのに使用（中身がバレるとかなりやばいので、絶対外部に漏らしてはいけない）

* 参考サイト
	- [お前らのSSH Keysの作り方は間違っている](http://qiita.com/suthio/items/2760e4cff0e185fe2db9)
	- [Generating SSH keys](https://help.github.com/articles/generating-ssh-keys/)

## [事前準備]
GitHubのアカウントは作っておくこと。

## [作業内容]
### 鍵作成
セキュリティを考えて、暗号化強度を強く暗号化強度を4096にして作成しています。
[お前らのSSH Keysの作り方は間違っている](http://qiita.com/suthio/items/2760e4cff0e185fe2db9)と公式ドキュメントに乗っ取り、パスワードも設定しておきます。

```bash
$ ssh-keygen -t rsa -b 4096 -C "hogehoge@fuga.com"
# -t 暗号化方式を指定
# -b 暗号化強度を指定
# -C コメントを設定 

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ts/.ssh/id_rsa): /Users/ts/.ssh/id_rsa_github # 秘密鍵の名前を指定
Enter passphrase (empty for no passphrase):  #パスワードを入力
Enter same passphrase again:  # もう一度入力
Your identification has been saved in id_rsa_github.
Your public key has been saved in id_rsa_github.pub.
```

### 作成できたファイルを確認
```bash
$ ls -l ~/.ssh
-rw-------  1 ts  staff   938  9 15 22:53 config
-rw-------  1 ts  staff  3326 11  8 21:52 id_rsa_github # 秘密鍵
-rw-r--r--  1 ts  staff   757 11  8 21:52 id_rsa_github.pub # 公開鍵
```

### GitHubに公開鍵を設定する
#### Githubにログインして、Settingsに移動
![GitHub.png](https://qiita-image-store.s3.amazonaws.com/0/43231/6fc8c7f2-deb2-6eb1-f9e9-38d7d1ac2786.png "GitHub.png")

#### SSH Keysを選択
![Your_Profile.png](https://qiita-image-store.s3.amazonaws.com/0/43231/11eba4fd-42d0-50a8-52c2-510de142b971.png "Your_Profile.png")

#### Add SSH keyを選択
![SSH_keys.png](https://qiita-image-store.s3.amazonaws.com/0/43231/8989894a-e61c-844c-3b60-016ca4d3e6c9.png "SSH_keys.png")

### 公開鍵をGitHubに登録する
* Title
	* 自分がわかりやすい名前を設定
* Key
	* 作成した公開鍵をコピペとかで貼り付ける
![SSH_keys.png](https://qiita-image-store.s3.amazonaws.com/0/43231/4091f011-d6a6-7891-5f4e-3399ac222aef.png "SSH_keys.png")
入力したら「Add Key」
パスワード入力が求められるので入力する。

### config設定
```bash
$ vim ~/.ssh/config
```

下記を追記

```bash
Host github
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_github #秘密鍵を指定
  User git
```

### 権限を修正する

```bash
$ chmod 600 ~/.ssh/config
```

### 秘密鍵をssh-agentに登録する

```bash
### ssh-agentが動作しているか確認
$ eval "$(ssh-agent -s)"
Agent pid 32047
# 動いていることが確認できました。

$ ssh-add ~/.ssh/id_rsa_github
Enter passphrase for /Users/ts/.ssh/id_rsa_github: # 鍵のpassword入力
Identity added: /Users/ts/.ssh/id_rsa_github (/Users/ts/.ssh/id_rsa_github)
```

## [事後確認・作業]

接続確認をしてみる
下記のように出れば、接続はできています。

```bash
$ ssh -T git@github.com
Hi mackerel7! You've successfully authenticated, but GitHub does not provide shell access.
```
MySQL と MariaDBの プリペアドステートメント　バインドパラメーターがSQL関数だった時の挙動の違い

MariaDBとMySQLの初期設定(mysql.conf)の違いかもしれないが、ハマったのでメモ

プリペアードステートメントのバインドパラメーターにnow()などの関数を渡した場合
MySQLは実行でき、MariaDBは実行できないという珍現象に遭遇


## プリペアードステートメント

```sql
SELECT h.follower, h.updated_at
      from twitter_status_histories as h,
      (SELECT id FROM bases WHERE twitter_account = 'usagi_anime' order by id desc limit 1) b
       where h.bases_id = b.id AND h.updated_at < ? order by h.updated_at desc limit 100
```
## 実際のクエリ

```sql
SELECT h.follower, h.updated_at
      from twitter_status_histories as h,
      (SELECT id FROM bases WHERE twitter_account = 'usagi_anime' order by id desc limit 1) b
       where h.bases_id = b.id AND h.updated_at < 'now()' order by h.updated_at desc limit 100
```

## MySQL 5.6 結果

```
follower	updated_at
51345	2014-09-23 18:53:27
50606	2014-09-14 14:55:02
50607	2014-09-14 14:50:04
46350	2014-08-11 16:44:05
```


## MariaDB 5.5.37 結果

```
Empty set, 1 warning (0.00 sec)
```

nowのクオーテーションをはずすと

```sql
SELECT h.follower, h.updated_at
      from twitter_status_histories as h,
      (SELECT id FROM bases WHERE twitter_account = 'usagi_anime' order by id desc limit 1) b
       where h.bases_id = b.id AND h.updated_at < now() order by h.updated_at desc limit 100
```

結果

```
|   133727 | 2015-11-07 12:00:06 |
|   133717 | 2015-11-07 11:30:07 |
|   133707 | 2015-11-07 11:00:07 |
|   133701 | 2015-11-07 10:30:06 |
```



うーんこの・・
linux / udp > 受信文字列を表示したい > tcpdump -A -n udp portrange 6000

http://qiita.com/7of9/items/22a93d7162f314b976a3
においてUDP通信の受信をした時、受信文字数は分かるが実際の受信文字列は表示されない。

受信文字列を表示したい。

```txt:動作確認
送信側: RaspberryPi2 + raspbian
受信側: CentOS 6.5 32bit (IP: 192.168.10.8)
```

root権限で受信側(CentOS)で以下を実行しておく。

```
# tcpdump -A -n udp portrange 6000
```

送信側(RPi2)で以下を実行する。

```
$ echo "TEST" | nc -u 192.168.10.8 6000
```

以下が受信側の実行結果。

```
# tcpdump -A -n udp portrange 6000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
22:33:10.814334 IP 192.168.10.5.35111 > 192.168.10.8.6000: UDP, length 5
E..!..@.@..~..
...
.ETEST
.............
```

余計な文字列があるが、`TEST`が受信されている様子が見られた。
ApacheとTomcatの連携

#目的
##なんのためにアパッチと連携するのか
・負荷分散のため
　静的なHTML 画像を高速なApache　動的なコンテンツをTomcatで処理する
・ApacheのWebサーバとしての広い機能を使いたい
・\<IPアドレス>：８０８０　というようにポート番号をそのまま見せたくない
というような理由がある。


#環境
CentOS6
Tomcat8
Apache/2.2.15 

#手順

Apache設定ファイルへ移動
```
[root@tk2-237-28065 init.d]# vi /etc/httpd/conf.d/proxy_ajp.conf
```
以下をproxy_ajp.confへ追記
```
ProxyPass /tomcat/ ajp://<IPアドレス>:8009/
ProxyPass /examples/ ajp://<IPアドレス>:8009/examples/
```

設定を再読み込みする
```
[root@tk2-237-28065 init.d]# /etc/rc.d/init.d/httpd reload
```

以上で、以下のようにポート番号なしでアクセス可能となる。
http:// \<IPアドレス>/tomcat/

#参考
http://centossrv.com/tomcat6.shtml
http://itmemo.net-luck.com/linux-centos-tomcat-install/
http://d.hatena.ne.jp/nemunemu10/20110914/1316016268
http://blogs.yahoo.co.jp/dk521123/33549956.html
RPi2 / python > USBシリアル受信 > 受信タイムアウトが起きてしまう > TeraTermの送信設定がCRだった。 CR+LFに変更した

```txt:動作確認
受信側: RaspberryPi2 + raspbian
送信側: Windows8.1 + TeraTerm
USBシリアルケーブル VE488 x 2本
クロス用治具 (TX-RX)
```

RPi2側では以下のpythonスクリプトを実行。

```151108b.py
import serial
import time

def main():
	print "Hello"
	con1=serial.Serial('/dev/ttyUSB1', 9600, timeout=10)

	str1=con1.readline()
	print "rcvd=", str1

if __name__ == '__main__':
```

以下を実行。
Windows8.1のTeraTerm側で"kkkkkkk<CR><LF>"を送信するのだが、RPi2側は何故か10秒の受信タイムアウトが起きてからprintを実行する。

```
pi@raspberrypi ~/lineMonitor $ python -u 151108b.py 
Hello
rcvd= kkkkkkkk
```

`<CR><LF>`がきちんと受信できてないのだろうか?
要調査。

##解決

TeraTerm側の設定の問題だった。送信設定が`CR`になっていて、`LF`を受信待ちのRPiが受信タイムアウトになっていた。

TeraTermの設定を以下のようにする。

1. [設定]-[端末]を選択
2. 改行コード枠にある「送信(M)」を`CR`から`CR+LF`に変更する

これで受信タイムアウトがなくなった。
Rails インストールで Xcode Command Line Tools を要求された件のまとめ

# 環境
## mac のスペック

| item | spec                 |
|:----:|:--------------------:|
| OS   | OS X El Capitan      |
| CPU  | 2.3GHz Intel Core i7 |
| mem  | 8GB 1333MHz DDR3     |

## 参考文献
* [改訂3版基礎 Ruby on Rails](http://www.amazon.co.jp/改訂3版基礎-Ruby-Rails-IMPRESS-KISO/dp/4844338153/ref=sr_1_2?ie=UTF8&qid=1446985883&sr=8-2&keywords=基礎+ruby+on+rails)

## 前提
* `rvm` がインストールされていること。
* Ruby がインストールされていること。
* 前提条件を満たすには[Ruby on Rails Tutorial](http://railstutorial.jp)が詳しい。
 * もう少し言うと、参考文献の書籍がなくてもこのチュートリアルがあれば Rails は学べるが、わかりやすさで言うとこちらの文献の方がわかりやすい。

# インストール
参考文献にある「改訂3版基礎 Ruby on Rails」の Chapter1 に従ってインストールを進めました。

## Ruby のバージョンを確認する
まずは現在インストールされている Ruby のバージョンを確認しておくこと。

```
$> rvm list

rvm rubies

   ruby-2.0.0-p643 [ x86_64 ]
   ruby-2.1.6 [ x86_64 ]
   ruby-2.1.7 [ x86_64 ]
=* ruby-2.2.1 [ x86_64 ]

# => - current
# =* - current && default
#  * - default
```

こんな感じで表示される。この場合はバージョンが 2.2.1 になっているので参考文献のバージョンと一致しているが、異なるバージョンであった場合は以下のように変更、またはインストールする。

### 変更するバージョンがインストールされていない場合
変更したいバージョンがインストールされていない場合は、まずはインストールしなくてはならない。

```
$> rvm install 2.2.1
```

### バージョンの変更
上記の方法でインストールした場合、もしくはインストール済みの他のバージョンへ変更する場合は以下の通り。

```
$> rvm use 2.2.1
```

デフォルトを変更する場合は、

```
$> rvm --default use 2.2.1
```

とする。

## Rails のインストール
本題。Rails をインストールする。

```
$> sudo gem install rails --version "4.2.1" --no-rdoc --no-ri
```

だけである。

# インストールに失敗
ここでさらなる本題。インストールに失敗することがある。

```
ERROR:  Error installing rails:
    ERROR: Failed to build gem native extension.

    /Users/********/.rvm/rubies/ruby-2.2.1/bin/ruby -r ./siteconf20151108-2928-flnwbq.rb extconf.rb
checking if the C compiler accepts ... yes
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
Building nokogiri using packaged libraries.
-----
The file "/usr/include/iconv.h" is missing in your build environment,
which means you haven't installed Xcode Command Line Tools properly.

To install Command Line Tools, try running `xcode-select --install` on
terminal and follow the instructions.  If it fails, open Xcode.app,
select from the menu "Xcode" - "Open Developer Tool" - "More Developer
Tools" to open the developer site, download the installer for your OS
version and run it.
```

うーん。

なんか Xcode の Command Line Tools がなくて何かのコンパイルで失敗しているような感じ？

## Command Line Tools を入れる
親切にコマンドまで書いてくれているので、

```
$> xcode-select --install
```

を実行すると GUI のインストーラが起動して Command Line Tools がインストールできる。この状態で先の Rails のインストールを再度実行すれば OK である。

最後に、

```
$> rails -v
Rails 4.2.1
```

とインストールしたバージョンを確認しておけば安心である。
継承したメソッドをオーバーライドさせない方法

# 序
とあるクラスを継承した時にオーバーライド不可にさせる。
今回は使い方の問題もあり、定義済みの全メソッドをオーバーライドさせない。というかしたらErrorを出すようにする。

# コード
```ruby

class ParentClass
  def self.method_added(name)
    if self == ParentClass
      return
    end
    
    if ParentClass.instance_eval { method_defined?(name) }
      remove_method(name)
      raise TypeError, "do not Override the methods."
    end
  end

  def hello
    puts "Hello World."
  end
end

class ChildClass < ParentClass
  def hello
    puts "Goodbye World."
  end
end

obj = ParentClass.new
obj.hello

obj = ChildClass.new # Error
obj.hello

```

# 解説
## method_added
これがメソッドが追加された「直後」に呼ばれるメソッド。
なので、このタイミングでメソッドがあるかどうかを検査すると、必ず「存在する」状態になります。

なので、

```ruby
if self == ParentClass
  return
end
```

で、省いています。


## instance_eval

instance_evalは渡したブロックを指定したクラスのオブジェクト内で実行するメソッドです。
なので、最終的な検査は

```rb
ParentClass.instance_eval { method_defined?(name) }
```

これでとりあえずOKっぽいです。
RとJavaScriptのちょっと似ているかもしれないところ

# 出オチ
```r
(function(){
    nanka_syori()
    # セミコロンはあってもなくてもよい
})()
```
名前空間汚染の対策としてこの書き方を見てから、RはJavaScriptと似ていると思っています。
半分は冗談なのですが、結構まじめに考えてみると、Schemeを祖先と思えば、意外と実際にそうなのかもしれません。セミコロンはあってもなくてもよいところとか。

# その他の類似点を募集中
ちょっと似ているなあと思いつつ、真面目に考えるだけの気力を持ち合わせていませんでした。。。
似ている部分をコメントに記載して頂けると、この記事が充実するという素敵な仕様になっています。
「いわれてみれば」と思った方、ちょっと考えてみませんか。逆に似てないところの指摘も歓迎します。
ベクトル演算的な、Rを使う大多数の方にとってのRの最も大きな特徴（？）の部分は、JavaScriptと全く似ていないかもしれません。
prototype(setClass)的な考え方はどうなんでしょう、この辺もまじめに調べると面白そうなのですが、まだR初心者なので自重します。
待望のneovimが0.1リリースされたのでインストールしてみた

[Release v0.1.0 · neovim/neovim](https://github.com/neovim/neovim/releases/tag/v0.1.0?utm_source=hackernewsletter&utm_medium=email&utm_term=code)

## インストール
[Installing Neovim · neovim/neovim Wiki](https://github.com/neovim/neovim/wiki/Installing-Neovim) に書いてある通りだが、詰まったのでメモ

`$ brew install neovim/neovim/neovim` で基本OK。

### エラーその1
MacPortsの残骸が残ってたのでコケた。
MacPorts アンインストールとかでググってMacPorts絡みのデータ削除

### エラーその2

```
aclocal: error: aclocal: file '/usr/local/share/aclocal/ksba.m4' does not exist
make[2]: *** [build/src/libuv-stamp/libuv-configure] Error 1
make[1]: *** [CMakeFiles/libuv.dir/all] Error 2
make: *** [all] Error 2
```

ググったら、`$ brew prune`で解決した人がいたので、やってみたら上記エラーが解消された
[Developers - brew error aclocal/ksba.m4 does not exist](https://www.bountysource.com/issues/4144405-brew-error-aclocal-ksba-m4-does-not-exist?utm_campaign=plugin&utm_content=tracker%2F461131&utm_medium=issues&utm_source=github)

### 設定

```
$ ln -s ~/.vim ~/.config/nvim
$ ln -s ~/.vimrc ~/.config/nvim/init.vim
```

### 起動

```
$ nvim
```

![スクリーンショット 2015-11-08 20.50.30.png](https://qiita-image-store.s3.amazonaws.com/0/10333/847c1e43-dee9-6de6-0c88-a29f62b2907f.png)

プラグインとか動かないと思ってたけど、意外と動いた
ちょっと使ってみようと思う
Qiita / raspberryPi > http://qiita.com/ > 無限ループになる

```txt:動作確認
RaspberryPi2 + raspbian
ブラウザ Web 3.8.2
```

##症状
ブラウザ(Webという名前?)で`http://qiita.com/`を開こうとすると`Loading "qiita.com"`の処理が無限に実行されるようだ。

結果としてRPi2からQiitaへの投稿ができない。

##対策

一度別のページを開けばよさそう。
http://qiita.com/stock
を開いて、そこから「ノウハウ・Tipsを投稿する」をクリックすればよい。
MSI内のプロパティ値を外部のスクリプトで取得する

Windows InstallerはCOMのインターフェースを持っていて、WSHでMSIファイル内のテーブルを読み込むことができます。JScriptで製品バージョンを取得してみます。

```js
var databasePath = "TestProduct.msi";
var query = "SELECT `Value` FROM `Property` WHERE Property.Property='ProductVersion'";
var msiOpenDatabaseModeReadOnly = 0;
//
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(databasePath, msiOpenDatabaseModeReadOnly);
var view = database.OpenView(query);
view.Execute();
var record = view.Fetch();
WScript.echo(record.StringData(1));
```

また、Inno SetupでもCOMを扱えるので、外部に置いたMSIファイルのバージョンを取得することができます。これはInno SetupをMSIのセットアップランチャーとして使う時に役に立つでしょう。
まず、変数を宣言し、

```pascal
var
  installer, database, view, rec: Variant;
```
下記のコードでバージョンを取得します。

```pascal
  installer := CreateOleObject('WindowsInstaller.Installer');
  database := installer.OpenDatabase('TestProduct.msi', 0);
  view := database.OpenView('SELECT `Value` FROM `Property` WHERE Property.Property=''ProductVersion''');
  view.Execute();
  rec := view.Fetch();
  MsgBox(rec.StringData(1), mbInformation, MB_OK);
```

`OpenView()`関数に与えるSQL文を変えれば、あらゆるテーブルの値を取得することができます。業務用途のために信頼性を上げるなら、例外処理を追加した方が良いです。

この関数で使えるSQL文の文法は、MSDNライブラリの「[SQL Syntax](https://msdn.microsoft.com/en-us/library/aa372021)」を、使用例は「[Examples of Database Queries Using SQL and Script](https://msdn.microsoft.com/en-us/library/aa368562(v=vs.85).aspx)」を参照してください。
指定したシートに含まれるグループ化されたオートシェイプのすべての子オブジェクトのテキストをカンマ区切りでdictionaryに格納する

```
Public Function getAutoshapeGroupItemsNameList(ByVal sheetobj As Worksheet) As Dictionary
    Dim shp As Shape
    Dim groupItems As Variant
    Dim itemsStr As String
    Set getAutoshapeGroupItemsNameList = CreateObject("Scripting.Dictionary")
    For Each shp In sheetobj.Shapes
        itemsStr = ""
        For Each groupItems In shp.groupItems
            itemsStr = itemsStr & groupItems.TextEffect.Text & ","
        Next groupItems
        getAutoshapeGroupItemsNameList.Add shp.Name, itemsStr
    Next shp
End Function
```
Swiftでクラスのアウトライン表示(区切り線やTODO)

# 概要
* クラスの概要を把握するのに便利なアウトライン表示のTipsです
<img width="601" alt="スクリーンショット 2015-11-08 20.39.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/25820/a68f3790-ab89-1337-91b7-99ed129dac0d.png">

# ショートカット 
* Control + 6 がアウトライン表示のショートカット。よく使います😇
* アウトライン表示中にキーボード入力するとファンクション名やプロパティ名で絞込みができる。便利!(意外と気づかない!!)
* アウトライン表示中に↑↓キーで移動、Enterキーで該当ファンクションやプロパティへ移動できる。便利!!

# アウトライン表示の装飾
## コメント

```swift
// MARK: コメント
// TODO: タスク
// FIXME: 要修正
```
<img width="237" alt="スクリーンショット 2015-11-08 20.47.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/25820/1a255bd2-bfc4-3c27-0ab4-2485d2f72e67.png">

## 区切り線
```swift
// MARK: -
let hoge1 = "区切り線のみ"
    
// MARK: - 区切り線とコメント
let hoge2 = "hoge"
    
// MARK: - 上下に区切り線とコメント -
let hoge3 = "hoge"
```
<img width="238" alt="スクリーンショット 2015-11-08 20.51.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/25820/4d251414-25bd-8b29-df92-603cb6da5d7d.png">

# その他
* Objective-Cで使えた以下はSwiftでは未対応

```swift
// !!!: 注意
// ???: 疑問点
#error エラー表示
#warning warning表示
```

* delegateを区切り線で仕切るのは一般的な気がする
<img width="487" alt="スクリーンショット 2015-11-08 20.53.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/25820/dcbf4d93-15bc-2f1d-8ee0-cc7a6fd7d213.png">

* 気になる点がありましたら気軽にコメントください!
line monitor > RPi2 / python > シリアルUSB0(送信) / シリアルUSB1(受信)

```txt:動作確認
RaspberryPi2
USBシリアルケーブル VE488 x 2本
上記VE488をクロス接続する治具 (TX,RX交差)
```

RPi2でのシリアル通信勉強のため、上記の設定で自己ループさせた状態で送信と受信を実装する。

http://qiita.com/7of9/items/373c8a0bd6f312eb7349
にてUSBシリアルの認識をした上で、以下のpythonコードを走らせる。

```151108.py
import serial
import time

def main():
	print "Hello"
	con1=serial.Serial('/dev/ttyUSB0', 9600, timeout=10)
	con2=serial.Serial('/dev/ttyUSB1', 9600, timeout=10)

	str1='from0\n'
	con1.write(str1);
	str2=con2.readline()
	print "str1=", str1
	print "str2=", str2

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

実行結果

```txt:結果
pi@raspberrypi ~/lineMonitor $ python 151108.py 
Hello
str1= from0

str2= from0
```

/dev/ttyUSB0から/dev/ttyUSB1での送信と受信が分かった。

参考
http://chicklab.blog84.fc2.com/blog-entry-46.html
【備忘録】C++コードのコンパイル時にg++/clang++でとりあえず迷ったら設定しておくと良いらしいオプション(CXXFLAGS)

# よく見かけるオプションのメモ（絶対ではない＆当方あまり詳しく知らない）
どこかにもっと詳しく書いてくださってる記事が合った気がするんだけど、どこだっけな……。
思い出せないので、とりあえずココにメモしておく。
まあGCCとか使ってる人なら当たり前のことなのだが

##C++の標準規格指定(f.g. c++0x, c++14 ...etc)
-std=c++14

##最適化の指定
-O2 

##警告の類
-Wall -Wextra -Wno-unused-parameter -Wfloat-equal
Macへのdfu-programmerのインストールはhomebrewで

# タイトルが全て

MacユーザーがArduino UNO Rev.3のATmega16u2などを書き変えたい時（主に[mocoLUFA](https://github.com/kuwatay/mocolufa)などを使いたい時ですね！）に利用するコマンドツール **dfu-programmer** ですが、いろいろとハマリポイントがあり、以前、[Arduino UNO R3 + dfu-programmerって、みんなどうしてるの?](http://qiita.com/tadfmac/items/b941f7d4858386e2d1b0)という記事を書きました。

時は流れ、ずいぶん簡単になったようです。タイトル通りにすればOK。

# homebrewで

homebrewは、[こちら↓](http://brew.sh/index_ja.html)から入れてください。

http://brew.sh/index_ja.html

El Capitanな方は、運が悪いとうまく入れられないようです。
トラブル発生な方は、下記記事など参考にして入れましょう〜。

[【Mac】OS X 10.11 El CapitanにHomebrewをインストールする方法](http://blog.h-wd.info/2015/10/08/mac-os-x-10-11-el-capitan%E3%81%ABhomebrew%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)

とりあえず、homebrewが入っている場合、下記コマンドでdfu-programmerが入れられます。

> $ brew update
> $ brew install dfu-programmer

これで、私は v.0.7.2が入りました。
もちろん、Arduino UNO Rev.3 で [mocoLUFA](https://github.com/kuwatay/mocolufa) の書き込みにも成功しました。

# 余談（dfu-programmerを使ってArduino UNO Rev.3 へmocoLUFAを書き込み方法）

下記スライドに以前書きましたので参考にどーぞー。

[ArduinoでMidiコントローラーを作ろう](http://www.slideshare.net/tadfmac/arduinomidi)
※P.12〜17あたりを参考にしてください。（それ以外のページは情報が古かったりするので）

以上でーす。
line monitor > RPi2 > USBシリアルの認識

```txt:動作確認
RaspberryPi2
```

RPi2に[VE488](http://akizukidenshi.com/catalog/g/gM-08343/)
というUSBシリアルケーブル(x2本)を挿すことによりRS-232C通信を行う。
GPIOでシリアル通信をする方法もあるが、今回はUSBシリアルで対応。

参考
http://chicklab.blog84.fc2.com/blog-entry-46.html

以下はVE488を挿す前。

```
pi@raspberrypi ~ $ lsusb
Bus 001 Device 005: ID 192f:0716 Avago Technologies, Pte. 
Bus 001 Device 004: ID 0853:0111 Topre Corporation 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi ~ $ 
```

以下はVE488を挿した後。

```
pi@raspberrypi ~ $ lsusb
Bus 001 Device 007: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 008: ID 192f:0716 Avago Technologies, Pte. 
Bus 001 Device 009: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 004: ID 0853:0111 Topre Corporation 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```