OmniAICreator/Qiita-1.07M huggingface dataset:
ETag等の比較で更新をチェックしてリソースを取得したい

追記：[`inject`メソッドで書き直した](http://qiita.com/hadzimme/items/1c82ab9b3629a41640a1)。

レスポンスヘッダでETagやLast-Modifiedを提供しているリソースへアクセスするとき、最終更新時と比較しつつ、定期的に更新をチェックするようなプログラムを書きたいときがあるだろう。ETagであれば、どこかに直前のETagを保持しておいて、次のリクエストヘッダに含めてGETするようなループを書けば良さそうだ、というところまでは思い当たる。しかし、「キモーイ」「変数に状態を持たせておいて、それをループの中で何度も書き換えたりするのが許されるのは小学生までだよね」「キャハハハハハ」と言われてしまったら……一体どのようにこれを実現すればいいのだろうか。

最終的にやりたいことをRubyで書くと、以下のようになる。

```rb
c = Crawler.new

c.start do |response|
  # 更新があるごとに何かする
end
```

これなら、`start`メソッドの中にイイカンジでyield的なものを書けば行けるだろうと思ったのだけど、ETagを次の処理に渡すのがなかなかうまくできなかった。FIFOっぽいなと思って、結局`Queue`を使って書いた。

```rb
require "logger"
require "open-uri"
require "thread"

$logger = Logger.new($stderr)
$logger.level = Logger::DEBUG

class Crawler
  def initialize(interval)
    @queue = Queue.new
    @interval = interval
  end

  def start(&block)
    t = Thread.start(block) do |block|
      while connection = @queue.shift
        response = connection.start
        block.yield(response)
        sleep @interval
        @queue << Connection.new(@interval, response.meta["etag"])
      end
    end
    @queue << Connection.new(@interval)
    t.join
  end
end

class Connection
  ENDPOINT = URI("https://example.com/index.rss")
  OPTION = {
    read_timeout: 5,
  }

  def initialize(interval, etag = "")
    @interval = interval
    @etag = etag
  end

  def start
    open(ENDPOINT, OPTION.merge("If-None-Match" => @etag))
  rescue OpenURI::HTTPError
    sleep @interval
    retry
  rescue => e
    $logger.warn("%s: %s" % [e.class, e.message])
    sleep @interval
    retry
  end
end
```

うーん。スレッドの処理をもう少しコンパクトに書きたいところ。ロガーの書き方も、もうちょっと考えましょう。

以下のようなコードを書けば、3秒おきにリソースにアクセスして、更新があったときに本体を取得できる。このコード自体は、起動すると、更新があるごとに新しいETagを延々とログに吐く。

```rb
c = Crawler.new(3)

c.start do |response|
  $logger.info(response.meta["etag"])
end
```
JavaSE(JDK)をインストールしたら必ずやっておきたい設定

## はじめに
インストール直後に実施する設定をまとめます。

## 作業手順
### 乱数生成に伴うJVMの遅延の回避
   (Oracleを使っている場合は特に..かな)

```properties:$JAVA_HOME/jre/lib/security/java.security
#securerandom.source=file:/dev/random
securerandom.source=file:/dev/urandom
```
参考: [乱数生成に伴う JVM の遅延の回避](http://otndnld.oracle.co.jp/document/products/E13153_01/wlcp/wlss40/configwlss/jvmrand.html)

### DNSキャッシュがリフレッシュされない問題の回避

```properties:$JAVA_HOME/jre/lib/security/java.security
#networkaddress.cache.ttl=-1
networkaddress.cache.ttl=600
networkaddress.cache.negative.ttl=10
```

### AES128までしか使えない等の問題の回避
Java Cryptography Extension (JCE)を"Unlimited Strength Jurisdiction Policy Files"版に差し替えます。

- [Java6用](http://www.oracle.com/technetwork/jp/java/javase/downloads/jce-6-download-429243.html)
- [Java7用](http://www.oracle.com/technetwork/jp/java/javase/downloads/jce-7-download-432124.html)
- [Java8用](http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html)

zipファイルをダウンロードして解凍すると、以下のファイルがあります。

```
US_export_policy.jar
local_policy.jar
```
これらのファイルを

```
$JAVA_HOME/jre/lib/security
```
の中にある同名のファイルに上書きしてください。

## 動作確認
Tomcatなどのアプリケーションサーバを運用している場合は、設定変更後にアプリケーションサーバを再起動してください。
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_131
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.3
	- JDK 1.8.0_131

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
ubuntuで'configure: error: OpenSSL support explicitly requested but OpenSSL could not be found'が出た時の対処法

初投稿です。
あるライブラリーで./autogen.shと叩いたところ、
`configure: error: OpenSSL support explicitly requested but OpenSSL could not be found`
なんていうエラーが表示された。
opensslインストールしてるはずなのに見つからないらしい。
困ったので、とにかくエラー文そのままGoogleに聞いてみたら出てきた(^^)

[http://superuser.com/questions/371901/openssl-missing-during-configure-how-to-fix](http://superuser.com/questions/371901/openssl-missing-during-configure-how-to-fix)
なんかヘッダファイル?が必要らしい(なんで最初からないのかはよく分かんない(--))
とにかく書いてる通り
`sudo apt-get install libssl-dev`
でインストールしたらopenssl認識できたみたい。
とにかく、めでたしめでたし╭( ･ㅂ･)و ̑̑
We suggest a virtual four-dimensional pixel. 仮想四次元空間ピクセルを提案する。 実装プラットフォームImplementation platform Qiita 4D(T,X,Y,Z(Time,x,y,z)Consider For　 Research Positioning Factory) 

![image](https://qiita-image-store.s3.amazonaws.com/0/109900/d108e639-8d82-22bd-aee8-7f02a9583a2d.png)
[MySQL] InnodbのFULLTEXTインデックスが更新されない現象

``InnoDB``で``FULLTEXT``インデックスをはったカラムを``update``で更新したとき
そのカラムに対する``FULLTEXT``インデックスが更新されないという現象が発生。
調べてみると、サーバーの設定が必要だったので記録しておきます。


[12.9.6 MySQL の全文検索の微調整](https://dev.mysql.com/doc/refman/5.6/ja/fulltext-fine-tuning.html)の【InnoDB 全文インデックスの最適化】を参照＠dev.mysql.com


### サーバーを止めないで変更

```shell-session:console
mysql> set GLOBAL innodb_optimize_fulltext_only=ON;
```

### サーバー再起動するなら

``my.cnf``に追記

```text:my.cnf
[mysqld]
innodb_optimize_fulltext_only = ON
```

[innodb_optimize_fulltext_only](http://dev.mysql.com/doc/refman/5.6/ja/innodb-parameters.html#sysvar_innodb_optimize_fulltext_only)の説明＠dev.mysql.com
ConoHaのVMをVisualStudio上のpython-openstackclientで、Debugモードで操作するデモ

下記 Youtubeは Windows 10 、Visual Studio 2015にて

 - Python Projectを作ってVirtual Environmentを作成、
 - pipで python-openstackclient をダウンロードし実行、
 - ConoHa2のVMを作成しながらOpenStack標準Clientで操作すること

をDemoします。

実行中の環境変数の部分は以下のようです。
すべてConoHaのコンパネで取れます。
```
OS_USERNAME=gncu26535051
OS_TENANT_NAME=gnct26535051
OS_PASSWORD=<your own password>
OS_AUTH_URL=https://identity.tyo1.conoha.io/v2.0
OS_REGION_NAME=tyo1
OS_IMAGE_API_VERSION=2
OS_VOLUME_API_VERSION=2
```


下記のイメージをClickするとyoutube動画に行きます。
レコードツールは、Windows10の「Winキー+G」でやった。
[![youtube video](http://img.youtube.com/vi/674QPSS_xdU/0.jpg)](http://www.youtube.com/watch?v=674QPSS_xdU)
ターミナルでSwiftを使う

$ mkdir projects-swift
$ cd projects-swift

``` hello.swift
#!/usr/bin/env swift

let name = "Jobs"
print("I'm Steve" +  name)
```
$ swift hello.swift
I'm SteveJobs

参考
http://qiita.com/merrill/items/be12ea2e1f3cb8304ee2
http://marui.hatenablog.com/entry/2015/03/26/113659
JSPタグを利用してBeanクラスの値を画面表示

## 概要
エンティティモデル(Bean）に設定したデータは
JSPタグを用いてブラウザ画面に表示できる。

## Java
ロジックとBeanを以下に記載する。

### ロジック

Javaプログラム内でBeanにデータをセットする。



	import bean.BeanSample;
	
	public class BeanController extends HttpServlet{
	
		@Override
		protected void doGet(HttpServletRequest req, HttpServletResponse	 resp)
				throws ServletException, IOException {
			this.doPost(req, resp);
		}
	
		@Override
		protected void doPost(HttpServletRequest req, HttpServletRespons	e resp)
				throws ServletException, IOException {
	
			ArrayList<BeanSample> beans = new ArrayList<BeanSample>();
			BeanSample bean = new BeanSample();
	
			bean.setBeanId("001");
			beans.add(bean);
	
			req.setAttribute("beanData", beans.get(0));
	
	
			RequestDispatcher rd = req.getRequestDispatcher("/beanSample.jsp");
			rd.forward(req, resp);
	
		}
	
	}

### Bean

BeanはGetter/Setterメソッドを用意する。


	public class BeanSample {
	
		String beanId = null;
	
		public String getBeanId() {
			return beanId;
		}
	
		public void setBeanId(String beanId) {
			this.beanId = beanId;
		}
	
	}

## JSP

「<jsp:useBean>」、「<jsp:getProperty>」タグを見てほしい。
各タグの要素は以下を指定している。

id：BeanControllerにてsetAttributeで設定した"BeanData"
class：「bean.BeanSample」はBeanの完全限定クラス名
property：BeanSample定義しているメンバ変数


	<%@ page language="java" contentType="text/html; charset=UTF-8"
	    pageEncoding="UTF-8"%>
	<html>
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>ビーンサンプル</title>
	</head>
	<body>
	<jsp:useBean id="beanData" class="bean.BeanSample" scope="request" />
	<jsp:getProperty name="beanData"  property="beanId"/>
	</body>
	</html>
ReactJS入門@ES6:コンポーネント編

**対象者：私を含むReact初心者**
次：[ReactJS入門@ES6:ReactRouter編](http://qiita.com/HIGAX/items/e7696fec353203453c0b)

***

### コンポーネントの作成方法

React.Componentを継承し**render**メソッドを実装したクラスがコンポーネントです。

```js
class Table extends React.Component {
  render() {
    return (
      <div>Table Component</div>
    )
  }
}
```

***

### コンポーネントが扱うデータ

#### 1\. props

propsはコンポーネントに渡されるデータです。
propsは**変更不可のデータ**です。

```js
<Table name="hoge" />
```

```js
class Table extends React.Component {
  render() {
    return (
      <div>
        <div>Table Component</div>
        <div>{this.props.name}</div> // hoge
      </div>
    )
  }
}
```

#### 2\. state

stateはコンポーネント自身のデータです。
stateはconstructorメソッドの内部で初期化します。

```js
class Table extends React.Component {
  constructor() {
    super();
    this.state = {
      checked: false
    };
  }
}
```

stateの追加や更新にはsetStateメソッドを使用します。
state全体を入れ替える場合は、replaceStateメソッドを使用します。

```js
class Table extends React.Component {
  constructor() {
    super();
    this.state = {
      checked: false
    };
  }
  onClick() {
    this.setState({ checked: !this.state.checked }); // state.checkeを更新
    this.setState({ unchecked: true }); // state.uncheckedを追加
  }
}
```

**注意**
setStateメソッドを実行後、即時にstateに反映されません。
stateを確実に取得したい場合は、setStateメソッドに関数を渡し、
コールバックで受け取る方法が用意されています。

```js
  constructor() {
    super();
    this.state = {
      name: 'NAKAMURA'
    };
  }
  onClick() {
    this.setState(
      (state, props) => { return {name: 'KINJO'} },
      () => { console.log(this.state) } // この時点のstate.nameは [KINJO]
    );
    console.log(this.state.name); // この時点のstate.nameは [NAKAMURA]
  }
```

***

### コンポーネントのthisのBind

ボタンのクリックイベントを拾いthis.onClickを呼び出す場合、
下記のコードはthis.onClickがundefinedとなり動作しません。

```js
class Table extends React.Component {
  onClick() {
    // ここにクリック時の処理を書く
  }
  render() {
    return (
      <div>
        <button onClick={this.onClick}>ボタン</button> // NG
      </div>
    )
  }
}
```

解決方法は

1. コンストラクタ内でbindする ```this.onClick = this.onClick.bind(this);```
2. JSX内でbindする ```<button onClick={this.onClick.bind(this)}>...```
3. ES7のBind Syntaxを使用する ```<button onClick={::this.onClick}>...```

などがあります。
個人的にはES7のBind Syntaxがシンプルだと思います。
（ES7を使用するリスクを忘れずに）

```js
class Table extends React.Component {
  constructor() {
    super();
    this.onClick = this.onClick.bind(this); // EX:1
  }
  onClick() {
    // ここにクリック時の処理を書く
  }
  render() {
    return (
      <div>
        <button onClick={this.onClick.bind(this)}>ボタン</button> // EX:2
        <button onClick={::this.onClick}>ボタン</button> // EX:3
      </div>
    )
  }
}
```
cocoapods Mac command not found: pod解決策

```
$ sudo gem install cocoapods
$ pod setup
-bash: pod: command not found
```
こうなった方のための解決策
```
$ rbenv rehash
$ pod
Usage:

    $ pod COMMAND

      CocoaPods, the Cocoa library package manager.

Commands:

    + cache      Manipulate the CocoaPods cache
    + init       Generate a Podfile for the current directory.
    + install    Install project dependencies to Podfile.lock versions
    + ipc        Inter-process communication
    + lib        Develop pods
    + list       List pods
    + outdated   Show outdated project dependencies
    + plugins    Show available CocoaPods plugins
    + repo       Manage spec-repositories
    + search     Search for pods.
    + setup      Setup the CocoaPods environment
    + spec       Manage pod specs
    + trunk      Interact with the CocoaPods API (e.g. publishing new specs)
    + try        Try a Pod!
    + update     Update outdated project dependencies and create new Podfile.lock

Options:

    --silent     Show nothing
    --version    Show the version of the tool
    --verbose    Show more debugging information
    --no-ansi    Show output without ANSI codes
    --help       Show help banner of specified command
```
以上。
JupyterのR kernel使用時に日本語を含むグラフを描く

Jupyterではいろいろなプログラム言語をkernelとして指定できます。Rもその１つで、インタラクティブに結果を表示しながら解析するのは楽しいし、効率的です。ただ、日本語フォントを含むグラフに関しては、R.exeに比べて、設定に少し癖があります。ここではうまくいったやり方を紹介します。

## 動作環境
Mac OS X 10.10.5(Yosemite)
R version 3.2.3
Xquartz　2.7.8
Ipython Notebookをhttp://localhost:8888で起動

## うまくいったコード
```r
#明示的にquartzデバイスを起動
quartz()
#font-familyをpar関数で指定
par(family = "HiraKakuProN-W3")
#plot関数で描画
plot(0,0, xlab = "日本語", ylab = "日本語")
#quartzデバイスを定位
dev.off()

```

- quartzデバイスを明示的に起動しないで、par関数でフォントファミリーを指定すると描画そのものは日本語でなされますが、警告が１文字についき１回出てきます。

- quartzデバイスの引数としてfamilyでフォントファミリーを指定しても文字化けのままです。

- dev.off関数でquartzデバイスを停止しないとアプリケーションとして起動したXQuartz.appが起動しっぱなしになってしまいます。

今のところうまくいくやり方なので、これを使っていますが、もしかしたら何か意味のないこともやっているかもしれません。

## ２０１６年９月１２日追記
上記のやり方では、うまく日本語が表示されなくなりました。原因を調査していますが、まだわかっていません。
対処法として以下のようにコードを書くと一応日本語を含む画像が表示できます。

## 暫定的な対処コード
```r
#明示的にquartzデバイスを起動
#pngファイルに保存するようにtypeとfileを設定
quartz(type = "png", file = "test.png")
#font-familyをpar関数で指定
par(family = "HiraKakuProN-W3")
#plot関数で描画
plot(0,0, xlab = "日本語", ylab = "日本語")
#quartzデバイスを定位
dev.off()

```
次のセルをマークダウン形式にして画像を呼び出し
```
![testpng](test.png)
```

ここでtypeをpdfにしたいかもしれませんが、ブラウザによって表示がうまくいくものと行かないものがあります。Chromiumベースのブラウザ（Chrome, FireFox）は表示ができません。safariではうまく表示できました。
A docker image for parse-server

![1-XpcOl_IPoFxj5-0jVCSc5A.png](https://qiita-image-store.s3.amazonaws.com/0/64396/9d41a003-7699-ca7b-5f82-0d2d9205080f.png)

# Migration of Parse Server with docker (Part1)

overview:

![1-MR1qKOVXd2NFJ5daJIFAeA.png](https://qiita-image-store.s3.amazonaws.com/0/64396/79be2207-b4b6-fa11-5f28-1acdb6fb3a8e.png)


## Setup parse server with docker

```shell-session
docker run -d -p 27017:27017 --name mongo mongo
docker run -d -e APP_ID={appId} -e MASTER_KEY={masterKey} -e FILE_KEY={fileKey} -p 1337:1337 --link mongo yongjhih/parse-server
```

That’s it.

Or with docker-compose

```shell-session
wget https://github.com/yongjhih/docker-parse-server/blob/master/docker-compose.yml
APP_ID=myAppId MASTER_KEY=myMasterKey docker-compose up
```

* api: http://localhost:1337/
* db: mongodb://localhost:27017/dev

## References

* Docker image source code: https://github.com/yongjhih/docker-parse-server
* Official migration guide: https://parse.com/docs/server/guide#migrating
* Parse Server Source code: https://github.com/ParsePlatform/parse-server
* Parse Server Example: https://github.com/ParsePlatform/parse-server-example
* Parse Server Wiki: https://github.com/ParsePlatform/parse-server/wiki

*origin from: https://medium.com/cowbear-coder/migration-of-parse-server-with-docker-part1-87034cc29978*
PayPalの支払い者への通知メールのチェックポイント

PayPalで支払いをすると支払い者には通知メールが送信されますが、この内容は売り手のアカウント設定やAPIのパラメータで変えることができます。

デフォルトの設定だと自分の想定と異なる内容が送られている可能性もあるので、チェックして支払い者へ適切な情報が送られるようにすることが良い購買体験を与える１つの要因かと思います。

以下にそのチェックポイントと設定方法を示します。
（図の番号と見出しの番号は一致します）

![aaaaa.png](https://qiita-image-store.s3.amazonaws.com/0/61900/808e16f6-3e68-672c-44ae-d4f1460bc47d.png)

##①売り手の名前
これはPayPalのビジネスアカウトに登録されている事業者名が表示されます。基本的に変更は不可のようです。

##②売り手のメールアドレス
これはデフォルトではPayPalのビジネスアカウントのメインメールアドレスが表示されます。メインメールアドレスは責任者などの個人アドレスである場合もあるので、カスタマーサポートのものに変えたい場合は、PayPalの**「個人設定」>「事業」**のメニューに進み、編集を押してカスタマサポートのメールアドレスを設定することで、そのアドレスがこの欄に表示されるようになります。

##③購入した商品の説明
これは、APIを使ったインテグテーションの場合、[SetExpressCheckout](https://developer.paypal.com/docs/classic/api/merchant/SetExpressCheckout_API_Operation_NVP/)の**L_PAYMENTREQUEST_n_DESCm**パラメータに商品名やその説明文の設定することで表示されます。
未設定の場合空白になりますので、後でメールを見返したときに支払い者が何を買ったかわかるためにも設定しておいたほうが良いかと思います。

##④クレジットカードの明細への表記
PayPalの支払いで資金元をクレジットカードにしたい場合、カード会社からの明細には
「PAYPAL \*XXX」(XXXが売り手によって異なる）と表示されます。
XXXの部分はPayPalがビジネスアカウント登録時に設定するものですが、自分の意図したものでない場合などは、**「個人設定」>「支払い受け取り設定」**でXXXの部分を変更できます。

その他**「事業」の「会社のURL」**（買い手の取引履歴にカスタマーサポートURLとして表示される）などの設定もチェックすることをお勧めします。
amCharts v2で、折れ線グラフと棒グラフを同居させる


現時点でamChartsはv3なのですが、とある事情によりv2を使用してグラフを書くことになったので、メモを残しておきます。

# 結果
今回はこのようなグラフを作ります。

![スクリーンショット 2016-02-03 16.02.38.png](https://qiita-image-store.s3.amazonaws.com/0/9186/316b5b8f-f33e-43d0-a64b-1d31f80d461f.png "スクリーンショット 2016-02-03 16.02.38.png")



# 実装

[結果: jsfiddle](http://jsfiddle.net/assaulter/mq8Lq65w/)

手っ取り早くソースを見たい方はこちらをどうぞ。

# 解説

[公式Doc（v2）](https://docs.amcharts.com/javascriptcharts/AmSerialChart)

公式ホームページがv3仕様になっているので、探すのに苦労しました...

## 描画したいデータの形式

今回は折れ線グラフと棒グラフを両方使用したいので、チャートは [AmSerialChart](https://docs.amcharts.com/javascriptcharts/AmSerialChart) を用います。

ざっくり言うと、チャートに折れ線グラフと棒グラフを設定して描画命令を行えばよいのですが、データはchartに対して設定するので、両方の数値を持った形で与える必要があります。

```javascript
// #17 ~ 21
chartData.push({
    date: newDate,
    g1: g1,
    g2: g2
});
```

例のソースコード場合、date がx軸、g1が折れ線グラフのy値、g2が棒グラフのy値に対応します。
（どのプロパティをつかうかは指定できるので、順番はどうとでもなります。

## グラフを作成する

折れ線グラフ

```javascript
// #60~66
var graph1 = new AmCharts.AmGraph();
graph1.title = "red line";
graph1.type = "line";
graph1.valueField = "g1";
graph1.bullet = "round";
graph1.hideBulletsCount = 30;
chart.addGraph(graph1);
```

棒グラフ

```javascript
// # 69~76
var graph2 = new AmCharts.AmGraph();
graph2.title = "yellow column";
graph2.type = "column";
graph2.fillAlphas = 0.2;
graph2.valueField = "g2";
graph2.bullet = "square";
graph2.hideBulletsCount = 30;
chart.addGraph(graph2);
```

実はtypeを切り替えるだけでよい。typeにはほかにも [ここ](https://docs.amcharts.com/javascriptcharts/AmGraph) にあるように、 "none", "round", "square", "triangleUp", "triangleDown", "bubble", "custom" とあるのでこれらは同居可能な筈です。

今回は毎回 chart.addGraph しているが、chart.graphs = [graph1, graph2]; でも大丈夫です。

最後に、write命令を行えば描画されます！
Laravel5でSSH(SCP/SFTP)を利用する　ついでにWindows環境でも


Laravel5から、SSHで何かをやりたいならEnvoyを使え！という感じらしいです。

が、昔あったSSHを利用したい場合は、[Laravel Collective](https://laravelcollective.com/)でメンテされている[Remote機能](https://laravelcollective.com/docs/5.2/ssh)を使えばいいようです。

基本的には、本家サイトの通りにやればいいのですが、いくつか不明な点もあったので使い方をメモしておきます。

##やりたいこと

* ローカルで生成したファイルをリモートサーバの指定PATHにSCPでコピーしたい
* SSHは鍵ログイン
* SSHが標準で使えないWindowsでも使いたい

##使い方（Mac/Linux)

まず、本家ページのガイダンスに従い、composerでライブラリ等を読み込み、config/app.php等を編集した後、artisanで、config/remote.phpを生成します。

手順は[こちら](https://laravelcollective.com/docs/5.2/ssh)の通り。

その他、注意点などを以下に書きます。

###remote.phpの設定

鍵のみでの認証の場合、どうしたらいいかわからなかったのですが、下記の記述でOKのようです。

```php
<?php

return [

    'default' => 'production',

    'connections' => [
        'production' => [
            'host'      => 'remotehost_name',
            'username'  => 'hoge',
            'password'  => '',
            'key'       => '/Users/hoge/.ssh/id_rsa',
            'keytext'   => '',
            'keyphrase' => 'hoge',
            'agent'     => '',
            'timeout'   => 10,
        ],
    ],

    'groups' => [
        'web' => ['production'],
    ],

];
```

###scp（ローカルからリモート）

下記のように記述することでscpでローカルからリモートへファイルコピーができました。
いつもの手抜きでroute.phpに記述。

```php
Route::get('up',function(){

	//コピー（ローカルからリモート）
    SSH::into('production')->put('/Users/hoge/test.txt','/home/hoge/test.txt');
    //return
    return 'up';

});
```

##Windowsで利用する

そもそもWindowsにはSSHが無いのでどうするのか調べてみました。
結論から言えば、去年リリースされたWindows対応のOpenSSHを利用すれば問題なく動くようです。

###OpenSSHを使う

Windows版のOpenSSHは[ここ](https://github.com/PowerShell/Win32-OpenSSH/releases)からダウンロードできます。

####インストール

インストーラーは無いので、Zipファイルを回答し、そこにPATHを通します。私の場合は、x64版をダウンロードし、それをCドライブ直下にコピーしました。

ユーザーのホームディレクトリにUNIX系と同様に.sshフォルダができますので、鍵を利用する場合はそこに鍵をコピーします。

後は、Mac(Linux)と全く同じ手順でSSHを利用できます。
Laravelで試す前に、事前に手動でsshでログインできるかを試して置いた方がいいでしょう。

```bash
ssh -i /path/to/key username@remote_hostname
```

sshが動くなら、おそらくEnvoyも動くのでしょう（試していませんが）。

###おまけ

そもそもSFTPができるかをコマンドで確認する方法。いつもはscpしてるので、SFTPの方法をメモ。
鍵をつかってログインするには、下記のようにする。

passphaseがある場合は入力を求められますので入力します。

```bash
sftp -o IdentityFile=C:¥Users¥hoge¥.ssh¥id_rsa username@remote_hostname
```

でサーバにログインしておいて、

```bash
>put localfile
```

等で操作可能。
ログイン後は基本FTPと同じですね。
phpとpythonのcgi実行可能な簡易WEBサーバーの起動方法

以下のコマンドはpythonまたはphpがインストールされていれば使えます。
※古いバージョンでは使えない場合もあり。

コマンドを実行したディレクトリがwebrootになります。

## python 

### python3の場合

```lang:コマンド
python -m http.server --cgi 8000
```

### python2の場合

```lang:コマンド
python -m CGIHTTPServer 8000
```

## php

### php5.4〜

```lang:コマンド
php -S localhost:8000
```

pythonもphpもポート番号は指定しない場合、デフォルトで8000が割り当てられます。
楽天ID決済とSlackの差異をつなぐだけのスニペット

Expressのルータコード

楽天から出てくるwebhookにtextをつけるだけの簡単な操作。


```js

router.all('/rakuten/', function(req,res,next){
  console.log(req.body);

  var payload = {};
  payload.text='てすと';

  request({
    uri: "https://hooks.slack.com/services/AAAAAAA/BBBBBBB/CCCCCCC",
    method: "POST",
    form: {
      payload: JSON.stringify(payload)
    },
    json: true

  }, function(error, response, body) {
    //console.log(body);
  });

  res.json(slackData);
});
OS起動時にfsckが自動実行されるのを防止する

#一定期間でOS起動時にfsckが実行される
Linuxでは一定期間ファイルシステムのチェックを行っていないと、起動時にチェックを行う機能がありますが、これを忘れたまま再起動を行うと数分のダウンのはずが、予測していなかった大幅なダウンタイムとなってしまう場合もあると思います。
※AmazonLinuxなどデフォルトで無効となっているディストリビューションもあります。

ec2の場合は、起動時にfsckが走ると、ネットワークサービスが起動していないのでStatus Checksがpassedにならず、
![status fail.png](https://qiita-image-store.s3.amazonaws.com/0/52904/fb6e4d67-d59b-ca44-1bc9-088d968b6f50.png)


Get System Logを確認すると

![syslog.png](https://qiita-image-store.s3.amazonaws.com/0/52904/c422781d-6c28-941a-31e5-73dde3175680.png)



```
root has gone xxx days without being checked, check forced.
```

のような出力で止まっている（チェック中）ことが確認できると思います。


こうなってしまえばもう待つしかありません。

#fsckの自動起動を停止
もちろん定期的にfsckをしなくていいというわけではありませんのが、
予期せぬfsckを防ぐためには、以下の２つの方法があります。

##fstabで起動時のチェックを無効化

第6フィールドの数値を「0」に変更します。

```
vi /etc/fstab
-------
LABEL=root      /        ext3   defaults       1 1
↓修正↓
LABEL=root      /        ext3   defaults       1 0
-------
```


##tune2fsでチェック期間を無期限に

```
tune2fs -i 0 /dev/sda1

tune2fs -l /dev/xvde1 | grep -i interval
--------
Check interval:           0 (<none>)
--------
```

※マウント回数でfsckが実行される設定もあるので、その場合は以下で無効に設定できます

```
tune2fs -c 0 /dev/xvde1
```


#(おまけ)スペックの違いによるfsckからの起動時間

fsckの実行時間は環境によると思いますので、参考まで。
それぞれ１回しか試していません。
環境はCentOS5/ディスク30GB(IOPSのインスタンスはは起動時に100GBに変更)です。

|  インスタンスサイズ |ディスク   |起動までの時間   |
|---|---|---|
|  m1.small(1core/1.7GB) | Magnetic  |  48分 | 
|  m1.small(1core/1.7GB) | プロビジョンド iops(3000)  | 48分  |  
|  c3.8xlarge(32core/60GB) | Magnetic  | 48分  | 

IOが高速だとfsckも早くなると予想したのですが、意外な結果が...
c++ builder > debug > スレッドが突然終わる症状

```txt:動作確認
C++ Builder XE4
```

TThreadを使ってスレッドで処理するプログラムがある。3ヶ月くらい大きなトラブルもなく動いていたが、突然そのプログラムのスレッドが停止するようになった。

スレッドの途中の処理においてログを見ていると、なぜか突然デストラクタが呼ばれてしまい終了している、という症状が何回も発生するようになっている。

仮に外部からTerminate関数がコールされてTerminateされるとしても、後処理の経路のログが出力されないといけないが出力されていない。何かよくわからないが突然デストラクタに飛んでいる。

そのスレッドが終了後も別のスレッドは普通に動いている。

結局行った対応は、Windowsのファイルシステムの修復だった (管理者権限でDosプロンプトにおいて sfc /scannow)。
修復を行った理由として、Explorer操作時に固まることが数回発生したため。

修復を行ってからは上記の症状が出ていないが、まだしばらく様子を見ている。
数時間でスレッドが落ちていた症状が27時間連続正常動作になった。

処理の途中でメモリ破壊をするような状況になっている可能性もゼロではない。
ExcelのN関数がちょっと便利。if(a1=b1,1,0)→n(a1=b1) でOK！

A列とB列が一致していたら、1
不一致だったら、0

みたいな判定をするときに、
=if(a1=b1,1,0)
て書いてました。

これをn関数を使うと
=n(a1=b1)
と書き換えられます。

ちょっとだけ便利です。（ただ可読性は下がります）


ついでに、
=n(a:a=b:b)
でも同じ結果になります。
Java 指定年月の最終日取得

## はじめに
事前に準備する外部ライブラリ等はありません。
JavaSEに含まれるjava.util.Calendarクラスを使用します。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
→[2016/02/04追記]yuichiro76さんにご教示いただいた効率のよい方法(Calendar#getActualMaximum)に修正しました。ありがとうございました！

```java:LastDayGetter.java
import java.util.Calendar;

/**
 *
 * @author tool-taro.com
 */
public class LastDayGetter {

	public static void main(String[] args) {

		//対象年
		int year = 2016;
		//対象月
		int month = 2;

		//取得処理
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.YEAR, year);
		calendar.set(Calendar.MONTH, month - 1);
		int result = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		//標準出力
		System.out.format("取得結果=%1$d", result);
	}
}
```
## 動作確認

```
$ javac LastDayGetter.java
$ java LastDayGetter
$ 取得結果=29
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
Java HTML特殊文字エスケープ

## はじめに
事前に準備する外部ライブラリ等はありません。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:HTMLEscaper.java
/**
 *
 * @author tool-taro.com
 */
public class HTMLEscaper {

	public static void main(String[] args) {

		//エスケープしたい文字列
		String source = "<a href=\"./index.php?foo=bar&hoge=hoge\">'ココ'からジャンプ</a>";

		//エスケープ処理
		String result = source.replace("&", "&amp;").replace("\"", "&quot;").replace("<", "&lt;").replace(">", "&gt;").replace("'", "&#39;");
		//標準出力
		System.out.format("エスケープ結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac HTMLEscaper.java
$ java HTMLEscaper
$ エスケープ結果=&lt;a href=&quot;./index.php?foo=bar&amp;hoge=hoge&quot;&gt;&#39;ココ&#39;からジャンプ&lt;/a&gt;
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
Nginx(本家版) インストール (Ubuntu)

# nginxサイトが配布するPGPキーを追加
```
wget http://nginx.org/keys/nginx_signing.key -O - | sudo apt-key add -
```

# nginxサイトのリポジトリを追加
```/etc/apt/sources.list.d/nginx.list
deb http://nginx.org/packages/ubuntu/ CODENAME nginx
deb-src http://nginx.org/packages/ubuntu/ CODENAME nginx
```

|version|CODENAME|
|:--:|:--:|
|12.04|precise|
|14.04|trusty|
|15.04|vivid|
|15.10|wily|
|16.04|xenial|
|16.10|yakkety|

# インストール
```
sudo apt update
sudo apt install nginx
```
AssetBundleのCRCとハッシュを取得する メモ

#　■概要
アプリのバージョン間の差分を出すために**CRC**や**ハッシュ**が必要になりそうなので
その方法をメモしておく。

#　■ソース

アセットバンドル名を含む絶対パスを設定する必要がある。

```
// 全アセットバンドル名を取得
string[] assetBundleNames = AssetDatabase.GetAllAssetBundleNames();

foreach (string bundleName in assetBundleNames)
{
    uint crcNum = 0;
    Hash128 bundleHash;
    bool getCrc = false;
    bool getHash = false;
    // アセットバンドル名を含む絶対パス
    getCrc = BuildPipeline.GetCRCForAssetBundle(外部ディレクトリパス + "/" + bundleName, out crcNum);
    // アセットバンドル名を含む絶対パス
    getHash = BuildPipeline.GetHashForAssetBundle(外部ディレクトリパス + "/" + bundleName, out bundleHash);
    Debug.Log("crcNum=" + crcNum.ToString());
    Debug.Log("bundleHash=" + bundleHash.ToString());
    Debug.Log("bundleName=" + bundleName);
}
```

#　■環境

・Unity5.3.0f4
・Windoews7 64bit
Java IPアドレスが指定範囲にあるかの判定

## はじめに
事前に以下のライブラリを用意します。

- Apache James
    - http://james.apache.org/download.cgi#Apache_James_2.3.2_is_the_stable_version
    - Binary (ZIP Format): james-binary-2.3.2.1.zip
- Avalon Framework API
    - jarファイルをMaven Repositoryから取得すると使いやすいです。
    - http://mvnrepository.com/artifact/org.apache.avalon.framework/avalon-framework-api/4.3.1
    - ※"Download ( JAR ) "のリンクからダウンロード
- Dnsjava
    - jarファイルをMaven Repositoryから取得すると使いやすいです。
    - http://mvnrepository.com/artifact/dnsjava/dnsjava/2.1.7
    - ※"Download ( JAR ) "のリンクからダウンロード

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:MyNetMatcher.java
import org.apache.james.util.NetMatcher;

/**
 *
 * @author tool-taro.com
 */
public class MyNetMatcher {

	public static void main(String[] args) {

		//判定したいIPアドレス
		String source = "192.168.1.5";
		//対象範囲
		String range = "192.168.1.0/24";

		//判定処理
		NetMatcher matcher = new NetMatcher();
		matcher.initInetNetworks(new String[]{range});
		boolean result = matcher.matchInetNetwork(source);
		//標準出力
		System.out.format("判定結果=%1$b", result);
	}
}
```
## 動作確認

```
$ javac MyNetMatcher.java
$ java MyNetMatcher
$ 変換結果=true
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
Slack で肩をすくめる方法

# 方法

コメント欄に `/shrug` と書いて送信する。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/9b409293-8b0a-f4ae-9004-98a60cec2293.png)

# 結果

肩をすくめた顔文字 ( ` ¯\_(ツ)_/¯` ) が投稿される。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/9b41cfb7-05dd-5aa3-271b-0e553d08aab4.png)

# 応用

`/shrug` の後に何かを書けば、メッセージも添えられる。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/4869108e-3f74-d421-af05-d954fa4d40b1.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/c2ceb6f8-6f95-0fbe-1d0e-077385134299.png)

# こんなコマンドがある理由

たぶん slack と shrug (肩をすくめる) をかけたジョークだ。



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Microsoft Code(vscode)でtypescriptを編集時に、"Cannot read property 'kind' of undefined"が表示されてしまう。


題名通り、編集中に謎の警告が出てきて結構不便してたのですが、解決法がわかりました。というか、

https://github.com/Microsoft/vscode-tslint/issues/13

にまんま書いてあって、tslintをアップデートしたら直りました。でもcodeって拡張は自動アップデートしてくれないのね。
cactiをdockerで動かす

## 参考

* [quantumobject/docker-cacti](https://hub.docker.com/r/quantumobject/docker-cacti/~/dockerfile/)

## 使い方

```yaml:docker-compose.yml
cacti:
# image: quantumobject/docker-cacti
  image: tukiyo3/cacti
  ports:
   - "80:80"
   - "161:161"
  volumes:
   - "/etc/localtime:/etc/localtime:ro"
   - "./backups/:/var/backups/"
```

```bash:backup
docker exec -it container_id /sbin/backup
```

```bash:restore
docker exec -it container_id /sbin/restore
```

![cacti.png](https://qiita-image-store.s3.amazonaws.com/0/25728/aadced6f-3828-a448-0564-cd8c50988555.png)


* 5分ほど待てばグラフが描画され始める
* キャッシュされたグラフデータ(rra)は`/var/lib/cacti/rra/`にwww-dataグループ権限で書き込まれる。
Java 数値から文字列への変換＆進数指定

## はじめに
事前に準備する外部ライブラリ等はありません。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:LongToString.java
/**
 *
 * @author tool-taro.com
 */
public class LongToString {

	public static void main(String[] args) {

		//変換したい数値
		Long source = 123456789L;
		//変換時の進数
		int radix = 36; //数値＋アルファベット小文字の36進数

		//変換処理
		String result = Long.toString(source, radix);
		//標準出力
		System.out.format("変換結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac LongToString.java
$ java LongToString
$ 変換結果=21i3v9
```
通番をIDに使う際など、文字列表現を短縮すると便利なシーンで使えます。

## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
Sabelでビューを追加する

たとえば `/foo/bar`というURLにビューを追加する場合、コントローラを作ってからビューテンプレートを作ればいいようだ。

```php:app/manage/controllers/Foo.php
class Manage_Controllers_Foo extends Manage_Controllers_Base
{
}
```

```html:app/manage/views/foo/bar.tpl
test
```
200ユーザー突破!あんなすごいエンジニアともであえるかも？？Qiitaユーザーが集まるSlack Teamを作ってみたよ！

by @mixiappwchr

![20151223025556.png](https://qiita-image-store.s3.amazonaws.com/0/37731/1d1ec460-cfeb-5093-b9a9-9deb7f34007b.png)

 
# 事の発端
日々Qiitaにていろいろ記事をかかせてもらい、また毎日本当にいい記事に出会え、本当に
Qiitaはいいサービスだなーと思い、またこの人と喋ってみたい！もうすこし詳しく聞いてみたい！と思うのですが、なかなか**コミュ障**のためそんなことできません。

# 皆さんもそう思ったことないでしょうか？




# ならチャットなら簡単に声かけれるのでは..?

と思い、Qiitaユーザーの集まるslack teamをつくってみました。



* 本当に人があつまるのか？？
* 有意義な場所になり得るのか？

まったくもって全然未知数ですが、入ってみたい！賛同する！~~という方は私の方までDMいただければとおもいます！~~
slackの招待を以下のslackinをつかって自動化しました。

https://github.com/rauchg/slackin
こちらから自分のアドレスを送って招待メールを受け取ってください。
またまわりにも是非紹介してください！
  
下記が招待ページです
http://qiita-users.lol/invite/



質問があれば私までDMをいただければ。

https://twitter.com/mixiappwchr


追記

UI/UXなどについてはなすデザイナー、フロントエンジニア向けのslackも別で作ってます

http://designers-jp.lol/invite/
PhalconとMongoDBの俺メモ(1) 登録・検索・更新・削除など

先日、MongoDBが面白かったので、Phalcon Framework で使ってみたときのメモ
#設定
まず、Phalconのチュートリアル見ながら、スタートアップのDIにMongoDBへの接続とCollection Managerを登録

```php:index.php
	// ローカルホストへの接続
	$di->set('mongo', function () {
		$mongo = new MongoClient();
		return $mongo->test;
	}, true);

	$di->set('collectionManager', function(){
		return new \Phalcon\Mvc\Collection\Manager();
	});
```
モデルとして、これもチュートリアルに倣って

```php:Item.php
<?php

use Phalcon\Mvc\Collection;

class Item extends Collection
{
    public function getSource()
    {
        return "item";
    }
}
```
#登録
データを登録して表示してみる。

```php:hoge.php
// 登録して
$bat = new Item();
$bat->name = '金属バット';
$bat->type = 'Weapon';
$bat->attackPoint = '3d6';
$bat->save();

$nabe = new Item();
$nabe->name = 'アルミの鍋';
$nabe->type = 'Helmet';
$nabe->defencePoint = 3;
$nabe->save();

$coke = new Item();
$coke->name = '黒い炭酸水';
$coke->type = 'Drink';
$coke->recoveryPoint = 7;
$coke->save();

// 表示
$items = Item::find();
foreach ($items as $item) {
	echo $item->name . "<br>";
}
```
#削除
データを削除して表示してみる。

```php:moge.php
// 削除してみて
$items = Item::find();
foreach ($items as $item) {
	$item->delete();
}

// 表示
$items = Item::find();
foreach ($items as $item) {
	echo $item->name . "<br>";
}
```
#更新
データを更新して表示してみる。

```php:poge.php
// 更新してみて
$items = Item::find();
foreach ($items as $item) {
	$item->name = "「" . $item->name . "」";
	$item->save();
}

// 表示
$items = Item::find();
foreach ($items as $item) {
	echo $item->name . "<br>";
}
```
#検索
特定のデータを更新して表示してみる。

```php:toge.php
// 特定のデータを更新してみて
$items = Item::find([['type' => 'Drink']]);
foreach ($items as $item) {
	$item->name = '黒っぽい炭酸水';
	$item->save();
}

// 表示
$items = Item::find();
foreach ($items as $item) {
	echo $item->name . "<br>";
}
```
なるほど。
rspecでcontrollerの処理をした時やmodelの処理時にメールが配信された事やメールの内容をテストしたい


ActionMailer::Base.deliveriesを参照すると取得出来るっぽい
mailを取得したいなら、ActionMailer::Base.deliveries.lastで出来る。

```ruby
describe "password_set_complete パスワード設定完了" do
  it "処理後、メールが配信される" do
    expect {
      post :password_set_complete, parameters
      mail = ActionMailer::Base.deliveries.last
      expect(mail.subject).to eq "PASSWORD登録のお知らせ"
    }.to change(ActionMailer::Base.deliveries, :size).by 1
  end
end
```

中々同じ事しているコード見つけられなかったのでメモ
conoHa:（centOS７）で、GDCP。

# リモートへGDCPインストールの際の、「client_secrets.json」の作成方法（前フリ投稿）
今夜にでも書かせていただきます。いまは、息抜！

![スクリーンショット 2013-07-15 4.21.09.png](https://qiita-image-store.s3.amazonaws.com/0/5135/7fb05c2a-fb79-4584-5485-5d2a956e0d35.png)

投稿前メモですが、宜しかったら、どうぞ。
https://www.icloud.com/pages/000sFiser3eMRByAVehnQriEA#gdcp%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E8%A3%9C%E8%AA%AC
Githubに新規リポジトリ(Repository)を作成する

*前提*
GitHubのアカウント作成済み
sshKeyを登録済み
hogitがインストール済み

*環境*
Mac OS X El Capitan(ver.10.11.1)

### 1. GitHubで新しいリポジトリを作成
- Repository name:必須。リポジトリ名を入力
- Description:任意。リポジトリの説明を入力
- Public/Private:公開したくない場合はPrivate(有償契約の場合)
- Initialize this repository with a README:READMEを作成するか否か。後から作れるため未チェック。
- Add .gitignore:git で無視するファイルを指定するファイル。後から作れるためNone
- Add a license:ライセンス設定。後から作れるためNone

### 2. 既存のローカルリポジトリをGitリポジトリに変換する
```
cd [GitHubで管理したいローカルのリポジトリ]
git init
```

```Bash:example 
cd /work/rocal/repository
git init
```

### 3. ローカルリポジトリのファイルをインデックスに追加、コミットする
```
git add .
git commit -m "[コミットのコメント]"
```

```Bash:example 
git add .
git commit -m "FirstCommit"
```


### 4. GitHubのリモートリポジトリ情報を追加する

```
git remote add origin [リモートリポジトリ情報]
```

```Bash:example 
git remote add origin https://github.com/xxxx/sample-repository.git
```

### 5. ローカルリポジトリをリモートリポジトリへ反映させる
```
git push origin master
```


## Appendix
他にGithubで新しいリポジトリを作って利用する方法としては、Githubで新規リポジトリ作成して、ローカルリポジトリとしてCloneする方法もある。
Facebook Messenger と ChatWork をネイティブアプリ化する (nativefier)

最近何かと話題の Electron と、頻繁に使っている Facebook Messenger の www.messenger.com が 2016/2/1 頃の Chrome のアップデートで異常に重くなったので、知人の Matsuda さんにに紹介してもらった「nativefier」という、ウェブサイトをネイティブアプリ化できるツールを使って劇的に解消することができました。

ついでに ChatWork もアプリ化しました。

## この記事の最新版

最新版はブログに掲載しています。
http://ja.katzueno.com/2016/02/3566/

## インストール

```npm install -g nativefier```

お使いの Mac などに Node.js が入っていることが必要です。

## Facebook Messenger をネイティブアプリにする

```
cd /Applications/
nativefier --honest --badge --app-name "Facebook Messenger" "www.messenger.com"
```

## ChatWork をネイティブアプリにする

```
cd /Applications/
nativefier --honest --badge --app-name "ChatWork" "www.chatwork.com"
```

## おまけ：アイコンを登録してみる

Messenger と ChatWork 2つつくると、アイコンがわかりづらいので、アイコンを登録してみます。


### アイコンをゲットする


https://www.iconfinder.com/

より.icnsなアイコンファイルをゲットできます。

### アイコンを作る

iPhone アプリから引っ張ってくるという手もあります。

- Messenger と　ChatWork アプリが入った iPhone を iTunes にバックアップ。
- Home - Music - iTune Library - Mobile Application フォルダに行き、Messenger と ChatWork の ipa ファイルを見つけて適当な場所にコピーする
- .ipa ファイルを .zip 拡張子に書き換える
- ZIP を解凍する
- フォルダを追うと、Mac OS では実行できない .app フォルダが現れるので、右クリック (Ctlr + クリック) でパッケージの中身を見る
- PNG ファイルを取得する
- 「[Macアプリの.icnsを作るときのメモ](http://qiita.com/Jacminik/items/a4c8fe20a4cba62f428b)」を参考にアイコンファイル作成

### アイコン付きのネイティブアプリを作る

これで「messenger.icns」「chatwork.icns」というファイル名のアイコンを作り

```
cd /Applications/

nativefier --honest --badge --app-name "Facebook Messenger" --icon /【アイコンの保存先】/messenger.icns  "www.messenger.com"

nativefier --honest --badge --app-name "ChatWork" --icon /【アイコンの保存先】/chatwork.icns "www.chatwork.com"
```

でアイコン付きのネイティブアプリを作成しました。


## 参考記事

nativefier の詳細ははこちらの記事を参考に

参考：[Webページをデスクトップアプリ化 - nativefierを使ってみる](http://qiita.com/taiyoslime/items/98be154455e76710df9d)

以上
「手と目で覚える正規表現入門」連載の実践をSwift Playgroundで始めました

今朝、こんな素晴らしい記事が投稿されました :tada: 

- [Qiitaに正規表現の入門記事を書きました - give IT a try](http://blog.jnito.com/entry/2016/02/03/054951)
- [初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」 - Qiita](http://qiita.com/jnchito/items/893c887fbf19e17d3ff9)

正規表現まともに勉強したことがなくて、スムーズに読み書き出来ずコンプレックスがあり克服したいと思っていたところグッドタイミングで、連載と同時にSwiftのPlaygroundで書きながら勉強していくことにしました。
https://github.com/mono0926/RegexPractice

## これまでの学習録

- [初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」 - Qiita](http://qiita.com/jnchito/items/893c887fbf19e17d3ff9)
    - https://github.com/mono0926/RegexPractice/issues/1
- [初心者歓迎！手と目で覚える正規表現入門・その２「微妙な違いを許容しつつ置換しよう」 - Qiita](http://qiita.com/jnchito/items/64c3fdc53766ac6f2008)
    - https://github.com/mono0926/RegexPractice/issues/3

---

以下、初回投稿時の文章:

第一回の分はすでに https://github.com/mono0926/RegexPractice/issues/1 にてやってみましたが、実際に書いたりPlaygroundでサクサク結果確認出来たりすると、とても理解が捗るなと思いました。

Markdown風ドキュメントを織り交ぜられるので、後から見返す時にも良い感じです。
参考: [Xcode 7のPlaygroundで出来ることまとめ - Qiita](http://qiita.com/mono0926/items/9f8324637d1dca1e7075)

このように表示されます:
<img width="533" alt="screen shot 2016-02-03 at 11 37 14 am" src="https://cloud.githubusercontent.com/assets/1255062/12771179/853e8e8c-ca6a-11e5-8bc2-e8a6032658b4.png">

http://qiita.com/mono0926/items/9f8324637d1dca1e7075#活用事例 にも書きましたが、Playgroundは色々活用出来るなと思っていて、今回は自らやってみた次第です。

[実行手順](https://github.com/mono0926/RegexPractice/blob/master/README.md#実行方法)通りにすれば動かせると思うので、もし良かったら弄ってみたりしてみてくださいヽ(・ω・｀）

https://github.com/mono0926/RegexPractice/blob/master/README.md に書いてますが、Pythonの正規表現モジュールぽく書ける[PySwiftyRegex](https://github.com/cezheng/PySwiftyRegex)というライブラリ経由で正規表現書いてます。
Playgroundからもこういった外部ライブラリサクッと使えるので便利です :yum: 

その2以降も続けて完遂できるようにがんばります！
【webブラウザを】wasaviを入れて遊ぶ【vim化】

webブラウザでtextareaをvim化できるwasaviというツールがあったので、入れて遊んでみました。
各ブラウザの拡張機能として提供されているようです。
詳細や導入方法は公式を参照ください。

# 公式サイト
http://appsweets.net/wasavi/

# gmailでも！
gmailでも反応しました！

![スクリーンショット 2016-02-03 13.18.14.png](https://qiita-image-store.s3.amazonaws.com/0/105934/62c894e9-0409-f5e0-c327-466d07ec0328.png)


これが、、、

![スクリーンショット 2016-02-03 13.18.34.png](https://qiita-image-store.s3.amazonaws.com/0/105934/34740c8f-19e6-4e5e-883a-538a233b6e17.png)


こうなる！

反映させたい時は:wqでいいようです。

vimmerには嬉しい？？
pythonでエラー出力に表示したい

python2.7を使っているので、

print >> sys.stderr, ”エラーです”

が一番覚えやすそう。


参考：
http://april.fool.jp/blogs/2014/07/%E3%83%A1%E3%83%A2-python%E3%81%A7%E6%A8%99%E6%BA%96%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%BA%E5%8A%9B%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF/
CollectionUtilsのとっても簡単なサンプル

初めましてこんにちは。

Qiitaデビューということで題材を悩みましたが、
JavaでApache Commons Collectionsを使用するサンプルを記載します。

ClosureとかPredicate、Transformerなんて分かりにくいですよね？
参考にしてみてください。

[Apache Commons Collections 4.1 API](https://commons.apache.org/proper/commons-collections/javadocs/api-release/index.html)

※ちょっとコード修正しました。

```java
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections4.Closure;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.IterableUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.Transformer;

import lombok.AllArgsConstructor;
import lombok.Data;

/** サンプルクラス */
public class CommonsCollectionsSample {
  /** 人物クラス */
  @AllArgsConstructor
  @Data
  class Person {
    /** ID */
    private int id;
    /** 名前 */
    private String name;
    /** グループ */
    private int group;
  }

  /** サンプル */
  public void sample() {
    // 人物リスト
    @SuppressWarnings("serial")
    List<Person> list = new ArrayList<Person>() {
      {
        add(new Person(1, "a", 1));
        add(new Person(2, "b", 1));
        add(new Person(3, "c", 2));
        add(new Person(4, "d", 2));
        add(new Person(5, "e", 2));
      }
    };

    // 全て出力
    IterableUtils.forEach(list, new Closure<Person>() {
      @Override
      public void execute(Person person) {
        System.out.println(person.toString());
      }
    });
    System.out.println("----------");

    // 名前リストを作る
    List<String> nameList = CollectionUtils.collect(
      list, new Transformer<Person, String>() {
      @Override
      public String transform(Person person) {
        return person.getName();
      }}, new ArrayList<String>());

    // 全て出力
    IterableUtils.forEach(nameList, new Closure<String>() {
      @Override
      public void execute(String name) {
        System.out.println(name);
      }
    });
    System.out.println("----------");

    // グループ1だけに絞る
    CollectionUtils.filter(list, new Predicate<Person>() {
      @Override
      public boolean evaluate(Person person) {
        return person.getGroup() == 1;
      }
    });

    // 全て出力
    IterableUtils.forEach(list, new Closure<Person>() {
      @Override
      public void execute(Person person) {
        System.out.println(person.toString());
      }
    });
  }

  public static void main(String[] args) {
    new CommonsCollectionsSample() {
      {
        sample();
      }
    };
  }
}
```

実行結果は下記の通りです。

```
CommonsCollectionsSample.Person(id=1, name=a, group=1)
CommonsCollectionsSample.Person(id=2, name=b, group=1)
CommonsCollectionsSample.Person(id=3, name=c, group=2)
CommonsCollectionsSample.Person(id=4, name=d, group=2)
CommonsCollectionsSample.Person(id=5, name=e, group=2)
----------
a
b
c
d
e
----------
CommonsCollectionsSample.Person(id=1, name=a, group=1)
CommonsCollectionsSample.Person(id=2, name=b, group=1)
```
エクセルで小計の計算をする関数式.markdown


# エクセルで小計の計算をする関数式

![スクリーンショット 2016-02-03 12.44.43.png](https://qiita-image-store.s3.amazonaws.com/0/18556/723e083a-7dfa-85ba-5468-4c3edee5e362.png "スクリーンショット 2016-02-03 12.44.43.png")

上記のようなエクセルで、
各カテゴリごとの小計を計算したい場合

`=IF($A3<>"",SUM(INDIRECT("C"&MATCH("*",$A$1:$A2,-1)&":C"&ROW())),"")`

をD2列に記載し、縦にオートフィルをすればok

## 注意

最後のセルであることの判定をするために、
A列の最後に適当な文字を入れている。
Heroku 複数ビルドパックの使い方


https://devcenter.heroku.com/articles/using-multiple-buildpacks-for-an-app

config:set BUILDPACK_URL だけじゃあかんくなったのん？

## ビルドパックのセット

普通にセットする

```` 
$ heroku buildpacks:set heroku/ruby
````

追加する

````:bash
$ heroku buildpacks:add --index 1 heroku/nodejs
````

確認する

````
heroku buildpacks
=== nameless-brushlands-4859 Buildpack
1. heroku/nodejs
2. heroku/ruby
````


昔の`.buildpacks`みたいなやり方はdeprecatedなのだろうか…書き直す必要あり？
コンテナにおけるmemory deduplication

## DLLのページ共有
一般に，複数のプロセスが同じDLLを呼び出す場合，DLLのページは共有される: http://unix.stackexchange.com/questions/116327/loading-of-shared-libraries-and-ram-usage

Dockerなどのコンテナでも，問題なくページが共有される．

ただし，aufsやoverlayfsではページ共有がなされるが，devicemapperやbtrfsでは(コンテナ毎にデバイスのmajor/minor番号が異なるため)ページ共有がなされない．
https://github.com/docker/docker/issues/7950


## KSM
KVMではゲストメモリ領域に対して`madvise(addr, length, MADV_MERGEABLE)`を呼び出すことで，KSM(Kernel SamePage Merging)を用いたMemory Deduplicationが行われる．

コンテナでも`LD_PRELOAD`を用いて`mmap(2)`などをフックし，`madvise(2)`を呼び出させてやることでKSMが可能 https://openvz.org/KSM_(kernel_same-page_merging)#Enabling_memory_deduplication_libraries_in_containers

ただし，`LD_PRELOAD`はstatic linkedなバイナリには適用できないので，Goで書かれたプログラムなどには適用できない．
SystemTapのguruモードを使えばstatic linkedなバイナリにも適用できそう．
そもそもGoでKSMしてどの程度の効果があるのかは不明．
CentOS 7.2にAnsible2をインストールする際にちょっとだけ注意すること

例によって備忘録

Cent OS7.2,正確にはvagrant用のbento/centos7.2にgithubから取得したansible2を入れてみました。
とりあえず動くみたいですが注意点が一つ。CentOS標準の状態ではansible2を動かすにはモジュールが不足しているので以下の二つのモジュールを入れる必要があります。

- yaml
- Jinja2

筆者は別途pipをインストールしてモジュールを入れました。

こちらからは以上です。
Firefox が句点の影響を受けて選択・移動できるように修正する

Firefox を更新を失敗したせいか、何かアドオンの影響を受けたのか。
そういうタイミングで妙な変化が起きた。

ブラウザを操作中の、ダブルクリックで文字列を選択するときの範囲や Ctrl と左右キーを使ったカーソル移動が普段と違っていた。

例えば URL 形式のアンカーなしの文字列を選択するときに、 _ttp://qiita.com_ の _qiita_ だけを狙ってダブルクリックをすると _qiita_ の部分だけではなく URL 全体が選択されてしまう。
日本語の場合だと句点直後の主語を選択したいのに、句点と、句点より前の「してしまった」みたいな前の文の末尾まで選択されてしまう。

さらにストレスなのは Ctrl と左右キーによるカーソル移動。

ロケーションバーで使うときに、狙いとしては _/_ 区切りで移動したいのに _Home_ や _End_ を押したかのように豪快に飛び越えてしまう。
テキストエリアで文章を入力しているときに使えば、予定していた距離よりも長く、やはり求めていない場所に着地する。

地味な問題。

しかし Ctrl を使ったカーソル移動を多用する人間にとっては非常に疲れる事態。

直せないもんかなー。

と、設定を覗いてみたらあっさりあった。

環境
----

- Firefox 44.0

設定
----

1. [about:config](about:config) を開く。
1. _layout.word_select.stop_at_punctuation_ を検索する。
1. _true_にする。
MacのAndroid Studioがドラッグアンドドロップでハングする


# 経緯

新しく買ったMacに新しいJDKを入れて、Android Studioも入れていざ開発しようと思ったら、起動時に右上にJDKが1.8.0_60~1.8.0_76だとドラッグアンドドロップに不具合が出るよみたいなメッセージが出てきて、そんな話聞いたことないなと思い、そのダイアログを消してしまいました。

しかし、Android Studio上でファイルをドラッグアンドドロップで動かそうとした時、Refactorのダイアログが出てきたままAndroid Studioがうんともすんとも動かなくなってしまいました。

# 解決策

ハングしてしまったものはターミナルでkillするしか閉じる方法はないです。ファイルをドラッグアンドドロップで動かせないのはIDEとしては致命的なので[ここ](http://tools.android.com/tech-docs/configuration/osx-jdk)を参考に違うJDKを設定します。

+ まずOracleのサイトから1.8.0_60~1.8.0_76の範囲外のバージョンを持ってきてインストールします。
+ .bashrcに以下を設定します.

```:.bashrc
export STUDIO_JDK=/Library/Java/JavaVirtualMachines/jdk1.8.0_xx.jdk
```

+ あとはターミナルをもう一度立ち上げて以下のコマンドでAndroid Studioを立ち上げます

```
open /Applications/Android\ Studio.app
```

この時にDockとかに登録してあるアイコンをクリックして立ち上げるとデフォルトのJDKが選択されてしまいます。デフォルトのJDKのバージョンを切り替えるにはもう少し手間がかかるのでとりあえずはこれでAndroid Studioを起動させる形でいいと思います。
Nginxでブラウザ言語判定してリダイレクトさせる方法

# 概要

ブラウザの言語設定を取得して、その言語のページにNginxでリダイレクトさせる設定についてまとめました。
例えば、example.comにアクセスすると、en.example.com や ja.example.comにリダイレクトするようにしたいという場合です。

# 方針

__・Nginxのモジュールを使う__

NginXでブラウザ言語を判定するために、Nginxオフィシャルページに載っているモジュール["Accept Language Module"](https://www.nginx.com/resources/wiki/modules/accept_language/)を使うと楽に設定できます。３rdパーティ製のモジュールで、[githubにソースコード](https://github.com/giom/nginx_accept_language_module)があります。
とても便利で良いのですが、ひとつ壁が…。知らなかったんですが、Nginxではモジュールを追加するためには、ソースコードからビルドする必要があります。

__・自前で実装する__

HTTPのaccept_languageを取得して、そこでロケール判定すれば良いだけなので、自分でNginxのconfに設定を追加すれば出来そうです。が、デバッグもしにくそうで、意外と大変そうです。

結局、今後ほかのモジュールを追加する可能性も考えて、Nginxのモジュールを追加して設定する事にしました。

# Nginxソースをダウンロード

[Nginx公式](http://nginx.org/en/download.html)から、バージョンを選んでダウンロードします。

```
$ wget http://nginx.org/download/nginx-1.9.10.tar.gz
$ tar xvf nginx-1.9.10.tar.gz
```

# 必要なモジュールを準備

Accept Language Moduleをダウンロードしておきます。

```
$ git clone https://github.com/giom/nginx_accept_language_module.git
```

その他、必要になりそうなモジュールも入れておきます。

```
$ cd /usr/local/src
$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
$ wget http://zlib.net/zlib-1.2.8.tar.gz
$ wget https://www.openssl.org/source/openssl-1.0.1r.tar.gz
$ tar xvf pcre-8.38.tar.gz
$ tar xvf zlib-1.2.8.tar.gz
$ tar xvf openssl-1.0.1r.tar.gz
```

（注）pcreはないとconfigureでエラーになります

```
./configure: error: the HTTP rewrite module requires the PCRE library.
```

# configure, ビルド、インストール

configureします。

```
$ ./configure \
--add-module=/usr/local/src/nginx_accept_language_module \
--with-pcre=/usr/local/src/pcre-8.38 \
--with-zlib=/usr/local/src/zlib-1.2.8 \
--with-openssl=/usr/local/src/openssl-1.0.1r \
--with-http_ssl_module
```

上記のadd_moduleでaccept_language_moduleを入れます。（上記のパスは、モジュールのある場所を指定してください。）

configureがうまく行けば、makeしてインストールです。

```
$ make
$ sudo make install
```

nginxのバージョンが出るようになればOKです。
これが出ない場合は、PATHを設定してあげると良いと思います。

```
$ nginx -v
nginx version: nginx/1.9.10
```

# 起動ファイルの準備

起動ファイルはなかったので、ここを参考にします。

https://www.nginx.com/resources/wiki/start/topics/examples/initscripts/

自分の環境のものを取得し、少しだけ、設定を変更すればOKです。

```
$ cd /etc/init.d
$ sudo vim nginx
```

変えたのは次の部分だけでした。

```
nginx="/usr/local/nginx/sbin/nginx"
...
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
```

これで動くと思います。

```
$ sudo service nginx start
```

# ブラウザ言語判定してリダイレクト

ようやくですが、/etc/nginx/以下のconfファイルに設定していきます。
Accept Languageモジュールのおかげで、英語と日本語など普通の判定なら__たった２行で可能__でした。
中国語も試しましたが、問題なく動作しました。

(/etc/nginx/nginx.conf)

```
server {
  ...
  set_from_accept_language $lang en ja;
  rewrite ^(.*)$ $scheme://$lang.example.com$1;
  ...
}
```

この __set_from_accept_language__ というのが、追加したモジュールによって提供されたメソッドで、$langという変数にロケールが入ります。
ブラウザのロケールが英語の場合は"en"が入り、日本語の場合は"ja"が入ります。どちらにもヒットしない場合は、最初のdefaultのロケール "en"がセットされます。

__・デバッグ__

余談ですが、デバッグする際は、add_headerを使うと便利でした。

```
server {
  ...
  add_header debug_var $lang;
  ...
}
```
とすると、Nginxがレスポンスヘッダーにdebug_varを付けてくれて、$langの中身を確認できます。

confへの設定自体はとても簡単でしたが、モジュールを追加してビルドするのが何かと大変でした。
UIWebViewでScaleする方法色々 ( ときどき更新 )

### GUI

* Scales Page To Fit
* View > Mode

![スクリーンショット 2016-02-03 11.22.55.png](https://qiita-image-store.s3.amazonaws.com/0/29844/18153a09-ab4f-bbfe-9e1c-0db5941fdff9.png)

### Code

```objc
// objective-c 
self.webView.scalesPageToFit = YES;
self.webView.contentMode = UIViewContentModeScaleAspectFit;
```

等

### その他

#### [metaタグを挿入する]

```js
var metalist = document.getElementsByTagName('meta');
var hasMeta = false;
for(var i = 0; i < metalist.length; i++) {
    var name = metalist[i].getAttribute('name');
    if(name && name.toLowerCase() === 'viewport') {
        metalist[i].setAttribute('content', 'width=device-width');
        hasMeta = true;
        break;
    }
}
if(!hasMeta) {
    var meta = document.createElement('meta');
    meta.setAttribute('name', 'viewport');
    meta.setAttribute('content', 'width=device-width');
    document.getElementsByTagName('head')[0].appendChild(meta);
}
```

```objc
[webView stringByEvaluatingJavaScriptFromString:JAVASCRIPT_SCRIPT];
```

* [viewport の指定を JavaScript で行う](http://www.united-bears.co.jp/blog/archives/3608)
* [Safari Developer Library - Supported Meta Tags](https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html)