OmniAICreator/Qiita-1.07M huggingface dataset:
２つのベクトルのなす角の内積・外積の数値の変化を確認

２つのベクトルのなす角が0°〜360°の間でどのように数値として変化するかを確認するDartのプログラム。

![スクリーンショット 2014-05-27 13.50.59.png](https://qiita-image-store.s3.amazonaws.com/0/636/3d83e104-8400-59a4-9c8a-a9893133fa06.png)

```yaml:pubspec.yaml
name: dotcheck
dependencies:
    browser: any
    vector_math: any
```

```html:index.html
<!DOCTYPE html>
<canvas id="canvas" width="500px" height="500px"></canvas>
<script type="application/dart" src="dotcheck.dart"></script>
<script src="packages/browser/dart.js"></script>
```

```dart:dotcrosscheck.dart
import 'dart:html';
import 'dart:math';
import 'package:vector_math/vector_math.dart';

CanvasElement canvas;
CanvasRenderingContext2D ctx;

num theta = 0;
num r = 100;

Vector2 origin = new Vector2.zero();
Vector2 to = new Vector2.zero();

main() {
  canvas = document.query('#canvas');
  ctx = canvas.getContext('2d');

  ctx.strokeStyle = 'black';

  window.requestAnimationFrame(update);
}

num lastTime;
update(num time) {
  num dt = lastTime != null ? (time - lastTime) / 1000 : 0;
  lastTime = time;

  window.requestAnimationFrame(update);

  render();

  theta += (PI / 4) * dt;
  if (theta > PI * 2) {
    theta %= PI * 2;
  }
}

render() {
  ctx
    ..resetTransform()
    ..clearRect(0, 0, canvas.width, canvas.height)
    ..translate(canvas.width / 2, canvas.height / 2)
    ..beginPath()
    ..moveTo(0, 0)
    ..lineTo(r, 0)
    ..moveTo(0, 0)
    ..lineTo(cos(theta) * r, sin(theta) * r)
    ..stroke();

  origin
    ..x = 1
    ..y = 0;
  to
    ..x = cos(theta)
    ..y = sin(theta);

  ctx
    ..fillText('angle: ${(theta * 180 / PI).toInt()}', 10, 10)
    ..fillText('dot: ${origin.dot(to)}', 10, 30)
    ..fillText('cross: ${origin.cross(to)}', 10, 50);
}
```
RMagick で正方形のサムネイルを作成する

![main_back.png](https://qiita-image-store.s3.amazonaws.com/0/1349/b2c8071e-120a-b4c3-5273-391668042713.png '元画像')

「RMagick 正方形」でググると [Railsでアップロードした画像からRMagickで正方形のサムネイルを作成 - Qiita](/kaorumori/items/562374ea1260d4c18531) という記事が出てきますが、こちらは正方形の白い画像の上に縮小した画像を貼った状態となり、あまり期待される操作だと思わなかったのでこちらにメモ

![f1618d2dd8dc86c8c6435afa1062bc4c.png](https://qiita-image-store.s3.amazonaws.com/0/1349/b8572408-4f78-4b8f-bb2d-19fe9c9c3fb8.png 'リサイズ1')


## RMagick 版
```rb
def create_square_image(rmagick, size)
  narrow = rmagick.columns > rmagick.rows ? rmagick.rows : rmagick.columns
  rmagick.crop(Magick::CenterGravity, narrow, narrow).resize(size, size)
end
```


## MiniMagick 版

```rb
def create_square_image(magick, size)
  narrow = magick[:width] > magick[:height] ? magick[:height] : magick[:width]
  magick.combine_options do |c|
   c.gravity "center"
   c.crop "#{narrow}x#{narrow}+0+0"
  end
  magick.resize "#{size}x#{size}"
end
```

![82d4dde70cfab5cb16619688d41d4cd8.png](https://qiita-image-store.s3.amazonaws.com/0/1349/3d5361d3-847f-e85e-ca57-b66d099132c7.png 'ソリューション')
こうなります
rails4でhas_manyにuniq制約を付ける

railsでhas_many :throughした時に重複しないような制約をかけるために、従来は以下のようにしていました。

```ruby:product.rb
class Product < ActiveRecord::Base
  has_many :product_categories
  has_many :categories, through: product_categories, uniq: true
end
```

ですが、これだとRails4.xでは以下のようなdeprecation warningが出ます。

```
DEPRECATION WARNING: The following options in your Product.has_many :categories declaration are deprecated: :uniq. Please use a scope block instead. For example, the following:
(以下略)
```

この警告をなくすにはscopeを使って以下のように書きます。

```ruby:product.rb
class Product < ActiveRecord::Base
  has_many :product_categories
  has_many :categories, -> { uniq }, through: product_categories
end
```

現時点では以前の書き方でも動きますが将来のバージョンでは無効になるので今のうちに書き換えておきましょう。
HHVM(HipHop Virtual Machine)/Hackとは

古い記事なのに、ちょこちょこと見られているようなので少し更新しました。Hackはタグすらない不遇っぷり。

# HHVMとは
HHVM(HipHop Virtual Machine)とは、Facebookが開発・公開しているC++で実装されたPHP実行環境（JITコンパイラ）の一つです。PHPのコードをJITコンパイルし、高速で動作させることを目的としています。以前に公開された「HHVM 3.0.0」ではPHPの他にPHPとシームレスに連携できる新しいプログラミング言語の「Hack」も動作させることができます。
（2017/07/31現在の最新版は3.20.0）
HHVMはFastCGIベースでApacheやnginxと共に動作します。

- 2014年ごろは、PHPをHHVMで動作させれば速くなるかも！と言った使われ方もあった様ですが、PHP7もリリースされた最近ではHack/HHVMとセットで使われることが多そうです。

## Hackとは
HHVM環境でPHPと共に動作する開発言語で、Facebookが開発・公開しています。PHPの利点と静的型付言語の利点を兼ね備え、一般的な開発言語が持っている機能もほぼ網羅されています。PHPからの移行も易しく、facebook社内のPHPコードはほぼHackに置き換えられているとのこと。ジェネリクス、Nullable型、型エイリアス化、Collections、ラムダなども実装されています。

### Hackエディタ
- [Nuclide](https://nuclide.io/) facebookオススメ
- [Vim](https://github.com/hhvm/vim-hack) 
- [Emacs](https://github.com/facebook/hhvm/tree/master/hphp/hack/editor-plugins/emacs)
- [Atom](https://github.com/steelbrain/atom-hack)
- [SublimeText](https://github.com/SiebelsTim/hack-sublime)

# HHVMのインストール
HHVM環境を作成するには、自分でbuildする方法とパッケージから導入する方法があります。パッケージから導入する方法は割と簡単ですが、buildするのは結構面倒です。

# 日本語情報について
ほとんどありません。blogでも環境を作って動かしてみたぐらいの人が多い様です。英語のドキュメントはそれなりにあるようですが、3系のものはまだあまり無い模様。

## 書籍
Kindle版 [プログラミングHHVM Hack](https://www.amazon.co.jp/exec/obidos/ASIN/B071J15YF3/hatofyon-22/)

### CentOSにとりあえず入れてみました(古い記事です)
[HHVM 3.0.1をCentOS 6.5 (64-bit)にインストールする](http://qiita.com/azurite@github/items/7fe383a8e5bdba373cf9)

#利用事例
https://www.slideshare.net/yujiotani16/php7hackhhvm7
https://speakerdeck.com/curepine/hackdefalse-zhuan-zhi-saitogou-zhu-shi-li
https://www.slideshare.net/K2ICE/hhvm-on-centos6?ref=https://geechs-magazine.com/tag/event/20160215

# 参考
https://code.facebook.com/posts/264544830379293/hack-a-new-programming-language-for-hhvm/

http://hhvm.com/
https://github.com/facebook/hhvm

http://hacklang.org/
ファイルのタイムスタンプを変更する

電子成果などでファイルの作成日付や編集日付を納期前に設定しないといけないことが、希にだがよくある。
ファイルを編集する時にパソコンの日付をいじってしまえばできなくはないけど、ネットワークに接続されたパソコンの日付が大きく変わるとネットワークにアクセスするタイプの操作ではトラブルが起こる可能性もあるのでPowerShellで日付だけを変更する方法を探した。

更新日時を変更する場合

```ps1
PS> Set-ItemProperty %FileName% -Name LastWriteTime -Value "%日時%"
```

作成日時を変更する場合

```ps1
PS> Set-ItemProperty %FileName% -Name CreationTime -Value "%日時%"
```

%日時%に日付と時間を設定する。
例えば2014年2月28日の午前10:50としたいのであれば、「02/28/2014 10:50 AM」という文字列を入れればOk。
ここで入れる文字列はおそらく `[Datetime]::Parse` でパースできる文字列になっていれば大丈夫なはず。例えば「2014/2/28 10:50」でも日時を読み取ってくれた。

扱えるプロパティは日時だけではなく下記の様なコマンドで一覧を見ることができる。

```ps1
PS> Get-ItemProperty %FileName% | Get-Member -MemberType Property
   TypeName: System.IO.FileInfo

Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   System.DateTime CreationTime {get;set;}
CreationTimeUtc   Property   System.DateTime CreationTimeUtc {get;set;}
Directory         Property   System.IO.DirectoryInfo Directory {get;}
DirectoryName     Property   System.String DirectoryName {get;}
Exists            Property   System.Boolean Exists {get;}
Extension         Property   System.String Extension {get;}
FullName          Property   System.String FullName {get;}
IsReadOnly        Property   System.Boolean IsReadOnly {get;set;}
LastAccessTime    Property   System.DateTime LastAccessTime {get;set;}
LastAccessTimeUtc Property   System.DateTime LastAccessTimeUtc {get;set;}
LastWriteTime     Property   System.DateTime LastWriteTime {get;set;}
LastWriteTimeUtc  Property   System.DateTime LastWriteTimeUtc {get;set;}
Length            Property   System.Int64 Length {get;}
Name              Property   System.String Name {get;}
```

「set;」を持つプロパティは日付と同じコマンドで変更が可能らしい。
Circle CIで一定量のカバレッジに行かなかったらテストを落とす。

CircleCIで一定量のcoverageに達しない場合はテストを落として、デプロイしない用にする。

# 前提
- railsで開発を行っている。
- gem simplecovを導入している。
- rspecを導入している(他のテストツールでも多分大丈夫)


CircleCI自体はそのような機能は持っていない。下記問い合わせの返信内容。
>
We don't have anything built-in to prevent deploys when the test coverage is low. However, it looks like you're using simlecov. You can configure simplecov to fail the tests if the coverage is not high enough: https://github.com/colszowka/simplecov#minimum-coverage. We won't deploy if the tests fail.


# 解決方法
SimpleCovの設定でminimum_covarageを指定する。
`SimpleCov.minimum_coverage 90`


具体的には、spec#spec_helper.rbに下記のように設定した。

```rb:spec_helper.rb
require 'simplecov'
require 'simplecov-rcov'
if ENV['CIRCLE_ARTIFACTS']
  dir = File.join("..", "..", "..", ENV['CIRCLE_ARTIFACTS'], "coverage")
  SimpleCov.coverage_dir(dir)
end

SimpleCov.minimum_coverage 90
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
SimpleCov.start do
  add_filter 'spec'
  add_filter 'vendor'
  add_filter 'features'
end

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'factory_girl'
~
~
~
```

circle CIでcovarageが低いと下記の用にエラーが出る。その後デプロイはされない。(minimum_coverageを100に設定してる)
>
Coverage (95.24%) is below the expected minimum coverage (100.00%).
((bundle exec rspec "" "" "spec" --format "progress")) returned exit code 2
DataPipelineのEc2Resouceで使えるAMIを作り上げる

とりあえずUbuntu 12.04でやった手順を載せておきます。

# 必要な物

実際には

* Linux
* Bash
* wget
* unzip
* Java 1.6 or newer
* cloud-init

が、必要なようですが、割と標準で入ってると思います。Javaはそうでもないかな？
今回既存のサーバーにですが以下の物が足りなかったので追加しました。

1. cloud-init
2. ec2-userという名前のユーザー

# 追加方法

## cloud-init

```bash
$ apt-get install cloud-init
```

## ec2-userの追加

### ユーザーの追加

```bash
$ adduser ec2-user
```

### ssh周りの設定

```bash
$ mkdir /home/ec2-user/.ssh
$ chmod 600 /home/ec2-user/.ssh
$ cp /home/ubuntu/.ssh/authorized_keys /home/ec2-user/.ssh/authorized_keys
$ chown ec2-user:ec2-user /home/ec2-user/.ssh/authorized_keys
```

# 参考

[Task Runners - AWS Data Pipeline](http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-how-remote-taskrunner-client.html#dp-custom-ami)
EclipseのJava更新作業 [Mac]

#Javaのダウンロード
##[1]
最新版をORACLEからダウンロード、
http://www.oracle.com/technetwork/java/javase/overview/index.html
インストールをする。
##[2]
Eclipseの環境設定>Java>インストール済みのJRE
を選択し、右の欄から追加をクリックして、
MacOS X VM を選択し、JREホームに
/Library/Java/JavaVirtualMachines/jdk1.x.x_xx.jdk/Contents/Home
最新版のJavaを選択して、チェックを入れて適用させる。
Git tips: ローカルリポジトリのルートやカレントディレクトリとの相対パスを取得する&その応用

あらまし
=======

Gitリポジトリのワーキングツリーのルートディレクトリや、カレントディレクトリとの相対パスが取得できると、リポジトリ全体に対する処理が楽にかけて便利です。

gitにはその機能が備わっていますので、それを使ってみました。

おことわり
========

Git 1.9で確認しています。
マニュアル見た限りでは大丈夫そうですが、ちょっと古いバージョンでは動作しない、または挙動が異なる場合があります。

時間のない人用まとめ
==================

```console
$ # Prepare
$ pwd
/home/myname
$ git init foo-repo
/home/myname/foo-repo/.git/
$ cd foo-repo/
$ mkdir -p bar/baz/
$ touch bar/baz/.gitkeep
$ git add bar/baz/.gitkeep 
$ git commit -m "Initial commit"
$ # Example
$ pwd
/home/myname/foo-repo/bar/baz
$ git rev-parse --show-toplevel
/home/myname/foo-repo
$ git rev-parse --git-dir # 常に絶対パスを返すとは限らない
/home/myname/foo-repo/.git
$ git rev-parse --show-cdup
../../
$ git rev-parse --show-prefix
bar/baz/
```

時間のある人用
============

`/home/myname/foo-repo`がワーキングツリーのルートディレクトリです。

ワーキングツリーのルートの絶対パスを表示する<br>`git rev-parse --show-toplevel` 
-----------------------------------------------------------------------

```console
$ pwd
/home/myname/foo-repo/bar/baz
$ git rev-parse --show-toplevel
/home/myname/foo-repo
```

カレントディレクトリから.git へのパスを表示する<br>`git rev-parse --git-dir` 
-----------------------------------------------------------------------

このコマンドは少しややこしい振る舞いをします。

カレントディレクトリがワーキングツリーのルートであるとき、相対パスを返します。
つまり、`.git`です。

```console
$ pwd
/home/myname/foo-repo/
$ git rev-parse --git-dir
.git
```

カレントディレクトリがワーキングツリーのサブディレクトリであるとき、絶対パスを返します。

```console
$ pwd
/home/myname/foo-repo/bar/baz
$ git rev-parse --git-dir
/home/myname/foo-repo/.git
```

カレントディレクトリからのワーキングツリーのルートへの相対パスを表示する<br>`git rev-parse --show-cdup`
----------------------------------------------------------------------------------------------

ルート **への** 相対パスを表示します。

```console
$ pwd
/home/myname/foo-repo/bar/baz
$ git rev-parse --show-cdup
../../
```

`cd $(git rev-parse --show-cdup)` で、ワーキングツリーのルートへ移動します。

ワーキングツリーのルートからカレントディレクトリの相対パスを表示する<br>`git rev-parse --show-prefix`
--------------------------------------------------------------------------------------------

ルート **からの** 相対パスを表示します。

```console
$ pwd
/home/myname/foo-repo/bar/baz
$ git rev-parse --show-prefix
bar/baz/
```

ルートへの絶対パスを組み合わせると、カレントディレクトリになります。
つまり、`pwd` と `echo $(git rev-parse --show-toplevel)/$(git rev-parse --show-prefix)` は等しくなります。

ワーキングツリーの外で実行した場合
------------------------------

いずれも、ワーキングツリーの外で実行するとエラーメッセージを発して0以外の戻り値を返します。

```console
$ git rev-parse --git-dir
fatal: Not a git repository (or any of the parent directories): .git
$ echo $?
128
```

応用
----

ワーキングツリーに含まれる`.gitignore`を列挙する。

```console
$ find $(git rev-parse --show-cdup) -type f -name .gitignore
```

参考
====
* [Git - git-rev-parse Documentation](http://git-scm.com/docs/git-rev-parse)
* [version control - Is there a way to get the git root directory in one command? - Stack Overflow](http://stackoverflow.com/questions/957928/is-there-a-way-to-get-the-git-root-directory-in-one-command)
NSObject の description メソッド

初回投稿ということで軽めの内容にします。

NSObject クラスには

```objectivec
+ (NSString *)description;
```
と

```objectivec
- (NSString *)desription;
```

の二つの descriptionメソッドが用意されています。
前者は __クラスメソッド__ で、後者は __インスタンスメソッド__ になります。
リファレンスにを読むと、クラスメソッドの方は _"レシーバークラスの内容を表す文字列"_ （通常はクラス名を返すようです）、インスタンスメソッドの方は _"レシーバーの内容を説明する文字列"_ （通常はインスタンスの値や状態を返すように実装しますよね）を返すとあります。
このようにどちらのメソッドを呼ぶかによって結果が異なりますので、どちらのメッソドを読んでいるのかを意識しながらコーディングしましょう。
ちなみに iOS5 から追加された、

```objectivec
- (NSString *)debugDescription
```

はデバッガ用のメソッドらしいのですが、まだ利用したことがありませんでした。
個人的によく忘れる情報へのポインタ

思い出したら随時追記します。

## PHPのマジック変数
http://www.php.net/manual/ja/language.constants.predefined.php

## リクエスト情報関連
http://jp2.php.net/manual/ja/reserved.variables.server.php
http://jp2.php.net/manual/ja/reserved.variables.get.php
http://jp2.php.net/manual/ja/reserved.variables.post.php
http://jp2.php.net/manual/ja/reserved.variables.cookies.php

## マジックメソッド
http://php.net/manual/ja/language.oop5.magic.php

## 配列に何かしたい
http://jp2.php.net/manual/ja/function.array-map.php
http://jp2.php.net/manual/ja/function.array-walk.php
SublimeTextでインデント(tab)を言語ごとに設定する方法

ちょうど悩んでいたことを解決出来たのでメモ。

参考元：[Sublime Text：インデント(tab)を言語ごとに設定する方法](http://charlie.hateblo.jp/entry/2013/10/10/101650)

Packageフォルダに各言語ごとのフォルダを作って、フォルダに「言語名.sublime-settings」という名前で、

```
{
	"tab_size": 2,
	"translate_tabs_to_spaces": false
}
```

と書いて再起動するだけ。

右下で選べるシンタックスと同じ名前にしておけば後から追加した言語でもいけました（と思う。Markdown Extendedとか……）。
CircleCI で db:seed の情報を使用する

## CircleCI の database 処理について
CircleCI は、通常 db:crate と db:schema:load しか行わないようです。具体的には以下のような処理をしています。

```
$ mkdir -p config
  echo 'test:
    host: localhost
    username: ubuntu
    database: circle_ruby_test
    adapter: mysql2
  ' > config/database.yml
$ bundle exec rake db:create db:schema:load --trace
```

つまり CircleCI では、db:seed の処理が行われません。何らかの理由でテストのデータベース処理に db:seed を処理に含めたい場合、以下の様な手順を踏みます。

### database.yml の作成と、db:seed を含めて database 初期化を行うための設定を circle.yml に追加する

CircleCI の公式ドキュメントに記載されている database configuration を参考にして設定します。[Configuring CircleCI #database](https://circleci.com/docs/configuration#database)

リポジトリのルートに ./circle.yml が無ければ作成し、以下の項目を記載してください。

```yaml:circle.yml
database:
  override:
    - mv config/database.ci.yml config/database.yml
    - bundle exec rake db:create db:migrate db:seed --trace
```

リポジトリに CircleCI 用の database.yml が既に用意されている場合は、上述の通りコピーして config/database.yml を作れば良いです。

用意されていない場合は、CircleCI の通常の挙動として記載した処理を参考に mkdir, echo 処理を行うか、次の手順のように database.ci.yml を作成します。

### CircleCI 用の database.yml (config/database.ci.yml) を作る

実際に作成したdatabase.ci.yml を例に挙げておきます。

```yaml:database.ci.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password:

development:
  <<: *default
  database: hoge_dev

test:
  <<: *default
  database: hoge_test
```

mysql2 の場合、username, password, database 名は何でも良いようです。対応しているデータベース、およびデータベースのユーザ名/password 等の情報については、以下のドキュメントを参照してください。[Test environment #database](https://circleci.com/docs/environment#databases)

## db:seed 以外の処理について

database 初期化処理の configuration では、好きなコマンドを実行できます。独自の rake タスクを用意している方や、その他のデータベース関連処理を行いたい場合は、ここに記載して行うと良さそうです。

### 参考サイト
 * http://blog.joshsoftware.com/2013/12/18/overriding-circleci-settings-to-load-data-from-seed-and-rake-tasks/
GroovyのwithCloseableでtry-with-resourcesを実現する

Java 7で入ったtry-with-resourcesは、リソースの開放忘れを防いでくれて便利なんだけど、Groovyではこの構文が使えなかった。

先日リリースされたGroovy 2.3から、try-with-resources構文を直接使うわけじゃないけど、withCloseableを使うことで実現できた。

```groovy
class A implements Closeable {
    def print() {
        println "print"
    }
    
    @Override
    public void close() {
        println "close called."
    }
}

// Closure終わりに自動的にcloseが呼ばれる
new A().withCloseable {
    it.print()
}
```

ポイントは、リソースを開放したいクラスが **Closeable** をimplementsすること。AutoCloseableを直接implementsしても使えない。
ExpressでWebアプリケーションを自動生成する

## 前提
npm インストール済

## express, express-generator, ejsをグローバルインストールする

```
npm install express -g
npm install express-generator -g
npm install ejs -g
```

## インストールフォルダを作る

```
mkdir -p /Desktop/06.express-generator
```

## コマンドでWebアプリケーションを自動生成する

#### 自動生成コマンドを実行する

```
cd /Desktop
express -e 06.express-generator 　　#ejsテンプレートをオプションで指定
```

#### 結果

```
   create : 06.express-generator
   create : 06.express-generator/package.json
   create : 06.express-generator/app.js
   create : 06.express-generator/public
   create : 06.express-generator/public/javascripts
   create : 06.express-generator/routes
   create : 06.express-generator/routes/index.js
   create : 06.express-generator/routes/users.js
   create : 06.express-generator/public/stylesheets
   create : 06.express-generator/public/stylesheets/style.css
   create : 06.express-generator/views
   create : 06.express-generator/views/index.ejs
   create : 06.express-generator/views/error.ejs
   create : 06.express-generator/public/images
   create : 06.express-generator/bin
   create : 06.express-generator/bin/www

   install dependencies:
     $ cd 06.express-generator && npm install

   run the app:
     $ DEBUG=06.express-generator ./bin/www
```

#### 依存モジュールインストール

```
cd 06.express-generator && npm install
```

#### アプリ実行する
```
   DEBUG=06.express-generator ./bin/www 　　　　　    
```

#### アプリを確認する
http://localhost:3000/
CentOSにjavaの開発環境用意

1,CentOSにJDKをインストール
```
$ yum search jdk
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
=============================== N/S Matched: jdk ===============================
java-1.6.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.6.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.6.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.6.0-openjdk-javadoc.x86_64 : OpenJDK API Documentation
java-1.6.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle
ldapjdk-javadoc.x86_64 : Javadoc for ldapjdk
icedtea-web.x86_64 : Additional Java components for OpenJDK
ldapjdk.x86_64 : The Mozilla LDAP Java SDK
```

javaでの開発を行う場合は、以下のどちらかをインストールする。

```
java-1.6.0-openjdk-devel.x86_64 : OpenJDK Development Environment

java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
```

java-1.6

```
yum install java-1.6.0-openjdk-devel
```

java-1.7

```
yum install java-1.7.0-openjdk-devel
```

どちらかをインストールにして完了

※参考
http://linux.just4fun.biz/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2/Java%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92CentOS%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.html
Mac OS XのアプリのURLスキームを調べる

```bash
open dict://この先生きのこるには
```

などのMacに入れてあるアプリのURLスキームを調べる。

スキーマの定義は、各アプリのContents以下にある **Info.plist** に定義されている。CFBundleURLTypesのところ。

```lang:Dict.appのInfo.plist
・・・
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeRole</key>
            <string>Viewer</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>x-dictionary</string>
            </array>
            <key>LSIsAppleDefaultForScheme</key>
            <true/>
        </dict>
        <dict>
            <key>CFBundleTypeRole</key>
            <string>Viewer</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>dict</string>
            </array>
            <key>LSIsAppleDefaultForScheme</key>
            <true/>
        </dict>
    </array>
・・・
```

一々、開いてみるのは面倒なので、一気に一覧化する。

```bash
find /Applications -name Info.plist -print0 | xargs -0 grep -A 3 CFBundleURLSchemes > ~/scheme.txt
```
Encoding::default_externalとEncoding::default_internalをデフォルトでUTF-8にしておく

まとめ
======

環境変数``RUBYOPT=-Eutf-8:utf-8``しましょう。

ついでに``LANG=ja_JP.UTF-8``しましょう。


なぜ(私にとって)必要か
====================

おそらくLinuxでLANG=ja_JP.UTF-8してあれば上記設定はいらないと思います。
私はWindowsでもShift_JISを使わないことに決めたので、単純に全面的にUTF-8で入出力してほしいです。
Windowsだと出力はShift_JIS(Windows-31J)、入力はnil(ASCII-8BIT)になっていて、時々force_encodingしたりencodeしたりが必要なので、めんどくさくなったので設定しました。
[Net::SSH](https://github.com/net-ssh/net-ssh)でLinuxホストから多バイトを受け取る場合なども問題が少なくなると思います。

問題点
======

cmd.exeで実行すると文字化けしそうです。ターミナルエミュレータを入れていれば多分問題無いと思います。

コンソールでgetsで入力待ちになるようなコマンドで日本語入力すると問題が出そうです。ターミナルエミュレータで入力も変換してくれていれば大丈夫だと思いますが、特に検証していません。

そういうものがあるか知りませんが、Encoding基準でなくシステム名でデフォルト文字コードを判定している場合は問題になるかも。
【個人メモ】julia - PyCallを利用してPythonのライブラリをjuliaで使う

# Pythonのライブラリを利用する

相変わらず朝活でドヤ顔でMac Book Pro Retina 13インチを触っている。
今日もjuliaやるか、と思った。
以前、Pythonも使えそうとQiitaの記事に書いた。

[【個人メモ】julia製Web Application Framework "Morsel"を試す](http://qiita.com/futoase/items/c42f72648d9dcd0616e8)

試してみるかと思ったので試してみる。
PyCall.jlをつかえばPythonのライブラリを実行できる。

https://github.com/stevengj/PyCall.jl

試しに使ってみよう。

# PyCall.jlのインストール

JuliaのREPLより、以下のコマンドを実行する

```jl
Pkg.add("PyCall")
```

これでOK

# Pythonのライブラリを試しに利用する

PyCall.jlのREADME.mdに書かれている例では
mathライブラリを利用している。

https://github.com/stevengj/PyCall.jl/blob/ef23e044d4870d3440a76c79d09c85a36c510d06/README.md

```jl
using PyCall
@pyimport math
math.sin(math.pi / 4) - sin(pi / 4)  # returns 0.0
```

# 正規表現ライブラリはつかえるだろうか？

## とりあえず試す

試してみる。

```jl
using PyCall

@pyimport re

match_pattern = re.compile("Welcome to (.+\.)")

groups_of_match = pycall(match_pattern["search"], PyObject, "Welcome to underground.")["group"]

result = convert(String, pycall(groups_of_match, PyObject, 0))
match_of_group = convert(String, pycall(groups_of_match, PyObject, 1))

println("All match is [$result]")
println("Match of first regex group is [$match_of_group]")
```

実行結果は以下の通り。

![スクリーンショット 2014-05-27 9.37.12.png](https://qiita-image-store.s3.amazonaws.com/0/3985/e1a7425a-b857-74d7-4522-4de9df18923d.png)


このコードは、Pythonでは以下と同等だ。

```py
import re

match_pattern = re.compile("Welcome to (.+\.)")

groups_of_match = match_pattern.search("Welcome to underground.")

result = groups_of_match.group(0)
match_of_group = groups_of_match.group(1)

print("All match is [{result}]".format(result=result))
print("Match of first regex group is [{match_of_group}]".format(
  match_of_group=match_of_group)
)
```

実行結果

![スクリーンショット 2014-05-27 9.45.26.png](https://qiita-image-store.s3.amazonaws.com/0/3985/a60afbb6-ec62-95fb-578e-2faecda854bb.png)

## 利用した関数など

### pycall 関数

[参考元](https://github.com/stevengj/PyCall.jl/blob/ef23e044d4870d3440a76c79d09c85a36c510d06/README.md#calling-python)によると、

```jl
pycall(function::PyObject, returntype::Type, args...)
```

という形式で書くとあるので、正規表現ライブラリの試用には以下のようにした。

```jl
pycall(match_pattern["search"], PyObject, "Welcome to underground.")["group"]
```

PyObjectは数値型やbool、関数型を返す。便利オブジェクトっぽい。
(説明にはC APIのPyObjectを利用していると書いてある)

pycallを以上のように呼び出すことで、
正規表現にマッチしたグループ及びマッチした文字列全体を利用できる。

```match_pattern["search"]``` は、
[PyObjectの説明](https://github.com/stevengj/PyCall.jl/blob/ef23e044d4870d3440a76c79d09c85a36c510d06/README.md#pyobject)にある通り、オブジェクトの属性を取得する。この場合は、正規表現マッチオブジェクトの **search** メソッドを呼び出している。

## convert

[convertの説明](https://github.com/stevengj/PyCall.jl/blob/ef23e044d4870d3440a76c79d09c85a36c510d06/README.md#pyobject)は、PyObjectの説明の中に書かれてる。

```jl
convert(T, o::PyObject)
```

要するに、キャストを行う。
juliaのString型にしたかったので、
正規表現の結果(PyObject)をjuliaのString型にキャストした。

```jl
convert(String, pycall(groups_of_match, PyObject, 0))
```

簡単にPyObject型をString型にキャストできた。

# 軽く触ってみて

PyCallがあることが、juliaのウリ文句の一つのようだ。
julia自身のライブラリ数はビルトインのものではさほど多くないので、
Pythonのライブラリ資産が利用できるのは良いと思った＾ー＾
Visual Studio を常に管理者権限で動かす

Windows 8で、Visual Studioを常に管理者権限で動かしたい。

タスクバーに登録したショートカットのプロパティを弄って管理者権限で動かすようにすることはできるが、これだと最近使ったものリストを選択した場合に管理者権限にならない。

レジストリを編集すると、単にソリューションファイルを開いただけでもちゃんとVisual Studioを管理者権限として動かすことができるようになる。

場所: HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

内容: 文字列値を作成し、常に管理者権限で動かしたい実行ファイルのパスを名前とする、値には RUNASADMIN を設定する。

Visual Studio 2013の場合は次の2つを登録しておくと良い
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe"
"C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\VSLauncher.exe"

http://www.cievo.sk/2011/11/02/how-to-set-run-this-program-as-administrator-via-registry/
http://punio.seesaa.net/article/343279221.html
MacBookProのUSB認識不良


##朝、突然の認識不良が派生しました

###NVRAM／PRAM をリセットする
1.Mac をシステム終了します。
2.キーボードで「command (⌘)」「option」「P」「R」の各キーの場所を確認します。手順 4 で3.この 4 つのキーをすべて同時に押す必要があります。
4.コンピュータの電源を入れます。
5.「command + option + P + R」キーを同時に押し続けて、グレイの画面を表示します。
   コンピュータが再起動し、2 度目の起動音が聞こえるまで、キーを押したままにします。
   キーを放します。

[NVRAM／PRAM をリセットする](http://support.apple.com/kb/HT1379?viewlocale=ja_JP&locale=ja_JP)
認証付きプロキシ環境でssh接続したい場合、Squid + corkscrewの組み合わせで乗り越えてみる

認証付きプロキシの環境で、プロキシ内からssh接続で外部に接続する場合にはいろいろ苦労が出てくると思います。

今回は、Squidを使って認証付きプロキシを越えるよう設定した後、corkscrewを使ってSquid経由でssh接続できるよう設定します。

## Squidのインストール
はじめに[Squid](http://www.squid-cache.org/)をインストールし、認証付きのプロキシを越えるよう設定してください。
homebrewなら以下のコマンドでインストールできます。

```
brew install squid
```
/usr/local/etc/squid.confを適当に編集して、プロキシを越えられるよう設定しましょう。

GUIの方が良い方は[SquidMan](http://squidman.net/squidman/)でもOKです。

## Corkscrewのインストール
[Corkscrew](http://www.agroman.net/corkscrew/)を使って、ssh通信を行う場合でもsquid経由で通信するよう設定します。

まず、Corkscrewをインストールしてください。
homebrewなら以下のコマンドでインストールできます。

```
brew install corkscrew
```

例として、githubに接続する場合は~/.ssh/configに以下の通り記載してください。

```~/.ssh/config
ProxyCommand /usr/local/bin/corkscrew 127.0.0.1 8080 %h %p

Host github.com
  User git
  Port 443
  Hostname ssh.github.com
  Protocol 2
  IdentityFile ~/.ssh/id_rsa
```

設定に問題なければ、下のコマンドでテスト接続できるはず！

```
ssh -T git@github.com
```

## 参考
[CorkscrewのReadMe](http://www.agroman.net/corkscrew/README)
tomcatのホットデプロイを無効にする

javaのソースなどを変更した場合、tomcatがそれを検知して自動的に再ロードしてくれますが、余計だよ！と思うときがあるので無効化させたい。

# 手順
作成したtomcatサーバをダブルクリックして設定画面を開く。
`サーバー・オプション`内の`デフォルトでモジュールを再ロード`のチェックを外す。

以上。
WEB+DB PRESS vol.80 「実践テスト駆動インフラ＆CI」 windows差し替え版

# 前提
特集記事目当てで購入したのに Mac前提だったので、怒りの Windows 版手順作成

* といっても、準備さえ済ませたらほぼ手順通りでできます
* まだ 第2章 しかやってません
* 記事のバージョンと多少違います

# インストール
Windows 上で bash を使えるように、msysgit を導入します。(git-bash が使えます)
別に bash 必須ではないかもしれないですが、元々 git 使用のために導入済みだったのでお手軽に試してみました。
本特集記事の第2章の終わり～第3章で git 使用し始めるので、ちょうど良いですね。

ちなみに本特集記事のバージョンとは割りと違っています (だいたい最新版)

## 環境
* Windows 7 SP1 x64

## ツール
### 事前導入
* msysgit 1.9.0 (おそらく最新ではない)

### 記事の手順差し替え
* Ruby 2.0.0p481
    * rubyinstaller-2.0.0-p481-x64.exe
    * http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.0.0-p481-x64.exe?direct
* VirtualBox 4.3.10
    * [VMware Player 使用者のための VirtualBox 導入](http://qiita.com/heignamerican/items/27fd8e636e175749234d) で導入したやつ(ステマ)
* vagrant 1.6.2
    * vagrant_1.6.2.msi
    * http://www.vagrantup.com/downloads.html
    * .NET 4.5 必要なので、インストール手順中で自動追加してくれます
    * __再起動必要__

### 記事の手順どおり
* serverspec-1.7.0
* CentOS 6.4
* Puppet 3.6.1-1

# 手順
1. git インストール
1. git-bash 起動
    * 「コマンドを実行」などの手順は全てこの bash 上での実行です
1. 本特集記事の第2章 手順通りに勧めて行き、『○○をインストール』の手順を前述のもの置き換えていきます。
1. 第2章まで無事終わります

なんとこれだけ。
びっくりするほど問題なく終わりました。

## 補足
### git
git 導入は結構昔なので、手順はここでは省略しておきます
git-bash は git 無関係な箇所で便利に使えるのでオススメです。

```bat:sh.bat
@PATH=%PATH%;C:\Program Files (x86)\Git\bin
@"C:\Program Files (x86)\Git\bin\sh.exe" --login -i
```

こんな感じで git-bash 起動バッチファイルがあると便利かも。
私の場合は、powershell 起動 → cd 管理用ディレクトリ → sh.bat とやります。

### それ以外
だいたい標準の手順でインストールすれば問題ないと思われます。

# 今後
* 第3章以降… は、やらないかも？
* vol.79 の Docker 入門記事も、Windows で試す？
* そもそも Windows 上での vagrant なんかのベストプラクティス調査？
procmailで迷惑メール対策 (全員)

## 以下も詳しい

* https://www.bigbang.mydns.jp/procmail-x.htm

## やりたいこと

[procmailで迷惑メール対策 (一ユーザとして)](http://qiita.com/tukiyo3/items/b90e6fb671401e53495e)では一ユーザだけ可能。
全員に対して行うには以下

準備
============

```bash:作業場所を準備
# mkdir -p /var/procmail/spam/new/
# mkdir -p /var/procmail/spam/cur/
# mkdir -p /var/procmail/spam/tmp/
# touch /var/procmail/procmail.log
```

```bash:procmailインストール
# apt-get install -y procmail
```

```diff:/etc/postfix/main.cf
+home_mailbox = Maildir/
+mailbox_command = /usr/bin/procmail
```

* Maildir形式を使っていること。(使っていない場合/etc/procmailrcでMAILDIRとDEFAULTの指定を削除)

レシピ
=======

UTF8で書く

```bash:/etc/procmailrc
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
LOGFILE=/var/procmail/procmail.log
SPAMDIR=/var/procmail/spam/new/.
PATH=$PATH:/bin:/usr/bin

:0
* ^From (mike.*|advertise.*|mensshop.*)@gmail.com
$SPAMDIR

:0
* ^From (.*-mag0.*|mastainfo.*|magmagnew-ade)@yahoo.co.jp
$SPAMDIR

# 本文か件名マッチ
:0
*^From .*@(docomo.ne.jp|ezweb.ne.jp|softbank.ne.jp|i.softbank.jp)
* ? nkf -Zmw | egrep "業界話題沸騰|検索PASS:|検索用ID:"
$SPAMDIR
```

ログ確認
=======

* /var/log/maillog
* /var/procmail/procmail.log
本当は使いたいけど使わないBashのTIPS

# 本当は使いたいんだけどねー

仕事だとベンダーのUNIXサーバーが多いのでbashがなかったりします。
HP-UXとかマジに死んで欲しい。Solaris11は大好きです。

##環境

* CentOS 6.5
* bash version 4.1.2

##LINENO変数とFUNCNAME変数
本当にbashが羨ましい。HP-UXやAIXも何故bashを標準で搭載してくれないのだろう。

```bash
#!/bin/bash
func1() {
  echo ${FUNCNAME}:${LINENO}
}
sub1() {
  echo ${FUNCNAME}:${LINENO}
}
func1
sub1
```
```bash
$ ./foo.sh
func1:3
sub1:6
```

##PIPESTATUS変数
パイプでコマンドを連結したとき、コマンドステータスは最後のコマンドしか取得することができません。
bashだとPIPESTATUS変数があるよね。

```bash
ret3() { return 3; }
ret4() { return 4; }
true | false | ret3 | ret4
echo ${PIPESTATUS[@]}
0 1 3 4
```

##算術式評価
i++ や i+=10 とかできる。

```bash
i=0
echo $i
0
: $((i++))
echo $i
1
echo $((++i))
2
echo $((i+=10))
12
```

なんてことでしょう。C言語っぽい書き方も可能です。でもこれは使わないからいいや。

```bash
for (( i=0 ; i<5 ; i++ )) ; do
  echo $i
done
```
```bash
$ ./foo.sh
0
1
2
3
4
```

##複合コマンド [[
これが超便利。
このような変数に値がない状態だとダサい結果になる。
shだと一度チェックして対応することが多いです。あーいやだ。

```bash
x=
y=hoge
[ $x = $y ] || echo "fail"
-bash: [: =: unary operator expected
fail

# こんなチェックはダサいよね。
[ "x${x}" = "x" ] && (echo "x is empty"; exit 1) 
[ "x${x}" = "x" ] && x=default
```

[[ を使うと少しだけ幸せになれます。

```bash
x=
y=hoge
[[ $x = $y ]] || echo "fail"
fail
```

もちろん、ダブルクォートで括ってあげたり、パラメータ展開を使う方法もあります。

```bash
x=
y=hoge
[ "$x" = "$y" ] || echo "fail"
fail

[ ${x:=default} = $y ] || echo "fail"
fail
```



##正規表現
=~ オペレーターを使うと正規表現が使えます。 [ expression ] はだめ。 [[ expression ]] にしてください。

```bash
[[ $url =~ htp:// ]]
echo $?
1
[[ $url =~ http:// ]]
echo $?
0
```

正規表現を使うと BASH_REMATCH という配列変数 にマッチした部分文字列が格納されます。
何だこれは？便利じゃないか。

```bash:hoge.sh
regexp="(http:/+)(w{3}.*com)"
url=http://www.google.com
[[ $url =~ $regexp ]]
echo ${BASH_REMATCH[0]}
echo ${BASH_REMATCH[1]}
echo ${BASH_REMATCH[2]}
```
```bash
./hoge.sh
http://www.google.com
http://
www.google.com
```


## 参考URL
ここ見れば全て書いてある。
http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html
cabal install が Permission DeniedでこけるときのWorkaround

# 症状

cabal install で、 dist/ ディレクトリを含むパッケージをインストール仕様とするとコケる。

(Issueがある https://github.com/haskell/cabal/issues/1698)

# 原因

cabal sdistコマンドを既にdistディレクトリがある状態で実行すると、それをtarballに含めてしまう。この状態で build を行うとうまく行かない場合があるので、現在のcabal installでは、

* dist/ を dist-tmp/ にリネーム
* dist/ を新しく作る
* dist-tmp を $distpref (パラメータ) にリネーム

という手順を踏んでから、buildを行っているようである。

しかし、 $distpref はデフォルトでは "dist" になっているため、結局同じ名前にリネームしているどころか、Windowsのディレクトリ操作APIではこれがPermission Deniedで失敗する。それゆえ、distディレクトリを含むパッケージのインストールが主にWindowsで上手くいかない。
（この操作にどういう意味があるのか僕にはよく分からなかったので、理解できた方教えてくださると助かります。）

# 対処方法

根本的な対策はソースコード中にTODOと書いてあることや、Issueがでていることから、近い将来には行われると思うが、ひとまずは、

$ cabal install happy --distpref=wdist

などと、 --distpref に "dist" 以外の（多分なんでも良い）名前を指定してやればうまくいく。
@mopemope 氏の「CoreOS でシステムメトリクスを収集し、グラフ化する」を Vagrant で

@mopemope 氏の [docker - CoreOS でシステムメトリクスを収集し、グラフ化する - Qiita](http://qiita.com/mopemope/items/34c07ae37592ae6407cf) を Vagrant を使ってローカルで簡単にお試し出来る環境を作ってみようと思い立つ。

```bash
$ git clone git@github.com:YungSang/coreos-cluster.git -b graphite-diamond
$ cd coreos-cluster
$ vagrant up
```

ベースは https://github.com/YungSang/coreos-cluster なので、後は Graphite と Diamond のサービスを追加するだけ。

Etcd の discovery 用の VM に Graphite を、それ以外の各 VM に Diamond を追加しました。

```yaml:discovery(vagrantfile-user-data)
    - name: graphite.service
      command: start
      runtime: no
      content: |
        [Unit]
        Description=Graphite Service
        After=docker.service
        Requires=docker.service

        [Service]
        ExecStartPre=/usr/bin/docker pull mopemope/graphite-docker
        ExecStart=/usr/bin/docker run -d --name %n -p 8081:81 -p 8080:80 -p 20030:2003 -p 2004 -p 7002 -p 8125:8125/udp -p 8126:8126 mopemope/graphite-docker
        #ExecStop=/usr/bin/docker stop -t 3 %n
        #ExecStopPost=/usr/bin/docker rm %n
        Restart=on-failure
        RestartSec=5s
```

なぜかサービスは上手く起動しているのに systemd 側では dead になるので ExecStop はコメントアウトすることに。

```yaml:user-data(vagrantfile-user-data)
    - name: diamond.service
      command: start
      runtime: no
      content: |
        [Unit]
        Description=Diamond Service
        After=docker.service
        Requires=docker.service

        [Service]
        User=core
        ExecStartPre=/usr/bin/curl -L https://gist.github.com/mopemope/79476588ed3650bc08d4/raw/nspawn-container -o /home/core/nspawn-container
        ExecStartPre=/usr/bin/chmod +x /home/core/nspawn-container
        ExecStartPre=/usr/bin/docker pull mopemope/diamond-docker
        ExecStart=/bin/sh -c '/home/core/nspawn-container mopemope/diamond-docker /diamond/run_diamond %ETCD_DISCVERY% 20030'
        Restart=on-failure
        RestartSec=5s
```

Discovery での Graphite イメージのダウンロードと起動を待ちます。

これで VM の監視体制が整いました。

Graphite: http://localhost:8080
Grafana: http://localhost:8081

後は、Fleet を使ってクラスタにサービスをばらまくと、Docker を使ったアプリケーション(コンテナ)も Graphite 側に表示されるようになるはず。
Phalcon で xhprof を使う

# インストール

phalcon は入れてる前提．

また，自分は VirtualHost で /var/www 以下などにドメイン名でアプリを入れて ワイルドカードで直接そこを参照するようにする設定を行っているのでその前提でやる．

例えば下記のような設定とか．

```apache
<VirtualHost *:80>
    ServerName exmple.com
    ServerAlias *.example.com
    Options -Indexes +FollowSymLinks
    VirtualDocumentRoot "/var/www/%0/web"
</VirtualHost>
```

## xhprof を入れる

apache 経由で参照できる場所に設置．ここでは前述のとおり /var/www 以下に置く．  phpize がどうやって入るかはまかせた．

```

$ git clone https://github.com/facebook/xhprof xhprof.example.com
$ cd xhprof
$ phpize
$ make
$ sudo make install      # 環境による
$ ln -s xhprof_html web  # VirtualDocumentRoot が web 以下だから
```

# phalcon プロジェクトに適用する

例えば phalcon/devtool で modules で作った場合の public/prof.php に下記のように書く．ココらへんは上で設置した xhprof の doc のページに書いてあるものを取ってきて貼り付けて動くようにしたもの．

```php
<?php

use Phalcon\Mvc\Application;

error_reporting(E_ALL);

try {

    $PROF_URL = 'http://xhprof.example.com/';
    $XHPROF_ROOT = '/var/www/xhprof.example.com/';

    xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

    /**
     * Include services
     */
    require __DIR__ . '/../config/services.php';

    /**
     * Handle the request
     */
    $application = new Application();

    /**
     * Assign the DI
     */
    $application->setDI($di);

    /**
     * Include modules
     */
    require __DIR__ . '/../config/modules.php';

    echo $application->handle()->getContent();

    // xhprof
    $xhprof_data = xhprof_disable();

    include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
    include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

    $xhprof_runs = new XHProfRuns_Default();

    $entryId = mt_rand();

    $run_id = $xhprof_runs->save_run($xhprof_data, $entryId);
    echo '<pre>'.htmlspecialchars("---------------\n".
            "Assuming you have set up the http based UI for \n".
            "XHProf at some address, you can view run at \n".
            $PROF_URL."index.php?run=$run_id&source=$entryId\n".
            "---------------\n").'</pre>';
} catch (Phalcon\Exception $e) {
    echo $e->getMessage();
} catch (PDOException $e) {
    echo $e->getMessage();
}
```

# 動作確認

上記のようにするとアクセスした時に最後に下記の様に表示される．


```
---------------
Assuming you have set up the http based UI for 
XHProf at some address, you can view run at 
http://xhprof.example.com/index.php?run=53837aa5adf00&source=1372228594
---------------
```

その URL にアクセスしに行くと下記の票に 時間やメモリ消費量などが表示される． 4ms 早いですね．

![screenshot 2014-05-27 2.33.31.png](https://qiita-image-store.s3.amazonaws.com/0/6975/c3972677-36cc-69d9-7fa1-1d1068b8b31d.png)


graphvis を入れてると下記のようにコールグラフも見られる．赤くなってるのは全体に対する割合が大きいからだけどそもそも実行時間とかが小さいのであんまり意味ない．

![screenshot 2014-05-27 2.35.24.png](https://qiita-image-store.s3.amazonaws.com/0/6975/7723eccc-40d9-9a09-f438-9b012a7530f3.png)


これでさらにパフォーマンス・チューニングがはかどりますね．
shell script でキャピタライズ


英単語の先頭を大文字に置換する処理をキャピタライズといいますが、このキャピタライズ処理を unix 標準のコマンドで実装しようという話です。


置換と言えばまず思い浮かぶのが *sed* (1) なのですが、GNU 拡張された *sed* (1) の場合は簡単に置換が可能なのですが、私の愛してやまない FreeBSD の標準の *sed* (1) では簡単にいきません。

## GNU sed の場合 ##

```
$ echo "foo" | sed 's/\(.\)\(.*\)/\U\1\L\2/g'
Foo
```                

GNU 拡張された *sed* (1) には大文字変換する **\U** と、小文字変換する **\L** という演算子があるので大文字、小文字変換が簡単に可能です。 

## FreeBSD 標準の sed の場合 ##

```
$ echo "foo" | sed 's/\(.\)\(.*\)/\U\1\L\2/g'
UfLoo
```

FreeBSD 標準の *sed* (1) だと正しく変換されません。

## awk を利用した場合 ##

*sed* (1) ではなく *awk* (1) を利用すれば FreeBSD でも、勿論 Linux でも OS X でもキャピタライズ処理は簡単にできます。

```
$ echo "foo" | awk '{ print toupper(substr($0, 1, 1)) substr($0, 2, length($0) - 1) }'
Foo
```             

*awk* (1) には大文字変換関数が実装されているので、切り出した1文字目を大文字変換すれば簡単に実現できます。 
GNU 版の *sed* (1) よりも長くなってしまいますが posix に準拠した機能のみでキャピタライズが可能です。

ここまではワンライナーでそれなりに綺麗に実現可能ですね。

## FreeBSD で sed を利用した場合 ##
どうしても FreeBSD の *sed* (1) を利用したい場合、 *tr* (1) や *exec* (1) も併用する事にはなりますが以下の処理で可能です。

```
$ eval `echo "foo" | sed 's/\(.\)\(.*\)/\/bin\/echo -n \1 | tr "[a-z]" "[A-Z]"; echo \2/g'`
Foo
```             

*sed* (1) で *tr* (1) を利用した置換スクリプトを出力して *eval* (1) で実行した結果を表示するという、もはやネタとしか思えない様なスクリプトです(というか本当にネタです)。
しかも *echo -n* を利用するために */bin/echo* を仮定しています。

**良い子は真似しないで下さいね!** (笑
[Android] DBファイルを削除する



# 概要

[Context#deleteDatabase()](http://developer.android.com/reference/android/content/Context.html#deleteDatabase(java.lang.String) "Context#deleteDatabase()")を実行すると、`/data/data/packageName/`配下にあるアプリ自身が持つDBファイルを削除できる。

# サンプルコード


```java:MainAcitivity.java

public class MainActivity extends Activity {

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

        // 引数の「xxx.db」部分はDBファイル名を指定
        deleteDatabase("xxxx.db");

    }


```
Eclipse 4.3 導入まで 日本語化 [Mac]

#Eclipse 4.3 導入まで
##[1]
下記のURLからEclipse Kepler (4.3.x)  を、
http://www.eclipse.org/downloads/
自分のMacにあったbitを選択し、矢印のアイコンをクリックしてダウンロード。
ダウンロードしたファイルを解凍し、アプリケーションにフォルダをコピーする。
##[2]
下記のURLのPleiades All in One ダウンロードの、Eclipse 4.3 Kepler Pleiades All in One をクリック。
http://mergedoc.sourceforge.jp
今回はJavaのみの使用を考えているので、自分のMacにあったbitを選択し、
JavaのFull Editionをダウンロード。
このファイルを解凍して、ファイル内の、dropinsの中身をコピーして、
アプリケーションに移動した、eclipseの中のdropinsにペーストする。(この際、上書きで構わない)
##[3]
[2]で移動したURLから「Pleiades プラグイン・ダウンロード」の最新版をクリックし、ダウンロードする。
このファイルを解凍して、ファイル内の、plugin,featuresのフォルダの中身をコピーして、
アプリケーションに移動した、eclipseのplugin,featuresにペーストする。
##[4]
アプリケーションのeclipseフォルダからeclipse.appを右クリックして「パッケージの中身を表示する」を選択。
contens>macosと移動して、eclipse.iniをテキストエディタで開く。

```
-javaagent:/Applications/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
-Dfile.encoding=utf-8
 ```

を追加で書き込み保存する。
##[5]
その後ターミナルで

```
/Applications/eclipse/eclipse -clean
 ```

と入力すると、eclipseが起動します。(このときシステム環境設定のセキュリティとプライバシーの、一般からダウンロードしたアプリケーションの実行許可を全てのアプリケーションを許可にしなければ起動しない場合があるので注意)

起動が確認できれば、今後アイコンから起動して大丈夫です。
homebrew で zlib not found と言われたので xcode-select --install で command line developer tools をインストールしようとしたけどできなかったときの対応

## 対応

XCode のメニューバーから。
Mac OSX Mavericks ではこうやるぽい。

**Xcode** - **Open Developer Tool** - **More Developer Tools**

![ 2014-05-27 00.47.31.png](https://qiita-image-store.s3.amazonaws.com/0/3189/5e64f823-0e9a-982f-bc63-64030c24fa51.png)

developer.apple.com が開くので、 **Command Line Tools for OS X Mavericks - April 2014** をダウンロードしてインストールした。

![ 2014-05-27 01.17.25.png](https://qiita-image-store.s3.amazonaws.com/0/3189/fd206b8f-4082-eade-b178-626a0709f738.png)


## 詳細

### 1. zlib がなくて httpd インストールできなかった

```console
$ brew install httpd
     :
  zlib not found
```

そういえば **Command Line Developer Tools** をまだ入れてなかったことに気づく。
でも `$ brew doctor` では問題ないと言われているので、今までとなんか違う。

```console
$ brew doctor
Your system is ready to brew.
```

以前はインストールされてないと、 **Command Line Developer Tools がないよ** みたいなこと言われた記憶がうっすらある。

### 2. `xcode-select --install` を試す

ググると最新の Command Line Developer Tools のインストール方法はこうやるぽいので試す。

```console
$ xcode-select --install
```

「 **ネットワークに問題があるため、インストールできない** 」 みたいなことを言われる。

### 3. Command Line Developer Tools を直接ダウンロードしてインストール

"対応" の通り。

### 4. httpd のビルドが通るようになった

ビルドは通って無事 httpd はインストールできたものの、 Xcode 側のほうの挙動が違うので、これでいいのかどうかよくわからない。

#### Xcode の Downloads には Command Line Developer Tools が表示されないまま

![ 2014-05-27 01.23.19.png](https://qiita-image-store.s3.amazonaws.com/0/3189/ad646165-ca9f-16a6-b0e6-ad3d57f52902.png)

#### `xcode-select --install` も利用できないまま

**ネットワークに問題があるため** みたいなエラーメッセージは出なくなったものの、利用できないというメッセージが代わりに出るようになっていた。

```console
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

![ 2014-05-27 01.25.12.png](https://qiita-image-store.s3.amazonaws.com/0/3189/4ab3c003-b97a-271f-16ab-3de2c956f293.png)

## なんかわかったら教えて下さい

これでいいのかどうかよくわからないので、なんかわかったら教えて下さい。
「プログラムでシダを描画する」をPythonで描画する

「プログラムでシダを描画する」シリーズに便乗して、Pythonでも書いてみました。

* [プログラムでシダを描画する - 強火で進め](http://d.hatena.ne.jp/nakamura001/20140505/1399316565)
* [「プログラムでシダを描画する」をDartで描画する - Qiita](http://qiita.com/zukkun/items/08b72c9934d3c0c09936)
* [「プログラムでシダを描画する」をGoで描画する - Qiita](http://qiita.com/qt-luigi/items/ec6cd349259fe6cc29eb)
* [Clojure - プログラムでシダを描画する - Qiita](http://qiita.com/woxtu/items/30aebcf15770c438d6fd)

## 出力結果
![Screenshot_from_2014-05-27 00:35:50.png](https://qiita-image-store.s3.amazonaws.com/0/31521/69027bd2-2318-ba59-b027-ba8226ba3279.png)

## ソースコード

### 再帰呼び出し版

* オリジナルと類似の再帰呼び出し版です。
* 関数定義には `lambda` を使ってスッキリ書いてみました。
* 画像ライブラリ PIL(Python Imaging Library) または Pillow が必要です。

```py
import random

N = 20
xm = 0
ym = 0.5
h = 0.6

width = 500
height = 500

W1x = lambda x, y: 0.836 * x + 0.044 * y
W1y = lambda x, y: -0.044 * x + 0.836 * y + 0.169
W2x = lambda x, y: -0.141 * x + 0.302 * y
W2y = lambda x, y: 0.302 * x + 0.141 * y + 0.127
W3x = lambda x, y: 0.141 * x - 0.302 * y
W3y = lambda x, y: 0.302 * x + 0.141 * y + 0.169
W4x = lambda x, y: 0
W4y = lambda x, y: 0.175337 * y

def f(im, k, x, y):
    if 0 < k:
        f(im, k - 1, W1x(x, y), W1y(x, y))
        if random.random() < 0.3:
            f(im, k - 1, W2x(x, y), W2y(x, y))
        if random.random() < 0.3:
            f(im, k - 1, W3x(x, y), W3y(x, y))
        if random.random() < 0.3:
            f(im, k - 1, W4x(x, y), W4y(x, y))
    else:
        s = 490
        im.putpixel((int(x * s + width * 0.5), int(height - y * s)), (0, 128, 0))

if __name__ == '__main__':
    from PIL import Image
    im = Image.new("RGB", (width, height), (255, 255, 255))
    f(im, N, 0, 0)
    im.show()
```

これでは、関数 `f()` で画像関連の引数を渡したり、関数内部に描画ロジックを書く必要があったりして、ちょっと美しくないので、もう少し Pythonic にしてみました。

### 再帰呼び出し＋ジェネレータ版

* ジェネレータを使って、再帰呼び出しの結果を `yield` で返してやるようにしました。
* 描画ロジックは、関数 `f()` の外へ追い出すことができました。

```py
import random

N = 20
xm = 0
ym = 0.5
h = 0.6

width = 500
height = 500

W1x = lambda x, y: 0.836 * x + 0.044 * y
W1y = lambda x, y: -0.044 * x + 0.836 * y + 0.169
W2x = lambda x, y: -0.141 * x + 0.302 * y
W2y = lambda x, y: 0.302 * x + 0.141 * y + 0.127
W3x = lambda x, y: 0.141 * x - 0.302 * y
W3y = lambda x, y: 0.302 * x + 0.141 * y + 0.169
W4x = lambda x, y: 0
W4y = lambda x, y: 0.175337 * y

def f(k, x, y):
    if 0 < k:
        for p in f(k - 1, W1x(x, y), W1y(x, y)):
            yield p
        if random.random() < 0.3:
            for p in f(k - 1, W2x(x, y), W2y(x, y)):
                yield p
        if random.random() < 0.3:
            for p in f(k - 1, W3x(x, y), W3y(x, y)):
                yield p
        if random.random() < 0.3:
            for p in f(k - 1, W4x(x, y), W4y(x, y)):
                yield p
    else:
        s = 490
        yield x * s + width * 0.5, height - y * s

if __name__ == '__main__':
    from PIL import Image
    im = Image.new("RGB", (width, height), (255, 255, 255))
    for p in f(N, 0, 0):
        im.putpixel((int(p[0]), int(p[1])), (0, 128, 0))
    im.show()
```

## まとめ

* 再帰呼び出し＋ジェネレータの合わせ技
* 描画ロジックと座標計算ロジックを分離
* `yield` でさらりと書けるジェネレータはお気に入りです。
[ObjC] AppDelegate 通知分岐処理テンプレート

リモート/ローカル通知での、AppDelegate分岐処理テンプレート。

通知は6パターン、分岐は5パターン。

※PushNotificationに対応した証明書のプロビジョニングを利用している前提。



```objc

#import "AppDelegate.h"

@implementation AppDelegate

/**
*
* [AppDelegate Notification Template]
*
* 通知を受け取った時の振る舞い
*
* ▼リモート通知うけとった
* 
*  [0-0] アプリがフォアグラウンドで動いている状態だった
*
*  [0-1] アプリがバックグラウンドにいる状態で通知を受け取り、通知領域をタップしてフォアグラウンドになった
*
*  [0-2] アプリは停止している状態で、通知領域がタップされ起動した
*
* ▼ローカル通知うけとった
*
*  [1-0] アプリがフォアグラウンドで動いている状態だった
*
*  [1-1] アプリがバックグラウンドにいる状態で通知を受け取り、通知領域をタップしてフォアグラウンドになった
*
*  [1-2] アプリは停止している状態で、通知領域がタップされ起動した
*/

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[UIApplication sharedApplication]
        registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert 
        | UIRemoteNotificationTypeBadge 
        | UIRemoteNotificationTypeSound)];

    if (launchOptions != nil) {
        NSDictionary *userInfo = [launchOptions objectForKey:
                UIApplicationLaunchOptionsRemoteNotificationKey];
        if (userInfo) {

            // アプリ起動していない状態で、
            //リモート or ローカルプッシュ通知エリアがタップされアプリが起動した

            NSLog(@"[0-2] or [1-2]");
        }
    }
    return YES;
}

/**
* リモート通知受け取った
*/
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if (application.applicationState == UIApplicationStateActive) {
        
        //アプリがフォアグラウンドで動いている状態だった
        NSLog(@"[0-0]");

    }
    else if (application.applicationState == UIApplicationStateInactive) {
        
        //バックグラウンドにいる状態で、通知を受け取り、
        //通知領域をタップしてフォアグラウンドになった
        NSLog(@"[0-1]");
    
     }
}

/**
* ローカル通知受け取った
*/
-(void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    if(application.applicationState == UIApplicationStateActive) {

        //アプリがフォアグラウンドで動いている状態だった
        NSLog(@"[1-0]");

    }
    else if (application.applicationState == UIApplicationStateInactive) {

        //バックグラウンドにいる状態で、通知を受け取り、
        //通知領域をタップしてフォアグラウンドになった
        NSLog(@"[1-1]");

    }
}
/**
* トークン取得成功
*/
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    // カッコとスペースを削除
    NSString *tokenString = [[[deviceToken description] 
             stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] 
        stringByReplacingOccurrencesOfString:@" " withString:@""
    ];

    NSLog(@"deviceToken = %@",tokenString);
}

/**
* トークン登録エラー
*/
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog(error.localizedDescription);
}

@end


```


何か間違いなどありましたら気軽にコメントいただけると嬉しいです。
MacにサーバーのGUIアプリを表示する


Mac初期化するとxserverに繋がらない!なんてことになったので記録.

* OSX 10.9.3

## xquartz導入

最近のOSXにはX11がデフォルトで入っていないそうです.
homebrew-caskで

```
brew update
brew cask install xquartz
```


##DISPLAY環境変数を設定

xquartzをインストールすればxtermからsshでxserverに接続出来ました.

~~でもterminalやitermからだと上手くいかない...~~
~~xtermの`env`とterminalの`env`を比べてみると, 環境変数`DISPLAY`が足りないようだったので~~

```zshrc
export DISPLAY=:0.0
```

としました.

**（追記）XQuartzをインストールして再起動したところ, itermで`DISPLAY`環境変数が正しく設定されていました.**
**環境変数は不要のようです. **


## 接続

```
open /Applications/Utilities/XQuartz.app
# ~/.Xauthorityを作成してくれます
ssh -Y ユーザ名@ホスト
```

`xeyes`が表示されればOK

ついでにマウスクリックが使えるように
`X11 > X11 Preferences > Windows > Click-through Inactive Windows`
をenableとしました.