OmniAICreator/Qiita-1.07M huggingface dataset:
mobile backend のデバイス登録処理の実装

mobile backend のデバイス登録処理の実装

クイックリファレンスがわかりにくかったのでメモ

```objective-c:AppDelegate.m

#import <NCMB/NCMB.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // デバイス登録
    NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
    NSString *applicationKey = [infoDict objectForKey:@"ApplicationKey"];
    NSString *clientKey = [infoDict objectForKey:@"ClientKey"];
    [NCMB setApplicationKey:applicationKey clientKey:clientKey];

    if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) {
        UIUserNotificationType type = UIRemoteNotificationTypeAlert |
                                      UIRemoteNotificationTypeBadge |
                                      UIRemoteNotificationTypeSound;
        UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:type
                                                                                categories:nil];

        [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeAlert |
          UIRemoteNotificationTypeBadge |
          UIRemoteNotificationTypeSound)];
    }
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NCMBInstallation *currentInstallation = [NCMBInstallation currentInstallation];

    [currentInstallation setDeviceTokenFromData:deviceToken];
    [currentInstallation save:nil];
}

```
EC2 : Rails, MySQL, Redis, nginx, Unicorn 環境構築

## 環境構築
* EC2インスタンス生成

* EC2インスタンスのSecurity groups確認 

``` sh
Ports 22 / Source : MyIP 
Ports 80 / Source : Anyway 
Ports 8081 / Source : Anyway 
```
* SSHでEC2インスタンスへConnect
 
* yumアップデート 

``` sh
sudo yum update
```

** sudo su - rootに変更してからやった方がいいかもです。
** またはuserを追加してそのuserに切り替えて使う。
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html

* 基本インストール 

``` sh
sudo yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison git
```

* nginxインストール 

``` sh
sudo yum install nginx
sudo /etc/init.d/nginx start
```
* redisインストール

```sh
sudo yum --enablerepo=epel install redis
```
起動する。ついでに自動起動の設定もする。

```sh
sudo service redis start
sudo chkconfig redis on
```
* mysqlインストール 

``` sh
sudo yum install mysql-server mysql-devel
mysqladmin -u root password <new password> 
sudo service mysqld start
```

* ruby-buildインストール

``` sh
git clone git://github.com/sstephenson/ruby-build.git
cd ruby-build
sudo ./install.sh
```

* rbenvインストール

``` sh 
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bashrc
exec $SHELL -l
``` 

* rubyインストール

``` sh
rbenv install -l
rbenv install 2.5.0
rbenv rehash
rbenv global 2.5.0
``` 

* bundlerインストール(bundler -vでバージョン確認ができない場合) 

``` sh
gem install bundler --no-rdoc --no-ri
``` 

* rails インストール 

``` sh
sudo gem install rails
``` 

* Rails アプリケーション新規作成

``` sh
rails new <アプリ名> -d mysql
``` 

-dを指定しない場合はsqliteが設置されている必要がある。

* Gemfile修正（#を外す）

``` sh
cd <アプリ名>
vi Gemfile
gem 'therubyracer', :platforms => :ruby
gem 'unicorn'
bundle install
``` 

* Rails アプリ確認

``` sh
cd <アプリ名>
rails s
``` 

別のタブで `curl -I localhost:3000` 確認

* Unicornインストール

``` sh
gem install unicorn;rbenv rehash
``` 

* config修正

``` sh
cd <アプリ名>
vi config/unicorn.conf

```

``` rb
# in unicorn.conf
worker_processes 2
listen '/tmp/unicorn.sock'
stderr_path File.expand_path('unicorn.log', File.dirname(__FILE__) + '/../log')
stdout_path File.expand_path('unicorn.log', File.dirname(__FILE__) + '/../log')
preload_app true
```

* nginxの設定ファイル編集 

``` sh
sudo vi /etc/nginx/nginx.conf
``` 

``` rb
# in nginx.conf
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    upstream unicornapp {
        server unix:/tmp/unicorn.sock;
    }

    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://unicornapp;
        }
    }
}
```

* nginx起動

``` sh
sudo /etc/init.d/nginx start
``` 

* unicorn起動

``` sh
cd <アプリ名>
unicorn -c config/unicorn.conf -D
``` 

* 動作確認
Public DNSもしくはPublic IPをブラウザで入力してRailsのWelcome aboardが表示されればOK

## その他

``` sh
sudo /etc/init.d/nginx stop
ps ax|grep unicorn|grep -v grep
``` 

これで表示されるmasterのプロセスをkillする

``` sh
sudo /etc/init.d/nginx restart
```
Vimperator で "IGNORE ALL KEYS" を回避

Vimperator を使っていると，ときどき勝手に "IGNORE ALL KEYS" と表示され Vimperator のキー入力を受け付けなくなる時があります．これは不便なので，.vimperatorrc に設定を追加してこの現象を回避します．

# 問題の再現

Vimperator を使っていると，意図しないタイミングで自動的に ignore モード（と呼ぶのでしょうか？ステータスバーに "IGNORE ALL KEYS (Press \<S-Esc\> or \<Insert\> to exit)" と表示されるアレです）に切り替わってしまい，Vimperator のキー入力を受け付けなくなる時があります．

いろいろなサイトにアクセスして ignore モードに切り替わる条件を調べてみると，どうやらパーセントエンコーディングを含む URL のサイトにアクセスしたときに切り替わるようです．例えば，日本語を含むキーワードで Google 検索した場合や，日本語タイトルの Wikipedia の記事へアクセスした場合などに，自動的に ignore モードに切り替わります．

# 問題を回避する設定

`.vimperatorrc` に以下の `autocmd` を追加します．

```:.vimperatorrc
autocmd LocationChange .* js modes.passAllKeys = false
```

追加したら `:source ~/.vimperatorrc` で設定を読み込みます．

# 解説

全てのページについて，ページを開くときに ignore モードを解除するようなコマンドを自動的に実行できれば，この問題はとりあえず解決できます．先ほどの設定はそれを行うためのものです．

`autocmd` はイベントが発生したときに実行するコマンドを登録します．

```
autocmd {バインドするイベント} {コマンドを実行する URL のパターン} {実行するコマンド}
```

バインドするイベントに `LocationChange` を指定しているので，ページを遷移したときにコマンドが実行されます．URL には `.*` を指定しているので，すべての URL においてコマンドが実行されます．実行するコマンドの先頭に `js` を指定しているので，コマンドは Javascript として実行されます．実行するコマンドには `modes.passAllKeys = false` を指定しているので，キー入力を無視しない（ignore モードにしない）よう設定されます．

# 問題の起こる環境

勝手に ignore モードに入る問題の原因がバグなのか設定のせいなのかアドオンが干渉しているのかさっぱりわからないので，僕がこの問題に直面した環境を晒しておきます（ググっても解決策はおろか同じ問題に直面している人すらほとんど見かけなかったので，Vimperator を使っている全ての人に起こりうる問題ではないのかもしれません）．

|アプリ|バージョン|
|:--|:-:|
|Firefox|35.0|
|Vimperator|3.8.3|
|Stylish|2.0.1|
|セッションマネージャ|0.8.1.6|
|DOM Inspector|2.0.15|

```:.vimperatorrc
highlight Hint font-family: monospace; font-size: 16px; font-weight: bold; text-transform: uppercase; color: white; background-color: red; border-color: ButtonShadow; border-width: 0px; border-style: solid; padding: 0px 1px 0px 1px;
set defsearch=gg
set complete=s
autocmd LocationChange .* js modes.passAllKeys = false
```
Rubyクローラーでユーザーエージェントを指定する


参考文献
https://github.com/ZIGExN/ruby-trailning/wiki/Web%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E6%A4%9C%E7%B4%A2%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9%E6%A7%8B%E7%AF%89%E5%85%A5%E9%96%80

Google検索の仕組み
https://support.google.com/webmasters/answer/70897?hl=ja

#Google
###Googleクローラー
https://support.google.com/webmasters/answer/1061943?hl=ja

```
#(例)
html = open(url, 'User-Agent' => 'Googlebot/2.1')
doc = Nokogiri::HTML.parse(html, nil, "UTF-8")
```

###Yahooクローラー
https://help.yahoo.com/kb/search/SLN22600.html?impressions=true

```
user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36'
html = open(url, "User-Agent" => user_agent
```
簡単なお絵かきアプリのソースコード【Swift】【Xcode6】【初心者】

環境
OS X Yosemite10.10
Xcode6.1.1

#アプリ説明
・ドラッグすることで線がひける
・クリアボタンで描画した線をすべて消せる

![Okkjo9VwcZCPeEO1422338452_1422338487.png](https://qiita-image-store.s3.amazonaws.com/0/63942/d832ed04-80bc-42b5-d4e2-ebc1ea4e59fb.png)


・挙動の動画はこちらから
　 http://youtu.be/bnoDrccX1Tw

・GitHubにソースコードを公開しました。
　 https://github.com/GonKenny/Swift-Sample-drawLine2

#ソースコード
##viewContoroller.swift

```swift
//1.クリアボタンを設置→viewController.swiftにつなげる
//2.新規ファイル→CocoaTouch classのファイル作成（drawView.swift)
//3.Viewを設置→custom classにdrawViewを入力してつなげる
//5.swiftファイルを作成(line.swift)


import UIKit

class ViewController: UIViewController {

    //9.描画エリアを接続
    @IBOutlet weak var drawViewArea: drawView!

    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 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.
    }

    @IBAction func claerTapped(sender: UIButton) {      //1.
        //10.
        var theDrawView : drawView = drawViewArea as drawView    //
        theDrawView.lines = []
        theDrawView.setNeedsDisplay()
        }

}
```

##drawView.swift

```swift
import UIKit

class drawView: UIView {
    
    //6.
    var lines: [Line] = []
    var lastPoint: CGPoint!
    
    
    //4.初期化
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        //self.backgroundColor = UIColor.blackColor() //チェック用
        
    }
    
    //7.
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        lastPoint = touches.anyObject()?.locationInView(self)
    }
    
    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
        var newPoint = touches.anyObject()?.locationInView(self)
        lines.append(Line(start: lastPoint, end: newPoint!))
        lastPoint = newPoint
        
        self.setNeedsDisplay()
    
    }
    
    //8.
    override func drawRect(rect: CGRect) {
        var context = UIGraphicsGetCurrentContext()
        CGContextBeginPath(context)
        
        for line in lines {
            CGContextMoveToPoint(context, line.start.x, line.start.y)
            CGContextAddLineToPoint(context, line.end.x, line.end.y)
        }
        
        CGContextSetRGBStrokeColor(context, 1, 0, 0, 1) //線の色
        CGContextSetLineWidth(context, 10)  //線の太さ
        CGContextSetLineCap(context, kCGLineCapRound)   //線を滑らかに
        CGContextStrokePath(context)
    }
}
```

##line.swift

```swift
//5.line.swiftに書き足す

import UIKit

class Line {
    var start: CGPoint
    var end: CGPoint
    
    init(start _start: CGPoint, end _end:CGPoint){
        start = _start
        end = _end
    }

}
```
書き加えた順番に番号をふってあります。
もし声があれば、制作方法の動画も作ります。

#ポイント
* 新規ファイルで新たなクラスを定義した後、identity InspecterのCustom　Classから、新たなクラスを接続。これで、別ファイルのクラスに書いた挙動をつなげられる。
* CGContextSetLineCapで線がカクカクしないようにする

#参考
Learning Swift #6 - Making a Drawing App
https://www.youtube.com/watch?v=8KV1o9hPF5E

まだまだ他の方の制作動画を見ながら真似するだけの段階です。
同じようなswift初心者の方に、少しでも役立てればいいなと思っています。
coda2とKoalaでSassのコンパイル時にどうしてもエラーが出てしまう時の対処法

![koalaのError](https://qiita-image-store.s3.amazonaws.com/0/3153/03a6840c-6fd5-a2d4-4799-e7f7e41d40dd.png)

![koalaのError2](https://qiita-image-store.s3.amazonaws.com/0/3153/ffa1096c-c539-866e-9807-bb25e8161a84.jpeg)

なぜか急にSassのコンパイル時にエラーが乱発した時に対処したことをまとめておきます。
以下の4つをやればエラーが出なくなりました。

1. Koalaのコンパイルボタンを使う。(エラー表示が消えてからボタンを押す)
1. Koalaのファイル毎の各オプションを見直す
1. 一旦Koalaから該当のsassファイルを消して、もう一度追加し直す
1. Coda2を再起動する

# Koalaのコンパイルボタンを使う

自動コンパイルでエラーが頻繁になってきたら、都度、コンパイルボタンを押すようにしたらうまくいくことがありました。

# Koalaのファイル毎の各オプションを見直す

![Koalaの設定.jpg](https://qiita-image-store.s3.amazonaws.com/0/3153/331d4255-e033-5c9c-c656-820275b1a618.jpeg)
ファイル毎の各オプションで、Compassを使っていないのに、Compassにチェックが入っていたり、Source Mapにチェックが入っていたりするとエラーになりました。

# まとめ

対処法の3、4ですが、追加しなおしたりすることで、設定の異常が修正されたりするのでしょうか。。。自分はとりあえず使っているだけの状態なので、上記4つの方法で解決していましたが、根本的な対処法は、エラーの文章が「individual stylesheets must be in the sass directory.」なので、config.rbのパス指定が間違っている可能性もあります。一度確認してみるといいかもしれません。
プロジェクトのディレクトリ名に日本語を使っている場合もエラーになりますね。
alternativesを使ってJAVA_HOMEを取得するワンライナー

## はじめに
linuxでaleternativesを使ってjavaを設定している場合、今使ってるjavaが実際どこにインストールされてるか分かりづらかったりするので、一発で今使ってるJavaがどこにあるかを取得するためのワンライナーを考えてみました。

## 1.alternatives --displayコマンド経由
alternatives --display <name>を使うと今のバイナリのリンクがどこに張られているか設定が確認できるので、そこから取得します。言語設定によって出力内容が変わるっぽいので日本語と英語両方対応出来るようにしてます。

```bash
# 日本語: リンクは現在 /usr/java/jdk1.8.0_25/bin/java を指しています。
# 英語：　link currently points to /usr/java/jdk1.8.0_25/bin/java
$ alternatives --display java | grep -P "(リンク|link)" | sed -E 's/^.+\s(\S+)\/bin\/java(\s.+)?$/\1/g'
/usr/java/jdk1.8.0_25
```

## 2.readlink経由
1を書いた後、よく考えたらalternativesのシンボリックリンクの向き先を直接取得すればいいじゃんと思いついてしまいました。こっちの方が楽だと思います。

```bash
$ readlink /etc/alternatives/java | sed -e 's/\/bin\/java//g'
/usr/java/jdk1.8.0_25
```
Swiftでビューを操作する

2014年に行われたWWDCで発表されて以来、話題になっているSwift言語を勉強してみたい！iOSアプリを開発してみたい！という方は増えてきていると思います。なので、Swift言語を使ったiOS開発をしてみたいという人向けに参考になる記事を書いていこうと思います！


今回は、iOSアプリ開発の中でも最も使われる基本的なものの一つViewについて解説していきます。


こちらも参考に


* [iOSアプリ初心者が覚えておきたい10のUIクラス](http://creatorhiro.com/archives/609)
* [売れるiOSアプリが作れるようになるおすすめの本８選](http://creatorhiro.com/archives/525)
* [SwiftでViewControllerを使う](http://qiita.com/h_nagami/items/66dc637463f98716bfa5)
* [Swiftでアニメーション[CoreAnimation編]](http://qiita.com/h_nagami/items/0ad8f8ef5bc23de21e1e)
* [Swiftでジェスチャーの追加](http://qiita.com/h_nagami/items/06a87514c49dd86c38ad)


##Viewとは？
ユーザーに画像やテキスト、図形などのオブジェクトを見せるために使われる要素です。iOS開発では、UIKitというFrameworkを呼び出して使います。

Viewオブジェクトとして以下の物が提供されています。

- *UIView*
- *UIImageView*
- *UITextView*
- *UITextField*
- *UILabel*
- *UIButton*
- *etc...*

これらのオブジェクトを組み合わせていくことで、画面を構成していきます。

##ビューの生成
さて、ビューを表示するためにはビューを生成する必要があります。まず、ビューを生成するためにはビューの色とサイズの設定が必要です。ビューのサイズと背景を設定するためには、CGRectとUIColorクラスを使います。

> サイズの生成：*CGRectMake(x, y, width, height)*
> 色の生成　　：*UIColor.whiteColor()*
> ビューの生成：*UIView(frame: rect)*

ビューを追加するコードを書いてみます。ここでは、Playgroundを利用した例を挙げます。

```swift:view.playground
// サイズを生成 (x, y, width, height): x,yは表示位置
var rect    = CGRectMake(0, 0, 100, 100)
// 色を生成
var bgColor = UIColor.blueColor()

// 生成したサイズを使って、ビューを生成
var view    = UIView(frame: rect)
// ビューの背景に色を設定
view.backgroundColor = bgColor
```

この手順で、サイズが100x100で背景色がブルーのビューが生成されます。

次に、画像を表示するビューUIImageViewです。example.pngという画像を表示します。

```swift:imageview.playground
// イメージオブジェクトを生成
var _image = UIImage(named: "example.png")

// イメージオブジェクトをイメージビューにセット
var imageView = UIImageView(image: _image)
```

example.pngを表示したビューが生成されます。ImageViewの場合は、デフォルトでイメージのサイズが適用されるのでサイズ指定をしていません。

##エフェクトのつけ方

ビューは基本的に、初期状態では装飾や変形等は特にありません。しかし、パラメーターを設定することで角丸やシャドウなどのエフェクトをつけることができます。ビューにエフェクトを掛ける時の多くは、ビューのlayerにパラメータをセットします。

```swift:effectView.playground
// 角丸
view.layer.cornerRadius = 2.0 

// シャドウ
View.layer.shadowColor = .blackColor() /* 影の色 */
View.layer.shadowOffset = CGSizeMake(10.0f,10.0f) /* 影の大きさ */
View.layer.shadowOpacity = 0.5 /* 透明度 */
View.layer.shadowRadius = 10.0 /* 影の距離 */
```

##ビューの上に別のビューを表示する
あるビューAの上に別なビューBを表示するためには、ビューAにビューBを必要があります。ビューを追加するためには次のメソッドを使います。

####*追加*

> ビューの追加：*viewA.addSubview(viewB)*

ビューにはタグをつけることができます。あらかじめビューにタグをつけておくことで、タグを利用して特定のビューを取り出すことができます。

####タグ

```swift:tag.playground
var tagViewB = 27

viewB.tag = tagViewB
viewA.addSubview(viewB)

var fetchedViewB = viewA.viewWithTag(tagViewB) // viewAの中からviewBを取り出す 
```

こうしてタグを設定しておけば、一度追加してしまったビューもあとから取得することができます。

####*削除*

１度追加したビューが必要なくなった時は、ビューを削除することができます。ビューを削除するには、以下のメソッドを利用します。

> ビューの削除：*viewB.removeFromSuperview()*

ビューを削除するには、ビューのオブジェクトを維持しておくか、もしくはタグを使ってビューを取得し削除します。削除する例を挙げてみます。

```swift:removeView.playground
// 維持しておいたビューを利用する
viewB.removeFromSuperview()

// タグを利用する
var fetchedViewB = viewA.viewWithTag(tagViewB)
fetchedViewB.removeFromSuperview()
```

上記のようにビューを削除することができます。
Go by Example: Range


(この記事は [Go by Example: Range](https://gobyexample.com/range) を翻訳したものです。)
rangeは様々なデータ構造の要素をイテレーションするものです。これまでに学んできたデータ構造とrangeをどう使うか見てみましょう。

```go
package main

import "fmt"

func main() {

	// ここではsliceの中の数字を合計するためにrangeを使います。
	// arrayでも同じように動きます。
    nums := []int{2, 3, 4}
    sum := 0
    for _, num := range nums {
        sum += num
    }
    fmt.Println("sum:", sum)
    
	// sliceとarrayのrangeはそれぞれのエントリーのindexと値を提供します。
	// 上記のものは、indexを必要としておらず、blankを示す _で無視しています。
	// indexを走査する用途も実際にはあります。
    for i, num := range nums {
        if num == 3 {
            fmt.Println("index:", i)
        }
    }
    
    // mapにrangeを適用する場合は、key/valueのペアでイテレーションします。
    kvs := map[string]string{"a": "apple", "b": "banana"}
    for k, v := range kvs {
        fmt.Printf("%s -> %s\n", k, v)
    }
    
    // stringにrangeを適用する場合は、Unicodeの数字をイテレーションします。
    // 最初の値は文字のindexで、2つ目の値は文字(unicodeのその字を表す数字)そのものです。
    for i, c := range "go" {
        fmt.Println(i, c)
    }
}

```


```
	
$ go run range.go 
sum: 9
index: 1
a -> apple
b -> banana
0 103
1 111
```
【保存版】仕事受託提案文のテンプレート

# はじめに
クラウドワークス、ランサーズなどでの使用を想定した、仕事受託提案文のテンプレートです。

案件の募集を見て仕事を受けたいな、と思ったけれど
ゼロから提案文を考えたりするのも大変だし、どの粒度で書いたら良いか...
と悩んだ際に是非利用してください。

※ 喜板一郎(きいた いちろう)さんは架空のシステムエンジニアです。

# 全文

```
神奈川県在住で、システム開発会社勤務の喜板一郎(きいた いちろう)と申します。32歳です。
アメリカの4年制大学でコンピュータサイエンス学部を卒業後、
秋葉原のシステム開発会社に勤めシステムエンジニアをしています。

現在フルタイムで企業向けiOSアプリの開発をしております。
[補足文]

今回、[クライアント様名]様の「[案件名]」にご協力できるかと思い連絡致しました。

■ご提案
1. 実装、お客様環境での動作確認
　仕様詳細内容を確認後、アプリ実装作業を行います。
　完了後、お客様環境での動作確認までサポート致します。

◼︎その他
　日中は会社勤務しておりまして、作業するのは深夜・早朝になります。
　電話は時間帯によっては出られない場合があります。ご相談ください。
　メールは常時確認しております。
　納期厳守で作業します。

　平日の13:00-17:00の時間帯に1時間ほどお打ち合わせ可能です。
　秋葉原に勤務しておりまして、秋葉原駅近辺ですとありがたいです。

[実績]

これをご縁に今後より良い関係を築けていけたらと思っております。

どうぞ、よろしくお願い致します。
```

# 解説

## 前半部分
まず在住地、本名、年齢を明らかにします。また簡単に学歴や勤務先の情報を書いておきます。

```
神奈川県在住で、システム開発会社勤務の喜板一郎(きいた いちろう)と申します。32歳です。
アメリカの4年制大学でコンピュータサイエンス学部を卒業後、
秋葉原のシステム開発会社に勤めシステムエンジニアをしています。
```

現在の状況を書きます。

```
現在フルタイムで企業向けiOSアプリの開発をしております。
[補足文]

```

上記ではiOS案件への提案を想定していますが、それ以外の案件の場合補足文を足します。

案件内容に対して「興味を持って調べている」「最新情報を追っている」「サンプルコードを書いている」など関連のある行為を書きます。

少なくとも興味を持って調べているはずですよね。

例えば、電子書籍作成代行案件の場合は以下です。

```lang:補足文例
最近は電子書籍出版に興味を持ち、日々調査を続けています。
```

続いてクライアント様名と案件名を書きます。
案件名を書くことで受け取った側の確認にもなります。

くれぐれもクライアント様名を間違えないようにしましょう。

```
今回、[クライアント様名]様の「[案件名]」にご協力できるかと思い連絡致しました。
```

## 提案部分
提案内容を書きます。

この部分の内容は案件により大きく変わります。

案件内容文を良く読み込み、正確かつ簡潔に記述することを心がけます。

クライアント様が質問をしていたら、この部分に回答を書きます。

```
■ご提案
1. 実装、お客様環境での動作確認
　仕様詳細内容を確認後、アプリ実装作業を行います。
　完了後、お客様環境での動作確認までサポート致します。
```

例えば使用するオープンソースを聞かれていた場合。

```lang:質問回答例
■ご質問への回答
・使用するオープンソース
　AFNetworking、SVProgressHUD、fmdbを使用予定です。
　その他使用する物がありましたら報告致します。
```

## 後半部分
時間や場所や連絡手段などの条件と希望を書きます。

```
◼︎その他
　日中は会社勤務しておりまして、作業するのは深夜・早朝になります。
　電話は時間帯によっては出られない場合があります。ご相談ください。
　メールは常時確認しております。
　納期厳守で作業します。
```

私は少なくとも1時間おきにはメールを確認できるので「メールは常時確認しております」と書いています。

電話可能な時間が限られる場合「電話は無理です」と言うよりも「ご相談ください」としておいた方がスマートかと思います。
また(私もそうですが)連絡手段として電話を使いたくない場合でも上記の書き方で良いと思います。

絶対に電話不可！という場合はその旨を書きましょう。

続いて、打ち合わせ可能な時間と場所を伝えます。

```
　平日の13:00-17:00の時間帯に1時間ほどお打ち合わせ可能です。
　秋葉原に勤務しておりまして、秋葉原駅近辺ですとありがたいです。
```

実績とやる気を伝える文を書きます。
実際にクライアント様にお話を聞いてみると、この部分が決め手となりました、という方が多いです。
重要。

もし実績がゼロの場合、やる気を伝えます。
例として実績なしでのBluetooth Low Energyアプリ作成案件の場合。

```lang:やる気を伝える文例
BLE書籍を読み込み、サンプルアプリを作り、BLE関連の最新ニュースはすべてチェックしています。今回、◯◯様のBLEアプリ作成に是非協力したいと思っております。
```

締めの言葉。

```
これをご縁に今後より良い関係を築けていけたらと思っております。

どうぞ、よろしくお願い致します。
```

# おわりに
提案の採用には「提案内容」「実績」「これまでの評価」が重要です。
その他の部分で損をしないよう、このテンプレートを活用してください。
ImageMagick > 画像内の特定色のピクセル数をカウントする

動作環境


    CentOS 6.5
    ImageMagickインストール済み

画像ファイルの中のある色のカウントを数えたいとする。

カウントしたい色のRGB値がわかっていればImageMagickに含まれるconvertコマンドを使えばいい。

    convert Screenshot.png -fill black +opaque "rgb(128,128,128)" -format %c histogram:info:

上記の実行結果として、以下のような情報が得られる

     900298: (  0,   0,   0) #000000 black
         78: (128, 128, 128) #808080 fractal 

上記のコマンドではRGB値が(128,128,128)のピクセル以外をすべて黒にした上で、黒色と(128,128,128)の色のカウントを数えている。

<hr>

    convert Screenshot.png -format %c histogram:info:
を実行すると、二値化を行わずにあらゆる色のカウント数を得られる。これはこれで使えるかも。
日報を自動作成する

#ずぼらサラリーマンシリーズ第１弾

##作業は順調なんです！！！えらい人にはわからないんです！！！

```lang:本日絶好調として日報を作成して帰りたい.vbs
Dim objWShell

 Set objWShell = CreateObject("WScript.Shell")

d = "mailto:report@example.jp" 
d = d & "?body=順調です&subject=[日報]jtakasuryuji" 
d = d & "%20" 
d = d & replace(FormatDateTime(Now, 0),"/",".")

objWShell.Run d,0,false
```

##本文までイケテル版。

http://qiita.com/salmonosushi/items/7f63eb2e59d9c9cd01a6 のVBScript版を思いついたので

```nippo書いたら帰れる.vbs
Dim objWShell
Set objWShell = CreateObject("WScript.Shell")
strToday = left(FormatDateTime(Now, 0),10)

'▽▽▽▽▽▽▽▽▽▽書き換えよ
yourname="小栗旬"
yoursign="開発部 シュレッダー係 小栗旬 <oguri@example.com> (内線 110)"

yourname=replace(yourname ," ","%20")
yoursign=replace(yoursign ," ","%20")

d = "mailto:#nippo;" 
d = d & "?subject=[日報]" & yourname
d = d & "%20" 
d = d & replace(strToday ,"/",".")
d = d & "&body=" 
d = d & "宛先各位%0d%0a%0d%0a%0d%0aお疲れ様です。開発部の" & yourname & "です。"

d = d & "%0d%0a%0d%0a添付のとおり日報を作成いたしました。"
d = d & "%0d%0aご確認いただきますよう、よろしくお願いいたします。"

d=d & "%0d%0a%0d%0a以上%0d%0a%0d%0a" & yoursign

objWShell.Run d,0,false
'''
SeleniumでSinon.jsを使う


例えばこういう感じのJSがあったとして

```javascript
$('button').click(function() {
  navigator.geolocation.getCurrentPosition(
    function(res) {
      var lat = res.coords.latitude;
      var lon = res.coords.longitude;
      $('#pos').text(lat + ':' + lon);
    });
});
```

これをE2Eテストで検証するのはなんかもう色々めんどうなので、sinon.jsでstub化したい。

こういうJSファイルを用意しておいて、

```javascript
// stub.js
sinon.stub(navigator.geolocation, 'getCurrentPosition')
     .callsArgWith(0, { coords: { latitude: 10, longitude: 20 } });
```

テストスクリプトからsinon.js本体とこいつを実行する。

```javascript
var webdriver = require('selenium-webdriver');
var firefox = require('selenium-webdriver/firefox');
var fs = require('fs');
var assert = require('assert');
var By = webdriver.By;
var promise = webdriver.promise;
var flow = promise.controlFlow();
var driver = new firefox.Driver();

flow.execute(function() {
  driver.get('http://localhost:8888/');
  driver.executeScript(fs.readFileSync('./sinon.js').toString());
  driver.executeScript(fs.readFileSync('./stub.js').toString());
  driver.findElement(By.css('button')).click();
  driver.findElement(By.css('#pos')).getText().then(function(text) {
    assert(text === '10:20');
  });
  driver.quit();
}).then(function() {
  console.log('ok');
}, function(e) {
  console.log(e.message);
});
```

（restoreとかははしょってる）

こういうケースの他にも、手で再現しづらい異常系を再現する場合とか、APIのレスポンスをmock化したい場合とかにも使えると思う。

ただしE2Eテストはがんばりすぎると死ぬのでやりすぎには注意しよう。
iOSアプリを作業用BGMムービーっぽく使いたい場合のお手軽手順

# こんな人にオススメ
- iPhoneアプリを作業用BGMとして使いたいけどMacbookの通常音声も同時に聞いて作業したい

# 必要なもの
- iOSアプリを動かせる環境(iPhoneなど)
- Yosemiteの入っている端末(Macbookなど)
- 充電ケーブル
- Quicktime

今回説明するのはiPhone5C+Macbookの手順です。

# 手順
1. iPhoneをMacbookに接続する
2. Quicktimeを起動し、ファイル→新規ムービー接続
3. デフォルトのカメラがFacetimeになっているのでiPhoneに切り替える。また、マイクを内蔵マイクからiPhoneに切り替える

![image](https://qiita-image-store.s3.amazonaws.com/0/41027/039e809f-b8ba-c044-6b50-aa2907d2623c.png)
4. これでMacbookで画面を見つつ音声鑑賞ができます。FFRKでもDreepsでも楽しみ放題です！

![image](https://qiita-image-store.s3.amazonaws.com/0/41027/d2c13d14-7ce6-890c-54d0-3fb5457a3601.png)

ちなみに、Quicktimeの音量ゲージをあげないと音声は聞こえないので注意。

### これって結局・・・
以前リニューアルされたApp Storeにアップロードする動画はこうやって撮影してね！の手順です（録画ボタン押してないだけ）。

最近は作業用BGMとしても使い勝手のいいゲームアプリがたくさんありますので、こんな使い方もありますよというご紹介でした。個人的には050Plusの着信を合わせてチェックしているため、以前よりも電話に出そびれる事件が減ったことが一番助かってます。
NSLog()を気兼ねなく利用しつつ確実に潰す

今更NSLog()です。

「releaseではログを吐かない俺俺Log()作ったからこっち使ってね」なんて決まり事を作ってもどうせ守られる保証なんてありませんし、プロジェクトごとに俺俺Log()を主張しだしてもうるさいだけなので、releaseビルドだけに限定してNSLog()自体を根本から絶ちましょう。

```objc:Hoge.pch
#ifndef DEBUG
#define NSLog(...)
#endif
```

## 追記

「『ログ出力の完全抑制』という意味であれば、それでは確実ではないだろう」という旨のツッコミを頂いたので、標準エラーの出力先を変える方法も追記します。

http://qiita.com/usagimaru/items/5aad44207ae5c74a1927
ActiveAdminのbreadcrumbの日本語化

ActiveAdminの日本語化って、「ja.ymlとかdevise.ja.ymlを準備すれば良いよ」っていうのは、 皆さんご存知の通り。

でも、breadcrumb(パンくずリスト)が日本語化できねぇー。。。ってなってる人、いませんか？

自分、少しハマりました。。。

なので、早速メモ。

Active Adminのパンくずリストって、内部で「breadcrumb_links」っていう関数が呼ばれている。

[Module: ActiveAdmin::ViewHelpers::BreadcrumbHelper — Documentation for gregbell/active_admin (master)](http://www.rubydoc.info/github/gregbell/active_admin/ActiveAdmin/ViewHelpers/BreadcrumbHelper)

で、そのソースみたら、以下の箇所を発見。
> name ||= I18n.t "activerecord.models.#{part.singularize}",

で, ja.ymlファイルに

> activerecord:
> 　　models:
> 　　　モデル名:   '日本語化した文言'

という感じで書いたら、見事に解決。

良かったら、参考にしてください。
mysqlでjoinした結果をdelete

mysqlでjoinした結果をdeleteする場合の構文を忘れがちなので備忘録としてメモ。

## テーブル作成

```sql
--- ユーザーメインテーブル
CREATE TABLE `user_main`(
  `user_id` int,
  `name` text,
  PRIMARY KEY  (`user_id`)
);

--- ユーザーサブテーブル
CREATE TABLE `user_sub`(
  `user_id` int,
  `type` int,
  PRIMARY KEY  (`user_id`)
);
```

## データ登録

```sql
INSERT INTO user_main values(1, 'name1');
INSERT INTO user_main values(2, 'name2');
INSERT INTO user_main values(3, 'name3');

INSERT INTO user_sub values(1, 1);
INSERT INTO user_sub values(2, 2);
INSERT INTO user_sub values(3, 3);
```

## JOINでSELECT

```sql
mysql> SELECT a.user_id, a.name, b.type FROM user_main a
LEFT JOIN user_sub b
ON a.user_id = b.user_id
WHERE b.type = 2;

+---------+-------+------+
| user_id | name  | type |
+---------+-------+------+
|       2 | name2 |    2 |
+---------+-------+------+
1 row in set (0.00 sec)
```

## JOINでDELETE!

ポイントは"DELETE テーブル別名 FROM テーブル名 [AS] テーブル別名"とすること。


```sql
mysql> DELETE a FROM user_main a
LEFT JOIN user_sub b
ON a.user_id = b.user_id
WHERE b.type = 2;

Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM user_main;
+---------+-------+
| user_id | name  |
+---------+-------+
|       1 | name1 |
|       3 | name3 |
+---------+-------+
2 rows in set (0.00 sec)

```
僕はこうやってテスト用画像を用意する。その1 連番の書いてある画像。(Windows & ImageMagick)

**追記：以下の内容はImagemagick6の頃の内容です。Imagemagick7以降は最後に追記しておきます。すみません。**

テストを行うときはこういう事がよくある。
テスト用画像を400枚用意したい。サイズは800x600。色や画像は何でも良いが、互いに識別できるものでないと、テストの時に困る。

そんな時、私ならこうする。

まず800x600の単色の画像を用意する。
私はPaint.netを使っているが、GIMPでも構わない。
テスト用画像を保存する場所においておこう。今回は「800x600_yellow.png」という名前としよう。![800x600_yellow.png](https://qiita-image-store.s3.amazonaws.com/0/55730/14438810-e4ea-e6df-f644-db9f50544450.png)

次。ImageMagickをWindowsにインストールする。
こちらからダウンロードしてインストーラを起動すればおしまい。
http://www.imagemagick.org/script/binary-releases.php#windows

次。コマンドプロンプトを起動し、先ほどの画像を配置したディレクトリへ移動する。
そしてこのようなコマンドを入力する。
```
convert -pointsize 240 -gravity center -annotate 0 "001" -fill black 800x600_yellow.png 800x600_yellow_001.png
```
すると、こんな画像が生成される。
![800x600_yellow_001.png](https://qiita-image-store.s3.amazonaws.com/0/55730/cdbf8789-b014-3c1c-317c-6f7fa76fa1bc.png)

これで、画像の生成は完了。
あとはコマンドをExcelでもなんでも使って量産すれば良い。
400枚くらい簡単に作れる。

追記:
Excelで、1という表記を001に変換したい場合は、=TEXT(A1,"000") ってな感じでTEXT関数を使うと良い。意外と知らない人がいて驚き。

追記（2017年07月08日）：
Imagemagick7だとconvertコマンドは廃止されて、magickというコマンドになったらしいです。こっちの方がWindowsのconvertコマンドと被らないから自分は好きです。こんな感じで文字入りの画像を作れます。背景画像を指定する方法が解らなかったので、塗りつぶしました。参考になれば幸いです。

```command
magick -background yellow -fill black -pointsize 70 label:"001" 001.png
```
追記（2024年02月25日）
このコマンドで文字を入れられるようでした。OpenAIに聞いたら即座に教えてくれました。便利な世の中になりましたねえ…。
```
magick convert 800x600_yellow.png -pointsize 240 -gravity center  -fill black -annotate 0 "001" 001.png
```
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55730/dd5e3b7a-31a7-4221-e37f-81d950d82441.png)
ui-routerでページタイトルを動的に変更する


Anguarjsのシングルページアプリケーションで、viewを変更した時にページタイトルを変更する方法を説明します。

## 事前準備
今回はui-routerモジュールを使用します。
ターミナルから下記のコマンドを実行して、ui-routerをインストールします。(要bower)
angularjsも一緒にインストールされます。

```
$ bower install ui-router
```
## viewの作成

ビューの変更を確認するために下記の3つのビューファイルを用意します。
index.htmlのtitle要素にpage-titleディレクティブを使用しています。


```html:index.html
<!DOCTYPE html>
<html lang="ja" ng-app="myApp">

<head>
    <meta charset="UTF-8">
    <title page-title></title>
</head>

<body>

    <div ui-view></div>
    <script src="bower_components/angular/angular.min.js"></script>
    <script src="bower_components/ui-router/release/angular-ui-router.min.js"></script>
    <script src="app.js"></script>
</body>

</html>

```

```html:home.html
<h1>Home</h1>
<p><a ui-sref="home">home</a></p>
<p><a ui-sref="login">login</a></p>
```
```html:login.html
<h1>Login</h1>
<p><a ui-sref="home">home</a></p>
<p><a ui-sref="login">login</a></p>

```

## app.jsの作成とstateの設定
angular.moduleでui.routerを指定してください。
$stateProviderの中にstateの設定を記述します。
titleに指定した文字列がstateのページタイトルになります。

```javascript:app.js
'use strict';
angular.module('myApp', ['ui.router'])

.config(function($stateProvider, $urlRouterProvider) {
  $urlRouterProvider.otherwise('/home');
  $stateProvider
    .state('home', {
      url: '/home',
      templateUrl: 'home.html',
      title: 'ホーム'
    })
    .state('login', {
      url: '/login',
      templateUrl: 'login.html',
      title: 'ログイン'
    });
});
```

## pageTitleディレクティブを追記
pageTitleディレクティブを追記します。
stateの変更があった場合に、state.titleのテキストをセットするようにしています。

```javascript:app.js
'use strict';
angular.module('myApp', ['ui.router'])

.config(function($stateProvider, $urlRouterProvider) {
  $urlRouterProvider.otherwise('/home');
  $stateProvider
    .state('home', {
      url: '/home',
      templateUrl: 'home.html',
      title: 'ホーム'
    })
    .state('login', {
      url: '/login',
      templateUrl: 'login.html',
      title: 'ログイン'
    });
})

/**
 * ページタイトルをセットするディレクティブ
 */
.directive('pageTitle', function($rootScope) {
  return {
    link: function(scope, element) {
      var listener = function(event, state) {
        var pageTitle = '';
        if (state.title) {
          pageTitle = state.title + ' | SiteName';
          element.text(pageTitle);
        }
      };
      // stateの変更が完了した後に処理を実行
      $rootScope.$on('$stateChangeSuccess', listener);
    }
  };
});
```
## ブラウザで確認

a要素のリンクをクリックしてstateを変更すると動的にタイトルが変更されます。

![スクリーンショット 2015-01-27 9.57.21.png](https://qiita-image-store.s3.amazonaws.com/0/42958/9a6beeb7-9064-6f81-019d-d63a46f2eafb.png "スクリーンショット 2015-01-27 9.57.21.png")
.form-horizontalでインライン表示

むちゃくちゃ悩んでいたのですが、よく考えたらとてもシンプルでした。
Horizontal formにする際、ラベルに2 or 3、input要素に10 or 9を割り当てなければならないと思い込んでいましたが、別にそんなことはなかったのです。.form-group内でカラムの合計を12にすればいいだけでした。

```html
<form class="form-horizontal">
  <div class="form-group">
    <!-- このform-group内でカラムの合計を12にすればいい -->
    <label class="col-sm-2 control-label">Name</label>
    <div class="col-sm-4">
      <input type="text" class="form-control">
    </div>
    <label class="col-sm-2 control-label">Email</label>
    <div class="col-sm-4">
      <input type="email" class="form-control">
    </div>
  </div>
</form>
```

.form-inlineを使ってなんとかしないといけない！と思っていたのはただの思い込みだった、という話。
rmした複数のファイルをまとめてgit rmする

git管理下にある複数のファイルを```rm```したときに、それらを一括して```git rm```したい場合の方法です。

```shell-session
% git rm `git ls-files --deleted`
```

```git ls-files```コマンドは、gitの管理状況ごとにファイルを一覧表示するためのコマンドで、上のように```--deleted```を使えば削除されたファイルを表示します。他にも
```--unmerged```でコンフリクトしたファイル表示、```--exclude```を使えば管理外のファイルの非表示条件も設定できます。

シェルでは「｀」でくくればコマンドの実行結果を取得できるので、それによって得られたファイル一覧を```git rm```で消す、という流れです。

一括削除する方法では、これ以外にも```git st```を```grep deleted```したのを整形するなど色々と手段はあるようですが、上記の方法が一番シンプルで分かりやすいので使っています。
Pythonでバイナリファイルを保存する


自分はよく、**Python** でとある壁紙サイトの壁紙画像を一括ダウンロードしたり、とあるフリー素材サイトの素材画像を一括ダウンロードしたりするんですが、その時にUNIX環境であれば、

```py
import os
os.system("wget -O sample.jpg http://sample.org/sample.img")
```

みたいに **wget** で簡単にできたんですが、windows環境だとwgetは使えません。
なので、どうやってバイナリを保存するか調べてみました。
以下のようにやるみたいです。

```py

import shutil
import requests

URL = "http://sample.org/sample.img"

res = requests.get(URL,stream=True)
with open(filepath,"wb") as fp:
    shutil.copyfileobj(res.raw,fp)

```

上記のように、**requests** モジュールの `Response` オブジェクトにある `raw` （urllib3を使ったHTTPResponseオブジェクト)を、
**shutil** モジュールの `copyfileobj` 関数を使って *ターゲットのファイルオブジェクトにコピーすることで保存する* 、という形式です。

これを用いれば、たとえばとある壁紙サイトから画像ファイルを一括ダウンロードしたいときは、

```py
import shutil
import requests
from BeautifulSoup import BeautifulSoup

URL = "http://sample.org/"
targets = []

soup = BeautifulSoup(requests.get(URL).text)
for link in soup.findAll("a"):
    if link.get("href").endswith(".jpg"):
        targets.append(link.get("href"))

for target in targets:
    res = requests.get(target)
    with open(target.split("/")[-1], "wb") as fp:
        shutil.copyfileobj(res.raw,fp)
```

このように書けば実行できる。大変便利なのでスクリプト化しておくのも良いト思います。
ファイルアップロードでお手軽な画像プレビュー

登録フォームでアップロードする画像のプレビューをお手軽に表示する方法。
以前はajaxを使って裏でサーバにアップロードしてimgのsrcを書き換えるなんてことをやってたけど、この方法だとクライアント側だけで解決する。
IE10以降/Chrome/FFで動作確認できた(safariはmac持っていないので未確認)

html

```html
<img id="preview" src="/images/blank.png" />
<input type="file" id="picture" name="picture" />
```

js

```js
$('#picture').change(function() {
  try {
    var reader = new FileReader();
    reader.onload = function(e) {
      $('#preview').attr('src', e.target.result);
    }
    reader.readAsDataURL(this.files[0]);
  } catch(e) {
  }
});
```
Maya2015 簡単スキニングマニュアル

Maya2015以降でしたら、いくつかのコツを覚えれば、スキニングはかなり楽に調整できます。
（MayaLTでも2015 Extension以降で対応しています。）

## １．ジョイントを描く際には、「投影された中心にスナップ」をONにする
簡単にメッシュの中央にジョイントを描けるようになります。

![0126-18_01.png](https://qiita-image-store.s3.amazonaws.com/0/12313/1ea0a7ef-a96f-b55f-f25a-1e8b743c2f4e.png)

***
## ２．ジョイントは必ず上/前/右のいずれかの平行投影のビューで描くようにします
一番良く使うのが右からのビューで、次に上からのビューです。

![0126-18_02.png](https://qiita-image-store.s3.amazonaws.com/0/12313/23266a85-8dd2-fbdb-e650-a5c4bbb0f134.png)

***
## ３．ジョイントが描けたらスキンにするメッシュにスムーズバインドをします。
Maya2014以降を使っているならば、「多面体ボクセル」バインドがオススメです。
この時、最大インフルエンス数を１～２の範囲にしましょう。

![0126-18_03.png](https://qiita-image-store.s3.amazonaws.com/0/12313/5a8185b6-3961-92aa-7552-3309f180199b.png)

***
## ４．スキンウエイトの調整は、スキンウエイトペイントツールから行います。

スキンウエイトペイントツールに切り替えた時、ビューのシェーディングが「すべてをスムーズシェード」になっていないと、ランプ表示がされませんので注意しましょう。
カラーランプ表示になっていない場合には、スキンウエイトペイントツール内で、「グラディエント」＞「カラーランプの使用」がONになっているかチェックをします。

![0126-19_02.png](https://qiita-image-store.s3.amazonaws.com/0/12313/a7d5aae4-521f-5258-7462-8f55785f327b.png)

***
## ５．その前にスキンウェイトの調整を行いますので、スキンの最大インフルエンス数を２から４に増やしておきます。
スキンの最大インフルエンス数を増やすのは、アトリビュートエディタからスキンクラスタノードを選択し、最大インフルエンス数を増やします。
この最大インフルエンス数は、Unity上で使用する場合には４程度に抑えるのがよいです。


![0126-18_05.png](https://qiita-image-store.s3.amazonaws.com/0/12313/fade7c5d-1ffd-fd9e-70e0-8c6a4f2edc6b.png)

***
## ６．スムーズブラシ等を使い、スキンが綺麗に変形するように調整します。

![0126-19_01.png](https://qiita-image-store.s3.amazonaws.com/0/12313/e55bd42b-5f83-bae0-6410-090bef5939b8.png)

***
## ７．スキンウェイトペイントツール中でジョイントを回転しつつ調整する。
### スキンウェイトペイントツール中での各ジョイントの回転は、「ジョイントを選択してから、中クリックで回転ギズモ表示、そのまま中ドラッグで回転」

![0126-19_05.png](https://qiita-image-store.s3.amazonaws.com/0/12313/ebf6841b-1c2d-e71b-ca05-6c32d83407d6.png)

***
### 元のバインドポーズに戻す時には、右クリックメニューから「バインドポーズに移動」で元に戻ります

![0126-19_04.png](https://qiita-image-store.s3.amazonaws.com/0/12313/7da717e6-40a1-66fd-beca-f75831bef562.png)
***
フォルダ構造をコピーする

```lang:CopyFolderStructure.cmd
@title □□[Google ドライブ]にCDリストを作成中です

set from=C:\Users\jtakasuryuji\Music\iTunes\iTunes Media\Music
set to=C:\Users\jtakasuryuji\Google ドライブ\CD
xcopy "%from%" "%to%" /s/e/t
```
純粋関数型プログラミング言語spinozaに惚れて

[ ここに Baruch De Spinoza の肖像画が載る ]

# 純粋関数型プログラミング言語spinozaに惚れて

先日、皆のアイドルであるところのkenokabeさんがQiitaから追放されてしまいました。
kenokabeさんは、Qiita上で良質のポエムを投稿する、実力派ITポエマーで、私はそんな彼の大ファンでした。
彼が追放されてしまった今、彼の新作を見る事はできません。

彼の生産物をもっと見たいのに、もうそれは叶わない願いになってしまった……そんなやりきれない気持ちをどうにかするために、彼が最期に遺した""純粋関数型""プログラミング言語spinozaの一部をAPLで実装しました。

APLはIBM Mainframeとかで使われていた配列指向言語です。
spinozaでは、『【値】を明示的に【集合】として取り扱うには「配列」データ型で表現』するため、配列を中心に回るAPLと親和性が高いことでしょう。

# 実装上の制限
* 値は数字か関数しか取れない。( Stringは存在しない。 )
* 関数名はシングルクォーテーションで囲む必要がある。
* GNU APL に依存している

# 実装
```APL:spinoza.apl
∇Spinoza ;R
'===== spinoza ====='
→((';'≢¯1↑R)∧'world = $'≢9↑R←⍞)/7
→((⍴R)=⍴⍕R←⍎¯1↓9↓R)/5
R←⌽R
R←⍎⍕R
→2
'===== APL ====='⍫
∇R←out X
→((⍴X)=⍴⍕X)/3
X←⌽X
R←⎕←' > ',X⍫
```

# 使用例
```APL:testcases
Coding$ apl --script -f hoge.apl
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
* Spinoza<CR> to enter Spinoza interpreter. *
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
∇R←APL
R←'APL'⍫ 
∇R←Hello x
R←'Hello, ',x⍫
∇R←plus10 x
R←x+10⍫
Spinoza
===== spinoza =====
world = $(1);
world = $(1)('out');
 >  1
world = $(1)(2)(3);
world = $(1)(2)(3)('out');
 >  1 2 3
world = $(1)('plus10');
world = $(1)('plus10')('out');
 >  11
world = $(1)(2)(3)('plus10');
world = $(1)(2)(3)('plus10')('out');
 >  11 12 13
world = $('APL');
world = $('APL')('out');
 > APL
world = $('APL')('Hello');
world = $('APL')('Hello')('out');
 > Hello, APL
world = $(9)('⍳')('/')('+');
world = $(9)('⍳')('/')('+')('out');
 >  45

===== APL =====
)OFF

Coding$
```

# 最後に
この実装は不完全です。
このままでは、spinozaは、圏論の概念もクソもない、Lispを分かりづらくしただけのようなクソ言語に成り下ってしまいます。
そこで、この実装を完全なものにすることを読者への課題とします。

別の人による実装を通して、彼の遺した言語の"""素晴しさ"""が少しでも伝われば幸いです。
サーバログ計画 と logrotate.d


サーバを用意するに当たり、計画しないといけないものの1つにログがある。だいたいは

- httpサーバのアクセスログ
- 同エラーログ
- アプリのログ(SQLのログ)

この3つは管理せねばならない。なので、ウェブアプリが作成されたら、吐かれるログファイルの場所とどう扱うか、は計画的に行い、チェックリストの類を用意して確認して設定すべきである。

原則として、決めねばならぬのは以下ぐらいであり、これらを回避するためにlog correctorの類を使うこともある。使うのがベターなんだろう。

- 生テキスト -> 圧縮 -> 削除/移動 のライフサイクル
- 並列処理の場合、またがっているのを1つにマージする方法(時系列に直列になってないとログの意味が薄い)
- ファイルの命名規則
- 圧縮保存する期間

この辺りのポリシーを決めるには以下のような要因がある。

- カスタマーサポートの期間
  - お客様との契約
  - カスタマーサポートエンジニアがチェックする分量など
- サーバコスト
  - ディスクをできるだけ使わないのか
  - 何日削除処理しなくて動き続ければいけないのかなど

とりあえず、テストの段階からどれぐらいの勢いでログが増えていくのかチェックしていけば本番のディスクとか予想できてよかろう。

# まとめると

以下ぐらいはチェックリストを作って管理したい。

- Webアプリのログはどこにでるのか
	- 方式は？
- ログ保存期間
	- 生 > 圧縮 > 削除のタイミングは？
	- 保管期間は？
- ディスク消費量の監視
	- 1日あたりどれだけ増えるのか？
	- この調子でいくと何日持つか？

# でも logrotate.d でいいじゃん

とりあえず **logrotate.d** なら確実に使えるわけで、スモールスタートで、ディスクもケチりにケチったりする場合なら必ず使うであろうこれ。

## *.1とかありえないので最低限以下をconfに

``` logrotate.conf
# use date as a suffix of the rotated file
dateext
```

ディスクの消費は **zabbix** だの **munin** だので確認すること。
Org-modeからQiita準拠のMarkdownをexportするパッケージを作ってみました

EmacsのOrg-modeでは、バージョン8から、組み込みの機能でMarkdownをexport出来ます。ただし、出来上がるのは標準の規格に準拠したMarkdownなので、Qiita用には少し都合が悪いです。例えば、コードブロックは、文頭にスペースが四つ置かれる形式になってしまって、シンタックスハイライトが効きません。そこで、Qiita準拠のMarkdownを吐き出せるようなパッケージを作ってみました。

# 作る前に試したもの

QiitaのMarkdownでは、[コードに関する記法はGitHub Flavored Markdownに準拠](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)とのことなので、まず、Github向けのパッケージを探してみました。
ありました。
[ox-gfm](http://github.com/larstvei/ox-gfm)というパッケージです。使ってみたところ、GithubのREADME.mdを書くのは十分にサポートしてくれました。ただ、Qiita用に使い回すためには、少しだけ追加で欲しい機能が有りました。

欲しかった機能

1.  コードブロックに名前を付けたい。
2.  コードブロックの言語の指定に使う文字列を変換したい。
3.  パラグラフ中の改行を取り除きたい。
4.  目次の生成を止めたい。

ということで作ってみました。

# 導入方法

## package.el

[MEPLA](https://melpa.org/)に登録いただきましたので（@takaxp さんありがとうございました）、組み込みの`package.el`を使って導入いただけます。

## 手動

コードが[ここ](https://github.com/0x60df/ox-qmd)にありますので、ox-qmd.elをダウンロードするか、 `git clone` するなどして、ロードパスの通った場所におきます。

# セットアップ

`init.el`や`.emacs`などinitファイルに、以下のコードを記述します。

```el:.emacs
(require 'ox-qmd)
```

# 使用方法

Org-mode標準のexport用メニュー( `C-c C-e` )から実行できます。

欲しかった機能1の名前付きコードブロックは、 `#+name:` を利用します。
Orgファイルで

    #+name: .emacs
    #+begin_src emacs-lisp
      (require 'ox-qmd)
    #+end_src

と書けば、

    ```el:.emacs
    (require 'ox-qmd)
    ```

とexportされます。

# 設定方法

欲しかった機能2に関しては、変換を行う言語の追加が行えます(デフォルトでは、変換が行われるのは、"emacs-lisp"->"el"のみです)。

```el
(add-to-list 'ox-qmd-language-keyword-alist '("shell-script" . "sh"))
```

を.emacsに記述すると、Orgファイル中の

    #+begin_src shell-script
      $ echo hello
    #+end_src

が、

    ```sh
    $ echo hello
    ```

とexportされるようになります。

欲しかった機能3に関しては、on/offを切り替えることが出来ます。デフォルトでは、パラグラフ中の改行は取り除かれる設定になっています。この動作をoffにしたい場合は、以下のコードを.emacsに記述します。

```el
(setq ox-qmd-unfill-paragraph nil)
```

# 欲しかった機能についての補足

## 3. パラグラフ中の改行の除去

QiitaのMarkdownでは、[Githubでコメントを書くときなど](https://help.github.com/articles/writing-on-github/)と同様に、改行は無視されないようです。この挙動は、エディタの画面幅で改行をしながら文章を書いていく場合には、都合があまりよろしくないです(Org-modeのデフォルトでは、行の折り返し表示がoffになっているため、私はこういう書き方をしていました)。今までの文章の書き方を変えずに、パラグラフは詰めて表示をして欲しかったので、改行の除去を実装しました。

なお、Org-modeのソースで文末に連続する2個のバックスラッシュを置いた場合(Markdownでは、文末に連続する2個のスペースを置くことに相当します)は、改行の除去は行いません。

## 4. 目次の生成の停止

Org-modeでexportを行うと、ファイルの頭あたりにマジックコメント

    #+OPTIONS: toc:nil

を記述しない限り、目次が生成されます。
Qiitaでは、目次が自動的に付加されるので、こうした目次、および目次用のアンカータグは無駄になります。無駄なものがあるのは忍びないので、最初から出ないようにしました。

# その後の追加機能

## テーブルの変換
従来テーブルはHTMLで出力されてしまっておりましたが、markdownで出力されるようにしました。テーブルの先頭行がそのまま表のヘッドラインとして使われ、水平線は無視されます。列の左・中央・右揃えは、それぞれ`<l>`、`<c>`、`<r>`を配置すれば[指定できます](https://orgmode.org/manual/Column-Width-and-Alignment.html)。指定がなければ右揃えになります。

```text:org-mode
| a   |  b  |   c | d |
|-----+-----+-----+---|
| <l> | <c> | <r> |   |
|-----+-----+-----+---|
| 1   |  2  |   3 | 4 |
```

```text:markdown
| a   |  b  |   c | d |
|:----|:---:|----:|--:|
|  1  |  2  |  3  | 4 |
```

## Noteのサポート

Noteは、スペシャルブロックで記述することができます。

```text:org-mode
#+begin_note-info
ノートの本文
#+end_note-info
```

```text:markdown
:::note info
ノートの本文
:::
```

`info`の部分は、適宜`warn`、`alert`に置き換えられます。省略も可能です。

## インライン画像のアップロード

実験的に、別featureとして作成、公開しました。[別記事](https://qiita.com/0x60df/items/63184e6bfa466ff1f71c)にまとめましたので、よろしければご覧ください。
コンピュータ将棋製作記 その5

# コンピュータ将棋製作記 その5（2015年1月26日）

## 進捗どうですか？

### 前回の課題

- Pythonで書きなおす
- 速度は一旦犠牲にしても、Square Centricの情報を評価しやすい設計にする
- USIに対応させ、XBoardなりのインターフェースで表示出来るようにする

### 今日進んだ所

- node.jsで書きなおした
- Square Centricで全手抽出が問題なく動くところまで行けた

## node.js

前回Pythonで書く、と言っていたのにnode.jsを選んだのは理由がある。

- node.jsの方が慣れていた
- 将来「なぜこのような手を選択したのか」を確認する時に、グラフィカルにログを追っていける方が望ましいのは言うまでもない。その時にnode.jsだとブラウザの上で動作させて全ての情報をオンメモリに置き、それを元にDOMを用いて情報を表示することが出来る

以上の理由によりnode.jsにした。移植ではなく、ほぼ全面書き直しだが、以前のC実装のテストが全部動く程度には書き直すことが出来た。

## Square Centric

よりスクエアの情報を効果的に持つように設計をしなおした。とはいえ現時点で持っているのは、その場所の情報、その場所に利いている駒の情報、その場所に移動できる駒の情報、だけである。

これに色々な情報を追加し、スクエアの価値によって思考ルーチンを書いてみたい。たとえば相手の王の近い所に自分の利きがあれば高得点、みたいな感じで。


## 雑感

- 早速1回書き直したが、この手の複雑なプログラムは正直あまり書き直したくない
- 利きを目で見える形で出力したらなかなかおもしろかった

## 次回予定

### TODO

- 何らかの思考ルーチンを作ってみる（まずは先読みしないタイプで）

### 短期目標

- USIに対応させ、XBoardなりのインターフェースで表示出来るようにする
- 金曜夜（30日夜）までに、minimaxなりα-βなりで何らかの思考ルーチンを組む
プログラマになること#15 ３：４：３の法則


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#ハチ、アリ、人間
集団の母数に関わらず、社会的生物は、構成比率として、3:4:3に収束します。
不思議ですね。
では上から７割だけで、新しい集団を形成してみます。
なんと、またもや3:4:3の構成になってしまうのです。
下位の３割だけで、新しい集団を形成してみます。
同じく、3:4:3の構成になってしまうのです。

![スクリーンショット 2015-01-27 2.11.00.png](https://qiita-image-store.s3.amazonaws.com/0/33317/06a5d9af-bdd2-2541-b456-333866619927.png "スクリーンショット 2015-01-27 2.11.00.png")

#8年間、50人の結果
直接PGを教えた学生さんが対象です。
きっちりと3:4:3を示しました。
##上位３割
「怠慢、短気、傲慢」です。素晴らしい。
##中間４割
「やりはするけど、結果が出ない。」でもいいんです。他のことができるから。
##下位３割
残念ながら、学習がほとんどできません。
プログラムを書き写すことを「写経」と言います。
書いた後のコードリーディングが大事なんだけど、理解が出来ない脳、忘却する脳になってしまっていて、創ることが出来ません。
機械的作業、単純な手続きは出来ます。

#どうすればいいのでしょう？
上位３割はガンガンやっていきましょう。
出来ない人の分までやれば良い。
誰のために？自分のためです。

中間４割
PGやっても良し、やらんでも良し。
上位３割を目指さなくとも良い。
やり続けて、昇格するのもありですよ。時間はかかる。
他の世界で、上位３割になるかも知れん。
見る目を養いましょう。

＃下位３割
辛いね。実に辛い。
でも、他人のせいにするのは、もうやめよう。
自分と向き合いましょう。仕方ないんだ。
出来ないことを自覚しましょう。
苦しんでいるのはあなただけでは無いのです。
出来る振りを辞めてしまえば楽になるよ。
なんでもいいから仕事をやって、笑って生きていこう。
[Cocos2d-x] 2.2.3 で作ったプロジェクトを 2.2.6 で動くようにする

# Cocos2d-x 2.2.6

1ヶ月くらい前にCocos2d-x 2.2.6がリリースされました。
主な内容はiOSの64bitサポートです。

[Cocos2d-x 2.2.6 released: IOS 64-bit supported | Cocos2d-x](http://www.cocos2d-x.org/news/386 "Cocos2d-x 2.2.6 released: IOS 64-bit supported | Cocos2d-x")

2月から新規にリリースするiOSアプリは64bit対応が必須になりましたが、これまでCocos2d-x 2.x系は64bitをサポートしていませんでした。
アップデートでのリリースに関しては6月まで猶予があるみたいですが、それでも2.x系から3.x系に移行するのは大変そうです。
2.2.6のお陰で、その手間が少し軽減されました。

# アップデートする

自分が2.2.3で作成したプロジェクトを2.2.6へアップデートした際のメモです。

## ディレクトリの移動

基本的にCocos2d-xのプロジェクトは`<SDKのディレクトリ>/projects`に保存されています。
自分の場合、Cocos2d-xのバージョンごとにディレクトリを分けていたので、`cocos2d-x-2.2.3/projects/`から`cocos2d-x-2.2.6/projects/`に移動させました。

## iOS Deployment Target

アプリのプロジェクトと、Cocos2d-xのプロジェクトのiOS Deployment Targetを合わせます。
もしかしたら、合わせなくても問題ないかも知れません。
自分はここが合っていなくてエラーになったことがあったので、合わせるようにしています。

## Architecturesを64bit対応にする

Architecturesのところを`$(ARCHS_STANDARD_32_BIT)`としている場合は、64bit対応の`Standard architectures (armv7, arm64) - $(ARCHS_STANDARD)`に切り替えます。
Valid Architecturesは`arm64 armv7 i386`としました。
2.2.6でプロジェクトを作った時は上記構成になっていたので、同じようにしています。`armv7s`も追加した方が良いのかも知れませんが、よくわかっていません。

## 64bit非対応のライブラリを使用している場合は外す

64bitに対応していないライブラリを使っている場合は外しましょう。

## 不足しているファイルを追加する

2.2.3 から 2.2.6 へのアップデートの間にいくつかのファイルが追加さているようです。
この状態でビルドしてもリンカエラーが発生するので、不足しているファイルをプロジェクトに追加します。

`extensions/CocoStudio`内の`ActionTimeline`ディレクトリと、`extensions/CocoStudio/Json/`内の`CocoLoader.h`、`CocoLoader.cpp`を追加します。

![tree.png](https://qiita-image-store.s3.amazonaws.com/0/7933/733b0f0c-f056-ff96-c6fc-34a6faa8c519.png)

## ビルド

自分の場合、上記の設定を行うことでビルドできるようになりました。
リンカエラーで手間取ってしまいましたが、大した修正なく動いて良かったです。
シンボルの配列の%記法をバリバリ使っていくことにした


Ruby 2.0 で追加されたシンボルの配列を表す%記法のリテラルがあります。


```ruby
%i(foo bar)  # => [:foo, :bar]
```

- `%i!STRING!`  
  要素がシンボルの配列(空白区切り)
- `%I!STRING!`  
  要素がシンボルの配列(空白区切り)。式展開、バックスラッシュ記法が有効

Rails なんかではシンボルの配列をバリバリ使うにも関わらず、あんまり使用例を見ません。ただ、もう 2.0 以降だけを考えてればよい頃合いだろうし、バリバリ使っていきたいと思います。

```ruby 
before_action :require_login, except: %i(index show)
```

すっきり！
レスポンシブなテキストボックスを実装する

突然ですが、問題です。

#問題

HTML、CSSを使用し、以下の条件でテキストボックスとSubmitボタンを配置しなさい。

##条件
1. テキストボックスとSubmitボタンを横並びで表示
2. Submitボタンは固定幅※何ピクセルでもOK
3. テキストボックスはSubmitボタンの幅を除いて、ブラウザいっぱいに伸縮する事

![Wireframe.png](https://qiita-image-store.s3.amazonaws.com/0/57442/63f66e97-7795-c592-6f8d-d0c16e615d55.png)
　
#答え
```answer.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title></title>
	<style>
		.hoge {
			overflow: hidden;
		}
		input[type=text] {
			width: 100%;
			box-sizing: border-box;
		}
		input[type=submit] {
			float: right;
			margin-left: 10px;
		}
	</style>
</head>
<body>
	<div>
		<input type="submit" value="submit">
		<div class="hoge">
			<input id="" type="text" name="">
		</div>
		<div style="clear: both;"></div>
	</div>
</body>
</html>
```
[Emacs] バッテリ残量をちょっとおしゃれに表示

unicode 文字で棒グラフ風。
"[○○%]" という表示はちょっと場所を取りすぎかなと思ったので。

````lisp
(add-to-list 'mode-line-format
             '(:eval (let ((bat (read (cdr (assoc ?p (funcall battery-status-function))))))
                       (cond ((> bat 87)  "█") ((> bat 75)  "▇")
                             ((> bat 62)  "▆") ((> bat 50)  "▅")
                             ((> bat 37)  "▄") ((> bat 25)  "▃")
                             ((> bat 12)  "▂") (t           "▁")))))
````

screenshot : http://i.imgur.com/pRHm6FR.png
scala.util.Tryを使いこなそう

#1.とっても便利なTry

Scalaを使っていて、以下のような書き方をしてしまうことあるのでは無いでしょうか？

```scala
def sampleDBAccess(id:String):writeEntity = {
    try{
      //何か転けそうなselect
      DBAccessor.selectById(id)
    }catch{
      case notfound:EntityNotFoundException => Entity.empty
      case e:Throwable => throw e
    }
}
```

JavaとかCとかやってるとつい書いてしまう処理です。
これだと、Exception投げる処理が分散してしまって、どこでなげたっけ？あれ？？となってしまったりします。
また、関数型的にかっこよくないなーって感じるかもしれません。
そこで！Scalaのscala.util.Tryです！

```scala
def sampleDBAccess(id:String):Try[writeEntity] = Try {
   DBAccessor.selectById(id).recover {case notfound:EntityNotFoundException => Success(Entity.empty) } 
}
```

こんな感じ。
TryはSuccess()とFailure()に分かれていて、こけたらFailureに勝手にExceptionいれてくれる優れものです。

#2.実際にどうやって使うの？
サンプルを使って、実際に書いてみます。

##2-1. 参照したデータを使う。

```scala
// ユーザー名からEntityを引っ張ってくる関数
def resolveByName(name:String):Try[User]

// 使い方
val ids = resolveByName("yusuke").map(_.id) // Try[id]がかえる。

// キャッチする場所
val ids = ids.recover({
    //特定のExceptionの場合復帰させるのであればここに書く
    case e:Throwable => throw e 
}).get
```

## 2-2. 参照したデータでさらに参照してみる。

```scala
// ユーザー名からEntityを引っ張ってくる関数
def resolveByName(name:String):Try[User]

def resolveByUserId(id:UserId):Try[UserData]

// 使い方
val ids = resolveByName("yusuke").flatMap(user =>  resolveByUserId(user.id)) // Try[UserData]がかえる。
```

Try[Try[xxxx]]となった場合にはSeq同様にFlatMapを使って1つにまとめることができます。
これを十分活用すれば、Exceptionをまとめて上の層に渡すことも可能です。

## 2-3 こけてもこけてないように見せたい

```scala
// ユーザー名からEntityを引っ張ってくる関数
def resolveByName(name:String):Try[User]

// 上記でもかきましたがgetOrElseでもみ消しましょう。
resolveByName("hoge").getOrElse(/*デフォルト値*/)
```

## 2−4 複数のTryを扱う。

```
def resolveByName(name:String):Try[User]

def createByUserId(id:UserId):Try[Message]

val message = for{
   u <- resolveByName("hoge")
   message <- createByUserId(u.id)
} yield message
//messageにTry[Message]がはいる。

```

#3. 最後に

このような感じで、scala.util.Tryはコケても、アプリケーションまでコケさせなくしたり、任意にコケさせたりできます。
いままで、try-catchで書いていた人もでscala.util.Tryを使ってスッキリさせませんか？
WebView内のJavaScript から Swiftの関数を呼ぶ

- [JavaScript から Swiftの関数を呼ぶ](#sec-1)
  - [ViewController.swift](#sec-1-1)
  - [index.html](#sec-1-2)

# JavaScript から Swiftの関数を呼ぶ<a id="sec-1" name="sec-1"></a>

Cocoa WebViewの話です。
iOSの話じゃないと思います。

## ViewController.swift<a id="sec-1-1" name="sec-1-1"></a>

```swift
import Cocoa
import WebKit

class ViewController: NSViewController {

     // cocoa WebViewをアウトレットしておく
    @IBOutlet weak var toWeb: WebView!

     // 同じパスにあるindex.htmlをロード
    var targetURL = NSBundle.mainBundle().pathForResource("index", ofType: "html");

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = NSURL(string: targetURL!)
        let request = NSURLRequest(URL: url!)
        self.toWeb.mainFrame.loadRequest(request)

        var win = toWeb.windowScriptObject
        win.setValue(self, forKey: "ViewController")
    }

    // Sample function with multiple parameters
    func multiplyTwoFloat(x: Float, y: Float) -> Float {
        return x * y
    }

    // Sample function with single parameters
    func printFloat(f: Float) -> Void{
        print("\(f)")
    }

    // JSからアクセス可能にする関数を定義する
    override class func isSelectorExcludedFromWebScript(aSelector: Selector) -> Bool {
        switch aSelector {
        case Selector("multiplyTwoFloat:y:"):
            return false
        case Selector("printFloat:"):
            return false
        default:
            return true
        }
    }
}
```

## index.html<a id="sec-1-2" name="sec-1-2"></a>

```html
<!DOCTYPE html>
<html>
<body>
<script>
    var swift = window.ViewController;
    var num = swift.multiplyTwoFloat_y_(2,2);
    swift.printFloat_(num); // -> 4.0 とログに表示される
</script>
</body>
</html>
```