OmniAICreator/Qiita-1.07M huggingface dataset:
64bit環境でCoreText+CoreGraphicsの描画結果がおかしい


## 経緯

以前`CoreText`を使って文字の縁のパスを取得し、それをゴニョゴニョして描画するアプリを作ったのですが、最近arm64対応を行ったところ、表示するサイズによって描画結果がちょっとおかしなことになりました。問題の症状と再現コードを残しておきます。

* Xcode6.4 + iOS8 + iPad Air(Simurator)

## 再現コード

`MyView`でパスを描画しています。
スライダーによってスケール値を変えられるようになっています。

```swift:ViewController.swift
import UIKit

class MyView: UIView {
    
    var scale: CGFloat = 1
    
    override func drawRect(rect: CGRect) {
        let font = CTFontCreateWithName("HiraKakuProN-W6", 40, nil)
        let text = "あ";
        var glyph: CGGlyph = 0
        var unichar: UniChar = text.utf16[text.utf16.startIndex]
        CTFontGetGlyphsForCharacters(font, &unichar, &glyph, 1)
        var flip = CGAffineTransformMakeTranslation(10, 50)
        flip = CGAffineTransformScale(flip, 1, -1)
        let path = CTFontCreatePathForGlyph(font, glyph, &flip)
        let c = UIGraphicsGetCurrentContext()
        
        UIColor.blueColor().set()
        CGContextScaleCTM(c, scale, scale)
        CGContextAddPath(c, path)
        //CGContextSetLineWidth(c, 4)
        CGContextSetLineCap(c, kCGLineCapRound)
        CGContextSetLineJoin(c, kCGLineJoinRound)
        CGContextSetLineDash(c, 0, nil, 0)
        CGContextStrokePath(c)
    }
}

class ViewController: UIViewController {

    private var myView: MyView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.whiteColor()
        
        let slider = UISlider(frame: CGRectMake(10, 30, 400, 0))
        slider.sizeToFit()
        slider.minimumValue = 1
        slider.maximumValue = 10
        slider.addTarget(self, action: "didChangeScale:", forControlEvents: .ValueChanged)
        view.addSubview(slider)
        
        myView = MyView(frame: CGRectMake(10, 80, 700, 700))
        myView.backgroundColor = UIColor.yellowColor()
        view.addSubview(myView)
    }

    func didChangeScale(slider: UISlider) {
        myView.scale = CGFloat(slider.value)
        println(myView.scale)
        myView.setNeedsDisplay()
    }
}
```

## 実行結果

こんな感じでスケール値によっては文字の一部が欠けるような感じになることがあります。

![aa.png](https://qiita-image-store.s3.amazonaws.com/0/31347/cf3e45d8-56fc-a7bf-4f08-91ad8474c700.png "aa.png")

## 所感

今のところ64bit環境でのみ再現していることから、`CGFloat`が`double`相当になったときにだけ何か計算結果がおかしな事になり、こうした症状が起きているのかな？と予想していますが、詳しい事は分かりません。

とりあえず駄目元でバグレポート出してみます。
また何か判れば追記します。
Yahooショッピング 商品登録API で「あすつく」が指定できません。

Yahooショッピング 商品登録APIを使い、商品登録をしています。
現在 確認しているのは「テスト環境」です。言語はPHPです。

値は以下のような形で送っているのですが
<pre>
    [seller_id] => ショップID
    [item_code] => xxxxxxxxxx
    [path] => パソコン
    [name] => ○○○
    [product_category] => 14054
    [price] => 0000000000000000000
    [headline] => □□□□□□□□□□□□□□□
    [explanation] => □□□□□□□□□□□□□□□
    [additional1] => □□□□□□□□□□□□□□□
    [sp_additional] => □□□□□□□□□□□□□□□
    [brand_code] => 12
    [ship_weight] => 1000
    [display] => 1
    [product_code] => xxxxxxxxxx
    [delivery] => 0
</pre>
ここまでだと、問題なく商品登録されます。
これに[astk_code] に「1」(あすつく)を加えてAPIを実行すると
<pre>
<?xml version="1.0" encoding="UTF-8" ?>
<Error>
  <Message><![CDATA[システムエラーが発生しました。]]></Message>
  <Detail></Detail>
  <Code>ed-00001</Code>
</Error>
</pre>
と返ってきます。

astk_code = 0 だと「OK」で返ってきます。
astk_code = 1 や astk_code = 2 だと 上記のように「システムエラー」になります。
astk_code = 1 や astk_code = '1' なども試しましたが結果は変わりません。

ストアエディターProで 「あすつく」を変更すると問題ありませんでした。

何が問題なのでしょうか?
テスト環境だからでしょうか? 本番環境にすると問題ないのでしょうか?
ご教授よろしくお願いいたします。
Rubyデザインパターン 1日目 : Template Method

Rubyデザインパターン学習のために、自分なりに読書の結果をまとめていくことに決めました。第1日目はTemplateMethodです。(http://www.amazon.co.jp/gp/product/4894712857/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4894712857&linkCode=as2&tag=morizyun00-22)

![スクリーンショット 2015-07-27 11.25.28.png](https://qiita-image-store.s3.amazonaws.com/0/80075/d68a4010-c177-4ef5-2f2e-899a76c76cb6.png)


# 1日目 Template Method
Template Methodとは最も基本的なデザインパターンと言われており、Template Methodを構築するというよりは、便利なコードにリファクタリングしていくと、自然とTemplate Method型になっていくことがよくあるそうです。

Template Methodの目的は、変わる物と変わらない物を分離し、その変わらない部分を抽象化したスーパークラスを作成してテンプレートとします。サブクラスではそれを継承することにより、コードの重複を無くし、メンテナンス性も高めることが出来ます。

大事なのは、デザインパターンを適用するためにコードを書くのではなく、必要になったときに少しずつ実装していくのがいいとのことです。そうでなければ、特定のデザインパターンを適用する為に、コードを書きかねないとのこと。

書籍の内容に沿って、HTMLを出力するクラスと、平文を出力するクラスをTemplate Methodで表現していきます。

### **抽象クラス**
```rb
class Report
  def initialize
    @title = '月次報告'
    @text = ['順調', '最高の調子']
  end

  def output_report
    output_start
    output_head
    output_body_start
    output_body
    output_body_end
    output_end
  end

  def output_body
    @text.each do |line|
      output_line(line)
    end
  end

  def output_start
  end

  def output_head
    raise 'Called abstract method: output_head'
  end

  def output_body_start
  end

  def output_line(line)
    raise 'Called abstract method: output_body'
  end

  def output_body_end
  end

  def output_end
  end
end
```

### **平文を出力するサブクラス**
```rb
class PlainTextReport < Report
  def output_head
    puts "****#{@title}****"
  end

  def output_line(line)
    puts line
  end
end

report_plain = PlainTextReport.new
report_plain.output_report
```

### **HTMLを出力するサブクラス**


```rb
class HTMLReport < Report
  def output_start
    puts ('<html>')
  end

  def output_head
    puts ('<head>')
    puts ("<title>#{@title}</title>")
    puts ('</head>')
  end

  def output_body_start
    puts ('<body>')
  end

  def output_line(line)
    puts ("  <p>#{line}</p>")
  end

  def output_body_end
    puts ('</body>')
  end

  def output_end
    puts ('</html>')
  end
end

report_html = HTMLReport.new
report_html.output_report
```

こういった形で共通部分を切り出して抽象化することにより、サブクラスには具体的な内容のみを記述し、プログラムの実行部分は全て親抽象クラスに記述します。
必ずオーバーライドされるべきところにはエラー処理を書いておくと、なお安全性は増しますね。
Unity5でwebViewを表示する

Unity5でwebViewを表示させようとしてハマったので、メモ。
iosシミュレータで表示させるまでやりました。
androidは未確認です。

## gree社製プラグイン
[コチラ](https://github.com/gree/unity-webview)から落としてきます。
## Unity5ではエラーが出る
Runしようとすると下記エラーが出るので対応します。

```エラー内容
"Couldn't open Assets/Plugins/WebView.bundle/Contents/MacOS/WebView, error: dlopen(Assets/Plugins/WebView.bundle/Contents/MacOS/WebView, 2): no suitable image found. Did find:
Assets/Plugins/WebView.bundle/Contents/MacOS/WebView: mach-o, but wrong architecture"
```

[こちら](https://github.com/gree/unity-webview/issues/28)のやり方で解決しました。
プラグインのWebView.bundleというファイルを生成し直します。

- plugins/Mac/WebView.xcodeproj をひらく
- Build Setting -> 「Architectures」 -> 「Architectures」を64bit architectureに変更する

<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/f70839fe-c5fa-e2c2-16a1-88819b876fe3.png" alt="スクリーンショット 2015-07-27 0.56.20.png" width="400" />

- 「Product」 -> 「Archive」からWebView.bundleを生成する
 
<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/037cde95-ea16-671c-6c4f-66019f7da019.png" alt="スクリーンショット 2015-07-27 0.56.33.png" width="300" />

- XCodeのOrganizerが立ち上がるので、「Export」からファイルを書き出します
- それを"Plugins/WebView.bundle"に上書きます

## ソースコード
[こちら](http://matudozer.blog.fc2.com/blog-entry-8.html)のコードを拝借させていただきました。

## iosビルドするとXCodeでエラーが出る

```エラー内容
'retain' is unavailable: not available in automatic reference counting mode
```

arc周りでエラーがでてるっぽいです。
[こちら](http://neo-shocker.com/code/2013/02/xcode-fno-objc-arc.html)のやり方で解決しました。
Build PhasesのCompileSourcesでWebView.mmのCompiler Flagsに"-fno-objc-arc"を追加
<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/0825e1dc-5487-1b57-818a-af5861ac9a49.png" alt="スクリーンショット 2015-07-27 11.08.38.png" width="300" />

この方法だと、Unity上ではwebviewは見れないです。
ビルドして実機orシミュレーターで確認するしかなさそうです。

- シミュレーターで確認

<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/e24a8e62-70b8-d3d5-a584-56e559daa003.png" alt="スクリーンショット 2015-07-27 11.16.45.png" width="300" />
Elixir 3.0.0 がバージョンアップしたことで Laravel 5.0.x で起こりうる障害とその対策

# 背景

Elixir 3.0.0 がリリースされました。これにより Laravel 5.0.1 までのバージョンを使っていると gulp が動かなくなるケースがあります。ハマったので共有。
https://github.com/laravel/elixir/releases/tag/3.0.0

Laravel 5.0.1 までだとデフォルトで Elixir のバージョン指定が "*" となっているため、npm update すると Elixir は 3.0.0 にバージョンアップします。
https://github.com/laravel/laravel/blob/v5.0.1/package.json

## queueTask の廃止

これまで Elixir には、独自タスクを追加するための仕組みとして、queueTask というメソッドが実装されていました。
例えば「デプロイ前にどこそこのディレクトリは一旦削除しておきたいな〜」など、Elixir が提供する機能の範囲内ではできないようなことを、Elixir のワークフローで行うための仕組みです。

```js
var gulp = require('gulp');
var del = require('del');
var elixir = require('laravel-elixir');

elixir.extend('del', function(args) {
    gulp.task('del', function(cb) {
        del(args, cb);
    });
    return this.queueTask('del');
});

elixir(function(mix) {
    mix
        .del('public/assets/')
        // 中略
        .copy('resources/', 'public/assets/');
});
```

この、queueTask がなくなりました。
3.0.0 からは以下の様に変わります。

```js
var gulp = require('gulp');
var del = require('del');
var Elixir = require('laravel-elixir');
var Task = Elixir.Task;

Elixir.extend('del', function(args) {
    new Task('del', function(cb) {
        del(args, cb);
    });
});

Elixir(function(mix) {
    mix
        .del('public/assets/')
        // 中略
        .copy('resources/', 'public/assets/');
});
```

## phpunit は明示的に phpunit.xml を指定しなければならなくなった

これまで以下のように指定すれば暗黙的に phpunit.xml を参照していました。

```js
var elixir = require('laravel-elixir');

elixir(function(mix) {
    mix.phpUnit();
});
```

しかし、3.0.0 からは以下のようにする必要があります。

```js
var elixir = require('laravel-elixir');

elixir(function(mix) {
    mix.phpUnit('./phpunit.xml');
});
```
[Tips][SOF]Tomcatでバックグランドプロセスを作る方法

StackOverFlowより引用です

### 起点
:question: [ja.stackoverflow.com : tomcatでバックグラウンドプロセスを正しく作る方法](http://ja.stackoverflow.com/questions/12679/tomcat%E3%81%A7%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E6%AD%A3%E3%81%97%E3%81%8F%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95)



### 英語原文：
:smile: [stackoverflow.com running-a-background-java-program-in-tomcat](http://stackoverflow.com/questions/4907502/running-a-background-java-program-in-tomcat)

### Spring3.0だともっと簡単だよね！！

:leaves: [Spring Framework task-scheduling-simplifications-in-spring-3-0]
(http://spring.io/blog/2010/01/05/task-scheduling-simplifications-in-spring-3-0/)
Swift 2.0 / Xcode 7 で Carthage を使って Alamofire や SwiftyJSON を管理する方法

Swift 2.0 / Xcode 7 では Swift の構文が大きく変更されており、 Alamofire や SwiftyJSON をはじめ、多くの Swift ライブラリでは Swift 2.0 / Xcode 7 用のブランチが作られて開発されています。

- [Alamofire](https://github.com/Alamofire/Alamofire): `swift-2.0`
- [SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON): `xcode7`
- [SWXMLHash](https://github.com/drmohundro/SWXMLHash) `xcode-7.0`
- [PromiseK](https://github.com/koher/PromiseK): `swift-2.0` ← これは有名ライブラリではなく僕の自作ライブラリです。

しかし、 [Carthage]() を使ってこれらを管理しようとしても、 README に書いてあるような Cartfile の記述方法ではうまくいきません。上記の Swift 2.0 / Xoce 7 用ではないコミットが checkout されてしまいます。

```
github "Alamofire/Alamofire" >= 1.3
github "SwiftyJSON/SwiftyJSON" >= 2.2.0
github "drmohundro/SWXMLHash" ~> 1.1
github "koher/PromiseK" >= 1.0.0
```

では、どうやって Cartfile に上記のブランチを指定すれば良いでしょうか？ [Carthage の Documentation](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#version-requirement) を読めば書いてあります。

> "some-branch-or-tag-or-commit" for a specific Git object (anything allowed by git rev-parse)

つまり、次のように書けば上記の Swift 2.0 / Xcode 7 用のブランチを指定することができます。

```
github "Alamofire/Alamofire" "swift-2.0"
github "SwiftyJSON/SwiftyJSON" "xcode7"
github "drmohundro/SWXMLHash" "xcode-7.0"
github "koher/PromiseK" "swift-2.0"
```

また、当然ながらこれらのブランチをビルドするためには Xcode 7 を使う必要があります。ビルドに Xcode 7 を使うようにするには、[ここ](https://github.com/Carthage/Carthage/issues/536)で述べられているように次のコマンドを実行すれば良いです。

> ```
sudo xcode-select -s /Applications/Xcode-beta.app/Contents/Developer
```
OpenVzからLXCに移行

## 参考

* [Linux Container - Proxmox VE](http://pve.proxmox.com/wiki/Linux_Container)

>  Migrate container from OpenVZ to Linux container
> copy the backup file in /var/lib/vz/template/cache/

## 注意点

* ZFS上でコンテナの作成、復元はできません。
* [Permission error w/ sockets inside CT since migration to PVE 4.1 | Page 2 | Proxmox Support Forum](https://forum.proxmox.com/threads/permission-error-w-sockets-inside-ct-since-migration-to-pve-4-1.25244/page-2)
    * socketのパーミッションが755になる問題あり

```bash:755
$ ls -l /var/lib/mysql/mysql.sock
srwxr-xr-x 1 mysql mysql 0 Feb  3 16:43 /var/lib/mysql/mysql.sock
```

* 力技で回避したい場合は以下

```diff:/etc/rc.d/init.d/mysql
 case "$mode" in
   'start')
     # Start daemon
 
     # Safeguard (relative paths, core dumps..)
     cd $basedir
 
     echo $echo_n "Starting MySQL"
     if test -x $bindir/mysqld_safe
     then
       # Give extra arguments to mysqld with the my.cnf file. This script
       # may be overwritten at next upgrade.
       $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
       wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
 
       # Make lock for RedHat / SuSE
       if test -w "$lockdir"
       then
         touch "$lock_file_path"
       fi
 
+      chmod 777 /var/lib/mysql/mysql.sock
       exit $return_value
     else
       log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"
     fi
     ;;
```


## CentOS6,7でデフォルトゲートウェイが設定されない

```diff:/etc/sysconfig/network
- GATEWAYDEV="venet0"
- IPV6_DEFAULTDEV="venet0"
+ GATEWAYDEV="eth0"
+ IPV6_DEFAULTDEV="eth0"
```

## sshログインが成功しない場合

* [[SOLVED] - Problems migrating OpenVZ containers Proxmox 2->4 (ssh PTY allocation request failed) | Proxmox Support Forum](https://forum.proxmox.com/threads/problems-migrating-openvz-containers-proxmox-2-4-ssh-pty-allocation-request-failed.24665/#post-123366)

> ssh PTY allocation request failed 

### 対応

```diff:/etc/rc.local
  #!/bin/sh
  #
  # This script will be executed *after* all the other init scripts.
  # You can put your own initialization stuff in here if you don't
  # want to do the full Sys V style init stuff.

+ rm -f /dev/ptmx && ln -s /dev/pts/ptmx /dev/ptmx
  touch /var/lock/subsys/local
```

* OS再起動しsshログインができることを確認

## CentOS7のsystemdでサービスを起動するときspawing: Permission deniedエラー

* [proxmox - CentOS7のsystemdでサービスを起動するときspawing: Permission deniedエラーの対処 - Qiita](http://qiita.com/tukiyo3/items/4df2cc330a9079c4c302)
Unity5.1でVector2.downとVector2.leftが追加されていた

　[Vector2](http://docs.unity3d.com/ScriptReference/Vector2.html)構造体の静的フィールド(Static Variables)に、Unity4では無かった次の二つが、Unity5.1では加わっていました。

* [Vector2.left](http://docs.unity3d.com/ScriptReference/Vector2-left.html) (x:-1, y:0)
* [Vector2.down](http://docs.unity3d.com/ScriptReference/Vector2-down.html) (x:0, y:-1)

Unity4ではVector2.leftとVector2.downが無いため、それに相当するものを利用したい場合、

```csharp:
Vector2 downVec = -Vector2.up;
Vector2 leftVec = -Vector2.right;
```

などとして代替していたと思います。

これでVector2の静的フィールドは

* [Vector2.zero](http://docs.unity3d.com/ScriptReference/Vector2-zero.html) (x:0, y:0)
* [Vector2.one](http://docs.unity3d.com/ScriptReference/Vector2-one.html) (x:1, y:1)
* [Vector2.up](http://docs.unity3d.com/ScriptReference/Vector2-up.html) (x:0, y:+1)
* [Vector2.right](http://docs.unity3d.com/ScriptReference/Vector2-right.html) (x:+1, y:0)
* [Vector2.left](http://docs.unity3d.com/ScriptReference/Vector2-left.html) (x:-1, y:0)
* [Vector2.down](http://docs.unity3d.com/ScriptReference/Vector2-down.html) (x:0, y:-1)


となりましたね。

ところでUnity5.1の[リリースノート](http://unity3d.com/unity/whats-new/unity-5.1)を確認するとこの追加はFIXESの項目にあります？FIXESなのかな？IMPROVEMENTSじゃなくて?

【追記】
初稿だと、Unity5からとしていましたが、Unity5.1からの間違いでした。
jekyllをさくらVPSからHerokuへ移行。

# 設定

## Gemfile

rack-jekyll、unicorn追記

``` ruby:Gemfile
gem 'jekyll'
gem 'nokogiri'
gem 'therubyracer'

# heroku用に追記
gem 'rack-jekyll'
gem 'unicorn'

```

## config.ru

/直下に新規作成

``` config.ru
require "bundler/setup"
Bundler.require(:default)
run Rack::Jekyll.new(:destination => '_site')
```

## _config.yml

exclude追記

``` _config.yml
// jekyll本体に関係ないファイル・ディレクトリ指定
exclude: ['config.ru', 'Gemfile', 'Gemfile.lock', 'vendor']
```

## unicorn.rb

/直下に新規作成

``` unicorn.rb
worker_processes 1
timeout 30
preload_app true
```

# 確認

Herokuアプリ作成してプッシュ。

``` bash
$ heroku create アプリ名
$ git push heroku master
```
iTunes ConnectでiOSアプリ申請メモ

## iTunes Connectにログイン

* https://itunesconnect.apple.com (safariで開くことを推奨)

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/98cbb9c6-9982-c828-865f-582fe6251eae.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/001f1d7a-d0c2-066e-7a15-208637d42785.png)
![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7d99ca38-144b-c549-2315-623f5c9c65d0.png)

## Developer Portalで新しいバンドルIDを登録する

![4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/fd3906ed-661b-9095-203e-4481c5a815b8.png)
![5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9e4a7acd-0fb3-d6d4-cc7e-db6e34d94981.png)
![6.png](https://qiita-image-store.s3.amazonaws.com/0/25728/dc2b6a2f-ef05-4c8b-1db4-1aabea4c2fd8.png)

## アプリの説明記述、スクリーンショット掲載

![8.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ff620b16-5ea1-ff4c-ef69-9465569c5ea5.png)
![9.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1c7c7a36-0f77-3be9-bf3b-043ea3150302.png)
技術英語 > until further notice


Until further notice, XXX (追って連絡があるまで,XXXしていなさい）。

Star trek voyagerにてTuvokが下位士官に対して言っていた。

<hr>
http://ejje.weblio.jp/content/until+further+notice
> 以後の通報のあるまで

<hr>
Until関連で思い出したのは
It's not until relatively recently that we recognize the importance of the nature. 
(我々が自然の重要さを知ったのは、つい最近のことだ）
もしくは
(つい最近まで、我々は自然の重要さに気づいてなかった）
AmazonAPIGatewayでパラメータを渡す

# Lambdaをさわる
久々にLambda触ってあそぼうとおもったらAmazonAPIGatewayなどというステキなものとくっついて連携できるようになってます。

#なにをしよう

とりあえず触るのが目的なので、挨拶APIつくります。

ブラウザで
http://example.com/hello?name=seike
にアクセスしたら
hello seike
が返ってくるのを目的にします。
動かすこととパラメータを渡すことだけがハードルです。

#動かす
やった内容を書く前につまづいたこと。
東京リージョンでAPIエンドポイントの作成時にエラーになりどうしても作成できませんでした。
作業してたタイミングがわるかったのか、未対応だったのか…？とりあえずバージニア北部リージョンで作成することができたのでこのあとはその体でみてください。

APIエンドポイントは以下の設定

* Method = GET
* Security = OPEN

でやってます。何も考えなくていいので。

#コード
目的が大したことないので。javascript入門みたいなコードになってます。

``` sample.js
exports.handler = function(event, context) {
    context.succeed("hello " + event.name);
};
```

#パラメータを渡そう
デフォルトのままではパラメータがそもそもlambdaのコードに渡りません。
ここからAmazonAPIGatewayを触ってパラメータをうまいこと渡してあげる設定をしていきます。
![スクリーンショット 2015-07-27 3.58.52.png](https://qiita-image-store.s3.amazonaws.com/0/19483/c7e4fba7-94f2-9bad-32f8-0c3484108d17.png)
MethodのGETの文字列のリンクを開くと、AmazonAPIGatewayのページが開きます。

![スクリーンショット 2015-07-27 4.02.05.png](https://qiita-image-store.s3.amazonaws.com/0/19483/4fa41fb5-e0c3-1b5a-affd-404839df63f4.png)

このページの右上の**Integration Request**で設定することでパラメータを受け取れます。

設定方法は説明を端折ると以下の画像のような感じの内容を書く必要があります。

![スクリーンショット 2015-07-27 3.58.31.png](https://qiita-image-store.s3.amazonaws.com/0/19483/a5dc8ee0-c9c2-ebd9-217f-a046eb79659f.png)

画像内のMappingTemplateを以下のように設定することで、GETパラメータの内容をLambdaのeventとして渡せました。

``` MappingTemplate.sample
{
    "name" : "$input.params('name')"
}
```

paramsではなくpathパラメータを受け取る設定も可能なはずです。
設定変更した後「Deploy API」をすると有効になります。

そして動作した結果がこれです。
![スクリーンショット 2015-07-27 4.07.04.png](https://qiita-image-store.s3.amazonaws.com/0/19483/5553724f-ae6d-9c7d-2371-37697d3875ab.png)

# さわってみて
* サーバを立てなければならないという呪縛から解き放たれた気がする？
* DNSの設定を組み合わせればもう少しまともなURLへのアクセスで動作させられそう。これは後でやってみようかな。
 
# 参考
[How to serve API using Amazon API Gateway and Amazon Lambda](http://awsace.com/how-to-serve-api-using-amazon-api-gateway-and-amazon-lambda/)
OpenCV3.0 Vizを用いた3次元点群の表示(VisualStudio2013, C++, OpenCV3.0)

#viz::WCloudを見つけたので3次元点群を色付きで表示してみた

##3次元点群可視化用のVizWindow生成

- viz::Viz3d myWindow("Point Cloud");

##rgb, depthデータの読み込み
- サンプル（rgb.png, depth.png）がmodules/rgbd/testdata/rgbd/odometryの中にあります

~~~
	float fx = 525.0f, // default
		  fy = 525.0f,
		  cx = 319.5f,
		  cy = 239.5f;

	Mat colorImage;
	Mat depth, depth_flt;

	colorImage = imread("rgb.png");
	depth = imread("depth.png", -1);
	imshow("rgb", colorImage);
	imshow("depth", depth);

	depth.convertTo(depth_flt, CV_32FC1, 1.f / 5000.f);
	depth_flt.setTo(std::numeric_limits<float>::quiet_NaN(), depth == 0);
	depth = depth_flt;
~~~

## 3次元点群の生成

~~~
	int height = 480, width = 640;
	Mat pCloud(height, width, CV_32FC3);
	for (int y = 0; y < 480; y++){
		for (int x = 0; x < 640; x++){
			if (depth.at<float>(y, x) < 8.0 && depth.at<float>(y, x) > 0.4){
				//RGB-D Dataset
				float Z = depth.at<float>(y, x);
				float X = (x - cx) * Z / fx;
				float Y = (y - cy) * Z / fy;
				pCloud.at<Vec3f>(y, x) = Vec3f(X, Y, Z);
			}
			else{
				//RGB-D Dataset
				pCloud.at<Vec3f>(y, x) = Vec3f(0.f, 0.f, 0.f);
			}
		}
	}
~~~

##VizWindowに表示

~~~
	viz::WCloud wcloud(pCloud, colorImage);
	myWindow.showWidget("CLOUD", wcloud);
	myWindow.spin();
~~~

- 3次元点群と色画像のサイズは同じでないといけません
- showWidgetの名前を"CLOUD2"のように変えていくことで簡単に点群を増やして表示できます
- ループの中で点群を増やす場合、myWindow.spinOnce(1, true);で更新すればいいです

ソースコードは[こちら](https://github.com/SatoshiRobatoFujimoto/PointCloudViz)

#実行準備
OpenCV3.0の導入については[こちら](http://qiita.com/SatoshiRobatoFujimoto/items/c65022a5a6bf845d219b)

Additional Include Directories
$(OPENCV_DIR)\build\include;
~~C:\Program Files (x86)\PCL 1.7.2\3rdParty\VTK\include\vtk-5.10;~~

Additional Library Directories
$(OPENCV_DIR)\build\x86\vc12\lib;
~~C:\Program Files (x86)\PCL 1.7.2\3rdParty\VTK\lib\vtk-5.10;~~

~~opencv_vtk_lib.hppはopencv300\build\includeの下に置いてください~~

※widget_accessorを使わないときVTKは不要です。

#実行結果
最初はこんな感じ。表示するときの座標系が違う。
![VTKCloud.png](https://qiita-image-store.s3.amazonaws.com/0/63863/8d427fc3-9b4d-a394-5253-85cbccbd1c75.png)

ドラッグで回転
Shift+ドラッグで平行移動
Ctrl+ドラッグで角度調整
スクロールでズーム
![VTKCloud2.png](https://qiita-image-store.s3.amazonaws.com/0/63863/e2335de9-d53a-a7a3-7790-c76395b351a5.png)

#関連記事
[Creating Widgets (Viz+VTK)](http://qiita.com/SatoshiRobatoFujimoto/items/5d9c1eaeda224f92c527)
文字列のラムダ式をコンパイルしてC#で使えるようにする

ラムダ式、便利ですよね。
文字列として、TextBoxあたりから入力したラムダ式を実行したり、
XAMLの中にラムダ式を埋め込めると結構便利？かと思ってやってみました。
動的に文字列を組み立ててメタプログラミング！なんてこともできますね。
あまり早くなさそうなので、連発はやめたほうが良さそうですけどね。
使いまわすときは、キャッシュを効かせるといいと思います。

今どきなら、Roslynをつかってやるとかいうことになるのでしょうが、使っていません。
式ツリーも使っていません。よくわからなかった。
やり方的には力技という感じですね。

この記事はとても参考になりました。やや古いのですが。
[C#をスクリプト言語として使う](http://labs.yaneu.com/20101017/)

```csharp:filename

using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace Rawler.Tool.Script
{
     public class ScriptUnitTest{
         //使い方
         public void Test()
         {
            var r = LambadLib.CompileLambda<int, int>("(n)=>n*n");
            System.Console.WriteLine(r.Func(2));
        }
    }

        public static class LambadLib
        {
            public struct LambadResult<T1, T2>
            {
                public CompilerError[] CompilerError { get; set; }
                public Func<T1, T2> Func { get; set; }
            }

            public static LambadResult<T1, T2> CompileLambda<T1, T2>(string source)
            {
                CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

                CompilerParameters cp = new CompilerParameters();
                cp.GenerateInMemory = true;
                cp.TreatWarningsAsErrors = false;
                cp.ReferencedAssemblies.Add("System.dll"); // Regex
                cp.ReferencedAssemblies.Add("System.Core.dll"); // Extensions

                string source2 = @"
            using System;
            using System.Linq;
            using System.Collections.Generic;

            class FunctionClass{
                 Func<(T1), (T2)> test = (lambda);
                public Func<(T1),(T2)> Test { get { return test; } }
            }";

                //入力したもので書き換え。
                source2 = source2.Replace("(T1)",typeof(T1).Name).Replace("(T2)",typeof(T2).Name).Replace("(lambda)", source);
                //コンパイル
                CompilerResults cr = provider.CompileAssemblyFromSource(cp, source2);

                LambadResult<T1, T2> r = new LambadResult<T1, T2>();
                r.CompilerError = cr.Errors.OfType<CompilerError>().ToArray();

                if (cr.Errors.Count > 0) return r;

                //コンパイルしたアセンブリを取得
                var asm = cr.CompiledAssembly;
                //MainClassクラスのTypeを取得
                Type t = asm.GetType("FunctionClass");

                var instance = Activator.CreateInstance(t);
                var m = t.GetMember("test");

                var method = t.GetProperty("Test").GetValue(instance, null);
                r.Func = (Func<T1, T2>)method;

                return r;
            }
        }
    }


```
Linux ディスクとファイルシステム

# ディスクとファイルシステム

- ディスクパーティション - 内臓のディスクを複数の領域に分割して利用すること
  - Linux では、一つのディレクトリツリーに複数のパーティションをマッピングしている
- マウント - ディレクトリーツリーへパーティションをマッピングすること
  - マウントポイント - パーティションがマウントされるディレクトリ

- ファイルシステム - データ本体だけでなく、ディレクトリやファイルの情報を書き込む形式など、ディスクパーティションの形式。
  - 主流なのは ext4 とか
  - ディスクパーティションのフォーマット - ディスクパーティションの中にファイルシステムを作成する。ディスクパーティションを利用する際は始めにする必要がある

- lsblk # ディスクパーティションの構成
- df # 現在のディスクパーティションのマウント状況

- デバイスファイル - ディスクパーティションを表す特殊ファイル
  - /dev/sda1 - sda1 というディスクパーティションを表す

- マウント処理などディスクいじる処理は root ユーザーで
  - lsblk # マウントできるディスクパーティションの確認
  - mount /dev/sr0 /media # /media に sr0 をマウント
  - umount /media # アンマウント
  - 

- ディスク使用量の確認
  - df -h # パーティションごとに使用量を表示。 -h で MB GB など単位をつけてくれる
  - du ~ # ディレクトリ単位(この場合は ホームディレクトリ)での使用量。 -h で単位で観れる。 -a でファイルまで
  - du -a ~ | sort -t" " -k1 -nr # -t" " -k1 で スペースで区切られた１列目(容量)でソート指定。-n で数値でソート、 -r で降順指定

- シンボリックリンク
  - ln -s <ファイルパス> 別名 # ファイルパスは相対パスの場合、リンク元からの相対パスで指定する
  - ls -l でシンボリックリンクを確認すると、リンク先(元ファイル)が見れる
  - リンク先(元ファイル)が消されていると シンボリックリンクもエラーになる
  - ln -s はディレクトリにも適用可能。ディレクトリのシンボリックリンクは rm で消す
dotfilesのGit管理と、グローバルの.gitignoreの関係


## dotfiles
* ホームディレクトリのドットファイルを~/dotfilesからシンボリックリンクする形で管理している。
* ホームディレクトリには、グローバルな~/.gitignoreがある。
* しかし、~/dotfilesディレクトリには、このディレクトリ自体を管理するための**ローカルな**.gitignoreがある。
* 被る。
* どうしよう。

## 参考
* [優れた dotfiles を設計する | TELLME.TOKYO](http://tellme.tokyo/post/2015/07/16/dotfiles/)

## 1.~/.gitignoreだけ別途管理する

* [defunkt/gist](https://github.com/defunkt/gist)

例として、上記コマンドラインツールを用いてGistで管理する。

~/.gitignoreをGistへアップロードする。

```bash
$ gist ~/.gitignore
https://gist.github.com/catfist/6df2cc0e4d534af3a95c
```

以後、アップデートは以下のコマンドで行う。

```bash
$ gist -u https://gist.github.com/catfist/6df2cc0e4d534af3a95c ~/.gitignore 
```

デプロイは、以下のコマンドで行う。コード内容だけを得るため、GistのRAWページを取得する。

```bash
curl -L https://gist.github.com/catfist/6df2cc0e4d534af3a95c/raw > ~/.gitignore
```

## 2.~/dotfilesでは、.gitignoreを使わない

* [Git - gitignore Documentation](http://git-scm.com/docs/gitignore)

代わりに、.git/info/excludeに記述する。記述方法は.gitignoreの場合と同じである。

```~/dotfiles/.git/info/exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
hub
```

というか、特に.gitignore自体をGit管理したいのでない限り、基本、.git/info/excludeで指定したほうがスマートな気がする。

## dotfilesリポジトリにおいてのみ、.gitignoreをトラックする

実は、~/.gitignoreに.gitignoreが含まれている。

これを追加するには、`-f`オプションを利用する。

```bash
$ git add .gitignore # 無視されてしまう
The following paths are ignored by one of your .gitignore files:
.gitignore
Use -f if you really want to add them.
$ git add -f .gitignore # 強制的に追加する
$ git st # トラックされている
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   .gitignore
```
[R] httrでQiitaのAPI v2を使いたかった

追記：個人用アクセストークンは使えました。コメント欄参照。

---------------------------------------------

使いたかったけど、`oauth2.0_token()`ではできませんでした。

# ドキュメント

https://qiita.com/api/v2/docs#auth

# Applicationを登録

OAuth 2.0を使うためには、https://qiita.com/settings/applications からアプリケーションを登録する。「Authorization callback URL」は`http://localhost:1410`にする。

# httrのコード

たぶんこんな感じだと思うんですよね。

```r
library(httr)

qiita_endpoint <- oauth_endpoint(authorize = "/api/v2/oauth/authorize",
                                 access    = "/api/v2/access_tokens",
                                 base_url  = "https://qiita.com")

myapp <- oauth_app("qiita",
                   key = "（Client IDの値）",
                   secret = "（Client Secret）")

qiita_token <- oauth2.0_token(qiita_endpoint, myapp, scope = "read_qiita")
```

でも結果はエラーになります。。content typeって？

```r
qiita_token$credentials
#> $message
#> [1] "Invalid content type"
#> 
#> $type
#> [1] "invalid_content_type"
```

# RTFM

Qiitaのドキュメントを見ると、`Content-Type`は`application/json`にしないといけないみたいです。

> POST /api/v2/access_tokens HTTP/1.1
> Content-Type: application/json
> Host: api.example.com

となっています。一方で、`httr`はどうやら`application/x-www-form-urlencoded`で送ってる雰囲気です。どっちが悪いのかよく分からないんですが、RFCでは`application/x-www-form-urlencoded`になっています。ということで、`httr`側は変更しなさそう。

> 4.1.3.  Access Token Request
   The client makes a request to the token endpoint by sending the
   following parameters using the "application/x-www-form-urlencoded"
   format per Appendix B with a character encoding of UTF-8 in the HTTP
   request entity-body:
(https://tools.ietf.org/html/rfc6749#section-4.1.3)

世の中的には`application/json`でやってるサービスも結構あるんでしょうか？ うーん、なにかいい解決方法あれば教えてください。。
Atomでthemeを自作して登録するまでの備忘録


某イカのゲームっぽいsyntax作れそうな気がしてatomに作ったのでざっくりメモ。

基本的なドキュメントはこのへん。
https://atom.io/docs/v0.60.0/creating-a-theme
https://atom.io/docs/v1.0.2/hacking-atom-creating-a-theme

# 初期化編

## 普通なやり方
apmというのがあるので、npmと一緒で`apm init`みたいなことすると良いかなーと思ったけどもうちょっといいやり方あった。

`cmd-shift-P`でコマンドパネル開いて`Package Generator: Generate Syntax Theme`を選ぶ
![font_scss_-__Users_inuscript_github_example-iconfont-scss_-_Atom.png](https://qiita-image-store.s3.amazonaws.com/0/7307/893bdacf-7a73-74f1-62ea-93bcc9668f3c.png "font_scss_-__Users_inuscript_github_example-iconfont-scss_-_Atom.png")

これで選択した所にテンプレートができてる。

`atom-template`というのがgithubに公式っぽくあがっているが、微妙にそっちは古そうだった

## 既存テーマをベースにするときのやり方
「このテーマ、ここだけなんとかしたい」とか「このテーマをベースにしたい」
という時は、もうちょっと違うやり方がある。
その時はざっくりこんな感じ

1. githubでベースとなるやつをcloneする
- cloneしたリポジトリの名前を変えておく
- ローカルにcheckoutする
- `package.json`の`name`を変えておく
	- 同じ名前では多分登録できないか、上書きされてしまう気がする
- `$apm link`を実行
	- `$npm link`とにたようなやつ。
	- `~/.atom/packages/`にシンボリックリンクする

# 起動編
`atom --dev .` で開く。
既に先ほど作ったsyntaxがインストール済みになっているはずなので、設定からそのsyntaxを選ぶ
（これがわからず最初詰まった）

あとはlessファイルをいじるだけ！

## lessいじるときの細かいテクニックとか
### [Pigments](https://atom.io/packages/pigments)プラグインは入れるべき
色を背景に入れてくれるpluginはこれまでにもあったが
こいつはlessの変数までしっかり読み込んでくれる。
マジ便利。

### lessのcolor functionは積極的に使う
[このあたり](http://lesscss.org/functions/#color-operations)の関数とか特に使える

### `atom --dev`だと簡単にelementをinspectできる
「あれ、ここの色どういうセレクタで調整するんだ？」ってなったら右クリックすると「Inspect Element」というのが増えている
![font-awesome_css_-__Users_inuscript_github_-_Atom.png](https://qiita-image-store.s3.amazonaws.com/0/7307/ad729e2a-81ea-5a5d-36a6-b16b6a1b2367.png "font-awesome_css_-__Users_inuscript_github_-_Atom.png")

chromeみたいにInspectorが開くので、どんなセレクタが有効になっているのかとかわかる。

### 【欄外】他のthemeをベースにする時のtips
割りとニッチな話。

今回、[monokai](https://github.com/kevinsawicki/monokai)をベースにいじった。ベースがしっかりしているのだが、色名が変数化されてないという難点があるので、下記のどっちかをする必要があった。

- [このpull req](https://github.com/kevinsawicki/monokai/pull/49/files)を取り込む
- がんばって置換する

今回は後者を選んだ。「どの色をどれにあてはめる」かを後で入れ替えたかったりしたため、`@pink`などの変数名だと都合が悪かった。なので全部`@color1` `@color2`などと変数化してあとで置き換える事にした。

atomのPackage Generatorでは、`@red`,`@green`などの色が最初から定数化されている。
最初はこちらを使ったが、入れ替えの調整しているうちに`@red`に青色が入ったりしていってわけがわからなくなってしまった。
結果として最初の開発時には番号化してしまうほうがいっそ楽だった。


# 登録編
だいたいnpmと一緒。

1. `$apm login`する
	- 「APIキーを貼ってね」的なことを言われるので、貼る。
2. `package.json`のtagにあわせて`$git tag`登録する
	- ~~`npm tag`みたいなのはなさそうだった。~~
	- ↑`$apm publish patch`みたいなのだけでよかった
3. `$apm publish`する
	- `repository`フィールドのurlが間違ってたり、tagが編だったりすると怒られる。
4. atom上で確認する

# 結果

[できました](https://atom.io/themes/ika-ink-syntax)
青がやたら使いづらくて困っています。
Linux シェル

# シェル

- シェル - ユーザが Linux にログインした際に起動し、端末状にコマンドプロンプトを表示してユーザーからの入力を待ち受ける
  - bash とか

- ワイルドカード指定。ls less cat rm mv とかで指定する時
  - ? : 任意の1文字
  - * : 任意の文字列
  - [...] : []内のいずれか1文字
  - [!...] : []内に含まれない1文字
  - ¥ : ワイルドカード記号の前につけることでワイルドカード文字列を指定 ""で囲んでも良い
  - {} : ,区切りで順番に展開
  - cp sample.{txt,bak} # バックアップが取れる

- history # コマンドの履歴が見れる
- history に関する環境変数は ~/.bash_profile に環境変数を編集して反映できる

- エイリアス - コマンドに別名をつけて実行する機能
  - alias ts="date +%Y%m%d_%H%M%S" # 設定
  - alias 設定してあるエイリアスを確認
  - ~/.bashrc で エイリアスを設定

- source ~/.bashファイル # 設定の読み込み
小さな画像を多く含むHTMLを高速化する方法(Data URLスキーム)

小さい画像を多く含むHTMLの場合、1つのHTMLに30個の画像を含む場合、1つのHTMLを表示するにつき、31リクエストを送信することになる。
１つ１つの画像サイズが小さければ、一瞬で応答を返すことになるが、30回、コネクションを確立し、リクエストレスポンスを実施し、アクセスログを書いたりするのは、1回であれば、大した負荷ではないが、大量のリクエストを受けるサーバにとっては、無視できない負荷になってくる。

「DataURLスキーム」は画像のデータをHTMLに埋め込み一体化させることによって、1リクエストでHTMLと画像の情報をクライアントに受け渡すことができます。

通常であれば、以下のようにHTMLファイルとは別に用意した画像ファイルを指定します。
```html:sample.html
<img src="icon.gif">
```
`div {
 background: white url('icon.gif') ;
}`

「DataURLスキーム」は以下のように画像のバイナリデータをBASE64エンコーディングし、テキストデータに変換し、HTMLに埋め込みます。
`<img src="data:image/png;base64,kVheJ3kiS....">`
`div {
 background: white url('data:image/png;base64,kVheJ3kiS....') ;
}`

ただし、いくつか注意点があります。
・画像データをBASE64エンコーディングするため、データ約1.333倍となります。
　よって、利用するのは、数KB以下程度の軽微な画像でなければ、却って遅くなります。
・古いIEはサポートしていない。(IE7以下はサポートしていない。IE8は32KBまで。IE9からは4GBまで。)
・HTMLに画像データを含むため、管理が煩雑化する。
Linux の標準入出力、パイプライン処理

# 標準入出力、パイプライン処理

- < # ファイル名指定で標準入力にできる
- >(>>) # ファイル名指定で標準出力をファイルに書き込む
- cat < input.txt > output.txt # ファイルからファイルに書き込み
- cat # ファイル名指定しないとキーボードの入力が標準入力になる。 -n で行番号。 Ctrl + D Ctrl + D に入力終了
- > dev/null # 出力を捨てる。バックグラウンド処理結果の画面出力が不要な時など
- > 端末id # ただし、権限があるユーザーしかできない。普通なら同一ユーザーとか root ユーザーとか
- コマンド > result.txt 2>&1 # 標準出力も標準エラー出力も出力
- 1>, 2> 1:標準、2:エラー出力を区別

- コマンド | grep
- ps -ef | head -3 # ヘッダー行から3行分
- ps -ef | tail -3 # 末尾から3行分
- cat sample.txt | grep hoge | wc -l #  一致行をカウント。 -l はカウント数だけ
- cat sample.csv | cut -d"," -f1,4 # ,区切りのcsv から 1,4列目を切り出す
- cat sample.csv | sort -t"," -k4 # ４列目でソート
- cat sample.csv | cut -d"," -f1 | sort | uniq -c # 重複覗いてカウント数も出す
- cat sample.csv | grep -E "(hoge|fuga)" # or条件でgrep
STSでSpring Loadedを使ってコードを即反映させる

Spring Boot、始めました。

IDEとして[Spring Tool Suite(STS)](https://spring.io/tools/sts)を使います。
コーディングも実行もSTSから行いますが、コードを書き換えるたびに停止→実行して反映する必要があります。
なんと非効率な…。

コードを書いて保存して反映される…が理想です。
そこで「Spring Loaded」を使用してこれを実現します。

## ■STSで「Spring Loaded」を使うための手順

【環境】

| OS/Tool | Version |
|:-----------|------------:|
| Mac OS X Yosemite | 10.10.4 |
| STS | 3.7.0.RELEAS |

【前提】
STSでプロジェクト(今回は「demo」という名前のプロジェクト)を作成済み


### 1. 「Spring Loaded」をダウンロードする

[こちら](https://repo1.maven.org/maven2/org/springframework/springloaded/)から最新のjarを任意の場所にダウンロードします。
自分は「springloaded-1.2.4.RELEASE.jar」を「/work/tool」にダウンロードしました。

### 2. STSで「Spring Loaded」を使うための設定をする

STSを起動しメニューの「Run > Run Configurations...」を選択します。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/10982/8bf0c5c7-8afb-79d7-1cf8-313f9c820c72.png)

左のリストから「Spring Boot App」にある対象のプロジェクトを選択し、右の「Arguments」タブを選択します。
真ん中に「VM arguments:」という項目があるので、その中に以下を追記します。
```
-javaagent:/work/tool/springloaded-1.2.4.RELEASE.jar -noverify
```
この状態で「Run」ボタンを押下するとプロジェクトが実行されます。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/10982/36605924-447b-0860-0ade-c3cb1d775ef4.png)

***

以上です。
後はコードを変更して保存するだけで、コードが即反映されます！捗りますね！

### ■参考にさせていただいたサイト

[Hot Swapping in Spring Boot with Eclipse STS](http://blog.netgloo.com/2014/05/21/hot-swapping-in-spring-boot-with-eclipse-sts/)
特定の時間より後のログを確認したい


例えば、サーバ再起動した時間の後のログだけをチェックしたいというときなど、
特定の時間の後のログだけチェックしたいというとき、どうやってgrepすればよいんだろうか。

例えば、apacheのcmbined形式のログで2015年7月26日18時45分以降のログだけを表示させたいとかっていうとき、
どんな風に書けば効率がいいのだろうか？

comined形式の例
```
192.168.1.1 - - [26/Jul/2015:22:51:46 +0900] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"
```

以下のような感じで書いてみた

```bash

grep '\[27\/May\/2015' access_log-20150531 | grep -v '\[27\/May\/2015:0' | grep -v '\[27\/May\/2015:1[0-7]' | grep -v '\[27\/May\/2015:18:[0-3]' | grep -v '\[27\/May\/2015:18:4[0-4]'
```

それぞれのgrepの役割は以下
１：その日のログだけ抽出
２：０時台のログを除外
３：１０時～１７時台のログを除外
４：１８時０～３０分台のログを除外
５：１８時４０～４４分台のログを除外


一応できたけど、とっさに確認したい時などはこんな長いコマンド考えているよりも、
素直に目grepしたほうが速そうな気もします・・・。


他にもっと良い方法ないのでしょうか。
Linux のプロセス, ジョブ操作

# プロセス, ジョブ操作

- Linux では、プロセステーブルというところに、実行中のプログラム全てに実行時間、実行ユーザーなど記録されている。プロセスが終了するとプロセステーブルから消える

- ps # PID: プロセスID, TTY: プロセスの起動端末, CDM: プログラム名
  - Linux が起動したプロセス(デーモン) は TTY ? と表示される

- デーモンと Fork&Exec
  - 一つの動作を担当するプロセス自身が、次の動作に必要となるプロセスを自分のコピーから作って処理を渡していくことで一連の処理が完成する
    例えば、 sshd であれば、 ssh接続を待ち受けるプロセス -> 認証を受け持つプロセス -> 認証後に ssh 接続をログアウトまで担うプロセス。
    最初のプロセスはフォーク後、他のユーザーからのログイン要求の待ち受けに回されることでサービスの継続が維持される
  - 親プロセス、子プロセス
    - ps -f # PPID: 親プロセス。どこからフォークしたのか
  - プロセスと実行ユーザー
    - 上記の例だと、認証が終わるまでは root ユーザー、認証後はログインユーザーの権限でプロセスが実行される。
      root ユーザーは通常のユーザの操作ではなく、このように linux のプロセス操作などに使われるのが基本用途なので、むやみに人が使わない
    - ps -u # 実行ユーザを表示

- プリフォーク
  - sshd のように一つのプロセスが処理にかかりっきりだと、他のアクセスからの対応が遅れる。
    そのため、事前に複数のプロセスをフォークしておき待機させておくことで速度を上げる。httpd などのプロセスはこれをしている

- pstree # 全てのプロセス、親子関係をツリー状で表示
  - systemd プロセス - 全てのプロセスの親プロセス。 linux 起動時に起動されるプロセス
- ps -C httpd # httpd サービスのプロセスを表示
- ps -e # 全てのプロセスを表示。 ps だけだと自身のプロセスだけ
- '-' でオプションを記述する POSIX スタイル, aux でする BSD  スタイル

- バックグラウンドジョブ
  - cp a.txt b.txt & # 最後に & をつけてコマンドする。 [] がこのバックグラウンドジョブの PID。 %1 のように % をつけて表記
  - watch -n1 "ls -l ~/work" # 一定時間ごとにコマンドを実行
  - fg [1] でコマンドプロンプトに処理を戻す。Ctrl + C で終了
  - Ctrl + Z で中断。 bg [1] でバックグラウンド処理再開
  - PID を指定しないと直前の ジョブを対象
  - jods # 実行中のジョブを確認
  - kill # ジョブ、プロセスの削除
  - 親プロセスを kill すると子プロセスも消える
MessagePack PHP拡張モジュールのインストール(PECL)


## 最新バージョンの確認

下記サイトで、最新のバージョンを確認する。
https://pecl.php.net/package/msgpack


## 拡張モジュールのインストール

ソースからコンパイルしてインストールしたPHP環境にインストールする。

```bash:
$ sudo pear clear-cache
$ sudo pear update-channels
$ sudo pear upgrade
$ sudo pecl install channel://pecl.php.net/msgpack-0.5.6
$ echo 'extension=msgpack.so' | sudo tee -a /usr/local/php-5.5.27/lib/php.ini
$ sudo /etc/rc.d/init.d/php-fpm restart
```

## 動作確認

```bash:
$ cat << EOF | sudo tee /usr/share/nginx/virtualhost/index.php
<?php
\$data = array(0=>1,1=>2,2=>3);
\$msg = msgpack_pack(\$data);
\$data = msgpack_unpack(\$msg);
var_dump(\$data);
EOF
$ curl http://virtualhost.tatsunet.net/
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
```
CentOs Atomic を　KVM/QEMU(virt-manager)を使って構築してみた

CentOs Atomic を　KVM/QEMU(virt-manager)を使ってインストールしたのでメモ。
ただ公式サイトの手順通りに実行しただけ。。(次はCUIで！)

## CentOS Atomic とは？

Docker のために作られた軽量OSのCentOS 版です。
詳しくは⇒ [Project Atomic](http://www.projectatomic.io/)

## 環境
CentOS release 6.5 (Final)
virt-manager-0.9.0-19.el6.x86_64
qemu-kvm-0.12.1.2-2.415.el6_5.10.x86_64

## 構築
公式サイトのquick startに従って実施(今回はvirt-managerで行います)
⇒ [Project Atomic Quick Start Guide](http://www.projectatomic.io/docs/quickstart/)

### イメージ取得

公式サイトからqcwo2形式のイメージを落としてきます。

```
$wget http://cloud.centos.org/centos/7/atomic/images/CentOS-Atomic-Host-7-GenericCloud.qcow2.xz
$xz -d CentOS-Atomic-Host-7-GenericCloud.qcow2.xz
```

### virt-magerで仮想マシンの作成

「新しい仮想マシンの作成」をクリック

![2015-07-26_215405.png](https://qiita-image-store.s3.amazonaws.com/0/55219/66c2048d-5c49-8432-9a4d-b0c1b23edb71.png)

適当な仮想マシンの名前を入力し、
「既存のディスクイメージをインポート」を選択し、次へ進む

![2015-07-26_220153.png](https://qiita-image-store.s3.amazonaws.com/0/55219/3fc61bc1-0858-f31b-a931-a57dde164cd2.png)

先ほど取得したqcow2イメージを選択する。
※公式サイトではOSにFedora 20かそれ以降を選択しろって書いてあったが、
  プルダウン中のFedora 18 までしかなかったので、「全般」のままに(;´Д｀)

![2015-07-26_220633.png](https://qiita-image-store.s3.amazonaws.com/0/55219/3e525f98-0abb-2846-458c-5ca4bcf4f7f0.png)

あとは適当にメモリとCPU数を設定してあげて、最後に「完了」を押せばOK!

### init.iso の作成
作成した仮想マシンにログインするためにはinit.isoを作成しなければいけないっぽい。。。
↑よくわかっていない

これも公式にしたがって作成する

```
$cat <<EOS> meta-data
instance-id: id-local01
local-hostname: samplehost.example.org
EOS
```

```
$cat user-data
#cloud-config
password: mypassword 
ssh_pwauth: True
chpasswd: { expire: False }

ssh_authorized_keys: 
  - ssh-rsa ... foo@bar.baz (insert ~/.ssh/id_rsa.pub here)
```

meta-dataとuser-dataファイルを作成したら、これらのファイルからinit.isoを作成する

```
$ yum install genisoimage.x86_64
$ genisoimage -output init.iso -volid cidata -joliet -rock user-data meta-data 
```
(genisoimageのオプションの意味はまた調べよう・・・)

### init.isoを仮想マシンに設定する

virt-managerのGUIから作成仮想を選択し、
上部メニューの「表示」⇒「詳細」をクリック
※仮想マシンは停止しておいた方がよさげ・・・？

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/55219/1659ddde-a2d3-4f30-480e-6a90404aaa36.png)

左下の「ハードウェアを追加」を選択し、
開いたダイアログの「管理しているストーレジか、他の既存ストレージを選択する」を選択し、
先ほど作成したinit.isoを選択する。

![2015-07-26_222700.png](https://qiita-image-store.s3.amazonaws.com/0/55219/209aade8-ef59-c493-ef94-444c3d63ae34.png)

## 仮想マシン起動

ログインユーザとパスワードを聞かれるのでuser-dataで設定したパスワードでログインする。
ユーザのデフォルトは centos


とりあえずこれでログインするとこまでいけた・・・(;´Д｀)
ログインしてrootユーザになってから

```
# docker version 
```
でdocker が入ってること確認！！

軽く感動w
[Android][初心者向け？]非同期でDBからデータ取得しつつ末尾での自動読み込み+最適な位置への自動スクロール


初心者趣味プログラマーなのでツッコミどころ満載だと思うので
容赦ないツッコミよろしくお願いします



わかりにくい。
ここは良くない等の指摘は大歓迎です。
ガンガンコメントください。


※わかりにくいと思うので説明しておきます
最適な位置への自動スクロールとは、
末尾での自動読み込み処理後、一番上まで戻ってしまうとユーザービリティを損ねるので
自動読み込みで追加した要素の少し上(今まで見ていたところ)まで
自動でスクロールするということです。


##OnScrollListenerをimplementsしてグローバル変数を設定
```java
public class List extends AppCompatActivity implements AbsListView.OnScrollListener {
//ここでグローバル変数の設定します
    myListView = (ListView) findViewById(R.id.myListView);
    int position;
    int y;
    private AsyncTask<Void, Void, String> mTask;
    
```
##最後までスクロールされたかどうかの判定  
AbsListView.OnScrollListenerのonScrollを利用
・表示されている先頭のインデックス(firstVisibleItem)、
・表示されているリストの数(visibleItemCount)
・リストのトータル数(totalItemCount)
が引数として渡ってくるので、
firstVisibleItem + visibleItemCount = totalItemCount
になる時、最後までスクロールされたと判定出来る。

```java
	@Override
    public void onScroll(AbsListView view, int firstVisibleItem,
                         int visibleItemCount, int totalItemCount) {
	// 最後までスクロールされたかどうかの判定  
        if (totalItemCount == firstVisibleItem + visibleItemCount) {
    // ここに次の数件を取得して表示する処理を書けばいい  
    //ListView.getFirstVisiblePosition()を実行すると、現在表示しているリストビューの一番上にあるアイテムのポジションを取得できます。
            position = myListView.getFirstVisiblePosition();
            y = myListView.getChildAt(0).getTop();
            additionalReading();
        }
    }
    
```
##書かないとエラーになるonScrollStateChanged

onScrollStateChangedメソッドはスクロールの状態を検知するためのメソッドです。
 使う必要がないと思ったため省きたかったのですが、Overrideが必須だったようなので、
    つけくわえました。

   これを使えばもっとスマートに自動読み込み、自動スクロール実装できるんでしょうか？
   というよりもっと気になるのは空でいいものなのか...

```java   
    @Override
    public void onScrollStateChanged(AbsListView arg0, int arg1) {
    }
```
##既に読み込み処理が開始していないのかのチェック
"最後までスクロールされたかどうかの判定" で呼び出した関数です。

```java

    private void additionalReading() {
    // 既に読み込み中ならスキップ
    /*
    	AsyncTaskがexecute(実行)していない
			そして
		AsyncTaskのステータスがRUNNINGでない。
		ときスキップする		 
    */
    if (mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING) {
            return;
        }
        mTask = new MyAsyncTask().execute();
    }
```
##非同期で取得し、ようやくViewにセット...

```java

    
        public class MyAsyncTask extends AsyncTask<Void, Void, String> {
            public MyAsyncTask() {
            
            }

            @Override
            protected String doInBackground(Void... params) {
            //doInBackgaroudのreturnはonPostExecuetの引数に渡ります。
            //ここで僕は通信して外部サーバーから情報を取得し、resultにViewにセットしたい値を代入しておきます。
            //確か、Viewの操作はdoInBackgroundからではできません。			
            return result;
            }

            @Override
            protected void onPostExecute(String result) {
            //表示位置の指定はListView.setSelection()メソッドで位置を指定するだけで可能です。
            //指定した位置までスクロールします。
            //position は先頭に表示したい行のインデックス。            
			 //y は指定したピクセル分、下にずらします。
            	myListView.setSelectionFromTop(position, y);
            }
   	 }
   	 
   
```

※大した内容でなくすいません
ただWebにまとまった情報がなかったので
いずれ訳に立つ人がでてくるかな〜と思って
投稿してみました。
これから初心者脱却に向けて頑張りますー

##少しでもここは直すべきと思うことあれば...
もし時間あって気が向いた時にでも
コメントで指摘してもらえたら嬉しいです。
ShellScript再起動中　シェルスクリプト からRubyを呼び出す

# シェルとRubyの組み合わせ

数年前に某案件で、ログファイルの解析処理を行った時にはShellScript(Bash)とPerlを組み合わせてやってたっけ。

今回はディレクトリ取得やコマンド実施などをShellScriptで、
文字列処理をRubyで実施するケースを想定します。

# 書いてみたシェルスクリプトのソースコード

##args.sh

<pre>
echo "hello shell"

dir=`pwd`"/args.rb"

echo "script source is"
echo $dir
echo "no args"
ruby $dir
echo "foo bar"
ruby $dir "foo" "bar"

echo "foo bar"
ruby $dir "one" "2" "san" "for"
</pre>

## args.rb
<pre>
$ cat args.rb

p ARGV

array = [ARGV[0],ARGV[1],ARGV[2]]

p "args 1,2,3"
p array

p "each do"

i = 0;
ARGV.each do |foo|
  p i
  p foo
  i = i + 1
end
</pre>

何やっているのかというと、args.sh のほうは
1.試しに文字を表示
2.現在のディレクトリをもとに、実行するファイルのパスを取得する
3.前項で取得したパスを表示する。
4.引数なし、２つ、４つのケースに関してrubyファイルを実施する。

args.rbに関しては
1.引数の入った配列を表示する
2.引数の入った配列のうち、先頭から３つ分を配列に入れる
3.引数の入った配列に関して、要素を一つずつ表示する。

# 実行結果

<pre>
a$ ./args.sh
hello shell
script source is
/Users/ShinichiMinoshima/Documents/rb/private/args.rb
no args
[]
"args 1,2,3"
[nil, nil, nil]
"each do"
foo bar
["foo", "bar"]
"args 1,2,3"
["foo", "bar", nil]
"each do"
0
"foo"
1
"bar"
foo bar
["one", "2", "san", "for"]
"args 1,2,3"
["one", "2", "san"]
"each do"
0
"one"
1
"2"
2
"san"
3
"for"
</pre>


# 注意
このスクリプト、実用性は皆無です。
rubyのコンパイル処理にも時間がかかるし。
（だから、前振りですって！）
「sudo: effective uid is not 0, is sudo installed setuid root?」と表示され、sudoコマンドが使えない場合は、ディスクユーティリティを使え (Mac)

# 概要
## 症状
ターミナルで`sudo hoge`と打つと、
```sudo: effective uid is not 0, is sudo installed setuid root?```
と表示され、管理者権限でコマンドを実行できない。

## 原因

パーミッションがおかしく（sudoコマンドが使えない状態に）なっているため。

## 対処法

ディスクユーティリティを使って、パーミッションを修復すればよい。

![diskutil.png](https://qiita-image-store.s3.amazonaws.com/0/28930/33091c1b-df84-a69f-644b-fa3c3cc6ecd0.png)


---

# 詳細

## 原因
`/usr/local/bin`あたりのパーミッションが正しくないとこのエラーが表示される。（パスはこれではないかも、あまり鵜呑みにはしないで下さい）

## 対処法

1. `F4`（または`fn+F4`）キーを押した後、「disk」と入力し「ディスクユーティリティ」を起動する
	- うまく行かなければ、画面右上にある虫眼鏡マークをクリックして「disk」と入力しも同じ
2. 下図の「ディスクのアクセス権を修復」をクリック、数分待つと問題が解消される
![diskutil.png](https://qiita-image-store.s3.amazonaws.com/0/28930/33091c1b-df84-a69f-644b-fa3c3cc6ecd0.png)
Linux基本操作

# linux のインストール時の設定項目
 - チェックサムでダウンロードがうまくできたか
 - 使用言語、キーボード
 - ストレージデバイスの種類
 - ホストネーム
 - タイムゾーン
   - タイムゾーン
   - unix タイム
     - 197001010000 からの経過秒
   - ハードウェアクロック と システムクロック
     - ハードウェアクロックはデバイスの内蔵電池で動き、OSが止まっているときはこの時計で時間を刻む。
       OS 起動時にハードウェアクロックからシステムクロックに時間が読み込まれ、停止時に 逆にハードウェアクロックに時間を書き込む。
       システムクロックは unix タイム、ハードウェアクロックは、System clock use で選んだタイムゾーンか、選ばなければ os のタイムゾーンが入る
  - root ユーザのパスワード
  - ディスクパーティションの分割方式
  - 初期にインストールするソフトウェア

# 基本操作
  - ユーザー系
    - useradd oura # ユーザーの追加 戦闘は数字や記号を使わない。記号は _ - 鹿使わない
    - id oura # ユーザー id の確認
    - passward oura # パスワード設定
    - 初期にできる root ユーザーはできるだけ使わない。インストール後に管理者用ユーザーを作ってそれ以降は、各ユーザーの権限のもと操作するのが望ましい
    - インストール後は、基本的に。直接linuxサーバを入れた筐体からログインするより、リモートで作業する
    - su - # root ユーザに切り替え。 Switch User
    - last # ユーザーのログイン履歴。ログイン、アウト時刻、ログインもと ip など

  - ネットワーク系
    - ifconfig # IPアドレス

  - サーバ情報系
    - hostname
    - whoami # 自身のユーザー
    - date, cal
  - パッケージ管理系

    - yum update - リポジトリのバージョンを更新する。インターネットで近くのミラーサーバからくる。
    - yum install - リポジトリからインストール

  - その他
    - man

  - ファイル、ディレクトリ操作
    - date >(>>) sample.txt # 出力をファイルに書き込み。 > は上書き、 >> は追記
    - .(カレント) ..(一つ上) ~(ホーム)
    - cd, pwd, mkdir, rmdir
    - cp # -i オプションで上書き防止
    - rm # -r ディレクトリを中身のファイルごと全消しする
    - mv # ファイルの移動とリネーム
    - diff # ファイル比較

  - セキュリティ系
    - ファイアーウォール
      - iptable -L INPUT # ファイアーウォールの確認
      - etc/sysconfig/iptablr # ファイアーウォールの設定ファイル
      - systemctl restart iptable.service # ファイアーウォールの再起動
    - SELinux - 各種サービスのリソースアクセスを制限
      - setsebool httpd_enable_homedirs # httpd サービスのホームディレクトリへのアクセス制限を確認
      - setsebool -P httpd_enable_homedirs true # アクセス制限を解除

  - サービス系
    - systemctl status httpd.service # サービスの状況
    - systemctl enable thhpd.service # linux 起動時に自動起動するように

  - アクセスパーミッション系
    - chmod
Controller から、イベントを発生させたHTMLのIDが取れました

Lightning Component で、コントローラーのメソッドに引数が渡せないので、
ボタンアクションの識別では、Componentを分けるしかないと思っていましたが、
コントローラー内で下記の変数を取得すると普通にIDが帰ってきました

event.target.id

ありがたい！
余計なコンポーネントを作らずにすみます！
Ruby再起動中　引数とループ

# 引数およびループ文の復習

引数：参照ファイルなどの指定に使いそう
ループ：要素数を取得したりとか

# ソースコード

引数は あらかじめ用意されている配列ARGV に入ってます。

実行時に与えられた引数をそのまま表示、
先頭から３つ分配列化して表示するケース、
引数が入っている配列の要素を一つ一つ読み込んで表示するケース。
を用意しました。

<pre>
p ARGV

array = [ARGV[0],ARGV[1],ARGV[2]]

p "args 1,2,3"
p array

p "each do"

i = 0;
ARGV.each do |foo|
  p i
  p foo
  i = i + 1
end
</pre>

# 実行結果

## 引数なし

### コマンド
<pre>
$ ruby args.rb 
</pre>
### 結果
<pre>
"args 1,2,3"
[nil, nil, nil]
"each do"
</pre>

## 引数２つだけ
###コマンド
<pre>
$ ruby args.rb 1 2
</pre>
###結果
<pre>
["1", "2"]
"args 1,2,3"
["1", "2", nil]
"each do"
0
"1"
1
"2"
</pre>

## 引数が４つある

###コマンド
<pre>
$ ruby args.rb one 2 san for
</pre>
###結果
<pre>
["one", "2", "san", "for"]
"args 1,2,3"
["one", "2", "san"]
"each do"
0
"one"
1
"2"
2
"san"
3
"for"
</pre>
Ruby再起動中　配列、ハッシュの要素数とか

# 配列やハッシュの要素数を取得したい

ユースケース：引数などの、要素がいくつあるかわからないケースで要素数だけカウントしたい場合？

# 答え
hoge.length のように、 lengthメソッドを使う。

# サンプルコード

配列の中にハッシュを入れたり、ハッシュの要素に配列を入れたしたりしていますが、ネストした場合を再現するためです。


<pre>
hs = { :id => 1 , :name => "hoge" }

ary = Array.new(2)
ary[0] = Array["1","one"]
ary[1] = Array["2","two"]

ary2 = Array.new(0)
ary2[0] = hs

hs2 = { :ary => ary , :ary2 => ary2 }   

p hs
p hs.length
p ary 
p ary.length

p hs2
p hs2.length
p ary2
p ary2.length

</pre>

# 実行結果

上から順に、ハッシュ、配列をネストした配列、配列を値に持つハッシュ、ハッシュをネストした配列の、中身と要素数を表示しています。

配列の場合、外側の要素を返しています。

<pre>
{:id=>1, :name=>"hoge"}
2
[["1", "one"], ["2", "two"]]
2
{:ary=>[["1", "one"], ["2", "two"]], :ary2=>[{:id=>1, :name=>"hoge"}]}
2
[{:id=>1, :name=>"hoge"}]
1
</pre>