OmniAICreator/Qiita-1.07M huggingface dataset:
Haskellについてちょっとだけ調べてみた

このへん
* [http://learnyouahaskell.com/chapters](http://learnyouahaskell.com/chapters)
* [http://www.seas.upenn.edu/~cis194/lectures.html](http://www.seas.upenn.edu/~cis194/lectures.html)


## Haskellの特徴

* 静的型付け
* 遅延評価
* 型推論
* Algebraic data type
    * 型を非常に柔軟に作れる
    * enumみたいのも簡単にできる
    * 再帰的な定義も簡単にできる
* curry
    * 例えば```a -> b -> c```な関数があったとすると、これは2引数の関数なのではなく、1つの引数を取り、さらにもう一つ引数を取ったらc型を返す関数である
* パターンマッチ
* 型クラス
    * Haskellのclass宣言はJavaで言うとinterfaceのようなもの
    * Haskellのinstance宣言は、Javaだとinterfaceを実装したclass(メソッドのみ)のようなもの
* functor, monad...


## FunctorとApplicative
```Haskell
class Functor f where
    fmap :: (a -> b) -> f a -> f b

    <$> = fmap
```
```Haskell
class (Functor f) => Applicative f where
    pure :: a -> f a

    (<*>) = f (a -> b) -> f a -> f b
```

* IOやMaybeはfunctorかつApplicativeかつMonadである
* おもしろいことに、[](配列)や((->) r)(関数)もfunctorである
* 関数のfmapは関数合成と同じ

fmapがあることにより、既存の関数を変更することなく(オペレータを変更することにより)引数に通常の値でもfunctorでも与えることができる。  
ただこれだと、2引数をとるような関数aに対してfmapすると ```(a -> b -> c) <$> f a```で```f (b -> c)```が返ってくるのでFunctorに定義されているパーツだけでは処理できない。Applicativeではこれ用に```<*>```が定義されており、これでようやくパーツが揃うことになる.  
```(a -> b -> c) <$> f a <*> f b```  
引数がもっとあれば、引数の分だけ```<*>```を増やしてけばよい.


## Monoid
```Haskell
class Monoid m where
    mempty :: m

    mappend :: m -> m -> m

    mconcat :: [m] -> m
    maconcat = foldr mappend mempty
```

* 単位元と二項演算が定義されている。
* Monoidのinstanceを定義することにより系を定義できる。
	* 新しい演算の体系を定義できる…!! 

FunctorとかApplicativeとかMonadとかMonoidとか、Haskellではなるべく値を
値をそのものとして扱うのではなく、値をあるcontext内に入れ、contextのレベル
で扱おうとしているように見える。(Javaで例えると、値を生のまま引き回すじゃなくてクラス作ってそん中に入れとくのとやりたいことは似ているっちゃ似ている)

## Monad
```Haskell
class Monad m where
    return :: a -> m a
    (>>=) :: m a -> (a -> m b) -> mb

    (>>) :: m a -> m b -> m b
    x >> y = x >>= \_ -> y

    fail :: String -> m a
    fail msg = error msg
```

* returnはApplicativeのpureと同じ役割(他の言語におけるreturnとは全く関係ない)
* []やMaybeはMonadである

```Haskell
instance Monad Maybe where
    return x = Just x
    Nothing >>= f = Nothing
    Just x >>= f = f x
    fail _ = Nothing
```

戻り値としてMaybeを返したい場合は多々あるし、入出力系だとIOを返さざるを得ないような場合があって、 ```a -> m a```な関数を書きたい場合が必ず出てくる。  
そんなこんなで、```(a -> m a)```の結果を次の```(a -> m a)```にシームレスに入れたくなってくる。  
そこで```>>=```を使うと、```(a -> m a) >>= (a -> m a) >>= ...```のように書ける。

* ```do```内の```<-```は、```>>=```のsyntax sugarである。
* ```do```内で```x <- y```のパターンマッチが失敗すると、即座にそのMonadについて```fail```で定義された値が返る。

```Haskell
foo :: Maybe String
foo = do
    x <- Just 3
    y <- Just "!"
    Just (show x ++ y)
    
-- 以下と同じ

foo = Just 3 >>= (\x ->
        just "!" >>= (\y ->
            Just (show x ++ y)))
```
```Haskell
-- Monad版のfmap
LiftM :: (Monad m) => (a -> b) -> m a -> m b

-- Monad版のfilter
filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]

-- Monad版のfoldl
foldM :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
```

## 感想
* こういう書き方をさせていくことによって、処理を書いてるというよりは定義を書いてる感じになってくるんだろう
* 新たな体系を記述していくのはそれはそれで楽しいかもしれない
* モナドがなにするもんなのかなんとなく分かってよかった
* ライプニッツのモナドとは何の関係もなかった
Struts2でJava8を使う場合

# Struts2+Java8を使うには

Struts2.5.3以前の中でJava8を使う場合は、Struts2-Java8-supportプラグインを導入します。これによりActionクラスの中でJava8の機能が使えます。
( Struts2.5.5では不要です )

特に有用なのは、Actionクラスにて画面へレスポンスする前のList型やMap型フィールドにStream APIを使ってフィルタリングするケースでしょう。

## 他に留意するポイント

もしStruts2-SpringプラグインやAspectJを導入していた場合、古いバージョンの[asm|OW2Consortium](http://asm.ow2.org/)を指定している場合があります。(asm-3.3.2.jarなど)
また、Struts2の前進であるwebwork2(xwork2)でもasm3を利用しています。

Struts2-Java8では 依存ライブラリとして asm-5.0系を指定しています。
もしasmがビルドパスやmavenのpom.xmlに含まれていた場合は削除します。

以下にmavenでの削除対象の指定例を示します。

### Struts2.5.xの場合

```xml:pom.xml
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<exclusions>
				<exclusion>
					<groupId>asm</groupId>
					<artifactId>asm</artifactId>
				</exclusion>
				<exclusion>
					<groupId>asm</groupId>
					<artifactId>asm-commons</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>
</dependencyManagement>
```

### Struts2.3.xまでの場合

```xml:pom.xml
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.apache.struts.xwork</groupId>
			<artifactId>xwork-core</artifactId>
			<exclusions>
				<exclusion>
					<groupId>asm</groupId>
					<artifactId>asm</artifactId>
				</exclusion>
				<exclusion>
					<groupId>asm</groupId>
					<artifactId>asm-commons</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>
</dependencyManagement>
```

## Actionクラスのフィールドにstream()って使うの？

Actionクラスにロジック乗せてしまい、Actionクラスを肥えさせることになるのでは…の懸念はじゅうぶんあります。

しかしフィルタリングはstream()以降で指定する関数で定義するものなので、Actionクラスの本体はそこまで太ることもないですし、関数を切り替えるだけで出力も自在に変えられるので、レスポンス（View層、ViewModel…？)の実装方法として、ありなのかも知れません。

## Struts2-Java8-supportプラグインの入手先

Struts2は全般的にmavenで導入、ないしはgithubからクローンするように移行しておりますが、個別に入手したい場合もありますので、mavenリポジトリのリンクと、githubの該当URLを残しておきます。

mavenリポジトリ：
http://mvnrepository.com/artifact/org.apache.struts/struts2-java8-support-plugin

github：
https://github.com/apache/struts/tree/master/plugins/java8-support
mod_alias使ってみた

## リダイレクト

* [mod_alias - Apache HTTP サーバ](http://httpd.apache.org/docs/2.0/ja/mod/mod_alias.html#redirectmatch)

http://example.com/info/ にアクセスしてきたら
http://example.com/info/info.php にリダイレクトさせたい場合

```apache:.htaccess
RewriteEngine on
RedirectMatch 301 ^/info/$   /info/info.php
```
SonarQube でテストカバレッジを測定する

# 環境および制約
* Windows 7
* SonarQube ver. 4.2 以降
* 測定対象のプロジェクトで maven を使用している．

# How to
**1. SonarQubeのダウンロード**
以下のリンクから，SonarQube と SonarQube Runner をダウンロードし，それらを任意の場所に移動する(ここでは，Cドライブ直下に移動)．
http://www.sonarqube.org/downloads/
**2. SonarQubeの起動**
以下のリンクを参考にして，SonarQube を起動する．
具体的には，
```command
C:\sonarqube\bin\windows-x86-xx\StartSonar.bat
```
を実行する．
http://docs.sonarqube.org/display/SONAR/Setup+and+Upgrade
**3. カバレッジの測定**
以下の記事を参考にして，テストカバレッジを測定する．
具体的には，
```command
mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install -Dmaven.test.failure.ignore=true
mvn sonar:sonar
```
を実行する．
http://www.sonarqube.org/unit-test-execution-in-sonarqube/
**4. 測定結果の確認**
測定外終了したら，[http://localhost:9000](http://localhost:9000)にアクセスして測定結果を見ながらコーヒーを飲む．
# travis-ciからAmazon S3へファイルをデプロイする

## 背景、目的

Amazon S3はクラウドスレージとしてのみだけでなく、静的なWEBコンテンツの配信元としても利用できる。Amazon S3へファイルをアップロードするツールは数あるが、コンテンツのバージョン管理としてGithubを利用している場合、ファイル配置とバージョンの紐付けを行う必要性が生じうる。今回は、CIサービスの[travis-ci](https://travis-ci.org)を利用してこれを実現する。


```
|source| -> |github| -> |travis-ci| -> |S3|
```


## 手順

 - AWSにデプロイ用アカウントの作成
 - S3にバケットの作成、権限の編集
 - `travis.yml`の設定

## デプロイ用アカウントの作成

travis-ciからのデプロイは、専用ユーザーを作成しそのユーザーアカウントを利用してtravis-ciがAWSのAPIを叩く。まずは、AWSコンソールの`IAM`からグループを作成する。アクセス許可を設定し、S3へファイルのアップロードができるようにする。本当は細かく設定するべきだろうけど、今回は`AmazonS3FullAccess`にした。

つぎにユーザーを作成する。適当な名前でユーザーを作ったら「認証情報のダウンロード」から、アクセスキーが書かれたCSVをダウンロードすること。これを忘れると再度ユーザーを作りなおすことになる。ユーザーを作ったら先ほど作ったグループのメンバーにする。

![fig1.PNG](https://qiita-image-store.s3.amazonaws.com/0/6756/ee801e5f-984a-9a53-2b80-9a08010b46a1.png)


## S3にバケットを作る

静的なWEBコンテンツを配信し、DNSで名前解決するときはバケット名をFQDNにするのが良いっぽい。バケットを作ったらプロパティから「静的ウェブサイトホスティング」を有効にする。また、アクセス許可から「認証済みユーザー」の「アップロード/削除」にチェックを入れる。これでデプロイはできる。

配信されたコンテンツを得Tランできるようにするには、別途バケットポリシーを編集する必要がある。[AWS Policy Generator](http://awspolicygen.s3.amazonaws.com/policygen.html)から次の様に設定をすることですべての人に公開されたコンテンツとすることができる。


 - Select Type of Policy : S3 Bucket Policy
 - Principal : *
 - AWS Service : Amazon S3
 - Actions : GetObjet
 - ARN : arn:aws:s3:::<bucket_name>/*

![fig2.PNG](https://qiita-image-store.s3.amazonaws.com/0/6756/02cfe388-0255-e860-7457-5fc55dbd2df2.png)


## travis.ymlの作成

リポジトリのルートディレクトリに`travis.yml`を作る。


```yml
language: bash
script: echo "do nothing"
deploy:
  provider: s3
  bucket: bucket_name
　　access_key_id: "YOUR AWS ACCESS KEY"
  endpoint: s3-ap-northeast-1.amazonaws.com
  region: ap-northeast-1
  on:
    branches: master
```

バケット名やリージョン、ブランチなどは適宜読み替えること。詳細は[リファレンス](http://docs.travis-ci.com/user/deployment/)を見た方がいい。最後にシークレットキーを暗号化して挿入する。事前に[travis.rb](https://github.com/travis-ci/travis.rb)を入れておく。

	travis encrypt --add deploy.secret_access_key

標準入力にシークレットキーを貼り付ける。あとは、masterブランチへpushしたらS3へファイルが展開されるのを確認する。
CocoaLumberjack(Version 2以降)にてログレベルをソース全体に適用する

古い記事しかなかったので今版の記事を書きます。
一応READMEを見て色々辿れば設定ができるのですが、昔の記事を見てたらハマったのでここにメモを残しておきます。

## install

いつものように。

```Podfile
pod 'CocoaLumberjack'
```

versionは`version 2.0.0`です。

```bash
$ grep Lum Podfile.lock
- CocoaLumberjack (2.0.0):
```

## pchに設定

[Getting started](https://github.com/CocoaLumberjack/CocoaLumberjack/blob/master/Documentation/GettingStarted.md)にある例だとそれぞれの場所に設定する必要を感じますがpchに設定できます。

```objc:*-Prefix.pch
#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>

    #define LOG_LEVEL_DEF ddLogLevel
    #import <CocoaLumberjack/CocoaLumberjack.h>

    #ifdef DEBUG
        static const DDLogLevel ddLogLevel = DDLogLevelVerbose;
    #else
        static const DDLogLevel ddLogLevel = DDLogLevelOff;
    #endif
#endif
```

`LOG_LEVEL_DEF`をCocoaLumberjackを設定する前にdefineしておくことが重要です。

今年の3月に変更があったみたいです。

https://github.com/CocoaLumberjack/CocoaLumberjack/issues/478#issuecomment-81632833

> For now the fix is to #define LOG_LEVEL_DEF ddLogLevel before importing CocoaLumberjack.

以前から他のライブラリでLogLevelを変更したい場合は使わていたみたいですが、今は必須になったようです。

他の記事では特にそういう記述がなかったので、？ってなりましたが「困ったら原典をあたれ」でしたね。

Enjoy!
ソースツリー(Source Tree)で2点間の差分ファイルを一発で作る、MAC版



※コマンド使用の人は不要かも知れませんが。
以下をベースに改良していますので、
設定は参考にして貰えればとおもいます。
https://www.eyemovic.com/blog_it/4747.php
差分を作りたい"２点"を選択して、実行してもらえれば、
その間の差分をZipで作ります。


```lang:sabun.sh
#!/bin/sh
git archive --format=zip HEAD `git diff --name-only $2 $1 --diff-filter=ACMR` -o ../az.zip
```

sabun.shは実行形式に変更する必用がありますので
sabun.shを保存後、ターミナルから

```
chmod +x sabun.sh
```
を実行します。
node.jsとかnpmの管理関連メモ


久しぶりにnode.jsを使おうと思った時、nodeそのものや、モジュールが古くなってるのでは？思い調べたメモ。

###前提
* mac(yosemite)です。
* nodeは、インストーラーでインストールしています（brewとかじゃなく）

###Node.js(npm)自体のアップデート

これは、最新のインストーラーをダウンロードしてインストールすれば上書きされるようです。

>ちなみにアンイストールはなかなか大変なようです。
[uninstallの情報](http://d.sonicjam.co.jp/post/52541343939)

###インストールされているモジュールのチェック

私はglobalが中心なので、

```bash
npm list -g
```

です。


###最新バージョンの有無のチェック

手動でやるのはややこし？そうなので、npm-check-updatesというのを使うことにしました。

```bash
sudo npm -g install npm-check-updates
```

でインストール。

```bash
sudo npm-check-update -g
```

で、現在のバージョンとアップデート可能なバージョンのリストを表示してくれます。

###バージョンアップ

モジュールのアップデートは、

```bash
sudo npm -g install [package_name]
```

で上書き？しろ！と言われたのでしました。

###あるモジュールでエラー

私の環境では、selenium-webdriverのアップグレード中に、

```bash
gyp WARN EACCES user "root" does not have permission to access the dev dir "/Users/hoge/.node-gyp/0.12.4"
```

というエラーが出ました。gypとか使ってないし、そんなファイルそもそも無いし。結論から言えば、

```bash
sudo npm -g install selenium-webdriver --unsafe-perm
```

という感じで--unsafe-permオプションをつけることで回避できました（たぶん）。
実際、アップグレードしたから使ってないので、本当に回避できたかはわかりませんが、まあ、大丈夫でしょう。

あと、これはselenium依存ですが、最新のブラウザに合わせて、chromedriver等のアップデートも必要です。
Python:lambdaで代入とかswitchとかしてみる

初投稿です。よろしくおねがいします。

RaspberryPiがらみで久しぶりにPythonを触って、自分でやりやすいように追求した結果をメモしときます。

特にいわゆる闇を志向しているわけではありません。
ので何かやっちゃいけないことだったら教えて下さい。

#lambdaどうなの？使えるの？
以前は使いどころがいまいち分からなかったlambda。
色々制限があるところが今は何だかむしろ好きかも。
可能なところは全部lambdaで書きたいくらい。

クイックソートの例でいきます。まずdefでは？

```Python
def qs( xs ) :
        le = [x for x in xs[1:] if x<=xs[0] ]
        gt = [x for x in xs[1:] if x>xs[0] ]
        if xs == []:
                return []
        else:
                return qs( le ) + [ xs[0] ] + qs( gt )
```
こんな感じでしょうか。

#代入できる？

lambdaで普通に書くと、

```Python
qs=(lambda xs :
	[] if xs == [] else
    qs( [x for x in xs[1:] if x<=xs[0] ] ) + [ xs[0] ] 
    + qs( [x for x in xs[1:] if x>xs[0] ] )
)
```


悪くはないけど、長くてごちゃごちゃしてる感あり。これだったらdefするかなあ。やっぱり。
途中での変数への代入はできないけど、名前に束縛して定義しておくことは出来るみたい。

```Python
qs=(lambda xs :
    (lambda 
    	le = [x for x in xs[1:] if x<=xs[0] ] ,
    	gt = [x for x in xs[1:] if x>xs[0] ] :
            [] if xs == [] else
            qs( le ) + [ xs[0] ] + qs( gt )
    )()
)
```
すっきりしてていいんじゃない？returnとかなくて僕好みなんですけど...
内側にもう一つlambda式を作ってデフォルト引数のまま実行させてます。
ってことは設定したデフォルト引数はそのまま変数として使えるってことですよね？

内側のlambda式からは自分より外側の引数や変数が使えます。
lambda x=1,y=x: のようにすると、yは隣のx=1でなく自分より外側にxを探しに行ってしまいます。
関係ない同士の引数は同じlambda式内に。参照関係がある場合は段を変えて。
段数は必要に応じて増減します。

ちなみに一番外側の引数には定数以外の動的なデフォルト引数を設定しないほうがいいようです。最初に生成した時のデフォルト値が記録されてしまって、大概思った通りの動作になりません。

#switchしたり、逐次実行したり...
結局、lambdaでやりたい(やれる)ことって

1.引数から導かれる条件で分岐して
2.不純な？動作（入出力とか表示とか)を逐次実行しつつ
3.純粋な計算をして値を返す。

これにつきる気がします。
分岐が多くなると~if~else~しか使えないのがちょっとつらい。
条件を先に、動作を後に書きたい！

* 何かswitch的なもの(Haskellのガードみたいなの)
* その中で逐次実行しつつ値を返すもの

が欲しいなと思って作ってみました。といってもそんなにテクはないので、見た目ごまかし系でアプローチ。

まず、準備。

```Python
box=lambda *x:x
unbox=lambda x:x[-1]
    
do=box             
switch=unbox
```

使う時は

```Python
switch(
	(条件1)    and do(実行式1a,実行式1b,...)
	or (条件2) and do(実行式2a,実行式2b,...)
	...
	or            do(最後の実行式a,最後の実行式b,...)
)
```

これで条件で分岐して、do()で式を順番に評価しつつ結果をタプルとしてswitch()に渡し、switch()はタプルの最後の要素を返します。
最後のdo()にはすべての条件が偽になった時の式を入れます。

タプルに入れたり出したりするのは、実行式の返り値がand/orの制御に影響しないようにするためです。

switchとdoには特に意味はありません。ヒト的には何となくそれっぽいかなと思って変えてみました。
名前から想像する機能はありません。
* 分岐の機能はand/orの短絡評価で、
* それが確実に動くようにboxして、
* 同時に関数boxの実行時に引数が評価されるのを利用して逐次実行、
* 返り値を取り出すためにunbox
各要素の合わせ技で欲しい機能を実現しています。
ただ、その辺にswitchとかdoとか書いてあったら読みやすいし書きやすいかな、ということです。guardとかcondとか使ったらかっこいいかも？モテる？

クイックソートの例では

```py

qs=(lambda xs :
    (lambda 
        le = [x for x in xs[1:] if x<=xs[0] ] , 
        gt = [x for x in xs[1:] if x>xs[0] ] :
        switch(
            xs == [] and do( [] )  
            or do( qs( le ) + [ xs[0] ] + qs( gt ) )
        )
    )()
)
```

ちょっと字数が増えたけど、何となく意味は伝わりそう。
自分でも間違えなさそう。

ちなみに、同じことを普通に書くと

```py
qs=(lambda xs :
    (lambda 
        le = [x for x in xs[1:] if x<=xs[0] ] , 
        gt = [x for x in xs[1:] if x>xs[0] ] :
        (
            xs == [] and ( [], )  
            or ( qs( le ) + [ xs[0] ] + qs( gt ) ,)
        )[-1]
    )()
)
```
これはこれですっきりしてる。漢だね。
でも、何してるかよくわからないし、書くとき[-1]とかコンマとか忘れそう。
ノンブロッキングな特性のメモ

並列処理とかみてて、定義がなんかややこしくなってきそうだったからメモ
http://doc.akka.io/docs/akka/2.3.11/general/terminology.html

英語の勉強も兼ねている。上のやつを日本語にしただけ。

# Wait-Freedom
全ての処理が有限の処理時間で終了することが保証されているという特性。
絶対に処理をブロックされない綺麗で美しい最強のやつ。デッドロックが絶対に起こらない。
飢餓状態（starvation: 訳が正しいかわからん）にもならない。

# Lock-Freedom
１つ１つは有限の実行時間で処理が終わる処理だけど、無数に呼ばれるような特性。
デッドロックにはならないけど、飢餓状態にならないことを保証するわけではない。

```
やったらすぐ終わるんだけど、優先度が高いタスクがすごい勢いで入ってきて、一向に終わらないというか始まらない。
```

みたいな感じだと理解。

# Obstruction-Freedom
ある点を突破したら、後は有限時間の処理で終わるという特性。

```
casさえ成功すれば終わるんだけど、何回リトライしても成功しない。
```

みたいな感じだと理解。

# Lock-FreedomとObstruction-Freedomの違い

Lock-FreedomとObstruction-Freedomの違いがよくわからないような気がするけど、Lock-Freedomが処理が始まってすらいないことで終わらないのに対して、Obstruction-Freedomは処理の途中で待っている感じがした。

##### Lock-Freedom

```
みんなの頑張り以上にタスクが積み上がってbacklogが溜まっていく
```

つまり、**みんな働いている**

##### Obstruction-Freedom

```
どうしても資料を印刷しないと進められないんだけど、何回コピー機を見に行っても誰かが使ってる
```

つまり、**暇をもてあましている**

みたいな感じだと理解。
DynamicLibrary で実行時に共有ライブラリをロードする

# ``std::dynamic_lib::DynamicLibrary`` を使って、実行時に共有ライブラリを読み込む方法

## 共有ライブラリ（C 側）

共有ライブラリがわはシンプルに 1 を返す関数を実装

```c
int one() {
    return 1;
}
```
`./libtest.so` としてコンパイルしておく。

## Rust側

先にソースコードを示すと以下の通り。

```rust
#![feature(std_misc)]
#![feature(convert)]
use std::env;
use std::path::Path;
use std::dynamic_lib::DynamicLibrary;

fn main() {
    let dylib = match DynamicLibrary::open(
        Some(Path::new(env::args().nth(1).expect("no args").as_str()))
        ) {
        Ok(x) => {x}
        Err(x) => {panic!(x)}
    };
    unsafe {
        let one = std::mem::transmute::<*mut u8, extern "C" fn() -> u32>(dylib.symbol("one").ok().expect("error"));
        println!("{}", one());
    }
}
```

ポイントは、DynamicLibrary.symbol の戻り値を std::mem::transmuteでキャストする点。これがわからなくて、コアダンプしまくった。（正直、ドキュメントに書いておいてほしいところ）

```rust:symbolの戻り値をキャストする
let one = std::mem::transmute::<*mut u8, extern "C" fn() -> u32>(dylib.symbol("one").ok().expect("error"));
        println!("{}", one());
```

```:実行結果
$ cargo run $PWD/libtest.so one
1
$ 
```

## 番外編：rustで記述された関数を呼び出してみる（実験）

rustでは関数名はマングリングされるため、ただのお遊びです。
（rustでpluginを実現するための仕組みはまだ確立していないだろうし）
ほんとは、trait継承させた関数をロードしたかったのだけど、試す時間がないため、通常の関数をロードしてみる。

### 呼び出される関数側

なにはともあれ、呼び出される側のパッケージを作成しておく。

```
$ cargo new plugin
```

Cargo.toml で crate-type を指定しておく

```ini:plugin/Cargo.toml
[package]
name = "plugin"
version = "0.1.0"
authors = ["Osamu NAKAMURA <osamu0329nakamura@gmail.com>"]

[lib]
name = "plugin"
crate-type = ["dylib"]
```

```rust:plugin/src/lib.rs
pub fn hello(s: &str) {
    println!("{}", s)
}
```

ビルドすると target/debug/libplugin.so が生成されるので、`nm`
でシンボル名を確認しておく。

```
$ nm target/debug/libplugin.so | grep hello
00000000003cf120 d _ZN5hello15__STATIC_FMTSTR20he86eaad7e5625859saaE
00000000000b3580 T _ZN5hello20h9886c09a1f174ff1eaaE
```

### 呼び出す側

こちらはバイナリテンプレートで作成する。（省略）
先程確認したシンボルをハードコードしています。

```rust:main.rs
#![feature(std_misc)]

use std::dynamic_lib::DynamicLibrary;

fn main() {
    let path = Some(std::path::Path::new("../plugin/target/debug/libplugin.so"));
    let dylib = match DynamicLibrary::open(path) {
        Ok(lib) => {lib}
        Err(x) => {panic!("{}", x)}
    };                                                                              
    let f = unsafe {
        //let sym = "_ZN13create_struct20hd017fab034f9fd02NbaE";                    
        let sym = "_ZN5hello20h9886c09a1f174ff1eaaE";
        match dylib.symbol(sym) {                                                   
            Ok(f) => {std::mem::transmute::<*mut u8, fn(&str) -> ()>(f)}
            Err(s) => panic!(s)
        }
    };
    f("Hello world!");
}
```

んで、実行する。

```
$ cargo run
Hello world!
```

関数名のマングリングについては、librustc_trans/back/link.rs のコメントに記述があります。
D言語のライブラリをTravis-CI上でテスト


昔[How to test D project on Travis CI](http://qiita.com/repeatedly/items/ccf5eefad7e2dba9cf36)という記事を書いたんだけど，今だともっとまともに出来るので新しく記事にしておく．

コミュニティのサポートによって，実はD言語の環境は組み込みで用意されてます．以下が英語のドキュメント．

[Travis CI: Building a D Project](http://docs.travis-ci.com/user/languages/d/)

上にほとんど書かれてるんですが，せっかくなので日本語でいくつか説明．

## .travis.ymlの例

基本的な環境はdmd/dubのセットになります．

```yaml
language: d
```

これが一番小さい設定になり，これだとdmdを使って以下のコマンドを実行したことになります．

```sh
dub test --compiler=${DC}
```

もちろんこれは変更することが出来て，scriptで指定してやれば良いです．下はmakeを使ってテストする例.

```sh
language: d

script: make test
```

## サポートされているコンパイラ

dmd，gdc，ldcがサポートされてます．デフォルトはdmdだけなので，他のでテストしたかったら指定します．以下のようにすれば，それぞれのコンパイラの最新版でテストされます．

```yaml
language: d

d:
  - dmd
  - gdc
  - ldc
```

各コンパイラはバージョンを指定することも出来ます．特定バージョンで問題があるような場合には，regressionのテストとか出来ます．

```yaml
d:
  - dmd-2.066.1
  - dmd
  - ldc-0.15.1
  - ldc
```

各コンパイラ，どこまで古いバージョンをサポートしているのかは分かりません！

## まとめ

とまぁこんな感じで，前よりは楽にテスト出来るようになりました．ibuclaw，klickverbot，MartinNowakの3人に感謝して，どんどんTravis-CI使ってテスト回しましょう！
jQueryをちゃんと学ぶ


#jQuery勉強してみたよ

実務で使うことが多いjQuery様。

##core機能


readyとjQueryオブジェクトにするやつくらいしかわかりません

```javascript:core.js


//===========Basic===========================

//要素contextを基点にセレクタexpで検索してマッチした要素を取得
$(exp [,context])

//指定したhtmlとプロパティ情報からjQueryオブジェクトを生成
$(html [,props])

//要素をjQueryオブジェクトに変換
$(elems)

//ページの読み込みがタイミングで関数fnを実行（readyメソッドのショートカット）
$(fn())

//readyイベントを制御（holdがtrueでイベント実行を待ち、falseで実行）
$.holdReady(hold)


//===============Access=======================

//コールバック関数fnで各要素を繰り返し処理
each(fn(index, elm))

//index+1番目の要素を取得（引数省略時はすべての要素）
get([index])

//要素のインデックス番号を取得
index(elm)

//要素の数を取得
length

//jQueryオブジェクトを要素の配列に変換
toArray()



//================cache=========================

//「キー：値」のハッシュ形式でデータを取得
data()

//キー名nameと値valueのペアでデータを設定（value省略時はキー名に対応する値を取得）
data(name[,value])

//オブジェクトでデータを取得
data(obj)

//指定されたキーlist（配列、または空白区切りの文字列）を削除
removeData(list)

//キー名nameを削除（name省略時はすべてのキーを削除）
removeData([name])



//===================plugin========================

//jQueryオブジェクトに新しいメソッドを追加（$().メソッド()の形式）
$.fn.extend(obj)

//jQUeryオブジェクトに新しいメソッドを追加（$.メソッド()の形式）
$.extend(obj)


```


##セレクタ（１）

あれ・・・・
ほとんど使えないものばかりじゃないか？

```javascript:selecter.js

//アニメーション実行中であるすべての要素を取得
:animated

//セレクタexpで指定した要素以外を取得
:not(exp)

//最初の要素を取得
:first

//最後の要素を取得
:last

//index番目の要素を取得
:eq(index)

//index + 1番目以上の要素を取得 :gt(index)

//index番目未満の要素を取得
:lt(index)

//h系（見出し）要素をすべて取得
:header

//指定した言語の要素すべてを取得
:lang(lang)

//ドキュメントのルート要素を取得
:root

//URLフラグメント（hoge.html#fooのfooにあたる部分）に一致するid値を持つ要素を取得
:target

//textを含む要素を取得
:contains(text)

//子要素のない要素を取得
:empty

//子要素を持つ要素を取得
:parent

//セレクタexpにマッチする子孫要素を持つ要素を取得
:has(exp)


```

##セレクタ（２）

あれ・・・
CSS3のセレクタと似てる。


```jQuery:selecter.js



//指定した属性を持つ要素を取得
elm[attr]

//指定した属性がvalueで始まる値を持つ要素を取得
elm[attr^=value]

//指定した属性がvalueで終わる値を持つ要素を取得
elm[attr$=value]

//指定した属性がvalueを含む値を持つ要素を取得
elm[attr*=value]

//複数の属性フィルタすべてにマッチする要素を取得
elm[funya][hoge][panipani]

//指定した兄弟要素の中で最初の要素を取得
:first-of-type

//指定した兄弟要素の中で最後の要素を取得
:last-of-type

//１つだけ子要素を持つ要素を取得
:only-child

//他に兄弟要素を持たない要素を取得
:only-of-type

//選択状態にある要素すべてを取得
:selected

//有効な状態の要素すべてを取得
:enabled

//無効な状態の要素すべてを取得
:disabled

//非表示の要素すべてを取得
:hidden

//表示状態の要素すべてを取得
:visible



```
VisualStudioCodeでSublimeライクなショートカットの設定



* 15.06.03 v0.3 Update cmd+dでSublimeの同一テキストをマルチカーソルで編集機能が追加されました。



## やり方
ショートカットの編集はメニューから選択
[Code] -> [Preferences] -> [Keyboard Shortcuts]



## 以下コピペできます。for Mac

```bson:keybindings.json


// Place your key bindings in this file to overwrite the defaults
[ 
// 選択中のテキストから次の同一テキスト1箇所にマルチカーソル  （default）
{ "key": "cmd+d",                "command": "editor.action.addSelectionToNextFindMatch",
                                 "when": "editorTextFocus" },
                                        
// ブロックコメントの追加
{ "key": "cmd+ctrl+/",           "command": "editor.action.blockComment",
                                 "when": "editorTextFocus" }, 
                                   
// 行の複製
{ "key": "cmd+shift+d",          "command": "editor.action.copyLinesDownAction",
                                 "when": "editorTextFocus" },
// 行の移動下方向
{ "key": "cmd+ctrl+down",        "command": "editor.action.moveLinesDownAction",
                                 "when": "editorTextFocus" },
// 行の移動上方向
{ "key": "cmd+ctrl+up",          "command": "editor.action.moveLinesUpAction",
                                 "when": "editorTextFocus" },

// 選択テキストで検索して全ての対象の末尾にマルチカーソル             
{ "key": "cmd+ctrl+g",           "command": "editor.action.selectHighlights",
                                 "when": "editorTextFocus" },
// コンテキストメニュー表示
{ "key": "cmd+ctrl+enter",       "command": "editor.action.showContextMenu",
                                 "when": "editorTextFocus" }  


]



```

### 他PCとの設定共有
設定ファイルは以下のパスに保存されているので、シンボリックリンク貼ってドロップボックス共有すれば他のPCとも同期できるはず。（未確認）

/Users/[YOUR USER NAME]/Library/Application Support/Code/User/keybindings.json
/Users/[YOUR USER NAME]/Library/Application Support/Code/User/settings.json
MongoDBにGeospatianl Indexを貼る - MongoDBはまりポイント


MongoDBでは位置情報を検索するためのインデックス - Geospatianl Index - というのがあることを知り、使ってみることにしました。
データを適当に収集してからインデックスを貼ろうとすると、いろいろ大変だったので、備忘録として記載します。
そもそもMongoDBの基本操作

## 前提
latitude, longitudeをStringでplacesというコレクションに保存してた。
latitude, longitudeが空文字のものや、存在しないものがあった。

```:places
[{
  name: "aaa",
  latitude: "33.333",
  longitude: "134.4444"
},
{
  name: "bbb",
  latitude: "",
  longitude: ""
,
{
  name: "ccc"
}]
```

## 1. Geospatianl IndexはFloatのArray

ドキュメントにて、Geospatianl IndexはArrayである必要があるらしいということで、とりあえず、以下のようにしてArrayを作った


```
db.places.find({latitude: {$ne: ""}}).forEach(function(r){
	db.places.update({_id: r._id},{$set: {coordinates: [r.latitude, r.longitude]}})
})
```

2dのインデックスを貼る（他に2dsphere、geoHeystackなどがある。2dsphereは後述する）

```
db.places.createIndex( { coodinates: "2d" }) 
#=> Point must only contain numeric elements
```

どうやら、Array内は数字しかダメらしい。latitude, longitudeを文字列として保存してたことが原因。リセットしてparseFloatをかけた

```:リセットコマンド
db.places.update({}, {$unset: {coordinates: 1}}, {multi: true})
```

```
db.places.find({latitude: {$ne: ""}}).forEach(function(r){
	db.places.update({_id: r._id},{$set: {coordinates: [parseFloat(r.latitude), parseFloat(r.longitude)]}})
})
```

```
db.places.createIndex( { coodinates: "2d" }) 
#=> exception: point not in interval of [ -180, 180 ]:: caused by :: {..., coordinates[non.0, non.0]}
```

どうやらlatitude, longitudeが存在しないもののcoordinatesも作っちゃってたらしい

## 2. latitude, longitudeの存在確認

先ほどまでは、```{$ne: ""}```で空じゃないことだけ確認していたが、そもそもfieldが存在するかの確認もしなくてはならない。ということで、上記リセットコマンドを打ったのち、以下のようにしてみた。

```
db.places.find({latitude: {$ne: ""}, latitude: {$exists: true}}).forEach(function(r){
	db.places.update({_id: r._id},{$set: {coordinates: [parseFloat(r.latitude), parseFloat(r.longitude)]}})
})
```

で、index作成

```
db.places.createIndex( { coodinates: "2d" }) 
#=> exception: point not in interval of [ -180, 180 ]:: caused by :: {..., coordinates[non.0, non.0]}
```

先ほどと同じエラーがでた。
どうやら、絞り込み条件が間違っていて、```latitude: {$ne: ""}```が効いてないらしい。
ということで、修正して再度挑戦

```
db.places.find({latitude: {$ne: "", $exists: true}}).forEach(function(r){
	db.places.update({_id: r._id},{$set: {coordinates: [parseFloat(r.latitude), parseFloat(r.longitude)]}})
})
```

```
db.places.createIndex( { coodinates: "2d" }) 
```
できた

## Geospatianl Index を2dから2dsphereにしてみる

>While basic queries using spherical distance are supported by the 2d index, consider moving to a 2dsphere index if your data is primarily longitude and latitude.

「latitude, longitudeのデータしかないなら2dsphereの方がいいよ」と言ってるので、2dsphere用に再度データを作り変える

1. 上記リセットコマンドを打つ

 ```:リセットコマンド
db.places.update({}, {$unset: {coordinates: 1}}, {multi: true})
```

2. 以下のコマンドを打って、coordinateとtypeを指定。latitudeとlongitudeの順番が逆なことに注意

 ```
db.places.find({latitude: {$ne: "", $exists: true}}).forEach(function(r){
	db.places.update({_id: r._id},{$set: {loc: {coordinates: [parseFloat(r.longitude), parseFloat(r.latitude)], type: "Point"}}})
})
```

3. 2dsphereのコマンドを打つ

 ```
db.places.createIndex( { loc: "2dsphere" }) 
```

できた

## geo_nearを使ってみる

```
db.runCommand({
   geoNear: "places" ,
   near: [ 0, 0 ],
   spherical: true
})
```
Macで内部音声の録音方法


Mac上でブラウザなどで再生した音を保存する方法(>Marverics)

##AudioMIDI設定

![スクリーンショット 2015-05-26 1.05.36.png](https://qiita-image-store.s3.amazonaws.com/0/72909/b236df93-bc97-59d8-d111-ffa7ee0b43d8.png "スクリーンショット 2015-05-26 1.05.36.png")

Soundflower(2ch)を選択する。右クリックのコンテキストメニューで
*このサウンド入力装置を使用
*このサウンド出力装置を使用
*この装置を通して通知音とサウンドエフェクトを再生
を選択する。

![スクリーンショット 2015-05-26 1.03.16.png](https://qiita-image-store.s3.amazonaws.com/0/72909/f2f5fa44-a3a8-221f-a0a9-a6c334362452.png "スクリーンショット 2015-05-26 1.03.16.png")

##QuickTime Player起動

![スクリーンショット 2015-05-26 1.07.04.png](https://qiita-image-store.s3.amazonaws.com/0/72909/f50c7591-7a61-b798-240b-5716fbdf8c4c.png "スクリーンショット 2015-05-26 1.07.04.png")

ファイルー＞新規オーディオ収録

![スクリーンショット 2015-05-26 1.08.42.png](https://qiita-image-store.s3.amazonaws.com/0/72909/42add537-e982-2500-42c0-8c21201fe210.png "スクリーンショット 2015-05-26 1.08.42.png")

ここで真ん中の赤いボタンを押すと、録音開始となるので、録音したいソースを再生する。再生が終了したら、再度押して録音停止。

ファイルー＞保存でファイル名をつけて保存する。

保存ファイルは.m4aのaac形式となる。

終わったら、AudioMIDIの設定を戻しておく。
rubyのワイルドカードを含むコマンドライン引数

しばらくはまった。OptionPaserの機能もしくはバグかと思っていた。

```
ruby test.rb -a hoge/*
```

rubyのコマンドライン引数はワイルドカードを展開するので``hoge/*``は、``hoge/hige.log``だったたり``piyo.txt``になったりする。

``hoge/*``のママrubyに受け取りたかったらこうする。

```
ruby test.rb -a 'hoge/*'
```

シングルクォーテーションで囲むそうです。
HinemosのイベントをChatWorkに投稿する

ChatWork APIを使ってHinemosのイベントをチャットに通知するようにしてみたら結構いい感じでした。

# ChatWork投稿スクリプトの準備

下記のような投稿用スクリプトを用意しておきます。

```bash:chatwork
#!/bin/bash

usage() {
        echo "Usage: $0 -r room_id -k api_key message" 1>&2
        exit 1
}

while getopts r:k:h OPT
do
    case $OPT in
        r)  room_id=$OPTARG
            ;;
        k)  api_key=$OPTARG
            ;;
        h)  usage
            ;;
        \?) usage
            ;;
    esac
done

shift $((OPTIND - 1))

message=$@

if [ -z "$api_key" -o -z "$room_id" -o -z "$message" ]; then
    usage
fi

curl -sk -X POST -H "X-ChatWorkToken: $api_key" -d "body=$message" "https://api.chatwork.com/v1/rooms/$room_id/messages"
echo
```

これを適当な場所（例では `/opt/scripts/chatwork`）に保存して `chmod +x /opt/scripts/chatwork` しておきます。

# 通知設定の追加

用意したスクリプトを呼び出す通知設定をHinemosに追加します。

![2015-05-26_00h50_27.png](https://qiita-image-store.s3.amazonaws.com/0/48002/c5f7abb9-57e2-28a1-0b55-9b6fefdca65f.png)


コマンドには以下を指定します。

```bash
/opt/scripts/chatwork -r <ルームID> -k <ChatWork APIキー> "[To:<ユーザID>] [info][title][#[PRIORITY_JP]][#[APPLICATION]] #[FACILITY_ID] の状態が更新されました （監視項目ID：#[MONITOR_ID]）[/title]#[MESSAGE][/info]"
```

`[To:ユーザID]` を入れとくことにより、Toメッセージにするのがミソ。
そうすればブラウザやスマホにプッシュ通知が行くので便利です。

# 監視設定

通知設定ができたら、あとはいつものように「通知」のところにさっきの通知設定を追加します。

![2015-05-26_00h52_02.png](https://qiita-image-store.s3.amazonaws.com/681/48002/99479748-8389-cc45-02fc-67bfdcfc93eb.png)

# 実行結果

![2015-05-26_00h52_45.png](https://qiita-image-store.s3.amazonaws.com/0/48002/e85b0ffd-cea3-6526-c30e-7752a08bf879.png)


何か起きたらまずチャットにでるし、ログも追えるし通知もでる。
コメントもしやすい。

おすすめです。
snmpd の設定方法

CentOS 6.x でSNMPによる監視を有効にするため、SNMPデーモンを設定するやり方。
ぜったい忘れるのでメモ。

## snmpdのインストール

```shell-session
[root@localhost~]# yum install net-snmp
```

## snmpdの設定

詳しくはサンプル設定ファイルまたはマニュアル参照で。

```text:/etc/snmpd/snmpd.conf
com2sec notConfigUser  default       public
group   notConfigGroup v1           notConfigUser
group   notConfigGroup v2c           notConfigUser
view    systemview    included   .1.3.6.1.2.1.1
view    systemview    included   .1.3.6.1.2.1.25.1.1
access  notConfigGroup ""      any       noauth    exact  systemview none none

# サーバの設置場所
syslocation somewhere
# 管理者の連絡先
syscontact Jun SAITO <jun.saito@example.com>
dontLogTCPWrappersConnects yes
# Hinemos 使うときは以下を追加
view    systemview    included   .1.3.6.1
```

## 161/udp を開ける

開いてなければ設定する。
以下はプライベートネットワークからの通信を全許可する場合。

```shell-session
[root@localhost~]# iptables -I INPUT 3 -s 192.168.0.0/24 -j ACCEPT
```

ちなみにコマンドで設定すると再起動時に揮発するので、``iptables-save``コマンドでダンプとっとくべき。

## TCP Wrapper の設定

``/etc/hosts.allow`` を忘れずに設定しておく。

```text:/etc/hosts.allow
snmpd: 192.168.0.0/255.255.255.0
```

## 確認

プライベートネットワーク ``192.168.0.0/24`` の別のホストから以下のコマンドで確認。
IPアドレスは適宜変更。

```shell-session
[unicast@hinemos ~]$ snmpwalk -v 2c -c public 192.168.0.123
```
Oracle 11g XEのDBをShift JIS化する

Oracle 11g XEのデフォルトの文字コードはUTF-8のため、Shift JISなDBのダンプを持ってくるとインポートできなくて死にます。
なのでDBの文字コードをShift JISに変更する必要がありますが、それにはDBを作り直す必要があります。

これは実は下のように ``createdb.sh`` というOracle XEにバンドルされているスクリプトを使うことで、わずか数ステップでShift JIS化できます。
（drop databaseは要らないかも。）

```shell-session
root@localhost # su - oracle
oracle@localhost $ sqlplus / as sysdba
SQL> shutdown immediate
SQL> startup restrict mount
SQL> drop database;
SQL> quit

oracle@localhost $ createdb.sh -dbchar JA16SJIS
```

おわり。
phpで参照元によって振り分ける処理

PHPで参照元によって振り分け処理を行うときのめも

```php:sansyo.php
/* 参照元によって振り分け処理 */
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null;
if (preg_match("|^https?://[a-zA-Z0-9-]+\.hoge\.jp|", $referer)) {
   // "xxx.hoge.jp" サイト内からのアクセス時の処理。
  
}
else {
 /* 直接アクセス時の処理 */
}
```

$_SERVER['HTTP_REFERER'] は取得できるとは限らないとのご指摘を受け、
isset($_SERVER['HTTP_REFERER'])の箇所を入れました。
【cocos2d-x 3.x】Actionを組み合わせて、ペラペラなSpriteを表現する

cocos2d-xのActionを組み合わせのみで、Spriteをペラペラ風に見せます。

![PaperTestVideo.gif](https://qiita-image-store.s3.amazonaws.com/0/80427/93cd515c-e323-2d4a-7bb2-ac17dbe651fa.gif)


#回転の表現
[ポイントA]
1. 左右から潰す(X軸のアンカーポイントを中央にした状態で、Scallを0まで小さくする)
2. 絵を逆にする
3. 左右に膨らませる(1と逆の事をする)

1~3を順番に行う事で、クルっと回転した様に見えます。

```lang:Character.cpp
#define ANIM_TIME_TURN 0.4f
#define ANIM_TIME_JUMP 0.6f

//左右指定された方に方向転換する CHARA_DIRE_LEFT or CHARA_DIRE_RIGHT
void Character::turn(bool dir)
{
    //既にその方向を向いていたら何もしない
    if(dir == mDir)return;
    
    //ターン中やジャンプ中だったら何もしない
    if(kCharacterStateTurn == mCharaState || kCharacterStateJump == mCharaState)return;
    
    //回転中状態にする
    mCharaState = kCharacterStateTurn;
    
    //左向きになっていたら右向き(デフォルト)にする
    if(this->isFlippedX()){
        mDir = CHARA_DIRE_RIGHT;
        
    //右向きになっていたら左向き
    }else{
        mDir = CHARA_DIRE_LEFT;
    }
    
    //元々のスケールXを保存
    float defaultScaleX = this->getScaleX();
    //潰す
    auto scaleSmallAct = ScaleTo::create(ANIM_TIME_TURN/2, 0, this->getScaleY());
    //絵を逆にする
    auto callfuncTurnPng = CallFuncN::create([=](Node* sender) {
        this->setFlippedX(mDir);
    });
    //膨らませる(元のスケールに戻す)
    auto scaleBigAct = ScaleTo::create(ANIM_TIME_TURN/2,defaultScaleX,this->getScaleY());
    //状態を戻す
    auto callfuncSetState = CallFuncN::create([=](Node* sender) {
        mCharaState = kCharacterStateNone;
    });
    
    //[ポイントA]:
    auto seq = Sequence::create(scaleSmallAct, callfuncTurnPng, scaleBigAct,callfuncSetState, NULL);
    this->runAction(seq);
}

```


#ジャンプの表現
[ポイントB]
1. 上から潰す(Y軸のアンカーポイントを下にした状態で、Scallを数％小さくする)
2. 1の状態で数秒待ち、溜めを表現
3. ジャンプ&Scaleを戻す

1~3を順番に行う事で、紙がぐにゃっと上から曲がって、そのまま飛び上がった感じになります。

```lang:Character.cpp
void Character::jump(int distance)
{
    //ターン中やジャンプ中だったら何もしない
    if(kCharacterStateTurn == mCharaState || kCharacterStateJump == mCharaState)return;

    //ジャンプ状態にする
    mCharaState = kCharacterStateJump;
    
    //左向きの場合は左にジャンプする様に距離をマイナスに
    int l_dis = distance;
    if(mDir == CHARA_DIRE_LEFT)l_dis = -distance;
    //デフォルトのスケールYを保存
    float defaultScaleY = this->getScaleY();
    
    //上部をぐにゅっと少し潰す
    auto scaleSmallAct = ScaleTo::create(ANIM_TIME_JUMP * 0.2f, this->getScaleX(),defaultScaleY * 0.5f );
    
    //溜めを作る
    auto delayAct = DelayTime::create(ANIM_TIME_JUMP * 0.2f);
    
    //潰していたのを戻す
    auto scaleBigAct = ScaleTo::create(ANIM_TIME_JUMP * 0.1f, this->getScaleX(), defaultScaleY);
    //ジャンプ
    auto jumpAct = JumpBy::create(ANIM_TIME_JUMP * 0.5f, Vec2(l_dis, 0), distance * 1.2f, 1);
    //大きさ戻すのとジャンプは同時
    auto spawn = Spawn::create(scaleBigAct, jumpAct, NULL);
    
    //状態を戻す
    auto callfuncSetState = CallFuncN::create([=](Node* sender) {
        mCharaState = kCharacterStateNone;
    });
    
    //[ポイントB]:
    auto seq = Sequence::create(scaleSmallAct, delayAct, spawn, callfuncSetState, NULL);
    this->runAction(seq);
}
```


#その他
キャラクターの周りに白い枠を付けてやると、紙っぽさが増して、ペラペラ感がより出る気がします。
phpで第2土曜日や第4土曜日を取得する

phpで第2土曜日を取得するには、
`<?php
  echo date("Y年 n月j日", strtotime('second sat of this month'));
?>`
で, 2015年 5月16日 と出力される。
これで次の第2土曜日を得る関数ができた。

```php:next_2_sat_day.php
function next_2_sat_gatu_hi(){
if ( intval(date("Ymd")) <= intval(date("Ymd", strtotime('second sat of this month')))) {
            return date("Y年 n月j日", strtotime('second sat of this month'));
} else {
            return date("Y年 n月j日", strtotime('second sat of next month'));
    }
}

echo next_2_sat_gatu_hi();
```
呼び出し結果、2015年 5月26日に実行すると
2015年 6月13日
となる。

参考にしたサイト:
http://php.net/manual/ja/datetime.formats.relative.php
http://php.net/manual/ja/function.date.php
Linuxの/bin、/usr/bin、$HOME/binのそれぞれの役割

この前Scalatraを使うために[Conscript](https://github.com/n8han/conscript)というものをインストールしてて、こいつが`~/bin`ディレクトリを作っていて、あれ、そこなんやと思い調べてみた。

それぞれの`bin`ディレクトリの役割と、あるプログラムをビルド・インストールする時に、`/bin`か、`/usr/bin`か、`~/bin`どこが適切なのかについて。


## まずbinってなんや

まず`bin`ってなんなんや。

binとは、Binary codeのことでようするに実行可能プログラム置き場ということ。バイナリということはコンパイル型の言語により作られたプログラムが置かれるのだろう。


そしてLinuxのディレクトリ構成については以下の記事がすごくよかった。ここで読めておいてよかったなと思った。

http://www.atmarkit.co.jp/ait/articles/0108/07/news002.html


## /bin

まずは`/bin`について

`/bin`には、FHSによって定められたシングルユーザを含めたどのユーザでも使えるコマンドだけが入る。FHSの定めたコマンドにも必須のもの（cat, lsとか）とOSごとに選択できるもの（tar, pingとか）があるらしい。

ここにその一覧がのってた。

http://www.pathname.com/fhs/2.2/fhs-3.4.html

また、

>/binは、NFSを使ってネットワークで共有したり、ROMに収めたりすることを想定していますから、ここにユーザーが新たにコマンドをインストールするべきではありません。
>http://www.atmarkit.co.jp/ait/articles/0108/07/news002_2.html

とのことで、よほどのことがない限りここにコマンドを追加する必要はなさそう。

ちなみに自分のMacでは、

```
$ ls /bin
date       expr       ln         pwd        stty       zsh
bash       dd         hostname   ls         rcp        sync
cat        df         kill       mkdir      rm         tcsh
chmod      domainname ksh        mv         rmdir      test
cp         echo       launchctl  pax        sh         unlink
csh        ed         link       ps         sleep      wait4path
```

といった感じだった。`zsh`とかは自分で追加したとして、`sleep`や`wait4path`はもともとOS Xの`/bin`に追加されてるみたい。

`wait4path`コマンドについは以下。公式のドキュメントがあった。

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/wait4path.1.html


個人的にはFHSの`/bin`の定義に超重要な（と思っていた）`cd`コマンドがないのが面白いなと思った。それだけ`/bin`はツリーの根の部分で作業するために最低限にあるコマンドなのかなと思った。

## /usr/bin

続いて`/usr/bin`について。


>ユーザーが一般的に使用するコマンドで、
緊急時のシステム保守に必須ではないコマンドが配置されます。
>http://www.linuxmaster.jp/linux_skill/2010/02/06linux.html


また、`/usr/sbin`については、


>システム管理コマンドで、緊急時のシステム保守に必須ではないコマンドが配置されます。
>http://www.linuxmaster.jp/linux_skill/2010/02/06linux.html

とある。

なるほど、`/bin`がOSの働きの根幹に関わるような役割をもつコマンドがはいっているのにたいして、`/usr/bin`にはそれよりももっと一般的に使われるようなコマンドが主に入っているみたいだ。

自分のPCだと、`git`や`vi`がここに入っていた。


## ~/bin

そして`~/bin`について。

これまで二つのbinディレクトリの役割からも分かるように、これはログインしているユーザに依存したコマンドを格納することになる。

自分でプログラムをインストールしたりするときは基本的に`~/bin`以下にインストールするのが良い気がする。例えばサーバー用のOSで他のユーザと共有となってしまう形で、コマンドを叩けるプログラムをぼんぼんインストールすべきでないと思うし。

この方のスクリプトとかすごく参考になる。

http://tyru.hatenablog.com/entry/20090510/1241935374

自分で何かツールとかを作った時には、`~/bin`にインストールする設定で書くようにしようと思った。

（Conscript、いけてるやん。。。）



## おわり

ということで`bin`について気になったので調べてみたら、思いのほかすごくおもしろかった。

逆に今まで何故疑問をいだいてググらなかったのだろうと後悔してるけど、当たり前になってしまったこともこれからは積極的にググって理解するようにしたいと思った。

最後まで読んでいただいてありがとうございました。何か間違ったところなどあればご指摘いただけるととてもうれしいです。


## 追記

### 2015/03/27 (Wed) 1:37

`cd`コマンドが`/bin`に入っていないことに言及しましたが、`cd`や`pwd`などは内部コマンドと呼ばれるシェルの機能として提供されているとのことです。

http://begi.net/read/base/11.html

ちなみにbashのコマンドリストは以下に一覧がまとまっています。

http://ss64.com/bash/


一方`bin`ディレクトリ内部で実行可能なプログラムとして置かれているものは外部コマンドと呼ばれています。

コマンドがどちらに属するかは`$ type`コマンドで調べることが出来ます！！type!!!

### 疑問点

- 内部コマンドと外部コマンドの提供され方の違いは分かったような気がするけど、二つに役割の違いというか、分担みたいなものはあるのだろうか。。
elasticmqを使ったsqsとの連携テスト

# 背景
Amazon SQS。自分のサービスにメッセージキューサービスをとても簡単に組み込めて便利。
http://aws.amazon.com/jp/sqs/

しかし、いざそれを使った機能のspecを書こうと思うと、「外部サービスだからstub書かなきゃ」という辛みと、「結合テスト的に実際にAPI叩きたいし」という欲求が出てきて、どうしたらいいのよ :scream: 、という感じになる。

# そりゅーしょん
環境用意すれば良いじゃない！

ElasticMQ
https://github.com/adamw/elasticmq

こちら、**Amazon SQS-compatible interfaces**という素晴らしい特徴を持ったメッセージキューシステムです。

これをローカルに立ち上げれば、そもそも普通の開発の時からローカルでキューシステム使った検証できるし、何よりrspecからキューへの登録、取得などのテストもちゃんとAPIを叩いた上で通すことができる。

# 注意
以下は、rails環境でrspecを利用することを想定しています。

# 準備
まずは、ElasticMQを用意。ローカルに普通にダウンロードしても良いけど、CircleCIとかでの利用を見越すとDockerコンテナとして用意しておくのが良さげ。

```Dockerfile
FROM java:8

# Create working space
RUN mkdir /var/elasticMQ
WORKDIR /var/elasticMQ

# Default port for SQS Local
EXPOSE 9324

# Get the package from Amazon
RUN wget -q https://s3-eu-west-1.amazonaws.com/softwaremill-public/elasticmq-server-0.8.8.jar

# Default command for image
ENTRYPOINT ["/usr/bin/java", "-Djava.library.path=.", "-jar", "elasticmq-server-0.8.8.jar"]
```

# spec_helper
`spec_helper`のほうに、以下の設定を書く。
IPはboot2dockerでelasticmqを立ち上げたときの値なので、必要に応じて`127.0.0.1`とかにすると良い。
ここではサンプルなので、キューの名前も決め打ちで一つだけにしているけど、実際には設定ファイルから読みこんだ値を使うなどよしなに。

```rb
# rspec内では常に以下のクライアントを使う 
sqs_client = Aws::SQS::Client.new(
  region:             'dummy-sqs',
  endpoint:           "http://192.168.59.103:9324",
  access_key_id:      'dummy',
  secret_access_key:  'dummy',
)
```

regionやアクセスキーなどの値は適当な値でも大丈夫そう（今のところ）。aws-sdkのversionが上がったりするとその辺のvalidationが走ってダメになるかも。今回試したのは2.0.42。

```rb
# 事前にqueueを作っておく
# 必要に応じて特定のspecでのみキューを作成するなどにしても良い
config.before(:suite) do
  # 都度都度Clientをstubするのが面倒なので`new`自体をstubする
  allow(::Aws::SQS::Client).to receive(:new).and_return(sqs_client)
  sqs_client.create_queue(queue_name: "sample_jobs")
  # http://192.168.59.103:9324/queue/sample_jobs
  # が作成したqueue_urlとなる
end
```

```rb
# テストが終わったらqueueのメッセージを消す
# purge処理は即時実行される訳ではないので、次のspec実行時にメッセージが残っている可能性あり
config.after(:each) do
  sqs_client.purge_queue(queue_url: "http://192.168.59.103:9324/queue/sample_jobs")
end
```

# spec
以上の準備ができたら、以下のようなモデルとspecを書いてみる。

```
class JobRegister
  class << self
    def client
      Aws::SQS::Client.new(
        region: 'ap-northeast-1' # 実際には決め打ちにすんなよ！
      )
    end

    def register message
      client.send_message(
          queue_url: "http://192.168.59.103:9324/queue/sample_jobs", # この辺も実際にはよしなにね！
          message_body: {
            message: message,
          }.to_json
        )
      end
    end 
  end
end
```

```spec/models/job_register_spec.rb
require 'spec_helper'
describe JobRegister do
  describe '.register' do
    it 'ジョブが登録されていること'
      described_class.register "hello"
      message = described_class.client.receive_message(queue_url: "http://192.168.59.103:9324/queue/sample_jobs").messages.first
      expect(JSON.parse(message.body)["message"]).to eq "hello"
    end
  end
end
```

というspecが通るようになる。

# 注意
queue_urlに`localhost`を使うには、
http://dev.classmethod.jp/server-side/ruby-on-rails/ruby_aws-sdk-core_elasticmq_sqs/
に記載のある通り、パッチを当てる必要がある。しかし、aws-sdkの実装を見る限り"."でsplitした結果からregionを取得してるようなので、"127.0.0.1"のように"."さえ入っていればパッチは当てなくても動いた。

# まとめ
とりあえずrspecからelasticmqを叩けた。CircleCIにコンテナを持って行けば、CI環境で結合テストも可能。
Terraform 関連記事 #terraform

更新日: 2015/05/25 23:51:30

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Terraform で Ruboty-Gacha アプリケーション を Heroku に構築](http://qiita.com/tbpgr/items/0e2487af7bd698153994)|2015/05/23 00:13:06|0|
|2|[インフラ維新 ハシモトプロダクト Terraform の設定ファイル](http://qiita.com/tbpgr/items/ba5565dbbf69dc092e24)|2015/05/25 23:47:08|0|
|3|[ハシモトさんの頭に広がる宇宙 Terraform とは？](http://qiita.com/tbpgr/items/a0a31c433f65e58368c6)|2015/05/23 00:06:12|1|
初めてのPython

今日からPythonを始めました。
プログラムに関する知識もあまりありません。
今日勉強したコードについてまとめていこうと思います。


**文字列型**
split(",") : 自分自身を特定の文字列 (,) で区切る。
index(",") : 引数で指定した文字 (,) が、最初に出てくるのが何文字目かわかる。

**datetimeモジュール**
date,time,datetime型のモジュールを読み込むためには、importで読み込む必要がある。これはどのモジュールにも共通している。

**date型**
今日：kyou = datetime.date.today()
曜日を調べる：kyou.weekday()

**datetime型**
今：datetime.datetime.now()

**リスト型**
list[-1]：最後の要素にアクセス　
append：リストの最後に要素を追加。
insert(a,b)：添字aの場所にbを挿入。
pop(a)：添字aの要素を削除。
remove(a)：要素aを指定して削除。
extend(list)：listの要素をすべて追加。
list[0:3]：０番目から始まって３番目の１つ手前までの要素を取り出す。
sort()：小さい順に並び替え。文字の場合はアルファベット順（大文字が前に来る）
reverse()：順序をさかさまにする。

**辞書型**
キー(key)と値(value)をペアで保存し、キーを使って値を呼び出す。
形式は、country_code={1:"America",39:"Italia",86:"China"}
数字がキーで、国が値。
country_code[39]でItaliaが取り出せる。

ありがとうございました！
スライド表示とマスター表示を切り替えるPowerPointマクロ

# やりたいこと

スライドを編集中に、一瞬でマスタ表示に切り替えたい。

# ソースコード

```vbnet:Module1
Option Explicit

'スライド表示とマスター表示を切り替える
Public Sub SwichView()
    Dim i As Integer
    
    If cView = "Slide" Then
        If ActiveWindow.Selection.Type = ppSelectionNone Then
            Call ShowMaster
        Else
            i = ActiveWindow.Selection.SlideRange.CustomLayout.Index
            Call ShowMaster
            ActiveWindow.View.Slide.CustomLayouts.item(i).Select
        End If
    ElseIf cView = "Master" Then
        Call ShowSlide
    Else
        MsgBox "スライドかマスターを表示してください"
    End If
End Sub

'マスターを表示
Private Sub ShowMaster()
    Application.ActiveWindow.ViewType = ppViewMasterThumbnails
End Sub

'スライドを表示
Private Sub ShowSlide()
    Application.ActiveWindow.ViewType = ppViewSlide
    Application.ActiveWindow.ViewType = ppViewNormal
End Sub

'表示されているビュータイプを判定する関数
Private Function cView() As String
    Dim p As Pane
    
    For Each p In ActiveWindow.Panes
        If p.ViewType = ppViewSlide Then
            cView = "Slide"
            Exit Function
        ElseIf p.ViewType = ppViewSlideMaster Then
            cView = "Master"
            Exit Function
        End If
    Next
    cView = "Others"
    
End Function
```

#注意
~~スライドを選択していない時だとエラーが出るかも。エラー処理は追って追加します。~~ 修正済。
スライドを選択しているときは、スライドに対応したマスターのレイアウトを選択する。
なお、マスターが複数ある場合には対応していない。

#参考

1. [スライドマスタを簡単に表示する−Shiftキー＋標準表示ボタン](http://www.relief.jp/itnote/archives/003892.php)

1. [PPTのVBAについて質問です。 PowerPointの](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1392249063)
PukiWikiの認証パスワード

XREAサーバーに置いてあるPukiWikiで、いつの間にかログイン出来ないようになってしまいました。
Basic認証のパスワードが比較的簡単なものだったので、「もしかして乗っ取りか！？」と焦りました。

[FastCGI版PHP環境で、PukiWikiのBasic認証（auth）を有効にする | rtwiki管理人日記](http://blog.rtwiki.net/pukiwiki/fastcgi_auth/)
こちらの記事によると、CGI版のPHP環境では、PukiWikiの認証機能が使えないとのこと。
先月はログインできてたので、サーバーのメンテナンスで僕のサーバーも最近変わったのでしょうかね？

こちらの記事に従って書き換えれば認証パスワードを変えられます。
[PukiWiki/Install/ユーザ認証 - PukiWiki-official](http://pukiwiki.osdn.jp/?PukiWiki/Install/%E3%83%A6%E3%83%BC%E3%82%B6%E8%AA%8D%E8%A8%BC)

そしてXREAでPukiWikiの認証を有効にするため、

```text:.htaccess
...
SetEnvIfNoCase Authorization "^(Basic .*)$" HTTP_AUTHORIZATION=$1
```

と追記します。

MD5はまだ詳しくないのですが、逆変換が難しいので軽く暗号化ができる、という認識で合ってますかね？
そして、[オンラインのMD5生成ツール](http://www.kiyori.co.jp/md5reverse/)は、変換したMD5符号が辞書登録されてしまい、逆変換が容易になってしまう、という危ないインターネットなのですね。（MD5=暗号化 という認識が正しいなら。）

[MacでMD5, SHA1を確認する。 - Qiita](http://qiita.com/norioc/items/8f57744da8a8dd5fbc6c)
でテキストファイル等のMD5を確認できるようですが、
PukiWikiで使うMD5はおそらくMacのmd5コマンドやopenssl md5コマンドとは生成されるコードは違うようです（すごく語弊がありそう）。

{x-php-md5}
でパスワードを生成するには以下のように自前のPukiWikiにクエリを付けてアクセスすれば生成ツールを開けます。
[Tips - Pukiwikiでパスワード設定](http://snakamura.org/tips/index.php?Pukiwiki%A4%C7%A5%D1%A5%B9%A5%EF%A1%BC%A5%C9%C0%DF%C4%EA)

復活。。
PowerPointのViewTypeを取得

PowerPointで表示している画面のタイプを取得するには、ppViewTypeというプロパティを調べる。
なお、このプロパティは、ウィンドウごとだけでなく、ペインごとに調べられる。

#### ppViewTypeの種類

|名前|値|説明|
|:---|:---:|:---|
|ppViewHandoutMaster|4|配布資料マスター|
|ppViewMasterThumbnails|12|マスターのサムネイル|
|ppViewNormal|9|標準|
|ppViewNotesMaster|5|ノート マスター|
|ppViewNotesPage|3|ノート|
|ppViewOutline|6|アウトライン|
|ppViewPrintPreview|10|印刷プレビュー|
|ppViewSlide|1|スライド|
|ppViewSlideMaster|2|スライド マスター|
|ppViewSlideSorter|7|スライド一覧|
|ppViewThumbnails|11|サムネイル|
|ppViewTitleMaster|8|タイトル マスター|

#### ペインとは
下図を見れば、理解しやすい。PowerPoint2003の画面だけど、考え方はPowerPoint2013でも同じ。

![Panes.PNG](https://qiita-image-store.s3.amazonaws.com/0/80231/d7e2081e-ebb0-3e80-dd8a-8bea90ecb807.png)

## 表示画面を取得するPPTマクロ

まずはコードから。

```vbnet:Module1
Sub ViewTypeCheck()
    Dim w As DocumentWindow
    Dim p As Pane

    'ウィンドウのppViewType
    Set w = ActiveWindow
    Debug.Print "ウィンドウ: " & w.ViewType

    'ペインのppViewType
    For Each p In ActiveWindow.Panes
        Debug.Print "ペイン: " & p.ViewType
    Next
    
End Sub
```

## 使い方
下記のウィンドウがアクティブのときに、上記マクロを使うと、下のような結果が返る。
![PPT.PNG](https://qiita-image-store.s3.amazonaws.com/0/80231/c748f124-459b-6764-6c89-5f50cf8daae8.png)

```vbnet:イミディエイトウィンドウ
ウィンドウ: 9
ペイン: 11
ペイン: 1
ペイン: 3
```

ウィンドウは標準で、各ペインはサムネイル、スライド、ノートを表示している。

## 参考

1. [PpViewType 列挙 (PowerPoint)](https://msdn.microsoft.com/ja-jp/library/office/ff745945.aspx)

1. [パワーポイントの画面構成](http://www.k-fix.jp/skill/app/pp/page02.html)
Ruby レシピブック第3版読みながらのメモ

[第8回 ベイサイドRuby on Rails勉強会@マスマス](http://connpass.com/event/15453/) で [Rubyのレシピブック第3版](http://amzn.to/1KunyFT)を読んでいて気づいたことの記録です。

## リテラル

### 001 数値リテラル

- `0xffffff`、`0777` でそれぞれ16進数、8進数になる。

8進数のは`0o777`でもOK。他の表記との整合性を考えると8進数の`0o777`の方がわかりやすい気がするけど、Chefのサンプルとかだと省略のほうが多かったからどっちがいいんだろう。

- 大きな数字を扱う時に`1.4e5`などの表記ができる。

```rb
pry(main)> 1.4e5
=> 140000.0
[11] pry(main)> 1.4e5.class
=> Float
[12] pry(main)> 4e4
=> 40000.0
[13] pry(main)> 4e4.class
=> Float
```

Floatじゃ丸め誤差が出るのでBigDecimalでこれを使わせて欲しいなあ。
あと、`4e4`などでもFloatになるようなので注意

### シンボルリテラル

- シンボルには空白が含められる

`:"symbol 123"`みたいなの。何に使うのこれ…。

### Procリテラル

- `lambda{|x| p x}` が `->(x){p x} でかける

Procの便利さがまだよくわからないのでパス

## 002 演算子

特に感想なし

## 003 変数と定数

### 擬似変数

`true`,`false`,`nil`って擬似変数なんだ。

## 004 代入

- これがエラーにならない

```rb
a = 0 if false
p a #=> nil
```

## 005~007

特に感想なし

## 008 繰り返し

- `next`の代わりに`redo`を使うと同じものをもう一度繰り返す

`redo`初めて知ったけど、これ使うコードは読みにくそう。
何か`redo`を使ったほうがいいのがあるのかな？

## 009 メソッド呼び出し

- メソッドの呼び出し対象となるオブジェクトを**レシーバ**と呼ぶ

知らなんだ。

## 010~014

特に感想なし

## 015 特異メソッド

どういうメソッドかはわかるけどいつ使うのこれ？

## 017 alias と undef

- undef でメソッドを使用不可にできる

```rb
undef :some_method
```

## 018~026

特に感想なし
LaravelでMigrationを使ったSQLiteデータベースの作成

LaravelのMigration（移動）機能をつかってデータベーステーブルを作っていきます。

この機能を使う理由として普通に最初から.sqlを使ってデータベースを作ると、あとでカラムを増やしたいとき面倒なことになるためです。しかしPHPでMigrationファイルを作っておくことで後で変更がしやすくなります。

データベースを作成する前にLaravelプロジェクトの設定を行います。
プロジェクト/app/database/以下にあるdatabase.phpを開きます。
すると、データベースのデフォルト設定がMySQLになっているので、それを
`'default' => 'sqlite'`に変えます。
これで設定終了です。


そしてこれから、LaravelのコマンドでMigrationファイルを作成します。

`php artisan migrate:make ファイル名`

これでプロジェクト/app/database/migrations/以下にファイルが作成されました。

開いてみると、

```lang:Migrationファイル.php
<?php
use Illuminate\Database\Migrations\Migration;
class CreateProductsTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
}
/**
* Reverse the migrations.
* 
* @return void
*/
public function down()
{
}
}
```
みたいな感じになってます。

中にup()とdown()２つの関数があります。

up()はテーブル作成のための関数で、down()がテーブルをドロップするための関数です。

それではup()内で簡単なプロダクト管理のデータベースをつくっていきます。
テーブルを作る関数は
`Schema::create()`
です。
例えば、


```

public function up()
{
　　　Schema::create('products',
　　　function($table)
　　　{
　　　　$table->increments('id');
　　　　$table->string('name');
　　　　$table->float('price');
     $table->timestamps();
　　　});
}
```
というふうに、
productsという名前のテーブルにid, name, priceのカラムを作りました。timestampsは作成時刻と変更時刻を自動的に作成してくれます。

次は、down()です。

```
public function down()
{
　　　Schema::drop('products');
}
```
簡単ですね。

そして、MigrationファイルをもとにLaravelコマンドで実際にアプリケーション上にテーブルを作成します。
`php artisan migrate`

これでテーブルができたはずです。
確かめてみましょう。

Laravelのデータベースファイルはプロジェクト/app/database/以下のproduction.sqliteです。

そこで、
`sqlite3 production.sqlite`
次に、
`.table`
で作成されたテーブルを確認します。
`migrations products`
このようになるはずです。migrationsというデータベースもありますね。
ちなみに`.schema`でカラムの確認もできます。

LaravelのSchema関数はほかにもあるので詳しくはLaravelのサイトで、
[Laravel公式サイト](http://laravel.com/docs/4.2/schema)