OmniAICreator/Qiita-1.07M huggingface dataset:
meta theme-colorを動的に制御する

# theme-colorについて

<meta name="theme-color" content="#fff">
アドレスバー・通知エリアの背景色指定できるHTMLタグ。
※今のところ主要ブラウザではAndroid Chromeのみ対応

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/145454/63167569-323a-26b5-47aa-db3a43212008.png)
※Facebookの例

## 作ったもの
[Demo](https://codepen.io/torosalmon/pen/aVJGMP)

JSからcontentの値を動的に変更すると通知エリアもリアルタイムで反映されます。
瞬時に色が変わるのではなくフェードで色が変わりますが、これはブラウザ側の仕様のようです。

```js
var color1     = '#99f';
var color2     = '#4ff';
var $metaColor = document.querySelector('meta[name="theme-color"]');
var $body      = document.getElementsByTagName('body')[0];
var $button    = document.getElementsByTagName('button')[0];

$metaColor.setAttribute('content', color1);

$button.addEventListener('click', function() {
  if(!$body.classList.contains('js-meta-theme-change')) {
    $body.classList.add('js-meta-theme-change');
    $metaColor.setAttribute('content', color2);
  } else {
    $body.classList.remove('js-meta-theme-change');
    $metaColor.setAttribute('content', color1);
  }
}, false);
```

## 演出アイデア

* サイドバーを開くイベント時に色を替えたり
* setIntervalでランダムに色を変化させたり
* 今居るコンテンツのカラーに合わせてスクロールイベントで変化させてみたり
スプレッドシートでワークシートのコピーを禁止する方法

Googleスプレッドシートにて、以下を実現する方法を 模索していました。

- シート内のセル編集は許可したい 
- ワークシートのコピーは禁止したい

なので、単純に閲覧権限で共有する方法だとセル編集も禁止となってしまい、やりたいことが実現できずにいました。

## 解決方法
シートコピーのイベントを検知する方法が見当たらなかったため、
少し強引ですが以下のGASを記述することでシートのコピーを制限する事が出来ました。

※以下のコードに対し、スプレッドシートの値編集時にトリガー実行するよう設定しておく

```js
function disableCopy() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  if(sheet.getName().indexOf('のコピー') != -1){
    ss.deleteActiveSheet();
    Browser.msgBox("シートのコピーを制限しています。", Browser.Buttons.OK);
  }
}
```

もしもっとスマートな方法を知っている方いましたら、教えていただけると嬉しいです！
PyData.Osaka Meetup #2 メモ

https://www.meetup.com/ja-JP/PyData-Osaka/events/235235319/

```
大阪工業大学うめきたナレッジセンター
PyData.Osaka Meetup #2を開催します．
大阪工業大学情報科学部 井上雄紀先生のご厚意により 
#1 に引き続き 
大阪工業大学うめきたナレッジセンター 
で開催させていただけることになりました．


今回からはテーマを設けています．

#2のテーマは Project Jupyter です．

参加費は無料です．  
参加をご希望の方は画面右の「グループにジョインしてイベントも出席する」ボタンをクリックしてください．

発表者も募集しています．LTでも構いません． 
テーマ(Jupyter)と異なるものでも構いません．

発表にご興味持たれた方はお気軽に 
https://github.com/PyDataOsaka/pydata-osaka-2016/issues/6 
にコメントください．



• @kozo2 binder の紹介

• @kozo2  airbnb の knowledge-repo の紹介

• @kozo2 Jupyter Newsletter を見てみよう

• @genya0407 nteract の紹介

• @taku-y PyMC3の変分ベイズの話 

• @kozo2 Osaka.Stanに行ってきた話 
```


# 会場の話
うめきたナレッジセンターはいったん閉じて別の場所に移動する予定

# Binder の紹介
Jupyter 環境をホスティングしてくれるサービス。なんと Free!。github repository を指定すると、環境が立ち上がる。
- http://mybinder.org/
- 使用例 https://github.com/ecell/ecell4 の README.md にある launch-binder を押す。

環境のカスタマイズは docs にちらっと書かれている http://docs.mybinder.org/getting-started
- Dockerfile
- conda
- requirements.txt

C++ のカーネル使ったりすることもできる。http://mybinder.org/repo/cernphsft/rootbinder C++ は [Cling](https://github.com/vgvassilev/cling) というラッパーシェルが動作する。

# airbnb の knowledge-repo の紹介
中身を見てみたけれども、面白い話ができそうにないので、キャンセルということでした。

# jupyter newsletter 2016-11
## brand logo
## アメリカのスパコン NERSC で Jupyter notebook を使う
## 開発者の紹介
zeromq でも有名な人
## PLOTCON
https://plot.ly/

# jupyter newsletter 2016-10
https://figshare.com/

nbgrader というツールは教育向けに使われているらしい。
https://github.com/jupyter/nbgrader

https://github.com/trending/jupyter-notebook

https://altair-viz.github.io/
http://vega.github.io/vega-lite/


# PyMC3の変分ベイズの話
Variational inference in PyMC3

[PyMC3](https://github.com/pymc-devs/pymc3) は stan と同じ立ち位置で、[theano](http://deeplearning.net/software/theano/) 上に構築されている。

作者の http://twiecki.github.io/ の blog 内容が充実している。


# nteract

Web ブラウザではなく、electron ベースのネイティブアプリで jupyter の UI を動かす環境。`ipynb` をダブルクリクすると起動するイメージ。現状は kernel を別途インストールしないといけなくて、しかも動作が怪しくて、というステータスらしい。

# Osaka.Stanに行ってきた話
[イベント](https://atnd.org/events/83097) は、[StanとRでベイズ統計モデリング](http://www.kyoritsu-pub.co.jp/bookdetail/9784320112421) の本の読書会。
mb_convert_encoding()でautoを使用するときの注意点

PHPでファイルのエンコードをUTF-8に変換する際に、
mb_convert_encording()の挙動で引っかかった部分があったのでここで共有する。

結論から言うと、
mb_convert_encording()を使用するとき、
__`$from_encoding`の値を`'auto'`にするのは避けたほうがよい。__

### 問題

以下のように、任意のエンコードからUTF-8に変換しようすると、
PHPがエンコードを認識できず、変換できないときがある。

```php:
$str = mb_convert_encoding ($str , 'UTF-8', 'auto');

// >> Warning: mb_convert_encoding(): Unable to detect character encoding
```

### 原因
`$from_encoding`の値を`'auto'`にした場合、PHPでは次のような振る舞いをする
らしい。

* [PHPマニュアル](http://php.net/manual/ja/mbstring.supported-encodings.php)

> この文字列は 言語設定 (NLS) ごとに定義されたエンコーディングのリストに変換されます。
>たとえば、言語設定が Japanese の場合は "ASCII,JIS,UTF-8,EUC-JP,SJIS" です。


裏を返せば、言語設定が Japanese でなかった場合に　"ASCII,JIS,UTF-8,EUC-JP,SJIS"に変換されないということである。

実際に`php.ini`の言語設定を調べてみたところ、デフォルトの設定である
neutralになっていた。

```bash:
$ php -i

mbstring.language => neutral => neutral
```

### 解決策

解決するために、

* php.iniの設定を修正する影響範囲の広さ
* プログラムがphp.iniに依存しないこと

の二点を鑑みて、
`$from_encoding`に`'auto'`ではなく、
`"ASCII,JIS,UTF-8,EUC-JP,SJIS"`を使用することにした。

```php:
$str = mb_convert_encoding ($str , 'UTF-8', 'ASCII, JIS, UTF-8, SJIS');
```
SQLServer: with(nolock)ヒントでロックを確実に回避できるという認識は間違い

「nolock」なのでロックしないっしょ～と思いがちですが、その認識が間違っていたのでメモ。

# SQLServerのロックについて
ロック モード
https://technet.microsoft.com/ja-jp/library/ms175519(v=sql.105).aspx

ロックの互換性
https://technet.microsoft.com/ja-jp/library/ms186396(v=sql.105).aspx

まずはロックについて。ロックにもいろいろ種類があるよっていう話と、同時に同一リソースにかけられるロックもあるよという話。
ここを一読すればだいたいつかめると思います。

名前忘れちゃったのですが、前に読んだ書籍に書いてあった、旗のイメージでロックを考えると分かりやすかったです。
Aの旗は同時に2本以上たてられるけど、Bの旗は1本しかたてられない。AとCの旗は一緒に立てられるけど、Dの旗は他のどの旗とも一緒には立てられない、、、みたいな。


# with(nolock)をつけると何がおきているか
通常のSELECT文を発行すると、S-lock(共有ロック)が取得されます。こちらはdeleteなど発行した時のロック(X-lock)と競合するので、該当テーブルが更新中の場合はSELECTが待たされることになります。

with(nolock)をつけたSELECT文は、Sch-S lock(スキーマ安定度ロック)が取得されます。こちらはX-lockと競合しないので、更新中のテーブルでもSELECTできます。（※ダーティリード）

ということで、with(nolock)をつける＝取得するロックをSch-Sロックにするということですね。
このロックはX-LockやU-Lockと競合しないため、確かにnolockなのですが、、、このSch-Sロックとも競合してしまう強力なロックがあります。

それがSch-M　lock(スキーマ修正ロック)です。

インデックス付Viewを作成するとき（schema bindngしたViewにインデックス張るとき）や、transaction内でtruncateしたときなど、
Sch-Mロックが取得されます。

このSch-Mロックがかかると、該当リソースへのアクセスができなくなってしまうため、長時間Sch-Mロックが取得され続けるとタイムアウトエラーが頻発してしまいます。

他にもSch-Mロックが取得されるケースは存在するので、稼動しているDBに対してオンラインで何かしらの操作をする場合には、その操作によって取得されるロックの種類と、そのロックが取得されることによる影響をしっかりと開発環境で検証しておく必要があります。
うっかりSch-Mロックをかけてしまうと、（Sch-Mロックは長時間取得されるような重い操作が多いので）たっぷりタイムアウトエラーが発生しますので注意が必要です。
DNSBL(CBL)による2016/11/25の誤ブロックの話

# DNSBL(CBL)による2016/11/25の誤ブロックの話

## 原文
Important: November 25, 2016

Early November 25th, a very large scale Necurs malware event occured. By large scale, many email installations will be seeing in excess of 80% Necurs spam, and some will see their inbound email volume jump by a volume of as much as 500%. This isn't an unusual thing normally, the CBL/XBL has been successfully dealing with large scale spam spikes like this, often daily, for years.

The email was allegedly an invoice, but the attached zip contained, instead, a form of ransom malware.

The detection rules initially deployed by the CBL unfortunately were insufficiently detailed, and listed a number of IP addresses it shouldn't.

Our internal policy states that when a listing heuristic is generating noticeable amounts of false positives, and it isn't possible to distinguish the good entries from the bad ones, that all listings from that heuristic should be purged as soon as possible. Therefore, all entries of this type were purged (by about 14:10 UTC), and the detection heuristic removed.

The false positives tended to be predominently email senders, and they'd only be listed if they hit our spamtraps (never-existing or not existing in many years email addresses) - this didn't involve any of our partner feeds.

If you were listed up to around 14:00 UTC November 25th, and the CBL lookup page appears to indicate that the IP is no longer listed, this is likely the explanation, and no further action is required on your part.

We apologize for the inconvenience.

## 大雑把にいうと

- 11月25日早朝にランサムウェアがめっちゃ活動してた
- その影響でDNSBL(CBL)のヒューリスティックスキャンが関係ないIPアドレスも大量にブロック対象としてリストアップしてしまった
- 誤検出のエントリは(UTCの)11月25日14:10ごろに全部クリアした
- 今は問題ないので安心してね

## 日本での影響

- キャリアメール(DoCoMo, au, softbank)のメールは遅延あるいは喪失が起きていたかも

  - キャリアからは明確にDNSBL(CBL)を使っているという回答はないが、ここにリストアップされると迷惑メールフォルダに自動転送されるため、何らかの参照をしているのは間違いなさそう

- GMail, Outlookなどへも影響が出ていた可能性あり

  - こちらも明確に回答は得ていないが、やはり過去にDNSBL(CBL)絡みで喪失が起きていたのではないか？という話がたまにある

## 対応

お客様へは「海外で運用されているスパムメールブロックサービスの誤検出により弊社サービスへ影響があった模様です。お手数ですがメールの再送をお願いします。」としか言いようがないので、そのように取り計らう。

Best regards,
CentOS7にPHP7をyumでインストールする手順(個人メモ)


### OSのバージョン
```
$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
``` 


### リポジトリの追加

EPELとRemiの追加が必要。

## EPEL
```
yum install epel-release
```

## Remi
```
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

## PHP7をインストール
```
yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd
```

## phpのversion確認
```
$ php --version

PHP 7.0.13 (cli) (built: Nov  8 2016 20:16:29) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
```
#17 【攻略】RubyWarrior Level8 ~中級編~

level8です。中級編の中で一番簡単でした。

#概要
今回は狭い通路に敵2体が立ちふさがっています。しかしwarriorは道中で爆弾の入ったケースを見つけたらしいので、今回は爆薬を使って敵をまとめて倒していきます。

ちなみにこの爆弾はwarrior自身もダメージを受けるのでちょっと工夫して使う必要があります。

#スクリプト
```
class Player
  def play_turn(warrior)
    if warrior.feel(:forward).enemy?
      warrior.detonate!(:forward)
    elsif warrior.feel.captive?
      warrior.rescue!
    else
      warrior.walk!
    end
  end
end
```

#解説
敵がいたら近づいて爆弾を投げる、いないなら前進するか捕虜を救出。それだけです笑
めちゃくちゃシンプルですね...
PHP7からはシングルトンの生成メソッドを2行で書ける

PHP7未満ではシングルトンの生成メソッドはこんな感じだったと思います。`static`で静的変数を定義し、それがNULLかどうかのif節を書きといった具合に。

```php
<?php

function getInstanceOldStyle()
{
	static $instance;
	if ($instance === null) {
		$instance = new stdClass();
	}
	return $instance;
}

assert(getInstanceOldStyle() === getInstanceOldStyle());
```

PHP7からはnull 合体演算子 (??) が追加されたので、もっとシンプルに書くことができそうです。


```php
function getInstance()
{
	static $instance;
	return $instance ?? $instance = new stdClass();
}

assert(getInstance() === getInstance());
```

なおクラスの`static`キーワードを使うならこんな感じでしょうか。

```php
class Singleton
{
	private static $instance;
	
	public static function getInstance()
	{
		return self::$instance ?? self::$instance = new self();
	}
}

assert(Singleton::getInstance() === Singleton::getInstance());
```
#16 【攻略】RubyWarrior Level7 ~中級編~

RubyWarrior Level7です。

#概要
今回も捕虜が爆弾を持っているのですが、敵3匹が行く手を阻んでいます。真ん中の敵を優先して倒して捕虜に向かうという感じにしましょう。

#スクリプト
```
class Player

  def initialize()
    @approach = 0
    @change = 0
  end

  #近くに捕虜がいるかの判定
  def captive?(warrior)
    if warrior.feel(:right).captive?
      return :right
    elsif warrior.feel(:left).captive?
      return :left
    elsif warrior.feel(:forward).captive?
      return :forward
    elsif warrior.feel(:backward).captive?
      return :backward
    else
      return :none
    end
  end

  #warriorの近くに空間があるか確認　
  def empty?(warrior)
    if warrior.feel(:right).empty?
      return :right
    elsif warrior.feel(:left).empty?
      return :left
    elsif warrior.feel(:forward).empty?
      return :forward
    elsif warrior.feel(:backward).empty?
      return :backward
    else
      return :none
    end
  end

    #近くに敵がいるかの判定
  def enemy?(warrior)
    if warrior.feel(:right).enemy?
      return :right
    elsif warrior.feel(:left).enemy?
      return :left
    elsif warrior.feel(:forward).enemy?
      return :forward
    elsif warrior.feel(:backward).enemy?
      return :backward
    else
      return :none
    end
  end

  def play_turn(warrior)


    if @change <= 1
      if warrior.feel.empty?
        warrior.walk!
        @change += 1
        return []
      end
    end



    @approach += 1
    if @approach <= 5
      e = enemy?(warrior)
      case e
      when :left
        warrior.bind!(:left)

        return []
      when :right
        warrior.bind!(:right)

        return []
      when :forward
        warrior.attack!

        return []
      end

    elsif @approach > 5
      dir = warrior.direction_of_stairs
      if warrior.feel(:left).captive?
        warrior.rescue!(:left)
      elsif warrior.feel.captive?
        warrior.rescue!
      else
        warrior.walk!(dir)
      end
    end

  end
end
```


#解説


ちょっと不細工なコードになりましたが、インスタンス変数に行動回数を保存することでなんとかクリアできました。

まず、@changeですが前方が空白だった場合のみ前進させるという分岐です。@changeに行動回数を保存しているので2回きりしかこちらの行動はしません。こうすることでいい感じに敵を倒しつつ一番奥の捕虜の前まで行くことができます。(@changeが二回以上になると方向転換するので@changeという名前です...)

続いて@approachですが、敵と接触してから経過したターン数を保存しています。
三体敵が固まっていますが、左右を拘束+前方を倒す、という流れは合計5ターンですみます。なので5ターン以内の処理とそれ以降の処理というように分けることで、敵をさばいた後は捕虜を救出することを優先するというロジックを組むことができます。
#15 【攻略】RubyWarrior Level6 ~中級編~

RubyWarrior攻略やっていきます。

#概要
今回は捕虜が爆弾を持っているみたいです。敵を倒すことよりも、捕虜を助けることを優先しなければ捕虜が爆ぜます。なので、最初は敵を無視して捕虜まで移動して助ける。といった感じでロジックを組みます。

#スクリプト
```
class Player

  #近くに捕虜がいるかの判定
  def captive?(warrior)
    if warrior.feel(:right).captive?
      return :right
    elsif warrior.feel(:left).captive?
      return :left
    elsif warrior.feel(:forward).captive?
      return :forward
    elsif warrior.feel(:backward).captive?
      return :backward
    else
      return :none
    end
  end

  #warriorの近くに空間があるか確認　
  def empty?(warrior)
    if warrior.feel(:right).empty?
      return :right
    elsif warrior.feel(:left).empty?
      return :left
    elsif warrior.feel(:forward).empty?
      return :forward
    elsif warrior.feel(:backward).empty?
      return :backward
    else
      return :none
    end
  end

  def play_turn(warrior)

    dir = captive?(warrior)
    if dir == :left
      warrior.rescue!(:left)
      return []
    elsif dir == :right
      warrior.rescue!(:right)
      return []
    end

    dir = warrior.direction_of_stairs
    if warrior.feel(dir).enemy?
      dir = empty?(warrior)
      warrior.walk!(dir)
    else
      warrior.walk!(dir)
    end

  end
end
```

#解説
captive?で捕虜のいる位置を確定し、dirに保存。捕虜がいると想定される位置で条件分岐を組みます。
ちなみにreturn []を返すことでターン終了することができます。これがないと1ターンに複数回行動を起こしてしまうのでエラーになります。
UITextFieldの文字数制限とキーボードの収納 [Swift3.0]

Swiftでテキストフィールドに文字数制限を設定するのが楽ではなかったので忘備録。

##入力後にキーボードをしまう
####ソース

```swift
import UIKit

class ViewController: UIViewController, UITextFieldDelegate  { //(1)

    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        textField.delegate = self //(2)
        textField.returnKeyType = .done //(3)
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
     //(4)
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}
```
####内容
(1)「UITextFieldDelegate」を実装(インプリメント)する
(2) UITextFieldのdelegate変数を自身を指定する
(3) UITextFieldの「returnキー」の表示を「done」に変更する
(4)「textFieldShouldReturn」関数を実装する。=>「Return」や「改行」などのキーをタップした時に呼ばれる処理。
-resignFirstResponder()を設定するとキーボードを閉じる。



##テキストフィールドに文字数制限を設定する
####ソース

```swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //(1)
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(textFieldDidChange),
            name: NSNotification.Name.UITextFieldTextDidChange,
            object: textField)
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
 
    //(2)
    @objc private func textFieldDidChange(notification: NSNotification) {
        let textFieldString = notification.object as! UITextField
        if let text = textFieldString.text {
            if text.characters.count > 8 {
                textField.text = text.substring(to: text.index(text.startIndex, offsetBy: 3))
            }
        }
    }
}
```
####内容
(1)文字数制限をかけるテキストフィールドを監視対象にする
(2)テキストフィールドの入力イベントを監視し、変更があった場合に指定文字数(ここでは8文字)を超えた文字の入力をさせいない



##キーボードを隠す + 文字数制限

```swift
import UIKit

class ViewController: UIViewController, UITextFieldDelegate  {

    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        textField.delegate = self
        textField.returnKeyType = .done
        
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(textFieldDidChange),
            name: NSNotification.Name.UITextFieldTextDidChange,
            object: textField)
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
    
    @objc private func textFieldDidChange(notification: NSNotification) {
        let textFieldString = notification.object as! UITextField
        if let text = textFieldString.text {
            if text.characters.count > 8 {
                textField.text = text.substring(to: text.index(text.startIndex, offsetBy: 3))
            }
        }
    }
}
```
plantUML(Web版)

前回plantUMLの導入手順を公開しました
"PlantUML導入手順"
http://qiita.com/borerere/items/01eeb2332b74b93b0958

しかしハッキリ言ってめんどくさいのでWeb版を使いましょう
http://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000
![image](https://qiita-image-store.s3.amazonaws.com/0/94585/7e075304-ef95-35c8-7a06-2cf728ab8650.png)

(追記 2017/02/21)
更に使いやすいWebのEditerがありました。
左側で記載した内容を(Shift + Enter)ですぐにプレビューできます。
http://sujoyu.github.io/plantuml-previewer/

![image](https://qiita-image-store.s3.amazonaws.com/0/94585/f117f0ae-1149-a667-356d-97f01859b8d2.png)


はい
Splatting が便利

[ブログからの転載](http://1bed.allright.life/?p=2395)

## Splatting が便利

先日 GitHub で他の方のソースコードをみている時にこの機能を知りましたので、同じように知らない人が居ればと思い紹介。

## Splatting とは

公式にはこのように書いてありました。

> スプラッティングは、パラメーター値のコレクションをまとめてコマンドに渡す手法です。Windows PowerShell はコレクションのそれぞれの値をコマンドのパラメーターに関連付けます。スプラットされたパラメーター値は、名前付きスプラッティング変数に格納されます。名前つきスプラッティング変数は普通の変数のように見えますが、ドル記号 ($) の代わりにアットマーク (@) で始まります。アットマークは Windows PowerShell に対して、引数が単一の値ではなくコレクションとして渡されることを伝えます。
> 
> スプラッティングはコマンドを短くし、読みやすくします。スプラッティング値は別のコマンドの呼び出しで再利用できます。また、スプラッティングを利用して、パラメーター値を $PSBoundParameters 自動変数から他のスクリプトや関数に渡すことができます。

## 記法

Windows PowerShell 3.0 以降では、コマンドの全パラメーターを次のように表せるそうです。

```ps1
<CommandName> <optional parameters> @<HashTable> <optional parameters>

<CommandName> <optional parameters> @<Array> <optional parameters>
```

## よく使いそうな例

可読性が良くなるので使っているという事もありますが、例えば自作の関数で引数が多いときや、条件によって動作を変える時に使い始めています。

次の関数は、引数で Param1, Param2, Param3 に数値を渡すと足し算の練習？をして、-Exec スイッチを入れると実際に足し算を行う関数です。

```ps1
function Get-ParamSum 
{
    Param(
        [CmdletBinding()]
        [Parameter()]
        [int]$Param1 = 0,
        [Parameter()]
        [int]$Param2 = 0,
        [Parameter()]
        [int]$Param3 = 0,
        [Parameter()]
        [switch]$Exec        
    )
    Write-Host -NoNewline ('{0} + {1} + {2}' -f $Param1, $Param2, $Param3)
    if ($Exec) {
        Write-Host (' = {0}' -f ($Param1 + $Param2 + $Param3))
    }
}
```

例えば、時分秒を合計して、日付が奇数なら -Exec スイッチを付けるとする

ダラダラ書いてみた例

```ps1
if(((Get-Date -UFormat %d) % 2) -eq 0) {
    Get-ParamSum -Param1 (Get-Date -UFormat %H) -Param2 (Get-Date -UFormat %M) -Param3 (Get-Date -UFormat %S)
} else {
    Get-ParamSum -Param1 (Get-Date -UFormat %H) -Param2 (Get-Date -UFormat %M) -Param3 (Get-Date -UFormat %S) -Exec
}
```

Splatting を使って書いてみた例

```ps1
$splatting = @{
    Param1 = Get-Date -UFormat %H
    Param2 = Get-Date -UFormat %M
    Param3 = Get-Date -UFormat %S
}

if(((Get-Date -UFormat %d) % 2) -eq 1) {
    $splatting.Set_Item('Exec', $true)
}

Get-ParamSum @splatting
```

# 参考サイト

* [about_Splatting](https://technet.microsoft.com/ja-jp/library/jj672955.aspx)
Googleスプレッドシートの機械学習アドオンを日本語で試す

機械学習で分類問題を手軽に解くのに、GoogleスプレッドシートのアドオンであるSmart Autofill（スマート・オートフィル）がありますが、日本語を扱うために工夫が必要だったので、そのメモです。

# Smart Autofillを利用する
[Smart Autofill](https://cloud.google.com/prediction/docs/smart_autofill_add_on)は、Googleの[Prediction API](https://cloud.google.com/prediction/)を手軽に利用できるGoogleスプレッドシートのアドオンです。

スプレッドシートデータから学習した結果を使い、歯抜けになっている空白セルに入るべき値を予測して埋めてくれます。

![screenshot1.png](https://qiita-image-store.s3.amazonaws.com/0/110991/0a1dacea-27b1-da82-e3a6-d01326915401.png)

Smart Autofillの入門ガイドには、多言語で入力されたテキストが、英語、スペイン語、フランス語のいずれであるかを自動補完するサンプルがあるのですが、これと同じことを日本語でも行うには、形態素解析をしておく必要がありました。

# 日本語を扱うための形態素解析
スプレッドシート上で形態素解析（分かち書き）を行うには、いくつか方法がありそうでしたが、てっとり早くYahooデベロッパーネットワークの[日本語形態素解析API](http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html)を使用しました。

YahooAPIの分かち書きは便利です。抽出した単語を品詞ごとにフィルタリングできます。利用制限も1日あたり50000リクエストまでいけるので、何かお試しするには十分です。

スプレッドシートのメニューから、スクリプトエディタを開き、以下のソースを入力します。

```コード.gs
function myFunction(text)
{
  var appid = "自分のアプリケーションID";
  var filter = "1%7C2%7C3%7C4%7C5%7C6%7C7%7C8%7C9%7C10";  // 名詞やら動詞やらを指定しています
  var url = "http://jlp.yahooapis.jp/MAService/V1/parse?appid="+appid+"&results=ma&sentence="+text+"&filter="+filter;
  var namespace = XmlService.getNamespace("urn:yahoo:jp:jlp");

  // APIを呼ぶ
  var xml = UrlFetchApp.fetch(url);
  // XMLをパース
  var document = XmlService.parse(xml.getContentText());

  var entries = document.getRootElement();
  var ma_result = entries.getChild("ma_result", namespace);
  var word_list = ma_result.getChild("word_list", namespace);
  var word = word_list.getChildren("word", namespace);

  var ret = "";
  for (var i = 0; i < word.length; i++) {
    // スペース区切りで抽出
    ret += word[i].getAllContent()[0].asElement().getText() + " ";
  }

  return ret;
}
```

スクリプトを保存したら、セル内で以下のように関数が使えるようになります。

```スプレッドシートの任意のセル
=myFunction(A1)
```

filterパラメータには、フィルタリングしたい品詞を設定できます。フィルタリングが不要の場合は、パラメータを設定しなければOKです。

今回は、引越し侍で収集しているお客様からの口コミ文章をカテゴライズすることが目的だったので、日本語文章内の句読点や助詞などは不要かなと思って省く設定にしてみました。

## filterに指定可能な品詞番号

| 品詞番号 | 品詞名 |
|:---------|:--------|
|1|形容詞|
|2|形容動詞|
|3|感動詞|
|4|副詞|
|5|連体詞|
|6|接続詞|
|7|接頭辞|
|8|接尾辞|
|9|名詞|
|10|動詞|
|11|助詞|
|12|助動詞|
|13|特殊（句読点、カッコ、記号など）|

# まとめ
はじめ何も考えずに、そのままの日本語文章をSmart Autofillしてみたところ、うまくカテゴライズしてくれなかったのですが、よくよく考えたら、そりゃ分かち書きが必要だよねと思い、形態素解析したデータに対して実行してみたところ、いい感じでカテゴライズしてくれるようになりました。

実際に運用するには、Prediction APIを使ってプログラミングするほうが良いと思いますが、まずはどれくらいのクオリティで自動補完してくれるかのテストには、お手軽に試せるSmart Autofillはとても便利でした。
raspberry pi 1 model bで、node-red　その１５

#概要
raspberry pi 1 model bの、node-redで、usbメモリをマウントして、ファイルをコピーしてみた。

#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite

#写真
![copy.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/b8588cbd-c57a-a60b-8495-6b698bc60f74.jpeg)

```
[{"id":"3350341a.acf9cc","type":"inject","z":"4f4f703e.a2a9d","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":120,"y":704,"wires":[["f74f5535.2f9ea8"]]},{"id":"f74f5535.2f9ea8","type":"exec","z":"4f4f703e.a2a9d","command":"sudo python /home/pi/py/copy.py","addpay":true,"append":"","useSpawn":"","timer":"","name":"copy","x":326,"y":702.5,"wires":[[],[],[]]}]

```
#準備
sudo aputitude install usbmount
#サンプルコード
```
import shutil

shutil.copyfile("/media/usb0/1.pdf", "/var/www/html/1.pdf")
shutil.copyfile("/media/usb0/2.pdf", "/var/www/html/2.pdf")
shutil.copyfile("/media/usb0/3.pdf", "/var/www/html/3.pdf")
shutil.copyfile("/media/usb0/4.pdf", "/var/www/html/4.pdf")
shutil.copyfile("/media/usb0/5.pdf", "/var/www/html/5.pdf")
print("ok");
```
system rbenvでsudo rbenv installするとrbenvがない・installがないと言われる

rubyよく分からない勢です。

Rubyのバージョンが違うと怒られたので

```
$ rbenv install
```

をすると

```
mkdir: cannot create directory ‘/usr/local/rbenv/versions/2.1.5’: Permission denied
```

と怒られました。
そりゃそうだろうねと思ってsudoを付けると

```
$ sudo rbenv install
sudo: rbenv: command not found
```

となります。なるほど、rbenvへのパスが通ってなかったのかな、ということでいつも通りPATHを渡して実行しました。

```
$ sudo env "PATH=$PATH" rbenv install
rbenv: no such command `install'
```

今度はrbenvの中がだめらしい・・・。
調べてみるとruby-buildというのがないとこのメッセージが出るようですが、locateとかするとあるんですよね。

なんでかなぁと思って環境変数を見比べていたら、分かりました。

```
$ export RBENV_ROOT=/usr/local/rbenv
```

が必要だったんですね。これで無事に解決できました。
Emacsのフォント設定

Arch Linux で快適に使うためのメモ。

ググったが、`~/.Xresources`を使う方法ばかりで、それだと上手く行かないことがあったので。

下記を実行して、対話的に設定してしまうのが早い。

`M-x customize-face RET default RET`

参考
http://emacs.stackexchange.com/questions/2501/how-can-i-set-default-font-in-emacs
【実機】Windows Server 2012 R2にMovable Type 6をインストールする

実機とバーチャルにて動きが違ったのでメモする

# 資料
## 必要インストール環境と、ブラウザ動作環境
https://www.movabletype.jp/documentation/system_requirements.html

# インストール環境

## Perl

## サーバー OS
Windows Server 2012 R2（64bit）

## ウェブサーバー
Microsoft Internet Information Server





# ********************
## Perl
Active Perlのコミュニティエディション（フリー）だとギリギリ動くと思われるバージョン「5.22.2.2202」がある
http://www.activestate.com/activeperl/downloads

Strawberry Perlだとお好きなバージョンをインストールできる
http://strawberryperl.com/releases.html
インターネットで文献をググって見ると最近（2016/11/28現在）のおすすめは「Strawberry Perl」みたいだ。

## サーバー OS
Windows Server 2012 R2
今回の案件が「Windows Server 2012 R2」だったので一択。

## ウェブサーバー
ホントは何でもいいのだろうけど、前のマシンで「IIS」だったので「Internet Information Services Version 8.5.9600.16384」を採用。

## データベース
MySQL バージョン 5.7.16
これもコミュニティエディション（フリー）の「MySQL Community Server」の「Microsoft Windows 」を選択してインストーラー（MSI）を入れる。
http://dev.mysql.com/downloads/

## Perl モジュール
ここで問題なのがどうやってPerlモジュールを入れるか？
Active　Perlだとおなじみのの「PPM」だと思うけど、Strawberry Perlだと「CPAN」でインストールしている文献が多かった。
しかし、気軽にアンインストールもできる「PPM」を採用してインストールした方がいいかなと思います。

## PHP
PHPじゃないと動かないツールもるのでインストール。
1.Microsoftの公式マニュアルを読む　　 　
https://msdn.microsoft.com/ja-jp/library/hh994592(v=ws.11).aspx　
とりあえず、WinCacheを動作させるには**Version５．３**まで落とさないといけないらしいけど
バージョン「5.6.28」を入れてWinCacheのクダリは読まなかったことにする。

２．PHP.iniの設定は以下のマニュアルを参考にした。
http://www.phpbook.jp/install/
【注意】
１の設定でFastCGIにしたからか
http://localhost/phpinfo.php
が表示されなかった。
php.iniの
fastcgi.impersonate = 1
のコメントアウトを外すことで動作した。
fastcgi.logging = 0
ついでに上記もコメントアウトを外した。

#イメージドライバー
ImageMagickというイメージドライバーが一番有名なのかなと思いますが、これがPPMのGUIでインストールしてもインストールされたことにならない。
https://code.activestate.com/ppm/PerlMagick/
プロンプトで　`ppm install PerlMagic`と打ったところ入ったことになった。
しかし、サムネイルが生成されない。
まだ、何かが足りない？！
いろいろ文献をググってみると「**W i n d o w s を 再 起 動 し　な　い　と　ダ　メ　よ**」とちらほら見かける、実機なので簡単に再起動できず。。。
MediaQueriesを横着して書く方法@Sass

Sassのmixin機能を利用して、冗長なメディアクエリを簡単に書きます。


# まずブレイクポイントは変数にします
BootStrapの設定を参考に、４デバイスを想定しました。
実のところ**PCかスマホだけで十分！**という場合も少なくないですが、せっかくなので４つとも使います。損はないです。

```scss
//== Screen Size
$screen-xs: 480px !default; //Extra small screen(xs)->smartphone
$screen-sm: 768px !default; //Small screen(sm) ->tablet
$screen-md: 992px !default; //Medium screen(md) ->desktop
$screen-lg: 1200px !default; //Large screen(lg） ->wide desktop
```


# Mixinを定義します
`@content`ディレクティブでコンテントブロックを渡していきます。
デバイス略称(`lg|md|sm|xs`)を引数として、`mq()`というmixinを定義してます。

下２つ（pc/sp）は横着の結果生まれました。
モバイルファースト(sp)で作った後、申し訳程度のPC対応するときに重宝しました。悪手なんでしょうけど、暫定処置としてよく使ってます。
可読性のため端折ってますが、実務に組み込む場合は変数をMixin用に置き換えて管理したり、もう少しちゃんと作った方が良いです。

```scss
@mixin mq($DEVICE) {
    // Large screen / wide desktop
    @if $DEVICE == "lg" {
        @media (min-width: $screen-lg) {
            @content;
        }
    }
    // Medium screen / desktop
    @else if $DEVICE == "md" {
        @media (min-width: $screen-md) and (max-width: ($screen-lg - 1)) {
            @content;
        }
    }
    // Small screen / tablet
    @else if $DEVICE == "sm" {
        @media (min-width: $screen-sm) and (max-width: ($screen-md - 1)) {
            @content;
        }
    }
    // Extra small screen / smartphone
    @else if $DEVICE == "xs" {
        @media (max-width: ($screen-sm - 1)) {
            @content;
        }
    }
    // ★PC★ (md & lg)
    @else if $DEVICE == "pc" {
        @media (min-width: $screen-md) {
            @content;
        }
    }
    // ★SP★ (xs & sm)
    @else if $DEVICE == "sp" {
        @media (max-width: ($screen-md - 1)) {
            @content;
        }
    }
}
```


# 実際書いてみる
メディアクエリの管理方法は様々ですが、ルールセットの中に書いてしまうのが手軽で良いです。スコープもわかりやすいし。
別々にしちゃうとどうも忘れるというか、そもそも別ける手間がめんどくさくてつらい。

```scss
.banner {
  margin: 0;
  @include mq(lg) {
    width: 512px;
  }
  @include mq(md) {
    width: 256px;
  }
  @include mq(sm) {
    width: 128px;
  }
  @include mq(xs) {
    width: 64px;
  }
}
```
と書くと、以下のようにうまいこと展開してくれます。

```CSS
.banner {
  margin: 0;
}
@media (min-width: 1200px) {
  .banner {
    width: 512px;
  }
}
@media (min-width: 992px) and (max-width: 1199px) {
  .banner {
    width: 256px;
  }
}
@media (min-width: 768px) and (max-width: 991px) {
  .banner {
    width: 128px;
  }
}
@media (max-width: 767px) {
  .banner {
    width: 64px;
  }
}
```

# 大事なこと
頑張ってまとめるように書いてもとっ散らかるのがお約束でが、[CSS MQPacker](https://github.com/hail2u/node-css-mqpacker)という神プラグインが自動でひとまとめにしてくれます。
ADDA > iterative.c > Checkpoint systems to save the current state of the iterative solver > vectors: xvec, rvec, pvec (Avecbuffer is _not_ saved)

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4

GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

In `iterative.c`, I found the following comments:

>/* Checkpoint systems saves the current state of the iterative solver to the file. By default (for every iterative
 * solver) a number of scalars and vectors are saved. The scalars include, among others, **inprodR**. **There are 3 default
 * vectors: xvec, rvec, pvec (Avecbuffer is _not_ saved)**. If the iterative solver requires any other scalars or vectors
 * to describe its state, this information should be specified in structure arrays 'scalars' and 'vectors'.
 */

The Checkpoint systems are prepared with functions named as  `SaveIterChpoint()` and `LoadIterChpoint()`.

If my understanding is correct, the Checkpoint systems are used to stop/resume the calculation. Therefore I think that SaveIterChpoint() stores the coefficients of system of linear equations somewhere as files.
ADDA > iterative.c > InitFieldfromE() > sets starting vector for linear system x_0, as well as A.x_0, r_0=b-A.x_0, and |r_0|^2 from given electric field;

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4

GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

In http://qiita.com/7of9/items/ea30561156acf3ef792a, after reading 'xvec', the `InitFieldfromE()` is called to transform xvec into starting vector.

The `InitFieldfromE()` is defined as follows:

```iterative.c
static void InitFieldfromE(void)
/* sets starting vector for linear system x_0, as well as A.x_0, r_0=b-A.x_0, and |r_0|^2 from given electric field;
 * assumes that xvec contains initial electric field, it is then replaced by x_0
 */
{
	// calculate x = (1/cc_sqrt)*V*chi*E (both x and E are stored in xvec)
	doublecomplex mult[MAX_NMAT][3];
	int i,j;
	for (i=0;i<Nmat;i++) for (j=0;j<3;j++) mult[i][j]=1/(cc_sqrt[i][j]*chi_inv[i][j]);
	nMultSelf_mat(xvec,mult);
	// calculate A.x_0, r_0=b-A.x_0, and |r_0|^2
	MatVec(xvec,Avecbuffer,NULL,false,&Timing_MVP,&Timing_MVPComm);
	nSubtr(rvec,pvec,Avecbuffer,&inprodR,&Timing_InitIterComm);
}
```

The `nSubtr()` is defined at `linalg.c` as follows:

```linalg.c
oid nSubtr(doublecomplex * restrict a,const doublecomplex * restrict b,const doublecomplex * restrict c,
	double * restrict inprod,TIME_TYPE *comm_timing)
// a=b-c, inprod=|a|^2; !!! a,b,c must not alias !!!
{
   ...
```
【Memo】MTAppJSONTableの既定値がある場合の条件分岐について


案件のバグ対応しながらで「あれ？」って気づいてしまったというか初歩的なミスで「あ〜そうだよね」ってなってしまった。凡ミスというか普通の感覚で条件分岐使ってましたという内容になります。

* [【Tips】MTAppJSONTableのテーブルを初期状態で表作る方法](http://qiita.com/redamoon/items/8b8ede0492f6efdaf79d)
* [【Memo】MTタグでMTAppjQueryのJSONTableに孫オブジェクトがある場合の取得方法](http://qiita.com/redamoon/items/32aa616be67bea26a9da)

以前、MTAppjQueryのJSONTableの記事に関して投稿したのですが、既定値に入力値がなかった時の条件分岐の仕方についてメモしておきたいと思いました。
値とは関係ない外側のHTMLが、値がなくても出力されていることに気づいたからことが発端です。※なんで出力されているの？

例えば、hogeというtextareaの種類のカスタムフィールドを作った時に以下のような条件分岐ができると思います。

```html
<mt:If tag="hoge">
<div class="hoge_box">
◯◯の機能: <mt:hoge>
</div>
</mt:If>
```

通常カスタムフィールドはtagなの判定で動作するのですが、前回紹介した既定値にJSONを入れている状態だとtagとして値がすでに入っているため`<mt:If tag="hoge">`は処理が抜けて外側のHTMLは条件にマッチしているため出力されてしまいます。
※なんで値入れてないのに動いているの？って思ったら既定値入っているからだ！と気づきました。。( ﾟдﾟ)ﾊｯ!そりゃそうだよね。`<mt:If tag="hoge">`で外を囲ってました。初歩的すぎる。。

今回の場合は、既定値で◯◯件すでにJSONで値をセットした状態で、MTAppAssetFieldを使っての処理だったのでアップロードしない記事もあったりしていたので、解決方法を考えた結果valueの値を比較の対象にした形で動かせば良いかなって思い実装してみました。

前回の[【Memo】MTタグでMTAppjQueryのJSONTableに孫オブジェクトがある場合の取得方法]()の記事で使ったソースを少し見直してみた結果がこちら

* `<mt:If tag="hoge">`の変わりに`<mt:If name="ImagePathHash">`を条件対象にしておく値があったら出力したいHTMLはここの中に組み込んでおく。

```html
<mt:Loop name="items">
<mt:Var name="items" index="$items_index" setvar="item">
<mt:Var name="item" key="imagePath" setvar="ImagePathHash">  // itemのimagePathを変数に格納
<mt:If name="ImagePathHash">
  <mt:Var name="ImagePathHash" json_decode="1" setvar="jsonImagePath">  // imagePathに対してjson_decodeを定義し変数に格納
  <mt:Var name="jsonImagePath" key="url" setvar="ImagePath_url">  // キーのurlを取得し変数格納
</mt:If>

<mt:If name="ImagePathHash">  // ImagePathHashを分岐に加えておく。フィールドの値がなかった場合は以下のHTMLは出力されません。
// メインのHTMLループ部分
<mt:If name="__first__">
<h1>タイトルが入ります。</h1>
<ul>
</mt:If>
  <li>
    <img src="<mt:Var name="ImagePath_url" />" alt="<mt:Var name="item" key="description">"/>
  </li>
<mt:If name="__last__">
</ul>
</mt:If>

</mt:If>

<mt:SetVar name="items_index" op="++">  // items_indexの値をインクリメント
</mt:Loop>
```

結論として、カスタムフィールドに既定値にすでに値がある場合は`<mt:If tag="◯◯">`って一致して動いちゃうよね？って話になるのですが、MTAppJSONTableを使ったケースで尚且つ既定値にJSONがある場合も同じで`<mt:If tag="◯◯">`って処理通るようですね。
当たり前なんですがテーブルにセルに値がないから、そこの条件にマッチしないから通らないのが正常なんだと思い錯覚してしまいました。あなたは正常だったのですよ。正常ではないのは私でした。すみませんm(_ _)m

### **既定値あったらtag動きます。私自身がバグでございました（思い込みってすごいな）**

大したことじゃないのですが、時間がたつと忘れる自分のためのメモにしようと思いました。
5分でできた！グラフ出力をmorris.jsで試してみる

# やりたいこと
簡単にちょっとかっこいいグラフを表示させたいので、morris.jsを使ってみる。
イメージとしては、こんな感じ。

<img width="505" alt="スクリーンショット 2016-11-28 7.16.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/143284/589c42f6-0471-36b2-2ebd-4aad5fd8095a.png">

# やったこと

## 1. javascriptとcssの読み込み

```html
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.min.js"></script>
```

> morris.jsは、raphaelとjqueryに依存しているため、上記を読み込む。

## 2. 出力先に、divタグを設置

```html
<div id="chart" style="height: 300px;"></div>
```

> id名と出力するグラフの高さを入力する。

## 3. グラフの出力内容を記載する

```js
new Morris.Line(
{
    element: 'chart',
    data: [
    	{"date":"2016-11-28","lineA":"128","lineB":"226"},
    	{"date":"2016-11-27","lineA":"128","lineB":"227"},
    	{"date":"2016-11-26","lineA":"127","lineB":"230"}
    ],
    xkey: 'date',
    ykeys: ['lineA','lineB'],
    labels: ['LineA','LineB'],
    lineWidth : 2,
    pointSize : 3,
    ymax : 230,
    ymin : 123,
    smooth : true,
    hideHover : true,
}
);
```

> 上記を記載するだけで、グラフを描画することが可能。
> 1ページ内に複数グラフを描画させたい場合は、2のdivタグのID名を変えて、
> elementの値をID名に合わせて、追記してあげれば複数のグラフを表示することができる

## 出力結果を確認

<img width="503" alt="スクリーンショット 2016-11-28 7.16.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/143284/b98892e8-3531-756a-f694-820d3d7a4421.png">


## その他ポイント

### 1つのグラフの中に、複数の線を表示させたい

> ykeysとlabelsを増やすことで、複数線を表示させることができる

### グラフの線を太くしたい

> lineWidthとpoinSizeの値を変えることで、線の太さ、値のポイントのサイズを変更することができる

### Y軸の高さを固定したい

> ymaxとyminを設定することで、Y軸の最大値とY軸の最小値を設定することができる

### 線を滑らかにしたい

> smoothを入れることで、滑らかな曲線で表現することができる


# 結果
グラフを書くには、オススメかも。
使い方もとても簡単でした。
技術英語 > Don't be temped to take shortcuts.

@ Code Complete (No. 17776 / 36077)

Windwos2000の開発最終段階で、不具合の対応について。

> **<font color=red>Don't be temped to take shortcuts. </font>** It might take more time, but it'll probably take less.

<hr>
関連して思い出したのは

http://qiita.com/7of9/items/25374ab44a1d67f4b423

> Don't jump to the conclusion.
Laravelでconfigの変更が反映されない場合

ソーシャル認証を実装する時に、services.phpに記述したfacebookとtwitterの設定が読み込まれず数日を費やしたのでメモ。

・Facebook認証でSocialiteを使おうとしたがapp_idが無いとかredirect_uriが無いとか言われて数日間さまよう。。
・諦めてSocialiteではなくfacebookSDK for PHPを使おうとするが、今度はなぜかCSRFの検証が出来ず原因の箇所まで特定するも解決策がわからず頓挫
・諦めてtwitter認証を実装しようとすると今度はconfigが読み込まれていないことに気づく
・dd()でapp["config"]の中身を見るとservicesの中に追加したはずのfacebookとtwitterのキーが無い。。
・調べるとconfigの変更が反映されないのはキャッシュされていてキャッシュの方が読み込まれているから
・php artisan config:cacheを実行したら一発で読み込まれた。。

以上
RedSVD を用いて疎行列の特異値分解を求める

#RedSVD

[RedSVD](https://code.google.com/archive/p/redsvd/) は修正BSDライセンスで公開されている行列分解ライブラリです．

C++の線形代数ライブラリである [Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page) を利用しており，簡単に利用することができます．
Eigenは疎行列を扱うためのクラスを提供していますが（SparseMatrix），特異値分解は密行列のみにしか対応しておりません．
RedSVDは SparseMatrix の特異値分解を計算することができるため，非常に便利です．


[Wiki](https://code.google.com/archive/p/redsvd/wikis/Japanese.wiki)によるとheaderだけの [RedSVD](https://github.com/ntessore/redsvd-h)も公開されているため，今回はこちらのheaderを用いて実装してみたいと思います．

headerは /usr/local/include などに配置すれば利用することができます．



また，RedSVDや特異値分解の詳細は以下の記事を御覧ください．
DO++ 「行列分解ライブラリredsvdを公開しました」
http://hillbig.cocolog-nifty.com/do/2010/08/redsvd-aa59.html

#実装例

実装例として，6×5の疎行列 $M$ の特異値分解を求めるプログラムを実装しました．

具体的には，$M = USV^T$ を満たす行列 $U$，$S$，$V$を求めます．

行列 $M$ は以下の通りです．

```
1 0 1 0 0
0 1 0 0 0
1 1 0 0 0
1 0 0 0 1
1 0 0 0 1
0 0 0 1 0
```

Eigenでは，``Eigen::Triplet`` を用いて疎行列 ``SparseMatrix`` を作成することが一般的です．
``vector<Eigen::Triplet<value_type>>`` に非零要素の位置と値を挿入し，``SparseMatrix`` に対して setFromTriplets() を実行します．

このようにして疎行列を作成すれば，あとは RedSVD のコンストラクタを用いるだけで行列 $U$，$S$，$V$ を求めることができます．

```
RedSVD::RedSVD<Eigen::SparseMatrix<double>> svd(M);
```

コンストラクタ内の compute() によって既に特異値分解が計算されているので，あとは matrixU() といった関数で行列を取り出すだけです．

行列 $U$ は matrixU()，行列 $S$ は singularValues().asDiagonal()，行列 $V$ は matrixV() を実行します．

ここで注意なのですが，singularValues() は特異値が格納されたベクトルが得られるため，asDiagonal() 関数を用いて対角行列に変換する必要があります．

以上を踏まえ，疎行列 $M$ の特異値分解を求めるプログラムを以下に示します．

```
#include <iostream>
#include <vector>
#include <Eigen/Sparse>
#include <Eigen/SVD>
#include <RedSVD/RedSVD-h>

using namespace std;
using T = Eigen::Triplet<double>;

int main()
{
    Eigen::SparseMatrix<double> M(6, 5);
    vector<T> t;
    t.push_back(T(0, 0, 1));
    t.push_back(T(0, 2, 1));
    t.push_back(T(1, 1, 1));
    t.push_back(T(2, 0, 1));
    t.push_back(T(2, 1, 1));
    t.push_back(T(3, 0, 1));
    t.push_back(T(3, 4, 1));
    t.push_back(T(4, 0, 1));
    t.push_back(T(4, 4, 1));
    t.push_back(T(5, 3, 1));

    M.setFromTriplets(begin(t), end(t));

    cout << M << endl;

    RedSVD::RedSVD<Eigen::SparseMatrix<double>> svd(M);
    Eigen::MatrixXd U = svd.matrixU();
    Eigen::MatrixXd S = svd.singularValues().asDiagonal();
    Eigen::MatrixXd V = svd.matrixV();
    cout << "U: " << endl << U << endl;
    cout << "S: " << endl << S << endl;
    cout << "V: " << endl << V << endl;
    cout << "M_approx: " << endl << U*S*V.transpose() << endl;
}
```

実行結果

<img width="500" alt="redsvd.png" src="https://qiita-image-store.s3.amazonaws.com/0/52644/9ae7fdc4-086b-99f6-fddb-a0a2a79e6962.png">

#まとめ

RedSVD を用いることで，簡単に疎行列の特異値分解を計算することができました．

今回の例では小さな行列に対して処理を行いましたが，より大きな行列に対しても実行可能です．
少しでも実験や開発の参考になれば幸いです．
Herokuとpythonのwebフレームワークbottleを使ってWebアプリ(オウム返し)を作る【入門者向け】

#はじめに
LINE BOT作成するにあたって作ってみようと思い作成。
せっかくなので自分用のメモついでに記事にしてみました。

#実行環境
OS X 10.12.1
Python 3.5.1
bottle 0.12.10

#まずは事前準備

##Heroku

###1.Herokuのアカウント作成
[こちら](https://signup.heroku.com/ "Heroku")から登録を行います。

###2.Heroku CLI のインストール
Heroku CLIはHerokuをコマンドラインで操作するためのものです。
[こちら](https://devcenter.heroku.com/articles/heroku-command-line "Heroku CLI")でOS X installerをダウンロードし、Heroku CLIのインストールを行います。

##bottleのインストール
bottleとはwebアプリケーションのフレームワークです。これを今回使用していきます。
以下のコマンド入力してインストールを行います。pipについてはググってください。

```
% pip install bottle
```

#いざ実装

##環境構築

環境構築と言ってもやることは一つでgitコマンドで環境を設定するだけです。
sampleというディレクリ内で作業していきましょう。

```
% mkdir sample
% cd sample
% git init
```

##オウム返しアプリ開発

エディタを開いて以下のようにコードを書きます。

```python:app.py
# -*- coding:utf-8 -*-

import os
from bottle import route, run
from bottle import get, post, request


@route('/', method='GET')
def input():
    input_txt = request.query.get('user')
    #GETで何も渡されていない時はinput_txtに何も入れない
    input_txt = "" if input_txt is None else input_txt
    return '''
    <form action="/" method="post">
            INPUT: <input name="input_txt" type="text" value="{input_txt}"/>
            <input value="echo" type="submit" />
        </form>
    '''.format(input_txt=input_txt)


@route('/', method='POST')
def do_echo():
    input_txt = request.forms.get('input_txt')
    return "{input_txt}".format(input_txt=input_txt)

run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
```

##Herokuにデプロイするための準備

python アプリを Heroku にデプロイするためには、依存関係のあるライブラリをrequirements.txt というファイルに書き込んでおく必要があります。また、Procfile というファイルも必要になります。
今回使用した bottle のバージョンを ```pip freeze``` で確認すると bottle==0.12.10 という記述が見つかるので以下のコマンドで requirements.txt に記入します。また、Procfile の作成には以下のようなコマンドを入力します。

```
% echo bottle==0.12.10 > requirements.txt
% echo web: python app.py > Procfile
```

このディレクトリ内での作業は以上で終了ですので、gitコマンドでコミットしておきます。

```
% git add .
% git commit -m "first commit"
```

##アプリをHerokuにデプロイ

Herokuにログインします。

```
% heroku login
```

と入力すると、先ほど登録したE-mailアドレスとパスワードを聞かれるので入力します。
成功すると以下のように表示されるはずです。

```
Logged in as 登録したメールアドレス
```

次に以下のように入力します。注意点としては "heroku apps:create XXX " の XXX は Heroku全体から見てユニークな名前にしなければならないという点です。なので誰とも被っていない名前を使うようにしましょう。被っていた場合は ``` ▸    Name is already taken ``` と表示されるはずです。

```
% heroku apps:create myapp-117118
% git push heroku master
```

ここまでの手順で誤りがなければ ```remote: Verifying deploy... done.``` が表示されているはずです。これが表示されていれば公開先は```
remote:　　　　　　https://myapp-117118.herokuapp.com/ deployed to Heroku
```の部分に書かれていますので、```
% open https://myapp-117118.herokuapp.com/
```とコマンドを打てば作成したアプリケーションが開くと思います。

##公開したアプリの確認

適当な文字を入力し・・・echoをクリック。
![スクリーンショット 2016-11-28 3.14.35.png](https://qiita-image-store.s3.amazonaws.com/0/150412/e840ae49-8f37-2306-8c34-2c19f5601dcb.png)

きちんと反映されていますね！
![スクリーンショット 2016-11-28 3.14.45.png](https://qiita-image-store.s3.amazonaws.com/0/150412/45cc792b-7c02-8023-ecf2-341a446688d5.png)

#おわりに

思ったより簡単にwebアプリが作成できたという印象なのではないでしょうか？
プログラミング自体ほとんどやったことがないという方には "app.py" に書かれているコードを理解するのに苦労するかもしれませんが・・・

ちなみに今回が初投稿なのですが、どこでどう区切ると良いのか・・ってことが一番難しいですね(笑)　記事を書いている他のみなさんの凄さを改めて実感しています・・。
また、私も初心者なので改善すべき内容や誤った内容がありましたらご教授ください。
MaxのパッケージマネージャでLinkライブラリを入れたのに開けなかった話

# なんだかんだで結果だけ

色々試したんだけど結果的にはオブジェクトであるところの.mxoがフォルダー扱いになってしまっていたからっぽい.

`**.mxo/Contents/Pkginfo` って名前で `iLaX????` って内容のテキストファイル作ったら直った.

[参考](http://abstrakt.vade.info/?p=62)
Cygwinのインストールがビターン！と止まる件

タイトルそのままです。
https://cygwin.com/install.html
ここから普通にダウンロードします。32bitのPCです。
なんか途中まではインストール出来るんですが
![Cygwin.JPG](https://qiita-image-store.s3.amazonaws.com/0/151325/3841da22-b935-ec91-c7d7-811122d287f9.jpeg)

ここからDiskの緑色な部分の進行が止まって、ずっとこのままです
私のパソコンは何か食らってるんですかね？
SublimeText + reveal-ckでスライド作成

恋するエディタといえばSublimeTextですね!
最近、SublimeTextのカスタマイズにはまったので、今回はreveal-ckと合体です笑

## reveal-ckとは
こちらを参考に...setupをお願いします。
[reveal-ckを使ってmarkdownでスライドを作る](http://qiita.com/tenmihi/items/7c9ae88d0735a78fab22)

### macOSSieraから権限周りが変わったようで

```
$ gem install reveal-ck
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
```

のようなERRORが来た時はこのようにしたらいけます

```
$ sudo gem install -n /usr/local/bin reveal-ck
```

## SublimeTextでreveal-ckを
自分の記事ですが...笑
[Sublime Text 3 + KotlinでHello!](http://qiita.com/hmhmsh/items/bb8c7ad083d1dd0d2742)

KotlinやJava、Swift等のBuildSystemが作れるので、reveal-ck版も同じようにできるのではと...

SublimeTextのメニューから`Tools -> Build System -> new Build System...`にアクセスし、ファイルを作成します

```reveal-ck.sublime-build
{
    "selector": ["slides.md"],
    "shell_cmd": "reveal-ck generate; reveal-ck serve"
}
```
保存先は`Packages/User/`です

`Tools -> Build System`に`reveal-ck`ができてると思いますので選択します

## 実行
`slides.md`を作成し、Markdownで書き込み、`command+b`または`command+shift+b`で実行です

## 結果
```
Generating slides for 'slides.md'..
Expected string default value for '--listen-on'; got false (boolean)
------------------------------------------------------------
[ reveal-ck ] Serving up slide content in 'slides/'.
[ reveal-ck ] Open your browser to 'http://localhost:10000'.
[ reveal-ck ] Press CTRL-C to stop.
------------------------------------------------------------
[ reveal-ck ] Getting Ready to Reload Browsers.
[ reveal-ck ] Getting Ready to Rebuild Slides.
[   reload  ] Using Guardfile at /usr/local/lib/ruby/gems/2.3.0/gems/reveal-ck-3.3.1/files/reveal-ck/Guardfile.
[   reload  ] LiveReload is waiting for a browser to connect.
[ reveal-ck ] Starting Webserver.
[   reload  ] Guard is now watching at '/Users/[名前]/[実行ファイルの階層]'
[   reload  ] Browser connected.
```
SublimeTextにこのように表示され、
http://localhost:10000
にアクセスして、スライドが表示されていれば成功です！

### error: slides.md is not valid US-ASCII
SublimeTextのPackage Installで`ConvertToUTF8`および`Codecs33`をインストールけどうまくいかず...日本語がうまく変換できてないみたいです...

### error: Address already in use - bind(2) for 127.0.0.1:10000
10000のポートがすでに使用されているようなので

```
$ lsof -i:10000
```
で探して、

```
$ kill -9 [PID]
```
で消しましょう

## 問題点
- `slides.md`の中身が英語だと、reveal-ckの特徴である、リアルタイムスライド更新もうまく機能するのですが、
中身に日本語が入るとうまくいかないですね...`index.html`が作られず...

- SublimeTextを終了させても、ポート10000が起動したままなので、手作業でkillしないといけないですね...
新型MacBookProのTouchBarにsushiが流れる動画を見て無性にsushiを流したくなったけど買えないので代わりにPlaygroundでsushiを流す話

これを見て無性にsushiを流したくなったのでPlaygroundでsushiを流してみたら意外とみんな気にいってくれたので共有します。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">sushiが流れる様子です <a href="https://t.co/Dp7OpyXFRt">pic.twitter.com/Dp7OpyXFRt</a></p>&mdash; mzp (@mzp) <a href="https://twitter.com/mzp/status/799856396778905600">2016年11月19日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ということで流す。※Xcode8.1

```swift
import UIKit
import PlaygroundSupport

let view = UIView(frame: CGRect(x: 0, y:0, width:320, height:44))
view.backgroundColor = UIColor.black

PlaygroundPage.current.liveView = view

(0...2).forEach {
    let sushi = UILabel(frame: CGRect(x:320, y:0, width:44, height:44))
    sushi.text = "🍣"
    
    view.addSubview(sushi)
    
    UIView.animate(withDuration: 3, delay: TimeInterval($0), options: [.curveLinear, .repeat], animations: { () -> Void in
        sushi.center = CGPoint(x: 0, y: sushi.center.y)
        
    }, completion: nil)
}
```

結果こんな感じ。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">sushiはやっぱり人気らしい <a href="https://t.co/3XHABqC6OU">pic.twitter.com/3XHABqC6OU</a></p>&mdash; hideyuki nanashima (@jollyjoester) <a href="https://twitter.com/jollyjoester/status/802936246884438016">2016年11月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

みんなでPlaygroundにsushiを流そう^^/
GoogleVRで遊んでみた

とりあえず下記サイトから　Google VR SDK for Unityをダウンロード
<a href="https://developers.google.com/vr/cardboard/overview?hl=ja" target="_blank">Google VR</a>

<h2>環境</h2>
PC:mac
Unity:5.4.1f1
xcode:Version 8.1
検証端末:ipodTouch第6世代

<h2>ダウンロードしたところ</h2>
<img src="http://ayumegu.jp/wp-content/uploads/2016/11/blog17-1.png" width="300px">

<h2>早速デモシーンを見てみる</h2>
左:ControllerDemo
Unity上だとOpetionキーを押したままマウス移動でカメラ動かせます。
<img src="http://ayumegu.jp/wp-content/uploads/2016/11/blog17-2.png">

右:DemoScene
こちら視点の位置で当たり判定を検出するデモ
これでコントローラーなくても簡単な操作が出来ます。
<img src="http://ayumegu.jp/wp-content/uploads/2016/11/blog17-3.png">

<h2>実機に入れてみる</h2>
BuildSettingの端末の向きだけ横に設定して・・・・これちゃんと設定しないと、だめだよ・・・。
<img src="http://ayumegu.jp/wp-content/uploads/2016/11/blog17-4.png">
xcode上では前はBitcodeとかの設定必要だった気がしたのですが、特になくて動きました。
楽だ〜

VR Modeを選択するとカメラ一つの方にも簡単に切り替えられます。
<img src="http://ayumegu.jp/wp-content/uploads/2016/11/blog17-6.png"><img src="http://ayumegu.jp/wp-content/uploads/2016/11/blog17-5.png">

<h2>1から作ってみる</h2>
ではデモも動いたところで簡単に1から作ってみる
新しいシーンを開いて
GoogleVR/Prefabs/GvrViewerMainをHierarchyに置いたら完了
これだけでカメラが二つに、ジャイロ対応します。

VRモードとカメラ一つのモードを切り替えるには
GvrViewer.csのVR Mode Enabledのチェックを外すとカメラ一つのモードになります。

<h3>目線でUI操作</h3>
World SpaceにしたCanvasにボタンを適当に配置。
EventSystemをHierarchyに配置。
そして作成したeventSystemのデフォルトで付いているStandalone Input Moduleのチェックを外すか削除し、GazeInputModule.csをアタッチします。
これで、目線でボタンが反応するようになります。
この状態で端末をタッチ、Unity上だとマウスクリックでボタンが押されたことになります。

<img src="http://ayumegu.jp/wp-content/uploads/2016/11/blog17-7.png">
<img src="http://ayumegu.jp/wp-content/uploads/2016/11/blog17-1.gif">

まぁ実際には長押し、一定以上見てたら押されたことにしたりしないとだけど、今回はいいや。

<h3>UI以外の判定</h3>
UI以外の場合はCameraにPhysics Raycasterをアタッチします。
あとはGameObjectにEventTriggerをアタッチして
Pointer Enter
Pointer Exit
Pointer Click
などをセットすればOkです。
あとはスクリプトを書くだけ。
DemoのようにしたければTeleport.csのScriptを参考にすればOK

<h3>おまけ</h3>
前に作った首振りのシステムを使って自分も犬になったかのようにボールを追っかけるだけのもの。
<img src="http://ayumegu.jp/wp-content/uploads/2016/11/blog17-2.gif">