OmniAICreator/Qiita-1.07M huggingface dataset:
AWS コマンドラインインターフェイス(Python/awscli)をMac OS Xで利用する手順

Macの環境が会社のマシンでまだ整っていなかったついでに手順を。

http://aws.amazon.com/jp/cli/

Pythonのpipコマンドのインストール方法が昔と変わっています。brewのガイドですぐわかりますが、以前はpythonのeasy_installにパスが通っていなかったところ、Mavericksではパスが通っているのでsudoが必要になるようです。

そうですか。sudoが必要ですか。残念。

```shell-session:command
# install python
brew install python
# install pip command
sudo easy_install pip
# install aws cli
sudo pip install awscli
# set completer
complete -C aws_completer aws
```

インストールはこれだけでOK。環境変数を設定します。

```shell-session:.bash_profile
export AWS_ACCESS_KEY_ID="Your access key"
export AWS_SECRET_ACCESS_KEY="Your secret access key"
```

再読み込み

```shell-session:command
source $HOME/.bash_profile
```

使ってみます。

```shell-session:command
aws s3 ls
```

バケットの一覧が表示されれば問題なく動作しています。
コマンドラインツールは以前よりかなり充実しているので便利ではあるのですがオプションが多すぎてタブでサジェストがでないと使いづらい感は否めませんね。

s3のコマンドがjavaのコマンドラインツールに比べて増えているのはうれしいところです。ls, cp, rm, mvなど基本コマンドが使える他、mb (make bucket)とrb(remove bucket)を利用できます。
またフォルダ内のファイルを同期するためのsyncを利用できます。

```shell-session:command
# create bucket
aws s3 mb --region=ap-northeast-1 s3://testcreatebucketforpcli
# ls
aws s3 ls s3://testcreatebucketforpcli
# sync local to s3
aws s3 --region=ap-northeast-1 sync . s3://testcreatebucketforpcli/tmp
```

javaのコマンドラインツールより多くのことができます。s3のコマンドがあるのはいいのですけど相変わらずなんだかなぁという感じで使いづらいですね。

個人的にどういうインターフェースが使いやすいのか今後考えてみたいと思います。
do_postgresのインストールに失敗

gem install do_postgres したら失敗

~~~
gem install do_postgres
Fetching: do_postgres-0.10.13.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing do_postgres:
	ERROR: Failed to build gem native extension.

        /var/lib/jenkins/.rbenv/versions/1.9.3-p448/bin/ruby extconf.rb
checking for main() in -lpq... no
checking for main() in -llibpq... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/var/lib/jenkins/.rbenv/versions/1.9.3-p448/bin/ruby
	--with-pgsql-server-dir
	--without-pgsql-server-dir
	--with-pgsql-server-include
	--without-pgsql-server-include=${pgsql-server-dir}/include
	--with-pgsql-server-lib
	--without-pgsql-server-lib=${pgsql-server-dir}/lib
	--with-pgsql-client-dir
	--without-pgsql-client-dir
	--with-pgsql-client-include
	--without-pgsql-client-include=${pgsql-client-dir}/include
	--with-pgsql-client-lib
	--without-pgsql-client-lib=${pgsql-client-dir}/lib
	--with-pqlib
	--without-pqlib
	--with-libpqlib
	--without-libpqlib
Could not find PostgreSQL build environment (libraries & headers): Makefile not created


Gem files will remain installed in /var/lib/jenkins/.rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1/gems/do_postgres-0.10.13 for inspection.
Results logged to /var/lib/jenkins/.rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1/gems/do_postgres-0.10.13/ext/do_postgres/gem_make.out
~~~

PATHにpostgreSQLのbinディレクトリを指定してから
gem installするとインストール成功

~~~
export PATH="/usr/pgsql-9.2/bin:$PATH"
gem install do_postgres

Fetching: data_objects-0.10.13.gem (100%)
Fetching: do_postgres-0.10.13.gem (100%)
Building native extensions.  This could take a while...
Successfully installed data_objects-0.10.13
Successfully installed do_postgres-0.10.13
2 gems installed
~~~
Sliderのchangeイベントが取得する方法


ちょっとハマったのでメモ。

##概要
inputタグのsliderの値が変更された時のイベントを設定したい。
jQueryMobileの公式Demoなどを見ると、input要素にイベントをバインドすると書いてあるけど上手く行かなかった。
色々調べた結果、onイベントを使ってイベントを設定すれば良いということが分かった。

##サンプル

HTML要素

```html
<div id="Div1">
    <label for="Slider">BPM</label>
    <input type="range" name="slider" id="Slider" value="150" min="30" max="400" />
</div>
```

できなかった例

```JavaScript
$("#Slider").bind("change", function(){
    alert(1);
});

$("#Slider").change(function(){
    alert(1);
});
```

できた例

```JavaScript
$("#Div1").on("change", "#Slider", function(){
    alert(1);
})
```

つまりSliderの実態はjQueryで動的に作られる要素ということだろうか。
実際に生成されたhtmlを見てみると、inputタグの下にスライダー部分の要素が作られていることが分かる。

[参考]#15 onメソッドを使ってみよう
http://dotinstall.com/lessons/basic_jquery_v2/25215
Playで外部ライブラリを内部開発する場合にキャッシュではまる解決メモ (MacOS X)

Play Frameworkを利用する場合に外部ライブラリを内部開発して内部のローカルリポジトリにアップロードする体制にした場合に、キャッシュに悩まされたのでメモ。

playのバージョンは2.2.0

ローカル開発しているjarライブラリのバージョンは頻繁に変更したくないのでバージョンをそのままでアップロードしながら開発した場合にplayが独自にmavenやIvyのリポジトリをキャッシュする。

playのガイド的には

```shell-session:clearcache
play dependencies --clearcache
```

これで解決するはずなのですがどうにもうまく動いてくれない時がある。

仕方ないのでplayインストールフォルダ内のlibexec/repository/cacheの下の対象グループ名フォルダを削除して解決とした。
Mac OS Xにhomebrewでインストールしている場合は下記フォルダ。

/usr/local/Cellar/play/2.2.0/libexec/repository/cache

いつもは上記のコマンドだけで解決するのだがたまに発生する。
原因調査はまた今度。
Chef使い方


chef用のディレクトリを作る
mkdir my-repo
cd my-repo
knife solo init chef-repo
cd chef-repo

gitに上げる
git init
git add .
git commit -m 'first commit'


vagrantの場合の設定
vagrantの設定ファイルにあるIPアドレスの設定をコメントアウトして有効にする
ドメインとかもろもろを設定してくれるコマンドをいれる
vagrant ssh-config --host ドメイン >> ~/.ssh/config

サーバにレシピを適用するために、Chefを外部サーバーにインストールする

VPSとかの場合
knife solo prepare -i 公開鍵　root@[セットアップ先サーバーのIPアドレスもしくはドメイン
公開鍵設定していない場合-iを入れなければ、普通にパスワードが聞かれる

vagrantの場合は
knife solo prepare ドメイン

cookbook作成
knife cookbook create クックブック名 -o site-cookbooks/

knife solo cook  ドメイン

以下のファイルにインストールしたいソフトとかを記入していく
vim site-cookbooks/クックブック名/recipes/default.rb
mavenのインハウスリポジトリを作るよ

たまに、mavenのリポジトリに無いライブラリとかありますよね？
または、既存ライブラリをオレオレ用にどうしても修正しなくなってはならなくなってしまったとき。

## install:install-file

そんな時はローカルのjar に対して、

```shell-session
mvn install:install-file -Dfile="httpclient/r10949/httpclient.jar" -DgroupId=new.gyu -DartifactId=httpclient -Dversion=r10949 -Dpackaging=jar
```

こんな感じにローカルにインストールすることで依存性が解決されます。

一人の時はこれでいいのですが、人数が増えてくるとメンバーに上記の手順をやらせるとかちょっとダサい。
そんな時には自社内にインハウスリポジトリを作るのがオススメです。

## インハウスリポジトリを使う

### インハウスリポジトリをつくる

インハウスリポジトリを作るのは簡単です。
普通にhttpアクセスできる場所を作ればOKです。

```apache:mvn.conf
Alias /mvnrepo/ "/home/mvn/repo/" 

<Directory "/home/mvn/repo">
    Options Indexes
    Order allow,deny
    Allow from all
</Directory>
```

例えばこんな感じ。

### インハウスリポジトリにデプロイするための設定

デプロイ方法は http put ,WebDAV,SCP色々有るみたいですが、フツーscpでいいでしょう。

#### 既存ライブラリを修正する場合

mvnプロジェクト化されているものをであればpom.xmlを修正します。

```xml:pom.xml
  <distributionManagement>
    <repository>
      <id>my.repo</id>
      <name>Inhouse</name>
      <url>scp://myserver/home/mvn/repo</url>
    </repository>
  </distributionManagement>

     :
<build>
    <extensions>
      <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-ssh</artifactId>
        <version>2.5</version>
      </extension>
    </extensions>
</build>
```

※ wagon というプラグインを使わないとSCPでのアップロードはできないようで。。

#### 有り物のjarを登録したい場合

```shell-session
mvn deploy:deploy-file -Durl=scp://xxx.xxx/home/mvn/repo \
                       -DrepositoryId=my.repo \
                       -Dfile=./httpclient.jar \
                       -DgroupId=new.gyu\
                       -DartifactId=httpclient \
                       -Dversion=r10949  \
                       -Dpackaging=jar
```

これでインハウスリポジトリ用のサーバにアップロードされます。

### インハウスリポジトリを使う

俺のプロダクトのpom.xml に

```xml:pom.xml
<repositories>
        <repository>
            <id>my.repo</id>
            <name> Inhouse</name>
            <url>http://xxx.xxx.xx/mvnrepo/</url>
        </repository>
</repositories>
```

を足せば、このリポジトリも探しに行ってくれます。
ActiveRecordと機械学習のライブラリai4rをつないでくれるcabalistを試してみた

Rubyの機械学習用ライブラリ[ai4r](https://github.com/SergioFierens/ai4r)をRailsのActiveRecordで使えるようにするための[cabalist](
https://github.com/marcinwyszynski/cabalist)を試してみた。

## 結論
Railsの世界で2年前のものは大昔のものですよねー、という直感が正しかった。
依存しているlibraly(leveldb?)のbindingが読み出せない。
ので、諦めました。

## やったこと

一応何をしたかを書いておく。

```
brew install leveldb
```

Gemfileに追記

```
gem 'cabalist'
```

```sh
$ bundle install
cabalist (master) $ be rspec spec/cabalist/
Resolving dependencies...
Bundler can't satisfy your Gemfile's dependencies.
Install missing gems with `bundle install`.
Fetching gem metadata from http://rubygems.org/.........
Fetching gem metadata from http://rubygems.org/..
Resolving dependencies...
Using rake (10.1.0)
...
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
```

モデル書いてrake:migrateやっても、うまくいかないので、オリジナルをcloneしてrspecを走らせる

```sh
$ git clone https://github.com/marcinwyszynski/cabalist.git
$ cd cabalist
$ bundle exec rspec spec/cabalist/
Resolving dependencies...
The Gemfile's dependencies are satisfied
dyld: lazy symbol binding failed: Symbol not found: __ZN6snappy19MaxCompressedLengthEm
  Referenced from: /Users/michiaki-ariga/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/leveldb-ruby-0.15/lib/leveldb/leveldb.bundle
  Expected in: flat namespace

dyld: Symbol not found: __ZN6snappy19MaxCompressedLengthEm
  Referenced from: /Users/michiaki-ariga/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/leveldb-ruby-0.15/lib/leveldb/leveldb.bundle
  Expected in: flat namespace

Trace/BPT trap: 5
P427@michiaki-ariga:cabalist (master) $ bundle exec rspec spec/cabalist/
dyld: lazy symbol binding failed: Symbol not found: __ZN6snappy19MaxCompressedLengthEm
  Referenced from: /Users/michiaki-ariga/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/leveldb-ruby-0.15/lib/leveldb/leveldb.bundle
  Expected in: flat namespace

dyld: Symbol not found: __ZN6snappy19MaxCompressedLengthEm
  Referenced from: /Users/michiaki-ariga/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/leveldb-ruby-0.15/lib/leveldb/leveldb.bundle
  Expected in: flat namespace

Trace/BPT trap: 5
```

う…bindingがうまくいかんやつだ…
諦めよう…
Otto を使って快適 pub/sub 生活


## Otto って
色々なライブラリをオープンソースとしてくれている [square](http://square.github.io/) による event bus 用の[ライブラリ](http://square.github.io/otto/)です。

```
Otto is an event bus designed to decouple different parts of your application while still allowing them to communicate efficiently.
```
(from [公式](http://square.github.io/otto/))

### event bus って
レイヤーの上から下のモジュールを呼ぶ場合は、素直にメソッドをコールすることで実現できます。
ですが、反対向きの場合だとコールバックを用意したりで色々面倒ですよね。
その問題を解決するための仕組みです。

具体的には pub/sub をクラスベースでシンプルに書けるような感じ。

## 従来の書き方
- `android.graphics.Point` を publish したい場合

### publish side

```java
void doPublish(Context context, Point point) {
    Intent intent = new Intent(SubscribeFragment. ACTION_POINT_PUBLISH).
        putExtra("x", p.x).
        putExtra("y", p.y);

    context.sendBroadcast(intent);
}
```

### subscribe side

```java:SubscribeFragment.java
static final String ACTION_POINT_PUBLISH = "some.unique.string";

BroadcastReceiver mValueReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Point point = new Point();
        point.x = intent.getIntExtra("x", 0);
        point.y = intent.getIntExtra("y", 0);

        receiveValue(point);
    }
};

void receiveValue(Point point) {
    // do stuff
}

@Override
public void onResume() {
    super.onResume();

    IntentFilter filter = new IntentFilter(ACTION_VALUE_PUBLISH);
    getActivity().registerReceiver(mValueReceiver, filter);
}

@Override
public void onPause() {
    getActivity().unregisterReceiver(mValueReceiver);

    super.onPause();
}
```

### 所感
- わざわざ Intent に入れたり出したりするのとかイケてない
- めんどい
	- Broadcast したい対象が複数になったりすると、さらにめんどい

## Otto を使うと
### publish side

```java
void doPublish(Context context, Point point) {
    BusHolder.get().post(point);
}
```

### subscribe side

```java:SubscribeFragment.java
@Subscribe
void receiveValue(Point point) {
    // do stuff
}

@Override
public void onResume() {
    super.onResume();

    BusHolder.get().register(this);
}

@Override
public void onPause() {
    BusHolder.get().unregister(this);

    super.onPause();
}
```

### singleton

```java:BusHolder.java
class BusHolder {
    static Bus mBus = new Bus();

    static Bus get() {
        return mBus;
    }
}
```

### 所感
- アノテーション付けるだけで良いのが素敵
- 自作クラスだろうとフレームワークのクラスだろうと気にせず post すれば (大体) おっけー
- 複数クラスを subscribe する場合はメソッドを増やすだけでよい (!!)

## and more
- Otto は guava の EventBus を fork して Android に最適化してある
- greenDAO などで有名な greenbot さんも独自実装の event bus を [公開](https://github.com/greenrobot/EventBus) してくれています
Javascriptメモ：POSTデータの受信

参考ページ（http://okwave.jp/qa/q2517418.html）

##### Javascriptはクライアント側のスクリプト言語なので、基本的にPOSTデータの受信は不可能 #####
が、PHPの力を借りればどうやら話は別らしい。

例えばこんな感じ

###### 送信側（post.html） ######

```html

<form action="./posted.php" method="post">
   <select name="yourChoice">
      <option value="a">A</option>
      <option value="b">B</option>
      <option value="c">C</option>
   </select>
   <input type="submit">
</form>

```

###### 受信側（posted.php） ######

```html

<script>
   var postedData = <?php echo($_POST['yourChoice']); ?>;
   alert(postedData);
</script>

```

個人的にはPHP苦手だけど、こういうこと知るとやっぱり勉強したほうがいいのかなと思う
SharedObjectをパッと消す方法




# 以下でパッと消せる
FlashPlayerで右クリ → [設定] → 3番目のタブ→

![storage.png](https://qiita-image-store.s3.amazonaws.com/0/2631/175210dc-0e7b-a447-ec72-dd86aaef5268.png "storage.png")

0kbにして削除 → 100kbに戻す。

現在表示しているドメインだけ消せる。

GUIで消せるからうれしい。



# 以下、SharedObjectの保存場所 (Macですいません)


## ChromeのPepperPlayer

    ~/Library/Application Support/Google/Chrome/Default/Pepper Data/Shockwave Flash/WritableRoot

## 普通のFlashPlayer

    /Users/ユーザー名/Library/Preferences/Macromedia/Flash Player/#SharedObjects/
Pythonでlet式を使う

`パッケージ化しました` -> [hachibeeDI/letexpr](https://github.com/hachibeeDI/letexpr)

ネタです

[PythonでStateモナド](http://qiita.com/hatchinee/items/4e13996017284fefa00c)
の記事を書いていて、PythonでもHaskellみたいなlet式が欲しいなって思ったので考えてみました。

そしたら、関連する投稿に
[letを作ってLet's 1行プログラミング](http://qiita.com/azyobuzin/items/7296c66a5facbefbf696)
というものがあったので、流用していい感じにします。
と思ったのですが、ざっと見た感じこれはapplyっぽいので流用は断念しました。なのでがんばります。


let式は、let内で束縛を行い、inで式を評価するようです。
また、let内で束縛した変数はlet式全体から参照することが出来るみたいです。

とりあえず結果を変数的な何かに束縛して、inで使えるようにしましょう

```py
class let(object):
    def __init__(self, action=None):
        if action is None:
            name, act = action
            self.lets = {name: act()}
        else:
            self.lets = {}

    def __or__(self, action):
        ''' :type action: (str, func) '''
        name, f = action
        self.lets[name] = f()
        return self

    def in_(self, func):
        return func(**self.lets)

if __name__ == '__main__':
    x = let(('xx', lambda : 1 + 2)) | ('y', lambda : 'yyy') | ('z', lambda : 5)
    print x.in_(lambda xx, y, z: str(xx) + y + str(z))
```

　　
一応形になりました。
ですが、このままだとlet式同士での値の参照が出来ないのでいい感じにしてやります。

上記のように、Pythonでは関数の引数に対して`**辞書`を渡すことで、keyに対応する引数にvalueを渡すことが出来ますが、いくつかの評判の良い言語などとは違い引数の過不足に対してはエラーを吐いてきます。
つまり、`self.lets_`内に保存している結果の中で、各々が必要としている値のみを渡す必要があるわけです。

　　

こういうとき`inspect`モジュールが便利なんですよ、ということで`getargspec`関数を使って必要な引数のみ渡してやります。

```py
from inspect import getargspec


class let(object):
    def __init__(self, action=None):
        if action is not None:
            name, act = action
            self.lets = {name: act()}
        else:
            self.lets = {}

    def __or__(self, action):
        ''' :type action: (str, func) '''
        name, f = action
        require_arg_keys = getargspec(f).args
        self.lets[name] = f(
            **self.__extract_require_args(require_arg_keys)
        )
        return self

    def __extract_require_args(self, arg_keys):
        return {k: v for k, v in self.lets.iteritems() if k in arg_keys}

    def in_(self, func):
        require_arg_keys = getargspec(func).args
        return func(
            **self.__extract_require_args(require_arg_keys)
        )
```

　　

では、実際に色々な引数を要求する式を渡して試してみます。
インデントとかもカッコよくしましょう。

```py
    measure = \
        (let()
            | ('x', lambda : 10)
            | ('y', lambda : 20)
            | ('size', lambda x, y: x * y)
            | ('hoge', lambda x, y: 'fooo')
        ) \
        .in_(lambda x, y, size:
             'x = {x}, y = {y}, x * y = {size}'.format(x=x, y=y, size=size))
    print measure  # => x = 10, y = 20, x * y = 200
```

やりましたね。
現状だと、上から下に評価していってるので、下にあるラムダから上の値を取得することは出来ませんが、頑張って式の評価を遅延させたりすればそれも出来るようになりそうですね。
もっとも普通に書いた方が普通に読めるので普通が一番だと思いました。
ubuntuにdebパッケージでMySQL5.6をインストール･アンインストール。

apt-get でインストールできない場合に、公式debパッケージからMySQL5.6をインストールする方法。

# インストール

dpkg -i だけではダメで、ユーザやらの設定も必要。

## ダウンロード
[Download MySQL Community Server](http://dev.mysql.com/downloads/mysql/) で Platform に Debiun Linux を選択すると mysql-5.6.14-debian6.0-x86_64.deb をダウンロードできる。
実のところ次のコマンドでいいんだけど、URLが変わるかもしれないので注意

```
wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.14-debian6.0-x86_64.deb
```

## パッケージインストール
おまちかねの dpkg -i

```
sudo dpkg -i mysql-5.6.14-debian6.0-x86_64.deb
sudo apt-get upgrade
sudo apt-get install libaio1
```
libaio1 も必要なのでapt-getでインストールしよう

## mysqlユーザの追加

```
sudo groupadd mysql
sudo useradd -r -g mysql mysql
sudo chown -R root:root /opt/mysql
sudo chown -R mysql:mysql /opt/mysql/server-5.6
```

## MySQL初期設定
```
sudo install -o mysql -g mysql -d /data/mysql
sudo -u mysql /opt/mysql/server-5.6/scripts/mysql_install_db --user=mysql --datadir=/data/mysql
```

## MySQLの設定ファイルを作る

```
sudo vi /etc/my.cnf
```
ファイルの中身

```
[mysqld]
basedir = /opt/mysql/server-5.6
datadir = /data/mysql
```

## MySQLの自動起動設定
```
sudo cp /opt/mysql/server-5.6/support-files/mysql.server /etc/init.d/mysql
sudo update-rc.d mysql defaults
sudo /etc/init.d/mysql start
```

## mysqlコマンドにパスを通す
```
sudo vi /etc/profile.d/mysql.sh 
```
中身はこんな

```
PATH="/opt/mysql/server-5.6/bin:$PATH"
MANPATH="/opt/mysql/server-5.6/man:$MANPATH"
```
実行権限を付ける

```
sudo chmod 755 /etc/profile.d/mysql.sh
```
bashコマンドを実行するだけではダメで、ログインしなおさないと有効にならない。

## 動かす
ログインしなおして次のコマンドを実行すれば起動しているMySQLに接続できる。

```
mysql
```

## おまじない
既に動くのだけど、最低限のセキュリティを設定するスクリプトがあるので実行する。/opt/mysql/server-5.6/bin 配下のコマンドなので、やはりログインしなおしてから実行するのが吉

```
mysql_secure_installation
```
rootのパスワードに何か設定して、あとは全部Yでいい。



# アンインストール

## mysqlコマンドのパスを消す
```
sudo rm /etc/profile.d/mysql.sh
```

## 自動起動設定を消す
起動していれば終了します。

```
ps -ef|grep mysql
sudo /etc/init.d/mysql stop
```

自動起動の設定を消します。

```
sudo update-rc.d -f mysql remove
```

起動スクリプトも消します。

```
sudo rm /etc/init.d/mysql
```

## 関連ファイルを消す

```
sudo rm /etc/my.cnf
sudo rm -rf /data/mysql/
```

/data が空になった場合は、/dataも消します。

```
sudo rmdir /data
```

## mysqlユーザを消す
所有権をrootに変更して、ユーザを削除します。

```
sudo chown -R root:root /opt/mysql/server-5.6
sudo userdel mysql
```

## パッケージアンインストール

```
sudo apt-get remove libaio1
sudo dpkg --purge mysql
```

/opt/mysql フォルダが残ることがあるので手動で消します。

```
sudo rm -rf /opt/mysql/
```


# 参考サイト
## MySQL5.5 のインストール

+ [Use MySQL official deb package in Ubuntu](http://weblog.riywo.com/post/35522896526)
+ [MySQL5.5をdebianにインストールする at softelメモ](http://www.softel.co.jp/blogs/tech/archives/3100) 

## mysql_secure_installation の説明
+ [mysql_secure_installation - ぷちWiki - Lightly and Leniently](http://lightly.wjg.jp/wiki/858)
Phalcon(PHP Framwork)::APIスケルトン

Phalcon
=

Phalcon Frameworkを利用してAPIを実装したときのスケルトンを紹介します。

本家ドキュメントでは、  
<http://docs.phalconphp.com/en/latest/reference/micro.html>  
を参考にしました。


####ディレクトリ・ファイル構成

基本構成は、Phalcon Developer Toolsを使用して作成しました。

```
phalcon-micro
│  .htaccess
│  app.php
│
├─.phalcon
├─app
│  ├─collections
│  │      UserCollection.php
│  │
│  ├─config
│  │      config.php
│  │      loader.php
│  │      services.php
│  │
│  ├─controllers
│  │      ControllerBase.php
│  │      UserController.php
│  │
│  ├─models
│  └─views
│
├─logs
│
└─public
    │  .htaccess
    │  index.php
    │
    ├─css
    ├─files
    ├─img
    └─js
```

####API用に追加した部分


1. コントローラー  
Developer Toolsで作成すると、MVしかない。

2. コレクション  
<http://docs.phalconphp.com/en/latest/reference/micro.html#using-controllers-as-handlers>


####サンプルソース
#####app.php
※ルーターの役割

```
<?php

//APIのバージョン
$version = "1.0";

//未定義のパスにアクセスした場合に実行される
$app->notFound(array(new ControllerBase(), "notFoundAction"));

//コレクションのインクルード
include __DIR__ . '/app/collections/UserCollection.php';

```

#####UserCollection.php

```
<?php

use Phalcon\Mvc\Micro\Collection as MicroCollection;

$userCollection = new MicroCollection();

//メインコントローラー
$userCollection->setHandler(new UserController());

//コレクション内での共通prefix
$userCollection->setPrefix("/{$version}/user");

/**
  * ユーザー情報取得
  *
  * http://api.sample.com/1.0/user/
  * に対して
  * GETでアクセスすると
  * UserControllerのapi_indexメソッドが実行される
  */
$userCollection->get("/", "api_index");

/**
  * ユーザー登録
  *
  * http://api.sample.com/1.0/user/register/
  * に対して
  * POSTでアクセスすると
  * UserControllerのapi_registerメソッドが実行される
  */
$userCollection->post("/register", "api_register");

$app->mount($userCollection);

```

#####UserController.php

```
<?php

class UserController extends ControllerBase {
    
    public function api_index() {

    }
    
    public function api_register() {

    }
}
```

#####ControllerBase.php
※全てのコントローラーのベース

```
<?php

use Phalcon\Mvc\Controller;

class ControllerBase extends Controller
{
    /**
     * 
     * @param int $code
     * @param array $content
     */
    protected function output($code, $content=array()) {
        //Header
        $this->response->setContentType('application/json')
                       ->setStatusCode($code, null)
                       ->sendHeaders();
        //Body
        $this->response->setJsonContent($content)
                       ->send();
    }
    
    public function notFoundAction() {
        $this->output(404);
    }
}
```
AirGramの使い方

# はじめに
* 利用するにあたり、有効なeメールアドレスが一つは必要です。
* 参考にするページは以下の通り
+ http://iwire.jp/news/2012/03/19/002/

# 利用方法

## Key/Secretの取得

1. http://www.airgramapp.com/dev/login にアクセス
1. Link:[No account? Create one!]をクリック
1. 入力欄にメールアドレスとパスワードを入れてRegisterボタンクリック
1. 　※ もちろん、Confirmには同じパスワードを入る
1. メールが届く
1. 再びログインページでログインする（http://www.airgramapp.com/dev/login）
1. ログインすると、自分のKeyとSecretが表示される。

## subscribe
1. ログインページに表示されているSubscribeAPIにあるcurlコマンドをコピー
1. macとかLinuxとかcurlコマンドが動作するシェルで、コピーしたコマンドを実行する
1. ※ シェルの使い方が分からない人は、、、がんばって

## Mobile設定（あんまりやる事はないです）
1. アプリをモバイル端末にダウンロード（AirGramで検索すると良い）
1. 参考ページを見ながら、指定したメールアドレスと、登録時に設定したパスワードを入れる

## ためす
1. ログインページに記載されている「Send Notification API」にあるcurlコマンドをコピー
1. subscribeと同様シェルにコピペして実行
1. 上記設定したMobile端末に通知がきたらOK

## phpでメッセージを送る場合の例
* ＄emailと＄msgにそれぞれ登録したメールアドレスと送信したいメッセージ文字列を設定しておいてください。
* CURLOPT_USERPWDで設定しているデータは、AirGramが用意しているデモ用のKey/Secretです。自分宛に送りたい場合には、上記で取得したKey:Secretを設定してください。

```airgram_send.php
$chandle=curl_init("https://api.airgramapp.com/1/send");
$opt=array(
CURLOPT_RETURNTRANSFER=>TRUE,
CURLOPT_USERPWD=>"am3TxzGRht:ERotzP4aYdMHwzPOcAtg",
CURLOPT_POST=>TRUE,
CURLOPT_POSTFIELDS=>array("email"=>$email,"msg"=>$msg)
 );
curl_setopt_array($chandle,$opt);
$ret=curl_exec($chandle);
```

## /bin/shでも例をあげてみる
```airgram_send.sh
email=$1
msg=$2
auth="am3TxzGRht:ERotzP4aYdMHwzPOcAtg"
curl -d "email=$email" -d "msg=$msg" -u $auth https://api.airgramapp.com/1/send

. airgram_send.sh to_obara@xxx.yyy.zzz 'test message'
```
PHP, Phalcon, Zephir

#Zephir

<http://blog.phalconphp.com/post/57161129440/phalcon-2-0-the-future>  
Phalconの2系からは、開発言語にZephir言語を使用しているそうで、  
PHP＋C言語なイメージらしいです。


公式ドキュメント  
<http://zephir-lang.com/>

導入方法  
<http://www.michaelgallego.fr/blog/2013/08/28/a-quick-introduction-to-zephir-language/>


ソース  
<https://github.com/phalcon/zephir>


必須モジュールインスト

```
sudo yum -y install git-core
sudo yum -y install gcc libtool
```


clangインスト

```
cd /usr/local/src/
sudo wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -Uvh epel-release-6-8.noarch.rpm
sudo yum install -y clang
```

json-cインスト

```
cd /usr/local/src/
sudo git clone https://github.com/json-c/json-c.git
cd json-c
sudo sh autogen.sh

sudo ./configure
sudo make
sudo make install
sudo make check
```

re2cインスト  
<http://labs.web-mix.jp/linux/centos/centos_add_rpmforge/>

```
cd /usr/local/src/
sudo wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
sudo rpm -Uvh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

---
# sudo vi /etc/yum.repos.d/rpmforge.repo
enabled = 0
---

sudo yum --enablerepo=rpmforge install -y re2c
```

zephirインスト

```
cd /usr/local/src/
sudo git clone https://github.com/phalcon/zephir.git
cd zephir/
sudo ./install
```

PHPアップデート  
(※5.4系じゃないとコンパイル時にエラーになるので)

```
sudo yum -y install php php-devel php-gd php-mbstring php-mysql php-pdo php-pear php-xml

# yumだと5.3までしかないので、それ以上に上げたい場合
//リポジトリの追加
sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
 
//php5.4にアップデートされることを確認。
sudo yum --enablerepo=epel,remi,rpmforge info php
 
//アップデート実行
sudo yum --enablerepo=epel,remi,rpmforge update -y php php-devel php-gd php-mbstring php-mysql php-pdo php-pear php-xml
```

####Zephirコードのコンパイル

1.ZephirコードをCに変換  
2.CコードをPHPエクステンションにコンパイル

以下を実行すると、/extフォルダに変換されたC言語コードが生成されます。

```
sudo ./bin/zephir compile
```

以下を実行すると、PHPエクステンションが生成されます。

```
cd /ext
sudo phpize
sudo ./configure
sudo make
sudo make install
```

生成されたsoファイルをphp.iniでロードするようにすればOK。
SublimeText3のセットアップ

## 公式からパッケージをダウンロードしてインストール
http://www.sublimetext.com/3
## プラグインを管理するPackage Controlをインストール
https://sublime.wbond.net/installation
## 初期設定
フォントサイズ等の初期設定をする。
## UIテーマをインストール
https://github.com/buymeasoda/soda-theme
## プラグインをインストール
https://gist.github.com/gaspanik/4048934
Emmet
Emmet CSS
HTML5
jQuery
AdvancedNewFile
AutoFileName
BracketHighlighter
Git
SCSS
SublimeCodeIntel
SideBarEnhancements
## 競合を解消
Emmetのreflect_css_valueとGo to Symbol in Projectが競合するので解消する。
https://github.com/sergeche/emmet-sublime/issues/266
## ざっくりした使い方
### 置換
とりあえずCommand + Shift + F押しときゃいける
### 関数検索
対象となる関数にフォーカスを当てCtrl + クリック
### 行操作（コピー）
選択せずにCommand + C
### 行操作（カット）
選択せずにCommand + X
### 行操作（ペースト）
選択せずにCommand + V
### 行操作（コピー・ペースト）
選択せずにCommand + Shift + D
### コメントトグル
Command + /
### インデント
Command + [ or ]
## 参考リンク
http://qiita.com/mryreplicant/items/97d96fd156cf30744b8b
http://dotinstall.com/lessons/basic_sublimetext
http://matome.naver.jp/odai/2137785598009652401
http://lab.sonicmoov.com/markup/649/
http://net.tutsplus.com/?s=sublime+text
http://dev.classmethod.jp/tool/html-corder-sublime-text-2-customize/
http://www.justinbar.net/post/best-sublime-text-3-settings
https://www.google.co.jp/search?q=sublime+text+3+best+packages&oq=sublime+text+3+best+packages&aqs=chrome..69i57.541j0j7&sourceid=chrome&espv=210&es_sm=91&ie=UTF-8
http://liginc.co.jp/designer/archives/6774
http://kachibito.net/software/sublime-text-2-shortcuts.html
http://qiita.com/mryreplicant/items/97d96fd156cf30744b8b
http://qiita.com/ANTON072/items/ee2a9f69aa8e7479f2d4
http://blog.layer8.sh/ja/2012/04/16/sublime-text-2%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7-mac-os-x/
http://net.tutsplus.com/articles/news/perfect-workflow-in-sublime-text-free-course/?search_index=4
lxc-docker-0.6.7 と dokku の組み合わせで /etc/init/docker.conf が正しく設定されない

2013-11-28 追記: issue の方に詳細がありますが、もう `-r=true` の追加は不要だったようです。

https://github.com/progrium/dokku/issues/346 で報告したので、そのうち直ると思いますが、
`dokku` の `plugins/00_dokku-standard/install` で

```bash
sed -i 's/docker -d$/docker -d -r=true/' /etc/init/docker.conf
```

という処理で `-r=true` というオプションを追加していたのですが、 `lxc-docker-0.6.7` では `/etc/init/docker.conf` の書き方が変わって、 該当する行がなくなってしまったので、代わりに `/etc/default/docker.conf` を作成して、

```bash:/etc/default/docker.conf
DOCKER_OPTS="-r=true"
```

のように設定すると良さそうです。

docker Remote API を使うのなら、

```bash:/etc/default/docker.conf
DOCKER_OPTS="-r=true -H tcp://10.0.2.15:4243 -H unix:///var/run/docker.sock"
```

という感じで `-H` もここに書いておけば良さそうです。

セキュリティ的にはあんまり付けない方が良さそうですが `-api-enable-cors` も必要なら追加しておきます。
Starling用テクスチャアトラスのXMLを出力するJSF

これは、Fireworksで選択中のスライスを元に、Starling用テクスチャアトラスのXMLを出力するFireworksのJSFです。
個人用途で作成したのですが、バックアップも兼ねてアップいたします。

テクスチャ（画像）は、別途書き出しする必要があります。
書き出すXMLのファイル名、ディレクトリは元のFireworksPNGと同じになります。
※ファイル名の『.fw』は自動で除去するようになっています。

【使い方】

1. テクスチャアトラスとして書き出したいサイズや位置でスライスを切る。
2. 各スライスにテクスチャ名をふっておく。
3. XMLに書き出したいスライスをすべて選択する。
4. JSFを実行する。

```js:outputStarlingXML.jsf

function execute(){
	var dom = fw.getDocumentDOM();

	var sliceArray = [];
	sliceArray = getSliceObject(fw.selection);

	var docname = dom.filePathForRevert;
	var fileDir = Files.getDirectory(docname);
	var imagName = Files.getFilename(docname);
	imagName = imagName.replace(/¥.fw/,'');
	var xmlName = imagName.slice(imagName.indexOf('/')+1, imagName.lastIndexOf('.'))+".xml";

	var _outputFilePath = fileDir+"/"+xmlName;
	var _xmlText = getSpriteText(imagName,sliceArray);

	var fileForSave = confirm("XMLファイルを保存します。よろしいですか？");
	if (fileForSave){
		if(saveXMLFile(_outputFilePath,_xmlText)){
			//alert("ファイルの保存が完了しました。");
		}else{
			alert("ファイルの保存に失敗しました。");
		}
	}else{
		//alert("キャンセルしました。");
	}
}

//////////////////////////////////////////////////
function getSliceObject($v) {
	var array = [];
	var length = $v.length;
	for (var i=0;i<length;i++){
		if($v[i] == "[object SliceHotspot]"){
			array[i] = {};
			array[i].name = $v[i].baseName;
			array[i].x = $v[i].left;
			array[i].y = $v[i].top;
			array[i].width = $v[i].width;
			array[i].height = $v[i].height;
		}
	}
	array.sort(
		function(a,b){
		var aName = a["name"];
		var bName = b["name"];
		if( aName < bName ) return -1;
		if( aName > bName ) return 1;
		return 0;
		}
	);
	return array;
}

function getSpriteText($imagePath,$v) {
	var str = '';
	var length = $v.length;
	str += '<?xml version="1.0" encoding="UTF-8"?>\n<TextureAtlas imagePath="'+$imagePath+'">\n'
	for (var i=0;i<length;i++) {
		str += '\t<SubTexture name="'+$v[i].name+'" x="'+$v[i].x+'" y="'+$v[i].y+'" width="'+$v[i].width+'" height="'+$v[i].height+'"/>\n';
	}
	str += '</TextureAtlas>'

	return str;
}

function saveXMLFile($path,$value){
	if (writeFile()){
		return true;
	}else{
		var fileForSave = confirm("同名のファイルが存在します。上書きしてもよろしいですか？");
		if (fileForSave){
			if (Files.deleteFileIfExisting($path)){
				if (writeFile()){
					return true;
				}else{
					//alert("ファイルの保存に失敗しました。");
				}
			}
		}else{
			//alert("キャンセルしました。");
		}
	}

	function writeFile(){
		if(Files.createFile($path,".xml","")){
			var fileReference = Files.open($path,true);
			if (fileReference){
				fileReference.writeUTF8($value);
				fileReference.close();
				return true;
			}else{
				return false;
			}
		}else{
			return false;
		}
	}
}
//////////////////////////////////////////////////

this.execute();
```
Play1.0系でguice moduleを使う際の注意点

#### 注意点
-----

guice moduleを使っている場合、play dependenciesの後に、
modules/guice-{version}/testフォルダを削除する必要がある。

削除しない場合、play runする場合は問題ないが、
play testが正常に動かなくなる。
（guiceのtestフォルダのテストを実行しようとして、コンパイルエラーになる。下図。）


![play01.png](https://qiita-image-store.s3.amazonaws.com/0/32509/c21d7276-fd60-f5c7-2ea7-912b086848a4.png)

次の解決方法のどちらかで解決する。
#### 解決方法１ 手動でmodules/guice-{version}/testフォルダを削除する。
-----


#### 解決方法2 依存性解決に「--forProd」オプションを付ける。
-----
```text
play dependencies --forProd
```
で依存性を解決しtestフォルダを作成しない。

#### 参考
-----
本件に関してplay-framework(googlegroup)を参考にした。
https://groups.google.com/forum/#!msg/play-framework/RgWptGEHOUU/mAxXr1wmPO8J
「のんびり座りたい」をsedで(横へな7)

「[のんびり座りたい](http://nabetani.sakura.ne.jp/hena/ord7selectchair/)」をsedでやってみました。他の実装は [第7回オフラインリアルタイムどう書くの問題](http://qiita.com/Nabetani/items/4364285801d1c9f370a1) から辿れます。

[「異星の電光掲示板」をsedで(横へな15)](http://qiita.com/pazworld/items/ff45058501299089c198) に引き続きsedで書いてみました。(過去問は逆順に辿りながらやらせてもらっています。)

```rb:selectchair.sed
# 数→椅子
s/1\([0-9]\)/55\1/
s/2\([0-9]\)/5555\1/
s/3\([0-9]\)/555555\1/
s/9/54/
s/8/53/
s/7/52/
s/6/51/
s/5/-----/g
s/4/----/
s/3/---/
s/2/--/
s/1/-/
s/0//

:LOOP

# どちら側の隣にも人が座っていない席に座る
s/^--\(.*\):\([A-Z]\)\(.*\)$/\2-\1:\3/
s/---\(.*\):\([A-Z]\)\(.*\)$/-\2-\1:\3/
t LOOP
s/--:\([A-Z]\)\(.*\)$/-\1:\2/
t LOOP

# 片側にしか人が座っていない席に座る
s/^-\(.*\):\([A-Z]\)\(.*\)$/\2\1:\3/
s/--\(.*\):\([A-Z]\)\(.*\)$/\2-\1:\3/
t LOOP
s/-:\([A-Z]\)\(.*\)$/\1:\2/
t LOOP

# 両側に人が座っている席に座る
s/-\(.*\):\([A-Z]\)\(.*\)$/\2\1:\3/
t LOOP

# 立ち去る
s/\(.*\)A\(.*\):a\(.*\)$/\1-\2:\3/
s/\(.*\)B\(.*\):b\(.*\)$/\1-\2:\3/
s/\(.*\)C\(.*\):c\(.*\)$/\1-\2:\3/
s/\(.*\)D\(.*\):d\(.*\)$/\1-\2:\3/
s/\(.*\)E\(.*\):e\(.*\)$/\1-\2:\3/
s/\(.*\)F\(.*\):f\(.*\)$/\1-\2:\3/
s/\(.*\)G\(.*\):g\(.*\)$/\1-\2:\3/
s/\(.*\)H\(.*\):h\(.*\)$/\1-\2:\3/
s/\(.*\)I\(.*\):i\(.*\)$/\1-\2:\3/
s/\(.*\)J\(.*\):j\(.*\)$/\1-\2:\3/
s/\(.*\)K\(.*\):k\(.*\)$/\1-\2:\3/
s/\(.*\)L\(.*\):l\(.*\)$/\1-\2:\3/
s/\(.*\)M\(.*\):m\(.*\)$/\1-\2:\3/
s/\(.*\)N\(.*\):n\(.*\)$/\1-\2:\3/
s/\(.*\)O\(.*\):o\(.*\)$/\1-\2:\3/
s/\(.*\)P\(.*\):p\(.*\)$/\1-\2:\3/
s/\(.*\)Q\(.*\):q\(.*\)$/\1-\2:\3/
s/\(.*\)R\(.*\):r\(.*\)$/\1-\2:\3/
s/\(.*\)S\(.*\):s\(.*\)$/\1-\2:\3/
s/\(.*\)T\(.*\):t\(.*\)$/\1-\2:\3/
s/\(.*\)U\(.*\):u\(.*\)$/\1-\2:\3/
s/\(.*\)V\(.*\):v\(.*\)$/\1-\2:\3/
s/\(.*\)W\(.*\):w\(.*\)$/\1-\2:\3/
s/\(.*\)X\(.*\):x\(.*\)$/\1-\2:\3/
s/\(.*\)Y\(.*\):y\(.*\)$/\1-\2:\3/
s/\(.*\)Z\(.*\):z\(.*\)$/\1-\2:\3/
t LOOP

# ごみ掃除
s/://
```
display:box内の改行

word-wrap: break-word;だけだと、突き抜けてしまう・・・

# 解決策
もう１行追加する

```css
word-wrap: break-word;
word-break: break-all;
```

ソース：http://aiclcl.blog.fc2.com/blog-entry-5.html

#片方だけ幅を指定して、片方をリキッドにしたいとき

```css
/*リキッドにしたい方に*/
-webkit-box-flex: 1.0;
-moz-box-flex: 1.0;
box-flex: 1.0;
```
vimのレジスタ

マニュアルから概要のみ抜粋。

# レジスタの種類

1.  無名レジスタ ""
2.  10個の番号付きレジスタ "0 から "9
3.  小削除用レジスタ "-
4.  26個の名前付きレジスタ "a から "z または "A から "Z
5.  4個の読み取り専用レジスタ ": と ". と "% と "#
6.  expression 用レジスタ "=
7.  選択領域用レジスタ "* と "+ と "~
8.  消去専用レジスタ "_
9.  最終検索パターン用レジスタ "/

## 1. 無名レジスタ
最後に使用されたレジスタの内容を格納。
削除・ヤンクなどされるたびに書き換えらる。

* `"`というレジスタ名で指定可能
* `_`を指定した削除`_dd`の場合はどのレジスタにも入らない

## 2.10個の番号付きレジスタ "0 から "9

レジスタ名|意味
:-:|----
0 | コピーしたテキスト
1|  **行削除** したテキスト。1行以下は小削除用レジスタ`"-`に格納される
2| 新たに削除コマンドが発生する度に、`"1`の内容が格納される
3~8|`"2`と同様、直前のレジスタの内容が順次格納される
9|同様だが、9番目の内容は破棄される
 
* 明示的にレジスタを指定した場合は格納されない

## 3.  小削除用レジスタ "-

1行以下の削除テキストが格納される。

* 明示的にレジスタを指定した場合は格納されない

## 4.  26個の名前付きレジスタ "a から "z または "A から "Z

明示的にした場合のみ使用される。

レジスタ名|意味
:-:|----
a-z | 上書きで格納される
A-Z| `a-z`の内容に追加で格納される

* 貼り付け時の動作は小文字も大文字も同じ

## 5. 4個の読み取り専用レジスタ ": と ". と "% と "#

レジスタ名|意味
:-:|----
. | 最後に挿入されたテキスト(コマンドラインの<C-r>では利用不可)
%| カレントファイル名
#| 代替ファイル名
:| 最後に入力されたコマンドライン(`@:`で直近コマンド繰り返し)

## 6.  expression 用レジスタ "=

指定するとコマンド行に移動し、
コマンドラインにて入力したコマンドの実行結果が格納される。

## 7.  選択領域用レジスタ "* と "+ と "~

GUIで選択されたテキストが格納される。
クリップボードのデータを操作するのに使用する。

## 8.  消去専用レジスタ "_

何も格納されない。
レジスタの内容を変更せずに消去するために使用する。

## 9.  最終検索パターン用レジスタ "/
最後に使用された検索パターンが格納される。
【JavaScript】reverse(),sort()の注意すべき点

こんにちは。

とにかく手を動かして、書いて
ミスして理解したものはここに記載していこうと考えています。

```js
var money = [100, 300, 200, 150] ;
    money.reverse() ;
    alert(money) ;
````

さて、この結果sortと同時に学習していたので
てっきり
100 150 200 300
と表示されるかと思っていました。

違いましたね～、
150 200 300 100 
と表示。

単元でまとめた引掛けのようなものに見事に引っかかったみたいです。

やりたいことは
大きい順に並べたかったわけで。

```js
var money = [100, 300, 200, 150] ;
    money.sort() ;
    money.reverse() ;
    alert(money) ;
````

このように一度ソートしてからじゃないとNGみたいですね。
なにかほかにもありそうですが。
サクッとブラウザで画面共有できそうな3ツール


お客さんにリモートでデモするために、見る人がブラウザだけでOKな画面共有ツールが欲しくて探してみました。

## join.me
[画面共有にjoin.me使ったら簡単最強すぎた | この先生きのこるには](http://project-p.jp/halt/?p=1729)

画面を見せる側のPCはインストール作業必用。見る方はブラウザだけでOKらしい

## QuickScreenShare
[QuickScreenShare ブラウザ経由の画面共有 - フリーソフト・Webツール 研究所](http://d.hatena.ne.jp/womtv/20111231/1325492785)

Java必要

## Screenleap
[ブラウザだけで画面を共有できるネットサービス Javaだけで動作する簡単共有 Screenleap | PCあれこれ探索](http://pc.mogeringo.com/archives/15825)

こちらもJava必要
VBAでSHIFT-JISのテキストを読み込む

    Public Function ReadSJISText(isFileName As String) As String

        Dim bytArray()     As Byte
        Dim intFileNo       As Integer
        Dim lngFileLenB  As Long

        'バイト配列の容量を確保する
        lngFileLenB = FileLen(isFileName)
        ReDim bytArray(lngFileLenB - 1)
    
        '使用可能なファイル番号を取得する
        intFileNo = FreeFile
    
        'ファイルをバイナリモードで開く
        Open isFileName For Binary As #intFileNo
    
        'バイナリデータとして読込んで…
        Get #intFileNo, , bytArray
        Close #intFileNo
    
        'Unicodeに変換して表示
        ReadSJISText= StrConv(bytArray, vbUnicode)

    End Function
VBAでUTF-8のテキストを読み込む

    Public Function ReadUTF8Text(isFilePath As String) As String

        'オブジェクトを作る
        Dim objStream As Object
        Set objStream = CreateObject("ADODB.Stream")

        '読み込むテキストのタイプを設定する
        '指定できるタイプはadTypeBinary(バイナリ)とadTypeText(テキスト)
        objStream.Type = adTypeText

        '文字コードをUTF-8に設定する
        '指定できる文字コードはHKEY_CLASSES_ROOT\MIME\Database\Charsetのサブキー
        objStream.Charset = "UTF-8"

        'ストリームを開く
        objStream.Open

        'ファイルを読み込む
        objStream.LoadFromFile(isFilePath)

        'テキスト内容を返却する
        ReadUTF8Text = objStream.ReadText

        'ストリームを閉じる
        objStream.Close

        Set objStream = Nothing

    End Function
ChaplinのViewの寿命管理

自分で調べたこと、はまったことのまとめ。

# 調べたこと
## Backbone
そもそも Viewとかに disposeがない。頑張って自分で管理。そこらへん Chaplin偉い。

## Controller
Controllerは dispatchごとに新しいのが作り直される。これは、Dipatcherのなかで以下の順で行われる。

- newController.beforeAction()
- oldController.dispose(param, route, option)  # ここで後述のように Viewが捨てられる。
- dispatcher.currentController = newController
- newController.action(...)  # router で指定された action。普通の Viewはここで作って member変数に入れておく。
- dispatcher.publishEvent 'dispatcher:dispatch' # ここで Composer#cleanupが走る

## View
Controllerとともに disposeされるべき Viewは Controllerの member変数に入れておけ。そうすれば、Controller#disposeが捨ててくれる。
逆に、捨てられては困る Viewなどは入れてはいけない。

ちなみに Backboneの Viewは階層構造をもたない。chaplinでは subviewを使って階層構造を作ることができる。当然、親の Viewが disposeされたときに subviewも一緒に disposeされる。

普通 Viewが disposeされたら、対応する DOM要素もなくなる。

## Compose
複数の Controllerをまたいで生きる Viewは、Composerに管理してもらう。そうすれば無駄な DOM再生成、再描画を抑えられる。

Composer経由で作られた Viewは、cacheされ、次の Controllerに遷移した時に再利用できるなら再利用される。再利用されない Viewは、action (routerで指定された method) を実行する前に Composer#cleanup経由で disposeされる。

再利用できるかどうかは、通常 compose時に渡した optionが同じものかどうかで判定される(Composition#check)。判定方法も options.checkで変えられそうだけど使ったことなし。

# ハマったこと
## 複数の composeされた Viewの階層
注意することとして、DOM階層が複数の composeされた Viewによりできてた場合、根の Viewだけが再利用不能とされ再構築されると変なことになる。枝の Viewは renderされず DOM部分木も根に繋ぎ直されないので、根の Viewだけ画面に現れることになる。

## callback中は、controller.compose 'id' で view を見つけられない
Composer#cleanupでは、生き残った Viewも staleフラグを立てられ、以降の Composer#retrieveで無視される。つまりdispatcher:dispatchイベントの後に callbackが呼び出されたりすると、そこでは controller.compose 'id' では viewを見つけられない。
【JavaScript】日付オブジェクト、オブジェクトの生成

こんにちは。
基本メモ程度ですが、忘れずに覚えていきたいことを書いていきます。

ちなみに現在はここを参考に勉強しています。

「マンガで分かる JavaScriptプログラミング講座」
URL：
http://crocro.com/write/manga_javascript/wiki.cgi?p=%C6%FC%C9%D5%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8


```js
var d = new Date() ;
```

ずーっとつまずいてきたこのよく聞く
newするnewする。
ようやくすっきりしました。

これはJavaで理解できたんですがね＾＾；

newすることでオブジェクトを新たに使えるという宣言

javaだとクラスを作った後、そのクラスを呼び出すのに必要な宣言だったんですね。

newでオブジェクトを宣言することで

```js
var d = new Date() ;
alert(d.getHours()) ;
```

のように
変数dのあとに.をつけて、今回で言うDate関数を呼び出して使うことができる。
よーやく理解に一歩前進。

これからも駆け出しPGをよろしくです＾＾
CakePHPのFormヘルパ、input labelのstyle変更方法


label =>array('style'=>'color:red');みたいに 'style'=>''で指定すればいいんだろうなとおもったけどlabelタグで表示させたい文字の指定は？って思って調べたら　'text' =>'表示ラベル' で指定すればOKだった。

まとめると下記の様なコード

```php
echo  $this->Form->input('Note.photo.remove', 
	array('
		type' => 'checkbox', 
		'label' => array(
			'text'=>'写真を削除する', 
			'style'=>'float:none'
		)
	)
);
```
【PHP入門講座】 PHPで出来ることと処理の流れ

**【2021/10/15 追記】**
**この記事は更新が停止されています。<font color="red">PHP を分かった気になって書いていた不正確な内容が多いため，過去の情報として参考程度にご覧ください。</font>また，完成にたどり着けなかったことをお詫びします。原則的には，[公式マニュアル](https://www.php.net/manual/ja/index.php)の参照をおすすめします。**


### [目次に戻る](http://qiita.com/mpyw/items/752e19a578cf7d96fc5f)

# PHP言語の特徴

## HTMLの中に埋め込むことが出来る

PHPファイルは、何も特別なことを書かなければただのHTMLファイルと同じ扱いを受けます。

```html+php:PHPコード
<div><?php echo 1 + 1; ?></div>
```

```html:実行結果
<div>2</div>
```

のように `<?php` と `?>` で囲んで、初めてそこでPHPのコードを記述できるようになります。 `echo` は指定したものを文字列として書き出す **（出力する）** 構文です。

```html+php
<div><?php
echo 1 + 1;
?></div>
```

```html+php
<div><?php

echo 1 + 1;

?></div>
```

としても結果は同じです。PHPタグ内でのこういった改行・半角スぺース・タブ文字は無視されます。しかし、

```html+php
<div>
<?php
echo 1 + 1;
?>
</div>
```

のようにした場合はどうなるでしょうか？

```html
<div>
2
</div>
```

となると予想されると思いますが、実際には

```html
<div>
2</div>
```

となります。なぜなら<ins>終了タグ直後の改行コードは削除される</ins>という特性を持っているからです。これは後々説明しますが、これによって得られるメリットがちゃんとあるので今は素直に受け止めてください。

なお、

```php
<?php
echo 1 + 1;
?>
```

のようにPHPコードだけを記述する場合、後ろのタグは省略して

```php
<?php
echo 1 + 1;
```

とすることが出来ます。実は<ins>[省略する方が推奨されています](http://php.net/manual/ja/language.basic-syntax.phptags.php)</ins>。

## サーバー側でコードが実行される

下図のような流れとなります。
![icon_4b_192.png](https://qiita-image-store.s3.amazonaws.com/0/25060/63ce9965-0b86-149d-9c6a-6ed9b4d4dff4.png)

イラスト中のコードを注意してみてください。そして、<ins>ユーザー側からはPHPコードが見えない</ins>ことに気付いてください。ここがPHPとよく対比されるJavaScriptとの違いです。

| | PHP | JavaScript |
| :--- | :--- | :--- |
| コードがユーザーから見えるか | 見えない | 見える |
| リロードせずに何かを行えるか | 行えない | 行える |
| 実行される場所 | サーバー上 | ユーザーのブラウザ上 |

根本的に役割が全く異なるのです。違う見方で言えば、 **組み合わせれば便利** であるとも言えます。この講座では触れませんが、JavaScriptが主体的にPHPスクリプトに[Ajax](http://ja.wikipedia.org/wiki/Ajax)リクエストを送り、連携を取るという形が多くのサイトで実装されています。

## Webページ制作という目的に特化している

JavaやC++はWindows上で動く事務ソフトウェアを開発したり、ゲームを開発したり、応用範囲が非常に広いですが、PHPで出来ることはかなり限られてきます。

- ユーザーからのリクエストに応じてHTMLを動的に生成して返す
- サーバー上でデータを保存したり読み込んだりする

大部分はこれらに該当するでしょう。しかし、先ほど述べたように「HTMLの中に簡単に埋め込める」という独特の強みを持っており、これらの目的に絞った仕事を行いたい場合は非常にラクに実装することが出来るでしょう。

## 言語のもとの名前が<del>クソダサい</del>

もともとは **Personal Home Page** の略だったらしいです。現在は **PHP - Hypertext Processor** という無理矢理とってつけたような形になってしまっています。
SRM149 div2 250


##問題文概略
与えられたドルとセント数を組み合わせて、"$1,234.05"のように表示せよ。
ドル：最初に"$"が付き、３桁ごとにカンマがつく。
セント：最初に"."が付き、1桁の場合0＋数字となる。

## 書いたコード

```
public class FormatAmt {

	public String amount(int dollars, int cents) {
		int n=0;
		int j=1;
		String s = "";
		String sDollars = String.valueOf(dollars);
		String sCents = String.valueOf(cents);
		//ドルに,をつける
		for(int i=sDollars.length()-1; i>=0; i--){
			s += sDollars.charAt(i);
			if(j%3==0 && j !=sDollars.length() ) {
				s+=",";
			}
			j++;
		}
		StringBuffer ans = new StringBuffer(s);
		//セントに0をつける
		if(sCents.length() != 2) {
			sCents = "0" + sCents;
		}
		return "$"+ans.reverse()+"."+sCents;

	}

}
```

## 他の参加者のコードを読んで修正した
```
public class FormatAmt {

	public String amount(int dollars, int cents) {

		String s = "";
		int i = 0;
		if(dollars == 0) {
			s += "0";
		}
		while(dollars > 0) {
			int mod = dollars % 10;
			dollars /= 10;
			i++;
			if(i % 3 == 0 && dollars != 0) {
				s = "," + mod + s;
			} else {
				s = mod + s;
			}
		}
		String c = "";
		if(cents < 10) {
			c = "0" + cents;
		} else {
			c += cents;
		}
		return "$" + s + "." + c;
	}

}
```
## 雑感
ドルの3桁区切りを実装するのに、

	「数字を逆順に並び替える」
	↓
	「左から3桁づつにカンマをつける」
	↓
	「もう一度逆に並び替える」

と考えたのだが、
	
	10で割った余りを求めて並べる
	↓
	3回おきにカンマを加える

とすれば楽に実装できたんだな。
PlayFramework1.0系でURLの最後を/{id}.{format}にする方法

URLの動的部分のマッチングは、/[^./]+/が使われるそうなので、

routesを↓のように設定すると

```text:上手くいかないroutes
GET  /path/{id}.{format}    Controller.method
```

http://example.com/12345.json
というリクエストをしても、コントローラー側では、
{id} に"12345.json"
{format}に null
が設定されてしまい。意図した動きにならない。
そこでマッチングの正規表現を/[^\.]+/に変えてマッチングさせる。

##### 設定
-----

```text:正しいroutes
GET  /path/{<[^\.]+>id}.{format}    Controller.method
```

コントローラー側は、

```java
static public void method(String id, String format){
    // some logic
}
```
と設定すると、id, formatにURLから値が設定される。
HttpResponseRedirectでSuspiciousOperationが発生するときの対策

HttpResponseRedirect を使って http[s], ftp 以外へリダイレクトさせようとすると下記のように SuspiciousOperation 例外が発生する。

```
SuspiciousOperation: Unsafe redirect to URL with protocol 'com.example.app.sample0'
```

以下のようなコードを追加すればこの例外を回避できる。allowed_schemes に例外を発生させたくないリダイレクト先を追加すればよい。

```py
try:
    from django.http.response import HttpResponseRedirectBase
        HttpResponseRedirectBase.allowed_schemes += ['com.example.app.sample0', ]
except ImportError:
    pass
```

import に関して、古いバージョンでは django.http 以下が reponse, request に分かれていなかった。なので Django のバージョンが古いとき（1.4系以前くらい、細かいバージョンは失念）は import は以下のようなコード。

```py
from django.http import HttpResponseRedirectBase
```

通常ブラウザで閲覧する Web ページの範囲であれば http[s], ftp 以外のリダイレクト先に飛ばしたいことはまずない。例えばスマホアプリをターゲットとしているときに '[アプリパッケージ名]://' にリダイレクトしたい（例：OAuthで認証用URLからアプリに制御を戻すとき）とか、そういったケースで使える。

***
### 補足


リダイレクト時のこの例外は Django 1.4 系で導入された。

HttpResponseRedirectBase の実際のコードは下記のようになっており allowed_schemes にリダイレクト先を追記すればいいことが容易に分かる。セキュリティ対策のために導入されたコードなので、上のサンプルのように極力リダイレクト先を限定するような記述にするのがよいと考えられる。

```response.py
class HttpResponseRedirectBase(HttpResponse):
    allowed_schemes = ['http', 'https', 'ftp']

    def __init__(self, redirect_to, *args, **kwargs):
        parsed = urlparse(redirect_to)
        if parsed.scheme and parsed.scheme not in self.allowed_schemes:
            raise SuspiciousOperation("Unsafe redirect to URL with protocol '%s'" % parsed.scheme)
        super(HttpResponseRedirectBase, self).__init__(*args, **kwargs)
        self['Location'] = iri_to_uri(redirect_to)

    url = property(lambda self: self['Location'])
```
Node.js を5分で大雑把に理解する


随時更新します。

## 対象の人

* 使ったことないけど、軽く理解はしておきたい人
* 本格的に勉強する前に、大まかな概要を知りたい人

## 特徴

* サーバーサイドのJavaScript
* 非同期 (I/Oの処理結果を待たず処理を進める) 
  * ノンブロッキングI/O (I/Oの結果を待たないで処理をすすめる。I/O処理が終了したらコールバック関数を実行。)
* イベントドリブン (何かしらのキッカケで動き始める)
* シングルスレッド (メモリ消費が少ない、仕事切り替えが少ないので速い)
* JavaScript エンジンが Google の V8 で速い

### Node.jsで作られたアプリの特徴

* 小さいデータや小さい計算の場合、速い
* メモリ消費量が少ない
* ローカルとリモートとのデータのやり取りをシームレスに行うフレームワーク(Meteor)などが出てきている
* サーバ側、クライアント側で処理の共通化ができる (入力値チェックなど)
* サーバサイドのコード変更した場合、Node.jsアプリの再起動が必要(な場合が多い)
* リアルタイムなアプリケーションに合う
 * シングルページアプリケーションに合っている
 * WebSocketを利用するアプリに合っている


## node.js は何を解決する?

* C10K問題 (クライアント１万台接続問題)を解決する
  * 従来のWebサーバは、1万接続もあるとパフォーマンスが落ちる。ので、その問題を解決する

## どのように解決する?

* ノンブロッキングI/O 
 * I/Oの待ちをなくすことで、沢山の接続を速くこなすことができる

例えば、ハードディスクの入出力のスピードは、CPUやメモリーから見ると非常に遅い。書き込み完了を待っているのは非常に時間の無駄なので、ハードディスクに書き込む命令を出して、書き込めたかの結果を待たず次の処理をどんどん進めてしまうので非常に処理を早くすすめられる。書き込めた場合にコールバックが呼ばれる。


## フレームワーク?

* Node.jsは、フレームワークではありません。ライブラリでもありません。
* JavaScript アプリケーションのプラットフォーム
* Node.jsでは、Webサーバとアプリケーションが同じ
  PHPのWebサイトで無理やり例えると、Apache + mod_php + Webアプリ です。なので、Node.js の Hello Worldのサンプルは、HTTPを受付け、200とヘッダーと内容を返す、というのが多い

## サーバーサイドJavaScript

* ファイル読み書きは、fsモジュールを使う

## node.js 上の有名なフレームワーク

* Express (シンプルなフレームワーク)
* Backbone.js
* Sails (Railsライクなフレームワーク)
* Meteor 


訂正) AngularJS (Angular2)を、node.jsのフレームワークと記載しておりましたが、ご指摘によりJavaScriptのフロントエンドのフレームワークということで削除いたしました。



## 基礎用語

* コールバック関数(非同期の処理が終わったら呼ばれる関数)
* CommonJS (共通化しようとしている規格)
* libuv (libev, libeio) 非同期I/Oライブラリ, イベントループ・ライブラリ
* DIRT (data-intensive real-time) DIRTy アプリ
* npm (node package manager) 
 * 沢山のモジュールとそのバージョンやモジュールの依存性を管理する

## クライアントサイド JavaScript との違い

* ホストオブジェクト: ブラウザの globalな window オブジェクト
* require
* モジュール: ファイルI/Oなど
* C/C++プラグインで拡張可能
* npm: パッケージマネージャー

## 参考

[Node js 入門](http://www.slideshare.net/SatoshiTakami/intoroduction-nodejs "Node js 入門")
grunt-contrib-jadeでmarkdownフィルタを使う

grunt-contrib-jadeと一緒にmarked, supermarked, markdown-js, markdownのいずれか一つをインストールするだけ。

```bash:Terminal
$ npm install grunt-contrib-jade marked
```

```coffeescript:Gruntfile.coffee
module.exports = (grunt) ->

  grunt.initConfig

    jade:
      compile:
        files: [
          dest: './'
          expand: true
          ext: '.html'
          flatten: true
          src: '*.jade'
        ]

  grunt.loadNpmTasks 'grunt-contrib-jade'

  return
```

あとはフィルタを指定してMarkdownで書くと、フィルタの部分がMarkdownで解釈され、出力される。

```jade:index.jade
doctype 5

:markdown
  # h1

  aaa

      $ echo 1
```

```bash:Terminal
$ grunt jade
```

```html:index.html
<!DOCTYPE html><h1 id="h1">h1</h1>
<p>aaa</p>
<pre><code>$ echo 1</code></pre>
```

あとincludeでもMarkdownが使えるみたい。これもmarkedなどがインストールされていないとコンパイルできない。

```jade:index.jade
doctype 5

include aaa.md
```

ちなみに、ちゃんと拡張子を指定して書かないと（`include aaa`と拡張子を省略すると）aaa.jadeと解釈されてしまうので注意が必要。

```:aaa.md
# aaa

## bbb

    $ echo 1
```

```html:index.html
<!DOCTYPE html><h1 id="aaa">aaa</h1>
<h2 id="bbb">bbb</h2>
<pre><code>$ echo 1</code></pre>
```

Jade便利だなー。
第16回オフラインリアルタイムどう書くの参考問題をRubyで解く

問題はこちら。
http://nabetani.sakura.ne.jp/hena/ord16lcove/

```rb
def point_include?(min_x, min_y, max_x, max_y, points)
  points.each{|x, y|
    return true if (min_x..max_x).include?(x) and (min_y..max_y).include?(y) 
  }
  false
end

def solve(q)
  points = q.split(',').map{|e| e.split('').map(&:to_i)}.uniq
  return 3 if points.size == 1
  x_min,x_max = points.map(&:first).minmax
  y_min,y_max = points.map(&:last).minmax
  max_cut = 0
  (x_max - x_min).times{|xd|
    (y_max - y_min).times{|yd|
      [
       [x_min, y_min, x_min + xd, y_min + yd],
       [x_min, y_max - yd, x_min + xd, y_max],
       [x_max - xd, y_min, x_max, y_min + yd],
       [x_max - xd, y_max - yd, x_max, y_max],
      ].each{|min_x, min_y, max_x, max_y|
        unless point_include?(min_x, min_y, max_x, max_y, points)
          cut_size = (max_x - min_x + 1) * (max_y - min_y + 1)
          max_cut = cut_size if cut_size > max_cut
        end
      }
    }
  }
  if max_cut == 0
    return nil if [x_min,x_max,y_min,y_max] == [0,9,0,9]
    return (x_max - x_min + 1) * (y_max - y_min + 1) + 1
  end
  (x_max - x_min + 1) * (y_max - y_min + 1) - max_cut
end

DATA.readlines.each do |line|
  no,q,a,d = line.chop.split(/\s+/)
  ans = solve(q)
  ans_s = ans.nil? ? '-' : ans.to_s
  print no + "\t" + ans_s
  puts ans_s == a ? ' o' : ' x'
end
__END__
0	41,33,26,55,74,58,68	39	
1	00,99,09,90	-	
2	09	3	
3	05,05,05	3	
```