OmniAICreator/Qiita-1.07M huggingface dataset:
Xcodeで音楽を再生してみた

If you would like to try my code, you have to prepare music files. (does not matter what type of extension, but highly recommend mp3 or mp4)

#Development Environment
- OS X El Captain 10.11.2
- Xcode Version 8.0

#Language
Swift 3.0

#Step 
1- Add your music file to **Assets.xcassets**

<img width="697" alt="musicXcode.png" src="https://qiita-image-store.s3.amazonaws.com/0/129117/b341758e-a121-7d56-d2a3-d24fccb97ece.png">

2- import AVFoundation to activate the library to use

```swift
import AVFoundation
```

3- Declare a parameter of AVAudioPlayer

 ```swift
var player: AVAudioPlayer?
```

4- Create main function that will play a music file in Xcode

```swift
 func playSound() {
        guard let sound = NSDataAsset(name: "前前前世") else {
            print("The music file that you mentioned is not found in asset folder")
            return
        }
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)
            player = try AVAudioPlayer(data: sound.data, fileTypeHint: AVFileTypeMPEGLayer3)
            player!.play()
        } catch let error as NSError {
            print("Error: \(error.localizedDescription)")
        }
    }
``` 

5- Done

#Source Code
```swift:ViewController.swift
import UIKit
import AVFoundation

class ViewController: UIViewController {
   
    var player: AVAudioPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()
        playSound()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

/* Function */
extension ViewController{
    func playSound() {
        guard let sound = NSDataAsset(name: "前前前世") else {
            print("The music file that you mentioned is not found in asset folder")
            return
        }
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)
            player = try AVAudioPlayer(data: sound.data, fileTypeHint: AVFileTypeMPEGLayer3)
            // You can print name of music that you are gonna play.
            print (sound.name)
            player!.play()
        } catch let error as NSError {
            print("Error: \(error.localizedDescription)")
        }
    }
}
```

#Conclusion
これで音楽再生アプリつくれちゃいますね！
GPUの性能をベンチマーク

SoftLayer ベアメタル の Tesla K80 の実力ってどんなもの？　と気になるので、性能を計ってみました。

単にベンチマークしても、結果の評価が難しいので、比較のために、デスクトップPC用 アキバで１〜２万円で売っている GPU を比較しながら、GPUのベンチマークをしてみます。ベンチマークのツールは、CUDA Toolkit のサンプルコードにある [nbody](http://docs.nvidia.com/cuda/cuda-samples/#cuda-n-body-simulation) を利用します。 


# 結果

簡単なスペックと結果を次の表にまとめました。

| モデル      | Tesla K80   | GTX 750Ti    |
|:-----------|:-----------:|:------------:|
| GPU数      |      2      |     1        |
| 総コア数    |     4992    |     640      |
| GPUクロック  |     824MHz  |   1110MHz    |
| 総グローバルメモリ | 23GB |       2GB      |
|CUDA Capability| 3.7      |      5      |
| nbody 結果 | 3134 GFLOP/s  |    962  GFLOP/s    |


# 測定方法

Tesla K80 には、GPUが２個入っているので、 -numdevices=2 をセットして、２個のGPUに負荷がかかる様にします。

~~~
root@server1:~/NVIDIA_CUDA-8.0_Samples/5_Simulations/nbody# ./nbody --benchmark --numbodies=256000 -numdevices=2
<中略>
number of CUDA devices  = 2
> Windowed mode
> Simulation data stored in system memory
> Single precision floating point simulation
> 2 Devices used for simulation
GPU Device 0: "Tesla K80" with compute capability 3.7

> Compute 3.7 CUDA device: [Tesla K80]
> Compute 3.7 CUDA device: [Tesla K80]
number of bodies = 256000
256000 bodies, total time for 10 iterations: 4182.238 ms
= 156.701 billion interactions per second
= 3134.016 single-precision GFLOP/s at 20 flops per interaction
~~~

GeForce GTX 750Ti の場合は、 --device=0 を指定します。

~~~
root@rei:~/nvidia/NVIDIA_CUDA-8.0_Samples/5_Simulations/nbody# ./nbody --benchmark --numbodies=256000 --device=0
<中略>
> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
gpuDeviceInit() CUDA Device [0]: "GeForce GTX 750 Ti
> Compute 5.0 CUDA device: [GeForce GTX 750 Ti]
number of bodies = 256000
256000 bodies, total time for 10 iterations: 13613.112 ms
= 48.142 billion interactions per second
= 962.836 single-precision GFLOP/s at 20 flops per interaction
~~~


# まとめ

Tesla K80 は、 発表から４年が経過しているが、23GBの搭載メモリ量と4992コア数もあり、月額で300ドル台で利用できるので、GPGPUを短期間試したいケースには適していると思う。



参考資料 
(1) [Qiita CUDA で GPU の 戦闘力の差 を 実感する...](http://qiita.com/hidenorly/items/0f71a2698987406a1935)
(2) [GPU搭載のベアメタル で CUDA が使えるって？](http://qiita.com/MahoTakara/items/9ea2b0b2c3795051f733)
API Gatewayの「Lambda プロキシ統合の使用」オプション

久々にAPI Gatewayの管理画面を開いたら、統合リクエストのページに以下のようなオプションが出ていいたので早速試して見ました。というのも、これまでAPI Gatewayを利用してLambdaを呼び出す際に、HTTPリクエストに含まれている情報を連携するために、わざわざMapping Templateを作成して、HTTPヘッダーなどをeventオブジェクトに設定していたのですが、これを使えば、HTTPヘッダーの情報がそのままLambdaに伝わるのでは！？と感じたためです。

![2016-10-17.png](https://qiita-image-store.s3.amazonaws.com/0/112407/b834cb60-563e-8ae9-bf7b-c77f7151ff51.png)

まずはチェックをはずした状態でAPI Gatewayのテストから以下のJSONをPOSTしてみます。

```
{ Message: 'Hello World' }
```

ログに出力されたLambdaのeventの中身は以下の通り。

```
{ Message: 'Hello World' }
```

続いて、「Lambda プロキシ統合の使用」オプションを設定した場合。
まずもってテスト画面にクエリ文字列とヘッダーを設定する欄が登場。

![2016-10-17 (1).png](https://qiita-image-store.s3.amazonaws.com/0/112407/df6931a0-ebf1-b5a2-77c7-4face324082e.png)

今回も同じく

```
{ Message: 'Hello World' }
```

をPOSTしてみたところ、Lambdaのeventには以下の値が設定されていました。

```
{
    resource: '/mook',
    path: '/mook',
    httpMethod: 'POST',
    headers: { Accept: ' application/json' },
    queryStringParameters: { param1: 'value1' },
    pathParameters: null,
    stageVariables: null,
    requestContext: {
        accountId: 'xxxxxxxxxxxx',
        resourceId: 'xxxxxx',
        stage: 'test-invoke-stage',
        requestId: 'test-invoke-request',
        identity: {
            cognitoIdentityPoolId: null,
            accountId: 'xxxxxxxxxxxx',
            cognitoIdentityId: null,
            caller: 'xxxxxxxxxxxx',
            apiKey: 'test-invoke-api-key',
            sourceIp: 'test-invoke-source-ip',
            cognitoAuthenticationType: null,
            cognitoAuthenticationProvider: null,
            userArn: 'arn:aws:iam::xxxxxxxxxxxx:root',
            userAgent: 'Apache-HttpClient/4.5.x (Java/1.8.0_102)',
            user: 'xxxxxxxxxxxx'
        },
        resourcePath: '/mook',
        httpMethod: 'POST',
        apiId: 'xxxxxxxxxx'
    },
    body: '{"Message": "Hello World"}'
}
```

とまあ、API Gatewayがこれまで丸めていたHTTPヘッダーの情報をかなりきちんと得ることができました。HTTPヘッダーに基づく処理をする場合には非常に役立ちますね。ただ、注意すべきは、`event.body`がJSONではなく、テキスト文字列になっているので、`JSON.parse`してやらないとエラーになりますね。
UIWebViewにUserAgentをつけて表示を変えたい…!

Apple does not support it and add it as Default, so we have to declare it in AppDelegate, which means we are supposed to call following function before creating WebView
# Development Environment
- OS X El Captain 10.11.2
- Xcode Version 8.0

#Language
Swift 3.0

# Step
1 Add below code in AppDelegate.swift

```swift:AppDelegate.swift
private func setupCustomUserAgent() {
        //UserAgentを上書き
        let webView:UIWebView = UIWebView()
        webView.frame = CGRect.zero
        let userAgent:String! = webView.stringByEvaluatingJavaScript(from: "navigator.userAgent")
        let userAgentStr = "QiitaLaw"
        let customUserAgent:String = userAgent.appending(userAgentStr)
        let dic:NSDictionary = ["UserAgent":customUserAgent]
        UserDefaults.standard.register(defaults: dic as! [String : AnyObject])
    }
```

2 Call that function in following

```
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        setupCustomUserAgent()
        return true
    }

```

3 Done
Laravelの環境構築で、phpbrew,phpコマンドが動かなくなってしまった話


```bash:ターミナル
brew install homebrew/php/composer
php -v
```

composerインストール後にphpコマンドが動作しなくなった。

```bash:エラー文
dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /Users/(ユーザー名)/.phpbrew/php/php-5.6.23/bin/php
  Reason: image not found
```


## 原因
`libreadline.6.dylib`が存在していないことが発覚。パスを確認すると、Homebrewのパッケージであるreadlineに問題があるらしい。

ただ、いきなりディレクトリを直接弄るのは怖いので、まずはReadlineのサマリーを出力(Homebrew便利)

```bash:ターミナル
brew info readline

readline: stable 7.0 (bottled) [keg-only]
/usr/local/Cellar/readline/7.0 (45 files, 2.1M)
  Poured from bottle on 2016-10-16 at 17:58:37
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/readline.rb

==> Caveats
```
readlineのバージョン（7.0）と、phpbrewが求めているreadlineのバージョン(6.x)がマッチしていないため動作しないことが判明


## 解決策

phpbrew側がreadline7を要求するようにしてくれれば万事解決できたのだが、そのような手段が見つからず断念。(Teratailで質問しても回答者様現れず………)

そこで、readline6を本家リファレンスからダウンロード＆インストールすることに決めた。

ちなみにhomebrewで別バージョンをインストールしようと試みたが、最近のhomebrewでは、versionsコマンドが廃止された為出来なくなってしまった。

### 手順
1.[こちら](http://core.ring.gr.jp/pub/GNU/readline/)にアクセスし、リストにあるreadline-6.3.tar.gzをダウンロード＆ファイルを解凍する。

2.展開されたファイルを`/usr/local/Cellar`ディレクトリに配置する
※ Cellarの場所が分からなかった場合、` open /usr/local/Cellar/`を実行するとFinderが表示してくれる

3.ターミナルで以下のコマンドを実行

```bash:ターミナル
cd /usr/local/Cellar/readline-6.3

pwd 
#/usr/local/Cellar/readline-6.3にいることを確認
./configure --prefix=/usr/local/Cellar/readline/6.3 --mandir=/usr/local/Cellar/readline/6.3/share/man --infodir=/usr/local/Cellar/readline/6.3/share/info --enable-multibyte

make

make install
```
これで、readlineに6.3のバージョンを導入完了。

4.バージョン6.3が入っているかどうか確認
brew info readlineを実行して、6.3が追加されていることを確かめる。

```bash:ターミナル
readline: stable 7.0 (bottled) [keg-only]
Library for command-line editing
https://tiswww.case.edu/php/chet/readline/rltop.html
/usr/local/Cellar/readline/6.3 (39 files, 1.9M)
  Built from source
/usr/local/Cellar/readline/7.0 (45 files, 2.1M)
  Poured from bottle on 2016-10-16 at 17:58:37
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/readline.rb
==> Caveats
```

5.readlineを7.0から6.3に切り替える

```bash:ターミナル
brew switch readline 6.3
```

最後にphp,phpbrewコマンドを実行して動作したら成功

```bash:ターミナル
> $ php -v

PHP 5.6.23 (cli) (built: Oct 16 2016 01:45:49)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

```


参考にしたサイト:
- [6.35. Readline-6.3](http://lfsbookja.osdn.jp/7.6.ja/chapter06/readline.html)
- [psqlしたらreadlineのエラーが出るようになって](http://blog.skylarking.me/2016/10/07/psql-readline-error/)
- [Macにpython3開発環境を構築する （pyenv導入）](http://catnapper-mar.hatenablog.com/entry/2016/10/16/020159)
Powershellで絶対パスと相対パスを相互変換したい


# 扱うパスが存在する場合

`Test-Path`で`$true`が返ってくるパスを扱う場合、`Resolve-Path`で相互変換できる。

## 相対パスから絶対パスへの変換例

```.ps1
$root = "C:\foo\bar" # 基準となるパス
$rltv = "..\baz.txt" # 相対パス

Push-Location $root
    (Resolve-Path $rltv).Path      # => C:\foo\baz.txt (変換される)
    $root | Test-Path              # => True
    Resolve-Path $rltv | Test-Path # => True
Pop-Location
```

## 絶対パスから相対パスへの変換例

```.ps1
$root = "C:\foo\bar"     # 基準となるパス
$abs  = "C:\foo\baz.txt" # 絶対パス

Push-Location $root
    Resolve-Path $abs -Relative # => ..\baz.txt (変換される)
    $root | Test-Path           # => True
    $abs  | Test-Path           # => True
Pop-Location
```

# 扱うパスが存在しない場合

`Push-Location`と`Resolve-Path`は、存在しないパスを指定すると例外が発生するので別の方法が必要になる。
後述する`Convert-LocalPath`を定義すると下記のようになんとかなる。

## 相対パスから絶対パスへの変換例

```.ps1
$root = "X:\foo\bar\" # 基準となるパス
$rltv = "..\baz.txt"  # 相対パス

$rltv | Convert-LocalPath -Location $root             # => X:\foo\baz.txt (変換される)
$root | Test-Path                                     # => False
$rltv | Convert-LocalPath -Location $root | Test-Path # => False
```

## 絶対パスから相対パスへの変換例

```.ps1
$root = "X:\foo\bar\"    # 基準となるパス
$abs  = "X:\foo\baz.txt" # 絶対パス

$abs  | Convert-LocalPath -Location $root -Relative # => ..\baz.txt (変換される)
$root | Test-Path                                   # => False
$abs  | Test-Path                                   # => False
```

# Convert-LocalPath

中身は[URI クラス](https://msdn.microsoft.com/ja-jp/library/system.uri(v=vs.110).aspx)を使っているだけ。


```.ps1
filter Convert-LocalPath
{
    Param
    (
        [parameter(
            Mandatory=$true,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true
        )]
        [string] $Path,

        [ValidateNotNullOrEmpty()]
        [uri] $Location = (Get-Location).Path,

        [switch] $Relative
    )

    if (-not $Relative) {return [uri]::new($Location, $Path).LocalPath}

    $localPath = $Location.MakeRelative($Path) -replace '/', '\'
    if ($localPath.StartsWith('.')) {$localPath} else {".\${localPath}"}
}
```

## 注意点

末尾に"\"がないとフォルダ扱いされません。

```.ps1
PS C:\> "..\baz.txt" | Convert-LocalPath -Location "X:\foo\bar"
X:\baz.txt

```


`Function`や`Variable`などのPSDriveは扱えません。

```.ps1
PS C:\> ".\NG" | Convert-LocalPath -Location "Function:"
./NG

PS C:\> ".\NG" | Convert-LocalPath -Location "Variable:"
./NG

```

# 小ネタ

動的型付けとオーバーロードの地獄感がすごい

```.ps1
PS C:\> [URI]::new("Z:\", "zzz").LocalPath
Z:\
PS C:\> [URI]::new("Z:\", [string]"zzz").LocalPath
Z:\zzz

PS C:\> [URI]::new

OverloadDefinitions
-------------------
uri new(string uriString)
uri new(string uriString, bool dontEscape)
uri new(uri baseUri, string relativeUri, bool dontEscape)
uri new(string uriString, System.UriKind uriKind)
uri new(uri baseUri, string relativeUri)
uri new(uri baseUri, uri relativeUri)

```
Controller単位で役割によるアクセス制限を掛ける方法(@EnableGlobalMethodSecurity)

#Controller単位で役割によるアクセス制限
画面単位でユーザのアクセスを制限したい場合に、ServiceではなくControllerで制限を掛けた方がしっくりくる為、
その制限を掛ける方法を以下に記載する。
（本来、上記ケースではURLによるアクセス制限にする方が望ましい？）

#アクセス制限の種類
アクセス制限は大きく分けて以下に分類できるが、
Controller単位でのアクセス制限は「2.クラス単位」を使用する事になる。

1. URL
1. クラス
1. メソッド
1. HTML

#実装方法
WebSecurityConfigurerAdapterを継承したクラスに`@EnableGlobalMethodSecurity(securedEnabled = true)`を付与する。
その後、各Controllerに対して`@Secured(value = "ROLE_XXXX")`を付与すればOK。


```java:WebSecurityConfig.java
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    // 以下省略

}
```

```java:UserSearchController.java
@Secured(value = "ROLE_ADMIN")
public class UserSearchController {
    // 以下省略

}
```
Spring Bootでapplication.properties(yml)に独自の設定値を定義する

Spring Bootでは、application.properties(yml)にアプリケーションの設定値を持たせることができるわけだが、その値はSpring Bootがデフォルトで持っているものしか設定できない。以下が設定可能な一覧と各デフォルト値。
[Common application properties](http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html)

上記以外で、独自の設定値を持たせたい場合は以下のように設定する。
※ここでの例は、
　slack.api.token
　slack.api.domain
という2つのプロパティを独自で定義したい設定値として示す。

# 1. プロパティに対応するJava Beanクラスを作成する
以下のように、application.propertiesに設定したいプロパティを持つJava Beanクラスを作成する。

```SlackApiConfiguration.java
@Component
@ConfigurationProperties(prefix = "slack.api")
public class SlackApiConfiguration {

	private String token;

	private String domain;

	public String getToken() {
		return token;
	}

	public void setToken(String token) {
		this.token = token;
	}

	public String getDomain() {
		return domain;
	}

	public void setDomain(String domain) {
		this.domain = domain;
	}
}
```


1. @Componentをつけてコンテナに登録されるようにしておく。
2. @ConfigurationPropertiesをつけてこのクラスが独自で設定したいプロパティを持つクラスという宣言をする。また、引数にprefixを指定するとその値でプロパティがグルーピングできる。
3. 設定したいプロパティを定義する(ここではtokenとdomain)。なお、これらにはsetterとgetterが必要。

# 2. メタ情報の追加

これは必須ではないが、pom.xmlに以下のようにspring-boot-configuration-processorを追加することで、メタ情報が追加されapplication.propertiesでCtrl + Spaceを押すと候補が表示されるようになる。

```pom.xml
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>
```

こんな感じで独自に追加した設定項目が候補表示される。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/23101/f2e53fdc-c9fd-91e9-434d-6f62d63e065c.png)

# 3. application.properties(yml)に独自の設定値を定義する

```application.properties(yml)
slack.api.token=XXXXXXXX
slack.api.domain=https://slack.com/api/
```

ここで設定した値が、1で作ったJava Beanクラスの各プロパティにバインドされる。

# 4. あとは必要なところで使うだけ

```
// 1で作ったJava BeanクラスをDIして
@Autowired
SlackApiConfiguration slackApiConfiguration;

// getterで呼ぶだけ
System.out.println(slackApiConfiguration.getToken());
System.out.println(slackApiConfiguration.getDomain());
```

# 参考
https://blog.ik.am/entries/376
http://m12i.hatenablog.com/entry/2014/10/28/101919
Intに数字の単位をつけて表示させたい (Ex. 1,000 -> 1K, 2,000,000 -> 2M)


# Development Environment
- OS X El Captain 10.11.2
- Xcode Version 8.0

#Language
Swift 3.0

#Step
1 Create Int Extension file

```swift:Int+Extension.swift
import UIKit

extension Int {
    // 数値省略処理
    func AbbreviationFormatter () -> String {
        let numberFormatter = NumberFormatter()
        typealias Abbreviation = (threshold:Double, divisor:Double, suffix:String)
        // 単位のパターン宣言はここで. Add more abbreviation from here
        let abbreviationsUnits:[Abbreviation] = [(0, 1, ""),(100.0, 1000.0, "K"),(100_000.0, 1_000_000.0, "M"), (100_000_000.0, 1_000_000_000.0, "B")]
 
        let initialValue = Double (abs(self))
        let abbreviation:Abbreviation = {
            var after = abbreviationsUnits[0]
            for temp in abbreviationsUnits {
                if (initialValue < temp.threshold) {
                    break
                }
                after = temp
            }
            return after
        } ()
        let actualValue = Double(self) / abbreviation.divisor
        numberFormatter.positiveSuffix = abbreviation.suffix
        numberFormatter.negativeSuffix = abbreviation.suffix
        numberFormatter.allowsFloats = true
        numberFormatter.minimumIntegerDigits = 1
        numberFormatter.minimumFractionDigits = 0
        numberFormatter.maximumFractionDigits = 1
        return numberFormatter.string(from: NSNumber (value:actualValue))!
    }
}
```

2 You can use that extension with int parameter

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let number1 = 5000
        let number2 = 500000
        let number3 = 5000000
        let number4 = 5000000000
        
        print (number1.AbbreviationFormatter())
        print (number2.AbbreviationFormatter())
        print (number3.AbbreviationFormatter())
        print (number4.AbbreviationFormatter())

        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```

3 Output will be following:
`5K
0.5M
5M
5B`

4 Done
macOS SierraでKarabinerの代わりに⌘英かなとdefaultsでキーボードの設定を行う

2016年10月現在、KarabinerはmacOS Sierraでは動かない、のでSierraに移行していない人が結構多いぽい。

[macOS SierraでKarabinerが動かなくて困っている人に贈る代替ソフトウェア](http://hitoriblog.com/?p=44850)という記事が上がっていたのでそれを参考に⌘英かなとdefaultsでKarabinerで使っていた機能を設定してみたので共有。

## ⌘英かなの設定
https://ei-kana.appspot.com

⌘英かな2.1.0からキーリマップ機能が追加されて、複数キーのリマップが可能になりました。

* Commandキー単発打ちで英数/かなの切り替え
* 複合キーのスワップ

![⌘英かな_と_tasks_scss_—__Users_yutaka_Development_zens_zensapp.jpg](https://qiita-image-store.s3.amazonaws.com/0/28262/6035199a-9653-3abb-9c06-17615c06cdef.jpeg)

Karabiner-Elementsは現在、単発キーの置き換えだけど、⌘英かなは複合キーのスワップができる。

## defaults でkey repeat を設定する

Macのdefaultsでkey repeatを環境設定から選べる速度以上の速度を設定できます。
terminal で設定してください。 変更後はMacの再起動が必要です。


```
# リピート入力認識までの時間 normal minimum is 15 (225 ms)
defaults write -g InitialKeyRepeat -int 10 # 150ms

# KeyRepert # normal minimum is 2 (30 ms)
defaults write -g KeyRepeat -int 1 # 15ms
```
Android WebViewのCookieの扱いで激ハマりした話

# 概要
WebViewでCookieを使おうと思った時、4系以降のOSに対応させようと思って発生した出来事です。
初回だけCookieが反映されず、WebViewの表示が正常ではなかった。

# 原因
WebViewのCookieってどこで登録してますか？
やっぱりWebViewClientのonPageStartedですか？
私も、onPageStartedです。

・・・原因はこれでした。


# 解決策
これは、5.0以降だとダメっぽいです。
4系だと正常に動いてくれます。

4系では、WebViewを生成してから、onPageStartedでCookieを登録していくことになると思います。
しかし、5.0以降では、onPageStartedでは、Cookieの登録が間に合わないようです。
5.0以降になると、WebViewを生成する前に、Cookieを登録しても怒られないようになっています。

例えば、MainActivityのOnCreateで書いたりします。

```java
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            CookieManager cm = CookieManager.getInstance();
            cm.setAcceptCookie(true);
            cm.setCookie(BuildConfig.URL_API_BASE, COOKIE_VALUE);
        }
```

これ、きちんとバージョンで分岐してあげないと、エラーも吐かずにアプリが落ちます。
最初落ちてるところを特定するのに苦労しました・・・。

こうしてWebViewを作る前にCookieを登録してあげることで、正常に動作するようになりました。

4x系では、以前と同様onPageStartedで設定してあげる必要があります。
対応OS5.0以降でいいよっていう素敵な環境ならonPageStartedに記述する必要はありません。

もっとスマートにならないのかね、これ・・・。

以上、WebViewのCookieの扱いで激ハマりしたことでした。
カウントダウン



デモ：http://codepen.io/mo4_9/pen/wzEjJO

![スクリーンショット 2016-10-17 21.37.11.png](https://qiita-image-store.s3.amazonaws.com/0/136286/f7e38693-180e-75c7-be15-002a13fe90ac.png "スクリーンショット 2016-10-17 21.37.11.png")


```javascript
class Countdown {

    constructor(opts={}) {
        this.$root = opts.$root || $('.countdown');
        this.$d = this.$root.find('.cd_d .num');
        this.$h = this.$root.find('.cd_h .num');
        this.$m = this.$root.find('.cd_m .num');
        this.$s = this.$root.find('.cd_s .num');

        this.endDate = Date.parse(opts.endDate) || Date.now() + 60 * 1000 * 5;

        this.init();
    }
    
    init() {
        this.loopId = setInterval(() => {
            const cd = this.getCount();
            this.$d.text( cd.d );
            this.$h.text( cd.h );
            this.$m.text( cd.m );
            this.$s.text( cd.s );
        },1000);
    }
    
    getCount() {
        const startDate = Date.now();
        const leftTime = this.endDate - startDate;
        const a_day = 24 * 60 * 60 * 1000;
        // day
        const d = this.set2fig( Math.floor(leftTime / a_day) );
        // hour
        const h = this.set2fig( Math.floor((leftTime % a_day) / (60 * 60 * 1000)) );
        // 残時間 / 秒 = 残分数
        // 残分数 % 60 = 残時間の分
        const m = this.set2fig( Math.floor((leftTime % a_day) / (60 * 1000)) % 60 );
        // 残時間 / ミリ秒 = 残秒数
        // 残秒数 % 60 = 残ミリ秒
        // 残ミリ秒 % 60 = 残時間の秒
        const s = this.set2fig( Math.floor((leftTime % a_day) / 1000) % 60 % 60 );

        // 終了
        if ( leftTime <= 0 ) {
            clearInterval( this.loopId );
            return {d:'00',h:'00',m:'00',s:'00'};
        }
        return {d,h,m,s};
    }
    
    set2fig(num) {
      return _.padStart(num,2,0);
    }
  
};

(() => {

  const countdown = new Countdown({
    endDate: '2020-08-01 00:00:00'
  });
  
})();
```

時間制御系ライブラリ
https://momentjs.com/
https://date-fns.org/


> 参考
[JavaScript (jQuery) でカウントダウンタイマーを書く](http://qiita.com/satomyumi/items/45ee16aca2972abf7c7d)
PowerShellメモ　GUIの入力画面を表示(XAML)

# 概要
GUIの入力画面を表示するサンプル。
![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/a0064963-982c-e850-da7f-05c7a5bcad7e.png)


# コード

```PowerShell
Add-Type -AssemblyName PresentationFramework
[xml]$xaml = @'
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="入力画面">
<StackPanel>
  <TextBlock Text="日付を入力↓" />
  <StackPanel Orientation="Horizontal">
    <DatePicker Name="cal" />
    <TextBlock Text="{Binding ElementName=cal, Path=SelectedDate, StringFormat='選択した日付：yyyy/MM/dd', Mode=OneWay}" Margin="20,0,0,0" />
  </StackPanel>
  <TextBlock Text="テキストを入力↓" Margin="0,10,0,0" />
  <TextBox Name="inTxt" Text=""/>
  <CheckBox Name="chk" Content="チェック" IsChecked="True" Margin="0,10,0,0" />
  <Button Name="okButton" Content="OK" IsDefault="True" Margin="0,10,0,0" />
  <TextBlock Name="errTxt" Text="" Foreground="Red" Margin="0,20,0,0" />
</StackPanel>
</Window>
'@
$reader = (New-Object System.Xml.XmlNodeReader $xaml)
$window = [Windows.Markup.XamlReader]::Load($reader)

$calendar1 = $window.FindName("cal")
$inputText1 = $window.FindName("inTxt")
$checkbox1 = $window.FindName("chk")
$btn1 = $window.FindName("okButton")
$errorText1 = $window.FindName("errTxt")

# カレンダーの初期設定（過去の日付を選択不可にする）
$calendar_loaded = $calendar1.add_Loaded
$calendar_loaded.Invoke({
  $calendar1.BlackoutDates.AddDatesInPast()
})

# 実行ボタン押下時の処理
$btn_clicked = $btn1.add_Click
$btn_clicked.Invoke({
  # 入力チェック
  if ($calendar1.SelectedDate -eq $null)
  {
      $errorText1.Text = "日付を入力してください。"
      return
  }
  if ($inputText1.Text -eq "")
  {
      $errorText1.Text = "テキストを何か入力してください。"
      return
  }
  
  # 入力値をコンソールに表示
  [string]$str1 = $calendar1.SelectedDate.ToString("yyyy/MM/dd")
  [string]$str2 = $inputText1.Text
  [string]$str3 = $checkbox1.IsChecked.ToString()
  Write-Host "日付：${str1}、テキスト：${str2}、チェック：${str3}" -BackgroundColor Blue
  # ウィンドウを閉じる
  $window.Close()
})

# ウィンドウ表示
$window.ShowDialog() > $null
```


# 実行例
![ps05.png](https://qiita-image-store.s3.amazonaws.com/0/142879/13cbafce-0ead-fe96-0f33-7908e0c54059.png)

日付を選択。
![ps06.png](https://qiita-image-store.s3.amazonaws.com/0/142879/5345a519-7a6a-7cfc-7e50-c60ba3e3b2d5.png)

日付とテキストを入力したらOKボタンを押す。
![ps07.png](https://qiita-image-store.s3.amazonaws.com/0/142879/42a64bf8-8a87-4bbc-aa44-9ac31972567f.png)

ダイアログが閉じてコンソールにメッセージが出力される。
![ps08.png](https://qiita-image-store.s3.amazonaws.com/0/142879/6fc19132-4379-542e-b4c4-d564a2bfb936.png)




# 動作確認した環境
* PowerShell V4 (Windows 8.1)
* PowerShell V5 (Windows 10)
あっけなくディープコピー on Rails

ときおりハッシュや配列のディープコピーが必要になりますが、Rails標準で機能が用意してありました。

# 変数のコピー、シャローコピー

Rubyはオブジェクト指向の言語ですが、変数はオブジェクトへの参照となっているので、変数をコピーしても、オブジェクト自体は1つのままです。

```rb:変数のコピー
a = { foo: :bar }
b = a
b[:hoge] = :piyo

# 共通のオブジェクトなので、aも変わる
p a[:hoge] # => :piyo
```

そして、オブジェクトをコピーするためのメソッドとして`Object#dup`があります。これを使えば上のようなことはなくなりますが、まだ完全とはいい難いです。

```rb:シャローコピー
a = { foo: [1, 2, 3] }

# ハッシュのコピーを作る
b = a.dup

b[:hoge] = :piyo

# ハッシュは別になっているので、aには影響しない
p a[:hoge] # => nil

# a[:foo]の配列は共通のまま
b[:foo] << 4
p a[:foo].length # => 4
```

ということで、`#dup`でコピーされるのは自分自身のオブジェクトだけで、このような1階層のコピーを**シャローコピー**（shallow = 浅い）といいます。

# ディープコピーするには～Ruby標準で～
それでは、中身までコピーするディープコピーを行うにはどうすればいいでしょうか。プレーンなRubyでは、いったんRubyのデータ構造を文字列にエンコード・デコードする[`Marshal`モジュール](https://docs.ruby-lang.org/ja/latest/class/Marshal.html)を使って、以下のように書くというイディオムがあります。

```rb:Marshalを使ったディープコピー
b = Marshal.load(Marshal.dump(a))
```

これでも動くといえば動くのですが、ちょっと間接的というか、まどろっこしい感じがします。

# Railsだともっとシンプル
Ruby on Rails（のActiveSupport）では、もっと単純な方法で実行できます。

```rb:ActiveSupport版
b = a.deep_dup
```

## 実装内容と制限

これがどのように実装されているか確認してみたところ、[`core_ext/object/deep_dup.rb`という1ファイル](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/deep_dup.rb)になっていました。

* `dup`不可能なもの（整数、`true`、`false`、`nil`、`Symbol`など）…そのまま
* `Array`…各要素に`#deep_dup`を再帰適用して`map`
* `Hash`…まずハッシュ全体を`dup`して、（キーの`dup`が必要なら行いつつ）値を`#deep_dup`
* それ以外…単純に`dup`

ということで、「`Array`と`Hash`以外のデータ構造」の場合は、自分で`#deep_dup`を実装しないと正しく実行できません。あと、再帰的なデータ構造を作り上げてしまった場合（`Array`の要素に自分自身を入れた場合など）、**無限ループしてしまいます**。`#deep_dup`が便利なのは、ちょうどJSONから起こしたような、ハッシュ・配列の組み合わせ構造の場合に限られるようです。
UIImageView (画像)を丸くする処理

# Development Environment
- OS X El Captain 10.11.2
- Xcode Version 8.0

#Language
Swift 3.0

# Step
1 Create UIImageView custom class file

```swift:CircleImageView.swift
import UIKit
class CircleImageView: UIImageView {
    @IBInspectable var borderColor :  UIColor = UIColor.black
    @IBInspectable var borderWidth :  CGFloat = 0.1
    
    override var image: UIImage? {
        didSet{
            layer.masksToBounds = false
            layer.borderColor = borderColor.cgColor
            layer.borderWidth = borderWidth
            layer.cornerRadius = frame.height/2
            clipsToBounds = true
        }
    }
}
```
 
2 Add the class in identity inspector
<img width="814" alt="custom class UIImageView.png" src="https://qiita-image-store.s3.amazonaws.com/0/129117/fc9a4416-0134-f147-d3bc-cdb14bb5c166.png">

3 Done.
vimからxcodeを開くプラグイン


## はじめに
xcodeなど使わずにvimでswiftやc++書きたいですよね
でもxcodeに頼らないといけないときもありますよね

## 機能
- git管理されているxcodeプロジェクトを開く(プロジェクトのルートにいればgit管理されてなくても良い)
- 現在開いているファイルをxcodeで開く
- xcodeにフォーカスを移動する
- xcodeを閉じる

## 使い方
[zebult/xcode.vim](https://github.com/zebult/xcode.vim)
deinかneobundleとか使っていれたら
好きなようにマッピングしてください

```vim
nnoremap <silent> <Leader>X :XcodeProjectOpen<CR>
nnoremap <silent> <Leader>x :XcodeFileOpen<CR>
nnoremap <silent> <Leader>e :XcodeFocus<CR>
nnoremap <silent> <Leader>Q :XcodeClose<CR>
```
今さらCentOS6.8にRedmine 1.2を入れる

# 今さらCentOS6.8にRedmine 1.2を入れる

今さらこんな古いバージョンのRedmineを使うことはないと思いますが、リストアの関係上必要に迫られてもう一度やれ言われたらできなさそうなのでメモも兼ねての手順書です。
DBはmysqlでpassengerを使います。
（昔流行った構成です）

* すでにCentOS6.8がインストールされてる状態からスタートです。
* rootでの作業前提です（sudoな人は頭にsudoをつけてください）

## 環境構築

* SELnuxのdisableとiptablesのOFF（真面目な方はちゃんとフィルタを書いてください）  

```shell-session
sed -i -e 's/^\(SELINUX=\).*/\1disabled/' /etc/selinux/config
setenforce 0

chkconfig iptables off
chkconfig ip6tables off
reboot
```

## 必要パッケージをインストール

```shell-session
yum -y groupinstall "Development Tools"
yum -y install openssl-devel readline-devel zlib-devel curl-devel
yum -y install mysql-server mysql-devel
yum -y install httpd httpd-devel
yum -y install rubygems
yum -y install ruby-devel
gem install rack -v=1.1.1 --no-rdoc --no-ri
gem install rake -v=0.8.7 --no-rdoc --no-ri
gem install i18n -v=0.4.2 --no-rdoc --no-ri
gem install mysql --no-rdoc --no-ri
gem install passenger -v=3.0.7 --no-rdoc --no-ri
```

## /etc/my.confにutf8を指定

```shell-session
vi /etc/my.conf

以下を追加

[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8
```

## mysqlの起動＆設定

* mysql_secure_installationでrootパスワードとか決めてください

```
service mysqld start
chkconfig mysqld on
mysql_secure_installation
```

* redmine用のDBの作成

```shell-session
mysql -u root -p
mysql> CREATE DATABASE redmine charset="utf8";
mysql> GRANT ALL PRIVILEGES ON redmine.* TO redmine@localhost IDENTIFIED BY 'redmine';
```

## redmine 1.2を持ってくる

```shell-session
svn co http://svn.redmine.org/redmine/branches/1.2-stable /var/lib/redmine
```

## redmineの設定

* [/var/lib/redmine/config/configuration.yml]の新規作成   
   下記の設定を新規作成（ユーザ名やパスワードは適宜変更）

```shell-session
vi /var/lib/redmine/config/database.yml

production:
  adapter: mysql
  database: redmine
  host: localhost
  username: redmine
  password: redmine
  encoding: utf8
```

* [/var/lib/redmine/config/configuration.yml]の新規作成   
  domeinは適宜変更

```shell-session
vi /var/lib/redmine/config/configuration.yml

production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "localhost"
      port: 25
      domain: 'exsample.com'

  rmagick_font_path: /usr/share/fonts/ipa-pgothic/ipagp.ttf

```


## redmineのディレクトリのパーミッション変更

```shell-session
chown -R apache:apache /var/lib/redmine
```

## railsやらpassengerやらの設定

```shell-session
gem install -v=2.3.11 rails
cd /var/lib/redmine
rake generate_session_store
rake db:migrate RAILS_ENV=production
passenger-install-apache2-module
```

## apacheのコンフィグにpassengerの設定（ついでにredmineも）

* [/etc/httpd/conf.d/redmine.conf]作成して下記設定を入れる

```shell-session
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.7/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.7
PassengerRuby /usr/bin/ruby
RailsBaseURI /redmine
```

## サブディレクトリで動くようにリンクを作る

```shell-session
ln -s /var/lib/redmine/public /var/www/html/redmine
```

## apacheの再起動

```shell-session
service httpd restart
chkconfig httpd on
```

これで`http://xxxxxxxx/redmine`で動く予定

gemでインストールするものはバージョン間違えると泣きます
PHP で作るテーブル駆動方式

## はじめに

プログラマのバイブル「[コード・コンプリート](http://amzn.to/2en7kCt)」で紹介されている「テーブル駆動方式」。

古典的なテクニックながら、コードをシンプルに保つことができる強力な手法…。
ですが、PHP の世界ではあまり紹介されている記事を見かけません。

ましてPHP を使ったサンプル記事となると、意外にこれが（大げさにいえば）、国内初なのでは？
ざっと Google 先生に聞いてみて、結果の少なさにそう感じた次第です（2016年10月現在）。

まず、テストやデバッグと同様、初心者向けの書籍で紹介されることは、ほとんどないのではないでしょうか。
しかし、最初に間違った道に進まないよう、初心者にこそ教えてもらいたいというのは私だけではないと思います。

※古典的かつ強力な手法ですので、Java や C の世界では普通に使われていそうですが。

PHP初心者の方にこそ、この方式で、整理された読みやすいロジックを書いて快適なコーディング生活を送ってもらいたいと思います。


## テーブル駆動方式を使わない制御構文の場合

※ ここではエラーチェックは無視して、ロジックが理解しやすく書いています。

やたらと if がつらなる、何を意味しているのか分かりにくいコードです。
初心者の頃、こういうコードを書いて怒られたものです。

「[コード・コンプリート](http://amzn.to/2en7kCt)」を読むまでは、switch　文で書いたりしていました。
分かりやすくなるのですが、switch は遅くなるという欠点があります。


```php

function getProductName($category, $price){
    if($category === "meat"){
        if($price === 10000){
            return 'gyuu';
        }elseif($price === 500){
            return 'buta';
        }        
    }
    if($category === "fish"){
        if($price === 2000){
            return 'maguro';
        }
        if($price === 100){
            return 'aji';
        }               
    }
}

echo getProductName("fish", 100); // aji が出力
```

メンテもしにくそうです‥。

カテゴリが「fish」で、価格が「100」のものは、「aji」が出力、というパターンが出ています。
もうひとつカテゴリがあり、「meat」の場合で、それぞれ２つずつ金額の異なるパターンがあります。
これだけのパターンならまだいいですが、カテゴリが10個と増えたら？　
※データベースを使うまでもないパターンです。

## テーブル駆動方式を使う場合

``` php 

function getProductNameFromTable($table, $category, $price){
    $count = count($table);
    for($i=0; $i<$count; $i++){
        if( ($table[$i][1] === $category ) and ($table[$i][2]=== $price) ){
            return $table[$i][3];
        }
    }
}
```

これだけです。
と、関数をたたく前に、以下の配列、テーブル的な構造を作っておきます。
ここが、この記事のキモとなる、テーブルです。

``` php
// 「テーブル型」データ
$table[] = [1,'meat',10000,'gyuu'];
$table[] = [2,'meat',500,  'buta'];
$table[] = [3,'fish',2000, 'maguro'];
$table[] = [4,'fish',100,  'aji'];

echo getProductNameFromTable($table, "fish", 100); //aji
echo getProductNameFromTable($table, "meat", 10000); //gyuu
```

何を意図しているデータなのか、一目瞭然で、これならメンテもしやすいですね。
パターンがいくら増えても、プログラムは変更する必要がないというメリットがあります。

単純にデータの「テーブル」を作って、
2列目のカテゴリ、3列目の数値が、それぞれ引数と一致するものを出力しています。

こんな表を作って、PHPに2列目、3列目を検索させているわけです。

複雑なロジックを書くことなく、さまざまなパターンを書けそうです。
ものすごく遅い、配列のキーを検索する組み込み関数を使う必要もありません。

また、この方法ならデータベースからの戻り値を何度も取りなおすのではなく、
取得するのは最初の1回だけで、検索やページングを
PHP に任せてしまうこともできそうです。

同様なことは、もちろん JavaScript でもできるので、
JSONデータの取扱にも役立ちそうです。


以上です。
CocoaPods1.1.0.rc.3でpod updateして遭遇したエラーと解決方法

##はじめに
Xcode 7.3, CocoaPods0.39の環境で開発していたプロジェクトについて、Xcode 8, CocoaPods1.1.0.rc.3という環境でpod updateを実行しました。
発生したエラーと解決方法について、シェアします。

## Specifying multiple `post_install` hooks
まず出たのがこのエラーです。

```
[!] Invalid `Podfile` file: [!] Specifying multiple `post_install` hooks is unsupported..
```

Podfileのなかに複数のpost_install do | installer |があったので、1つのpost_install do | installer |にまとめて解決しました。

## The dependency `***` is not used in any concrete target.

```
The dependency `SwiftyPickerPopover` is not used in any concrete target.
```
[こちらの記事](http://qiita.com/ShinokiRyosei/items/7187ffb71862aba7e240)によりますと、CocoaPods 1.0.0以降では、ターゲットを指定する仕様になったようです。

target ‘ge-calc’ do
pod 'SwiftyPickerPopover'
end
のような形にすることで解決できます。


##No such file or directory @ rb_file_s_stat - Pods/Target Support Files/Pods/Pods-acknowledgements.plist
```
No such file or directory @ rb_file_s_stat - Pods/Target Support Files/Pods/Pods-acknowledgements.plist
```

Setting.bundleの中のAcknowledgements(謝辞)項目への追記作業を自動化をPodfileに書いていたのですが、ここでパスの不整合が起きていました。記述の第二のエラーの解決のために指定したターゲット名がパス名に入るようになったからです。

パス名を次のように書き換えます。
例えば、パス名が"ge-calc"だった場合、
`/Pods-ge-calc/Pods-ge-calc-acknowledgements.plist`
のように指定することで解決できます。

関連リンク
ライセンス表記の自動作成
http://qiita.com/mox2/items/545f1d39e4829907ac42

冒頭文つきで、CocoaPods経由のOSSのライセンス表記を自動化する
http://qiita.com/hsylife/items/5f1e7bdd7de0fd60532f
ツクールMVで距離を計算するプラグインコマンドとその使い方

プレイヤーが一定の距離まで近づくと、隠れていた敵が現れて近づいてくるイベントを作りました。
![SCGetDistance_arg3_1.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/8751cc6b-0984-f826-6c47-dbd89ecbe0cd.gif)


距離を条件にした条件分岐が見つからなかったので、距離を計算して変数に格納する部分をプラグインコマンドで作ってみました。

イベントは、隠れて動かない状態（１ページ目）、現れて追いかける状態（２ページ目）の２つで、セルフスイッチAで切り替えています。
１ページ目では並列処理を使い、距離を計測し続けます。条件が真になったらセルフスイッチAをONにして２ページ目へ移ります。

# 2つのイベントの距離の計算
### プラグインコマンド呼び出し

```SCGetDistance E1 E2 V1```

2 つのイベントの距離を計算します。

|引数|説明|
|---|----|
|E1|1つ目のイベントの番号です。|
|E2|2つ目のイベントの番号です。|
|V1|計算した距離を格納する変数の番号です。|

イベントの番号は、イベントに割り振られた番号のほかに、
0 で呼び出したイベント、-1 でプレイヤーのイベントを表せます。

### 用例

イベントのページ１の設定は次のとおりです。
![arg3-page1.png](https://qiita-image-store.s3.amazonaws.com/0/46088/9a20c7ab-967e-78f4-5af6-29a4c8c8dc80.png)

1行目で、 SCGetDistance 0 -1 20 を実行しています。
このイベント(イベントID=0)とプレイヤー(イベントID=-1)との距離を計算して、結果を変数20番(名称:ワーキング変数1)に格納します。

その後、通常の条件分岐を使って、変数20番(名称:ワーキング変数1)が 2 以下ならばセルフスイッチAを ON にします。
この条件分岐は、このイベントとプレイヤーとの距離が 2 よりも近いという意味になります。

#イベントと座標との距離の計算
### プラグインコマンド呼び出し

```SCGetDistance E1 X1 Y1 V1```

イベントと指定した座標との距離を計算します。

|引数|説明|
|---|----|
|E1|イベントの番号です。|
|X1|座標の X 軸の値です。|
|Y1|座標の Y 軸の値です。|
|V1|計算した距離を格納する変数の番号です。|

イベントの番号は、イベントに割り振られた番号のほかに、
0 で呼び出したイベント、-1 でプレイヤーのイベントを表せます。

### 用例
イベントのページ１の設定は次のとおりです。
![arg4-page1.png](https://qiita-image-store.s3.amazonaws.com/0/46088/88d1c29c-05cc-1b38-95f5-983b27bf821c.png)

1行目で、 SCGetDistance 0 0 66 20 を実行しています。
このイベント(イベントID=0)と座標(0, 66)との距離を計算して、結果を変数20番(名称:ワーキング変数1)に格納します。

その後、通常の条件分岐を使って、変数20番(名称:ワーキング変数1)が 2 以下ならばセルフスイッチAを ON にします。
この条件分岐は、このイベントと指定した座標との距離が 2 よりも近いという意味になります。

このイベントはルートを指定して進ませているので、この条件分岐を使わなくてもよいと思いますが、固定ではない移動をする場合などは必要になると思います。

![SCGetDiatance_arg4_1.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/52956708-9dce-1b95-d695-0217d1d2e01c.gif)

余談ですが、セルフスイッチAをONにした後の設定の２ページ目は次のとおりです。
![page2.png](https://qiita-image-store.s3.amazonaws.com/0/46088/bed27f3d-102d-42d3-ad53-1886b8a14c00.png)

# 参照
[githubでプラグインを公開中](https://github.com/sakura-crowd/RMMV/tree/master/SCGetDistance)
　このプラグインを使う場合は、上記の github をご利用いただくか、[SCGetDistance.js](https://raw.githubusercontent.com/sakura-crowd/RMMV/master/SCGetDistance/SCGetDistance.js)のリンク先を保存してください。 

[パンプキンヘッドとお菓子の迷宮：無料ゲーム配信中！ [ふりーむ！] ](http://www.freem.ne.jp/win/game/12989)
　このプラグインを使った作品です。  


# 謝辞
今回のサンプル画像で[ぴぽや](http://piposozai.blog76.fc2.com/)様の画像を使わせていただきました。
ツクールMVのプラグイン「Terrax Lighting system」で簡単に照明を作る

洞窟で明かりをつける演出としては、中心を半透明の円で塗りつぶした黒地の画像などを使う方法があります。
これはシンプルに実装できる反面、プレイヤーが画面端にいったときや、複数の明かりがある場合に対応しづらいです。

今回は、プレイヤーのまわりの明かりだけではなく、スイッチで照明をつけるために、[
Terrax Lighting system](http://forums.rpgmakerweb.com/index.php?/topic/49339-terrax-lighting-system/) を使わせていただきました。
とてもきれいな照明を手軽に表示できました。

![明かりをつける2.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/28303484-94f5-12b1-519e-18fd462c097c.gif)


具体的な使い方は、このプラグインの中にデモプロジェクトやテキストがあります。
私もそれを見て使うことができました。  
ただ、英語表記だったので、デモを見ながら少し手間どりました。
今後、思い出しやすいようにここに実装した範囲で記録します。

## プラグインの描画の ON/OFF を切り替える。
### プラグインの描画を ON にする。
![暗くなる1.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/a5df3d1a-fdca-b200-7988-b5cc2fbe04f1.gif)

プラグインコマンドで ```Light activate``` を呼び出すことで、プラグインの描画を ON にできます。
![2016-10-17_201804.png](https://qiita-image-store.s3.amazonaws.com/0/46088/a3e5a106-20eb-fdd5-8159-5a5bdba1711c.png)

洞窟に入った場所のイベントなどで呼び出すと、その時点で暗闇と照明が描画され始めます。

### プラグインの描画を OFF にする。
![明るくなる1.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/3c1af300-cddc-0cf5-1a85-5060e180c17f.gif)

プラグインコマンドで ```Light deactivate``` を呼び出すことで、プラグインの描画を OFF にできます。
![2016-10-17_201744.png](https://qiita-image-store.s3.amazonaws.com/0/46088/67c6b1f3-c3c0-80f3-5569-3b5991566736.png)

洞窟を出た場所のイベントなどで呼び出すと、その時点で暗闇と照明が描画されなくなります。

## 明かりをつける
### プレイヤーの明かりの設定
プラグインコマンドで ```Light radius 100 #FFFFFF``` を呼び出します。
100 は大きさでその後はカラーコードです。これらはユーザが自由に設定できます。

プラグインの描画を OFF にすることで無効にできます。

### イベントに明かりをつける
イベントのメモに ```Fire 450 #FFCC00``` と記述します。
450 は大きさで、その後はカラーコードです。これらはユーザが自由に設定できます。

## 明かりをつけたり、消したりする
![明かりをつける1.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/94b8c161-fa8d-9cb6-bc1d-c22cab8e46dc.gif)

明かりを制御するには、まず明かりに ID を割り振ります。
![2016-10-17_195656.png](https://qiita-image-store.s3.amazonaws.com/0/46088/b5fad955-6291-e0f3-62b4-6e17004349ce.png)

メモの欄に```Fire 450 #FFCC00 1```と書いてあります。
これが明かりの設定です。
450 は明かりの大きさ、その後はカラーコードです。
そのあとの 1 というのが ID になります。
これはユーザが自由に決められるようです。

この ID=1 の明かりをつけたい場合は、プラグインコマンドで```Light on 1```とします。
![2016-10-17_195710.png](https://qiita-image-store.s3.amazonaws.com/0/46088/741971d3-4706-4481-1415-6ba87d0a40ec.png)

この明かりを消したい場合は、プラグインコマンドで```Light off 1```とします。
![2016-10-17_195723.png](https://qiita-image-store.s3.amazonaws.com/0/46088/a7e58633-2358-873c-d743-356b50cf0d30.png)

## 状態を復元する
私の使い方が悪いのかもしれませんが、明かりの ON/OFF がうまく復元されませんでした。
そのため、明かりの ON/OFF と連動しているスイッチで変数を変更し、その変数を条件にして起動時に light on/off を呼び出しました。

次がそのイベントです。
![2016-10-17_195201.png](https://qiita-image-store.s3.amazonaws.com/0/46088/4d4a2c8f-3f6c-8c84-d14c-126f8a6d3164.png)

最初の２つは、プレイヤーの明かりの色と大きさを設定し、すぐに暗闇・照明を無効にしています。
そのあとの条件分岐が、明かりの状態を復帰させるための処理です。

# 参照
[Terrax Lighting system - JS Plugin Releases (RMMV) - RPG Maker Forums](http://forums.rpgmakerweb.com/index.php?/topic/49339-terrax-lighting-system/)
VMware Fusion 上の FreeBSD でシリアルコンソールを使う

OS起動メッセージをテキストとしてコピーしたり、シングルユーザモードでの操作時にコピー&ペーストする場合は、シリアルコンソールが使えると便利です。

VMware Fusion 上の FreeBSD でシリルコンソールを使う手順を書きます。
以下の手順は VMware Fusion Professional 8.5.0、FreeBSD 9.3-RELEASE で確認しています。

VMware で仮想マシンのシリアルポートを有効にする (telnet)
--------------------------------------------------------

VMware Fusion の仮想マシン設定でシリアルポートの追加はできますが、ここで作成したシリアルポートはファイル出力しかできないため、シリアルコンソールとして使用できません。
仮想マシン設定ファイル (.vmx) ファイルをテキストエディタで編集して双方向通信可能なシリアルポートを設定します。
なお、ファイルを間違って編集した場合、仮想マシンが起動しなくなりますので、注意が必要です。

対象となる仮想マシンを停止した後、仮想マシン設定ファイル (.vmx) ファイルに以下の内容を追加します。

```
serial0.present = "TRUE"
serial0.fileType = "network"
serial0.fileName = "telnet://127.0.0.1:5555"
serial0.startConnected = "TRUE"
```

`serial0.fileName` の値は http://kb.vmware.com/kb/2004954 を参考にしています。
この例では、IPアドレス 127.0.0.1、ポート番号 5555、プロトコル telnet でシリアルポートにアクセス可能となります。
127.0.0.1にアクセスできる同一ホスト上のユーザからは誰からでもアクセスできるので、セキュリティには注意が必要です。
ポート番号は他で使われていない、利用可能なポート番号を指定します。

仮想マシン設定ファイル (.vmx) 編集後に VMware Fusion の仮想マシン設定で確認すると、取り外し可能デバイスにシリアルポートが追加され、詳細を確認すると「カスタムのサポートされていない設定」と表示されます。

FreeBSD でシリアルコンソールを有効にする
----------------------------------------

シリアルコンソールとビデオコンソールのデュアルコンソールを有効にするため、ブートブロック設定ファイル `/boot.config` に以下を設定します。

```sh:/boot.config
-Dh
```

シリアルコンソールに接続する
----------------------------

仮想マシンを起動し、telnetコマンドでシリアルコンソールに接続します。
接続先は仮想マシン設定ファイル (.vmx) で設定したIPアドレス、ポート番号です。
なお、`BTX loader 1.0  BTX version is 1.02` の行だけはシリアルコンソールではなく通常のコンソールに表示されます。

```shell-session
$ telnet 127.0.0.1 5555
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
/boot/config: -Dh
Consoles: internal video/keyboard  serial port  
BIOS drive C: is disk0
BIOS 638kB/522176kB available memory

FreeBSD/x86 bootstrap loader, Revision 1.1
(root@snap.freebsd.org, Thu Jul 10 23:35:10 UTC 2014)
Loading /boot/defaults/loader.conf 
/boot/kernel/kernel text=0xf0bf90 data=0x13d720+0x123388 syms=[0x8+0x149fb8+0x8+0x15ac2e]
/
Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [/boot/kernel/kernel]...               
Copyright (c) 1992-2014 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 9.3-RELEASE-p43 #0: Sat May 28 00:19:32 UTC 2016
    root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64
gcc version 4.2.1 20070831 patched [FreeBSD]
(中略)
FreeBSD/amd64 (freebsd9) (ttyu0)

login:
```
ElectronでjQueryがundefinedになったけど2行で解決した話


##経緯
テレビ画面のプロトタイプを作るってことで、Electronでサクッと作るのがいいなと思い、jQueryでサクッと作ろうと思ったらいきなりつまづいたので、忘備録。


##現象
```html

	<script type="text/javascript" src="js/jquery-3.1.1.min.js"></script>
	<script type="text/javascript" src="js/script.js"></script>
	
```

こんな感じでインポートしたらコンソールにエラー出た

```
$ is not undefined
```

Chromeで動くのになんでや。。。
サクッと解決したい！

##解決策
サクッと解決2ステップ

1. npmにjqueryをインストールする

```

$ npm install jquery --save

```

2. jqueryと自分の作ったjavascriptの間にこれを入れる

```html

<script>window.$ = window.jQuery = require('jquery');</script>

```

これで解決しました。
UIVideoEditorControllerの「保存」のテキスト変更

UIVideoEditorControllerの右側のボタンが「保存」となっていたので変更したくて調査。

ラッパークラスを作成して、表示前に強引にボタンのタイトルを変更することで実装できたのでメモ。

`UINavigationButton`っていうクラスだったが、
調べると`UIButton`を継承しているので、キャストしてタイトル変更。
ただ、もしかすると審査が通らないかもしれないので、審査通らなかったら諦めよう。

```swift
///
/// CstmVideoEditorController
///
class CstmVideoEditorController: UIVideoEditorController {
    ///
    /// will appear
    ///
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        for v in self.navigationBar.subviews {
            if v is UIButton {
                ///
                /// 右側のボタンか判定
                ///
                if v.frame.origin.x > self.view.w * 0.5 {
                    (v as! UIButton).setTitle("Done", for: UIControlState.normal)
                    (v as! UIButton).setTitle("Done", for: UIControlState.disabled)
                    (v as! UIButton).setTitle("Done", for: UIControlState.selected)
                    (v as! UIButton).setTitle("Done", for: UIControlState.highlighted)
                }
            }
        }
    }
}
```


もっといい方法あればコメント頂きたく。。。

m( _ _ )m
MAC SierraでASP.NET その２ ~始めてのWEBアプリ~

Macで.NETやる意味があるか判らないけど、
とにかく、WEBアプリケーションを.NETで作ってみるというお話し。


## 事前準備

Macの.NET環境周りの設定は、前回の記事を参照してね
[MAC SierraでASP.NET ＆ Hello World! - Qiita](http://qiita.com/madaran0805/items/3344d502657072b66aa0)

それと、NodeJSとnpmは入れておいてね。
NodeJSはｎで管理すると多分幸せ。
以下の通り、最新にしておきましょう。
諸事情により、最新にするのが難しい場合は・・・他を当たって下さい Orz。

```
sudo npm cache clean -f
sudo npm install -g n
sudo n latest
```

## プロジェクトを作ってみる

### 1. Yoとかgulpとか使うのでインストール（すでに実装済なら次へ）

```
npm install -g yo bower grunt-cli gulp
```

### 2. ASPのジェネレーター入れます。

```
npm install -g generator-aspnet
```

### ３. プロジェクトフォルダ作って実行してみます。

```
% mkdir myyo
% cd myyo
% yo aspnet 
````

### ４. とりあえず、BootstrapによるWEBアプリケーションを選択してみる。

```
     _-----_     ╭──────────────────────────╮
    |       |    │      Welcome to the      │
    |--(o)--|    │  marvellous ASP.NET Core │
   `---------´   │        generator!        │
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? What type of application do you want to create? Web Application <--WebApplication選択
? Which UI framework would you like to use? Bootstrap (3.3.6) <--Bootstrap選択
? What's the name of your ASP.NET application? webapp <--プロジェクト名入力
 
____
LOG省略・・・俺、良い仕事してるYo！・・・みたいな感じだYo!
____

Your project is now created, you can use the following commands to get going
    cd "webapp"
    dotnet restore
    dotnet build (optional, build will also happen when it's run)
    dotnet ef database update (to create the SQLite database for the project)
    dotnet run
```

Yoで生成されたディレクトリに移動して、言われたとおりコマンドを叩いてみる

```
cd webapp
dotnet restore
dotnet build
dotnet ef database update
dotnet run
```

旨くいけば、ポート5000でWEBサイトが確認できます。

http://localhost:5000/

![161017-0002.png](https://qiita-image-store.s3.amazonaws.com/0/46529/9c6c2dd0-8181-396a-2b07-5db3b51bae6d.png)


生成される内容とかまでは、まだ欲判りませんが・・・
とりあえず、Scaforld的な感じで、MVCモデルが完成されますね。
この辺りは、VisualStudioで作成されるテンプレートと、殆ど一緒のようです。

この後は、Visual Studio Codeでファイル開いてみたりして、稼働を確認して見たり、何か弄ってみたり、ラジバンダリ・・・（古っ

あとは、現行プロジェクトを、なんらか借りてきて、
そのまま開発環境を移行できるか確認して見ることにします。

以上
ウィキデータの紹介#2

# 歴史
ウィキデータのプロジェクトはアレン人工知能研究所、ゴードン・アンド・ベティ・ムーア財団、グーグルの3団体から総額130万ユーロの寄付を受け、2012年10月30日にスタートしました。

グーグルは2010/7月、オープンな情報データベース「Freebase」を運営するMetawebを買収し「ナレッジ・グラフ」で利用してきましたが、2014年10月に「Freebase」のデータを全てウィキデータに移送し、「Freebase」プロジェクトを閉じました。
https://plus.google.com/109936836907132434202/posts/bu3z2wVqcQc
グーグルのDenny Vrandecicはウィキメディア・ドイツのメンバーであると同時にウィキデータのリーダーであり、2015年にウィキメディア財団の理事にもなっています。

2012年よりプロジェクトを牽引したドイツのウィキメディア・コミュニティは下記３段階での計画を立案、実施しました。
1.集中型の言語間リンク – 異なる言語の同じトピックのウィキペディア記事をリンク
2.全ウィキペディア向けの情報ボックス用の中心の場所の提供
3.ウィキデータ内のデータに基づく一覧記事の作成と更新

これにより、2013年3月には全世界のウィキペディアからウィキデータにつながり、それまでの全ての言語版のウィキペディア間で張られていたリンクが全てウィキデータで集中管理されるようになりました。

![Wikidata_before.png](https://qiita-image-store.s3.amazonaws.com/0/35320/136794b9-31e1-25d3-8dd7-3de78da176e0.png) ![Wikidata_after.png](https://qiita-image-store.s3.amazonaws.com/0/35320/506bef44-3ac6-9f24-ed6d-d4084b893a7c.png)

現在ウィキデータの項目数は2400万件以上、項目内の文は1億件以上となっています。
![https   tools.wmflabs.org wikidata todo stats.php.png](https://qiita-image-store.s3.amazonaws.com/0/35320/0d4f869a-d206-fb2a-83a9-079520a7861a.png)
ウィキペディアからのインポートはもちろん、それ以外のソースからのインポート、ボットによる自動更新、コミュニティの手作業による更新などが行われています。

# 検索エンジンから見たウィキデータ
出資企業からも明らかですがこのウィキデータの構造化データには検索エンジン各社も注目しています。例えばグーグルのナレッジ・グラフのように検索エンジンがコンテンツそのものを（一部）公開しているのは広告をクリックするまでの滞在時間を長くする意図があるようです。これにウィキペディアからの情報が比較的多く使われていますが、ウィキデータに切り替えるとCC0なので制約なしに使え、クレジット表記も不要です。
![Matsudo-google.png](https://qiita-image-store.s3.amazonaws.com/0/35320/2f58e005-bda9-3465-aaf7-8ac1cba8de2d.png)
（グーグルでの「松戸市」検索結果。右半分がナレッジ・グラフ）

マイクロソフトのBingも同じようなことをやっています。
![Matsudo- Bing.png](https://qiita-image-store.s3.amazonaws.com/0/35320/0d777be3-4331-a416-0e84-528d01aaac26.png)
（出典：マイクロソフトBing）

2015年にはロシアの検索エンジンYandexもウィキデータに投資したとの報も下記記事にあります。

ただし、誰でも編集できるデータには誤りやいたずらが混入するリスクは当然あります。これについてはオープンなデータのコミュニティでよくあることで、コミュニティ側は楽観視しているものの、ビジネス利用を考えている人たちにとっては懸念が払拭しきれていないようです。
上にある棒グラフではウィキデータの文の数が１億件に達したことを示していますが、その下半分の面積のオレンジ色の部分は出典が無い文を表しています。ウィキデータではできるだけ各文に出典を明記することが推奨されており、品質を上げる努力が行われています。
（出典：[Unsourced, unreliable, and in your face forever: Wikidata, the future of online nonsense](http://www.theregister.co.uk/2015/12/08/wikidata_special_report/)）

[ウィキデータの紹介#1](http://qiita.com/higa4/items/b5c8982a3bd33fc16263) | [ウィキデータの紹介#3](http://qiita.com/higa4/items/77239543efc0a76c04cd)