OmniAICreator/Qiita-1.07M huggingface dataset:
[baserCMS] 会員ログイン時、もとの閲覧していたページへログイン後に遷移させる

baserCMSで会員ログイン機能を作成した際に、会員ログイン時、もとの閲覧していた公開ページへ遷移させる動作を作ってみました。

■ 課題点
・会員がログインする際に、ログインフォームからのログイン後遷移の際に、マイページ側ダッシュボードへ遷移するため、もとの閲覧していたページを再度探さなくてはならないので解消したい。


## 想定している対象者
- baserCMSでウェブサイトを制作をしている方
- baserCMSでマイページ機能（会員ログイン機能）を作成している方
- baserCMSのイベント処理に興味がある方


## 発生状況
- 会員ログイン後、通常の動作ではマイページ側のダッシュボードへ遷移する点を調整したい
  - ログイン後の遷移先は、認証プレフィックス設定で設定できるが固定

### 環境
- baserCMS 3.0.6.1


## 考えてみた対処策

- ログイン用フォームへ遷移する前のリファラーを保持する
- ログイン時に、ログイン用フォームへの遷移前のURLへ遷移させる
- ログイン用フォームへの遷移前のURLは、サイト内のリンクであることをチェックする


## イベント処理の作成
利用するイベントを設定します。
startup, beforeRender の2つを利用します。



```php:ControllerEventListener.php
<?php
/**
 * [ControllerEventListener]
 *
 */
class YourPluginControllerEventListener extends BcControllerEventListener
{
	/**
	 * 登録イベント
	 *
	 */
	public $events = array(
		'startup',
		'beforeRender',
	);

	/**
	 * startup
	 * 
	 * @param CakeEvent $event
	 */
	public function startup(CakeEvent $event)
	{
		$Controller = $event->subject();
		$this->changeloginRedirect($Controller);
	}

	/**
	 * beforeRender
	 * 
	 * @param CakeEvent $event
	 */
	public function beforeRender(CakeEvent $event)
	{
		$Controller = $event->subject();
		if (BcUtil::isAdminSystem()) {
			return;
		}
		$this->holdRefererUrl($Controller);
	}

	/**
	 * ログイン画面に遷移する際に、遷移前のURLをセッションに保持する
	 * 
	 * @param Object $Controller
	 */
	private function holdRefererUrl($Controller)
	{
		$targetController = array('members');
		if (!in_array($Controller->request->params['controller'], $targetController)) {
			return;
		}

		$targetAction = array('admin_login');
		if (!in_array($Controller->request->params['action'], $targetAction)) {
			return;
		}

		$referer = $Controller->referer();
		$Controller->Session->write('MyMember.referer', $referer);
	}

	/**
	 * 会員ログインの際、ログイン画面に遷移する前のページをログイン後の遷移画面に設定する
	 * 
	 * @param Object $Controller
	 */
	private function changeloginRedirect($Controller)
	{
		$targetController = array('members');
		if (!in_array($Controller->request->params['controller'], $targetController)) {
			return;
		}

		$targetAction = array('member_login');
		if (!in_array($Controller->request->params['action'], $targetAction)) {
			return;
		}

		if ($Controller->Session->check('MyMember.referer')) {
			$refererUrl = $Controller->Session->read('MyMember.referer');
			if ($this->isAccessFromThisSite($refererUrl)) {
				$Controller->BcAuth->loginRedirect = $refererUrl;
			}
		}
	}

	/**
	 * アクセス元がサイト内からのURLかを判定する
	 * 
	 * @return boolean
	 */
	private function isAccessFromThisSite($refererUrl)
	{
		$parseUrl = parse_url($refererUrl);
		if (!isset($parseUrl['path'])) {
			return false;
		}

		$parsedUrl = Router::parse($parseUrl['path']);
		if (!isset($parsedUrl['controller']) || !isset($parsedUrl['action'])) {
			return false;
		}
		// ログイン画面の場合はリダイレクトループになるため防止する
		if ($parsedUrl['action'] == 'member_login') {
			return false;
		}

		return true;
	}

}
```

### 留意点

ログイン画面に遷移する際に、遷移前のURLをセッションに保持するタイミング、
アクセス元がサイト内からのURLかを判定するタイミング、
はそれぞれRequest情報、URL解析した情報をもとにして判定しているので、より厳密にしたり、特定のURLでは利用しないなどの調整ができます。

## 参考記事

- http://book.cakephp.org/2.0/ja/core-libraries/components/sessions.html
RaspberryPi(Raspbian)のCPUの温度をcatを使わないで取得してみた


raspiのCPUの温度を知りたいときは多くの人が`cat`で取得していると思います

```bash
$ cat /sys/class/thermal/thermal_zone0/temp
#40084
```
これって打つの大変ですよね
しかも1000倍の値で出力されるし...	
でも以下のコマンドでもCPU温度を知ることができます

```bash
$ vcgencmd measure_temp
#temp=40.1'C
```

こっちの方がだいぶ短いですね
しかも1000倍になってないし、単位も付いてます

>[追記 コメントより指摘がありました]
>`VCHI initialization failed`
のようなエラーが出た場合、実行するユーザーが`video`グループに入っていないので
> ```bash
>$ sudo usermod -aG video ${実行したいユーザ名}
>```
>と実行してユーザーを`video`グループに追加してください

`vcgencmd`はその他にも

```bash
#CPU周波数を表示
$ vcgencmd measure_clock arm
#frequency(45)=700074000

#電圧を表示
$ vcgencmd measure_volts
#volt=1.2000V

#CPU(arm),GPUのメモリ使用量
$ vcgencmd get_mem arm
#arm=448M
$ vcgencmd get_mem gpu
#gpu=64M
```

などができます
他にも色々あります

詳細は`vcgencmd commands`か[RPI vcgencmd usage(英語)](http://elinux.org/RPI_vcgencmd_usage)でご確認ください
iOSプッシュ通知用SSL証明書の有効期限をシェルスクリプトで監視する。 

# 経緯
先日、iOS向けプッシュ通知用SSL証明書の有効期限が切れており、
慌てて証明書の再作成と監視の実装を行いました。

意外にも、iOS向けプッシュ通知用SSL証明書の有効期限監視の情報出てこなくて困りました。
なので、備忘兼/誰かのお役に立てればと…。

ちなみに、プッシュ通知用のサーバに以下のログが出ており、
ログ監視していたおかげで気づくことができました。危なかった…。
※いや手遅れだったのだけれども。。。


```
ERROR: Unable to connect to 'ssl://gateway.push.apple.com:2195'
```

# 前提(2015/10/13追記)
### Appleのプッシュ通知サーバとやり取りするサーバに下記が入っていること。
* プッシュ通知用SSL証明書
* bcコマンド、exprコマンド
* opensslコマンド
* nrpe(Nagiosを使用する場合)
* slack通知用のスクリプト(slackへの通知をする場合)

### Nagiosサーバがあること(Nagiosで監視する場合のみ)

# 監視方法(概要)
SSL証明書の有効期限監視？そんなのNagiosのcheck_httpプラグインでチョロいっす！

…と言いたいところですが、今回監視したいのはAppleのプッシュ通知サーバとやり取りするための証明書の有効期限。
WEBサーバのSSL証明書の有効期限ではないので、check_httpでは監視できません。。

なので、

1. opensslコマンドで有効期限を引っ張る。
2. dateコマンドでUNIX_TIMEに変換。
3. 引き算＆割り算して残り何日か計算し、if文で判定して結果をNagiosに返す。

というスクリプトを作成しました。

### 拙作なサンプルスクリプト
https://github.com/koitatu/nagios_scripts

# 参考にさせていただいた記事
http://qiita.com/miriorg/items/ead54100bc145008e031

# 監視方法詳細

1.opensslコマンドで証明書の有効期限を引っ張ります。

```
# openssl x509 -in <証明書ファイルのパス> -text |sed -e '/Not After/{s/^.* : //;p};d'  
Jun 13 09:50:42 2016 GMT
# 
```

2.後で残り何日？って計算したいので、UNIX_TIMEに変換します。

```
# date '--date=Jun 13 09:50:42 2016 GMT' +%s
1465811442
#
```

3.現在の日付を取得してUNIX_TIMEに変換します。

```
# date +%s
1444651962
#
```

4.bcコマンドで引き算して、残り日数(秒数)を求めます。
※後から気づいたけど、ここもexprで良い気がする。最初違うやり方でやろうとしてた際の名残ですね。。。

```
# echo 1465811442 - 1444651701|bc
21159741
#
```

5.有効期限(秒数)を日数に変換します。

```
# expr 21159741 / 86400
244
#
```

6.後はお決まりのif文で判定して、nagiosが判定出来るように終了コードを返してやれば終わりです。

* 2015/10/12 21:34追記

* 蛇足ですが、nagiosは以下のようにステータス判定します。

```
終了コード0…正常
終了コード1…warning
終了コード2…critical
その他…unknown
```

最後、駆け足になってしまいましたが、こんな感じです。
もっとスマートなやり方等あれば、是非ご指摘ください。

# 通知をslackに飛ばしたい時(2015/10/13追記)
Nagiosとか立ててないよ！って場合には、以下のような感じでslackにでも飛ばしてあげましょう。

```
### Main Routine
if [ "${DAYS_LEFT}" -le 15 ]; then
        ./slack.sh "NG" "NG - ${CERT_FILE} is remind ${DAYS_LEFT} days. Expire Date is ${JST_DATE}"
        exit 2;
elif [ "${DAYS_LEFT}" -le 30 ]; then
        ./slack.sh "NG" "NG - ${CERT_FILE} is remind ${DAYS_LEFT} days. Expire Date is ${JST_DATE}"
        exit 1;
else
        ./slack.sh "OK" "OK - ${CERT_FILE} is remind ${DAYS_LEFT} days. Expire Date is ${JST_DATE}"
        exit 0;
fi
```

### slack通知のサンプルスクリプト
~~https://github.com/koitatu/zabbix_scripts/blob/master/slack.sh~~ 

https://github.com/koitatu/nagios_scripts/blob/master/send_to_slack.sh

## 分かりやすいslack通知導入の記事
http://codenote.net/slack/2768.html (2015/11/01 修正 inncoming Webhookなのでこっちでしたorz)

~~http://lab.aratana.jp/entry/2014/12/05/124822~~ 　(incomming Webhookじゃないならこっち)

Nagiosとの連携だけど、非常に分かりやすい記事です。
【メモ】Cloud9からHerokuにRailsプロジェクトをデプロイする際の注意点(2015年10月)


2015/10/12時点でのメモです。


# rubyのバージョンを2.2.3にする。  
デフォルトでは2.2.1が入っていました。

Herokuでサポートしているバージョンの一覧はこちら

https://devcenter.heroku.com/articles/ruby-support#ruby-versions

## rvm install
Cloud9のコンソールで

```bash
rvm install 2.2.3
rvm --default use 2.2.3 # ターミナルを新しく開くとバージョンが戻っている場合がある？のでデフォルトにする （追記：けどダメw　詳しくは後述）
gem install bundler
bundle install
```

2.2.3に切り替えた上で、bundlerとgemの入れ直し。

### Gemfileにrubyのバージョンを記述

```ruby:Gemfile.rb
source 'https://rubygems.org'

ruby '2.2.3'
```

# SQLite3は1.3.10へ

Gemfileにて


```ruby:Gemfile.rb
group :development, :test do
  gem 'sqlite3', '1.3.10'
  .
  .
end
```


```ruby:Gemfile.rb
group :production do
  gem 'rails_12factor'
  gem 'pg'
end
```


```bash
bundle install --without production
```

------


そういえば``config/database.yml``はいじってない・・・。

http://qiita.com/jhorikawa/items/84a0f4a7f40f5914ad1a

こちらの記事では``1.3.9``にしたようですが、``git push heroku master``した際に


```bash
remote:        An error occurred while installing sqlite3 (1.3.10), and Bundler cannot
remote:        continue.
remote:        Make sure that `gem install sqlite3 -v '1.3.10'` succeeds before bundling.
```

というエラーメッセージがでるので、``1.3.10``にしました。


-----

``heroku create``したあとでtoolbeltアップデートしてね！みたいなメッセージが出るかもしれませんが、その時は

~~```bash
sudo apt-get install heroku-toolbelt
```~~

~~http://stackoverflow.com/questions/30746923/issues-updating-heroku-to-a-newer-version-on-cloud9-ide~~

すいません、こっちでしたorz

```bash
wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh
```

ちゃんと公式に説明がありましたよ・・・

https://docs.c9.io/docs/deploying-via-cli


-----
### rvmのバージョンが戻ってしまう
デフォルトで2.2.3にしても、新しいターミナルを開くと元のバージョンに戻ってしまう・・・とりあえず

```bash
$ cd ~
$ pwd
/home/ubuntu
$ vi .bashrc
```

``.bashrc``の一番最後に

```bash
rvm use 2.2.3
```

と記述することにしました。そして新たなターミナルを開くと

```bash
Using /usr/local/rvm/gems/ruby-2.2.3
$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
$ rvm list

rvm rubies

   ruby-1.9.3-p551 [ x86_64 ]
   ruby-2.1.5 [ x86_64 ]
   ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.3 [ x86_64 ]
```

なんか無理やりっぽいですけど・・・w
AWS Lambda - Scheduled EventのCron書式

AWS Lambdaで、Scheduled Eventをcron形式で設定しようとしたら小ハマりしたので備忘録。基本的には以下の話そのまま。

> Walkthrough 5: Using Lambda Functions to Process Scheduled Events (Python)
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/getting-started-scheduled-events.html

# 基本書式

各項目は半角スペース区切りで、時間は**UTC**で指定する。

> cron(Minutes Hours Day-of-month Month Day-of-week Year)

「分、時、日、月、曜日、年」の順ですね。一般的なcronには**year**は無いわけで、一枠多いことにご注意。

# サンプル

上のリンクのサンプルそのままですが。注意すべきは**Day-of-week**のところ、「*」だと通らないので「?」を使う必要あり。

| Example                                                                        | Cron expression            |
|--------------------------------------------------------------------------------|----------------------------|
| 毎日 10:00am (UTC) | cron(0 10 * * ? *)         |
| 毎日 12:15am (UTC) | cron(15 12 * * ? *)        |
| 月曜から金曜の 06:00pm (UTC) | cron(0 18 ? * MON-FRI *)   |
| 毎月1日の 8:00am (UTC) | cron(0 8 1 * ? *)          |
| 月曜から金曜 (UTC) で10分ごと | cron(0/10 * ? * MON-FRI *) |
| 月曜から金曜、8:00am - 5:55pm の間(UTC)で5分ごと | cron(0/5 8-17 ? * MON-FRI *) |


# 参考

> Cron ジョブを Lambda Scheduled Event に置き換えてサーバーレスを目指す
http://blog.manabusakai.com/2015/10/cron-job-to-lambda-scheduled-event/
Bracketsのショートカットを変更してカスタマイズする方法

Bracketsは独自の便利な機能がたくさんある反面、それ故にキーボードショートカットも少し独特になっています。
自分流に色々とカスタマイズしたい、出来るだけSublime Textや他のエディタと同じように使うにはどう設定していけばよいか、自分が試したことを基に紹介します。

* 基本的な使い方はこちら→[Bracketsの機能紹介、使い方解説](http://qiita.com/assialiholic/items/c8137321c7599a168b16)
* その他の便利エクステンション集はこちら→ [Brackets おすすめエクステンション集・解説](http://qiita.com/assialiholic/items/c7962f804cdb21a49327)


# まずはデフォルトのショートカットを確認する
GitHubに[公式ドキュメント](https://github.com/adobe/brackets/wiki/Brackets-Shortcuts)が、拙いですがQiitaの方にそれを訳したものも掲載しています。
→[Bracketsショートカット集](http://qiita.com/assialiholic/items/7683d94108b12f1ca3ad)

## そもそもショートカットが動かない場合
Bracketsデフォルトで予め割り当てられているものでも、環境によっては動作しないことがあります。
そういった場合の多くは機能そのものに不具合があるのではなく、そのショートカットが既にPCのグローバルとして割り当てられていることが原因かと思います。
（実際に私もCtrl+Alt系で動作しないものがありましたが、既にIntelのグラフィックスドライバのショートカットに割り当てられていたことが原因でした）

どのソフトが既にグローバルのショートカットとして使用しているか解明出来れば良いのですが、それが難しい場合まずはBrackets側のショートカットを絶対にバッティングしないものに変更して、動作チェックをすることお勧めします。

# デフォルトのショートカットを変更する
Bracketsを起動し`デバッグ→ユーザーキーマップを開く`を選択すると、keymap.jsonというファイルが表示されます。
こちらがBracketsが用意しているショートカット変更用のファイルで、overridesの中に`"希望ショートカット":コマンドID`（コマンドIDは上記の公式ドキュメント・和訳ページ参照）を入力することにより、ショートカットを変更することが出来ます。
![keymap.png](https://qiita-image-store.s3.amazonaws.com/0/48404/b5c87471-ab45-df5f-06fb-e7d770fcaf9d.png)

ファイル内にある[wikiページ](https://github.com/adobe/brackets/wiki/User-Key-Bindings)の最下部にSublime Text風にショートカットを変更するセットが予め用意されていますので、まずはこちらを参考にするのが手っ取り早いかと思います。

# エクステンションのショートカットを変更する
Bracketsを使用していく中で色々とエクステンションを追加していくと、

* EmmetがCtrl+Eで展開出来ない（BracketsではCtrl+Alt+Enterがデフォルトです）
* エクステンション同士のショートカットがバッティングする

ということが少なからず出てきます。
エクステンションで追加した機能も基本的にkeymap.jsonで変更しますが、コマンドIDを調べるのに[Brackets Key Remapper](https://bitbucket.org/sacah/brackets-key-remapper)というエクステンションを使用します。

こちらをインストールするとBrackets本体のグローバル設定ファイルであるbrackets.jsonにBracketsデフォルト、及び各エクステンションのコマンドIDとショートカットが追記されるので、そこから変更したいコマンドのIDをkeymap.jsonにコピペして、任意のキーに変更します。
![brackets.png](https://qiita-image-store.s3.amazonaws.com/0/48404/1a17ee42-0bf1-fe6e-3d3e-c1e43fcff38a.png)


brackets.json内のショートカットを直接編集しても動作しますが、出来れば対象のコマンドIDをコピペしてkeymap.jsonに追記していく形の方が望ましいかと思います。
（設定はkeymap.jsonに記述されているものが優先されます）

***

以上、簡単ですがBracketsのショートカットを変更する方法でした。
一度設定すればkeymap.json・brackets.jsonは他の環境にも持ち運べますので、少し手間がかかるのは最初だけかと思います。
ぜひ自分流にカスタマイズして、快適なBracketsライフをお送りください！
Neonライブラリ上にLiquidFloatingActionButtonを設置

# Neonライブラリ上にLiquidFloatingActionButtonを設置

画面構成を一定に維持してくれるライブラリ[Neon](https://github.com/mamaral/Neon)上で液体風のアニメーションを持ったボタンライブラリ[LiquidFloatingActionButton](https://github.com/yoavlt/LiquidFloatingActionButton)を設置する。

## 環境設定
- CocoaPodsのインストール

```
sudo gem install cocoapods
```

- ライブラリのインストール  
swift2.0でLiquidFloatingActionButtonを利用するにはbranch指定をしないといけないみたい  
https://github.com/yoavlt/LiquidFloatingActionButton/issues/13

```
platform :ios, '9.0'
use_frameworks!
 
target 'LiquidButonnOnNeon' do
  pod 'LiquidFloatingActionButton', :git => 'https://github.com/yoavlt/LiquidFloatingActionButton.git', :branch => 'swift-2.0'
  pod 'SnapKit'
  pod 'Neon', '~> 0.0'
end
 
target 'LiquidButonnOnNeonTests' do
 
end
```

## 実装

```swift

import UIKit
import LiquidFloatingActionButton
import SnapKit
import Neon

class ViewController: UIViewController ,LiquidFloatingActionButtonDataSource, LiquidFloatingActionButtonDelegate {

    var cells: [LiquidFloatingCell] = []
    let liquidButton : LiquidFloatingActionButton = LiquidFloatingActionButton()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let cellFactory: (String) -> LiquidFloatingCell = { (iconName) in
            let cell = LiquidFloatingCell(icon: UIImage(named: iconName)!)
            return cell
        }
        cells.append(cellFactory("ic_cloud"))
        cells.append(cellFactory("ic_system"))
        cells.append(cellFactory("ic_place"))

        

        liquidButton.animateStyle = .Up
        liquidButton.dataSource = self
        liquidButton.delegate = self
        self.view.addSubview(liquidButton)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // レイアウトの設定
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        
        layoutFrames()
    }
    func layoutFrames() {
        liquidButton.anchorInCorner(.BottomRight, xPad: 10, yPad: 10, width: 56, height: 56)
        
    }
    
    
    // LiquidFloatingActionButtonのデリゲート
    func numberOfCells(liquidFloatingActionButton: LiquidFloatingActionButton) -> Int {
        return cells.count
    }
    
    func cellForIndex(index: Int) -> LiquidFloatingCell {
        return cells[index]
    }
    
    func liquidFloatingActionButton(liquidFloatingActionButton: LiquidFloatingActionButton, didSelectItemAtIndex index: Int) {
        print("did Tapped! \(index)")
        liquidFloatingActionButton.close()
    }


}
```
![スクリーンショット 2015-10-12 20.49.18.png](https://qiita-image-store.s3.amazonaws.com/0/34484/02edc391-26d3-f5c0-901f-fc4234fd11bb.png)

## 感想
なぜかボタン位置がズレるけどとりあえずOKということで

アニメーションを伴ったライブラリがNeon上で利用できるのか試してみるのが目的だったけど問題ないみたい
defineで定めた定数値の計算

defineで値を定め、その値を計算するときに思い通りにならないことがあったのでメモ。
こんな初歩的内容でも超初心者に役立てば幸い！
#経緯
define constant01 30
define constant02 20
などとして定数を定めて
double d_var = constant01/constant02;
等と書いて計算させたがなぜか切り捨てられて1.0になってしまう。

#結論
define constant01 20     //小数を付けなければint(整数)として扱われる
define constant02 20.0   //小数を付ければdoubleとして(?)扱われる

#確認src 

```c:main_study01.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define input_def01 15
#define input_def02 6

int main(int argc,char *argv[]) {
        printf("this is define input study\n");
        int int_devided=0;

        //割り算をしてint型変数へ格納する 答えは2.5で切り捨てで２がint_devidedへ格納される
        int_devided = input_def01/input_def02;
        printf("devide of define_input is %d\n",int_devided);

        //割り算をしてdouble型変数へ格納する 答えの2.5がdouble_devidedへ格納されるハズだが...
        double double_devided =  input_def01/input_def02;
        printf("devide of define_input is %f\n",double_devided);//2.0が出力された！

        //いったんdouble型変数に格納してから計算すると
        double def01 = input_def01;
        double def02 = input_def02;
        double_devided =  def01/def02;
        printf("devide of double from define_input is %f\n",double_devided);//2.5が出力された
}
```

```text
$ gcc main_study01.c -o study.exe

$ ./study.exe
this is define input study
devide of define_input is 2
devide of define_input is 2.000000
devide of double from define_input is 2.500000
```

以上。
SN74141 を使う


今日はニキシー管関係の電子工作するぞー、と思ってたんだけど早速電源を壊したので、先に必要な SN74141 を使ってみた & Arduino 向けのライブラリを書いた。

![20151012-DSC04520.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/481d208b-04b4-6695-6f84-18553895b55c.jpeg "20151012-DSC04520.jpg")


SN74141 はロシア製の IC で、つなげてる10本の PIN のどれかを GND につなげるために使われる。これだけ聞くと何に使うんだろうという感じなんだけど、ニキシー管はアノードから10個あるカソードのうちどれかに繋ぐことで、電気が流れ適切な数値を点灯させることができる。

また入力が170V程度と高電圧なので、それに耐えられる必要があるんだけど、それにぴったりなのが SN74141 (と互換チップ)。というかニキシー管のために作られた IC ぽい。

- http://8901.teacup.com/aiao/bbs/66

> １．ニキシー管のプリバイアスはカソードを単に高抵抗で接地するだけではまずいのか
> 
> ・ニキシー管のカソード制御に、トランジスタを使用する場合、Trがオフになっている電極が問題になります。
> ・Trがオフの場合、Trのブレークダウン電圧(VCEO)が約50V以下のTrでは、漏れ電流が流れて管が薄く点灯します。
> ・また、逆にブレークダウン電圧が、250V以上の十分に高いTrでは、オフになっているカソード極が、放電によりアノード極と同電位まで上がる可能性があるため、他のカソード極とグロー放電を起こす場合があります。
> ・この、どちらにも影響を受けない電位が、60V～120Vとされており、プリバイアス電圧となっています。
> ・SN74141の出力部にも、トランジスタの保護とプリバイアスのために、60Vのツェナーダイオードが入っています。
> ・スタティック点灯では余り影響は出ませんが、ダイナミック点灯では、オフになったはずの極が薄く点灯する現象が出ます。

なるほど…。

とりあえずデータシートに沿って Arduino 向けのライブラリを実装。たいしたことはしてない…。

- https://github.com/hotchpotch/Arduino-SN74141

サンプルで Lチカ。わーい Lチカ、あかり Lチカ大好き〜。

- https://youtu.be/1SU47uxkKDk
ライブラリseeを使った、メソッドや変数の確認

##Pythonのライブラリseeの紹介
seeは、ライブラリ内のメソッドや変数を確認する時に便利なので重宝してます。
新しくライブラリを入れた時にちゃんとメソッドがすべて入ってるかどうかの確認に使ったり、クラスがどんな変数を持ってるのか確認する時に便利です。

###使い方
調べればすぐに出てくると思うので導入方法は割愛します。
基本的に、スクリプトには書かずに、terminal上(Mac OSX, Yosemite)で自分は使います。
ソースはこちらhttps://github.com/araile/see/blob/develop/see.py

####
```check.
$ python 
Python 2.7.10 (default, Jul 14 2015, 19:46:27) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import see
>>> see.see(see)
    help()           .PY_300          .PY_301          .SYMBOLS         .SeeError()
    .fcntl           .fn_filter()     .fnmatch         .inspect         .line_width()
    .re              .regex_filter()  .see()           .struct          .sys
    .term_width()    .termios         .textwrap
```
こんな感じで、簡単にライブラリ内に何が入っているか確認できます。
出力を見てみると、`.re .fnmatch .sys`等の標準ライブラリを使ってることがわかります。`()`がついてるものはメソッド、ついてないものは変数なので、とてもわかりやすいです。
引数の情報等があれば、もっと良いのですが...

###ライブラリseeに入っているよく使う関数
個人的によく使うものは`.fn_filter()`と`.regex_filter()`です。
`fn_filter(names, pat)`は、単純に、第一引数にイテレーションを回せるもの、第二引数にpatternを入れます。
第一引数は、普通に`see.see(see)`を入れると、上記の出力が渡されます。第二引数には、ShellScriptでつかう正規表現？を入れればそのpatternに合ったものがタプルで帰ってきます。

ちなみに、`fn_filter`の`fn`は、`fnmatch`のことです。なので、この関数は名前の通り`fnmatch`で`filter`をかけてるだけです。
下記に簡単な例を出します。1個目は変数、２個目は関数のみ出力するものになっています。
最初に`.`がついているのは、`repr()`や`+`などがライブラリによっては混じるので入れています。
####
```test_fn_filter.
>>> see.fn_filter(see.see(see), '.*[0-9a-zA-Z]')
('.PY_300', '.PY_301', '.SYMBOLS', '.fcntl', '.fnmatch', '.inspect', '.re', '.struct', '.sys', '.termios', '.textwrap')
>>> see.fn_filter(see.see(see), '.*)')
('.SeeError()', '.fn_filter()', '.line_width()', '.regex_filter()', '.see()', '.term_width()')
```
次に、`regex_filter()`
こちらも、名前の通り、regex は　regular expression のことです。
標準ライブラリ`re`にある`re.match`で`filter`をかけて、タプルで出力します。
なので、第一引数は`fn_filter`同様のもの、`第二引数には正規表現を与えます。
基本的に、`fn_filter`と同じ使い方なので説明を省略します。

###使い分け
個人的には、fn_filterの方は、関数、変数を見たい時、regex_filterはある文字列を含むものを見つけたい時に使います。

説明しなかったものはソースコードを見ればわかると思います。
Webプログラマ向けハードウェアmille-feuille（ミルフィーユ）Raspberry Pi 用サポートツール


Webプログラマ向けのハードウェアとして有名なRaspberry Pi。Linux PCとして動作するので、少しでもLinuxに触れたことがある人には比較的容易に使えるところが嬉しいですね。

そこで、「さぁ、Raspberry Piでハードウェアの試作だ！」と意気込んで接続してみると。。。
「つながらない」「回路図ってなんだ！？」「はんだづけできない・・・」
ハードウェアを試作するには別の知識がいろいろと必要ですよね。

そういったハードウェアの知識がなくても、ファームを作るのが面倒な人でも、
試作から小ロット量産までできるツールがあります。
mille-feuille（ミルフィーユ）です。

mille-feuilleには「自動配線機能」と「回路図自動生成機能」があります。

簡単に言えば

自動配線機能：はんだづけしなくていい。ただ重ねるだけ
回路図自動生成機能：全自動でシンプルな構成を出してくれる
（それぞれ、ハードウェアのファームとか書かなくていいという利点があります。）

要するにハードウェアに関わる作業はなにもしなくていいということです。

プログラマはPHPまたはPythonで動かせます。グラフで表示などするときは、Javascriptなどですね。もちろん通常のファームウェアはライブラリを叩けば良いだけです。

今回はCPUボードが安くて小ロットの業務用に使えそうなRaspberry Piをベースに、IoT、M2M向けのハードウェア試作をmille-feuilleを使ってやってみます。


#1,mille-feuille（ミルフィーユ）とは？
mille-feuilleはRaspberry Pi 2,B+,A+に取り付けるハードウェアを自動認識して設計できるサポートツールです。（お菓子のパイ生地を重ねるように接続します）

主に2つの機能があります。
###a,自動配線機能
ふつうはRaspberry Pi からデバイスに手で配線して試作しますよね。それを自動的に「どのデバイスが接続されたか認識」して配線を「自動で接続」して「端子番号を気にしないでライブラリ叩くだけ」で動かしてくれる機能です。
ふつうに配線したのと同じ状態になるので、これまでのファームウェアライブラリもつかえるのが特徴です。

###b,自動回路図生成機能
小ロット量産の時には回路図が必要になります。その回路図を生成してくれる機能です。これは上記の自動配線機能がない、手で配線して試作したようなシンプルな回路図が生成されます。配線に関するファームウェアも自動生成されるので、試作から小ロット量産まで同じWebプログラムで使用できます。


#2,mille-feuille（ミルフィーユ）で開発する方法
大まかに「組み立てる」「テストする」「回路図を自動的に生成」「基板にする」の4工程で作ります。
###a,組み立てる
組立はそれぞれを重ねて接続するだけです。
はんだ付けや複雑な配線を考える必要はありません。
Raspberry Piに入れるPythonライブラリからの命令で、mille-feuille（ミルフィーユ）内部のデジタルスイッチが勝手に配線の種類を認識して接続してくれます。
![PhotoGrid_1444632195297.jpg](https://qiita-image-store.s3.amazonaws.com/0/96369/b09624a4-1bd8-5723-641c-8525c85cb8e4.jpeg)


###b,テストする
プログラムは主にmille-feuille（ミルフィーユ）のPythonのハードウェアライブラリを叩いて動かします。
Pythonのハードウェアライブラリを叩ければどの言語でも使用できます。
今回はPHPとPythonのサンプルを用意しました。

Google chartを使えばグラフも簡単に書けますよ。
![PhotoGrid_1444568984492.jpg](https://qiita-image-store.s3.amazonaws.com/0/96369/8cd61dda-0b3d-f198-6a4f-22765a0b0bb4.jpeg)

PHPのサンプルは簡単に書けます。下のはアナログ信号取得のサンプルです。

```PHP:AnalogRead.php
include ("milpython/mil_analog.php");
$dataCh0 = readAD(0);
$dataCh1 = readAD(1);
```

PythonのサンプルはPHPよりも滑らかな動きを実現したい時に使います。

```Python:AnalogRead.py
#!/usr/bin/python
from mil import mil
from mil import milMod
from mil import AD2ch

mil.init()
modA = milMod.milMod(AD2ch.getAddr(),AD2ch.getIOs())

modA.connect()
dataCh0 = AD2ch.analogRead(0)
dataCh1 = AD2ch.analogRead(1)
modA.disconnect()
```

###c,回路図を自動的に生成
回路図を自動的に生成するには、まず、mille-feuille（ミルフィーユ）にどのデバイスが接続されているかという情報をRaspberry Pi用に作られたアプリケーションを使って集めます。
その情報を回路生成ようのサーバーにアップロードして、回路図スクリプトとそれに合わせた配線設定ファイルをダウンロードしてきます。
回路図スクリプトはEagle CADというフリーソフト（商用はライセンスが必要です）にインポートすると、自動的に回路図が生成されます。
![generate2.jpg](https://qiita-image-store.s3.amazonaws.com/0/96369/218f53de-623f-241b-e0a2-798f6c1e4d8b.jpeg)


###d,基板にする
最後に、出来上がった回路図から基板を作ります。回路図から基板を作るにはいくつか方法があります。時間やコストなどを考えて選択してくださいね。

![pcbJP.png](https://qiita-image-store.s3.amazonaws.com/0/96369/64556407-0537-a236-4c8f-471d5b91db38.png)


今回はRaspberry Piをベースに作ってみましたが、仕組み的にはmbedなどにも取り付け可能です。
対応機種が増えたら開発の幅が広がりますね。

mille-feuilleはindiegogoでキャンペーン中です。よかったらシェアしてください☆
https://www.indiegogo.com/projects/mille-feuille-automatic-schematic-creation-tool/
Spring Data Redisを使ったRedisの負荷分散


[以前](http://qiita.com/yoshidan/items/723912c720c8deedf190)Spring Data RedisとRedis Sentinelを連携させてみたが、Sentinelを使ってアクセス可能なのはMasterノードだけなので、SlaveにアクセスするにはSlave用のRedisTemplateを用意する必要がある。
そのため、複数のSlaveを用意してRedisからの読み取り操作を分散させたいような場合には、別途仕組みを作る必要がある。

## アクセス分散の方法

### 専用のロードバランサーを利用する

ロードバランサーを利用してRead用にVIPを払い出し、対応するRedisTemplateを用意する。

![スクリーンショット 2015-10-10 8.15.56.png](https://qiita-image-store.s3.amazonaws.com/0/39230/e145ac69-f1e8-1321-8c8f-ec0a88242725.png "スクリーンショット 2015-10-10 8.15.56.png")


ヘルスチェックや負荷分散はロードバランサーが代行するためアプリケーションのコードはシンプルになる。
ただし、RedisCacheManagerが単一のRedisTemplateしか利用できないため、Springのキャッシュ機構(@Cacheableつかうやつ)利用時には結局作り込みは必要になる。

### RedisTemplateのレイヤで負荷分散する 

ロードバランサー用意するのは大掛かりなので、アプリだけで全て完結させる。

![スクリーンショット 2015-10-10 8.27.13.png](https://qiita-image-store.s3.amazonaws.com/0/39230/96dafbd9-5759-f8dc-b6d3-6d60d004fd81.png "スクリーンショット 2015-10-10 8.27.13.png")

そのためのライブラリを作ってみた。

https://github.com/nysd/spring-data-redis-support/blob/master/docs/loadbalance.md

```
<repositories>
    <repository>
        <id>nysd.maven</id>
        <name>nysd maven repository</name>
        <url>http://nysd.github.io/archivar/</url>
	</repository>
</repositories>

<deppendencies>
    <dependency>
        <groupId>spring.support</groupId>
        <artifactId>spring-data-redis-support</groupId>
        <version>1.6.0.1</version>
    </dependency>
</dependencies>
```


* 読み取り対象ノードに対して定期的にinfo replicationを発行する。(書き込みの方はSentinel利用するので考慮不要)
* info replicationの結果エラーとなるかmaster_sync_in_progressが1の場合、対象ノードは利用不能にマーク。
* Redis操作時には利用可能なノードに対応するRedisTemplateをランダムに一つ選択して処理を実行。
* @Cacheable利用時にGET操作のみ読み取り専用のRedisTemplateを利用する。
UILabel作成

//

//  ViewController.swift

//  UIKit001

//


import UIKit


class ViewController: UIViewController {

    

    override func viewDidLoad() {

        super.viewDidLoad()

        

        // Labelを作成.

        let myLabel: UILabel = UILabel(frame: CGRectMake(0,0,200,50))

        

        // 背景をオレンジ色にする.

        myLabel.backgroundColor = UIColor.orangeColor()

        

        // 枠を丸くする.

        myLabel.layer.masksToBounds = true

        

        // コーナーの半径.

        myLabel.layer.cornerRadius = 20.0

        

        // Labelに文字を代入.

        myLabel.text = "Hello Swift!!"

        

        // 文字の色を白にする.

        myLabel.textColor = UIColor.whiteColor()

        

        // 文字の影の色をグレーにする.

        myLabel.shadowColor = UIColor.grayColor()

        

        // Textを中央寄せにする.

        myLabel.textAlignment = NSTextAlignment.Center

        

        // 配置する座標を設定する.

        myLabel.layer.position = CGPoint(x: self.view.bounds.width/2,y: 200)

        

        // Viewの背景色を青にする.

        self.view.backgroundColor = UIColor.cyanColor()

        

        // ViewにLabelを追加.

        self.view.addSubview(myLabel)

    }

    

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

    }

    

    

}
Fertile Forest Model （ツリー構造データをRDBで扱うための第五のモデル）

# ツリー構造データとRDB

ツリー構造データをリレーショナルデータベース(RDB) で扱う場合、以下の４つのモデルが知られていました。

1. 隣接リストモデル (Adjacency List Model)
2. 経路列挙モデル (Path Enumeration Model)
3. 入れ子集合モデル (Nested Sets Model)<br>
   入れ子区間モデル (Nested Intervals Model)
4. 閉包テーブルモデル (Closure Table Model)

入れ子集合モデルは、現時点では多くのフレームワークで採用されていて、便利なライブラリが多数のデベロッパーによって開発されています。

# 第五のモデル

Fertile Forest Model （肥沃な森林モデル）は、新しい発想で設計された、第五のモデルです。従来のモデルよりも、次の点で優れています。

1. ツリー構造データのために追加されるデータ量のコスト
2. 検索速度
3. 関連ノードの検索バリエーション
4. ツリー構造が破損した場合の修復の難易度

ツリー構造を扱う従来のモデルよりも豊かな機能を有するモデル、という意味で「Fertile Forest Model」と命名しました。以下、FFモデルと記載します。この記事は、FFモデルについて書かれた最初のブログ記事になるでしょう。

FFモデルの詳細については、次のエントリからまとめていきます。

- ツリー構造データをRDBで扱うための第五のモデル
- [RDB に於けるツリー構造データ (1)](http://qiita.com/StewEucen/items/18a1703353c735258a8a)
- [RDB に於けるツリー構造データ (2)](http://qiita.com/StewEucen/items/e5895d9f09beb16c61fd)
- [モデルデザイン](http://qiita.com/StewEucen/items/b4840343c22cea11ec26)
- [ノード検索＜祖先ノード系＞](http://qiita.com/StewEucen/items/632bddd683d77d1cf176)
- [ノード検索＜子孫ノード系＞](http://qiita.com/StewEucen/items/44901b69e2a061e0bc0a)
- [ノード検索＜親戚ノード系＞](http://qiita.com/StewEucen/items/22ba49ab8e591c663c84)
- [ノード追加](http://qiita.com/StewEucen/items/796c6d017dcf32bdb429)
- [ノード移動](http://qiita.com/StewEucen/items/bfb2f84d66929c0c4747)
- ノード削除
- ツリー構造の復元
- 実数列化ツリーモデル
iOSでiframeのスクロールが効かない問題への対応



よくある埋め込みパーツみたいなのを作っていたのだけど、
スマホで横幅100%の指定が効かず、横に伸びちゃって困った。

http://stackoverflow.com/questions/26046373/iframe-scrolling-ios-8

このあたりを参考に解決。

最終的にこんな感じで無事動作しました。

```html
    <div style="width:100% !important;overflow:auto !important;-webkit-overflow-scrolling:touch !important;">
      <iframe style="width:100%;height:XXXpx;" src="XXXXX"></iframe>
    </div>
```

-webkit-overflow-scrollingの指定がミソですね。

よかったよかった。
ubuntu 14.04 (trusty) にHAProxy 1.5.x を入れる

ubuntu 14.04 で HAProxyの1.4系じゃなくて1.5系が使いたい場合

```shell-session
echo deb http://archive.ubuntu.com/ubuntu trusty-backports main universe | tee /etc/apt/sources.list.d/backports.list
apt-get update
apt-get install haproxy -t trusty-backports
```

これでok
RailsでDBに格納したテキストをlocaleに応じていい感じに取り出す方法





DBに文言を格納するけど、localeに応じて日本語と英語を出し分けたいケースがありました。

ベースのやりかたはこちらの記事を参考にしています。

>[Railsの多言語化対応 I18nのやり方を整理してみた！【国際化/英語化】](http://morizyun.github.io/blog/i18n-english-rails-ruby-many-languages/)



「(6)DBに格納されている文字列の多言語化」のケースです。


## DBの様子

テーブルにこんな感じで値を格納しているとします。

    #storesテーブル
    +------+-------------+---------------+
    |  id  | name_en     |  name_ja      |
    +------+-------------+---------------+
    |   1  | Hoge Store  | ほげストア      |
    +------+-------------+---------------+


## ふつうに出力すると

ストレートに出力すると、こんな感じ。

    #views/stores/show.html.haml
    %h1
      - if(I18n.locale==:ja)
        = @store.name_ja
      - else
        = @store.name_en

ちょっとがんばって動的にlocaleを読み込むと、

    #views/stores/show.html.haml
    %h1
      = @store.send("name_#{I18n.locale}")

きれいになりました。  
しかしいろんなところにこれ書くのは大変。


## モデルのメソッドにしたらいいじゃない

というわけで、モデル側でこんな感じにメソッドを定義してみる。

    # models/stores.rb
    class Store < ActiveRecord::Base    
      def name
        self.send("name_#{I18n.locale}")
      end
    end


するとviewではいつもどおり呼び出すだけで、いい具合に翻訳されて出てくる。


    #views/stores/show.html.haml
    %h1
      = @store.name


便利！
XeLaTeXで日本語を含むソースコードを表示する。

TeXの文書にコードを入れるのにlistingsをよく使うのですが、listingsがデフォルトでは日本語に対応してません。

「listings 日本語」で検索するとjlistingを合わせて使えって記事が多いんですが、jlistingは[lastline使うとバグる](https://miyazakikenji.wordpress.com/2013/11/13/jlisting/)ので、ここではjlistingを使わない方法を紹介します。

XeLaTeXの場合は、`\usepackage{xeCJK}`で[xeCJK](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?xeCJK)を読み込むと、listingsで日本語を使っても表示がくずれなくなります。

自分の場合は、[TeX Live](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?TeX%20Live) 2014をインストールしたときにxeCJKのパッケージは含まれていたので、個別にインストールする必要はありませんでした。

xeCJKを使う場合は日本語フォントの指定も必要になるので、実際には以下のような内容を追加します。

```tex
\usepackage{xeCJK}
\setCJKmainfont{IPAPMincho}
\setCJKsansfont{IPAPGothic}
\setCJKmonofont{IPAGothic}
```
[Unity] 3Dオブジェクトを常に前面に表示するシェーダ


[![Gyazo](https://i.gyazo.com/ef1688415ceda06dfa0f17af7bb64088.gif)](https://gyazo.com/ef1688415ceda06dfa0f17af7bb64088)

2DのUIなどは常に画面に表示されますが、3Dオブジェクトの場合は奥行きなどによって表示されないケースが出てきます。
しかし、VRゲームなどでは3DでUIを作る必要があり、なにかの後ろに隠れてしまうのは問題になるケースがあるかと思います。
そんなときに使えるシェーダ。記述量はとても少ないです。

```ShaderLab
SubShader {
	Tags { "RenderType"="Opaque" "Queue"="Geometry+5" }
	ZTest Always
}
```

`Tags` に `"Queue"="Geometry+5"` を追加します。
さらに `ZTest Always` も追加します。

こうすることで、少なくとも通常のGeometryよりは常に前面に描かれるようになります。

## 解説

### レンダリングのソートを変更する

`"Queue"="Geometry+5"` とすることで、通常のモデル（Geometry）よりも `+5` だけあとにレンダリングされるようになります。
こうすることで、常にモデルよりも最後にレンダリングされるようになります。

### ZTestを常に合格させる

次に、`ZTest Always` を指定します。
こうすることで、奥行きがどうであれ必ずレンダリングされることになります。

結果として、レンダリングのソートをできるだけ後ろにしつつ、常にレンダリングを行うことで通常のモデルよりも常に前面にオブジェクトがレンダリングされるというわけです。


## 透明オブジェクトの場合

ちなみに透明オブジェクトを上記の方法で実装するとうまく動きません。
いくつかパラメータを追加・変更する必要があります。

### Transparentを指定する

以下のように、`RenderType` などを `Transparent` に変更する必要があります。

```ShaderLab
Tags { "RenderType"="Transparent" "Queue"="Transparent+2" }
```

また、`#pragma` に `alpha` を追加する必要があります。

```ShaderLab
#pragma surface surf Standard fullforwardshadows alpha
```

`alpha` の手前の記述はデフォルトのままです。（つまり最後に `alpha` を追記します）


## コード

最後に、最終的なコードを載せておきます。

```ShaderLab
Shader "Custom/UIShader" {
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Metallic ("Metallic", Range(0,1)) = 0.0
	}
	SubShader {
		Tags { "RenderType"="Transparent" "Queue"="Transparent+2" }
		LOD 200
		
		ZTest Always
		
		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
		#pragma surface surf Standard fullforwardshadows alpha

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
		};

		half _Glossiness;
		half _Metallic;
		fixed4 _Color;

		void surf (Input IN, inout SurfaceOutputStandard o) {
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
			o.Albedo = c.rgb;
			// Metallic and smoothness come from slider variables
			o.Metallic = _Metallic;
			o.Smoothness = _Glossiness;
			o.Alpha = c.a;
		}
		ENDCG
	} 
	FallBack "Diffuse"
}
```
Linuxでディスプレイの輝度が調整できないときの対処

よく忘れてしまうのでメモ。
大抵Grubの設定をいじれば直るっぽい。

- 設定ファイルを開く。

```bash
$ sudo vi /etc/default/grub
```

-  `GRUB_COMDLINE_LINUX_DEFAULT`の項目を以下のように編集する。

```text
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_backlight=vendor"
```

- grubの設定をアップデートする。

```bash
$ sudo update-grub # 修正しました(1/14) 修正前:grub-update
```

あとは再起動すると、輝度が調整できるようになる。
TOSHIBAのdynabook KIRAのUbuntuで確認済み。

余談
ACPIというのはベンダー共通の規格でAdvanced Configuration and Power Interfaceというらしい。

電源管理や輝度調整など、ハードウェアに近い部分の規格を担っているので、経験上Linuxでそこら辺の問題に遭遇したらこいつの設定を疑うと良い。
緯度経度の表記を相互的に変換する

座標に関する表記方法として、大きく分けて次のものがある。

1.  **DMS** (**D**egree **M**inute **S**econd, 緯度経度を度分秒（60進数）を使って表す。ex. 153°59′11″, 24°16′59″)
2.  **DEG** (Degree, 緯度経度を10進数の度のみを使って表す。ex. 133.9350, 34.66167)

参考) <http://www7a.biglobe.ne.jp/~allegory/dms-deg.html>

変換する方法がはっきりしていて、わかりやすいのでさまざまなプログラミング言語で変換の方法が書かれている。

が、Rではどうなのだろう。関数はあるのかしらんと思って調べてみたところ、 **`{celestial}`** パッケージに変換のための関数が用意されていた。それぞれの方法で変換を試みる。

説明のために次のようなデータを用意する。

``` r
df_jp <- data.frame(address          = c("Tokyo, Japan", 
                                         "Okayama, Japan", 
                                         "Sapporo, Japan",
                                         "Okinawa, Japan"),
                    stringsAsFactors = FALSE) %>% 
  ggmap::mutate_geocode(address)
```

``` r
dplyr::tbl_df(df_jp) %>% kable(format = "markdown")
```

| address        |       lon|       lat|
|:---------------|---------:|---------:|
| Tokyo, Japan   |  139.6917|  35.68950|
| Okayama, Japan |  133.9350|  34.66167|
| Sapporo, Japan |  141.3469|  43.06417|
| Okinawa, Japan |  127.8014|  26.33583|

``` r
library(celestial)
```

パッケージを読み込んで準備完了。

### DEGからDMS

``` r
deg2dms(df_jp$lat, type = "cat", sep = "dms")
```

    ## [1] "+35d41m22.20s" "+34d39m42.01s" "+43d03m51.01s" "+26d20m08.99s"

``` r
# spe 引数で度分秒の区切り文字を指定する
deg2hms(df_jp$lon, type = "cat")
```

    ## [1] "09:18:46.01" "08:55:44.40" "09:25:23.27" "08:31:12.33"

変換した値を新たな列として加える。

``` r
df_jp %<>% dplyr::mutate(lon_dms = deg2hms(lon, type = "cat"),
                         lat_dms = deg2dms(lat, type = "cat", sep = "dms"))
```

### DMSからDEG

先ほど同様、変換した値を新規列とする。

``` r
df_jp %<>% dplyr::mutate(lon_deg = hms2deg(lon_dms, sep = ":"),
                        lat_deg = dms2deg(lat_dms, sep = "dms"))
```

``` r
kable(df_jp, format = "markdown")
```

| address        |       lon|       lat| lon\_dms    | lat\_dms      |  lon\_deg|  lat\_deg|
|:---------------|---------:|---------:|:------------|:--------------|---------:|---------:|
| Tokyo, Japan   |  139.6917|  35.68950| 09:18:46.01 | +35d41m22.20s |  139.6917|  35.68950|
| Okayama, Japan |  133.9350|  34.66167| 08:55:44.40 | +34d39m42.01s |  133.9350|  34.66167|
| Sapporo, Japan |  141.3469|  43.06417| 09:25:23.27 | +43d03m51.01s |  141.3470|  43.06417|
| Okinawa, Japan |  127.8014|  26.33583| 08:31:12.33 | +26d20m08.99s |  127.8014|  26.33583|
Xcode 7エラー iPadシミュレータが立ち上がらない場合の対処


# 以下のエラーのように、iPadシミュレータのみ起動しない場合の対処方法

**Unable to boot device because it cannot be located on disk**
Use the device manager in Xcode or the simctl command line tool to either delete the device properly or erase contents and settings.


![ssss3323.png](https://qiita-image-store.s3.amazonaws.com/0/8920/f12d6c23-3007-1499-7222-72826c44fe45.png)



上記エラー文に書いてある通りシミュレータのナビゲーションバーから
`Simulator` > `Reset Content and Settings...` を実行すると解決します。

原因はおそらく、シミュレータのフォルダを消してしまったためかと思います。
今更聞けない文字コードの仕組み

# 文字コードの構成要素

文字集合とエンコーディングの2つの要素がある

* 文字集合
  JIS X 0208とかUnicodeとか
* 符号化方式（エンコーディング）
  EUC-JP, Shift_JIS, ISO-2022-JPとか
  UTF-8, UTF-16 とか

cf. http://equj65.net/tech/charcode/

# 文字コードの仕組み

> それぞれの文字集合に含まれる文字について、その「符号位置」を示す「番号」をそれぞれ独自の手順や計算式によってバイト列の表現に変換したもの。
> http://d.hatena.ne.jp/snaka72/20100710/SUMMARY_ABOUT_JAPANESE_CHARACTER_CODE

※16進数を表すために「0x」を数値の文頭に付与する
> http://q.hatena.ne.jp/1156532619

|文字集合|符号化方式（エンコーディング） |備考|
|:-----------------|:------------------|---|
|unicode|UTF-8, UTF-16|全世界の文字を扱えることを目的としてしている。|
|JIS X 0208|ISO-2022-JP(JIS)、EUC-JP、Shift_JIS|日本語で使用される主な文字を収録した文字コード。漢字はJIS第1・第2水準漢字が収録されている|
|ASCII|ない|英数字と一部の記号のみを収録した基礎的な文字コード|

cf. http://appakumaturi.hatenablog.com/entry/20120414/1334334986

# なぜWEBでUTF-8がよく使われるか

他の言語よりも比較的容易に多言語対応が行える。
MacでASP.NET 5のサンプルを動かしてみる

仕事では Windows × C# を使っているが、*NIX環境でも .NET が動くようになっているのでとりあえず動かしてみた(UNIXでも動く・・・のかな？)。
しかし、[参考記事](http://www.atmarkit.co.jp/ait/articles/1502/20/news074.html)の通りにやっても動かなかったのでその時に解決した方法メモ。

## ■環境

- Mac OS X Yosemite 10.10.5
- mono v1.0.0-beta3

## ■まずは手順通りに！

1. Homebrew をインストール
2. `brew doctor` で確認 **ひっかかりPoint①**
3. KVM/XRE をインストール
4. サンプルコードを動かしてみる -コンソールアプリ-
5. サンプルコードを動かしてみる -Webアプリ- **ひっかかりPoint②**

## ■ひっかかった箇所

### **Point①**

#### `brew doctor` で警告がでて参考記事通りにいかない。
Waringがいろいろ出たうち、以下のやつだけどうしたらよいかわからんかった。。
> Warning: Xcode 7 lacks the 10.10 SDK which can cause some builds to fail.

Xcodeの最新バージョンをインストールしたのに出るから「？？？」って感じだった。
が、結局コンソールに出ているコマンド`xcode-select --install`をたたいて、
インストールボタン押下でよかった、、
![インストールダイアログ](http://image.itmedia.co.jp/ait/articles/1502/20/ap-02.gif)
Xcodeインストールだけじゃダメで、コマンドラインツールを別途インストールするとか・・・
凡ミスでした

### **Point②**

#### Webアプリが動かない・・・

最初に解決策を書く。

- 動かせるブランチを選択してダウンロード(もしくは`git clone`)。自分がサンプルで動かしたのは[これ](https://github.com/aspnet/Home/tree/fixsamples)です
- `project.json`の`X.X.X-*`を`X.X.X-beta3`に修正
- Webアプリのディレクトリに移動して `kpm restore` で依存ファイル解決
- `k kestrel` でアプリ実行

結局、最初は[開発ブランチ](https://github.com/aspnet/Home/tree/dev)で実行しようとしていて、なんだか依存ファイルの解決に失敗していた模様。`k kestrel`実行後、出力されたエラーは以下のようなものがあった。

> - System.InvalidOperationException: Unable to load application or execute command 'Microsoft.AspNet.Hosting'. Available commands: web, kestrel.
> - System.Exception: TODO: Error: unrecognized argument 'restpre'
> - System.Exception: TODO: type <null> failed to load message

エラーから解決策がわかりにくいのは相変わらずだったｗ
んでも、なんで`project.json`を書き換える必要があったかはナゾ・・・
[ruby][メモ] 階乗

階乗の計算をしようと思ったらなかったので作る。

``` ruby
def factorial(number)
  if number.zero?
    1
  else
    number * factorial(number - 1)
  end
end
```

こんな感じで実装。
`number`が大きい時にエラる。。。

```
pry(main)> a=Hoge.factorial(9000)
SystemStackError: stack level too deep
```

[再帰の限界](http://d.hatena.ne.jp/mizti/20121113)があるっぽい？？

[Railsの`sum`のsource](http://apidock.com/rails/Enumerable/sum)を見てみたら、`inject`を使ってた。
ので`inject`を試してみる。

```ruby
def factorial(number)
  (1..number).inject(1,:*)
end
```

これだと、数値が大きくても行けるっぽい。

`number`が`nil`だとエラるので`nil`だと`0`が入るようにする。

```ruby
def factorial(number)
  number = 0 if number.nil?
  (1..number).inject(1,:*)
end
```

このままだと直感的に階乗てわかりづらい。
`Integer`を拡張した方が便利そうなので拡張する。


```ruby
class Integer
  def factorial
    (1..self).inject(1,:*)
  end
end
```

`nil`だからほにゃららってとこは要らんかった。

```rb
class Integer
  alias :! :factorial
end
```

でより階乗っぽく書ける。

```
pry(main)> 5.!
=> 120
```

`100,000`くらいになると遅いけどまぁいいや。
docker-machineがStarting VM...で固まる問題の対処法

OSXにDocker-Toolboxをインストールして、`Docker QuickStart Terminal`を実行したところ、

```
$ bash --login '/Applications/Docker/Docker Quickstart Terminal.app/Contents/Resources/Scripts/start.sh'
Creating Machine default...
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
```

ここで固まってしまうという現象に遭遇しました。

(このときVirtualBoxの画面でプレビューを見るとクジラの絵が表示されていました。)

この状態でdocker-machineを操作しても、下記のようなエラーが出ます。

```
error getting URL for host default: exit status 255
```

# 環境
Mac OSX 10.10.5
docker-machine version 0.4.1 (e2c88d6)
VirtualBox 5.0.6r103037

# 原因

OSXの ~/.ssh/configで下記のような設定をしていたのが原因でした。

```
Host *
   ServerAliveInterval 60
   TCPKeepAlive y
   ControlMaster auto
   ControlPath ~/.ssh/%r@%n:%p
   ControlPersist yes
```

この設定をやめたら解決しました。

# 参考
https://github.com/docker/machine/issues/1684#issuecomment-133125038
https://github.com/docker/machine/issues/1591#issuecomment-126169020
XCode7におけるSQLiteとかの場所


以前[自分のブログの記事](http://project-unknown.hatenablog.com/entry/2015/02/19/000614)にSQLiteの保存場所を探す際に[ShiyPholders](http://simpholders.com)が便利ですよーと書いたのですが、XCode7以降まだ対応されていなかった為、自前で調べる方法をなんパターンか備忘録がてらに投稿。



## PGMにDocumentRootをログに吐き出す処理を埋め込んでしまう

これが一番てっとり早いです。
AppDelegate等に以下のログを仕込んでしまって確認する方法です

### swiftの場合

```swift
#if DEBUG
   print("----------------------------------");
   print("[DEBUG]");
   let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
   print(documentsPath)
   print("----------------------------------");
#endif
```

### objective-cの場合

```objc
#if DEBUG
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = paths[0];
    NSLog(@"----------------------------------");
    NSLog(@"[DEBUG]");
    NSLog(@"[Document Path] : %@", documentsPath);
    NSLog(@"----------------------------------");
#endif
```

## コマンドラインで見つける場合

```
cd ~/Library/Developer/CoreSimulator/Devices 
find . -name "hogehoge.sqlite"  # SQLiteのファイル名
```

早くSimPholderがXCode7以降に対応してくれることを切に願うばかりですね。
c++ builder XE4, 10.2 Tokyo > その時だけの変数を使う > { String msg = DateTimeToStr(Now()); }

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```


通常、以下の処理では2つ目のmsgの使用時にエラーがでる。

```cpp
String msg = DateTimeToStr(Now());
OutputDebugString(msg.c_str());

// 処理のコード

String msg = DateTimeToStr(Now());
OutputDebugString(msg.c_str());
```

以下のようにすることで、その時だけの変数を使うことになる。`{ }`内だけがその場の処理となるのだろう。文法的になんという名前かは不明。

```cpp
{
	String msg = DateTimeToStr(Now());
	OutputDebugString(msg.c_str());
}

// 処理のコード

{
	String msg = DateTimeToStr(Now());
	OutputDebugString(msg.c_str());
}
```

関数を呼ぶのでもいいが、デバッグ時に処理の前後で似たようなことを少しの間だけ試したい時などに使ったりしている。
SpineにPhotoshop上のデザインを取り込む（プラグイン考察編）

# はじめに
Spine公式のPhotoshopプラグインでは、レイヤーごとに画像パーツを書き出すことができますが、Photohsop Generator (https://helpx.adobe.com/jp/photoshop/how-to/generate-web-graphics-automatically.html) 利用時のようにレイヤーグループを１枚の画像として書き出すことができず、(レイヤーグループは別の機能に割り当てられている）複雑なキャラクターデザインを行う場合、別途Spine書き出し用のpsdを用意するような羽目になってしまいます。この件について考察をしてみたので、記事にまとめてみます。

※記事を書いた時点で使用しているバージョンはPhotoshop CC 2015およびSpine2.1.27 Essentialです。Mac上での作業での解説となるので、Windowsの人は画像キャプチャとパスを適当に読み替えてください。

# スマートオブジェクトを使ってみる

レイヤーグループは使えませんが、スマートオブジェクトは１枚の画像として書き出してくれました。
前の記事で画像を書き出したドラゴンは頭の部分がスマートオブジェクトになっています。

![スクリーンショット 2015-10-12 17.00.35.png](https://qiita-image-store.s3.amazonaws.com/0/8302/4ebebb91-f100-caff-899b-f5e8cb141b69.png)
全体構成。

![スクリーンショット 2015-10-12 17.01.20.png](https://qiita-image-store.s3.amazonaws.com/0/8302/75765dd4-06fc-718c-29fb-af5d33e5d761.png)
スマートオブジェクト内の構成。

問題なく正しく動くのですが、デザインの全体像を把握しながらの編集が若干やりずらいですね。

# 外部スマートオブジェクトを使って見る

外部も内部もかわらんのですが、 Photoshopの確かちょっと前のバージョンから外部ファイルのスマートオブジェクトが利用できるようになりました。また、ここでスマートオブジェクトとしてIllustratorのファイルも読み込むことができるので、使いどころがあるかもしれません。全体像が把握できない問題がさらに大きくなりますが。。とりあえず試してみましたが、問題なくデータの書き出しはできます。

※IllustratorにもSpine用の書き出しプラグインが存在します。SpineインストールフォルダのScript以下に存在します。機能はPhotoshop版よりも劣るため、公式としてもいったんaiからpsdにexportしてPhotoshop側のプラグインを利用することを推奨していました。
http://ja.esotericsoftware.com/spine-images#Illustrator

# Generatorを使ってみる？

公式のPhotoshopプラグインを利用してSpineに読み込ませることができるのは、各パーツの位置と重ね合わせ順、のみです。位置の指定に関しては一度行ってしまえば再度行うこともないので、パーツ配置はおとなしくSpine上で(ガイドなど利用しつつ)行うとして、画像の作成および更新はGenerator(や、他のツール)に任せた方が楽なのかもしれません。

# 別プラグインに期待してみる？

公式でなくとも PhotoshopからSpine用のデータを書き出すプラグインなどを作成している人はたくさんおられるようです。
>A number of alternate Photoshop scripts have been posted to the Spine forum(http://ja.esotericsoftware.com/forum/search.php)

まだ詳細を確認していませんが、こちらにAfterEffectsからモーションを書き出したり、Generatorと連携させるプラグイン？があるようですね。
http://ja.esotericsoftware.com/forum/viewtopic.php?f=11&t=2983

# おわりに
Spineが読み込むjsonのフォーマットはわかりやすいですし、Adobeツールの拡張機能(CEP)作成周りも充実してきているので、自作してみるのも良いかと思います。
http://adobe-cep.github.io/CEP-Resources/
Flashからであれば、ある程度のボーン設定やモーションまでまとめて書き出すこともできるかもしれませんね。
OSX El Capitan でのHDD完全消去方法

HDDを安全に消去するために以前から OS X 付属の[ディスクユーティリティの機能](https://support.apple.com/kb/PH5849?locale=ja_JP&viewlocale=ja_JP#dskutl14079-e)を使用していたのですが、El Capitan ではディスクユーティリティから該当機能が無くなってしまいました。

El Capitan で安全な消去を行うには、以下のような構文の `diskutil secureErase` コマンドを使用してコマンドラインから実行する必要があるようです。

    diskutil secureErase <level> <target>

`<level>` には、消去方法（以前のディスクユーティリティでの「セキュリティオプション」に相当）に応じて以下のいずれかの値を指定します。

| 値 | 消去方法 |
|:--:|:-----------|
| 0 | ゼロでの上書きを1回 |
| 1 | ランダム値での上書きを1回 |
| 2 | 米国国防総省標準の7回の上書き |
| 3 | Gutmannアルゴリズムでの35回の上書き |
| 4 | 米国エネルギー省標準の3回の上書き |

`<target>` には以下のいずれかを指定します。

| 値 | 内容 | 値の例 |
|:--|:--|:--|
| ディスク識別子 | disk* 形式の識別子 | disk3 |
| デバイスノード | ディスク識別子を含む、/dev/disk* 形式のデバイスノード | /dev/disk3 |
| マウントポイント | ボリュームのマウントポイント | /Volumes/Untitled |
| UUID | 11111111-2222-3333-4444-555555555555 形式のUUID  | 173877DF-55C5-4D07-8905-BFD67E6D0CEA |

ディスク識別子は、ディスクユーティリティで対象のディスクを選択し、「情報」ボタンを押すとGUIで確認できます。「BSD装置ノード」がディスク識別子です。

![スクリーンショット 2015-10-12 16.00.24.png](https://qiita-image-store.s3.amazonaws.com/0/43355/c8ba8cb1-58a0-30d6-866a-1f84535743aa.png)

例えば、上のディスクに対してDoE標準の3回の消去を行うには、以下のコマンドを実行します。

    diskutil secureErase 4 disk3

間違って使用中のディスクを指定した場合、どうなるかは不明です。ディスクの指定ミスにはくれぐれもご注意を。
App内实现短信发送，并初始化短信内容



头文件  `#import "MessageUI/MessageUI.h"`

代理    `<MFMessageComposeViewControllerDelegate>`

方法    

```
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
   [self dismissViewControllerAnimated:YES completion:nil];
   switch (result) {
      case MessageComposeResultSent:
         // 发送成功
         NSLog(@"发送成功");
         break;
      case MessageComposeResultCancelled:
         // 取消发送短信
         NSLog(@"取消发送");
         break;
      case MessageComposeResultFailed:
         // 短信发送失败
         NSLog(@"发送失败");
         break;
         
      default:
         break;
   }
}
```

```
#pragma mark - 发送短信调用的方法
- (void)showMessageView:(NSArray *)phones title:(NSString *)title body:(NSString *)body {
   if ([MFMessageComposeViewController canSendText]) {
      //
      MFMessageComposeViewController *smsVc = [[MFMessageComposeViewController alloc] init];
      [smsVc setRecipients:phones];
      [smsVc.navigationBar setTintColor:self.navigationController.navigationBar.barTintColor];
      [smsVc setBody:body];
      [smsVc setMessageComposeDelegate:self];
      [self presentViewController:smsVc animated:YES completion:nil];
      [[[[smsVc viewControllers] lastObject] navigationItem] setTitle:title];
   }else {
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示信息" message:@"该设备不支持短信功能" delegate:self cancelButtonTitle:@"好的" otherButtonTitles:nil];
      [alert show];
   }
}
```
djangoでクエリ(sql)を投げた回数をテストで確認する

テスト用のDBコネクションをいじってしまってて素直に[TransactionTestCase.assertNumQueries](https://docs.djangoproject.com/en/dev/topics/testing/tools/#django.test.TransactionTestCase.assertNumQueries)が使えない場合に。

```python
# coding: utf-8

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")

from django.conf import settings
from django.db import connections

import unittest, pprint
from collections import deque
from core.models import Kvs, Hoge


class TestKvs(unittest.TestCase):

    def setUp(self):
        settings.DEBUG = True

    def tearDown(self):
        # django.db. reset_queries でもいい
        connections['default'].queries_log = deque()  
        settings.DEBUG = False

    def test_simple(self):
        hoge = list(Hoge.objects.all())[0]
        # select
        self.assertEqual(len(connections['default'].queries), 1)

        Kvs.set(hoge.id, hoge)
        # select, begin, update
        self.assertEqual(len(connections['default'].queries), 4)

        got = Kvs.get(hoge.id)
        # select
        self.assertEqual(got.id, hoge.id)
        self.assertEqual(len(connections['default'].queries), 5)


if __name__ == "__main__":
    unittest.main()
```

参考: [Django: is there a way to count SQL queries from an unit test?](http://stackoverflow.com/questions/1254170/django-is-there-a-way-to-count-sql-queries-from-an-unit-test)
VirtualboxのGuest Additionsをvagrantで(それなりに)手軽に更新する方法

## はじめに
VirtualboxのGuest Additionsは

~~~bash:console
$ yum update 
~~~

~~~bash:console
$ apt-get upgrade
~~~

なんかを行うとkernelのバージョンが上がってインストールされているGuest Additionsのバージョンが上がってしまうことがあります。
一々、ビルドしてとやるのは面倒ですので、vagrant upした時に自動でguest-additionsのバージョンも上げてほしいものです。

## プラグインを使う

[vagrant-vbguest](https://github.com/dotless-de/vagrant-vbguest)を利用することで、vagrant upをした際に勝手にVirtualboxのGuest Additionsをビルドしてくれるようになります。

~~~bash
$ vagrant plugin install vagrant-vbguest
~~~

## (注意) Guest Additionsのビルドに失敗するケース
- (参考)[vagrant-vbguestプラグインがGuestAdditionsを無効にしてしまう](http://qiita.com/hapicky/items/a7f9d56588f96d005fad)
- Virtual Boxのテストビルドを使用している[^1]
- 元々Guest Additionのバージョンがかなり新しい[^2]
- vagrant upした際にconfig.vbguest.auto_updateがtrueになっており、バージョンが上がってしまう[^3]

[^1]: vagrant-vbguestがGuest Additionsを見つけられずビルドエラーが起きる
[^2]: vagrant-vbguestを使用する場合はVirtualBoxを常に最新のStableに保っていたほうが安心でしょう
[^3]: 上記のようにVagrantfileに記述することで回避可能です。

~~~ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vbguest.auto_update = false
end
~~~