OmniAICreator/Qiita-1.07M huggingface dataset:
基本情報技術者試験H27秋期午後問8（疑似言語）VBAプログラム

```
Sub main()
    Dim str1 As String, str2 As String
    Dim Text(20) As String, Pat(20) As String
    Dim i As Integer
    str1 = "ACBBMACABABC"
    str2 = "ACAB"
'    str1 = "XYZABCABCDE"
'    str2 = "ABCAB"
    TextLen = Len(str1)
    For i = 1 To TextLen
        Text(i) = Mid(str1, i, 1)
        Debug.Print "Text("; i; ")="; Text(i)
    Next
    
    PatLen = Len(str2)
        For i = 1 To PatLen
        Pat(i) = Mid(str2, i, 1)
        Debug.Print "Pat("; i; ")="; Pat(i)
    Next
    Call BMMatch(Text, TextLen, Pat, PatLen)
End Sub

Sub BMMatch(ByRef Text() As String, TextLen, ByRef Pat() As String, PatLen)
    Dim i As Integer
    Dim Skip(26) As Integer, PText As Integer, PPat As Integer, PLast As Integer
    For i = 1 To 26
        Skip(i) = PatLen
'        Debug.Print "Skip("; i; ")="; Skip(i)
    Next
    For i = 1 To PatLen - 1
        Skip(index(Pat(i))) = PatLen - i
'        Debug.Print "Pat("; i; ")="; Pat(i)
'        Debug.Print "index(Pat("; i; "))="; index(Pat(i))
'        Debug.Print "Skip(index(Pat("; i; "))))="; Skip(index(Pat(i)))
        Debug.Print "+++Skip("; index(Pat(i)); ")="; Skip(index(Pat(i)))
    Next
    PLast = PatLen
    Debug.Print "PLast="; PLast, "PatLen="; PatLen
    Do While PLast <= TextLen
        PText = PLast
        PPat = PatLen
        Debug.Print "PText="; PText, "PPat="; PPat
        Debug.Print "Text="; Text(PText), "Pat="; Pat(PPat)
        Debug.Print "---------------------------------"
        
        Do While Text(PText) = Pat(PPat)
            If PPat = 1 Then
                Debug.Print "PText="; PText
                End
            End If
            PText = PText - 1
            PPat = PPat - 1
            Debug.Print "PText="; PText, "PPat="; PPat
            Debug.Print "Text="; Text(PText), "Pat="; Pat(PPat)
            Debug.Print "---------------------------------"
        Loop
        Debug.Print "PLast="; PLast
        PLast = PLast + Skip(index(Text(PLast)))
        Debug.Print "PLast="; PLast
    Loop
    Debug.Print "Result=-1"
End Sub

Function index(s) As Integer
    Dim ABCD As String
    Dim i As Integer
    ABCD = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    For i = 1 To 26
        If s = Mid(ABCD, i, 1) Then
            Exit For
        End If
    Next
    index = i
End Function
```
実行結果

```
Text( 1 )=A
Text( 2 )=C
Text( 3 )=B
Text( 4 )=B
Text( 5 )=M
Text( 6 )=A
Text( 7 )=C
Text( 8 )=A
Text( 9 )=B
Text( 10 )=A
Text( 11 )=B
Text( 12 )=C
Pat( 1 )=A
Pat( 2 )=C
Pat( 3 )=A
Pat( 4 )=B
+++Skip( 1 )= 3 
+++Skip( 3 )= 2 
+++Skip( 1 )= 1 
PLast= 4      PatLen= 4 
PText= 4      PPat= 4 
Text=B        Pat=B
---------------------------------
PText= 3      PPat= 3 
Text=B        Pat=A
---------------------------------
PLast= 4 
PLast= 8 
PText= 8      PPat= 4 
Text=A        Pat=B
---------------------------------
PLast= 8 
PLast= 9 
PText= 9      PPat= 4 
Text=B        Pat=B
---------------------------------
PText= 8      PPat= 3 
Text=A        Pat=A
---------------------------------
PText= 7      PPat= 2 
Text=C        Pat=C
---------------------------------
PText= 6      PPat= 1 
Text=A        Pat=A
---------------------------------
PText= 6 
```
画像URL一覧ファイルを使って一括で画像をダウンロードする方法(Mac)

最近、ディープラーニングで機械学習を行う際に大量の画像をダウンロードする機会がありましたので、その際に考えた効率のいい画像の一括ダウンロード方法を紹介致します。

まず、以下のようにネットに落ちている画像URLをテキストファイルにまとめます。

```urls.txt
http://aaaaaaaaaaaaaaaaa/hoge.jpg
http://bbbbbbbbbbbbbbbbb/moge.jpg
http://ccccccccccccccccc/foo.jpg
http://ccccccccccccccccc/bar.jpg
http://ddddddddddddddddd/hoge.jpg
http://eeeeeeeeeeeeeeeee/moge.jpg
http://fffffffffffffffff/foo.jpg
http://ggggggggggggggggg/bar.jpg
```

そして、ターミナルを起動し、このテキストファイルが保存されているディレクトリへと移動する。

> $ cd (urls.txtのあるディレクトリパス)

移動したら、以下のコマンドを打ちます。

> $ sed "s/^/curl -O /g" urls.txt > (任意の名前).sh

これで、以下の様なURLの先頭に「curl -O 」が付加されたシェルスクリプトが生成されます。

```(任意の名前).sh
curl -O http://aaaaaaaaaaaaaaaaa/hoge.jpg
curl -O http://bbbbbbbbbbbbbbbbb/moge.jpg
curl -O http://ccccccccccccccccc/foo.jpg
curl -O http://ccccccccccccccccc/bar.jpg
curl -O http://ddddddddddddddddd/hoge.jpg
curl -O http://eeeeeeeeeeeeeeeee/moge.jpg
curl -O http://fffffffffffffffff/foo.jpg
curl -O http://ggggggggggggggggg/bar.jpg
```

そして、画像を保存したいフォルダを先に作っておき、その中に移動します。
今回はimagesフォルダを現在自分がいる階層に作成します

> $ mkdir images
> $ cd images/

そして、そのフォルダ内にいる状態でシェルスクリプトを実行します。

> $ sh ../(任意の名前).sh

すると、以下のようにダウンロードが始まり、imagesフォルダに画像が溜まり始めます。

<img width="481" alt="スクリーンショット 2016-07-11 0.41.27.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/e21e1f33-2fca-430a-ebb9-87c63d542380.jpeg">

以上です。
Golangのos.Openはfor文の中に書く場合、deferで閉じてははいけない

```
package main

import (
	"os"
)

func main() {

	for i := 0; i < 67757; i++ {
		file, err := os.Open(".")
		if err != nil {
			panic(err)
		}
		defer file.Close()
	}
}
```

この様にある一定数を超えると

`panic: open .: too many open files` となります。
実行例 https://play.golang.org/p/FUxEJaRwO4
※PlayGroundの制限でメッセージは違います

解決案としては、1例として

```
for i := 0; i < 167757; i++ {   
       func() {
            file, err := os.Open(".")
            if err != nil {
                panic(err)
            }
            defer file.Close()
        }()
    }   
```

こういうふうに無名関数化すると、解決します。  
原因は何かと言うと、`defer` が実行されるタイミングと、ファイルを開ける限界数です。

実行例 https://play.golang.org/p/eePKDL0kNa

必要な部分を抽出して此処に書きましたが  
どうでもいいこと含めた内容は[別に書いてますー。](https://log.shinofara.xyz/2016/07/10/golang%E3%81%AEfor%E6%96%87%E3%81%AE%E4%B8%AD%E3%81%A7file%E3%82%92%E9%96%8B%E3%81%84%E3%81%A6%E9%96%89%E3%81%98%E3%81%A6%E3%81%9F%E3%82%89%E3%83%8F%E3%83%9E%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7/)

# 参考

http://mattn.kaoriya.net/software/lang/go/20151212021608.htm
メイカーズバザール大阪2016　出展レポート

#出展したよー。
7/9(土)、7/10(日)とメイカーズバザール大阪2016に出展してきました！

いつもはソフトばっかりですが、HW、電子工作、Makerの雰囲気を感じてすごく刺激になりましたよ！！

#自分の出展内容
http://makersbazaar.jp/makers_detail.php?id=47
デジタルテルミン「スペースデジミン」と、簡易警告灯[「アラーム君」](https://github.com/Blue-Tone/AlarmBoy)を出展。

スペースデジミンは子供の反応は上々でした。
後半、自分で演奏したら、大人の反応も良くなって来たので、練習して動画UPしてみますね！

アラーム君は、日本語ドキュメントの充実が必要ですね。
少しずつ整備しよう。

写真はこんな感じ。
![IMG_4811.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/1c0d054c-de2b-b321-6b18-60f8f23d822f.jpeg)
![IMG_4810.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/4f29e7de-65a4-697c-da74-723af63426c1.jpeg)
![IMG_4832.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/077fd40e-71f9-8aa4-46e4-489a8d8b29b2.jpeg)
![IMG_4830.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/6bdae50a-9a05-69c5-28f9-7fa69a44827b.jpeg)
![IMG_4831.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/2eb064b6-28fa-63c0-80dc-4e872a7c864b.jpeg)



#レポート
一人で店番していたので、あまりゆっくり見れなかったですが、すごい！と思ったのがあったので、紹介します！

##Nefry(ネフリー)
[Nefryドキュメントまとめ](http://qiita.com/wamisnet/items/d07c3c22e2bf5ab628ef)
IoTを簡単にできるデバイス。Arduino IDEでプログラミング可能です。
IoTのニュースってサーバ側の話題が多く、端末側はどうなってるんだって思ってたら、遭遇しました。
センサーも簡単につなげられるみたいです。
使い道がいろいろあって、これは今後が楽しみなデバイスです。
１つ購入。自分はXFDをWiFi経由で動作させたり、部屋の照明(LED)をWebから操作。なんてのに使用予定。
通販もあるみたいです。
![IMG_4827.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/2d939f9e-bb5e-3eeb-ed05-e0a716bfd4cf.jpeg)
![IMG_4826.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/4b7c278a-1101-9d56-cfac-73ebe06f9213.jpeg)
![IMG_4823.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/79119f84-9d53-51e1-ab34-d788acdb8a2e.jpeg)
![IMG_4825.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/b51390be-b92f-a307-cec5-1ea47ad98a38.jpeg)![IMG_4824.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/d0a4ff5b-941a-7575-82f6-d6b680471676.jpeg)

１個購入しました！使うのワクワク！
![IMG_4828.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/ebd909ef-fbf7-c5f3-2944-9dfc995a9ed3.jpeg)
![IMG_4829.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/5e167e44-30d1-2e83-b790-50fc7d6e215b.jpeg)


##ARM Theremin(アームテルミン)
[アーム・テルミン / アーム・シンセテルミン](http://hyamasynth.web.fc2.com/ArmThermin/ArmTerminPR.html)
同じテルミン系ということで、あらかじめWebサイトで下調べしてから、触らせてもらいましたが、完成度が高い！
音も良いし、音色、音の変化の滑らかさ、ピッチの演奏しやすさ。
ビブラートの付け方や、キャリブレーション、エコー等の細かな仕様が、カユイところに手が届く感動の作品でした。
演奏者の事を考えた仕様になってますね。感動しました！！
![IMG_4821.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/c79dc8a9-58b2-f763-8352-d688ee63adcf.jpeg)
![IMG_4820.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/b8b0fce9-3018-631b-a645-b9303a6ea9d9.jpeg)

#懇親会
1日目の終了後に、出展者の懇親会があったのですが、FabLab北加賀屋の皆さんのテーブルにご一緒させてもらいました。面白い話がわんさかで、やっぱこういう仲間とかコミュニティって大事だなー。と思いました。
FabLab北加賀屋、今度見学に行こう。

#まとめ
他の人の作品も見れて、刺激になった！
出展者同士の情報交換も凄くできて良かったです！
いい経験できました。
みなさん、ありがとう！！
Python 3で日本語をprintする際のUnicodeEncodeErrorはLANGに気をつける

# サマリ

Python3でUnicodeEncodeErrorが起きたときには

* LANG=ja_JP.UTF-8 と環境変数が設定されているか確認する
* language-pack-ja がインストールされているか確認する

# 現象

今まで7年ほどPython 2系を使ってきましたが、そろそろ3系に移ろうと思っています。

Python3では、文字列まわりがUnicodeに統一されて、便利になったと聞いていたのですが、UnicodeEncodeErrorでつまづきました。

OSはUbuntu 14.04.4 LTSでPythonはpyenvで入れた3.5.2です。
実行したコードは下記のHello Worldです。

```python:hello_ja.py
# coding: utf-8                                                                                            
print("こんにちは世界")
```

結果

```shell-session
% python hello_ja.py
Traceback (most recent call last):
  File "sample.py", line 4, in <module>
    print("\u3053\u3093\u306b\u3061\u306f\u4e16\u754c")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)
```

Python2系だと、codecsを使って一手間かける必要がありましたが、3系ではこれでいけるはずですが…

# 対策

[備忘録 - #python3 で sys.std(in|out|err) の encoding を強制する](http://blog.livedoor.jp/dankogai/archives/51816624.html)
を読んでみると、Python3系の文字コード選択では、どうやら環境変数のLANGを見ている様子。

環境変数を確認すると、日本語utf-8になっていました。

```shell-session
% export | grep LANG
LANG=ja_JP.UTF-8
```

LANG=Cになっていたら、これが原因だったのですが、今回は違ったようです。

基本に立ち返って、日本語環境がそもそもインストールされているのか確認したところlanguage-pack-jaがインストールされていませんでした。英語版のイメージでインストールしていたので、入れ忘れていたようです。

[Debian/Ubuntuのデフォルトロケールを変更する](http://qiita.com/tailak/items/77b90a4df07e4f6a1fc2#2-2)に従ってパッケージのインストールと、デフォルトロケールの設定をします。

```shell-session
% sudo apt-get install language-pack-ja
% sudo update-locale LANG=ja_JP.UTF-8
```

これで、正しく日本語をprintできるようになりました。

```shell-session
% python hello_ja.py
こんにちは世界
```
TensowFlowをセットアップしてハマったのでメモ

# ことの発端

TensowFlowをpipを使ってインストールして動作確認しようとした時に以下のようなエラーが出ました。こいつのおかげでTensowFlowの動作確認がこけました。tensorflowのimportの段階ですでにこけるとか・・・。

```
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/tensorflow/__init__.py", line 23, in <module>
    from tensorflow.python import *
  File "/Library/Python/2.7/site-packages/tensorflow/python/__init__.py", line 49, in <module>
    from tensorflow import contrib
  File "/Library/Python/2.7/site-packages/tensorflow/contrib/__init__.py", line 23, in <module>
    from tensorflow.contrib import layers
  File "/Library/Python/2.7/site-packages/tensorflow/contrib/layers/__init__.py", line 68, in <module>
    from tensorflow.contrib.layers.python.layers import *
  File "/Library/Python/2.7/site-packages/tensorflow/contrib/layers/python/layers/__init__.py", line 22, in <module>
    from tensorflow.contrib.layers.python.layers.initializers import *
  File "/Library/Python/2.7/site-packages/tensorflow/contrib/layers/python/layers/initializers.py", line 24, in <module>
    from tensorflow.python.ops import random_ops
  File "/Library/Python/2.7/site-packages/tensorflow/python/ops/random_ops.py", line 23, in <module>
    from tensorflow.python.framework import ops
  File "/Library/Python/2.7/site-packages/tensorflow/python/framework/ops.py", line 39, in <module>
    from tensorflow.python.framework import versions
  File "/Library/Python/2.7/site-packages/tensorflow/python/framework/versions.py", line 22, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "/Library/Python/2.7/site-packages/tensorflow/python/pywrap_tensorflow.py", line 28, in <module>
    _pywrap_tensorflow = swig_import_helper()
  File "/Library/Python/2.7/site-packages/tensorflow/python/pywrap_tensorflow.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow', fp, pathname, description)
ImportError: numpy.core.multiarray failed to import
```

このエラーの中身を要約すると「読み込んだnumpyのバージョンにダブりがあってうまく機能しなかったぜー」みたいなもの。


# どうやって解決していったか。
いろいろ調べてみて、「numpyを全てアンインストールして再びインストールし直す」という方法です。
まずは以下のブログを見て該当するフォルダに移動してアンインストール。
http://sechiro.hatenablog.com/entry/2016/04/02/Mac%E3%81%ABTensorFlow%E3%82%92%E5%85%A5%E3%82%8C%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E3%82%89%E3%80%81Numpy%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%9F%E3%81%AE%E3%81%A7

しかし、エラーメッセージの中身は変わらなかったので、情報をいろいろ探っていって別なnumpyのインストール場所の候補を見つけた。以下のブログの通りに削除 + 再インストール。
http://d.hatena.ne.jp/aremokoremo/20140507/1399475248

そうしたらうまくTensowFlowをimportすることができてTensowFlowによるプログラミングライフの幕開けをむかえることができました。

# もし私と同じようなエラーメッセージが出てハマったら・・・
以下の二つのフォルダ内にnumpyがないか確認しよう。そして以下のフォルダから全てのnumpyを削除してから新しいnumpyを再インストールしてみよう。

- `/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/`

- `/Library/Python/2.7/site-packages/`
尊重和對得起自己的專業

最近碰到一些事情，有些人勸我放下一些東西
這些東西就剛好是我自己的專業上必須要的考量

剛好這又是我一個什麼都比較會放，就最不會放的東西之一

就讓我想到，之前在某家公司面試的時候

面試的主管就問我當接到案子、看到案子不合理的時候要怎麼做？

> 當然是要反映不合理的地方，提出改善的方法

我是這麼樣回答，
用我會的東西，解決專案上看起來有問題的地方

不過意外地，好像就和該位主管的意思相反，
當然就來來回回，
不斷想要勸我為了專案好，不要提改善意見，把它完成就對了
一直想要引導我說出

> 為了專案好，先做就對了

不過我知道他想要我講什麼，我沒有照他的意思講就對了

怎麼講到最後這個面試好像在跟設局的記者講話 :laughing:
dub 1.0.0 のSingle-file packages

dub 1.0.0 Single-file packages
==============================

dub 1.0.0の新機能 Single-file packagesを紹介します。
公式のドキュメントは[Getting Started](https://code.dlang.org/getting_started)のSingle-file packagesを参照して下さい。

```
$ dub --version
DUB version 1.0.0, built on Jun 20 2016
```

# Single-file packages

Single-file packagesとは、パッケージレシピファイル(`dub.sdl`/`dub.json`)に記述していた内容をソースファイル内に埋め込める機能です。
1つのファイルで構成されるような小さなアプリケーションやスクリプトに対し、dubのサポートを付与することができます。
dubプロジェクトを作成しなくてもdubパッケージを使える点が便利です。

```dlang_requests.d
#!/usr/bin/env dub
/+ dub.sdl:
name "dlang_requests"
dependency "requests" version="~>0.1.9"
+/
import std.stdio,
       std.getopt,
       requests;

string url = "http://example.com/";

void main(string[] args)
{
  getopt(args, "url", &url);

  auto rs = Request().get(url);
  writeln(rs.responseBody);
}

```

`dub run --single dlang_requests.d`、もしくは行頭にシェバングを追記し実行権限を与えた上で`./dlang_requests.d`で実行できます。
コマンドラインオプションは`dub run --single dlang_requests.d -- --url=http://qiita.com`もしくは` ./dlang_requests.d --url=http://qiita.com`で与えることができます。
海外長期滞在する場合にしておくと良い申請


この投稿は、[J-1ビザでアメリカへインターンに行く流れ](http://qiita.com/Tkashiro/items/d38e76610c9315ef539b)の番外編で、インターンに関係なく、海外に長期滞在する場合にやっておくといい手続きをまとめています。

制度は変更されるので、自分でやる場合は、もう一度調べなおして実施してください。あくまで参考程度で。

# 日本でやっておくといいこと


## 住民登録削除

海外へ転出という形で住民登録を削除できます。
削除することでそれ以降の、国民健康保険料は請求されません。滞在国での健康保険料を会社が負担してくれるのであれば、これでいいかと思います。それがなければ、住民登録は残しておいて、何かあれば、現地でかかった医療費の一部を国民健康保険で補填できかと思います（各自確認お願いします）
また住民票を削除したので、住民税もかからなくなります

住民税の課税基準は課税年の1月1日に日本住所がある場合です。住民登録を削除したのが、1月1日以降の場合は、その年の住民税は支払う必要があります。

## 年金支払

住民票を削除するときに、年金支払いも停止させるか聞かれます。払い続けるか、止めるか選べます。

## 運転免許更新

海外滞在期間中に免許の更新を迎える予定の人は2つの選択肢があります

- 1 出国前にパスポートにある滞在国のVISAを見せて事前更新。近くの警察署でできました
- 2 帰国後にパスポートの出国、入国スタンプを見せることで事後更新。但し免許センターに行く必要があるようです

2016/07/11追記
現行のルールではいかなる理由でも免許失効後、3年経過すると更新できないみたいです。
また、ゴールド免許のような免許の種類を維持するためには別のルールがあるみたいです。
詳しくは下記を参照ください。

[警視庁：海外滞在中で日本の免許をお持ちの方](https://www.npa.go.jp/annai/license_renewal/living_abroad.html)

## 出入国自動化ゲート登録

空港で時短テクニックです。

出発時に日本の出国審査前に同じ場所で「出入国自動化ゲート」の登録をやっているので登録しておくと便利です。
登録すると、日本出国時、日本帰国時は、審査に並ぶ必要はなく、パスポートと指紋のスキャンをする駅の改札みたいなゲートでセルフサービスで審査できて早いです。VISA関係なく、よく海外に行く人はやっとくと便利だと思います。

http://www.moj.go.jp/nyuukokukanri/kouhou/nyuukokukanri01_00111.html

# 滞在国でやっておくといいこと

## 在外選挙人名簿

日本の投票に外国にいても参加できるのが「在外選挙制度」といいます。投票に参加するには、滞在国の最寄りの日本大使館、日本領事館で「在外選挙人名簿」に登録する必要があります。登録すると、大使館経由で投票用紙が自宅（滞在国）に届きます。

選挙になってからあわてないように登録しておくといいと思います。

http://www.soumu.go.jp/senkyo/hoho.html

## IDの申請

アメリカでの話になります。
外国滞在で有効になるIDの代表はパスポートですが、常に持ち運ぶとなるとかさばりますし、なくした時、大変です。

長期滞在する人は、「Non Driver Licence」を取得しておくとIDとして使えて便利でリスク回避になります。
（形状は日本と運転免許証と同じで、財布にはいります）
Non Driver Licenceは運転しない人の免許証みたいなもので、運転はできないですが、IDとして使えます。

最寄りの「dmv (Department of Motor Vehicle)」という役所に申請して取得します。


- 役所での申請手続きに時間がかかります。（2時間30分くらい。主に待ち時間）
- dmvによっては手続きの予約ができるみたいです。やっておくと時短になると思います

参考までにNY州のDMVのサイトです。↓
https://dmv.ny.gov/id-card/bget-non-driver-id-card-ndid
【Python】pandas.DataFrameとnumpy.ndarrayのループ時間比較

データ分析の際にpandas.DataFrameで苦肉の策としてforループさせると時間がかかり過ぎることがあるため，numpy.ndarrayにするとどのくらい速くなるか確認。

```py3:check_speed.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import time
import numpy as np
import pandas as pd

df100 = pd.DataFrame(np.random.randn(100, 100))
df1000 = pd.DataFrame(np.random.randn(1000, 1000))

# 100 * 100で計測
print('Time of pandas.DataFrame (100 * 100)')
idxs = df100.index
cols = df100.columns
start = time.time() # ここから
for idx in idxs:
    for col in cols:
        df100.ix[idx, col] = df100.ix[idx, col] + 1
print(time.time() - start) # ここまで

print('Time of numpy.ndarray (100 * 100)')
matrix = df100.values
idx_range = range(len(df100.values[:, 0]))
col_range = range(len(df100.values[0, :]))
start = time.time() # ここから
for i in idx_range:
    for j in col_range:
        matrix[i, j] = matrix[i, j] + 1
print(time.time() - start) # ここまで

# 1000 * 1000で計測
print('Time of pandas.DataFrame (1000 * 1000)')
idxs = df1000.index
cols = df1000.columns
start = time.time() # ここから
for idx in idxs:
    for col in cols:
        df1000.ix[idx, col] = df1000.ix[idx, col] + 1
print(time.time() - start) # ここまで

print('Time of numpy.ndarray (1000 * 1000)')
matrix = df1000.values
idx_range = range(len(df1000.values[:, 0]))
col_range = range(len(df1000.values[0, :]))
start = time.time() # ここから
for i in idx_range:
    for j in col_range:
        matrix[i, j] = matrix[i, j] + 1
print(time.time() - start) # ここまで
```

計測結果は以下。

| 種別 | 100×100[秒] | 1000×1000[秒] |
|:-----------:|------------:|------------:|
| pandas.DataFrame | 2.010 | 206.6285 |
| numpy.ndarray | 0.0055 | 0.5832 |

思っていたより差がありますね。今後はちゃんとnumpy.ndarrayで計算するようにしないと...。
あと，計算時間は概ね行列のサイズに比例するようです。
LIS3DHをRaspberry Piで使う方法（SPI編）

秋月電子通商で買った[３軸加速度センサモジュール（LIS3DH）](http://akizukidenshi.com/catalog/g/gK-06791/)をSPIインターフェイスを用いてRaspberry Piで使ってみる。

# 前提
WiringPiを使用する。

# 方法
WiringPiで準備されているSPIのモジュールを使って入出力を行うため、`wiringpiSPI.h`をincludeする。
初期設定のため`wiringPiSPISetup`を実行する。

`wiringPiSPIDataRW`で入出力をするのだが、LIS3DHは最初の1byteでアドレスとReadなのかを指定し、次の1byteで情報が帰ってくるというのがデータシートに書いてあるのが、最初は良くわからなかったorz

以下にサンプルコードを示す。

```spa_LIS3DH.c
/* SPI LIS3DH */

#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiSPI.h>

char outdat[3]={0x00,0x00,0x00};

int main(int argc, char *argv[])
{
  char c;
  int fd,data,out;

  /* WiringPi SPI Setup */
  fd=wiringPiSPISetup(0, 500000);
  if(fd<0){
    printf("SPI Open error!\n");
    return(1);
  }

  /* LIS3DH WHO_AM_I */
  outdat[0]=0x0F;
  outdat[0]|=0x80;//READ
    printf("%X ",outdat[0]);
  data=wiringPiSPIDataRW(0,outdat,2);
    printf("%X ",outdat[1]);
  if(outdat[1]==0x33) printf("I AM LIS3DH\n");
  else return(2);
  
  /* LIS3DH CTRL_REG1 */
  outdat[0]=0x20;
  outdat[1]=0x27;// 10Hz, normal mode
  data=wiringPiSPIDataRW(0,outdat,2);
  
  while(1){
    
    /* LIS3DH OUT_X */
    outdat[0]=0x28;
    outdat[0]|=0x80;//READ
    outdat[0]|=0x40;//increment address in multiple reading
    printf("%d ",outdat[0]);
    data=wiringPiSPIDataRW(0,outdat,3);
    out=(outdat[2]<<8 | outdat[1]);
    if(out>0x7FFF)out=out-0xFFFF;

    printf("OUT_X = %6d ",out);
    
    /* LIS3DH OUT_Y */
    outdat[0]=0x2A;
    outdat[0]|=0x80;//READ
    outdat[0]|=0x40;//increment address in multiple reading
    data=wiringPiSPIDataRW(0,outdat,3);
    out=(outdat[2]<<8 | outdat[1]);
    if(out>0x7FFF)out=out-0xFFFF;

    printf("OUT_Y = %6d ",out);
    
    /* LIS3DH OUT_Z */
    outdat[0]=0x2C;
    outdat[0]|=0x80;//READ
    outdat[0]|=0x40;//increment address in multiple reading
    data=wiringPiSPIDataRW(0,outdat,3);
    out=(outdat[2]<<8 | outdat[1]);
    if(out>0x7FFF)out=out-0xFFFF;

    printf("OUT_Z = %6d ",out);

    printf("\n");
    
    delay(100);
  }
  
  return(0);
}
```
IPAの情報処理技術者試験まとめ

### まえがき
IPAの出している情報処理技術者試験。持っているといって何かになるわけではない資格だが、所有している知識の証明になり、持っていて損はない資格だと思われる。ではどの試験を受けようかなと考えたとき、高度試験は数が多いのでまとめてくれてればいいのになあっと思ったので、まとめてみました（主観が入っているので注意）。
IPAのサイトに書かれている情報から抜粋したものなので、詳細は[IPA:情報処理技術者試験:試験区分](http://www.jitec.ipa.go.jp/1_11seido/seido_gaiyo.html)を参照してください。

<!--
生きていく上で手に職をつけておくと良いと聞く。では何があれば手に職をつけたと言えるのだろうか。一番わかりやすいのは資格だろう。公務員、司法書士、建築士、医師、看護師…なるためには資格が必要であり、資格があれば職に困ることはなくなるだろう。

ではSEは？
業務をする上ではITの知識・技術が必要であるのは間違いないが、なるために必要な資格はない。現在IT関係の資格には各種ベンダーが出している資格、IPAが出している国家資格があるが、どれも必須ではなく持っていれば良いくらいの資格である（公的機関のIT技術者に関しては必須）。今後の安心・安全で価値あるシステムを作っていく上で、IT技術者の資格整備をしっかり行っていってもらいたいものであるが、現在の情報処理技術者試験も持っていて損はないので取得しておこうと思う人もいるかもしれない。
-->

### 高度試験一覧

| 試験区分 | 略称 | 開催季節 |
|:--|:-:|:-:|
|ITストラテジスト|ST|秋|
|システムアーキテクト|SA|秋|
|プロジェクトマネージャ|PM|春|
|ネットワークスペシャリスト|NW|秋|
|データベーススペシャリスト|DB|春|
|エンベデッドシステムスペシャリスト|ES|春|
|情報セキュリティスペシャリスト|SC|春秋|
|ITサービスマネージャ|SM|秋|
|システム監査技術者|AU|春|
![taikei.png](https://qiita-image-store.s3.amazonaws.com/0/105279/6d0a21c4-704d-cfb9-e282-abb681d2d351.png)


### 取得者像
各資格を"マネージャ - エンジニア"軸と"経営 - 現場"軸で見たときの立ち位置をプロットしてみました。
![exam.png](https://qiita-image-store.s3.amazonaws.com/0/105279/fc18cb28-b6c8-32ed-4a6e-558f14011761.png)

### 受験者数・合格率
平成27年のデータをもとにグラフ化しています。
![passrate.png](https://qiita-image-store.s3.amazonaws.com/0/105279/61bec94b-99c6-6e42-5a65-16107dc31079.png)

### 所感
* 合格率はどれも同程度なので、取得したい資格という視点だけで受験すれば良い。
* スペシャリスト系資格(SC, DB, NW, ES)は単純に技術知識に対する資格なので、特に肩書きのないSEはこれらの資格をとりあえず取得すれば良い。
* その他の資格は自身の（目指す）肩書きにあたる資格を取得するのが良い。

### おまけ
試験区分に書いてあるサブタイトル的なものがかっこよかったので、転載しておきます。

* [ITストラテジスト](http://www.jitec.ipa.go.jp/1_11seido/st.html)
 * 経営とITを結びつける戦略家
* [システムアーキテクト](http://www.jitec.ipa.go.jp/1_11seido/sa.html)
 * 業務とITのグランドデザイナー
* [プロジェクトマネージャ](http://www.jitec.ipa.go.jp/1_11seido/pm.html)
 * ITプロジェクトの成功請負人
* [ネットワークスペシャリスト](http://www.jitec.ipa.go.jp/1_11seido/nw.html)
 * ネットワーク社会を担う花形エンジニア
* [データベーススペシャリスト](http://www.jitec.ipa.go.jp/1_11seido/db.html)
 * ビッグデータ時代に求められる、データ志向の担い手
* [エンベデッドシステムスペシャリスト](http://www.jitec.ipa.go.jp/1_11seido/es.html)
 * 組込みシステムの腕利きエンジニア
* [情報セキュリティスペシャリスト](http://www.jitec.ipa.go.jp/1_11seido/sc.html)
 * ITの安全・安心を支えるセキュリティの番人
* [ITサービスマネージャ](http://www.jitec.ipa.go.jp/1_11seido/sm.html)
 * 情報システムの安定稼働を約束する仕事人 
* [システム監査技術者](http://www.jitec.ipa.go.jp/1_11seido/au.html)
 * 独立した立場でITを監査する御意見番
PythonでURLリストから画像ダウンロード

# PythonでURLリストからファイルダウンロード

以下の記事で特定のWEBサイトをクロールしてURLのリストができてきたので、それをダウンロードするコードを書いてみました。

[BeautifulSoup4でWEBスクレイピング（連番ページ）](http://qiita.com/shngt/items/d4fa9c4231aab09145d9)

[BeautifulSoup4でWEBスクレイピング（階層化ページ）](http://qiita.com/shngt/items/3a32e5cc439d5277f7af)

## ソース

```python:simple_downloader.py
# -*- coding: utf-8 -*-

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import requests, os

headers = { 'User-Agent' : 'Mozilla/5.0' }
cwd = os.getcwd()
result_dir = cwd + '/download/'
list_file = cwd + '/list.txt'
done_file = 'done.txt'
fail_file = 'fail.txt'

def fetchImage(url):
    path_relative = url.replace('http://', '').replace('https://', '')
    try:
        res = requests.get(url, headers = headers)
        image = res.content
        paths = os.path.split(path_relative)[0].split('/')
        path_current = result_dir
        for path in paths:
            path_current += path + '/'
            if not os.path.exists(path_current):
                os.mkdir(path_current)
        with open('{result_dir}{path_relative}'.format(result_dir = result_dir, path_relative = path_relative), 'wb') as f:
            f.write(image)
    except:
        return False
    return True

def getUrl():
    result = ''
    with open(list_file, 'r') as f:
        url_list = f.read().split('\n')
    result = url_list.pop(0)
    with open(list_file, 'w') as f:
        f.write('\n'.join(url_list))
    return result

def saveUrl(file_name, url):
    with open(file_name, 'a') as f:
        f.write(url + '\n')

def download():
    url = getUrl()
    while url != '':
        if fetchImage(url):
            saveUrl(done_file, url)
            print('done ' + url)
        else:
            saveUrl(fail_file, url)
            print('fail ' + url)
        url = getUrl()

download()
```

## 参考にしたサイト

[pythonで特定のURLから画像を一括ダウンロード修正版](http://qiita.com/fantm21/items/8b963a0c973057f0984a)
[[Python]ファイル/ディレクトリ操作](http://qiita.com/supersaiakujin/items/12451cd2b8315fe7d054)
Powershell - 良く使っているコマンドレットまとめ中

カレントディレクトリ配下のテキストファイル内の文字列を検索

```
function Search-StringAllFiles{
    param(
        [parameter(mandatory)][string]$Pattern,
		[string[]]$Exclude = @("*.exe","*.dll","*.xlsx","*.xlsm","*.ppt","*.docx","*.jar","*.zip")
    )
	Get-ChildItem -Recurse -Exclude $Exclude | Select-String $Pattern
}
Set-Alias grep Search-StringAllFiles
```

カレントディレクトリ配下のディレクトリサイズを一括取得

```
function Get-DirectorySize{
Get-ChildItem -Force -Directory `
    | Select-Object Name, @{ name = "Size(MB)"; expression = { `
            [math]::round((Get-ChildItem $_.FullName -Recurse -Force `
                | Measure-Object Length -Sum `
            ).Sum /1MB ) `
    } }
}
Set-Alias ds Get-DirectorySize
```

カレントディレクトリのファイル名を一括置換

```
function Rename-AllFiles{
    param(
        [parameter(mandatory)][string]$search,
        [parameter(mandatory)][string]$replace
    )
    Get-ChildItem -File | %{ $newname = $_.Name -replace $search,$replace; Rename-Item $_ $newname }
}
Set-Alias rn Rename-AllFiles
```
git checkoutで特定のファイルをチェックアウトする

何かの手違いで管理対象のファイルを失ってしまった場合、
そのファイルだけ取得することができる。

HEADのファイルも取得できるし、ある時点のファイルも取得できる。

```
git checkout コミットID file_path
```

ディレクトリのパスを指定すると、そのディレクトリ配下のファイルを全てチェックアウトすることもできる。

```
git checkout コミットID directory_path
```

仕事でやらかしてしまった時は落ち着いて復元しよう。
githubでgemのテスト

# githubでgemのテストができました。
[ruboty](https://github.com/r7kamura/ruboty)という、rubyで書かれたbotを使い始めました。
機能追加にはgemで追加するということで、gemの勉強をしました。
gemの作成方法は記載あるのですが、実際にgemとして使うテストの方法が見当たらず、見つけたのが[GistでGemを公開する](http://qiita.com/r7kamura/items/5e7d082d8e0d0471d71d)。
さすがにテスト的なgemを作って、本家に登録するわけにはいかないので、Gistなら行けそうと思った。ただGistで公開した後の使い方を見ると、
```
gem "my-gem-name", git: "https://gist.github.com/1234567890abcdef1234.git"
```

ん、これだったらgithubのリポジトリを参照するだけでよいのでは？と思って、ruboty用に作ったテスト用のgem [ruboty-hello](https://github.com/takus69/ruboty-hello)。これをGemfileに以下の記載でrubotyに取り込むことができました。
```
gem "ruboty-hello", git: "https://github.com/takus69/ruboty-hello.git"
```

これだったら、gemのテストをするときや、個人的なgemを発行するときはこれで十分だと思いました。まあ当たり前のことなのかもしれませんが、gemを初めて作る人の一助いなれば幸いです。
【Unity】Transformの回転設定速度比較

Transform の回転設定の方法は色々あるがどれが最速なのか検証

#【検証環境】
・Unity5.3.5f1（Personal Edition）
・Nexus7(Android 5.0.2)
・10万回試行した際にかかった時間を比較

#検証項目
①QuaternionをEulerから計算して設定
②QuaternionをAngleAxisから計算して設定（回転軸キャッシュ版）
③QuaternionをAngleAxisから計算して設定（回転軸簡易取得版）
④Transformに直接Euler角を設定

#検証コード
```
	float prevTime, nowTime;
	int count = 100000;					// 10万回試行
	Transform trans = this.transform;	// Transform参照処理が含まれないようにする
	Vector3 axis = Vector3.up;			// ※今回回転軸の計算処理は含めない
	
	prevTime = Time.realtimeSinceStartup;
	for (int i = 0; i < count; ++i)
		trans.localRotation = Quaternion.Euler(0f, 0f, 0f);
	nowTime = Time.realtimeSinceStartup;
	Debug.LogWarning("Quaternion Euler : " + (nowTime - prevTime));
			
	prevTime = Time.realtimeSinceStartup;
	for (int i = 0; i < count; ++i)
		trans.localRotation = Quaternion.AngleAxis(0f, axis);
	nowTime = Time.realtimeSinceStartup;
	Debug.LogWarning("Quaternion AngleAxis(Cache) : " + (nowTime - prevTime));
			
	prevTime = Time.realtimeSinceStartup;
	for (int i = 0; i < count; ++i)
		trans.localRotation = Quaternion.AngleAxis(0f, Vector3.up);
	nowTime = Time.realtimeSinceStartup;
	Debug.LogWarning("Quaternion AngleAxis : " + (nowTime - prevTime));
			
	prevTime = Time.realtimeSinceStartup;
	for (int i = 0; i < count; ++i)
		trans.localEulerAngles = new Vector3(0f, 0f, 0f);
	nowTime = Time.realtimeSinceStartup;
	Debug.LogWarning("Transform Euler : " + (nowTime - prevTime));
```

#結果
①Quaternion Euler
　　　0.05273438
②Quaternion AngleAxis(Cache)
　　　0.03561401
③Quaternion AngleAxis
　　　0.03945923
③Transform Euler
　　　0.03509521

#総評
Euler指定の場合はQuaternionをはさまずに直接指定した方が速い
またTransformに関わらずQuaternionを求める場合はEulerよりAngleAxisで求めた方が速かった
Windows 7 を今更使うためにDSP版を買ったあとにやったこと

# きっかけ

あるソフトを使う際にWindows 7が必要だった。

しかしそのソフトを使う環境として適したWin7は手元になかったので、秋葉原で在庫少なめになっているWin7を買うこととなった。

OS X El CapitanのVirtualBox上でWin7のVMを扱いつつ、将来的にはWin10に乗り換えることも視野に置いて初期設定を行う。

本記事の賞味期限は2016/7/28までとなる。7/29のいずれかの時点でWindows 10への無償アップグレードは行えなくなるとのこと。

とはいえ、それ以後有償で更新する場合にも一部は役に立つかもしれない。

# DSP版64bitsを買う

ソフト動作をそこそこ急ぎで行う必要があったことから即秋葉原へ向かった。そこまで急がなければ、Amazonで買っても問題はないと思う。

以前から店頭でのWin7 64bitsの在庫が減っているのは認識していたが、やはり少しだけ苦労した。32bitsのを買うのは気が引ける。

秋葉原で言えばツクモは64bitsについて「入荷待ち」。多分二度と入荷しないのではないか。

今回はパソコンショップアークで購入。イベント「技術書典」でお世話になった通運会館の横である。Homeは売り切れていてProfessional。DSP版なので一緒にパーツを買う必要があるわけだけど、店側の工夫でこの点は気にする必要はない。どの店もここらへんはわきまえているはず。

# Win7の更新プログラム適用がめっちゃ遅い

購入直後の環境でとりあえず一連の更新プログラムを適用するが、(当たり前だが)この更新が非常に遅い上、完了見込み時刻が出てこないため、困る。

1〜2つ程度先にマニュアルで更新プログラムを当ててから行うと少し速くなるようだ。

http://freesoft.tvbok.com/tips/windows_update/microsoft_solutions_documents.html

半日を経て全ての更新プログラムが当たった。更新後リブートは勝手にするお節介がここでは役に立つ。深夜に放置しとけば翌朝再起動後のログイン画面に戻っているはずだ。

# Win10更新時にライセンス認証が聞かれる……

インストールしてOS更新した直後ではWin7自体がサーバとライセンス認証を行っていないことがある。

この状況でWin10のアップグレードを行うと、方法によってはWin10インストールウィザードの中途で黙って「ライセンスキー」を聞かれる。典型的にはWin10のisoをマウントしてsetup.exeを実行するとそれなりに長々と待たされたあげく、ここで先に進めなくなる。

決して画面に書かれているわけではないが「あなたのWindows、海賊版ですね？」と、暗に責められているかのようである。

このキーは購入した直後のWin7のキーではいけないようであった。ネットではWin7のキーも受け付けるなどという説明もあるのだけど、本件とは関係がない。

一度、Win7上でライセンス認証を行い、Microsoft側サーバのお墨付きを得てからWin10アップグレードを試みればこの問題は発生しなくなる。

なお、Microsoftのサイトから辿れるアップグレードサポートのソフトだと、この点がわかりやすく説明されるので、それで気づいた。Win10を導入する方法には何パターンかあり、自分が見た3パターン中、注意事項でこの問題を把握できる説明が表示されたのは1パターンのみだった。

## おまけ: Win8.1環境でVirtualBoxのビデオドライバがWin10への更新をサポートしていない問題

本件では並行して自分が持っている別のWin8.1環境についても更新をかけた (こちらは8には戻すつもりはない)。その際に表題の件でハマった。

結論としてはVirtualBoxのGuest Additionを消して再起動すれば、はまらなくなる。手動でビデオドライバを消すと、Guest Additionが再度勝手に同ドライバをインストールするため、意味が無い。

# ディスク容量が小さすぎた

Win7をインストールする環境のディスクサイズをVMレベルで32GB程度にしたのだが、更新後の状態でWindows7本体が30GB弱食い尽くしていた。

Win10へのアップグレードには10GB程度追加で必要とのこと。この10GBは外部ディスクでも良いらしいが、今後のことを考えれば32GBのCドライブでなんとかするという発想自体が問題であるため、ここでディスクを拡張することにする。

この時、何を勘違いしたか採用したディスク形式はqcowであった。KVMで使うつもりならまだしも今回はそんなつもりはないので、無駄。

VBoxManageはqcowに対応していないのでqemu-imgが必要。qemuをbrewにてインストール、qemu-img convertでvdiに変換し、VBoxManage modifyhdにて--resizeする。

最終的にはvdi 50GBとした。

## --resizeしてもWindowsレベルでディスクの拡張が確認できない場合

32GB -> 50GBとしてVirtualBoxはそれを認識しているが、Windows本体から見るとCドライブの大きさが変わっておらず、NTFSのパーティションを拡張することも出来ない、という症状に悩まされた。

結論としては、スナップショットをとっている環境では--resizeをしてもWindowsがサイズ変更を認識しないため、NTFSのパーティションを拡張することも出来ないようだ。それが原因だと思われた際にはスナップショットを消して試す。

参考: http://dust-memorys.blogspot.jp/2013/02/virtual-box.html

スナップショットの代わりに、ディスクのバックアップはVBoxManage clonemediumあたりでやっておくと良いかもしれない。あるいはVM自体をクローンして試しても良い。

# Win10へアップグレード後、すぐWin7へ戻す

ここの説明は巷に溢れてるので敢えてするまでもない。

旧環境に戻すまで31日の猶予があるとのことだが、今回はそもそもWin10へのアップグレード権を確保しておくために更新している。すぐにWin7戻したほうがトラブルは少ないだろう。

Win7への復旧でトラブルはなかった。Win10更新後にパスワードを変更したりしてWin7に戻すと、おそらくWin10上のパスワード変更をWin7は認識していないため古いパスワードが必要になる。そういったちょっとした面も含めて、さっさと戻すに限る。

Win7へ戻した後、適当なセキュリティソフトを入れて、無事当初の目標を達成、ソフトを使える状況を構築できた。急ぎだというのに、結局2日程度潰した。
今さらやけどGitHub使ってみた。

GitHubってすごい!
でも英語がちょっと苦手…
だから自分なりにまとめてみた。

#すばらしさ 1 ファイル形式の使用度がわかる

これにはとても驚いた。自分のサイトのHTMLファイルをGitHubで管理しているが、どのようなファイルがなん%使われてるかというのがわかりやすくていい。

#すばらしさ 2 Gistが意外と使える

Gistで今まで投稿したQiitaのコードの部分が抜粋されていてとても良い。

#すばらしさ 3 Commitでファイルの更新がわかりやすい

これにもとても驚いた。自分が一括アップロードしたファイルが英語なのにわかるようになっているのがやさしい。

#わからない点

* Issueとは？
    * ほかの部分がわかるのに、なぜかこの部分だけ分かりずらい。 
* Via appload とは？
    * windowsなのでViaはつかえないし、普通にドラッグアンドドロップしただけなのに…

#感想

なぜ今までアカウントだけ取得して放置していたのだろうか?というぐらいにとてもいいサービスだった。
Visual Studioのショートカットなど使い方メモ

Windows x Unityでの開発ではVisual Studioを使っているので、ショートカットや使い方なんかをメモしていきます。随時更新。（ていうか、ショートカットがなんか独特な気がするのは俺だけ？( ;´Д`)）

## ショートカット

*※ `Ctrl + hoge, Ctrl + fuga` と書かれている箇所は、連続で入力すると実行される。*

- 定義元を見る ... `F12`
- 参照元をすべて表示 ... `Shift + F12`
- コメントアウト ... `Ctrl + K, Ctrl + C`
- アンコメントアウト ... `Ctrl + K, Ctrl + U`
- 前の位置に戻る ... `Ctrl + _`
- 次の位置に進む ... `Shift + Ctrl + _`
- ブックマークする ... `Ctrl + K, Ctrl + K`
- クイック起動 ... `Ctrl + Q`
メニューなどを文字列で検索して実行できる。
- ファイル間移動 ... `Ctrl + ,`
クラスやファイルなど、様々なものを検索、移動ができる。
- 選択行の移動 ... `Alt + 矢印キー`
選択した行をそのまま上下に移動することができる。
- アウトラインの展開・折りたたみ ... `Ctrl + M, Ctrl + M`
- すべてのアウトラインの展開・折りたたみ ... `Ctrl + M, Ctrl + L`

## VsVimの設定

VsVimはVisual StudioをVim風に操作できるプラグインです。
これに、元々すでにいくつかのショートカットが存在しているので、それのメモ。

- 定義元を見る ... `gd`
- 次のタブに移動 ... `gt`
- 前のタブに移動 ... `gT`

### VsVimの.vimrc

ユーザのホームディレクトリに `.vimrc` を配置します。
基本的な書き方は通常のVimと同じだと思います。
Visual Studio向けの特殊な部分については以下のようにすることで対応できそうです。

```
nmap <C-O> :vsc View.NavigateBackward<CR>
nmap <C-I> :vsc View.NavigateForward<CR>
nmap gD :vsc Edit.FindAllReferences<CR>
nmap gi :vsc Edit.GoToImplementation<CR>
nmap gh gT
nmap gl gt

// ナビゲーションバーをフォーカスする
nmap <space>fs :vsc Window.MoveToNavigationBar<CR>
nmap <space>fo :vsc Window.KeepTabOpen<CR>
```

あと、 `Ctrl` を使う場合、Visual Studio側でそのショートカットをVsVimで使うように設定しないとならないので注意が必要です。

その他の設定は[こちら](https://github.com/jaredpar/VsVim/wiki/Settings-Reference)。


## おすすめ拡張機能など

- [Indent Guides](https://marketplace.visualstudio.com/items?itemName=SteveDowerMSFT.IndentGuides)
- [C# outline 2015](https://marketplace.visualstudio.com/items?itemName=Skybladev2.Coutline2015)
- [IntelliCommand](https://marketplace.visualstudio.com/items?itemName=DenGladkikh.IntelliCommand)
- [Hide Main Menu](https://marketplace.visualstudio.com/items?itemName=MatthewJohnsonMSFT.HideMainMenu)
- [Visual Studio 2015 Color Theme Editor](https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.VisualStudio2015ColorThemeEditor)
- [Shader Unity Support](https://marketplace.visualstudio.com/items?itemName=MarcinODev.ShaderUnitySupport)
- [Viasfora](https://marketplace.visualstudio.com/items?itemName=TomasRestrepo.Viasfora)
ScalaでTree構造を表現するためのクラス

同一型のみによるTree構造は結構簡単。
Dot(節点)とLine(辺)の2種類のクラスからなるTreeはちょっと工夫する必要がある。

```scala
case class Dot[D, L](value: D, lines: Line[L, D]*)
case class Line[L, D](value: L, dot: Dot[D, L])
```
型クラスを使うとこういう構造が表しやすい。
Realtek AmebaのSPIを使う

Realtek AmebaのSPIを使ってみました。

# まとめ
* Realtek AmebaのSPIのAPIはmebd HAL準拠のAPIとして提供される。
* SPIマスタとSPIスレーブの両方をサポート


# 準備
* コンパイラはlaunchpadからarm-none-eabi-gccをインストールしてください。
* SDKはgithubにある https://github.com/eggman/rtl_ameba_gcc_sample を使います。

# SPIのAPI 
* ROM内蔵HALのAPIとmbed halのAPIとmbed 拡張halのAPIがあります。
* ROM内蔵HALは情報が不足しているのでよくわかりません。
* mbed拡張HALは今回のSDK環境に入っていないので、また別の機会に説明します。
* mbed halのSPIについて説明していきます。

# mbed HAL SPI
* sdk/src/sw/lib/sw_lib/mbed/hal/spi_api.h がAPIのヘッダファイルです。
* このAPIのソースコードは https://github.com/neojou/arm-gcc-blink-example/blob/master/src/sw/lib/sw_lib/mbed/targets/hal/rtl8195a/spi_api.c にあります。

```c
void spi_init         (spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel);
void spi_free         (spi_t *obj);
void spi_format       (spi_t *obj, int bits, int mode, int slave);
void spi_frequency    (spi_t *obj, int hz);
int  spi_master_write (spi_t *obj, int value);
int  spi_slave_receive(spi_t *obj);
int  spi_slave_read   (spi_t *obj);
void spi_slave_write  (spi_t *obj, int value);
int  spi_busy         (spi_t *obj);
```
## spi_init()
* SPIの初期化、４つの端子 MOSI MISO SCLK CSを設定する。

## spi_free()
* SPIの解放。 端子割り当てが解放されるっぽい。

## spi_format()
* bits １転送単位のbit幅を指定、通常は8
* mode 0-3のSPIモードを設定
* slave 0ならマスター、1ならslave

## spi_frequency()
* SPIマスターの場合に、SPICLKの周波数を設定する。 SPIブロックに供給されているクロックの分周器の設定。

## spi_master_write()
* SPIマスター動作時に使う valueをSPIスレーブに書き込み、読み込んだ値を戻り値として返す。
* １転送単位ごとに、自動的にCSが無効→有効→無効となります。 マルチ転送したい場合は、CSを別途GPIOで制御が必要。

## spi_slave_reeive()
* SPIスレーブ動作時に使う 受信バッファにデータがあるか確認する 0：データなし、0以外：データあり

## spi_slave_read()
* SPIスレーブ動作時に使う 受信バッファを読みだし、値を戻り値として返す。

## spi_slave_write()
* SPIスレーブ動作時に使う 送信バッファにvalueを設定する。

## spi_busy()
* SPIを使用中かどうか確認する。0:空いてる 0以外:使用中


# サンプルコード
* SPIマスタの動作を確認してみたときのコードです。
* CSがLowになり、SPIクロックが送信され、8バイトのデータが送信されることを確認しました。

```c
#define SPI0_MOSI  PC_2
#define SPI0_MISO  PC_3
#define SPI0_SCLK  PC_1
#define SPI0_CS    PC_0

    spi_t spi_master;

    spi_init(&spi_master, SPI0_MOSI, SPI0_MISO, SPI0_SCLK, SPI0_CS);
    spi_format(&spi_master, 8, 0 , 0);
    spi_frequency(&spi_master, 20*1000*1000);

    spi_master_write(&spi_master, c);
```


# Ameba の SPI の HWについて
* AmebaのSPIの中身はSynopsys Design Ware SSIです。
* Synopsys Design Ware SSI は Altera の FPGA Cyclone Vに載っていて、Alteraから詳しいマニュアルが入手できます。
* https://www.altera.com/en_US/pdfs/literature/hb/cyclone-v/cv_5v4.pdf

# その他
* spi_frequency(20000000)と20MHzを設定した場合の実際のクロックをロジアナで測定したところ5MHzでした。
 * 内部のバスクロックを分周しているので、元のバスクロックが低いのか、SPIの分周を設定しているレジスタ baudrのsckdvの設定が正しくないのかもしれません。
 * 調べてみたところ、baudrのsckdvが8に設定されており、40/8 = 5MHzになっていました。

```c
    DiagPrintf("SSI0 SCKDV %x\r\n", HAL_READ16(SSI0_REG_BASE, REG_DW_SSI_BAUDR));
```
を実行すると

```
SSI0 SCKDV 8
```
と表示されました。

 *　下記のコードをしたらbaudrのsckdvが2となり 20MHzで動くようになりました。SDKのlib_platform.aに含まれているspi_freq()に問題があるようです。

```c
    PHAL_SSI_ADAPTOR pHalSsiAdaptor;
    PHAL_SSI_OP pHalSsiOp;

    pHalSsiAdaptor = &pspi->spi_adp;
    pHalSsiOp = &pspi->spi_op;

    pHalSsiAdaptor->ClockDivider = 2;
    pHalSsiOp->HalSsiInit(pHalSsiAdaptor);
```

* 上記で説明したAPIはポーリング動作のようです。
 * 割り込みやDMAを使ったAPIがmed拡張APIで定義されいます。
PHPでWebスクレイピングするときのエージェント設定

最近PHPでWebスクレイピングすることが多くなって少し困ったことをがあったので解決法も書きます

`<?php
               $url='http://example.com // 参照URL
$websc = file_get_contents($url.$input_data);
?>`

大概のサイトはこれだけでソースは持ってこれるのですがまれにエージェントがないとダメなサイトがあったのでゴニョゴニョいじってたら下記の感じで行けました。

`<?php
               $url='http://example.com // 参照URL
                    $context = stream_context_create(array(
                    	'http' => array(
                    		'method' => 'GET',
                    		'header' => 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
                    	)));
$websc = file_get_contents($url.$input_data,false,$context);
?>`

ただ単にcontextにエージェント情報を入れただけですね
これだけで出来たので何かの役に立てばと

では
eclipseの環境作成

#概要
Web開発でeclipseを利用する際，インストールしたときにやることをまとめました。
eclipse neonが登場したので，そのときに行った作業を中心に記します。

#環境
- Windows 10

#Preference
- Gitのデフォルトリポジトリフォルダをワークスペースフォルダに変更
    - Preferene->Team->Git
- 文字コード変更
    - Preferene->General->Workspace
- tab文字を可視化
- 1行80文字ラインを表示
    - Preference->General->Editors->Text Editors

#Install
## [SmartyPDT](https://code.google.com/archive/p/smartypdt/wikis/InstallSmartyPDT.wiki)
- smartyファイルのシンタックスハイライト

## [Eclipse Color Theme](https://marketplace.eclipse.org/content/eclipse-color-theme)
- eclipseのカラーテーマを変更
Slackで参加ユーザーに関する情報(アバター画像等)を取得する方法


## やること

slackに参加しているユーザーの情報を取得したいので，slackのユーザー情報をjson形式で取得する。

## 手順

まず，ユーザー情報を取得したいslack groupのtest tokenを確認します。

[Test token generator](https://api.slack.com/docs/oauth-test-tokens)

![Tokens_for_Testing_and_Development___Slack.png](https://qiita-image-store.s3.amazonaws.com/0/102294/18579599-586c-f264-8fb5-287d04fdc4c3.png "Tokens_for_Testing_and_Development___Slack.png")

取得したtokenを元に以下のURLから，ユーザー情報をjson形式で取得できます。

``` https://slack.com/api/users.list?token=SLACK_TOKEN&pretty=1 ```

## 結果

![slack_api.png](https://qiita-image-store.s3.amazonaws.com/0/102294/80fc9fc6-6844-b426-0ecc-21d9a1624107.png "slack_api.png")


各メンバーごとのprofileのimage_xxがアバター画像となっています。
また，botかどうかや権限の有無の情報も含まれています。
CentOS7でのDockerコンテナのcgroupディレクトリ

```shell-session
$ docker run -d -m 512m centos:latest /bin/bash
```

```shell-session
# memoryの場合
$ cat /sys/fs/cgroup/memory/docker/${container_id}/memory.limit_in_bytes
```

Ubuntuとかだとまた違うディレクトリにあるらしい。
R: スクリプトで日本語を使わずに日本語を使う

Rで、スクリプト内に日本語があると時々不都合がでるので、次のような方法で対応しています。

```r
# R
intToUtf8(c(12371, 12435, 12395, 12385, 12399))
## [1] "こんにちは"
```

欲しい文字がどの番号に対応しているには

```r
# R
utf8ToInt("こんにちは")
[1] 12371 12435 12395 12385 12399
```
一旦調べて、スクリプトには日本語を使わないで表記するようにしています。


Pythonで調べる方法もあります。

```py3
# python3
[ord(s) for s in "こんにちは"]
## [12371, 12435, 12395, 12385, 12399]
```

python2系の場合は u"" が必要です。

```py
# python2
[ord(s) for s in u"こんにちは"]
## [12371, 12435, 12395, 12385, 12399]
```

-------------
### 追記（thanks: @shiracamus）

Rでもユニコード指定することができるようです。

```r
"\u3053\u3093\u306b\u3061\u306f"
## [1] "こんにちは"
```

コードは16進数で指定するものなんですかね。
16進数の対応コードを得る方法は色々あります。

Rでは、こんな感じ。

```r
# R
sprintf("%x", utf8ToInt("こんにちは"))
[1] "3053" "3093" "306b" "3061" "306f"
```

Pythonではhexを使えます。

```py3
# python3
[hex(ord(s)) for s in "こんにちは"]
['0x3053', '0x3093', '0x306b', '0x3061', '0x306f']
```

----------------
### 追追記

ちなみに、Rのパッケージに組み込む場合に、関数定義内で"\u..." 形式の文字列を使用すると、以下の警告が出るようです。

```
plotat.Rd: non-ASCII input and no declared encoding
```

全角文字をRヘルプ内で使うのは推奨しないということのようです。
Dockerで作業する用のストレージ領域を準備する



単純にUbuntuのvagrantのbox引っ張ってくると
ストレージサイズが10GBくらいしかなくて何にもできないので、ストレージをくっつける。

# デバイスの準備

適当にvirtualboxで対象の仮想マシンに仮想ディスクをくっつける。100GBとかでええんでない??

# フォーマット

対象のデバイスファイルが/dev/sdbだったので、
ext4でフォーマットする。必要なら適当にsdb1なりなんなり作ってくらはい。

```Bash:フォーマット
sudo mkfs -t ext4 /dev/sdc
```
mkfs -t ext4の代わりに、mkfs.ext4でもいいよ。
好みの問題。

ここを真面目にやるならlvmのボリュームでもなんでも作れば
幸せになれると思います。

マウントできるように/etc/fstabを編集。
/etc/fstab上に/optに/dev/sdcをマウントするよう設定。


```txt:/etc/fstab編集
/dev/sdc	/opt	ext4	defaults 0 0

```

ここも色々と細かく設定できるけど面倒なのでシンプルに。
Perlで :innocent: を 😇 に変換する 〜Slackの絵文字対応〜

# はじめに

最近, Slackが大流行していますね.
社内のコミュニケーションのためのチャットツールとしてはもちろん, それ以外の趣味やOSSなどのコミュニティでも活用されるパターンが増えてきていて, 何かしらの形でSlackを使ったことがある! という方は多いのではないでしょうか?

...さて, Slackはチャットという文章によるコミュニケーションを活発にするために, 様々な機能を提供していますが, その1つが｢絵文字｣です.
例えば, `:innocent:`を含むテキストを送信すると, Slackは自動的に😇に変換して表示してくれます:

![slack.gif](https://qiita-image-store.s3.amazonaws.com/0/737/cea67656-4e25-e709-ff05-839a4afd3f77.gif)

**非常に便利ですね.**

さて, Slackの流行に伴って, Slackが提供する｢キーワードと絵文字の対応｣(`:innocent:`と😇, `:+1:`と👍など)が定着してくると, **開発しているサービスに, この変換機能を搭載したい**と思う事もあるのではないでしょうか? 私は思いました.

そういう時に便利なPerlのCPANモジュールが, 今回ご紹介する[Text::SlackEmoji](https://metacpan.org/pod/Text::SlackEmoji)です.

# 使い方

[SYNOPSIS](https://metacpan.org/pod/Text::SlackEmoji#SYNOPSIS)に書いてあるとおりです. `Text::SlackEmoji->emoji_map`で, ｢キーワード｣をkey, ｢絵文字｣をvalueにしたハッシュリファレンスを取得することができるので, 後は正規表現で｢キーワード｣を取得して, ｢絵文字｣に置き換えていくだけです:

```perl
use strict;
use warnings;

use Text::SlackEmoji;

my $message = 'Hello! :innocent: :+1: :bow:';
my $emoji_map = Text::SlackEmoji->emoji_map;

$message =~ s!:([-+a-z0-9_]+):!$emoji_map->{$1} // ":$1:"!ge;

print "$message\n"; # => Hello! 😇 👍 🙇
```

# まとめ

Perlで, Slackのメッセージにおける`:innocent:` -> 😇 のような変換を実現する, Text::SlackEmojiを紹介しました.
かなりニッチなモジュールではありますが, Slackが流行している昨今, 覚えておくとふとしたタイミングで使えそうなモジュールだと思います. 是非ご活用下さい.
UnityでAndroidにビルドして実行をするとノイズが走るように見える問題

下の画像がUnityEditor上で動作している画面です。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/127761/f52d0cd1-5a4f-ec6d-125d-5e346e52051d.png)

次がAndroidに実機ビルドして実行した画面です。

![S_4586827258869.jpg](https://qiita-image-store.s3.amazonaws.com/0/127761/4f512153-210b-1290-e3c8-e96fd4223839.jpeg)

ちなみに環境は
Unity5.3.5
Android4.4.2
XperiaZ SO-02E
となっております。

最初の画像と比較すると、Androidの画像は画面が分割されすぎていることがわかるかと思います。
それが複数に重なりノイズのようになっているのでしょう。

またEditorの画面を見た人でわかる人もいるでしょうが、カメラを設置しておりません。
実は、ここが重要なのです。**カメラの有無が正常に描画できるかどうかのようです。**

以下がカメラを追加してEditorで実行した画面です。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/127761/d64d6c25-a50f-a10d-cd7d-7a7ae5c893eb.png)

次にカメラを追加してAndroidで実行した画面です。
![S_4586858200546.jpg](https://qiita-image-store.s3.amazonaws.com/0/127761/b9942bd5-377a-b914-b7e3-20f85efcca37.jpeg)

同じ端末ですが正常に動作しました。すごく基本的ですがUnityで何かを制作するときはカメラを忘れずに追加しておきましょう。

ちなみに、この問題は機種依存をするので機種によっては起こりません。
自分の知っている限り、SH-02Eは起こりませんでした。
Docker環境でstrace


starceしようとしたらエラーになったので。

> root:/# strace /bin/ls
> strace: ptrace(PTRACE_TRACEME, ...): Operation not permitted
> +++ exited with 1 +++

ぐぐれば何か出てきますよね。。。

* [» Running Strace in Docker](http://blog.johngoulah.com/2016/03/running-strace-in-docker/ "» Running Strace in Docker")

起動オプションを追加すればよいようです。

```
--security-opt seccomp:unconfined
```

このオプションを追加したコンテナでstraceを実行すると

> root@aca47db0b5ff:/# strace /bin/ls
> execve("/bin/ls", ["/bin/ls"], [/* 9 vars */]) = 0
> brk(NULL)                               = 0x72f000
> access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
> mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbbdf0de000
> access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
> ...
[undefined method `for' for・・・]deviseのストロングパラメーターが編集出来ないエラー。

#概要
gem deviseにおいて、configure_permitted_parametersメソッドを作る。その中ではdevise_parameter_sanitizerメソッドを使いストロングパラメーターを編集する。この見慣れた光景でエラーが起きる。**undefined method `for' for・・・**というエラー。調べてみるとバージョン4.1.0以降からdeviseの仕様が変わったらしい。
![スクリーンショット 2016-07-10 11.28.18.png](https://qiita-image-store.s3.amazonaws.com/0/114543/9e3713c8-05cd-9c65-cf76-9515d3623198.png)


#解決方法

gem deviseの[github](https://github.com/plataformatec/devise)のStrong Parametersを見ましょう。そうすると、下記のような記述にしろと言われてる。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
  end
end
```

つまり、
僕の記述の場合は、これから
>   devise_parameter_sanitizer.for(:account_update).push(:firstname, :secondname, :nickname, :introduction, :job, :age, :avatar, :local)

こうしろということですね。

>    devise_parameter_sanitizer.permit(:account_update, keys: [:firstname, :secondname, :nickname, :introduction, :job, :age, :avatar, :local])

はい、無事動きました。
DatadogをIAM role設定で導入する

IAMの画面を操作したことのある人向けにDatadogのRole設定について説明します。
Role設定にすることでDatadog上にアクセスキー、シークレットキーを配置する必要がなくなり、セキュアになります。

# ポリシーの作成

はじめにIAMの画面からポリシーを作成します。ポリシーは以下となります。
仮にDatadog_Integrationという名前とします。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "autoscaling:Describe*",
        "cloudtrail:DescribeTrails",
        "cloudtrail:GetTrailStatus",
        "cloudwatch:Describe*",
        "cloudwatch:Get*",
        "cloudwatch:List*",
        "dynamodb:list*",
        "dynamodb:describe*",
        "ec2:Describe*",
        "ec2:Get*",
        "ecs:Describe*",
        "ecs:List*",
        "elasticache:Describe*",
        "elasticache:List*",
        "elasticloadbalancing:Describe*",
        "elasticmapreduce:List*",
        "elasticmapreduce:Describe*",
        "iam:Get*",
        "iam:List*",
        "kinesis:List*",
        "kinesis:Describe*",
        "logs:Get*",
        "logs:Describe*",
        "logs:TestMetricFilter",
        "rds:Describe*",
        "rds:List*",
        "route53:List*",
        "ses:Get*",
        "sns:List*",
        "sns:Publish",
        "sqs:GetQueueAttributes",
        "sqs:ListQueues",
        "sqs:ReceiveMessage",
        "support:*"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

# IAMロールの作成

IAM画面にてIAMロールの作成を選択します。

![Enter_Role_name.png](https://qiita-image-store.s3.amazonaws.com/0/51203/15f276ca-c7cc-d63d-a6d6-5f28dedbceb0.png)

仮に"Datadog_Integration"を入力し、次のステップをクリックします。
ロール名はあとで使うので覚えておいてください。

![ロールタイプ.png](https://qiita-image-store.s3.amazonaws.com/0/51203/1ecbefc9-38bc-92ed-e1aa-aa140e8226ea.png)

「クロスアカウントアクセスのロール」をクリックし、「サードパーティのAWS...」を選択します。
DatadogのAWSアカウントにアクセス許可を与えるということになります。

![Datadog Accountの入力.png](https://qiita-image-store.s3.amazonaws.com/0/51203/f9e2146b-2cb4-c547-e726-f65caae7a62a.png)

アカウントIDはDatadogのアカウントID 464622532012 を入力します。
外部IDは、Datadogの設定画面で取得する必要があります。

別のブラウザ画面を用意し、以下のURLにアクセスします。

https://app.datadoghq.com/account/settings#integrations/amazon_web_services

![AWS Integration.png](https://qiita-image-store.s3.amazonaws.com/0/51203/9a1e2ff7-4aad-504e-dcdc-a90ce21579af.png)

Role Delegationを選択します(設定がない、新規に設定する場合は「add another acocunt」)をクリックしてください。

![DatadogのAWSIntegration画面.png](https://qiita-image-store.s3.amazonaws.com/0/51203/8a1c758b-098d-8b11-46c0-8ca1bbccb8f8.png)

AWS External ID: をメモします。
画面はとじないで、さきほどのIAM Role設定の画面にもどり外部IDに入力します。

![スクリーンショット_2016-07-10_15_23_45.png](https://qiita-image-store.s3.amazonaws.com/0/51203/7ba035f2-bfc6-ee32-9cf7-6049c6e25a10.png)

次のステップをクリックします。

ポリシーのアタッチ画面になります。最初のステップでつくったDatadog_Integrationをアタッチします。

ロールが作成されたら、Datadogの画面にもどます。

![Datadog設定2.png](https://qiita-image-store.s3.amazonaws.com/0/51203/03610170-4c17-b7f6-c985-df07206f6316.png)

ロール名を設定します。入力がただしく出来ると上の部分が緑になります。緑になったら、忘れずに画面下にある「Update Configuration」ボタンをクリックしてください。おさないと設定が保存されません。

以上で設定は完了です。
MySQLのエラー備忘録

# 以下にまとめています
[VagrantでLAMP環境を構築する (自分メモ)](http://qiita.com/tt0805/items/da43f3f4b94e6e6a89f0)

# 本題
ここではMySQLでのエラーをまとめます

# やりたいこと
phpを用いて、MySQLデータベースと接続を行うこと

# エラー
<pre>
 Warning: mysql_connect(): No such file or directory in 
</pre>

## 対応その1
- mysql_soketの設定確認
<pre>
 php -i | grep socket
</pre>

そうするとなんか出た

<pre>
 PHP Warning:  Unknown: It is not safe to rely on the system's timezone settings.
</pre>

timezoneが設定されていないよって言うことなので設定します。

<pre>
$ whereis php.ini
$ php: /usr/bin/php /etc/php.d /etc/php.ini /usr/lib64/php /usr/share/php /usr/share/man/man1/php.1.gz
</pre>
いっぱいでてきたので、ブラウザ上でphpinfo()を表示してLoaded Configuration Fileの中身を確認

どうやら/etc/php.iniみたいなので、[[PHP]php.iniのtimezoneを設定する](http://qiita.com/maximum80/items/d8c841ccdaf6f8106b3f)を参考に設定をおこないました

## 対応その2
直らなかったので続き
[PHP Warning: mysql_connect(): - MySQLソケットエラー](http://webkaru.net/php/php-warning-mysql-connect/)

まずはsocketの場所を確認

<pre>
$ mysql_config --socket
/var/lib/mysql/mysql.sock
</pre>

あとはphp.iniを編集するだけ

・・・・

直らない・・・

続く