OmniAICreator/Qiita-1.07M huggingface dataset:
PHP7の構文解析プロセスが刷新されたことが一目でわかるエラー表示

PHP5とPHP7では構文解析、つまり、テキストファイルからPHPで書かれたソースコードを読み込んでインタプリタで実行するまでのプロセスに変更がありました。[PHPの実行時とコンパイル時](http://qiita.com/tadsan/items/f037095e7f07b54d3fea)に書いたのですが、PHPは実行ごとにソースコードから仮想機械(Zend VM)のバイトコード(opcode)にコンパイルされます[^1]。

とは言っててもふつうにPHPを書いてる限りではあまり実感する差分ではないのですが、PHP5.6で動かしながらコードを書いてたら、「おやっ」と感じる挙動を発見し、この短いコードでPHPの構文解析の変更について説明できることに気がついたので紹介します ＞＜

```php
<?php

class Hoge
{
    function foo()
    {
    }

    /**
     * メソッド定義を追加しようとしてうっかり既存のメソッドと同じ名前で、
     * 実装する前にセーブした状態で実行しちゃったケースを想像
     */
    function foo

    public function buz()
    {
    }
}
```

```txt:php7
PHP Parse error:  syntax error, unexpected 'public' (T_PUBLIC), expecting '(' in /home/jail/prog.php on line 15
```

```txt:php5.6
PHP Fatal error:  Cannot redeclare Hoge::foo() in /home/jail/prog.php on line 13
```

次に、`function foo`を`function bar`に置換、つまりメソッド名の重複は起こらないようにしてみます。

```txt:php5.6
PHP Parse error:  syntax error, unexpected 'public' (T_PUBLIC), expecting '(' in /home/jail/prog.php on line 15
```

この差分をコンパイラの気持ちになってみると、PHP5時代はソースコードのパースをしながら順次メソッドの定義もやってたんですねー、だからその後の実装部分のsyntax errorを検出する前にメソッド名の重複を検査できたんですねー。

ここで重複定義のチェックができても誰が得するんだって感じなのでPHP7の挙動の方が自然だと思ひます。

[^1]: @hnwの[Zend OPcacheの速さの秘密を探る](http://www.slideshare.net/hnw/zend-opcache)にまるっと説明されてるので、お読みください
Rubyっぽく書きたい！！

rubyっぽくないコードをみるとリファクタリングしたくなるわけです。
ちょいちょい、追記していきたい。

## case01
```ruby:before01.rb
def can_use?
  # open_atから一週間以内 || deleted_atから一週間以内
  today = Date.today
  if open_at.present? and deleted_at.present?
    open_at + 7.days > today && deleted_at + 7.days > today
  elsif created_at.present?
    open_at + 7.days > today
  elsif deleted_at.present?
    deleted_at + 7.days > today
  else
    true
  end
end
```
```ruby:after01.rb
def can_use?
  return true unless target_date = [open_at, deleted_at].compact.min
  target_date > 1.week.ago
end
```
考察

- 日付を引いたり、足したりしてる処理はちゃんとActiveSupport使おう
- 条件分岐で条件に当てはまらなかったら、早めにreturnすると可読性が上がる
    - 比べるものが存在しない時
- 同じ条件判定が`or`で続く場合当てはまるりうるものを、選んでから判定すればDRYになる
    - 日付で以内だったら、`min`をとってからの判定
- rubyは条件判定で代入して使うイディオムがあるため、短く書ける
    - 代入文が値を返し、`nil`と`false`以外trueになる性質を利用
- 基本的にテスト書いてないのにリファクタリングはしちゃダメ


## case02

```ruby:before02.rb
#loop内
next if user.blank?
next if user.is_a?(Admin)
next if user.disabled?
```

```ruby:after02.rb
next if user.instance_eval { blank? || is_a?(Admin) || disabled? }
```
考察
- instance_evalを使えば、レシーバーのスコープ内でいろいろできる
　　- instance_evalの使い方として正しいのかはわからないけど、レシーバーを省略してシンプルに書ける
- 条件分岐は`or`でつなげた方が計算コストも減るし、シンプルになると思う

## case03

```ruby:before03.rb
if article.save
  flash[:notice] = "投稿成功"
else
  flash[:notice] = "入力に間違いがあります"
end
```

```ruby:after03.rb
flash[:notice] = if article.save
                   "投稿成功"
                 else
                   "入力に間違いがあります"
                 end
```
考察
- rubyのif文やcase文は値を返してくれる、インデントなど揃えれば上記のような書き方をした方が個人的に見やすいと思う
コードからもIBからも使えるUIViewのサブクラスのinitに関して

コードで実装したUIViewのサブクラスを、コードからもIBからも使えるようにしておく時の共通の初期化のコードをどうしたら良いのかの話。

## Objective-Cではこんな感じでやってたはず

```obj-c
@interface HogeView: UIView

@property(nonatomic)UIView *fugaView;

@end

@implementation HogeView

- (instancetype)initWithFrame:(CGFrame)frame {
    self = [super initWithFrame:frame];
    if(self) {
        [self setup];        
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if(self) {
        [self setup];
    }
    return self;
}

- (void)setup {
    self.fugaView = [UIView new];
    [self addSubview:self.fugaView];
}
@end
```
平和すぎる。

## Swiftの場合

プロパティは出来るだけletにしておきたいしもちろんOptionalにもしたくないので全部initの中でやる必要があるが
共通の処理はどう書いたら良いのか...という事情があって調べたらこういう方法があった。

```swift
class HogeView: UIView {
    let fugaView: UIView
    
    init(_ coder: NSCoder? = nil) {
        // common initialize
        fugaView = UIView.init()
        
        if let coder = coder {
            super.init(coder: coder)!
        } else {
            super.init(frame: CGRect.zero)
        }
        
        // common setup
       addSubview(fugaView)
    }

    required convenience init?(coder aDecoder: NSCoder) {
        self.init(aDecoder)
    }
}
```

やったぜ。

ちなみに、この方法だと`init(frame)`が失われてしまっています。
自分はAutolayoutを使わない場合のレイアウトは全て`layoutSubviews()`とか`viewDidLayoutSubviews()`でやるので別にいらないけど...。



---
という感じのことが↓の記事に書かれていました。
https://theswiftdev.com/2015/08/05/swift-init-patterns/ (リンク切れ)
CSVファイルの読み込み


```cpp:readCsvNumbers.h
/// CSV形式のdouble１行を読み取る
/// 引用符で囲んだ文字列には対応せず

///—— 宣言
#include <iostream>
// CSV形式の数値１行を最大(nMaxItem)カラム数まで
//doubleの配列に読み込み、読み込み数を返す。
int  readCsvNumbers(std::istream &is,double *pd,int nMaxItem);
```
```cpp:readCsvNumbers.cpp
///—— 実装
int readCsvNumbers(std::istream &is,double *pd,int nMaxItem)
{
	char comma;//","を読み飛ばす為
	int nGet=0;
	//ファイルを読み終わればEOF
	if(is.eof()) return -1;
	for(int iItem=0;iItem<nMaxItem;iItem++){
		//数字読み込み
		is>>pd[iItem];
		//行末か数字以外なら終了。
		if(is.fail()) break;
		if(iItem<nMaxItem-1){
			is>>comma;
		}
		if(is.fail()) break;
		nGet++;
	}
	return nGet;
}
```
```xpp:sample.cpp
///—— 使い方の例
/// 標準入力から読む場合。
#define nCol (10)
int main(int ac,char *av[]){

	double *din=new double[nCol];

	while(!std::cin.eof() && !std::cin.fail()){
		//ＣＳＶデータを1行読み出し
		int nR; 
		nR=readCsvNumbers(std::cin,din,nCol);
		//読み込んだカラム数を確認
		//不足で終了
		if(nR!=期待した数)
			break;
		if(nR<0) //EOF
			break;

		//行毎の処理。
		//for(int i=0;i<nR;i++){
			//std::cout<<d[i]<<" ";
		//}
		//std::cout <<std::endl;
	}
	//
	delete [] din;
	return 0;
}
```
/// ファイルから読む場合は
std::ifstream ifs;
ifs.open(tapFile,std::ifstream::in);
として、ファイルをオープンして、
std::cinの代わりにifsを使います。
［解決済み］［質問］jqueryが反応しません、なぜなんでしょうか...

初めまして、webサイト制作初心者です。

DWでweb制作をしていて、jqueryにも手を出してみようと思ったのですがなぜか反応しません。誰かわかる方助けていただけないでしょうか..

以下コードです。

```ruby:sample

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>jqueryファイルの読み込み</title>
<link href="Untitled-1.css" rel="stylesheet" type="text/css">
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.1/jquery.min.js">
</script>
<script type="text/javascript">
$(document).ready(function(){
alert("jQueryファイルの読み込み完了。");
});

$('button').click(function(){
  $('p').text("押されました");
});
</script>


</head>

<body>
<h1>jqueryファイルの読み込みです。</h1>
<h2>
<p>押されてないよ</p>
<button>クリックしてね</button>
</h2>
</body>
</html>

```




上がコードなのですが、アラートは反応するのですがボタンを押しても文章がかわりません。誰かわかる方どうかお願いします。

追記、buttonに反応するscriptをbodyを閉じる直前に入力した所反応しました。
GooglePlayで表示される言語を切り替える

URLリンクの最後に、&hl=[言語]を追加すると、その言語に合ったページが表示されるようになります。

# Gmail
https://play.google.com/store/apps/details?id=com.google.android.gm

# Gmail(English) &hl=en
https://play.google.com/store/apps/details?id=com.google.android.gm&hl=en

#パラメータの言語一覧

英語 (アメリカ合衆国) – en-US

中国語 (簡体字) – zh-CN

中国語 (繁体字)(台湾) – zh-TW

イタリア語(Italiano) – it-IT

ドイツ語(Deutsch) – de-DE

韓国語 (한국어 ) – ko-KR

フランス語(Français) – fr-FR

ロシア語(русский) – ru-RU

インドネシア語 – id

スペイン語(Español) (スペイン) – es-ES

ポルトガル語(Português) (ブラジル) – pt-BR

ポルトガル語(Português) (ポルトガル) – pt-PT

オランダ語(Nederlands) – nl-NL

フィンランド語(Suomi) – fi-FI

デンマーク語(Dansk) – da-DK

スウェーデン語(Svenska) – sv-SE

タイ語 – th

アイスランド語 – is-IS

トルコ語(Türkçe) – tr-TR

ノルウェー語(Norsk bokmål) – no-NO
VirtualBox上のLinuxにGuestAdditionsをインストールして、共有フォルダを設定する



# 目的
VirtualBoxにLinuxをインストールした後、
GuestAdditionsをインストールする方法を毎回忘れて調べる羽目になるので、備忘のためにメモっておく。


# 環境
ホストOS は Mac
VirtualBox は Version 5.0.4
ゲストOS は CentOS 7.1

試した時期は 2015年の9月頃


# 前提パッケージのインストール
ゲストOSのインストール時に、開発まわりのパッケージを一緒にインストールする必要がある。
忘れてしまったら、以下の手順で必要なものを導入する。

## NWに接続する
まずはNW接続できないといけないので、VirtualBox側でNW設定をブリッジにする。（ブリッジじゃなくてもいいけれど、何も考えずにやるには一番楽チン）

## OS起動時のNW接続を有効にする
設定ファイル /etc/sysconfig/network-scripts/ifcfg-xxx を編集して、

``` /etc/sysconfig/network-scripts/ifcfg-xxx
ONBOOT=yes
```

にする。
※OS起動時にNW接続する必要がなければ、この設定は不要。

## サービス再起動

``` ネットワークサービスの再起動
service network restart
```

これでネットワーク接続できるようになるはず。

## 必要パッケージのインストール
make
gcc
kernel-dev
の３つをインストールする。
yumでOK。

``` パッケージインストール
yum -y install make gcc kernel-dev
```
kernel-devなんかはちょこちょこ更新されているから、バージョン指定したほうがいいかもしれない。
kernelとバージョンが異なると、正しく動かせなくなってしまう。
※makeとgccは必要ないかもしれないが、うろ覚えの記憶ではこの3つが必要だったはず。


# GuestAdditionsのインストール

## ISOを接続する
VirtualBox側でVBoxGuestAdditions.isoを接続する。
デバイス -> Guest AdditionsのCDイメージを挿入。

## GuestAdditionsのインストール
接続したISOをマウントしよう。

``` マウント
mount -r /dev/cdrom /media
```

ISOをマウントしたら、インストール。

``` インストール
cd /media
sh ./VBoxLinuxAdditions.run
```

インストールが終わったら、ISOをアンマウントしてOSを再起動してやろう。

``` アンマウント&再起動
cd
umount /media
shutdown -r now
```

最初の cd はマウントしたディレクトリから移動するために使った。

ここまでが、GuestAdditions がインストール手順だ。


### ちなみに・・・
私は gnome とかの GUI まわりをインストールしていないので

``` インストール時のメッセージ
Installing find the window System drivers
Could not find the X.Org or XFree86 Window System,
skipping.
```

と、でてきた。
GUIまわりのものはインストールされなかったようだ。


# 共有フォルダを設定

## VirtualBox側の準備
VirtualBox側の設定 -> 共有フォルダから、共有フォルダを作る。
（例として共有フォルダ名を hoge とする）
この時に入力するフォルダ（＝作られるフォルダ）は、ホストOS側だ。


## ゲストOSから共有フォルダをマウントする
ゲストOS側で適当なフォルダを作成（例として /piyo とする）して

``` 共有フォルダをマウント
mount -t vboxsf hoge /piyo
```

とすればフォルダを共有できるようになる。



以上
【npm】コマンドラインからQiitaのユーザーページを開く

よいライブラリの作者は、よいアウトプットをしていることが多いです。
例えば、モダンjsの構成のサンプルであるレポジトリをgitクローンして見ているとします。

[mizchi/modern-js-stack-example-with-react](https://github.com/mizchi/modern-js-stack-example-with-react)

そのとき、これに関連する作者の記事を参照したくなります。本来なら、いちいち検索する必要があり面倒ですが、今回つくったCLIツールを使うと一瞬で開けて便利です。

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

オプションが与えられなければ、一番近くのディレクトリのpackage.jsonのauthor情報を利用しそのユーザーのQiitaページを開きます。

[github: akameco/qiita-home](https://github.com/akameco/qiita-home)

## インストール

```
$ npm i -g qiita-home
```

## 使い方

以下のコマンドを提供します。

```
$ qiita-home
// または
$ qh
```

ユーザー名が与えられれば、そのユーザページを表示します。上記のgifのように、何も与えなければ、一番近いディレクトリのpackage.jsonからauthorをQiitaページを表示することになります。
また、おまけですが`--tag`または`-t`でタグの検索結果を表示します。

```
$ qiita-home --help
  Usage
    $ qiita-home [ユーザー名]
    $ qh [ユーザー名]
  Options
    -t, --tag  タグで検索
  Examples
    $ qiita-home
    $ qiita-home akameco
    $ qiita-home -t Node.js
```

## まとめ
Qiitaを使っているのがほぼ日本人というのもありますが、ほとんどのnpmパッケージでこのコマンド使っても、404ページに飛ばされて悲しいです。日本人もっとOSS頑張れという気持ちになります。

[github: akameco/qiita-home](https://github.com/akameco/qiita-home)
Visual Studio Code 1.0 リリースのニュースまとめ

##Visual Studio Code 1.0 リリースについてのニュースサイト
- ZDNet Japan　[MSの開発者向けエディタ「Visual Studio Code」、バージョン1.0に到達](http://japan.zdnet.com/article/35081236/)
- TechCrunch Japan　[Windows、OS X、LinuxをカバーするMicrosoftのVisual Studio Codeエディタがついに1.0に](http://jp.techcrunch.com/2016/04/15/20160414microsofts-visual-studio-code-editor-for-windows-os-x-and-linux-hits-1-0/)
- 窓の杜　[Microsoft製の無償コードエディター「Visual Studio Code」がv1.0.0に
 ](http://www.forest.impress.co.jp/docs/news/20160415_753468.html)
- INTERNET Watch　[正式版となるコードエディター「Visual Studio Code 1.0」が公開 ](http://internet.watch.impress.co.jp/docs/news/20160415_753437.html)
- CodeZine　[Microsoft、マルチプラットフォーム／マルチ言語対応の開発環境「Visual Studio Code 1.0」をリリース](https://codezine.jp/article/detail/9385)
- BIGLOBEニュース　[Microsoft、「Visual Studio Code」のバージョン1.0安定版を公開](http://news.biglobe.ne.jp/it/0415/imn_160415_1459089964.html)

##ニュースサイトに記述のあったVisual Studio Code　関連リンク
- [GitHubのオープンソース](https://github.com/Microsoft/vscode)
- [エディタ機能拡張](https://code.visualstudio.com/docs/extensions/overview)
- [エクステンション（1000種類以上）](https://marketplace.visualstudio.com/VSCode)
- [Visual Studio Code ブログ](http://code.visualstudio.com/blogs/2016/04/14/vscode-1.0)
- [Visual Studio Code 日本語サイト](https://www.visualstudio.com/ja-jp/products/code-vs.aspx)
- [Visual Studio Code 英語サイト](https://code.visualstudio.com/)
- [ダウンロードサイト(for Windows, Linux, OS X)](http://code.visualstudio.com/Download)


* * *
[]()
[]()
[]()
MySQL5.6系のレプリケーションで、スレーブをクラッシュセーフに設定する

## 設定経緯
ある日いつも通り2台構成のMySQLサーバでマスタースレーブレプリケーションを組んだ後にログを眺めていたら、以下の様なログがスレーブ側で発生していた。
`[Warning] Slave SQL: If a crash happens this configuration does not guarantee that the relay log info will be consistent, Error_code: 0`

英文を読んでみると、

`この構成の場合、もしクラッシュした場合にはリレーログの情報の一貫性は保証されません`

的なログ。

このサーバのMySQLはMySQL5.6だったので、どうやら5.6の新機能のクラッシュセーフ関連の機能を有効にしていないために発生しているみたい。

既にサービスインしているサーバで、停止には許可がいるサーバだったんだけど、スレーブで有効にすれば良さそうだったので有効にしてみた。

## 設定
設定はこれだけ。

```
vim /etc/my.cnf
----------
[mysqld]
relay_log_info_repository  = TABLE
relay_log_recovery         = ON
----------
service mysqld restart
```

これでエラーは出なくなった。

## 設定理解
※以下のサイトを大変参考にしています
https://yakst.com/ja/posts/57

上記サイトを見ればだいたいわかっちゃいますが自分の理解のために記載。

### スレーブのレプリケーションのスレッド
スレーブのレプリケーションのスレッドは以下の２つから成る。

* IOスレッド
* SQLスレッド

IOスレッド:
バイナリログをマスターからスレーブのローカルのリレーログにコピーする役割を担う。

SQLスレッド:
リレーログ内のクエリを実行する役割を担う。

### スレッドのポジション
それぞれのスレッドは、ローカルにファイルとしてポジションを記録している。

IOスレッドのポジションは `master.info` に。
SQLスレッドのポジションは `relay-log.info` に記録される。

### ポジションをファイルに書き込む事の問題点
ファイルに書き込みが行われたタイミングと、ディスクへのファイルの書き込みが同期していないこと。
ファイルへの書き込みが行われた後、ディスクへファイルが書き込まれる前にサーバがクラッシュしてしまうと、ファイルに記録されているポジションが正しくない場合が発生する。

※ここでのファイルの書き込みというのは、まだディスクに書き込まれていない状態の、メモリ上などに存在するデータの事を指しているのだろうか？上手く理解できていない。

MySQL5.5系の場合、`sync_master_info = 1` `sync_relay_log_info = 1` と設定することによって、トランザクション毎にファイルをディスクに同期させる処理が可能だった。

しかし、この設定を行っても、レプリケーションの情報はトランザクションのコミットの後に書き込まれるため、トランザクションがコミットされてかつ、レプリケーションの情報が更新される前にサーバがクラッシュしてしまうと、不整合が発生する可能性が高くなる。

### MySQL5.6系での上記問題の改善
MySQL5.6系では、レプリケーションの情報を、ファイルではなくテーブルに書き込む事を可能にした。
ファイルの時はトランザクションのコミット後にレプリケーション情報を更新していたが、トランザクションの中でレプリケーション情報を更新することが可能になった。


力尽きた・・
力が湧いたらコピペっぽい記載じゃなくて色々な情報を纏めて書こうと思います。
Sphinxでアンダーラインを引く（HTML限定）


**この方法を取っても、LaTeXを用いて作成したPDFには反映されないことに注意**

カスタムCSSとして、以下のクラスを追加しておく。

```css
.underline {
  text-decoration: underline;
}
```

アンダーラインを使いたいrstファイルの冒頭に以下の記述を追加。

```rst   
.. role:: underline
  :class: underline
```

アンダーラインを引きたい箇所を以下の記述にする。

```rst   
:underline:`アンダーライン引きたい場所`
```

### 参考URL
[How to underline text in reStructuredText? - Stack Overflow](http://stackoverflow.com/questions/9084173/how-to-underline-text-in-restructuredtext)
連珠(五目並べ)プログラムのための覚書

# 概要
　前に書いた『[連珠(五目並べ)入門 for プログラマ](http://qiita.com/YSRKEN/items/81f97660be023add2265)』にて、**ルールを実装する観点から見た連珠(五目並べ)**を紹介しました。簡単そうな見た目に反し、結構複雑だと思われた方も多いのではないでしょうか。
　実際連珠はややこしいです。単純に三や四をヒク(意味は後述)よりも、ミセ手・フクミ手・ノリ手・ハメ手を駆使した方が**遥かにエキサイティング**になります。しかしそこまで知恵を回さずにプレイすると、**ただ四三完成を目指す子供遊び**になってしまいます。
　そこで、少しでもエキサイティングな対局が出来るように何をするべきか……すなわち**実装のコツ**についてまとめてみました。

# ルール実装編
　当たり前のことですが、**連珠にはルールが存在します**。つまり、黒・白どちらも**「五連を目指す(黒は禁手を避ける)」**ために石を打つ必要があります。[前回の記事](http://qiita.com/YSRKEN/items/81f97660be023add2265)では「五連判定→長連判定→直線上の四々判定→三と四を数えて三々or四々判定」とするのが効率よく処理できると書きましたが、実用上は次のようなフローになると思われます。

- 既に五連・長連が完成していたり、「もうこれ以上指しても引き分けしかない」かどうかをチェックする
- 自分が五連を揃えられる場合は**そのまま揃えて勝つ**。ただし黒には長連禁があるので注意
- 相手が活四を打ったなら**即座に防ぐ**。そこが禁点だったなら投了せよ
- **通常の手を探索する**。当然、禁手は避ける必要がある

　五や四だと指す手が非常に限られてきますので、先に判定しておくと他が楽になります。実際、「三は考えてから止めよ、**四は止めてから考えよ**」といった格言があるぐらいですので、この辺りで時間を掛けるのは無駄です。また、**先に五と四を判定したことで、**白の長連以外は即勝ちが無くなり、**今後の布石が考えやすくなる**といったメリットもあります。

# 定石編
　囲碁や将棋などと同じく、連珠にも定石が存在します。ただ、[前回の記事](http://qiita.com/YSRKEN/items/81f97660be023add2265)でも説明したように、データをかき集めるのは大変ですので、[拙作「Shioi」では、伊達五目収録の定石を拝借いたしました](https://github.com/YSRKEN/Shioi/blob/master/book.csv)。なお、[伊達五目](http://www.vector.co.jp/soft/win95/game/se067096.html)の定石データの仕様については[作者によって公開](http://hp.vector.co.jp/authors/VA009422/adb_format_draft2.html)されています。

# 四追い勝ち編
　「四追い勝ち」とは、活四の連続で五連を目指す戦術のことです。黒でも白でも使える**連珠の基本戦術**ですので、将棋における詰将棋ルーチン・囲碁における詰め碁ルーチン以上に重要だと言えます。そもそも、後述するミセ手・フクミ手の説明には四追い勝ちの説明が欠かせませんので、ルール部分を実装した後は真っ先に取り組むべき箇所でしょう。
　意外にも、ルーチン自体はそこまで難しくありません。これは「自分の活四に対し、**敵が防ぐ手は一つしかない**」からです。「自分が活四を打った直後に敵が五連以上にする」ことは事前チェックで弾けますので、「敵の防手で敵に活四・棒四(四ノリ手)が生じる」可能性に気をつければ容易に実装できるでしょう。また、探索範囲が狭いので、長手数を読むのも簡単です。なお、黒はたとえ四追い中でも**四々含めた禁手を打つことは禁じられています**ので、その点も注意が必要です。

# 追い詰め編
　「追い詰め」とは、追い手の連続で五連を目指す戦術のことです。ここで言う「追い手」は4種類(棒四と活四を分けると5種類)存在します。

|名称|説明|備考|
|:---|:---|:---|
|三|同種の石を1個加えると達四になるもの|四には勝てないので注意|
|四(棒四)|4個の石の連で、同種の石を1個加えると五連になる点が2カ所あるもの|敵に四が生じてないかぎり勝ち確|
|四(活四)|同種の石を1個加えると五連になるもの|棒四以外には勝つので、ノリ手防ぎなどで活躍する|
|ミセ手|敵が放置すると、次に四三を作ることができる手|1回も四追いしないフクミ手とも言える|
|フクミ手|敵が放置すると、次に四追い勝ちできる手|防手が10箇所以上生じることも珍しくない|

　ここでミセ手・フクミ手は四追い勝ちルーチンで判定できます(前者は「四三」だけ考慮すると違うが)。ただ、防手が1つに限らないどころか、「自分の(四以外の)追い手に対し、**一旦四ノビしてこちらに防がせることで攻めを途切れさせる**」といった戦術も取れるのが恐ろしいところです。具体的には、「**四三になる場所を四々にしてしまう**」「**ノリ手(後述)で防いでしまう**」などですね。こうなると攻めが失敗してしまいますので、探索が四追い勝ちより遥かに高コストなことは明らかでしょう。裏を返せば、それだけ連珠が**黒も白も綱渡り**なのです。

# 通常探索編
　こちらに四追い勝ちも追い詰めも存在しない場合、それ以外の手を打つしかありません。もちろん明後日の場所に打っていては勝利に繋がりませんが、**この布石を思考することは非常に難しいです**。
　中盤が難しいのは将棋も囲碁も同じですが、それらと違って**一歩ミスれば即死しかねない**ため、どう評価していくべきなのかについて様々な研究がされています。[モンテカルロ木探索を用いて形勢を推定するソフト](http://www.vector.co.jp/soft/winnt/game/se502329.html)もありますが最強とは言えませんしね。実際、[最強レベルの連珠ソフトでも人間に遠く及ばないようです](https://twitter.com/haisaresu/status/719855028773605376)。
PowershellでHash値を算出し重複ファイルを洗い出す

日々PCを使っていると、重複したファイルがそこかしこに散らばり
挙句ディスクの空き容量が不足する事態に。
調べるフリーソフトもあるけれど、会社とかのルールで入れられない・わざわざ入れたくないという方へ。


## 必須環境
* Windows8.1以降のOS
	* Powershell 4.0のGet-FileHashコマンドを利用するためです。Windows7だけど、MS提供モジュールはインストールできるという方はPowershell4.0導入で対応可能です。
	* Windows Management Framework 4.0をインストールすることでPowershell4.0導入可能です。
* Powershell3.0以前の環境でも.Net FrameworkのSystem.Security.Cryptography 名前空間を利用することで、SHA256でHash値を取得可能なようです。Get-FileHashコマンドの処理を適宜編集してください。
	* Windows7であれば、Powershell2.0が標準インストールされています。

## 使い方
1. 下記Scriptのディレクトリ設定を適当な値に編集し、実行。(*1)
	* $wDir : 作業用ディレクトリの指定します。Hashリストを生成するディレクトリでもあります。
	* $lRoot : 調査対象のトップディレクトリを指定します。
	* 生成されるHashリスト : yyyyMMdd-hhmmss_Hashlist.csv
2. 完了したら生成されたCSVを開き、Hashでソートして不要なものを削除。
	* CSVのレコード数次第では、Excelで編集したりAccess等のDBで抽出したりしましょう。(*2)

## 注意事項
1. SHA256で算出していることもあり、ファイルサイズ・ファイルの数次第ではあるものの想像以上に時間がかかることが想定されます。心してかかりましょう。
	* ファイル数が多い場合、その他アルゴリズムでは重複する可能性が高く対策としてSHA256を採用しています。
2. Powershellでソートさせたり重複ファイルだけリスト化も不可能ではないですが、そこまでやらせると時間がかかり過ぎるので適宜ツールは使い分けしましょう。

## その他
* 実装出来ていないですが、今後実装したいこと。
	* ファイルサイズも取得してCSVに書き出し
	* 処理の高速化(高速にできるのか!?)
	* 前述のPowershell3.0以前の環境への対応
	* Function化


```Get-Hashlist.ps1
# ワーキングディレクトリ設定/ファイル一覧対象ディレクトリルート設定/タイムスタンプ取得
$wDir = "D:\"
$lRoot = "E:\"
$fTimeStamp = Get-Date -Format "yyyyMMdd-hhmmss"

# ワーキングディレクトリへ移動
cd $wDir

# ファイル一覧情報取得
Write-Host (Get-Date)
Write-Host Getting File List ...
$fList = Get-ChildItem -Path $lRoot -Recurse -File
$lCount = $fList.count

# Hash一覧作成
$fPath = ".\"+$fTimeStamp+"_Hashlist.csv"
Write-Host $fPath
for ($i = 0;$i -lt ($lCount);$i++){
 $pPer=$i/($lCount - 1)*100
 Write-Progress -Activity "Hash一覧作成中" `
  -PercentComplete $pPer `
  -CurrentOperation "$lCount : $pPer% complete" `
  -Status "しばらくお待ちください。"
 $fList[($i)] | `
  Get-FileHash -Algorithm SHA256 | `
  Select Hash,Path | `
  Export-CSV -NoTypeInformation -Path $fPath -Append
}

# Hash一覧データレコード数取得
$fRecord=(Import-Csv -Path $fPath).Length

# ファイル件数,Hashレコード数比較
IF ($lCount -eq $fRecord){
 Write-Host Match Record Count. Complete.
} ELSE {
 Write-Host Not Match Record Count. Error.
}

Read-Host "Press Any Key"
超便利！cv::formatについて

# cv::formatとは
cv::Matの中身を様々なフォーマットで出力してくれる便利関数です．
デフォルトスタイル，python，numpy，csv，c言語の配列スタイルの出力フォーマットを選択できます．
実験の結果を吐き出して，エクセルでざっくりとグラフにしたい時とかに便利です．
OpenCV3.1の公式ドキュメントは[こちら](http://docs.opencv.org/3.1.0/d3/da1/classcv_1_1Formatter.html#gsc.tab=0)からどうぞ．

出力フォーマットの設定は，2.0と3.0では違うので注意が必要です．
2.0での使用方法は，[こちら](http://opencv.jp/cookbook/opencv_mat.html)に書いてあります．
2.0では，文字列での指定でしたが，3.0からはcore.hppにFormatterクラスがあり，
そこに各フォーマットの列挙子があります．

| Format | OpenCV2.0 | OpenCV3.0 |
|:-----------:|:------------:|:------------:|
| default     |    ";"       | FMT_DEFAULT  |
| python      |   "python"   | FMT_PYTHON   |
| numpy       |   "numpy"    | FMT_NUMPY    |
| csv         |   "csv"      | FMT_CSV      |
| C           |   "c"        | FMT_C        |
| MATLAB      |   未対応     |  FMT_MATLAB    |

以下にサンプルです．
テスト画像からSURF特徴量を取得して，特徴記述子の中身をCSVファイルに書き出しています．

```cpp
#include<iostream>
#include<vector>
#include<fstream>
#include"OpenCV31.h" //opencvのインクルード

using namespace std;
using namespace cv;

int main(int argv,char **argc)
{
	cv::Mat img = cv::imread("test1.png",cv::IMREAD_GRAYSCALE);

	Ptr<cv::xfeatures2d::SIFT> sift = cv::xfeatures2d::SIFT::create();

	vector<KeyPoint> keyp;
	cv::Mat desc;
	sift->detectAndCompute(img, cv::Mat(), keyp, desc);

	ofstream ofs("sift.csv");
	ofs << cv::format(desc, cv::Formatter::FMT_CSV) << endl;

	cv::imshow("src", img);
	cv::waitKey();

	return 0;
}
```

これを知るまでforループでがりがり書いて出力してました・・・
以上です．
BeagleBoneBlackで外付けLED




##LEDをつけるために勉強
LEDを使うのは久しぶりなので、すっかりLEDとか電流の決まりを忘れてる

 - LEDの足が長い方がプラス、プラスを接続する方をアノードという
 - 短い方がマイナスで、マイナスを接続する方をカソードという

注: 電流の方向はアノードからカソードに向かうものとする必要が有る。

- カソードをつなぐ方を、BBBのD-GND(グランド)に接続
 - アソードをつなぐ方に、今回GPIO30に接続

今回、抵抗はなしでやりました(本当はよろしくないと思います)。


##とりあえずサイトを参考にいろいろやっていく
以下のサイトを参考にしました！

http://nobikko-nobinobi.hatenablog.com/entry/2015/04/05/213348

使用するGPIOポート番号のデバイスファイルを作らないといけないようなので、ターミナルで接続したところのデバイスファイルを作成

```デバイスファイル作成
# echo 30 > /sys/class/gpio/export
```

そうするとGPIO30のディレクトリができる

```
/sys/class/gpio/gpio30/direction
```

```確認
# echo 30 > /sys/class/gpio/export

# ls /sys/class/gpio/
export      gpiochip0/  gpiochip64/ unexport
gpio30/     gpiochip32/ gpiochip96/

# ls /sys/class/gpio/gpio30
active_low  direction  edge  power  subsystem  uevent  value
```

今回、LEDを点灯させるために出力を行うので、directionファイルをoutにする

```
echo out > direction
```

確認してもらえればわかるけど、

directionファイルの中身は入力か出力かを表す`in`か`out`が記載されているだけだった。

```direction
out
```

んで、この中のvalueっていうファイルをいじったらいろいろLEDがつく。
なので
点灯

```
echo 1 > value
```
消灯

```
echo 0 > value
```


最後に使用し終わったデバイスファイルの削除

```
echo 30 > /sys/class/gpio/unexport
```


##まとめ
LEDをつけるには、使用するGPIOポート番号のデバイスファイルを作成。その後、出力か入力かを決め、信号を出力するようにする。

```点灯し、消灯するまでの流れ
echo 30 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio30/direction
echo 1 > /sys/class/gpio/gpio30/value
echo 0 > /sys/class/gpio/gpio30/value
echo 30 > /sys/class/gpio/unexport
```

今回、ターミナルで操作してLEDを点灯した。
次はbonesriptを利用して、点灯してみようと思う。
BeagleBone Black セットアップ

BeagleBone Black(以下BBB)を扱うことになりました！
しかし、BBBのドキュメントが多くないので少しでも誰かの助けになればと投稿を決意しました！

##いざ、BeageBone
はじめに、メモ書きから始めちゃいます。すいません。

 - 起動はケーブル挿したらおっけ
 - 終了は電源ボタン長押しでもいいし
 or 以下のコマンドをターミナルから入力
故障の原因になるかもしれないからきちんと電源を落とそう！

```
shutdown -h now
```


ディレクトリの削除は`rmdir`

##セットアップしていくよ

http://beagleboard.org/static/beaglebone/latest/README.htm

上記のサイトから必要なドライバをインストール

 - mac
 `Serial`と`Netowork`の両方をインストール

 - windows
 64bitだったので、64bitのドライバをインストール。途中信頼するかどうか聞かれるが全て信頼するでインストール
 
 
##usbでbeagleboneに接続
ドライバをインストールしたことから、ネットワーク環境設定でBBBのipアドレス確認して、sshで接続できるはず！

chromeのアドレスバーにアドレス`http://198.168.7.2/`を入力して確認

その後以下のコマンドでssh接続。
どっちのコマンドでもアクセスできる。
初期はrootのパスワードを設定されていないからそのままいける。


```
ssh root@198.168.7.2
ssh root@beaglebone.local
```

##cluod9で利用するには以下のアドレスでブラウザからアクセス
   
```
http://192.168.7.2:3000/ide.html
```

##デモをやってみる！
いろいろコード書いてみたりで遊んでみよう！！
今回はターミナルでファイルを作成し、コードを書いた後実行してみる！
試しにボード上にあるLEDをチカチカするよ。

```led.js
  1 var b = require('bonescript');
  2
  3 leds_out = function(status) {
  4   b.digitalWrite('USR0', status);
  5   b.digitalWrite('USR1', status);
  6   b.digitalWrite('USR2', status);
  7   b.digitalWrite('USR3', status);
  8 }
  9
 10 var state = b.HIGH;
 11 blink = function() {
 12   if(state == b.HIGH){
 13     state = b.LOW;
 14   }else{
 15     state = b.HIGH;
 16   }
 17   leds_out(state);
 18 }
 19
 20 b.pinMode('USR0', b.OUTPUT);
 21 b.pinMode('USR1', b.OUTPUT);
 22 b.pinMode('USR2', b.OUTPUT);
 23 b.pinMode('USR3', b.OUTPUT);
 24
 25 setInterval(blink, 1000);
```

実行

```
node led.js
```



##参考サイト

https://github.com/kinneko/BBBB/wiki/Brink-LED

http://marutsuparts.blog74.fc2.com/blog-entry-1051.html
OSX(EI Capitan) に rbenv 経由で古い ruby 1.8.7 をインストール

古いプロジェクトの開発環境を、インストールする時に嵌ったので備忘録です。

### required software

OSX 10.11.3(EI capitan)
XCode 7.3
XCode Command Line Tools
homebrew
rbenv

### エラー1

```
An error occurred while installing libxml-ruby (1.1.4), and Bundler cannot
continue.
Make sure that `gem install libxml-ruby -v '1.1.4'` succeeds before bundling.
```

### エラー2

```
Could not load OpenSSL.
You must recompile Ruby with OpenSSL support or change the sources in your Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL using RVM are available
at rvm.io/packages/openssl.
```

`bundle install` などで上記エラーになったので、
以下で必要なものを先にインストールしました。

```
brew install homebrew/dupes/apple-gcc42
brew install openssl
brew install libxml2
brew install libxslt
brew install libiconv
brew install readline
export CC=`which gcc-4.2`
export CFLAGS='-g -O2'
export RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`"
export CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`"
rbenv install 1.8.7-p371
```

/usr/local/bin/gcc-4.2 は環境によってパスが違うかもしれないので、 `which gcc-4.2` で確認してください。
Node-REDの新ノード更新・インストールするについて

# 課題

Raspberry PiでNodeREDを使って、ノードを作って、インストールすると問題なかったけど、いざちょっと修正したいなと思ったら、どうしても反映してくれなくて、困りました！

なんでだろう・・色々試した結果、globalパラメータを指定すると、モジュールが自動的にグロバールフォルダに保存され、修正している本体とぜんぜん違うところでした。

自分のケースだけかもしれませんが、メモってみた。

# 前提と結果

* ノードを作成する際、以下のフォルダーに設定していました。

```
/root/.node-red/[nodes_are_installed]

```

インストールする際、以下のコメントでインストールします。

```
npm -g install .
```

その結果は利用するモジュールおよびノードが入ってきました！

```
/usr/local/lib/node_modules/node-red-ncmb-datastore/
``` 
じゃノードの更新はここで更新すればいいか？もっと良いやり方が知っている方、ぜひ教えてください！

<追記>

ノードのコードを更新したら

```
npm -g install .
```
Unity5ハコスコVR開発 セットアップ編 (Google Cardboard SDK for Unity)


最近VR開発を始めました！
その日々を記します。

まずはiPhoneでハコスコVRアプリを作る際のセットアップ編。
この状態の作り方メモです。

![スクリーンショット 2016-04-15 12.30.41.png](https://qiita-image-store.s3.amazonaws.com/0/76843/6693a03f-f4d0-2cd2-7a0a-3678917c6011.png)

環境:
Unity5.3.4
Cardboard SDK for unity (Ver 0.7.0)
iPhone5s os9.3.1

#1 Cardboard SDK for unityのダウンロード

下記よりCardboard SDK for unityをダウンロードします。
https://developers.google.com/cardboard/unity/download?hl=ja#cardboard_sdk_for_unity

#2 Unityでプロジェクトを作成

新規プロジェクト作成 ⇨ Assets ⇨ Import Package ⇨ Custom Package ⇨ 先ほどダウンロードしたCardboardSDKの.unitypackageファイルをインポート

![スクリーンショット 2016-04-15 12.49.50.png]
(https://qiita-image-store.s3.amazonaws.com/0/76843/85d7e39b-a435-5577-a094-812375e7d3e9.png)



#3 カメラの設定

MainCameraにscriptsフォルダ内のStereoController.csをアタッチ(これでいけたが良いのだろうか..) ⇨ 動作確認のためのcubeを一つ設置。⇨ 実行。
するともうこちらの状態に！

![スクリーンショット 2016-04-15 12.30.41.png](https://qiita-image-store.s3.amazonaws.com/0/76843/6693a03f-f4d0-2cd2-7a0a-3678917c6011.png)

altキーを押しながらドラッグするとグリグリ動かせます！

#4 そしてiPhoneアプリ向けにビルド

※iPhoneアプリにビルドする場合は、AppleのiOSデベロッパプログラムに登録している必要があります。
登録してない方はこの辺の記事を参考に登録。
http://www.studioloupe.com/2013/04/iOSDev1.html

File ⇨ Build Setting からiOSを選択。Swich Platform を押してios向けに切り替えます。


<img width="300" alt="スクリーンショット 2016-04-15 20.47.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/76843/b488bb63-2272-a76b-5591-62ad3d619285.png">


私の環境だと、
そのまま書き出したら**なぜか画面が辺な向きにビルドされたので、デバイスの向きを設定しました。**

Player Setting を押して、Default OrientationをLand Scapeに設定します。
<img width="596" alt="スクリーンショット 2016-04-15 20.49.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/76843/bf51253f-2345-a5c1-c8d0-150c1cdf14e6.png">

そしてBuildします！

#5 Xcodeの設定

さて、ここまできたら残りはXcodeでの作業なのですが、ここがハマりました、、、、。

**UnityからビルドされたXcodeのプロジェクトファイルを開いて、そのまま実機にビルドしようとしたらエラーが出ました。。**

そこで2か所設定しました。

1.Build SettingのEnable BitcodeをNoにします。

<img width="415" alt="スクリーンショット 2016-04-15 20.56.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/76843/1862a5ea-c5c2-ec89-8952-8d443ad6238a.png">

2.General ⇨ Linked Frameworks and Libraries に Security.frameworkを追加

<img width="759" alt="スクリーンショット 2016-04-15 20.58.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/76843/6a35d685-e765-7d44-01f4-c9cee5ba38c0.png">

以上でエラーが解決しました。

#6 実機に書き出してハコスコVR体験！

お疲れ様でした！これで実機にビルドできると思います。

Cubeを好きな3dモデルに変更したりして、楽しんでみてください！






ちなみに私は今、
なぜか飛んでくる🍌バナナを破壊するゲーム🍌を作っています。🍌🍌

![スクリーンショット-2016-04-15-12.34.30.png](https://qiita-image-store.s3.amazonaws.com/0/76843/5efb96be-22b8-ac13-6545-77d108724bdb.png)

エンジョイ ハコスコ バーチャリアリティ！

続く...かも
次回は注視点とObjectの衝突判定
Support Vector Drawable対応で使うapp:srcCompatをdatabinding使用箇所でも使いたい

# Support Vector Drawableについて

Vector Drawable対応そのものについては以下の資料が非常に参考になりますのでよくわからない方は御覧ください。

- 
[Support Vector Drawable](https://speakerdeck.com/takahirom/support-vector-drawable)
- [VectorDrawable対応まとめ
](http://qiita.com/konifar/items/bf581b8f23dea7b30f85)
- [Support Vector Drawableのバージョン間差異について](http://qiita.com/androhi/items/7398c7d7c5b07d14ab01)

# Data Bindingについて

Data Bindingについては、[Android Developersの公式ガイド](http://developer.android.com/intl/ja/tools/data-binding/guide.html)を御覧ください。

# 本題

## 問題

[Data Bindingガイド](http://developer.android.com/intl/ja/tools/data-binding/guide.html)を読むと、drawableを`android:src="@{@drawable/image}"`のように指定するかと思います。

そのあと、Support Vector Drawable対応しようとして`app:srcCompat="@{@drawable/image}"`とreplaceすると、ビルドに失敗します。

```
Cannot find the setter for attribute 'app:srcCompat' with parameter type android.graphics.drawable.Drawable. 
```

Drawableのsetterがapp:srcCompatにないと言われます。

## 解決方法

まず、当該xmlに`com.example.R`をimportします。`com.exapmle`の部分は適宜Package名に置き換えてください。

```xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <import type="com.example.R" />
        .....
    </data>
    ....
</layout>
```

drawableの指定方法を`app:srcCompat="@{R.drawable.image}`のように変更します。

最後に適当なクラスのstaticメソッドとしてsrcCompatのBindingAdapterを定義します。

```java
@BindingAdapter("srcCompat")
public static void srcCompat(ImageView view, int resourceId) {
    view.setImageResource(resourceId);
}
```

以上でビルドして利用することができます。

ちなみに、上記の場合はdrawableが固定なのでData Bindingを使わなくてもよくて、実際にはこのような時に効果が発揮されます。

```xml
app:srcCompat="@{item.isA ? R.drawable.imageA : R.drawable.imageB}"
```
Excel の WEBSERVICE 関数で簡易 Entity Linking

Excel の WEBSERVICE 関数を使って、任意のキーワードに対応する Wikipedia Japanese の URL を取得する方法を紹介します。ガチの [Entity Linking](https://en.wikipedia.org/wiki/Entity_linking) は自然文を解析してコンテクストに応じたリソースを取得するような高度な処理ですが、ここで紹介するのは「セルの値をコピーして検索フォームに貼り付けて Wikipedia のリンクを探すのつかれた、なんとかして」という声にこたえることを目的としています。


WEBSERVICE 関数については前稿 [Excel の WEBSERVICE 関数で外部データ取得] (http://qiita.com/frogcat/items/eddf5f8df4bba0419336) を参照してください。ちなみに Mac の Excel ではいまだサポートされていないようです。

# 1. シナリオ

以下のように A列に雑多なキーワードが並んだ Excel があります。B列に Wikipedia のへのリンクを埋めましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/13b9bde1-ed66-ca0b-7f61-7484c4166b93.png)


# 2. 手順

## 入力

セル **B1** に以下の式を入力します

```キーワードからWikipediaのページ名を取得.
="https://ja.wikipedia.org/wiki/" & FILTERXML(WEBSERVICE("https://ja.wikipedia.org/w/api.php?format=xml&action=query&redirects&titles=" & ENCODEURL(A1)),"//*[not(@missing)]/@title")
```

うまくいくと次のように URL がフィルされます

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/b4168691-7bc5-09e6-67b8-b60e76676224.png)



## コピー

**B1** を **B2～B19** にコピーすると以下のようにフィルされるはずです

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/f0248d4c-2a30-ae28-77d7-08f9f0e5dcad.png)


## 確認と手直し

フィルされた URL をそれぞれ確認しましょう。**たこ** や **ドラクエ** など、気になるものがありますね。

該当するページが存在しな場合には **#VALUE!** が表示されます。

またこの方法だとリンク先が **曖昧さ回避ページ** であるかどうかまではわからないので、念のため個別に確認するのがいいです。

# 3. 解説

ここで紹介した方法は [MediaWiki API:Query](https://www.mediawiki.org/wiki/API:Query) を使って、結果の XML から URL を作る、というものです。

具体的には以下のようなリクエストに対して

* [https://ja.wikipedia.org/w/api.php?format=xml&action=query&redirects&titles=なす](https://ja.wikipedia.org/w/api.php?format=xml&action=query&redirects&titles=%E3%81%AA%E3%81%99)

以下のような XML 出力が得られます。

```response.xml
<?xml version="1.0"?>
<api batchcomplete="">
  <query>
    <redirects>
      <r from="なす" to="ナス" />
    </redirects>
    <pages>
      <page _idx="1211" pageid="1211" ns="0" title="ナス" /> 
    </pages>
  </query>
</api>
```

ここに `//@title` という XPath を適用することで、Wiki のページタイトルを取得しています。で、`https://ja.dbpedia.org/wiki/` をアタマにつけて URL 化。

なお、リンク先のページがない場合には以下のように page 要素に missing 属性が付与されているので区別することができます。このような XML に対して `//*[not(missing)]/@title` という XPath を適用することで、missing 属性がついた要素は選択されない＝ EXCEL 関数上ではエラーとなる、という挙動を実現しています。

```missing.xml
<?xml version="1.0"?>
<api batchcomplete="">
  <query>
    <pages>
      <page _idx="-1" ns="0" title="該当なし" missing="" />
    </pages>
  </query>
</api>
```

なお、ここ紹介した方法は単純な文字列連結で URL を作っていますが、空白をアンダースコアに変換したり、 URL エンコードをしたりなど、用途に応じて必要な処理を追加するといいでしょう。


# 4. まとめ

* Wikipedia の API と Excel の WEBSERVICE 関数を使って、キーワードに対応する Wikipage を取得する方法を紹介しました
* `https://ja.dbpedia.org/wiki/` のかわりに `http://ja.dbpedia.org/resource/` を使うとより LOD/EntityLinking としては好ましいですがそれはまた別の機会に
* もっと高度な EntityLinking をお求めの方は <http://openrefine.org/> などをどうぞ
MacOSX上のEmacsで/tmp/以下のファイルにflymakeを適用すると死ぬ件の解決

筆者の手元のMacOSX上のEmacsで`/tmp/`以下のPHPファイルを開くと下記のようなエラーが出てflymakeが動いてくれないという問題がありましたが、これが解決できたという話です。

![flymake-error.png](https://qiita-image-store.s3.amazonaws.com/0/46856/c8c6f873-a78c-0a6f-371c-c819c68db08e.png)

この問題について以前flymakeの中身を追いかけたところでは、シンボリックリンクをうまく辿れないことによるflymakeのバグだという結論になりました。MacOSX上では`/tmp/`が`/private/tmp/`へのシンボリックリンクになっているので、`/tmp/`以下でだけこの問題が起きていたというわけです。とはいえこのバグを修正するほどの熱意もなかったので、諦めてそのまま使っていました。

しかし、Emacsの挙動を変更してシンボリックリンクを解決したパスでファイルオープンするようにすればこの問題は起きないはずです。そんな設定が「[find-file-visit-truenameを設定する - すぎゃーんメモ](http://d.hatena.ne.jp/sugyan/20120105/1325766364)」で紹介されていました。

```el
;; ファイルオープン時、シンボリックリンクを解決したパスで開く
;; http://d.hatena.ne.jp/sugyan/20120105/1325766364
(setq-default find-file-visit-truename t)
```

上記の設定をした結果、`/tmp/`以下のファイルに対してもflymakeが期待通り動くようになりました。やったね！
ownCloudにドキュメント編集機能を実装してみようと思った話

# はじめに
ownCloudは自前のサーバーに構築可能なクラウドストレージのPHPアプリケーションです。
今回の環境を構築した際の導入方法などについては[こちら](http://qiita.com/inductor/items/62b08813dc5cedf4ff34)をご覧ください。

# 今回やりたかったこと
ownCloudのWeb Intereface上で、Officeドキュメントを直接編集・保存できるようにする

# どうやるか
ownCloudの「アプリ」機能に[Documents](https://apps.owncloud.com/content/show.php/Documents?content=168711)なるものを発見した。
どうやら複数同時に編集もできるみたいなので採用することに！

ownCloud側での主な導入方法は[ここ](https://doc.owncloud.org/server/7.0/user_manual/documents.html)にあったので割愛

サーバー側にLibreOfficeまたはOpenOfficeの導入が必須だが、ownCloud構築済みのローカルサーバに入れるか別のサーバーに入れて連携させるかは設定で変更可能のようだ。
今回は個人用途なのでローカルで導入を・・・。

# いざやってみる
`sudo yum -y install libreoffice`でまずはLibreOfficeを導入
owncloudのconfig.phpに`whereis libreoffice`で出てきたファイルパスを記述
`'preview_libreoffice_path' => '/usr/bin/libreoffice',`

念のためphpとnginxを再起動して確かめてみるも失敗。。。
エラーを見ると、

```
Conversion test failed. Raw output:/usr/lib64/libreoffice/program/soffice.bin 
X11 error: Can't open display: Set DISPLAY environment variable,
use -display option or check permissions of your X-Server
(See "man X" resp. "man xhost" for details)
```

んん？GUIが無いって怒られてるのか？
調べてみるとownCloud側のconfigにOffice起動時のパラメータを指定して入れておくといいらしい・・・。
`'preview_office_cl_parameters' => '--headless'`と追記してもう一度やってみるがだめ

調べてみると以下のような内容を発見
>Traveling through the yum repositories, I’ve found the libreoffice-headless (it means the openoffice without ServerX) then I’ve installed it using this simple command:
>root@centos:/$ yum install libreoffice-headless

`sudo yum install libreoffice-headless`と叩いてからやってみると上手くいきました。
OkHttp3を学ぶ。①-2 (おまけ)mBaaSとも連携

AndroidでOkHttp(3.2)を学習するシリーズ,非本質的な,おまけ編。
[前回](http://qiita.com/kmry2045/items/870127b1dc6b25bbcbdf)は,MainActivity内のAsyncTaskからOkHttp通信を呼び出した。次の作業としては,activityからmodelにOkHttp通信コードを移すこと。...なのだが,androidでサーバー通信ネタを調べていたら,お手軽そうなmBaaS連携の記事を見つけてしまった : 
[Androidでデータをサーバに保存する最短方法とは？](http://qiita.com/thuydg@github/items/1b60bdfb3bc1dc795d64)
*->  ニフティクラウド mobile backend（NCMB）という,mBaaS へのお誘い記事。記事にある通り,数分でAndroidからニフティクラウド（NCMB）にデータ保存を開始できる。*

せっかくなので,こちらもMainActivity内に盛り込んでしまい,activityにてんこ盛り状態を味わってみることにした...ちょこちょこいじるだけで,OkHttp3+NCMB,あっけなく動作。

やっていること:  webからOkHttp3経由で画像をダウンロードし,ダウンロードした画像番号をNCMBに保存。
![NCMBOk.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/697007e8-129b-1c17-d468-bfa20936fbd0.png)

対応するNCMBの管理画面。ダウンロード記録がどんどん記録されている。
![NCMB_data.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/8407d528-274a-6d1f-2af9-7fe449f2abee.png)

たしかに,AndroidからNCMBへの保存は非常にお手軽。無償だし,今後も使っていきたい。のは良いが,OkHttp3と合わせたことで,ソースコード[MainActivity.java](
https://github.com/kmry/android_data_demo/blob/master/app/src/main/java/ncmbdataquick/mbaas/com/nifty/datastorequickstart/MainActivity.java)はいい感じに肥大している。

次回以降, このfattyなMainActivityをスリム化していきたい。ひとまずソース一式を,githubに置き,これをきれいにしていくこととしたい。

https://github.com/kmry/android_data_demo
git checkout できないとき、私はこうしてます。(※知ってる方法は２つ)

```git checkout master```

masterに限らない話ですが、
ブランチを切り替える時に下記エラーが出て切り替えられないことがあります。

```
error: Your local changes to the following files would be overwritten by checkout:
    abc.txt
    hogehoge.ctp
Please, commit your changes or stash them before you can switch branches.
error: The following untracked working tree files would be overwritten by checkout:
    abc.txt
Please move or remove them before you can switch branches.
Aborting
```

そんな時はこうしています

##  変更履歴を [スタック](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF) する  

```git stash save 'なんのスタックか自分がわかるメモ' ```  

- 変更履歴を戻すには(元のブランチに戻した時など)  
```git stash pop```  
※複数回スタック(```git stash```)していた時は :arrow_lower_left:     
```git stash list (スタックを確認)```  
```git stash pop [↑で確認したハッシュ値]```

<br>

## とりあえずコミットしておく(オススメ)  
上記```git stash```だと思わぬハプニングでスタックが消えてしまったら
変更履歴は消えちゃいます。 (普通は無いですが...)
なのでとりあえずコミットしておきましょう。
```git add -A```
```git commit -m '[コミットメッセージ]とりあえずのコミット！'```  

**※プッシュしてしまわないように気をつけてください！**

- 変更履歴を戻すには(元のブランチに戻した時など)  
コミットしたブランチに戻ってから  
```git reset --soft HEAD^```  
```git reset```

<br>

今回２つの方法を紹介しました。 
ですが、ちゃんとコマンドを理解して使わないと
せっかくの編集が消えちゃう可能性がありますので気をつけてください。  


### (追記)

２つ目の方法の続き。少し応用かもしれません。
違うブランチに変更内容を反映させたいときは、
一時的に作ったコミットを反映させたブランチにもってきてから
```reset --soft```すればできます。

```
git checkout [反映させたいブランチ]
git cherry-pick [一時的に作ったコミットのハッシュ値]
git reset --soft
git reset
```

<br>

----

### :smiley: 過去に書いた Git関連の記事 :arrow_double_down: 

[Qiita-何も知らない人がGitとGitHubを独学で知る](http://qiita.com/iKenji/items/367e8344490dd37e14f0)
[Qiita-プルリクエストで表示される差分の仕組みを GitHub に問い合わせたときの話](https://qiita.com/ikenji/items/7417d4f41ac8b564b36d)
[Qiita-ブランチ間の差分をコミット単位で知る・見る](https://qiita.com/ikenji/items/fecd39966bbf463da3f4)
[Qiita-git 差分を見る](https://qiita.com/ikenji/items/42248085c4f4b55660d6)
HTML,CSS勉強メモ #17 〜レスポンシブ〜

本日の勉強

##**進度**##
<dl>
<dt>レスポンシブなウェブサイトを作ろう</dt>
<dd>01:レスポンシブWebデザインとはなにか？</dd>
<dd>02:HTMLファイルを作ろう(1)</dd>
<dd>03:HTMLファイルを作ろう(2)</dd>
<dd>04:CSSファイルを作ろう</dd>
<dd>05:スタイルを振り分けよう</dd>
<dd>06:共通部分のスタイルを完成させよう</dd>
<dd>07:スマートフォン向けのスタイル</dd>
<dd>08:タブレット向けのスタイル</dd>
<dd>09:PC向けのスタイル</dd>
<dd>10:`iframe`を埋め込もう(1)</dd>
<dd>11:`iframe`を埋め込もう(2)</dd>
</dl>

##**メモ**##
###デベロッパーツールでスタイルを確認する

- レッスン内ではiOSシミュレーターを使っていますが・・・
 - 私はWindowsだし、なんか入れ方とか調べてたらまた時間かかりそうだなと思っていると、Chromeのデベロッパーツールでそれを見ることが出来ることを発見しました！
 - やり方は普通にデベロッパーツールを開いて、Ctrl+Shift+M(もしくはElementsの左のアイコン)で切り替えることができます。さらに上部のResponsiveボタンで表示デバイスを選べます。

###`display:none;`

- 07:スマートフォン向けのスタイルで使われていますが、どういうことなのか？
 - `display`:要素の表示形式を指定するもの
 - `none`:レイアウトに影響を与えることなく要素を非表示にする

###`<meta name="viewport" content="width=device-width, initial=1.0">`

- これもスマートフォン向け～のところで使われているけど、何が起きているのか？
 - `name="viewport":この`meta`データの種類は表示領域を示していますよ。
 - `content="width=device-width"`:デフォルトでは980pxなので、これをデバイスの幅にしてください。
 - `initial=1.0`:初期倍率を1.0にしてください。

＊調べた感じでは`width`と`initial`は必ずしも両方指定する必要はないようです。
　おそらく各ブラウザへ明示的に示していると言う感じではないかと・・・
＊`initial`と`initial-scale`が違うものなのか気になってちょっと時間使っちゃいました。
　同じもののようです。


１０，１１回の「`iframe`を埋め込もう」も終わってますが、`CSS`に書かれていることがどうなっているのか全然わからないので調べ中です。
時間がかかりそうなのでわかり次第書こうと思います。
cocoaアプリケーションをデスクトップに置く

調べても出てこなかったので質問サイトで聞きました…
![スクリーンショット 2016-04-15 18.53.16.png](https://qiita-image-store.s3.amazonaws.com/0/102145/58c4b180-72ea-9af3-3b02-52b10175f60e.png)

このproductsフォルダの中の
![スクリーンショット 2016-04-15 18.53.24.png](https://qiita-image-store.s3.amazonaws.com/0/102145/bae6efe9-0b3e-1899-1c6a-4516e136f822.png)

〇〇.appをデスクトップにドラッグアンドドロップするだけです。
〇〇.appの文字が赤くなりますが、Xcodeで実行すれば再生成されます。
jsonを含む Spark RDDを簡単にparseしてRDDにする。

- DataFrameを使って、case classを定義してなどでやるのをとりあえずおいておいて
- 単純にjson->scalaのデータにする。
- jupyter notebook上でやるなど

```
import scala.util.parsing.json.JSON

val jsonRdd = sc.textFile("なんか一行jsonになっているでかいデータ")

val parsedJsonRdd = rdd.map(JSON.parseFull(_))

parseJsonRdd.take(10).foreach(println)

```
かっこいい、作りたいサイト一覧

このサイトのモーション、デザインが好きです。ローディングも美しい。
http://www.felissimo.co.jp/500/

素晴らしい
http://leverages.jp/

ローディングのアニメーションがかわいい
http://studio-home.jp/

おもしろい世界観
http://www.kyoto-u.ac.jp/explore/

奥行き。ふわっと感がいい
http://design.hmk84.com/

ヘッダーの開閉アニメーションが面白い
https://healthcareiotcons.com/


https://crossme.jp/
https://uzuz.jp/
http://waaark.com/

http://brand.denso.com/ja/
小ネタ Elixirからkubernetesのapiを叩きはじめた

kubernetes環境がわらわら立ち始めてきたので、プログラミングしながら触ってみたいな、ということでよさ気なライブラリを探しましたがまだ更新系はそんなにないみたいです。

kubectlを叩くのもいいのですが、標準出力されるメタデータの形式をシェル等でいじるのも面倒です。。

そこで、REST APIを叩いてみることにしました。

なお、rest 一覧は、localhost:8080 でk8sを立てたら、

* http://localhost:8080/swagger-ui

で確認が可能になります。

httpoisonとpoisonがあればいけるので、mix.exsを、以下のようにして

```mix.exs
  def application do
    [applications: [:logger, :httpoison]]
  end

  defp deps do
    [
      {:httpoison, "~> 0.8.0"},
      {:poison, "~> 2.0"}
    ]
```

例えば下記みたいなことをしてみました。

```ex
def ExK8S

  @base_url  "localhost:8080/apis/extensions/v1beta1/namespaces/default" 

  def show_deployments do
    url = @base_url <> "/deployments"

    case HTTPoison.get(url) do
      {:ok, response} ->
        IO.puts(response.body)

      {:error, error} ->
        IO.inspect(error.reason)
    end
  end
```

上記を実行すると、

```json
{
  "kind": "DeploymentList",
  "apiVersion": "extensions/v1beta1",
  "metadata": {
    "selfLink": "/apis/extensions/v1beta1/namespaces/default/deployments",
    "resourceVersion": "543"
  },
  "items": [
    {
      "metadata": {
        "name": "nginx",
        "namespace": "default",
        "selfLink": "/apis/extensions/v1beta1/namespaces/default/deployments/nginx",
        "uid": "2403844c-02e8-11e6-9089-9c5c8e718ea8",
        "resourceVersion": "267",
        "generation": 2,
        "creationTimestamp": "2016-04-15T08:57:54Z",
        "labels": {
          "run": "nginx"
        },
        "annotations": {
          "deployment.kubernetes.io/revision": "1"
        }
      },
      "spec": {
        "replicas": 1,
        "selector": {
          "matchLabels": {
            "run": "nginx"
          }
        },
        "template": {
          "metadata": {
            "creationTimestamp": null,
            "labels": {
              "run": "nginx"
            }
          },
          "spec": {
            "containers": [
              {
                "name": "nginx",
                "image": "nginx",
                "ports": [
                  {
                    "containerPort": 80,
                    "protocol": "TCP"
                  }
                ],
                "resources": {},
                "terminationMessagePath": "/dev/termination-log",
                "imagePullPolicy": "Always"
              }
            ],
            "restartPolicy": "Always",
            "terminationGracePeriodSeconds": 30,
            "dnsPolicy": "ClusterFirst",
            "securityContext": {}
          }
        },
        "strategy": {
          "type": "RollingUpdate",
          "rollingUpdate": {
            "maxUnavailable": 1,
            "maxSurge": 1
          }
        }
      },
      "status": {
        "observedGeneration": 2,
        "replicas": 1,
        "updatedReplicas": 1,
        "availableReplicas": 1
      }
    }
  ]
}
```

と、Jsonがそのまま取れました。

お、いけそうじゃん、ということで、rolling update等をよしなに実行できるかを今後は実験していきたいと思います。

---

本日は以上です。
複数あるGeometryをまとめあげる


# 前提
- three.js [Release r74 · mrdoob/three.js](https://github.com/mrdoob/three.js/releases/tag/r74)


# 課題
1つの要素なんだけど、諸般の事情により複数のGeometryとして定義されてしまっているものを、1つのGeometryとして作り直したい。

実例としては、GeoJsonで定義されている世界地図を、D3.jsで投影して、それをThree.jsに読み込ませるとき、国ごとに1つのオブジェクトになってしまっているので、おそらくGeometryの数だけ処理が重くなる。それを1つのGeometryにすることで、多少なりとも処理や管理を簡単にしたい。

# 手法
```javascript
var geoms = getMultipleGeometries(); // returned multiple geometries, created yourself.

var merged_geom = new THREE.Geometry();
var matel = new THREE.MeshBasicMaterial();

$.each(geoms, function(i, geom ){
  // mergeするGeometryの座標管理のため、一旦Mesh化する
  var mesh = new THREE.Mesh( geom, matel);
  mesh.updateMatrix();
  
  merged_geom.merge( mesh.geometry, mesh.matrix);
});

var trueMesh = new THREE.Mesh( merged_geom, matel);
scene.add( trueMesh ); // scene is Scene instance in three.js
```

Meshを2度作らなきゃいけないのが納得できないが、``THREE.GeometryUtils.merge()``が廃止されたようなので、結局こうしないといけないっぽい。
bundlerでGemの相関図を出力する

`$ bundle viz` コマンドを使えば良い。

http://bundler.io/v1.11/bundle_viz.html

使用するには `graphviz` と `ruby-graphviz`が必要なのでインストールしておく。

```
$ brew install graphviz
$ gem i ruby-graphviz
```

オプションがいくつかあり、便利そうなのは

-f ... ファイル名を指定する
-F ... フォーマットを指定する。png, jpg, svg, dot
-v ... Gemのバージョンを表示する
--without= ... 指定したグループを除外する

あたり。例えばRails-4.2.6で`rails new`した時のGemのグラフは以下のようになる。

```
$ bundle viz -v
```

![gem_graph.png](https://qiita-image-store.s3.amazonaws.com/0/7630/9aedba5a-9817-ff05-b46b-69c22975464b.png)
MacにAptana Studio 3 (3.6.1)をInstallしようとしたら、JNI_CreateJavaVM.symbolがないというAlertが出て立ち上がらない問題の解決策メモ

# Aptana
 Ruby on Railsは、ふだんは仕事の関係でScientific Linux上でAptana 3.4.1を使っています。ちょっと古いバージョンを使う理由は、なぜか3.6だと(Javaとの整合の問題らしく)編集しようとするとAptanaが落ちるためでした。

今回別件でMac上で直接Ruby on Railsを走らせようと、Aptana 3.6.1をDownloadし、dmgからApplication Folderに移そうとしたら、以下のAlertが出ました。
さて、どうしたものか、という自分用メモ。

# 現象

```Alert
The JVM shared library "/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/../jre/lib/server/libjvm.dylib" does not contain the JNI_CreateJavaVM.symbol.
```

# 環境
Mac OS El Capitan (Version 10.11.4)

bashを開いて java -versionでバージョンを確認すると
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

envで環境変数を見ると
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home

特に問題はないと思うのだが・・・。Aptana 3.6.1のダウンロードを見ると、
Aptana 3.6.1
System Requirements
Mac OS X 10.5 or better, Java 1.6
要するに、Java 1.6でないから、編集していて落ちたりしたのか、と合点がいった。

# ググってみたら
さて、どうしようか。
Aptana 3.6.1 Mac does not contain the JNI_CreateJavaVM.symbol
（まんま）で検索すると、stack overflowで、まんまの質問があった。
http://stackoverflow.com/questions/25914757/osx-yosemite-jvm-shared-library-does-not-contain-the-jni-createjavavm-symbol

以下のサイトからJavaForOSXを取得、再インストールして、rebootしろと・・・
https://support.apple.com/kb/DL1572?locale=en_US
英語よりも日本語がいい。
https://support.apple.com/kb/DL1572?locale=ja_JP
として、表示させました。（表示が日本語になるだけでなく、パッケージのインストーラも日本語でした。）
このURLにつなぐと、レガシーシステム用にJavaの1.6を入れるといってくる。いや、Mac自身のJavaは1.8がいい。変えたくないなぁ。

もう少し探すと、AptanaStidio3.iniを編集して、

```AptanaStudio3.ini
-vm /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java
```

を一行追加しろと、Aptanaに1.6.0.jdkを使わせろ、と書かれていました。これでいくか。
# JavaForOSX.pkg
拡張子がpkgってことは、インストーラ？もしかして、これを走らせると、1.8.0のJavaの環境が1.6.0に置き換わっちゃうの？と、不安を抱えつつ、インストール。あっという間に終わった。不安を抱えつつ、 java -versionで確認すると、1.8.0, envも書き換わっていない。やったね！という訳で、念を入れてMacを再起動。
セーフ！大丈夫、java -versionは変わっていませんでした。
あとは、Aptanaだけ1.6のバージョンを使わせればいい。

うまく起動しました。何というか、ツールが指定しているバージョンをきちんと確認しなかった私が悪い、っていう感じでした。

さて、あとはpleiadesをインストールして、日本語化したらOK。こっちは、Eclipseで何度もやっているから、たぶんすんなりいくでしょう。（すんなりいって欲しい・・・）

何かのご参考までに・・・

実は、私はこの書き込みがQiitaデビューです。読んでくださっている方がいらっしゃるなら、絶対に僕より若いと思うけれど、ブランクの長い僕にとっては、皆さんみんなが先輩です。諸先輩がた、どうぞ、よろしくお願いいたします。