OmniAICreator/Qiita-1.07M huggingface dataset:
Chromium for android の Buildしてみた

###アンドロイド用のChromiumをビルドする方法
先ずは、[build用マシン](https://chromium.googlesource.com/chromium/src/+/master/docs/linux_build_instructions.md)を用意する。

```bash:command
~$ git clone https://chromium.googlesource.com/chromium/tools /depot_tools.git
~$ export PATH=$PATH:~/depot_tools
~$ git config --global color.ui true
~$ mkdir ~/chromium && cd ~/chromium
~/chromium$ fetch --nohooks android --nosvn=True
~/chromium$ echo "{ 'GYP_DEFINES': 'OS=android target_arch=ar m', }" > chromium.gyp_env
~/chromium$ gclient runhooks
~/chromium$ cd src
~/chromium/src$ gn args out/Default
~/chromium/src$ ninja -C out/Default chrome_public_apk
```
cronの先頭に書いておくと便利

cronの先頭に書いておくと便利

```
# （行頭の # マークはコメント行を示す）
# +------------ 分 (0 - 59)
# | +---------- 時 (0 - 23)
# | | +-------- 日 (1 - 31)
# | | | +------ 月 (1 - 12)
# | | | | +---- 曜日 (0 - 6) (日曜日=0)
# | | | | |
# * * * * * 実行されるコマンド
```
PythonでNamespace指定のXMLを読む

PythonでXMLを読む話が舞い込んだので調査をしました。
扱っているXMLタグの構成がnamespace:tag_nameの形式のものがあり、
namespace付きのタグがうまく検索できなかったため、コードをまとめました。

サンプルコードのURLを加えてなかったので追加しました。
[サンプルコード](https://github.com/Synashida/XMLReadForPython)

phpならsimplexml_load_stringで読み込めます。
phpの場合は namespace_tag_nameに変換されるので気にせずノードの検索ができます。

pythonだと事前にnamespaceを配列に格納し、find関数を実行するときにnamespaceの配列を渡してあげないと検索できません。

そんなわけでnamespaceのあるXMLの読み込み方法

まずは読み込むXMLの内容を抜粋します。こんなタグ構成です。

```MESH03622.gml
<?xml version="1.0" encoding="UTF-8"?>
<gml:FeatureCollection xmlns:fme="http://www.safe.com/gml/fme" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.safe.com/gml/fme MESH03622.xsd">
<gml:boundedBy>
<gml:Envelope srsName="EPSG:4612" srsDimension="2">
<gml:lowerCorner>24.4333333329177 122.924999999934</gml:lowerCorner>
<gml:upperCorner>24.4833333336014 123.000000000218</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<gml:featureMember>
<fme:MESH03622 gml:id="id060c8300-20cf-4750-b6a6-6b9730bc8fb3">
<fme:FID>0</fme:FID>
<fme:KEN_ID>47</fme:KEN_ID>
<fme:KEY_CODE>36225734</fme:KEY_CODE>
<fme:MESH1_ID>3622</fme:MESH1_ID>
<fme:MESH2_ID>57</fme:MESH2_ID>
<fme:MESH3_ID>34</fme:MESH3_ID>
<gml:surfaceProperty>
<gml:Surface srsName="EPSG:4612" srsDimension="2">
<gml:patches>
<gml:PolygonPatch>
<gml:exterior>
<gml:LinearRing>
<gml:posList>24.4416666664184 122.925000000467 24.4500000000747 122.924999999934 24.4500000002353 122.937499999765 24.4416666669395 122.937499999636 24.4416666664184 122.925000000467</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:PolygonPatch>
</gml:patches>
</gml:Surface>
</gml:surfaceProperty>
</fme:MESH03622>
</gml:featureMember>
```

そのXMLを読み込むためのPythonスクリプト

```ReadXMLSample.py
from pprint import pprint
import os
import xml.etree.ElementTree as ET

  # XMLに指定されているNameSpaceをそれぞれ登録する
  # xmlns:fme="http://www.safe.com/gml/fme" これは 'fme' : 'http://www.safe.com/gml/fme' となる
  ns = {'gml': 'http://www.opengis.net/gml', 'fme': 'http://www.safe.com/gml/fme', 'xlink': 'http://www.w3.org/1999/xlink'}
  tree = ET.parse(fileName)
  root = tree.getroot()

  # AtrributeのsrsNameを取得する
  pprint ("envelope = " + root.find('gml:boundedBy/gml:Envelope', ns).attrib['srsName'].strip())

  # gml:featureMember以下を取得したい
  fmeNodes = root.findall('gml:featureMember', ns)

  records = []
  for itemNode in fmeNodes:
    # ルート以下のnodeの値が欲しい場合、rootからのパスを記述することで値が取得できる
    # findするときに namespaceの配列を指定するのを忘れずに！
    pprint ("KEN_ID = " + itemNode.find('fme:MESH03622/fme:KEN_ID', ns).text.strip())
    # 現在のitemNodeを基準に相対パス指定で取得可能
    pprint ("KEN_ID = " + itemNode.find('.//fme:KEN_ID', ns).text.strip())
    # pointlistが取得したい場合も同様でパスを記述する
    pprint ("posList = " + itemNode.find('fme:MESH03622/gml:surfaceProperty/gml:Surface/gml:patches/gml:PolygonPatch/gml:exterior/gml:LinearRing/gml:posList', ns).text.strip())
    # データが流れ過ぎないように便宜上break
    break
```

読み込み方はいくつか方法がありますが、読み込んだタグからの相対パスまたは絶対パスで指定すればいい。
そういうふうに考えておけばいいかなと。
AWS CLI で RDSのログを最初からすべて取得する

RDSのログを見たい
---
RDSのログ取得してSlowqueryなど見たい時ありますよね。
(見れるかは設定しだいですが...)

手軽に見る方法としてwebコンソール見たり、`aws　cli`の`download-db-log-file-portion`を利用する方法があります。
`aws cli`の使い方は単純で以下のようにすれば取得できます。

```bash
$ aws rds download-db-log-file-portion　--db-instance-identifier [RDSの名前] --log-file-name [取得したいログ名]
```

全部表示できない
---
手軽に実行できるのですが、１００００行？か超えるとそれより前のが切れて見れないようです。
ドキュメント読むと
`In order to download the entire file, you need --starting-token 0 parameter:`
と書いてあるのでつけて実行してみると...

```bash
$ aws rds download-db-log-file-portion　--db-instance-identifier [RDSの名前] --log-file-name [取得したいログ名] --starting-token 0
Bad starting token: 0
```
エラーになって取得できない…
ぐぐってみたけどよくわからない…

別のオプションを試す
---
`aws cli`にはjsonを読みこませるオプション(`--cli-input-json`)があるのでjsonを使ってみようとおもいます。
ちなみに、jsonのskeletonを生成するオプションもあるのでそれを利用します。

```bash
$ aws rds download-db-log-file-portion --generate-cli-skeleton 
{
    "DBInstanceIdentifier": "",
    "LogFileName": "",
    "Marker": "",
    "NumberOfLines": 0
}
```

パラメータ名全然違うな…
`Marker`ってのがログの位置？らしいのでそこに`0`を渡してやれば最初からとれるみたい。

すべてのログを取得するには
---

結果として私がログすべてを取得するのに利用した方法はこちら

```bash
$ aws rds download-db-log-file-portion　--db-instance-identifier [RDSの名前] --log-file-name [取得したいログ名] --cli-input-json '{ "Marker": "0" }'
```
これで全部取れた…はず…
ちなみに利用していたバージョンは以下なのでそんなに古いわけではない？

boto3のdownloadDBLogFilePortionは、Maker=0を指定した場合でも、最初の1Mのみしか取得できない。（1M以上の残りのログについては、1Mで切られます。）
boto3で実装する場合は、残りのデータがあるかをAdditionalDataPendingで確認できるので、次のMarkerポジションで指定して、続きのログを取得するようにしています。
https://github.com/aws/aws-sdk-js/issues/1463

DownloadCompleteDBLogFile APIがあるのだが、現状botocore等のSDKに対応していないので、対応が待たれるところ。

https://github.com/aws/aws-sdk-js/issues/1292


```bash
$ aws --version
aws-cli/1.10.8 Python/2.7.10 Linux/4.4.8-20.46.amzn1.x86_64 botocore/1.3.30
```

もっと綺麗に取れる方法があれば教えていただければ幸いです。
Javaだけで、webのフロントとサーバが作れるGWTを始めませんか？　その２

私は、GWTでのwebアプリ開発を開始して、もう何年にもなります。

世の中はweb2.0という、struts や phpが主流になりつつある感じでしたが、

その当時から、GWTはSingle page applicationでした。

理由は簡単です。

クライアント側も、サーバ側も、javaだけでいけるのです。

最近の多くが、フロントとサーバ側を違う言語で実装します。

GWTも、サーバー側を実はphpや他のアプリで利用することも可能ですが

やはり、javaを利用したRPC通信を行うと、すごく強力な通信が可能です。

皆さまも、GWTでチャレンジしてみてはいかがでしょうか
GalaxyProject の Galaxy で、job_conf.xmlを更新したのに、うまくジョブが実行できないとおもったら

# 概要

Galaxy で、job_conf.xml を更新したのに、うまく実行ができないように見えた。

# 結論

1. Galaxy を restart していない
2. 前のジョブが残っている。

1番目は、再起動してみると解消できることが多い。
2番目は、Adminの画面の、Manage jobs で、まだ動いているステートになっているものがあれば消す。
自分のヒストリーでジョブを消すというのでも良いかもしれない。
ClojureのREPLでよく使うvarを短縮する

REPL上で、ファイルの変更を反映するのに毎回↓するの、長いですね。

```clojure
(use '[clojure.tools.namespace.repl :only (refresh)])
(refresh)
```

[lein-shorthand](https://github.com/palletops/lein-shorthand)プラグインを使うとこう↓なります。楽ですね。

```clojure
(./r)
```

## lein-shorthand

任意の完全修飾シンボル名に対して、別名を付けることができます。  
上記の例で言えば、`clojure.tools.namespace.repl/refresh`という完全修飾シンボル名に`./r`という別名を付けています。  
もっと分解すると、`clojure.tools.namespace.repl`名前空間の`refresh`というシンボルに、`.`[^3]という名前空間の`r`というシンボルを付けています。  

[^3]: `.`じゃなくてももちろんOKです。

## Configuration

1. `project.clj`[^2]の`:plugins`キーに`com.palletops/lein-shorthand`を追加します。
2. さらに`:shorthand`というキーに`{<名前空間> [完全修飾シンボル名...]}`を書きます。

[^2]: もちろん`profiles.clj`などでもOKです。


## Example

自分の`profiles.clj`は↓のようにしてみました。

```clojure
{:user {:plugins [
          ; ....
          [com.palletops/lein-shorthand "0.4.0"] ; こいつが今回のテーマ
          ; ....
        ]
        :dependencies [
          ; ....
          [alembic "0.3.2"]
          [org.clojure/tools.namespace "0.2.11"]
          ; ....
        ]
        :shorthand {. [[r clojure.tools.namespace.repl/refresh]     ; clojure.tools.namespace.repl/refresh -> ./r
                       [pp clojure.pprint/pprint]                   ; clojure.pprint/pprint                -> ./pp
                       clojure.repl/doc                             ; clojure.repl/doc                     -> ./doc
                       clojure.repl/find-doc                        ; clojure.repl/find-doc                -> ./find-doc
                       clojure.repl/source                          ; clojure.repl/source                  -> ./source
                       alembic.still/distill                        ; alembic.still/distill                -> ./distill
                       alembic.still/lein]}}}                       ; alembic.still/lein                   -> ./lein
```


## Usage

ちゃんと、補完されます。いい感じですね！

![lein-shorthand.jpg](https://qiita-image-store.s3.amazonaws.com/0/37466/2415d0d8-82af-d844-a607-2586bf7a6957.jpeg)


## きっかけ

先日の[nishi-shinju-clojure#0](https://clojure-love.doorkeeper.jp/events/49296)の[高速！Clojure Web 開発入門](http://www.slideshare.net/ssuser8b0ea4/clojure-web)という発表の中で、[alembic](https://github.com/pallet/alembic)[^1]というleiningenのプラグインが紹介されており、そのalembicのREADMEで`lein-shorthand`が登場していました。

aleimbicは[pallet](https://github.com/pallet?utf8=%E2%9C%93&query=lein-)、lein-shorthandは[PalletOps](https://github.com/palletops)のGitHubOrganizationに置かれており、開発者は同じ方でのようです。

[^1]: alembicはエラーが出てなぜか結局動かせませんでした。。便利そうなのに。。
CentOS 7 でGNOMEデスクトップ環境構築

CentOS 7をインストールした際、デスクトップ環境を入れたつもりが入っていなかったとき、環境構築したときの方法です。

# GNOME Desktopのインストール

```
# LANG=C yum groupinstall "GNOME Desktop"
```

# Xの起動

```
# startx
```

デスクトップが表示されたら、初期設定を行なっておきます。

# ターゲットの変更
システム起動時にGUIで起動するようにターゲットを変更します。

```
# systemctl set-default graphical.target
```

# 再起動
設定が完了したら再起動します。
再起動時にライセンス情報が表示される場合がありますので、同意しておきます。

以上で完了です。

# 参考
- [[CentOS]CentOS7最小限のインストールからのGnomeデスクトップ環境構築 | Zero Configuration](http://goo.gl/JpCF0v)
CentOS6 で QCA8171 のドライバを入れてネットワークに繋いだ

# CentOS 7

QCA8171に対応済みだった。

# CentOS 6.8

- http://elrepo.reloumirrors.net/elrepo/el6/x86_64/RPMS/
    - kmod-alx-0.0-9.el6.elrepo.x86_64.rpm

`$ rpm -ivh kmod-alx-0.0-9.el6.elrepo.x86_64.rpm`
`$ vi /etc/sysconfig/network`

```:/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain
```

`$ vi /etc/sysconfig/network-scripts/ifcfg-eth0`

```:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 
BOOTPROTO=dhcp 
ONBOOT=yes
```

`$ reboot`


# CentOS 6.5

- CentOS 6.8 と手順は同じ
- kmod-alx-0.0-6.el6.elrepo.x86_64.rpm を入れたら動いた
Laravel5のformにデフォルト値NULLを許可する方法

たぶん常識なのでしょうが私はその常識すらもわからない素人ですのでメモ

### 何がしたいか

* 入力フォームがあったとする。
* 入力は任意。
* ユーザーが何か文字を入力している場合はそれをDBに登録。
* 何も入力しなかった場合はNULLをDBに登録。

### 実装

```
<?php // ファイルパス app/Http/Controllers/Admin/ItemsController.php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\ItemModel;

use Illuminate\Http\Request; // 実際に使用してるコードから少し改変してるので
use App\Http\Requests; // もしかしたらどっちかいらないかも

class ItemsController extends Controller
{
	public function store(Request $request)
	{
		$item = new \App\ItemModel();

		$item -> normal_column = $item -> normal_column = $request -> normal_column;
		$item -> nullable_column = empty($request -> nullable_column) ? $item -> nullable_column = NULL : $item -> nullable_column = $request -> nullable_column;

		$item -> save();

		return redirect('/');
	}
}
?>
```
Ruby on Railsのmigrationでdatetimeのデフォルト値をCURRENT_TIMESTAMPにする


## 結論
``` migrate
t.column   :update_date, 'DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP'
```

2016/7/28 追記
rails5だと下記でいけるっぽい
[こちらの記事より](http://qiita.com/mitz/items/b2295e440585ba63b083#default%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%8Cproc%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E6%B8%A1%E3%81%95%E3%82%8C%E3%81%9F%E3%82%89%E5%BC%8F%E5%B1%95%E9%96%8B%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB)
``` 
t.datetime :update_date, default: -> { 'NOW()' }
``` 
2016/7/28 追記ここまで

## 経緯
update_atとは別の用途で必要となったupdate_dateカラムには

「デフォルトは自動でレコード追加日が入るようにする。」

という定義のもと、もともとmigrationに
``` 
t.datetime   :update_date, default: DateTime.now
``` 
って書いてあって、db:migrate流して「show create table」すると
``` 
`update_date` datetime DEFAULT '2016-07-26 02:57:58',
``` 
あぁそうねそうね。そりゃそうなるよねっっっ当たり前ですよね！！
誰だよこんなのレビュー通したやつは。。。
```
`update_date` datetime DEFAULT CURRENT_TIMESTAMP
```
にしたいんですよ俺は！！！

でも。。。
``` 
t.datetime   :update_date, default: CURRENT_TIMESTAMP
``` 
とか書いても怒られるし。。。。

SQLで別途書くしかないのかなぁ。。。と思ってたら
以下の記事で同じように対応されてました！！ありがとうございます！！！！
> http://qiita.com/gozuqi/items/d63a9a3572240baf3c67

t.datetimeじゃなくて、t.columnにして、後から設定足してやる感じで色々できるのね。
Laravel5(Blade)のViewで改行させたいだけなのに少し悩んだ

Laravel5、と言うかBladeを使用したページで改行コードが入った文字列を表示させようとして少し悩んだのメモ。
PHPに不慣れだったりLaravelの情報を調べると4と5が混在していて探しにくいとか言い訳してみる。

# 環境
Mac OS X El Capitan 10.11.4
Laravel Framework version 5.2.39

#素直に改行させてみる

こんなのFrameworkとか関係なくPHPとHTMLの世界の話でしょ？
PHPに`nl2br`って便利な関数あるみたいだし楽勝じゃん！
と舐めきって書いたのが以下のコード。

controller.php
```$str = "文字列\n文字列";
return view('view')->with('str',nl2br($str, false));```

view.blade.php
```{{ $str }}```

出力結果
```文字列<br> 文字列```

うん、nl2br関数は効いてるけど上手にエスケープされてるね。
セキュアで素敵だね。でも今は素直に表示して頂きたい。

と言うか三重の波括弧`{{{ $str }}}`だとエスケープされるけど
二重の波括弧`{{ $str }}`ならエスケープされないんじゃないの？
と思ったらそれはLaravel4まででLaravel5ではどちらもエスケープされるとの事。

Laravel5でエスケープされないように修正。
view.blade.php
```{!! $str !!}```

出力結果
```文字列
文字列```
そう、これが見たかった。

ちなみにPHPのコード上で
```$str = '文字列\n文字列';```
と文字列をシングルクォートにすると\nが文字列として扱われるので`nl2br`すら効かずにそのまま出力される。
細かい、細かいよPHP。
java > 項目間のスペースの数を1つにする

[ここ](http://qiita.com/7of9/items/9553a7c5d1bd8a295faa#2%E7%95%AA%E7%9B%AE%E3%81%AE%E9%A0%85%E7%9B%AE%E3%81%AE%E8%AA%AD%E8%BE%BC%E3%81%BF)にて出てきた課題。

```
3.14  2.718  6.022  1023
```

上記のような文字列を空白1文字で(`' '`)でProcessingのsplitするとvals[1]には空白が入る。
vals[1]には2.718が入ってほしい。

split()の前に文字列置換すればいい。
http://stackoverflow.com/questions/7643999/how-to-remove-white-space-characters-in-between-the-string
のanswered Oct 4 '11 at 6:29 Prince John Wesley

http://ideone.com/JzTPUc

```java
import java.util.*;
import java.lang.*;
import java.io.*;
 
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		String str = "3.14  2.718    6.022      1023";
		str = str.replaceAll("\\s+", " ");
		System.out.println(str);
	}
}
```

```txt:結果
3.14 2.718 6.022 1023
```

この結果をsplit()するとvals[1]には2.718が入る。
Zabbixでログ監視

Zabbixでログ監視を行います。また、3.0からはログファイルから正規表現を利用して数値を取得できるようになったようです。

# 前提
Zabbixでログ監視を行うためには、エージェントのアクティブチェック関連の設定をする必要があります。
`zabbix_agentd.conf`の`ServerActive`に、「hostname:port」の形式でアクティブ監視を許可するZabbixサーバを指定します。

また、ログ監視するためにはzabbixユーザの権限が足りません。root権限で実行できるようにするためには、`zabbix_agentd.conf`の`# AllowRoot=0`を`AllowRoot=1`に変更すればよいですが、セキュリティ上よろしくありません。
そこで、ファイルのパーミッションを変更することで、zabbixユーザでもログを読めるようにします。

```
# chown root:zabbix /var/log/messages
# chmod 640 /var/log/messages
```

logrotateしても大丈夫なように設定を変更します。以下のように`create 0640 root zabbix`を追加しておきます。

```text:/etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    sharedscripts
    postrotate
	/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
    create 0640 root zabbix
}
```

# テンプレートの作成
テンプレートがない場合はあらかじめ作成しておきます。
Zabbixの「設定」->「テンプレート」でテンプレートの一覧が表示され、右上の`テンプレートの作成`から作成できます。

テンプレート名と適切なグループを設定し、`追加`します。

## アイテム
作成したテンプレートの「アイテム」を選択し`アイテムの作成`から作成します。
下記以外の設定は状況に応じて設定してください。
ログ監視のキーにはlog[], logrt[], eventlog[]が使用できます。詳細は[6 Log file monitoring [Zabbix Documentation 3.0]](https://goo.gl/R1Tgml)などを確認してください。

#### 例 (Postfix/LMTPの遅延を検出する)
- 名前：＊任意＊
- タイプ：Zabbixエージェント(アクティブ)
- キー：logrt[/var/log/maillog,"^.*postfix/lmtp.*delay=([0-9.]*), delays=.*$",,,,\1]
- データ型：数値(浮動小数)
- 単位：sec

## トリガー
障害感知できるように設定します。

## グラフ
必要であれば設定します。

# 参考
- [Zabbixでsyslog監視(CentOS 7編) - Qiita](http://goo.gl/TwVjRZ)
- [6 Log file monitoring [Zabbix Documentation 3.0]](https://goo.gl/R1Tgml)
- [Zabbixでログ監視 - Qiita](http://goo.gl/g2wuYE)
spark sqlのdf.saveAsTableはdefaultでgz + parquetでdataは保存される。


# hiveで普通にtsvをloadする

- tsvデータをhdfsにおく
- hiveからload data でinsertする。
- hiveのtableは最も効率(処理、空間）が悪いっぽい textformat 
- and sequencefile

```textformat
7.84 MB	2016/7/26 10:58:24	3	128 MB	sample.tsv
```


```sequencefile
9.07 MB	2016/7/26 12:22:09	2	128 MB	000000_0
```
した場合

- textformatの場合、tsvがそのまま, hiveのtable dataになる。
- 非圧縮でのsequence fileの場合、当然、元データサイズと同じくらいになる、

# spark sql data frameのsaveAsTableでtable作成、insertをした場合

- tsvをtextFileで読み込み、caseクラスでRow型に変換して、toDFでdataframeに変換して、saveAsTableでhive tableとして保存する。

- オプション設定はなし、default

```
175.17 KB	2016/7/26 11:27:47	2	128 MB	part-r-00000-3261acea-9b2b-495a-8db5-8f81cef47ca1.gz.parquet
171.1 KB	2016/7/26 11:27:47	2	128 MB	part-r-00001-3261acea-9b2b-495a-8db5-8f81cef47ca1.gz.parquet
```
の場合

- gz.parquet suffixのfileが2つ生成
- サイズ、suffixからgz圧縮＋parquet format

show create tableの表示からも確認

```
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
WITH SERDEPROPERTIES ( 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
TBLPROPERTIES (
  'COLUMN_STATS_ACCURATE'='false', 
  'EXTERNAL'='FALSE', 
  'numFiles'='2', 
  'numRows'='-1', 
  'rawDataSize'='-1', 
  'spark.sql.sources.provider'='org.apache.spark.sql.parquet', 
  'spark.sql.sources.schema.numParts'='1', 
```

# snappy codec オプションを指定した場合

- sqlContext.setConfで

```

sqlContext.setConf("spark.sql.parquet.compression.codec", "snappy")
sqlContext.setConf("parquet.compression", "SNAPPY")
```

でsaveAsTableで保存した場合

```
235.3 KB	2016/7/26 11:19:10	2	128 MB	part-r-00000-5d10d91c-d05d-4be6-9c40-d6c7db9c56cc.snappy.parquet
228.73 KB	2016/7/26 11:19:07	2	128 MB	part-r-00001-5d10d91c-d05d-4be6-9c40-d6c7db9c56cc.snappy.parquet
```

- snappy + parquetで保存される。
- ↓のshow create table の結果でもわかる。

```
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
WITH SERDEPROPERTIES ( 
  'spark.hadoop.mapred.output.compress'='true', 
  'spark.hadoop.mapred.output.compression.codec'='org.apache.hadoop.io.compress.SnappyCodec', 
  'spark.hadoop.mapred.output.compression.type'='BLOCK') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
TBLPROPERTIES (
  'COLUMN_STATS_ACCURATE'='false', 
  'EXTERNAL'='FALSE', 
  'numFiles'='2', 
  'numRows'='-1', 
  'rawDataSize'='-1', 
  'spark.sql.sources.provider'='org.apache.spark.sql.parquet', 
  'spark.sql.sources.schema.numParts'='1', 
```
ASP.NET MVC + EntityFramework で初期値投入に手こずったときに見直すこと

# ASP.NET MVC + EntityFramework で初期値投入に手こずったときに見直すこと

新しいプロジェクトを作るといつも DB に初期値を放り込むまでの手順を忘れるので自分用の備忘録として残す。

## 情報

- [Getting Started with Entity Framework 6 Code First using MVC 5](https://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application)

- [Data Developer Center > Learn > Entity Framework > Get Started > Config File Settings](https://msdn.microsoft.com/en-us/data/jj556606)

## 構成

- ~/Models/Config.cs
- ~/Repositories/MyContext.cs
- ~/Repositories/MyInitializer.cs

## 手順

新規 MVC プロジェクトを作成した状態から、モデル Config の内容が初期化されるまでの手順を示す。

- モデル Config を定義する。

```csharp
public class Config
{
  public int Id { get; set; }
  public string Key { get; set; }
  public string Value { get; set; }
}
```
- DbContext から派生した MyContext を定義する。

```csharp
public class MyContext : DbContext
{
  public MyContext() : base("MyStore")
  {
    // Lazy Loading を禁止する - お好みで
    Configuration.LazyLoadingEnabled = false;
  }

  public DbSet<Config> Configs { get; set; }
}
```

- MyInitializer を定義する。

  ```csharp
public class MyInitializer :
//DropCreateDatabaseIfModelChanges<MyContext>
//DropCreateDatabaseAlways<MyContext>    // 初期はこれが便利
CreateDatabaseIfNotExists<MyContext>
{
   protected override void Seed(MyContext context)
 {
    base.Seed(context);

    // Config エンティティを初期化
    var configs = new List<Config>
    {
      new Config { Key = "key1", Value = "value1" },
      new Config { Key = "key2", Value = "value2" }
    };
    configs.ForEach(x => context.Configs.Add(x));
    context.SaveChanges();
  }
}
```

- Web.config 設定を更新する。

```xml
<connectionStrings>
  <add name="MyStore" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=MyStore;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionString>
<entityFramework>
  <contexts>
    <!-- MyTest はアセンブリ名、ビルドしたときにできる dll の主ファイル名と思ってよし -->
    <context type="MyTest.Repositories.MyContext, MyTest">
      <databaseInitializer type="MyTest.Repositories.MyInitializer, MyTest" />
    </context>
  </contexts>
</entityFramework>
```

- Web.config の代わりにコードで初期化クラスを指定する場合は、

```csharp
// Global.asax
public class MvcApplication : System.Web.HttpApplication
{
  protected void Application_Start()
  {
    Database.SetInitializer(new MyInitializer());
  }
}
```

- スキャフォールディングを使って、コントローラを生成する。

- アプリケーションを実行し、生成したコントローラを呼び出す。

`http://localhost:60444/Configs/Index`

- すると、

  1. スキャフォールディングが出力したコントローラが生成され、その過程で、
  2. DbContext が生成され
  3. Initializer.Seed が呼ばれてから
  4. アクションが実行される。

以上。

## 確認した環境

- ASP.NET MVC
- 日本語 Windows 10 Home 64ビット
- Visual Studio 2015 Community, IIS Express
PHPの日付書式

# date関数

[マニュアル](http://php.net/manual/ja/function.date.php)より抜粋
## コード
```php
<?php
// YYYY/MM/DD形式
echo date("Y/m/d") . "\n";
// YY/M/D形式（先頭0付けない）
echo date("y/n/j") . "\n";
// MMM(月英語3文字)
echo date("M") . "\n";
// DDD(曜日英語3文字)
echo date("D") . "\n";
// 曜日
echo date("w") . "\n";
$week = array("日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日");
echo $week[date("w")] . "\n";
// HH24:MI:SS形式(24時間表記)
echo date("H:i:s") . "\n";
// am|pm HH:MI:SS形式
echo date("a h:i:s") . "\n";
// AM|PM HH:MI:SS形式
echo date("A h:i:s") . "\n";
```
## 実行結果
```
2016/07/26
16/7/26
Jul
Tue
2
火曜日
03:02:10
am 03:02:10
AM 03:02:10
```
wordpress　再度立ち上げる方法

自分の備忘録として記載。

・過去作成したワードプレスを立ち上げる方法。

1:MAMPを立ち上げる。
　

今回はインストール直後でしたのでログイン画面へのボタンがありましたが、通常は「http://サイトのURL/ファイルを配置したディレクトリ/wp-login.php」からログイン画面へアクセスすることができます。(ローカル環境にインストールした場合などは例えば http://localhost/wordpress/wp-l
ogin.php となります)。




・MAMPで複数のローカルホストを立ち上げる方法
http://qiita.com/tsukishimaao/items/cab4caa065d901608856
※こちらのリンク先は、ローカルホストを複数立ち上げる方法が記載。
現時点では、同じホストで運用している。状態。ローカルホスト：８８８８　で立ち上げ中」
動作報告（Elasticsearch 2.3.4 + Apache Nutch 2.4）

#動作環境
Cloudera 5.7
Elasticsearch 2.3.4
Apache-Nutch 2.4 (2.x branchの最新clone)

#ポイント
Apache-NutchのIndexer-elastic2プラグインにより、Elasticsearch 2.x系にデータを入れれるようになりました。

conf/nutch-site.xml
```xml
  <property>                                                                                                                                                                            
    <name>plugin.includes</name>                                                                                                   
    <!-- do **NOT** enable the parse-html plugin, if you want proper HTML parsing. Use something like parse-tika! -->                                                                   
    <value>protocol-httpclient|urlfilter-regex|parse-(text|tika|js)|index-(basic|anchor)|query-(basic|site|url)|response-(json|xml)|summary-basic|scoring-opic|urlnormalizer-(pass|regex|basic)|indexer-elastic2</value>                                                                                                                                                        
  </property>  
```
最後のindexer-elasticをindexer-elastic2に変えるとElasticsearch 2.x系にデータが入ります。
JQuery【メモ】

JQueryのメモ

# 値をセットする

```html
<html lang="ja">
    <head>
        <meta charset="uTF-8">
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js""></script>
        <title>さんぷる</title>
    </head>
    <body>
        <script> 
        $(function() {
            $('#text_update').text("ああああ");
            $('#update_input_text').val("123456");
            $('#update_html').html('<b>aaa</b>');
        });
        </script>
        <span id="text_update"></span>
        <form method="post">
            入力：<input type="text" name="namae" size="40" id="update_input_text">
        </form>
        <p id="update_html"></p>
    </body>
</html>
```

valとtextで間違えやすいので注意。
テキストをそのまま置く場合にはtextを使う。


追記
タグがあるときはシングルコーテーションで囲った方がいいかも。(上記ソース修正済)
このままgithubにあげたら警告？(コードが赤くなる)が出たので。

#～.clickと$(document).onの違い

```html
<html lang="ja">
    <head>
        <meta charset="uTF-8">
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js""></script>
        <title>さんぷる</title>
    </head>
    <body>
        <script> 
        $(function() {
            $('.button').click(function(){
                 alert("clickイベント");
            });
            
            $(document).on('click', '.button2', function(){alert("onイベント");});

        });
        </script>
        <a href="" class="button">click</a><br>
        <a href="" class="button2">on</a>
    </body>
</html>
```

～.click：その要素に対してイベント発生。FW等でまだ描画してない場合、完了しない。
$(document).on：ページ全体を描画してからイベント発生。
※ソースだと違いはわかりません。(書き方忘れそうだったから追加)
Ajaxで「No 'Access-Control-Allow-Origin' header is present on the requested resource」エラーが出たら。。。

要はクロスドメインの問題です。ネットいろいろ書いてあるが、私の場合、ajaxのBodyに以下の行を追加したら解決できました。

            crossDomain: true,
            dataType: "jsonp",
vagrant up でVagrant has detected that you have a version of VirtualBox installed that is not supported と言われる。

Vagrant upが失敗する

# Vagrant upが失敗

```
vagrant up

The provider 'virtualbox' that was requested to back the machine
'default' is reporting that it isn't usable on this system. The
reason is shown below:

Vagrant has detected that you have a version of VirtualBox installed
that is not supported. Please install one of the supported versions
listed below to use Vagrant:

4.0, 4.1, 4.2, 4.3
```
Vagrantのバージョンが問題みたいです。

```
vagrant -v
Vagrant 1.7.2
```

# Vagrantをバージョンアップ
最新版をダウンロードしました。
https://www.vagrantup.com/downloads.html

```
vagrant -v
Vagrant 1.8.5
```

# 再度Vagrant up
こんどはうまくいきました。
JavaScriptで重複チェックをして配列に追加する方法

###配列に同じ値がないときのみ、追加したい

・DB（配列）に登録済みかどうか調べる
・DB（配列）になければ登録、あれば登録しない

*IsArrayExists(array, value)*
array（配列）にvalue（同じ値）が既に存在するかを調べる

```js:myscript.js
function IsArrayExists(array, value) {
  // 配列の最後までループ
  for (var i =0, len = array.length; i < len; i++) {
    if (value == array[i]) {
      // 存在したらtrueを返す
      return true;
    }
  }
  // 存在しない場合falseを返す
  return false;
}
```

*PushArray(array, value)*
配列の最後に追加する

```js:myscript.js
…

// 重複を排除しながらpushする関数
function PushArray(array, value) {
  // 存在しない場合、配列にpushする
  if(! IsArrayExists(array, value)) {
    array.push(value);
  }
  return true;
}
```

*UnshiftArray(array, value)*
配列の最初に追加する場合

```js:myscript.js
…

// 重複を排除しながらunshiftする関数
function UnshiftArray(array, value) {
  // 存在しない場合、配列にpushする
  if(! IsArrayExists(array, value)) {
    array.unshift(value);
  }
  return true;
}

```
参考
http://d.hatena.ne.jp/replication/20140227/1393465335

###おまけ 配列の追加・取り出しに関する4つのメソッド（unshift, shift, pop, push）
![配列の追加・取り出しに関する4つのメソッド（unshift, shift, pop, push）](http://cdn-ak.f.st-hatena.com/images/fotolife/m/maeharin/20130122/20130122135827.jpg)
引用：http://maeharin.hatenablog.com/entry/20130122/unshift_shift_pop_push
hiveのdesc formatted [table_name]で表示されるcompressedの表示は信用できない 

というか、いつも、Noなので、見てもしょうがない。
>  Note: The Compressed field is not a reliable indicator of whether the table contains compressed data. It typically always shows No, because the compression settings only apply during the session that loads data and are not stored persistently with the table metadata.
```

http://www.cloudera.com/documentation/archive/impala/2-x/2-0-x/topics/impala_describe.html
Macで始める、はじめてのDocker（１歩目）

Dockerのお勉強メモ、ちょっとずつ色々調べつつやって行きます。

#MacにDockerの環境を構築
Docker Toolboxをインストールしました。
インストールや中身について、以下の記事にて大変詳しく書かれいたので、とても勉強になりました。
http://qiita.com/akiko-pusu/items/a30db6332a77ed0ded09

#基本用語

参考→http://www.slideshare.net/zembutsu/docker-images-containers-and-lifecycle

Dockerイメージ：OS+アプリケーションをテンプレート化（たまに「パッケージ化」とも）したもの。
Dockerコンテナ：実際にマシンの上でDockerエンジンで動かしているもの。アプリケーション実行環境。
Docker Hub：世界中の人たちが作ったDockerイメージが大量に保管/公開されている場所


#実習


##まず最初はhello worldから

ITお勉強の第一歩、hello worldからやってみます。


**dockerで、hello-worldコンテナをrun（起動）、という意味のコマンド**

```console
$ docker run hello-world
```
実行結果は以下の通り。
hello-worldコンテナが自分の環境にもともと存在しなかったので
・Docker Hubから"hello-world"というDockerイメージをダウンロードして、
・それを元に、マシン上でDockerコンテナを作り、
・実行
という流れです。

```console
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```

##Dockerイメージの確認

**ローカルにどんなDockerイメージがあるのかを確認するコマンド**

```console
$ docker images
```

出力結果はこちら。
前述でダウンロードしたhello-worldのイメージがあるのがわかります。

```console
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              c54a2cc56cbb        3 weeks ago         1.848 kB
```

##ローカルの状況確認

**ローカルのDocker環境（Docker Engine）で何のコンテナがどうなってる（動いている？止まってる？）を確認するコマンド**

```console
$ docker ps -a
```

コンテナID等が確認できます、このあと、コンテナの停止等々を行うときに必要なIDらしい。

```console
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                      PORTS               NAMES                   sleepy_borg
42f9a6b98d8f        hello-world                "/hello"                 11 hours ago        Exited (0) 11 hours ago  
```

とりあえず今日はこの辺で。
にしても・・Dockerのクジラ、かわいい。
[CSS] CSSで作る印影（印鑑、ハンコ、判子）っぽいもの

# 背景

「画面にハンコを表示してくれ！」という要望は多……くはないですよね……。

ImageMagickかな、SVGかな、どうやって作ろうか悩んでいたら、

「見た目だけハンコっぽくなっていればいいから！」ということで、CSSで作ることにしました。

# 完成イメージ

できあがりのイメージです。
↓↓↓
![css-stamp.PNG](https://qiita-image-store.s3.amazonaws.com/0/59475/82cb9e84-bc80-fd22-f650-df989ebf915d.png)

名前が長いとはみ出すので、印影用に別名を用意するのがおすすめです。

# ソース

```html:stamp.html
<div class="stamp stamp-approve">
<span>2016.6.4</span>
<span>井之頭五郎</span>
</div>
```

border-radiusで丸くして、position:absoluteで無理やり位置合わせしています。


```css:stamp.css
.stamp { font-size:10px; border:3px double #f00; border-radius:50%; color:#f00; width:64px; height:64px; position:relative; margin:auto; }
.stamp span { display:inline-block; width:100%; text-align:center; }
.stamp span:first-child::before { position:absolute; top:5px; left:0; right:0; margin:auto; width:80%; border-bottom:1px solid #f00; line-height:1; padding-bottom:3px; }
.stamp span:first-child { line-height:56px; }
.stamp span:last-child { position:absolute; top:38px; left:0; right:0; margin:auto; width:80%; border-top:1px solid #f00; padding-top:2px; line-height:1; }

.stamp-approve span:first-child::before {
  content:"承認";
}
```

# お試し

こちらでお試しください。

https://jsfiddle.net/g5x8yp14/2/
iOSデバイスのバージョンをFloatで取得する


## バージョン説明

iOSのバージョンは「 __X.X.X__ 」になっています。よね？
左から __メジャー__ 、 __マイナー__ 、 __リビジョン__ ...当たり前のように知ってるか。

## ソースコード

```swift:UIDevice.swift
extension UIDevice {

    class func getVersion() -> Float {
        let version = UIDevice.currentDevice().systemVersion
        
        if version.containsString(".") {
            let versions = version.componentsSeparatedByString(".")
            return Float(versions[0] + "." + versions[1]) ?? 0.0
        } else {
            return 0.0
        }
    }
}
```

```swift:VersionTest.swift
import XCTest
// プロジェクト名: sample-projectの場合
@testable import sample-project

class sample-project: XCTestCase {
	func testVersion() {
		// iOS9.3.xの場合
		XCTAssertEqual(UIDevice.getVersion(), 9.3);
	}
}
```

### まとめ

```swift:swift
UIDevice.currentDevice().systemVersion
```

上記では、リビジョンが含まれている場合、`Float()` キャストしてあげると `nil` が返ってくるので先ほどのようなソースコードにしました。
AWSにJenkinsをインストール


## やりたいこと
- yumでインストールする
- 最新安定版を使う (2016/7/26 時点では、2.7.1)
- Apacheと連携する (ブラウザから8080ポートを使用しない)
- 他のアプリも同一サーバで使用するので、prefixを/jenkinsにする。

## 前提

以下は構築済み

- EC2インスタンス：Amazon Linux AMI (t2.micro)
- Apache : 2.4


## Jenkinsのインストール

Javaのバージョンの確認する。

```
$ java -version
java version "1.7.0_101"
OpenJDK Runtime Environment (amzn-2.6.6.1.67.amzn1-x86_64 u101-b00)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)
```

yumリポジトリの追加とRPMパッケージの公開鍵をインポートする。

```
$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat-stable/jenkins.repo
$ sudo rpm --import http://pkg.jenkins.io/redhat-stable/jenkins.io.key
```

Jenkinsのバージョンを確認してインストールする。

```
$ sudo yum list available | grep jenkins
jenkins.noarch                        2.7.1-1.1                     jenkins
$ yum install jenkins
```

サービスを起動する。

```
$ sudo service jenkins start
$ sudo chkconfig httpd on
```

EC2インスタンスのセキュリティグループで8080が開いていることを確認し、
ブラウザでJenkinsにアクセスし、認証とプラグインのインストールを実行する。

```
http://ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8080/
```


インストールは終了。


## Apacheと連携

Apacheとの連携について、Jenkins(1.x)では、AJPを使用していたが、Jenkins2.xでは、プロキシを使用する。

Jenkins側の設定を変更する。

```
$ sudo vi /etc/sysconfig/jenkins
```

JENKINS_PORTの変更と、JENKINS_ARGSにprefixを追加する。

```
# JENKINS_PORT="8080"
JENKINS_PORT="8081"

# JENKINS_ARGS=""
JENKINS_ARGS="--prefix=/jenkins"
```

Apache側にJenkinsの設定を追加する。

```
$ sudo vi /etc/httpd/conf.d/jenkins.conf
```

内容は以下の通り。

```
ProxyPass         /jenkins  http://localhost:8081/jenkins nocanon
ProxyPassReverse  /jenkins  http://localhost:8081/jenkins
ProxyRequests     Off
AllowEncodedSlashes NoDecode

<Proxy http://localhost:8081/jenkins*>
  Order deny,allow
  Allow from all
</Proxy>
```

JenkinsとApacheのサービス再起動する。

```
$ sudo service jenkins restart
$ sudo service httpd restart
```

EC2インスタンスのセキュリティグループで8080を削除し、
ブラウザでJenkinsにアクセスし、Jenkinsにアクセスできることを確認する。

```
http://ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com/jenkins
```



## 参考

- [RedHat Linux RPM packages for Jenkins](http://pkg.jenkins-ci.org/redhat-stable/)

- [CentOS 6.x でJenkinsをインストールするには](http://qiita.com/UmedaTakefumi/items/4a6f688a61e169759e44)

- [Running Jenkins behind Apache](https://wiki.jenkins-ci.org/display/JENKINS/Running+Jenkins+behind+Apache)
OpenSSLから、BoringSSLに移行

様々な理由で、OpenSSL を使い続けるのが難しくなり、Boring SSL に移行するという場合はあると思います。
基本的に両者のI/Fは同じなのですが、違う点が少しあります。

Boring SSL
https://github.com/google/boringssl

# ビルドに必要なコンパイラ要件が新しい

ちゃんと調べてないですが、C+11 等が必要だったりします。既存のソフトウェアにマージする場合は注意しましょう

# SSL_CTX_ctrl がない

置き換えが必要です
https://github.com/google/boringssl/blob/master/PORTING.md#replacements-for-ctrl-values


他にも幾つか違う点はあるのですが、私が填まったのは上記の2点でした。

https://github.com/google/boringssl/blob/master/PORTING.md
Emacs 25 で saveplace を使う

[saveplace](http://www.emacswiki.org/emacs/SavePlace) は、以前開いたファイルを再度開いたときに元のカーソル位置を復元してくれるライブラリです。

Emacs 24.5 までは

```el
(require 'saveplace)
(setq-default save-place t)
```

で使うことができるが、Emacs 25 で変更があったらしく

```el
(require 'saveplace)
(save-place-mode 1) ;; Changed for Emacs 25
```

としないと動かなかった。
HDD > 容量の大きいHDDにしてパーティションサイズを増やす

```txt:動作環境
Windows 8.1 pro (64bit)
True Image 2016
```

http://qiita.com/7of9/items/485fc8c3ac8811e30b4a
にて困っていたパーティションを拡張できない状況。

その対処方法としてTrue Imageの「ディスククローン」機能にて拡張できることを教えてもらった。

例として、16GBから64GBのSSDにディスククローンを選択し、「移行先に合わせる」を選択することでパーティションを拡張できた。

77.50KBのパーティションは拡張した領域の後ろの方にきちんと残っている。

<hr>
<font color=red>注意点</font>
True ImageはSourcenextから出ているもの(Personal版)もあるが、こちらでは「ディスククローン」機能が使えない。
Acronisからのものをきちんと買うこと。

間違って買わないように。(買ってしまった人より)。
HDD > True Image 2016 > ディスククローン > 再起動をすることになる

```txt:動作環境
Windows 8.1 pro (64bit)
```

SSDを16GBから64GBに変更するためTrue Image 2016を購入した。

True Imageの機能に「ディスククローン」があるが、動作が独特だった。

Windows 8.1上にてディスククローンを開始したら「コンピュータの再起動が必要です。再起動しない場合は処理がキャンセルされます」というメッセージが表示される。

再起動をすると独自OS(おそらくlinux)が起動してディスクコピーが始まる。

ディスククローン実行時にそのOS(Windows)上で他の作業ができないようになっているようだ。

True Imageを起動しているOSのディスククローンも考えてこうなっているようだ。今回実施したのは外付けディスク同士のクローンだが、その場合でも再起動してlinuxで処理することになる。
コンピュータをバッチファイルでドメインに参加させる

コンピュータをドメインに参加させるのって面倒ですよね。
情シスが登録してユーザに引き渡すならともかく、遠隔地のコンピュータをユーザに操作してもらって参加させなきゃいけないときなんて、手順書を渡してあってもミスされることがよくあったり。

Windows 7以降には、コンピュータをオフライン・ドメイン参加させるための[djoin](http://technet.microsoft.com/ja-jp/library/offline-domain-join-djoin-step-by-step%28WS.10%29.aspx)というコマンドラインツールが備わっています。
このツールでコンピュータをADに事前プロビジョニングしておいて、対象コンピュータでプロビジョニングデータを読み込むことでドメイン参加が完了する仕組みです。

ただこのdjoin、オプション指定が多いのでユーザに実行してもらうには難しいものがあります。
ならば、事前プロビジョニングを実施してプロビジョニングファイルを読み込むためのバッチファイルを生成するバッチファイルを作ればいいんじゃない?
ということで出来上がったのがこちら。

```bat:djoin.bat
@echo off

set DOMAIN=CONTOSO

set /p PCNAME="ドメインに参加させたいコンピュータ名を入力してください: "
for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do call set PCNAME=%%PCNAME:%%i=%%i%%

echo %PCNAME%を%DOMAIN%ドメインに追加しています。
echo.

djoin.exe /provision /domain %DOMAIN% /machine %PCNAME% /savefile %PCNAME%.txt > NUL
if ERRORLEVEL 2224 (
    echo %PCNAME%は%DOMAIN%ドメインに登録済みです。
    choice /M "既存のコンピュータを変更してもよろしいですか"
        if ERRORLEVEL == 2 (
            echo 終了します。
            goto END
        ) else (
            djoin.exe /provision /domain %DOMAIN% /machine %PCNAME% /reuse /savefile %PCNAME%.txt > NUL
            goto CREATEBAT
        )
)

:CREATEBAT
(
    echo.@echo off
    echo.cd /d %%~dp0
    echo.  net session ^>nul 2^>^&1
    echo.  if %%errorLevel%% == 0 ^(
    echo.    djoin /requestODJ /loadfile %PCNAME%.txt /windowspath %%SystemRoot%% /localos
    echo.    goto SUCCESSFUL
    echo.  ^) else ^(
    echo.    echo wscript.sleep 50 ^> %%TEMP%%\wait.vbs
    echo.    for /L %%%%i in ^(1,1,5^) do ^(
    echo.      color cf
    echo.      cscript /nologo %%TEMP%%\wait.vbs
    echo.      color fc
    echo.      cscript /nologo %%TEMP%%\wait.vbs
    echo.    ^)
    echo.    del %%TEMP%%\wait.vbs
    echo.    color cf
    echo.    echo.
    echo.    echo 管理権限で実行されていません。
    echo.    echo 右クリックして「管理者として実行」で実行してください。
    echo.    echo.
    echo.  ^)
    echo.pause
    echo.exit /b
    echo.:SUCCESSFUL
    echo.    reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Authentication\LogonUI /v LastLoggedOnUser /f
    echo.    reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Authentication\LogonUI /v LastLoggedOnSAMUser /f
    echo.    del /q %PCNAME%.txt
    echo.    del /q %PCNAME%.bat
) > %PCNAME%.bat

:END
timeout 5
```

実行する際は`set DOMAIN=`の行を環境に合わせて書き換えてください。

## 実行要件
以下のものが必要です。

- Windowsドメインネットワーク
- 事前プロビジョニング実施PC: Accout Operator以上の権限をもつユーザ
- プロビジョニング対象PC: Administratorsグループに入っているローカルアカウント

## ドメイン参加手順
1. 事前プロビジョニング実施PCでバッチファイルを実行(バッチファイルをダブルクリックでOK)
2. 登録したいコンピュータ名を聞かれるので入力してEnter
3. カレントディレクトリにファイル名が「コンピュータ名」で、拡張子が.batと.txtの二つが生成されます
4. この二つのファイルをプロビジョニング対象PCへコピー
5. コンピュータ名.batを右クリックして「管理者として実行」を選択
6. LANケーブルを接続してWindowsを再起動

これでドメインへの参加は完了です。
コンピュータ名は事前プロビジョニング時に指定したものに変更されます。
バッチファイル実行後に.batと.txtは自動的に削除されます。
プロビジョニングファイルはいちど使用されたら再利用できないので、間違って実行されたりしないように削除するようにしました。

## バッチファイル解説
5行目: プロンプトを表示して入力を待ちます。
6行目: 入力されたアルファベットを大文字に変換しています。
11〜17行目: コンピュータがADに登録済みかどうかを判定しています。
19行目: 事前プロビジョニングを実施しています。
24〜54行目: バッチファイル生成のヒアドキュメントもどき。
28行目: 「管理者として実行」されているかを判定しています。
32〜46行目: 「管理者として実行」されていなかったらコマンドプロンプトウィンドウをピカピカさせるvbsを作って実行しています。
50〜51行目: 最終ログオンユーザ名を消しています。
52〜53行目: プロビジョニングファイルとバッチファイルを消去しています。
bootstrapのカスタマイズがどうしても変わらない時はhtmlを見よ

htmlのheadタグのファイルを読み込む順番がbootstrapより自作ファイルになっていることで変更が適用されなかった。


head部分改善前

```
①自作css
②bootstrap 
```

改善後

```
①bootstrapファイル
②自作cssファイル
```
RailsでRuby標準ライブラリを拡張してautoloadさせる方法と、理想的なディレクトリ構成

# 対象バージョン

Rails 4.2.6

# 対象読者

- Rubyの標準ライブラリを拡張したいけど、何でもかんでもlib直下にコードを入れると死ぬ人
- lib/core_ext に標準ライブラリを格納したはいいけど、 `CoreExt module` じゃないコードをどうやって autoload させたら良いかわからない人

# 方法


## `lib/core_ext/` に拡張コードを実装

```lib/core_ext/string.rb
class String
  def and_hello
    self+" and hello"
  end
end
```

## lib 直下を autoload対象にする

```config/application.rb
module AppName
  class Application < Rails::Application
....
    config.autoload_paths += ["#{config.root}/lib/"]
  end
end
```


## `lib/core_ext.rb` を実装

`lib/core_ext/string` を require する

```lib/core_ext.rb
require 'core_ext/string'

module CoreExt
end
```

## `config/initializers/core_ext.rb` を実装

`CoreExt` モジュールを呼び出して、拡張コードを読みこませる

```config/initializers/core_ext.rb
CoreExt
```

# Q&A形式の解説

## `config/initializers` で `CoreExt` を呼ぶのは何で?

- Railsのオートロードは、対象のモジュールが呼ばれた時に、初めて読み込まれる
    - なので、`config/initializers` で `CoreExt` を呼び出すことで、 `String` の拡張を明示的に読み込ませている

## `lib/core_ext/string` を `config/initializers` とかで直接 require しちゃダメなの?

- それでも良いと思うけど、Rails way から中途半端に外れるのは何かと危険と考えているので
- 途中からプロジェクトに参加した人は、そこだけ Rails way から外れているなんて思わない
    - 驚きは最小にしたいよね

## `config/initializers` 直下に string.rb 置いちゃったら楽じゃない?

- コードが散逸するのが嫌だ
    - 絶対そんなところ探さない自信がある
- `config/initializers` は初期処理や、アプリ固有の設定を置くべき場所
- `CoreExt` を読み込むという初期処理を置くだけにして、責務を分担している

## lib直下に、string.rb を置かないのは何で?

- なんでもかんでもlib直下に置くのもよく分からなくなるから
- 標準ライブラリ拡張は、ActiveSupport の様式に従って `core_ext` に置いた

## autoload_paths を `lib/core_ext` にすれば `config/initializers/core_ext.rb` 不要じゃない?

- lib以下のディレクトリに、別に module にしたい実装が追加された時に、ややこしいことになりそうなのでやらない
    - 例えば、 `Util::Hoge` を実装した場合
    - `autoload_paths += ['lib', 'lib/core_ext']` とかすると、2回 core_ext がロードされるはず...

```
├── core_ext
│   └── string.rb
├── core_ext.rb
└── util
    └── hoge.rb
```

- あと、この方法だと String が拡張されないんだよね...
    - module じゃないから、autoload が働かないという解釈でよいのかな? 
    - おしえてえらいひと

# 参考

## モジュールが読み込めているか確認する時に便利なメソッド

`ActiveSupport::Dependencies.autoloaded_constants`

- autoloadで読み込まれているモジュールを配列で返す

`ActiveSupport::Dependencies.autoload_paths`

- autoload対象のpathを配列で返す


## 参考リンク

- [Declutter your lib directory | Lunar Logic Blog](http://blog.lunarlogic.io/2013/declutter-lib-directory/)
    - **アプリの責務で無いもの、他でも使いまわせるものをlibに置くべき**
        - libの中でさらに役割をわけてディレクトリを切ると良い
        - `lib/core_ext` : 標準ライブラリ拡張
        - `lib/hack` : ライブラリのモンキーパッチとか
    - **libにはアプリの拡張は置かない**
        - アプリの責務であるものは、appにサブディレクトリ切ってそこにおくべき
    - ちょっとしたアプリの設定は、 `config/initializers`
- [Railsアプリのモジュールはどこに置くべきか問題 (公開版)](http://www.slideshare.net/muryoimpl1/rails-37396344)
    - 上記の翻訳
- [Rails プラグイン作成入門#3.コアクラスを拡張する | Rails ガイド](http://railsguides.jp/plugins.html#%E3%82%B3%E3%82%A2%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E6%8B%A1%E5%BC%B5%E3%81%99%E3%82%8B)
    - ファイル名がわかりづらくて混乱するけど、大体このやり方に準拠した
- [Railsでlib以下を読み込ませる方法とその注意点 〜名前重複の死を避けるために〜 - Qiita](http://qiita.com/necojackarc/items/fb76352dbea5bdd83366)
【Swift】メソッドがどこから呼ばれているかを知るTips - debug identifiers -

あるメソッドが、どのメソッドから呼ばれているのか気になるときがあります。
ファイルを辿っていけば最終的には見つかりますが、複数のメソッドを同時並行で追うのはなかなか面倒です。
そんなとき、***debug identifiers（デバッグ識別子）をデフォルトパラメータとして使うと捗ります。*** 

## 環境
Version 8.0 beta
Swift 3.0

## 変更前
例えば、こんなメソッドがあるとします。
何の変哲もないIntを合計し、printするだけのメソッドです。
このメソッドの呼び出し元を知りたいとき、どうしたらよいでしょうか？

```swif
func addTwoInts(a: Int, b: Int)  {
    let sum = a + b
    print("\(sum)")
}
```

## 変更後
\#file, #line, #functionを引数として使います。
デフォルトパラメーターとして使うことで、addTwoIntsがどのメソッドに呼ばれたのかがわかるようになります。

```swift
func addTwoInts(a: Int, b: Int,
                absolutePath: String = #file, line: Int = #line, function: String = #function)  {
    // 絶対パスをファイル名だけにする
    let file = absolutePath.components(separatedBy: "/").last ?? absolutePath
    print("\(file):\(line) >>> \(function)")
    
    let sum = a + b
    print("\(sum)")
}
```

ViewDidLoad()から呼び出すと、ファイル名、ライン番号まで出力される。

```swift:出力
ViewController.swift:65 >>> viewDidLoad()
```


しかも、引数の数を変更したから各所でコンパイルエラーが発生する、といった心配もありません。
addTwoIntsは、２つのIntを受け取れば良いままです。

<img width="300" alt="autocomplete.png" src="https://qiita-image-store.s3.amazonaws.com/0/119686/4c121709-ed54-4487-4f6b-006a202ee030.png">

## 参考
[The Swift Programming Language (Swift 2.2)
](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html)
Processing / ControlP5 > serialPlotter (v0.1, v0.2) > COMポートのデータをグラフ描画

```txt:動作環境
Processing 3.1.1 on Windows 8.1 pro(64bit)
Library: ControlP5 v2.2.6
Library: Serial
```


## やろうとしていること

COMポートから受けたN項目のデータをグラフにプロットする。
Arduino IDEが1項目しか表示できないので、N項目にしたい。


## code v0.2

[v0.2 @ github](https://github.com/yasokada/processing_160726_serialPlotter/releases/tag/v0.2)

http://qiita.com/7of9/items/23d9056d6137a612f50e
で実装したものを参考にした。

## 実行環境

- シリアル送信側: ダミーデータ送信プログラムを動かすPC (Windows 7pro)
  - http://qiita.com/7of9/items/823e9c3a0fa208ee6eee
- シリアル受信側: 本ソフトを動かす (Windows 8.1 pro)

上記の2つの端末をシリアルのケーブル(クロス)で接続する。
こちらではVMイメージ2つにてnamed pipeを使っての動作をした。

## 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/dad8c1a4-7fb4-19e1-0c22-fb01b9fb1808.png)

ダミーデータ送信プログラムから送信したsine curveをグラフ描画できた。
グラフデータの拡大縮小、上下移動もできる。

## TODO

### 2番目の項目の読込み: DONE

2番目の項目を取る処理がすっきりしない。
本来はvals[1]でとりたいが、項目間に空白が2つついている場合、vals[1]には空白が入ってしまっている。

```
  float vals[] = float(split(mystr, ' '));
  
  datavals1[numSeries1] = vals[0];
  numSeries1++;
  datavals2[numSeries2] = vals[2];  // TODO: get at [1]
  numSeries2++;  
```

### その他

- 4項目対応
- 数値のmin, maxをテキスト表示
- 横軸の検討
JavaScript ライブラリ viewer.js 

**viewer.js**
[https://github.com/fengyuanchen/viewerjs](https://github.com/fengyuanchen/viewerjs)

```index.html
<!-- index.html -->


<div>
 <ul id="images">
   <li><img src="picture.jpg" alt="Picture"></li>
   <li><img src="picture-2.jpg" alt="Picture 2"></li>
   <li><img src="picture-3.jpg" alt="Picture 3"></li>
    <!-- ここに必要な分だけ追加する  -->
 </ul>
</div>
```

```app.js
var viewer = new Viewer(document.getElementById('images') );
```
bindingSourceから型付き行の取り出しとか新規行の取得

こっちも、備忘録的な感じですがコード書き終わるとだいたい忘れてしまうのでメモ
拡張で書いておくと、楽に変換出来るかもつう事でソースです
どちらのメソッドも、見ての通り、DataRowViewからRowを取り出すんですけど
これを結構忘れてスタックしがち（笑）
ご参考になれば幸いです。

```buindingSource.cs
    public static class BindingSourceExtensions
    {
        public static T GetCurrent<T>(this BindingSource bs) where T : class
        {
            T funcRet = null;
            DataRowView current = bs.Current as DataRowView;
            if (current != null) {
                funcRet = current.Row as T;
            }
            return funcRet;
        }

        public static T GetNewRow<T>(this BindingSource bs) where T : class
        {
            T funcRet = null;
            DataRowView addRow = bs.AddNew() as DataRowView;
            if (addRow != null) {
                funcRet = addRow.Row as T;
            }
            return funcRet;
        }
    }
技術英語 > These concepts are sometimes called "fan out."

@ Code Complete (No. 5456 / 36077)

> The same study found that the more classes a class used, the higher its fault rate tended to be. These concepts are sometimes called <font color=red>"fan out."</font>

[fanout cable](http://www.lanshack.com/Custom-MTP-to-SC-OM3-10-Gig-12-Fiber-Fanout-Cable-Plenum-Rated-made-in-USA-by-QuickTreXreg-P6676.aspx)


反対の意味としてのfan-inというのも時々目にする。

こういう用語は反対の意味で(fan-outとfan-inが反対に）使われていないか気を付けた方がいいかもしれない。
シストレプログラムで特徴量として利用しているテクニカル指標を整理してみた

株価とか為替の予測してる系の論文と、自分のシストレプログラムで特徴量として利用しているテクニカル指標を整理してみた。
https://www.dropbox.com/s/5sspkpyx5c7vd5z/テクニカル指標まとめ.xls?dl=0

【関連】
xgboostによる決定木アンサンブル学習でFXのシステムトレードするコードを書いた
http://qiita.com/ryo_grid/private/757fa93fc479439b2676
Spineランタイム：アニメーション再生タイムライン(トラック)の構成

以前にFlashとSpineのタイムラインの違いについて簡単に[まとめ](http://qiita.com/harayoki/items/153fa507f381bbcfc259)ましたが、Spine側をもう少し詳しく掘り下げてみようと思います。
以下、Spineツール4.3、ランタイムはSpine-Stralingの4.3を利用した場合で解説しますが、どの言語ランタイムでも基本は同じです。

#Spineランタイムのタイムラインは映像編集ソフトのそれに似ている
Spineランタイムでは１キャラクターに対して、アニメーションの再生を同時にいくつでも行う事ができ、並列にアニメーションタイムラインが並んでいる状態になります。(対して、Spineツール上のタイムラインは１本です)。それぞれのタイムラインは`トラック`と呼ばれ、トラックは１つづつ個別のスピードで再生できます。各トラックのアニメーションで同じパーツを操作していても、うまい具合に全てが合成されて再生されます。

アニメーション再生命令の第一引数にはトラック番号が指定できます。これで複数のアニメーションを同時に制御できます。アニメーションの停止命令の`clearTrack`もトラック番号が指定できます。

```sample.as
var trackIndex:int = 0; // これがトラック番号
// 再生
var animName:String = "hoge";
var loop:Boolean = false;
animationState.setAnimationByName(trackIndex, animName, loop);
// 停止
animationState.clearTrack(trackIndex);
```

その他、トラック番号が指定できる命令はいくつかあります。

![SpineTimelineFig1a.png](https://qiita-image-store.s3.amazonaws.com/0/8302/4389cede-1c11-36e0-433f-ebfc39412d8f.png)

#連続アニメーションとアニメーション切り替え時のMixing
`addAnimation`などの命令で連続アニメーションを指定した際は、指定トラックに複数のトラックデータが並ぶ状態になります。トラックデータ同士の合間に間を設けることも、それぞれのアニメーションをクロスフェードさせるような感じで、スムーズに切り替えることもできます。

この、アニメーションのmixingについては別途投稿にまとめます。

#まとめ
アニメーションスピードの個別で調整や、合成するアニメーションの動的な追加など、Spineは他ツールと比較して、高度で柔軟な作業ができると言えます。弱点としては現在アニメーションツール側では複数のアニメーションを合成再生プレビューする機能が(おそらく)ない点です。しかし、ここはそのうち改善されると思いますし、[SkeletonViewr](http://qiita.com/harayoki/items/3c909e5b9edb8012a69d)を立ちあげつつ作業することで、ある程度カバーできそうです。

今回は以上です。