OmniAICreator/Qiita-1.07M huggingface dataset:
良く使うLinuxコマンド

# はじめに
自分の普段使っているLinuxコマンド・オプションをまとめてみる。
打ち慣れて手になじんでいると他の方法を考えなくなってしまうなと思ったので

使用してるOSはCentOS

# `ls -ltr`
一覧表示する場合は大体これ。最新ファイルが下に表示されるように

# `ps -ef`
プロセス一覧を表示させる

# `tail -f "ファイル名"`
試験中にログファイルを表示する場合によく使用する

# `tar cvf`
アーカイブする場合は一応詳細表示するけどあんまり見てない

# `tar xvf`
展開する場合も`vf`をつけて
gz形式のファイルを展開する場合も`z`を付けなくても成功することを最近知る

# `tcpdump -i "インタフェース" port "ポート番号" -w "出力ファイル"`
パケットキャプチャする場合。出力ファイル名に`date`コマンドをつけて上書きされないようにする

# `tcpdump -r "ファイル" -A -n -nn`
サーバ上でそのままキャプチャファイルを見る場合


一旦ここまで、思いつくまま記載したので今後も追記していく
擬似要素での画像挿入するときのスタイル

#擬似要素で画像（ボタンのマークとか）を表示させるときよくやるやつ
####CSSの書き方をメモ
ボタンにグラデーションとか使ってるときは、いろいろめんどくさいので
`:before` `:after`擬似要素を使って背景画像を指定
`image-url()`はいつも使うようにする
 `$src`と`image-width()`はSPサイトのときに使用
└ PCのときはサイズ違いのアイコンを使いまわすことが多いので、直接サイズ指定

```scss:scss

.title{
	$src: 'img/plus-icon.png';
	text-decoration: underline;
	color: #206fb8;
	&:before{
		padding-right: 5px;
		content: "";
		display: inline-block;
		position: relative;
		top: 2px;
		width: image-width($src)/2;
		height: image-height($src)/2;
		background: image-url($src) no-repeat center center;
		background-size: image-width($src)/2 image-height($src)/2;
	}
	&.active:before{
		background-image: image-url('img/minus-icon.png');
	}
}

```

`content: "url()"`でも画像を表示できるが、サイズの指定ができないので上のように擬似要素のバックグラウンドで画像を指定するのがベター
Seleniumでiframe内のDOMを操作する方法

コメントにて、driver.switch_to.frame(iframe) ではないかと、ご指摘いただきました。
最近、Selenium を使っておらず、ちゃんと確認していないのですが、適宜、いただいたコメントもご参考にされてください。

メモ。[元ネタ](http://stackoverflow.com/questions/25721263/cant-select-an-iframe-in-selenium-webdriver)。

Seleniumで、driverインスタンスを通して、特定のDOM要素を取り出して、ボタンのクリックとかをするけど、iframe内のDOMはそのままだとアクセスできない。

先にiframeのDOMを探して、driverの`switch_to_frame`を呼び出せば、そのiframeのDOMをいじれる。

```py
iframe = driver.find_element_by_css_selector('.some-selector')
driver.switch_to_frame(iframe)
driver.find_element_by_css_selector('.some-selector-in-iframe').click()
```
FactoryBotをrails consoleから使う

# はじめに

既にFactoryBotをRailsで利用している人向けのお話です。

`rails console`でちょっと試したいことがあるけど、インスタンスの生成が面倒なモデルがあったりします。
FactoryBotでフィクスチャーが用意されていれば、それを使った方が手っ取り早いです。

しかし、`rails console`を立ち上げただけではFactoryBotは使えません。

# 手順

`rails console`はSandboxモードで立ち上げたほうがデータベースが汚れなくてよいでしょう。

```bash
$ rails console test --sandbox
```

(`RAILS_ENV`が`development`のときにもFactoryBotが有効になるようにしていれば`test`は不要です)

FactoryBotをrequireします。

```rb
require 'factory_bot_rails'
```

`FactoryBot`クラス名を明示せずに`create`や`build`を行えるようにします。(オプション)

```rb
include FactoryBot::Syntax::Methods
```

これで`rails console`からFactoryBotが使えるようになります。

# おまけ

コピペしてまとめて流す用のまとめです。

```rb
require 'factory_bot_rails'
include FactoryBot::Syntax::Methods
```


# 参考

- [How do I use factories from FactoryGirl in rails console](http://stackoverflow.com/a/23580836)
Spring Boot でプーリング設定をする

Spring Bootでデータベースのコネクションプーリングするのにハマって
「はじめてのSpring Boot」の槙さんにTwitterで助けて頂いたのでお礼代わりに書き残しておきます。


プーリングの設定はapplication.ymlに書きます。

```lang:application.yml
spring:
  datasource:
    url=jdbc:oracle:thin:@localhost:1521/orcl
    driverClassName=oracle.jdbc.driver.OracleDriver
    username: scott
    password:tiger
    maxActive: 15
    maxIdle: 10
    minIdle: 5
    initialSize: 0
```

とここまではすぐわかったんですが、Configクラスでdatasourceを生成する際に`@ConfigurationProperties`で設定を拡張しないと有効になりません！

```lang:Config.java
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource dataSource() {
    DataSourceBuilder factory = DataSourceBuilder
            .create(this.properties.getClassLoader())
            .driverClassName(this.properties.getDriverClassName())
            .url(this.properties.getUrl())
            .username(this.properties.getUsername())
            .password(this.properties.getPassword());
    return factory.build();
}
```

これだけだと「ConfigurationProperties勝手に使うんじゃねえ！」って警告が出るのでpom.xmlにも設定を追加してやります。

```lang:pom.xml
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>
```

こちらで詳しく説明してくださっていました。
[stackoverflow - Spring-Boot: How do I set JDBC pool properties like maximum number of connections?](http://stackoverflow.com/questions/25573034/spring-boot-how-do-i-set-jdbc-pool-properties-like-maximum-number-of-connection)
が、`DataSourceAutoConfiguration.CONFIGURATION_PREFIX`の書き方は今はサポートされていないのかエラーになりました。

ConfigurationPropertiesの書き方はこちらも参考にさせて頂きました。
[rororo1989のブログ - Spring Bootその６ db周りね！](http://hkanai.hatenablog.com/entry/2015/07/18/031600)
prefixってそういうことなのね。

# 2016/10/29追記 SpringBoot1.4の場合
application.ymlに書くだけでちゃんと動きました。

```lang:application.yml
spring:
  datasource:
    driverClassName: oracle.jdbc.driver.OracleDriver
    url: jdbc:oracle:thin:@localhost:1521/orcl
    username: scott
    password: tiger
    sqlScriptEncoding: UTF-8
#pooling setting
spring.datasource.tomcat:
    maxActive: 15
    maxIdle: 10
    minIdle: 5
    initialSize: 2
```

Tomcatじゃない人は別途確認してください。
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4-Release-Notes#datasource-binding
GoでSpreadsheetを操作するパッケージを作った

---

皆様こんにちは、いわーくです。

Goは実行環境を選ばず、バイナリ１個で動作するので簡単なツールを作るのが非常に手軽ですよね。
さらに、ゴルーチンによって並行処理が簡単に実装できるので、同時に色々な処理をさせるのが得意です。

そんなGoを使ってスプレッドシートを読み書きすることができれば、とても便利ですよね！

執筆時点ではGo言語からスプレッドシートを読み書きできるパッケージは見つからなかったので、自分で作りました。

githubで公開しています => [spreadsheet](https://github.com/Iwark/spreadsheet)


【6/25追記】
どうやら[公式のパッケージ](https://godoc.org/google.golang.org/api/sheets/v4)が公開されたみたいです。こちらの[QuickStart](https://developers.google.com/sheets/quickstart/go)に簡単な使い方が書かれています。


## インストール

他のGoのパッケージと同様に``go get github.com/Iwark/spreadsheet``でインストールできます。

ドキュメントは[godoc](https://godoc.org/github.com/Iwark/spreadsheet)で閲覧できます。

## 使い方

認証にoauth2のclientを使います。Googleの[developer console](https://console.developers.google.com/project)からサービスアカウントキーを生成しておきます。

ここでは、``client_secret.json``として保存します。こんな感じのやつです。

```client_secret.json
{
  "type": "service_account",
  "project_id": "xxxxxxx",
  "private_key_id": "xxxxxxxxxxx",
  "private_key": "-----BEGIN PRIVATE KEY-----xxxxxxxxxEND PRIVATE KEY-----\n",
  "client_email": "xxxxxx@xxxxxxx.iam.gserviceaccount.com",
  "client_id": "xxxxxxxxxxx",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xxxxxxx.iam.gserviceaccount.com"
}
```

``spreadsheet``パッケージは次のように使うことができます。

```main.go
package main

import (
    "fmt"
    "io/ioutil"

    "github.com/Iwark/spreadsheet"
    "golang.org/x/net/context"
    "golang.org/x/oauth2/google"
)

func main() {
    data, _ := ioutil.ReadFile("client_secret.json")
    conf, _ := google.JWTConfigFromJSON(data, spreadsheet.Scope)
    client := conf.Client(context.TODO())

    service := &spreadsheet.Service{Client: client}
    sheets, _ := service.Get("1mYiA2T4_QTFUkAXk0BE3u7snN2o5FgSRqxmRrn_Dzh4")
    ws, _ := sheets.Get(0)
    for _, row := range ws.Rows {
        for _, cell := range row {
            fmt.Println(cell.Content)
        }
    }

    // Update cell content
    ws.Rows[0][0].Update("hogehoge")

    // Make sure call Synchronize to reflect the changes
    ws.Synchronize()
}
```

## その他できること

基本的な読み書きに加えて、現段階では以下のような機能があります。

* IDを元にシートを取得
* タイトルを元にシートを取得
* シートの追加・削除

詳しくは[ドキュメント](https://godoc.org/github.com/Iwark/spreadsheet)をごらんください。

## 内部的にやっていること

読み込みに関しては、Googleが用意しているHTTPのAPIを使ってXMLを取得し、パースしています。

書き込みに関してもGoogleがHTTPのAPIを用意しているので、ユーザーが変更したセルを保存しておいて``Synchronize``のタイミングでバッチ用のAPIを使って変更したセルを一気に送信しています。

その他も大体そんな感じです。

## まだ作成途中です

現状、シートを読み込む際に空白のセルも含めて取得してしまっているので、10000セル以上あるようなシートだとXMLのParseに非常に時間がかかってしまいます。

最初のリクエストでは空白のセルは受け取らず、書き込みの際に空白のセルが更新されていたらIDを取得し、書き込みを行うようにしたいですね。色々と改善の余地がありそうです。

それにしてもGoは速くて楽しいです！

良ければ使ってみてください！
【R】重回帰分析の結果の見方

※開発・統計初心者なので、情報に間違いなどあれば指摘してください。

卒論に実験データの重回帰分析の結果を載せるにあたり、
**偏回帰係数・標準偏回帰係数・t値・有意確率・重回帰決定係数**が必要になった。

とりあえず出力結果の見方をメモ

- 偏回帰係数・t値・有意確率・重回帰決定係数

1. csvデータを読み込ませる

2. 重回帰分析

```
mul_d <- data.frame(LL=mul_d$X2L,A=mul_d$a,B=mul_d$b)
#データ分析用のデータフレームを作成。
#読み込んだデータをそのまま使用できる場合は不要。
#今回はLL, A, Bのカラム名にそれぞれ元データのX2L, a, bカラムの情報を入れた。

reg_ele<-lm(LL=mul_d$LL~mul_d$A+mul_d$B)
#reg_eleに重回帰分析の結果を渡す。A, Bがそれぞれ独立変数、LLが従属変数
```

3.結果を表示

```
summary(reg_ele)

##出力結果の見方
#Estimate：偏回帰係数
#t value：t値
#Pr：有意確率
#Multiple R-squared：R2乗値=決定係数
```

- 標準偏回帰係数


>独立変数 xi の偏回帰係数を bi，標準偏差を si，従属変数 y の標準偏差を sy とすれば，xi の標準化偏回帰係数は bi*si/sy です。

→重回帰分析で求められた結果から計算できますね。コメントありがとうございました。
※2016/02/25更新

***
以下、初期の内容

scaleを使用して標準化したデータに対して、上記と同様重回帰分析を行う。
結果に対してsummaryで要約を表示し、Estatimatedの値が標準偏回帰係数。

1. csvデータを読み込ませる

2. 重回帰分析

```
mul_d <- data.frame(LL=mul_d$X2L,A=mul_d$a,B=mul_d$b)
df <- scale(mul_d)
#標準化

df <- data.frame(df)
#行列をデータフレームに変換（カラム名を使えるように）

reg_ele_s<-lm(LL=df$LL~mul_d$A+df$B)
#reg_ele_sに重回帰分析の結果を渡す。A, Bがそれぞれ独立変数、LLが従属変数
```

3.結果を表示

```
summary(reg_mul_s)

#Estimate：標準偏回帰係数
```

***

結果の見方については以上です。

※参考にしました
[Rを使った分析（重回帰分析）](http://mizumot.com/handbook/?page_id=484)
Unity5.3で「Missing required icon file. The bundle does not contain an app icon for iPad of exactly '167x167' pixels, in .png format」エラーでappstoreに申請できない。対処。

環境: 
Mac
Unity5.3.2x
xcode7.2x

Unityで出力したファイルをxcodeからappstoreに申請しようとしたら、こんなエラーが。。。

**Missing required icon file. The bundle does not contain an app icon for iPad of exactly '167x167' pixels, in .png format**

<img width="671" alt="スクリーンショット 2016-02-24 18.52.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/37406/ed3996ee-c4e6-55d2-1752-d45697be804e.png">


ipad用の167x167のアイコンが足りないそうです。。
Unity上にはそんな設定する項目が見当たらず、ググッてxcode上で、そのアイコン設定すればいいというのがあったので、
xcodeで、167x167のpngアイコンをドラッグ＆ドロップし、
そして申請！！！！！

成功！！！
同じ方がいたら、参考になればうれしいです！


こちらを参考にさせていただきました！
http://forum.unity3d.com/threads/missing-required-icon-file.385574/
fabricのアプリがリリースされていたので簡単にレビュー

fabricのアプリがリリースされていました。

iOS版
https://itunes.apple.com/us/app/apple-store/id1077938720?mt=8

Android版
https://play.google.com/store/apps/details?id=io.fabric

せっかくなので、簡単にレビュー。
できることとできないこととか書いてみます。
（アプリのリリースバージョンで以下のレビューを書いています）

## fabricアプリでできること（時間がない人用まとめ）
まずアプリでできることをまとめてみました。

- **Active users right now**：リアルタイムでアプリを使っているユーザー表示
- **Crash free users**：アプリのクラッシュ率表示
- **Daily active users**：1日ごとのアプリを使っているユーザー数表示
- **Activity**：1日ごとの大まかなアプリのクラッシュ内容等の表示
- **Push Notification**：特定の条件が発動した際にプッシュ通知

アプリの目玉としては、**プッシュ通知**ではないかと思います。
通知する基準を"All"、"Priority"、"Critical"、"None"の4パターンで設定が可能です。

## アプリを使ってみました
今回はiOS版のアプリ画面で見ていきたいと思います。

アプリを起動するとまずIDとパスワードでログイン。
1Password対応なのが、何気に便利。

<img width="276" src="https://qiita-image-store.s3.amazonaws.com/0/40009/24d1a4de-36f0-19f0-aee8-b62dded06e8a.jpeg">

ログインすると、IDに紐付けられているアプリ一覧が表示されます。

<img width="276" src="https://qiita-image-store.s3.amazonaws.com/0/40009/5c524f57-de81-1260-45c2-1ae4b6e42ed8.jpeg">

任意のアプリを選択すると、こんな感じで詳細を見ることができます。

<img width="276" src="https://qiita-image-store.s3.amazonaws.com/0/40009/720b4008-9a60-ec3b-219b-53eedf905991.jpeg">

リアルタイムでアプリを使用しているユーザーの数（前日との比較）、クラッシュ率（1ヶ月比較）、アクティブユーザー数（1ヶ月統計）と主なアプリのクラッシュ内容等を見ることができます。

特にアクティブユーザー数をパッと確認したいときには便利ですね。

Activityの中身は簡単にどの部分でクラッシュしているかなどを簡易的に表示。

<img width="276" src="https://qiita-image-store.s3.amazonaws.com/0/40009/10172822-f068-53e8-076f-aaa6081d06e9.jpeg">

あくまで簡易的な表示なので、詳しいログなどの表示はできません。

そして、目玉機能のプッシュ通知機能についてはアプリ別で設定を変えることができます。

<img width="276" alt="IMG_8346.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/40009/2d144b28-bc5a-f4aa-5297-5b6902761936.jpeg">

通知する、通知しないの設定を4段階で設定が可能です。
アプリ別に設定が可能なので、新規リリースしたアプリについては全ての通知を受け取って、アクティブユーザーが少ないアプリについては通知を控えるなど設定ができますね。

## まとめ
アプリ側では簡易的な表示しかできませんが、機能を絞っていていいと思います。

アプリのバージョン毎のクラッシュ率分布やOS毎の利用率、個別で設定したイベント表示などは見ることができないので、その部分はPCで見ましょう。

モバイルアプリ版はあくまでも簡易的な表示のみ、ということですね。
通知機能は割と使えるかな、と思います。

公式のブログにもアプリの紹介がされていましたが、英語がわかる人はこちらもどうぞ。
https://fabric.io/blog/introducing-the-fabric-mobile-app
Implementing functional languages を頑張って読む.2日目

# 2日目
[1日目](http://qiita.com/amama/items/d7fb5feeb288ff7b6b35)
[3日目](http://qiita.com/amama/items/0cd53283c3b839bc8ae2)

## 19ページ
`type CoreExpr = Expr Name`とある.Exprは型コンストラクタだったらしい.僕はCしか知らないので,型コンストラクタという単語を正しく使ってるかはしらない.
なんとかなると思うので型コンストラクタは全部無視して型のことだと思う.
`type Name = String`とある.CにStringなんてないので,char*で代用する.

```c
typedef char * Name;
```

IsRecを実装しているので実装する.letは下位ビットを0b0100,letrecは0b0101としてあるので不要だと思うがCで実装する.(bool,true,falseを使うにはstdboolのインクルードが必要.staticは気分)

```c
typedef bool IsRec;
static IsRec recursive = true, nonRecursive = false;
```

binderOf関数を実装する.[(識別子,束縛されている式)]のリストから[識別子]のリストを得る.Cにリストやタプルなんて高級なデータ構造はないので,とりあえずリスト型があるものとして扱う.
もちろんエラー処理なんてしない.全部適切なデータが来るものとして扱う.
Mirandaのリスト型をmi_list,タプル型もリスト型とする.僕は自分でコードを書くときはsnake_caseが好きだから.
Cで書くときに型情報が失われてしまうので注意する.
rhssOfも同様に書く.

```c
mi_list bindersOf(mi_list defns) {
	mi_list ret = init_mi_list();
	for(mi_list defn = ml_car(defns); !isnil(ml_cdr(defns)); defns = ml_cdr(defns)) {
		ml_add(ret, ml_car(defn));
	}
	return ret;
}

mi_list rhssOf(mi_list defns) {
	mi_list ret = init_mi_list();
	for(mi_list defn = ml_car(defns); !isnil(ml_cdr(defns)); defns = ml_cdr(defns)) {
		ml_add(ret, ml_cdr(defn));
	}
	return ret;
}
```

コンパイルするために適当にヘッダを書く.本当に適当なので後で書き直す.

```c
#ifndef MI_TYPES_H
#define MI_TYPES_H

#include <stdbool.h>

typedef struct mi_list * mi_list;

mi_list init_mi_list(void);
mi_list ml_car(mi_list);
mi_list ml_cdr(mi_list);
mi_list ml_add(mi_list, mi_list);
bool isnil(mi_list);
#endif
```

`type Alter a = (Int, [a], Expr a)`なんていうクソ面倒そうな型コンストラクタが出てきたけど面倒なのでリストにする.
本当にリストは汎用性高い.タプルとリスト両方作った理由がわからん.型情報が失われるからかな.
`type CoreAlt = Alter Name`とあるので,これを期待してコードを書くことにする.

`isAtomicExpr`もよくわかんないのでそれっぽく実装する.

```c
bool isEVar(Expr e) {
	return ((uintptr_t)e.car & 8) == 8;
}

bool isENum(Expr e) {
	return ((uintptr_t)e.car & 1) == 1;
}

bool isAtomicExpr(Expr a) { //このaは型コンストラクタの引数ではない
		return isEVar(a) || isENum(a);
}

```

多分後でExprとかlistとかtupleのちゃんとした実装をする.型コンストラクタみたいなのに対応させる.
unionでいいのかなあ.タプルは構造体でよさそう.

`type Program a = [ScDefn a]`,` type ScDefn a = (Name, [a], Expr a)`もリストで実装する.

```c
typedef mi_list Program;
typedef mi_list ScDefn;
```

今後の課題は

```
main = double 21 ;
double x = x+x
```
を

```
[("main", [], (EAp (EVar "double") (ENum 21))),
("double", ["x"], (EAp (EAp (EVar "+") (EVar "x")) (EVar "x")))
]
```

に変換できるようになること.

**1.3を読み終わった**
エラーメッセージの表示

```lang:~html.erb

<% if @~.errors.any? %>
  <div id="error_explanation" class="alert alert-danger">
    <h2><%= @~.errors.count %>件のエラーがあります。</h2>

     <ul>
       <% @~.errors.full_messages.each do |message| %>
       <li><%= message %></li>
        <% end %>
     </ul>
   </div>
<% end %>


```
postが失敗したときに初期値が入るようにする

@postにフォームで入力され送信されたものが入るようにする。

```lang:posts_controller.rb

def create
 @post = Post.create(post_params)

end

```

postの保存が失敗したときに入力した初期値が入るように設定する。


```lang:new.html.erb

<% form_tag posts_path do %>

<%= text_field_tag :title, @post.title %>

<%= text_field_tag :content, @post.content %>

<% end %>


```

このように、引数に@post.titleや@post.contentなどとすると、
保存は失敗しているが@postに送信された内容が入ったままなので
初期値を表示させることができる。







```lang:posts_controller.rb

def new
 @post = Post.new

end

```


new.html.erbを初めて表示する場合には、newアクションを経由する。
new.html.erbでは@postが使われているので、newアクションで中身が空の@post定義する必要がある。
値がセットされていないので初期値は空になる。

このような構造になっている。
コンテナにインストールするpython パッケージの管理

# 概要
プログラムの実行に必要な python パッケージを Dockerfile に直接記述していたので，requirements を用いて一元管理する．

# pip-tools で requirements の管理
requirements.in に必要なパッケージを記入する．

```requirements.in
webapp2
paste
webob
```

Dockerfile に pip-tools のインストールと，`requirements.in` の追加，パッケージのインストールに関する項目を追加する．

```Dockerfile:Dockerfile
RUN apt-get update && apt-get install -y python-pip
RUN pip install -U pip pip-tools

ADD ./requirements.in ./
RUN pip-compile && \
    pip install -r requirements.txt && \
    rm requirements.txt
```

# 参考
- [pip-toolsでrequirements.txtのパッケージバージョン番号を管理しよう](http://qiita.com/ryu22e/items/ad3f8f3df30886d23661)
character_set_databaseとcharacter_set_serverの違いを知りたくて

mysqlの設定は、環境つくるときにちょいちょいやるのですが、いつもなんとなく文字コードの設定はやっておりました。

もう、なんとなくやるのは嫌だ！と思って深追いしたメモです。

# まず違いがわかってない

```mysql
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

こうなってたときに、よし、

- character_set_database
- character_set_server

をutf8に変更しようっとなります。

でも、そもそも、この違いがわからなくて調べました。

ここにありました。
http://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_character_set_server


>character_set_database
デフォルトデータベースで使用される文字セット。デフォルトのデータベースが変更されるたびに、サーバーはこの変数を設定します。デフォルトデータベースが存在しない場合、変数は character_set_server と同じ値になります。

やばい、デフォルトデータベース..ってなんだよ。となりましたが、これは、USEで選択されているデータベースを指すようです。

>character_set_server
サーバーのデフォルト文字セット。

なるほどー。。。

わかった気がするんですけど、うまく言語化できないのですが、とにかく

- character_set_server

をちゃんと設定すればよいということです。

（すでに文字化けを起こしちゃっている場合は、character_set_databaseがlatin1とかになっていたりします。その場合はcharacter_set_serverをutf8にしたところで手遅れで、character_set_databaseを修正する必要があるのでdatabase作り直しとかだと思います。）


# なので、やることは[mysqld]に追記

```mysql:my.cnf
[mysqld]
character-set-server = utf8
````

とすれば、上の２つのlatin1は消えてutf8になります。

[mysqld]ってなんだよ、って気持ちにはなりますので、この辺をみておきます。
https://dev.mysql.com/doc/refman/5.6/ja/option-files.html


以上です。
my.cnfの全容は分かっておりませんが、少しだけ仲良くなれた気がします。
nginx設定ファイルで指定できる単位一覧

nginx.confなどでサイズや時間を指定する際に使える単位一覧です。

## サイズの単位
|単位|値|
|:--:|:--:|
|k|キロバイト|
|m|メガバイト|

## 時間の単位
|単位|値|
|:--:|:--:|
|ms|ミリ秒|
|s|秒|
|m|分|
|h|時間|
|d|日|
|w|週|
|M|月|
|y|年|

## 例
```nginx
# 1month
expires 1M;

# 1minute
expires 1m;
```
RaspberryPi1(2とzeroも)で動かすgolang製アプリをクロスコンパイル(onMac)



私NASストレージとしてRaspberryPi1を運用してまして
golangで作られたtorrentClientをインストールしてみたくなりました。
そこで初めてクロスコンパイルしてみました。


超簡単で以下のコマンドのみ

```raspberpi1用
GOOS=linux GOARCH=arm GOARM=6 go build
```


特に``./make.bash``とか``--cross-compile-all``を使ってクロスコンパイル環境を作ることもなく
そのままクロスコンパイルできました。
homebrewでインストールすると最初からクロスコンパイル環境できているんですかね。
(goのバージョンは1.6です。)



ポイントは``GOARM=6``なところ

[http://elinux.org/RPi_Hardware](http://elinux.org/RPi_Hardware)によるとRaspberryPiのCPUは以下となっております。

| ボード名 | CPU | cat /proc/cpuinfo |
|--------|--------|---|
| RaspberryPi(1,zero)  | 700 MHz ARM11 ARM1176JZF-S core |ARMv6-compatible processor rev 7 (v6l)|
| RaspberryPi2  | 900MHz quad-core ARM Cortex-A7  |ARMv7 Processor rev 5 (v7l)|

なので``GOARM=6``とすれば1,zero用に
``GOARM=7``とすれば2用にバイナリが作れるってことですね。


間違ったアーキテクチャでコンパイルすると以下の実行エラーが出ます。


```
$ cloud-torrent
Illegal instruction
```

raspberpi1上でアプリをコンパイルしようとしたら凄く時間がかかりまして、Macでクロスコンパイルしたら一瞬でした。


# 作業履歴

[cloud-torrent](https://github.com/jpillora/cloud-torrent)というgolang製アプリをRaspberryPi1に導入する




## バイナリ作成

Macにて以下の作業を実施

```
$ go get -v github.com/jpillora/cloud-torrent
$ cd $GOPATH/src/github.com/jpillora/cloud-torrent
$ GOOS=linux GOARCH=arm GOARM=6 godep go build 
$ file cloud-torrent
cloud-torrent: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
```

scp等で作成したバイナリを`/home/pi/bin/`に配置


## daemonとして設定する

### supervisorの導入

RaspberryPi上で作業

```
$ sudo apt-get update
$ sudo apt-get install supervisor
```

### 設定

```sh:
sudo vim /etc/supervisor/conf.d/cloud_torrent_sv.conf
```

以下のように記述


```/etc/supervisor/conf.d/cloud_torrent_sv.conf                                                      
[program:cloud_torrent]
command=/home/pi/bin/cloud-torrent  ; 起動コマンド
numprocs=1   ; 起動するプロセス数
redirect_stderr=true  ; エラー出力を標準出力にリダイレクト
stdout_logfile=/var/log/cloud_torrent.log  ; 標準出力ログのファイル名
user=pi
```

以下のコマンドで有効化

```
$ sudo supervisorctl reread
$ sudo supervisorctl add cloud_torrent
$ sudo supervisorctl status
cloud_torrent                    RUNNING    pid 9663, uptime 2:03:24
```

初期状態では:3000ポートにてアクセス




 





# 参考文献

https://github.com/golang/go/wiki/GoArm
http://qiita.com/Jxck_/items/02185f51162e92759ebe
https://thinkit.co.jp/story/2013/08/06/4162
http://raspi.seesaa.net/article/415778601.html
機械学習キット numpy matplotlib scipy　御三家をdebian ubuntu にインストールするには守るべき順番がある

#機械学習キット numpy matplotlib scipy　御三家をdebian ubuntu にインストールするには守るべき順番がある


> python -v

- うん、これはさすがにはいっている

> pip
: command not found

- さてここから

sudo apt-get install python-pip

- pip install ですんなりはいると思ったら大間違い


sudo apt-get install -y python2.7-dev libpng-dev libfreetype6-dev
sudo apt-get install -y libgtk2.0-dev
sudo apt-get install -y python-gtk2-dev

上記devをいれてからようやくnumpy とmatplotlibが通る

> sudo pip install numpy
> sudo pip install matplotlib

numpyの前にscipyは入らないけど、後にもまだ必要なものを自分で依存解決する必要がある。

sudo pip install cython

sudo apt-get install gfortran 
sudo apt-get install liblapack-dev

> sudo pip install scipy
【Unityシェーダー】よく使うシェーダー関数はcgincを作ると便利

※この記事で使っているUnityのバージョンは Unity5.2.1p3 です。 (OSはWindowsです)

#はじめに
シェーダーを書いてると.shaderがついつい長くなってしまいます.
そこで、外部ファイルにシェーダー関数を定義して.shaderからこれを呼ぶ方法はないか調べてみました.

#1 .cgincファイルを作る
Unity上の右クリックメニューからは.cgincを作ることができないみたいなのでエクスプローラー上で適当なファイルを作って拡張子をcgincに変更します.

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/3c62448a-74e5-0b1b-8727-36bc7382c832.png)
<br>

```hoge.cginc
float hogefunc()
{
	return 0.7;
}
```

#2 .shaderで#includeする
.shaderの頭で  ```#include"hoge.cginc"``` と記述します. 
```#include"UnityCG.cginc"``` の下に書いておけば大丈夫だと思います
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/21486dfa-fb5f-3dbf-e536-07a8be4a6cba.png)

#3 完成
これでhoge.cgincの中で定義した関数が使えるようになりました.
.shaderの中でhogefunc()を呼ぶと正しく動きます.

#参考
How can I make my own shader include file (.cginc or .glslinc)?
http://answers.unity3d.com/questions/7595/how-can-i-make-my-own-shader-include-file-cginc-or.html
専門用語抽出ツール「TermExtract」のインストール

# 概要
- 専門用語は複数名詞の復合であることが多く，形態素解析後に処理が必要
- TermExtractはそのためのツールのひとつ
- OSX や CentOS にインストールする場合注意点がある
- nkf とかで ソースコードを utfにする

# 本文
## 背景
NLPではその手始めに形態素解析を実施することが一般的で，これに関してはMeCabなど便利なツールも沢山あります．
ところで，多くの専門用語は複数の名詞の複合であることが多く，形態素に分けてしまうと問題があることもあります．

例：
> 原文「手書き文書解析システム Hoge Piyo の開発」
> 分かち書き「手書き|文書|解析|システム|Hoge|Piyo|の|開発」
> ほしい結果 「手書き文書解析システム|Hoge Piyo|の|開発」

単純に名詞が連続している場合にはくっつける…というのも手なのですが，もう少し賢く専門用語を抽出する手法もあるようです．
とりあえず，日本語でわかりやすい論文があり，Perlベースの実装も提供されているツールに「TermExtract」があるようです．
http://gensen.dl.itc.u-tokyo.ac.jp/

と，言うわけで手元のOSXやCentOSにインストールした見たモノの動かなかったので，メモ．

## 問題
インストールは全く複雑でなく，マニュアルにある手順にしたがって行くと問題なく完了します．
サンプルもつけてあって，よさげですが，なぜか動作しません（ファイルの読み込みなどはできているのに，結果を返してくれません）．

## 原因
文字コードの問題です．

## 対策
```shell-session:sample.sh
% nkf -Lu -w --overwrite Makefile.PL
% cd TermExtract 
% nkf -Lu -w --overwrite *.pm
```
などとして，ソースコードをUTF8に変換する必要があります．

## おしまい．

### おまけ 
自分が適用した例については，もともとの文章量が多くもない（1000件に満たない）ので，名詞が連続してたらつなぐ…というので十分でした…；
YouTubeの動画のダイレクトリンクを取得する方法

YouTubeの動画のダイレクトリンクを取得する方法を簡単に纏めました。

## 動画のidを取得
ブラウザーで表示するURLをみたらすぐわかると思います。

```
https://www.youtube.com/watch?v=r1nzIVm6UXY
```
`v=r1nzIVm6UXY`というパラメータがありますね。r1nzIVm6UXYとは動画のidです。

## 動画の情報を取得
上記の動画IDを`http://www.youtube.com/get_video_info?video_id=`の後ろにつけて、以下のURLになります。

```
http://www.youtube.com/get_video_info?video_id=r1nzIVm6UXY
```
ブラウザのアドレスバーに入力したらget_video_infoというファイルをダウンロードします。
そのファイルの内容は
```
status=ok&default_audio_track_index=0&timestamp=1456301410&cc_fonts_url=https%3A%2F%2Fs.ytimg.com%2Fyts%2Fswfbin%2Fplayer-vfld3Zj60%2Ffonts708.swf&ad_logging_flag=1&excluded_ads=10%3D14_14%3B46%3D14_14%3B61%3D1_3%2C2_3%3B63%3D1_1%2C1_2_1%2C1_3%2C2_2_1%2C2_3%2C15_2_1%3B64%3D14_14%3B65%3D15_2_1&keywords=%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AA%E3%83%BC%2C%E5%BB%BA%E8%A8%AD%2C%E5%BB%BA%E8%A8%AD%E6%8A%80%E8%A1%93%2C%E5%BB%BA%E7%AF%89&cosver=10_11_2&apply_fade_on_midrolls=True&video_verticals=%5B366%2C+1247%5D&dashmpd=https%3A%2F%2Fmanifest.googlevideo.com%2Fapi%2Fmanifest%2Fdash%2Fsparams%2Fas%252Chfr%252Cid%252Cip%252Cipbits%252Citag%252Cmm%252Cmn%252Cms%252Cmv%252Cpcm2cms%252Cpl%252Cplayback_host%252Crequiressl%252Csource%252Cexpire%2Frequiressl%2Fyes%2Fsver%2F3%2Fkey%2Fyt6%2Fupn%2F-
...省略
```

## (2)で取得した情報を分析して、ダイレクトリンクを取得
get_video_infoファイルには動画についていろんな情報があって、分析したらダイレクトリンクを取得できます。ダイレクトリンクだけじゃなくて、役に立つ多くの情報がありますね。
”間違って削除されないようコンテナを保護する”で作ったOUを削除する方法のリンク


”間違って削除されないようコンテナを保護する”で作ったOUを削除したいんだけど | kamepress https://kametaro.wordpress.com/2008/06/13/%E2%80%9D%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E5%89%8A%E9%99%A4%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E4%BF%9D%E8%AD%B7%E3%81%99%E3%82%8B/
ISO8601形式の文字列をNSDateにする方法


日時の情報をJSONなどでやりとりする時にこんな文字列をよく使う。

- `2016-02-24T09:00:00.000Z`
- `2016-02-24T00:00:00.000+09:00` 

これらは[ISO8601](https://ja.wikipedia.org/wiki/ISO_8601)という規格らしい。
サーバー側のTimezoneの設定次第ではどちらの形式で渡されてくるかわからない。なのでこれら両方に対応した NSDateFormatter のフォーマットがこちら

```
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ";
```



参考: http://stackoverflow.com/questions/16254575/how-do-i-get-iso-8601-date-in-ios
Alpine Linux をRaspberry Pi にインストールする

## 環境

使ったラズパイ: Raspberry Pi 2 Model B
母艦: Mac

![IMG_7638 のコピー.JPG](https://qiita-image-store.s3.amazonaws.com/0/17704/f51aeaf3-1165-d515-a01a-e4d89d0bbaa4.jpeg)

## やること

以下の手順に従ってRaspberry Pi に Alpine Linux をインストールします。 この記事では Mac でやる際の手順を説明します。

http://wiki.alpinelinux.org/wiki/Raspberry_Pi 

## 手順

1. OS のイメージをダウンロードします
  - http://alpinelinux.org/downloads/ の
  - alpine-rpi-3.3.1-armhf.rpi.tar.gz
  - をダウンロードします。
  - これはこの記事を書いた時点でのバージョンなので 3.3.1 の部分はその時の最新のやつを使ってください
2. Mac に SD Card を刺してフォーマットします
  - ディスクユーティリティを開いて `消去` というところから `FAT` で初期化します
3. 1でダウンロードしたファイルを解凍して SD Card の中に入れます
  - SD Card の中が以下の画像の様になればおっけーです
  - ![image](https://qiita-image-store.s3.amazonaws.com/0/17704/265473e6-2aaa-554a-8a62-ff622646caa5.png)
4. SD Card を取り外して Raspberry Pi に刺します
5. Raspberry Pi にディスプレイ・キーボード・LAN ケーブルを接続して電源を入れます
6. なんか画面に文字ががーーーっと出てログインを求められるのでログインします
  - ユーザメインは `root` でパスワードは空です
7. ログインしたら `setup-alpine` と実行してセットアップします
8. 色々聞かれるので適当にエンターを押したりしてセットアップします
  - わからない部分はその都度ググったりしましょう
  - 遊びでやる分には適当で大丈夫です
9. `lbu commit` をして変更を保存します
  - lbu は `local backup` の略っぽい
  - Alpine Linux は初めて触ったのでよくわからないので後で調べます
10. アップデートしたりする
  - http://wiki.alpinelinux.org/wiki/Raspberry_Pi  の `Post Installation` の部分をやる


特に引っかかることもなく簡単にインストールできました。

Ubuntu をインストールしたときはめっちゃ時間がかかったのですが、 Alpine は数分でインストールが完了しました。

イメージサイズが小さいので環境を作り直したりするのが楽でいいと思います。
Sublime Text 3 でコーディングの効率化を図るための初期設定

テキストエディタ Sublime Text 3 を使って、コーディングの効率をあげるための設定をインストールから、プラグインインストールまで一連の流れを追ってメモ

# Sublime Text 3 のインストール

1. 公式サイトから各OS用インストーラをダウンロード、実行<br /> https://www.sublimetext.com/3
2. アプリを起動する


# Package Controll のインストール

Sublime Text のパッケージ管理ツールをインストールします。
公式サイト：https://packagecontrol.io/

1. Sublime Text 3 を起動
2. ショートカットキー「Ctrl + `」でコマンドライン表示
3. 公式サイトの Installation からコマンドをコピーしてコマンドラインで実行<br />https://packagecontrol.io/installation#st3

## EditorConfig のインストール

EditorConfig は、異なるエディタを使うケースや複数人数に渡るプロジェクトにおいて力を発揮します。
改行コードや文字コードが異なることによるエラーを防ぐことができるよう、エディタの設定ファイルを外部ファイルで管理するプラグインです。
プロジェクトごとに異なるインデントや文字コードなどの規定がある場合に非常に役立ちます。
公式サイト：http://editorconfig.org/

1. Sublime Text 3 を起動
2. ショートカットキー「Ctrl + Shift + P」でコマンドパレットを表示
3. Package Controll: install Package を実行
4. EditorConfig を検索してインストール実行

### EditorConfig の設定

1. .editorconfig ファイルの作成<br />文字コードは UTF-8、改行コードは CRLF または LF
2. 設定したいプロパティの値を指定して、.editorconfig に保存<br />https://github.com/sindresorhus/editorconfig-sublime#readme

## Emmet のインストール

html をチート入力できます。
コードの記述時間が大幅に短縮されます。
Ctrl + E で変換！
公式サイト：http://emmet.io/

1. Sublime Text 3 を起動
2. ショートカットキー「Ctrl + Shift + P」でコマンドパレットを表示
3. Package Controll: install Pachage を実行
4. Emmet を検索してインストール実行

チートシートはURLを参照：http://docs.emmet.io/cheat-sheet/

### Emmet の設定

もし、Hayaku を入れる場合は、tab が喧嘩してしまうので、下記の通り設定を変更します。
1. Sublime Text 3 を起動
2. メニューの Preferences を開く
3. Package Settings → Emmet → Settings - User を選択
4. 下記を記述して保存


```
{
"disable_tab_abbreviations_for_scopes": "css,less,sass,scss,stylus"
}
```
を記述して保存

## ConvertToUTF8 のインストール

ShiftJIS のファイルを UTF-8 に変換して表示してくれます。
保存するときは文字コードを戻してくれます。

1. Sublime Text 3 を起動
2. ショートカットキー「Ctrl + Shift + P」でコマンドパレットを表示
3. Package Controll: install Pachage を実行
4. ConvertToUFT8 を検索してインストール実行

## SublimeLinter のインストール

SublimeLinter はリアルタイムで構文チェックをしてくれます。

1. Sublime Text 3 を起動
2. ショートカットキー「Ctrl + Shift + P」でコマンドパレットを表示
3. Package Controll: install Pachage を実行
4. SublimeLinter を検索してインストール実行

## BracketHighlighter のインストール

{ } をハイライト。閉じたかどうかチェック。

1. Sublime Text 3 を起動
2. ショートカットキー「Ctrl + Shift + P」でコマンドパレットを表示
3. Package Controll: install Pachage を実行
4. BracketHighlighter を検索してインストール実行
Jmeterのインストール

# **環境**
## **Linux**
- CentOS6.7
- Apache-Jmeter2.13

## **Windows**
- Windows7 Pro x64
- Apache-Jmeter2.13

# **インストールの流れ**
## **Linux**
1. Javaのインストール
2. jmeterパッケージダウンロード
3. jmeterパッケージ解凍＆パス設定

## **Windows**
1. Javaのインストール
2. jmeterパッケージダウンロード
3. jmeterパッケージ解凍＆パス設定


# **詳細手順(Linux)**
## **1. Javaのインストール**

```shell-session
[root@jmeter01 ~]# yum install -y java
```

## **2. jmeterパッケージダウンロード**
### **2.1 ディレクトリ移動**
```shell-session
[root@jmeter01 ~]# cd /opt/
```

### **2.2 パッケージダウンロード**
```shell-session
[root@jmeter01 opt]# wget http://ftp.kddilabs.jp/infosystems/apache//jmeter/binaries/apache-jmeter-2.13.tgz
```

## **3. jmeterパッケージ解凍＆パス設定**
### **3.1 パッケージの解凍**
```shell-session
[root@jmeter01 opt]# tar zxvf apache-jmeter-2.13.tgz
```

### **3.2 パス設定**
```shell-session
[root@jmeter01 opt]# vim ~/.bashrc
# Jmeter
PATH=$PATH:$HOME/bin:/opt/apache-jmeter-2.13/bin
```

### **3.3 パス反映**
```shell-session
[root@jmeter01 opt]# source ~/.bashrc
```

### **3.4 確認**
```shell-session
[root@jmeter01 opt]# which jmeter
/opt/apache-jmeter-2.13/bin/jmeter

[root@jmeter01 opt]# jmeter --version
Copyright (c) 1998-2015 The Apache Software Foundation
Version 2.13 r1665067
```

# **詳細手順(Windows)**
## **1. Javaのインストール**
http://www.java.com/ja/download/ からもモジュールをダウンロードしインストール実施

## **2. Jmeterのインストール**
### **2.1 モジュールのダウンロード**
- 下記からダウンロード

http://ftp.kddilabs.jp/infosystems/apache//jmeter/binaries/apache-jmeter-2.13.zip

### **2.2 インストール**
- 起動確認
  - 下記`.bat`ファイルを実行

```shell-session
C:\Program Files (x86)\apache-jmeter-2.13\bin\jmeter.bat
```

- 下記が起動したらインストール終了です

![WS000527.png](https://qiita-image-store.s3.amazonaws.com/0/79134/5befb28c-5301-9875-9e6b-5046ff34d123.png)
JSP 7.6練習問題P213 

##練習7-2

▪️FruitServlet.java

```java
package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import bean.Fruit;
import javax.servlet.RequestDispatcher;

@WebServlet("/FruitServlet")
public class FruitServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Fruit f = new Fruit("いちご", 480);

		request.setAttribute("fruit", f);

		RequestDispatcher dispatcher = request.getRequestDispatcher("/show.jsp");
		dispatcher.forward(request, response);
	}

}
```

▪️Fruit.java

```java
package bean;

public class Fruit implements java.io.Serializable {
	private String name;
	private int price;

	public Fruit() {

	}

	public Fruit(String name, int price) {
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

}
```

▪️show.jp

```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="bean.Fruit"%>
<!-- リクエストスコープからインスタンスを取得 -->
<%
	Fruit fruit = (Fruit) request.getAttribute("fruit");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8">
<title>show.jsp</title>
</head>
<body>
	<p><%=fruit.getName()%>の値段は<%=fruit.getPrice()%>円です。
	</p>
</body>
</html>
```

▪️FruitServlet.java 実行結果
![スクリーンショット 2016-02-24 17.00.50.png](https://qiita-image-store.s3.amazonaws.com/0/95187/627bb013-e106-bb2d-fc56-cffc053bec8d.png)
CakePHP ローカライズ／翻訳

[参考サイト](http://kwski.net/cakephp-2-x/1104/)

上記に全て書いてあるが、自分用にメモ。

# 最初に
テキストを記述するときは必ずこう書いておく事。
これで、後からこう記述した所を自動抽出して翻訳ファイルを生成することが出来る。

```php
<?php echo __('翻訳するテキスト'); ?>
```

# 工程
1. コンソールでpotファイル生成
2. Poeditでpot→poに変換、mo出力
3. CakePHPで言語設定

# コンソールでpotファイル生成
コンソール(コマンドプロンプト)でappディレクトリに移動。
以下のコマンドを実行。

```
C:\xampp568\htdocs\cakephp\app>cake i18n


Welcome to CakePHP v2.7.3 Console
---------------------------------------------------------------
App : app
Path: C:\xampp568\htdocs\cakephp\app\
---------------------------------------------------------------
I18n Shell
---------------------------------------------------------------
[E]xtract POT file from sources
[I]nitialize i18n database table
[H]elp
[Q]uit
What would you like to do? (E/I/H/Q)
>
```
[E]を選択。
抽出対象のディレクトリを指定。

```
Current paths: None
What is the path you would like to extract?
[Q]uit [D]one
[C:\xampp568\htdocs\hondapdf\app\] >
```
その後はデフォルトのままでOK。

```
Current paths: C:\xampp568\htdocs\hondapdf\app\
What is the path you would like to extract?
[Q]uit [D]one
[D] >

Would you like to extract the messages from the CakePHP core? (y/n)
[n] >
What is the path you would like to output?
[Q]uit
[C:\xampp568\htdocs\hondapdf\app\Locale] >

Would you like to merge all domain and category strings into the default.pot file? (y/n)
[n] >


Extracting...
---------------------------------------------------------------
Paths:
   C:\xampp568\htdocs\hondapdf\app\
Output Directory: C:\xampp568\htdocs\hondapdf\app\Locale\
---------------------------------------------------------------

Done.
```
これでapp\Localeに幾つかのpotファイルが生成された。
自分で記述したテキストはdefault.potに抽出されているはず。

言語ごとに指定のフォルダに配置する必要があるので、
`app\Locale\jpn\LC_MESSAGES` を作成しpotを配置する。
※英語→日本語の翻訳をする場合
※実際にCakeが使うのはこの後生成するmoファイルなので、potはここに置いておく必要はないが同じ場所に置いておく。

# Poeditでpot→poに変換、mo出力
Poeditを起動し、「ファイル」→「POTファイルを元に新しいカタログを作成します」で先程のpotを読み込み。
「カタログの設定」ダイアログの「複数形」を以下のようにしておく。
こうしないと後で「invalid nplurals value」エラーが出てしまう。

```
#変更前
nplurals=INTEGER; plural=EXPRESSION;
#変更後
nplurals=2; plural=(n > 1);
```

そのままPoedit上で翻訳する。
保存すると同じ場所にmoファイルが生成される。

# CakePHPで言語設定
`app\Locale\jpn\LC_MESSAGES\default.mo` ができた。
ここに置いてあるだけでCakeはブラウザの言語設定から自動で言語を判断して表示してくれる。

任意で切り替える場合はControllerに以下を記述。

```php
// 英語のまま
Configure::write( 'Config.language', 'eng');
// 日本語へ翻訳
Configure::write( 'Config.language', 'jpn');
```
シェルとPythonでデータを簡単にグラフ化する


# はじめに

定期的に取得したデータをグラフ化するのは簡単かつ得られものも大きいことが少なくない。
ただ未経験の人にはハードルが高く感じられると思うので、入り口の提供になればと思う。
(あとはpythonの布教)

# meminfoのグラフ化

例として定期的に取得した`/proc/meminfo`の情報をシェルとpythonで簡単にグラフ化してみる。

meminfoの情報は`<日付>/<時分秒>/meminfo.log`の形式で保存されているとする(例:`20160224/105312/meminfo.log`)


meminfoのフォーマットはこんな感じ

```
MemTotal:         511476 kB
MemFree:          269240 kB
Buffers:           13936 kB
Cached:            56044 kB
SwapCached:            0 kB
Active:            36944 kB
Inactive:          47324 kB
Active(anon):      14648 kB
Inactive(anon):      208 kB
Active(file):      22296 kB
Inactive(file):    47116 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:             0 kB
HighFree:              0 kB
LowTotal:         511476 kB
LowFree:          269240 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         14304 kB
Mapped:            16548 kB
Shmem:               568 kB
Slab:               7416 kB
SReclaimable:       2600 kB
SUnreclaim:         4816 kB
KernelStack:         504 kB
PageTables:          784 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      255736 kB
Committed_AS:     195212 kB
VmallocTotal:    1548288 kB
VmallocUsed:        8428 kB
VmallocChunk:    1350896 kB
```

meminfoの中で`Committed_AS`の値をグラフ化したいとする

```bash
$ find . -name 'meminfo.log' | sort | xargs grep Committed_AS
```

とすると以下のような出力が得られる。

```
./20160211/190409/meminfo.log:Committed_AS:     389260 kB
./20160211/191528/meminfo.log:Committed_AS:     389300 kB
./20160211/192648/meminfo.log:Committed_AS:     394600 kB
```

これを更にgawkで処理して`日付 数値`のフォーマットにする

```bash
$ find . -name 'meminfo.log' | sort | xargs grep Committed_AS | gawk 'match($0, /\/([0-9]+)\/([0-9]+).*[0-9]+ kB/, a) {print a[1] a[2], $2}'
```

```
20160211190409 389260
20160211191528 389300
20160211192648 394600
```

あとはmatplotでこれを描画する

```py3:plot_date.py
#!/usr/bin/env python3 

import matplotlib.pyplot as plt

from datetime import datetime as dt

import sys

[date, y] = zip(*[l.split() for l in sys.stdin])
date=[dt.strptime(d, "%Y%m%d%H%M%S") for d in date]

plt.plot(date,y)

plt.show()
```

```bash
$ find . -name 'meminfo.log' | sort | xargs grep Committed_AS | gawk 'match($0, /\/([0-9]+)\/([0-9]+).*[0-9]+ kB/, a) {print a[1] a[2], $2}' | python3 plot_date.py
```

![mem_plot.png](https://qiita-image-store.s3.amazonaws.com/0/39647/1358006f-5988-4423-1c96-48279692e334.png)
Swift - ARC 和 循环强引用



```Swift
//  Created by Kxx.xxQ 一生相伴 on 16/2/23.
//  Copyright © 2016年 Asahi_Kuang. All rights reserved.
//

import Foundation

// Swift - ARC

class Student {
    var name: String?
    var age: Int?
    
    init(name: String, age: Int) {
        self.name = name
        self.age  = age
        print("\(self.name!)   被创建了.")
    }
    deinit {
        print("\(self.name!)   被销毁了.")
    }
}


var xiaoMing: Student? = Student(name: "小明", age: 25)
// xiaoHong和xiaoWang会对xiaoMing强引用。ARC 计数为3
var xiaoHong = xiaoMing
var xiaoWang = xiaoMing

// 必须全部释放才能销毁对象。
xiaoMing = nil
xiaoHong = nil
xiaoWang = nil




// 对象之间循环强引用
class Person {
    var name: String
    weak var apartment: Apartment?
    
    init(name: String) {
        self.name = name
        print("\(self.name)    被创建了")
    }
    deinit {
        print("\(self.name)    被销毁了")
    }
}

class Apartment {
    var doorNumber: NSInteger
    unowned var people: Person
    
    init(doorNumber: NSInteger) {
        self.doorNumber = doorNumber
        self.people = Person(name: "xx")
        print("公寓\(self.doorNumber)号    被创建了")
    }
    deinit {
        print("公寓\(self.doorNumber)号    被销毁了")
    }
}

var xiaoKuang: Person? = Person(name: "邝大爷")
var apartmentOne: Apartment? = Apartment(doorNumber: 19910923)

// 相互强引用了
xiaoKuang!.apartment = apartmentOne
apartmentOne!.people = xiaoKuang!

// Swift提供了两种解决对象属性循环强引用的方法：
// 1. 弱引用(weak reference)：只能被声明为变量，只能是可选类型，因为可以为nil
// 2. 无主引用(unowned reference)：永远有值，所以被声明为非可选类型

xiaoKuang = nil
apartmentOne = nil
```
JavaScript の正規表現の case insensitive は全角英数にも適用される

```js:全角で
"ｉＰｈｏｎｅ".match(/ｉｐｈｏｎｅ/i);  // ["ｉＰｈｏｎｅ"]
```

べんり🎉

## 以下で動作確認

* iOS 9.2.1 UIWebView 
* Google Chrome Version 48.0.2564.116 (64-bit) 
* node
    * v0.10.36 (AWS Lambda 上)
    * v5.5.0

## 補足

上のように case insensitive (`i`フラグ) を使うことで、半角全角各々で大文字 / 小文字に対応できますが、半角 ↔ 全角の両方にヒットさせたいときは、自分で両パターン用意してやる方法があります。

### 全角 ↔ 半角の相互変換

たとえば String に以下のように全角半角変換を生やす。

```js:全角→半角にする
String.prototype.toHankaku = function () {
    return this.replace(/[Ａ-Ｚａ-ｚ０-９]/g, function (s) {
        return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
    });
};

"ｉＰｈｏｎｅ".toHankaku();  // "iPhone"
```


```js:半角→全角にする
String.prototype.toZenkaku = function () {
    return this.replace(/[A-Za-z0-9]/g, function (s) {
        return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
    });
};


"iPhone".toHankaku();  // "ｉＰｈｏｎｅ"
```
136年後 > 2152年X月X日になった時 > unsigned 32bit intの使用間違い

```txt:動作確認
C++ Builder XE4
```

3日ほど前に出くわした現象。日付が2152年3月28日になった。

理由は DWORD (僕の環境でunsigned int 32bit)の変数に対してマイナス値を計算しようとしていたことだった。

今後は同じ症状になった時にすぐに原因を見つけられるようにここにメモしておく。


### 再現コード

```
#include <stdint.h>

...

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TDateTime dt1;

	// 0. Now
	OutputDebugString(DateTimeToStr(Now()).c_str());

	// 1. DWORD (unsigned int 32bit)
	DWORD dword_diff_time_sec = 50;

	dword_diff_time_sec = (- dword_diff_time_sec); // error > DWORD is unsigned long
	dt1 = IncSecond(Now(), dword_diff_time_sec);
	OutputDebugString(DateTimeToStr(dt1).c_str());

	// 2. unsigned int 64bit
	uint64_t uint64_diff_time_sec = 50;

	uint64_diff_time_sec = (- uint64_diff_time_sec); // error
	dt1 = IncSecond(Now(), uint64_diff_time_sec);
	OutputDebugString(DateTimeToStr(dt1).c_str());

	// 3. unsigned int 16bit
	uint16_t uint16_diff_time_sec = 50;

	uint16_diff_time_sec = (- uint16_diff_time_sec); // error
	dt1 = IncSecond(Now(), uint16_diff_time_sec);
	OutputDebugString(DateTimeToStr(dt1).c_str());


}
//---------------------------------------------------------------------------
```

IncSecond()は指定時刻に秒数を足す処理。


```txt:結果
デバッグ出力: 2016/02/24 16:10:01 -- Now
デバッグ出力: 2152/04/01 22:37:27 -- DWORD使用ミス
デバッグ出力: 2016/02/24 16:09:11 -- uint64使用ミス (だがミスになっていない)
デバッグ出力: 2016/02/25 10:21:27 -- uint16使用ミス
```


2152年(だいたい136年後）の日付が出てきたとしたら、32bit unsigned int(long)にて負数を間違って使用している、ということに次回はすぐに気づきたい。

<hr>
(追記 2016/02/26)

1月7日に投稿した記事に136年というのが記載されていた。
さすがに136という数値までは覚えていなかった。

http://qiita.com/7of9/items/27b321cfdfe579f44b9a
AppDelegateに処理を任せる

クラス一つ一つに同じ処理を書くのは冗長なので、デリゲートを利用する。

```swift:AppDelegate.swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
...
  func getValue(key: String) -> String {
    if key == "key1" {
      return "value1"
    } else if key == "key2" {
      return "value2"
    }
    return ""
  }
}
```

```swift:FirstViewController.swift
import UIKit

class FirstViewController: UIViewController {
  let myDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
...
  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    let value = myDelegate.getValue("key1")
  }
}
```


```swift:SecondViewController.swift
import UIKit

class SecondViewController: UIViewController {
  let myDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
...
  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    let value = myDelegate.getValue("key2")
  }
}
```
auditについてインストールと簡単な利用方法のメモ。

# はじめに
## auditとは？
auditとはLinuxサーバで用いる監査ツールです。

## どんなことができるの？
SELinuxのAVC拒否、システムログイン、アカウント変更、sudoなどを使った認証結果などを監査することができます。
・システムイベントの記録
・監査イベントの記録
・バックアップのチェック
・ログファイルの切り替え
・設定ファイルの変更チェック
etc...

# 導入
auditのインストールと設定について簡単に説明します。

## 1. パッケージインストール
RedHat系はyum、Debian系はapt-getでパッケージインストールができます。

```bash:Debian系
$ sudo apt-get install auditd
```
```bash:RedHat系
$ sudo yum install audit
```

※パッケージの指定がapt-getの場合はauditd、yumの場合はauditとなるので注意してください。

## 2. 構成
基本的にauditdは設定ファイル(auditd.conf)とルール定義ファイル(audit.rules)、ログ(audit.log)の３つから構成されます。
またこれらのファイルは、デフォルトで以下のパスに配置されます。
・設定ファイル：_/etc/audit/auditd.conf_
・ルール定義ファイル：_/etc/audit/audit.rules_
・ログ：_/var/log/audit.log_

ということでインストールができたので、とにかく利用してみましょう。

## 3. ルールの確認
まずは、ルールの確認です。

```bash:-lオプション
$ sudo auditctl -l
No rules
```

初期は何もルールが設定されていないので"_No rules_"となります。
それでは何か追加してみましょう。

## 4. ルールの追加

```bash:確認
$ sudo auditctl -a exit,always -F arch=b64 -S open -F path=/etc/resolv.conf
```

_**-a filter,action**_：指定したルールを追加します。_filter_でフィルタを指定し、_action_で監査イベントを生成するかどうかを指定します。
ちなみに、_-a_でルールを末尾に追加、_-A_でルールを先頭に追加です。
_**-F**_：監査イベントで抜き出すための条件式を定義します。
_**-S**_：システムコール名やシステムコール番号を指定します。allはワイルドカードです。
_**-k**_：監査イベントにラベルを付けてログを後から検索できるようにする場合に指定します。

詳しい内容はまた記載しませんが、これは"_/etc/resolv.conf_"をopenするのをチェックしています。

ルールの追加が完了したらもう一度確認コマンドを実行してみましょう。

```bash:-lオプション
$ sudo auditctl -l
LIST_RULES: exit,always arch=3221225534 (0xc000003e) watch=/etc/resolv.conf syscall=open
```

ルールが追加されたのが確認できます。

## 5. ルールの削除
それでは追加したルールを今度は削除してみます。

```bash:削除
$ sudo auditctl -d exit,always -F arch=b64 -S open -F path=/etc/resolv.conf
```

_**-d**_：指定したルールを削除します。

それでは削除できているか確認します。

```bash:確認
$ sudo auditctl -l
No rules
```

一つしかルールがなかったので削除すると"No rules"になりました。

# 今回のまとめ
・auditはLinuxサーバで利用する監査ツール
・RedHat系はyum、Debian系はapt-getでパッケージインストールができる。
・パッケージインストールの指定はyumだとaudit、apt-getだとauditdになる。
・_auditctl -l_でルールの確認
・_auditctl -a_でルールの追加
・_auditctl -d_でルールの削除

以上です。
ngInfiniteScrollのスクロールイベントを強制的に発火させる


無限スクロールを実現してくれる便利なライブラリngInfiniteScroll。

https://sroze.github.io/ngInfiniteScroll/documentation.html

基本的にはスクロールさせれば勝手に読み込みイベントが発火してくれますが、ページの高さに比してスクロールしない量のコンテンツを読み込んだ時にスクロールしない->イベントも発生しないので困ってしまいます。

でそんな時に強制発火させる方法


html

```html
 <div infinite-scroll='loadMore()' infinite-scroll-parent="true"
     infinite-scroll-distance="0" infinite-scroll-listen-for-event="force:load">
```

controller

```js
 $scope.$emit('force:load')
```

infinite-scroll-listen-for-eventを定義すれば良いというわけです。

ご参考まで
Bladeでエラーになって困ったメモ [入門者編]

そのファイル名は何ですのん！？

![Screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/71525/a260ed65-604f-cf20-0079-13d89ccb0ed4.png)

↓ここに出てくるようです。

![Screenshot-1.png](https://qiita-image-store.s3.amazonaws.com/0/71525/f87e07bc-871e-b620-378e-e0eb53fcb79f.png)

↓の内容はエラー出す為に、滅茶苦茶書いてます。

![Screenshot-2.png](https://qiita-image-store.s3.amazonaws.com/0/71525/877d1611-3330-8f11-1cb6-841a66d62de9.png)
dockerで、いい感じでMySQL環境を作る


### データコンテナ作成

    $ docker run -d -v /var/lib/mysql --name localStorage busybox true

| オプション / パラメータ | 内容 |
| :-- | :-- |
| -d | コンテナのバックグラウンド実行指定。 |
| -v /var/lib/mysql | ホストにマウントするコンテナ側のディレクトリ(MySQLデータディレクトリ)。 |
| --name localStorage | ストレージコンテナの名前。 |
| busybox | [データコンテナ用超軽量イメージ](https://hub.docker.com/_/busybox/)。 |
| true | busybox内で実行するコマンド(コンテナとして存在するだけなので、何もせずに正常終了させる)。 |

### データコンテナを使うコンテナ作成

    ＄ docker run -d --volumes-from localStorage -e MYSQL_ROOT_PASSWORD=root --name sampleDB mysql:5.6

| オプション / パラメータ | 内容 |
|:--|:--|
| -d | 同上。 |
| --volumes-from localStorage | ストレージコンテナ指定。さっき作ったデータコンテナを今からrunするコンテナにマウントする。 |
| -e MYSQL_ROOT_PASSWORD=root | MySQL rootパスワード設定(rootの部分はパスワード文字列そのもの)。 |
| --name sampleDB | runするコンテナの名前。 |
| mysql | [mysqlイメージ](https://hub.docker.com/_/mysql/)の選択。 |


因みに、

    $ docker run -d --volumes-from localStorage -v /host/path/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name sampleDB mysql

みたいにすると、

| オプション / パラメータ | 内容 |
|:--|:--|
| -v /host/path/conf:/etc/mysql/conf.d | ホスト上の /host/path/conf/ をコンテナの /etc/mysql/conf.d/ にマウントしてくれる。 |

となります。ローカルコンフィグレーションには便利。nfsマウントのdocker版みたいな感じ(逆向き)。


### mysqlのコンテナに接続

    $ docker ps -l -q
    0f1e506b00ec
    $ docker exec -it 0f1e506b00ec bash
    root@0f1e506b00ec:/#

### バックアップをホスト側に行う

sampleDBの起動中に行う。

    $ docker run --rm --volumes-from localStorage -v $(pwd):/backup busybox tar cvf /backup/backup.tar /var/lib/mysql

| オプション / パラメータ | 内容 |
|:--|:--|
| --rm | プロセスが終わると、その後直ぐにコンテナも終了する。 |
| --volumes-from localStorage | 起動中のデータコンテナ名。 |
| -v $(pwd)/backup:/backup | ホスト上の ./backup/ を、コンテナ上の /backup/ にマウントする。 |
| busybox | データコンテナ用超軽量イメージ。 |
| tar cvf /backup/backup.tar /var/lib/mysql | コンテナ上の /var/lib/mysql/ を tar cvf して、/backup/backup.tar に書き出す(つまり、マウント先のホスト上の ./backup/backup.tar へ書き出す)。 |

### ホストにあるバックアップからのリストア

    $ docker run --rm --volumes-from new_localStorage -v $(pwd):/backup busybox cd /var/lib/mysql && tar xvf /backup/backup.tar

| オプション / パラメータ | 内容 |
|:--|:--|
| --rm | プロセスが終わると、その後直ぐにコンテナも終了する。 |
| --volumes-from localStorage | 起動中のデータコンテナ名。 |
| -v $(pwd):/backup | ホスト上の . を、コンテナ上の /backup/ にマウントする。 |
| busybox | データコンテナ用超軽量イメージ。 |
| cd /var/lib/mysql && tar xvf /backup/backup.tar | コンテナ上の /var/lib/mysql/ にcdで移動し、 tar xvf で/backup/backup.tar を解凍。 |

---

# おまけ

エイリアスを切った感じでdockerコマンドの私的まとめ。

    $ alias CONTAINER_ID='docker ps -l -q' #現在動作中

| docker command | 内容 |
|:--|:--|
| docker stop `CONTAINER_ID` | コンテナを停止する |
| docker start `CONTAINER_ID` | コンテナを起動する |
| docker restart `CONTAINER_ID` | コンテナを再起動する |
| docker attach `CONTAINER_ID` | 起動中のコンテナに接続する |
| docker cp `CONTAINER_ID`:/etc/passwd . | コンテナ内のファイルをホストにコピーする |
| dockr rm `CONTAINER_ID` | コンテナを削除する |
| docker inspect `CONTAINER_ID` | コンテナの情報（IPなど）を表示する |
| docker logs `CONTAINER_ID` | コンテナのログを表示する |
| docker top `CONTAINER_ID` | コンテナのプロセスを表示する |


| docker command | 内容 |
|:--|:--|
| docker ps | 起動中のコンテナを表示する(停止中のコンテナも表示するには -a オプション) |
| docker rm \`docker ps -a -q\` | コンテナの全削除(実行中のコンテナはエラーが出る？)