OmniAICreator/Qiita-1.07M huggingface dataset:
Unity Dev: play a movie on the iPhone | Handheld.PlayFullScreenMovie issue

#Sadness

> Movie Textures are not supported on iOS. Instead, full-screen streaming playback is provided using Handheld.PlayFullScreenMovie. 
http://docs.unity3d.com/Manual/class-MovieTexture.html

Anyway, I solved how to code for playing a movie on the iPhone.

- you could add a component to any object in a scene. In my case, I just added a C# script component(movieplayer) to the Main Camera.
- <img width="280" alt="Screen Shot 2015-11-26 at 20.10.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/53282/308ee639-4b2e-9b8e-4758-48a90cee7a64.png">
- Also, you need to add a movie in the "StreamingAssets" folder in the "Assets" folder as seen in the image below.
- <img width="377" alt="Screen Shot 2015-11-26 at 20.10.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/53282/9d27d81d-9384-c839-ed8b-17d6cf957a69.png">
- Finally, you code like this.

```
using UnityEngine;
using System.Collections;

public class movieplayer : MonoBehaviour {

	// Use this for initialization
	void Start () {
		Handheld.PlayFullScreenMovie ("file://" + Application.streamingAssetsPath + "/"+"EasyMovieTexture.mp4");
		Debug.Log (Application.streamingAssetsPath);
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}
```

- That's all you need to do before build your iOS app. The sad thing is, however, you cannot make sure whether or not the code works fine unless you actually deploy the app on the iPhone. In the emulator you would see nothing.
- <img width="1552" alt="Screen Shot 2015-11-26 at 20.20.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/53282/326f04fb-edd2-1eb1-27aa-70e10e2d522c.png">
MySQLのvarchar

5.3.3 non-NULL Variable-Length Array
non-NULL Variable-Length Array是记录体中非空变长字段的实际长度数组，并标识该字段是否行外存储。由于NULL字段在Compact格式中长度必为0，并且可以在Nullable Bitmap中判断，因此不用存储。变长字段包括varchar、varbinary、text和blob等，如表t1的变长字段包括c2、c4、c5、c7和c8，若这些字段在记录上不是null，那么会使用1~2字节来保存其实际长度。

另外，当记录的总长度超过页面大小的一半（一般为8000字节左右），记录就需要挑选几个最大的变长字段实施行外存储，直到行内记录总长度小于8000字节。值得注意的是，不仅仅是blob或text字段会导致行外存储，varchar和varbinary字段同样会发生。

因此，非null变长字段长度的意义为：

1. 若行外存储

最高位（第15位）总是1，表示使用两字节表示长度
次高位（第14位）为1，表示行外存储
剩余14位（0~13）表示行内存储使用的长度，Compact行格式是768字节前缀+20字节行外指针。而Dynamic行格式仅包含20字节行外指针。行外字段真实长度记录在行外页中。
2. 若行内存储

若字段定义的最大长度小于等于255，用1个字节表示其长度。
若字段定义的最大长度大于255，但实际使用长度小于128，用1个字节表示其实际长度。
若字段定义的最大长度大于255，并且实际使用长度大于等于128或者若字段是大字段（blob、text等），用2字节表示其长度。
最高位（第15位）总是1
次高位（第14位）为0表示行内存储
剩余14位（0~13）表示真实长度。
NSArray, NSMutableArrayの要素にnilを入れたい


## はじめに

NSArrayでは要素nilは終端を意味するので、途中に追加することができない。
しかし、条件によってNULLなオブジェクトを要素にしたい場合はある。

Cだったら

```c
char *array[] = { "aaa", NULL, "bbb", NULL, "ccc"};
```

のようにしたい場合である。

## 解決方法
NULLを意味するするオブジェクトを返す```[NSNull null]```を使うとよい

例

```objc
@[@0, @1, [NSNull null], @3, @4]
```
というのをNSMutableArrayで動的に作りたい場合は


```objc
NSArray *someArray = @[@"hoge", @"fuga", [NSNull null], @"hogehoge", nil];

NSMutableArray *mutable = [NSMutableArray array];
for(int i = 0; i < 5; i++) {
  if( i != 2 ) {
    [mutable addObject:[NSNumber numberOfInt:i];
  } else {
    [mutable addObject:[NSNull null]];
  }
}
```

とすれば良い

追記

コメントで頂いた通り、nilと[NSNull null]は別物なので、nilと同じようには使えません。
[NSNull null]のオブジェクトにメソッドを呼ぶとクラッシュしてしまうので、
```if(obj != [NSNull null])```
のようなチェックが必要になります。
java DocumentBuilderのparse解析でハマったこと

javaでxmlを解析したいと思いまして、DocumentBuilderを使って以下のコードを書きました。
ネットでもよく見るコードなのですが、

// ドキュメントビルダーファクトリを生成
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
// ドキュメントビルダーを生成
DocumentBuilder builder = dbfactory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));

xmlのデータはxml.getBytes()で正常に取得できていたので、
後はdocを解析して対象のタグを抽出するだけなのですが、
試しに、docそのものを出力したところコンソールにnullとの記載が。 :scream: 

docに何も入っていないと勘違いしてしまい、builder.parseが正常に動作してないと疑ってしまいましたが、
実はdocの出力の仕方がまずかっただけで、正しくxmlをparseできていました。
Document docの後に、

Element root = doc.getDocumentElement();
NodeList list = root.getElementsByTagName("タグ名");
とすればxmlの解析情報が入っていました。

この事実にすぐに気がつけず無駄な時間を費やしてしまった。反省です。 :sweat_smile:
リモートリポジトリのブランチを削除した後にローカルで表示される追跡ブランチを削除する


リモートリポジトリのブランチを削除するには、空のブランチをpushすれば消える

http://blog.koogawa.com/entry/2014/03/08/121751

しかし、リモートのブランチを削除しても、それを追跡していたブランチはローカルに残る場合がある。
そのブランチは下記コマンドで削除可能

git branch -d -r origin/coolbranch


リモートブランチを削除した直後の状態

```lang:console1
merge2% git branch -a                                                                                                                                                        [~/work/server/coolservice 17:56]
* develop
  issue_16985
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/issue_16985
  remotes/origin/master
```

この状態からローカルに残ったリモート追跡ブランチissue_16985を削除

```lang:console2
merge2% git branch -d issue_16985                                                                                                                                            [~/work/server/coolservice 17:57]
Deleted branch issue_16985 (was 33650fb).
merge2% git branch -a                                                                                                                                                        [~/work/server/coolservice 17:57]
* develop
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/issue_16985
  remotes/origin/master
```

削除された。

```lang:console3
merge2% git branch -d -r origin/issue_16985                                                                                                                                  [~/work/server/coolservice 17:57]
Deleted remote branch origin/issue_16985 (was 33650fb).
merge2% git branch -a                                                                                                                                                        [~/work/server/coolservice 17:57]
* develop
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
merge2%   
```

参考
http://stackoverflow.com/questions/5094293/git-remote-branch-deleted-but-still-appears-in-branch-a
【AndroidStudio】パッケージ名を変更する方法 [6万View達成]

# AndroidStudioでAndroidのパッケージ名を変更する方法
プロジェクト開始時は適当なパッケージ名で、本番になったから変えたいということがあって、
ファイルだけをリファクタリングしたらソースが全部消えたりしてはまったのでメモ。
※やる場合は自己責任でお願いします。

## １．AndroidManifest.xmlを編集する
package名称をjp.co.abcに変更する

```xml:AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.co.abc">
```

## ２．build.gradleを編集する
applicationIdをjp.co.abcに変更する

```json:build.gradle

android {
    defaultConfig {
        applicationId "jp.co.abc"
    }
}
```
編集後、上部にSyncバーがでたら押して同期します。

## ３．物理構造の変更
AndroidStudioを終了する。
ソースフォルダをbackupしておいて、新しいフォルダ階層を作成する。
> [プロジェクト名]\app\src\main\java\jp\co\abc


## ４．ファイル一括置換
フォルダ配下のファイルの中のpackage宣言を秀丸でgrep一括置換する。

## ５．確認
AndroidStudioを起動する。
クリーンビルドしてからアプリが起動することを確認すれば完了です。
※クリーン後にAndroidStudioを再起動してから再ビルドすると、gradleがちゃんと動いてくれる気がします。
Git LFSのワークフローの草案


デザイナーとしてGit LFSをプロジェクトで使いたい。
雑ながらワークフローを考えてみた。ほぼ草案状態。運用を進めて問題があれば更新したいと思う次第。

## 想定状況

+ git入ってる
+ hubコマンド入っててgitコマンドをラップ済
+ git cloneしてある状態

上記のための作業はこの記事ではカットです。

## git-lfsのインストール
Homebrewでやりました。何でもいいと思います。

```
brew install git-lfs
```

ダウンロードの場合は[こちら](https://git-lfs.github.com/)

## 初期設定

プロジェクトのルートディレクトリでこれをやります。

```
git-lfs install
```
git-lfsにトラッキングさせる必要があります。

+ 拡張子でトラッキング(ファイル名でトラッキング)
+ ~~ディレクトリでトラッキング~~

ディレクトリでトラッキングできると思ってましたが、なんか上手くいかなかったので勘違いです(汗)
できるようになるとうれしいです。

```
$ git lfs track "*.psd"
```

拡張子は何を管理するのかで変更してください。
メッセージの通りにトラッキングされているか確認します。

```
$ git lfs track
Listing tracked paths
    *.psd (.gitattributes)
```

これで.gitattributesっていうファイルが出来てるんですけど、それはカレントディレクトリにできるので、プロジェクトルートでやるのがいいんだと思います。


## 運用
git使えない人に使えるようにしてもらうのに最低限知っておいてもらいたいことを考えました。

### 1. 自分のローカルをリモートの最新版に合わせる

```
git checkout develop
git pull
```

### 2. 自分の作業用ブランチを作成する

```
git checkout -b your-branch
```


### 3. 自分の作業内容をリモートに送る

```
git add .
git commit -m 'コミットメッセージ'
git push
```

そしてプルリク

```
git pull-request
```

自分の今のプロジェクトの都合上、タイトルのみのプルリクエストは好ましくないので、ここは呼び出されるエディタをその人が使いやすいものにしておく必要がある。Atom推奨しておけばいいかなと。

```
git config --global core.editor atom
```

GUIツールを使ってもらうのもひとつの手だと思います。けどこれくらいルーティンにできればあんまり多機能を意識させると逆に厄介なイメージもあるので迷いもの。

1から3を繰り返してもらうだけを想定しています。

-----

今後、どんな感じに運用されるかでもっと向上していけたらと思います。
コンフリクトとかの処理とか考えていないので、発生したら発生したときにどうすればいいか考えようかなと。

### 参考

[Git LFS 公式ページ](https://git-lfs.github.com/)
[Git LFSが1.0になってGitHubで使えるようになったので試してみた](http://qiita.com/kiida/items/0d51c43ac73f14f09f5a)
Android API Level 23からのNavigationViewのヘッダー取得方法

AndroidのビルドターゲットをAPIレベル23に上げ、DesignSupportLibraryもバージョンアップしたら、22以前まで取得できていたNavigationViewのヘッダーViewが取得できなくなっていたので、その時の対応の備忘録です。
ビルドターゲットはAPIレベル22から23にあげています。

## API Level 22以前

```java
View headerView = mNavigationView.findViewById(R.id.header_hoge);
```
普通にxmlのid指定で取得していました。

## API Level 23以降

```java
View headerView = mNavigationView.getHeaderView(0);
```
22以前のようにidでは取得できなくなっていました。
AndroidDesignSupportLibrary 23.1.1から方式が変わっているみたいです。
けど、[公式ドキュメント](http://developer.android.com/intl/ja/reference/android/support/design/widget/NavigationView.html)には対象のAPIが表記されていないのはなんでだろう・・・

## 参考
http://stackoverflow.com/questions/33199764/android-api-23-change-navigation-view-headerlayout-textview
ホスト名まめちしき

軽く備忘録を。
ホスト名の長さが長すぎるとtd-agentに怒られました。

```
STDERR: /opt/td-agent/embedded/lib/ruby/2.1.0/webrick/utils.rb:58:in `gethostname': File name too long - gethostname(3) (Errno::ENAMETOOLONG)
```

先輩がRFCによると、最初の.（ドット）までは64バイト制限、ドットつなげると256バイトまでいける、と教えてくれました。
http://homepage1.canvas.ne.jp/kabada/hostname/dns.html

ハイフンはOKだけどアンダースコアはホスト名では使えなかったりは前から良くあることで知ってたけど長さで怒られたのは初めてでした。

以上。
ajaxでphpに値を渡す

お世話になります。 

現在、郵便番号から住所を検索するというよくある機能を実装しているのですが、うまくいかなくて困っています。 

郵政省からダウンロードしたCSVを必要な情報にコンバートし、php側で検索する部分まではできたのですが、javascript&htmlのフォームで入力された郵便番号をphpにajaxで渡し、コールバックされた値をフォームに自動入力されるという部分ができなくて困っています。 

コンバートされたcsvから、検索するphpのコードを以下に示します 

$zipcodeにajaxで渡ってきた郵便番号を入れたいということです。 

どうぞ宜しくお願い致します。 

```
<?php
//郵便番号
$zipcode = '123-4567';
 
$dir = __DIR__ . '/zipcode';
 
$zipcode = mb_convert_kana($zipcode, 'a', 'utf-8');
$zipcode = str_replace(array('-','ー'),'', $zipcode);
 
$result = array();
 
$file = $dir . DIRECTORY_SEPARATOR . substr($zipcode, 0, 1) . '.csv';
if(file_exists($file)){
    $spl = new SplFileObject($file);
    while (!$spl->eof()) {
        $columns = $spl->fgetcsv();
        if(isset($columns[0]) && $columns[0] == $zipcode){
            $result = array($columns[1], $columns[2], $columns[3]);
            break;
        }
    }
}
 
if(!empty($result)){
    echo $result[0] . $result[1] . $result[2];
} else {
    echo 'Not Found';
}
```

追記

重大なマナー違反をしてしまい大変申し訳ありません。
回答を急ぐあまりマルチポストをしていました。
以下、teratallでの類似の質問です。

https://teratail.com/questions/21121
Java 2D 画面処理

Java2Dの画面処理を行いました。

処理内容

・縦線、横線、斜め線
・円
・楕円

![スクリーンショット 2015-11-26 18.14.45.png](https://qiita-image-store.s3.amazonaws.com/0/85551/b6a035a8-cbb8-5022-5d5f-23342dda9956.png)

コード

```
package J3D;

import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.geom.Line2D;
import java.awt.Color;

public class J3D extends JPanel{

    public static void main(String[] args){
    JFrame frame = new JFrame();

    J3D app = new J3D();
    frame.getContentPane().add(app);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(0, 0, 400, 400);
    frame.setTitle("あいうえお");
    frame.setVisible(true);
    Insets insets = frame.getInsets();
    frame.setSize(400 + insets.left + insets.right,
    		      400 + insets.top + insets.bottom);
  }

  public void paintComponent(Graphics g){
	Graphics2D g2 = (Graphics2D)g;
	
	int x = 1,y = 1;
	
	g2.draw(new Line2D.Double(200,0,200,400));
	g2.draw(new Line2D.Double(0,200,400,200));
	
	drawCircle(g2);
	drawEllipse(g2);
	for(int i = 0;i < 400; i++){
		g2.draw(new Line2D.Double(0 - (x * -i) ,400 - (y * i),200 - (x * -i),200 - (y * i)));
	}

    g.setColor(Color.blue);
   // g.drawString("Hello Java2D", 10, 50);
  }
  public void drawCircle(Graphics2D g2){
      double x , y , cx = 200, cy = 200, r = 100;
      for(int i = 0; i < 820; i++){
          x = r * Math.sin(i) + cx;
          y = r * Math.cos(i) + cy;
          g2.draw(new Line2D.Double(x, y, x + 0.1, y + 0.1));
      }
  }
  public void drawEllipse(Graphics2D g2){
      double x , y , cx = 200, cy = 200, r = 100;
      for(int i = 0; i < 820; i++){
          x = r * Math.sin(i) + cx;
          y = r * Math.cos(i) / 2 + cy;
          g2.draw(new Line2D.Double(x, y, x + 0.1, y + 0.1));
      }
  }
}
```

実行環境
・Mac version 10.10.2
・eclipse
Reduce disk size on Centos7


#proc
1) new disk (ebs/pd ...) & attach

2) fdisk

```bash:
lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
├─xvda1 202:1    0   1G  0 part /boot
├─xvda2 202:2    0   1G  0 part [SWAP]
└─xvda3 202:3    0   6G  0 part /
xvdf    202:80   0   8G  0 disk

fdisk /dev/xvdf
コマンド (m でヘルプ): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p
パーティション番号 (1-4, default 1):
最初 sector (2048-16777215, 初期値 2048):
初期値 2048 を使います
Last sector, +sectors or +size{K,M,G} (2048-16777215, 初期値 16777215):
初期値 16777215 を使います
Partition 1 of type Linux and of size 8 GiB is set

コマンド (m でヘルプ): p

Disk /dev/xvdf: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0xa9515700

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/xvdf1            2048    16777215     8387584   83  Linux

コマンド (m でヘルプ): a
Selected partition 1

コマンド (m でヘルプ): p

Disk /dev/xvdf: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0xa9515700

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/xvdf1   *        2048    16777215     8387584   83  Linux

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！
```

3) mount & copy data

```bash:
mkfs.xfs /dev/xvdf1

mount /mnt/new /dev/xvdf1

xfsdump -J - / | xfsrestore -J -p 60 - /mnt/new
# specific proc
xfsdump -J - /boot | xfsrestore -J -p 60 - /mnt/new/boot
```

4) edit fstab

```bash:
# get UUID
xfs_admin -u /dev/xvdf1
UUID = c864efba-c36d-4165-a4f0-723e4fdfbe4f

# edit fstab 
UUID=c864efba-c36d-4165-a4f0-723e4fdfbe4f       /       xfs     defaults        0 0

```
5) chroot

```bash:
mount -t proc proc ./proc
mount -t sysfs sys ./sys
mount --bind /dev ./dev
chroot .
```

6) install grub2

```bash:
grub2-mkconfig -o /boot/grub2/grub.cfg
grub2-install /dev/xvdf
```

7) unmount all

```bash:
umount ./dev
umount ./sys
umount ./proc
umount /mnt/new
```

8) set hdd label

```bash:
xfs_admin -L / /dev/xvdf1
```
ブロックチェーンって何？Ryan X. Charles氏のfullnode (alpha)を実行してみた

結論、ブロックチェーンは分からなかったし、ただ読み込んだlibraryのテストがmochaで走るだけだった。

しかしながら、例えばbitcoinの実装をするとしたら、カギの生成などについては、fullnode command promptが動くようになるので、ここで各ライブラリを叩いていく形で、模擬的に試験はできるっぽい。

しかしドキュメント不足でわからず…。

https://github.com/ryanxcharles/fullnode

````
$ git clone git@github.com:ryanxcharles/fullnode.git
$ cd fullnode
$ npm install
$ gulp
$ chmod 777 bin/testapp.js
$ ./bin/testapp.js
````

ここまでやれば http://localhost:3000/ で gulp-mocha による各ライブラリのテストが分回る様子を見れる。が、これはたぶんfullnode.jsの実体ではない。本来はこれ↓

````
$ chmod 777 bin/fullnode.js
$ ./bin/fullnode.js
fullnode>
````

しかし、どんなコマンドがあるのかわからない…。

`/build/` にも、コンパイルされたfullnode.js が出てくるが、index.htmlを開いても動かないので、謎。

ブロックチェーンがどういう実装となるのか疑問があったので、せっかくなので実行してみたが、よくわからなかった。どのレイヤーの話なのかさえもわからなかったので、今後を見守りたい。


### 補足

es6で書かれているので、gulpなどがsyntax errorになる。nodeが古いのが問題なので、`$ sudo n latest` して最新のnodeを入れると良い(require 4.0.0 over)
homebrew mysql バージョンを落とす

# 環境
Mac OS El Capitan 10.11.1

homebrewをインストール後、mysqlインストールした状態。

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

```
$ brew install mysql
```

このようにすると、mysql ver 5.7.9がインストールされる（記事を書いたときは)。これを5.6に変える。

＊El Capitan・Railsでmysqlを使うとうまくいかなかったのでmysqlのバージョンを下げようと思いました。

# mysqlのuninstall

```
$ brew uninstall mysql
```

ただし、```/usr/local/var/mysql/```は削除されない。
なぜなら、このフォルダの中にDBのデータが保存されているため。
データのbackupを取った後、このフォルダも削除。

```
# DBデータが消えるのでこのコマンドは何も考えず打っても責任は取りません。DBバックアップをとってから。
$ rm -rf /usr/local/var/mysql/
```

# mysql5.6のインストール

brewの検索

```
$ brew search mysql
```

```homebrew/versions/mysql56``` が見つかるので

```
$ brew install homebrew/versions/mysql56
```

でmysql5.6をインストール。

```
$ mysql --version
```

で5.6系であれば完了。

# mysqlを入れていなければ

はじめから、5.7系を入れないで5.6系を入れるなら下記コマンドだけ。

```
$ brew install homebrew/versions/mysql56
```

# おまけ

```
$ brew info homebrew/versions/mysql56
```
でmysql56のinfoが見れる。
デザインのフィードバックをくれるアプリ

<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-70453381-1', 'auto');
ga('send', 'pageview');

</script>
#『DesignTalks』
Webデザイン/UI/UXをフィードバックしてくれるアプリ

#勧めたい人
- モバイルアプリ開発に従事してる人
- UXチーム・グロースハックチームの方で簡単に施策の効果を確かめたい人

#概要
- UIに対するフィードバックやレビューを貰える&与えれる
    - モバイルアプリから簡単に該当箇所にコメントしたり、レビューを要求できる
- 音声で貰える＆与えれる
    - さくっと欲しい箇所を指定したり、コメントできる

#詳細
![DesignTalks.png](https://qiita-image-store.s3.amazonaws.com/0/77287/ef2f36cd-9fe6-9a11-8f47-df8d47f3f20f.png)


#参考
[100SHIKI - 世界のアイデアを日替わりで](http://www.100shiki.com/)
[DesignTalks](http://www.getdesigntalks.com/)
Raspberry Pi 2+Ubuntu 14.04+ROSでEV3動かしてみた


[ROSでレゴマインドストームEV3を動かしてみた - Qiita](http://qiita.com/mechamogera/items/504fcf57153086094ba2)をVirtualBoxからではなくてRaspberry Pi 2からやってみてできたので手順をメモしておく。
事前に[Raspberry Pi 2にUbuntu 14.04を入れてみた](http://qiita.com/mechamogera/items/2c21b125937b70a80aca)の手順でRaspberry Pi設定済み。

# やってみた手順

基本的に[ROSでレゴマインドストームEV3を動かしてみた - Qiita](http://qiita.com/mechamogera/items/504fcf57153086094ba2)の通り。
上記の手順とは違うことをしたところを以下に書いておく。

## ROSインストール

[システムをアップデートとROSのインストール](http://qiita.com/oh_rusty_nail/items/b19f474b0d88eecddc1e#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%A8ros%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)の手順でros-indigo-desktop-fullがなぜか入らなかったのでros-indigo-ros-baseを入れた。

```bash
$ sudo apt-get install ros-indigo-desktop-full
(略)
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 ros-indigo-desktop-full : Depends: ros-indigo-simulators but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

$ sudo apt-get install ros-indigo-simulators  
(略)
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 ros-indigo-simulators : Depends: ros-indigo-gazebo-ros-pkgs but it is not installable
E: Unable to correct problems, you have held broken packages.

$ sudo apt-get install ros-indigo-gazebo-ros-pkgs
(略)
Package ros-indigo-gazebo-ros-pkgs is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'ros-indigo-gazebo-ros-pkgs' has no installation candidate
```

## ros-indigo-navigationインストール

[VM側でmindstorms_ros環境構築](http://qiita.com/mechamogera/items/504fcf57153086094ba2#vm%E5%81%B4%E3%81%A7mindstorms_ros%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)の手順でapt-get install ros-indigo-navigationで失敗するが、[「Raspberry Pi 2にUbuntu 14.04を入れてみた」の「libegl1-mesa-devやlibgles2-mesa-devのインストールが失敗する場合」](http://qiita.com/mechamogera/items/2c21b125937b70a80aca#libegl1-mesa-dev%E3%82%84libgles2-mesa-dev%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%8C%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88)の手順で対応出来る。

## mindstorms_ros環境構築構築

[VM側でmindstorms_ros環境構築](http://qiita.com/mechamogera/items/504fcf57153086094ba2#vm%E5%81%B4%E3%81%A7mindstorms_ros%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)の手順でcatkin_makeした際にros-indigo-desktop-fullを入れていないせいか幾つかパッケージが不足してエラーとなったので、都度apt-get installで対応パッケージをインストールした。
たしか以下のパッケージ(抜け漏れあるかも)

* ros-indigo-nao-description
* ros-indigo-orocos-kdl
* ros-indigo-robot-state-publisher
* ros-indigo-tf-conversions
ぼくのvimperatorrc

これがあるからFirefoxが手放せません、のVimperator
https://addons.mozilla.org/ja/firefox/addon/vimperator/

<img width="771" alt="Screen Shot 2015-11-26 at 17.29.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/f4b4dc96-270f-c155-022a-afbb4ce441be.png">
vimperator使いにはおなじみのhintまみれなページ


説明や使い方は↓にお任せ
**今更Vimperator入門とvimperatorrc晒し**
http://qiita.com/highdrac/items/4f48fda72520ac3546f5



で、使っているvimperatorrc

```vim
" vim:set filetype=vim :
" メニューバー、ツールバーなどを表示
"set gui=mT

" beepのかわりに、visualbellをつかう。
set visualbell

" 選択文字列ののコピーを <C-c> に割り当て
map <C-c> Y

" j/k でのスクロール幅を 1行 から 3行 に変更
map j 3<C-e>
map k 3<C-y>

" Backspace に戻るを割り当て
map <BS> <A-Left>


" h/l にタブ切り替えを割り当て
map h <C-p>
map l <C-n>

"フレームの切り替え
map <C-l> ]f
map <C-h> [f


" 検索結果をハイライト
set hlsearch

inoremap <C-a> <Ins><C-a><Ins>

" ヒントをアルファベットにする
set hintchars=ifjklasdhguonmerwc

" タイトルを Vimperator から Firefox に変更
set titlestring=Firefox

" ヒントのフォントサイズを大きくする
hi Hint z-index:5000; font-family:Menlo; font-size:14px; color:white; background-color:red; border-color:ButtonShadow; border-width:0px; border-style:solid; padding:0px 2px 0px 2px; position:absolute;

" commandモードでIMEオフ
style! -name=commandline-ime chrome://* #liberator-commandline-command input {ime-mode: inactive;}

```

プラグインは入れないシンプル設計。
個人的にh/lでタブ切り替えが手放せません。こんな設定してる人見たことないけど。。

よかったらどうぞ。
NSString 比較系メソッド覚書

# お馴染みのメソッド

## 完全一致
```objc:NSString.h
- (BOOL)isEqualToString:(NSString *)aString;
- (NSComparisonResult)compare:(NSString *)string;
```
上記2つのメソッドは若干挙動が異なる。

>NSStringの文字列比較はisEqualToStringではなくてcompareメソッドがいいのか
http://iphone-dev.g.hatena.ne.jp/ktakayama/20130809/1376034733


## 前方一致
```objc:NSString.h
- (BOOL)hasPrefix:(NSString *)str;
```

## 後方一致
```objc:NSString.h
- (BOOL)hasSuffix:(NSString *)str;
```

# 比較的新しいメソッド

## 部分一致（大文字・小文字を区別する）
```objc:NSString.h
- (BOOL)containsString:(NSString *)str NS_AVAILABLE(10_10, 8_0);
```

従来の書き方

```objc
if ([stringA rangeOfString:stringB].location != NSNotFound) {
    NSLog(@“一致");
}
```

## 部分一致（大文字・小文字を区別しない）
```objc:NSString.h
- (BOOL)localizedCaseInsensitiveContainsString:(NSString *)str NS_AVAILABLE(10_10, 8_0);
```

従来の書き方

```objc
if ([stringA rangeOfString:stringB options:NSCaseInsensitiveSearch].location != NSNotFound) {
    NSLog(@“一致");
}
```

## 部分一致（正規化）
```objc:NSString.h
- (BOOL)localizedStandardContainsString:(NSString *)str NS_AVAILABLE(10_11, 9_0);
```
ロケールが考慮され、大文字・小文字や発音記号が正規化される。
以下の2例はいずれも一致となる。

```objc
if ([@"a" localizedStandardContainsString:@"á"]) {
    NSLog(@"一致");
}

if ([@"a" localizedStandardContainsString:@"A"]) {
    NSLog(@"一致");
}
```
Picasso が利用するメモリのサイズを変更する


Picasso が使用するのはデフォルトだと端末で使用できるメモリの 15% だが、メモリ圧迫？のせいか `java.lang.OutOfMemoryError` が多発するようになってしまったので 10% に変更してみた。

> **前提：**
> 
> Piccsso のバージョン：2.5.2
>
> 手元の Android アプリケーション
>
> - compileSdkVersion 22
> - minSdkVersion 15
> - targetSdkVersion 22
> - LargeHeap を有効にしている
>   - つまり `AndroidManifest.xml` で `android:largeHeap="true"` としている


まず Piacasso のソースの `Utils.java` を見ると、デフォルトの 15% というのは次のように計算している。

```java:Utils.java
// ..

static int calculateMemoryCacheSize(Context context) {
  ActivityManager am = getService(context, ACTIVITY_SERVICE);
  boolean largeHeap = (context.getApplicationInfo().flags & FLAG_LARGE_HEAP) != 0;
  int memoryClass = am.getMemoryClass();
  if (largeHeap && SDK_INT >= HONEYCOMB) {
    memoryClass = ActivityManagerHoneycomb.getLargeMemoryClass(am);
  }
  // Target ~15% of the available heap.
  return 1024 * 1024 * memoryClass / 7;
}

// ..
```

> 上記を見る限り、7 で割ってるので、厳密には 15% でなく 14.28% ぐらいだと思われる。

これを参考に、自分のアプリケーションに適用してみる。カスタム `Application` クラスの `onCreate()` で、

```java:MyApplication.java
// ..

@Override
public void onCreate() {
    super.onCreate();

    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    boolean largeHeap = (getApplicationInfo().flags & ApplicationInfo.FLAG_LARGE_HEAP) != 0;
    int memoryClass = am.getMemoryClass();
    if (largeHeap && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        memoryClass = am.getLargeMemoryClass();
    }
    int cacheSize = 1024 * 1024 * memoryClass / 10;
    Picasso picasso = new Picasso.Builder(this).memoryCache(new LruCache(cacheSize)).build();
    Picasso.setSingletonInstance(picasso);
}

// ..
```

以上。
SourceTree > 古いバージョンの取得になる > v0.9.2.3 > 管理者権限でログイン / Check for Updatesを実行する

```txt:動作環境
Windows 7pro
```

## 症状
SourceTreeを別PCにインストールしようとしている。

https://www.sourcetreeapp.com/download/
から取得できるファイルが SourceTreeSetup_0.9.2.3.exeとなる。

別のPCでセットアップ済みは v1.6.22.

v0.9.2.3をインストールしてから Check for Updatesを実行すると「アクセスが拒否されました」となる。

## 対処
「アクセスが拒否されました」のエラーは管理者権限でログインしていなかったためだった。

管理者権限でログインしなおしたら、Check for Updatesで v1.6.23が取得できるようになった。
Symfony2 の FormType と jQuery Validation Plugin の相性が悪い

```
$builder->add([
    'name' => 'hoge',
    'type' => 'choice',
    'dataType' => 'choice',
    'detail' => [
        'mapped' => false,
        'choices' => [1 => 'hoge', 2 => 'fuga', 3 => 'hage'],
        'empty_value' => '---',
        'empty_data' => null,
        'multiple' => false,
        'expanded' => false,
        'required' => true,
        'constraints' => [
            new NotBlank([
                'message'=>'『ほげ』は必須入力項目です。',
                'groups' => ['default']
            ])
        ]
    ]
)
```

ってやると

```
<select required="required">
    <option disabled="disabled">---</option>
    <option value="1">hoge</option>
    <option value="2">fuga</option>
    <option value="3">hage</option>
</select>
```
ってなるんですけどね

これだとなぜか　jquery validation　が動かない

デフォルトの disabled="disabled" を抜くと動く

buildFormでrequiredを抜くと disabled が設定されないので、後付けでrequiredをつけると両方動くけど非常にキモイ

だれかかっこいい解決方法をおしえてください
Arduino-IRremoteにおける赤外線送受信の注意

Arduino-IRremote( https://github.com/z3t0/Arduino-IRremote )を利用して赤外線を送受信しようとしたとき、

```cpp:sample.ino
#include <IRremote.h> // 赤外線送受信用ヘッダファイル

int RECV_PIN = 6; // 赤外線受信モジュール
IRrecv irrecv(RECV_PIN); // 赤外線受信用オブジェクトの設定
decode_results results; // 赤外線受信結果を格納する
IRsend irsend; //赤外線送信用オブジェクトの設定

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // 受信を開始する
  irrecv.blink13(true); // 受信時にLEDの点灯を許可する
}

void loop() {
  /* 赤外線を受信したら値を返す */
  if (irrecv.decode(&results)) {
    if (results.decode_type == SONY) {
      if (results.value == 0x3E8) {
        Serial.println("Code 1000");
      }
    } else if (results.decode_type == UNKNOWN) {
      Serial.println("There is an error.");
      irsend.sendSony(0x7D0, 32);
    }
    irrecv.resume(); // 受信機をリセットする
  }
}
```

のように記述するかと思いますが、このとき一度赤外線を送信すると赤外線の受信が停止してしまうんですよね。<br>
どうやら赤外線受信フラグがリセットされてしまうようで、以下のようにすると上手くいきました。

```cpp:sample.ino
void loop() {
  /* 赤外線を受信したら値を返す */
  if (irrecv.decode(&results)) {
    if (results.decode_type == SONY) {
      if (results.value == 0x3E8) {
        Serial.println("Code 1000");
      }
    } else if (results.decode_type == UNKNOWN) {
      Serial.println("There is an error.");
      irsend.sendSony(0x7D0, 32);
      irrecv.enableIRIn(); // 受信を開始する
      irrecv.blink13(true); // 受信時にLEDの点灯を許可する
    }
    irrecv.resume(); // 受信機をリセットする
  }
}
```

参考になれば幸いです。
Android開発してたらNoClassDefFoundErrorでハマった

Android開発しててクラッシュレポートを入れようとTwitterのCrashAnalyticsをいれたら```java.lang.NoClassDefFoundError```でロリポップ以降は問題なかったが、Andorid4.x落ちてはまったのでその時の解決メモ

## 原因
apkに含められるメソッドの総数は65,535が上限にひかかった

ちなみにLolipop以降は65k問題対策されてて問題ないらしい。

## 解決方法

####gradle側の変更

```gradle
    defaultConfig {
        applicationId "xx.xx.xxx"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0.00"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true <-- ここ追加
       ・
       ・
       ・
    dependencies {
        compile 'com.android.support:multidex:1.0.0'
    }
```

## Applicationクラス

Applicationクラスに```MultiDexApplication```を継承させる


たぶんこれでOK
メモ : Mac でファイル(の拡張子)を再帰的に一括変換する

カレントフォルダ以下のファイル(及び、その拡張子)を一括変換したい人向けのメモ

#1) brewでrenameを入れる。
Linuxのrenameとは別物らしいが、brewでrenameが入るとのこと。

```
$ brew install rename
$ rename -h
Usage:
    rename [switches|transforms] [files]

    Switches:
(いろいろあるが略)
    -s/--subst *from* *to*
    -S/--subst-all *from* *to*
    -x/--remove-extension
    -X/--keep-extension
    -z/--sanitize
    --camelcase --urlesc --nows --rews --noctrl --nometa --trim (see manual)
```

要するにAliceをBobに置換する場合、
> rename -s Alice Bob

とする。

#2) カレントフォルダ以下のファイルを一括変換

例、カレントフォルダ以下のファイルの拡張子.ktを.kt_に一括リネームしたい場合:

##①　カレントフォルダ以下のファイルを一覧。
> find . -name \*.kt

##②　問題なければ、一括rename。
> find . -name \*.kt | xargs rename -s .kt .kt_

おしまい。

## 誰得?

例、クロスプラットフォーム開発で共通モジュールを移植する時など、特定フォルダ以下のコードをコンパイラに当座触ってほしくないファイルがた〜くさんある人など*(...ただいま、KotlinでAndroid/iOSクロスプラットフォーム開発にトライアル中...)*

...すみません、事実上、こちらの記事のパクリですね。。
http://qiita.com/shuhei/items/cf1ddf373d1f83d5d667
jqインストールワンライナー


```shell-session
U=https://github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz;D=$HOME/$(basename $U|cut -d. -f1,2);(mkdir -p $D&&cd $D&&curl -s -L $U|tar xzv --strip=1 -C .&&./configure --disable-maintainer-mode&&make&&sudo make install)
```
docker pauseコマンド

##| はじめに

ここでは[公式リファレンス](http://docs.docker.com/v1.7/docker/reference/commandline/pause/)を参考に説明しています。
ただ、バージョンや環境等により若干挙動が異なるかもしれませんが、その点についてはご容赦ください。
また、その他のdockerサブコマンドについては[こちら](http://qiita.com/kooohei/items/8acb82c6c0bf00bfb9bb)に記載していますので、もしよければ参考にしていただければと思います。

##| 使い方

起動しているコンテナを一時停止させます。

```:使い方
使い方： docker pause CONTAINER [CONTAINER...]
```

CONTAINERに入る値は"CONTAINER ID"または"NAMES"のどちらを指定しても良く、連続して指定することで同時に複数のコンテナを一時停止にできます。

まずは現在のコンテナ情報を確認してみます。

```bash:コンテナ情報確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3bf2eb952ea0        ubuntu              "/bin/bash"         37 seconds ago      Up 37 seconds                           hopeful_brown
```

STATUSはUPとなっているのが確認できます。
それでは一時停止してみましょう。

```bash:一時停止
$ docker pause hopeful_brown
hopeful_brown

または

$ docker pause 3bf2eb952ea0
3bf2eb952ea0
```

再度、コンテナ情報を確認します。

```bash:コンテナ情報確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
3bf2eb952ea0        ubuntu              "/bin/bash"         55 seconds ago      Up 55 seconds (Paused)                       hopeful_brown
```

STATUSのところに(Paused)が付いて一時停止しているのがわかります。

この一時停止中のコンテナは[unpause](http://qiita.com/kooohei/items/d6d9106ee1ca147d83fc)サブコマンドで解除ができます。

pause中はコンテナが一時停止中のため、attachができなくなります。
また、別のターミナルでattachしていた場合は、画面操作ができなくなり、
解除するには、"control + p q"で一旦コンテナから抜けてあげる必要がありあます。

以上です。
Webサービスで Mac OS X の launchd (plist) を作成してワンライナーでインストールする

#### 1.サイトにアクセスする
[ZeroWidth’s Launched online service](http://launched.zerowidth.com/)

#### 2.Web画面上で plist の内容を入力する。
![Launched.png](https://qiita-image-store.s3.amazonaws.com/0/41095/87ecd653-b465-3c3c-b3cd-77fd04c9e731.png)

* **Name**　plists の名称を入力する
* **Command**　実行コマンドを入力する
* **Schedule**　任意
* **Extras**　任意

#### 3. 最下段の **Create .plist** ボタンを押す。

#### 4. plistの生成画面に遷移する。
![Launched2.png](https://qiita-image-store.s3.amazonaws.com/0/41095/5e1d2e28-f551-6763-2aab-4b0e8a42ca74.png)

#### 5. 好きな方法でインストールする。
* **Install**　ワンライナーのクイックインストール
* **Manual Install**　マニュアルインストール

#### 6. 参考
[launchd(8)の使い方](http://qiita.com/archinwater/items/4c2e9174e4898a197de6)
[Mac（OS X）ではcronじゃなくてlaunchdでやる](http://furudate.hatenablog.com/entry/2014/11/09/155017)

以上
【質問】【Spring MVC】【Spring Security】Spring Securityの開発方法について

現在、Spring MVCを使った開発をしています。

色々とサイトを探していますが、設定方法、コーディング方法共に分からない状態です。
今回は、Spring Rooなどのツールは使わないです。

環境設定、開発方法についてご教示ください。
サンプルコードや参考サイトの情報でもかまいません。

よろしくお願いいたします。

＜環境＞
OS…Windows 7 Professional
開発環境・・・STS3.4.0
hibernate・・・4.2.1.Final
spring-data-jpa・・・1.3.4.RELEASE
HSQLDB・・・2.2.9
データベースの正規形

昔やったことのおさらい。
参考文献として http://www.amazon.co.jp/dp/4785620463 この本を見つつ、ネットで検索しつつ。


記号の意味

* X → A：属性集合Xが決まれば属性集合Aが決まる(関数従属)
* X ⊆ RS: XはRSの部分集合
* X ⊂ RS: XはRSの真部分集合 (X ⊆ RS かつ X ≠ RS)
* A ∈ RS: AはRSの要素


* {}: 集合
* __属性__ (強調文字): 主キー


単語の意味

* 属性: DBのカラム
* 超キー: 行を特定できる属性の集合。例えば {メールアドレス, 氏名} のペアもあり。氏名は冗長なので省いたものが候補キー(またはキー)。そこから扱いやすいものを主キーとして選ぶ。
* 素属性: 候補キーの構成要素となる属性

※ 本に合わせて日本語とカタカナ


# 第三正規形

* RDBの更新不整合を解消するための指針は、すべてのリレーションスキーマを第三正規形とすることである。
* リレーションスキーマRSが第三正規形であるとは、関数従属性 X → A (X ⊆ RS, A ∈ RS, A ∉ X) が成り立つ場合に以下の条件のいずれかが常に満たされる場合
    1. X が RS の超キー
    2. A が素属性

営業 {__商品番号__, __顧客番号__, 社員番号, 販売価格} というリレーションスキーマRSがあったとき、「{顧客番号} → 社員番号」という関数従属性Fが存在すれば、RSは第三正規形ではない。
候補キーは {商品番号, 顧客番号} であり、Fは上記1, 2のどちらも満たさない。
({顧客番号}は超キーではない、社員番号は候補キーの構成要素ではない)


これは {__商品番号__, __顧客番号__, 販売価格}, {__顧客番号__, 社員番号} に分解することで第三正規形となる。


蛇足：{__メールアドレス__, 氏名, 携帯番号} というスキーマは「携帯番号 → __氏名__」という関数従属性も考えられるが、携帯番号も実は主キーになり得る(候補キー)ので第三正規形の条件を満たす。


# ボイス・コッド正規形

* 第三正規形の条件2を省いたもの。

営業 {__商品番号__, __顧客企業番号__, 顧客担当者番号, 販売価格} というスキーマRSがあり、「顧客担当者番号 → __顧客企業番号__」の関数従属性があるとき、RSは第三正規形の条件を満たすがボイス・コッド正規形の条件は満たさない。

これを主キーを維持したまま分解すると {__商品番号__, __顧客企業番号__, 販売価格}, {__顧客担当者番号__, 顧客企業番号} になるが、結合できない。

主キーを変更して {__商品番号__, __顧客担当者番号__, 販売価格}, {__顧客担当者番号__, 顧客企業番号} にするとボイス・コッド正規形の条件を満たす。
ただし、「{__商品番号__, __顧客企業番号__} → 販売価格」が「{__商品番号__, __顧客担当者番号__} → 販売価格」に変更されているので、元々商品と企業が決まれば価格が決まっていたものが、同一企業でも担当者ごとに異なる価格が追加できるようになってしまった。(従属性保存分解ではない。)

蛇足：こういった制約をデータベースに持たせるのかアプリケーションで実装するのかは、ケースバーケース、らしい。


# さらに正規化

[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%AD%A3%E8%A6%8F%E5%8C%96)や[@IT](http://www.atmarkit.co.jp/ait/articles/0605/11/news124_4.html)が分かりやすい。


## 多値従属性

数式は非常に長いのでざっくり言うと、X が 決まれば Yの集合が決まるとき 多値従属性 X →→ Y が成り立つという。
関数従属性は多値従属性の特殊な場合。


## 第四正規形

* 多値従属性 X →→ Y (XY ⊂ RS, Y ⊄ X) が成り立つ場合は、常にXがRSの超キーである場合

プロジェクト {__プロジェクト番号__, __社員番号__, __ミーティング日__} のスキーマRSがあるとき、RSはボイス・コッド正規形ではあるが第四正規形ではない。(「プロジェクト番号 →→ 社員番号」「プロジェクト番号 →→ ミーティング日」は成立するが {プロジェクト番号} は超キーではない。)

分解して {__プロジェクト番号__, __社員番号__}, {__プロジェクト番号__, __ミーティング日__} にすると第四正規形を満たす。


## 結合従属性

ざっくり言うと、リレーションRSとその分解 {RS1, RS2, ..., RSn} があるとき、{RS1, RS2, ..., RSn} の自然結合(natural join) とRSが等しい場合に、RSは結合従属性　*(RS1, RS2, ..., RSn) が成り立つという。


## 第五正規形

* RSの分解{RS1, ..., RSn}において自明でない結合従属性 *(RS1, ..., RSn) が成り立つ場合には常にRSn(1 <= i <= n)がRSの超キーである場合

部品提供 {__工場番号__, __部品番号__, __業者番号__} のスキーマRSがあり

* 「工場 対 部品」「工場 対 業者」「部品 対 業者」はN対N
* 工場fが必要とする部品pはfと契約のある業者のうちでpを提供可能な業者すべてから供給を受ける

という条件がある。
この場合、RSに多値従属性は存在しないので第四正規形は満たす。しかし「工場fが必要な部品群を決めたが業者は未定」などの場合に挿入不整合を起こす。
結合従属性に基づき {__工場番号__, __部品番号__}, {__工場番号__, __業者番号__}, {__部品番号__, __業者番号__} に分解すると第五正規形を満たし、不整合も解消される。


# 雑感

第四正規形以降に数式が多すぎてちょっと力尽きたので雑になっている。
本のまとめの章にはこう書いてある。

> 一般には従属性に基づく整合性制約を保存した分解が可能なのは第三正規形までであり、それ以上の分解を行った場合には更新不整合を排除できる度合いは高まるものの、従属性を担保することができない。

つまり、データ追加更新削除時の整合性を重視するのか、Aが決まればBが決まるというビジネスルールを重視するかで正規化の度合いが変わり、それは状況によって選ばなければならない。ということ。
Atomに本当のAutoSave機能をつける

Atomでは標準でAutoSaveパッケージが添付されているのだけど、動くタイミングがバッファの切替タイミング等だけなので個人的にはちょっとイマイチ。

ということで、実装してみた。

パッケージとして作っても良かったのだが、まずは簡単に `init.coffee` に追加する感じで。
需要が多そうだったり、あるファイルは除くとかの指定が欲しくなったらパッケージとして作るかも知れない。

```init.coffee
saveTimer = {}
atom.workspace.observeTextEditors (e) =>
  e.onDidStopChanging () =>

    return unless e.getPath()?

    unless saveTimer[e.getPath()]?
      saveTimer[e.getPath()] = 0

    else
      if saveTimer[e.getPath()] is 0
        
        saveTimer[e.getPath()] = setTimeout () =>
          e.save()
          saveTimer[e.getPath()] = 0
        , 1000 # wait msec
```

最後の行の `1000` を変えることで、更新の頻度を変えることができるけど、問題がなければ短いほうが良いと思う。
でも、1秒だと `onDidStopChanging` のほうが長いので、実はほとんど意味がなかったりもする。

AutoSaveには色々な考えがあるけど、僕は「[Emacsでファイルの自動保存 (auto-save-buffers)](http://0xcc.net/misc/auto-save/)」に賛同派。



> しかし、auto-save-buffers はたいへん便利であると主張しても、 大方の人は「今のままでいいや」 「まちがって修正してしまったのが、勝手に保存されるほうが嫌」 などと理由を挙げて、なかなか納得してくれない。 Emacsのマニュアル を見ても、同じようなことが書かれている。

>> 自動セーブは通常は読み込んだファイル名でのセーブは行ないませ ん．これは予定の半分しか変更していないような中途半端なプログ ラムをセーブするのは望ましくないからです．その代わり，自動セー ブは自動セーブファイルと呼ばれる別のファイルに行なわれ，読み 込んだファイルは，陽にセーブした(C-x C-sなどで)場合のみ変更 されます．

>この考え方は CVS などのバージョン管理システムが広く使われる ようになった現在では古くなっていると思う。きりのいいところで ファイルに保存するのではなく、きりのいいところでバージョン管 理システムに保存すればいい。


ところで、起動時のオーバーヘッドとかも考えて `init.coffee` に記述するスタイルにしてみたのだけど、間違ってないよね？
git memo

#git コマンド

## proxyを通す場合
```bash:terminal
$ git config --global http.proxy <プロキシサーバのアドレス>:<プロキシサーバのポート番号>
```

と書くが、うっかり間違えて手で修正することに。
※同じコマンド打っても上書きはしてくれない

```shell-session:terminal
 # vi ~/.gitconfig
```
MITライセンスってなにそれおいしいの？って感じなのでメモ((φ(･д･｡)


MITライセンスについて調べる必要があったのでメモ。
今まで、僕はライセンスに関してなにも使てもこなかったばちが当たりました。
というわけで、MITライセンスについてまとめようとおもいます。

##MITライセンスとは
| 概要(Wikipedia) |
|:--|
| MITLicense（エム・アイ・ティー ライセンス）は、マサチューセッツ工科大学を起源とする代表的なソフトウェアライセンスである。X11 LicenseまたはX Licenseと表記されることもある。MIT LicenseはGPLなどとは異なり、コピーレフトではなく、オープンソースであるかないかに関わらず再利用を認めている。BSDライセンスをベースに作成されたBSDスタイルのライセンスの一つである。MIT Licenseは、数あるライセンスの中で非常に制限の緩いライセンスと言える。  |

ゆるゆるライセンスですね。
Wikiの要約↓

| 要約 |
|:--|
|1. このソフトウェアを誰でも無償で無制限に扱って良い。ただし、著作権表示および本許諾表示をソフトウェアのすべての複製または重要な部分に記載しなければならない。
2. 作者または著作権者は、ソフトウェアに関してなんら責任を負わない。|

つまりこういうこと？

- 自由に使っていいよ！（なにしても自由）
- 本許諾表示は絶対書いてね！
- 元の作成者は関知しません。

↓
作った俺はこいつを公開してやる代わりに、本許諾表示をかけよ。あ、あと、作った結果なにがあっても、俺は知らんのでよろしく。

ってことだよね？

##本許諾表示ってなにそれおいしいの
本許諾表示ってなんぞ？
↓
そのライセンスが公開されているサイト、またはそのパッケージ内に`LICENSE.txt`たるファイルが公開されていると思いますので、そいつです。
その中身をコピーして、その機能を利用しているソースコードにコピーでOKです。

```LICENSE.txt
Copyright (c) <year> <copyright holders>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```

とまあ今回はこれくらい。
Symfony1.4 (PHP5.5) Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in 

##symfony やったことないよ
いまさらなぜ symfony1かというと既存のソースが 1.4.xだから X(

##まずは、ここを読んでみる
[1.4 チュートリアル Jobeet 日本語](http://symfony.com/legacy/doc/jobeet/1_4/ja/01?orm=Doctrine)

frontend_dev.php を表示してみると　Σ(・_・)
![sf1.jpg](https://qiita-image-store.s3.amazonaws.com/0/71525/310f501b-bcf2-c93f-60d1-e45e73b19915.jpeg)

##原因 PHP5.5.0から preg_replaceの /e 修飾子が非推奨になりました。
[preg_replace 変更履歴](http://php.net/manual/ja/function.preg-replace.php)

##対応情報1
[Symfony 1.4 deprecated /e modifier](http://blog.jakoubek.cz/symfony-1-4-deprecated-e-modifier)

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in lib/vendor/symfony/…This changelog will solve the problem for all symfony 1.4.x. Tested on Symfony 1.4.20

 lib/vendor/symfony/lib/command/sfCommandManager.class.php     |  4 +++-
 lib/vendor/symfony/lib/form/addon/sfFormObject.class.php      |  2 +-
 lib/vendor/symfony/plugins/sfDoctrinePlugin/lib/form/sfFormFilterDoctrine.class.php  |  2 +-
 lib/vendor/symfony/plugins/sfPropelPlugin/lib/form/sfFormFilterPropel.class.php      |  2 +-
 lib/vendor/symfony/lib/response/sfWebResponse.class.php       |  2 +-
 lib/vendor/symfony/lib/util/sfInflector.class.php             |  5 +----
 lib/vendor/symfony/lib/util/sfToolkit.class.php               | 11 +++++++++++
 7 files changed, 19 insertions(+), 9 deletions(-)

##対応情報2
[preg_replace() the /e modifier is deprecated](https://github.com/LExpress/symfony1/issues/77)

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in ----\lib\vendor\symfony\lib\util\sfToolkit.class.php on line 362

Replace:
`return preg_replace(array_keys($replacePairs), array_values($replacePairs), $search);`
With:
`return strtr($search, $replacePairs);`
java 点での描画

点での描画を今回しました。画像では点ですが、drawLineを使って点を描画しています。
<img width="377" alt="スクリーンショット 2015-11-26 14.48.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/85552/9bf409cb-e35a-b4a6-9abf-ba695d2ece30.png">

下はコードです。

```java:Graphics2DTest1.java
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Insets;

public class Graphics2DTest1 extends JPanel{
	int x = 1;
	int y = 400;
	
	int r = 100;
	int cx, cy;
	
	
	int movex;
	int movey;

  public static void main(String[] args){
    JFrame frame = new JFrame();

    Graphics2DTest1 app = new Graphics2DTest1();
    frame.getContentPane().add(app);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(0, 0, 400, 400);
    frame.setTitle("タイトル");
    frame.setVisible(true);
    Insets insets = frame.getInsets();
    frame.setSize(400 + insets.left + insets.right, 400 + insets.top + insets.bottom);
  }

  public void paintComponent(Graphics g){
	 g.drawLine(0,200,400,200);
	 g.drawLine(200,0,200,400);
	 array(g);
	 Circle(g);
	 oval(g);
  }
  
  public void array(Graphics g){
	  for(int i = 0; i <= 400; i++){
		  g.drawLine(x + i ,y - i,x + i,y - i);
		  movex += 1;
		  movey -= 1;
	  }
   }
   
  
  public void Circle(Graphics g){
	  for(int i = 0; i < 360; i++){
		  cy = (int) (200 + Math.sin(i) * r);
		  cx = (int) (200 + Math.cos(i) * r);
		  g.drawLine(cx, cy, cx, cy);
	  }
  }
  
  public void oval(Graphics g){
	  for(int i = 0; i < 360; i++){
		  cy = (int) (200 + Math.sin(i) * r / 2);
		  cx = (int) (200 + Math.cos(i) * r);
		  g.drawLine(cx, cy, cx, cy);
	  }
  }
}
```
キャストをして、すべてint型で作っています。点のズレなどはそのせいです。

ターミナルで実行する場合は下のコマンドを打ってください。
$ javac Graphics2DTest1.java
$ java Graphics2DTest1

で実行可能です。
cfn-initを使う

清書はそのうちやる。

##cfn-initとは
この記事読むといいと思う
http://dev.classmethod.jp/cloud/aws/cfn-init/

##何に使う？
CloudFormationテンプレートのMetadataに書いた内容を読み込んで処理してくれる。
※MetadataないLogical_IDを指定すると怒られる

##例

	$ cfn-init -s STACK_NAME -r Logical_ID --region REGION
	
|Param|入れるプロパティ|
|:--|:--|
|STACK_NAME|CloudFormationのスタック名|
|Logical ID|テンプレートの名前|
|REGION|リージョン|

###Logical IDって？
こいつ
![CloudFormation_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/23936/475b2dfe-f915-f99a-6ce6-aed1beccbe91.png "CloudFormation_Management_Console.png")

JSONファイルだとここ
![anegawa-hvm_json_-__Users_dc_hideokamoto_develop_amimot-enterprise-cfn_-_Atom.png](https://qiita-image-store.s3.amazonaws.com/0/23936/c689dc73-7a92-9a1f-d815-c44b0bc85943.png "anegawa-hvm_json_-__Users_dc_hideokamoto_develop_amimot-enterprise-cfn_-_Atom.png")

###MetadataとかUserDataってどう書けばいいの？
今触ってるところだからちょい待ち
Circle CIの無料プランでBuildに行列ができ始めたら[ci skip]をうまく使うと幸せになれるかもしれない

# Circle CIの無料枠は1コンテナ = 1並列

Circle CIはご親切に1コンテナは無料で提供してくれるので最初は気持ちよく使えるのだが、徐々にプロジェクトが増えだすと、buildの行列が出来始める。
1コンテナを足すのに$50/月なので、そこまでいたくないけどお金のないベンチャーだと少しでもケチりたいところ。

料金体系はここが詳しい
http://qiita.com/minodisk/items/5151e780c56ecbc4d7ee

# [ci skip]をcommit messageに入れるとbuildが無視される
らしい
https://circleci.com/docs/skip-a-build

## 実際にやってみた
適当に差分作ってから、commit messageに[ci skip]をいれてみる。

```
$ git commit -am 'skip test [ci skip]'
```

## 結果
![スクリーンショット 2015-11-26 13.31.43.png](https://qiita-image-store.s3.amazonaws.com/0/62421/cb8a7188-cf65-64cd-8297-74f32aab3e3b.png "スクリーンショット 2015-11-26 13.31.43.png")

見事にスキップして次のbuildがRunningされた。

# 使いどころ
おそらく以下の様な場面で、有効なのではないかと思う。

- コメントのtypo fixの様などう考えても再buildしなくていいもの
- 画像など静的assetだけ入れた場合
- あらかじめbuildがこけると分かっている様な場合
- こまごまとpushしないといけない様な場合

### たとえば...
例えば、capistranoでdeployをする様な設定を書いている場合、サーバー側で特定のbranchをpullしてくる必要があるためトライ&エラーをしている場合でもリモートブランチに細かくpushする必要がある。その時に、うまく動くまでは[ci skip]でbuildをskipしておくとその他のプロジェクトに迷惑をかけないですんだりする。

# まとめ
うまく使えば結構効果を発揮するのではないかと思いました！
Gulpに安心して移行するためのGruntの忘れ書き9選

今更感はありますが、古いプロジェクトだとまだgruntを使っていることは多いと思います。
これだけを抑えておけばGruntはOKという点をまとめました。

## インストール

```js
npm install -g grunt-cli
```

* gruntをコマンドラインで実行するためのインタフェースのこと。
* grunt-cliがインストールされていないと、コマンドラインからgruntを実行することは出来ない。
* コマンドラインで`grunt`を実行すると実行階層のGruntFileと同階層にインストールされているgruntがそのバージョンで実行される
* これにより、同じマシンで複数のバージョンのgruntを実行することが出来る。

## wrapper関数

```js
module.exports = function(grunt) {
  // 全てのgruntのコードはこの中に書いていく
};
```

Gruntの処理を囲うための関数。全ての処理はこの中に記述していく。

## initConfig
* grunt.initConfigとはgrunt.config.initへのエイリアスであり、
grunt.config.initとは現在のプロジェクトのための設定オブジェクトの初期化する処理のこと。
* ここで初期化した設定を元にタスクが実行される。

## loadNpmTasks
* npmでインストールされたモジュールは`loadNpmTasks`でロードすることにより、初めてタスクとして利用することが出来る。

```js
grunt.loadNpmTasks('grunt-contrib-uglify');
```

* 上記の記述により`uglify`タスクをGruntFile内で利用することが出来る。
* 後述する`load-grunt-config`を利用するとこの記述は省略して自動ロードすることも可能。

## カスタムタスク
* npmモジュール以外に自身で設定できるタスクのこと。`grunt.registerTask`で設定できる。
* 例えば、grunt実行時にデフォルト実行するタスクは`default`としてカスタムタスクを登録する。

```js
// デフォルトタスクの指定
grunt.registerTask('default', ['uglify']);
```

* 上記のようにしておくと、grunt実行時にuglifyタスクが実行される。

## タスク実行時の動作の仕組み
* タスクを実行時にGruntはinitConfigで設定したオブジェクトで同じ名前のプロパティを探す。
* これにより、同じタスク内で複数の構成に応じた実行をすることも可能。
* 例えば、cssの連結処理を実行したい時は`grunt concat:css`のように実行する。
* 各タスクで実際に指定できるオプションはタスクのGithubページを参照する。

```js
grunt.initConfig({
  concat: {
    css: {
      // 連結(concat)タスク"css"ターゲットへのオプションとファイルをここに書く
    },
    js: {
     // 連結(concat)タスク"js"ターゲットへのオプションとファイルをここに書く
    }
  }
});
```

## テンプレート文字列
* `initConfig`内では他タスクの設定を`<% %>`でアクセスできる。
* <% pkg.name %>のように他の設定から参照可能。

## load-grunt-configの利用
* `load-grunt-config`を利用すると、肥大化しがちなinitConfigを分割することが出来る。
* 分割するファイルは/grunt配下に設置する
* 例えば、上記の`initConfig`の場合は/grunt/concat.jsとすることでconcatタスクの設定を自動的に読み込むことが出来る。
* load-grunt-configの具体的な使い方はGithubの公式サイトがわかりやすいです。

https://github.com/firstandthird/load-grunt-config

## タスクに対応するNPMモジュールを調べる
* タスクの詳細な挙動を確認する時は元のコードを読むのが一番。
* package.jsonにインストールするNPMモジュールが記載されているので、タスク名に近いモジュールを確認しGithubで確認すると応用が聞いていい感じ。
Docker で Oracle XEを動かしてHRスキーマを使えるようにする

学校でOracleの学習をしていたら使うかもしれないhrスキーマ。
自分のマシンにOracle突っ込んで動かしっぱなしにするのもなぁ…ってことで使う時だけDockerで動かしてしまえ。っていう奴です。

環境はUbuntu 14.04.3(LTS)デスクトップ版を想定してます。

dockerのインストール
-----------------

````
$ sudo apt install docker.io
$ sudo gpasswd -a ユーザー名 docker
````

ここまでやったら一度ログアウトする。(ターミナルの終了じゃ駄目)


oracle-xe-11gのインストール済イメージをpull
-----------------
````
$ docker pull wnameless/oracle-xe-11g
````

一旦起動。
-----------------

````
$ docker run -d -p 1521:1521 wnameless/oracle-xe-11g
````

hrスキーマを有効にする。
-----------------

`docker run`後すぐは起動処理が走っていてsqlplusで接続できないことがあるため、2〜3分(マシンの性能にもよるけど)が経ってから実行すること。

````
$ sqlplus system/oracle@localhost/xe
````

````
SQL> ALTER USER hr ACCOUNT UNLOCK;
SQL> ALTER USER hr IDENTIFIED BY hr;
SQL> exit;
````

外部ファイルにしておいて@で読みこんでもOK。

hrスキーマを有効にしたdockerイメージを保存
-----------------

````
$ docker ps -a
CONTAINER ID        IMAGE                            COMMAND                CREATED             STATUS                      PORTS                                      NAMES
29bf9c0d9861        wnameless/oracle-xe-11g:latest   "/bin/sh -c '/usr/sb   33 minutes ago      Up 33 minutes               22/tcp, 8080/tcp, 0.0.0.0:1521->1521/tcp   stupefied_perlman
````
の`CONTAINER ID`に書かれてる文字列(ここでは`29bf9c0d9861`)を次のコマンドに指定します。

````
$ docker commit 29bf9c0d9861 oracle-xe-11g-hr
````

実行後にきちんと保存されていることを確認する。

````
$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
oracle-xe-11g-hr          latest              6e2467bff3ad        7 minutes ago       3.537 GB
wnameless/oracle-xe-11g   latest              0803d64ebc69        5 months ago        2.241 GB
````

以降使用したい時は

````
$ docker run -d -p 1521:1521 oracle-xe-11g-hr
````

で起動すること。

コンテナの停止
-----------------

````
$ docker ps
````
して止めたいコンテナIDを確認して

````
$ docker stop コンテナID
````

で停止する。

hrスキーマへ接続
-----------------

こちらも起動してから接続可能になるまで時間がかかるのでしばらく待つこと。

````
$ sqlplus hr/hr@localhost
````

参考サイト
-----------------
* githubの [wnameless/docker-oracle-xe-11g](https://github.com/wnameless/docker-oracle-xe-11g)
* [
Oracle® Database Express Editionスタート・ガイド](https://docs.oracle.com/cd/E36055_01/admin.112/b66465/toc.htm)

あれ?
-----------------

Dockerfile作ればいいのでは?と思ったけどうまくいかなかったので(
VisualStudioでのデバッグ(32bit、64bit)メモ

# 32bit、64bit切り替え
WEBアプリ(.NET)開発時、32bit版VisualStudioでも、64bit版の開発は可能。
ただし、デバッグ時、32bit版の IIS Excpress では当然動作しない。この場合は 32bit で動作させる。

付随して、32bitと64bit で参照DLLが変わる場合、デバッグとリリースでDLLを切り替える必要がある。
ビルドモードの違いで参照DLLを自動に切り替える仕組みはないようなので、これは手動で行わなければならない。