OmniAICreator/Qiita-1.07M huggingface dataset:
TeXだけでpdfファイルを結合する

素人の備忘録。

# 動機
TeXしかない状況でpdfファイルを結合せざるを得なくなったときに。
再度同じ状況になるとはとても思えないし、もっといいやり方があるだろうとも思うが、万が一のため記録しておく。

# 解決策
## ファイル名を連番に変更
結合したいpdfファイルのファイル名を「同じファイル名 + 連番」の形にしておく。
例えばWindowsなら、

0. 複数のpdfファイルを選択
0. 右クリックから「名前の変更」
0. 適当なファイル名を入力

とすれば、リネームソフトなどを使うまでもなく連番のファイル名になる。
[参考](https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=012512)

## pdfファイルの結合
今、

* test(1).pdf
* test(2).pdf
* test(3).pdf

の３つのファイルを結合したいとする。
結合するpdfファイルを同じディレクトリに入れ、以下の`tex`ファイルを同ディレクトリ内に作成する。
これをpdflatexで実行すると、3つのpdfファイルを結合したpdfファイルが作成される。

```tex
% pdfLaTeXで処理すること
\documentclass[a4paper]{article} % ここは変えないこと
\usepackage{pdfpages}

% ファイル数カウンタの宣言
\newcount\pdffilecounter

% ファイル名変数の宣言
\newtoks\filename
% 総ファイル数変数の宣言
\newcount\endfilenumber

% ファイル名を入力
\filename = {test} % ここを変更
% 総ファイル数を入力
\endfilenumber = 3 % ここを変更

\begin{document}

\loop % 繰り返し始点
	\advance\pdffilecounter by 1 % ファイル数カウンタを1増やす
	\includepdf[nup=1x1, pages=-]{\the\filename (\the\pdffilecounter ).pdf} % pdfファイルの取り込み
	\ifnum\pdffilecounter < \endfilenumber % ファイル数カウンタが総ファイル数より小さければ繰り返し
\repeat % 繰り返し終点

\end{document}
```

全体のページ番号を入れたい場合は以下のような感じで。

```tex
% pdfLaTeXで処理すること
\documentclass[a4paper]{article} % ここは変えないこと
\usepackage{pdfpages}

% ファイル数カウンタの宣言
\newcount\pdffilecounter

% ファイル名変数の宣言
\newtoks\filename
% 総ファイル数変数の宣言
\newcount\endfilenumber

% ファイル名を入力
\filename = {test} % ここを変更
% 総ファイル数を入力
\endfilenumber = 3 % ここを変更

% ページ番号フォントの調整
\renewcommand{\thepage}{
{\Large 
\textbf{
\textsf{
\arabic{page}
}}}}
% ページ番号位置の調整
\footskip=3.2cm

\begin{document}

\loop % 繰り返し始点
	\advance\pdffilecounter by 1 % ファイル数カウンタを1増やす
	\includepdf[nup=1x1, pages=-, pagecommand={\thispagestyle{plain}}]{\the\filename (\the\pdffilecounter ).pdf} % pdfファイルの取り込み
	\ifnum\pdffilecounter < \endfilenumber % ファイル数カウンタが総ファイル数より小さければ繰り返し
\repeat % 繰り返し終点

\end{document}
```

# 注意
Windowsで結合するファイル名を日本語にした場合、上のtexファイルのエンコードはシフトJISにすること。
utf-8ではファイル名のところでエラーが出る。
ファイル名が半角英数のみならばutf-8でも問題ない。
RailsアプリのためのDockerfileとdocker-compose.ymlのサンプル

[production環境でRailsアプリをdockerコンテナとしてECSで運用するために考えたこと - Qiita](http://qiita.com/joker1007/items/b8a932c1ae29705cef8d) の補足

プロジェクト固有っぽいもの抜いた簡単なサンプルを用意した。
適宜読み替える必要はあるし、もっとスマートに書く方法はありそう。

https://gist.github.com/joker1007/9d6cd83b91bbf19eb7e33346cca50299
もう gulp watch を暴走させない。

`gulp`の`watch`を使っていると、ファイルを変更していないのに、勝手にタスクが走り出すことがあります。

変更していないファイルを、変更されたと勘違いしたり、
変更していない同じファイルを、何回も変更されたと勘違いしたり。

一度`watch`が暴走し始めると、gulpコマンドを再起動させるはめになり、面倒でした。

## 例

watchタスクをひとつ、適当に例として書いてみます。

```js:gulp
// 注意 これだけでは動きません。
gulp.task('scss', function () {
  gulp.watch(config.src, function (event) {
    console.log('changed scss: ', event.path);
    gulp.src(config.src)
      .pipe(plumber())
      .pipe(sass())
      .pipe(gulp.dest(config.dest));
  });
});
```

gulpが暴走すると、

```rb:永遠に変更され続けます。
changed scss: common.scss
changed scss: common.scss
changed scss: common.scss
changed scss: common.scss
changed scss: common.scss
changed scss: common.scss
changed scss: common.scss
```

## 暴走の原因はメモリ不足

私の場合、virtualBox、vagrantという環境でgulpを使用しており、
メモリが512MBがしかありませんでした。

gulpがメモリを512MB、全部使ってしまったタイミングで、暴走が始まることを確認したため、メモリを4GBに増加させたところ、暴走しなくなったので、おそらくこれが原因でした。
ES5で書くAngular v2（４）「クリックイベント」

※現在この方法は推奨されません

[前回](http://qiita.com/puku0x/items/99a0602bf248ce42e8f6)はngForを用いてリストの内容を表示しました。

今回はクリックイベントを追加してToDoリストのサンプルを作ります。
![GIF.gif](https://qiita-image-store.s3.amazonaws.com/0/106886/bdf9f7a3-54ab-edd0-c409-9c78e79e3e16.gif)

HTMLは見出しとこれから作成するToDoコンポーネントを配置します。

```html:app.html
<!DOCTYPE html>
<html>
    <head>
         <meta charset="utf-8">
        <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/2.0.0-beta.17/Rx.umd.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/2.0.0-beta.17/angular2-polyfills.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/2.0.0-beta.17/angular2-all.umd.dev.js"></script>
        <script src="components/todo-component/todo-component.js"></script>
    </head>
    <body>
        <h1>Todo list</h1>
        <todo-component></todo-component>
    </body>
</html>
```

コンポーネントの実装は以下のように、ToDoリストの元データとクリックイベント発火時のメソッドが追加されています。

```js:components/todo-component/todo-component.js
(function(app) {
    app.TodoComponent = ng.core
    .Component({
        selector: 'todo-component'
    })
    .View({
        templateUrl: 'components/todo-component/todo-component.template.html'
    })
    .Class({
        constructor: function() {
            this.todoList = [{'title': 'ToDo_01', 'complete': false},
                             {'title': 'ToDo_02', 'complete': false},
                             {'title': 'ToDo_03', 'complete': false},
                            ];
        },
        add: function(title) {
            var todo = {'title': title, 'complete': false};
            this.todoList.push(todo);
        }
    });
    document.addEventListener('DOMContentLoaded', function() {
        ng.platform.browser.bootstrap(app.TodoComponent);
    });
})(window.app || (window.app = {}));
```

テンプレートにはリスト表示と、新規追加用のフォームを配置します。

```html:components/todo-component/todo-component.template.html
<li *ngFor="let todo of todoList">
    {{todo.title}}
</li>
<div>
    <input type="text" [(ngModel)]="todo"/>
    <button (click)="add(todo)">Add</button>
</div>
```

`(click)="add(todo)"`と書かれている部分がクリックイベントです

今回はクリックイベントを使いますが、この他にも

- focus : マウスカーソルが重なった時
- blur : マウスカーソルが外れた時

といったイベントにも適用できるようです。

毎度のことながら、動くサンプルはCodepenで見ることが出来ます。
https://codepen.io/puku0x/pen/BKeZeK

# まとめ
Angular v2のクリックイベントを用いて、リストにデータを追加する処理を組み込みました。

以前紹介したデータバインディングの表記と合わせると

- [()] : 双方向バインディング
- [] : 単方向バインディング
- () : イベント

...何だかややこしいですね。

今回作ったToDoサンプルは[次回](http://qiita.com/puku0x/items/120019ea3b9542e58fdc)も使います。
Ubuntu16.04でVirtualBoxインストール

#Ubuntu16.04で、まだ入れてなかったので、PPAから最新版をインストールしてみたメモ。


```
sudo gedit /etc/apt/sources.list
```
deb http://download.virtualbox.org/virtualbox/debian xenial contrib
を貼り付ける。

```
sudo apt-key add oracle_vbox.asc 
sudo apt-get update
sudo apt-get install virtualbox-5.0
```
COUNT(*)について

COUNT(*)について

COUNT(*)は遅いので件数取得はCOUNT(KEY)にすべきと言われたが、
前にコスト測ったら大して変わらなかった気がしたので、真面目に調べてみた。
先に結論を書くと、DB2や最近のOracleの場合、問題ない。

1.そもそもこの発言のネタ元は・・・
ネタ元はおそらく下記のサイト
http://www.geocities.jp/mickindex/database/db_optimize.html
『作成日：2002/10/25』とあるから時代錯誤な知識の可能性が高い。

2.実際はどうなのか？また、現状はどうなのか？
次にOracleのフォーラムを見ると昔はたしかにそうだったとのこと。
現在の主流のオプティマイザの種類と昔のオプティマイザの種類は異なっており、
昔は、RBO(ルールベース・オプティマイザ)を使っており、
現在は、CBO(コストベース・オプティマイザ)を基本使っている。
CBOの場合、COUNT(*)としてもコスト計算した上でよりコストの低い実行計画をDBで建ててくれるので問題ない。
ちなみに、RBOとCBOは下記のサイトの解説が詳しい。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060111/227100/

3.DB2ではどうなのか？
DB2の場合は、CBOを採用しているので、基本的にCOUNT(*)問題ない。
ただし、ALTER TABLE テーブル名 VOLATILE文とか実行されていると統計情報が無視されるので、
RBO的な動きになるので、COUNT(KEY)の方が早いかも。
VOLATILE文利用時は未検証。

ちなみに、他のTIPSも時代錯誤な知識に結構なってるらしい。
とりあえず、今回はCOUNT(*)についてのみ調べてみた次第です。
【iOS】【Urban AirShip】任意のタイミングでPUSH通知の許可設定ダイアログの表示させる

Urban AirShipの公式ドキュメント通りにすると、↓のようになる。

```swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    let config = UAConfig.defaultConfig()
    UAirship.takeOff(config)
    UAirship.push().userNotificationTypes = ([.Alert, .Badge, .Sound])
    UAirship.push().userPushNotificationsEnabled = true
    return true
}
```

これを takeoff はapplication didFinishLaunchingWithOptionsのままで
userNotificationTypes 等は表示させたいビューに記載する


```swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    let config = UAConfig.defaultConfig()
    UAirship.takeOff(config)
    return true
}
```

```swift
// 表示させたいビューコントローラ
UAirship.push().userNotificationTypes = ([.Alert, .Badge, .Sound])
UAirship.push().userPushNotificationsEnabled = true
```

表示タイミングによってプッシュ通知の許諾率がかなり変わってくるので、見せ方、タイミングはかなり重要である
Getting Started with Google's SyntaxNet for POS-tagging

Google just released (12 March 2016) its open-source project SyntaxNet which they say as "the world's most accurate parser". SyntaxNet has been developed using Google's Tensorflow Framework.

This is a tutorial on OSX to get started with SyntaxNet to tag part-of-speech(POS) in English sentences.

Here are the steps for installation:

1. Install bazel:
    - Install [JDK 8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html).
    - Install Xcode command line tools.
    - Install [bazel](https://github.com/bazelbuild/bazel/releases) version 0.2.2 (NOT 0.2.2b) (use darwin version for OSX)

2. Install homebrew and then swig: `$ brew install swig`
3. Install protocol buffers supported by tensorflow: `$ pip install -U protobuf==3.0.0b2`
4. Install asciitree to draw parse trees i=on console: `$ pip install asciitree`

Now check the build and test SyntaxNet using:

```bash
$ git clone --recursive https://github.com/tensorflow/models.git
$ cd models/syntaxnet/tensorflow
$ ./configure
$ cd ..
#For testing on Mac run following: (will take some time for tests to pass)
$ bazel test --linkopt=-headerpad_max_install_names \
    syntaxnet/... util/utf8/...
```

Google has already provided a trained model for POS-tagging English sentences called Parsey McParseface. This is located under `syntaxnet/models`. To test it inside the terminal we can use the script `syntaxnet/demo.sh` which provides a basic interface to Parsey McParseface.

```bash
# try this in terminal to POS-tag a sentence
$ echo 'Did you see that man?' | syntaxnet/demo.sh

# the following should be the output
Input: Did you see that man ?
Parse:
see VB ROOT
 +-- Did VBD aux
 +-- you PRP nsubj
 +-- man NN dobj
 |   +-- that DT det
 +-- ? . punct

```
複数行でも text-overflow: ellipsis したい時のCSSメモ

## 2024年追記
以下は古い情報ですので、 [line-clamp](https://caniuse.com/?search=line-clamp) を使ってくださいね！

## はじめに

幅をはみ出したテキストを三点リーダ `…` で省略する場合は `text-overflow: ellipsis;` を使いますが、複数行で使えないのが残念です。下記、複数行でもそれらしい見た目を得るための簡易的な方法の紹介です。

## サンプル
![cap_ 2016-05-17 18.34.19.png](https://qiita-image-store.s3.amazonaws.com/0/48396/9d33438e-e630-abeb-004c-1ca389a7d918.png)
デモはこちら(Codepen)：
http://codepen.io/skwbr/pen/zqQwVZ

## コード

### HTML
```html
<p class="text-ellipsis">あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。</p>

<p class="text-ellipsis multiline">あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。</p>

<p class="text-ellipsis multiline line-4">あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。</p>
```

### CSS
SCSSです。CSS版が見たい方は [Codepen](http://codepen.io/skwbr/pen/zqQwVZ) の「View Compiled」からどうぞ。

```scss

//変数定義
$line-height: 1.5;
$bg-color: #ccc;

.text-ellipsis {
  //単数行用スタイル
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  background-color: $bg-color;
  line-height: $line-height;
  
  //複数行オプションClass
  &.multiline {
    white-space: normal;
    max-height: 2em * $line-height;
    position: relative;
    &::after {
      content: "…";
      position: absolute;
      display: block;
      bottom: 0;
      right: 0;
      background-color: $bg-color;
    }
  }
 
  //行数指定ユーティリティClass
  @for $i from 2 through 5 {
    &.line-#{$i} {
      max-height: 1em * $i * $line-height;
    }
  }
  
}

```

* 複数行の場合は、行数(`line-height`と行数の積)の分だけ高さ(`max-height`)をもうけ、after擬似要素で右下端に`…`をabsolute配置している。
* ユーティリティクラスで、行数をHTML側から指定できるようにする。


### 課題点

* この方法は文字切りをしたいボックスの背景色が決まっている場合にのみ使える。
* また、制限行数よりも文字列が短い場合(ボックスの右下まで文字がいかない場合)は、下図のように気持ち悪いことになる。

![cap_ 2016-05-17 18.44.24.png](https://qiita-image-store.s3.amazonaws.com/0/48396/9db8d019-ed42-6521-7d8d-c9820a77bfb9.png)

現状これをCSSだけで判別して出し分ける方法は思いつかなかったです。
あるいは [この記事](https://hail2u.net/blog/webdesign/necessity-of-multiline-ellipsis.html) で言われているように、「続きを見る」などの役割に置き換えてしまえば、常に出ていても不自然な感じがしなくて済むかもしれません。
MacにNginxを入れてみる

MacにNginxをインストールしてみたメモ。

Homebrewでインストール
```
$ brew install nginx
```
以下実行結果結果

```
==> Installing dependencies for nginx: pcre, openssl
==> Installing nginx dependency: pcre
==> Downloading https://homebrew.bintray.com/bottles/pcre-8.37.yosemite.bottle.t
######################################################################## 100.0%
==> Pouring pcre-8.37.yosemite.bottle.tar.gz
🍺  /usr/local/Cellar/pcre/8.37: 146 files, 5.9M
==> Installing nginx dependency: openssl
==> Downloading https://homebrew.bintray.com/bottles/openssl-1.0.2d_1.yosemite.b
######################################################################## 100.0%
==> Pouring openssl-1.0.2d_1.yosemite.bottle.tar.gz
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

This formula is keg-only, which means it was not symlinked into /usr/local.

Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/openssl/lib
    CPPFLAGS: -I/usr/local/opt/openssl/include

==> Summary
🍺  /usr/local/Cellar/openssl/1.0.2d_1: 464 files, 18M
==> Installing nginx
==> Downloading https://homebrew.bintray.com/bottles/nginx-1.8.0.yosemite.bottle
######################################################################## 100.0%
==> Pouring nginx-1.8.0.yosemite.bottle.1.tar.gz
==> Caveats
Docroot is: /usr/local/var/www

The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.

nginx will load all files in /usr/local/etc/nginx/servers/.

To have launchd start nginx at login:
  ln -sfv /usr/local/opt/nginx/*.plist ~/Library/LaunchAgents
Then to load nginx now:
  launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
Or, if you don't want/need launchctl, you can just run:
  nginx
==> Summary
🍺  /usr/local/Cellar/nginx/1.8.0: 7 files, 964K
```

起動コマンド
```
$ nginx
```
でターミナルには特に何も出ず起動。
http://localhost:8080/
にアクセスしてwelcomeが出て成功。

停止
```
$ nginx -s stop
```
でターミナルには何も出ず終了。





参考）
http://phiary.me/mac-nginx-install/
[VIP] MacのVB上でCoreOSをホストに使い、alpineベースのdocker環境を作る part 2

### 構成
+ [part 1](MacのVB上でCoreOSをホストに使い、alpineベースのdocker環境を作る part 1)

Mac上のVBにCoreOSを入れ、インストールする。

+ prat 2

CoreOSの基本設定とdockerの基本設定をする。 --> この記事

+ part 3

alpineベースのdockerを楽しむ。

# CoreOSの設定である、cloud-config.ymlを作っていく

他の記事を見て下さい!!!

### 最終的なconfig

+ まずはcloud-config.ymlをHOMEに置く

```text:cloud-config.yml 
#cloud-config

hostname: coreos-host01

coreos:
  update:
    reboot-strategy: best-effort
  etcd:
    discovery: https://discovery.etcd.io/{HASH}
    addr: 192.168.59.101:4001
    peer-addr: 192.168.59.101:7001
    bind-addr: 0.0.0.0
  fleet:
    public_ip: 192.168.59.101
  units:
    - name: etcd.service
      command: start
    - name: fleet.service
      command: start
    - name: docker.service
      command: start
    - name: timezone.service
      command: start
      content: |
        [Unit]
        Description=timezone
        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/bin/ln -sf ../usr/share/zoneinfo/Japan /etc/localtime
    - name: 10-static.network
      runtime: no
      content: |
        [Match]
        Name=eth0

        [Network]
        Address=192.168.59.101/24
        Gateway=192.168.59.1
        DNS=8.8.8.8
        DNS=8.8.4.4

users:
  - name: coreuser
    passwd: `openssl passwd -1`で生成したパスワード
    groups:
      - sudo
      - docker
    ssh-authorized-keys:
      - ssh-rsa ***で記させる公開鍵
```


+ cloud-configのシンタックスチェック

```
# coreos-cloudinit -validate=true -from-file=./cloud-config.yml
```

+ 初回インストール
    + コマンド中のstableは自分がダウンロードしたバージョン{Stable | Beta | Alpha}によって書き直す  

```
$ sudo coreos-install -d /dev/sda -C stable -c ./cloud-config.yml
…
割愛
…
gpg: key 93D2DCB4 marked as ultimately trusted
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: Good signature from "CoreOS Buildbot (Offical Builds) <buildbot@coreos.com>" [ultimate]
Installing cloud-config...
Success! CoreOS stable 835.13.0 is installed on /dev/sda
```

+ ここまで来たら、一旦VMを落とす

```
$ sudo shutdown -h now
```

+ VMのStorageからCoreOSを抜く

![Screen Shot 2016-05-17 at 17.42.01.png](https://qiita-image-store.s3.amazonaws.com/0/25582/f82ea19c-d02e-fd67-a6cd-ad98d634fae7.png)

+ その後、起動。
    + VNのコンソールから入れることを確認

![Screen Shot 2016-05-17 at 17.44.42.png](https://qiita-image-store.s3.amazonaws.com/0/25582/a2d8e4c3-74e4-3c53-3f7c-1d190bfcd2c4.png)


+ MACのCLIから、鍵でssh出来ることも確認。

```
$ ssh -i id_rsa-try-docker coreuser@192.168.59.100 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
Warning: Permanently added '192.168.59.100' (ED25519) to the list of known hosts.
Last login: Tue May 17 17:44:23 2016
CoreOS stable (835.13.0)
coreuser@coreos-host01 ~ $
```

+ 先ほどのcloud-config.ymlは以下に格納されている

```text:PATH
/var/lib/coreos-install/user_data
```

+ 最後のcoreosのupdateをしておく

```
$ sudo update_engine_client -update
```

### 参考資料

[【CoreOS】cloud-config解説〜インストール](http://qiita.com/xshsaku/items/1ba3f930ff80bef685a6)

# Dockerを設定していく

+ 現状バージョンを確認(2016/05/17)

```
$ docker -v                   
Docker version 1.9.1, build 9894698
```
C言語プロジェクトやるときに使ってるものとか

C言語初心者だし、大きなコードベースも扱ってないけど、自分の現状のまとめ。知識不足は間違いないので、他に便利なものがあればコメントにて教えて下さい。

# プロジェクトテンプレート

Makefileの書式は多分一生覚えられないと思う。

だので、[segmentio/khaos](https://github.com/segmentio/khaos)を使ってMakefileその他を生成できるようにしている。ディレクトリ構成で悩みたくないので、１実行ファイルにつき１プロジェクトを作成する方式。

https://github.com/hashrock/khaos-c

これは自作のテンプレートだけど、Cプロジェクトなんて千差万別なので好きなのを作る方がいいと思う。

MakeじゃなくてSconsでやってみたこともある。必要なことが網羅されておりすこぶる快適という感触はあったものの、どこでもすぐに導入出来るかというとむずく、Pythonバージョン依存関連でyak shavingを招いてしまった。きちんと整備された環境ならSconsで問題ないと思う。

C言語、便利なものも多々あれど、ビルドにあれとかこれが必要で、導入時点でfailするってケースがかなりあって辛い。npmって楽なんだなあって本当に思った。

gulpじゃなくてMakefileいいぞって言ってる人見かけるけど、Makefileの記法辛くないのかなぁ。

# makeheaders

ヘッダの手書きは辛いのでmakeheadersを使う。序盤のうちは一切ヘッダ手書きしなくていいかも。

`makeheaders *.c` だけ書いたシェルスクリプトを置いておくと楽。

構造体をヘッダに含めたいときはどうするんだろう。生成されたヘッダはいじらず、後で結合とかすればいいのかな？

あとできればNode.jsで実装しなおしたようなポータブルなものがほしい。

# astyle

コードフォーマッタにはastyleを使っている。下記のような設定にしている。

```bash
astyle --indent=tab -p -n -k3 -W3 --style=1tbs src/*.c src/*.h
```

1tbsというのは、K&Rのバリエーションらしい。見た目で決めたけれど、プロジェクト全体でフォーマットが揃ってれば2スペでも何でもいいと思っている。

# 単体テスト

CuTestとかCppUTestとかいろいろあり、いくつかは使ってみたけど、案外ノーフレームワークで書くのが手っ取り早い。

```c
void testSomething(){
	int ret = something(1);
	if (ret) {
		printf("#1 %s OK!\n", __func__);
	} else {
		printf("#1 %s Fail\n", __func__);
	}

	//文字列比較
	unsigned char *str = somethingStr(1);
	if (strcmp(str, "1") == 0) {
		printf("#2 %s OK!\n", __func__);
	} else {
		printf("#2 %s Fail\n", __func__);
	}
}

int main(void)
{
	testSomething();
	return 0;
}
```

CIとかやるにはこれじゃ全然ダメだけど、最低限はこんな感じ。あとからフレームワークを使う形にも書き直しやすい気がする。valgrindに食わせる時も特に迷うことがない。

# 今後

実のところCのプロジェクトのルートにpackage.jsonを置きたい気持ちが生まれている。astyleとかmakeheadersとか、Node実装があってnpm installでさくっと入ったらいいのにな、とか、バイト操作めんどいUtil欲しいとか、ゆとり的な感想を持ってしまう。

もっと楽しく書けるようになったらいいなと思うけれど、なんだか面倒事や落とし穴が多くて、楽しくなるまでにはまだまだ時間がかかりそうだし、その頃には定年になっていそう。
SNMP サービスにバインドされているポート番号を変更する

net-snmpなど他のSNMPサービスと共存する環境で使用する場合、ポートのバッティングを避けるため標準SNMPサービスのポートを変更する。

#環境

* Windows 7 Professional SP1 64bit


#設定ファイル変更

以下のフォルダにある

```
C:\Windows\System32\drivers\etc\
```
servicesというファイルを編集

```text:servies
   # Copyright (c) 1993-2004 Microsoft Corp.
   #
   # This file contains port numbers for well-known services as defined by
   # RFC 1060 (Assigned Numbers).
   #
   # Format:
   #
   # <service name>  <port number>/<protocol>  [aliases...]   [#<comment>]
   #

   snmp     165/udp  snmp
   snmp-trap   166/udp  snmp
```

>   snmp     165/udp  snmp

の部分を変更したいポート番号に変更する。

#参考

https://support.microsoft.com/ja-jp/kb/158770
railsでオープンクラスをするときの作法

# 参考
http://stackoverflow.com/questions/7490680/in-rails-how-to-add-a-new-method-to-string-class

# 例: Stringクラスを拡張する場合

~~~lib/ext/string.rb
class String
  def is_number?
    true if Float(self) rescue false
  end
end
~~~

~~~config/initializers/extensions.rb
require 'ext/string'
~~~
Swift で bitfield を使う

English article is [here](http://qiita.com/codelynx/items/3a4105cb6115d00c4455).

# C言語の bitfield
Swift に C言語 でいう bitfield機能 がない事は承知かもしれません。多くの場合はそれほど必要に迫られる場合はないかもしれませんが、しかし、時にはそんな機能が必要になる事だってあります。C言語ではこんな使い方をしていた人もいたかもしれません。

```RGB_t.c
struct RGB_t {
  unsigned int red : 4;
  unsigned int greeb : 4;
  unsigned int blue : 4
  unsigned int alpha : 4
};

struct RGB_t color;
color.red = 0xf
color.green = 0x0
color.blue = 0x8
color.alpha = 0xf
```

# ZBitField

そこで、[ZBitField](https://github.com/codelynx/ZBitField) を紹介します。Swift 2.2対応済みのはずです。詳細な説明の前に雰囲気を見てみましょう。まずは、ビットフィールドに書き込む場合です。

```.swift
var bitfield = ZBitField([("red", 4), ("green", 4), ("blue", 4), ("alpha", 4)]!
bitfield["red"] = 0xf
bitfield["green"] = 0x0
bitfield["blue"] = 0x8
bitfield["alpha"] = 0xf
let data = bitfield.data // NSData
```

次は、NSData からビットの要素の取り出しです。

```.swift
var data = .... // NSData
var bitfield = ZBitField([("red", 4), ("green", 4), ("blue", 4), ("alpha", 4)]!
bitfield.data = data
let r = bitfield["red"]
let g = bitfield["green"]
let b = bitfield["blue"]
let a = bitfield["alpha"]
```

単純なビット構成ならビットシフトで良いかもしれませんが、複雑なビット構成の場合は、名前でビット要素にアクセスできるのは便利かと思います。

#ビットのフォーマットの定義

ビットフォーマットの定義は最上位ビットから指定します。総ビット数は８の倍数が理想的ですが、そうでない場合はその上位ビットから名前が割り当てられます。名前とそのビット数は `(String, UInt8)` のタプルの配列で指定します。名前は重複してはいけませんし、ビット数は1〜64ビットの間でなくてはなりません。では、TCP ヘッダのフォーマットを定義してみましょう。

```
+---------------+---------------+---------------+---------------+
| Source Port                   | Destination Port              |
| . . . . . . . | . . . . . . . | . . . . . . . | . . . . . . . |
| Acknowledgement Number                                        |
| . . . . . . . | . . . . . . . | . . . . . . . | . . . . . . . |
|Offset | Reserved  |U|A|R|P|S|F| Window                        |
| . . . . . . . | . . . . . . . | . . . . . . . | . . . . . . . |
| Checksum                      | Urgent Pointer                |
| . . . . . . . | . . . . . . . | . . . . . . . | . . . . . . . |
+---------------+---------------+---------------+---------------+
```

こんな具合に定義できます。TCPヘッダは例として取り上げただけですので、詳細は突っ込みはご遠慮ください。

```.swift
var bitfield = ZBitField([
	("SourcePort", 16),
	("DestinationPort", 16),
	("SequenceNumber", 32),
	("AckNumber", 32), 
	("DataOffset", 4),
	("Reserved", 6), 
	("URG", 1), ("ACK", 1), ("PSH", 1), ("RST", 1), ("SYN", 1), ("FIN", 1),
	("Window", 16),
	("Checksum", 16),
	("UrgentPointer", 16)
])
```

# ZBitField の API

### init

```.swift
init?(_ spec: [(String, Int)]) 
```

ビットフィールドのビット構成を定義します。名前とビット数のタプルを配列にして渡します。ビット構成上問題がある場合には `nil` を戻します。

#### length

```.swift
let length: UInt
```
バイト長を戻します。

#### data

```.swift
var data: NSData { get set }
```
実際のバイト列を取り出したり、設定したりします。

#### subscript

```.swift
subscript(key: String) -> UInt { get set }
```

ビットフィールドに書き込んだり、ビットフィールドから読み出したりします。名前は大文字小文字も区別されます。

# Github

コードはGithubから取得してください。 MIT licenseとなっています。

https://github.com/codelynx/ZBitField


# 環境

執筆時点での Swift のバージョンは以下の通りです。

```.console
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
```
c++ builder XE4, 10.2 Tokyo > String > 複数のメールアドレスを"<xxx>,...,<zzz>"の形式にする

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

メール送信機能において複数のアドレスを指定する場合、そのアドレスを`<7of9@xxx.com>,<7of9@yyy.com>,<7of9@zzz.com>`のように連結することで複数アドレスへ送信できることは確認した。

ユーザがメールアドレスを入力するTEditが複数ある場合、角括弧をつけてもらうのは不親切なUIなので、自動でつける処理を以下のように実装した。

角括弧をつけて入力された場合もきちんと処理されるよう、角括弧を先に削除してからフォーマット調整している。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <memory>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String allAdr = Edit1->Text + L"," + Edit2->Text + L"," + Edit3->Text;
	allAdr = FormatMailAddresses(allAdr);
}
//---------------------------------------------------------------------------

String __fastcall TForm1::FormatMailAddresses(String srcStr)
{
	std::unique_ptr<TStringList> mlist(new TStringList);

	mlist->CommaText = srcStr;

	String itmstr;
	String resstr = L"";
	for(int idx = 0; idx < mlist->Count; idx++) {
		itmstr = mlist->Strings[idx];
		// remove angle brackets
		itmstr = StringReplace(itmstr, L"<", L"", TReplaceFlags()<<rfReplaceAll);
		itmstr = StringReplace(itmstr, L">", L"", TReplaceFlags()<<rfReplaceAll);

		if (resstr.Length() > 0) {
			resstr = resstr + L",";
		}
		resstr = resstr + L"<" + itmstr + L">";
	}

	return resstr;
}
```
Spark on EMRでlog出力する



## 概要

Sparkは複数サーバで分散処理する影響でログ設定もちょっと面倒だったので、まとめておきます。

## 前提

他のシステムがlogbackで実装されてるとしても、Sparkアプリではlog4jでログ出力するのがトラブルが少なそうです。

簡単に調べてみると、Spark（というかHadoop, EMR）は、log4jでのログ出力を前提としているようでした。
Sparkもコンパイルの依存にlog4jなどが入っているし、EMRでも実行時のクラスパスにslf4j-log4j12などがついてきます。

頑張って一つずつ依存を取り除いていけば解消出来るのかもしれませんが、僕はEMRの中をいじるのはオススメしません。きっと嵌まります。


## log4j.propertiesの読み込ませ方

Sparkは複数マシンのJVMで、Driver/Executorが動くため、
それぞれに設定を行う必要があります。

### 静的に読む方法

以下をspark-submit時に指定してあげます。
見てわかると思いますが、上がDriver用で下がexecutor用です。
（なお、ここで設定する時にjarの中のリソースを取得出来ない気がしたので、後述の動的な読み込みを推奨しておきます。
上手く行った例があったら教えて下さい。）

```
--driver-java-options=-Dlog4j.configuration=file:///home/hadoop/log4j.properties
--conf spark.executor.extraJavaOptions=-Dlog4j.configuration=file:///home/hadoop/log4j.properties
```

### 動的に読む方法

Driver/Executorそれぞれで、loggerを生成する前に以下を実行します。

```scala
    val props = new Properties()
    props.load(getClass.getClassLoader.getResourceAsStream("myLog4j.properties"))
    PropertyConfigurator.configure(props)
```

ここで注意することは、

- `log4j.properties` を指定すると、EMRでクラスパスに入ってる何かが邪魔してくるっぽくて上手くいかなかったので、別の名前を使うこと
- このコードを呼んだ後にloggerを生成すること
- DriverだけでなくExecutorでもこのコードを呼ぶこと

です。

ちなみに、それらを踏まえたサンプルコードはこんなかんじです。

```scala:Main.scala
import java.util.Properties

import org.apache.log4j.PropertyConfigurator
import org.apache.spark.{SparkConf, SparkContext}
import org.slf4j.LoggerFactory

object Main {

  def main(args: Array[String]): Unit = {

    val props = new Properties()
    props.load(getClass.getClassLoader.getResourceAsStream("myLog4j.properties"))
    PropertyConfigurator.configure(props)

    val driverLogger = LoggerFactory.getLogger(Main.getClass)

    val conf = new SparkConf().setAppName("Simple Application")
    val sc = new SparkContext(conf)
    val rdd = sc.range(1, 100, 1, 10)

    driverLogger.info("----Start info----")

    lazy val logic = new ExecutorLogic()
    rdd.map(i => i*2)
      .foreach(i => logic.log.info(i.toString))
  }
}

```

```scala:ExecutorLogic.scala
import java.util.Properties

import org.apache.log4j.PropertyConfigurator
import org.slf4j.LoggerFactory

class ExecutorLogic {

  val props = new Properties()
  props.load(getClass.getClassLoader.getResourceAsStream("myLog4j.properties"))
  PropertyConfigurator.configure(props)

  lazy val log = LoggerFactory.getLogger(classOf[ExecutorLogic])

}
```

また、この時に

- Dependenciesに `slf4j-api` をprovidedで入れておく
- src/main/resources以下に `myLog4j.properties` を配置しておく

をしてあげる必要があります。

あとは、YARNやSpark UIから見て、ちゃんとlogger設定が反映されていればOKです。
GAE/Goで形態素解析してみた

# GAE/Goで形態素解析
Goの形態素解析ライブラリで最もメジャーなのは[kagome](https://github.com/ikawaha/kagome)であるが、辞書ファイルが1ファイルの容量制限（32MB）を超えてしまい、デプロイできない。
そこで、他にもGoで書かれた形態素解析のコードはないものかと探し回ったら、[SenKo](https://github.com/ledyba/SenKo)というのが存在したので、試してみました。

# SenKo
MeCab形式の辞書ファイル（csv）を採用。
32MBを超えるcsvファイルは存在しないが、辞書ファイルが多いい。

# 試してみるコード
## 辞書の読み込み

```
var dec *senko.Decoder
func loadDictionary() {
	mat := senko.LoadMatrix("data/matrix.def")
	dict := senko.NewDictionary()
	dict.LoadDictionaries("data")
	dec = senko.NewDecoder(dict, mat)
}
```

## APIの作成
リクエスト：形態素解析したい文章
レスポンス：形態素解析結果（単語・品詞）

```
func registerAnalysis() {
	http.HandleFunc("/api/analysis", handleAnalysis)
}

func handleAnalysis(w http.ResponseWriter, r *http.Request) {
	c := appengine.NewContext(r)
	sentence := r.FormValue("sentence")
	log.Infof(c, "形態素解析対象文字列 = %s\n", sentence)
	var vocabularies []Vocabulary
	for _, s := range dec.Search(sentence) {
		str := strings.Split(s.Repr(), ",")
		if str[0] == "EOS" {
			break
		}
		vocabulary := Vocabulary{
			Word: str[0],
			Pos:  str[4],
		}
		vocabularies = append(vocabularies, vocabulary)
		log.Infof(c, "単語 = %s, 品詞 = %s", vocabulary.Word, vocabulary.Pos)
	}
	json, err := json.Marshal(&vocabularies)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
	}
	w.Header().Set("Content-Type", "application/json;charset=utf-8")
	w.Write(json)
}
```

# デプロイしてみる
動いた。
kagomeに比べ、csvファイルを読み込む処理が入るのでTokenizerの生成に時間はかかるが、一度読み込んでしまえば、形態素解析の処理自体は速いです。
文章の中に未知語が含まれていると、結果を返してくれなかったり、kagomeよりも精度は劣ると感じるものの、自分がやりたいことに対しては十分でした。
辞書ファイルがcsvなので、必要に応じて楽に単語を追加できる点でもありだとは思います。

<img width="1175" alt="スクリーンショット 2016-05-17 18.35.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/115823/6926a06a-1b8d-8368-8f51-35541ce89609.png">

最後の「もも」がうまくいっていませんね（涙）
PostgreSQL の Array を使うと ActiveRecord の初期化が重くなる場合がある事を学んだ

Rails 4.2.6, Ruby 2.3.1, PostgreSQL 9.5.2 の話
----

1MBくらいの要素を追加したら(!?)、SELECT 後のインスタンス初期化で非常に待たされました。
試しにカラムの型を `jsonb` に変更してみたところ、多少はマシになりました。

ActiveRecord のコードを探ってみると、デフォルトでは Ruby で書かれたパーサによって PostgreSQL の Array を Ruby の Array にキャストしている事が分かりました。

- [rails/array_parser.rb at 4-2-stable · rails/rails](https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/connection_adapters/postgresql/array_parser.rb)
- [rails/array.rb at 4-2-stable · rails/rails](https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb#L8-L18)

```ruby:lib/active_record/connection_adapters/postgresql/oid/array.rb
module ActiveRecord
  module ConnectionAdapters
    module PostgreSQL
      module OID # :nodoc:
        class Array < Type::Value # :nodoc:
          include Type::Mutable

          # Loads pg_array_parser if available. String parsing can be
          # performed quicker by a native extension, which will not create
          # a large amount of Ruby objects that will need to be garbage
          # collected. pg_array_parser has a C and Java extension
          begin
            require 'pg_array_parser'
            include PgArrayParser
          rescue LoadError
            require 'active_record/connection_adapters/postgresql/array_parser'
            include PostgreSQL::ArrayParser
          end
```

ということで、PostgreSQL の Array を使う場合は [DockYard/pg_array_parser](https://github.com/DockYard/pg_array_parser) を使っておくと良さそうです。
([DockYard/pg_array_parser](https://github.com/DockYard/pg_array_parser) のコードは読んでませんし、2013年でコミットは止まっている様です。)


一方その頃 Rails 5.0.0 は
----

`pg` が持っている機能を使っている様です。

```ruby:lib/active_record/connection_adapters/postgresql/oid/array.rb
module ActiveRecord
  module ConnectionAdapters
    module PostgreSQL
      module OID # :nodoc:
        class Array < Type::Value # :nodoc:
          include Type::Helpers::Mutable

          attr_reader :subtype, :delimiter
          delegate :type, :user_input_in_time_zone, :limit, to: :subtype

          def initialize(subtype, delimiter = ',')
            @subtype = subtype
            @delimiter = delimiter

            @pg_encoder = PG::TextEncoder::Array.new name: "#{type}[]", delimiter: delimiter
            @pg_decoder = PG::TextDecoder::Array.new name: "#{type}[]", delimiter: delimiter
          end
```

- [PostgreSQL, Use ruby-pg's built-in capabilities for array en-/decodin… · rails/rails@647eb2c](https://github.com/rails/rails/commit/647eb2cf1cd65b0391e3584361f0fc76246e64f3)
一部端末で方角がwebkitCompassHeadingで取得できなくなっている？ので実装した[iOS,Android]

# webkitCompassHeadingってなんぞ？
`webkitCompassHeading`とは、記事「[webkitCompassHeadingでSafariからでも電子コンパスの情報を取得可能。ただしiOS 5.0 以上から。](http://kazuph.hateblo.jp/entry/20120429/1335693938)」で紹介されているように、iOS 5以上のSafariで、ジャイロセンサーから方角を取得できるAPIのことです。それが**いつの間にか使えなくなっている？**ようなので、W3Cの記事「[DeviceOrientation Event Specification](http://w3c.github.io/deviceorientation/spec-source-orientation.html)」を見ながら実装しました。この方法なら、**iOSのみならずAndroidでも方角を取得できます。**

# Alphaを使えばいいんじゃないの？
ジャイロセンサーにアクセスする`DeviceOrientation Event`には、`Alpha`というパラメーターがあります。
> alpha 角はデバイスの上端が地球の北極をまっすぐ向いているときが 0 度であり、デバイスが左へ回転するのに従って増加します。
> [方向および動きとして示されるデータ](https://developer.mozilla.org/ja/docs/DOM/Orientation_and_motion_data_explained)より引用

リンク先を見ていただくとわかるのですが、Alphaでも方角が取得できます。それをつかえばいいじゃないか！ と言いたいところですが、**`Gamma`と`Alpha`は`Beta`の影響を受けるようで、`Beta`が90度に差し掛かると、`Gamma`と`Alpha`の値が一瞬180度変化してしまいます。**これだと、3D空間をジャイロセンサーとシンクロさせたい時などに、一瞬チラッと別の視線に切り替わってしまうのでマズイことになります。その回避策として、`webkitCompassHeading`を使うことが多いですが、Androidで使えなかったり、サポートしているはずのiOSでも反応しなくなっているので、もうどうしたもんか状態でした :poop: 

# W3Cにソースコード載っていたソースコードがそのまま使えた
W3Cの記事「[DeviceOrientation Event Specification|A.1 Calculating compass heading](http://w3c.github.io/deviceorientation/spec-source-orientation.html#worked-example)」に数式とソースコードが載っていたので試しにそのまま使ってみました。そしたら、`Alpha`のように影響を受けずに方角を取得できた。iOSでもAndroidでも。引数として、ジャイロセンサーの`Alpha`、`Beta`、`Gamma`を渡すと0〜360度で返してくれます。

```js
function compassHeading(alpha, beta, gamma) {
  var degtorad = Math.PI / 180; // Degree-to-Radian conversion

  var _x = beta ? beta * degtorad : 0; // beta value
  var _y = gamma ? gamma * degtorad : 0; // gamma value
  var _z = alpha ? alpha * degtorad : 0; // alpha value

  var cX = Math.cos(_x);
  var cY = Math.cos(_y);
  var cZ = Math.cos(_z);
  var sX = Math.sin(_x);
  var sY = Math.sin(_y);
  var sZ = Math.sin(_z);

  // Calculate Vx and Vy components
  var Vx = -cZ * sY - sZ * sX * cY;
  var Vy = -sZ * sY + cZ * sX * cY;

  // Calculate compass heading
  var compassHeading = Math.atan(Vx / Vy);

  // Convert compass heading to use whole unit circle
  if (Vy < 0) {
    compassHeading += Math.PI;
  } else if (Vx < 0) {
    compassHeading += 2 * Math.PI;
  }

  return compassHeading * ( 180 / Math.PI ); // Compass Heading (in degrees)
}
```

# webkitCompassHeadingってどうなったの？
ささっと調べた限りでは`webkitCompassHeading`が現状どうなっているのかよくわかりませんでした。使えなかったのは僕の手元にある端末がおかしいのか？ みなさんの端末ならうまくいっているのか？ 一先ず、この方法でしばらく様子を見てみたいと思います。

# 追記
念のために他のiOS端末で試していただきました。動いてたーーー！ Android民なので、iPhoneではなくiPodで検証していたから動かなかったのか、、、？ 原因ご存知のかたいらっしゃったら教えて下さい :tired_face:
Zabbix で、/var/log/messages の更新が一定期間なかったら通知する

# 概要

/var/log/messages
の更新が一定の期間なかったら、エラーが起こっている可能性(journald が落ちている？)があるので、 Zabbix で通知したい。


# 結論

Item は

```
vfs.file.time[/var/log/messages,modify]
```

Trigger は、こんな感じでとれるようだった。

```
{Template local file:vfs.file.time[/var/log/messages,modify].now()}
-
{Template local file:vfs.file.time[/var/log/messages,modify].last()}
>86400
```

# 感想

* [1 サポートされているトリガー関数 [Zabbix Documentation 2.2]](https://www.zabbix.com/documentation/2.2/jp/manual/appendix/triggers/functions)

now()
の使い方がよくわからなかった。
Linuxとは


MacやWindowsと同じようにOSですが、無償で利用できることやサーバー運用に適しているといったところでLinuxは魅力的。

##ディストリビューション

本来はOSの中核となるLinuxカーネルのことをLinuxといいます。
実際はこれ単体じゃなくユーザーがそのまま使えるようパッケージングした **Linuxディストリビューション**を使います。
けど長いので以下LinuxディストリビューションをLinuxと呼ぶことにします。

##Linux環境


ホストOS：自分のPCのOS（MacとかWindows）
仮想化ソフトウェア：Oracle VM VirtualBoxとか

仮想化ソフトウェアの上に仮想的なOS（Linux）を立てる感じ。

##代表的なOS

CentOSやUbuntu。
でめちゃくちゃいろんな種類があるらしいけど、最近の主流は下の２つらしい。

|系統|ディストリビューション |
|:--|:--|
|Red Hat系|Red Hat Enterprise Linux, CentOS, Fedora |
|Dabian系|Debian GNU/Linux, Ubuntu |

##参考

- 新しいLinuxの教科書（SB Creative）
にお世話になりました。
RaspberryPi 1 Model B で3GPIを使うにはニッパーが必要だって話

以下の組み合わせでラズパイの3G接続ができましたので報告します。

・RaspberryPi 1 Model B Rev.2
・3GPI  (http://www.mechatrax.com/products/3gpi)
・SORACOM Air SIM

ラズパイにSIMを乗っけようと思ったら、メカトラックスさんの3GPIが最高であるという話はかねてから聞いていました。夜な夜なお祈りしていたら（嘘）、メカトラックスさん自身からボードをご提供いただけましたので（本当）、調子に乗って記事を書くことにしました。

まず、胸ワクで3GPI開封の儀です。

![0.jpg](https://qiita-image-store.s3.amazonaws.com/0/125904/e30da72b-0745-d663-35c1-054a41c2492a.jpeg)

左上がラズパイに乗っけるシールド本体、左下が3G用のアンテナです。シールドの左の方に金色の金具が２つくっついていると思います。この真ん中の方にアンテナをねじ込みます。下にもアンテナをつけられる箇所があり、ここに別売りの専用アンテナをつけるとGPSまで使えるようです。知らなかった！

真ん中下のSDカードは、ドライバ込のOS (Raspbian）イメージが書き込まれたもので、ラズパイ本体に差し込みます。つまり、自分でOSイメージを書きこむ必要がないわけです。個人的に、ラズパイ最初にして最大の困難がこのOSイメージを自分でSDに書き込むところだと思っているので、このフェーズをスキップできるのは大変うれしいですね！（ただしOSはRaspbian固定になります）

その上のUSBケーブルは、シールドとラズパイ本体の通信に使われるもので、本体側のUSBポートを一つ占有します。電源用じゃないので注意。

右端のACアダプタはシールドの電源です。シールドに電源供給されていれば、ラズパイ本体に電源を供給する必要がないのが地味に、しかしかなりうれしいです。

SIMは、たまたまSORACOM AirのナノSIMが手元にあったので使うことにしました。3GPIは標準SIMサイズなので、アダプターを付けて装着します。

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/125904/6e930dfd-cc9b-8f16-32a3-74f651572818.jpeg)

また、ラズパイとしては、これもたまたま手元にラズパイ1のModel B Rev.2があったので、かなり古いんですが使ってみました。

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/125904/9ae01a46-478b-d038-ef89-849b6d6be7fc.jpeg)

よーしこれでドッキング！！
と思ったのですが、刺さらないことにはたと気づきました。3GPIのピンは40本ですが、ラズパイBは古いのでピンの数が26本。それならまだしも、3GPIのソケットが、ラズパイ上のビデオ端子とぶつかっています！
それで、3GPIのソケットの方を加工するか、ラズパイ側の方を加工するか悩んだ結果、ラズパイのビデオ端子は使ったことがないし、今後も使うとは思えなかったので、こっちをニッパーで切り離してくっつけることにしました。

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/125904/e33c7be7-5928-f2cc-775d-7bdd30b3d95f.jpeg)

残酷…
しかし、これで無事にドッキングできました！

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/125904/d13ab3c9-ebfb-4c67-2b8b-9c68a8ed5e1b.jpeg)

ケーブルも挿していくとこんな感じになります。残ったUSBポートにキーボードを、HDMIにディスプレイを挿して起動です。もちろん他のPCなどからsshで入っても問題ありません。

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/125904/26db3075-bfe6-7010-9848-e61b836a2684.jpeg)

これでラズパイを起動すると、おなじみのラズパイコンソールが出ます。ここで

`ping www.google.com`

と打ってみると…

![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/125904/ab02d67a-b672-e476-2d44-8f2cd6a6410a.png)

よっしゃあああ！！！！

SORACOM AirかIIJmioのSIMであれば、何も設定することなく接続できるって説明書に書いてありましたが偽りはありませんでした。これは簡単でいいですね！

ただし旧世代のラズパイにこだわる人はニッパーが必要なのでご注意を（笑
メカトラックスさん公式には

> ※Raspberry Pi model B については別途御問い合わせ下さい

とのことです。頼めばピンが少ないものを送ってくれるのかも。ニッパー作戦実行時には自己責任でお願いします！

最後に蛇足ですが、Ethernetと3G両方を使う場合、デフォルトだとEthernetが優先に使われるようです。3Gを優先にするには、

`sudo route del default dev eth0`
`sudo route add default dev ppp0`

の２コマンドを打つ必要があります。インターネット接続のない閉じたLANにラズパイ＋3GPIを入れて外の世界とやりとりさせたいようなときには役立つかもしれません。

ここら辺の設定について詳しく書いてくださっている方がいるので、ご興味のある方は是非ご覧ください。
http://qiita.com/dietposter/items/ac9108b8eaebb90e8050
Data Binding ライブラリの BindingAdapter と XML 名前空間

Data Binding ライブラリの `BindingAdapter` アノテーションの話。 (Data Binding ライブラリの 2.1 で確認した。)

[Data Binding Guide](https://developer.android.com/topic/libraries/data-binding/index.html) によると、アプリケーション名前空間 (http://schemas.android.com/apk/res-auto) に属する XML 属性に対する独自セッター (custom setter) の定義方法は以下のような感じになっている。

```java
@BindingAdapter({"bind:imageUrl", "bind:error"})
public static void loadImage(ImageView view, String url, Drawable error) {
   Picasso.with(view.getContext()).load(url).error(error).into(view);
}
```

属性名のプレフィクスとして `bind:` が使われている。

だが、実際に上のようなコードを書いても、ビルド時に 『Application namespace for attribute bind:imageUrl will be ignored.』 みたいな警告が表示される。

実際にどうすればいいのかはちゃんとドキュメントには書かれてないので絶対に正しいかどうかはわからないが、おそらくはプレフィクスを何もつけないのがライブラリ開発者の想定している使い方だと思われる。 下のような感じ。

```java
@BindingAdapter({"imageUrl", "error"})
```

警告を出すようになった変更自体は去年の 2015 年の 5 月にコミットされてる。

* https://android.googlesource.com/platform/frameworks/data-binding/+/1331801%5E!/

コミットメッセージには 『Give warning when BindingAdapter uses namespace.』 って書かれてる。 理由は謎。 『Bug 20725101』 というのもコミットメッセージに書かれてるけど、このバグがどれなのかはググってもわからなかった。 少なくとも [AOSP のバグトラッカー](https://code.google.com/p/android/)に登録されているものではなさそう。

そんなわけで明確な理由はわからないけど、多分 『XML の名前空間接頭辞はあくまで XML の文書中で特定の名前空間 URI に紐づけられるものなので、Java のアノテーションでいきなり名前空間接頭辞が出てきてもそれが実際の名前空間 URI として何に紐づけられるべきなのか判断できない』 という理由で名前空間接頭辞は付けないようになったんじゃないかなーと思う。 つまり、基本的には全てアプリケーション名前空間に属する属性として扱うようになった、と。 ただ、アプリケーション名前空間と http://schemas.android.com/apk/res/android の名前空間の区別は必要なので、後者の名前空間を表すものとして例外的に `android:` は残されてるぽい。

Stack Overflow にもこの話題はあった。

* [Android DataBinding Custom Binding Adapter Warning](http://stackoverflow.com/questions/35313466/android-databinding-custom-binding-adapter-warning)
* [Android dataBinding - @BindingAdapter custom app namespace being ignored](http://stackoverflow.com/questions/35065953/android-databinding-bindingadapter-custom-app-namespace-being-ignored)
Java に C# の LINQ を移植した

# Java で LINQ - visGeekCollections

Java 8 がリリースされてラムダ式を書けるようになったのに、いまいち使いづらい Stream API にがっかりしたので C# の LINQ を移植しました。**[visGeekCollections](https://github.com/visGeek/JavaVisGeekCollections)** を使うと C# の LINQ の構文をほとんどそのまま使えるようになります。

# ソースコード
GitHub にて公開しています。不具合などがありましたらご連絡ください。
**[visGeekCollections(GitHub)](https://github.com/visGeek/JavaVisGeekCollections)**

# LINQ to Object

LINQ を使うと配列、リスト(`List<E>`)、マップ(`Map<K, V>`)、セット(`Set<E>`)などのシーケンシャルなデータの検索や操作を簡単に行うことができます。

````Java:従来の書き方
List<Integer> values = new ArrayList<>(); // リストを用意して
for (int val : new int[] { 2, 4, 6, 1, 5, 3 }) { // 数値の配列のうち
	if (val <= 3) { // 3 以下の値を
		values.add(val); // リストに入れて
	}
}
Collections.sort(values); // リストをソートする。
````

````Java:LINQ
List<Integer> values =
		Enumerable.of(2, 4, 6, 1, 5, 3) // 数値の配列のうち
				.where(val -> val <= 3) // 3 以下の値を
				.orderBy(val -> val) // 昇順にソートして
				.toList(); // リストに変換する
````

# 使い方
- 既存のシーケンシャルデータを `IEnumerable<T>` に変換する。

````Java
// 配列
Cat[] catArray = ...;
IEnumerable<String> source = Enumerable.of(catArray);

// List など
List<Cat> catList = ...; // Iterable<T> を継承したオブジェクト
IEnumerable<Cat> source = Enumerable.of(cats);
````

- その場で作る

````Java
// 可変長引数
IEnumerable<Integer> source = Enumerable.of(1, 2, 3);

// リスト
EnumerableList<Integer> list = new EnumerableList<>(); // extends ArrayList<E> implements IReadOnlyList<T>
EnumerableLinkedList<Integer> linkedList = new EnumerableLinkedList<>(); // extends LinkedList<E> implements IReadOnlyList<T>

// マップ
EnumerableMap<String, Integer> map = new EnumerableMap<>(); // extends HashMap<K, V> implements IReadOnlyMap<T>
EnumerableLinkedMap<String, Integer> linkedMap = new EnumerableLinkedMap<>(); // extends LinkedHashMap<K, V> implements IReadOnlyMap<T>

// セット
EnumerableSet<Integer> set = new EnumerableSet<>(); // extends HashSet<E> implements IReadOnlySet<T>
EnumerableLinkedSet<Integer> linkedSet = new EnumerableLinkedSet<>(); // extends LinkedHashSet<E> implements IReadOnlySet<T>
````

- 独自のコレクションクラスを作る

````Java
public class CatCollection implements IEnumerable<Cat> {
	private final ArrayList<Cat> cats = new ArrayList<>();
	
	@Override
	public Iterator<Cat> iterator() {
		return this.cats.iterator();
	}
}
````

# 特徴

- LINQ と同様に遅延実行されます。`select()` などでは無駄なバッファリングをせず、つど yield する処理になっています。
- 標準の `List`、`Map`、`Set` を置き換えることができる各種コレクションクラスがあります。.NET のクラスと同様に `IReadOnly*` インターフェイスを実装しています。
- プリミティブ型、プリミティブ型配列、プリミティブ型のラッパークラスとその配列に対応しています。
- 集計メソッド(`sum`、`max`、`min`、`average`)は `BigDecimal` 型に対応しています。
- `Enumerable.of(...)` に渡したソースが配列、`Collection<T>`、`List<E>` である場合、`elementAt()`、`count()` などの処理がランダムアクセスによって最適化されます。



# 参考
- [Microsoft Reference Source - Enumerable.cs](http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs)
BigQuery | JOIN EACH を複数使うとメチャクチャ重い問題

## 1. JOIN の後に JOIN

普通に実行できる。

```sql
SELECT
  *
FROM
  dataset.table1 AS table1
JOIN
  dataset.table2 AS table2
ON
  table1.id = table2.id
JOIN
  dataset.table3 AS table3
ON
  table2.category = table3.category
```

## 2. JOIN EACH の後に JOIN

むしろクエリ１より速い。

```sql
SELECT
  *
FROM
  dataset.table1 AS table1
JOIN EACH
  dataset.table2 AS table2
ON
  table1.id = table2.id
JOIN EACH
  dataset.table3 AS table3
ON
  table2.category = table3.category
```

## 3.JOIN EACH の後に JOIN EACH 

何分経っても結果が返ってこない。原因は不明。

```sql
SELECT
  *
FROM
  dataset.table1 AS table1
JOIN EACH
  dataset.table2 AS table2
ON
  table1.id = table2.id
JOIN EACH
  dataset.table3 AS table3
ON
  table2.category = table3.category
```

でもお金はかかっていない様子。(たぶん)

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/62875a61-d76e-0b8c-6f57-0a3a0147e1d9.png)

# 補足

- 2016/05/17 現在の情報。
- 環境によるかもしれません。他の報告求む。



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Cloud9でGAE/Goの環境構築

Cloud9でGAE/Goが開発したいということなので
自分で試してみたことのメモ

# Cloud9　とは
https://c9.io
ブラウザでアプリケーションの開発ができるサービスということで
無料でも結構使えるらしい

# 前提
Cloud9のアカウントを取得して
プロジェクトはUbuntuをベースに作成

# GAE/Go SDK のインストール
`cd ~`とかでHOMEディレクトリに移動して以下のコマンドでささっとSDKをインストール

```bash
$ curl -s -o go_appengine.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.37.zip
$ unzip -q go_appengine.zip
$ rm -f go_appengine.zip
```

https://gist.github.com/k2wanko/bd7707e481c13adddc577292a7a3dd20
一発でインストールするようのシェルスクリプト

bashrcにPATHを追加しておく

```bash:.bashrc
export PATH=$PATH:/home/ubuntu/go_appengine:$GOPATH/bin
```

# Editorの設定

ExperimentalでGoのコード補完に対応しているので
それを有効にする

[Preferences]->[Experimental]->[Language]の[Go　Code　Completion]をオンにする

# goimportsの設定

コード補完もそうだがGoの開発で必須と言ってもいいgoimportsも設定しておく

以下のコマンドでインストール

```bash
$ go get golang.org/x/tools/cmd/goimports
```

左上の[Cloud9]->[Open Your Init Script]でinit.jsを開いて

以下のJSを追加する

```js:init.js
var path = require('path');

var execGoFmt = function execGoFmt(filepath) {
    services.proc.execFile('bash', {
        args: ['-c', 'goimports -w ' + path.join(services.c9.workspaceDir, filepath)]
    }, function (e, a) {
        console.log(e, a);
    });
};

services.save.on('afterSave', function (e) {
    if (e.path && e.path.endsWith('.go')) {
        execGoFmt(e.path);
    }
}, plugin);

services.format.on('format', function (e) {
    if (e.mode !== 'golang') return;
    var tab = e.editor.ace.session.c9doc.tab;
    services.save.save(tab, {}, function () {
        execGoFmt(tab.path);
    });
    return true;
}, plugin);
```

参考: https://community.c9.io/t/init-script-example/2528

保存したら左上の[Cloud9]->[Resatrt Workspace]で再起動しておく

これでgoを保存したらgoimportsでコードフォーマットと依存パッケージを追加してくれるようになる。

本当はプラグインまで作ろうと思ったのだけどなんかめんどくさそうだったので
後回しにした。

# Hello World

ここまで来たら後は動作確認

事前に`go get`で依存パッケージをインストールしておく

```bash
$ go get -u google.golang.org/appengine
```

`app.yaml`と`main.go`を作成する

```yaml:app.yaml
runtime: go
api_version: go1

handlers:
  - url: /.*
    script: _go_app
    secure: always
```

```go:main.go
package main

import (
	"fmt"
	"net/http"

	"google.golang.org/appengine"
	"google.golang.org/appengine/log"

	"golang.org/x/net/context"
)

func init() {
	http.HandleFunc("/", handle)
}

func handle(w http.ResponseWriter, r *http.Request) {
	ctx := newContext(r)
	log.Infof(ctx, "Index")
	fmt.Fprintf(w, "ok")
}

func newContext(r *http.Request) context.Context {
	return appengine.NewContext(r)
}
```

参考: https://cloud.google.com/appengine/docs/go/

ローカルの環境では`goapp serve`ですぐみれるようになるが
Cloud9では以下のコマンドで起動することでブラウザからでも見れるようになる。

```bash
$ dev_appserver.py --skip_sdk_update_check true --host $IP --port $PORT --admin_host $IP --admin_port 8081 .
```

※`.`はapp.yamlの位置を指定、今回はカレントディレクトリにあるので`.`

Applicationは `https://[ProjectID]-[UserName].c9users.io`にアクセス
管理画面は `https://[ProjectID]-[UserName].c9users.io:8081`にあるのでCronとかDatastoreとかはここで中を確認できます

今回試してみたプロジェクトは以下なので　ファイル構成とか確認に使ってください
https://ide.c9.io/k2wanko/gaegoexample


# 感想

こういうCloudIDEは初めて触ってみたのですが、勉強会とかでMacとかWindows使ってる人でも統一した環境を用意できるのでかなりいいと思いました

ちなみにターミナルでemacs開いてみたら普通に使えたのですが、emacsで環境構築したら負けかなと思ったので一応使えるかなというところまでは作ってみました。
virtualbox uuid does not match

virtualboxでvdiを入れ替えたりしていたら、仮想マシンを起動するタイミングで下記のようなエラーが出た。

仮想マシン"centos"のセッションを開けませんでした。
UUID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx} of the medium '/Users/zzzz/VirtualBox VMs/centos/centos.vdi' does not match the value {yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyy} stored in the media registry ('/Users/zzzz/.VirtualBox/VirtualBox.xml').
終了コード : NS_ERROR_FAILURE (0x80004005)
コンポーネント: Medium
インターフェース: IMedium {53f9cc0c-e0fd-40a5-a404-a7a5272082cd}

.vdiファイルが置かれているフォルダに.vboxファイルがある。virtual boxが終了している状態で
このファイルをエディタで開く。

開くと上記エラーのyyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyと同じ文字列が2箇所あるはず。
これをxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxに変更して保存し、virtual boxを起動して、仮想マシンを起動すると
正常にcentosが起動した。
備忘録【androidブラウザ（デフォルト）】で背景画像のrepeat-yが効かない

# まとめて指定がダメだったっぽい
```
background: url("../images/sp/bg_xxxxx.png") repeat-y left top;

```

ググって出てきた記事
[CSSでbackgoundプロパティに複数の指定を記述するとAndroidで不具合が出る](http://rabbit-punch.com/web/1317)

# 個別に指定しなおした
```
background-image: url("../images/sp/bg_xxxxx.png");
background-repeat: repeat-y;
background-position: left top;

```

### 治りませんでした。。
これは、原因出なかったよう。。


### 背景画像の縦サイズが1px。これが問題？
続いて、リピートyしている画像が、
縦**1px**だったので、
2pxにしてみた。

だめだった。

#改善策→縦3px以上にする（正解じゃないと思いますが）
### 縦に伸ばす背景画像の縦サイズを3px以上にする
一応、これで、治りました。


# ついでに、、1pxほどの隙間ができる不具合
あと、background imageに、
以下のように、複数画像を指定すると、
1px（実際には1pxじゃない）ほどの隙間ができてしまう。。
これ、解明できませんでした。。
どなたか教えて頂けると幸いです。

```
  background:
  url("../images/aaa.png") no-repeat left top,
  url("../images/bbb.png") no-repeat right top,
  url("../images/ccc.png") no-repeat right bottom,
  url("../images/ddd.png") no-repeat left bottom,
  url("../images/eee.png") repeat-x left top,
  url("../images/fff.png") repeat-y right top,
  url("../images/ggg.png") repeat-x left bottom,
  url("../images/hhh.png") repeat-y left top,
  black;
```

## ↓同じような症状が出たという方の記事
[スマートフォンサイト制作で、要素と要素の繋ぎ目に謎の境界線が出来る場合の対応](http://astone-labo.blogspot.jp/2014/01/blog-post.html)