OmniAICreator/Qiita-1.07M huggingface dataset:
【THREE.js】Quaternionでローカル座標の回転を取り扱う

# アジェンダ & ソースコード
```js
// 1. 回転させたいObjectのQuaternionを取得する
var quaternion = ANY_OBJECT.quaternion;

// 2. 回転を加えるためのQuaternionを作成する
var target = new THREE.Quaternion();
var axis = new THREE.Vector3(ANY_X, ANY_Y, ANY_Z).normalize();
target.setFromAxisAngle(axis, ANY_ANGLERAD);

// 3. 回転させる
quaternion.multiply(target);
```

# 1. 回転させたいObjectのQuaternionを取得する
```js
var quaternion = ANY_OBJECT.quaternion;
```
とすることで、**ANY_OBJECT**のQuaternionを取得できます。

# 2. 回転を加えるためのQuaternionを作成する
```js
var target = new THREE.Quaternion();
var axis = new THREE.Vector3(ANY_X, ANY_Y, ANY_Z).normalize();
target.setFromAxisAngle(axis, ANY_ANGLERAD);
```
とすることで、**(ANY_X, ANY_Y, ANY_Z)**なるベクトルを中心軸として、右周りに**ANY_ANGLERAD**回転を加えるためのQuaternionが作成されます。**ANY_ANGLERAD**にはラジアンで角度を指定します。

```js
// 例：ローカル座標のy軸を中心に、90°回転を加えるQuaternionの作成
var target = new THREE.Quaternion();
var axis = new THREE.Vector3(0, 1, 0).normalize(); // 絶対値が1なので、normalize()はなくてもOK
target.setFromAxisAngle(axis, Math.PI / 2);
```

# 3. 回転させる
```js
quaternion.multiply(target);
```
とすることで、回転が適用されます。

# 4. まとめ
Quaternionを用いる利点は、ジンバルロックという回転がうまく適用できない状態が発生しないことです。

Quaternionの数学的な構造を簡潔に知りたい方は、以下の資料がオススメです。
→ http://www.slideshare.net/yoshihiromizoguchi/ss-28541012
Unityメモ ゲームオブジェクトの複製

弾丸とか敵キャラとか、プレハブ化して
複製しなきゃいけなくなるときがきました


```csharp:hoge.cs
using UnityEngine;

public class hoge : MonoBehaviour {
		
	// 複製するゲームオブジェクトを登録しとく
	public GameObject obj;
		
	void Start () {
		Instantiate(obj, transform.position, Quaternion.identity);
　　　　// 引数 は (複製するゲームオブジェクト, 複製する場所, 向き)

/*
Object Instantiate(Object original, Vector3 position, Quaterinon rotation);

Quaternion.Identity (回転してない状態)
transform.position (現在地) 
*/

	}
}
```
rails「kaminari」のpaginateで条件分岐

サイトとかによくある、ページ番号を < > とか数字をクリックしてページを移動するやつ。railsにライブラリとしてある「kaminari」を使用する機会があったのでメモ程度に残しておきます。

###ページングする

導入も含めこちらを参考にしました -> [ページングを行う「kaminari」](http://www.techscore.com/blog/2013/01/07/railsライブラリ紹介-ページングを行う「kaminari」/)


viewsやmodelに対して条件を制限することができるのですが今回はページ番号の表示の仕方の部分のみ触れます。

まずデフォルトの設定がされているのですがそれは下記です。

 * default_per_page  
ページあたりの表示件数（デフォルトは 25）
 * max_per_page  
ページあたりの表示件数の最大（デフォルトは nil）  
 * window  
表示中のページの左右何ページを表示させるかを指定（デフォルトは 4)  
例）2のとき左右に２ページずつなんで5が中心  < ... 3 4 5 6 7 ...>  
 * outer_window  
先頭ページ、最終ページから何ページ分のリンクを表示するかを指定します（デフォルトは 0）
 * left  
先頭ページから何ページ分のリンクを表示するかを指定します（デフォルトは 0）  
 * right  
最終ページから何ページ分のリンクを表示するかを指定します（デフォルトは 0）
 * page_method_name  
モデルに追加されるページ番号を指定するスコープの名前（デフォルトは page）
 * param_name  
ページ番号を渡すために使用するリクエストパラメータの名前（デフォルトは page）


こんな感じになっています。具体的にコードに落とすと

```
<%= paginate @hogehoge, left: 5, window: 0, theme: "hoge" %>
```

こんな感じで記述すると5ページまでは選択されているタブのみが動くって感じです。
そのあとの挙動を変化させたいならif文ですね、ちなみに下記のようなインスタンス変数に対してなら@hogehoge.num_pagesとやると合計のページ数が出ます。これで最初、中間、最後での場合分けも可能です。

```
<% if params[:page] <=　5 %>
  <%= paginate @hogehoge, left: 5, window: 0, theme: "hoge" %>
<% else %>
  <%= paginate @hogehoge, window: 4, theme: "hoge" %>
<% end %>
```

って感じに書けます。また説明がなかったですがthemeでpaginateの具体的な内容を記述していきます。paginateの内容は下記です。

````
<%= paginator.render do -%>
  <nav class="pagination">
    <%= first_page_tag unless current_page.first? %>
    <%= prev_page_tag unless current_page.first? %>
    <% each_page do |page| -%>
      <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
        <%= page_tag page %>
      <% elsif !page.was_truncated? -%>
        <%= gap_tag %>
      <% end -%>
    <% end -%>
    <%= next_page_tag unless current_page.last? %>
    <%= last_page_tag unless current_page.last? %>
  </nav>
<% end -%>
````


主にこんな感じでかけるので参考にしていただければ幸いです。
ffmpegとconvertで綺麗なGIFを作成する方法

当然だけど、事前にffmpeg、convertの各ライブラリは用意しておいて下さい。

```
$ brew install ffmpeg
$ brew install convert
```

ディレクトリに連番でPNGで配備し（ここではframesディレクトリ）、convertでまとめます。

```
$ mkdir frames
$ ffmpeg -i terget.mov -vf scale=320:-1:flags=lanczos,fps=30 frames/%03d.png
$ convert -delay 2 -layers optimize frames/*.png output.gif
```

何かこれで結構綺麗に出来たってだけで、パラメータはチューニングの余地があるかも。
MySQLチートシート

#### MySQLへのログイン

```
mysql -u root -p
```

***
#### データベースの一覧を表示

```
SHOW DATABASES;
```

***
#### データベースへの作成

```
CREATE DATABASE データベース名;
```

***
#### データベースの削除

```
DROP DATABASE データベース名;
```

***
#### データベースへの接続

```
USE データベース名;
```

***
#### データベースを指定してテーブル一覧を表示

```
SHOW TABLES FROM データベース名;
```

***
#### データベースに接続していてテーブル一覧を表示

```
SHOW TABLES;
```

***
#### テーブルを作成

```
CREATE TABLE データベース名.テーブル名 
(col_name1 data_type1, col_name2 data_type2, ...);
```

***
#### テーブルを削除

```
DROP TABLE テーブル名;
```

***
#### データの追加

```
INSERT INTO db_name.tbl_name (col_name1, col_name2, ...)
  VALUES (value1, value2, ...);
```

***
#### テーブルへのカラム追加

```
ALTER TABLE database_name.table_name
ADD column_name datatype;
```

***
#### テーブルからのカラム削除

```
ALTER TABLE database_name.table_name
DROP COLUMN column_name;
```

***
#### カラムのデータタイプの変更

```
ALTER TABLE database_name.table_name
MODIFY column_name datatype;
```

*** 
#### プロセスの表示

```
SHOW PROCESSLIST;
```

***
#### レコード値の変更

```
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
```

***
#### テーブル作成SQL文の作成

```
SHOW CREATE TABLE tbl_name;
```

***
#### データのソート

```
SELECT column_name, column_name
FROM table_name
ORDER BY column_name ASC|DESC, column_name ASC|DESC;
```

***
#### テーブルの全レコードを削除する方法
```
DELETE FROM meta_data;
```

***
#### カラム名を変更
```
ALTER TABLE table_name CHANGE old_column_name new_column_name column_definition;
```

***
#### 参考URL
https://dev.mysql.com/doc/refman/5.7/en/sql-syntax.html
http://www.w3schools.com/sql/default.asp
Gitオブジェクトの中身

# はじめに

`.git/objects`フォルダの中に大量にできる謎のファイルについて調べてみました。
Gitをただツールとして使うだけなら必要のない知識ですが、Gitの設計を理解すると、Gitを難しいと思わなくなるかもしれません。

# Gitオブジェクト

Gitのデータは、Gitオブジェクトという形で`.git/objects`の中に格納されます。
例えば、以下のようにファイルを1つだけコミットしてみると、

    $ git init
    $ echo "hello" > sample.txt
    $ git add sample.txt
    $ git commit -m "Initial commit"

`.git/objects`フォルダの中にファイルが3つできていることが分かります。

    $ find .git/objects -type f
    .git/objects/71/9448a65a4412c7dcdfa3845dbaf755f14207ae
    .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
    .git/objects/e3/d14d7340059b5852f32f29574e98ff73eb3c47

Gitオブジェクトは40文字のハッシュが付けられ、先頭の2文字をサブフォルダ名、残りの38文字をファイル名として、1つのオブジェクトごとに1つのファイルに保存されます。

# cat-fileコマンドで見てみる

`git cat-file`コマンドでGitオブジェクトの内容を確認できます。
`-t`オプションでオブジェクトのタイプを表示します。見たいオブジェクトのハッシュを指定しますが、40文字すべて入力する必要はなく、先頭の4文字で十分です。

    $ git cat-file -t 7194
    commit
    $ git cat-file -t ce01
    blob
    $ git cat-file -t e3d1
    tree

3つのオブジェクトは、それぞれ**commit**、**blob**、**tree**というタイプであることが分かります。

## blobオブジェクト

`-p`オプションでオブジェクトの中身を表示できます。

    $ git cat-file -p ce01
    hello
    $ cat sample.txt
    hello

blobオブジェクトはファイルデータそのものです。ファイル名や属性（実行可能かどうか）の情報は含まれていません。

## treeオブジェクト

    $ git cat-file -p e3d1
    100644 blob ce013625030ba8dba906f756967f9e9ca394464a    sample.txt
    $ ls
    sample.txt

treeオブジェクトはフォルダ構造を表します。ファイルの属性、blobオブジェクトへの参照（サブフォルダの場合はtreeオブジェクトへの参照）、ファイル名の情報を記録しています。

## commitオブジェクト

    $ git cat-file -p 7194
    tree e3d14d7340059b5852f32f29574e98ff73eb3c47
    author nkshigeru <nkshigeru@example.com> 1434542915 +0900
    committer nkshigeru <nkshigeru@example.com> 1434542915 +0900
    
    Initial commit

commitオブジェクトには、トップレベルのtreeへの参照、コミットしたユーザーの情報、タイムスタンプ、コミットメッセージが含まれます。また、これは最初のコミットなので親コミットがありませんが、2回目以降のコミットでは親コミットへの参照も含まれます。

# pythonで見てみる

実はGitオブジェクトはzlibで圧縮されているだけなので、pythonや何か適当なツールでも見ることができます。

    $ python
    >>> f = open('.git/objects/ce/013625030ba8dba906f756967f9e9ca394464a', 'rb')
    >>> import zlib
    >>> zlib.decompress(f.read())
    'blob 6\x00hello\n'

つまり、blobオブジェクトは、`オブジェクトタイプ'blob' + ' ' + ファイルコンテンツの長さ + null文字'\0' + ファイルコンテンツ`という構造になっていることが分かります。

さらに、Gitオブジェクトのハッシュは、圧縮されていないデータのSHA1ハッシュを計算することで求められます。

    >>> import hashlib
    >>> hashlib.sha1('blob 6\x00hello\n').hexdigest()
    'ce013625030ba8dba906f756967f9e9ca394464a'

blobオブジェクトやtreeオブジェクトの場合は、同じ内容ならハッシュが同じになるため、ディスク容量を節約することができます。（commitオブジェクトの場合は、ユーザー情報やタイムスタンプが含まれるため、別のcommitオブジェクトと全く同じになることはたぶんないと思います。）
一方、少しでも内容が異なれば、全く異なるハッシュになるため、オブジェクトが衝突することを心配する必要はありません。また、ハッシュによってデータの破損を検出することが可能です。


# まとめ
Gitのデータは、zlib圧縮とSHA1ハッシュを使って`.git/objects`フォルダの中に格納されています。そのしくみはとてもシンプルですが、データを効率的に安全に扱う工夫がされています。
AccessVBAで他フォームの処理結果を使う

#AccessVBAで他フォームの処理結果を使う
MS Accessを使って事務処理的な業務を回してるようなシーンでは
社員マスタを登録する時に所属部門を検索して入力したいだとか、
商品マスタを登録する時に販売組織を検索して入力したいだとか、
「他のフォーム開いて結果を受け取りたい場面」というのはよくあると思う。

こういう時にどうするべきかググっても某知恵袋とかが出てきて
回答者によって方針が全然違ったりする。ので、メモに残す。
この中では３番目のやり方がましだと思うが、４番目のやり方もあるかもしれない。

##方法１：子フォームから親フォームを直接操作する
ネット上でよく見られるやり方なのかは知らない。
メンテを頼まれたファイルで濫用されている方法なので、きっとそうなのだろう。

```vbnet:Form_Main
Private Sub CommandOpenSubF_Click()
  'サブフォームを呼び出して結果を待つ
  Call DoCmd.OpenForm(FormName:="SubFoo",WindowMode:=acDialog)
  If Len(Me.FooId.Value) > 0 Then
    '選択したFooIdの値を必要とする処理
  End If
End Sub
```
```vbnet:Form_SubFoo
'選択したレコードのIDをMainフォームに直接書き込んでSubFフォームを閉じる
Private Sub CommandChoice_Click()
  Forms!Form_Main.FooId.Value = Me.FooId.Value
  DoCmd.Close
End Sub
```
* 方法１のメリット
 1. 多分これが一番早いと思います
 2. 共用とか考えないなら最も簡単に目的を実現出来る
* 方法１のデメリット
 1. サブフォームからメインフォームを操作するため、結合がかなり強固
 2. サブフォームからメインフォームを操作するため、動作が分かりにくい
 3. やりたい事によってはメインフォームに受取り専用の項目が必要になる
 4. 同じようなサブフォームが呼び出し元のフォームに対してコピペで生産される
 5. 同じようなサブフォームが呼び出し元のフォームに対してコピペで生産される
    大事なことなので二回書きましたっ！

##方法２：標準モジュールのメンバ変数でやりとりする
```vbnet:Mod_Foo
Public FooId As String
```
```vbnet:Form_Main
Private Sub CommandOpenSubF_Click()
  'サブフォームを呼び出して結果を待つ
  Call DoCmd.OpenForm(FormName:="SubFoo",WindowMode:=acDialog)
  If Len(Mod_Foo.FooId) > 0 Then
    '選択したFooIdの値を必要とする処理
  End If
End Sub
```
```vbnet:Form_SubFoo
'選択したレコードのIDをMod_Fooに書き込んでSubFフォームを閉じる
Private Sub CommandChoice_Click()
  Mod_Foo.FooId = Me.FooId.Value
  DoCmd.Close
End Sub
```
* 方法２のメリット
 1. サブフォームからはメインフォームの存在を気にしなくてよいので結合は弱い
 2. サブフォームの起動も標準モジュールに押しこめば共通関数的に使える
* 方法２のデメリット
 1. グローバルスコープに変数を置く事によるデメリットを全部受ける

##方法３：イベントを使う
```vbnet:Form_Main
'SubFooフォームのイベント監視のための宣言
Private WithEvents m__SubFoo As Form_SubFoo

Private Sub CommandOpenSubF_Click()
  'サブフォームを呼び出すだけ
  Set m__SubFoo = new Form_SubFoo
  m__SubFoo.Visible =True
End Sub

Private Sub m__SubFoo_OnSelected(Byval aFooId As String)
  Set m__SubFoo = Nothing '用済みなのでさっさと参照を破棄する  
  '選択したFooIdの値を必要とする処理
End Sub
```
```vbnet:Form_SubFoo
'IDを選択したイベント
Public Event OnSelected(ByVal aFooId As String)

'選択したレコードのIDでOnSelectedイベントを起こす
Private Sub CommandChoice_Click()
  RaiseEvent OnSelected(Me.FooId.Value)
End Sub
```
* 方法３のメリット
 1. サブフォームからはメインフォームの存在を気にしなくてよいので結合は弱い
 2. グローバルスコープも使わないで済む
 3. サブフォームの型を明示して使うので、Publicなプロシージャがあれば呼び出せる
 4. サブフォーム部品（フォーム内に別フォームを埋め込む部品）でも応用できる。
* 方法３のデメリット
 1. 他の方法に比べるとイベントを書くのは結構面倒くさい
 2. サブフォームを「作業ウィンドウ固定」にしていないとモードレスになる
 3. イベントの名前を変えてもエラーにならず、静かに失敗する
 4. イベントのシグネチャを変えてもエラーにならず、静かに失敗する

- - -

2015/12/31 一部修正

- 方法１と２のコードにCallキーワードが抜けていたのを追記
AWS summit 2015 -Day1-

# いってきたよ

2015 6/2(火)
AWS summitへいってきました。
お弁当をたべました。
おいしかったです。

はい、行ってきました。
主にCloudSearchの為に。なので6/2しか行っていません。
CloudSearchだーいすき。HAHAHA。

今回は行ってきた感想と、情報を展開していきます。
Session内容は、CloudSearchしか話す気ないです。
その他はいつか展開するかもしれませんが…期待はしないでいただきたいです。

CloudSearchは、ランチセッションだったので、会場でお弁当ゲット。
無料のセミナーで情報もらえて、お弁当もらえて、至れり尽くせりですね。

# Session内容

## CloudSearch

### snapdish紹介

Session1. CloudSearch Deep Dive
初回から大本命、CloudSearchです。
まず、CloudSearchとはどんなものなのかの説明から。

snapdishというレシピ検索サイトで使われているそう。
どこで使われているかというと、もちろん検索部分。

関係ないですが、
「CloudSearch、AWSの中でもそんなにメジャーなサービスじゃない。」
に、しゅーん。となりました。(笑)

### CloudSearchの構築

CloudSearchはフルマネージドな検索エンジン。
個人的な感想ですが、他のAWSサービスより運用や導入は楽かな、と思います。
勿論そう思ってなんとなく使っていると痛い目見るのですが…。

そんなCloudSearchをとりあえず構築してみる。
例えで出たのは、南北線のデータ検索。(駅名だったり、他路線のデータだったり)
フィールド定義はJSON形式でuploadするだけ。楽チン。
あとは言語を選べたりできる。対応言語は34ヶ言語。
勿論日本語対応！
あとはもう検索可能に！簡単簡単！！

### 見出しの切り出し方

日本語は形態素解析・N-gramに対応しています。
さらに、フィールドのコピーも作れるので、同じデータでも形態素解析のフィールドとNgramのフィールドを作って、形態素解析の方を検索にヒットした際のスコアを高くするなど設定が可能。
また、辞書登録もマネジメントコンソールから・CLIからと出来るので、「きゃりーぱみゅぱみゅ」という奇怪な言葉も検索可能になります。
言葉って難しいですもんね。

### CloudSearchの中身
フルマネージドというだけあって、Auto ScalingかつAuto Partitioning。
データが増えたら自動的にスケールアウト・分割してくれます。
＝気が付かない内に高額請求されないようデータ管理は気をつけましょうね。(笑)

#### indexing
CloudSearchの中身にはELBがいて、そこから複数いるEC2の内のどこかに均等に送られる。
そのノードがデータを受け取って、S3/DynamoにUpload。
その時点でAPIとしては「200」を返します。
その後、非同期でデータをpollingしてindixingされているそうです。
なので、「200」が返ってきたからといってすぐにデータが取得できるわけではありません。

#### search
indexingと同様、ELBにいき、そこから複数いるEC2の内のどこかに均等に検索にいく。
しかしそれぞれのEC2に違うデータが分割されて入っているため、分散検索をしにいく。

### インスタンスタイプによる違い
どんなインスタンスタイプを使えば良いかは、Sessionのスライドと扱うデータによってBestなサイズを見つけてくださいな。

### CloudSearh導入例
一週間で導入したschooさん。
技術力さえあれば、一週間でも導入できる！

nanapiさん
デフォルトのまま使用しているが、そこそこいい検索になっている。
保守・運用していないが成り立っている！

ChatWork
日本の中で最大の導入例。
データ件数は5億件を超える！データが増えても検索速度は快適！！
運用はメンテナンスフリー。

その他様々な企業の方々が導入しているそうです。

# 感想(CloudSearchのSessionだけでなく)

単純なAWSサービスの情報だけでなく、
プレゼンの仕方等、勉強になるところが多々ありました。
有休とってまで行って良かったと思います。

AWSの方々に直接質問する機会もそうそうないので、
勇気を振り絞って質問しに行ったり…(超絶人見知り)
いやあ、自分の成長を感じますね★

全体的に残念だったのは、
会場入る時に予約したかどうかの確認が何もなかったこと。
事前予約していない人用の列はありましたが、していなくても普通に会場に先に入れてしまう運用…。
その為、事前予約した人が立ち見になり愚痴っている現場を何度か目撃しました。。

でも、何個か立ち見で見ましたが、段差のない場所で座らされるより、
立っていた方がスライドは見やすかったです。
特に私は女なので、男性ばかりの会場では身長・座高でどうしても見えなくなります。
…もちろん足は悲鳴をあげてましたが…！！！！！

あと、会場が複雑(ただの方向音痴)
CloudSearchのSessionに間に合わないんじゃないかと一人で半べそかきながら迷子ってました。
事前に会場の見取り図とか持っておくべきでしたね。
申し込み時に展開されてたでしょうか？

以上、AWS summitの情報展開でした。
Session等は、公式に公開されているので、興味のある方は是非見てみると良いと思います。
私も参加していないSessionは暇な時に見てみようかな、と思います。
特に、「Tech Deep Dive by Amazon」のみの参加なので、Amazon以外の企業のSessionにも興味がありますね。
ajaxを止めてページ遷移させる

ボタンを押すとページ遷移する、というのをモバイル版でやってみたところ変な挙動になった。一応遷移？はするがデザインが崩れている。。。。そこでリロードしてみると、ちゃんと思い描いていた画面になるというものだった。疑われるのはjavascriptまわり。ということで対応してみた。


###ページ遷移するときだけ一時的にajaxを止める

もともとのコードが
```
<a href="/mobile/hogehoge">Hoge</a>
```

Hogeをクリックしても上手く遷移してくれなかったのでだが、data-ajax="false"ってのをaタグに入れ込んだら解決した。

```
<a href="/mobile/hogehoge",data-ajax="false">Hoge</a>
```

ちょこっと調べてもJQuerymobileとajaxの相性の悪さに悩まされてる記事が多い。。。他ではformとかが多い印象です、[jquerymobileの罠](http://d.hatena.ne.jp/runatubu/20140117/1389966751)←こちらも参考になると思います。
stringerで作った型の値をJSONにするときに文字列にする

すごい局所的だけど [stringer](https://godoc.org/golang.org/x/tools/cmd/stringer)で型を作って、それを構造体に入れたい場合の話。

```go
//go:generate stringer -type=City
type City int

const (
	Tokyo City = iota
	Osak
	NewYork
)

type Address struct {
	City City `json:"city"`
}

func main() {
	a := Address{NewYork}
	bs, _ := json.Marshal(a)
	fmt.Println(string(bs)) // {"city":2}
}
```

http://play.golang.org/p/BLUOtGTo5J

最後の結果を`{"city":"NewYork"}`にしたいとき


```go
//go:generate stringer -type=City
type City int

const (
	Tokyo City = iota
	Osaka
	NewYork
)

// Marshal時にstringで使った文字列を返す
func (c City) MarshalJSON() ([]byte, error) {
	return []byte(`"` + c.String() + `"`), nil
}

type Address struct {
	City City `json:"city"`
}

func main() {
	a := Address{NewYork}
	bs, _ := json.Marshal(a)
	fmt.Println(string(bs)) // {"city":"NewYork"}
}
```
http://play.golang.org/p/TMsY4i2AuZ


```go
func (c City) MarshalJSON() ([]byte, error) {
	return []byte(`"` + c.String() + `"`), nil
}
```

前後に`"`が必要。
libGDXの基礎１３ リソースを管理する

libGDXとはWindows、Linux、Mac、Android、iPhone、HTMLに対応したクロスプラットフォームゲームライブラリです。有名なIngressでも利用されています。欧米ではわりとメジャーどころです。


#リソースを管理するのは大変

今まではリソースについてコンストラクタ等で生成するときに引数に文字列やFileHandleを渡せばよいという感じでした。

たとえばテクスチャ読み込みは以下のように

```java
Texture tex = new Texture("hoge.png");
```

サウンド（効果音）読み込みは

```java
Sound sound = Gdx.audio.newSound(Gdx.files.internal("hoge.wav"));
```

といった感じです。

もちろん、これでも問題はないのですが、規模が大きくなるとリソースが複数カ所で必要になった場合ちゃんと解放ができるかどうか、すでに読み込んでいる場合は読み込まないようにするとか、非同期で読み込めないとかいろいろと問題が出てくると思います。

そこで使われるのがAssetManagerです。

#AssetManagerとは

AssetManagerはリファレンスカウンタ方式というものを取っています。どれだけリソースを参照しているかをカウントするのです。

利用するときには参照カウンタを+1し、ロードします。すでに1以上になっていた場合はロードせず以前ロードした時の参照を返します。

もう使わなくなった時には参照カウンタを-1します。このとき参照カウンタが0になったら破棄されます。

これによって、複雑な画面の呼び出し順序などを考慮せず安全に確保と開放ができるようになります。

#使い方

まず普通にインスタンスを作って

```java
AssetManager assetManager = new AssetManager();
```

ロードの指示をして（ここでリファレンスカウンタ+1）

```java
assetManager.load("hoge.png", Texture.class);
```

取得。getメソッドはそこまで軽くはないのでループの中とかででは呼ばないように。

```java
batch.begin();
Texture tex = assetManager.get("hoge.png");
batch.draw(tex, 0, 0);
batch.end();
```

解放（ここでリファレンスカウンタ-1）

```java
assetManager.unload("hoge.png");
```

ただし、注意点があります。loadはあくまでもロード開始の指示をするだけです。非同期でロードされます。

とりあえず手っ取り早いロードするまでブロックする命令があります。

```java
assetManager.finishLoading();
```

しかし、これではロードする項目が多いと画面も更新されないので長時間かかる場合は利用しないほうがよいでしょう。

ロードが完了したかどうかは以下のメソッドで調べることができます。

```java
boolean isLoaded = assetManager.update();
```
読み込み中にアニメーション表示などをする場合はこちらを利用します。
VBAHaskellの紹介 その17（大きな関数オブジェクト）

VBAHaskellに、1次元配列の部分列を作成する`subV`という関数を追加した。[^1]
機能的には`subM`関数の1次元限定バージョンに過ぎないが、こちらは2変数なので関数オブジェクト化ができる利点がある。
ここで書きたいのは、その実装方法とdll側に合理化を行ったことだ。

```vbnet
m = iota(1, 10000000)                  ' 大きな配列
printM subV(m, Array(2,4,6,8))         ' m(2), m(4), m(6), m(8) 
  3  5  7  9
```
上の通り、配列とインデックスを指定するとその位置の要素を取り出してくるだけなので、`subV`を普通にループで実装することに問題はない。が、ループを避けて以下のように実装した。

```vbnet
'1次元配列の部分配列を作成する
Public Function subV(vec As Variant, ByRef index As Variant) As Variant
    Dim fn As Variant
    fn = p_getNth       ' getNth はN番目の要素を取り出す関数
    swap2nd fn, vec     ' 第2引数をswapによって対象配列に束縛する
    subV = mapF(fn, index)   ' indexに対してmapする
    swap2nd fn, vec     ' swapした対象配列を戻す
End Function
    Public Function p_subV(略
```
基本的には単一の要素を取得する`getNth`関数を`mapF`で繰り返し適用しているだけだが、問題がある。引数`vec`に渡される対象配列が巨大な場合に、そのコピーを生成してしまったらすごく非効率になるのだ。
まず、`fn = p_getNth(, vec)`と普通に書いてしまうと、`vec`のコピーが発生し、`fn`は巨大な関数オブジェクトになる。効率の悪化を避けるためには上に書いたように、いったん裸の関数オブジェクトとして軽く生成しておいて、あとから第2引数に`vec`をswap渡ししてやればいい。
swapとはAPI関数`swapVariant`およびそれを使った`swap1st`や`swap2nd`関数[^2] のことで、巨大な配列でもほとんど無視できるコストで交換できるものだ。ただし目的の処理が終わったらもう一度swapして戻してやらないと、対象配列が消えてしまう。

```vbnet
    fn = p_getNth       ' 裸の関数オブジェクト
    swap2nd fn, vec     ' 第2引数をあとからswapによって束縛
```
次に`mapF`の中身だが、C++dllの中のいちばん根っこのところ[^3] でVariant変数を2回もコピーしていた。Variantの実体ではなくポインタで十分なところをポインタに直したところ、上に書いた`subV`が十分高速に動くようになった。
関数オブジェクトの大きさを気にしなくて済むとなると、できることが増えるかもしれない。

[VBAHaskellの紹介 その16（ラムダ式？の生成）](http://qiita.com/mmYYmmdd/items/95efb65f408fe2405e84)
[VBAHaskellの紹介 その1（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)
* * *
ソースコード
https://github.com/mYmd/VBA
dllバイナリ：
https://github.com/mYmd/VBA/blob/master/bin/mapM (32bit-Office用)
https://github.com/mYmd/VBA/blob/master/bin/mapM64 (64bit-Officey用)
VBAコード添付済みExcelブック
[VBAHaskellほぼ全部入り.xlsm](https://github.com/mYmd/VBA/blob/master/bin/VBAHaskell%E3%81%BB%E3%81%BC%E5%85%A8%E9%83%A8%E5%85%A5%E3%82%8A.xlsm)

[^1]: [Haskell_4_vectorモジュール](https://github.com/mYmd/VBA/blob/master/Haskell_4_vector.bas)
[^2]: [Haskell_1_Coreモジュール](https://github.com/mYmd/VBA/blob/master/Haskell_1_Core.bas)
[^3]: functionExprクラス周り : [VBA_NestFunc.hpp](https://github.com/mYmd/VBA/blob/master/VBA_NestFunc.hpp)
sicket.ioでcesium

そういうわけでcesiumをsocket.ioで動作させるrequire.configを書いてみる 

```
<script src="../../ThirdParty/requirejs-2.1.9/require.js"></script>
	<script type="text/javascript">
    require.config({
		baseUrl : '../../../Source',
        waitSeconds : 60,
        shim:{
        "socketio" : {
         exports: "io"
            },
        },
        paths:{
        socketio : "/socket.io/socket.io"
        }
    });
 </script>
```

cesiumはやはり、baseUrlを'../../../Source'にしないと動かないので
これは仕方がない。すると普通に
`<script src="/socket.io/socket.io.js">`　
とかするとうまくいかなかったりする。そこで上のようなrequire.configでsocket.ioを動作させることができたりする。

そうそう、上のconfigの後、普通は起動のスクリプトは

```
function startx(Cesium){
  スタートコード
}
require(["Cecium"],startx);
```

見たいにして書くんだが、上のconfigがあれば

```
function startx(Cesium,io){
 var socket = io.connect("http://localhost:8080");
 その他スタートコード
}
require(["Cecium","socketio"],startx);
```

みたいに、ioを引数で受け取ることができて普通のsocket.ioを書くことができる。

これでやっと、リアルタイムのtimelineを動かすことができました
Google API の PHP ライブラリでプロキシを設定する

[Google API PHP Client](https://github.com/google/google-api-php-client) でプロキシを設定する方法。

## cURL が入っている場合

PHP に cURL が入っている環境では、`Google_IO_Curl#setOptions(...)` で `CURLOPT_*` を渡せばいいみたい。

 * http://stackoverflow.com/questions/17049352/google-api-php-client-library

```php
$client = new Google_Client();
$client->getIo()->setOptions(array(
    CURLOPT_PROXY => 'myproxy.mywebsite.com',
    CURLOPT_PROXYPORT => 8909
));
```

## cURL が入ってない場合

cURL が入っていない場合は `Google_IO_Stream` が使われる。こっちだと、見た感じ `setOptions()` では設定できなそう。

オプションのデフォルト値は `Google_IO_Stream#executeRequest(...)` メソッドの冒頭で、

```php
$default_options = stream_context_get_options(stream_context_get_default());
```

のように取得している。ので、`stream_context_set_default()` を使ったらうまくいった。

 * http://php.net/manual/ja/function.stream-context-set-default.php

```php
stream_context_set_default(array('http' => array('proxy' => 'tcp://example.com:8080')));
```
$.fn.eachにも便利なDOMアクセス

jQueryでは複数のオブジェクトを`each`で回すことでまとめて処理できますが、基本的に毎回jQueryオブジェクトの作成が必要になります。ただ、状況によっては省略してDOMとして使ってしまうのもありです。

# `$.fn.each`の動作
jQueryオブジェクトに対して、`.each`で同じ関数を実行できますが、その関数の中では、`this`が対象の要素を表す**DOMノード**になっていて、jQueryオブジェクトではないので、よく

```js:jQueryに変換
$('ほげほげ').each(function(){
  var $elem = $(this);
  //本来の処理に入る
});
```

というように最初に変換しておく方法がとられます。そもそも、なぜDOMノードで来るのかといえば、`jQuery.fn.each`の実装自体が

```js:jQuery.fn.each
jQuery.fn = jQuery.prototype = {
    //中略

    // Execute a callback for every element in the matched set.
    // (You can seed the arguments with an array of args, but this is
    // only used internally.)
    each: function( callback, args ) {
        return jQuery.each( this, callback, args );
    },

    //後略
}
```
と、単純に`jQuery.each()`という、配列やオブジェクトを汎用的に回す関数を呼び出しているだけなのです。そして、jQueryオブジェクトは数値プロパティとしてDOMオブジェクトを持ち、`length`のある「配列のようなオブジェクト」で、`each`で回すことができます。

# DOMだけでできること
もちろんイベント割り当て[^1]やアニメーション、jQueryプラグインによる機能の適用など、jQueryオブジェクトでないとできないことも多数あるとは思います。ただ、DOMで済ませられるような場面であれば、ループを回るたびごとのjQueryオブジェクトの生成コストも削減できますので、特に多数のものをループさせるときには考えたほうがいいでしょう。

以下のようなものは、あっさりDOM経由で使えます。

* `id`属性…`this.id`
* （チェックボックス・ラジオボタン以外の`input`で）入力値…`this.value`
* `readonly`や`required`、`disabled`、`maxLength`といったフォーム制御用の属性…`this`へそのまま使えます（一部はキャメルケースになっていますが）

なお、`this.href`や`this.src`も使えますが、（IE以外では）これらは絶対パスに展開されていますので注意が必要です（書いたままの相対パスで取るにはjQueryの`.attr()`を使えます）。

## `data-xxx`属性
勝手に属性を生やすのが公認された形となった`data-`系の属性ですが、jQueryの`.data()`とは初期化時を除いて関連しない、**似て非なる**機能となっています。ということで、jQuery側の`.data()`を操作するにはjQueryを使うしかありません。

一方、`data-`系はふつうにattributeとして操作してもいいのですが、最近は`dataset`という専用の機能が登場しています。[CanIUse](http://caniuse.com/#feat=dataset)で確認すると、IEが11以上なのでPCでは実戦投入が困難ですが、モバイルではAndroid4以上であれば対応しています。`data-foo-bar`属性なら、`this.dataset.fooBar`として読み書きできます。

##Coffee break
CoffeeScriptの場合、`this.hoge`を`@hoge`のように書けるので、さらにスッキリ使えます。



[^1]: 状況にもよりますが、`.on`を使ったほうがいい場面かもしれません。
新人サーバーエンジニア向けコマンド紹介(中級)

# 新人サーバーエンジニア向けコマンド紹介(中級)

少し発展したコマンドやテクニックについて紹介

## コマンド一覧

### man

オンラインマニュアルを参照する。
これを使えば、たいていのコマンド使用方法が簡単に分かる。

```bash
man ls
man mv
```

### find

ファイルを検索する。
たくさんのオプションがあるが、詳しいことは`man`を見て欲しい。

```bash
find . -name "*.log"  # 末尾にlogとついたファイル名をフルパスで出力
```

### gzip

**ファイル** をgzip形式で圧縮する。
フォルダは圧縮できない。
ログファイルの圧縮に使用すると、100分の1のファイルサイズになったりする。超優秀。
圧縮率にこだわりたい場合は、代わりに`bzip2`を使用すると良い。
`bzip2`の使い方はgzipとまったく同じなので、解説はしない。
フォルダ圧縮は後述の`tar`コマンドで行うと良い。
オプションについては`man`を見て欲しい。

```bash
gzip hoge.log  # hoge.logをhoge.log.gzへ圧縮して置き換える。hoge.logは消える 
gunzip hoge.log.gz  # hoge.logを解凍
```

### tar

ファイルやフォルダを一つのファイルへ固める。
単体では圧縮は行わないが、オプション指定でtarで固めてgzipで圧縮できる。
オプションについては(ry

```bash
tar cfvz hoge  # hogeフォルダをtar.gz形式で圧縮
tar xfvz hoge.tar.gz  # hogeフォルダを解凍
```

### tail

ファイルの末尾を表示する。
`-f`オプションと組み合わせると真価を発揮する。
具体的には `-f` と組み合わせた場合、ファイルの監視モードになる。
`/var/log/httpd/error_log` を指定した場合、apacheのログをリアルタイムで追うことができる。
オプションについｔ(ry

```bash
tail hoge.txt  # hoge.txtの末尾10行を表示
tail -f /var/log/httpd/error_log   # apacheエラーログを監視
```

### head

末尾があるなら頭を表示するものもある。
こちらは単体だと使用する機会はあまりない。

```bash
head hoge.txt  # hoge.txtの末尾10行を表示
```

### ps コマンド

今何のプロセスが動いているか調べるのに使う。
よくgrepと組み合わせる。
オプションｎ(ry

```bash
ps ax | grep mysql   # mysql関係のプロセスを表示
```

## パイプテクニック

これのためにCUIはあるといっても過言ではない。
パイプはこれ。`|`
JISキーボードなら、`shift + ¥`キーで入力できる。
コマンドで出力した内容を別のコマンドへ引き渡せる。

### よく使う組み合わせ

```bash
ps ax | less  # ps axの内容を出力せず、lessで閲覧する。
ls | grep log  # logという名前のつくファイルやフォルダだけ出力
```

### xargs

パイプと言ったら`xargs`コマンド。
`xargs`を使用すると、後に続くコマンドへ **引数** として引き渡すことができる。

```bash
ls | xargs mv ../  # 今いるフォルダの中身を全て一つ上の階層へ移動させる
find . -name .DS_Store | xargs rm   # 今いるフォルダより下にある.DS_Storeを全て削除
```

### リダイレクト

パイプとは若干違うかも。
リダイレクトとは、`>`や`>>`のこと。
出力内容をファイルへ変更する。
`>`は新規書き込み。指定したパスに何か書かれていた場合は、消去されて書き込まれる。
`>>`は追記書き込み。末尾へ追加して書き込む。

```bash
ls > result.txt   # lsした結果をresult.txtへ書き込む
cat id_rsa.pub >> ~/.ssh/authorized_keys   # 公開鍵の登録
```

## ssh系コマンド

`ssh`について忘れてた！
`ssh`を使うと、リモートのサーバーへ接続してshellで操作できる。
トンネリングとか便利。

```bash
ssh hoge@192.168.10.30   # hogeユーザーで192.168.10.30へ接続
ssh hoge@www.hogehogefoofoobarbar.com
```

### scp

リモートサーバーへファイルのコピーをする。

```bash
scp hoge.txt hoge@192.168.10.30:hoge/  # hoge.txtをリモートのhoge/へコピーする。
scp -r hoge_folder hoge@192.168.10.30:  # フォルダのコピー
```

## z系コマンド

`zgrep`や`zcat`というコマンドがある。
内容は、`.gz`なファイルに対して該当のコマンドが走る。

```bash
zless error_log.gz   # error_log.gzを閲覧する。解凍した内容を閲覧できる。
```
[質問] PythonのWebフレームワークbottleを使って、textareaのデータのデータをリアルタイムで取得する方法

質問があります。

PythonのWebフレームワークbottleを使って、Webアプリを作成しているのですが、

HTMLのtextareaに入力された文字列を、入力される毎に

サーバのbottleで処理させたいと思っています。

　

下記のリンクのようにinputイベントを使えば、

同じようなことが可能なようなのですが、

これと同じような処理をpython(bottle)でできないでしょうか？

[テキストフィールド（input, textarea）の変化をリアルタイムに取得する Subterranean Flower blogSubterranean Flower blog](http://sbfl.net/blog/2014/03/20/how-to-track-input-changes-in-realtime/)

ご存知の方は教えて頂けると幸いです。
[Cookie・WebStorage]ブラウザにデータを保存する


ブラウザにデータを保存する方法は3つある。

- Cookie
- sessionStorage
- localStorage

それぞれの特徴は下表。

||別ウィンドウでのデータ共有|有効期限|データ量上限|サーバへのデータ送信|
|:--|:--|:--|:--|:--|
| Cookie |◯|指定した期限まで有効|4KB|サーバアクセスするたびに自動送信|
| sessionStorage |☓|ウィンドウやタブを閉じるまで有効|1オリジンあたり5MB|必要時のみ送信|
| localStorage |◯|永続的に有効|1オリジンあたり5MB|必要時のみ送信|

【参考文献】
▼Web Storage
http://www.htmq.com/webstorage/

# 1. Cookieの実装
jQueryプラグイン「jquery.cookie.js」が便利。
事前にjQueryとjquery.cookie.jsを読み込んでおく。

```
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.cookie.js"></script>
```

▼Cookieの保存

```
$.cookie('KEY（キー）', 'VALUE（値）', {オプション});
```

- オプション
  - `expires`：有効期限（日数）
  - `path `：有効なパス（ドメイン全体で利用したい場合は’/’を設定）
  - `domain`：有効なドメイン
  - `secure`：HTTPS接続の場合のみにcookieを送信(デフォルトはfalse)

▼Cookieの取得

```
$.cookie('KEY（キー）');
```

▼Cookieの削除

```
$.removeCookie('KEY（キー）');
```

[実装例] TypeScript、moment.jsを使った実装例は下記。

```javascript
if ($.cookie('HOGE_KEY') == undefined) {
  var expiration:Date = moment().endOf('day').toDate();
  $.cookie('HOGE_KEY', 'HOGE_VALUE', {expires: expiration}); // クッキーの期限は日付の変わり目（午前0時）
}
```

- Cookieが入っていない時、取り出そうとすると`undefined `
- JavaScriptで日付を扱うならMoment.jsが便利。
- moment.jsを使うには、`<script src="http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.2/moment.min.js"></script>`を読み込んでおく。

【参考文献】
▼jQueryプラグイン「jquery.cookie.js」でcookieを簡単に扱う
http://www.tam-tam.co.jp/tipsnote/javascript/post3109.html

# 2. sessionStorageの実装
▼sessionStorageの保存

```
window.sessionStorage.setItem('KEY（キー）', 'VALUE（値）');
```

▼sessionStorageの取得

```
window.sessionStorage.getItem('KEY（キー）');
```

▼sessionStorageの削除

```
window.sessionStorage.removeItem('KEY（キー）');
```

# 3. localStorageの実装
▼localStorageの保存

```
window.localStorage.setItem('KEY（キー）', 'VALUE（値）');
```

▼localStorageの取得

```
window.localStorage.getItem('KEY（キー）');
```

▼localStorageの削除

```
window.localStorage.removeItem('KEY（キー）');
```

【参考文献】
▼Web Storage
http://www.htmq.com/webstorage/
新人サーバーエンジニア向けコマンド紹介(初級)

# 新人サーバーエンジニア向けコマンド紹介(初級)

Linux系サーバーを操作する際に必要なコマンドの紹介。

## 基本コマンド

### ls

フォルダの内容を表示

```bash
ls     # 現在のカレントディレクトリ内を表示
ls -l  # 権限や作成時間などの詳細情報を含めて表示
ls *.log  # 末尾に.log があるファイルのみを表示
```

### cp

コピーする

```bash
cp hoge.txt foo.txt        # hoge.txtをfoo.txtという名前でコピー
cp -r hoge foo             # hogeというフォルダをfooという名前でコピー
```

### mv

ファイルやフォルダの移動

```bash
mv hoge.txt ../     # hoge.txtを一つ上のフォルダへ移動
mv hoge.txt foo    # hoge.txtをfooフォルダの中へ移動
```

### rm

ファイルの削除

```bash
rm hoge.txt    # hoge.txtを削除
rm -r hoge_folder # hoge_folderを削除
rm -rf hoge_folder # 削除の際に確認を求めないで削除
```

### less

テキストファイルの閲覧
qを押すと終了する。

```bash
less hoge.txt
```

### vi

ファイルの編集
'command mode' と 'insert mode' がある。
'command mode' で i を押す => 'insert mode'
'insert mode' で Esc キーを押す => 'command mode'
'insert mode' 中はテキストを普通に入力できる。
'command mode' 中は各種コマンドが使える

```bash
:w # セーブする
:wq # セーブして編集を終了する
:q  # 編集を終了する。何か変更をした場合は終了できない。
:q! # セーブせず編集を終了する  編集がなかったことになる
```

### cat

ファイルの内容を画面へ出力する。
小さいファイルの閲覧で使用する。

```bash
cat hoge.txt  # hoge.txt の内容が画面へ出力される
```

### echo

入力内容を画面へ出力する。
環境変数等の確認に使用したりする。

```bash
echo $PATH  # 環境変数の表示
```

### grep

キーワードに合致した行を抽出する。
ログの解析等でよく使われる。

```bash
grep hoge /var/log/secure   # hogeが含まれている行を抽出
```
Pleskにおけるmailmanの設定

このドキュメントはPlesk8系向けで、Plesk11の場合は未確認。

# MLを新規作成した時のデフォルト設定を変更する

```
# vi /etc/mailman/mm_cfg.py
```

次の内容を追加する。（Default.pyファイルに本来の設定があるが、それよりもこの設定が優先される。むしろ、default.pyはアップデート等で上書きされるリスクがあるので、編集禁止らしい）

```
DEFAULT_SERVER_LANGUAGE = 'ja'
DEFAULT_SEND_REMINDERS = No
DEFAULT_REPLY_GOES_TO_LIST = 1
DEFAULT_SUBJECT_PREFIX = "[%(real_name)s:%%d]"
DEFAULT_SEND_WELCOME_MSG = No
DEFAULT_SEND_GOODBYE_MSG = No
DEFAULT_MAX_NUM_RECIPIENTS = 0
DEFAULT_MAX_MESSAGE_SIZE = 0
DEFAULT_MSG_FOOTER = ""
DEFAULT_PRIVATE_ROSTER = 2
DEFAULT_GENERIC_NONMEMBER_ACTION = 0
DEFAULT_ARCHIVE_PRIVATE = 1
```

# mailmanのメーリングリスト管理パスワードを紛失した場合

```
# cd /usr/lib/mailman/bin/
# change_pw -l （mlname） -p （passwd）
```
とすれば、パスワードを指定できる。

```
# change_pw -l test-ml -p c8s****4
```

# シーケンスの値を変更する

メーリングリストのタイトルに付く連番の番号を変更する。

```
# cd /usr/lib/mailman/bin/
# ./withlist （リスト名）
```

withlistのコマンドモードに切り替わる
ロックする。何をロックするのかは謎ｗ

```
>>> m.Lock()
```

現在の「次に送り出す数字」を表示することができる。（省略可能）
小数点以下の数字が出てくるが気にしない。

```
>>> m.post_id
80.0
```

次に配信されるメールの数字を指定する。

```
>>> m.post_id=100
```

保存する。

```
>>> m.Save()
```

ctrl+Dで終了する（セーブしてないといったメッセージが表示されるが、Saveコマンドは実行済なので無視してよい）

# サイトパスワードを設定する
mailmanには、全て共通の管理ログインができる「サイトパスワード」と、リストごとに設けた「リストパスワード」がある。前者はサーバ管理者、後者はメーリングリストの運用担当者が利用することを想定している。PLESKのデフォルトでは、サイトパスワードが設定されていない。そこで、初めて設定する場合、ならびにパスワードを紛失した場合には、次のコマンドで設定できる。

```
# /usr/lib/mailman/bin/mmsitepass
New site password:（設定したいパスワードを入力する）
Again to confirm password: （同じパスワードを再入力する）
Password changed.
```
Rails 4 でカスタムフォントを使う

カスタムフォントの使い方のメモ :memo:

# <i class="fa fa-copy" style="font-size:1em;"></i> 手順

1. app/assets/fonts 以下に fontファイルを置く

2. scss で @font-face を指定

```
@font-face {
  font-family: 'SkipStd';
  src: font-url('FOT-SkipStd-D.otf') format('truetype');
  font-weight: normal;
  font-style: normal;
}
```


これで使えるようになります


```
body {
  font-family: 'SkipStd';
}
```

反映されなかったら、サーバを立ち上げ直してみてください


# <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参考リンク

plapier さんの説明がわかりやすかったです
#### <i class="fa fa-file-text-o" style="font-size:1em;"></i> https://github.com/thoughtbot/bourbon/issues/239#issuecomment-26167073
SBDBTを使ったArduinoとWindows PC間のBluetooth通信

# 用意するもの<a id="sec-1" name="sec-1"></a>

-   Arduino Uno
-   PIC24FJ64GB004 小型マイコン基板 SBDBT (ランニングエレクトロニクス)
    <http://runningele.cart.fc2.com/ca1/2/p-r-s/>
-   Bluetooth USB アダプター BSHSBD03 (バッファロー)
    <http://buffalo.jp/products/catalog/supply/bluetooth/bluetooth/adapter/bshsbd03/>

# 結線<a id="sec-2" name="sec-2"></a>

SBDBT と Arduino 間の結線は以下の通り．

|SBDBT | Arduino Uno |
|:----:|:-----------:|
|2     | 3.3V        |
|3     | GND         |
|7     | D0(RX)      |
|8     | D1(TX)      |

また，SBDBTの6番ピンと9番ピンを接続しておく(フロー制御なしの設定)．

![arduino-sbdbt.jpg](https://qiita-image-store.s3.amazonaws.com/0/53034/2f9d14bf-bf83-d206-2171-fa88b3f8472b.jpeg)

# プログラム<a id="sec-3" name="sec-3"></a>

    int counter;
    
    void setup() {
      Serial.begin(9600);
      counter = 0;
    }
    
    void loop() {
      Serial.println(counter);
      counter++;
      delay(100);
    }

# 書き込みと接続<a id="sec-4" name="sec-4"></a>

## Arduino側<a id="sec-4-1" name="sec-4-1"></a>

-   Arduino Unoにプログラムを書き込むときには，D0(RX)とD1(TX)ピンを抜いておく必要がある．

-   USBケーブルでPCとつないだままだと，シリアル接続での通信経路がUSBケーブル経由になってしまう．
    Bluetoothで通信を行うためには，USBケーブルをPCから外す必要がある．
    Arduinoへの給電はUSB-ACアダプタなどで行う．

## Windows側<a id="sec-4-2" name="sec-4-2"></a>

-   タスクバーのBluetoothアイコンを右クリックし，[Bluetoothデバイスの追加]を選択する．
    
![sbdbt01.png](https://qiita-image-store.s3.amazonaws.com/0/53034/83537cf1-9984-5e2c-2980-ef8d8c932ba0.png)

-   Bluetoothデバイスの管理画面に，SBDBT-xxxxxxxxxxxxが現れるので(少し時間が
    かかることもあるので気長に待つ)，[ペアリング]をクリックする．
    パスコードの入力を促されるので，マニュアルにある通り0000を入力する．
    
![sbdbt02s.png](https://qiita-image-store.s3.amazonaws.com/0/53034/df315a54-4d59-6f3d-36b8-736d53f2100c.png)

-   デバイスマネージャーの[ポート(COMとLPT)]に[Bluetoothリンク経由の標準シリアル]が現れる．
    私の場合は二つ現れた．
    プロパティの[詳細]タグの[バスによって報告されるデバイスの説明]がSPP(Serial Port Profile)になっている方が恐らく正解．
    
![sbdbt03.png](https://qiita-image-store.s3.amazonaws.com/0/53034/8afc04bc-d6bf-01b1-cf0b-4be824b853a7.png)

-   ポートの設定について，動作した例を以下に示す．

![sbdbt04.png](https://qiita-image-store.s3.amazonaws.com/0/53034/65c2f09c-0a27-1a59-ba58-a6cfe3bc0c8b.png)

-   Arduinoから送信されたデータの確認には，例えばTera Term <http://osdn.jp/projects/ttssh2/> を使う．
    以下のように表示されればOK．
    
![sbdbt05.png](https://qiita-image-store.s3.amazonaws.com/0/53034/7f95a119-1b06-47f4-2b90-43edf8b10ec0.png)
[Java・Tomcat・Maven]URLのrewriteによるルーティング


`/mypage/*`アクセス時、`/mypage`に飛ばすには下記をすればよい。

▼pom.xmlのdependenciesに下記を追加。

```
		<dependency>
			<groupId>org.tuckey</groupId>
			<artifactId>urlrewritefilter</artifactId>
			<version>4.0.4</version>
		</dependency>
```

- urlrewritefilterについては下記参照。Mavenのリモートリポジトリ（Maven Central Repository）。
  - http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.tuckey%22

▼WEB-INFディレクトリに、urlrewrite.xmlというファイルを作成。ファイルの中身は下記。

```
<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">

<urlrewrite>
	<rule>
		<from>/mypage/(.*)</from>
		<to type="forward">/mypage</to>
	</rule>
</urlrewrite>
```

▼WEB-INFディレクトリにあるweb.xml（tomcatの設定ファイル）にfilterとfilter-mappingを追加。

```
	<filter>
		<filter-name>UrlRewriteFilter</filter-name>
		<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
	</filter>
```

```
	<filter-mapping>
		<filter-name>UrlRewriteFilter</filter-name>
		<url-pattern>/mypage/*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
	</filter-mapping>
```

※ おまけ（phpのルーティング）
▼.htaccessファイルでルーティング設定
http://qiita.com/shuntaro_tamura/items/28aeade180ea30a19d63
MySQLのスキーマをCSVにエクスポートする

MySQLのスキーマをエクセルなどに出力したいときありますよね。
そのスニペットです。

```sql
SELECT * INTO OUTFILE '/path/to/table_name.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES  TERMINATED BY '\n'
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'table_name';
```
[android]SDカードのpathの取得

#はじめに
　　　　javaの基本的な理解はできている
　　　　androidStudioの導入が完了している
同じく、開発初心者による備忘録のような形になります。
[Day1.AndroidStudioにおけるプロジェクトの作り方](http://qiita.com/BD1-FM/items/f9caa43b2d5510ddcfe4)
[Day2.Androidアプリケーションの構成](http://qiita.com/BD1-FM/items/c5ed161feec1fdf92796)
[Day3.アプリケーションのレイアウト](http://qiita.com/Yuki_Yamada/items/eb4a25cedca2ff8078fd)
[Day4.onClickListenerの実装とその後の処理](http://qiita.com/Yuki_Yamada/items/758bcce58801c12cd4d5)
[Day5.Activityのライフサイクル](http://qiita.com/Yuki_Yamada/items/5906bca15b312de4479d)
[Day6.xmlで枠を指定する](http://qiita.com/Yuki_Yamada/items/15fc68dc88b57734149b)

#Environmentクラス
androidアプリ開発でのデータの保存についてです。
機種ごとに保存pathが違ったり4.2以降はマルチユーザー対応（タブレットのみ）によってストレージの扱いが変わっていたりなど大変なんです。直接参照している場合はファイルが見つからないため落ちます。ですので基本的にハードコーディングはやめるべきです。何よりも互換性がなくなります。(androidでは致命傷でしょう...)
御託はどうでもいいからpathの取得の仕方を教えろ、という方は一番下に行けば幸せになれるでしょう。

そこで使用されるのがEnvironmentClassです。

##Environment.getXXXDirectory()
Environment.getXXXDirectoryを呼び出すことでFileインスタンスの取得ができます。
種類としては

- getDataDirectory
- getDownloadCacheDirectory
- getExternalStrageDirectory
- getRootDirectory


です。
今回はExternalStrageDirectoryを用いてSDカードにアクセスします。

##アプリの専用保存場所の取得
データの保存場所はroot Directoryにしないほうがいいでしょう。理由としては、アンインストールした時にそのアプリで生み出されたごみが残ります。
あなたもデスクトップが汚いのは気になるでしょう。

アプリにはそれぞれ専用の保存領域が確保されています。さらにAcitivty内のメソッドで簡単に取得できます。

- getExternalFilesDir(String string)
- getExternalStoragePublicDirectory(String type)

###getExternalFilesDir
ファイルを置くディレクトリpahtを取得できます。
ここはアプリ固有のファイルの置場所でアプリがアンインストールされた際一緒に消されます。また、ファイルにロックはかかってないので外部から参照（読み書き）することも可能です。

###getExternalFilesDir
publicなディレクトリを取得できます。
typeを指定することでさまざまな場所を動的に取得できます。
よく使われるtypesとしては

- DCIM
- DOWNLOADS

でしょうか。
名前のままですが カメラとダウンロードを取得できます。

```java:.java
 File pathExternalPublicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
```

上記でダウンロードディレクトリのpathを取得できます。

以上です。

```java:.java
 File pathExternalPublicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
```

せっかちな人のためにカメラのディレクトリpahtの取得の記述も書いておきます。
タブ変更時にUITabBar の背景色変更

背景用の画像を動的生成して当てはめる。
TabbarItem 自体に背景画像など適用するのは不可能なので、Tabbar そのものに背景設定を行う。



```objc:tabbar_delegate
-(void)changeTabBarBackground:(int)index{
    CGFloat width = self.view.frame.size.width;
    
    CGRect rect = CGRectMake(0.0f, 0.0f, width, 40.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextSetFillColorWithColor(context, [[UIColor greenColor] CGColor]);
    CGContextFillRect(context, rect);
    
    CGContextSetFillColorWithColor(context, [[UIColor redColor] CGColor]);
    rect = CGRectMake(width/3 * (CGFloat)index, 0.0f, width/3, 40.0f);
    CGContextFillRect(context, rect);
    
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    [self.tabBar setBackgroundImage:image];
    
}
```

タブバー全体に背景色を設定、その後、選択したタブに対応した背景部分に任意の背景色を設定する。
上記は3タブ設定時の例。
.mdをhtml表示してみた(cebe/markdown)

カレントディレクトリの./vendor/にライブラリを保存してくれるもの。
パッケージ管理ができ、root権限は不要。

## 参考

* [packagist.org](https://packagist.org/)

## インストール

```bash:
curl -sS https://getcomposer.org/installer | php
```

## ライブラリの導入

```json:composer.json
{
    "require": {
        "cebe/markdown": "v1.1.0"
    }
}
```

```bash:
php composer.phar install
```

## 使い方

```php:md2html.php
<?php
require_once __DIR__.'/vendor/autoload.php';

$markdown = file_get_contents(__DIR__."/vendor/cebe/markdown/README.md", "r");
$parser = new \cebe\markdown\GithubMarkdown();
echo $parser->parse($markdown);
```

読み込んだmarkdownがhtmlで表示されていることが確認できる。
Travis-CI からビルド成功したらチャットワークに投げるやつ

## チャットワークのトークン取得

右上の自分のアイコンクリックしてから「動作設定」→「API発行」

## 環境変数の設定
右上の「Settings」→「Environment Variables」→「Add a new variable」から設定しとけばおｋ
あとで使う `CHATWORK_TOKEN` と `CHATWORK_ROOM_ID` を設定
`CHATWORK_TOKEN` はさっき確認したチャットワークのトークン
`CHATWORK_ROOM_ID` はチャットワークで部屋開いた時のURLの#!ridより後ろの数字

## .travis-ci に追記

```yaml
after_success:
  - 'curl -X POST -H "X-ChatWorkToken: $CHATWORK_TOKEN" --data-urlencode "body=[info][title][Travis-CI] Test Passed[/title]#$TRAVIS_BUILD_NUMBER https://magnum.travis-ci.com/$TRAVIS_REPO_SLUG/builds/$TRAVIS_BUILD_ID[/info]" "https://api.chatwork.com/v1/rooms/$CHATWORK_ROOM_ID/messages"'
```

## こんな感じで投稿される

![スクリーンショット_2015-06-17_19_53_09.png](https://qiita-image-store.s3.amazonaws.com/0/19816/67aca132-342b-a203-07d4-6c95cc933e52.png)
Vue.jsのドキュメントには日本語版がある


![スクリーンショット 2015-06-17 18.44.21.png](https://qiita-image-store.s3.amazonaws.com/0/32596/712cc9ff-4feb-afc3-dcb0-801adc4b3cfc.png "スクリーンショット 2015-06-17 18.44.21.png")

# 日本語ドキュメント

http://jp.vuejs.org/


満を持して本日リリースされました。めでたいですね。
Vue.js自体は、0.12の次に1.0のリリースが控えています。0.11から大幅にAPIが変更されましたので、これから安定化に向けて頑張っていくような気がします。

Vue.jsの弱点として「ViewModelが巨大化してしまい、大きな構造のアプリをどう作ればいいかわからない」点がしばしば挙げられます。宣伝だけするのも何なので、今回はVue.jsのサンプルとして最大規模の、[vue-hackernews](http://jp.vuejs.org/examples/hackernews.html)のコードを読んでいきたいと思います。

その前に、HackerNews Cloneで多用されている「Vueify」の動きだけ、ざっと説明します。

# コンポーネント化(Vueifyを使う)

https://github.com/vuejs/vueify

Vueifyは、Vue.js用のコンポーネントのフォーマットの.vue形式をコンパイルするための、browserifyのプラグインです。詳しくは、[Vue.jsでpopup componentを作ってみる | TEJI TECH BLOG](http://www.tejitak.com/blog/?p=821)を参照するといいでしょう。

ざっくりした構造は下記のように、template（HTMLの断片）とscript、styleをべったりつなげただけです。

![スクリーンショット 2015-06-17 18.52.15.png](https://qiita-image-store.s3.amazonaws.com/0/32596/d58d6a9f-2613-48eb-8d6e-444231021562.png "スクリーンショット 2015-06-17 18.52.15.png")

vueファイルをrequireした上で、browserify + vueifyに通すと、下図のようにbundle.js内にべっとり埋め込まれます。

![スクリーンショット 2015-06-17 18.54.18.png](https://qiita-image-store.s3.amazonaws.com/0/32596/f68ad1ac-3a06-4911-9ea1-46434711d2e3.png "スクリーンショット 2015-06-17 18.54.18.png")

こうすることで、ViewModelを細かく部品に分けて管理することができます。最終的にはBroserifyで１ファイルにコンパイルしてしまう感じですね。

なお、Webpackでも同様のことが出来ます。vue-loaderを利用して下さい。

# HackerNews Cloneの構造


[DEMO](http://vuejs.github.io/vue-hackernews/#/news/1)

[SOURCE](https://github.com/vuejs/vue-hackernews)

では、実際にHackerNews Cloneの構造を図示していきます。

## ルーティング

まず、index.html内にapp.vueがロードされます。app.vue内には、`.view`領域があり、ニュース一覧画面、詳細画面、ユーザ情報画面があり、ルータによって切り替えられるようになっています。

![スクリーンショット 2015-06-17 18.58.37.png](https://qiita-image-store.s3.amazonaws.com/0/32596/f0dc0abf-9b7f-7b86-cf28-bd879042f193.png "スクリーンショット 2015-06-17 18.58.37.png")

ルータがやっていることは、{{view}}にビューの名称を代入しているだけです。{{view}}が変更されると、対応するビューに切り替わります。

## ViewModelとModelの連携

※正確なM, VMの分類かどうかはちょっと自信ないです。間違っていたらご容赦を…

HackerNews Cloneのバックエンドは、firebaseを利用しています。雑に作るとなると「ViewModel内にfirebaseからデータをfetchする」ロジックを直書きも出来ますが、そうなるとViewModelがどんどん太ってしまいます。

HackerNews Cloneでは、store.jsというモデル内にfirebaseの操作を集約し、ViewModelから呼び出すようになっています。

ViewModelからModelを参照するには、requireを使っています。

store.js内でEmitterを作成し、メソッドを生やしたものをexportします。利用する側からはrequireします。

![スクリーンショット 2015-06-17 19.02.54.png](https://qiita-image-store.s3.amazonaws.com/0/32596/7843b459-4675-be8e-3a67-96691829615b.png "スクリーンショット 2015-06-17 19.02.54.png")

ViewModelからfetchするときは、Modelを呼び出すだけにします。

![スクリーンショット 2015-06-17 19.09.17.png](https://qiita-image-store.s3.amazonaws.com/0/32596/cc4035f9-d0a9-7b9c-3102-3863cdd11fdb.png "スクリーンショット 2015-06-17 19.09.17.png")

また、ModelをEventEmitterにすることで、Model側からViewModel側にイベント通知を行なうことが出来ます。

![スクリーンショット 2015-06-17 19.10.16.png](https://qiita-image-store.s3.amazonaws.com/0/32596/57fe0832-9af4-926d-71dc-fc8dca80e1a1.png "スクリーンショット 2015-06-17 19.10.16.png")

これで、リアルタイムにModelが更新されたとしても、ViewModelをイベントドリブンに更新することが出来ますね。

# おわりに

ここまで、ソースコードを読んで構造を図示してみました。間違ったところがあれば、ぜひコメントをお願いします。

大規模開発において、どこまでVue.jsが通用するのか（向いているのか）という点については、あまり自信がない部分なので、Vueでこうしてるよ、あるいはReact + fluxの方がいいよ、などぜひコメントをいただければと思います。
[Swift] iOS のカメラのフラッシュを On/Off する


Swift で書いてみました。

```
    func toggleTorch() {
        Logger.log("tapped")
        let avDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

        if  avDevice.hasTorch {
            avDevice.lockForConfiguration(nil)
            avDevice.torchMode = AVCaptureTorchMode.Off == avDevice.torchMode ? AVCaptureTorchMode.On : AVCaptureTorchMode.Off
            avDevice.unlockForConfiguration()
        }
    }

```

あまり使う機会ないかもしれませんが。
Express.js4で、静的ページをst.jsで配信する

Express4使っていますか？　私はちょっと久々です。色々さまよっている間に、「結局、nginxをフロントに立てるの過剰じゃね？」と思うようになりました。で、「[こんな記事](http://hakobera.hatenablog.com/entry/2012/10/22/231534)」にも励まされて、今は直接フロントにnode.jsを立てて遊んでいます。で、そうすると、リンク先にもある、express.staticの遅さが気になります。あと、gzipとか、キャッシュサイズもコントロールしたいですね。そうすると、なにか代わりが必要になります。

で、上記リンクでちょっと推奨気味だったst.jsを組み込んでみました。設定値は、その道に詳しい人とご自身のプロジェクトを熟知した人に聞いて下さい。私は、「瞬間最大風速の時に効けばそれでよし。それ以外はキャッシュなんてあってないような存在がよろし」という感じで設定しているので、参考になるかどうかはわかりません。

とは言え、こういう単機能で CPU bound な処理は、来るべき将来ネイティブモジュールが出てきてスタンダードになる気がします。っていうか誰かやって（jsで600行、ロジックも明快なので、そこそこお手頃だと思いますよん。そしてキャッシュのexpire処理とかは別スレッドでやって欲しいな）。それまでの繋ぎとして、いかがでしょうか。

```coffeescript:app.js(部分)
st = require('st')

#下記行の代わりにその後に続く記述を入れるよ
#app.use express.static(path.join(__dirname, 'public'))
mount = st 
  path: __dirname + '/public' #配信するファイルのパス
  url: '/public'              #pathに相当するURL
  cache:
    fd:
      max: 100           #保持するfdの数
      maxAge: 1000*20    #fdの有効期限(ms)
    stat:
      max: 1000          #保持するstatオブジェクト
      maxAge: 1000*20    #statオブジェクトの有効期間(ms)
    content:
      max: 1024*1024*256 #キャッシュメモリのサイズ
      maxAge: 1000*60*10 #キャッシュの有効期限(ms)
      cacheControl: 'public, max-age=600' #cache-controlヘッダに明示する内容
    index: true   #autoindexを使わないならtrueを入れる(さもなくば、{max,maxAge})
    readdir: true #autoindexを使わないならtrueを入れる(さもなくば、{max,maxAge})
  index:       false, #ディレクトリアクセスは404（trueだとautoindex,indexファイル名の指定も可
  dot:         false, #「.」で始まるファイル名は403
  passthrough: true, #ファイルがない時はnextを呼ぶ（express側で404を処理する）
  gzip:        true, #原則としてgzipで配信する

app.use mount
```
Laravel 5.0をLaravel 5.1にアップグレド

Laravelのdocsを参照しながら行いましたが、５分もかからなかったことにびっくりしました。
http://laravel.com/docs/5.1/upgrade#upgrade-5.1.0

１. bootstrapフォルダにcacheフォルダを追加して、書き込み権限を与えました。
２. bootstrap/autoload.phpを開いて、`$compiledPath`を次のように書き換えます。

```php
$compiledPath = __DIR__.'/cache/compiled.php';
```

３. composer.jsonでのLaravelのバージョンを`5.0.*`から`5.1.*`にアップします

```json
"laravel/framework": "5.1.*",
```
４. 最後に、`composer update`してエラーなく完了しました。
ASP.NET Web FormsでWebControlを拡張せずにカスタマイズする

はい、誰得（俺得）情報ですね。

たとえば、[PanelコントロールのGroupingTextプロパティ](https://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.panel.groupingtext.aspx)に何か設定しておくと、出力されるHTMLは&lt;fieldset&gt;と&lt;legend&gt;になります。で、その&lt;legend&gt;にclassを付けたいなと思ったとしても、ふつうの`Panel`コントロールだと手段がありません。`Panel`を継承して拡張すればいいんですが、そうしたくない特殊な事情があった場合はどうしましょう。

> JavaScriptでやれ。はい、もっともですね。でもまあここではそういう手段はとらないことにします。いまどきWeb Formsを使ってるようなとこにはいろいろ事情があるんです。

そんな時は[コントロールアダプター](https://msdn.microsoft.com/ja-jp/library/67276kc5.aspx)が使えます。コントロールアダプターを使う場合、普通は[ブラウザー定義ファイル](https://msdn.microsoft.com/ja-jp/library/vstudio/ms228122.aspx)に書いておくのですが、コードから設定することもできなくはないです。

```csharp
public class LegendTagModifier : Control
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        if (Context != null && !DesignMode)
        {
            var dict = Context.Request.Browser.Adapters;
            var panelName = typeof(Panel).FullName;
            if(!dict.Contains(panelName))
            {
                dict.Add(panelName, typeof(PanelAdapter).FullName);
            }
        }
    }

    public class PanelAdapter : WebControlAdapter
    {
        protected override void Render(HtmlTextWriter writer)
        {
            if (!string.IsNullOrEmpty(((Panel)Control).GroupingText))
            {
                writer = new LegendTagHtmlTextWriter(writer);
            }
            base.Render(writer);
        }
    }

    public class LegendTagHtmlTextWriter : HtmlTextWriter
    {
        public LegendTagHtmlTextWriter(HtmlTextWriter writer)
            : base(writer)
        {
            this.Indent = writer.Indent;
            this.NewLine = writer.NewLine;
        }

        public override void RenderBeginTag(HtmlTextWriterTag tagKey)
        {
            if (tagKey == HtmlTextWriterTag.Legend)
            {
                // <legend class="foo bar"></legend>
                this.AddAttribute(HtmlTextWriterAttribute.Class, "foo bar");
            }
            base.RenderBeginTag(tagKey);
        }
    }
}
```

上の`LegendTagModifier`カスタムコントロールをaspxに放り込んでおくと、`Panel`が&lt;legend&gt;を出力する時だけ介入できます。
【win7】.exeの関連付けを変更してしまったときの対応。

#.exeを7Zipに関連付けしてしまった！

* 単純ミスで時間つぶしまくったよ。
* UI、UXって何？
* プログラムの選択が、ソート的に7Zip推しの状態になってた？
* EXEなので、regeditとかも使えない。プロンプトも出ない（.comだから出ると書いてあるページもあったけどなかったよ）。
* 軽く詰んだ。
* とりあえずタブレットでググりながら解決できたっぽいので、忘れないうちにここにメモっておく。


###セーフモード+コマンドプロンプトで起動する。
* F8でセーフモードって共通？
* 起動画面に書いてなかったのと、一回で成功しなかったのでいろいろ試して時間かかった。そのたびに再起動だし。
* 結局、F8の入力タイミングがかなりシビアだった。コツはトントンとリズミカルにたたいておくこと。

###コマンドプロンプト様が現れた。
やることはコマンド二つとregeditの変更。

[コマンドプロンプトで入力]
 assoc .exe=exefile
 ftype exefile="%1" %*

[regedit]
プロンプトでregeditで起動。
 HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/FileExts
の中にあるフォルダを消した。フォルダの中身だけ（7Zipに関連づけられている設定）消してもいいかと思ったけど、消せないのがあったのでフォルダごとやった。



これで元通り、だと思う。
ftypeの引数の部分は、ググった通りにしたけど、可変長？引数のところがexe全般に対してこれでいいのかは確信が持てない。
rspecでrake aborted! Mysql2::Error: Unknown database 'hoge_test'と言われる解決方法。

rspecを実行する前にrake db:test:prepareをしたら失敗しました。

```
bundle exec rake db:test:prepare

rake aborted!
Mysql2::Error: Unknown database 'hoge_test'
```
データベースがないと言われます。

db:createすればいいのかなと思いました。

```
bundle exec rake db:create:all
hoge_development already exists
```
developmentはあると言われました。

testのデータベースにmigrateします。

```
bundle exec rake db:migrate RAILS_ENV=test
```
RAILS_ENVでtestを指定しました。

再度rscecを実行します。

```
 bundle exec rspec --color --format d
```
rspecの実行に成功しました。
rspecを実行する前はtestのデータベースができていないといけないということか(☝ ՞ਊ ՞)
Javascriptでオブジェクトリストを扱う便利なもの集め（関数型プログラミング）

最近はJavascriptも便利になったもので関数型のコーディングもできるようになった。

ただJavascriptのsyntaxにはどうもなれなくて、、なんでこういう書き方をする？と言われると「jsの特性」としか言えないので、いくつか整理

ほぼ自分が忘れた時に参考する自分用メモに近い
jQueryだろうが、AngularJSだろうが、関係なく使えるはず

```js
// 基本オブジェクトというか連想配列で扱う
// 処理前後で引数のステータスを変えたくない

// リストのソート
// hogeが数字
function sort(array) {
  return array.concat().sort(function(x,y) { return x.hoge - y.hoge; });
}

// リストのソート
// hogeが文字
function sort(array) {
  return array.concat().sort(function(x,y) { return x.hoge.localeCompare(y.hoge); });
}

// リストの検索
// 例：未払いがあるかをチェック
function contains(array) {
  return array.map(function (e) { return e["status"]; }).indexOf("unpaid") >= 0;
}

// フィルター
// 例は100円以上のものを抽出
function filter(array) {
  return array.filter(function(x) { return x.cost > 100;});
}

// 繰り返し処理
// 例えば消費税計算(tax = 0.08)
function loopexec(array, tax) {
  return array.concat().forEach(function(x) { x.price = x.cost * (1 + tax);});
}

// 要素同士の計算
// 例えば総額の計算
function total(array) {
  return array.reduce(function(x,y) { return x.price + y.price;} );
}

```
大概のことが１行でできるのですっきりする。

prototypeとうまく調合すれば普通のオブジェクトみたいにもなりそうだけど、今回の目的ではないので割愛

いまときのブラウザーだと大概は支援しているはず。

chromeでは問題なく動作しました。