OmniAICreator/Qiita-1.07M huggingface dataset:
iOSアプリデベロッパーがAndroidアプリ開発に挑戦して疲れたら読むページ

Eclipse(ADT)と仲良くするとAndroidアプリ開発のストレスが減る。

Eclipseはアプリ開発専用のツールではなく汎用性の高いIDEだ。
アプリ開発に役立つ機能を所謂Eclipseマニュアル的な書籍やウェブページから探し出すのはなかなか大変なので、Xcodeに慣れたユーザが欲しそうな情報だけをまとめておく。

# まず最初に覚えておくべきショートカットキー

Xcodeとキーが異なるもので、かつ(多分)便利なもの4つ。

| 内容 | Key (Eclipse) | 参考: Xcode | 備考 |
|:----|:--------------|:-----------|:-----|
| すばやく開く | Cmd + Shift + R | Cmd + Shift + O | 開く時のタブの挙動はXcodeと異なる |
| すべてのファイルを閉じる | Cmd + Shift + W | (Cmd + Opt + W) | - |
| オーガナイズインポート | Cmd + Shift + O | - | 必要なimport文を自動で追加するやつ |
| 自動インデント | Cmd + Shift + F | - | - |

# Xcodeにあわせる

Xcodeはアプリ開発用に最適化されているのでデフォルトの状態でも快適に使えるが、Eclipseの場合はカスタマイズしてなんぼ。

## ショートカットキーを追加する

新しいキーバインドはEclipseの設定画面から登録できる。

![スクリーンショット 2014-01-05 9.31.38 PM.png](https://qiita-image-store.s3.amazonaws.com/0/14097/9903eb63-896c-a4fc-15b2-6ab379c8fb87.png)

XcodeにはあるがADTにはないキーバインドは随時ここから登録していく。

例えば、Runに`Cmd` + `R`をバインドしておくと、Xcode同様すぐにビルド・実行できて便利。

## ショートカットキーを変更する

よく使うキーバインドなのにXcodeとEclipseで意味が異なるものがある。

| キー | Xcode | Eclipse |
|:----|:------|:--------|
| Cmd + Shift + F | 検索(プロジェクト全体から) | 自動インデント |
| Cmd + Shift + O | すばやく開く | オーガナイズインポート |

XcodeとEclipseをいったりきたりしていると、結構混乱してストレスになるのでキーバインドを変更して統一しておくとストレスが減る。
ただし、他の機能・ショートカットとあわせたときに統一感がなくなるという問題も。

## 自動補完のタイミング

XcodeとEclipseではコードの自動補完が発動するタイミングが異なる。

http://onozaty.hatenablog.com/entry/20130407/p1

コンテンツアシストの設定で、自動補完を発動させるトリガーを変更するとあらゆる文字を入力したタイミングで発動可能になる。
入力したい単語が候補になかった時の挙動がXcodeとEclipseで違ってイライラするのだが、どうやらこれはどうしようもないっぽい。

# Xcodeにはないが、Eclipseにある便利な機能
## LogCatのフィルター
LogCat上のログは、アプリ/システムからの大量のログですぐに流れてしまいそのままでは視認性が良くないが、フィルターを活用すると便利。

![スクリーンショット 2014-01-05 11.17.23 PM.png](https://qiita-image-store.s3.amazonaws.com/0/14097/3b2d15a8-a7bd-b5aa-fa56-be69bc54e920.png)

フィルターは一度きりではなく複数登録しておいて切り替えることができるので、その時にデバッグしたい内容にあわせて、バイナリ側をいじらずに監視対象をコントロールできてとても便利。

![スクリーンショット 2014-01-05 11.19.31 PM.png](https://qiita-image-store.s3.amazonaws.com/0/14097/d402329b-f1e5-5c5d-6994-944672fd411f.png)

# なんだかおかしくなったら試すべきこと

ADTを使っていて不具合に遭遇することは珍しくない。SDK, ADTともにアップデートが結構な頻度であることで、相性の問題が発生することも多々。

そういうときは、とりあえずADT, SDKのバージョンを最新にあげてみること。なんと一度のアップデートだとうまくアップデート・反省されないこともたまにあるので、2回くらい試してみること。

デバイスの認識がおかしいときは、ケーブルを疑ってみること。たかがケーブルだが、ケーブルを変えたら安定することも多々。

# その他

* Javaでは必然的にGetter / Setterのコードを書かなければいけない場面が多くなるので、Sourceメニューの`Generate Getters and Setters...`は活用するべき。XcodeにもGetter / Setter生成機能は存在するが、最近のObjective-Cでは多分重宝する場面が少ないので使ったことがない人も多そう。
* AndroidエミュレータはどうやってもiOSシミュレータほど快適にはならない。実機転送が容易なので、基本的にAndroidアプリ開発では実機を使うべき。
*
「ブログで色々公開したら、恥をかいたけどすごく勉強になった。」の添削

http://programming-10000.hatenadiary.jp/entry/20140105/1388920615
の添削です。
JS のみ記載、未実行なので、何かしらバグがあるかも？

```js
$(function() {
    var timerId = 0;
    // jQuery オブジェクト生成はコストが高いので極力減らす。繰り返し使うときは変数に保持。
    // $ で始まる変数名は jQuery オブジェクトっていう命名ルールは単に好みの問題。
    var $input = $('#input');    
    var $result = $('#result');
    // 今どきの jQuery なら on を使いたい。
    var $stopBtn = $('#stopBtn').on('click', function() {
        clearTimeout(timerId);
        // 連打対策の解除。
        $startBtn.prop('disabled', false);
    });
    var $startBtn = $('#startBtn').on('click', function() {
        // 1000 ミリ秒待ち中に連打された時の対策
        // $stopBtn.trigger('click');
        // こっちの連打対策の方がカッコイイかも。prop と attr の違いに注意。
        $startBtn.prop('disabled', true);
        $.post('/ajax', {
            'input': $input.val()
        }, function(res) {
            $result.append(
                'SESSION ID:' + res.session + ' ||| ' +
                'MY NAME:' + res.name + '<br />'
            );
            timerId = setTimeout(function(){
                // 1000 ミリ秒後にまたスタートボタンをクリックする。
                $startBtn.trigger('click');
            }, 1000);
        });
    // 初回に trigger する事で、ページロード完了時に1回スタートボタンをクリックしたのと同等。
    }).trigger('click');
});
```
今年の素数な日

今年の日付の内、8ケタ表示にしたものが素数になる日付を求める。

```rb
require 'prime'
require 'date'
days = Array(Date.new(2014, 1, 1) .. Date.new(2014, 12, 31))
days.select { |d| Prime.prime? d.strftime('%Y%m%d').to_i }.map { |d| d.strftime('%Y/%m/%d') }
```

素敵な日

```rb
# => ["2014/02/01", "2014/02/13", "2014/03/01", "2014/03/03", "2014/03/27", "2014/03/31", "2014/04/11", "2014/04/23", "2014/04/29", "2014/06/09", "2014/06/13", "2014/06/19", "2014/08/07", "2014/08/23", "2014/08/29", "2014/08/31", "2014/09/07", "2014/09/09", "2014/09/27", "2014/10/03", "2014/10/21", "2014/11/01", "2014/11/11", "2014/12/01", "2014/12/03", "2014/12/07", "2014/12/21"]
```
Android入れてるソフト


// ------ ブラウザ
ドルフィン
OperaClassic

// ------ SNS
twicca
LINE
ハングアウト

// ------ メール
Gmail
K9Mail

// ------ 電話
デフォルト電話
SMARTalk

// ------ ユーティリティ
1Password
Quickpic
端末仕様確認ツール
AnySend
GTasks
JuiceDefender



// ------ 電話 初期設定
デフォルト電話アプリ → [ 設定 ] →
[ 通話設定 ] → [ アカウント ] → [ アカウントを追加 ]

アイパス、サーバ名にSMARTalkのアカウント情報を入力

アドレス帳がGoogleアカウントに紐付いていると、
バックアップせずともアカウント同期でアドレス帳が同期されるので便利。


// ----------------- 参考URL
・ vCard形式のデータをGoogle連絡先にインポート
https://support.google.com/mail/answer/183711?hl=ja
JavaScript 視覚化ライブラリ


## グラフ

- sigma.js http://sigmajs.org/examples.html
> an open-source lightweight JavaScript library to draw graphs, using the HTML canvas element

- arbor.js http://arborjs.org/
> a graph visualization library using web workers and jQuery


## マインドマップ

- mindmup https://github.com/mindmup/mapjs
  デモ http://www.mindmup.com/
  
- js-mindmap http://kenneth.kufluk.com/google/js-mindmap/
  デモ http://jsdo.it/semanticmap/k0mV


## 高機能 / フレームワーク

- d3 https://github.com/mbostock/d3/wiki/Gallery
  DOM操作するだけのもの。データ指向で視覚化支援。デモ豊富。

- raphael http://raphaeljs.com/
  SVGを楽に描画

- infovis http://philogb.github.io/jit/demos.html
  視覚化用のウィジェットが色々 by SenchaLabs

- processingjs http://processingjs.org/exhibition/
  独自のプログラミング言語でcanvasを操作


## チャート

- Highcharts JS http://www.highcharts.com/

- Chart.js http://www.chartjs.org/
  HTML5ベース。綺麗

- Google Charts https://developers.google.com/chart/?hl=ja
  Google Driveで作成できるアレ

- Radian http://openbrainsrc.github.io/Radian/gallery/
  AngularJSベース。HTMLタグをカスタマイズするだけで良い

## フォルダ

http://nob-log.info/2012/01/12/javascript/
Play! frameworkを素でインストールせずにsbtから使う

Play! frameworkを空の状態から一つずつファイル・設定を追加していってPlayを動かしてみます。Play! frameworkをインストールしていなくても良いですが、sbtはインストールする必要があります。

## 一番シンプルなPlay

project/plugins.sbtとbuild.sbtを設定する必要があります。

```sh
$ mkdir project
$ vi project/plugins.sbt
```

```scala
// Use the Play sbt plugin for Play projects
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.1")
```

```sh
$ vi build.sbt
```

```scala
play.Project.playScalaSettings
``` 

これらを二つの.sbtファイルを設定することで、Play!が依存するライブラリを含めてローディングができるようになり、playの環境を実行できるようになります。

```sh
$ sbt play
```

これを実行すると、いつものPlayのプロンプトが出てくるはずです。

注意: sbtとplayのバージョンの組み合わせには動くモノと動かないモノがあるはずです

## ルーティング

さて、この状態でsbt play runすると、localhostの9000番ポートでPlayアプリケーションが待ち受けるのですが、アクセスしてみると、No router defined.と表示されてしまいます。ルーティング設定がされてないためです。

```sh
$ mkdir conf
$ vi conf/routes
```

```
GET   /   controllers.Application.index
```

Play の標準的なルーティング設定ですね。これを実行すると今度はobject Application is not a member of package controllersと怒られるようになるので、controllersパッケージにApplicationオブジェクトを作成してindexメソッドを用意します。

```sh
$ vi hello.scala
```

```scala
package controllers

import play.api._
import play.api.mvc._

object Application extends Controller {
  def index = Action {
    Ok("Hello, World.")
  }
}
```

これで、無事Hello, World.がブラウザに表示されたはずです。

## まとめ

いつもはplay new <application>コマンドを使ってPlayアプリケーションを書き始めていたんですが、たったこれだけでPlayアプリが書けるとわかったので、たとえば非Playアプリケーションとして作り始めていたものを、やっぱりPlayで作り直すかと思った時(ライブラリ機能とかも考えるとそうそうないとは思うが…)にも、Play の設定を追加するのは簡単！かもしれません。
RMySqlでclose出来ない接続を解除する

適当な覚え書き。
RMySQLを利用していて以下のエラーに遭遇しました。

```r
mysqlNewConnection(drv, ...) : 
  RS-DBI driver: (cannot allocate a new connection -- maximum of 16 connections already opened)
```

接続が解除されていないみたいだったので

```r
cons <- dbListConnections(MySQL())
for(con in cons){
  dbDisconnect(con)
}
```

としたのですが

```r
unable to find an inherited method for function 'dbDisconnect' for
## signature '"MySQLConnection"'
```

となってしまったので

```r
cons <- dbListConnections(MySQL())
for(con in cons){
  mysqlCloseConnection(con)
}
```

で回避しました。
Java プログラムを Maven から実行する方法


`exec-maven-plugin` を使えば、
指定した Java プログラムを Maven から実行することができる。

# `exec-maven-plugin`の使用例

pom.xml に以下を追記する。

```
<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <configuration>
                <mainClass>com.example.Main</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>
```

`<mainClass>` には、実行したいクラスを指定する。


指定したクラスを実行するには、以下のコマンドを実行する。

    mvn exec:java

# リファレンス

 * [Exec Maven Plugin - Introduction](http://mojo.codehaus.org/exec-maven-plugin/)

 * [7. Maven Tips | TECHSCORE(テックスコア)](http://www.techscore.com/tech/Java/ApacheJakarta/Maven/7-2/#maven-6-14)

 * [java - How to run a maven created jar file using just the command line - Stack Overflow](http://stackoverflow.com/questions/15869784/how-to-run-a-maven-created-jar-file-using-just-the-command-line)
New Year's Greeting, Lispy style

![2014-public.png](https://qiita-image-store.s3.amazonaws.com/0/6090/4dcc9de9-1b63-a020-96c8-8ccd61c8569d.png)


* いま見直してみると、 on earth は文法的に間違い (what on earth = what the hell の綺麗なバージョン)
  * 多分 on Earth ならいける
* UMAは和製英語らしいというのは知っていた
  * でもそれだとダジャレにならないのでそのまま採用した (どうせ日本人にしか送らない)
Unity(C#)でイベントを利用する


まだUnityっぽいプログラムの書き方が把握できていないので、もしかしたらUnityではそうやらないよ！ってことかもしれませんが、Unity + C#でイベントを扱って色々制御してみたので、その備忘録を書いておきたいと思います。

今回の例では、内包しているパーティクルがすべて終了したときをハンドリングしたかったのでそれの処理を書いています。

以下はパーティクルをいくつか内包しているGameObjectにアタッチされているスクリプト例です。

```c#
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class SomeClass : MonoBehaviour {

	//まずはデリゲートを宣言
	public delegate void EndHandler();

	//上記のデリゲート型のeventをpublicで宣言。
	//以後、これにイベントハンドラを登録していく
	public event EndHandler endHandler;

	//内包しているパーティクルを保持するList
	private List<ParticleSystem> particleSystems = new List<ParticleSystem>();

	void Start () {
		foreach (Transform child in transform)
		{
			particleSystems.Add(child.GetComponent<ParticleSystem>());
		}
	}
	
	void Update () {
		int endCount = 0;

		foreach (ParticleSystem particle in particleSystems)
		{
			if (!particle.IsAlive())
			{
				endCount++;
			}
		}

		if (endCount == particleSystems.Count)
		{
			endHandler();
		}
	}
}
```


以下は上記スクリプトがアタッチされたオブジェクトの生成と、イベントハンドラの登録例。

```c#
void CreateObject(int level = 1) {
	//Inspectorから登録されたいくつかのオブジェクトから指定のPrefabをインスタンス化
	GameObject obj = Instantiate(m_Objects[level - 1]) as GameObject;

	//親子関係を作る
	obj.transform.parent = transform;

	//生成したオブジェクトにアタッチされた`SomeClass`スクリプトを取得
	SomeClass s = obj.GetComponent<SomeClass>();

	//スクリプトの`endHandler`プロパティにイベントハンドラを登録
	s.endHandler += () => Destroy(gameObject);
}
```

なんかもっとスマートな方法ある気がしてならないけど、とりあえずこれで意図したことが実装できました。
ViewHolderパターン自動生成のメモ

http://www.slideshare.net/bs_yagi/potato01-no-more-viewholder

* [Android CodeGenerator plugin](http://plugins.jetbrains.com/plugin/7284?pr=idea) をインストールする
* レイアウトID (`R.layout.xxx`) にカーソルを合わせて `generate` すると、ViewHolder classを生成する

楽だけどソースみないとやり方がわからなかった。
【jQuery】動的に生成された要素にイベントを設定する


$(イベントを設定する要素の範囲).on('イベント','イベントを設定する要素',イベント時の処理);

```js
// li.imageにhoverイベントを設定する。イベントの処理内容はfunction(){}。
$(document).on('hover', 'li.image', function(){});
```
TikZで角丸四角形で囲んだノードを書く

TikZでnodeを使うときに四角形で囲むときは `rectangle` オプション(という表現かは知らないが)、
丸で囲むときは `circle` オプションを使う。

角丸四角形で囲みたいときはどうすればいいのかと検索していたら見つかったのでメモしておく。

http://tex.stackexchange.com/questions/28115/rounded-corners-only-at-one-side-of-a-tikz-node

サンプルコード:

```latex
\documentclass[a4j]{jsarticle}
\usepackage[dvipdfmx]{graphicx}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node[draw,rectangle,rounded corners=3pt] {Foo};
\end{tikzpicture}
\end{document}
```
Chefでソースアーカイブ取得→展開→ビルド→インストールするならark cookbookを使わない手はない


> yumとかに無いので、どっかのネット上からソースのアーカイブを落としてきて、tmpで展開して、makeしてinstallする

結構よくある操作だと思いますが、
公開されているレシピを見ていると結構自前で書いていることをよく見かけます。

そういう操作をする時はopscode cookbookのarkを使うといいですおという話です。

# chef-ark

[chef-ark](https://github.com/opscode-cookbooks/ark)はアーカイブされたリソースの管理を行うopscode製のcookbookで、

* リソースの取得
* 展開(アーカイブの解凍)
* ビルド(make)
* インストール(make installとかsymbolic link作ったりとか ownerやgroupを設定したりとか)

などの一連の流れを実施してくれます。
もちろん展開時はzipやらtar.gzからは全く気にすることなく、展開を実施してくれますし、makeなども不要であれば実施しません。

# 環境

* Chef 11以上

# 試してみる

今回は`ark`を利用して、glassfishを入れてみたいと思います。

## ark cookbookの準備

Berkshelfで準備します

```rb:Berksfile
site :opscode

cookbook 'java', git: "https://github.com/socrata-cookbooks/java.git" #こっちはglassfish用

cookbook 'ark'
```


install

```bash
# berks install
```

## recipeの例

めんどくさいのでattributeとかに切り出してないですが、
パスワードとかはちゃんとやったほうがいいですね。

```rb:default.rb
#
# Cookbook Name:: glassfish
# Recipe:: default
#
# All rights reserved - Do Not Redistribute
#

include_recipe "java"

group 'glassfish' do
  group_name 'glassfish'
  action :create
end

user 'glassfish' do
   group 'glassfish'
   home '/home/glassfish'
   password "password"
   action :create
end

ark "glassfish" do 
  url "http://download.java.net/glassfish/4.0/release/glassfish-4.0-ml.zip"
  path "/opt"
  owner "glassfish"
  group "glassfish"
  version "4.0"

  action :put 
end
```

`ark`リソースの`action`を`:put`にしています。
通常は`:install`に入れますがすると`glassfish/bin`が`$PATH`に設定されかつ`/usr/local/`下にシンボリックリンクが作成されます。
このあたりは不要だったので`:put`アクションにしています。

あと多分metadata.rbに`depends`の設定が必要です。

```rb:metadata.rb
name             'glassfish'
maintainer       'bfts.co.jp'
maintainer_email 'soundtricker@example.com'
license          'All rights reserved'
description      'Installs/Configures glassfish'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.0'
depends "java"
depends "ark"
```

## あとは起動

普通に起動してください。いい感じで

* `http://download.java.net/glassfish/4.0/release/glassfish-4.0-ml.zip`からglassfish-4.0-ml.zipを取得
* chefのcacheディレクトリ(`Chef::Config[:file_cache_path]`)に展開
* /opt配下へコピー
* owner、groupの設定

あたりをしてくれます。
もちろん設定でパーミッション設定や、`$PATH`への追加などなどインストールに必要なことはだいたいやってくれます。

# まとめ

ark cookbookはかなり利用しやすいresourceを持っているのでぜひ使ってみてはいかがでしょうか?
RailsとjQueryでインクリメンタルサーチ


Ruby（Rails3）とjQueryでインクリメンタルサーチの処理を書いてみたのでまとめました。

##元記事
下記エントリの転載になります。
[RailsとjQueryで、簡単インクリメンタルサーチ - rokuroFire](http://www.rokurofire.info/2014/01/05/rails_jquery_incsearch/)


##本エントリの前提
* インクリサーチは、ポスト（Model:Post）のタイトル（title）を検索
* json形式でデータを受け取り、JSでページを更新

##ルーティング
今回はposts/newページ内で利用するので:postsのcollection内に入れました。

```config/routes.rb
resources :posts do
	collection do
		get 'search', :action => :search
		# posts/search
	end
end

```

##Controller

params[:q]に、クエリのデータが入っています。
Model:Postのtitleから、クエリの文字列を含むものを最大3件取得しています。

```app/controllers/posts_controller.rb
def search
	raise unless params[:q]

	lists = []
	results = Post.where("title like ?", "%#{params[:q]}%").order('count DESC').limit(3)
	results.each do |result|
		lists.push({:title => result.title) if result.title
	end
	render :json => { :lists => lists, :result => "success"}
	return true

	rescue
	render :json => {:result => "error_search" }
end
```

##JavaScript

検索枠にテキストを入力し、500ms経ったあとに1回ajax通信を行います。
onkeypressでイベントを発生させているため、文字入力を行う度にincSearch関数が実行されます。関数内でclearTimeoutを実行することで、関数実行時にタイマーがリセットされるため、関数の実行回数 = 通信の回数にはならないようにしています。

※ DOMの処理は省略
※ 実際は、エンターキーを押した時の分岐やonblurイベントも加えないと、思い通り動かないかも？

```application.js
// ajax処理
function incSearch(){
	// タイマーをストップ
	clearTimeout(incSearch.timeid);

	// setTimeout 500ms
	incSearch.timeid = setTimeout(function(){
		// inputに入力されているテキストを取得
		var query = tgtInput.value;
		if(query.length == 0) return false;

		// ajax処理
		jQuery.ajax({
			type : 'GET',
			url : '/posts/search',
			data : {
				q : query
			},
			timeout : 1500,
			success:function(data){
				if(data.result != "success") return false;
				changeDom(data.lists);
			},
			error:function(){
				// エラー時の処理をここに書く
				return false;
			}
		});

	},500);

};
incSearch.timeid = "";

// DOMの変更
// 引数listsに検索結果が入っている
function changeDom(lists){
	if(lists.length == 0) return false;
	// ここにDOMを書き換える処理を書く
};

// ターゲットとなるinputタグにイベント追加
var tgtInput = document.getElementById('tgtInput');
tgtInput.onkeydown = incSearch;

```
render file: 'file_name', layout: falseをテストする。

イマイチちゃんとしたやり方が見つからなかったので、取り敢えず現状のテスト状態を記述。
ちゃんとした方法が知りたい。

# `render file: 'file_name', layout: false`

Controller部分はこんな感じで

```rb
def show
  @object = Object.find(params[:id])
  render file: 'file_name.html', layout: false
end
```

単純にファイルを表示して、
可能ならspec内に

```rb
# bra bra bra...
  get :show, id: test_object
  expect(response).to render_template(file: "some_file.html", layout: false)
```

と言う感じでテストしたいのだけど、出来ない。

```rb
  1) ObjectsController GET #show renders file
     Failure/Error: expect(response).to render_template(file: "some_file.html", layout: false)
       Expected [] to include "some_file.html".
```

となってしまう。
色々調べるとインスタンス変数`@templates`とか`@layouts`があるらしくそれでテスト出来るっぽいのだが見つからない。なんだか`@_templates`とか`@_layouts`は見つかったのでそれでテストすることに。

```rb
# bra bra bra...
  get: show, id: test_object
  expect(@_layouts).to be_blank
  expect(@_templates.keys.first).to eq('some_file.html')
```

一応ちゃんとテスト出来てるけど、適当に見つけた方法なのでちゃんとした方法がありそうで知りたい。

## 参考
[ruby on rails - Rspec test to render no layout - Stack Overflow](http://stackoverflow.com/questions/16592551/rspec-test-to-render-no-layout)
minidlna-1.1.0 のコンパイルと起動方法

コンパイルに必要なライブラリは、以下の通り
- libexif
- libjpeg
- libid3tag
- libFLAC
- libvorbis
- libsqlite3
- libavformat (the ffmpeg libraries)

あと、
debian/Ubuntu apt-get install gettext 

/usr/local/etc/minidlna.conf をコピーして

% sudo minidlna -f /usr/local/etc/minidlna.conf
で起動。
KwikでSpriteSheetを使ったアニメーションを作成する

# KwikでSpriteSheetを使ったアニメーションを作成する

アニメーションさせたいイメージファイルを用意します

![images.png](https://qiita-image-store.s3.amazonaws.com/0/9044/b0c617b0-f8f5-ccca-c1ca-f38762b85495.png)

 **[Texure Packer](http://www.codeandweb.com/texturepacker "Texure Packer")** でKwik用の.lua/.pngファイルを生成します

![2014_01_05_15_10_1.png](https://qiita-image-store.s3.amazonaws.com/0/9044/4d8bc913-e5e2-927b-c341-c268638cd9f7.png)

Kwikの **プロジェクトフォルダ直下** にTexure Packerで生成した.lua/.pngファイルを格納します

![2014_01_05_15_18_1.png](https://qiita-image-store.s3.amazonaws.com/0/9044/eab6888f-d2a2-ce6f-703f-d5eb57a2344f.png)

PhotoshopでKwikプロジェクトを開き、イメージファイルと同じサイズのシェイプを作成し、TOOL SETからSprite sheet replacementを選択します

![page1_psd___50___Rectangle_1__RGB_8___.png](https://qiita-image-store.s3.amazonaws.com/0/9044/05c7aa83-a506-fbf4-76cf-d8bd1cd4ff08.png)

Texure Packerで生成した.lua/.pngファイルの格納場所をそれぞれ指定し、その他の情報も入力します

![2014_01_05_15_41.png](https://qiita-image-store.s3.amazonaws.com/0/9044/c2ae7e8b-e845-a3eb-54aa-07ae9d72e761.png)

### 完成！

![2014_01_05_15_50.png](https://qiita-image-store.s3.amazonaws.com/0/9044/04735d7a-4163-2603-fa94-8f60466a8248.png)


 **[GitHub](https://github.com/0309/Kwik_SpritesheetTest "GitHub")**
「Cは超高級アセンブラ？」の「未定義動作」に対する逃げ道の探索

#概要
[Cは超高級アセンブラ？ - Qiita [キータ]](http://qiita.com/kazh98/items/71a868c1fc33de68a7d6)

yohhoyさんのコメント
> ここで挙げられているプログラムは、いわゆる「未定義動作」となります。
>http://www.jpcert.or.jp/sc-rules/c-exp05-c.html
>
>環境（コンパイラやOS等）によっては出力結果が20になったり18になったり、はたまた実行時クラッシュを引き起こしたりしますが、いずれもこのプログラムとしては「あり得る」実行結果です。

とあったので、逃げ道がないか探しました。

結論は、構造体の実体そのものにはconstをつけず、メンバにconstつければ逃げられるようです

#探索
[EXP05-C. const 修飾をキャストではずさない](http://www.jpcert.or.jp/sc-rules/c-exp05-c.html)
には、以下のように記述されています。

> 変数の型にたいするconst修飾をキャストしてはずさないこと。const 修飾をキャストしてはずすと、プログラムが定数値を変更できることになり、未定義の動作につながるおそれがある。

> C99 の脚注には以下のように記載されている。
 *処理系は、volatileでないconstオブジェクトを、読み取り専用記憶域に置いてもよい。さらに、処理系はそのアドレスが使われないならば、そのようなオブジェクトに記憶域を割り付けなくてもよい。*
(略)
> ##自動検出
 - LDRA tool suite V 7.6.0 はこのレコメンデーションの違反を検出できる。
 - GCC は -Wcast-qual フラグを使用することでこのレコメンデーションの違反を検出できる
 - Compass/ROSE はこのレコメンデーションの違反を検出できる。

(参考)
[JIS X 3010:2003 プログラム言語Ｃ](http://kikakurui.com/x3/X3010-2003-01.html)

要は・・・

- 読み取り専用記憶域に置かれない
- GCC の -Wcast-qual フラグを使用して検出されない

であれば、OKであろうと考えた。

#テスト方法
- 対象の変数(st_dest)が読み取り専用記憶域に置かれていないことをprintfによるアドレス
出力とobjdumpにより確認する。
- GCC の-Wcast-qual フラグを使用して検出されない

objdumpの確認結果は、適当になってしまうところがあったので、省略(たぶんOK)。

#逃げ道

```c:test.c
#include <stdio.h>
#include <stdlib.h>
/* add - start */
#include <string.h>

#define PRINT_VALUE(a) printf(#a" = %d\n", a);

struct {
  const int age;
} st_src = {20}, st_dest = {18};
/* add - end */

int
main (
  int   argc,
  char *argv[ ]
  )
{
  const int age = 18;

  printf ( "%d\n", age );
  *( ( int* )( &age ) ) = 20; /* -Wcast-qualにより、ここは検出可能 */
  printf ( "%d\n", age );

  /* add - start */
  PRINT_VALUE(st_dest.age);
  
  /* 
     st_dest.age = 20; という代入は、 
      エラー: 読み取り専用メンバ 'age' への代入です
     となる。(constの期待動作をする。)
   */
  /* -Wcast-qualでも↓は、検出されない・・・ st_src と st_dest自体は「constオブジェクト」ではないので、読み取り専用領域におかれない。 */
  memcpy(&st_dest, &st_src, sizeof(st_dest));

  PRINT_VALUE(st_dest.age);
  /* add - end */
  return ( EXIT_SUCCESS );
}
/*
  MinGW + gcc- 4.7.2でコンパイル
   $ gcc -pedantic -Wall -Wcast-qual test.c
   test.c: 関数 'main' 内:
   test.c:22:6: 警告: cast discards '__attribute__((const))' qualifier from pointer target type [-Wcast-qual]

  実行結果
   $ ./a.exe
   18
   20
   st_dest.age = 18
   st_dest.age = 20
*/
```
python の map オブジェクトを list にした後は何も残らない

map/zip/filter オブジェクトに対して、list を２回やると空っぽになります。

```py3:list_twice
>>> xs = [1, 2, 3]
>>> mapped = map(lambda x:x+1, xs)
>>> list(mapped)
[2, 3, 4]
>>> list(mapped)
[]
```

最初何が起こったのかわからずバグじゃないかとか、破壊的メソッドか！？などと思ったりしたわけですが、仕様らしいです。http://stackoverflow.com/questions/19759247/listing-a-filter-object-twice-will-return-a-blank-list

## なので適当に書いてはいけない

もともとは以下のように dict を作ったところでハマりました。

```py3:bad_code
xs = map(func, my_list)
ys = dict(zip([x.key for x in xs], xs))
```

今読み返すと悲しいコードですが・・・ list() を使わなくても内包表記だろうがなんだろうが iterate すると消えてしまうので、この場合 zip の２番めの xs は空っぽになってしまったのでした。なので、map した場合は注意するように頑張ることにしました。

ちなみに上のコードは、以下のようにして解決しました。

```py3:bad_code
xs = map(func, my_list)
ys = {x.key:x for x in xs}
```

おかげで Python3 では、内包表記が dict と set に対応してるというのを学びました。
XML をパースする(C++/CX, C#版)

[XML をパースする](http://qiita.com/episteme/items/2f7e4857a6867e00a8fb) のC++/CX版。
Windows::Data::Xml::Dom 名前空間にある XmlDocument を利用する。
DOMパーサであるので、XMLの木構造がXmlDocumentに構築される。
その中から特定のtagを持つElementを取得し、アトリビュートを抽出する。

```cpp
#include <locale>
#include <iostream>
#include <string>

using namespace Platform;
using namespace Windows::Data::Xml::Dom;

template<typename Function>
void collect(XmlDocument^ doc, String^ tag, String^ attr, Function func) {
    // 指定したtag名を持つElementを探す
    XmlNodeList^ nodes = doc->GetElementsByTagName(tag);
    if ( nodes == nullptr ) return;
    for ( unsigned int i = 0; i < nodes->Size; ++i ) {
        XmlElement^ elm = safe_cast<XmlElement^>(nodes->GetAt(i));
        // アトリビュートを手に入れる
        String^ value = elm->GetAttribute(attr);
        if ( value != nullptr ) func(std::wstring(value->Begin(), value->End()));
    }
}

using namespace std;

int main(Array<String^>^) {
    String^ xhtml =
       L"<?xml version='1.0' ?>" 
       L"<html><body>"
       L"  <a href=\"http://qiita.com/episteme\">επιστημη(1)</a>"
       L"  <a href=\"http://blogs.wankuma.com/episteme\">επιστημη(2)</a>"
       L"  <img src=\"https://pbs.twimg.com/profile_images/54608127/epi_normal.jpg\"/>"
       L"</body></html>";

    XmlDocument^ doc = ref new XmlDocument();
    doc->LoadXml(xhtml);

    wcout.imbue(locale("japanese"));
    collect(doc, L"a",   L"href", [](const wstring& value) { wcout << value << endl;});
    collect(doc, L"img", L"src",  [](const wstring& value) { wcout << value << endl;});

}
```

同様にC#だと:

```csharp
using System;
using System.Xml;

class Program {
    static void collect(XmlDocument doc, string tag, string attr, Action<String> func) {
        XmlNodeList nodes = doc.GetElementsByTagName(tag);
        if ( nodes == null ) return;
        for ( int i = 0; i < nodes.Count; ++i ) {
            XmlElement elm = nodes[i] as XmlElement;
            string value = elm.GetAttribute(attr);
            if ( value != null ) func(value);
        }
    }

    static void Main(string[] args) {
        string xhtml =
          "<?xml version='1.0' ?>" 
        + "<html><body>"
        + "  <a href=\"http://qiita.com/episteme\">επιστημη(1)</a>"
        + "  <a href=\"http://blogs.wankuma.com/episteme\">επιστημη(2)</a>"
        + "  <img src=\"https://pbs.twimg.com/profile_images/54608127/epi_normal.jpg\"/>"
        + "</body></html>";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xhtml);

        collect(doc, "a",   "href", (val) => Console.WriteLine(val));
        collect(doc, "img", "src" , (val) => Console.WriteLine(val));
    }
}
```
Railes4.0.2をインストールしてしまったあとにRails3.2.16に変更する方法（メモ）


>###### #記述：2014/01/05

#Railsのバージョンを指定せずに最新バージョンをインストールしてしまい、削除してから再インストールするときのメモ

```bash:バージョンを指定せずにインストールしてしまい
gem install rails --no-rdoc --no-ri
```

rails -v としたところ
Rails 4.0.2
と表示され間違えたことに気づく

```bash:一旦削除する
gem uninstall rails
```



```bash:バージョンを指定して再インストールする
gem install rails -v '3.2.16' --no-rdoc --no-ri
```

再度 rails -v としたが依然
Rails 4.0.2
と表示された。

gem list でインストールされている一覧を見てみると
・・・
rails (3.2.16)
railties (4.0.2, 3.2.16)
・・・
なんと。


```bash:4.0.2のブートアップも削除する
gem uninstall railties -v '4.0.2'
```

無事。
Rails 3.2.16
と表示されました。
Ubuntu Server 12.04TLSのSoftRAIDの復旧方法

<p><a title="HP ProLiant MicroServer" href="http://click.linksynergy.com/fs-bin/click?id=io05cscacMI&amp;subid=&amp;offerid=252926.1&amp;type=10&amp;tmpid=9776&amp;RD_PARM1=http%253A%252F%252Fh50146.www5.hp.com%252Fproducts%252Fservers%252Fproliant%252Fdirectplus%252Fmicroserver%252Foption.html"><img style="margin: 0px 0px 0px 10px; display: inline; float: right" border="0" alt="HP ProLiant MicroServer" align="right" src="http://farm8.static.flickr.com/7419/8727281800_c6e0193929.jpg" width="250" height="316"></a></p> <p>うちのホームNASは、<a href="http://click.linksynergy.com/fs-bin/click?id=io05cscacMI&amp;subid=&amp;offerid=252926.1&amp;type=10&amp;tmpid=9776&amp;RD_PARM1=http%253A%252F%252Fh50146.www5.hp.com%252Fproducts%252Fservers%252Fproliant%252Fdirectplus%252Fmicroserver%252Foption.html">HP ProLiant MicroServer</a> なんですが、その中の1HDDが壊れたようだ。そこで、Ubuntu Server 12.04TLSでのSoftRAID5の復旧方法をメモしておきます。</p><p>リブートしたタイミングで壊れたらしく、正しく起動しない。リモートアクセスカードキットを使って、grubにパラメータを追加する。grubの画面で e ボタンを押し、kernelラインに</p><pre>bootdegraded=true</pre>
<p>を追加して「F10」起動させる。すると、RAIDが壊れた状態で起動できるので、壊れたHDDを/dev/md0 から切り離します。</p><pre>mdadm --remove /dev/md0 /dev/sd**</pre>
<p><a href="http://click.linksynergy.com/fs-bin/click?id=io05cscacMI&amp;subid=&amp;offerid=252926.1&amp;type=10&amp;tmpid=9776&amp;RD_PARM1=http%253A%252F%252Fh50146.www5.hp.com%252Fproducts%252Fservers%252Fproliant%252Fdirectplus%252Fmicroserver%252Foption.html">HP ProLiant MicroServer</a> は、ホットプラグインに対応していないので、電源を落とします。shutdown –h now で良いと思います。</p>
<p>次に、壊れたHDDを新しいHDDに入れ替えます。今回は、<a href="http://www.amazon.co.jp/gp/product/B008P56QTG/ref=as_li_ss_tl?ie=UTF8&amp;camp=247&amp;creative=7399&amp;creativeASIN=B008P56QTG&amp;linkCode=as2&amp;tag=makotstoybox-22">WD Red 3.5inch IntelliPower 2.0TB 64MBキャッシュ SATA3.0 WD20EFRX</a><img style="border-bottom-style: none !important; margin: 0px; border-left-style: none !important; border-top-style: none !important; border-right-style: none !important" border="0" alt="" src="http://www.assoc-amazon.jp/e/ir?t=makotstoybox-22&amp;l=as2&amp;o=9&amp;a=B008P56QTG" width="1" height="1"> にしてみました。</p>
<p>HDDを入れ替えたら、起動させるんですが、bootdegraded=true が必要です。</p><pre><p>mdadm --add /dev/md0 /dev/sd**</p></pre>
<pre>mdadm --assemble --scan</pre>

<p>復旧状況は、以下のコマンドで確認出来ます。</p>
<pre>cat /proc/mdstat</pre>
PHP Ninjaを超えるWordpress高速化方法!

<p><a title="php-ninja" href="http://www.flickr.com/photos/15258827@N03/9308371716/"><img border="0" alt="php-ninja" src="http://farm3.static.flickr.com/2855/9308371716_153ee36484.jpg"></a></p> <p><a href="http://php-ninja.com/">PHP Ninja - WordPress 高速化チューニング、Nginx、Z Cloud の組合せによるハイパフォーマンス WordPress専用クラウドサービス「PHP Ninja」。ファーストサーバ提供。</a> で、有名な<a href="http://php-ninja.com/">PHP Ninja</a>は「WordPress」を高速で動かすことができるPaaSサービスを超える高速性をPHP Ninjaより安く手に入れる方法を記述します。</p><p>まず、さくらのVPS2G SSDの契約が必要です。<a href="http://px.a8.net/svt/ejp?a8mat=1U7TPL+EGYB3M+D8Y+C4TB5" target="_blank"> <img style="float: right; margin: 0px 0px 0px 10px; display: inline" border="0" alt="" align="right" src="http://www24.a8.net/svt/bgt?aid=111219753875&amp;wid=001&amp;eno=01&amp;mid=s00000001717002038000&amp;mc=1" width="125" height="125"></a> <img border="0" alt="" src="http://www15.a8.net/0.gif?a8mat=1U7TPL+EGYB3M+D8Y+C4TB5" width="1" height="1"></p> <p>これだけで、Wordpressは相当速くなります。Apache + mod_php でね。<br>ただ、これだけではダメです。次に、<a href="http://memcached.org/">memcache</a> です。<a href="http://pecl.php.net/package/memcache">PHP-memcache</a>(php-memcached)をインストールして下さい。そして、<a href="http://pecl.php.net/package/apc">APC</a>も必須です。</p> <p>最後に、<a href="https://wordpress.org/plugins/w3-total-cache/">W3 Total Cache</a>(W3TC)です。お勧めの設定は以下の通りです。</p> <p>memcache は、512MB位で十分でしょう。W3TCは、</p> <ol> <li>Page cache は、Memcached へ</li> <li>Minify は、設定しない</li> <li>Database Cache は、設定しない</li> <li>Object Cache は、Memcached へ</li> <li>Browser Cache は、Enable へ</li></ol> <p>あと、忘れずに W3TC が推奨する .htaccess を設定して下さい。あと、お勧めなプラグインを列挙しておきます。</p> <ol> <li><a href="https://wordpress.org/plugins/mo-cache/">WordPress › MO Cache « WordPress Plugins</a></li> <li><a href="http://stocker.jp/diary/wp-hyper-response/">WP Hyper Response</a></li> <li><a href="https://wordpress.org/plugins/jetpack/">WordPress › Jetpack by WordPress.com « WordPress Plugins</a></li></ol> <p>これを読んでも、よく判らない方は <a href="http://smilelogic.jp/contact">お問い合わせ – スマイルロジック</a> まで。</p>
無料のSSL証明書が利用できるらしいので、取ってみた!

<p> <p><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4274065421/makotstoybox-22/ref=nosim" target="_blank"><img style="float: left; margin: 0px 10px 10px; display: inline" alt="マスタリングTCP/IP SSL/TLS編" align="left" src="http://ecx.images-amazon.com/images/I/4165T404E2L._SL160_.jpg">マスタリングTCP/IP SSL/TLS編<br>Eric Rescorla 齋藤 孝道 古森 貞 鬼頭 利之 </a><img style="border-top-style: none !important; border-left-style: none !important; border-bottom-style: none !important; border-right-style: none !important; margin: 0px" border="0" alt="" src="http://www.assoc-amazon.jp/e/ir?t=makotstoybox-22&amp;l=as2&amp;o=9&amp;a=4274065421" width="1" height="1"> </p>その名は、イスラエルのStartComという企業がやっている <a href="https://www.startssl.com/">StartSSL</a> というもの。IE、Firefox、Google Chrome、Safari、Operaの最新版で証明書エラーなく使用できます。IE6でもアップデートが当たっていれば使用できます。  <p>ちょっと、いろいろと面倒なので、簡略的に一気にやり方を書きます。</p><ol> <li><a href="https://www.startssl.com/">StartSSL</a> にブラウザからアクセス  <li>Sign up で、email certificate (S/MIME)を取得します。Phone は+81-3-123-4567 と最初のゼロを抜かした数字を書きます。  <li>次に、Email欄に書いたメールアドレスにパスコードが送られてくるので、遷移した画面にコピペします。  <li>すると、暗号化の強度を選ぶ事ができ、普通に「高強度の暗号化」を選んで、「Continue」を押すと、ブラウザに個人証明書がインストールされます。  <li>次に、ドメインの所有者である事を確認します。  <li>タブの Validations Wizard をクリックします。  <li>Type として Domain Name Validation を選択します。  <li>自分の所有するドメイン名を指定します。この時点では、www をつける必要はありません。  <li>ドメインの正当な所有者であることを確認するためのキーが送られてくるメールアドレスを選択します。こちらで任意のアドレスを指定することはできません。「continue」を押すと、メールにキーが送られてきます。このキーを入力すると、ドメインの所有者であることが確認され、Web サーバ用の証明書などが作成できるようになります。メールは、結構時間が掛かります。  <li>いよいよ Webサーバ用の証明書を作成します。  <li>「Certificates Wizard」のタブを押して、SSL/TLS Web Serber Certificate を選択します。  <li>自分で作成した秘密鍵ファイルが無い場合は、ここで作成することもできます。10文字以上32文字以下のパスフレーズを入力して 「continue」 を押します。パスフレーズにはアルファベットと数字のみが使えます。（自分で作成した秘密鍵ファイルがある場合は、Skip を押して先に進みます。）  <li>このファイルをサーバに保存します。説明文では ssl.key という名前で保存と書かれていますが、ここではSSH/telnet等でログインして /最適なディレクトリ/最適な名前.key に保存します。  <li>サーバのサブドメインを指定します。ここではサブドメインとして www を指定しています。サブドメインを使わないについても証明書には含まれますので、とりあえず www を指定しておきましょう。なお、無料では複数のサブドメインや、ワイルドカード (*.example.org) の指定はできません。  <li>ここで、作成に時間が掛かります。PEM エンコードされた CRT ファイルができます。これが Web サーバの証明書ファイルです。これをSSH/telnet等でログインして /最適なディレクトリ/最適な名前.crt として保存します。保存したら「continue」をクリックします。これで証明書の作成は終了です。  <li>中間ファイルを保存します。SSH/telnet等でログインして、/最適なディレクトリ/で以下のコマンドを入力します。<pre><p>wget https://www.startssl.com/certs/sub.class1.server.ca.pem<br>wget https://www.startssl.com/certs/ca.pem</p></pre>
<li>Apacheの場合は、以下の様に設定します。</li></ol><pre>SSLCertificateFile    /最適なディレクトリ/最適なファイル名.crt
SSLCertificateKeyFile /最適なディレクトリ/最適なファイル名.key
SSLCertificateChainFile /最適なディレクトリ/sub.class1.server.ca.pem
SSLCACertificateFile /最適なディレクトリ/ca.pem</pre>
<p><a href="http://wiki.smilelogic.jp/index.php/%E7%8B%AC%E8%87%AASSL%E3%82%B5%E3%83%BC%E3%83%90%E8%AA%8D%E8%A8%BC%E5%B1%80%28CA%29%E4%BD%9C%E6%88%90%E3%81%A8%E3%82%B5%E3%83%BC%E3%83%90%E8%A8%BC%E6%98%8E%E6%9B%B8%E7%99%BA%E8%A1%8C">Apache+mod_ssl/Apache-SSLの起動時パスフレーズを削除する方法は、wiki を参照下さい。</a></p>
<p>無料で、SSL証明書が取れるなんて、良い時代になりましたな～</p>
PHPでdate関数を使って簡単に、月末を求める方法

<a href="http://www.amazon.co.jp/gp/product/4774144371/ref=as_li_ss_il?ie=UTF8&amp;camp=247&amp;creative=7399&amp;creativeASIN=4774144371&amp;linkCode=as2&amp;tag=makotstoybox-22"><img style="float: left; margin: 0px 10px 0px 0px; display: inline" border="0" align="left" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;ASIN=4774144371&amp;Format=_SL160_&amp;ID=AsinImage&amp;MarketPlace=JP&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=makotstoybox-22"></a><a href="http://www.amazon.co.jp/gp/product/4774144371/ref=as_li_ss_tl?ie=UTF8&amp;camp=247&amp;creative=7399&amp;creativeASIN=4774144371&amp;linkCode=as2&amp;tag=makotstoybox-22">パーフェクトPHP (PERFECT SERIES 3)</a><img style="border-top-style: none !important; border-left-style: none !important; border-bottom-style: none !important; border-right-style: none !important; margin: 0px" border="0" alt="" src="http://ir-jp.amazon-adsystem.com/e/ir?t=makotstoybox-22&amp;l=as2&amp;o=9&amp;a=4774144371" width="1" height="1">  <p>date()関数と、mktime()関数を利用します。結構簡単なので、驚きますよ。</p><p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>1. 今月末</p> <p>現在の月に「+1」します。</p> <p>$day = date('Y-m-d', mktime(0, 0, 0, date('m') + 1, 0, date('Y')));</p> <p>2. 来月末</p> <p>現在の月に「+2」します。</p> <p>$day = date('Y-m-d', mktime(0, 0, 0, date('m') + 2, 0, date('Y')));</p> <p>簡単でしょ!?</p>
MySQLのrootパスワードを忘れたときの対処法

<p><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798124230/makotstoybox-22/ref=nosim" target="_blank"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798124230/makotstoybox-22/ref=nosim" target="_blank"><img style="float: left; margin: 0px 10px 0px 0px; display: inline" alt="MySQL徹底入門 第3版 ～5.5新機能対応～" align="left" src="http://ecx.images-amazon.com/images/I/5195HbgN1ZL.jpg" width="250" height="316"></a>MySQL徹底入門 第3版 ～5.5新機能対応～<br></a><img style="border-top-style: none !important; border-left-style: none !important; border-bottom-style: none !important; border-right-style: none !important; margin: 0px" border="0" alt="" src="http://www.assoc-amazon.jp/e/ir?t=makotstoybox-22&amp;l=as2&amp;o=9&amp;a=4798124230" width="1" height="1"></p> <p>フラフラの時にインストールしたMySQLのrootパスワードを忘れてしまった!困った!と慌てた場合に、対処する方法。そんなに難しくない。</p> <p>一応、CentOS 6.xで確認。<br>Ubuntu でも同じなんじゃないかな～</p>
<p>&nbsp;</p> <p>まず、root権限になる。</p> <pre>sudo su -<br>password:</pre>

<p>次に、mysqld を落とす。平和的に。</p>
<pre># /etc/init.d/mysql stop</pre>

<p>強引に落とす場合は、</p>
<pre># killall mysqld</pre>

<p>セーフモードでmysqlを立ち上げる。</p>
<pre># /usr/bin/mysqld_safe --user=root --skip-grant-tables</pre>

<p>これで、パスワードナシでmysqlにアクセス出来るので、パスワード初期化</p>
<pre># mysql<br>mysql&gt; update user set Password=null where Host='localhost' and User='root';<br>
mysql&gt; exit</pre>

<p>次に、セーフモードではなく通常モードでmysqldを再起動</p>
<pre># /etc/init.d/mysql restart</pre>

<p>mysqlにrootでログインしてパスワードを設定する。</p>
<pre># mysql -u root<br>mysql&gt; set password for root@localhost=password('rootパスワード');</pre>

<p>再設定完了!</p>
Rails4でGemを作る練習をしてみた。

[Rails GuideのPluginの作り方](http://guides.rubyonrails.org/plugins.html "Rails GuideのPlugin解説")に沿ってお試しでGemを作成して自分のGitHubにPushしてみました。

```rb:Gemfile
 gem 'yaffle', git: 'https://github.com/makoto0306/rails_gem_lerning'
```
とGemfileに書いてbundleすることができます。


Guideの通りにやってみたんですが、次の2箇所を変えないとうまく動きませんでした。

・テストの親クラスがTest::Unit::TestCaseになっているけど動かなかったので
　ActiveSupport::TestCaseにしました。

・作り終えてGitHubにPushしてbundleすると下記のエラーが出たのでRails_ROOT 直下のyaffle.gemspecファイルのTODOと書いてあるところ(名前やemailなど)を書き換えるとうまくいきました。
```erb:エラー
yaffle at /{自分のディレクトリ}/rails_gem_lerning-a93d479cfe0a did not have a valid gemspec.
This prevents bundler from installing bins or native extensions, but that may not affect its functionality.
The validation message from Rubygems was: "nothing" is not a URI
```

以下に簡単な手順を記します。

  1. rails plugin new {プロジェクト名}でプロジェクトを作成
  2. 既存のクラスなどを拡張する場合はlib/プロジェクト名/core_ext.rbに
  3. テスト用プロジェクトはtest/dummyにあるのでそこで試す
  4. ActiveRecordの拡張メソッドは下記のように書く

プロジェクト名Yaffle

```rb:yaffle/lib/yaffle/acts_as_yaffle.rb

module Yaffle
  module ActsAsYaffle
   extend ActiveSupport::Concern

    module ClassMethods   #クラスメソッド
      def acts_as_yaffle(options = {})
        cattr_accessor :yaffle_text_field
        self.yaffle_text_field = (options[:yaffle_text_field] || :last_squawk).to_s
      end
          #スコープがローカルインスタンスなのでacts_as_yaffleメソッドが
          #使用された場合のみインスタンスメソッドも使用可能となる。
      include Yaffle::ActsAsYaffle::LocalInstanceMethods  
    end

   module LocalInstanceMethods  #インスタンスメソッド
      def squawk(string)
        write_attribute(self.class.yaffle_text_field, string.to_squawk)
      end
    end
  end

end
#ActiveRecord:Baseのincludeメソッドを呼び出す（引数はYaffle::ActsAsYaffleつまり上のモジュール）
ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle 
```

次は[このあたり](http://blog.thepete.net/2010/11/creating-and-publishing-your-first-ruby.html, "このあたり")を読んでオリジナルのGemをRubyGemsで公開できればいいなーと思います。
MySQL Workbench6でMySQL5.0.77に接続しようとするとConnection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)のエラーが出る場合の解消法


##MySQL Workbenchで接続情報を入力してTest Connectionを押すとエラーが発生
```
Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)
```

##MySQLのバージョン
```
mysql --version
mysql  Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1
```

##解消方法
MySQL WorkbenchのAdvancedタブにある、Uset the old authentication protocol.にチェックを入れる。

##参考
- http://bugs.mysql.com/bug.php?id=70023
Paperclipで追加されるカラムの位置を指定する

Railsで画像アップロードを行うために[Paperclip](https://github.com/thoughtbot/paperclip "Paperclip")を使ったときに、カラムの位置が気に入らなかったので変更する方法をメモ。

## :afterを追加してみる（失敗例）

`rails g paperclip user photo`で作成されたファイルに、`:after`引数を追加してみます。

```ruby:add_attachment_photo_to_users.rb
class AddAttachmentPhotoToUsers < ActiveRecord::Migration
  def self.up
    change_table :users  do |t|
      t.attachment :photo, :after => :id
    end
  end

  def self.down
    drop_attached_file :users, :photo
  end
end
```

このまま`rake db:migrate`を実行すると、
以下のカラムが既存のusersテーブルの末尾に追加されてしまいました。

* photo_file_name
* photo_content_type
* photo_file_size
* photo_updated_at
* {:after=>:id}_file_name
* {:after=>:id}_content_type
* {:after=>:id}_file_size
* {:after=>:id}_updated_at

`paperclip-3.5.2/lib/paperclip/schema.rb`を覗いてみると以下のようになっていました。

```ruby:paperclip-3.5.2/lib/paperclip/schema.rb
module Schema
  COLUMNS = {:file_name    => :string,
             :content_type => :string,
             :file_size    => :integer,
             :updated_at   => :datetime}
（中略）
  module TableDefinition
    def attachment(*attachment_names)
      attachment_names.each do |attachment_name|
        COLUMNS.each_pair do |column_name, column_type|
          column("#{attachment_name}_#{column_name}", column_type)
        end
      end
    end
```

見ての通り、渡された引数は全てカラム名として使われてしまい、制約を加えることはできません。

ということで、`t.attachment`を使った場合はカラムの位置は「指定できない」ようです。

## 全て書き直す（結論）

結局のところ全て手で書き直すことになります（最初の`rails g`も無駄になります）。

```ruby:add_attachment_photo_to_users.rb
class AddAttachmentPhotoToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :photo_file_name,    :string,   :after => :id
    add_column :users, :photo_content_type, :string,   :after => :photo_file_name
    add_column :users, :photo_file_size,    :integer,  :after => :photo_content_type
    add_column :users, :photo_updated_at,   :datetime, :after => :photo_file_size
  end

  def self.down
    remove_column :users, :photo_file_name
    remove_column :users, :photo_content_type
    remove_column :users, :photo_file_size
    remove_column :users, :photo_updated_at
  end
end
```

残念。
Chef SoloでPostgreSQLのインストールと他ホストからの接続許可する


PostgreSQLは、インストール直後は自ホストのみ接続許可されているため、他ホストから接続するためのレシピを残しておく。

# 実行環境

- chef 11.8.2
- CentOS 6.3

# CookBookの作成

postgresという名前のcookbookを作る。

```ruby
knife cookbook create postgres -o site-cookbooks
```

# レシピ

「site-cookbooks/postgres/recipes/default.rb」に以下を記載する。

### postgresqlのインストール

```ruby
package "postgresql-server" do
     action :install
end
```

### データベースの初期化

初期化コマンドを実行する。
コマンドを実行すると、「/var/lib/pgsql/data」ディレクトリが生成されるので、既に実行済みか否かはdataディレクトリの有無で判断する。

```ruby
dataDir = "/var/lib/pgsql/data/"
if not File.exists? dataDir then
   execute "postgresql-init" do
      command "service postgresql initdb"
   end
end
```

### 設定ファイルの書き換え

外部からの接続許可のための設定ファイルを書き換える。

```ruby
template "/var/lib/pgsql/data/pg_hba.conf" do
   mode 0600
end

template "/var/lib/pgsql/data/postgresql.conf" do
   mode 0600
end
```

### 設定ファイルの読み込みと自動起動設定

設定ファイルを書き換えたため、postgresqlを再起動する。
ポートを開放するため、iptablesは無効にしておく。

```ruby
service "postgresql" do
    action [:enable, :restart]
end

service "iptables" do
   action [:disable, :stop]
end
```

# テンプレート

### postgresql.conf

「site-cookbooks/postgres/templates/default」へ「postgresql.conf.erb」として配置する。

他ホストからの接続を許可し、ポートを明示的に指定する。

```postgresql.conf.erb
listen_addresses ='*'
port = 5432			# (change requires restart)
```

### pg_hba.conf

「site-cookbooks/postgres/templates/default」へ「pg_hba.conf.erb」として配置する。
すべてのホストからの接続で、パスワード認証を利用する設定にしておく。

```pg_hba.conf.erb
# IPv4 local connections:
host    all     all       0.0.0.0/0        password
```

以上。レシピとテンプレートは、以下のgithubへ配置。

https://github.com/y-mori/chef-repo/tree/master/site-cookbooks/postgres
unite-javaimportの現在

[unite-javaimport](https://github.com/KamunagiChiduru/unite-javaimport.git)は現在バージョン0.02になったため、ここで一度、現在の姿を紹介する。

できること
--------------------------------------------------------------------------------
1. カーソル上のクラスのimportを挿入

    1. normalモードで`<Leader>I`を押下すると、uniteウィンドウが開く

    1. クラスを選択

    1. 選択したクラスがimportされる

1. すべての型名からuniteインタフェイスによりクラス名を選択し、選択したクラスをimport

    1. `:Unite javaimport`コマンドを実行

    1. クラスを選択

    1. 選択したクラスがimportされる

1. 既にあるimport文に対してソートを行う

    1. `:JavaImportSortStatements`コマンドを実行

1. 既にあるimport文から、不要なimport文を削除

    1. `:JavaImportRemoveUnnecessaries`コマンドを実行

1. uniteのプレビュー機能により、javadocを表示


インストール方法
--------------------------------------------------------------------------------
[neobundle.vim](https://github.com/Shougo/neobundle.vim.git)を使用している場合、`$MYVIMRC`に以下を記述して`:NeoBundleInstall`する。

```vim:$MYVIMRC
NeoBundle 'KamunagiChiduru/unite-javaimport', {
\   'depends': ['Shougo/unite.vim'],
\}
```

動作には、外部コマンドとして以下のものが必要である。

1. `wget` or `curl`
1. `ctags` - 5.8以上(バージョン低くても多分動く気がする)
1. `java` - 1.6以上

javadoc表示機能を使用するためには、追加で以下が必要となる。

1. `$MYVIMRC`への記述を以下に修正

    ```vim:$MYVIMRC
    NeoBundle 'KamunagiChiduru/unite-javaimport', {
    \   'depends': ['Shougo/unite.vim', 'yuratomo/w3m.vim'],
    \}
    ```

1. 外部コマンドとして`w3m`が必要


TODO
--------------------------------------------------------------------------------
1. 速度改善

1. 未importなクラスをバッファ中から検索し、uniteウィンドウを連続的に開く

1. staticインポートへ対応する

1. `java.lang`直下のクラスはimportが不要のため、候補から除外する

他、欲しい機能やバグ等、あれば[こちらまで](https://github.com/KamunagiChiduru/unite-javaimport/issues)。
当方windows環境を持っていないので、windowsでの動作報告等も歓迎しております。
メールアドレスのドメインをすべてダミーのものに変更する

正規表現を使って、メールアドレスのドメイン部分を置換する。
PostgreSQLでは正規表現リテラルはE''で囲み、バックスラッシュは重ねてエスケープする。

```postgres
update user
set
	mail_address = regexp_replace(mail_address, '^(.+)@(.+)$', E'\\1@example.com')
```
第10回オフラインリアルタイムどう書くの問題をHaskellで書いた


第10回オフラインリアルタイムどう書くの問題をHaskellで書いた

移動場所の記録をWriterモナドで上手く書けそうな気もしますが、モナドの理解不足。。。
あとlet文、if文が多いのもイマイチか。。。
テスト処理ももっと簡潔に書きたい。

```hs:honeycomb.hs
import Control.Applicative

honeycomb = [
				"   T   ",
				"  k U  ",
				" j H V ",
				"i S I W",
				" R B J ",
				"h G C X",
				" Q A K ",
				"g F D Y",
				" P E L ",
				"f O M Z",
				" e N a ",
				"  d b  ",
				"   c   "
			]

honeycombW = length $ honeycomb !! 0
honeycombH = length honeycomb

directions c | c == '0' = (0,-2)
             | c == '1' = (1,-1)
             | c == '2' = (1,1)
             | c == '3' = (0,2)
             | c == '4' = (-1,1)
             | c == '5' = (-1,-1)

nextPosition :: (Int, Int) -> Char -> (Int, Int)
nextPosition (x, y) d = let (dx, dy) = directions d 
                        in (x + dx, y + dy)

validPosition :: (Int, Int) -> Bool
validPosition (x, y) = and [x >= 0, x < honeycombW, y >= 0, y < honeycombH, honeycomb !! y !! x /= ' ']

move :: ((Int, Int), String) -> Char -> ((Int, Int), String)
move ((x, y), path) d = let (x', y') = nextPosition (x, y) d
					    in if validPosition (x', y')
					    	then ((x', y'), ((honeycomb !! y') !! x'):path)
					    	else ((x, y), '!':path)

solve str = reverse $ snd $ foldl move ((3,6), "A") str

main = do
	tests <- map words <$> lines <$> getContents
	mapM (\t -> print $ runTest solve t) tests
	where
		runTest f t = f (head t) == last t 
	
```

```test.txt
135004	ACDABHS
1	AC
33333120	AENc!!b!M
0	AB
2	AD
3	AE
4	AF
5	AG
4532120	AFQPOEMD
051455	ABSHSj!
23334551	ADMb!cdeO
22033251	ADLKLa!ML
50511302122	AGSjkTHTU!VW
000051	ABHT!!!
1310105	ACDKJW!V
50002103140	AGSk!HU!IVIU
3112045	AEDKYXKC
02021245535	ABCIJW!JIHBS
014204	ABIBCIB
255230	ADAGAEA
443501	AFPefgQ
022321	ABCKLZ!
554452	AGRh!!Q
051024	ABSHTUH
524002	AGAFGSB
54002441132	AGQRjSRhRSGA
11010554312	ACJV!!UTkSHI
23405300554	ADMNEFOFGRi!
555353201	AGRih!gPQG
22424105	ADLMabaLD
11340202125	ACJKDCKJX!!J
4524451	AFQFPf!P
44434234050	AFPf!!e!!Pgh
00554040132	ABHk!j!i!jRG
3440403	AEOePfgf
111130	ACJW!XW
21133343125	ADKXYZ!a!Z!L
353511	AEFOPFA
22204115220	ADLZYLY!KY!X
03013541	ABABICBGB
101344	ACIVJCA
2432541	ADENbNdN
45332242015	AFQPedc!!NME
215453	ADKCAGF
45540523454	AFQh!i!RQg!!
42434302545	AFEOd!!ONOef
```
よく使うgitコマンド



##リポジトリ作成

```console
git init
```

##コミット

```console
git commit -m “メッセージ”
```

##ログの表示

```console
git log
```

##現在の状態の表示

```console
git status
```

##差分の表示

```console
git diff
```

##直前に戻す

```console
git reset --hard HEAD
```
MySQLの勉強(Windows7)

#MySQLを勉強

##MySQLをダウンロード->SQL文が受け付けるところまで

下記のURLをその通り実行。
[MySQL入門のカルマ](http://pc-karuma.net/mysql/install-windows/)

##MySQL用のツールを導入する。
###HeidiSQL
視覚的に操作できるらしいので入れてみる
[HeidiSQL](http://www.heidisql.com/)
Windows8でnode-gypを入れるメモ

結構めんどかったのでメモ。Windows8.1、node v0.10.22です。

[node-gyp](https://github.com/TooTallNate/node-gyp)はNode.jsのネイティブ拡張モジュールをビルドするためのツールです。自分は[topojson](https://github.com/mbostock/topojson)をインストールしようとした時に、node-gypが必要だったのでインストールしました。

まずpythonがないと

```
gyp ERR! stack Error: Can't find Python executable "python", you can set the PYTHON env variable.
```

とエラーを吐くのでpythonを入れます。[node-gyp](https://github.com/TooTallNate/node-gyp)の説明にあるように、python 2.7.xにした方がいいです。入れたらパスを通しておきます。

あとはVisual Stadio 2012 for Windows Desktopが必要です。ExpressでOKなので入れます。

以上でnode-gypのインストールが出来るはずです。後は[topojson](https://github.com/mbostock/topojson)入れる時なんかにもちゃんと拡張モジュールビルドしてくれるようになります。

書いてみたら別にめんどくさくはない感がありますね。結局VS2012のインストールが長くてめんどくさい感じだった気が。
urllib.request の fixture

HTTPretty が python3.3 の ```urllib.request.urlopen()``` でうまく動かなかったので探してきました。で参考にさせて頂いたソースがあったのですが、どこか忘れてしまった・・・手順は以下のとおり。urllib2 を使えば python2 でもたぶん大丈夫。

```python:仕込み
from io import StringIO
import urllib.request as urllib2

def generate_response(req, return_data):
	resp = urllib2.addinfourl(StringIO(return_data),
								'mock header',
								req.get_full_url())
	resp.code = 200
	resp.msg = 'OK'
	return resp

expect_url = {}

def register(url, return_data):
	expect_url[url] = lambda req:generate_response(req, return_data)

def mock_response(req):
	return expect_url[req.get_full_url()](req)

class MyHTTPHandler(urllib2.HTTPHandler):
	def http_open(self, req):
		return mock_response(req)
```

これを install_opener します。あとは、expect_url にハックする URL と戻り値を入れればいいです。

```python:テスト本体
from nose.tools import *

class TestUrlopen(object):
	def __init__(self):
		my_opener = urllib2.build_opener(MyHTTPHandler)
		urllib2.install_opener(my_opener)

	def test_urlopen(self):
		url = 'http://mock_server'
		register(url, "hello world")

		ret = urllib2.urlopen(url).read()
		eq_(ret, "hello world")
```

expect_url を global に置いて動的にレスポンスをつけるのは私のアイデアですが、他はまんまコードを頂いてます。どこだったかな・・・

ここではやってませんが、同じURLで違うデータを返す（副作用を入れる)場合は register() で push して、mock_response() で pop すれば良いかと。

なんとなくクラスも作ってみました。https://gist.github.com/norobust/8254063
外部コマンドの標準出力を端末の標準出力に流す

こう言う風に、少しずつ結果が標準出力に流れてくるコマンドがあるとします。

```rb:test.rb
5.times.each do |i|
  sleep 0.2
  puts i
end
```

```bash
% ruby test.rb # 0.2秒間隔で現れる
0
1
2
3
4
```

これをRubyから外部コマンドとして普通に実行すると、コマンドが全て完了してからいっきに結果が得られます。

```rb
% ruby -e 'puts `ruby test.rb`' # 1秒後に一気に現れる
0
1
2
3
4
```

Rubyからそのコマンドの結果を受け取りたい場合はこれでもよいですが、例えばスクリプトからRakeタスクを実行するような場合は、標準出力に遅延なく流して欲しいです。`Open3.pipeline` 使うとそれができます。

```rb
% ruby -r open3 -e 'Open3.pipeline("ruby test.rb")' # 0.2秒間隔で現れる
0
1
2
3
4
```

サブプロセスを立ち上げてその標準出力を自分の標準出力につなげているだけなので、色などもそのまま表示されます。

```bash
% cat test.zsh
autoload -U colors; colors
echo ${fg[green]}green
sleep 0.2
echo ${fg[blue]}blue
% ruby -r open3 -e 'Open3.pipeline("zsh test.zsh")'  # 緑でgreen, 青でblueと表示される
green
blue
```
文字をヤンクする

 Windows のように、まず文字を選択してからコピーしたい場合は、「v」を押してビジュアルモードに移行します。ビジュアルモードに入ると、Vimの一番下の行に 【-- ビジュアル --】もしくは【-- VISUAL --】と表示されます。この状態で、「l」や「j」を押すと移動した分だけ文字が反転して選択されていることが示されます。ヤンクしたい部分を選択してか ら、「y」を押せば選択範囲をヤンクすることが出来ます。