OmniAICreator/Qiita-1.07M huggingface dataset:
【Julia】Juliaで時系列データにふれあいたい

[Julia Advent Calendar 2015](http://qiita.com/advent-calendar/2015/julialang)の12日目の記事です。
Juliaで時系列データを扱えるパッケージ`TimeArray`を使ってみた([マニュアル](http://timeseriesjl.readthedocs.org/en/latest/)を写経)所感を記載します。
v0.4.2を使用しています。

TimeSeriesの機能紹介の前に、Juliaには日付型などの時間を表す型が存在ます。
それらの型に対応した関数も同時に用意されています。
参考URL : http://julia.readthedocs.org/en/release-0.4/stdlib/dates/#dates-and-time
※ `Dates.`が前についている関数は時間を表す型を扱う関数を指します。

##使用データ
`MarketData.jl`より呼び出す。
データの詳細は[こちら](http://marketdata.readthedocs.org/en/latest/test_data.html)を参照

##機能紹介

`TimeArray`の主な機能は

 + TimeArray型のデータの作成
 + TimeArray型のデータから要素を取り出す
 + TimeArray型の操作
 + TimeArray型の結合

###前準備
```jl
# パッケージの読み込み
using TimeSeries, MarketData
```

###TimeArray型を作成する
```jl
# 日付型の1次元配列を作成
dates = [Date(1999,1, 1):Date(2000, 12, 31);]

# 先の配列と同じ長さの乱数を生成しカラム名に"test"とつけたTimeArrayを作成
mytime = TimeArray(dates, rand(length(dates)), ["test"])   
```

###データから要素を取り出す

```jl
# 行を選択して抽出
ohlc[1:3] 

# カラムを選択して出力
ohlc["Open", "Close"] 

# 時間を指定
ohlc[[Date(2000, 1, 3):Date(2000, 1, 10);]]

# 行と列を選択
ohlc["Open", "Close"][1:3] 

# カラム名と時間
ohlc["Open", "Close"][Date(2000, 1, 3):Date(2000, 1, 10)] 

# Dates.daynameは曜日を返す関数を適応させclから月曜日のデータのみを取り出す
when(cl, Dates.dayname, "Monday")

# 2001-12-27からデータの終わりまでを取り出す
from(cl, 2001, 12, 27)

# データの頭から2001-1-5まで
to(cl, 2001, 1, 5)


# 定めた条件(ここではCloseがOpenよりも大きい)に対してtrueとなる日付を返す
green = findwhen(ohlc["Close"] .> ohlc["Open"])
ohlc[green]

# 定めた条件(ここではCloseがOpenよりも大きい)にtrueとなる値を行数で返す
red = findall(ohlc["Close"] .< ohlc["Open"])
ohlc[red]
```

###TimeArray型の操作

```jl
# 2期ずらす
lag(cl[1:3], 2)

# lagとは逆方向にずらす
lead(cl[1:3], 2)

# 前期と比較し何%変化したのか
percentchange(cl[1:3])

# 10期ずらしで移動平均をとる
moving(cl, mean, 10) 

# 上の期と演算を行う。ここでは累積和となる
upto(cl, sum)

# Baseモジュールにある関数を適用させる. cumsum(cl)ではダメ
basecall(cl, cumsum)
```

### TimeArray型の結合

```jl
# TimeArrayに対応したmerge, ただしinner joinのみ
Caterapple = merge(AAPL, CAT)

# collapse：periodで指定した枠組みでデータを圧縮する
collapse(cl, last, period = Dates.month)  # 月の最後の値を出力する
```

##感想
時系列ならではの時間(年・月・週・日など)でデータを切ったり要約する分には今のところ不自由は感じなかった。時系列データの解析・可視化まわりについてはノータッチなので、追々調査してみたい。
nodebrewでnodeのバージョンを切り替えたはずが切り替わってなかった時の確認方法

nodebrewで管理していたnodeのバージョンを4系にあげようとしてあがらなかったのでメモ


現状

```
$ nodebrew ls
v0.12.7
v4.2.3
v5.2.0

current: v4.2.3
```

なっているのに

```
$ node -v
v0.12.0
```

なぜかv0.12.0を使っていることになっていた


なにかのバグかと思ったものの以前（結構前）に素でnodeをインストールしていたっぽく

```
$which node
/usr/local/bin/node
```

nodebrewで管理している場合 /path/to/.nodebrew/current/bin/nodeを参照するはず


（npmはnodebrewで管理しているやつを使ってたので気づいた）

```
$ which npm
/path/to/.nodebrew/current/bin/npm
```

/usr/local/bin/node をrmして再度確認

```
$ which node
/path/to/.nodebrew/current/bin/node

$ node -v
v4.2.3

$ nodebrew use v5.2.0
use v5.2.0
$ node -v
v5.2.0
```


nodebrew管理下の物を使うようになっている
【Swift】NSXMLParserで文字列にアルファベットや数字、マルチバイト文字が含まれる場合、複数に分かれてパースされる件


SwiftでXMLをパースする際に、
NSXMLParserを使用するのですが、以下のような要素をパースする際に

例
`<ele>aaa あいうえお abcd 春夏秋冬 123</ele>`

マルチバイト＋アルファベット文字列が要素内であったとすると、
それぞれ分かれて、一回目aaaで二回目あいうえお、三回目abcdの形で取得できてしまって、
一気に取れないのが不便。

フラグとかはないので手動で配列に貯めてから、閉じタグを読み込んだ時にreduceで再帰的に足して取得する


##実装

NSXMLParserDelegateを指定

```swift
    var isTitle:Bool=false
    var parsedStrArr:Array<String>!
    var entries : NSMutableArray!
    var tmpEntry : NSMutableArray!

    override func viewDidLoad() {
        super.viewDidLoad()
        loadRss()
    }

    func loadRss() {
        
        // Sample feed url
        let rUrl: NSURL = NSURL(string: "https://hoge.co.jp/feed/?cat=5")!
        let rssUrl = rUrl
        
        parser = NSXMLParser(contentsOfURL: rssUrl)!
        parser.delegate = self
        
        //以下の1行の処理でparse関連の処理が行われる。
        let success:Bool = parser.parse()
        if success {
            print("パース成功")
        } else {
            print("パース失敗")
        }
    }

    // NSXMLParserDelegate
    // ここから下はParse関連処理

    func parserDidStartDocument(parser: NSXMLParser){
        entries = NSMutableArray()
    }
  
    // 開始タグを読み込んだ時よばれる - Start
    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {

        parsedStrArr = []
        
        if (elementName == "title"){
	      // 配列初期化
            tmpEntry = NSMutableArray()
            entries.addObject(tmpEntry)
            isTitle = true;
        }
    }

    //閉じタグを読み込んだ時よばれる - End
    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        
        if (elementName == "title"){
            // reduceによる再帰処理で文字列を足す
            tmpEntry.addObject(parsedStrArr.reduce(String()) { $0 + $1 })
            isTitle = false
        }
    }

    //タグ以外のテキストを読み込んだ時（タグとタグ間の文字列）
    func parser(parser: NSXMLParser, foundCharacters string: String?) {
        
        if(isTitle && tmpEntry != nil){
            // タイトル内文字列を追加していく
            parsedStrArr.append(string!)
        }
    }

    func parserDidEndDocument(parser: NSXMLParser){
		// ここで最終処理 entries
    }


```



##参考
[iOS] NSXMLParser で文字列が1つのエレメントで複数に分かれてパースされる
http://www.kuma-de.com/blog/2012-07-20/3782
clickでカスタムの引数型を定義する（例: 文字列をevalしたものをオプションの値にする型の実装）

clickでは、カスタムの引数型を定義して使うことができます。
→ http://click.pocoo.org/6/parameters/#implementing-custom-types

## 方法
click.ParamType を継承したクラスを作り、convert() をオーバーライドします。
convert() が返す値がNoneの場合、default引数が設定されていればその値（をまたこのconvert()を通したもの）がオプションの値となります。

## 例) 文字列をevalしたものをオプションの値にする型
以下の実装例では、文字列以外はevalせずに返し、evalできない文字列は生のまま返しています。
空白を含むならクオートして渡します。シェルに展開されてしまう文字列はエスケープするなり工夫が必要です。

```eval_param_type.py
# -*- encoding: utf-8 -*-
import click

class EvalParamType(click.ParamType):
    def convert(self, value, param, ctx):
        if not isinstance(value, str):
            return value
        try:
            return eval(value)
        except:
            return value  # raw string


@click.command()
@click.option('--p', type=EvalParamType(), default={0:1, 2:3})
## typeキーワードにはクラスのインスタンスを渡します
def main(**kwargs):
    if 'p' in kwargs:
        print 'kwargs:', kwargs
        p = kwargs['p']
        print p.__class__, p


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

試してみます

```
$ python eval_param_type.py 
kwargs: {'p': {0: 1, 2: 3}}
<type 'dict'> {0: 1, 2: 3}

$ python eval_param_type.py --p "Hello"
kwargs: {'p': 'Hello'}
<type 'str'> Hello

$ python eval_param_type.py --p "'Hello, world'"
kwargs: {'p': 'Hello, world'}
<type 'str'> Hello, world

$ python eval_param_type.py --p hello
kwargs: {'p': 'hello'}
<type 'str'> hello

$ python eval_param_type.py --p 3.14
kwargs: {'p': 3.14}
<type 'float'> 3.14

$ python eval_param_type.py --p 5
kwargs: {'p': 5}
<type 'int'> 5

$ python eval_param_type.py --p -3
kwargs: {'p': -3}
<type 'int'> -3

$ python eval_param_type.py --p True
kwargs: {'p': True}
<type 'bool'> True

$ python eval_param_type.py --p 1+2
kwargs: {'p': 3}
<type 'int'> 3

$ python eval_param_type.py --p []
kwargs: {'p': []}
<type 'list'> []

$ python eval_param_type.py --p "()"
kwargs: {'p': ()}
<type 'tuple'> ()

$ python eval_param_type.py --p None
kwargs: {'p': {0: 1, 2: 3}}
<type 'dict'> {0: 1, 2: 3}
// ’None’をevalするとNoneになって、default引数に設定された値を見に行く
```
Groongaの管理ツールをすぐ試すには

# Groongaの管理ツールをすぐ試すには


この記事は、Groonga Advent Calendar 2015の12日目の記事です。

[Groongaの細かいことを知らなくても使えるWebブラウザー上で動く管理ツール]
(http://qiita.com/groonga/items/1a4bf4e69a3bfb8a0663)としてGroonga Adminがあります。

この記事を書いている時点の最新版は0.9.4です。

Groonga Adminをセットアップするには、ソースコードのアーカイブをダウンロードしてから展開し、Groonga AdminのREADME.mdに書いてあるように適宜設定をしてあげればよいです。

https://github.com/groonga/groonga-admin

ちょっとどんなものか自分で試したいが、そのひと手間すら面倒くさい人のためにデモサイトが用意されています。
[Groonga Meatup 2015](http://gihyo.jp/news/report/2015/12/0801)に参加した人ならすでにその存在を知っているかもしれません。

http://packages.groonga.org:10041/

まずは、↑にアクセスしてみましょう。
URLで気づいたかも知れませんが、Groongaのパッケージ配布サイトでデモサイトが稼動しています。

![packages-groonga-org.png](https://qiita-image-store.s3.amazonaws.com/0/13564/bcaba814-aed6-7797-aa10-b6913e899efa.png)

テーブルにはアクセスログが登録されていますね。

![search-table.png](https://qiita-image-store.s3.amazonaws.com/0/13564/4c9202f7-94bb-7eb6-123a-13d745eef9b8.png)

というわけで、Groonga Adminのデモサイトの紹介でした。
明日のGroonga Advent Calenderについては、まだ誰も登録していませんね。。。
きっと誰かが書いてくれるはず。
LeanUX：エンジニアだからこそコードを書かない工夫をしよう

@ippokm ともうします。すごく当たり前のことを書きます。
この記事は[Gaiax Advent Calendar 2015](http://qiita.com/advent-calendar/2015/gaiax)の11日目でもあります。

**LeanUX**っぽい話をします。
LeanUXはLeanStartUpのメソッド（MVPの作成による仮説検証）をDesignThinkingという手法とアジャイル開発という手法によって実現したものです。ただし、**独断と偏見を混ぜながら雑にまとめ**ています。

# コードを書く時間はもったいない
事業を進めていくうえで、開発をする時間はとても貴重な時間であって、エンジニアが最大の価値を発揮する瞬間でもあります。
このコードを書くという行動をするために、エンジニアという職業があるといっても過言ではありません。
コードを書き、動作するシステムを作って、事業を推進していくということこそがエンジニアの知的生産性なのです。

しかし、これには重大な前提があるということを、考えたことはあるでしょうか。

## 重大な前提

**エンジニアの価値が発揮されるのは**、書いたコードが、
事業の中で**適切にユーザーに価値を届けられた時だけ**だ、ということです。

* 仮に、寝る間を惜しんで作った機能が、ユーザーに気付かれもしなかったら…
* 仮に、頑張って実装した機能が、ユーザーにとって全く必要のないものだったら…

意味がなくなってしまいますよね。
今までの俺達の努力は何だったのか。。。

こういうことは、特に新規事業に関わるエンジニアであれば、誰でも一度は経験したことがあるのでは無いでしょうか。

# 「結果：アウトプット」ではなく「成果：アウトカム」

LeanUXでは、プロジェクトの進捗を、

* **結果：アウトプット**「正確に動く機能やアプリケーションを作りきった」

ではなく、

* **成果：アウトカム**「ユーザーの行動が変わった」「ビジネスゴールに近づいた」

で測定すべきだと考えます。

当前ですよね。

しかし、私たちはこの重大な前提をしばしば忘れがちです。
では、どうすればよいか。

# ユーザー視点に立とう！

そこに一番近づく方法はユーザーの視点に立つこと。
しかし、開発者自身がユーザーと同じ視点で、自分たちが作った製品を客観的評価し続けることができるのでしょうか。

答えは簡単です。

絶対に不可能なのです。

そこで必要となってくるのがユーザーテストや行動観察といった手法です。

## ユーザーテスト

ユーザーテストでは、自分たちの作った製品を、ターゲットとなるユーザーに実際に使ってもらい、その行動を観察することによって、製品・サービスに含まれる課題を明らかにするというものです。

ユーザーテストでテストできることには、様々な物があります。

- ユーザーのフォーム入力がどのように行われるのか。スムーズにできるのか。
- ボタンの位置が適切であるか。ボタンに気づいているか。
- ユーザーはそのページのどこを見ているのか。どんな順番で見ているのか。
- ユーザーがそのページを開いた瞬間、何を感じたのか。どんな気持ちだったのか。

Google Analyticsでは取得できない様々な課題が、ユーザーテストから明らかになるのです。
そしてその課題は、時として、そのサービスを利用する上での**重大な欠陥**であったりするのです。

* 開発した機能に気づかない
* 機能を追加したことで、途中でページから移動してしまいサービス全体にとっては実は悪影響だった。
* そもそもこのページで何ができるのか、理解されていない

などです。

# ユーザーに最速で価値を届ける

それでは、ユーザーに最速で価値を届けるにはどうすればよいか。
それは、LeanStartUpで言うところの**仮説検証**を高速で回すこと。

仮説を思いついたら、最も高速でその仮説を検証する方法を考え、そのために行動することです。

検証する方法はユーザーテストだけではもちろんありません。
A/Bテスト、インタビュー、ユーザーテスト、登録フォームだけを作る、などの方法があります。

そして、重要な事は、

* 機能を作りきって大きく失敗する

のではなく

* **最小限の労力で仮説を検証**して
* **最大のアウトカムを得る**ことです

ユーザーテストをする際には
機能を全て作りる必要はありません。
プロトタイプで十分なのです。

例えば

* ペーパープロトタイプ
* ワイヤーフレーム
* ページデザインのイラスト
* クリックできるワイヤーフレーム
* 静的なHTMLページ
* 実際には動かない偽のボタンを設置する

こういったものでも、ユーザーに実際に製品の一部として使ってもらうことはできます。
そして、自分が検証したいものに合わせて、これらの手法を利用して、仮説を紐解いていくのです。

# 「それはデザイナーの仕事」ではなく「エンジニアこそやるべきこと」

そう、これは UXデザインの領域ですよね。
しかし、サービスの価値を高めるためには、必ずエンジニアの力が必要なのです。

高速でテストを回していくには、高速でプロトタイプを作成する必要があります。
チーム全員がテストをしていれば、「構成書」などの書類を作らずとも、全員の合意が取れるようになります。
自分たちが実装すべき機能、追加すべき要素をチーム全員で明らかにしていくので、スムーズにプロジェクトをすすめることができます。

プロトタイピングをするときに静的ページ作ったり、A/Bテストをできるようにしたり、そもそも仮説検証をするにあたっての仮説や検証方法を定義するという論理的な行動などは、エンジニアが最も得意とする領域です。

事業の核を作り、推進していくフェーズにおいて、こうしたエンジニアのコードを書く以外の働きは、今後必要不可欠になっていくでしょう。

# コードを書かずにプロトタイプを作ろう！

プロトタイピングはチーム全員が取り組むべきものです。
アイデアにデザイナーもエンジニアもありません。
最終的には、エンジニアがコードを書き、デザイナーが綺麗なデザインを上げ、製品が作られていきます。

しかし、仮説を検証するプロトタイプは、綺麗である必要も、ちゃんと動く必要もないのです。
僕達が作ろうとしているサービスや機能が、本当に必要とされているものなのか、ということを確かめるだけなのですから。

# Gaiax / Q-LINKチームでの取り組み

LeanStartUpで新規事業の作り方は劇的に変化した、と言われています。
もはや、なにが当たるのかわからない時代。成功する方法を模索するには、このような手法が不可欠だといわれています。

私の所属しているQ-LINKチームでも、UXデザインの手法を取り入れたところ、課題が次々と湧き出てきました。目からうろこ状態です。
事業としての仮説検証も大きくスピードアップしてきました。そしてこれからもどんどん加速していきます。

製品の**UXをチーム全員で考え**、UXを大きくするために全ての行動をとる。
そして、**Leanの手法を用いて早く失敗に気づくこと**。
さらに、**いち早く次のアクションにつなげていくことが大切**なのです。
JavaでProperty-Based testing その１ [JPopulator + Junit]

テストツールAdventCalendar 2015 11日目の記事です。
1日遅れてしまってすいません。

#導入#
先日、ランダムデータを作ってテストしたいケースがあり、ランダムデータ生成やProperty-based testingのライブラリを探しました。
そこで見つけたjPopulatorが簡単に使えて便利そうだったので紹介しようと思います。

#使い方#
まず、もっともシンプルな使い方です。

```
Populator generator = new PopulatorBuilder().build();
generator.populateBean(Person.class);
```

populateBeanメソッドの引数に指定したクラスのデータが自動的に生成できます。
他のフレームワークに依存しておらず、たったこれだけの記述でランダムデータを生成できます。
また、フィールドにクラスがある場合も自動的にそのクラス内のフィールドもランダムデータで埋めてくれます。

普段テストするとき、本当はできるだけ現実で使われるデータに近いデータを用意したいのに、必要最低限で済ますことが多いかと思います。
簡単に記述できるるので、テストの視認性を下げずに、重要度が低いと考えているフィールドにもとりあえず値を詰めておくということができます。

##生成データのコントロール##
生成データを調整することも簡単にできます。
###フィールドを除外して生成###
`generator.populateBean(Person.class, "age");`

###指定数のインスタンスをまとめて作成###
`generator.populateBeans(Person.class, 100);`

###ランダムな数のインスタンスをまとめて作成###
`generator.populateBeans(Person.class);`


##生成されるデータのバリエーションを変える##
Randomizerインターフェースを実装することで生成データの内容も自由にカスタマイズできます。

```
public class AgeRandomizer implements Randomizer<Integer> {
    @Override
    public Integer getRandomValue() {
        return ((Double) (Math.random() * 50)).intValue();
    }
}
```

RandomizerはSAM Typeなのでもちろんラムダ式で書くことができます。

```
Populator generator = new PopulatorBuilder()
                .registerRandomizer(Person.class, Integer.class, "age", () -> ((Double) (Math.random() * 50)).intValue())
                .build();
}
```

既成のRandomizerもいくつか用意されているので便利に使えると思います。

既成のRandomizer
<img width="264" alt="スクリーンショット 2015-12-12 13.56.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/30244/a0380cbf-275d-62e4-9927-b35da26909f2.png">

Randomizerの使用例

```
Populator generator = new PopulatorBuilder()
                .registerRandomizer(Person.class, String.class, "name", new FirstNameRandomizer())
                .build();
```

最後にテストへの応用例としてJUnitのDataPointsを利用してテスト用のランダムデータを生成するコードを紹介します。

```
import org.junit.contrib.theories.DataPoints;
import org.junit.contrib.theories.Theories;
import org.junit.contrib.theories.Theory;
import org.junit.runner.RunWith;

import io.github.benas.jpopulator.api.Populator;
import io.github.benas.jpopulator.impl.PopulatorBuilder;
import io.github.benas.jpopulator.randomizers.CityRandomizer;
import io.github.benas.jpopulator.randomizers.FirstNameRandomizer;

@RunWith(Theories.class)
public class UseJpopulator {
    @DataPoints
    public static Person[] getParameters() {
        Populator generator =
            new PopulatorBuilder()
                .registerRandomizer(Person.class, String.class, "name", new FirstNameRandomizer())
                .registerRandomizer(Person.class, Integer.class, "age", () -> ((Double) (Math.random() * 50)).intValue())
                .registerRandomizer(Address.class, String.class, "city", new CityRandomizer())
                .build();
        return generator.populateBeans(Person.class, 100).toArray(new Person[0]);
    }
    @Theory
    public void XXX(Person p) {
        // TODO some tests
    }
}
```
生成結果
<img width="650" alt="スクリーンショット 2015-12-12 14.06.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/30244/c06bf40f-f608-e750-805f-2d3f790185ed.png">

今日は以上です。

次はJunit-Quickcheckについて書くつもりです。
line monitor > 付随Tool > USBメモリコピー(v0.1, v0.2)

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

```txt:動作確認
Raspberry Pi2 + raspbian
```

シリアルラインモニターのログファイルはSFTPで接続すれば取得できる。

では、ネットワークがつかえない時はどうか。

pythonでUSBフォルダコピー機能を実装した。

## プログラム
[v0.1 @ github](https://github.com/yasokada/python-151212-logFolderCopier/releases/tag/v0.1)

```logFolderCopier.py
#!/usr/bin/env python

'''
v0.1  2015 Dec. 12
  - add USB memory insertion recognition
  - add folder copy feature
  - add main 
'''

'''
Usage:
# sudo python logFolderCopier.py [LogFolderPath]
e.g.
# sudo python logFolderCopier.py /home/pi/linemonitor/Log/
'''


import shutil
import os.path
import sys
import time

param = sys.argv

srcpath=param[1] # xxx/Log/
dstpath="/media/pi/COPYTO"

chk1=False
chk2=False
chk3=False
while True:
	chk1 = chk2
	chk2 = chk3
	chk3 = os.path.isdir(dstpath)
	if os.path.isdir(srcpath) and os.path.isdir(dstpath):
		if chk1==False and chk2==False and chk3==True:
			print "inserted"
			shutil.copytree(srcpath, dstpath + "/Log/")
			print "Copied"
	time.sleep(0.5)
```

## やっていること

- 500m秒ごとにコピー先フォルダの有無をチェック。
- フォルダ有無が(False -> False -> True)となった時に、USBメモリが差し込まれたと認識する。SWを押下した時のチェックと同じ。
- ログフォルダをコピー (shutil.copytree())

参考
http://www.gesource.jp/programming/python/code/0008.html
http://www.gesource.jp/programming/python/code/0015.html


## 使い方

chmod +xで実行権限をつけておく。

/etc/rc.localなどで以下のように実行しておく。(Logフォルダの場所は環境依存)

```
nohup ./logFolderCopier /home/pi/linemonitor/Log/ &
```

ボリューム名 (COPYTO : 全部大文字)としたUSBメモリを挿して2秒程度待てばログフォルダがコピーされる。


## 実装 v0.2 > umount + 上書き対応
(追記 2019/02/22)


2015年12月13日に下記を追加した。

- 対象メディアのumount
- 上書きを考慮したコピー処理


[v0.2 @ GitHub](https://github.com/yasokada/python-151212-logFolderCopier/blob/master/logFolderCopier.py)
VisualStudio Codeの拡張機能を作って公開してみた

# 作ったもの
[teratail【テラテイル】](https://teratail.com/)のクライアント

## VisualStudio Code上に質問一覧を表示
teratail Client for Visual Studio Code
[cssho/vscode-teratail](https://github.com/cssho/vscode-teratail)
[teratail Client - Visual Studio Marketplace](https://marketplace.visualstudio.com/items/cssho.vscode-teratail)

![2015-12-12.png](https://qiita-image-store.s3.amazonaws.com/0/54591/49bce391-7635-22e1-6232-982ad317eb0c.png)

## node.js用クライアント
teratail API client library for node.js
[cssho/node-teratail](https://github.com/cssho/node-teratail)
[teratail - npm](https://www.npmjs.com/package/teratail)

## 参考にしたもの

### 実装

実装は既存のtwitterのクライアントを参考にしてみた。

#### VisualStudio Codeの拡張機能
[austin-----/vscode-twitter](https://github.com/austin-----/vscode-twitter)
[Visual Studio Codeの拡張機能をTypeScriptで作る方法 | TOACH](http://toach.click/2015/12/07/vsc-ext/)

#### node.js用クライアント
[desmondmorris/node-twitter](https://github.com/desmondmorris/node-twitter)

### マーケットプレイスでの公開
[Visual Studio Codeの拡張機能を公開する方法 | TOACH](http://toach.click/2015/12/11/vscode-blade-runner/)

## 今後の課題
- テストコードの充実
- 質問の個別表示
- 質問一覧のendpoint以外への対応

## まとめ
実装はかなり既存のコードを~~パクっｔ~~参考にしていて理解しきれていないとこがある。（特にVS Codeの拡張周り）
参考になるコードが合ったおかげで概念はなんとなく理解でき、npmやマーケットプレイスへの公開はすんなりできた。
ちなみに思いついたのは昨日で実質10時間位で初めてのnpm&VisualStudio Codeの拡張機能デビューを果たせた。
Kintone JavaScript による自動採番

#JavaScript による自動採番
自動採番の実装例の一つです。
番号管理アプリで、関連するアプリレコードの採番処理を一括管理します。

- 複数アプリで、関連レコードを同時に追加する場合に有効です。
- レコード番号に影響されませんので、アプリのコピー・データの流用が行いやすい

番号管理アプリに、番号先頭文字、桁数、番号などを持ちます。
![自動採番1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/4e8e8d4e-3e0b-8762-879c-b65394774c33.png)
R MarkdownでPythonなど他言語を使用できる…？

## この記事の目的
私が大好きなRMarkdownについて、Tipsを集中的に連載しようという思いつきの企画です。あと自分の中で進めている別企画のメモという位置づけでもあります。なので**大した中身はありません**。

### R Markdownとは
Markdown記法をベースに、チャンクという形でRのコードを記述して評価・出力することができるものです。RStudioのクイックリファレンスでは以下のように説明してあります:

> R Markdown is an easy-to-write plain text format for creating dynamic documents and reports. 

## engine='python'...?

[R Markdown reference(pdf)](http://www.rstudio.com/wp-content/uploads/2015/03/rmarkdown-reference.pdf)の2ページ目にはrチャンクオプション一覧があって非常にためになるのですが、その中に`engine`というのがあります。その説明は以下のようになってます:

> Knitr will evaluate the chunk in the named language, e.g. `engine = 'python'`. Run `names(knitr::knit_engines$get())` to see supported languages.

これはまさか…というわけで、Rmdファイルに以下のようなチャンクを作成してみて実行します:

~~~~~
```{r engine="python"}
f = lambda x, y: x + y 
print f(1, 2)
```


すると出力はこうなります：

```
3
```

私の使用するマシンではちゃんと実行されました。なお同一のコードをRのコンソールで実行してもエラーが出ます…。おそらく環境設定などでPathが通っていれば、ある程度評価してくれるのではないかと思います[^1]。他にもいろんな言語に対応しているようですので、どんな言語に対応してるかは以下のコードをConsoleで実行して確認してみてください[^2]:

[^2]: もちろんその言語の環境がインストールされてないと走りません。

```
names(knitr::knit_engines$get())
```

[^1]: Pythonまったくわからないのでサンプルコードすらまともに書けません。

この機能についての解説は、以下をご覧ください:

- [Language engines: Use other languages in knitr | knitr](http://yihui.name/knitr/demo/engines/)

私としては使う機会はあまりないのですが、これまで全くと言っていいほど言及されてこなかったことから、あまり使えないのかもしれません。ただ需要はあると思ったのでご紹介しました。

Enjoy!
[nrf52]NFCサンプルのソースを見る

nRF52832(Preview版)が載った、nRF52 Preview-DKというボードを持っている。
PCA10036とも言う。
今週、東京や大阪で行われた説明会では、PCA10040というボードが配布されたようだ。

PCA10036はEngineering Aのチップが、PCA10040はEngineering Bのチップが載っているとのこと([nrf52 + S212 softdeviceの回答](https://devzone.nordicsemi.com/question/54791/nrf52-s212-softdevice/))。
S132 v2.0.0-7.alphaやnRF52 SDK v0.9.2も「Engineering Bは～」と書かれているので、もうPreview DKの時代は終わったのかもしれない(まあ、Previewだから仕方ないが)。
nRF52832の[Errata](http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.nrf52.v1.0.0%2Ferrata.html&cp=1_1_1)を読めば、細かく違いがわかるかもしれないが、面倒なのでやってない。


下記のソースはPreview-DKでも動いたので、ソースを少し読んでおこう。
なんでNFCかというと、私がそういう人だからだ。
[04a_nfc_url](https://github.com/NordicSemiconductor/nrf52-gtt-demos/tree/master/04a_nfc_url)


#構成

ソースの構成は、こうなっている。

|source tree|
|:--|
|![tree.png](https://qiita-image-store.s3.amazonaws.com/0/18861/dcbf0896-68d7-a8f1-3d5d-db8cf13ee013.png)|

中の方まで読んでいくとわかるが、SoftDeviceは関与していない。
特にNFC Pairingと連動している感じもない。
BLEとは異なるユニットなのだろう。

「[nRF52 Global Tech Tour 2015 に参加してきました](http://reinforce-lab.github.io/blog/2015/12/11/nrf52-techtour-report/)」を読むと、WRITEを受け付けないようだ。
このツアーのまとめサイトを読んだが(リンク先を探せなかった)、NFCによるファーム更新も遅いけどできなくはない、ということのようなので、WRITEのデータは読めるけどRAMには反映させないだけかもしれない。
Type 2 Tagのようなので、MIFARE Ultralightとかの資料があればそれを読むのが早いかもしれない。

#使い方
1. nfcSetup()
2. nfcSetPayload()
3. nfcStartEmulation()

これだけ。
nfc_lib.hに宣言があり、nfc_lib.libがいるので、この中身はライブラリ提供のようだ。

|nfc_lib.h|
|:--|
|![nfc_lib_h.png](https://qiita-image-store.s3.amazonaws.com/0/18861/ec8756e3-4b9b-0bc7-d658-0b372b892a06.png)|

ただ、hal_nfc.cをコンパイルしているので、最終的にはここからハードをたたいているんじゃないだろうか。

サンプルでは、nfc_uri_msg_create()を使ってNDEF URIのデータを作っている。
これは、単にNDEFフォーマットのデータを作っているだけなので、データは自作しても良いだろう。
そうすれば、[AAR](http://developer.android.com/intl/ja/guide/topics/connectivity/nfc/nfc.html#aar)みたいなのを作って、Androidアプリの起動なんかもさせられるだろう(フォーマットは探せば出てくるだろう)。

#まとめ
* nRF52832では、NFCのタグになれる
* READだけできる(らしい)

#おまけ
そうそう、搬送波の検知もできるようだ。
なので「スマホが近づいた」みたいな動作をすることもできるだろう(スマホがNFCのInitiatorになってるなら)。
たぶん、搬送波検知なので、NimocaやSuicaの改札に近づいても反応するだろう。
13.56MHzのが来てるなー、という程度だから、相手がどういう人かはわからなくても検知するだろう。
Herokuで単純なrubyスクリプトを定期的に実行する



ActiveJobとか使わずに、単純なrubyスクリプトをHerokuで実行したい

# 前提条件

heroku toolbelt が導入されていること

# 準備

シンプルなrubyスクリプトを用意する

```main.rb
p "hello"
```

# git に commitする

```shell-session
git init
git add main.rb
git ci -m "First commit"
```

# buildpacksを指定しながらherokuを開始

## buildpacks って何?

https://devcenter.heroku.com/articles/buildpacks

- 言語毎に実行環境が格納されたパッケージがある
- Herokuのインスタンスにどのパッケージを使うか指定してあげる必要がある
    - rubyの場合はこれ -> https://github.com/heroku/heroku-buildpack-ruby

## buildpack-ruby を導入

```shell-session
heroku create --buildpack https://github.com/heroku/heroku-buildpack-ruby.git
```

# Gemfileを用意

heroku-buildpack-ruby は Gemfile を読んで必要なgemをインストールするので、存在しないとデプロイ時にエラーを吐く

参考 → https://devcenter.heroku.com/articles/buildpacks#detection-failure


```shell-session
bundle init
```

```Gemfile
# A sample Gemfile
source "https://rubygems.org"

ruby "2.2.3"
```

```shell-session
bundle install
git add Gemfile Gemfile.lock
git ci -m "Add Gemfile"
```

# コードをherokuにデプロイ

```shell-session
git push heroku master
```

# herokuでコードを実行

```shell-session
$ heroku run "ruby main.rb"
Running ruby main.rb on fathomless-temple-5052... up, run.9858
"hello"
```

実行できた!!

# One-off Dynosについて

今回の `heroku run` のような一時的なコマンドや、管理者タスク等を実行する時に立ち上がるHerokuのインスタンス

https://devcenter.heroku.com/articles/one-off-dynos


## お値段や制限は?

- 起動後24Hで勝手に終了
    - https://devcenter.heroku.com/articles/one-off-dynos#one-off-dyno-timeout
- free や hobby の場合、3個まで平行起動可能
    - https://devcenter.heroku.com/articles/dyno-types#concurrent-one-off-dyno-limits
- お値段は、起動から終了までの時間に応じて、インスタンスタイプ毎のお値段が掛かる様子
    - なのでfreeならば無料のはず
        - https://devcenter.heroku.com/articles/usage-and-billing
    - free や hobby の場合、インスタンスタイプは選べないらしいので、やっぱり無料のはず
        - https://devcenter.heroku.com/articles/one-off-dynos#one-off-dyno-type

# 定期的に実行する

[Heroku Scheduler](https://devcenter.heroku.com/articles/scheduler)を使う

- Heroku Scheduler は、定期的に処理を実行してくれるcronみたいなことをしてくれるアドオン(freeなら無料)


## `p "hello"` だと、出力が確認できないので、slack に出力するように実装を変える

```main.rb
require "rubygems"
require "slack-notifier"

Slack::Notifier.new(ENV['WEBHOOK_URL']).ping("Hello World")
```

```Gemfile
# A sample Gemfile
source "https://rubygems.org"

ruby "2.2.3"

gem "slack-notifier"
```

`bundle install` と、`git push heroku master` をすませておくこと 

webhook url はリポジトリに入れたくないので、環境変数に持たせる

## Heroku側に環境変数を渡す

```
heroku config:set WEBHOOK_URL="https://hooks.slack.com/services/********"
```

# Heroku Schedulerの設定

## アドオンの追加

```
heroku addons:create scheduler:standard
```

## 管理画面を開く

```
heroku addons:open scheduler
```

![Heroku_Scheduler_-_Vimperator.png](https://qiita-image-store.s3.amazonaws.com/0/5329/9eb632f0-16b0-b463-13f4-bf10030d5df6.png "Heroku_Scheduler_-_Vimperator.png")

## 管理画面から、10分に1回 `ruby main.rb` を実行するように設定

![Heroku_Scheduler_-_Vimperator.png](https://qiita-image-store.s3.amazonaws.com/0/5329/7639be64-e0df-c3da-695e-509f3b3da7b9.png "Heroku_Scheduler_-_Vimperator.png")

しばらく待機...

![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/5329/46e80d16-91d1-31ba-b2c3-792e4513cf2f.png "Slack.png")

出力された!!

今日はここまで
Atlas-SoC GHRDの設定

#GUIでのコンパイル
[前回](http://qiita.com/new3bon/items/1d7349f9bb0c2d6228a1)、CUIでのコンパイルができたのでGUIでのコンパイルをしてみることにする。
Quartusを起動して、Open Projectから
~/atlas/atlas-soc-ghrd/ATLAS_SOC_GHRD/ATLAS_SOC_GHRD.qpf
を開く。
そのまま、Start Compilationを実行。コンパイルが通った。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/99409/2426589c-8aad-1405-d4cb-b45b963155de.png)

#CPU設定を見てみる
Atlas-SoC基板に乗ってるDDRとかは設定されているはずなので、この基板で新しくプロジェクトを作るときのためにCPU設定を記録しておく。
Project NavigatorをIP Componentにして、soc_systemをダブリクリックしてqsysを起動する。
こんな接続になっていた。結構いっぱいモジュールが繋がっている。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/99409/4f334bc5-2730-409f-3736-1d4b98f1efa4.png)
hps_0の設定は以下のようになってた。けっこう設定が多い。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/99409/abfcf2c4-7cc4-ca40-8e31-a88c11d221d5.png)

![4_1.png](https://qiita-image-store.s3.amazonaws.com/0/99409/86a56d82-f8c7-9144-00e7-54810274824d.png)

![4_2.png](https://qiita-image-store.s3.amazonaws.com/0/99409/9eac7bdd-ad3d-faee-69f5-d86353986461.png)

![5.png](https://qiita-image-store.s3.amazonaws.com/0/99409/d830f647-2701-9446-db5b-e48aeab0ff64.png)

![6.png](https://qiita-image-store.s3.amazonaws.com/0/99409/43d610c6-d9f5-685f-1288-a63f62687be8.png)

![7.png](https://qiita-image-store.s3.amazonaws.com/0/99409/7c8f74ab-6a86-7451-c2f4-2d1560ea65af.png)

![8.png](https://qiita-image-store.s3.amazonaws.com/0/99409/9d70a182-9ef8-740a-1398-885881966251.png)

![9.png](https://qiita-image-store.s3.amazonaws.com/0/99409/d7b4ff18-499b-954a-200d-77e2c2c42e9a.png)

![10.png](https://qiita-image-store.s3.amazonaws.com/0/99409/1b760c54-7c86-1fcf-8304-c3c1e39c29d3.png)
RPi / CentOS6.5 > USBメモリのマウントポイント > RPi: /media/pi/ | CentOS:/media/

```txt:動作確認
CentOS 6.5
Rasbeprry Pi2 + raspbian
```

USBメモリを挿した時のマウントポイントを調べた。

- CentOS : /media/ (例: /media/MyUSB)
- RPi2 : /media/pi/ (例: /media/pi/MyUSB)
Starling のテクスチャの破棄について

# 破棄漏れ
破棄漏れ。それは、その言葉が発せられた途端に実装者を凍りつかせる呪いの言葉。

Starling に限らず、破棄漏れというのは恐ろしいものです。場合によってはあっという間にリソース不足エラーが起きます。どんなに気をつけていても、気付けば、Adobe Scout の使用 GPU メモリの数値が減るどころかどんどん増えていくのを目の当たりにすることに・・・。

大体そういう時は、結構組んでしまっていて、どこが破棄されてないかもう判らない状態に・・・。しかもこれが大き目の開発で、且つ、複数人での開発だったときには・・・。

こうなるともう大量のクラスを細かく見て、細々と破棄処理を実装していくしかないという、雲をつかむような作業行うしかないという地獄絵図となります。

経験ある方は、この時点で血の気の引くような思いをしてるのではないでしょうか。（経験者談

# 管理クラス
どうするかっていう話ですが、まぁこういうのはもう管理用のクラス作って、そこからしか生成しないことによって生成を管理するしかないです。どっかのタイミングでまとめて破棄とか。何かの条件にあったものを破棄とか。

# そんなこといったって
最初からそういう風に気をつけていれば良いですが、ある程度作った後で「やっぱ管理が必要」とかになると、そこから全部のテクスチャ生成を管理クラスからに移行するっていうのは大変ですよね。

あと、コンテンツの都合上、細々ときちんと破棄をしなければならない場合とか、結局自身で気をつけて破棄処理をしていないと・・・となると、管理ミスが発生したりするわけですね。しょうがない、人間ですもの。

# 最終手段
Starling の中に手を入れちゃいましょう。テクスチャの生成を全て Starling 経由で行っている限りは、Starling で管理できます。

Starling でのテクスチャ生成は、全て Texture クラスの静的メソッドで生成されます。ここで「生成ログ」を仕込んでおくことによって、ある程度「テクスチャがどこで生成されたか」を知ることができるので、もし破棄漏れが起こったとしてもそのログを参照して破棄漏れの箇所を見つけることができます。

（むしろ、この機能がなんでデフォルトで入ってないんだという気がしなくも無いですが）

# 肝心の手法は？
業務で作ったものなんで、勝手にクラスファイルを載せる訳には行かないんですよねー・・・。というわけで、「ある程度」手法をお伝えするので各自頑張って作ってみてください。

注意
- この手法は Starling 1.7 での手法です。その他のバージョンは各自で調査した上で実装してください。
- あと、動作を保障するものではないので、自己責任で。
- 間違って本家にコミットしたりしないように（出来るか判らないけど

# 必要なクラス
自分の場合は以下のような形で作りました。

- ログデータ管理クラス（以下のメソッドは静的です）
 - setLog(createdTexture:Texture):void
 - unsetLog(disposedTexture:Texture):void
 - 取得なり出力したりするメソッド
- ログデータクラス
 - texture:Texture
 - stackTrace:String

# 実装
Texture クラスの以下の生成部分で、「ログデータ管理クラス」の setLog() を叩きます。管理用のキーとして、生成されたテクスチャも this で渡してやりましょう。

- fromData()
- fromEmbeddedAsset()
- fromBitmapData()
- fromAtfData()
- fromVideoAttachment()
- fromColor()
- empty()

次に setLog() でログデータを生成し、保持します。

- setLog() の中で new Error().getStackTrace() を実行すると、この段階でのスタックトレースが取れます。デバッグでのエラーでよく見る「どこでエラーが出てるよ」っていうのがわかるやつもこれですね。つまり、どこからこのメソッドが呼ばれてるかが判るということです。ということは、どこで生成してるかが判るということですね。
 - あとは、このスタックトレースをデータとして保持し、「ログデータ管理クラス」で管理します。
 - 更にテクスチャの参照を保持しておくと、後で「破棄されていないテクスチャ」そのものを参照することができますので、破棄漏れをテクスチャ自体を参照することが出来ます。ビジュアル的に確認したい場合に有効です。

Texture クラスの以下の破棄部分で、「ログデータ管理クラス」の unsetLog() を叩きます。どのテクスチャを破棄しているのかを渡さないといけないので、これも this を渡しましょう。

- dispose()

unsetLog() でログデータを削除します。ちゃんと dispose を呼ばれていれば、ログデータも削除されるはずです。

あとは、それらを取得するか出力するメソッドを作って現在生成されているログを参照するだけです。

# これで OK（多分
後はただただ、破棄漏れの場所をログで見つけ、それを破棄するようにして、Adobe Scout でちゃんと破棄出来てるか確認して安心しましょう。雲をつかむような破棄チェック地獄とはこれでおさらばです。

# 希望
本家が機能実装してくれないかな・・・。
Xvfb を利用したヘッドレスブラウザテスト

> This is a Japanese translation of [Headless Browser Testing With Xvfb](http://tobyho.com/2015/01/09/headless-browser-testing-xvfb/) by [Toby Ho](http://tobyho.com/).

> [Toby Ho](http://tobyho.com/) は JavaScript のテストフレームワーク [testem](https://github.com/testem/testem) の作者。testem は Google が開発する [Karma](https://github.com/karma-runner/karma) フレームワークと並んで、実ブラウザ上でテストケースを走らせられるツールとして人気があります。

by [Toby Ho](https://github.com/airportyh), 2015/01/09

いまどき "ヘッドレスブラウザ" と言うと、PhantomJS がすぐに思い浮かぶかもしれませんが、実は他にも選択肢があります。この記事では Linux で使える Firefox, Chrome などの実ブラウザのヘッドレスな (GUI 無しでの) 実行の仕方の紹介をします。(そのために Xvfb というツールを使います)

# PhantomJS の何が問題か？

PhantomJS は素晴らしいツールです。世界中の企業 / エンジニアに使われています。特に、JavaScript のテストを走らせるためによく採用されています。しかし、PhantomJS に欠点がないわけではありません。PhantomJS は Chrome や Safari と同じ WebKit ベースで作られているものの、微妙に違う点もいくつか存在します。そのような違いは、テスト失敗の誤検知 (本当は成功しているが PhantomJS 固有の問題でテストが失敗すること) や、テストケースのパフォーマンス劣化を招いたりします。実際のエンドユーザーがいないという意味で、PhantomJS は実際のブラウザではないため、PhantomJS 固有の問題を解決することは、実際のプロダクトを改善することとは別な、テストケースを維持するためのコストとなります。ただでさえ、きちんとテストを書き続けることは難しいことですが、そのメンテナンスがテスト失敗の誤検知などでさらに面倒になってしまうと、開発者のモチベーションに悪影響です。

# 実ブラウザをヘッドレスに実行する

以上のような理由から、私はある時から JavaScript のテストを走らせるために、実ブラウザだけを使うことに決めました。このことは、開発中にテストを走らせるための別ブラウザ窓をいつも開いている (実際はバックグラウンドに隠しているかもしれませんが) ということを意味します。私にとってはこれで OK  です。しかし、多くの場合 CI サーバは Linux です。そしてディスプレイを持っていません。そこで Xvfb が出てきます。

Xvfb というのは X (Linux 用の GUIシステム) のための仮想ディスプレイフレームバッファというもので、それは、GUI アプリが書き込むための偽のディスプレイバッファを提供します。つまりは、すべてのプログラムをヘッドレス (GUI 無し) に実行することができます。

## Xvfb のインストール

Debian か Ubuntu 上で apt-get を使っている場合はインストールはシンプルです

    apt-get install xvfb

Redhat 系 OS で yum を使う場合

    yum install xorg-X11-server-Xvfb

## ブラウザのインストール

Ubuntu 上で Chrome と Firefox をインストールするのは簡単でした。

- Chrome に関しては単純にダウンロードページに行って `.deb` ファイルを落として、`dpkg -i <the path to the .deb file>` コマンドを実行してください。
- Firefox については、`api-get install firefox` でインストールできます。

CentOS の場合、いろいろ問題が見つかりました。

- まずそもそも、Chrome は CentOS ではサポートされていません。Chromium をビルドするためのシンプルな方法も見つけることができなかったため、私は諦めました。
- Firefox についても、少し問題がありました。まず `yum install firefox` をしたところエラーで起動できず、gdk-pixbuf2 を `yum install gdk-pixbuf2` でインストールする必要がありました。

その他の Linux に関しては、Chrome の Download ページと Firefox on Linux ページを参照してください。

## Xvfb の使い方

Xvfb の使い方は:

    xvfb-run <コマンド>

以上だけです！例えば、次のコマンドで Firefox を Xvfb で使えます:

    xvfb-run firefox http://google.com

上のコマンドは、単純に Firefox をバックグラウンドで起動します。よく分からない警告がコンソール上に流れるかもしれませんが、それ以外は特に何も見えないはずです。

Testem を使っているなら:

    xvfb-run testem -l firefox

で、Firefox 上で test が走り、

    xvfb-run testem -l chrome

で、Chrome のテストが走ります、ヘッドレスに！

もちろん、これは Testem に限ったことではありません。Karma、Grunt、Gulp や実ブラウザを起動する他のどんなテストランナーでも xvfb-run で実行することができ、単純にうまくいきます。

# 結論

もし開発に Linux を使っている場合、これは素敵なソリューションです。これを使って、余計なウインドウを開くことなくテストが実行できます。セットアップも簡単で、使うのも簡単です。しかし、開発に Linux を使っていないにしても、CI では大抵 Linux を使っているでしょうし、その場合、今の所 PhantomJS を使ってテストを走らせているかもしれません。もしそれがうまくいっているなら、それはそれで素晴らしいですが、もし PhantomJS が余計な開発のオーバヘッドを生みだしつつあるようなら、このセットアップにスイッチすることを検討してみてはどうでしょうか。
ゆるっとローカル環境を作る

ちゃっちゃとプレビュー用途やWordpressを動かすくらいならSCOTCH BOXが一番楽なんじゃないかなと。

https://box.scotch.io/

## SCOTCH BOXとはなんぞや
立ち上げるだけでざざっとLAMP環境をセットアップしてくれるVagrantfileの認識。

## usage
当然ながら[Vagrant](https://www.vagrantup.com/)と[VirtualBox](https://www.virtualbox.org/)は入れておく。
以前はOSXではVM5xは動かないとかあったけど、今は多分行けるんじゃないかと。

本家からcloneして使っても良いけど、VMのメモリ割当を1024MBにしたいので、それを記述した下記をVagrantfileとして保存。

### Vagrantfile

```rb
Vagrant.configure("2") do |config|

  config.vm.box = "scotch/box"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.hostname = "scotchbox"
  config.vm.synced_folder ".", "/var/www", :mount_options => ["dmode=777", "fmode=666"]
  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.memory = "1024"
  end

end
```

### ディレクトリ構成

* Vagrantfile
* public/*  - ルートディレクトリ  

#### サーバー起動
コンソールで下記を叩くだけ

```shell-session

vagrant up
```

初回だけインストール、立ち上げが走った後、
[192.168.33.10](192.168.33.10)でアクセスできる。

## ルートディレクトリ変更
デフォルトのルートディレクトリがpublicなんで、それをpublic_htmlやらhtdocsやら好きに変えたい場合はSSHで設定ファイルを触る必要がある。

### SSHログイン

```shell-session

ssh vagrant@192.168.33.10
```

パスワードを聞かれるのでvagrantと入れてやる

```shell-session

vagrant@192.168.33.10's password: vagrant
```

なんかアスキーアートが出たら接続成功。

### 設定ファイル編集
vimで編集

```shell-session

sudo vim /etc/apache2/sites-available/000-default.conf
```

途中に下記の記述があるのでpublicを好きなのに変更して保存

```shell-session

DocumentRoot /var/www/public
```

SSHからログアウト

```shell-session

exit
```
### vagrant 再起動
コンソールに戻って

```shell-session

vagrant reload
```
これでディレクトリが変わっているはず。

## データベース
[phpMyAdmin本体](https://www.phpmyadmin.net/)をDLして、ルートディレクトリ以下に適当に設置しURLにアクセスする。

こんな感じ。
[192.168.33.10/phpMyAdmin/](192.168.33.10/phpMyAdmin/)

ID/PW共にrootでログイン出来る。
scotchboxという名前のデータベースがすでにあるので、これを使う。

たとえばwordpressインストールなら下記のような感じ。

|データベース名|scotchbox|
|:-----------:|:------------:|
|ユーザー名|root|
|パスワード|root|
|ホスト名|localhost|

## その他
### アクセスするipアドレスを変更
Vagrantfile 4行目を変更

```rb
config.vm.network "private_network", ip: "192.168.33.10"
```

### アップデート
たまにしてあげよう！

```shell-session
vagrant box update
```

## まとめ
とりあえず[Vagrant](https://www.vagrantup.com/)と[VirtualBox](https://www.virtualbox.org/)だけ入れといて、Vagrantfileがあれば簡単にローカル環境を量産できる。
ec-cube/silex/symfonyのイベント対比表

ec-cube/silex/symfonyのイベントの実行タイミングをまとめてみました。

| ec-cube                                | silex               | symfony                      | 実行順序 | 備考                                                                                   |
|----------------------------------------|---------------------|------------------------------|----------|----------------------------------------------------------------------------------------|
| eccube.event.app.before                | before, early_event | KernelEvents::REQUEST, 512    | 1        | ルーティング解決、セキュリティコンポーネントの実行前。ログインユーザ情報は取得できない |
| eccube.event.controller.[route].before | before              | KernelEvents::REQUEST         | 2        |                                                                                        |
| eccube.event.controller.[route].after  | after               | KernelEvents::RESPONSE       | 3        |                                                                                        |
| eccube.event.app.after                 | after, late_event   | KernelEvents::RESPONSE, -512 | 5        |                                                                                        |
| eccube.event.controller.[route].finish | finish              | KernelEvents::TERMINATE      | 6        |                                                                                        |
| eccube.event.render.[route].before     | -                   | KernelEvents::RESPONSE       | 4        | FilterResponseイベントが引数として受け取ることができる                |

12/22は、 @amidaike さんです！
Nginx・PHP7.0・Ubuntu14.04でphpinfoを表示させる


<h1>概要</h1>
Nginxとphp-fpmの設定にすごくハマったので、今回は備忘録として、Nginx・phpの設定からphpinfo()を表示させるまでの流れを書いていきます。

<h2>1.Nginxの最新版をインストール</h2>
<h3>・PGPキーの追加</h3>
$curl http\://nginx.org/keys/nginx_signing.key | sudo apt-key add -
<h3>・リポジトリを一覧に追加</h3>
$sudo sh -c <font color="red">"echo 'deb http\://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"</font>
$sudo sh -c <font color="red">"echo 'deb-src http\://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"</font>
<h3>・アップデートの後、Nginxのインストール</h3>
\$sudo apt-get update
$sudo apt-get install nginx
<h2>2.PHP7.0のインストール</h2>
今回のPHP7.0はパッケージからインストールしていきます。
<h3>・リポジトリの追加</h3>
\$sudo apt-get install software-properties-common
$sudo add-apt-repository ppa:ondrej/php-7.0 -y
<h3>・アップデートの後、インストール</h3>
\$sudo apt-get update
$sudo apt-get install php

php7.0-fpmもインストールしておきます。
$sudo apt-get install php7.0-fpm

以上でインストールの作業は完了です。
ここからNginx・PHP7.0の設定ファイルをいじっていきます。
<h2>3.Nginx設定ファイルの変更</h2>
/etc/nginx/conf.d/default.confの編集

location / {
        <font color="red">root   /usr/share/nginx/html;</font>↓
        <font color="green">root /var/www;</font>
        <font color="red">index index.html index.htm;</font>↓
        <font color="green">index index.php;</font>
    }
</font>
location ~ \.php$ {
        root           /var/www;
     <font color="red">fastcgi_pass   127.0.0.1:9000;</font>↓今回はTCP/IPではなく、UNIX Socketを使用します。
     <font color="green">fastcgi_pass   unix:run/php/php7.0-fpm.sock;</font>
        fastcgi_index  index.php;
        <font color="red">fastcgi_param  SCRIPT_FILENAME /scripts$fastcgi_script_name;</font>↓
        <font color="green">fastcgi_param  SCRIPT_FILENAME  \$document_root/$fastcgi_script_name; </font>
        include        fastcgi_params;
    }

<h2>4.PHP7.0-FPM設定ファイルの確認</h2>
/etc/php/7.0/fpm/pool.d/www\.confに以下のコードが記述されているか確認して下さい。もしないのであれば、追記しましょう。

<font color="green">listen = /run/php/php7.0-fpm.sock</font>
<h2>5.アクセスの確認</h2>
細かい設定は以上で終わります。
次に/var/wwwのディレクトリにindex.phpを作成します。
/var/www/index.php
\--------------------------
<?php
phpinfo();
\-------------------------

index.phpの作成が終わったら、ブラウザからアクセスしてみましょう。自分のURLにアクセスして、下の画面が表示されていれば完成です。
![スクリーンショット 2015-12-12 12.26.45.png](https://qiita-image-store.s3.amazonaws.com/0/97920/866de47a-3df0-b48f-f370-30a4e57f9fc7.png)
Kintone JavaScript による関連レコードの動的作成

#Kintone 関連レコード
kintone API を利用すると、JavaScript で関連レコードを動的に表示できます。
kintone標準機能では、表示条件の設定に融通が利かないので、作成してみました。
標準の関連レコードと同じようにhtml タグをつけてあげると、違和感なく表示されます。
もちろん、項目の長さや書式も自由に設定出来ます。
少しハードルが高くなりますが、ルックアップも動的に表示したいですね。

![アプリ作成例1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/bc23f869-e3dc-36b2-c8fa-6ccbe976f52b.png)
MacにWindows10 Enterpriseの評価版をインストールしてみた 〜VirtualBoxを使って〜

#はじめに
個人的にWindow10を一時的に評価したいと思い、
Microsoft Windows10 Enterprise EvalutionをMac上でVirtualBoxを動かして、
インストールすることにしました。
この記事は、2015/12/12現在で作成したものなので、各種バージョンなどはその時点のものに
読み替えていただければと思います。

#インストール開始

書いてたら、長くなったので、４分割しました。
それぞれのページで確認してください。

##Windows10 Enterprise Evalutionのダウンロード

[ココ](http://qiita.com/areaz_/items/5cbadd6e9deffac0249f)

##VirtualBoxのダウンロードとインストール

[ココ](http://qiita.com/areaz_/items/b4bcf7702f051e80af4f)

##VirtualBoxを使って、Windows 10 Enterpriseをインストール

[ココ](http://qiita.com/areaz_/items/43aa81437b1a570eea6d)

##MacとVirtualBoxで動いてるWindows 10 Enterprise とファイル共有

[ココ](http://qiita.com/areaz_/items/2288ae833faeca5d080c)

さて、次は・・・。
MacにVirtualBoxをインストールする

#はじめに
個人的にWindow10を一時的に評価したいと思い、
Microsoft Windows10 Enterprise EvalutionをMac上でVirtualBoxを動かして、
インストールすることにしました。
この記事は、2015/12/12現在で作成したものなので、各種バージョンなどはその時点のものに
読み替えていただければと思います。

その中の**VirtualBoxのダウンロードとインストール**について書いてみます。

##前提条件

私が使ってる環境です。

+ MacBook Air(13-inch, Mid 2013)
+ OS X El Capitan バージョン 10.11.1
+ メモリ 8GB 1600MHz DDR3

##ダウンロードしていきます

　　手順を書いていきます。
　　（１）URLにアクセス
　　　　　https://www.virtualbox.org/
　　（２）[Download VirtualBox 5.0]をクリック
　　（３）[VirtualBox 5.0.10 for OS X host → amd64]をクリック
　　（４）[VirtualBox-5.0.10-104061-OSX.dmg]
　　　　　がダウンロードされているので、確認してくださいね。

##インストールします

　　手順を書いていきます。
　　（１）[VirtualBox-5.0.10-104061-OSX.dmg]をダブルクリック
　　　　　![001_virtualbox_install.png](https://qiita-image-store.s3.amazonaws.com/0/105220/be317575-3f62-da87-439f-79eb8c1b5aca.png)

　　（２）[1. Double click on this icon][VirtualBox.pkg]をダブルクリック

　　（３）[続ける]をクリック
　　　　　![002_confirm.png](https://qiita-image-store.s3.amazonaws.com/0/105220/e9297152-306e-8fff-e015-9096ea45b90b.png)

　　（４）[続ける]をクリック
　　　　　![003_start.png](https://qiita-image-store.s3.amazonaws.com/0/105220/626cf15e-dad3-f74c-06cd-696a57f5c711.png)

　　（５）[インストール] をクリックし、パスワードを入力
　　　　　![004_install_drive.png](https://qiita-image-store.s3.amazonaws.com/0/105220/365ac730-8452-1b98-f835-53bc5e778c34.png)

　　（６）しばらく待つとインストール終了するので、[閉じる]をクリック
　　　　　![005_install_finish.png](https://qiita-image-store.s3.amazonaws.com/0/105220/34e0432f-1326-9e95-d163-1b5e3b1b8fb3.png)

　　（７）LaunchpadにVirtualBoxがあることを確認してください

VirtualBoxのインストールは１０分程度で十分終わります。
Windows10 Enterprise Evalutionをダウンロードする

#はじめに
個人的にWindow10を一時的に評価したいと思い、
Microsoft Windows10 Enterprise EvalutionをMac上でVirtualBoxを動かして、
インストールすることにしました。
この記事は、2015/12/12現在で作成したものなので、各種バージョンなどはその時点のものに
読み替えていただければと思います。

その中の**Windows10 Enterprise Evalutionのダウンロード**について書いてみます。

##前提条件

私が使ってる環境です。

+ MacBook Air(13-inch, Mid 2013)
+ OS X El Capitan バージョン 10.11.1
+ メモリ 8GB 1600MHz DDR3

##ダウンロードしていきます

　　手順を書いていきます。

　　（１）URLにアクセス
　　　　　https://technet.microsoft.com/ja-jp/evalcenter/dn781239.aspx
　　（２）今すぐダウンロードをクリック
　　（３）Outlook.comのログインを行う
　　　　　★事前にアカウント作成が必要
　　（４）[Windows 10 Enterprise Evalution]と書かれたページに情報を入れていく
　　　　　・名
　　　　　・姓
　　　　　・メールアドレス
　　　　　・国
　　　　　・所属している会社または組織での主な枠割
　　　　　→ここまでは自分の情報を入れてください
　　　　　・Windows 10 Enterpriseをダウンロードするためのあなたの目的
　　　　　→[Windows 10 Enterpriseの評価]を選択
　　　　　 もし、他の用途でも利用される場合は、それを選択してください。
　　　　　・現在使用しているオペレーティングシステム
　　　　　→ご自身で普段利用しているWindowsOSを入れてください
　　　　　・ダウンロードするもの
　　　　　→[Windows 10 Enterprise]を選択
　　　　　・ソフトウェアバージョン
　　　　　→[64bit]を選択
　　　　　・言語選択
　　　　　→[日本語]を選択
　　　　[次へ]を選択
　　　　するとダウンロードが始まります。
　　（５）[10586.0.151029-1700.TH2_RELEASE_CLIENTENTERPRISEEVAL_OEMRET_X64FRE_JA-JP.ISO]
　　　　　がダウンロードされていますので、確認してくださいね。
KBrowser 活用例（発注書管理システム）

Kintone アプリをKBrowser を使って外部公開する例をご紹介いたします。
社外にユーザが多数いる場合、有効です。

#KBrowser による発注書管理システム対応
##システム対応前　メールによる発注書管理のマニュアル運用
![1マニュアル運用.png](https://qiita-image-store.s3.amazonaws.com/0/100572/d235a79a-bca8-0ede-da09-10b34b18cec4.png)

##KBrowser による発注書管理 
![KBrowserシステム構成1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/a9d959fb-470d-36c2-f94c-7791c970c6e9.png)

#発注書処理フロー
![3発注書処理フロー1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/9a722310-18fb-3d59-6bd5-df108aabcf1e.png)

#発注情報のメール送信
![発注情報のメール送信.png](https://qiita-image-store.s3.amazonaws.com/0/100572/5be50841-018b-b9cd-b1de-cbe022a9ff7c.png)

# KBrowserメニュー作成例
![KBrowserメニュー作成例1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/c6352f39-0880-0487-462f-b2764a8c10ab.png)
RPi > license > HDMIがひっかかる

RaspberryPiを商業利用することを検討した時に、HDMIのライセンスでひっかかりそうだ。

https://www.raspberrypi.org/blog/starting-a-business-with-a-raspberry-pi/
のコメントにある

> There is another issue to consider though, and that is HDMI licensing. You would (as far as I can understand) need to become an HDMI adopter and pay yearly licenses. Read more at
>
http://olimex.wordpress.com/2012/05/17/hdmi-doubts/#comment-502
>
There is also other issues to consider(SD-card technology,
REACH, etc, etc).


上記の #comment-502に記載しているのは

> The gist: You have to pay \$10000 / year (“HDMI adopter”) plus a royalty per unit (\$0.05 if you display the HDMI logo everywhere, \$0.04 if you implement HDCP). A “low volume” plan exists which means \$5000 per year + \$1 / unit in administrative fees + the aformentioned royalty.


HDMI付きのRPiを使う限りは、HDMI adopterになって支払いを続けないといけないように思う。

computer-moduleでHDMIなしのものを作ればいいのだろうか。
https://www.raspberrypi.org/products/compute-module/
GDBでRTT

nRF51822で、UARTが使えないけど動作状況を見たいときがある。
ブレークポイントで止めることはできるが、そこから再開させられないので、流しながら動作を見たい方が多い。
そういうときに、SEGGER RTTというものが使えそうだ。

[Debugging with Real Time Terminal](https://devzone.nordicsemi.com/tutorials/6/debugging-with-real-time-terminal/)

上記はKeilでの説明だが、うちではGCC+GDB(eclipse)なので、その環境で試す。

# Makefile

書き方は各人異なると思うので、こんな感じで。
今回は、printf風のAPIを使いたいので、それも追加している。

    C_SOURCE_FILES += \
    $(SDK_PATH)/components/drivers_ext/segger_rtt/RTT_Syscalls_GCC.c \
    $(SDK_PATH)/components/drivers_ext/segger_rtt/SEGGER_RTT.c \
    $(SDK_PATH)/components/drivers_ext/segger_rtt/SEGGER_RTT_printf.c
    
    INC_PATHS += -I$(SDK_PATH)/components/drivers_ext/segger_rtt

# ソースファイル

ヘッダファイル。

    #include "SEGGER_RTT.h"

ログ。
最初の「0」は、Channelのようである。
nRF51822で試したところ、1にするとHardFaultが発生した。

    SEGGER_RTT_printf(0, "START\r\n");

    SEGGER_RTT_printf(0, "err_code = %u\r\n", err_code);

# 実行

うちはeclipseなので、まずは普通にSEGGERでのデバッグを開始させる。
そうすると、SEGGER J-Link Control panelというアプリが立ち上がるんじゃないかと思う。
(Windowsでやっていると、そうなった。)

RTTタブを選び、右側の「Start」を押すとログ取得を開始する。
Startしてからデバッグを開始させると良いだろう。

![segger_rtt.png](https://qiita-image-store.s3.amazonaws.com/0/18861/835889c7-3d8a-313c-5693-1f1ed69418dd.png)

SEGGERのアプリをインストールしたときに「RTT Viewer」というものがあり、リンク先ではそれを使っているようだ。
Control Panelアプリがもう1個立ち上がったので変になるかと思ったが、特に問題でもなさそうだ。
ブレークポイントを使ったりしないなら、RTT Viewerだけ起動させれば済むと思われる。

RTT Viewerを立ち上げる前もSEGGERがバッファリングしているようで、nRF51822起動時のログが後からでも表示できた。
なお、ログのクリアはタブの上で右クリックして「Clear Terminal」を選択するようだ。
ATOM の Theme / Package の一言感想文（2015-12-12）

[前に一度やった](http://qiita.com/spiegel-im-spiegel/items/115fea37ad2e515f6641)けど，あれから半年経って [ATOM] も 1.x に上がったし環境もちょっとずつ変わったので，再度。

[ATOM] について書いた記事は「[ATOM Editor をそろそろ始めようか](http://qiita.com/spiegel-im-spiegel/items/3d41d98dacc107d73431)」をどうぞ（ブックマークもこちら）。ちなみに Windows 環境。

## Themes

```
C>apm list -i -b -t
atom-monokai@0.9.7
→ UI Theme に反応して自動的に Dark と Light を切り替えてくれる。便利。
```

## Packages

```
C:>apm list -i -b -p
autoclose-html@0.19.0
→ ブログを Hugo に換えて以来 HTML をベタ書きすることは少なくなったのだが，まぁ地味に便利。
editorconfig@1.2.2
→ 仕事で ATOM を使うときは必須。なのだが， trim_trailing_whitespace と insert_final_newline が効かなくなってしまった気がする。
file-icons@1.6.13
→ 見栄えは大事。
git-plus@5.6.10
→ 必須機能。 GUI が要るなら Git Extensions 併用で。
go-plus@3.5.2
→ 開発環境 http://qiita.com/spiegel-im-spiegel/items/6c4c819207354c4d7262
highlight-line@0.11.0
→ Windows キャレットをよく見失うのよ。これないと作業効率が下がる。
japan-util@0.1.1
→ 全角の英数字や半角カナを使う馬鹿が後を絶たないので必要。最近は出番が少なくなって嬉しい。
language-lua@0.9.4
→ Lua 用の syntax highlight および snippets。 Core には入ってなかった。
open-recent@4.0.1
→ 最近開いたファイルとフォルダ（＝プロジェクト）を覚えてくれる賢いやつ。てか，何故これを Core に入れないのだ。
quick-highlight@0.3.9
→ 指定した単語をマークしてくれる。地味にありがたい。
show-ideographic-space@1.0.1
→ 全角空白を可視化する。コード書きには必須アイテム。
symbols-tree-view@0.10.1
→ アウトライン解析みたいに使える。コード書きには必須アイテム。
wrap-style@0.3.0
→ japanese-wrap と同じ作者による。 ATOM 1.2 以降， soft wrap については改善されたが， wrap-style があるともっと幸せになれる。
```

## 最近のブログ記事

最近ブログ記事で書いた [ATOM] に関する記事。

- [ATOM で Go — プログラミング言語 Go | text.Baldanders.info](http://text.baldanders.info/golang/golang-with-atom/)
- [行末の空白文字を削除する — しっぽのさきっちょ | text.Baldanders.info](http://text.baldanders.info/remark/2015/trim-trailing-whitespace/)
- [ATOM Editor で現在日時を挿入する — しっぽのさきっちょ | text.Baldanders.info](http://text.baldanders.info/remark/2015/insert-datetime-in-atom-editor/)
- [ATOM Editor で Amazon Associate ID を含んだ商品 URL を生成する — しっぽのさきっちょ | text.Baldanders.info](http://text.baldanders.info/remark/2015/insert-amazon-url-with-associate-id-in-atom-editor/)

[ATOM]: https://atom.io/ "Atom"
rpm最低限メモ


本当に最低限のメモ。

###インストール済　一覧

```bash
rpm -qa
```

###インストール

```bash
rpm -ivh hoge.rpm
```

###アップグレード

```bash
rpm -Uvh hoge.rpm
```

###アンインストール

```bash
rpm -e hoge.rpm
```

###何がどこにインストールされたか？

```bash
rpm -ql
```
MySQL5.7を触ってみました①

　今更遅いですけど、MySQL5.7を触って始めました。
　まずはインストールです。

## 古いバージョンをアンインストール

既存環境のmysqlバージョンを確認します。

```bash
# rpm -qa | grep mysql
mysql-libs-5.1.71-1.el6.x86_64
```

古いバージョンを全部アンインストールします。

```bash
# yum -y remove mysql*
```

## インストール開始

rpmをインストールします。

```bash
# yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
```

mysql5.7をインストールできるようにします。

```bash
mysql5.6のリポジトリを無効にします
# yum-config-manager --disable mysql56-community

mysql5.7のリポジトリを有効にします
# yum-config-manager --enable mysql57-community-dmr
```

これから、mysql5.7をインストールします。

```bash
# yum -y install mysql mysql-devel mysql-server mysql-utilities
```

## 事後確認

```bash
# rpm -qa | grep mysql
mysql-community-libs-5.7.10-1.el6.x86_64
mysql-connector-python-2.1.3-1.el6.x86_64
mysql-community-server-5.7.10-1.el6.x86_64
mysql-community-devel-5.7.10-1.el6.x86_64
mysql-community-release-el6-5.noarch
mysql-community-common-5.7.10-1.el6.x86_64
mysql-community-client-5.7.10-1.el6.x86_64

# mysql --version
mysql  Ver 14.14 Distrib 5.7.10, for Linux (x86_64) using  EditLine wrapper
```

## 起動

mysqlを起動して、ログインしてみます。

```bash
# /etc/init.d/mysqld start
Initializing MySQL database:                               [  OK  ]
Starting mysqld:                                           [  OK  ]

# cat /root/.mysql_secret
cat: /root/.mysql_secret: No such file or directory
```

あれ！？rootの初期パスワードを記述されるファイルがありません。調べましたら、/var/log/mysql.logに記述されると分かりました。

```bash
# cat /var/log/mysqld.log | grep password
2015-12-11T01:07:23.389684Z 1 [Note] A temporary password is generated for root@localhost: tW&R&:(36Kv9
```

## rootパスワード変更

mysqlへログインして、rootをパスワードを変更します。

```mysql
# mysql -u root -p
Enter password:<初期パスワード> 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.10

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '<パスワード>';
Query OK, 0 rows affected (0.00 sec)
```

mysql5.7のパスワードポリシーの初期値はMEDIUMとなっていますので、以下の条件を満たす必要があります。

- 大文字／小文字／数字／記号の全てが入っている
- 長さが８文字以上

## まとめ

　インストールはとてもシンプルです。
　MySQL5.7には150を超える新機能がありますので、これからもちょっとずつ触ってみたいと思います。