OmniAICreator/Qiita-1.07M huggingface dataset:
cron設定ファイルの所有者と権限について

セキュリティ上の理由から、cronは設定ファイル（crontab および/etc/cron.d/ 以下に置いたファイル）にオーナー以外のユーザーの書き込み権限および実行権限がついていると、それを設定ファイルと見なしてくれない（※1）。

設定ファイルの所有者と権限は
`-rw------- 1 root root`
にする（※2）。

※1 cron のman の記述
>CAVEATS
       In this version of cron , without the -p option, /etc/crontab must not be writable by any user other than root, no crontab files may be links, or linked to by any other file,
       and no crontab files may be executable, or be writable by any user other than their owner.

※2 セキュアな設定のガイド。108ページ目にcron設定ファイルに関する記載がある。
  Redhat のドキュメントだが、CentOSでも同様の模様。
  https://www.nsa.gov/ia/_files/os/redhat/rhel5-guide-i731.pdf
NSAttributedStringを用いた際、文字列の切り詰め(truncation)が効かない(正しく表示されない)

行の高さや行間を指定するためなどにNSAttributedStringを用いた場合に、文字列の切り詰め(truncation)が効かなくなった場合、

```
NSMutableParagraphStyle *paragrahStyle = [[NSMutableParagraphStyle alloc] init];
paragrahStyle.lineBreakMode = NSLineBreakByTruncatingMiddle;
```

などとして、lineBreakModeを指定する必要がある。

## See
* http://stackoverflow.com/a/28587251
備忘録

# qmailのqueueを削除する
http://d.hatena.ne.jp/youhey/20111219/1324268485

# .qmail-** ファイルの設定方法
http://dsas.blog.klab.org/archives/50524479.html

# From, Toアドレスに日本語を表示する
http://iandeth.dyndns.org/mt/ian/archives/000628.html
※前後の`"`も含めてMIMEエンコードする。

# Gitリポジトリを移行する
http://tanacasino.hatenablog.com/entry/2013/08/03/233427

# MySQLのSELECT文の、デフォルトの並び順について
http://forums.mysql.com/read.php?21,239471,239688#msg-239688

# 2月の日数をjava.util.CalendarのgetActualMaximumメソッドで調べる際のはまりポイント
http://d.hatena.ne.jp/torutk/20110629/p1

# td-agent (fluentd) のフォーマットチェック
http://fluentular.herokuapp.com/

# 正規表現パターンを可視化してくれるサイト
http://regexper.com/

# 役に立つか分からないけど面白そうなサイト
http://visualgo.net/

# Tomcat のGCログを見やすくする
http://d.hatena.ne.jp/Kazuhira/20120623/1340466318

# GithubのSSH設定
https://gist.github.com/to4iki/b27b40700bcd46484326
Reactで外部Scriptを動的に読み込む

#外部scriptを画面遷移するたびに読み込みたい・・・

Webpayが提供しているCheckoutHelperを使うと、数行コピペするだけでCredit決済に必要なクライアント側の機能が実装できます。
参考 : http://engineering.webpay.co.jp/2014/08/26/checkout-helper-usage/
外部Scriptを読み込むことでwebpay仕様のボタン&入力フォームを表示する方式なのですが、renderの中にそのまま書いてもscriptがloadされないので表示されませんでした。

##scriptタグをrenderの中に書いてもボタンが表示されてくれない・・・
```js
render() {
  return (
    <div className="payment jumbotron center-block">
      <h1>Payment</h1>
      <form action="/purchase" method="post">
　　　   <script src="https://checkout.webpay.jp/v2/" className="webpay-button" data-key="test_public_bMj6ai5NZbYSbNraz51jkf7j" data-lang="ja"></script>
      </form>
    </div>
  );
}

```

##appendChildでscriptタグを挿入
一応componentDidMountでappendChild、componentWillUnmountでremoveChildすれば表示されるようになりました。
ただ、Reactを通さないDOM操作をするとReactのstate変化で再描画するときに消えてしまったりするのでベストのやり方ではないような・・・。
良い方法あったら教えて下さいm(__)m

```js
import React from 'react';

export default class Payment extends React.Component {

  componentDidMount() {
    var webpayForm = React.findDOMNode(this.refs.webpayForm);
    var script = document.createElement("script");
    script.setAttribute("src","https://checkout.webpay.jp/v2/");
    script.setAttribute("class","webpay-button");
    script.setAttribute("data-key", "test_public_19DdUs78k2lV8PO8ZCaYX3JT");
    script.setAttribute("data-lang", "ja");
    script.setAttribute("data-token-name", "webpayToken");
    script.setAttribute("id", "webpayButton");
    webpayForm.appendChild(script);
  }

  componentWillUnmount() {
    var webpayForm = React.findDOMNode(this.refs.webpayForm);
    webpayForm.removeChild(document.getElementById("webpayButton"));
    //for preventing webpay error
    window.WebPay = void(0);
    window.WebPayCheckoutHelper = void(0);
  }

  render() {
    return (
      <div className="payment jumbotron center-block">
        <h1>Payment</h1>
        <form action="/purchase" method="post" role="form" ref="webpayForm">
        </form>
      </div>
    );
  }
}
```

##CheckoutHelperをSingle page applicationで使うのは辛い・・・
WebpayのCheckoutHelperはSingle page applicationで実装されることを想定されていなくていろいろと辛いです。
再読み込みをすると1度しか読み込みできないというWebpayの仕様にひっかかってしまいます。
こんなエラーがでます。
`window.WebPay is already defined. Loading twice?
WebPay CheckoutHelper is already initialized. You cannot place two helpers per page. `

componentWillUnmountで以下のようなcodeを入れると回避できるのですが、この対応で問題がないのかあるのかは分かりません。。
`window.WebPay = void(0);
window.WebPayCheckoutHelper = void(0);`

Single page applicationでwebpay使うときはCheckoutHelper使わない方がいいのかも・・・。
Symfony2 Admin Bundleでテーブル作成から画面作成まで

Code for Japanの合宿で、
急遽開発を担当することになったので、
Symfony2にて開発を行った。

自分で手を動かして開発するのは何年振りだろう。。。
間違ってたらごめんなさい。
地味に環境構築が大変。

あとで清書します。

# Symfony2 をインストール

省略
※後程作成します。

# Sonata Admin Bundleインストール

## composer.json設定

Symfony2インストール直下のcomposer.jsonに以下を追記

```
   "require": {
        ・・・
        "sonata-project/core-bundle": "~2.3",
        "sonata-project/admin-bundle": "~2.3",
        "sonata-project/doctrine-orm-admin-bundle": "~2.3",
        "fresh/doctrine-enum-bundle": "~3.2"
        ・・・
    },
```

## インストール

```shell-session
composer install
```

# テーブル作成

DB管理ツールなどでテーブルを手動作成する。

# Schemeファイル作成

```shell-session
app/console doctrine:mapping:import --force APPBundle yml
```

>テーブルから作成しない場合、スキーマファイルを作成したのち、
>以下の手順で、テーブルに反映を行う。

># データベース作成
```shell-session
app/console doctrine:database:create
```

># テーブル作成
```shell-session
app/console doctrine:schema:create
```

# Entityクラスファイル作成

```shell-session
app/console doctrine:generate:entities APPBundle
```

# 管理画面作成

```shell-session
app/console sonata:admin:generate APPBundle/Entity
```


# その他参考資料
DOCUMENTATION » ADMIN
https://sonata-project.org/bundles/admin/2-3/doc/index.html
Symfony2 Jobeet’s documentation 12. 12日目: Sonata Admin Bundle
http://jobeet.symfony.gr.jp/day-12-sonata-admin-bundle.html
The Web Mason
http://thewebmason.com/category/sonata-admin/
Symfony2 | Cristian Radulescu
http://cristian-radulescu.ro/category/programming/symfony2
windows 7でbash環境を構築して、gvm環境を整える	

まあ、chocolateyネタです。
某事情によりwindowsに入れる必要が生じたが、今までのやり方では構築できなくなったので、
2015年4月24日、現時点で動くものの手順を残します。

### bash環境を整える

1) chocolateyインストール
https://chocolatey.org/
こちらに従いインストール

2) 以下cmdから作業 [^1] [^2]

```lang:
choco install mingw
choco install mingw-get -version 1.0.3
choco install conemu
```
[^1]: mingw-getをデフォルトでインストールすると1.0.2になってインストールできない。
[^2]: もし1.0.2でも1.0.3でも起動できなかった場合はchocoではできないんで、http://www.mingw.org/ から手動インストール

3) ここでcmd再起動（%PATH%認識のため）

```lang:
mingw-get install msys-bash
```

4) conemuに以下を設定して起動

```lang:
C:\tools\mingw64\msys\1.0\bin\bash --login -i
```
これでbash起動はできる。

5) 追加で必要なものをインストール

```lang:
mingw-get install msys-base
mingw-get install msys-wget
mingw-get install msys-unzip
mingw-get install mingw32-libz
mingw-get install msys-libopenssl
mingw-get install msys-openssl

"以下はあれば便利。必須ではない"
mingw-get install msys-grep
mingw-get install msys-diffutils
mingw-get install msys-less
mingw-get install msys-awk
mingw-get install msys-sed
```

## gvm環境設定
前提：上記の作業完了後

1) mingwだけだとcurlはないのでcurlを入れて、ssl設定をする

```lang:
choco install curl
wget http://curl.haxx.se/ca/cacert.pem
mv cacert.pem /c/ProgramData/chocolatey/bin/curl-ca-bundle.crt
```

2) gvmインストール

```lang:
curl -s get.gvmtool.net | bash
source ~/.gvm/bin/gvm-init.sh
```

3) インストールできるか確認。gradleとかがssl通信なので都合いい

```lang:
gvm install gradle
gradle -v
```
Swift


## 基本型

String
Bool
Float
Int

## 変数定義

let イミュータブル
var ミュータブル

## リテラル

### 文字列

```Swift
let msg = "World"
let hello = "Hello, \(msg)"
```

### 配列

```Swift
let immutableNumbers = [5, 7, 1]
immutableNumbers[1] = 9
// error: cannot assign to the result of this expression

var mutableNumbers = [3, 1, 2] 
mutableNumbers[1] = 9

var emptyNumbers = [Int]()

```

### ディクショナリ

```Swift
let immutableDictionary = [ "Name": "Bibio", "Age": "18" ]
immutableDictionary["Age"] = "32"
// error: cannot assign to the result of this expression

var mutableDictionary = [ "Name": "Bibio", "Age": "18" ]
mutableDictionary["Age"] = "32"

var emptyDictionary = [String:String]()
```

キーと値は同じ型でないとエラーになる。

## 関数定義

-> 返り値の型

```Swift
func msg(str: String) -> String {
	return "Hello, \(str)"
}
println(msg("world"))
```

### 可変引数

```Swift
func sumOf(numbers: Int...) -> Int {
	var sum = 0
    for number in numbers {
    	sum += number
    }
    return sum
}

sumOf(1, 3, 5)  // 9
```


## 関数リテラル

{} で囲み、定義と引数の間を in で仕切る

```Swift
let numbers = [1, 3, 5]
let mappedNumbers = numbers.map({
	(number: Int) -> Int in
	return number * 3
	})
```

リテラルの型と戻り値は省略できる。

```Swift
let numbers = [1, 3, 5]
let mappedNumbers = numbers.map({
	number in number * 3
	})
```
RakeタスクでModelがNameErrorになる

# 現象

```
[ec2-user@Test railsapp]$ RAILS_ENV=production rake user:task
rake aborted!
NameError: uninitialized constant User
...
```

# 原因

productionの初期設定だとモデルファイルが事前に読み込まれないのが問題のようです。

http://stackoverflow.com/questions/4300240/rails-3-rake-task-cant-find-model-in-production

# 対処法
production.rb 設定ファイルに次の2行を追加する。

```rb:config/environments/production.rb
  config.threadsafe!
  config.dependency_loading = true if $rails_rake_task
```

念のため、Rakeタスクファイルに次の1行を追加する。

``` rb:lib/tasks/export.rake
  $rails_rake_task = true
```

# 参考

http://stackoverflow.com/questions/9828841/production-rake-tasks-dont-recognize-my-models
Unity C# スレッドの休止と再開


## AutoResetEvent クラス ##

上記クラスを使ってスレッドの休止と再会を管理

参考URL:
　http://okwakatta.net/topic/topic025.html
　http://www.wisdomsoft.jp/526.html

## スレッド呼び出し元、Unityエディタからクリックイベントで呼ばれる ##

```csharp:ThreadCallBase
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class ThreadCallBase : MonoBehaviour {

    private Thread1 ThreadOne = new Thread1();
    public Text LogText;

	// Use this for initialization
	void Start () {

        ThreadOne.ThreadStart();
	}
	


    public void OnclickThreadSleep()
    {
        ThreadOne.SleepFlgTrue();
        Debug.Log(ThreadOne.TestString);
        LogText.text = ThreadOne.TestString;
    }


    public void OnclickThreadInterupt()
    {
        ThreadOne.SleepFlgFalse();
        Debug.Log(ThreadOne.TestString);
        LogText.text = ThreadOne.TestString;

    }


    public void OnclickLog()
    {
        Debug.Log(ThreadOne.TestString);
        LogText.text = ThreadOne.TestString;

    }

    // This function is called when the MonoBehaviour will be destroyed (Since v3.2)
    public void OnDestroy()
    {
        ThreadOne._threadFirst.Interrupt();
        ThreadOne._threadEvent.Reset();
    }
}
```


## スレッド側ソース　Unity関係のものは一切使えない ##

```csharp:Thread1
using UnityEngine;
using System.Collections;
using System.Threading;

public class Thread1  {


    public Thread _threadFirst;

    public AutoResetEvent _threadEvent;

    public string TestString;

    public bool sleepFLG = false;

    public void ThreadStart()
    {
        sleepFLG = false;
        _threadFirst = new Thread(ThreadWorking);
        _threadEvent = new AutoResetEvent(true);
        _threadFirst.Start();
    }


    public void ThreadWorking()
    {
        while(true){

            if (sleepFLG == true)
            {
                TestString = "Sleep On";
                // スレッドを休止状態にする。
                _threadEvent.WaitOne();
            }
            else
            {
                TestString = "Sleep Off";
            }
        }
    }


    public void SleepFlgFalse()
    {
        /* スレッド処理を実行するようにフラグを落とします */
        sleepFLG= false;

        /* AutoResetEventオブジェクトをシグナル状態にして
            スレッドを再開させます */
        _threadEvent.Set();
    }

    public void SleepFlgTrue()
    {
        sleepFLG = true;
    }
}
```
jqGrid インストールから表示まで

#jqGridの使い方
環境はEclipse。

<br>

##1.ダウンロード
次の2つをダウンロードする
・jQueryUI  ( http://jqueryui.com/download/ )
　　　　- ページ最後尾にある「Theme」のセクションから “Redmond” を選び、ダウンロード
・jqGrid  ( http://www.trirand.com/blog/?page_id=6 )
　　　　- そのままダウンロード



<br>
##2.コーディング
```html:jqGrid.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
    <link type="text/css" media="screen" href="jqGrid/jquery-ui.min.css" rel="stylesheet" />
	<link type="text/css" media="screen" href="jqGrid/css/ui.jqgrid.css" rel="stylesheet" />
	<script type="text/javascript" src="jqGrid/js/jquery-1.11.0.min.js" ></script>
	<script type="text/javascript" src="jqGrid/js/jquery.jqGrid.min.js" ></script>
	<script type="text/javascript" src="jqGrid/js/i18n/grid.locale-ja.js" ></script>

	<script type="text/javascript">
	jQuery(document).ready(function()
	{
		var mydata = [
			{comp_code:"CD1", comp_name:"株式会社シー", comp_kana:"カブシキカイシャシー"},
			{comp_code:"CD2", comp_name:"ビー株式会社", comp_kana:"ビーカブシキカイシャ"},
			{comp_code:"CD3", comp_name:"有限会社エー", comp_kana:"ユウゲンガイシャエー"},
		];

		jQuery("#list").jqGrid({
                        data: mydata,
			datatype: "local",
			colNames:['コード', '会社名', 'カナ'],
			colModel:[
				{name:'comp_code'},
				{name:'comp_name'},
				{name:'comp_kana'},
			],
			multiselect: false,
			caption: '会社一覧'
		});
	});
	</script>
</head>
<body>
  <table id="list">
  </table>
</body>
</html>
```
<br>
↓整理したものの、とりあえずダウンロードした2つのフォルダの中身を全部ほりこんどけばOK！
　jQueryの「images」フォルダはライブラリが読み込むので必要！

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/60528/416f3a06-6fb0-1d77-86bf-c1253cd040b5.jpeg)





<br>
##3.表示
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/60528/adfec934-862d-71dd-f574-e0a14d3b7d76.jpeg)

<br>
とりあえず簡単ではあるがこれでjQgridを使った画面を作ることができる！！

<br>
参照
http://samples.northwind.mydns.jp/home/webdev/jqgridsample1
Scalaの環境構築


##使用するもの
vagrant:centOS
JDK:java8

##install
Scalaを動かすためにはJavaが必要です。JDKをinstallする必要がある。
vagrantにcentOSを入れ環境構築をしていく
ここではvagrantの入れ方は省略する。

```
sudo wget http://downloads.typesafe.com/scala/2.11.5/scala-2.11.5.tgz
```

を実行しScala本体を入れる

```
sudo tar xvfz scala-2.11.5.tgz 
```

解凍する
##Hello World
とりあえずHello Worldの表示をする。
###対話型で実行
まずDownloadをした、ファイルからScalaを実行する。

```
cd scala-2.11.5/bin/
./scala
```

Scalaが起動したことが確認できたら、以下のコマンドを実行し、Hello Worldを表示させる。

```
scala> printf("Hello World");
Hello World
scala>
```

###コンパイルして実行
コンパイルして実行する。
パスをとおしていないとめんどくさいのでパスを通す

```
$export PATH=$PATH:scala-2.11.5/bin/ 
```
旧IEでdisplay: inline-blockを適用する


display: inline-blockを使って中央揃えをする機会は結構ありますが、
古いIEではinline-blockが使えなかったりします。

IE8では、以下のプロパティを、inline-blockを適用したい要素に記述することで解決できました。


```
  *display: inline
  *zoom: 1
```
iOS実機ビルド、プロヴィジョニング関連エラー

iPhone 実機ビルドについて、新しい端末を登録した時の事。

　エラーが出てビルドできなかった。

Fix issue しても解決しない。。。


AppleDeveloper

iOSビルド、
証明書、
Provisioning Profile

登録と、ダウンロード。

デバイス登録

結論：
TARGETSのGeneralより
　Teamプロパティをnoneして、
　Revorke And Requestして、
　元の
Rails4 文字コードiso-2022-jpでS/MIMEでメールを送信

Rails4.0でs/mimeメールでメールを送信する必要がありましたが、gemを発見できなかったので自作、といっても単にOpen3.capture3でsendmailコマンドを叩いているだけですが。
エラー系は省略、文字コードiso-2022-jp固定、cc、bccや複数のあて先は対応していません。
また、sendmail使用可を前提としています。
もっといい方法ないかな。。。

```ruby:smime_mailer.rb
class SMimeMailer
  require 'kconv'
  require 'open3'

  attr_accessor :from, :to, :subject, :body, :delivery

  MIME_DEF = {
      var: 'MIME-Version: 1.0',
      charset: 'Content-Type: text/plain; charset=iso-2022-jp',
      encoding: 'Content-Transfer-Encoding: 7bit'
  }

  # @param [String] :from 送信元
  # @param [String] :to 送信先
  # @param [String] :subject メールタイトル
  # @param [String] :body メール本文
  # @param [String] :cert 証明書のパス
  # @param [Boolean] :delivery true:メール送信まで実施 false:メールの送信はしない
  def self.smime_mail(from: nil, to: nil, subject: nil, body: nil, cert: nil, delivery: true)
    SMimeMailer.new.tap do |me|
      me.body = encrypt_s_mime(cert, to_mime_str(body).kconv(Kconv::JIS, Kconv::UTF8))
      me.subject = 'Subject:' + NKF::nkf('-jM', subject)
      me.from = "From: #{from}"
      me.to = "To: #{to}"
      me.delivery = delivery
    end
  end

  # メール送信実施
  def deliver
    path = Tempfile.open('temp', encoding: 'iso-2022-jp') { |f|
      f.puts @to
      f.puts @from
      f.puts @subject
      f.puts @body
      f.path
    }
    if @delivery
      Open3.capture3("/usr/lib/sendmail -t < #{path}", binmode: true)
    end
  end

  private

  def self.encrypt_s_mime(cert, body)
    OpenSSL::PKCS7.write_smime(OpenSSL::PKCS7.encrypt([OpenSSL::X509::Certificate.new(IO.read(cert))], body))
  end

  def self.to_mime_str(body)
    "#{MIME_DEF.values.join("\n")}\n\n#{body}"
  end

end
```
【FXML利用】JavaFX8でControllerを疎結合に保って、画面遷移する方法

#この記事で紹介すること
+ JavaFX8でFXMLを使ったアプリケーションで画面遷移をする方法
+ 上記を実現するにあたり、できるだけControllerを疎結合にする方法

例のごとくJavaFX8もJava8も初めての経験なので、
「今のところこういう感じがよさそう」と思った内容を記載しておきます。
色々ご指摘頂けると嬉しいです。

#前置き
ポイントとなる部分だけコードをなんとなく書いているので、
JavaFX(バージョン8)で画面遷移どうするんだろう、とか、
Controller同士が疎結合にならない、、、とかいうお悩みの方が対象の内容になります。

#問題1：JavaFXで画面遷移ってどうするの？
ShowされたStageにSceneをセットするだけです。
※StegeにSceneをセットしてShowするでも良いです。

#問題2：Stage、ってあのメインクラスの？何か嫌な予感。。
すみません。これ良いわっていうほどの解決策ではないかもしれません。
やっぱStageはメインクラスで多少がちゃがちゃして、というのはしょうがない気がします。

ちょっと不安に思わせてしまったかもですが、
実際にコードを見てみましょう。

##メインクラス
Applicationを継承したメインクラスです。

説明が長くなりそうだったので、
他のControllerから取得するためのStageを無理やりpublic staticにしていますが、
皆さんがやるときは、ぜひ別途情報共有クラスを作って下さい。

```java:SampleMain.java
public class SampleMain extends Application{

	// 他のControllerから取得するためのStage(できれば別クラスを用意する)
	public static Stage presentStage;
	
	public static void main(String[] args){
		Application.launch(args);
	}
	
	@Override
	public void start(Stage stage) throws Exception {
		presentStage = stage;

		// タイトル
		stage.setTitle("Sample");
		
		// sceneの作成(nullですので中身ないです)
		Scene scene = new Scene(new Pane());
		stage.setScene(scene);
		
		// 最初の画面
		LoginController.getInstance().show();
		
		// 表示
		stage.show();
	}

}
```

##それぞれのControllerの構成
メインから呼び出した、最初のログイン画面というていで見てください。
他のControllerも共通化しない場合は同じ構成を持つことになります。

ポイントはSceneをシングルトンにして、
メインクラスで設定したStageを持ってきてShowメソッドでセットすることです。

ちなみにインスタンスはFXMLのコントローラークラスが指定されている状態なら
load()した後に、getController()で取れます。
※その代わりこのアクセス方法の場合、コンストラクタはprivateにできません。注意しないと、、、


```java:LoginController.java
public class LoginController {
	/**
	* instance(singleton)
	*/
	private static final LoginController instance;
	/**
	 * Scene(singleton)
	 */
	private static final Scene SCENE;
	static {
		FXMLLoader fxmlLoader = new FXMLLoader(ClassLoader.getSystemResource("login.fxml"));
		try {
			fxmlLoader.load();
		} catch (IOException e) {
			// loggerを使って何かしら出すほうがいいですね。手抜きですみません
			e.printStackTrace();
		}
		Parent parent = fxmlLoader.getRoot();
		Scene s = new Scene(parent);
		s.setFill(Color.TRANSPARENT);
		SCENE = s;
		instance = fxmlLoader.getController();
	}

	/**
	 * singletonのインスタンスを返す
	 * @return instance
	 */
	public static LoginController getInstance() {
		return instance;
	}

	/**
	 * 表示する
	 */
	public void show() {
		SampleMain.presentStage.setScene(SCENE);
	}

	@FXML
	public void onClick(ActionEvent event) {
		// クリック時の処理とか色々して~~~次のページ表示
		FirstContent.getInstance().show();
	}
}
```

#結果
これを全画面(Controller)でやっていくと、
FXMLとControllerは1対1、
そしてController同士は別のControllerを呼び出したくてもすぐ切り替えられる、
ということになります。
やっと実用的な感じがしてきました。

#あとがき
2つしか画面使わないアプリケーションだったので疎結合に書くならこんな感じかなぁと思いましたが、
複数ある場合は、上手く共通化した方がよさそうです。

それにしてもJavaでGUI作れるのは凄く良いです。
処理は簡単に書けるし、DBアクセスも楽チン！
gradle使ってすぐ共有できるし、exeにも変換できるライブラリがある！

まだ微妙な面もありますが、
少しずつ使う人が増えて情報が整理されると良いなーと思います。」

余談ですが、JavaFXではScene BuilderというGUI作成を簡単にするやつが絶対必須です！
ワシはXML直に書きたいんやってお方以外はぜひ使ってみてください。
docker バッドノウハウ集



## boot2docker VM のメモリとディスクサイズの調整
boot2docker 1.6 のデフォルトでは
- メモリ: 2G
- ディスク: 20G

だけど、僕の MacBook Mid 2011 (memory 4G, disk 480G) ではメモリは割り当てすぎだし、ディスクはすぐに足りなくなって、以下に書いたような image, volume の整理を頻繁にやらないといけないので不便。

[Docker オフィシャルドキュメント](https://docs.docker.com/articles/b2d_volume_resize/)ではデータ活かしたままディスクを拡張する方法書いてあるけど、開発環境なので image, volume, container など無くなっても問題ないのでやり直す。

参考: https://ryanfb.github.io/etc/2015/01/28/increasing_boot2docker_allocations_on_os_x.html

```:~/.boot2docker/profile
# Disk image size in MB
DiskSize = 100000
# Memory in MB
Memory = 1024
```

```shell-session
boot2docker stop
boot2docker destroy
boot2docker init
boot2docker start
```

##  (動いていない) container を削除

```sh
docker ps -aq | xargs 
```

## タグのついていない image を削除 
動いている container が使ってるものは除外される。

```sh
docker images | grep "^<none>" | awk '{print $3}' | xargs docker rmi
```

##  container が削除されてしまった volume を削除
うっかり data volume container を `-v` なしで削除すると残ってしまう。
docker 1.6 の段階ではオフィシャルな削除方法が無い。
https://github.com/chadoe/docker-cleanup-volumes

```sh
docker run -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker:/var/lib/docker --rm martin/docker-cleanup-volumes 
```
怖いときは --dry-run

## docker-spy - container 間で相互に通信した場合のお手軽 DNS サーバー
EDIT: 2015-12-13: FYI: Docker 1.9 network により同じ custom network 内の container 同士は /etc/hosts により名前で参照できるようになったので、 [docker-dns-proxy](https://github.com/hiroshi/docker-dns-proxy) では dnsmasq を使っています。

http://www.ivoverberk.nl/service-discovery-with-docker/

```sh
docker run --name docker_spy -p 53:53/udp -p 53:53 -v /var/run/docker.sock:/var/run/docker.sock iverberk/docker-spy  
```

```sh
docker run --dns 172.17.42.1 -h app.localdomain --rm -it centos:centos6 bash  
```

TIPS: nginx の resolver はデフォルトで ipv6 の "AAAA" record を探しに行き docker-spy が対応できないので

```
resolver 172.17.42.1 ipv6=off;
```


## 二度目の `docker-compose up` の前には
docker-compose により起動した container が存在する状態で up しようとすると、 bin/echo が無い image でも bin/echo を実行しようとして失敗するので、

```sh
docker-compose stop
docker-compose rm -f
```

ちなみにエラーはこんなやつ

```sh
Cannot start container 41fe5d69322cacc578b9251741c38f332c9939f19e90cc77105161ade0cfbb90: [8] System error: exec: "/bin/echo": stat /bin/echo: no such file or directory
```
【javascript】jQuery-ui.datepickerのインプットを３つにする方法

１．普通のテキストインプットを用意する

２．クラスを指定

```html:html
<input type=text id="xxx_date" name="xxx_date" class="datepicker" />
```

３．readyイベントで以下の処理を実行

```js:javascript

$(function(){
  $(".datepicker")
    .hide()
    .each(function(){

      //インプット本体
      var _p$ = $(this);
      var name = _p$.attr("name");

      var _y$ = $("<input type='text' name='"+name+"_y' maxlength='4' size='5' style='text-align:right;' />");
      var _m$ = $("<input type='text' name='"+name+"_m' maxlength='2' size='3' style='text-align:right;' />");
      var _d$ = $("<input type='text' name='"+name+"_d' maxlength='2' size='3' style='text-align:right;' />");

      $(this)
        .wrap("<span />")
        .before( _y$ )
        .before("<span> 年 </span> ")
        .before( _m$ )
        .before("<span> 月 </span> ")
        .before( _d$ )
        .before("<span> 日 </span> ")

      /* イベント定義 */
      // ▽datepicker操作▽
      _p$.on("change", function(){
        _y$.val( $(this).val().split("-")[0] );
        _m$.val( $(this).val().split("-")[1] );
        _d$.val( $(this).val().split("-")[2] );
      });
      // ▽YMDインプット操作▽
      _y$.add(_m$).add(_d$).on("change", function(){
        if( _y$.val() == "" || _m$.val() == "" || _d$.val() == "" ){
          _p$.val("");
          return false;
        }
        _p$.val(
               _y$.val()
          +"-"+_m$.val()
          +"-"+_d$.val()
        );
      });
    })
    .datepicker({
        showOn: "button"
        //,buttonImage: ""
        //,buttonImageOnly: true
        ,showOtherMonths: true
        ,dateFormat   : 'yy-mm-dd'
        ,onSelect    : function(data,inst){inst.input.trigger("change");}
    })
    .trigger("change");
});

```

隠したテキストからはyyyy-mm-dd形式の日付文字列が
年月日のテキストからはそれぞれの数値（name=xxx_date_y,xxx_date_m,xxx_date_d）が送信される。
必要な方だけ受け取りたい場合はいらない方のname属性を削除する。

(2015-07-06追記)
バグバグしてたので直しました。
具体的にはイベント定義以下。
[Metal] iOS Metalのちょっとしたメモ

細かい部分をちょくちょくメモ予定。

## float4x4の設定

シェーダ内で`float4x4`の値を生成するとき、CPU側のバッファでは普通に配列で作ったりしていたのでそのままの感覚でやったらビルドエラー。
`float4`型のものを4つ、指定する必要があるみたい。（まぁ冷静に考えれば当たり前なんだけど）

```metal
float4x4 mat = float4x4(float4( 1,  2,  3,  4),
                        float4( 5,  6,  7,  8),
                        float4( 9, 10, 11, 12),
                        float4(13, 14, 15, 16));
```

ちなみにCPU側から送る場合は、Objective-C++を使うなら`simd::float4x4`とかを使って、シェーダ側でも同じ型をそのまま使うのが手っ取り早そうです。
が、Objctive-Cでそれをやる場合は、2次元配列にして渡してやることで対応できます。

```objc
static const float mat[4][4] = {
	{ 1,  2,  3,  4},
	{ 5,  6,  7,  8},
	{ 9, 10, 11, 12},
	{13, 14, 15, 16},
};
```


## Metalシェーダの`[[]]`セマンティクス

セマンティクスっていうのか分からないけど、Cg/HLSLでいうセマンティクス的な感じのもの。

[ドキュメント](https://developer.apple.com/library/ios/documentation/Metal/Reference/MetalShadingLanguageGuide/func-var-qual/func-var-qual.html)はこちら。

結構量があるので、詳細はドキュメントを。


## フラグメント（ピクセル）を破棄する（discard）

フラグメントシェーダでピクセルを破棄するには以下のようにします。

```metal
fragment half4 frag(VertexOut input [[stage_in]]) {
	half4 color = half4(input.color);
	
	// なにがしかの条件を判定する
	if (anyCondition) {
		discard_fragment();
	}
	
	return color;
}
```

[ドキュメント](https://developer.apple.com/library/ios/documentation/Metal/Reference/MetalShadingLanguageGuide/std-lib/std-lib.html)には以下のようにあります。

>The following Metal function is used to terminate a fragment:

void discard_fragment(void)
Marks the current fragment as being terminated, and the output of the fragment function for this fragment is discarded.

つまり、ピクセルを破棄したい場合に`discard_fragment()`を実行することで、該当のピクセルを破棄することができるというわけです。
ただ見てもらうと分かる通り、 **色は普通に設定しつつそれを`return`しています。**

`discard_fragment()`を実行することで破棄される、というのがなんとなくモヤっとしますね。
*（OpenGLだと`discard`キーワードでそれを示す）*


## gl_FragCoord相当の処理

Metalでは以下のように使用します。
例は画面サイズを元にpositionを`-1〜1`に正規化する処理です。

```metal
struct VertexOut {
    float4 position [[position]];
};

struct Uniforms {
	float2 resolution;
};

fragment half4 frag(VertexOut input [[stage_in]],
					  constant Uniforms &uniforms [[buffer(0)]]) {
	float2 position = (input.position.xy * 2.0 - uniforms.resolution) / min(uniforms.resolution.x, uniforms.resolution.y);
	
	// ...
}
```


### Metalは座標が上下逆？

ちょっと検証しきれてないですが、↑のサンプルでWebGLではうまく動いていたものが微妙に違う挙動をしていたので確認したところ、`position.y`の値を逆転<del>（-1をかける）</del><ins>（1を引く）</ins>したら想定通りの挙動になりました。どうやら上下が逆のようです。

[2016.11.27 追記]
コメントで指摘もらいましたが、内容的には`1を引く`のが正しそうです。すみません。

ちなみに以下のようにして画面に対しての色を出力してみるとWebGLと比べて上下が逆になりました。
*（ただ、iOSのOpenGLも逆になっていた気がするのでiOS側の仕様かもしれません）*

```metal
fragment half4 frag(VertexOut input [[stage_in]], constant Uniforms &uniforms  [[buufer(0)]]) {
    float2 resolution = float2(uniforms.resolution[0], uniforms.resolution[1]);
    float2 position = (input.position.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
    return half4(position.x, position.y, 0.0, 1.0);
}
```


ちなみにWebGLで同様のことをやったのがこちら。
[実際に動いているやつ](http://glslsandbox.com/e#24822.0)

```glsl:webgl-ver
#ifdef GL_ES
precision mediump float;
#endif

uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;

void main( void ) {

	vec2 position = ( gl_FragCoord.xy  * 2.0 -  resolution ) / min(resolution.x, resolution.y);

	gl_FragColor = vec4(position, 0.0, 1.0);

}
```
Selenium WebDriver でIEのセキュリティ証明書警告画面を突破する方法

SeleniumでIE11上のテスト中にSSL証明書エラー（「このWebサイトのセキュリティ証明書には問題があります」の警告画面）が出てしまう場合の突破方法のメモ。


![スクリーンショット (2).png](https://qiita-image-store.s3.amazonaws.com/0/76324/77143889-84e5-f5b8-1797-443ef1e8ddb5.png)

<br/>
Seleniumを使ったエレメント指定はできないようなので、下記のようにJavaScriptを実行して「このサイトの閲覧を続行する」をクリックしたらいけました。

```
driver.execute_script("document.getElementById('overridelink').click();")
```
<br/>

*当然ですが「警告」画面なので、明らかに安全だと分かっている場合に（社内サーバーにあるステージングサイトなど）自己責任でやることになります。<br/>

根本的な解決方法はこちら→[自己証明書のhttpsサイトで証明書エラーを非表示にする手順](http://qiita.com/tukiyo3/items/f6592f9f99e363ed14bb)
（tukiyo3さん情報ありがとうございました）

<br/>
参考にした[ページ](https://www.linkedin.com/groups/How-we-can-handle-SSL-4067187.S.128415058)
PHPでかんたんに一意のIDを発行する方法



# uniqid()という関数を使う

> string uniqid ([ string $prefix [, bool $more_entropy ]] )
マイクロ秒単位の現在時刻にもとづいた、接頭辞つきの一意な ID を取得します。

[uniqid](http://php.benscom.com/manual/ja/function.uniqid.php)

現在時刻にもとづき13桁の文字列が発行される。

```php:
uniqid();
//5539e2d75cc2b
```
iTunes Connectで「ページにエラーが 1 個以上含まれています。」と表示される状態の解決法

iTunes Connectにてアプリを申請する際、「ページにエラーが 1 個以上含まれています。」とだけ表示。
どこが問題なのか不明だったが、以下を修正することで問題が解消。

確認する点は以下2点

- 価格が設定されているか
- バージョンのリリースが選択されているか

上記2点が問題の場合、赤で強調表示されなかったため原因が判明するまでに時間がかかった。。。
WordPressプラグインのユニットテスト用のWordPress環境をセットアップする


WordPressプラグインの開発にPHPUnitを導入するには、WP-CLIで以下のようなコマンドを実行すれば自動的にひな形をつくってくれます。

```
$ wp scaffold plugin <plugin-slug>
```

できあがるプラグインはこんな感じ。

```
├── .travis.yml
├── bin
│   └── install-wp-tests.sh
├── oreore.php
├── phpunit.xml
├── readme.txt
└── tests
    ├── bootstrap.php
    └── test-sample.php
```

でも意外とめんどくさいのが、これらのテストで使用されるWordPress環境の構築です。

ためしに`phpunit`といきなり叩いてみましょう。

```
$ phpunit 
PHP Warning:  require_once(/tmp/wordpress-tests-lib/includes/functions.php): failed to open stream: No such file or directory in /Users/miyauchi/www/dev.local/www/wordpress/wp-content/plugins/oreore/tests/bootstrap.php on line 6
```

WordPressがねえぞおらおらーという趣旨のエラーメッセージが出ます。

WP-CLIが自動的に生成するPHPUnitは`/tmp`以下にWordPressがセットアップされていることを前提としていて、セットアップ用のスクリプトが`bin/install-wp-tests.sh`というファイル名で用意されています。

基本的にはこのシェルスクリプトに引数を与えて叩けばいいのですが、頻繁につくったり捨てたりしないといけない環境なので、一度捨ててもっかい作り直すまでをだーって処理するためのシェルスクリプトを用意しました。

https://github.com/miya0001/install-wp-test-env

## 動作環境

ローカル（Macを前提）に以下の環境がセットアップされていることが前提です。

* phpunit
* wp-cli
* MySQLサーバー

あと、MySQLサーバーのrootパスワードが設定されていないことが前提です。

（あくまでもローカルのテスト環境です。外部から接続される環境は想定していませんからね！）

## 使い方

以下のコマンドを実行してください。

```
$ curl -L https://raw.githubusercontent.com/miya0001/install-wp-test-env/master/install.sh | bash
```
コマンドプロンプトでパスを通す！

#パスを通せって結構ありますよね。

setx /m path "%path%;c:/xxx/aa/bb"

mオプション: 対象をシステムの環境変数にする。つけないとユーザー個別の環境変数が対象になる

#確認方法

※プロセスを再起動する必要があります

echo %path%
or
set

setコマンド(オプションなし)は環境変数を一覧表示します。またsetxとの違いは一時的な設定であるかどうかです。

set:一時的
setx:恒久的
Ray.Di コンストラクタ束縛

# コンストラクタ束縛

`Ray.Di`には`@Inject`アノテーションの付いていないサードパーティーのクラスにも使用できる**コンストラクタ束縛** (`toConstructor` binding)という束縛があります。

## 実装例

複数のオブジェクトの利用でそれぞれは同じクラスでインスタンス化されていますが、別のオブジェクトのケースがあります。例えば接続先DBの違う複数のDBオブジェクトなどです。これは一般に [ロボットの足問題](http://tech.cm55.com/wiki/guice/RobotLegsProblem) (robot legs problem)として知られる問題です。

### 要件

設定の異なる[SolrClient](http://php.net/manual/ja/class.solrclient.php)を利用するための`SolarModule`を作成することを考えます。`SolarModule`のコンストラクタに渡す設定値は以下のとおり。

```php
$config = [
  'foo' => ['port' => 8080],
  'bar' => ['port' => 8081]
]
```

`bar`の設定でつくられた`SolrClient`は以下のセッターメソッドで受け取れるようにします。

```php
    /**
     * @Inject
     * @Named("bar")
     */
    public function setBarClient(\SolrClient $solrClient)
    {
```

### 実装コード

```php
<?php

require dirname(__DIR__) . '/vendor/autoload.php';

use Ray\Di\AbstractModule;
use Ray\Di\Di\Inject;
use Ray\Di\Di\Named;
use Ray\Di\Injector;

class SolarModule extends AbstractModule
{
    private $config;

    public function __construct(array $config)
    {
        $this->options = $config;
    }

    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        foreach ($this->config as $name => $option) {
            $optionName = "options.solr.{$name}";
            // SolrClientのコンストラクタ引数$clientOptionsに"options.solr.{$name}"という名前を動的につけます。
            $this->bind(\SolrClient::class)->annotatedWith($name)->toConstructor(
                \SolrClient::class,
                "clientOptions=$optionName"
            );
            // "options.solr.{$name}"に値を直接束縛しています。
            $this->bind()->annotatedWith($optionName)->toInstance($option);
        }
    }
}

class IndexPage
{
    /**
     * @var \SolrClient
     */
    private $fooSolrClient;

    /**
     * @var \SolrClient
     */
    private $barSolrClient;

    /**
     * @Inject
     * @Named("foo")
     */
    public function setFooClient(\SolrClient $solrClient)
    {
        $this->fooSolrClient = $solrClient;
    }

    /**
     * @Inject
     * @Named("bar")
     */
    public function setBarClient(\SolrClient $solrClient)
    {
        $this->barSolrClient = $solrClient;
    }

    public function showOptions()
    {
        var_dump($this->fooSolrClient->getOptions()['port']);
        var_dump($this->barSolrClient->getOptions()['port']);
    }
}

$config = [
  'foo' => ['port' => 8080],
  'bar' => ['port' => 8081]
];
$injector = new Injector(new SolarModule($config));
/** @var $page IndexPage */
$page = $injector->getInstance(IndexPage::class);
$page->showOptions();

//int(8080)
//int(8081)
```

## 結論

`toConstructor`束縛は依存の構造を明らかにするため`Provider`束縛よりクリーンに記述でき、この例のような動的な束縛にも向いています。
Maximaで点をplotする

plot2dを使ってdata.txtに書かれた値をplotする。

```data.txt
0 0
1 2
2 4
3 6
4 8
5 10
```
こんな感じのdata.txtを用意する。左がx座標、右がy座標。

maximaを起動して
```
data: transpose(read_matrix("/path/to/data.txt"));
plot2d([discrete,data[1],data[2]],[style,points]);
```
これで、点がプロットされる。style,pointsを消せば、直線が表示される。
data[1],data[2]というのが、最初に取り込んだdata.txtの列を表しているので
この値を変えれば、どの列をどの座標の値にするかを変更できる(はず)

### 参考資料  
http://maxima.sourceforge.jp/maxima_12.html
AppCompat22.1.0でFragmentにAppComatXXViewが適用されない

> **この記事の事象は、AppCompat 22.1.1で修正済みです。**


# バグの事象

22.1.0のAppCompatActivity(旧ActionBarActivity)を適用すると、FragmentのinflateにActivityのLayoutInflaterが適用されない

https://code.google.com/p/android/issues/detail?id=169760#c1

既に、Future Relaseになってますが、現時点の対応方法として2つあります。

# 修正方法その1

22.1.0以前の実装を自分で書いてやればいいだけです。
BaseActivityを作っている人は1行で終わります。

```java:BaseActivity
public class BaseActivity extends AppCompatActivity {

    @Override
    public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
        // DelegateのcreateView()をreturnするようにする
        return getDelegate().createView(parent, name, context, attrs);
    }

}
```

# 修正方法その2

Issueコメントにあるように、引数のLayoutInflaterではなく、getActivity().getLayoutInflater()を利用します。

```java:HogeFragment

public class HogeFragment extends Fragment {

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // getActivity().getLayoutInflater()を使う
        return getActivity().getLayoutInflater().inflate(R.layout.fragment_security, null, false);
    }
}
```
git管理している別ブランチの特定ファイルをvimで画面分割して開く

- fugitiveとはvimからGitを操作できるようにするもの

インストールはNoeBundleを使っているなら以下をvimrcに追加

```
" Gitを使うプラグイン
NeoBundle 'tpope/vim-fugitive'

```

タイトルにある
「他ブランチの特定ファイルを画面分割して開く」はこちら

```
:Gvsplit BRUNCH_NAME:PATH_TO_FILE
```

その他のコマンドは調べるかhelpを見る

```
:h fugitive
```
logrotateで世代数が壊れる現象

`/var/log/messages`とかがなぜかすごい世代数分残る現象が発生していた。
`logrotate`の`-d`オプションで設定を眺めてみたら、**52**世代残すことになっていた。
しかし、`/var/log/messages`が設定されている`/etc/logrotate.d/syslog`には、世代数の設定がない。
`/etc/logrotate.conf`では世代数が**4**となっていて、**52**はいったいどこから来ているのかと思ったら、`/etc/logrotate.d/glusterfs`に原因があった。
このファイルの冒頭部分は以下のようになっていた。

```
# perform the log rotate every week
#
weekly
# keep the backup of 52 weeks
rotate 52
missingok

# compress the logs, but from the .2 onwards
compress
delaycompress
notifempty

# Rotate client logs
/var/log/glusterfs/*.log {
```

つまり、グローバルなところが汚染されているようだ。
このファイルは、`/etc/logrotate.conf`にある`include /etc/logrotate.d`で読み込まれるはずなので、ファイル名順でこのファイルより後ろにあるファイルが影響を受けると思われる。(未確認)

この部分は以下の修正が入っている模様。
[logrotate: gluster logrotate config should not be global](https://github.com/gluster/glusterfs/commit/a5d73daabf6df95bc73b186d92f3e2d1239a6f8a#diff-3eaf22eded4f3fbcabeef0314ea1e920)
なので、GlusterFS最新版を入れている場合はおそらく問題ない。
プロキシ,有線LAN,固定IP等の悪環境の中でOSXを再インストールする

OSXユーティリティの画面でコマンドラインを立ち上げ、以下を入力。

1.次のコマンドを使って、利用可能なネットワークインターフェースのリストを表示する。

```
networksetup -listnetworkserviceorder
```

以下が表示されるので、変更したいインターフェースを確認し、

```
$ networksetup -listnetworkserviceorder
(1) Ethernet
(Hardware Port: Ethernet, Device: en0)

(2) AirMac
(Hardware Port: AirPort, Device: en1)

(3) FireWire
(Hardware Port: FireWire, Device: fw0)

(4) Bluetooth DUN
(Hardware Port: Bluetooth DUN, Device: Bluetooth-Modem)
```

2.IP アドレス、サブネットマスク、およびルーターを設定します。次の例では、Ethernetインターフェースを使います。

```
networksetup -setmanual "Ethernet" xxx.xxx.xxx.xxx(固定IP) xxx.xxx.xxx.xxx(サブネットマスク) xxx.xxx.xxx.xxx(デフォルトゲートウェイ)
```

3.DNS サーバを設定します。次の例では、Ethernetインターフェースを使います。

```
networksetup -setdnsservers "Ethernet" xxx.xxx.xxx.xxx(プライマリ) xxx.xxx.xxx.xxx(セカンダリ)
```

4.(必要に応じて)プロキシを設定します。

```
networksetup -setwebproxy "Ethernet" <domain> <port> on <user> <pass>
```

5.ターミナルを終了して、インストールを続行します。


参考:[DHCP サービスが利用できない場合に Lion 復元機能を使う](https://support.apple.com/ja-jp/HT200168)
Goでパッケージ外非公開の構造体フィールドを参照する

golangでパッケージ外非公開の構造体フィールドを無理矢理に取得してくる方法です。
実例として`websocket.Conn`の`rwc`がほしいケースがあったのでそれを参考に。
https://godoc.org/golang.org/x/net/websocket

```go
func getNetConn(ws *websocket.Conn) (n net.Conn) {
  v := reflect.ValueOf(ws).Elem().FieldByName("rwc")
  if !v.CanAddr() {
    log.Fatalf("Can't addr")
  }
  // アドレスからnet.Conn型に変換
  n = (*(*interface {M()})(unsafe.Pointer(v.UnsafeAddr()))).(net.Conn)
  return
}
```

`reflect`パッケージを使って`rwc`のValueをとってきます。
`net.Conn`にキャストしたいのですが`Interface()`はunexportedな構造体メンバに使えないので一旦アドレスに変換。
`reflect`内の[コード](http://golang.org/pkg/reflect/#Value.Interface)を参考にして無理くりにやってみました。

なんか将来的にできなくなりそうな臭いもしますが…。golang 1.3では動くみたいです。

golangだとそもそもこういうことをすべきではない、ライブラリを直してもらうべき、という話なんでしょか。
golangのお作法がわかっていないのでもっといい方法があれば教えてもらえると嬉しいです。
inputのchangeイベントが発火しない時の対処法

#inputのオートコンプリート問題

input[type="date"]などに入力する際は専用のオートコンプリートが提供されますが、
端末によってchangeイベントが発火しない場合があります。（検証ではHTL21, SC-06Dで再現）
そうなると、ngModelが更新されず困ったことになります。

例えば、validでないとsubmitが押せないようにしていると、入力したのにボタンが押せないという不具合になります。

```html
<form name="form" novalidate>
  <input type="date" name="date" ng-model="user.date" required>
  <button ng-click="update(user)" ng-disabled="form.$invalid || isUnchanged(user)">SAVE</button>
</form> 
```

# 対処

directiveなどで要素とngModelを監視して同期させます。

```html
<form name="form" novalidate>
  <input type="date" name="date" ng-model="user.date" required input-date>
  <button ng-click="update(user)" ng-disabled="form.$invalid || isUnchanged(user)">SAVE</button>
</form>

```

```coffeescript
app.directive "inputDate", [
  "$interval"
  ($interval) ->
    return {
      restrict: "A"                                                                                                                                                                          
      require: "ngModel"                                                                                                                                                                     
      link: (scope, element, attrs, ngModel) ->                                                                                                                                              
        interval = $interval (->                                                                                                                                                             
          if ngModel.$viewValue != element.val()                                                                                                                                             
             ngModel.$setViewValue element.val()                                                                                                                                              
        ), 500                                                                                                                                                                              

        # ページ遷移時に$intervalをcancelする                                                                                                                                                                                     
        scope.$on '$stateChangeStart', () ->                                                                                                                                                 
          if angular.isDefined interval                                                                                                                                                      
             $interval.cancel(interval)                                                                                                                                                       
             interval = undefined  
    }
]
  
```
homebrewのupdateでコケる

```
$ brew update
```
したら

```
Error: Failure while executing: git checkout -q master
```
と出て失敗するときの対処法。  

```
$ cd /usr/local
$ git fetch origin
$ git reset --hard origin/master
```
でOK。  
  
[参考]  
[brew update fails · Issue #5128 · Homebrew/homebrew · GitHub](https://github.com/Homebrew/homebrew/issues/5128#issuecomment-981388)
AndroidのJUnit時にスクリーンロックを解除する方法

AndroidでActivityInstrumentationTestCase2を使ってJUnitのテストを実行させるとき、スクリーンロック(キーガード)が掛かっていてActivityが起動できないときの対処法です。
ただし、PINロックやパターンロックが掛かっているときはこの手法では外せないので注意してください。

[サンプルプロジェクト](https://github.com/cattaka/FastCheckList)

まずスクリーンロックを解除するだけのActivityをテスト側のコードに作ります。

```java
public class UnlockKeyguardActivity extends Activity {
    private static Handler sHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_unlock_keyguard);

        Window window = this.getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    }

    @Override
    protected void onResume() {
        super.onResume();
        sHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                checkUnlocked();
            }
        }, 100);
    }

    private void checkUnlocked() {
        KeyguardManager km = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        if (!km.inKeyguardRestrictedInputMode() && pm.isScreenOn()) {
            finish();
        } else {
            sHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    checkUnlocked();
                }
            }, 100);
        }
    }
}
```

次にUnlockKeyguardActivityをテスト側のAndroidManifest.xmlに追加する。
このときにandroid:exported="true"にしておくのが大事。

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.cattaka.android.fastchecklist.test"
    >
    <application>
        <activity
            android:name="net.cattaka.android.fastchecklist.test.UnlockKeyguardActivity"
            android:exported="true"/>
    </application>

</manifest>
```

そしてテストの開始時(setUpなど)にキーガードが掛かっているかチェックして、掛かっていたらUnlockKeyguardActivityを起動する処理を追加する。

```java
    protected void setUp() throws Exception {
        super.setUp();
        {   // Unlock keyguard and screen on
            KeyguardManager km = (KeyguardManager) getInstrumentation()
                .getTargetContext().getSystemService(Context.KEYGUARD_SERVICE);
            PowerManager pm = (PowerManager) getInstrumentation()
                .getTargetContext().getSystemService(Context.POWER_SERVICE);
            if (km.inKeyguardRestrictedInputMode() || !pm.isScreenOn()) {
                Intent intent = new Intent(getInstrumentation().getContext(),
                    UnlockKeyguardActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                getInstrumentation().getTargetContext().startActivity(intent);
                while (km.inKeyguardRestrictedInputMode()) {
                    SystemClock.sleep(100);
                }
            }
        }
    }
```

ActivityInstrumentationTestCase2から派生させたクラスに実装し、そのActivityのテストではそのクラスを継承して書くようにすれば自動でスクリーンロックを解除して開始してくれるようになる。
SkinnyFrameworkでユーザ画面と管理画面のデザインを変える方法

Webアプリでは１つのアプリ上にユーザ向けのエリアと管理用のエリアを持つことがよくあると思います。そのときには、ユーザ画面向けと管理画面向けでデザインやエラー画面の内容を切り替える必要があります。

SkinnyFrameworkでそのようなユーザ画面と管理画面での表示内容を出し分ける方法を紹介します。


ベースのレイアウトを切り替える
---

LayoutSwitchFeatureトレイトは、ビューの基板となるレイアウトファイルを切り替える機能を提供します。
このトレイトをコントローラにmixinし、defaultLayoutを設定することでレイアウトを変更できます。

```scala:LayoutSwitchFeature.scala
trait LayoutSwitchFeature extends SkinnyWebPageControllerFeatures {

  // コントローラに対するデフォルトレイアウト名(ex:"default.ssp")
  protected def defaultLayout: Option[String] = None

  /* レイアウトを設定するためにオーバーライド */
  override def render(path: String)(implicit format: Format = Format.HTML): String = {
    defaultLayout.foreach { l =>
      layout(l)
    }
    super.render(path)(format)
  }

}
```


エラー画面を切り替える
----

CustomErrorPageFilterは、haltWithBodyの呼び出しや例外発生時のエラー画面で使われるビューファイルのパスを変更します。


```scala:CustomErrorPageFilter.scala
package filter

import skinny.filter.SkinnyRenderingFilter

/**
 * エラーハンドリング用フィルタ
 */
trait CustomErrorPageFilter extends SkinnyRenderingFilter {

  protected def errorPagePath = ""

  override protected def haltWithBody[A](httpStatus: Int)(implicit format: Format = Format.HTML): A = {
    val body: String = format match {
      case Format.HTML => render(s"${errorPagePath}/error/${httpStatus}")
      case _ => renderWithFormat(Map("status" -> httpStatus, "message" -> ResponseStatus(httpStatus).message))
    }
    Option(body).map { b =>
      halt(status = httpStatus, body = b)
    }.getOrElse {
      halt(status = httpStatus)
    }
  }

  addRenderingErrorFilter {
    case e: Throwable =>
      logger.error(e.getMessage, e)
      try {
        status = 500
        render(s"${errorPagePath}/error/500")
      } catch {
        case e: Exception => throw e
      }
  }

}
```

コントローラの基底クラス群
----

上記の２機能を用意した上で、コントローラの基礎部分を以下の様に作成します。
この例は、今回の内容のみに特化したシンプルなものですので、実際には各機能ごとに色々な拡張がされると思います。


```scala
// アプリ全体のコントローラ基底trait
trait ApplicationControllerFeature extends LayoutSwitchFeature
  with AppErrorPageFilter

// ユーザ画面系のコントローラ基底trait
trait UserControllerFeature extends ApplicationControllerFeature

// 管理画面系のコントローラ基底trait
trait AdminControllerFeature extends ApplicationControllerFeature {
  override protected val errorPagePath = "/admin"
  override protected val defaultLayout = Some("admin.ssp")
}

// 管理画面用のSkinnyResource
trait AdminResource extends SkinnyResource {
  override protected def resourcesBasePath = s"/admin/${toSnakeCase(resourcesName)}"
  override protected def viewsDirectoryPath = s"/admin/${resourcesName}"
}
```

使い方
-----

ここまでの準備ができてしまえば、実際のコントローラは以下の様に普通に実装して行けばよくなります。

```scala
// ユーザ画面のルートパス("/"下)に対応するコントローラ
class RootController extends SkinnyController
    with UserControllerFeature {
  def index = render("/index")
}

// 管理画面のルートパス("/admin/"下)に対応するコントローラ
class AdminRootController extends SkinnyController
    with AdminControllerFeature {
  def index = render("/admin/index")
}
```

ビューファイルに関しては、以下のようなファイルレイアウトになります。

```
src/main/webapp/WEB-INF/
+ layouts/
  - default.ssp (ユーザ画面用レイアウト)
  - admin.ssp (管理画面用レイアウト) 
+ views/
  + root/ ("/"階層に対応する。ユーザ画面用のルートページ)
  + error/ (ユーザ画面用のエラーページ)
  + admin/ ("/admin"階層に対応する。管理画面用のページ)
    + error/ (管理画面用のエラーページ)
```
FuelPHPでHTTPS通信へリダイレクトする方法

FuelPHPでHTTP通信が来た場合にHTTPS通信へリダイレクトする方法

```php:rest.php
public function before() {
    // HTTP通信ならリダイレクトする
    if (!strstr(Input::protocol(), 'https')) {
        $url = 'https://' . Input::server('HTTP_HOST') .  Input::server('REQUEST_URI');
        Response::redirect($url, 'location', 301);
        die;
    }
    return parent::before();
}
```

die; が要るのかは謎です。

参考サイト
[FuelPHP method-specific, controller-based SSL solution](https://gist.github.com/rickharris/1304847)
[FuelPHP1.6、Inputクラスの中身を理解する。](http://piyopiyocs.blog115.fc2.com/blog-entry-583.html)