OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyでファイルの内容を書き換えるサンプル（置換する）

## やりたいこと

複数のアプリケーションを一つのサーバで管理している場合に、同じ修正を複数のアプリケーションに行わないといけない場合がある。
その場合の一括文字修正の処理を書いてみました。

サンプルでは www 配下にある、****/app/views/tasks/index.html ファイルの中身の Time.now を Time.new.utc へ変換すします。

## 実行方法

```bash
#作業したいディレクトリのある場所へ移動。
cd /www

# サンプルファイルの作成
vi replacement.rb
```

以下の内容をreplacement.rbに記述

```rb:replacement.rb

# ruby replacement.rb dir_name で実行

# アプリケーションの設置ディレクトリの取得を行うクラス
class FileGet
  attr_accessor :file_name
  attr_reader :dir_list

  def initialize(dir_name)
    @dir_list  = get_dir(dir_name)
    @file_name = "/app/views/tasks/index.html"
  end

  # directoryを取得
  def get_dir(dir_name)
    Dir.glob("#{dir_name}*/")
  end

  # 置換するファイルのパスを取得
  def get_file_list
    file_path_list = []
    @dir_list.each do |dir|
      file_path       = "#{dir}#{@file_name}"
      file_path_list << file_path if File.exist?(file_path)
    end
    return file_path_list
  end
end

# ファイルの置換を行うクラス
class ReplaceText
  attr_accessor :pattern, :replacement
  def initialize(file_list=[])
    @file_list   = file_list
    @pattern     = /Time\.now$/
    @replacement = "Time.now.utc"
  end

  def replace_files
    @file_list.each { |l| exec(l) }
  end

  private

  def exec(path)
    # 読み取り専用でファイルを開き、内容をbufferに代入
    buffer = File.open(path, "r") { |f| f.read() }

    # バックアップ用ファイルを開いて、バッパを書き込む（バックアップ作成）
    File.open("#{path}.bak" , "w") { |f| f.write(buffer) }

    # bufferの中身を変換
    buffer.gsub!(@pattern, @replacement)

    # bufferを元のファイルに書き込む
    File.open(path, "w") { |f| f.write(buffer) }
  end
end

# アプリケーションの設置ディレクトリの取得
file_get  = FileGet.new("./#{ARGV[0]}/")
file_list = file_get.get_file_list

# 置換の実行
if file_list.count > 0
  r = ReplaceText.new(file_list)
  r.replace_files
end
```


実行する。

```bash
# アプリを設置しているディレクトリを指定
ruby replacement.rb ./
```
tigでローカルにチェックアウトした全てのbranchをツリー表示する

# やりたいこと

- ローカルにチェックアウトしてあるbranchをtigで一括でみたい
- 引数に複数のブランチを指定すれば可能だけど、めんどくさい


# 環境

- CentOS6.7 x64
- Linuxbrewで入れたtigを利用。

```
$ tig -v
tig version 2.1.1
```


# コマンド

引数として```git branch```した結果を渡す
先頭の```*```が邪魔なので、```tr -d```で削除する

```
tig `git branch | tr -d ' *'`
```

xargsとかではpagerが起動してうまくいかず、
結局上記で落ち着いた。

あとはaliasに登録するなりなんなり
Atomでスペルチェックを無効にする

Atomのversionは1.5.3
## 困ったこと
日本語でメモを取っていると、赤下線が出てきて見づらい。
## 直し方
[設定]→[パッケージ]→Core Packageの[spell-check]を
無効にする。
2017/2/20 追記
下図の通り、「英語のスペルチェック」もまとめて無効になってしまうことには注意する。
英語だけをチェックする機能があればよいのですが。

## 画面表示
spell-check有効
![Atomスペルチェック_01.png](https://qiita-image-store.s3.amazonaws.com/0/96016/9f35719c-8e12-a1d1-efae-cbb2f3352044.png)

無効化
![Atomスペルチェック_02.png](https://qiita-image-store.s3.amazonaws.com/0/96016/33075046-7a3a-2cd0-6455-10558fb10e47.png)
S3へのアクセスをEC2経由のみにする

S3へのアクセスをEC2経由(特定のURL)のみに設定する
開発環境などに使用することがあるのでメモ

# やりたいこと
1. UserがEC2経由のhttpアクセス時のみS3のコンテンツを表示
2. UserからS3への直アクセスは拒否する

# 設定
## EC2側 
1.httpdをインストール

```
# yum install httpd
```

2. 下記のようにS3へアクセスするためのファイルを準備

```index.html
<a href="https://REGION.amazonaws.com/BUCKETNAME/index.html">
S3link
</a>
```

## S3側
1. Bucketを作成
2. Bucket配下にindex.htmlを配置  
3. index.htmlへアクセスを確認する (この段階ではアクセス出来る)
4. BucketのPropertiesからPermissionsを選択、Edit bucket policyに下記を追加

```bucketpolicy.
{
	"Version": "2012-10-17",
	"Id": "policy example",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::BUCKETNAME/*",
			"Condition": {
				"StringLike": {
					"aws:Referer": "http://xxx.xxx.xxx.xxx/*"
				}
			}
		}
	]
}
```

## 設定後
1. S3へ直接アクセス
AccessDeniedになることを確認

2. EC2を経由しアクセス
S3へのリンクからコンテンツが表示されることを確認

## 追加検証
### S3へファイルをアップロードする際にpublic-readを付与するとどうなるか
1. index.htmlにpublic-readのACLを付与してS3へアップロード  
`# aws s3 cp index.html s3://BUCKETNAME/index2.html --acl public-read`
2. アクセスを確認する  
S3への直接アクセスでアクセスが出来る

# まとめ
S3への直接アクセスは拒否しつつEC2経由でのアクセスが出来る。
アクセス元のURLを指定すれば同じように特定のURLからのアクセス等も指定できる。
bucketpolicyの設定をすればbucket内の特定の拡張子やパスのみといった使い方も可能なはず。
HTTP Refererを利用してアクセスをしているためアクセス管理設定をEC2側である程度コントロール出来る。
(SecurityGroupで制限や特定のサブドメイン経由のみ、Basic認証付きや一部のコンテンツだけとかetc...)

今回のケースの様に使う際には、acl設定に注意してS3へアップロードすること。

### 参考サイト
[MD-Blog_Server/Network](http://www.monster-dive.com/blog/server_network/20140404_001130.php)
Vagrant で複数サーバー立ち上げて、LoadBalancer と Webサーバー を設定する

## 目的

Web サーバーの構築に関して、以下を確認する

『Load Balancer にぶら下がるWebサーバーのいずれかが落ちた時、アクセスは残りのサーバーだけに振り分けられるようになるのか』

今回は vagrant で仮想環境を3つ立ち上げ、1つを LoadBalancer, 2つを Web サーバーとして設定した。
vagrant を使うのが久しぶりだったため、使い方を復習しながら進めた。

## やったこと

### 1. vagrant で1台サーバーを立ち上げてみる

下記内容を基に実施
[Vagrant超入門: 基本コマンドとVagrantfileによる設定](https://github.com/tmknom/study-vagrant/tree/master/study2)

しかし、vagrant の環境に http（80番ポート）でアクセスできない事態が発生

→ firewall で弾かれていたため、iptables で80番ポートを解放する ( /etc/sysconfig/iptables )

```:/etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
```

→ 今回は CentOS6だったが、7 だと別の問題が発生する模様
[VagrantでCentOS7を立てたが、httpアクセスが繋がらない時にやったこと](http://qiita.com/takuhou/items/1bdd8403a15be7411e20)


### 2. 複数サーバーを立ち上げる

下記内容を基に実施
[Vagrant超入門: 複数サーバを一発で立ち上げる！](https://github.com/tmknom/study-vagrant/tree/master/study4)

使用した Vagrantfile の設定

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2" 

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # All Vagrant configuration is done here. The most common configuration
  # options are documented and commented below. For a complete reference,
  # please see the online documentation at vagrantup.com.

  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "centos64box"

  config.vm.define "lb01.dev" do |lb01|
    lb01.vm.network :private_network, ip: "192.168.33.10"
  end 

  config.vm.define "web01.dev" do |web01|
    web01.vm.network :private_network, ip: "192.168.33.11"
  end 

  config.vm.define "web02.dev" do |web02|
    web02.vm.network :private_network, ip: "192.168.33.12"
  end 

  config.vm.define "db01.dev" do |db01|
    db01.vm.network :private_network, ip: "192.168.33.13"
  end 
end
```

### 3. lb, web × 2 を設定

各サーバーに Apache を install

lb01 に対しては load balancing の設定をした
[RailsのDeploy環境+運用を考慮したサーバー構築](http://qiita.com/tadatti/items/d0f1d08d1cc4c8275376)

```apache:/etc/httpd/conf/httpd.conf
<VirtualHost *:80>
    ProxyPass /balancer-manager !
    <Location /balancer-manager>
        SetHandler balancer-manager
    </Location>

    ProxyPass / balancer://192.168.33.10/
    ProxyPassReverse / balancer://192.168.33.10/

    <Proxy balancer://192.168.33.10/>
        BalancerMember http://192.168.33.11/ loadfactor=5
        BalancerMember http://192.168.33.12/ loadfactor=5
    </Proxy>
</VirtualHost>
```

### 4. アクセス検証

* web01, web02 も正常に動いている時
  * → アクセスは両サーバーに振り分けられる

* web02 の apache のプロセスを突然killしてみる
  * → アクセスはweb01にしか振られなくなった

* web01 も web02 も落としてみる
  * → Service Temporarily Unavailable ってなりました
[自分用メモ]C++で重複定義を回避する

`#ifndef`と`#endif`、`#define`を使う。

#### 1. ヘッダファイル(.h)の先頭に次の2行を入れる

```cpp
#ifndef INCLUDED_Sample_h_
#define INCLUDED_Sample_h_
```

#### 2. ヘッダファイルの最後に次の1行を入れる

```cpp
#endif
``` 

#### 3. ソースの全体

```cpp
#ifndef INCLUDED_Sample_h_
#define INCLUDED_Sample_h_

const int i = 100;

#endif
```

### するとどうなるか...

1回目の`const int i = 100`はコンパイルされるが、2回目は無視される。
つまり1つのプログラムでヘッダファイルが何回インクルードされても、定義は1回だけとなる。
concrete5 File関連のEvent一覧

Ver. 5.7.5.6

# Concrete\Core\File\File

- on_file_set_password
    - ファイルにパスワードが設定された時
- on_file_duplicate
    - ファイルが複製された時
- on_file_add
    - ファイルが追加された時
- on_file_delete
    - ファイルが削除された時
- on_file_download
    - ファイルのダウンロードを計測している時にダウンロードされた時

# Concrete\Core\File\Set\Set

- on_file_set_add
    - ファイルセットが追加された時
- on_file_added_to_set
    - ファイルがファイルセットに追加された時
- on_file_removed_from_set
    - ファイルがファイルセットから除外された時

# Concrete\Core\File\Version

- on_file_version_add
  - 新しいファイルバージョンが追加された時
- on_file_version_duplicate
  - ファイルバージョンが複製された時
- on_file_version_deny
  - ファイルバージョンが承認されなかった時
- on_file_version_update_title
  - ファイルのTitleが更新され新しいファイルバージョンが作成された時
- on_file_version_update_tags
  - ファイルのTagsが更新され新しいファイルバージョンが作成された時
- on_file_version_update_description
  - ファイルのDescriptionが更新され新しいファイルバージョンが作成された時
- on_file_version_update_contents
  - ファイルの内容が更新され新しいファイルバージョンが作成された時（画像編集機能を使った時など）
- on_file_version_approve
  - 新しいファイルバージョンが承認された時
シーケンシャルリードのブロックサイズはどのくらいが適切か

ファイルの内容をネットワークに書く場合、頑張ってファイル読み込みとネットワークへの書き込みを並行して動かすのは面倒なので、普通は次のようなコードになると思います。

```py
while True:
    data = f.read(BLKSIZE)
    if not data:
        break
    sock.sendall(data)
```

さて、この時の BLKSIZE はどれくらいの大きさが適切でしょうか？

とりあえず思いつくのは4KB (x86 のデフォルトのページサイズ) ですが、ネットワークやディスクが十分に高速な場合、ちょっとシステムコールが多すぎになる気がします。 Python みたいな遅いプログラミング言語を使ってる場合はループに含まれるメソッド呼び出しのオーバーヘッドなんかも無視できないので、もうちょっと大きくしたい気がします。
富豪的に、一気に1MBとかにしてみたい気もしますが、ちょっと待ってください。このプログラムはシーケンシャルに見えますが、ブロックサイズが小さい間はディスクアクセスとネットワークアクセスが並行して動いています。

まず、ファイルからの読み込みは readahead という仕組みで、最大128KBくらいまでは先読みが効きます。
ネットワーク側がボトルネックになった場合、ブロックサイズを128KB未満にしておくことで、ディスクからの読み込みでブロックする時間をほぼゼロにして、ネットワークのスループットを無駄にせずに済みます。

一方、ソケットへの書き込みも同じくOSのソケットバッファに対して行われます。例えば TCP の送信バッファであれば、 `cat /proc/sys/net/ipv4/tcp_wmem` で最小値、デフォルト値、最大値を知ることができます。私の環境 (Ubuntu willy で sysctl などを変更していない) では `4096	16384	4194304` でした。デフォルトが16KBで、OSが状況に応じて最大で4MBまで増やす可能性があるということです。

ソケット以外の書き込み先として、パイプの場合だと、一般的なバッファサイズは64KBのようです。 ([参考](http://unix.stackexchange.com/questions/11946/how-big-is-the-pipe-buffer))

ユーザーランドのバッファを、カーネル内のバッファからバッファへデータをコピーするためのバケツだと考えた場合、バケツがカーネル内のバッファより大きいとスムースにコピーができません。
ブロックサイズを決めるときは、下限を4KB、上限はパイプのことを考慮に入れる必要があるなら64KB、無いなら128KBを上限として、その間のどこかを適当に選ぶのが良いと思います。

> Note
> もちろんこれは、一般的な環境でそこそこ効率よくプログラムを書きたいとか、設定可能なサイズのデフォルト値を決めたいとかいった場合に参考になる基準であって、特定の環境で最大限の性能を出すためのチューニングをする場合は話は別ですよ。
iPhone の WebView or Safari で、横向きにした時にフォントが太くなるのを防ぐ

横向きにすると、文字が微妙に太くなる (大きくなる現象は、`-webkit-text-size-adjust: 100%;` で対処できる)。

太くなる現象は、html か body の css に以下をいれてやると対処できるワークアラウンド

```css
html {
    -webkit-transform: translate3d(0,0,0);
}
```


`-webkit-font-smoothing: antialiased` を設定している時などでよく分かります。

# 出典
http://stackoverflow.com/questions/3220662/uiwebview-font-is-thinner-in-portrait-than-landscape
C++ builder > exception > UnicodeString??? Date ????? > VarToDateTime 関連のエラーのようだ

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

連続動作14日目にエラーが出た。

エラーメッセージは以下だった。動作OSが英語版なので例外メッセージも英語化しておかないといけないのか。

```
exception > UnicodeString??? Date ?????
```

とりあえず検索したら以下を見つけた。

http://stackoverflow.com/questions/11782114/how-i-can-convert-str-to-datetime

> 	
I changed my code and put the '02 August 2012 18:53' into AnsiString Variable, but now I have this error : 'could not convert variant of type (String) into type (Date)

...

>  VarToDateTime leads to a path that 'VarDateFromStr' is called with LOCALE_USER_DEFAULT. If the user locale is not US (or compatible), a type mismatch occurs.

英語OS用に使用したVarToDateTime()にて上記の問題があるとのこと。

しかし上記エラーが毎回発生せず、10日から20日に1回程度しか起こらないので、また別の問題かもしれない。

関連している処理としては GPS から日時を受信し、それをTDateTime型に変換して使っている。そのあたりのtry, catch対策をするか、受信文字列のチェック機構を入れるなどの対策が必要なのだろう。
Xcode からビルドを審査に提出できない時の回避方法

# 困った
原因は不明ですが、最近 App Store にビルドを提出しようとすると、以下のエラーが表示されるようになってしまいました。

![Organizer.png](https://qiita-image-store.s3.amazonaws.com/0/29815/905ae5a2-8f2c-e784-dfff-943bb89b7eae.png)

# 救世主 Application Loader
そんな時には代替の方法があります。**Application Loader** です。

1. Organizer から Upload To App Store する代わりに、Export で "Save for iOS App Store Deployment" を選択して ipa ファイルを書き出します。
2. 起動中の Xcode アイコンを右クリック -> Open Developer Tool -> Application Loader を選択し、Application Loader を起動します。
3. 書きだした ipa ファイルを選択してアップロード。

良かったですね！

# とはいえ
何か気持ち悪いので原因がわかる方教えて下さい。
多次元配列の最大値（最小値）のインデックスを求める

これでできるらしい。メモ

```py
argmax=lambda A:np.unravel_index(np.array(A).argmax(), np.array(A).shape)
argmin=lambda A:np.unravel_index(np.array(A).argmin(), np.array(A).shape)
```

使い方は、```argmax(リスト)```で。
PHPでPDFファイルの内容をテキストで取得（Google Drive利用）

PHPでスクレイピングとかやってて、情報がPDFでしか提供されていない場合にPDFからテキスト情報を抜き出したい。
[Xpdf](http://www.foolabs.com/xpdf/)を入れて `pdftotext` を使えばいけるにはいけるけど、モノによっては改行ポイントとかの精度が低い場合がある。

で、Googleドライブのファイル変換機能を使ってみたらどうかと試した次第のメモ。

流れとしては

1. PHPでPDFを取得（ダウンロード）
2. GoogleドライブにGoogleドキュメントとしてアップロード
3. アップロードしたGoogleドキュメントの中身を取得

といった感じ。

下準備として以下のURLにある手順を済ませる必要がある。

> Drive REST API / PHP Quickstart
> https://developers.google.com/drive/v2/web/quickstart/php

上記ページに `getClient()` という関数が定義されているので、それを使う。

```php
/*
...

getClient()までのコード
https://developers.google.com/drive/v2/web/quickstart/php

...
*/

// 対象のPDFファイル
$pdf = 'http://example.com/example.pdf';

try {
    $client = getClient();
    $service = new \Google_Service_Drive($client);

    /**
     * PDFのソースを取得
     */
    $content = file_get_contents($pdf);

    /**
     * Googleドキュメント(OfficeでいうWord)としてアップロードする
     *
     * google-apps形式でアップロードしないとダウンロードリンクが取得できない。
     * 「google-apps.document」以外（google-apps.spreadsheet等）を指定しても、
     * PDFだとGoogleドキュメント形式になってしまう模様。
     *
     * @link https://developers.google.com/api-client-library/php/guide/media_upload
     */

    // アップロードファイル形式の設定
    $meta = new \Google_Service_Drive_DriveFile(array(
      'mimeType' => 'application/vnd.google-apps.document'
    ));

    // アップロード実行
    $created = $service->files->insert($meta, array(
      'data' => $content,
      'mimeType' => 'application/pdf',
      'uploadType' => 'multipart',
      'fields' => 'id'
    ));


    /**
     * アップロードしたファイル情報からダウンロード用リンクを取得し、
     * プレーンテキストとしてダウンロード。
     */

    $file = $service->files->get($created->id);

    if (!empty($file->exportLinks['text/plain'])) {
        $request = new \Google_Http_Request($file->exportLinks['text/plain'], 'GET', null, null);
        $httpRequest = $service->getClient()->getAuth()->authenticatedRequest($request);
        if (200 == $httpRequest->getResponseHttpCode()) {
            /**
             * ここで抽出テキストが取得できる
             */
            $content = $httpRequest->getResponseBody();
            echo '<pre>'.$content.'</pre>';

            // アップロードしたファイルが不要なら削除
            $service->files->delete($created->id);
        }
    }
} catch(\Google_Service_Exception $e) {
    echo '<strong>'.$e->getMessage().'</strong>';
    echo '<pre>'.$e->getTraceAsString().'</pre>';
} catch(\Google_Exception $e) {
    echo '<strong>'.$e->getMessage().'</strong>';
    echo '<pre>'.$e->getTraceAsString().'</pre>';
} catch(\Exception $e) {
    echo '<strong>'.$e->getMessage().'</strong>';
    echo '<pre>'.$e->getTraceAsString().'</pre>';
}
```

ざっくり見てみたところ、[Xpdf](http://www.foolabs.com/xpdf/)との違いは以下の3点ぐらい・・・？
最後のやつが大きなメリットかな。

- 表形式のものについて、Xpdfはセルごとに改行が入るっぽいけど、Googleドライブは行(tableでいうと`<tr>`)ごとに入ることが多い（全部じゃない）。
- 全角英数文字について、Xpdfはそのままだけど、Googleドライブは全て半角英数になるっぽい。
- 言うまでもないけど、XpdfはPDFのみ、Googleドライブはその他Office系ファイルも処理できる。
pryで起動時に変数を渡す


pryの使い方把握してれば迷わないかもしれないですが、selfで`str`という変数を定義した場合、

```ruby
require 'pry'

str = 'Hello, Pry'
Pry.start self
```

とすれば、pry内で`str`にアクセスできます。
underscoreコードリーディング（tap）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##tapとは


###[underscorejs.orgのtap](http://underscorejs.org/#tap)

こんな説明。
>####_.tap(object, interceptor) 
>Invokes interceptor with the object, and then returns object.
>The primary purpose of this method is to "tap into" a method chain, in order to perform operations on intermediate results within the chain.



```javascript
_.chain([1,2,3,200])
  .filter(function(num) { return num % 2 == 0; })
  .tap(alert)
  .map(function(num) { return num * num })
  .value();
=> // [2, 200] (alerted)
=> [4, 40000]
```

------------- 
interceptorをobjectとともに呼び出し、その後objectを返します。
コレの主な利用手段としては、メソッドチェーン内に入り込み、チェーン内での間の結果の操作を行うことです。


###[underscore.tap](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1073)
コード的にはこのあたり。

```javascript
  // Invokes interceptor with the obj, and then returns obj.
  // The primary purpose of this method is to "tap into" a method chain, in
  // order to perform operations on intermediate results within the chain.
  _.tap = function(obj, interceptor) {
    interceptor(obj);
    return obj;
  };

```


interceptorにobjectを渡す。
その後、objectを返す。
Jenkinsでsudo実行時のエラー


### 変なエラーがでる(logに残る所でsudo使ってんじゃねぇよザコってことらしい)
```
sudo: no tty present and no askpass program specified
```


### visudo に設定を追加
```
$ sudo visudo
```

```
# Defaults !visiblepw
Defaults visiblepw

root	ALL=(ALL:ALL) ALL
jenkins ALL=(ALL) NOPASSWD:ALL
```


### jenkins リスタート

```
$ service jenkins restart
```
docker特権コンテナからusb機器を利用

## 参考

* [おっさんエンジニアの実験室: lxcコンテナに録画システムを移設する](http://ossan-engineer.blogspot.jp/2015/09/lxc.html)

## docker-compose.yml


```diff:docker-compose.yml
 srv:
   image: ubuntu:14.04
+  privileged: true
   volumes:
    - /etc/localtime:/etc/localtime:ro
+   - /dev/bus/usb/:/dev/bus/usb/:rw
   entrypoint:
    - /sbin/init
```
Scalaでエラトステネスのふるい

参考：[wikipedia:エラトステネスの篩](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)

```
import scala.collection.mutable

object Main{
  def main(args: Array[String]): Unit = {
    val N = 120 // N以下の素数
    val primes = mutable.BitSet()

    primes(2) = true

    // すべての数を素数として初期化。2以外の偶数は素数にはなりえないので除外。
    for (i <- 3 to N by 2) {
      primes(i) = true
    }

    // ふるいにかける。
    for (i <- 3 to Math.sqrt(N).toInt by 2 if primes(i); j <- i * 2 to N by i) {
      primes(j) = false
    }

    println(primes.mkString(","))
    println(primes.drop(9).head) // 10番目の素数
  }
}

```
SoftLayer API エンドポイントの アクセス許可

## 概要
SoftLayerのAPIを利用することで、ブラウザからポータルにアクセスする事なく、物理サーバーのオーダーや再起動などが出来るという大変便利なものである。　一方で、APIキーとユーザーIDを知られると、サービス停止攻撃に悪用されるなど被害が考えられる。　このため予めユーザーIDに対してアクセスを許可するIPアドレスを設定する事が望ましい。ここでは設定と注意事項について記載する。


## IPアドレスの制限設定の方法

SoftLayerカスタマーポータル(https://control.softlayer.com/) から、Account -> Users -> Username で進み Edit User Profile (https://control.softlayer.com/account/user/profile) に移動する。

その中の以下の部分に、アクセスを許可するIPアドレスを設定する。複数設定する場合は、コンマで区切る。

![スクリーンショット 2016-02-22 10.01.42.png](https://qiita-image-store.s3.amazonaws.com/0/42829/b6eb2c28-4ce3-eeb4-3040-b761fb79c930.png)


## 無許可のIPアドレスの場合

無許可のIPアドレスから、APIをコールすると、以下の様に、"Invalid IP Address for API key" の例外が発生して、アクセスできなくなる。

```
$ slcli setup
Username []: IBM*******
API Key or Password []:********************************************** 
Endpoint (public|private|custom) [public]: 
Timeout [0]: 
SoftLayerAPIError(SoftLayer_Exception): Invalid IP Address for API key.
```

## 注意事項

* この Allowed IPs を設定すると、デフォルトの動作が禁止となる。
* この設定は、パブリックIPアドレスだけではなく、SoftLayerのプライベートに対しても同時にアクセスできなくなるので、プライベートIPアドレスも同時に登録する必要がある。
* プライベートアドレスからアクセスする場合は、10.0.0.0/8 や 10.132.5.128/26 の様な ネットワークアドレスで登録すると便利である。
* SoftLayerのアドレス範囲のインスタンスからAPIをアクセスする場合でも対象となる。　このため slcli setup コマンドで、APIのエンドポイントに Public を指定して、10.0.0.0/8 の様にプライベートアドレスだけを許可すると、アクセスできなくなる。　この場合は、再度 slcli setup コマンドを実行して APIのエンドポイントを Private に変更すると良い。
メモ: Laravelのはじめ方


オレ流

めったにlaravel始めることも無いので、
たまに始めると、いっつもバラバラになりがちなのでまとめとく。

## 基本構成

- Laravel @latest
- Vagrant(Homestead)
- PhpStorm
- Ide Helper


## laravelのインストール

````
$ laravel new hoge
$ cd hoge
$ composer install
$ composer require laravel/homestead barryvdh/laravel-ide-helper --dev
$ cp .env.example .env
$ vendor/bin/homestead make
````

## Vagrant 環境構築

そのままのhomesteadじゃ満足できないのでxdebugだけぶち込みたい。

````
$ touch after.sh
````

下記内容をぶち込む

````
#! /bin/sh

cd /tmp
wget http://xdebug.org/files/xdebug-2.4.0rc3.tgz
tar xvzf xdebug-2.4.0rc3.tgz
cd xdebug-2.4.0RC3/
phpize
./configure
make
sudo cp modules/xdebug.so /usr/lib/php/20151012/

cat << EOT >> /etc/php/mods-available/xdebug.ini
; configuration for php xdebug module
; priority=20
zend_extension=/usr/lib/php/20151012/xdebug.so
xdebug.idekey="phpstorm"
xdebug.remote_enable=1
xdebug.remote_connect_back=1
xdebug.remote_port=9000
xdebug.max_nesting_level=300
xdebug.scream=0
xdebug.cli_color=1
xdebug.show_local_vars=1
EOT

sudo ln -s /etc/php/mods-available/xdebug.ini /etc/php/7.0/fpm/conf.d/20-xdebug.ini
sudo ln -s /etc/php/mods-available/xdebug.ini /etc/php/7.0/cli/conf.d/20-xdebug.ini

sudo service php7.0-fpm restart

````

これでvagrant up実行

````
$ vagrant up
````


## ide-helper 生成

とりあえず`config/app.php`に下記を追加

````
    "providers" =>[
        // ....
    
        \Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class    
        // ....
    ]
````

コマンドを実行

````
$ php artisan ide-helper:generate
$ php artisan ide-helper:meta
````
Swift中map(_:)函数和flatMap(_:)函数使用


```Swift
//  Created by Kxx.xxQ 一生相伴 on 16/2/22.
//  Copyright © 2016年 Asahi_Kuang. All rights reserved.
//

import Foundation

var arr:Array = [1,4,5,7,8]
func function(a: Int) ->Int {return a * 3}
func changeToString(a: Int) ->String {return "\(a)"}
let a = 3
// 映射函数
var b: Array = arr.map{ $0 * function(a) }

print(b)

// 将整型数组映射为字符串数组
var c: Array<String> = arr.map({ element in changeToString(element) })
var d: Array<String> = arr.flatMap({ element in changeToString(element) })

// map函数和flatMap函数基本是一样的，但是也有区别。map == flatMap的满足条件是：1. 是一维数组，因为flatMap会降一维。 2. flatMap函数是解包Optional，解包过程中会过滤掉Nil值，而map不会。
var result: Bool = c == d ? true : false
print("c数组为:\(c)","d数组为:\(d)","c数组等于d数组判定为 \(result)", separator: "\n", terminator: "\n")
```

####打印输出结果为:
![pic url](https://github.com/Asahi-Kuang/picture/blob/master/0A7AB625-38F2-4C50-BF51-D3432280F640.png?raw=true)
/var/lib/dockerを削除できない問題

# 問題

Dockerのデータ(デフォルトは`/var/lib/docker`)を他のボリュームに移動させたら、元のデータフォルダを`rm -rf`で消せない。

# 原因

あのフォルダは一般ファイルの他に、ファイルシステム独自の機能(btrfs subvolumeなど)も使っています。

# 解決

[このスクリプトを使う](https://github.com/docker/docker/blob/master/contrib/nuke-graph-directory.sh)
goimportsがgomail.v2のimport宣言を消してしまう

`gomail`(https://godoc.org/gopkg.in/gomail.v2) を使ってみたのですが、その時に`goimports`がらみで困った話

もとのコードがこんな感じ

```go
import (
...
    "gopkg.in/gomail.v2"
...
)

...

func XX() {
...
	msg := gomail.NewMessage()
...
}
```

これはもともと動作していたものの抜粋ですが、このファイルに`goimports`が効くと、`import`宣言の`"gopkg.in/gomail.v2"`が消えてしまいます。

`import`宣言にパッケージ名を書くことで解決しました。

```go
import (
...
    gomail "gopkg.in/gomail.v2"
...
)
```
EP5 Know How to Slice Sequences


> - Avoid being verbose: Don't suply o for the start index or the length of the sequence for the end of index.
- Slicing is forgiving of start or end indexed that are out of bounds, making it easy to express slices on the front or back boundaries of a sequence(like `a[:30]` or `a[-2o:]`)
- Assiging to a list slice will replace that range in the original sequence with what's referrenced even if their lengths are different.

> Effective Python


```python
In [9]: a = "a b c d e f g h".split()

In [10]:

In [10]: first_twenty_items = a[:20]

In [11]: first_twenty_items = a[-20:]

In [12]:

In [12]: a[20]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-12-f8db3c71230c> in <module>()
----> 1 a[20]

IndexError: list index out of range

```

asigning slice of list does not affect to the origin of slice.

```python
In [3]: a = "a b c d e f g h".split()

In [4]: b = a[4:]

In [5]: print('Before' , b)
Before ['e', 'f', 'g', 'h']

In [6]: b[1] = 99

In [7]: print('After', b)
After ['e', 99, 'g', 'h']

In [8]: print('No change', a)
No change ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

```

assigin some list to slice affects to the origin of slice

```python
In [25]: a = "a b c d e f g h".split()

In [26]: b = a

In [27]: print('Before', a)
Before ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

In [28]: a[:] = [100, 101, 102]

In [29]: assert a is b

In [30]: print('After', a)
After [100, 101, 102]
```
[メモ]bitフラグ管理のコメントつけ

どれがどれかわかりやすくていいと思う

```cpp
foo( 0b00001111 );
//     |||||||+  X axis enable
//     ||||||+-  Y axis enable
//     |||||+--  Z axis enable
//     ||||+---  PD : 0:power down 1:active
//     ||++----  BW1-BW0 cutoff 12.5[Hz]
//     ++------  DR1-DR0 ODR 95[HZ]
```

コメントの部分画像からそのまま移しました。

参照元
[ささ＠白猫勢さんはTwitterを使っています: "bit演算とか使ってフラグ管理するときにこのコメントの書き方すごくよくない？？？ https://t.co/TPLOdHbtkA"](https://twitter.com/mygod877/status/701058209075703808)
CakePHP3 脆弱性修正のリリース（2016/02/22）につきまして

CakePHP3系について脆弱性の報告をいたしました。修正版が日本時間の 2016/02/22 にリリースされています。

http://bakery.cakephp.org/2016/02/21/cakephp_3016_3111_323_released.html

脆弱性の分類としては、XSS（クロスサイトスクリプティング）に該当するのではないかと思います。
3系で作成したサイトをインターネット上に公開している場合は必ず更新を行ってください。

更新を怠った場合、皆さまのサイトがフィッシング詐欺に使われてしまう可能性があります。
また、Google 等の検索エンジンからウィルスに感染しているサイトと見做され、皆さまのサイトが索引から削除されてしまうかもしれません。

これまでに報告した脆弱性とは異なり、ほぼ全利用者がこの脆弱性の影響を受けると思いますので、念のためご報告させていただきました。

ご報告は以上になります。
EP 4 Write Helper functions Instead of Complex Expressions



> - Python's syntax makes it all too easy to write single-line expressions taht are overly complicated and difficult to read
- Move complex expressions into helper functions, especially if you nned to use the same logic repeatedly.
- The if/else expression provides a more readable alternative to using Boolean operators like `or` and `and` in expressions

> Effective Python

Let's thinke the situation where we want to parse the first value of the url parameters.

```python
>>> from urllib.parse import parse_qs
>>> my_values = parse_qs("red=5&blue=0&green=", keep_blank_values=True)
>>> print(repr(my_values))
{'red': ['5'], 'blue': ['0'], 'green': ['']}
>>>

>>> print("Red", my_values.get('red'))
Red ['5']
>>> print("Green", my_values.get('green'))
Green ['']
>>> print("Opacity", my_values.get('opacity'))
Opacity ['']
```

We want to ensure that value should be integer and if it does not present in dictionaly, it returns 0.

```python
red = int(my_values.get('red',[''])[0] or 0)
```

We can do this way. But it lacks readablity.

```python
green = my_values.get('green', [''])
if green[0]:
    green = int(green[0])
else:
    green = 0
```

This flow is reused in other place and giving name for this process improves readablity. Therefore: a helper function is the way to go.

```python
def get_frist_int(values, key, defalut=0):
    found = values.get(key, [''])
    if found[0]:
        found = int(found[0])
    else:
        found = default
    return found
```


```
green = get_first_int(my_values, 'green')
```
lodash.js (underscore.js)でのtemplateの使い方


#要件
例）フロントエンドでajaxで取ってきたデータに応じて下記テーブルに要素の追加を行いたいなぁって時、、、

```ìndex.html
<table id="userInfo">
    <tr>
        <td>名前</td>
        <td>性別</td>
        <td>職業</td>
    </tr>
</table>
```

#jQueryだけでやると

```script.js
$.ajax({
  url: ajaxurl,
  type: "GET",
  timeout: 10000
}).done(function(result, textStatus, xhr) {
  for (var i = 0; i < result.length; i++) {
    var $tr = $("<tr></tr>");
    $tr.append("<td>" + result[i].name + "</td>")
        .append("<td>" + result[i].gender + "</td>")
        .append("<td>" + result[i].job + "</td>");
    $("#userInfo").append($tr)
  }
}).fail(function(xhr, textStatus, error) {
  console.log("error");
});
```


こんなんかな？(もうちょっとマシなやり方あると思いますが)

##問題点
htmlをどう書くかがjavascript内に記載してあるのちょっと生理的に受け付けない
  ↓
ってことでtemplateを使うと
htmlはhtml内に書けるのですっきりします

#templateの使い方

##まずはhtmlにtemplateを追記しましょう

```index.html
<script type="text/html" id="lodashTemplate_userData">
  <tr>
      <td><%= name %></td>
      <td><%= gender %></td>
      <td><%= job %></td>
  </tr>
</script>
```

##javascriptも結構すっきり

_.template にhtml内のテンプレートを記載した部分を入れてテンプレを作成したら、あとは対応するデータを入力すると対応したhtmlを吐き出してくれます。


```script.js
$.ajax({
  url: ajaxurl,
  type: "GET",
  timeout: 10000
}).done(function(result, textStatus, xhr) {
  var compiled = _.template($("#lodashTemplate_userData").html());
  for (var i = 0; i < result.length; i++) {
    $("#userInfo").append(
      compiled({
        "name": result[i].name,
        "gender": result[i].gender,
        "job": result[i].job,
      }));
  }
}).fail(function(xhr, textStatus, error) {
  console.log("error");
});
```

※lodashを読むのを忘れないように

#まとめ
これでjavascriptがhtmlに汚染されずにすむような気がします:innocent:
Excel > 曜日を表示 > 書式: m"月"d"日"(aaa) > 3月14日(月)

```txt:動作確認
Excel 2013 on Windows 8.1 pro (64bit)
```

日付に曜日を自動付加する方法を聞いた。
書式に`(aaa)`を足せばいいとのこと

[セルの書式設定]-[表示形式]タブ-[種類(T)」に以下のように入力する。

```
m"月"d"日"(aaa)
```

で以下のようになる。

```
3月14日(月)
```
MSDN Subscription の Microsoft Azure 無償利用特典利用方法

MSDNサブスクリプションにはAzureの無償利用特典が含まれています。
__またMSDN契約がなくてもVisual Studio単体購入でも対象になるはず？？__
試せていないので間違っていたら申し訳ないですが、下記の「年払い」はそれに該当するような気がしますが。。。

| サブスクリプション | 無償範囲のクレジット |
|:-----------|------------:|
|Visual Studio Professional - 年払い|        ¥5,500|
|Visual Studio Professional with MSDN プラン|        ¥5,500|
|Visual Studio Test Professional with MSDN|        ¥5,500|
|MSDN Platforms|        ¥10,500|
|Visual Studio Enterprise - 年払い|        ¥15,500|
|Visual Studio Enterprise with MSDN|        ¥15,500|
|Visual Studio Enterprise with MSDN (BizSpark)|        ¥15,500|
|Visual Studio Enterprise with MSDN (MPN)|        ¥15,500|

サブスクリプションをMSアカウントに結びつけてもデフォルトでは無効になっているため、明示的に有効化する必要があります。
インターネット上に結構古い情報もあって分かりにくかったので、一応2016年2月22日時点で最新の情報のリンクを張っておきます。

[https://msdn.microsoft.com/ja-jp/ee943806.aspx#c_B](https://msdn.microsoft.com/ja-jp/ee943806.aspx#c_B)

せっかく使えるのですし、無償の範囲で使い倒しましょう！
ルーティングのメソッド

```lang:routes.rb

 resources :users do
    member do
      get :following, :followers
    end
  end

```

memberメソッドを使うと、ユーザーidが含まれているURLを扱えるようになるので、getリクエストを指定すればfollowingページと,followerページにルーティングを設定できるようになる。
user/id/following
user/id/followerが作成される。



すべてのユーザーを取り出すページを作りたいなら、
collectionメソッドを使う。
collectionメソッドはユーザーidが含まれないURLを設定してくれる。
adbとpythonでAndroidの時計を精確に補正する

# まえがき
Androidの時計をadbコマンドから補正する場合，root化した上で下記のようなコマンドをシェル等から打ち込めば補正できる．

```
$ adb shell "su -c 'date `date +%s`'"
```

しかし，この方法では秒数単位でしか指定できないため，最悪の場合1秒の誤差が発生してしまう．
通常の使用であれば問題ないが，例えばログ出力の解析時に秒単位のズレが致命的になるような場合，この手法は使えない．
NTPのアプリを使用する方法もあるが，画面操作が必要なアプリしか見つからなかったため，自動化させるためにPythonを使ったスクリプトを作成して補正した．

# 戦略
至ってシンプルに，○時○分○秒.000000のときにadbコマンドを実行する．

# Pythonによる実装
シェルスクリプトでも出来そうだけれど，面倒（というか分からない）だったのでPythonで実装．2系で書いているので適宜3系にしてください．

## ソース

```py
import sys
import subprocess
import time
from contextlib import closing

m = 8

def loop():
    while True:
        t = time.time()
        it = int(t*10**m)
        if it == int(t)*10**m:
            subprocess.call("adb shell \"su -c 'date %d'\"" % int(t), shell=True)
            break

if __name__=='__main__':
    loop()
    print "Done"
```

## 解説
loop()メソッドを呼び出して時刻合わせが出来るようになるまで無限ループに入る．
time.time()で時刻を取得するが，得られる値はfloatなので小数点以下の値も入っている．
mで指定した桁数まで引き上げてから丸めた値：int(t×$10^m$)と，丸めてから引き上げた値：int(t)×$10^m$を比較して，同じならコマンド実行，違うなら再度時刻取得を繰り返す．
自分の環境では8桁まで指定しても問題無く時刻合わせが出来たけれど，この辺は環境に応じて変えた方がいいかもしれない．

書いてて思ったけれど引数にmを与えて，精度を指定するメソッドの方が綺麗ですね．後，タイムアウトも出来る方が親切かもしれない．そのうち暇があれば実装します．

## コマンド実行遅延の影響
実際にはadbのコマンドを実行してから反映されるまで遅延が発生するため，8桁の精度どころか10msec程度の誤差は余裕で発生してしまう．
そこで，どのくらい遅延するかを測定（方法については後日，記事を上げます）し，それをあらかじめずらしてコマンドを実行する．
具体的には

```py
padding = 0.07
...
    t = time.time() + padding
```

といった形で時間をずらしておく．自分の環境では0.07=70msecほどズレていたし，あまり安定しないのでこの方法では100msec程度のズレは許容せざるを得ない．
RailsライクなSwift製webフレームワークSwifton

Swift製でRailsライクなフレームワークが出たっぽいです。
その名もSwifton!
Swift on Railsの略のようです！
略したらRailsは消えたのかな(´・ω・｀)

ということで、ちょっと触ってみました。

【公式github】
https://github.com/necolt/Swifton

# インストール

手元の環境がubuntuだったのでubuntuでやります。

最新のswift（3.0-dev）がいるようなので、ソースからコンパイルします。

```bash
$ cd /usr/local/

$ wget https://swift.org/builds/development/ubuntu1510/swift-DEVELOPMENT-SNAPSHOT-2016-02-08-a/swift-DEVELOPMENT-SNAPSHOT-2016-02-08-a-ubuntu15.10.tar.gz

$ tar xvfz swift-DEVELOPMENT-SNAPSHOT-2016-02-08-a-ubuntu15.10.tar.gz

$ mv swift-DEVELOPMENT-SNAPSHOT-2016-02-08-a-ubuntu15.10 swift

$ echo 'PATH=/usr/local/swift/usr/bin:$PATH' >> ~/.bashrc

$ source ~/.bashrc

$ swift --version
Swift version 3.0-dev (LLVM a7663bb722, Clang 4ca3c7fa28, Swift 1c2f40e246)
Target: x86_64-unknown-linux-gnu
```

そしてインストール。
今の所ToDoアプリのサンプルをcloneしてね、みたいな手順になってるようです。この辺はまだ走り出し感がありますね。

```bash
$ git clone https://github.com/necolt/Swifton-TodoApp.git

$ cd Swifton-TodoApp

$ swift build
```

# ディレクトリ構成

サンプルアプリ見る限りですが、こんな構成になってるみたいです。

```
app -- Views -- Todos -- Index.html.stencil
    |- Public -- jquery_ujs.js
    |- Sources -- main.swift
    |          |- TodoController.swift
    |          |- Todo.swift
    |          |- ApplicationController.swift
    |- Packages/
    |- app.json
    |- README.md
    |- Procfile
    |- Package.swift
    |- MIT-LICENSE
    |- Dockerfile
```

Sourcesにcontrollerとかmodelとかrouterとか入ってるようですね。
テンプレートエンジンにはstencilというのを使っているようです。twigっぽい雰囲気。

# 起動してみる

サンプルアプリに起動してアクセスしみてます。

```bash
$ ./.build/debug/Swifton-TodoApp
[2016-02-22 01:28:39 +0000] [1623] [INFO] Listening at http://0.0.0.0:8000 (1623)
[2016-02-22 01:28:39 +0000] [1624] [INFO] Booting worker process with pid: 1624
```

サーバーは無事起動しました。
localhost:8000にアクセスすればいいようなので、ブラウザからアクセスしてみます。
※docker使ってたので、8889にポートフォワードしてます。

アクセスしたらrouteがないと怒られました(´・ω・｀)

![スクリーンショット 2016-02-22 10.36.36.png](https://qiita-image-store.s3.amazonaws.com/0/105934/4f309b15-e398-ece8-05f9-94aa5fffaac4.png)


main.swiftにroute情報が書いてあるみたいなので見てみます

```swift:main.swift
router.resources("todos", TodosController())
```

todosにアクセスすればよさそうです。

![スクリーンショット 2016-02-22 10.39.40.png](https://qiita-image-store.s3.amazonaws.com/0/105934/b2e8d0d1-1102-48e7-67d9-acd5f7a1c9b4.png)


だいぶシンプルな感じのページですが、一応表示されました！
まだmigrationあたりとか言及されてないので、その辺までサポートしてくれるといいなぁ〜
なにはともあれ取り扱いは簡単にできそうなので、もうちょっといじってみようかな！
PHPStormでのDebug時に、毎回1行目で止まるのを解除する

PHPStormで、RemoteDebugの設定時に、
メッセージを確認せずに、うっかりYesを選択してしまったら、
毎回1行目で止まってしまうようになりました。

下記から解除できます。
Run > Break at first line in PHP scripts　のチェックをOFF

![image](https://qiita-image-store.s3.amazonaws.com/0/108481/cf7dcfa4-61df-d217-6cd8-4fad077a1b24.png)
Leaflet.js（〜version 0.7.*）の地図上にd3.jsでsvg要素を表示する


このページに記載のサンプルコードを例として参考にします。Leaflet.jsのヴァージョンが0.7.*以下の場合で有効な書き方です。
http://www.d3noob.org/2014/03/leaflet-map-with-d3js-elements-that-are.html

ライブラリファイルを読み込みます。

```
<link rel="stylesheet" href="//cdn.leafletjs.com/leaflet-0.7/leaflet.css" />
<script src="//cdn.leafletjs.com/leaflet-0.7/leaflet.js"></script>
<script src="//d3js.org/d3.v3.min.js"></script>
```

地図を描きます（例はOpenStreetMap）。

```
var map = L.map('map').setView([35.689488, 139.691706], 4);
mapLink = '<a href="http://openstreetmap.org">OpenStreetMap</a>';

L.tileLayer(
    'http://{s}.www.toolserver.org/tiles/bw-mapnik/{z}/{x}/{y}.png', {
    attribution: '&copy; ' + mapLink + ' Contributors',
    maxZoom: 18,
}).addTo(map);
    
map._initPathRoot();
```

![map1.png](https://qiita-image-store.s3.amazonaws.com/0/1417/ad4e5545-9922-9b5a-3b45-50c3d293c81b.png "map1.png")

地図が表示されました。

ChromeでDeveloper Toolsを立ち上げてみると、Leaflet.jsが生成したdivの中に、svgが生成されています。

![code1.png](https://qiita-image-store.s3.amazonaws.com/0/1417/1ed008fb-b633-8c1b-324c-9677ced3d99c.png "code1.png")

ここにd3.jsを使って、svg要素を追加していきます。まずは便利なのでグループ要素を生成します。

```
var g = d3.select("#map").select("svg").append("g");
```

![code2.png](https://qiita-image-store.s3.amazonaws.com/0/1417/445255fd-4f2e-833c-f468-deee8773152a.png "code2.png")

svgの中にgroupが生成されました。
データを元にcircleを生成すると、

```
var feature = g.selectAll("circle")
    .data(collection.objects)
    .enter().append("circle")
    .style("stroke", "black")  
    .style("opacity", .4) 
    .style("fill", "red")
    .attr("r", 4);  
```

![map2.png](https://qiita-image-store.s3.amazonaws.com/0/1417/d7b8e3dc-1191-b44c-2015-4aaf7e7d523b.png "map2.png")

groupの中にcicleが生成されました。

![code3.png](https://qiita-image-store.s3.amazonaws.com/0/1417/df65202b-3615-2bc0-26e2-8d24f0a60b15.png "code3.png")

あとはviewreset時に、生成したグループの位置合わせをするようにlatLngToLayerPointを使った設定をしておきます。
http://leafletjs.com/reference.html#map-viewreset

```
map.on("viewreset", update);
update();

function update() {
  feature.attr("transform", 
  function(d) { 
    return "translate("+ 
      map.latLngToLayerPoint(d.LatLng).x +","+ 
      map.latLngToLayerPoint(d.LatLng).y +")";
    }
  )
}
```
[#Windows10] Windows7からのアップデート時にデュアルディスプレイできなくなった

"windows10 デュアルディスプレイ できない"で検索された方。
ご安心ください。どうにかなる・・・かも知れません。

# 症例

Dell製デスクトップマシンを
Windows7からWindows10にアップデートしたら、
デュアルディスプレイできなくなってつらかった。

# 原因の調べ方

Windows10にてデバイスマネージャーを開きます。
すると、ディスプレイアダプターのところが
Microsoft 基本ディスプレイ アダプターっていうのに
なっているかと思います。


![スクリーンショット_020816_102827_AM_022216_103135_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19990/bfc96b17-92c5-44c0-4f1f-daf3cb6cde54.jpeg)

この状態ではデュアルディスプレイできません。
Microsoft基本ディスプレイアダプタークソですね。

Microsoft基本ディスプレイアダプターとは何かというと、
ディスプレイが複数枚になった時にそれらの整合性をとる
「ビデオカード」というハードウェアの、ドライバとなっております。
**ビデオカード・OSに対応した適切なドライバが適用されていないとデュアルディスプレイできない**ということです。


# 回避方法

問題の原因はディスプレイアダプターが
Windows10に対応していないことが挙げられます。
僕の場合はNVIDIA Quadro FX 550という
少し古いディスプレイアダプターが使われていました。

このドライバ、Windows10版が準備されていないようで
[NVIDIA ビデオカードドライバ ダウンロードページ](http://www.nvidia.co.jp/Download/index.aspx?lang=jp)
で検索しても画像の通り見つかりませんでした。

![スクリーンショット_020816_102216_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19990/74b96853-35c7-75e5-4bc5-c3fed8c03263.jpeg)

なので、回避方法としては**上記ダウンロードページで
自分のビデオカード用のディスプレイアダプターが
Windows10向けに作成されているか先に検索すること**
が挙げられます。

自分のビデオカードのドライバが
Windows10向けに作られていないなら
**Windows10へのアップデートを諦めましょう**。

※自分の使っているマシンのビデオカードの
種類はデバイスマネージャーで調べてください。

# 手遅れな人へ

Windows10にアップデートしてから気づいた方は、
ビデオカード(ハードウェアです)を挿し替えましょう。
家電屋さんかどっかで適当なビデオカードを入手して挿し替えましょう。
(僕もそうしました。)

ビデオカードを購入する前に、Windows10向けの
ドライバが準備されているかWebで調べましょう。
NVIDIA製のビデオカードの場合は先ほどの
ドライバダウンロードページで検索できます。

# 問題解決後

問題解決(=*ビデオカード挿し替え*)すると、ディスプレイアダプター(ビデオカードのドライバ)は
基本ディスプレイアダプターというのから書き換わっています。

![quadro_022216_103112_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/19990/fd1b81e3-aa12-db05-7a21-81b7edfc63c0.jpeg)

現在は無事にデュアルディスプレイできています。
めでたしめでたし
[PHP]日付ライブラリ「Carbon」の挙動を確認する※随時更新

# 概要
- 現在のプロジェクトでPHPの日付ライブラリである「Carbon」使用している
- 自分にとって一部挙動がよく分からない箇所があるのでテストコードを書いて確認する
- ドキュメントを読んでいるが実際に確認したほうが安心というのもある
- 確認したものから随時更新していく
- 確認はメソッド単位で行う

## diffInMonths()
- Carbonインスタンス同士を比較して「経過した月数」を返すメソッド

```php
/**
 * Test diffInMonths()
 */
public function testDiffInMonths()
{
    // 現在日時同士
    $carbon1 = Carbon::now();
    $carbon2 = Carbon::now();
    $this->assertEquals(0, $carbon1->diffInMonths($carbon2));

    // 1ヶ月経過してない
    $carbon1 = Carbon::createFromFormat('Y-m-d', '2016-02-01');
    $carbon2 = Carbon::createFromFormat('Y-m-d', '2016-02-01')->addMonth()->subDay();
    $this->assertEquals(0, $carbon1->diffInMonths($carbon2)); // true

    // 1ヶ月経過した
    $carbon1 = Carbon::createFromFormat('Y-m-d', '2016-02-01');
    $carbon2 = Carbon::createFromFormat('Y-m-d', '2016-02-01')->addMonth();
    $this->assertEquals(1, $carbon1->diffInMonths($carbon2)); // true

    // 2ヶ月経過した
    $carbon1 = Carbon::createFromFormat('Y-m-d', '2016-02-01');
    $carbon2 = Carbon::createFromFormat('Y-m-d', '2016-02-01')->addMonths(2);
    $this->assertEquals(2, $carbon1->diffInMonths($carbon2)); // true

    // 1年1ヶ月経過した
    $carbon1 = Carbon::createFromFormat('Y-m-d', '2016-02-01');
    $carbon2 = Carbon::createFromFormat('Y-m-d', '2016-02-01')->addYear()->addMonth();
    $this->assertEquals(13, $carbon1->diffInMonths($carbon2)); // true
}
```
Excelで40代のおっさんが忘れがちなこと(随時追記)

40代にもなると、Excel使う頻度が増えるので、年に一回ぐらい調べなおすハメになるアレをメモっておく。

#軸の目盛間隔を30分ごとにする。
0.02083333333を指定



# このメモを作ったことさえ忘れる。

たぶんどうしようもない。
Amazon LinuxへのErlang/Elixir/Phoenixのインストール手順

Amazon LinuxへErlang/Elixirをインストールした際の手順メモです。

# 手順

```
# ホームディレクトリに移動
cd

# gitをインストール
sudo yum install git

# nvmをgitリポジトリからclone
git clone git://github.com/creationix/nvm.git .nvm

# .bash_profileを変更
vi ~/.bash_profile

  # 以下の設定を追加
  source ~/.nvm/nvm.sh

# 一旦ログアウトして再ログイン

# インストール可能なnode.jsのバージョンの一覧を確認
nvm ls-remote

# node.jsをインストール(LTSであるv4の最新版をインストールしておく)
nvm install v4.3.1

# バージョンを確認
node -v

# nvmのデフォルトバージョンを定義
nvm alias default v4.3.1

# erlangの依存パッケージをインストール
sudo yum install ncurses ncurses-devel openssl openssl-devel gcc-c++ unixODBC unixODBC-devel fop *openjdk-devel inotify-tools
sudo yum --enablerepo=epel install inotify-tools

# 作業ディレクトリを作成して移動
mkdir ~/work && cd ~/work

# erlangの最新バージョン(記事執筆時点では18.2.1)をソースからインストール
wget http://erlang.org/download/otp_src_18.2.1.tar.gz
tar zxvf otp_src_18.2.1.tar.gz
cd otp_src_18.2.1
./configure

  # wxWidgets not found, wx will NOT be usable
  # というメッセージが表示されますが、GUIを使わないなら無視して良いと思われます。

make
sudo make install

# 動作確認
erl -version

# elixirの最新版(記事執筆時点では1.2.3)をインストール
wget https://github.com/elixir-lang/elixir/releases/download/v1.2.3/Precompiled.zip
sudo unzip Precompiled.zip -d /opt/elixir

# パスを通す
vi ~/.bash_profile

  # export PATHの部分を下記のように変更
  export PATH=/opt/elixir/bin:$PATH

# 一旦ログアウトして再ログイン

# 動作確認
iex

# hexのインストール
mix local.hex

# phoenixのインストール
mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
```

# 参考情報
[AmazonLinuxにErlang＋Elixir＋Phoenixをインストールしてみた](http://blog.tearthesky.com/2015/12/amazonlinuxerlangelixirphoenix.html)
[CentOSにElixirをインストールしてみる](http://d.hatena.ne.jp/hayabusa333/20150617)
[CentOS6 に Erlang / Elixir のインストール](http://qiita.com/sonots/items/335a1cff003d70feff96)
[Node v5.0.0 (stable)](http://qiita.com/yuhei_7/items/f1e6db17e243667b8513)
ドメインのシェアとか

# ドメインに関するあれこれが分かるサイト
## このへんから
* http://www.webhosting.info/domain-names/registrars

## 特に日本レジストラにおける契約数
* http://www.webhosting.info/domain-names/registrars/reports/country/JPN

あまり使うサイトではないので備忘録的に
ディスク関係でよくやらされること

搭載ディスク全ての容量
```
frdisk -l
```

何のパーティションがあるか調べる
```
cat /proc/partitions
```

全体の容量を確認する
```
df -h
```

現在のディレクトリの容量を見る
```
du -kh .
```

現在のディレクトリ以下の容量を個別に見る
```
du -sh *
```

カレントディレクトリに1.1Gのダミーファイルを作る
```
dd if=/dev/zero of=dummy_file_1GB bs=1M count=1024
```
CrystalのIntのパフォーマンスが悪くなかったのが予想外だったのでLLVM中間表現を確認した

## 背景

前回の記事でCrystalのベンチマークを行った。
http://qiita.com/irxground/items/cd7368444caa5e27ecdd

もちろんこれは「悪くなるだろう」と予想したから計測したのだが、全然そんなことはなかったので、実際に「なぜ悪くならなかったか」を調べてみた。

最近の機械語を吐く言語はたいてい、LLVMを利用しているので、LLVMの中間表現を読んでみるのが手っ取り早い。

## 結果

Crystalは引数の型が `Int8 | Int16 | Int32 | Int64` のようなUnionだった場合、引数の型ごとに関数を生成するようだ。確かにこの方法なら実行時のパフォーマンス劣化は起こらない。
しかも実際に利用した型のみ生成されているので（つまり今回で言えば、`Int8`や`Int16`の分の関数は生成されない）安心して利用できる。

## コード等

### コード

前回の一部を利用

```rb:fib_example.cr
def fib_32(n : Int32)
  if n < 2
    n
  else
    fib_32(n - 1) + fib_32(n - 2)
  end
end

def fib_signed(n : Int::Signed)
  if n < 2
    n
  else
    fib_signed(n - 1) + fib_signed(n - 2)
  end
end

N = 20
pp fib_32(N)
pp fib_signed(N.to_i32)
pp fib_signed(N.to_i64)
```

### 生成

```
$ crystal build --emit llvm-ir --release fib_example.cr
```

### 生成されたLLVM中間表現

自分の手元だと中間表現は 12,715行もの巨大なコードになるので、ぱっと見圧倒されるが、LLVM中間表現上の関数名には元のCrystalの関数名が含まれるので、関数名で検索すれば簡単に見つかる。

ただし今回の例ではうまくいっているが（CrystalがやっているのかLLVMがやっているのかわからないが）関数のインライン展開はかなり行われるので、もし同じようにLLVM中間表現を読もうとしている人は注意したほうがいいと思う。


```llvm
; （略）

; Function Attrs: nounwind readnone uwtable
define internal fastcc i32 @"*fib_32<Int32>:Int32"(i32 %n) #5 {
entry:
  %0 = icmp slt i32 %n, 2
  br i1 %0, label %exit, label %else

else:                                             ; preds = %entry
  %1 = add i32 %n, -1
  %2 = tail call fastcc i32 @"*fib_32<Int32>:Int32"(i32 %1)
  %3 = add i32 %n, -2
  %4 = tail call fastcc i32 @"*fib_32<Int32>:Int32"(i32 %3)
  %5 = add i32 %4, %2
  ret i32 %5

exit:                                             ; preds = %entry
  ret i32 %n
}

; （略）

; Function Attrs: nounwind readnone uwtable
define internal fastcc i32 @"*fib_signed<Int32>:Int32"(i32 %n) #5 {
entry:
  %0 = icmp slt i32 %n, 2
  br i1 %0, label %exit, label %else

else:                                             ; preds = %entry
  %1 = add i32 %n, -1
  %2 = tail call fastcc i32 @"*fib_signed<Int32>:Int32"(i32 %1)
  %3 = add i32 %n, -2
  %4 = tail call fastcc i32 @"*fib_signed<Int32>:Int32"(i32 %3)
  %5 = add i32 %4, %2
  ret i32 %5

exit:                                             ; preds = %entry
  ret i32 %n
}

; Function Attrs: nounwind readnone uwtable
define internal fastcc i64 @"*fib_signed<Int64>:Int64"(i64 %n) #5 {
entry:
  %0 = icmp slt i64 %n, 2
  br i1 %0, label %exit, label %else

else:                                             ; preds = %entry
  %1 = add i64 %n, -1
  %2 = tail call fastcc i64 @"*fib_signed<Int64>:Int64"(i64 %1)
  %3 = add i64 %n, -2
  %4 = tail call fastcc i64 @"*fib_signed<Int64>:Int64"(i64 %3)
  %5 = add i64 %4, %2
  ret i64 %5

exit:                                             ; preds = %entry
  ret i64 %n
}

; （略）
```

しかし、`fib32`も`fib_32<Int32>`という関数名になっているのは不思議だ……
Excel > 土日は"休"と表示する > =IF(OR(WEEKDAY(C7)=1,WEEKDAY(C7)=7),"休","") > =IF(WEEKDAY(C7,2)>=6,"休","")

```txt:動作確認
Excel 2013 on Windows 8.1 pro (64bit)
```

| 対象セル | 項目 | 例 |
|:-:|:-:|:-:|
| C7 | 月/日 | 3/3 |
| D7 | 月/日 | 3/4  |
| E7 | 月/日 | 3/5  |

土日は"休"、それ以外は何も表示しないようにしたい。

以下を使えばよさそう。

```
=IF(WEEKDAY(C7)>=6,"休","")
```

結果、こうなる。

| 対象セル | 項目 | 例 | 結果 |
|:-:|:-:|:-:|:-:|
| C7 | 月/日 | 3/3 | |
| D7 | 月/日 | 3/4  | "休" |
| E7 | 月/日 | 3/5  | "休" |


祝日には対応してないので、そこはセルフサービス（自分で記述）で。

## v0.2 

weekdayは以下のようだった。

- 7: Satruday
- 1: Sunday

[office.com](https://support.office.com/en-us/article/WEEKDAY-function-60e44483-2ed1-439f-8bd0-e404c190949a)


こちらが正しかった。

```
=IF(OR(WEEKDAY(C7)=1,WEEKDAY(C7)=7),"休","")
```

| 対象セル | 項目 | 例 | 結果 |
|:-:|:-:|:-:|:-:|
| C7 | 月/日 | 3/3 | |
| D7 | 月/日 | 3/4  | |
| E7 | 月/日 | 3/5  | "休" |


<hr>
(追記 2016/02/23)
@shibahead さんによるコメントをタイトルに追記しました。
ビジュアル仕様書共有ツール Zeplin でアプリ開発が爆速になった


デザイナーが作ったデザインをエンジニアがコードに落としこむ工程，コミュニケーションコストも大きくなかなか大変ですよね．そんな課題を解決してくれる，ビジュアル仕様書共有ツール Zeplin を使ってみたところ非常に好感触で，アプリ開発がかなり効率化されたように思うので，普及もかねてまとめてみようと想います． 

## Zeplin は何を解決してくれるのか

これまでアプリ開発の際，デザイナーさんに以下の様なビジュアル仕様書を Google Drive で共有してもらっていました．

![スクリーンショット 2016-02-20 22.59.11.png](https://qiita-image-store.s3.amazonaws.com/0/7113/b8d4c7b7-f641-c399-e233-338c57af6802.png "スクリーンショット 2016-02-20 22.59.11.png")

自分はデザイナーさんみたいに 1px の細かい差異など分からなかったりするので，このようなビジュアル仕様書を作成してもらえると，正しく実装することができ非常に助かります．しかし，これには例えば以下のような課題がありました．

(1) デザイナーさんのコストが大きい．上図の例はアプリの 1 画面に過ぎませんが，これが 10 枚，20枚… となってくると膨大な時間と労力が必要になります．

(2) 漏れなく記述するのが難しい．コーディングと違い MECE かどうか自動テストすることなどできないので仕方がない面もありますが，サイズや位置などを同定できないケースが発生する度に，デザイナーさんとのコミュニケーションコストがかかってしまいます．

(3) 静的であり柔軟性がない．ビジュアル仕様書に記載されていないけど，実装の都合でこのコンポーネントとこのコンポーネントの間の距離がほしい！といったことはよくありますが，記載されている位置やサイズから自分で割り出さなければなりません．

このようなエンジニア･デザイナー間の課題を全て解決してくれる神ツール，それが Zeplin です．Zeplin は，__Sketch__ __で作成したデザインを流し込むだけで__ 高機能なビジュアル仕様書を作成でき，それ以外にも多くの機能を提供してくれます．

## Zeplin でできること

それでは，Zeplin でできることを見ていきたいと想います．

### 1. コンポーネントの位置，サイズ，カラーなどの取得
![ssTypeface.png](https://qiita-image-store.s3.amazonaws.com/0/7113/b601b0ea-9d66-c927-215f-413bc1de92f8.png "ssTypeface.png")

これがメインの機能です．コンポーネントをクリックすると，右に位置･サイズ･カラー･フォントなどの情報が表示されます．また，この状態で他のコンポーネントをマウスオーバーすると，そのコンポーネントとの距離が表示されます．各コンポーネントのアセットのダウンロードももちろんできます．

### 2. デザイン上にコメントを残す
![ssNote.png](https://qiita-image-store.s3.amazonaws.com/0/7113/ff5f4d6c-dd70-b4a9-b8cf-fdfefee2dd65.png "ssNote.png")

デザイン上に共有したいことをコメントとして残すことができます．デザイナーさんが動きの部分を説明したり，エンジニアが気になった部分を質問したりと，Zeplin 上でコミュニケーションを完結することができます．

### 3. カラーとフォントのガイドラインの取得
![ssGuideline.png](https://qiita-image-store.s3.amazonaws.com/0/7113/644988eb-7dfc-976f-20fd-32a502fa0c62.png "ssGuideline.png")

上図のようなガイドラインを自動で作成してくれます．さらに iOS アプリの場合，以下のように，ガイドラインに基づき UIColor の extension を Swift または Obj-C で自動で生成してくれるので非常に便利です．カラー名は Zeplin 上で指定できます．

```swift
import UIKit

extension UIColor {
    class func warmGreyColor() -> UIColor {
        return UIColor(white: 124.0 / 255.0, alpha: 1.0)
    }
    ...
}
```
### 4. CSS 自動生成
![tmp2.gif](https://qiita-image-store.s3.amazonaws.com/0/7113/fe84b137-a122-7ea9-e4f9-581c773d8826.gif "tmp2.gif")

Zeplin 1.2 から，コンポーネントの CSS を出力してくれるようになりました． 自分はまだ試していないですが，Web 開発がさらに爆速になりそうですね．

Zeplin には Web ブラウザ版と Mac アプリがあり，自分は Mac アプリの方を利用しています．Zeplin に興味を持たれた方，1 プロジェクトまでは無料で利用できるのでぜひ 1 度試してみて下さい．コミュニケーションコストが劇的に減るはずです．
--no-input をcall_command のoption指定 にしたい場合

Djangoでcall_commandのoption指定で迷ったのでメモ

```.py
# Similar to the command line
management.call_command('dumpdata', '--natural-foreign')

# Named argument similar to the command line minus the initial dashes and
# with internal dashes replaced by underscores
management.call_command('dumpdata', natural_foreign=True)

# `use_natural_foreign_keys` is the option destination variable
management.call_command('dumpdata', use_natural_foreign_keys=True)

```
[参照 django](https://docs.djangoproject.com/es/1.9/ref/django-admin/#running-management-commands-from-your-code)

と記述してあるので、

`python manage.py flush --noinput`
を実行したい場合は、

```.py 
management.call_command('flush',noinput=True)
```

で動くと思ったが一向にnoinputが効かなかった。

そこでいろいろ調べると
https://github.com/django/django/blob/master/django/core/management/commands/flush.py#L20
ということらしい。
そこで

```.py 
management.call_command('flush',interactive=False)
```
としたら動いた。

ドキュメントに書いてないような……。ソース読めってことなのか……。
[Django] リダイレクト先でメッセージを表示する


環境
Python 3.5.0
Django 1.9.2

```settings.py
MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'
```

```views.py
from django.contrib import messages

messages.success(request, '更新しました！')
```

```template.html
{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}
```

参考文献
[DjangoでrailsのFlashメッセージと同じことをしたい - 雑記](http://d.hatena.ne.jp/yuheiomori0718/20120620/1340205629)