OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftでSafariのリーディングリストに追加

		
Safariのリーディングリストは、後で見たいウェブページをリーディングリストに登録することで、ネット環境が無いオフラインでもiPhone内のストレージにキャッシュされて記事の続きを閲覧できる機能

今回はリストに追加する実装を記載

##はじめに
Build PhasesのLink Binary With Librariesに
iOS7から追加されたSafari Service Frameworkを追加

##実装

```swift
import SafariServices

let title = "my profile site"
let url = NSURL(string: "http://manchan.github.io")
        
// リーディングリストに追加できるかどうかチェック
let isValid = SSReadingList.supportsURL(url)
let list = SSReadingList.defaultReadingList()
var msg:String?

// 追加
if isValid && list.addReadingListItemWithURL(url, title: title, previewText: nil, error: nil){
    msg = "追加に成功"
}else{
    msg = "追加に失敗"
}

// 確認       
UIAlertView(title: "追加test", message: msg, delegate: nil, cancelButtonTitle: "OK").show()
```

##用例
AppleWatchからニュースの記事見出しだけ見て、親iPhoneのsafariに追加するなどが考えられる実装（Google News, NYTimes）
watchOS1ならopenParentApplicationで送信
watchOS2ならWatch Connectivityで

##注意
追加済みのURLとかのチェックはできない、また既出のリストも取得、編集、削除できない
読みだすことができれば、いろいろとできそうなので残念。
オフライン閲覧が可能なので、ストレージにキャッシュが貯まるので膨大にある場合、キャッシュを削除する必要がある
iOS9であれば設定から
`一般 > ストレージとiCloudの使用状況 > ストレージを管理 > Safari `
のリーディングリストを編集を押して削除


##参考
iOS Developer Library > Safari Services Framework Reference  SSReadingList Class Reference
https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Reference/SSReadingList_Ref/index.html#//apple_ref/occ/cl/SSReadingList
iconv-liteで対応している文字コード一覧を出力する


```coffeescript
encodings = require "iconv-lite/encodings"

# 配列から重複を除く処理が標準でないのでCoffeeScript Cookbookから借用
# https://coffeescript-cookbook.github.io/chapters/arrays/removing-duplicate-elements-from-arrays
array_unique = (array) ->
  output = {}
  output[array[key]] = array[key] for key in [0...array.length]
  value for key, value of output

existsEncodings = []
for key, val of encodings
  # 頭が"_"で始まるもの(_internal等)は恐らく内部処理用なので飛ばす
  continue if key.match /^_/
  # keyは数字のみでvalに名称らしきものが入っているものが多数あったので
  if typeof val == "string"
    existsEncodings.push val
  else
    existsEncodings.push key

existsEncodings = array_unique existsEncodings.sort()

for enc in existsEncodings
  console.log enc
```

本当に対応しているかを確認するならば`iconv = require "iconv-lite"`して`iconv.encodingExists()`で確認するとよい。
Swift版 WKWebViewでUserAgentに文字列を追加する

なかなか手ごわいWKWebView。useragentの文字列を丸ごと置き換えることはわりとすぐ出来たのですが、既存のUserAgentに特定の文字列を追加することがなかなかできません。

あーだこーだ悩んでいた私に天啓が。

**UserAgent変えるだけなら、UIWebView使ってもいいじゃん！**


試してみたところうまくいったのでスニペットをお届けます。
よかったらコピペってみてください。

```swift
    /// カスタムuseragent設定
    private func setUserAgent(){
        let tmpWebView:UIWebView = UIWebView()  //UIWebViewでよかったんや！
        tmpWebView.frame = CGRectZero
        let userAgent:String! = tmpWebView.stringByEvaluatingJavaScriptFromString("navigator.userAgent")
        let userAgentStr = " UserAgentに追加する文字列"
        let customUserAgent:String = userAgent.stringByAppendingString(userAgentStr)
        
        let dic:NSDictionary = ["UserAgent":customUserAgent]
        NSUserDefaults.standardUserDefaults().registerDefaults(dic as! [String : AnyObject])
    }
```

これをAppDelegate#didFinishLaunchingWithOptions から呼び出す

```AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        //UserAgentを上書き
        setUserAgent()
```

これで``WKWebView``のUserAgentに指定した文字列が追加されます。

お試しあれ。
macでdlibのインストールのメモ

# boostのインストール
[参考](http://butterfly-effect.hatenablog.com/entry/2014/12/23/032525)

```
sudo brew install boost
sudo brew install boost-python 
```

# ski-image

```
sudo pip install scikit-image
```

# dlibインストール

```
sudo pip install dlib
```

# dlib実行時のエラー

```
50071 FATAL [1] dlib.gui_core: Unable to connect to the X display.
Traceback (most recent call last):
  File "./gen_detecter.py", line 81, in <module>
    win_det = dlib.image_window()
RuntimeError: Failed to initialize X11 resources
```

[こちら](https://github.com/davisking/dlib/issues/21)によれば、XQuartzを入れる必要がありそう。
[こちらの方法](http://macperson.net/mac-x11-xquartz/)で入れたら、エラーが消えた
Unityのファイルインポート時に任意の処理を走らせる。


# 概要
Unityプロジェクトにファイルを追加する際に、毎回決まって行なう作業とかありませんか？

その作業、インポート時のイベントをフックすることでひょっとしたら自動化できるかも！
というお話を綴ります。

# 手順
### 1. スクリプトファイル作成
![ss_120.png](https://qiita-image-store.s3.amazonaws.com/0/97611/130cd04f-f332-91a9-ecc1-44ee93eb686e.png)
Editorフォルダの下に任意のクラスを作ってね！

### 2. コード記述

```csharp:ImportProcessor.cs
using UnityEditor;	//!< UnityEditorを追記してね
using UnityEngine;
using System.Collections;

public class ImportProcessor : AssetPostprocessor	//!< AssetPostprocessorを継承するよ！
{

}
```

ベースはこれで完成！
とっても簡単ね！

続きは使用例と[リファレンス](http://docs.unity3d.com/ja/current/ScriptReference/AssetPostprocessor.html)を参照してね！

# 使用例
## テクスチャインポート時に `Generate Mip Maps` を無効化する
テクスチャのインポートをフックする場合は `OnPreprocessTexture()` または `OnPostprocessTexture(Texture2D)` を使うよ。
### サンプルコード
```csharp
using UnityEditor;	// UnityEditorを追記してね
using UnityEngine;
using System.Collections;

public class ImportProcessor : AssetPostprocessor	//!< AssetPostprocessorを継承するよ！
{
	void OnPreprocessTexture()
	{
		Debug.Log( "# テクスチャがインポートされるよ！" );

		// インポート時の設定に手を加える場合は assetImporter にアクセスするよ
		TextureImporter ti = assetImporter as TextureImporter;

		ti.mipmapEnabled = false;	// MipMap生成を無効化！
	}
}
```

## インポートするファイルに Thumbs.db が含まれていたら削除する

もっとざっくり、すべてのインポート結果(削除や移動も)を監視することもできるよ！

### サンプルコード

```csharp
using UnityEditor;	// UnityEditorを追記してね
using UnityEngine;
using System.Collections;

public class ImportProcessor : AssetPostprocessor	//!< AssetPostprocessorを継承するよ！
{
	static void OnPostprocessAllAssets( string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths )
	{
		// インポートされたものリストをチェック
		foreach( string path in importedAssets )
		{
			Debug.Log( "# 「" + path + "」がインポートされたよ！" );

			// パス文字列に thumbs.db が含まれていたら削除！
			if( path.ToLower().IndexOf( "thumbs.db" ) >= 0 )
			{
				if( AssetDatabase.DeleteAsset( path ) )
				{
					Debug.Log( "# thumbs.dbを削除したよ！ (" + path + ")" );
				}
			}
		}
	}
}
```

# 参考

- [Unity - Scripting API: AssetPostprocessor](http://docs.unity3d.com/ja/current/ScriptReference/AssetPostprocessor.html)
- [Unity - マニュアル: AssetDatabase](http://docs.unity3d.com/ja/current/Manual/AssetDatabase.html)
Redux: state を local storage に保存する (redux-localstorage)


# 概要

Redux で state を local storage に保存する middleware [redux-localstorage](https://github.com/elgerlambert/redux-localstorage) の紹介です。

# インストール

```
npm install --save redux-localstorage
```

# 使い方

middleware として ```persistState``` を追加します。

```js:store/configureStore.js
import persistState from 'redux-localstorage'

export const finalCreateStore = compose(
  persistState("auth"),
)(createStore);
```

引数には保存する state 名を指定します。
ルートのみ指定可能で、保存は指定したルート以下をすべて保存します。
state を指定しない場合はすべての state を保存します。

複数の state を保存したい場合は配列で指定します。

```js
  persistState(["auth", "my"]),
```

local storge にデータがある場合は、次のアクセス時にその state で再開されます。

# 参考

* [elgerlambert/redux-localstorage](https://github.com/elgerlambert/redux-localstorage)
Linux でシステムディレクトリ を誤って move してしまったときの対処

# 概要
Linux でシステムディレクトリを誤って /tmp などに move してしまった場合の対処を示します。想定するシチュエーションと発生する事象を説明し、具体的な対処方法を記します。

# シチュエーション
あなたは、root 権限でシステムにログインし、システムディレクトリ（例として /lib）を誤って /tmp などの下に move してしまいました。

このとき以下のような状況に陥ります。
* ありとあらゆるコマンド実行でエラーが発生する
  * ls, cd, mv, cpなど基本的なコマンドが実行できない


回復するには、対象ディレクトリを元のパスに move し直すことですが、コマンド実行でエラーが発生するので戻せません。


# 対処
(1) 環境変数 LD_LIBRARY_PATH に move 先のフルパスを追加する
LD_LIBRARY_PATH はライブラリファイルの実体を管理します。よって、本パスに該当するパスが指定されれば解決。とはいえ、テキスト処理系のコマンドを実行するのに必要なファイルが移動してしまっていると使えません。

(2) ld-linux を実行する
古式ゆかしい対処。

`# /tmp/lib/ld-linux.so.2 --library-path /tmp/lib/ /tmp/bin/{実行バイナリ} `

(3) busybox を利用する
もっともスマートな方式。標準Unixのコマンド機能を単一のバイナリで実行できる busybox を使います。

`# /bin/busybox mv /tmp/lib/ /`

# 補足

本件は、過去に筆者が実際に経験しました。受託開発で納品する本番機で、しかもアプリケーションの総合テスト真っ盛りの中でやらかしました。事の重大さに気づいたのは、深夜にひとりきり。真夏なのにあれほど背筋が凍ったことはありません。解決するまでの2時間は生きた心地がしませんでした。
PhpStorm10にアップデートしてからインデントがおかしい


# PhpStorm10にアップデートしてからインデントがおかしい場合
## PhpStorm10にしてからオートインデントの挙動がおかしい
配列やメソッドチェーンの際にインデントが1つ多くなってしまいます。

```
// こうなってほしいのに
$foo = [
    'hello',
    'world',
];

// こうなってしまう
$foo = [
        'hello',
        'world',
];
```

## 問題は認識されている様子
https://youtrack.jetbrains.com/issue/WI-29726
https://youtrack.jetbrains.com/issue/WI-28981

## 暫定対応
Settings > Editor > Code Style
Indents Detection から
"Disabling detection of intendation" のチェックを外すと改善することがあるようです。

参考)
https://devnet.jetbrains.com/message/5564005;jsessionid=C3C426BA8B3FA83EB5E379DBF2A35C2F
SHA-2なワイルドカード自己発行証明書の作成

[SHA-2でSANsな自己発行証明書の作成](http://qiita.com/tanakachang/items/c4cf9d55c8e36ac46610)について書きましたが、ワイルドカード自己発行証明書の作成についても。

#手順

    $ openssl genrsa -out /etc/httpd/conf/ssl.key/server.key 2048
    $ openssl req -new -sha256 -x509 -key /etc/httpd/conf/ssl.key/server.key -out /etc/httpd/conf/ssl.crt/server.crt -days 1000

二つ目のコマンド実行後に、

    Common Name (eg, your name or your server's hostname) []:

と聞かれたら、

    *.example.com

みたいな形でコモンネームを指定します。
phpmd.orgに掲載されてないRule


PHPMDでWarningでたので抑止しようとしたらルールが phpmd.org になかったのでソースおって調べた。

# TooManyPublicMethods

こっちは記載あった(^^;　http://phpmd.org/rules/codesize.html#toomanypublicmethods

意味　public メソッド多すぎ。


## 警告メッセージ例
下記の様なWarning

```
phpmd: The class AttachmentBehavior has 22 public methods. Consider refactoring AttachmentBehavior to keep number of public methods under 10.
```

## 抑止

classコメントで下記の様にして抑止

```php
/**
 * Class AttachmentBehavior
 *
 * @SuppressWarnings(PHPMD.TooManyPublicMethods)
 */
```

# DevelopmentCodeFragment

意味　開発用コード入っちゃってるよ

コード内に```print_r```とか入ってると出てきます。

デバッグ用のちょっとしたライブラリつくってると発生しやすい(^^;

## 警告メッセージ例
```
phpmd: The method FilesModelTestBase::_assertArray() calls the typical debug function print_r() which is mostly only used during development.
```

## 抑止

抑止は下記で。

```php
/**
 * _assertArray method
 *
 * @SuppressWarnings(PHPMD.DevelopmentCodeFragment)
 */
```
第0回 黒い画面 (さわりの部分)

##まず
今回は触りの触りをやります。
何回かに分けて説明していきます。

##コマンドラインって？
黒い画面のこと
文字入力によってコンピュータを操作する

##コマンドラインのメリット
・文字入力で操作するので早くて軽い
・コマンドをスクリプト化できるので、自動化しやすい
・PCを遠隔操作するときなど送るのは文字だけなのでデータ量が少なく済む
・かっこいい

##コマンドラインのデメリット
・学習コストがかかる
・使う機会がなかなかない？(人によります

##シェルスクリプトって？
コマンドラインインタプリタ向けに書かれたスクリプト言語
システムコマンドに新たなコマンドのように提供したり、コマンド列を自動的に実行させるバッチ処理などができる。

##とりあえず触ってみる
まずはメリットの自動化についてやってみたいと思います。

```sh:HelloWorld.sh
#! /bin/sh

echo "Hello World"
```
これを実行させるにはまず権限を書き換え、そのあとに実行させます。

```sh
$chmod u+x HelloWorld.sh
$./HelloWorld.sh
Hello World
```
ということで画面に出力されました。

##次回予告
シバンの説明とかシェルスクリプトの文法または、
シェルとかカーネルとか深いところを書こうと思っています。
BigQueryのWeb UIでテーブル名が長すぎて確認できないときの対処法

BigQueryを使っているとどうしても長いテーブルを作る必要が出てくるかもしれません。
その際にクエリブラウザで見てみると以下のように長いテーブル名は省略されてしまいます。

![table_name.png](https://qiita-image-store.s3.amazonaws.com/0/30079/5c385c1c-4dea-5d23-3b00-03d04f70d0aa.png "table_name.png")

その際に便利なのが、[Stylebot](https://chrome.google.com/webstore/detail/stylebot/oiaejidbmkiecgbjeifoejpgmdaleoha)というChromeのExtensionです。
これを使ってCSSを変えれるので、左ペインの幅を広くして、より多くのテーブル名を見せる事ができます。

# Stylebotの設定

以下のように設定すれば左ベインの幅が広がります。

## #content-panel

![css_1.png](https://qiita-image-store.s3.amazonaws.com/0/30079/a918d12f-e966-9e0d-e113-018b25bbe6c8.png "css_1.png")

## #content-panel-main

![css_2.png](https://qiita-image-store.s3.amazonaws.com/0/30079/f6f2f723-f3e2-44f2-d8db-6db096048b53.png "css_2.png")

## div.project-display

![css_3.png](https://qiita-image-store.s3.amazonaws.com/0/30079/3f57f086-2d92-f430-f56f-f917f7fad944.png "css_3.png")

## div.tables-table-id.goog-inline-block.overflow-ellipsis

![css_4.png](https://qiita-image-store.s3.amazonaws.com/0/30079/a46e9583-9def-8694-efa0-bc744c807a9b.png "css_4.png")

# 結果

![result.png](https://qiita-image-store.s3.amazonaws.com/0/30079/3a8186e7-4530-7769-8fc8-4eba4a186b9c.png "result.png")

綺麗に広がりました!まだ全体は見えませんがここらへんはCSSを調整すればいいかと思います。
Excel2013 > 整列 > 左右に並べて表示 > 左側を意図的に選ぶ > 1. 左側にしたい方のウィンドウを選択 / 2. 整列 > 左右に並べて表示

```txt:動作環境
Excel 2013 on Windows 8.1 pro
```

整列 > 左右に並べて表示
を行う時、左側に持ってきたいウィンドウがあるとする。

以下で左側に持ってこれるようだ。

1. 左側にしたい方のウィンドウを選択
2. そのメニューにて「整列」>「左右に並べて表示」を選択
"Unity"+"leap motion" [練習四つ]: VRGUI Project

<h2>VRGUI Project： 「指のポジション！」</h2>
<h3>Goal: 空間に浮かぶGUIを作る</h3><ul>
<li>Step 1: UnityでLeap Motionを使ってGesture Motion認識ができる。</font></li>
<li><font color=red>Step 2: uGUIでメニューを作って空間に浮かべる</font> </li>
<li>Step 3:メニュー選択。任意のGameObjectからRaycastを飛ばしてメニューを選択できる。選択状態で色を変える。できたら音も。</li>
<li>Step 4:メニューで選択した項目を実行。メニューに任意のアクションを割り当てられるように実行する。</li>
</ul>

<hr/>

Step2をしている中で、指のpositionとスピード(velocity)を求める。
目標は二つの指でmotionの感知するために。

指のポジション
<hr/>
<img width="1020" alt="Screen Shot 2015-11-16 at 17.05.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/afe9a6fa-127e-4ed5-5959-d5e5486b2c52.png">

説明
<font color="red">a</font>　　handModel.fingers[i]　：べつべつの指のため, 
i=0~4；親指からて小指まで　０、１、２、３、４

<font color="red">b</font>　.GetTipPosition().x: べつべつの指のx-position
.GetTipPosition() -> x,y,z position

<br/>
<br/>

指のvelocity(速力）：次のブログで。。。
<hr/>

<img width="1017" alt="Screen Shot 2015-11-16 at 17.06.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/10bebfd2-74ef-a073-fae2-9c9524d6a673.png">

unityはrigid bodyがあるcomponentの速力を求めることができる。
Atomを1.2.0にアップデートしたらremote-editが動作しなくなる


##  はじめに

表題の通り、Atomを1.2.0にアップデートしたら[remote-edit](https://atom.io/packages/remote-edit)で編集したいファイルを選んでも編集ペインが出てこなくなった。
何か情報がないかとIssueを見に行ってみたら[すでに報告されている( Files are not displayed after successfully reading from remote server #143 )](https://github.com/sveale/remote-edit/issues/143)ようだ。

## 原因

TextEditorのコンストラクタの引数が変更されたために起きている。
実際に変更されているのは[このコミット(51abab9)](https://github.com/atom/atom/commit/51abab930d53b8153d19e3b810b286cc12f7c81a#diff-561e90889eebfd1149f1b29006d738c4)で、エラーは[このコミット(95f0ff0)](https://github.com/atom/atom/commit/95fbff033dc47c6fb3b31dfeeb155c1f7233c7f7#diff-561e90889eebfd1149f1b29006d738c4)で追加されている。
通常であればAPIドキュメントにも載っている`atom.workspace.open`あたりを利用すると良いのだが、残念ながらremote-editはTextEditorを継承して独自クラスとして拡張してしまっているのためコンストラクタの引数を最新のものに追随する必要がある。

## 対策

[Issue内のコメント](https://github.com/sveale/remote-edit/issues/143#issuecomment-156842548)にもあるが、現状はバージョンを1.1.0に戻して自動アップデートが実行されないようにするしかないようだ。
試していないので動く保障はないが、[remote-edit-editor.coffee](https://github.com/sveale/remote-edit/blob/master/lib/model/remote-edit-editor.coffee)に定義されているRemoteEditEditorのコンストラクタを継承元のTextEditorと同じように変えてやれば恐らく動くはずである。

### 2015/11/17 Update

動作するかの確認はしていないが、[この問題に対するPR](https://github.com/sveale/remote-edit/pull/144)があるようだ。

### 2015/11/19 Update

上記のPRだと問題があったようで、[再度PR](https://github.com/sveale/remote-edit/pull/146)されている。
修正内容を確認したが、テスト用だと思われる`console.log`が残っているのは気になるものの、それ以外の部分は前のPRと比べてかなり綺麗に書き直されている。

### 2015/11/24 Update

開発者がなかなか対応できない状況なのか、未だに公式には対応されていない。
折角修正済みのPRが存在するのだからと、取り急ぎ上記PRを取り入れてみることにした。
試してみたところ当方の環境では正常に動作しているようだ。
以下、上記PRを無理やり当てる方法を記すが、こちらでは動作に関する責任を取りかねるので自己責任の範囲で利用してほしい。

#### 1. diffファイルのダウンロード

GitHubのPRはURL末尾に「.diff」を付けるとUnified形式のdiffをダウンロードできる。
今回のPRだと[https://github.com/sveale/remote-edit/pull/146.diff](https://github.com/sveale/remote-edit/pull/146.diff)となる。

#### 2. ダウンロードしたdiffをpatchコマンドで適用する

シェルを開き、パッケージのディレクトリに移動し、`patch`を用いて適用する。

```shell-session
$ cd /path/to/.atom/packages/remote-edit
$ patch -p1 < /path/to/146.diff
```

当方はWindows 7環境で利用しているが、MinGW/MSYSで最低限のシェル環境は整えているのでそちら由来の`patch`を利用している。
試してはいないが、[WinMerge](http://winmerge.org/?lang=ja)を利用してもパッチの適用は可能だと思われる。

#### 3. 追加されたnpmモジュールをインストール

diffのpackage.jsonの部分を確認してもらえれば分かると思うが、[temp](https://www.npmjs.com/package/temp)モジュールが追加となっている。
手動でインストールしてやる必要があるため、`npm`コマンドを用いてインストールした。

```shell-session
$ cd /path/to/.atom/packages/remote-edit
$ npm install temp
```

別に`npm install`でも`npm i`でも構わないが、依存パッケージのひとつである[keytar](https://www.npmjs.com/package/keytar)はネイティブモジュールであるためビルド環境が必要となる。
Windowsの場合はVisualStudio、Macの場合はXCodeが入っていなければエラーが出るため注意していただきたい。

#### 4. おもむろに`Ctrl + Alt + B`で接続先リストを開く

以上で差分の適用は終了なので、remote-editが正しく動作するかの確認を行う。
こちらの環境では初回のみ接続先リストの表示に待たされることとなったが、表示された後はいつも通り使うことができた。

### 2015/12/07 Update

2015/12/05付けで[このPR](https://github.com/sveale/remote-edit/pull/146)が取り込まれ、手を加えないでもremote-editが使用できるようになったようだ。
上記手順で手を加えた方でも何もせずにアップデートが出来る。
ruby-style-guideの翻訳をだいぶなおした

https://github.com/fortissimo1997/ruby-style-guide/pull/17

まあ細かいことは向こうに書いたので、もうちょっと一般的に言えることを:

- 訳者は、たとえ英語力がミジンコレベルだったとしても、日本語は読めるはずだからこそ翻訳をやっているわけで、したがって、訳文が日本語として成立しているかは判定可能のはず。訳があっているかどうか以前の問題として、拙文を上梓して読者のお目汚しを願わんとする以上は、 **最低でも日本語** を書くというのは矜恃とかそういう問題だと思う。翻訳したらまず読み返すべし。
- 英単語がよく訳せないなら、度胸一発ハッタリかまして適当訳するくらいなら **ルー語** にしてくれたほうがむしろありがたいので、無理に訳そうとするな。
- 英語にない文型を独自に編み出さないこと。どんなに複雑なように見える文でもかならず英文は5文型のどれかでできているので、よくわかんないからといって **第六第七の文型** を編み出すべからず。
- まず動詞を発見せよ。その文の動詞はどれか。動詞が見つかれば、文脈から主語が見つかるし、見つからなければ命令形だ。
- 文の構造からして理解不能なら、文に括弧を挿入しまくって **構文木** を作成せよ。[たとえばこのように](https://github.com/shyouhei/ruby-style-guide/commit/d31fadee5f8ac1ee1f7a12f53ab1da3d96cde0f1)
- 英文の平叙文で引用符 `"` が出現しているときのニュアンスは日本語に対応するものがないことを理解せよ。単に鉤括弧に置換すれば良いというものではない。これでも読め。 http://matome.naver.jp/odai/2140084137494424501

追記: diff見えるように分割した
https://github.com/fortissimo1997/ruby-style-guide/pull/18
https://github.com/fortissimo1997/ruby-style-guide/pull/19
https://github.com/fortissimo1997/ruby-style-guide/pull/20
https://github.com/fortissimo1997/ruby-style-guide/pull/21
Emacs の package をコマンドラインから全部アップデートする

いちいち <kbd>M-x</kbd> `package-list-packages` して <kbd>U</kbd> <kbd>x</kbd> するのが面倒だからバッチでやりたいという話です。

## やりかた

こういう Emacs Lisp を書いて

```el:upgrade-packages.el
(package-list-packages)
(package-menu-mark-upgrades)
(package-menu-execute t)
```

普通にバッチで実行します。

```
$ emacs --script path/to/upgrade-packages.el
```

stdout には、こんな感じで普段 minibuf とかに出てくる文字列がズラズラと出てきます。

```
Importing package-keyring.gpg...
Importing package-keyring.gpg...done
Contacting host: elpa.gnu.org:80
Contacting host: elpa.gnu.org:80
3 packages can be upgraded; type `U' to mark them for upgrading.
3 packages marked for upgrading.
Making version-control local to let-alist-autoloads.el while let-bound!
Generating autoloads for let-alist.el...
Generating autoloads for let-alist.el...done
# ... (略) ...
```

## 注意点

[MELPA](https://melpa.org/) のようなサードパーティのレポジトリを追加している場合は、その初期化 (`package-archives` に append するやつ) を一番最初に実行する必要があります。`init.el` などとの共通部分を適当に抜き出して再利用できるようにするのがスマートな感じがします。
crond, jenkinsでバッチ実行をdocker-run経由にした際、ゴミコンテナが大量に残ってしまう問題

毎時、`docker-run -it myapp batch.sh` みたいなことしてたら、すごい勢いでゴミコンテナが溜まった…



```
# 叩いた分だけ
$ docker run -it ubuntu:latest date
$ docker run -it ubuntu:latest date
$ docker run -it ubuntu:latest date

# ゴミが残る（◞‸◟）
$ docker ps -a | grep ubuntu
2219e2ebc02f        ubuntu:latest                               "date"                 6 seconds ago       Exited (0) 5 seconds ago                                  adoring_bohr
ba7cf556e859        ubuntu:latest                               "date"                 8 seconds ago       Exited (0) 7 seconds ago                                  dreamy_lovelace
2515feae6cfe        ubuntu:latest                               "date"                 20 seconds ago      Exited (0) 20 seconds ago                                 serene_meitner
```


こうすると残らないよ！！

```
$ docker run --rm -it ubuntu date
```
Golang interfaceの使い方

[ここ](http://golangtutorials.blogspot.jp/2011/06/interfaces-in-go.html)を参考にした｡

立方体と長方形の面積(体積)を求めるとする｡

```go
package main

import "fmt"

type Rectangle struct {
	length, width int
}

type Cube struct {
	side int
}

func (r Rectangle) Area() int {
	return r.length * r.width
}

func (c Cube) Area() int {
	return c.side * c.side * c.side
}

func main() {
	rect := Rectangle{length: 5, width: 3}
	fmt.Println("Rectangle is ", rect)
	fmt.Println("Area is ", rect.Area())
	cb := Cube{side: 3}
	fmt.Println("Cube is ", cb)
	fmt.Println("Area is ", cb.Area())
}

```

Areaを定義して､それぞれ面積(体積)を計算してやった｡

```go
Rectangle is  {5 3}
Area is  15
Cube is  {3}
Area is  27

```

もう少し抽象化してみる｡ Shaper という　interface を作ってやって

Shaper(変数).Area()

で変数を放り込めば面積が出るようにしてやる｡


```go
package main

import "fmt"

type Shaper interface {
	Area() int
}

type Rectangle struct {
	length, width int
}

type Cube struct {
	side int
}

func (r Rectangle) Area() int {
	return r.length * r.width
}

func (c Cube) Area() int {
	return c.side * c.side * c.side
}

func main() {
	rect := Rectangle{length: 5, width: 3}
	fmt.Println("Rectangle is ", Shaper(rect))
	fmt.Println("Area is ", Shaper(rect).Area())
	cb := Cube{side: 3}
	fmt.Println("Cube is ", Shaper(cb))
	fmt.Println("Area is ", Shaper(cb).Area())
}
```

出た｡

```go
Rectangle is  {5 3}
Area is  15
Cube is  {3}
Area is  27

```

これでいったい何すんの?と思ったが､どうもこれで､「図形の面積(体積)をだす」という計算が抽象化出来たわけだ｡

ということはfunc main()内をもっと簡略化できる｡
体積(面積)を出したい図形を配列に入れてイテレーションさせてみる｡

```go
func main() {
	rect := Rectangle{length: 5, width: 3}
	cb := Cube{side: 3}
	arr := []Shaper{rect, cb}

	for _, value := range arr {
		fmt.Println("Area is ", value.Area())
	}
}
```

```go
Area is  15
Area is  27

```

出た｡

#追加
この記事はとても参考になる

インタフェースの実装パターン #golang
http://qiita.com/tenntenn/items/eac962a49c56b2b15ee8

急いで学ぶGo lang#6 インターフェイス
http://dev.classmethod.jp/go/golang-6/
マルコフ過程で風力っぽいダミーデータ生成

# 背景
風力の時系列データを資料に用いたいとします。
ここでは、著作権を気にしなくていいようにダミーデータをPython3で作成することにします。単純な乱数だと偽物っぽいので、マルコフ過程を用います。

# 方針
下記の3状態を考えて、推移確率を適当に決めます。また、各状態ごとのデータは上限を変更したときの一様乱数にします。

- 無
- 低
- 高

# 実装
```py3
import numpy as np
import matplotlib.pyplot as plt

sts = [0, 1, 2] # 無, 低, 高
coe = [0, 30, 80] # 上限
M = np.array([[0.93, 0.07, 0.0], # 推移確率
              [0.45, 0.3, 0.25],
              [0.0, 0.07, 0.93]])
st = 0 # 初期状態
res = [] # 結果
np.random.seed(16)
for i in range(400):
    res.append(np.random.rand() * coe[st])
    st, = np.random.choice(sts, 1, p=M[st])
plt.bar(range(len(res)), res)
```
# 結果
それらしくなりました。
![ダウンロード (1).png](https://qiita-image-store.s3.amazonaws.com/0/13955/1882f905-3b0f-8c47-68ef-2c324965e9bf.png)
spark-shellでimportとか変数設定とかをファイル読み込みで事前にやっておくには

出来上がったアプリ、ツールなどは、
spark-submitで使えばよいが、spark-shellで対話的に
デバッグ、確認したいが、いちいち、importとか変数設定とかするのが面倒な場合は、ファイルに設定して、読み込む


```prepare.scala
import org.apache.spark._
import org.apache.spark.rdd._

import com.rikima.ml.Query

val input = "/opt/hoge/data.tsv"
val model = "/opt/hoge/model.json"

def process(queries: RDD[Query]) : RDD[Int] = {
 ....
}

```

spark-shellの起動

```shell.sh
#!/bin/sh

jars="hoge.jar"
for jar in $(ls ./extjars/*.jar)  ; do
   jars=$jars,$jar
done
spark-shell --jars $jars -i ./prepare.scala 

```

これで、spark-shell起動後に、input, model変数が使えたり、process functionを使える。
全角、半角を区別することなくスペースが除去される[NSCharacterSet whitespaceCharacterSet]


```

// 半角スペースを前後に２つが格納された変数を宣言
NSString *str1 = @" iPhone 開発 ";
 
// 全角スペースを前後に２つが格納された変数を宣言
NSString *str2 = @"　　iPhone 開発　　";
 
// トリムする。第一引数では、Chara型で空白を指定。
NSString *retstr1 = [str1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSString *retstr2 = [str2 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
 
// 取得した文字列をコンソールログへ表示
NSLog(@"retstr1_1 is =%@=",retstr1);
NSLog(@"retstr2_1 is =%@=",retstr2);
 
```
JAVA throw 例外インスタンス;(例外的状況の報告)String getMessage()/printStackTrace();

<FONT color="#ff0000">■例外的状況の報告(例外を投げる)</font>
**throw 例外インスタンス;**
一般的には「**throw new 例外クラス名("エラーメッセージ");**」となる

■Test05.java

```java
public class Test05 {
	public static void main(String[] args) {
		Person p = new Person();
		p.setAge(-128);
	}
}
```

■Person.java

```java

public class Person {
	int age;

	public void setAge(int age) {
		if (age < 0) {
			throw new IllegalArgumentException("年齢は正の数を指定すべきです。指定値=" + age);

		}
		this.age = age;
	}

}
```

■実行結果
Exception in thread "main" java.lang.IllegalArgumentException: 年齢は正の数を指定すべきです。指定値=-128
	at Person.setAge(Person.java:7)
	at Test05.main(Test05.java:4)

■例② Test05.java

```java
public class Test05 {
	public static void main(String[] args) {
		Person p = new Person();
		p.setAge(5);
	}
}
```

■例② Person.java

```java

public class Person {
	int age;

	public void setAge(int age) {
		if (age < 0) {
			throw new IllegalArgumentException("年齢は正の数を指定すべきです。指定値=" + age);

		}
		this.age = age;
		System.out.println("異常なし");
	}

}
```

■例② 実行結果
異常なし

<FONT color="#ff0000">■例外インスタンスが必ず備えているメソッド</font>
**String getMessage()
例外的状況の解説文(エラーメッセージ)を取得する**

■String getMessage() 例

■Test05.java

```java
public class Test05 {
	public static void main(String[] args) {
		try {
			throw new UnsupportedMusicFileException("未対応のファイルです");
		} catch (Exception e) {
			// e.printStackTrace();
			System.out.println(e.getMessage());
		}
	}
}
```

■UnsupportedMusicFileException.java

```java
public class UnsupportedMusicFileException extends Exception {
	public UnsupportedMusicFileException(String msg) {
		super(msg);
	}

}
```

■String getMessage() 例 実行結果
未対応のファイルです


**void printStackTrace()
スタックトレース(エラーが発生するまでの経緯)の内容を画面に出力する**

■printStackTrace()例
■Test05.java

```java
public class Test05 {
	public static void main(String[] args) {
		try {
			throw new UnsupportedMusicFileException("未対応のファイルです");
		} catch (Exception e) {
			e.printStackTrace();
			// System.out.println(e.getMessage());
		}
	}
}
```

■UnsupportedMusicFileException.java

```java
public class UnsupportedMusicFileException extends Exception {
	public UnsupportedMusicFileException(String msg) {
		super(msg);
	}

}
```

■printStackTrace()例 実行結果
UnsupportedMusicFileException: 未対応のファイルです
	at Test05.main(Test05.java:4)
nodeで特定の人のGithubContributionsデータ(草カレンダー)を取得する。

#Githubアカウントの草データ取得#

githubの誰かのアカウント行くと丁寧に生えてあるこの草のカレンダーですね。

![githubcontributions.png](https://qiita-image-store.s3.amazonaws.com/0/85665/5c4feb59-4c5f-c8b9-8932-8adb6f95d31e.png)

この草データを取得したいと思います！

これは恥ずかしながら自分のgithubの草なんですが、気にしないでください。
githubの草データはこのURLを叩けば帰ってきます。

https://github.com/users/{username}/contributions

このURLを叩いて帰ってくるのが<svg>タグとか<g>タグとかで今までJSONしか使ったことのない自分にとっては未知の世界だったんですが、xml形式だったらしくそれをJSONに変換してやれば何も怖くなかったですb

てなわけで、このURLを叩いてデータを取得しましょう。

```js:kusa.js
var https = require('https')
,   parseString = require('xml2js').parseString
,   async = require('async');

// githubの草のオブジェクト
function contribution(x, y, color, count, date){
  this.x = x,
  this.y = y,
  this.color = color,
  this.count = count,
  this.date = date;
}

/* usernameのContributionsをの色と位置取得して配列にプッシュ */
var getGitHubData = function(name, callback) {
    var url = 'https://github.com/users/' + name + '/contributions';
    var width, height, contributions = [];

	https.get(url, function(res) {
		var body = '';
		res.on('data', function(chunk) {
    		body += chunk;
		});

		res.on('end', function() {
			parseString(body, function(err, result) {
                // console.log(result);
				width = result.svg.$.width,
				height = result.svg.$.height,
				data = result.svg.g[0].g;

				// 並行実行
				async.forEach(data, function(datum, callback) {
                   // datum.$.transform は transform(???, 0)の形式なのでmatchで???を抽出
					x = datum.$.transform.match(/\d+/)[0];
					datum.rect.forEach( function(rect) {
						y = rect.$.y;
						color = rect.$.fill;
						count = rect.$['data-count'];
						date = rect.$['data-date'];
						
						kusa = new contribution(x, y, color, count, date);
						contributions.push(kusa);
					});
					callback();
				}, function(err) {
					if( err ) console.log(err);
					console.log(contributions);
					callback(contributions);
				});
			});
		});
	}).on('error', function(e) {
		console.log(e);
  	});

};
```

一気に書いちゃいましたが、あるnameの人のgithubの草を取得するために、URLを叩いて、帰ってきたxml形式のデータを'xml2js'でJSON形式に変換。そのデータをcontributionsに格納していく。こうして格納し終えたcontributionsのデータはこんな草オブジェクトの配列になってるはずなので、後はこれをcanvasに描画するなり、なんなりとしてやってください。

取得したcontributionsのオブジェクトデータ配列はこんな感じで帰ってくるはず。

```json:contributions.json
 [{ x: '676',
    y: '26',
    count: '4',
    color: '#44a340',
    date: '2015-11-10' },
  { x: '676',
    y: '39',
    count: '1',
    color: '#d6e685',
    date: '2015-11-11' },
  { x: '676',
    y: '52',
    count: '1',
    color: '#d6e685',
    date: '2015-11-12' },
  { x: '676',
    y: '65',
    count: '3',
    color: '#8cc665',
    date: '2015-11-13' },
  { x: '676',
    y: '78',
    count: '4',
    color: '#44a340',
    date: '2015-11-14' },
  { x: '689',
    y: '0',
    count: '11',
    color: '#1e6823',
    date: '2015-11-15' },
  { x: '689',
    y: '13',
    count: '3',
    color: '#8cc665',
    date: '2015-11-16' } ]

```

自分のメモ用ということで。では。
Unity 複数ディスプレイで複数カメラを扱う(Windows限定)

#マルチディスプレイ

UnityではWindowed,Full screen(ディスプレイを指定)のどちらかしか選択できませんが，以下の画像のようなマルチディスプレイ環境で別々のカメラビューを表示する方法です．

![6.png](https://qiita-image-store.s3.amazonaws.com/0/79662/645146f5-3359-a8c9-f10f-87ddf86e6a6a.png)

#カメラ設定

例として上の画像の1と2の解像度の違うディスプレイにそれぞれ別のカメラビューを表示します．
基本的にはUnityのシーン上に複数のカメラを配置し，CameraコンポーネントのViewportRectの値をディスプレイ配置と同じ構成になるように設定します．

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/79662/6e492183-5b83-6fd3-2a7d-878395118791.png)

あとはプロジェクトをビルドし，[こちら](http://qiita.com/oishihiroaki/items/5a28fdc3011340c1ead8)を参考にバッチファイルを作成，実行します．

#スクリプト
これらの設定を簡単に行えるように以下のスクリプトを作成しました．
[github](https://github.com/tamalign/MultiDisplayScript/blob/master/MultiDisplayScript)

#使い方
適当なゲームオブジェクトを作成してスクリプトをアタッチし，各ディスプレイの解像度，スクリーンの左上の位置を指定します．

![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/79662/015ca704-bb3b-1719-5873-d7829760fd68.png)

実行します．

#実行時にウィンドウ位置がずれる問題
[こちら](http://qiita.com/oishihiroaki/items/5a28fdc3011340c1ead8)のようにフルスクリーンで実行する場合は問題ないかもしれませんが，特定のディスプレイのみにゲームウィンドウを表示する際にウィンドウ位置がずれる問題がありました．
そこで


```filename:MultiDisplayScript.cs
 void Start() 
    {
        #if UNITY_EDITOR
                return;
        #endif
        int handle = GetForegroundWindow();
        MoveWindow(handle, (int)Position.x, (int)Position.y, (int)fRect.x, (int)fRect.y, 1);
    }
```


ここでウィンドウの位置を変更しています．

#おわりに
デバッグなどあまり行っていませんので不具合がありましたらお願いします．
Oracleでテーブル間で同一カラム名のコピーを行う


データコンバートや、テストの場面で２テーブル間で同一カラム名をコピーする際に
カラム構成がほぼ同じ（だが少し異なる）場合、全カラム明記の憂き目に合います。

そんな作業を少しでも軽減すべく、Stored Procedureを書いてみました。
”EXECUTE IMMEDIATE”コマンドを使用するのでパフォーマンスが必要な場所には使えませんが
メンテナンス作業には使えるかと思います。

組み込みSQLで出来る方法があれば教えてください。
私が知らないだけかもしれません。

#使用法

```plpgsql:PL/SQL
BEGIN 
  -- TABLE1からTABLE2へ同一カラム名のものは全てコピー
  COPY_TABLE_COLS( 'TABLE1', 'TABLE2' );
  -- 上記のWHERE節付き
  COPY_TABLE_COLS( 'TABLE1', 'TABLE2', 'RECNO < 300' );
END;
/
```

#Stored Procedure
```plpgsql:PL/SQL
CREATE OR REPLACE PROCEDURE COPY_TABLE_COLS( SP_SOURCE_TABLE VARCHAR2, SP_TARGET_TABLE VARCHAR2, SP_SOURCE_WHERE VARCHAR2 := NULL)
IS
 vColNames VARCHAR2(3000);
 vSQL      VARCHAR2(3000); -- 項目が多すぎる場合は、問題が起きます。　悪しからず。
 vWHERE    VARCHAR2(3000);
BEGIN
    IF SP_SOURCE_WHERE IS NULL THEN
        vWHERE := '1=1';
    ELSE
        vWHERE := SP_SOURCE_WHERE;
    END IF;
    
    SELECT WMSYS.WM_CONCAT(Column_Name) INTO vColNames FROM (
      SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME=SP_SOURCE_TABLE
      INTERSECT
      SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME=SP_TARGET_TABLE)
    WHERE Column_NAME NOT IN ('ROWID');

    vSQL := 'INSERT INTO ' || SP_TARGET_TABLE
        || '   ( ' || vColNames || ')'
        || ' SELECT ' || vColNames || ' FROM ' || SP_SOURCE_TABLE
        || ' WHERE ' || vWHERE;

    -- DBMS_OUTPUT.PUT_LINE(' SQL=' || vSQL);
    EXECUTE IMMEDIATE vSQL;
END;
/
```
GeocoderでGoogle Map上の座標を検証する

とあるWebサイトで、施設のGoogleマップの旗がずれているような気がしたので、
住所や施設名から計算した緯度経度と、Googleマップで指定された緯度経度を比較してみる。

#東京タワーの緯度経度をGeocodingサイトで調べる

[Geocodingサイト](http://www.geocoding.jp/)で東京タワーを検索すると、住所と座標が分かる。

>〒105-0011 東京都港区芝公園４丁目２−８ 東京タワー
>座標: 35.658581, 139.745433

#Geocoderで住所から緯度経度を取得

まずは geocoder をインストール。

```
pip install geocoder
```

Pythonコードはとっても簡単。

```geocode.py
import geocoder
n = "東京タワー"
a = "東京都港区芝公園４丁目２−８"
p = [35.658581, 139.745433]

g = geocoder.google(a)
print(a, p,"<-->", g.latlng)

g = geocoder.google(n)
print(n, p,"<-->", g.latlng)
```

#地点間の距離を算出する

これだけだと、どれ位ずれているか、よく分からないので、
[2点の緯度経度から距離を算出するpythonコード]
(http://blogs.yahoo.co.jp/qga03052/33991636.html)を借りて、距離を計算。

```geocode.py
import geocoder
import math

# 2地点間の距離の計算(Python)
# http://blogs.yahoo.co.jp/qga03052/33991636.html
def deg2rad(deg):
    return( deg * (2 * math.pi) / 360 )

def Hubeny(lat1, lon1, lat2, lon2) :
    a =6378137.000
    b =6356752.314140
    e =math.sqrt( (a**2 - b**2) / a**2 )
    e2 =e**2
    mnum =a * (1 - e2)

    my =deg2rad((lat1+lat2) /2.0)
    dy =deg2rad( lat1-lat2)
    dx =deg2rad( lon1-lon2)
    sin =math.sin(my)
    w =math.sqrt(1.0-e2 * sin *sin)
    m =mnum /(w *w *w)
    n =a/w
    dym =dy*m
    dxncos=dx*n*math.cos(my)
    return( math.sqrt( dym**2 + dxncos**2) )

n = "東京タワー"
a = "東京都港区芝公園４丁目２−８"
p = [35.658581, 139.745433]

g = geocoder.google(a)
dist = Hubeny(p[0], p[1], g.latlng[0],g.latlng[1])
print(a, p,"<-->", g.latlng,dist)

g = geocoder.google(n)
dist = Hubeny(p[0], p[1], g.latlng[0],g.latlng[1])
print(n, p,"<-->", g.latlng,dist)
```

その結果、完全に一致するかと思ったら、数ｍのずれがありました。

```実行結果
東京都港区芝公園４丁目２−８ [35.658581, 139.745433] <--> [35.6585817, 139.7454636] 2.771940296311124
東京タワー [35.658581, 139.745433] <--> [35.6585696, 139.745484] 4.78817294783698
```

この程度のずれなら十分ですが、Google Map上で数百ｍずれている施設があったので、
BeautifulSoap等で当該箇所をWebスクレイピングして、検証するとよいでしょう。

```
> var myLatLng = new google.maps.LatLng(37.695042, 140.127955);
```

で記述されていることが多いので、

```
r = re.compile(r'LatLng\((.*),(.*)\)')
m = re.search(r, str)
   if m:
      p = [float(m.group(1)),float(m.group(2))]```
```

という正規表現で見つければよいようです。
[Ruby] 色々メモ



Ruby自体をそんなに触ったことがなくて、色々詰まるところがあるのでメモ。

### ファイル一覧の取得

```ruby
Dir::glob("./path/to/dir/*).each {|filename|
	if !FileTest.directory?(filename) 
		# do something to the file.
	end
}
```

#### ファイルパスからファイル名を抽出する

```ruby
File.basename(filename)
```

#### ファイルパスからディレクトリ名を抽出する

```ruby
File.dirname(filename)
```

組み込み定数を利用することで、実行時のファイルパスから実行ディレクトリを取得することができる。

```ruby
runPath = File.expand_path(File.dirname($0))

# or

runPath = File.expand_path(File.dirname(__FILE__))
```

### メソッド末尾の `!` `?` マーク

どうやら `dangerous methods` と呼ばれていて、内部的なステータスが変化するメソッドにつけるという慣例ぽい。
特に中身が変化しないメソッドにつけても大丈夫だった。
（参考: [Why are exclamation marks used in Ruby methods?](http://stackoverflow.com/questions/612189/why-are-exclamation-marks-used-in-ruby-methods)）

コメントで指摘もらいましたが、上記はちょっと解釈が違うらしい。
こっちの内容のほうがそれっぽい？（どちらもシンタックスシュガーとのこと）
[What is the purpose of “!” and “?” at the end of method names?](http://stackoverflow.com/questions/7179016/what-is-the-purpose-of-and-at-the-end-of-method-names)

上記のAnswerから引用すると、`!` は

>Methods ending in ! perform some permanent or potentially dangerous change

ということらしい。
永続的変化、あるいは潜在的に危険な変更を伴う処理の場合につけておくことっぽい？
例えばRailsのActiveRecordの例だと、`save` メソッドは失敗したら `false` が返るけど、`save!` メソッドはエラーを投げるらしい。

また `?` は

>Methods ending in ? return a boolean

`boolean` が返ることが分かりやすくなってるってことかな？


```ruby
# こんな感じ？
class Hoge
	def initialize(name)
		@name = name
	end
	
	def method!
		@name = "hoge"
	end
end

hoge = Hoge.new("aaa")
hoge.method!
```


### 代入演算

`name=(name)` のように定義するといわゆるSetterを定義できる。

```ruby
class Hoge
	# ... 省略
	def name=(name)
		print "Input is #{name}"
		
		@name = name
	end
end
```

```console
hoge = Hoge.new("abc")
hoge.name = "efg" # => Input is efg
```

#### `attr_accessor`で自動定義

どうやらインスタンス変数はそのままでは外部からセットできない？
上記のようにsetterを実装してやる必要があるみたいです。
が、毎回それを書いていくのは大変なので、`attr_accessor` というメタクラスのメソッドが用意されています。

コメントで指摘いただきました。
>セッターを作るだけなら，attr_accessor でなく attr_writer で OK です。
ゲッターは attr_reader で。
そして，attr_accessor はその両方を作ります。

「アクセサ」なので両方、ということですね。

```ruby
class Hoge
	attr_accessor :age
	# ... 略
	
	# セッターだけなら以下
	attr_writer :age
	
	# ゲッターだけ
	attr_reader :age
end
```

とすると、`name=(name)` を定義したのと同じようなことが自動で定義されます。

### メタクラスの拡張

`Class` クラスを拡張することで、クラス自体のメソッドを拡張することができます。
JavaScript的にはObjectの拡張に似てます。

```ruby
class Class
	def hoge
		print "hoge"
	end
end
```

とすることで、すべてのクラスに `hoge` メソッドが追加されます。

```ruby
Array.hoge # => hoge
```

#### クラス・メソッドを定義時に実行させる

```ruby
# 上記の拡張がなされたとして
class Fuga
	hoge # これが実行される
	
	# ... 略
end
```


ちなみに、そのクラスだけのクラス・メソッドは以下のように定義します。

```ruby
class Hoge
	def self.fuga
	
	end
end
```

ちなみに定義方法はこれ以外にもいくつかあるようです。
こちらの記事が参考になります→ [Ruby のクラスメソッド定義まとめ](http://qiita.com/Linda_pp/items/b7135ae1f0def6058c6c)

※ 当然ですが、`Class` の拡張でなくても、継承先のクラスなどで生成時に、継承元クラスのクラス・メソッドを実行させることができます。


### ブロックとyield

Rubyを最初に見た時に「お？」と思ったのがこの「ブロック」でした。
↓こういうやつ

```ruby
3.times {|i|
    p i
}
```

これは、`times` に続くブロックを関数と考えると分かりやすいです。
このブロック単位を実行している、というわけです。
そして当然ですが、このブロック変数を受け取るメソッドを自分で定義することも可能です。
実装する際は `yield` を使います。

```ruby
class Hoge
	def initialize()
		@data = [1, 2, 3, 4, 5]
	end
	
	def method
		for i in @data
			yield(i)
		end
	end
end

hoge = Hoge.new
hoge.method {|i|
	p i
}

# => 1, 2, 3, 4, 5
```
RaspberryPiでcronを動かす


MTAがインストールされていないらしく、postfixのインストール
<pre>sudo apt-get update
sudo apt-get install postfix</pre>



おまけ：
・ cronのログは/var/log/syslog
・ 起動コマンド
<pre>$ sudo /etc/init.d/cron start</pre>
RaspberryPiで温度計測


* 計測結果取得(温度計)
	* 使用前の設定を以下URL参照
http://deviceplus.jp/hobby/raspberrypi_entry_018/

	* データ取得コマンド
	* 
```
cat /sys/bus/w1/devices/28-021564e9faff/w1_slave
```

* 温湿度計取得
	* 下記を参考にI2Cを有効化
https://blog.ymyzk.com/2015/02/enable-raspberry-pi-i2c/
	
	* 下記コマンドでi2c-toolsとpython-smbusをインストール
	* 
```
sudo apt-get install i2c-tools python-smbus
```

	* datasフォルダ、scriptsフォルダを作成
	* 実行するためのgithubから以下ファイルをscriptsフォルダに配置
	* データ取得コマンド
	* 
```
python akilib/examples/raspberrypi/hdc1000.py
```
RaspberryPiへの無線LANの設定


ELECOM WDC-150SU2MBKを利用する場合。
https://www.raspberrypi.org/forums/viewtopic.php?p=462982
上記を確認して自分のRaspberryPiのOSバージョンに合ったドライバをSDカードのboot配下に配置しておく。
OSバージョン確認方法

```
name -a
```

RasipberryPiを起動し、SDカードのroot配下のドライバをhome配下にコピー

```
sudo cp /boot/ドライバファイル名.tar.gz /home/
```

/homeに移動し

```
sudo tar zxvf ドライバファイル名.tar.gz
```
で解凍

```
sudo ./install.sh
```
でインストール



http://takuya-1st.hatenablog.jp/entry/2015/05/17/155229
上記のとおり無線LAN設定



```
/etc/network/interfaces
```

の設定は以下のとおり

```XML:interfaces
auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
\#iface wlan0 inet manual
iface wlan0 inet static
address 192.168.1.211←ここがそれぞれ違う
netmask 255.255.255.0
gateway 192.168.0.254
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

auto wlan1
allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```
RaspberryへのOSインストール手順


■Raspbianのインストール
以下から最新版のRASPBIAN WHEEZYを「Download ZIP」から「2015-05-05-raspbian-wheezy.img」をダウンロード
https://www.raspberrypi.org/downloads/raspbian/


ddコマンドにてRaspbianのイメージファイルをSDカードにコピーする
http://ledsun.hatenablog.com/entry/2014/10/26/174712

microSDをPCから外してラズパイに差し込む。
USBを接続して電源を入れる


■PC接続して動作確認
参考:http://trapple.hateblo.jp/entry/2015/10/21/095526
PCとの接続のためにFT234Xのドライバを以下からダウンロード
http://www.ftdichip.com/Drivers/VCP.htm
解凍してインストール。

```
% kextstat | grep FTDIUSB
```

上記コマンドでドライバのインストール確認。

PCにUSBケーブルを差し込み以下のように認識されているか確認

```
% ls -al /dev/*usb*
crw-rw-rw-  1 root  wheel   18,   9 10 29 17:03 /dev/cu.usbserial-DJ001NIV
crw-rw-rw-  1 root  wheel   18,   8 10 29 17:04 /dev/tty.usbserial-DJ001NIV
```

上記確認ができたらGNU screenを使用

```
screen /dev/tty.usbserial-DJ001NIV 115200
```

ログインできればOK

おまけ：screenの終了コマンド
<pre>C-a k (Ctrl+aを押した後に k)</pre>

■ディスク容量の拡張
これをしないとすぐに容量オーバーになるので必須。
以下を参考に設定
参考:http://kkayataka.hatenablog.com/entry/2012/10/13/114500

■タイムゾーンの設定
参考：http://www.absolute-keitarou.net/blog/?p=1201
データ解析向け Python 環境を揃えた USBブートUbuntu をつくる


注意：ときどき更新します。誤りもあるかもしれません。

# Lili USB Creator で USBメモリに Ubuntu を焼く

USB作成環境は Windows7 64bit です。

**材料**

- USBメモリA（インストールCDの代わり, USB2.0, 8GB の余りものを使用）
- USBメモリB（Ubuntuのインストール先, USB3.0, 16GB を使用）
- [LinuxLive USB Creator](http://www.linuxliveusb.com/)
- [ubuntu-ja-15.04-desktop-amd64.iso](https://www.ubuntulinux.jp/download/ja-remix)

1. USBメモリAを差し，Lili USB を起動
2. STEP1でUSBメモリAを指定，STEP2で上記isoを指定，STEP4で「FAT32でフォーマットする」にチェックを入れ，雷をクリックし，作成完了を待つ
3. できたら windows をシャットダウンし，USBメモリAをブートする（BIOSの設定で起動順位をHDDより上にした上で起動する）
4. USBメモリBを差し込む
5. インストールを進めていき，インストールの種類で「それ以外」を選択
6. サイズを見てUSBメモリAらしき領域を選択し，「変更…」をクリック
7. 新しいパーティションのサイズ…：16384（MAXにする），利用方法：ext4…，パーティションの初期化：チェックを入れる，マウントポイント：/ でOK
8. ブートローダをインストールするデバイス：USBメモリAらしきデバイスを選択（入れ子になっている一番上を選択）し，インストール
9. スワップスペースを選んでませんと言ってきたら「続ける」
10. そのあと初期設定を進んでいき，インストールを待って完成
11. インストールが完了したUSBメモリBを差し，ブートする

# いろいろインストール


## 下準備
```bash
sudo apt-get update
sudo apt-get upgrade
```
```bash
sudo apt-get install python-dev
```
```bash
python
Python 2.7.9 (default, Apr  2 2015, 15:33:21) 
[GCC 4.9.2] on linux2
```
## pip
```bash
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
```
```bash
pip -V
pip 7.1.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)
```

2015.10.11 現在、

``` bash
apt-get install python-pip
```

で入れると、1.5.6 でこの後のパッケージがうまくいかなかったです。

## データ解析関係パッケージ
``` bash
sudo pip install numpy
sudo pip install pandas==0.16.2  # 最新の 0.17.0 だとstatsmodels をうまくインストールできなかった
sudo pip install cython
sudo pip install pystan

sudo apt-get install gfortran libopenblas-dev liblapack-dev
sudo pip install scipy

sudo pip install patsy
sudo pip install statsmodels

sudo apt-get install libfreetype6-dev
sudo pip install matplotlib
```

```bash
pip freeze  # 一部抽出

Cython==0.23.4
matplotlib==1.4.3
numpy==1.10.1
pandas==0.16.2
patsy==0.4.0
pystan==2.8.0.0
scipy==0.16.0
statsmodels==0.6.1
```

anaconda を使うのと，どちらがいいのでしょうか。

## （DBと）GIS
### QGIS

`/etc/apt/sources.list`に追記

```bash
deb     http://qgis.org/debian vivid main
deb-src http://qgis.org/debian vivid main
```

認証キーを取得

```bash
wget -O - http://qgis.org/downloads/qgis-2015.gpg.key | gpg --import
gpg --export --armor 3FF5FFCAD71472C4 | sudo apt-key add -
```

インストール

```bash
sudo apt-get update
sudo apt-get install qgis python-qgis qgis-plugin-grass
```

### GRASS GIS のGUI
6.4.4 も 7 も、エラーがあってできなかった >.<
やっぱり 15.04 じゃなくて LTS にすべきだった（最初に間違った）>.<

### PostGIS
```bash
sudo apt-get install postgis
sudo apt-get install pgadmin3
```

# 参考
- [Ubuntu 11.10 をUSBメモリにインストールする | シログ](http://cloud-work.net/usb%E3%83%96%E3%83%BC%E3%83%88/usb_install/#USB-2)
- [いつの間にかpipのインストールが楽になってた件](http://qiita.com/who_you_me/items/831d62f396e6d66dda66)
- [software installation - How do I install QGIS 2.8 on ubuntu 15.04? - Ask Ubuntu](http://askubuntu.com/questions/645343/how-do-i-install-qgis-2-8-on-ubuntu-15-04)
- [Pythonのデータ分析関連パッケージインストール - katz's adversaria](http://d.hatena.ne.jp/katz_24/20140214/1396971657)
AndroidからWebView内のjQueryイベントを呼び出す方法

Android用にラップしたJavaScript関数を作りたくなかったので
いろいろ調べてみたら意外と簡単に出来たのでメモ。

JavaScript関数を呼び出す

```js:filename
            webView.loadUrl("javascript:next('3');");
```

jQueryのClickイベントを呼び出す

```js:filename
            webView.loadUrl("javascript:$('.next').trigger(\"click\");");
```

参考にしたサイト
[【jQuery】クリックなどのイベントを発生させる](https://www.softel.co.jp/blogs/tech/archives/4376)
[【jQuery】jQueryの形と、呼び出し方](http://qiita.com/glaytomohiko/items/19159be555c6ba86a13a)
c#のEnum拡張をもうちょい楽に

# c#のEnum拡張をもうちょい楽に

こちらの記事を参考に
http://neue.cc/2010/11/13_285.html

LINQ を使わず、generic にしてちょっと整理してみたやつ。

拡張メソッドは static かつ non-generic なクラスじゃないと定義できないので、迂回するしかなさげ。
generic クラスも静的コンストラクタ使えるんだなぁ。

LINQ を外したのは、書き下しながら挙動見たかっただけなので深い意味はないです。
可能なら元記事のLINQ使った方がいいと思います。

あ、試したのは unity5.02 です。
unity は .net のバージョンが古いから、新しい c# ならもうちょいいい方法があるかも。

```csharp
using System;
using System.Collections.Generic;

/// enum付随データを保持する方
public static class CustomEnumAttributes<EnumType, AttributeType> {

	public static Dictionary<EnumType, AttributeType> dic { get; private set; }

	static CustomEnumAttributes() {
		dic = new Dictionary<EnumType, AttributeType> ();
		var v = Enum.GetValues(typeof(EnumType));
		for (int i = 0, num = v.Length; i < num; ++i) {
			var c = (EnumType)v.GetValue (i);
			var t = c.GetType ();
			string name = Enum.GetName(t, c);
			AttributeType[] attrs = t.GetField(name).GetCustomAttributes(typeof(AttributeType), false) as AttributeType[];

			if (attrs.Length > 0) {
				dic [c] = attrs [0];
			} else {
				// なんかログ吐いた方がよさげ
			}
		}
	}
}

/// enum型を持つ方
public static class Hoge {
	public enum State {
		[HogeAttributes("hoge1", 1)]
		hoge1,

		[HogeAttributes("hoge2", 2)]
		hoge2,
	}

	[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
	public sealed class HogeAttributes : System.Attribute
	{
		public readonly int id;
		public readonly string label;

		public HogeAttributes(string label, int id)
		{
			this.label = label;
			this.id = id;
		}
	}

	// enum拡張
	public static HogeAttributes GetData(this State id)
	{
		return CustomEnumAttributes<State, HogeAttributes>.dic[id];
	}
}
```

## 使い方

```csharp
public class SomeHogeUsage {
	public void UseHoge() {
		var data = Hoge.State.hoge1.GetData().label;
		Debug.Log (data);
	}
}
```
「-bash: rspec: コマンドが見つかりません」だと！？

いつもrspecのテストを行うときには「速い」って聞いてたから何も考えずにこんな感じでした

```
$spring rspec spec/xxxx/xxxxx.rb
```

でspringを外して実行してみたところ・・・

```
$rspec spec/xxxx/xxxxx.rb
-bash: rspec: コマンドが見つかりません
```

マジか！？
なんで動いてくれないのさ

教えてもらったところbundle execが必要なそうな

```
$bundle exec rspec spec/xxxx/xxxxx.rb
```

動いた

bundle exec のありなしの違いはなんだろ？って思ったら親切なサイトが
[bundle execの意味知ってる？](http://qiita.com/shunsuke227ono/items/dbc7c3428bc0ac01e9ac)
うむ。常識レベルかｗ

自分の環境では共通のところにはrspecはインストールされていなくて、
プロジェクト単位ではインストールされている状態だったみたい。

```
# 共通のところにインストールされているかチェック(入っていない場合)
$ whereis spec
spec:
```

入ってたらどう表示されるんかな
ATOMでながら作業が捗るパッケージ紹介

Atomはelectronを使ったエディタであるからして、パッケージで様々なことが可能だ。
本稿では、ながら作業に焦点を当てたパッケージを紹介する。

## video-player

[video-player](https://atom.io/packages/video-player)

もしあなたが動画データをPC内に持っている or 持てるのなら、このパッケージで作業が捗るだろう。
タブ内で動画再生も可能だが、それよりも`Video Player: Play In Background`の機能が良い。
コードを書きつつ、背景で半透明の動画を流せるので、プラグインにスペースを取られることなく作業が可能になる。

`Video Player: Stop`の機能で動画は消せる。
瞬時にショートカットキーを繰り出せるように反復して練習しよう。

## youtube-pane

[youtube-pane](https://atom.io/packages/youtube-pane)

作業用の動画やBGMをYoutubeに限定していいなら、こちらが使いやすかった。
Youtubeモバイル版がそのままパネルとして出てくるので、操作はわかりやすい。
`Ctrl + Alt + Y`で表示をToggleできる。非表示でも再生は止まらない。
パネルの大きさに融通が利かないのが少し扱いづらいか。

## Browser Plus

[browser-plus](https://atom.io/packages/browser-plus)

特化していなくても、ブラウザ機能がそのまま入っていれば汎用的に使える？
その通り。Browser Plusならタブをブラウザに変えることができる。
タブがそのままブラウザになるので、サイズは自分で分割するなどして調節すればいい。
タブを開いていなければブラウザであることなんて遠目ではわからないはずだ。
（多分。タブタイトルは開いているWebのタイトルになるので、よく見るとわかる）

ちなみにAtomでFlashは再生できない。残念。


## その他調べてみたプラグイン

### Twitter

[elastic-twitter-stream](https://atom.io/packages/elastic-twitter-stream) というのがあるのだが、自前のAPIトークンを設定する必要がある上に、検索機能がメインなので「自分のTLを監視したい」を簡単に解決してくれるプラグインではなかった。
誰か作ってほしい。

### 音楽再生サポート

iTunesとの連携などあるのだが、音楽アプリはどこからでもアクセス可能なショートカット機能が豊富なものが多いので、あまり魅力には感じられなかった。

## Enjoy

エンジョイしすぎて起こる諸々の事故は自己責任で。
JAVA 自動的にclose();が呼び出されるtry-catch文

#tryの直後に丸かっこで囲まれた複数の文を記述することが可能
##開かれたファイルやデータベース接続などは、finallyブロックを記述しなくても自動的にclose()メソッドが呼び出される
■例

```java
import java.io.FileWriter;

public class Test04 {
	public static void main(String[] args) {
		try (FileWriter fw = new FileWriter("data.txt");) {
			fw.write("hello!");
		} catch (Exception e) {
			System.out.println("何らかの例外が発生しました");
		}
	}
}
```

■close();が呼び出されずに終了してしまう例

```java
import java.io.FileWriter;
import java.io.IOException;

public class Test05 {
	public static void main(String[] args) {
		try {
			FileWriter fw = new FileWriter("data.txt");
			fw.write("hello!");
			fw.close();

		} catch (IOException e) {
			System.out.println("書き込みが失敗しました");
			System.exit(1);
		} catch (NullPointerException e) {
			System.out.println("nullです");
			System.exit(2);
		}
	}
}
```
エンジニアくずれが１晩でパワポでサイトデザインして中小企業の社長さまから99％一発OKをもらう流れ

エンジニアくずれが１晩でパワポでサイトTOPデザインして、中小企業の社長さまから99％の確率で一発OKをもらうためのノウハウをまとめます。あくまでweb担当者がいない中小企業社長さまに一発OKをもらいたいとき向けです。
**オリジナリティあふれる斬新なデザインの対局に位置する話です。**


#１．準備

##フォントはしっかり揃える

日本語は、新ゴ系（買う）＆小塚系（Adobe製品付属）が必須。
英語は、フリーのフォントをいっぱい揃える。
プロっぽいフォントを使えば、それだけで仕上がり感が違います。
（自分は日本語フォント300、英語フォント600いれてます。使うのは一部ですが）


#２．素材探し（1,2時間）

##参照サイトを決める

多くの中小企業の社長さまがお求めなのは、オリジナリティではなく「あの有名企業のような立派感」だと思います。なので、いまある立派なサイトをしっかりリサーチします。

「高級感」「明るい感じ」「あのサイトがすき」というお客さんの言葉を頼りに、なるべく全然違う業界からイメージに近いデザインコンセプトのサイトを探す。初見で「はっ」とするサイトがみつかるまでがんばる。


参照するのは下記
・カラーパターン（カラーピッカーで完全にまねると印象が違う。黒と思っても微妙に違かったりする）
・フォント種類（ゴシックか明朝か筆記体かくらいの大まかさで）＆サイズ
・おおまかなレイアウト（メニュー配置、バナー配置など）


##使う写真素材選びは時間をかける

これで社長の第一印象のほとんどが決まる。時間をかける。

使う画像をgoogle画像検索で探しまくる。
次々に見ながら「はっ」とする画像が出るまでがんばる。

「○○　壁紙」とかで検索するとでかくてきれいなのがいっぱいみつかる。
（もちろん使用にあたってはちゃんと許可＆購入する）


#３．デザイン序盤（3～4時間）

##メッセージの優先順位を考える

お客さんがのせたい情報の重要度を、ＡＢＣの３ランクくらいに分類する。
で各ランクに応じて、フォント種類＆カラー、バナーサイズ＆カラーを考える。


##レイアウトする

最近のフラット＆シンプルデザインのサイトなんてパワポで十二分だと思ってます。
ツールはなんでもいいのでレイアウトします。ちなみに自分はpowerpoint2003を使ってます。最強です。


#４．デザイン佳境（2～3時間）

##デザイン要素を絞り込む

素人がやると、だいたいいろんな要素を、いろんな色＆サイズでデザインしてしまいがち。
こうなると、統一感がなくごちゃごちゃした印象だったり、メッセージの優先順位があいまいになったり、
「やっぱりこっちを強調して」と言われたときに、さてどれくらい目立たせようかと迷ってしまう。

なので、色数・文字サイズ・バナーサイズをぐっとしぼる。（スタイルをコピペする）
さきほどのメッセージの優先順位3段階を意識しながら。


##大胆に変えてみる

デザインが佳境になってくると、あんまりいじりたくなくなってくるが、これを大胆に変えてみる。フォントサイズを思いきって小さく（大きく）したり、凝った要素部分を思いきってはずしてみたりする。
これでデザインが極大（local max）に陥ってないかを検証できる。
検証できてるとお客さんのデザイン反論に速やかに再反論できる「やってはみたんですけどこっちがよかったです」。


#５．デザイン提案直前（1時間）

##一晩おく

一晩おいて、翌日の初見で、なんか気になるところが出てくる。そこを微修正する。

こんな考え方でデザインしたのが下記です。なんとか一発OKいただけました。
![2015-11-13_17h18_46.png](https://qiita-image-store.s3.amazonaws.com/0/72794/f962f759-2dfa-8b9c-610c-08efe4b98631.png)