OmniAICreator/Qiita-1.07M huggingface dataset:
metalsmith-permalinksを使った際のハイパーリンク

#Metalsmith
EVERYTHING IS A PLUGINという思想の元に作られた静的サイトジェネレーター(static site generator)。
githubのリポジトリ：https://github.com/segmentio/metalsmith

#metalsmith-permalinksプラグイン
静的サイトジェネレーター(static site generator)Metalsmithのプラグイン。
github:https://github.com/segmentio/metalsmith-permalinks

about.html(もしくはabout.md)をビルドして、about/index.htmlのようにしてくれる。

#この記事の対象者
metalsmith-permalinksを使ったページを作ろうとしている人

# ハイパーリンクについて
以下のようにすれば良かったものが、

```html
<a href="about.html">about</a>
```

metalsmith-permalinksによって、以下のように変更しないといけなくなる。

```html
<a href="about/">about</a>
```

##metalsmith-collectionsを利用する
[segmentio/metalsmith-collections](https://github.com/segmentio/metalsmith-collections)を利用して、動的に行う。

###metalsmith-colelctionsとは
他のソースファイルの情報を、collectionsフィールドに格納して利用出来るようにしてくれる。

###実際の例を見てみる
[maruLoop/metalsmith-simple-example](https://github.com/maruLoop/metalsmith-simple-example)にexampleがある。

####1. metalsmith-collectionsのインストール

```
npm install --save-dev metalsmith-collections
```

####2. metalsmith.jsonに記述

```metalsmith.json
{
  "metadata": {
    "title": "My Blog",
    "description": "My second, super-cool blog."
  },
  "plugins": {
    "metalsmith-collections": { // 必ず、metalsmith-permalinksより上に記述する
      "posts": {
        "pattern":"posts/*.md"
      }
    },
    "metalsmith-markdown": {},
    "metalsmith-permalinks": { // 必ず、metalsmith-templatesより上に記述する
      "pattern": "posts/:title"
    },
    "metalsmith-templates": {
      "engine": "handlebars"
    }
  }
}
```

#### 3. テンプレートファイルに記述する
metalsmith-collectionsプラグインによって、collections.postsオブジェクトが作られている。
また、metalsmith-permalinksプラグインによって、collections.postsオブジェクト内に、pathフィールドが追加されている。

```template.html
<html>
<head>
    <title>{{ title }}</title>
    <meta name="description" content="{{ description }}">
</head>
<body>
    <h1>{{ title }}</h1>
    <p>{{ description }}</p>
    <ul>
        {{#each collections.posts}} <!-- metalsmith-collectionsが作ったオブジェクト -->
        <li>
            <a href="{{this.path}}">{{this.title}}</a> <!-- metalsmith-permalinksがpathフィールドを追加してくれるので利用する -->
        </li>
        {{/each}}
    </ul>
</body>
</html>
```
IntentFilter#match のコードを読んだ

次のようになっている。

1. Intent の action が 非null なのに、IntentFilter の actions に含まれていなければ NO MATCH
1. データがMATCHしなければ NO MATCH。MATCHするかどうかは、
    1. IntentFilter の types と schemes が両方とも null のとき
        * Intent の type と data の両方が null ならば MATCH、
        * そうでなければ NO MATCH
    1. IntentFilter の schemes が 非null のとき
        * schemes が Intent の scheme を含まなければ NO MATCH
        * IntentFilter の mDataSchemeSpecificParts がマッチせず、
        * mDataAuthorities と mDataPaths もマッチしなければ NO MATCH
    1. IntentFilter の schemes が null のとき
        * Intent の scheme が、非null で、"" でなく、"content" でも "file" でもなければ、NO MATCH
    1. IntentFilter の types が 非null のとき
        * Intent の type が null なら NO MATCH
        * IntentFilter の types が Intent の type を含めば、MATCH
        * Intent の type が "*/*" なら、
            * IntentFilter の types が 非empty なら MATCH、empty なら NO MATCH
        * IntentFilter の types が "*/*" を含めば MATCH
        * IntentFilter の types が "hoge/*" を含んで Intent の type が "hoge/" で始まれば MATCH
        * Intent の type が "hoge/*" で、IntentFilter の types が "hoge/" で始まるものを含めば MATCH
    1. IntentFilter の types が null のとき
        * Intent の type が 非null なら NO MATCH
    1. 上記のいずれにも該当しなければ MATCH
1. カテゴリがMATCHしなければ NO MATCH。MATCHするかどうかは、
    1. Intent の categories が null なら、MATCH
    1. IntentFilter の categories が null のとき、
        * Intent の categories が empty なら MATCH
        * そうでなければ NO MATCH
    1. Intent の categories のすべてが、IntentFilter の categories に含まれれば MATCH、そうでなければ NO MATCH
1. いずれにも該当しなければ、MATCH
FreeBSDにOCamlをインストール

関数型言語の勉強のために[OCaml](https://ocaml.org/)をインストールしてみます。
どうやらOCamlをインストールするため、パッケージマネージャである[OPAM](http://opam.ocaml.org/)を使うようです。

[Install OCaml](https://ocaml.org/docs/install.html)

1.インストール
`% cd /usr/ports/devel/ocaml-opam`
`% sudo make install`

2.初期化
`% opam init`
``% eval `opam config env```

3.バージョンを指定
`% opam switch 4.02.1`
``% eval `opam config env```

4.確認
`% ocaml -version
The OCaml toplevel, version 4.02.1`
`% opam switch list
system  I system  System compiler (4.01.0)
4.02.1  C 4.02.1  Official 4.02.1 release
--     -- 3.11.2  Official 3.11.2 release
--     -- 3.12.1  Official 3.12.1 release
--     -- 4.00.0  Official 4.00.0 release
--     -- 4.00.1  Official 4.00.1 release
--     -- 4.01.0  Official 4.01.0 release
--     -- 4.02.0  Official 4.02.0 release`

とりあえずインストール出来たようです。
gemratというやつ

概ねRuby初心者。

普段`node`使ってて`npm install -D xxx`とかやると`package.json`に追加してくれるので、`ruby`にもおんなじようなやつないかなと思って探してたらあった。

[gemrat](https://github.com/DruRly/gemrat)

### Usage

    gem install gemrat  # gemratのインストール
    gemrat cocoapods

`gemrat`でインストールすると`Gemfile`に**バージョン込で(←※ここ重要)** 追記して`bundle install`してくれる
ちょー便利

> もっと簡単なやり方あったら教えてください。
bundle install と updateの違い

まずは改めて各ファイルの役割から。

>**Gemfile**：必要となるgemを記述します。
**Gemfile.lock**：現在使用しているgemのバージョンおよび特定のgemを使うためにインストールする必要のあるgemの一覧が管理されます。

んで、`bundle install` と `bundle update`ですが、

>**bundle install**：`Gemfile`に更新があれば、未インストールのgemがインストールされ、`Gemfile.lock`が更新される。更新がなければ`Gemfile.lock`に従ってgemの更新を行う。`Gemfile.lock`が存在しない場合は`Gemfile`に従ってgemの更新を行い、`Gemfile.lock`を作成する。
**bundle update**：`Gemfile`に従ってgemの更新を行い、`Gemfile.lock`を上書きする。


ということでした。PHPで`composer`はバンドルを`composer.json`に追加した際に、`composer update`をするので、gem追加時に`bundle install`をすることに慣れず、ちょっと戸惑いました。インストールしたgemは私の環境では`rbenv`というRubyのバージョンを簡単に変更できるサービスを利用しているので、`/home/vagrant/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/`に保存されていました。


ユースケースとしては

* 新環境で開発スタート：**bundle install**
* 開発中に新しいgemを追加：**bundle update**で常にバンドルを最新版に保つ
* デプロイ：**bundle install**

って感じがいいのかな、と思いました。開発環境だとできるだけ`bundle update`して、バンドルを最新版に保っておいてあげると仲間から喜ばれそうですね。くれぐれも本番環境で`bundle update`だけはアウトです。これは`composer`も一緒。
Metalsmithのソースファイル解説

# Metalsmith
EVERYTHING IS A PLUGINという思想の元に作られた静的サイトジェネレーター(static site generator)。
githubのリポジトリ：https://github.com/segmentio/metalsmith

# この記事の対象者
Metalsmithのビルドまではしたことがある人
ない人は[Metalsmith(静的サイトジェネレーター)の導入 - Qiita](http://qiita.com/maruloop/items/4c9ab4135ff1f3689d2a)

# ソースファイルの構造
ソースファイル(デフォルトでは、srcディレクトリにある)の解説。
ソースファイルの構造自体は、Jekyllとほぼ同じ。

下記のような構造になっている。

```hoge.html
---
title: My First Post
date: 2012-08-20
template: post.html
---
<h1>hoge</h1>
<p>fugafuga</p>
```

### YAML Front-Matter
ソースファイル上部の---で囲まれた部分は、YAML Front-Matterと呼ばれる。
メタ情報を書いたりするのに利用される。

```hoge.md
---
title: My First Post
date: 2012-08-20
template: post.html
---
```

YAML Front-Matterと呼ばれているが、JSON形式でも書ける。

```hoge.md
---
{"title":"My First Post", "date": "2012-08-20", "template": "post.html"}
---
```

### HTML部分
ソースファイルの下部は、HTMLなど書くことが出来る。
※metalsmith-markdownプラグインを入れることで、HTMLでなくmarkdownを書くことも出来る

# ソースファイルをビルドすると
このソースをビルドすると、

```hoge.html
---
title: My First Post
date: 2012-08-20
template: post.html
---
<h1>hoge</h1>
<p>fugafuga</p>
```

下記のようなJSONとして扱われ

```json
{
  "title":"My First Post",
  "date": "2012-08-20",
  "template": "post.html",
  "contents": "<h1>hoge</h1><p>fugafuga</p>"
}
```

このJSONが、テンプレートエンジンでレンダリングされる際に使われる。
metalsmith-permalinksの紹介

# metalsmith-permalinks
静的サイトジェネレーター(static site generator)Metalsmithのプラグイン。
github:https://github.com/segmentio/metalsmith-permalinks

# できること
about.html(もしくはabount.md)をビルドして、about/index.htmlのようにしてくれる。

metalsmith-permalinksによって、HTMLのリンク先が変わってしまうので、
それらはmetalsmith-collectionsを併用して、リンクを貼る。
※[metalsmith-permalinksを使った際のハイパーリンク - Qiita](http://qiita.com/maruloop/items/eea333cf6a6cb4f89f20)で解説

# この記事の対象者
Metalsmithをビルドまではしたことがある人
ない人は[Metalsmith(静的サイトジェネレーター)の導入 - Qiita](http://qiita.com/maruloop/items/4c9ab4135ff1f3689d2a)

# やり方
###1. metalsmith-permalinksのnode-moduleをインストールする

```
# MetalsmithのProjectのディレクトリ内で、npm install
npm install metalsmith-permalinks --save-dev

```

###2. metalsmith.jsonに指定して、適用する

```metalsmith.json
{
  "metadata": {
    "title": "My Blog",
    "description": "My second, super-cool blog."
  },
  "plugins": {
// ...略...
    "metalsmith-permalinks": {
      "pattern": "posts/:title" // about.htmlのYAML Front-Matterに指定したフィールド名を:hogehogeのように利用出来る
    },
    "metalsmith-templates": {
      "engine": "handlebars"
    }
  }
}
```

###3. ビルド
ビルドすると、生成物のディレクトリ(デフォルトはbuild)に、permalinkを貼れている生成物があるはず。
mrubyでC言語のソースにrubyスクリプトを埋め込むには

# .rbファイルをmrbcでコンパイル

mrbcコマンドで、rubyのスクリプトファイルをコンパイルして、
これをC言語のuint8_t型の配列として宣言したソースコードを出力
することが出来る。

```shell-session
mrbc -BcheckFile checkFile.rb
```

checkFile.cというファイルが出来る。
-oでこのファイル名を指定することも出来るらしい。

## 生成されたCのソースコード

```c
/* dumped in little endian order.
   use `mrbc -E` option for big endian CPU. */
#include <stdint.h>
const uint8_t
#if defined __GNUC__
__attribute__((aligned(4)))
#elif defined _MSC_VER
__declspec(align(4))
#endif
checkFile[] = {
0x45,0x54,0x49,//以下省略
};
```

# C言語側で.rbファイルのスクリプトを呼び出すには

```c

extern const uint8_t checkFile[];

mrb_load_irep(mrb, checkFile);

// 以降は、.rbファイルの内容に応じて頑張る。
mrb_value val;
val = mrb_funcall(mrb, mrb_top_self(mrb), "checkFile", 1,
                    mrb_str_new_cstr(mrb, filepath));
```

# なんでこんなことをするか

rubyのスクリプトのままだと、実行ファイルや共有ライブラリとして配布した際に、
スクリプトファイルも必要になってしまうが、mrbcで埋め込めば、これを回避できる。
CodeStyleをプロジェクトごとに設定してバージョン管理する

Android StudioでプロジェクトごとにCodeStyleを分ける方法です。
本来ならプロジェクトごとではなくチーム全体で統一すべきですが、とりあえず1つのプロジェクトで新しいCodeStyleを使ってみる、みたいな状況を想定しています。

今回は例として[SquareのCodeStyle](https://github.com/square/java-code-styles)を適用してみることにします。

#CodeStyleのインポート
[Installation](https://github.com/square/java-code-styles#installation)にしたがってインポートし、Android Studioを再起動します。
成功していれば、設定画面のCodeStyleのSchemeに、`Square` と `SquareAndroid` が追加されているはずです。

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/15267/db598c71-d0f2-c6a7-8b13-cbd399fa786c.png "Preferences.png")

#CodeStyleをProjectスキーマにコピー
そのまま`SquareAndroid`を選択して適用すると他のプロジェクトにも設定が反映されてしまうので、`SquareAndroid`の設定を`Project`にコピーします。

![Code_Style_Schemes.png](https://qiita-image-store.s3.amazonaws.com/0/15267/e0d7a656-b21b-dbf5-a898-9f2714c55be0.png "Code_Style_Schemes.png")

このProjectスキーマというのはプロジェクト固有でCodeStyleを保持するスキーマで、`<PROJECT_HOME>\.idea\codeStyleSettings.xml`に設定が保存されます。
つまりこれをgitで管理するようにすれば、他のチームメンバーが設定をインポートしたりすることなくCodeStyleを共有できます。

![AbstractDetailActivity_java_-__app__-_whovoice-android_-____work_whovoice-android_.png](https://qiita-image-store.s3.amazonaws.com/0/15267/1de3fd15-c8d8-2e94-206f-7b7e29933a8b.png "AbstractDetailActivity_java_-__app__-_whovoice-android_-____work_whovoice-android_.png")

`Project`を選択して Apply / OK を押せば完了です。

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/15267/bfc9e83e-fd1d-3bf8-3c4c-ce4993e6d9e1.png "Preferences.png")

# その他Tips
* [Android Studioでプロジェクト全ファイルをフォーマット整形する](http://qiita.com/konifar/items/0e388481ad584e29df47)
* [AndroidStudioで保存時に自動整形+import整理する（作業時間2分）](http://qiita.com/konifar/items/1f56c82490986d1613a8)
Rancher を動かしてみる

# 追記(2015/3/13 23:40)
CentOS 6 でRancher の管理サーバーまでは動いたのですが，コンテナの作成がどうにもうまくいかなかったので，Ubuntu でやり直しました →http://qiita.com/t-fukai/items/14e5218b4451a9ccd0c3
## はじめに
RancherというDockerのホストやコンテナを操作するツールを動かしてみました．
今回はRancherサーバーの起動とホストの追加までやってみました．

## Rancher とは
Rancher はオープンソースプロジェクトの1つで，Web UIやAPIを通してDockerのホストやコンテナを操作する機能を提供するものです．OpenStackやCloudStackのDocker版というのが僕のイメージです．
HP: http://rancher.com/
Github: https://github.com/rancherio/rancher

Github のReadme.md 曰く，機能としては以下のようなものがあるようです．

* multi-host networking
* global and local load balancing
* volume snapshots

Github の最初のコミットは昨年の11月(2014/11/08) で，現在活発に開発している真っ最中のようです．

##動作環境
今回はRuncherサーバー用のVMとDockerホスト用VMを各1台づつ用意して，Rancher を動かしてみました．
2つのマシンともOS はCentOS 6.6, Docker 1.4.1 です．
Dockerのバージョンは**1.4 以上**を要求されています．


```
$ cat /etc/redhat-release 
CentOS release 6.6 (Final)
$ docker version
Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8/1.4.1
OS/Arch (client): linux/amd64
Server version: 1.4.1
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): 5bc2ff8/1.4.1
```

##Rancher管理サーバー
以下のコマンドでRancherの管理サーバーが起動します．

```
# docker run -d -p 8080:8080 rancher/server
```

起動するとWeb UI が見れるようになります．
管理サーバーの80番ポートにアクセスしてみると，以下のようなUIが見れます．

![rancher-WebUI.png](https://qiita-image-store.s3.amazonaws.com/0/51342/ed763aa8-459d-3f02-8c20-d2f5fd663d0a.png)


##Dockerのホストを追加
追加したいホストマシンで以下のコマンドを実行すると追加できます．

```
# docker run --rm -it --privileged -v /var/run/docker.sock:/var/run/docker.sock rancher/agent http://<管理サーバのIP>:8080
```

僕の環境では，このコマンドを実行した時に一度以下のようなエラーがでて，もう一度同じコマンドを実行するとうまく動きました．Dockerで他のコンテナを動かしていたのが何か影響したのかもしれませんが，原因はよくわかってません．

```
FATA[0050] Error response from daemon: Cannot destroy container 413311abca605b42e6b142c4fcee5d678e4e21dee4bd2c70964a876f9019ea8e: Driver devicemapper failed to remove root filesystem 413311abca605b42e6b142c4fcee5d678e4e21dee4bd2c70964a876f9019ea8e: Device is Busy
```

ホストの追加に成功すると，Web UIから追加したホストを見ることができます．

![rancher-add-host.png](https://qiita-image-store.s3.amazonaws.com/0/51342/3775415b-1112-88f9-e33c-5ff7354c7fc7.png)

## おわりに
とりあえずRancher の管理サーバーを動かして，ホストを1つ追加するところまでやってみました．
今後，コンテナの作成やコンテナ同士の連携などやってみたいと思います．
Unity5のGUIクラスに追加されたScopeについて


Begin/Endで行うGUIグループのヘルパー機能。usingステートを使ってIDisposableオブジェクトとして表現することが出来るようになりました。

## 使い方

今までは

```cs
void OnGUI ()
{
	GUILayout.BeginHorizontal();

	GUILayout.Label("Label 1");
	GUILayout.Label("Label 2");

	GUILayout.EndHorizontal();
}
```

これからは以下のようにして管理することが出来るようです。

```cs
void OnGUI ()
{
	using (var scope = new GUILayout.HorizontalScope()) {

		GUILayout.Label ("Label 1");
		GUILayout.Label ("Label 2");

	}
}
```

## オリジナルのScopeを作成する

HorizontalScopeをアセンブリブラウザで見てみると`GUI.Scope`を継承して作成することが出来るみたいですね。

![ss 2015-03-08 14.30.20.png](https://qiita-image-store.s3.amazonaws.com/0/5549/87546c8e-5abf-e9ec-958b-4f7af18cdb56.png "ss 2015-03-08 14.30.20.png")


### IndentScopeを作成してみる

エディターGUIでは`EditorGUI.indentLevel`によってインデントを変更することが可能です。これをScopeで実装してみましょう。

```cs:IndentScope.cs
using UnityEngine;
using UnityEditor;
public class IndentScope : GUI.Scope
{
	int _indentLevel;

	public IndentScope (int indentLevel)
	{
		_indentLevel = EditorGUI.indentLevel;
		EditorGUI.indentLevel = indentLevel;
	}

	protected override void CloseScope ()
	{
		EditorGUI.indentLevel = _indentLevel;
	}
}
```

以下のように使用することが出来ます。

```cs:NewBehaviourScript.cs
using UnityEngine;
using System.Collections;
using UnityEditor;

public class NewBehaviourScript : EditorWindow
{
	[MenuItem("Window/Example")]
	static void Open ()
	{
		GetWindow<NewBehaviourScript> ();
	}

	void OnGUI ()
	{
		using (var scope = new IndentScope(0)) {
			EditorGUILayout.LabelField ("IndentLevel 0");
		}

		using (var scope = new IndentScope(1)) {
			EditorGUILayout.LabelField ("IndentLevel 1");
		}

		using (var scope = new IndentScope(2)) {
			EditorGUILayout.LabelField ("IndentLevel 2");
		}
	}
}
```

![ss 2015-03-08 15.16.49.png](https://qiita-image-store.s3.amazonaws.com/0/5549/54561332-4107-24ac-b834-855b6d5dcfdc.png "ss 2015-03-08 15.16.49.png")
全角/半角のみをチェック

正規表現とかめんどくさいよね！

```php
function isZenkaku($string){
  return $string === mb_convert_kana($string, 'ASKH', 'UTF-8');
}
function isHankaku($string){
  return strlen($string) === mb_strlen($string, 'UTF-8');
}
```

どうでもいいけど住所欄に全角のみバリデーションって百害あって一利なしなので滅びろ。
VBS: ファイル一覧とフォルダ一覧の取得

なぜ枯れた技術に縋ってるんでしょうね

```vbnet
dim fso
set fso = createObject("Scripting.FileSystemObject")

dim folder
set folder = fso.getFolder("C:\")

' ファイル一覧
dim file
for each file in folder.files
    msgbox file.name
next 

' サブフォルダ一覧
dim subfolder
for each subfolder in folder.subfolders
    msgbox subfolder.name
next



```
Rでの混合正規乱数の発生方法

 
* [Rコードの最適化例：混合正規乱数の発生コード](http://www.okada.jp.org/RWiki/?R%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96%E4%BE%8B%EF%BC%9A%E6%B7%B7%E5%90%88%E6%AD%A3%E8%A6%8F%E4%B9%B1%E6%95%B0%E3%81%AE%E7%99%BA%E7%94%9F%E3%82%B3%E3%83%BC%E3%83%89)
* [混合正規乱数の生成](http://abrahamcow.hatenablog.com/entry/2014/06/21/033758)
* [裏 RjpWiki](http://blog.goo.ne.jp/r-de-r/e/edecbe96456c2319d2454a1477675b33)
* [Rで任意混合数の混合正規分布に従う乱数を作る](http://d.hatena.ne.jp/yanma/20080317/1205679707)
【小ネタ】コマンドプロンプトでジャンプコマンドの実装

# コマンドプロンプトでジャンプ

コマンドプロンプトで移動する際は皆さん `cd` を使っていると思います。
ただこれ移動した後良くアクセスするところに戻りたいとき結構めんどくさくないですか？

たとえば `"/Program files/Java/jre7/lib"` からデスクトップに移動したい

普通は 

```
cd ../../../users/[ユーザー名]/desktop 
```

か

```
cd /users/[ユーザー名]/desktop
```

あとは

```
cd %userprofile%/desktop
```

で移動するかと思います。

ここでパスを通したフォルダにこのバッチファイル入れておけば簡単に移動できます。
移動場所を増やしたいときもifとラベル増やせばOK

##使用法

```
jump.bat desktop
```

##実装

```bat:jump.bat
@echo off

if /I "%1" == "" goto USAGE
if /I "%1" == "desktop" goto DTOP
if /I "%1" == "home" goto HOME

goto ERROR

:DTOP
c:
cd %userprofile%/desktop

goto EOF

:HOME
c:
cd %userprofile%
goto EOF

:ERROR
rem echo ERROR

goto USAGE

:USAGE

echo jump.bat	TOKEN
echo 	TOKEN:
echo 		desktop
echo 		home


goto EOF

:EOF

```
Project Euler 40

問題
---
正の整数を順に連結して得られる以下の10進の無理数を考える:

```
   0.123456789101112131415161718192021...
```

小数第12位は1である.

dnで小数第n位の数を表す. `d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000 `を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2040

回答
---
各数の桁数からどの桁がどの数かは求められるから‥

などと考えたが、めんどくさくなり、単純に各数字を文字列として結合してから、生成した文字列の指定桁数を求めた。

```py
def main():
  ans = 1
  ls = ''.join([str(i) for i in range((10**5)*2)])
  for d in [10**j for j in range(7)]:
    ans *= int(ls[d])
  print ans
main()
```

logを使ってみた。こっちの方がメモリの節約になりそうかと思ったが、logのバグにより動かなかった。このバグを特定するのに1時間くらいかかった。

```py
from math import log

def main2():
  digits = [10**i for i in range(7)]
  N = 10
  ans = 1
  s = 0
  i = 1
  while digits:
    s += int(log(i,N))+1
    if s >= digits[0]:
      ans *= int(str(i)[digits.pop(0)-s-1])
    i+=1
  print ans
main2()
```

logのバグ
http://bugs.python.org/issue3724

```
>>>log(1000,10)
2,9999999999999996
```
回答： 発音を間違えやすいギョーカイ英単語

**(2016/02/19) このページは廃止しました。
直接 [発音を間違えやすいギョーカイ英単語](http://qiita.com/kuh96/items/03a7b55150fe07e11e5a) を見てください**

-----
[発音を間違えやすいギョーカイ英単語](http://qiita.com/kuh96/items/03a7b55150fe07e11e5a)
 1,2 の「無理やりカタカナ表記＋アクセント強調」と、3. 難問の回答です。
間違ってたら教えてください。

## 1. ほとんどのヒトが間違えてる？

* index  **イ**ンデクス
* parameter  パ**ラ**メタ ～ フランス語起源？
* agile **ア**ジャル

## 2. その他もろもろ

* label  **レイ**ブル
* mobile  （米） **モウ**ブル （英）**モウ**バイル
    * 参考 https://www.youtube.com/watch?v=fxhFUZJ6ub8
    * 動く彫刻のときは **モウ**ビール
* access  **ア**クセス
* matrix  **メイ**トリクス
* router  **ルー**タ　**ラウ**タ
* console  **コ**ンソウル
* null  **ナ**ル

3/8 追加

* launcher  **ロー**ンチャ
* energy  **エ**ナジー
* entropy **エ**ントロピー

3/28 追加

* equal  **イー**コル
* input  **イ**ンプット
* output **アウ**トプット

5/2 追加 ～ 7of9 さんのコメントより複合語 

* network **ネッ**トワーク
* kilometer （米）キ**ロ**ミータ （英）**キ**ロミータ
* bookmark **ブッ**クマーク
* website  **ウェ**ブサイト

9/26 追加

* technique *テク***ニー***ク*

## 3. 難問？

以下の3つだけが大きいオー

* cost
* lost
* doll 

聞き分けは難しいよね。won't ～ と want to ～ とかほぼ正反対の意味にんなってしまうし。特にイギリス英語の場合。
casbahでupsertする際のObjectIdに関する謎挙動

#### casbahでupsertする際のObjectIdに関する謎挙動

```scala
val id = new ObjectId

val where = DBObject("_id" $eq id) // <= (A)
val where = DBObject("_id" -> id)  // <= (B)

val set = DBObject("_id" -> id)

db("collection").update(where, set, upsert=true)
```

(A)のパターンのときにエラーになる。
(B)はOK。

`->`と`$eq`で意味が違うのか？？
`find`はどっちでやっても結果同じだけど。。。

`upsert`のときに発生。
`update`のときに`_id`変更NGなのは理解できるが。。。

---

失敗するパターン

```scala
val failed = { db: MongoDB =>
  println("失敗するパターン")
  
  val coll = db("sample")
  
  coll.drop
  
  val id = new ObjectId
  
  val where = DBObject("_id" -> DBObject("$eq" -> id))
  val set = DBObject("_id" -> id)
  
  val result = coll.update(where, set, upsert=true)
  /* ↑ここで例外発生
    com.mongodb.WriteConcernException
      serverUsed : "127.0.0.1:27017"
      ok : 1
      n : 0
      updatedExisting : false
      err : The _id field cannot be changed from {_id: { $eq: ObjectId('54fbcc2c3004a4267ff36eec') }} to {_id: ObjectId('54fbcc2c3004a4267ff36eec')}."
      code : 16836
  */
  println(result)
}
```

---

成功するパターン

```scala
val success = { db: MongoDB =>
  println("成功するパターン")
  
  val coll = db("sample")
  
  coll.drop
  
  val id = new ObjectId
  
  val where = DBObject("_id" -> id) // <= 変更箇所
  val set = DBObject("_id" -> id)
  
  val result = coll.update(where, set, upsert=true)
  // こっちは成功する
  
  println(result)
}
```

---

`cannot be changed`とか言ってるけど、upsert前にdropしてるからコレクション空っぽのはずだぞ。。。
回避策あるので深追いはしないが、、、みすてりー。

[gist](https://gist.github.com/fkmt-disk/3e30fc7e9e77d30ce2b7)にコード全文。
Project Euler 39

問題
---
辺の長さが {a,b,c} と整数の3つ組である直角三角形を考え, その周囲の長さを p とする. p = 120のときには3つの解が存在する:

```
   {20,48,52}, {24,45,51}, {30,40,50}
```

p ≤ 1000 のとき解の数が最大になる p はいくつか?
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2039

回答
---
各pに対し、a,bを変化させながら、`a^2+b^2`が`(p-a-b)^2`が等しいか否かを確認するというコードを書いた。なんとなくwhileで書いてしまったけど、forで書いたほうがよいような気もする。

```py
def main():
  MAX = 1000
  sq = [x**2 for x in range(MAX)]
  p = MAX-1
  d_max = 0
  ans = 0
  while p > 0:
    (a, b) = (p//2,p//2)
    d = 0
    while a > 0:
      if sq[a]+sq[b] == sq[p-a-b]:
        d+=1
      elif sq[a]+sq[b]< sq[p-a-b]:
        break
      while b > 0:
        if sq[a]+sq[b] == sq[p-a-b]:
          d += 1
        elif sq[a]+sq[b] < sq[p-a-b]:
          break 
        b -=1
      a, b = a-1, a-1

    if d > d_max:
      ans, d_max = p, d
      print ans, d_max
    p -= 1
  print ans
  
main()
```
cpanfileから消したはずの依存がcpanfile.snapshotに残る

cpanfileにCPANモジュールを追加して`carton install`したとする。追加したモジュールをcpanfileから削除して、もう一度`carton install`を実行したとき、最初に追加したCPANモジュールの依存が`cpanfile.snapshot`に残ったままになるという現象が起きた。

## 理由

cpanfile.snapshotはlocal/にインストールされているモジュールから生成されるが、cpanfileからモジュールを外してもlocal/からは削除されないから。

## 対処方法

- local/を消してから`carton install`する。
- `cpanm --local-lib-contained local --uninstall Module::Name`でlocal/からモジュールを削除してから`carton install`する。（※ドキュメントでは`--uninstall`はEXPERIMENTALと表示されていることに注意）
- [Re: Cartonで不要になったモジュールをcpanfile.snapshotから削除したい - skaji's blog](http://ks0608.hatenablog.com/entry/2015/06/12/023447)
  - cpanfileに登録されたモジュールを起点に再帰的に依存モジュールを取得してcpanfile.snapshotに書き出しているらしい。
  - 依存から外れたモジュールをlocal/から削除する機能はないので、`carton install`を実行すると、削除したモジュールがcpanfile.snapshotに再び追加される。`carton install`を実行したら`regen-cpanfile-snapshot.pl`を再実行すること。

### VCSのブランチ間でlocal/が食い違う問題

「ブランチAでモジュールXを追加したが、ブランチBでは追加していない」という場合、local/をVCSで管理していないと[^exclude-local]、ブランチBでもlocal/にモジュールXがインストールされた状態になるので、`carton install`を実行するとcpanfile.snapshotにモジュールXが追加されてしまう。

gitのpost-checkout hookでlocal/を入れ替えるなどの対策が考えられる（→[vzvu3k6k/carton-local-stash · GitHub](https://github.com/vzvu3k6k/carton-local-stash)）。

[^exclude-local]: [Cartonのドキュメント](https://metacpan.org/pod/Carton#Initializing-the-environment)ではlocal/をバージョン管理しない運用が推奨されている。

## 再現コード

```bash
mkdir tmp && cd tmp
echo "requires 'Nothing::Tiny';" > cpanfile
carton install

mv cpanfile.snapshot cpanfile.snapshot.0 # cpanfile.snapshotを外して
echo > cpanfile # cpanfileを空にする
carton install  # cpanfile.snapshotには何の依存もない状態になってほしいが……
diff -sq cpanfile.snapshot cpanfile.snapshot.0 # cpanfile.snapshot.0と同じ内容になる

rm -rf local
rm cpanfile.snapshot
carton install # 一度local/を消すと、cpanfileの指定通りのcpanfile.snapshotが生成される
diff -sq cpanfile.snapshot cpanfile.snapshot.0
```

## 内部処理

`carton install`の処理の実体はCarton::CLI::cmd_installにある。ざっくりまとめると

1. `$builder->install($env->install_path);`で依存モジュールをlocal/にインストールする。
  - 内部的にはcpanmを呼び出している（Carton::Builder::installを参照）
1. `$env->snapshot->find_installs($env->install_path, $env->cpanfile->requirements);`でlocal/にインストールされているモジュールを走査して`$env->snapshot->save;`でcpanfile.snapshotに書き出す。

という処理をしている。

## 関連

- [Remove modules in local that can't be reached from cpanfile · Issue #127 · perl-carton/carton](https://github.com/perl-carton/carton/issues/127)
- [carton-uninstall - uninstall modules from your local environment - metacpan.org](https://metacpan.org/pod/release/MIYAGAWA/carton-v0.9.10/docs/carton-uninstall.pod): `carton uninstall`というコマンドがあったが、[削除された](https://github.com/perl-carton/carton/commit/76204ccce01dab0ad307d67beeda9bf3357bbfde)。

---

<p>
This document is licensed under
    <a rel="license" href="http://creativecommons.org/publicdomain/zero/1.0/">CC0</a>.
</p>
VBS: 正規表現の使い方メモ


キャプチャの仕方を忘れる

```vbnet

' 普通の使い方
dim re, mc
set re = createObject("VBScript.RegExp")
re.pattern = "a(.)c"
set mc = re.execute("abc")

if mc.count > 0 then ' マッチしているか確認すること
    msgbox mc.item(0) ' "abc"
end if

' キャプチャ
dim submc
set submc = mc.item(0).submatches
msgbox submc.item(0) ' "b"


' その他フラグなど
re.ignoreCase = true ' 大文字小文字を区別しない
re.global = true ' 複数マッチ
re.multiline

```
Nexus Player 買ってみた、かつ Kodi（旧 XBMC）をインスコしてみる。そして「音声検索」トラブルなのだよ！

## Kodi（旧 XBMC）
オープンソースのメディアプレイヤーでローカル、インターネット、ストレージにある動画、音楽、ポッドキャストなどさまざまなマルチメディアファイルを再生できるオープンソースの再生プレイヤーです。
ちなみにAppleTVにもXBMCをインスコできるのだけど敷居が高くJailbreakしないとだったのですが、Nexus Player は、root化せずとも正規ルートでサイド・ロードインストールでき敷居も低そーなのでインストールしてみました。



## Kodi インスコの前準備
WindowsマシンとNexus PlayerをUSBで繋ぎ、adbコマンドでKodiをインストールしてみます。

### Java（JDK）のインストールとAndroid SDKの設定
下記のページを参照して、Java（JDK）のインストールとAndroid SDKをインストール、設定し adb コマンドを使用できるようにします。

> [【ADB】Java(JDK)とAndroid SDKを導入してADBコマンドを使えるようにする](http://andmem.blogspot.jp/2014/04/installjdkandroidsdkadb.html)
> [Androidの各種ドライバのインストール](http://andmem.blogspot.jp/2012/10/android.html)

### Nexus Player開発者モードに
Nexus Player の画面で 「設定 -> 端末情報 -> ビルド」のところでリモコンの真ん中ボタンを７回タップして開発者モードを有効にします。メニューに「開発者向けオプション」が表示されるので「USB デバッグ」を有効にしておきます。
※参考したサイトのほうがよくわかるかもｗ

> [Nexus Player ハンズオン - まずは Kodi（旧 XBMC）でより高度なメディア・ハブへ](http://netbuffalo.doorblog.jp/archives/4978009.html)
> [Nexus 7 Android 4.2で消えた開発者向けオプションを表示させる方法。](http://androidlover.net/smartphone/galaxynexus/android-4-2-developer-options.html)

## Nexus Player と PCを接続する
Nexus Player と PCを接続するには、microUSB Bケーブルで接続します。接続するとNexus Playerの画面に「allow USB debugging?」がでるので（うるおぼえです）。okを押しときます。

PCの黒い画面(dos窓)を出して、次のコマンドを実行します。ここでdeviceリストに下記のように１つ以上表示されない場合は、Java,SDK,接続のokなどを再確認すること。
※ちなみにdeviceの値は、個体別に違うよー

```
C:\>adb devices
List of devices attached
11179C2B        device
```

### kodi をダウンロードする
http://kodi.tv/download/ から、ドルイド君マークの x86 をダウンロードする。
2015/3/7時点では kodi-14.1-Helix-x86.apk です。


### インストールする
adb コマンドを使用してapkパッケージをインストール。11179C2B は、devices で表示された値を指定する。

```
C:\>adb -s 11179C2B install kodi-14.1-Helix-x86.apk
8782 KB/s (64202487 bytes in 7.138s)
        pkg: /data/local/tmp/kodi-14.1-Helix-x86.apk
Success
```

できあがりー。これで Nexus Player のトップ画面に kodi が表示されています。

# アンインストールするとき
パッケージ名をまず調べて、削除する。

```
C:\>adb -s 11179C2B shell pm list package
C:\>adb -s 11179C2B uninstall org.xbmc.kodi
```

## kodi の設定
こちらも下記サイト様の方がよくかかれているのでそちらを参照

> [Nexus Player ハンズオン - まずは Kodi（旧 XBMC）でより高度なメディア・ハブへ](http://netbuffalo.doorblog.jp/archives/4978009.html)
> [Windows用のDLNAクライアントとしてXBMCを使ってみる](http://signal-flag-z.blogspot.jp/2013/09/windowsdlnaxbmc.html)

## 音声検索ができなくなった
音声検索がすごい便利で、例えば「AKB」と音声で検索すると YouTube、Hulu とかとか検索してくれるのですけどね。突然、音声検索ができなくなりました。
症状としては、音声検索すると「Googleに接続できません」とエラーになる。

2015/05/19現在 既出の問題らしく多くの人がこの問題を抱えてますｗ
「nexus player 音声検索 不具合」で検索するとよろし。

[音声検索のトラブル改善方法教えてください](http://bbs.kakaku.com/bbs/K0000738912/SortID=18782455/)


とりあえずの回避策(2015/05/20)

・リモコンの[検索]ボタン⇒検索したい言葉⇒まるボタンの真ん中を、クリックってやると検索できる
Project Euler 38

問題
---
192 に 1, 2, 3 を掛けてみよう.

```
   192 × 1 = 192
   192 × 2 = 384
   192 × 3 = 576
```

積を連結することで1から9の パンデジタル数 192384576 が得られる. 192384576 を 192 と (1,2,3) の連結積と呼ぶ.

同じようにして, 9 を 1,2,3,4,5 と掛け連結することでパンデジタル数 918273645 が得られる. これは 9 と (1,2,3,4,5) との連結積である.

整数と (1,2,...,n) (n > 1) との連結積として得られる9桁のパンデジタル数の中で最大のものはいくつか?
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2038

回答
---
まず、指定した数字のセットから指定した桁数のパンデジタル数（文字列）を生成するジェネレータを作ってみた。

```py
import copy
def pandigital(digit,seq1,seq2=[]):
  iter1 = map(str,seq1)
  if seq2:
    iter2 = map(str,seq2)
  else:
    iter2 = copy.deepcopy(iter1)
  for d in range(digit-1):
    iter1 = (x+y for x in iter1 for y in iter2 if not (y in x))
  return iter1
```

先頭に0を含まず、かつ、10桁のパンデジタル数のジェネレータを生成するときは次のように指定する。seq2を省略すると、seq1がseq2にコピーされる。

```py
 pandigital(digit=10,seq1=range(1,10),seq2=range(0,10))
```

なお、このジェネレータは、range(1,10)を渡せば小さい順から値を返し、range(10,1,-1)を渡せば大きい順から値を返す、・・・と思う。

本問の回答にあたっては、上記関数を用いて、まず9桁のパンデジタル数の集合PAND_SETを作成する。後に、他の数がこのパンデジタル数の集合に含まれているか否かを参照するため、参照スピードを考慮してここではset()を使ってセット型オブジェクトにしておく。

次に、iを2から10,000までのループさせ、sが9桁の数（の文字列）になるまで、次の計算を行う。
s = str(i) + str(i*2) + str(i*3) ・・・

このようにして算出したsが答え候補ansよりも大きく、かつ、sがPAND_SETに含まれているかを確認する。もし両方が真であれば、ansをsで置き換える。

```py
import pandigital
def main():
  SEARCH_MAX = 10**4
  PAND_SET = set(pandigital.pandigital(9,range(1,10)))
  ans = 0

  for i in range(2,SEARCH_MAX):
    s = str(i)
    j = 2
    while len(s)<9:
      s += str(i*j)
      j+=1
    if len(s)>=10:
      continue
    if int(s) > ans and s in PAND_SET:
      ans = int(s)
  print ans
main()
```
vzquota : (error) quota file is corruptedの対処

以下エラーが出て起動しない。

```bash:
# zctl start 270
Starting container ...
vzquota : (error) quota file is corrupted
vzquota on failed [4]
```

## 参考

* [OpenVZ Forum: Support » vzquota : (error) quota file is corrupted | vzquota on failed [4]](http://forum.openvz.org/index.php?t=msg&goto=37621&)

## 対処

```bash:
# vzquota off 270 -f
# vzquota drop 270
```

## 起動確認

```bash:
# vzctl enter 270
vzctl start 270
Warning: distribution not specified in CT config, using defaults from /etc/vz/dists/default
Starting container ...
Initializing quota ...
Container is mounted
Setting CPU units: 1000
Setting CPUs: 1
Container start in progress...
```
iOS8 safariではviewportが解釈されるよりも前にJavaScriptが実行されるらしい

したがって、スマートフォンサイトでよくあるように、viewportで以下のように設定していた場合、

```html
  <meta name="viewport" content="width=device-width">
```

`window.innerHeight`や`window.innerWidth`の値が意図したように取得できない。

## 実検

```html:html
<body>
  <script type="text/javascript">
  (function(){
    //即時関数で取得
    document.write('<p>window.innerHeight(instant): <span>'+ window.innerHeight + 'px</span></p>');
    document.write('<p>window.innerWidth(instant): <span>'+ window.innerWidth + 'px</span></p>');
  })();
  </script>
  <!-- DOMContentLoaded -->
  <p>window.innerHeight(DOMcontentLoaded): <span id="a_1"></span>px</p>
  <p>window.innerWidth(DOMcontentLoaded): <span id="a_2"></span>px</p>
  <!-- window.onload -->
  <p>window.innerHeight(onload): <span id="b_1"></span>px</p>
  <p>window.innerWidth(onload): <span id="b_2"></span>px</p>
</body>
```

```js:javascript
document.addEventListener( "DOMContentLoaded", function(){
	var a1 = document.getElementById('a_1');
	a1.innerText = window.innerHeight;
	var a2 = document.getElementById('a_2');
	a2.innerText = window.innerWidth;
}, false );

window.onload = function () {
	var b1 = document.getElementById('b_1');
	b1.innerText = window.innerHeight;
	var b2 = document.getElementById('b_2');
	b2.innerText = window.innerWidth;
};
```

結果は以下の通り。
閲覧環境は、iOS8.1.3 iPhone5S Mobile Safari

> window.innerHeight(instant): 1409px
> window.innerWidth(instant): 980px
> window.innerHeight(onload): 460px
> window.innerWidth(onload): 320px
> window.innerHeight(DOMcontentLoaded): 460px
> window.innerWidth(DOMcontentLoaded): 320px

このように、読み込みを待たずに即時にJavaScriptを実行した場合だけ、``width=device-width``が効いてない状態の値を取得しているようだ。
これはなかなかに衝撃的である。

同じ端末のChromeで確認した場合には、即時実行(instant)した場合でもロードを待ってから実行したのと同じ値が取得できた。
また、Android端末（android4.0.4 標準ブラウザ Galaxy S2）でも、全て同じ値だった。
iOS7以前ではどうだったかまでは確認できてないが、おそらくは即時実行させても同じ値を取得したのではないかと思われる。（iOS8だけで発生していた不具合に、本件を原因と見立てた対策をしたところ問題が解消したため。）

この結果から、iOS8のmobile safariのviewport解釈のタイミングの問題だと推測してみたが、実際のところこの結果が何を意味するのか私は正確には理解していない。諸賢のご意見をうかがいたい。
初体験の Windows Server 2012

わたしは本社の開発なんだけど、製品事業のほうから Jenkins さんのセットアップを頼まれた。
マスターは CentOS にしてもらったが、スレーブは Windows Server 2012 とのこと。

特に xxnix が得手というわけではないが Windows は大の苦手、その上 2012 どころか Windows Server というものに触ったことがない。
  **君子危うきに近寄らず！**

まあやってみっか、ということで RD でログイン。
な、なんと。これが悪評高い Windows 8 風スタート画面というやつか！
どこになにがあるんかコマンドプロンプトを出すにはどうすりゃええんかさっぱりわからん。

Jenkinsスレーブなら本来 Windows 7 で十分。
リモートデスクトップが 1 セッションしか使えないのは痛いが。。

Server は CAL 追加も必要だが、標準で 2 セッションと聞いた。
でもリモートデスクトップが終了してしまう場合がある。どうもデフォルトで 1 セッションになっているみたい。

これはググッて見るとすぐ解決。でも「セッション数」に何も表示されない。後でタスクマネージャで見れることが判明。

Java と .NET 3.5 を追加インストールをしてもらって、何とかスレーブのサービス化まで終了。

と、ところが、ログオフボタンはどこや～
え、こんなとこにあるんか！

というわけで、製品事業のサーバーなので、へんな設定をしないよう気を使うし、あれやこれやでえらく疲れた金曜日でした :fearful:
subversionで元々空のコミットをsvndumpfilterで取り除く

リポジトリの歴史改変をしていると時々発生する話です。svndumpfilterの結果空になるコミット番号を除去するには--drop-empty-revsオプションをつけてsvndumpfilterをすれば良いのですが、このオプションをつけないで実行すると空コミットが採番され、もう一度svndumpfilter --drop-empty-revsを通しても除去できなくなります。--drop-empty-revsは元々空のコミットには影響しない仕様だそうで。

# --drop-all-empty-revs
超マイナーオプション --drop-all-empty-revs というものがあり、これは既に空になっているコミットも除去してくれます。それだけです。[英語なら情報あります](http://stackoverflow.com/questions/9791317/svndumpfilter-drop-empty-revs-keeps-padding-revision)が日本語であんまり見つからなかったので記録しておきます。

# いつ使うの？
svndumpfilterを多用した後のリポジトリをgit svn cloneしようとしたら変なエラーでcloneできなかったことがありました。そのときの原因がsvn上の初回コミットが空になっていたからでした。
Yosemiteアップデート後にrubyのKernel情報を更新方法

# 概要
* Yosemiteにアップデートしたけれど、rubyのKernel情報は変わっていなかった(Mavericksのまま)ので、Yosemiteのカーネルを認識させた時の備忘録です。
* YosemiteとMavericks間でbundle installをするとインストールされるバージョンが変わり、Gemlock.lockが毎回差分が出てしまっていたのでYosemiteにアップデートしたが状況が改善されなかった。

# 環境
* rbenv 0.4.0

# 原因
ruby -v のversionを確認したらdarwin13のままだった

```
$ ruby -v
$ ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]
```

# 解決方法
再インストールしました。

```
$ rbenv uninstall 2.1.3
$ rbenv install 2.1.3
$ ruby -v 
$ ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin14.0]
```

# その他
再インスールなので、以下を実施してgem系を再インストール

```
$ gem install bundle
$ cd (projcectのカレントに移動)
$ bundle install
```

上記のインストールでnokogiriのエラーが出た場合には以下で解決しましたので、ご参考ください。

* [Yosemiteにアップデート後bundle install ができなくなった話](http://qiita.com/nakanowax/items/ef70fa43bc8069ca6bbe)
[GoogleAppEngine]DjangoのClass-based View用の@login_required

# はじめに

Google App Engine/Python で、ユーザーがログインしていなかったらログイン画面にリダイレクトしてくれる
`@login_required` というデコレータ。

https://cloud.google.com/appengine/docs/python/tools/webapp/utilmodule#login_required

```python:appengine/ext/webapp/util.py
def login_required(handler_method):
  """A decorator to require that a user be logged in to access a handler.

  To use it, decorate your get() method like this:

	@login_required
	def get(self):
	  user = users.get_current_user(self)
	  self.response.out.write('Hello, ' + user.nickname())

  We will redirect to a login page if the user is not logged in. We always
  redirect to the request URI, and Google Accounts only redirects back as a GET
  request, so this should not be used for POSTs.
  """
  def check_login(self, *args):
	if self.request.method != 'GET':
	  raise webapp.Error('The check_login decorator can only be used for GET '
						 'requests')
	user = users.get_current_user()
	if not user:
	  self.redirect(users.create_login_url(self.request.uri))
	  return
	else:
	  handler_method(self, *args)
  return check_login
```

（コードは SDK より引用）

非常に便利なんですが、これは webapp にしか対応していないため
Django 用に書き直してみた。
Class-based View（クラスベース汎用ビュー）用です。



# コード

```python:util.py
# -*- coding: utf-8 -*-
from django.http import HttpResponsePermanentRedirect
from google.appengine.api import users


def login_required(handler_method):
	u"""Django の Class-based View 用デコレータ

	Example:
		class MyView(View):

			@login_required
			def get(self, request):
				user = users.get_current_user()
				...
	"""
	def check_login(self, request, *args):
		user = users.get_current_user()

		if not user:
			login_url = users.create_login_url(request.get_full_path())
			return HttpResponsePermanentRedirect(login_url)
		else:
			return handler_method(self, request, *args)

	return check_login
```
OS XでCUIだけでタスクを落とす

### killしたいタスクのIDを調べる

```bash
ps aux | grep "Application Name"
```

- ps: **p**rocess **s**tatus
- aux:
  - **a** all users
  - **u** detailed information
  - **x** include daemons
- grep: **g**lobal **r**egular **e**xpression **p**rint

見にくい時は単純に

```bash
ps a | grep "Application Name"
```

でOK

### タスクを落とす

```bash
kill -9 [process id]
```

-9 は -SIGKILL でもOK（よりニーモニック）
続 a*x + b*y = gcd(a,b) を解くプログラム

[a*x + b*y = gcd(a,b) を解く](http://qiita.com/kuh96/items/9f0c3562db6d9e6cd410)　の応用問題２つ。

# 多変数版

ベズーの等式は3変数以上についても成り立ちます。

$a_{1}x_{1} + a_{2}x_{2} + \cdots + a_{n}x_{n}= gcd(a_{1}, \cdots, a_{n})$

与えられた整数 $a_{1}, \cdots, a_{n}$ から、上を満たす整数 $x_{1}, \cdots, x_{n}$
を１組求めるプログラムを作ってください。

# 多項式版

ベズーの等式は多項式についても成り立ちます。

$a(x)f(x) + b(x)g(x) = gcd(a(x), b(x))$

与えられた多項式　$a(x), b(x)$ に対して、
上を満たす多項式　$f(x), g(x)$ を１組求めるプログラムを作ってください。

ただし多項式の係数は、体（たい、field ～　余りのない割り算ができる）であることが必要です。

実数、複素数ではプログラム困難なので、係数は有理数であるとします。

*  より簡単には「有限体」 $F_{p} = \frac{Z}{pZ} \ ただしp\ は素数$ でもかまわない
*  例えば　$F_{7}=[0,1,2,3,4,5,6]$ なら、計算途中で 7 を超える or 負になったら、それを常に 7 で割った余りに置き換えて計算する

##  ちょっとだけ数学

（工事中）
AVAudioPCMBufferがAVAudioPCMFormatFloat32の場合


私的メモ



####ハマった点

C側でconst float ** を定義すると何故か UnsafeMutablePointer＜UnsafePointer＞の順序になる。元の定義はUnsafePointr＜UnsafeMutablePointer＞なので逆？この理由はよくわからないが無理やりキャストして呼び出してみたところ問題なくアクセスできた。
ScalatraでFormDataを受け取る

HTML5のFormDataを使うとAjax使ってる時はパラメータ作るのがとても楽になるので重宝してます。
FormDataを使えば、ファイルアップロード処理だってAjaxでできるようになるので、見えないiframeにsubmitして...なんて面倒なことをしなくて済みます。

WebフレームワークにScalatraを使っている時にFormDataをjQueryでAjax通信しようとしてうまく行かなかったので、その備忘録を。


わかれば単純。
リクエストを受け取るServletに[FileUploadSupportをmixin](http://www.scalatra.org/2.4/guides/formats/upload.html)しておくだけ。

後は、いつものように、

```javascript
var formData = new FormData();
//・・・ごにょごにょしてFormDataを作る

$.ajax({
    url: 'リクエスト先URL',
    type: 'POST',
    dataType: 'json',
    data: formData,
    processData: false,
    contentType: false
}) //・・・後はいつもの感じで
```

とやっておけば、ちゃんとリクエストパラメータが取れるようになります。ファイルアップロードをしなくてもFileUploadSupportをmixinする必要があるみたいです。

ちなみに、[scalatra-forms](https://github.com/takezoe/scalatra-forms)も併せて使っていますが、マッピングも問題ないです。


ただし、multiParamsで取るような配列の要素

```html
<input type="text" name="datas" value="abc">
<input type="text" name="datas" value="def">
<input type="text" name="datas" value="123">
```

を送るような時は注意が必要ですが、それは次回...
Debian + IceWM で何かの key を押すと入力が變になる問題

ThinkPad X40 の上で Debian + IceWM を利用してゐる．何かの key を押すと入力が變になつてしまふ．例へば c を押すと France 語の ç が出るやうになつてしまふ．どうすれば戻せるかわからないので，いつもしかたなく reboot してゐる．
ログをデバッグ時にブラウザに出力する

2015年の現在であってもPHPでのWebアプリケーション開発は、なんだかんだといってブラウザでの目視確認に頼りがちだ。

なので、ロガーに流した内容は開発環境ではブラウザでそのまま見えた方がべんり… なこともあるんじゃないかなあ、たぶん。

そんなわけで、Logger Guardなるものを作った。

* [BaguettePHP/LoggerGuard](https://github.com/BaguettePHP/LoggerGuard)
* [zonuexe/logger-guard - Packagist](https://packagist.org/packages/zonuexe/logger-guard)

PSR-3についてご存じない方は [PSR-3 Logger Interfaceの話 - 泥のように](http://blog.tojiru.net/article/356923949.html) を読んでほしい。

## インストール

Composerをインストールしてるプロジェクトなら、コマンドラインで `composer require 'zonuexe/logger-guard'` って実行するだけですよ。

## 設定

このライブラリは、あくまでデバッグ用(当たり前だ)なので、開発環境以外で`new Teto\Logger\Guard`されることがないように注意して欲しい。

```php
<?php

$logger = new \Monolog\Logger('myapp');
$logger->pushHandler(new \Monolog\Handler\ErrorLogHandler);

// 開発環境では define('DEBUG', true) してある想定
if (defined('DEBUG') && DEBUG) {
    $guard = new Teto\Logger\Guard($logger, 'notice');
}

// ↓ あとはふつうに実装するだけ

$logger->debug('printデバッグ');
$logger->info('ログイン情報とか');
$logger->error('エラーっぽい感じ');
$logger->warning('怪しげな感じ');
$logger->notice('大事なことなのでry');
$logger->crit('致命的なエラーとか');
$logger->alert('たすけてえーりん');
$logger->emerg('もうだめぽ');

// 後処理は特に書く必要はなくて、勝手に出力される
```

あと、[Monolog](https://github.com/Seldaek/monolog)はかなり柔軟で扱ひやすい構造になってるので、知らなかったひとは使ってみてほしい。

## 出力

[headers_list()](http://php.net/manual/ja/function.headers-list.php)から勝手にレスポンスのContent-typeを取得してきてログのフォーマッターを選ぶので、別に何もしなくていい。

`Content-type: text/plain` みたいなときは、ちゃんとHTMLが吐かれないようにはしてる。

## Guardって何

オブジェクトのデストラクタで副作用を起こすことを目的にした実装パターンのことを **guard object** とか **scope guard** とか呼ぶらしいので、それにあやかった。

C++もPerlもよくわかんないんだけど。

* [More C++ Idioms/スコープ防壁(Scope Guard) - Wikibooks](http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E9%98%B2%E5%A3%81%28Scope_Guard%29)

デストラクタから例外が投げられると致命的エラーになるので使ひどころを見極めるのが難しい処理ではあるのだけれど、今回のようにデバッグ用途でならアリかな、と言った感じだ。

## あとがき

PHPにもマクロ欲しいなと思った。

## 追記

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">PHP - ログをデバッグ時にブラウザに出力する by <a href="https://twitter.com/tadsan?ref_src=twsrc%5Etfw">@tadsan</a> on <a href="https://twitter.com/Qiita?ref_src=twsrc%5Etfw">@Qiita</a> <a href="http://t.co/sao1LbD0yC">http://t.co/sao1LbD0yC</a> そういやChromeLoggerなんていう便利な拡張があってだな......最近使ってないけどあっちはどうなった</p>&mdash; 保 登 心 愛 (@hnle0) <a href="https://twitter.com/hnle0/status/574490991530409984?ref_src=twsrc%5Etfw">March 8, 2015</a></blockquote>

良い質問ですね！

これを利用するには、お手元のGoogle Chromeに[Chrome Logger - Chrome ウェブストア](https://chrome.google.com/webstore/detail/chrome-logger/noaneddfkdjfnfdakjjmocngnfkfehhd)をインストールして、コードに一行追加するだけで良い。

```php
<?php

$logger = new \Monolog\Logger('myapp');
$logger->pushHandler(new \Monolog\Handler\ErrorLogHandler);

// 開発環境では define('DEBUG', true) してある想定
if (defined('DEBUG') && DEBUG) {
    // ↓ この行を追加するだけ
    $logger->pushHandler(new \Monolog\Handler\ChromePHPHandler('NOTICE'));
    // ↑ ここまで
    $guard = new Teto\Logger\Guard($logger, 'notice');
}
```

Guardは全然関係なかった！ この場合も、開発環境の外でお漏らししないように気をつけてくださいね。

FirePHPってのもあるらしく、Monologも対応してるので、興味があったら調べてみてください。
Go言語 １３日の金曜日をjson形式で出力する

[Qiita - 13日の金曜日を返すプログラム](http://qiita.com/SnowLeopard_/items/77a62e2eabfb5410a7e5)

こちらの記事を見て、面白そうだったのと暇だったので作ってみた次第です。

エンジニアにとっては、１３日の金曜日はJSONと戯れる日として認知されているようです。
[１３日の金曜日　json - Google 検索](https://www.google.co.jp/search?num=20&site=&source=hp&q=%EF%BC%91%EF%BC%93%E6%97%A5%E3%81%AE%E9%87%91%E6%9B%9C%E6%97%A5+json&oq=%EF%BC%91%EF%BC%93%E6%97%A5%E3%81%AE%E9%87%91%E6%9B%9C%E6%97%A5%E3%80%80&gs_l=hp.3.0.35i39l2j0l8.2886.7476.0.8843.26.22.3.0.0.3.289.2798.0j7j7.14.0.msedr...0...1c.1j4.62.hp..14.12.1760.0.lMDYszZnp4Q)


```jason.go
package main
 
import (
	"encoding/json"
	"errors"
	"fmt"
	"io/ioutil"
	"os"
)
 
type Jason struct {
	Year  int
	Month []int
}
 
func yobi(year int, month int) (int, error) {
	if year < 0 {
		return 0, errors.New("input error!!")
	}
 
	if month == 1 || month == 2 {
		year -= 1
		month += 12
	}
	return (year + year/4 - year/100 + year/400 + (13*month+8)/5 + 1) % 7, nil
}
 
func EncodingJSON(jason Jason) []byte {
	bdata, err := json.Marshal(jason)
 
	if err != nil {
		fmt.Println(err)
		return nil
	}
	return bdata
}
 
func main() {
	var (
		year       int
		pyobi      int
		jasonMonth []int
		err        error
	)
	fmt.Printf("Please, input year.->")
	fmt.Scan(&year)
 
	for month := 1; month <= 12; month++ {
		pyobi, err = yobi(year, month)
 
		if err != nil {
			fmt.Println(err)
			return
		}
 
		if pyobi == 0 {
			jasonMonth = append(jasonMonth, month)
		}
	}
 
	jason := Jason{year, jasonMonth}
	bdata := EncodingJSON(jason)
	os.Stdout.Write(bdata)
 
	content := []byte(bdata)
	ioutil.WriteFile("jason.json", content, os.ModePerm)
}
```

[gist](https://gist.github.com/mizukmb/22cb922eac7dfdb87f2d)はこちら

## Usage
１３日の金曜日を調べたい西暦を入力して下さい。
例)2015年の場合

```
$ go run jason.go
Please, input year.->2015
{"Year":2015,"Month":[2,3,11]}
```

実行すると `jason.json` ファイルが出来上がります。

```
$ ls
jason.go jason.json
$ cat jason.json 
{"Year":2015,"Month":[2,3,11]}
```

一応、0以下の数値を与えるとエラーになります。
おわりです。

## 参考
KOBE GDG: Go言語でJSONを扱う, http://kobegdg.blogspot.jp/2013/03/gojson.html
Go言語でファイル操作: ファイルを作って書き込む - Qiita -, http://qiita.com/suin/items/7eb4fc405ac73846a9b1
Rubyのrequireに渡す文字列って大文字でもいいのかな？

環境:
Mac (OS X Yosemite 10.10.2)
Ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]

どうでもよさそうなバグっぽい事象のメモその2
ものすごいうんこ記事かもしれないけど深夜の魔力のせいで投稿 (たぶん明日起きてから後悔しそう)

ドキュメント: [module function Kernel.#require](http://docs.ruby-lang.org/ja/2.2.0/method/Kernel/m/require.html)

なんか大文字にしてもrequireできた

```rb
irb(main):001:0> require 'DATE'
=> true
```

大文字にする箇所を変えると別のライブラリだと見なされるっぽくて、もう一回requireできる

```rb
irb(main):002:0> require 'DATE'
=> false
irb(main):003:0> require 'date'
=> true
irb(main):004:0> require 'date'
=> false
irb(main):005:0> require 'DAte'
=> true
irb(main):006:0> require 'DAte'
=> false
```

同じライブラリを2回requireすると、ものによっては「もう読み込まれてっぞ！！！」ってすごい怒られる

```rb
irb(main):007:0> require 'oPeN-uRi'
=> true
irb(main):008:0> require 'open-uri'
/usr/local/Cellar/ruby/2.2.1/lib/ruby/2.2.0/open-uri.rb:98: warning: already initialized constant OpenURI::Options
/usr/local/Cellar/ruby/2.2.1/lib/ruby/2.2.0/oPeN-uRi.rb:98: warning: previous definition of Options was here
/usr/local/Cellar/ruby/2.2.1/lib/ruby/2.2.0/open-uri.rb:387: warning: already initialized constant OpenURI::Buffer::StringMax
/usr/local/Cellar/ruby/2.2.1/lib/ruby/2.2.0/oPeN-uRi.rb:387: warning: previous definition of StringMax was here
/usr/local/Cellar/ruby/2.2.1/lib/ruby/2.2.0/open-uri.rb:485: warning: already initialized constant OpenURI::Meta::RE_LWS
/usr/local/Cellar/ruby/2.2.1/lib/ruby/2.2.0/oPeN-uRi.rb:485: warning: previous definition of RE_LWS was here
/usr/local/Cellar/ruby/2.2.1/lib/ruby/2.2.0/open-uri.rb:486: warning: already initialized constant OpenURI::Meta::RE_TOKEN
/usr/local/Cellar/ruby/2.2.1/lib/ruby/2.2.0/oPeN-uRi.rb:486: warning: previous definition of RE_TOKEN was here
/usr/local/Cellar/ruby/2.2.1/lib/ruby/2.2.0/open-uri.rb:487: warning: already initialized constant OpenURI::Meta::RE_QUOTED_STRING
/usr/local/Cellar/ruby/2.2.1/lib/ruby/2.2.0/oPeN-uRi.rb:487: warning: previous definition of RE_QUOTED_STRING was here
/usr/local/Cellar/ruby/2.2.1/lib/ruby/2.2.0/open-uri.rb:488: warning: already initialized constant OpenURI::Meta::RE_PARAMETERS
/usr/local/Cellar/ruby/2.2.1/lib/ruby/2.2.0/oPeN-uRi.rb:488: warning: previous definition of RE_PARAMETERS was here
=> true
```
(rbenvも入れてるけど起動遅いから普段はbrewのやつそのまま使ってます)

# 蛇足

全然関係ないけどrequireに複数の文字列を渡したりシンボル渡したりしたいとたまに思う
のでそういう関数

```rb
# 複数の文字列 or シンボルを一気にrequireする
# 成功したか失敗したかをbooleanの配列で返す

def req(*features)
  features.flatten.map{|s|require s.to_s}
end
```

```rb
irb(main):004:0> req :date
=> [true]
irb(main):005:0> req :yaml, :yaml
=> [true, false]
irb(main):006:0> req %w|cgi open-uri zlib|
=> [true, true, true]
```
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」ゲームパッド情報を合成

# ゲームパッドの情報を合成
ゲームパッドの機能を追加しました。
今まで、

**PADAXES**

と、

**ANALOGSTICK**

で、ジョイパッドの方向指示キーとアナログスティック、もしくはキーボードのカーソルキーとバーチャルゲームパッドの情報は完全に分離していましたが、「**environ.coffee**」に、

```coffeescript
    GAMEPADMIX = true
```
というパラメータを追加すると、「**ANALOGSTICK[0][0]**」（コントローラー番号0のスティック番号0）に方向指示の情報も反映されるようにしました。
どういうことかというと、アナログスティックの返す情報は「**-1〜1**」になっていますが、方向指示キーを押すと該当する値が振り切れます。
例えば、上を押した場合は、「**ANALOGSTICK[0][0][VERTICAL]**」の値が-1になります。
ですので、単純にキャラクタ移動させるゲームでは、移動量に「**ANALOGSTICK**」を使うことで細かい移動が出来るようになります。

2015.03.08以降のバージョンをpullするかcloneし直し、ゲームプロジェクトで「**enforce update**」すると使えるようになりますが、「**environ.coffee**」は更新されないので、上記のパラメータ「**GAMEPADMIX**」は自分で追記する必要があります。

アナログスティックの情報はバーチャルゲームパッドのアナログ情報も反映されていますので、結果的に

* アナログゲームパッド
* ゲームパッドの方向キー
* バーチャルゲームパッドのアナログ情報
* キーボードのカーソルキー

の情報が合成されます。

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
NodeJSで入れておきたいパッケージまとめ


実運用でNodeJSをやるなら
入れておきたいnpmパッケージ

----------------------
○開発モード
コード修正時に即再起動
・nodemon

○デバッガ
実行時ブレークポイント、変数ウォッチ機能
・node-inspector
対象サーバのリモートデバッグをするには次のように行う
サーバ側でnode-inspector起動
$node --debug app.js
$node-inspector
クライアント側からはsshポートフォワードを行う
$ssh -N -L 8080:127.0.0.1:8080 (User Name)@(server IP)
クライアント側のブラウザで下記にアクセス
http://127.0.0.1:8080/debug?port=5858

○リモートエディタ
・brackets
Bracketsサーバを立ち上げ
$ brackets --proj-dir （nodeJSサーバのディレクトリ） --supp-dir (Bracketsの設定ファイルを置く任意ディレクトリ)
(server IP):6800にアクセスすると
ブラウザでBracketsエディタを起動し直接サーバファイル（コード）を編集できる

○ブラウザテスト駆動開発
・browser-sync

○非同期処理
nodejsで起こりがちなコールバック地獄を避ける。綺麗なコードがかける
エラー処理も見やすくなる
・async
・Q
Node12以降ではライブラリを使わなくてもES6のPromiseが使えるのであえて入れる必要はないかもしれない

○クリティカルセクション
同時アクセスされたら困るような箇所（同じファイル書き込みなど）をロックする
・semaphore
RDBMSのトランザクションは
sequelizeを使ったほうが良い

○永続化
マルチプロセス起動もできる
・pm2

○フレームワーク
ルーティング管理、静的リソースの管理など
・express

○ログ
アクセスログ
expressの場合、下記設定
app.use(express.logger('dev'));
実行行ログ出力
・lwl

○セッション管理
・cookie-parser
・express-session
<pre>
app.use(express.cookieParser()); // cookie
app.use(express.session({
    secret: 'secret cat',
    cookie: { httpOnly: true,secure: true,maxAge:3600000 }, // add httpOnly and secure attr to be more safety
    resave: false,
    saveUninitialized: true,
    rolling: true
}));
</pre>
複数NodeJSサーバの場合、軽量KVSに保存するのが一般的
下記はRedisで管理する場合
・connect-redis

○クッキー
expressの場合、下記設定を有効にする
app.use(express.cookieParser());
セキュリティのために下記もすべし
-secure属性をつける
-httponly属性をつける

○HTMLテンプレートエンジン
nodejsのパラメータを渡して動的ページ生成
・ect
pug(旧jade)、ejsなどもあるがectが最速

○CSSテンプレートエンジン
cssパターンを関数化できる。
プレフィックス付なども１つの関数にまとめられる
・less

○タスク処理/ファイル変更監視
・gulp

○ページ高速化
JS,LESSをミニファイ
・gulp-uglify
・gulp-less
・gulp-autoprefixer
gzip圧縮
expressの場合は下記設定でレスポンスがgzipになる
app.use(express.compress());

○クライアントサイドライブラリ管理
・bower
・browserify
○レスポンシブデザイン
・bootstrap


○品質管理
・grunt-plato

○テスト
単体テスト
・jasmine
REST APIテスト
・frisby

○セキュリティ
盗聴対策、ログインページやフォーム入力ページがある構成ならHTTPS必須
・https

CSRF対策
・csurf
簡易にCSRF対策する場合はリファラーチェック
req.headers['referer']

XSS対策
データ検証（validate）と、無害化（sanitize）
・validator
クライアントサイドでsanitizeしないと確実でない

-----------------
下記はDBや認証使う場合

○MySQL
・node-mysql
MySQLのORM
・sequelize
下記npmでさらにマイグレーション(古いDB定義を新しいDB定義に変換する)もできる
・sequelize-cli

○Redis
・node-redis

○OAuth認証
・passport

○LDAP
・ldapjs

-----------------
おまけ

○サーバサイドレンダリング
・node-canvas
canvas描画をcairoエンジンによりサーバ側で行う
・reactjs
下記サンプル参照
https://github.com/mhart/react-server-example

DOM描画に関するブラウザ依存がなくなるかも
XSS対策がサーバ側でできる
（実用に耐えられるかは要検証）