OmniAICreator/Qiita-1.07M huggingface dataset:
Android Httpでデータ取得

#HTTP通信

前回のボタンでのテキスト変更を一部変更して、
HTTP通信で取得してきたテキストに変更するにようにします。
※[Android ボタン押下時の動作](http://qiita.com/yamikoo@github/items/0a023ff6e7f6d0a4ee12)

![TextView_HelloWorld.gif](https://qiita-image-store.s3.amazonaws.com/0/15564/a33e518e-072e-d4a9-7972-b1067329b747.gif)

#実装
まず、Manifestにinternet許可の設定を追記します。

```xml:AndroidManifest.xml一部抜粋
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.qiita.qiita">

    <uses-permission android:name="android.permission.INTERNET" />
```

AndroidのメインスレッドでHTTP通信を実行すると
「NetworkOnMainThreadException」の例外が発生します。
その為、別のスレッドで実行する必要があります。
今回はAsyncTaskを継承して実装します。

###AsyncTaskの主な処理
上から順に呼び出されます。
####・onPreExecute()
　　メインスレッドで実行され、非同期処理の前処理
####・doInBackground()
　　非同期で処理したい内容を記述します。abstractメソッドの為、実装が必須。
####・onProgressUpdate()
　　メインスレッドで実行されます。
　　doInBackground()で、publishProgress()が呼ばれた場合に処理されます。
　　進捗状況などをプログレスバーで表示する際などに使用します。
####・onPostExecute()
　　doInBackgroundメソッドの実行後にメインスレッドで実行されます。
　　doInBackgroundメソッドの戻り値をこのメソッドの引数として受け取ります。

AsyncTaskの引数は＜doInBackgroundの引数,onProgressUpdateの引数,onPostExecuteの引数＞となっています。

ここでは
doInBackgroundで引数のURLを使用してHTTPリクエストを実施し、結果を戻り値とします。
onPostExecuteにて戻り値をTextViewにセットしています。

```java:AsyncHttpRequest.java
package com.example.qiita.qiita;

import android.app.Activity;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


public class AsyncHttpRequest extends AsyncTask<String, Void, String> {
    private Activity mActivity;

    public AsyncHttpRequest(Activity activity) {
        mActivity = activity;
    }

    @Override
    protected String doInBackground(String... params) {
        HttpURLConnection connection = null;
        StringBuilder sb = new StringBuilder();
        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            InputStream is = connection.getInputStream();

            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String line = "";
            while ((line = reader.readLine()) != null)
                sb.append(line);
            is.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            connection.disconnect();
        }
        return sb.toString();
    }

    public void onPostExecute(String string) {
        ((TextView)mActivity.findViewById(R.id.textview)).setText(string);
    }
}
```

Activityは前回のテキストを変更しているリスナーを変更をして、
AsyncHttpRequestを呼び出します。（Hello world!!を返却するだけのURLを引数に指定）

```java:MainActivty.java

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    　　　　　　　　new AsyncHttpRequest(self).execute("https://xxxxxxx.herokuapp.com/xxxx/");
    }
});
```


###Developers
・AsyncTask
https://developer.android.com/reference/android/os/AsyncTask.html
[Unity]FPS(Frames Per Second)上限を外したい

Unityの初期設定では、FPSはモニタのリフレッシュレートに固定されています。
ゲームを作るとかなら固定で良いと思うのですが、FPSを計測して処理速度を比較したい！といった時なんかは上限を取り払いたいですね。

![スクリーンショット 2017-02-01 02.07.08.png](https://qiita-image-store.s3.amazonaws.com/0/157713/d0526bc6-eac0-5a13-9374-d0b58aae2316.png)

図のように左上のタブから辿っていき、Qualityを選択。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/157713/9d7fddf7-51dc-34a5-3ad2-3b6cf1ea3694.png)

その後、V Sync Count のタブから、Don't Sync を選択。
これでFPS上限を解放できます。
[Unity]Google Cardboard SDKを使ってAndroid用にBuildする際の注意点[備忘録]

Google Cardboard SDK for Unity (v1.10) を使ってAndroid用にゲームをBuildする時に引っかかった箇所のメモ
（増えたらまた追記していくスタイル）

#症状 一覧
- 本体を傾けると画面まで回っちゃう…（しかもタブで変更できない…）
- "unable to merge android manifests see the console for more details" って怒られるけど何なん！


# 画面を傾けると画面まで回っちゃう…（しかもタブで変更できない…）
スマフォでVRする時は（視点は回転させるけど）画面を回転させないためにDefault Orientationを固定しなきゃいけない。

![a.PNG](https://qiita-image-store.s3.amazonaws.com/0/157713/ba85dc9f-7fa2-ebcd-9f86-8ae4d9406c91.png)

できないいいいいいいいいいいい
なんでええええええええええええああああああああああああああ

ここが原因でした

![s.PNG](https://qiita-image-store.s3.amazonaws.com/0/157713/ea667e2f-294e-75c8-ab9e-cc32267db1b2.png)

チェックを外すと…

![b.PNG](https://qiita-image-store.s3.amazonaws.com/0/157713/fabaac20-24ae-894d-a8ac-b58c5165a989.png)

![スクリーンショット 2017-02-01 01.14.28.png](https://qiita-image-store.s3.amazonaws.com/0/157713/d4b515d6-22d6-b23f-79cf-87ced05c4efa.png)


できた！！！！！！！！！！！！！！！！！！！！！
（自分でチェック入れてたような気もする。Androidの時は毎回チェックしよう。）


#"unable to merge android manifests see the console for more details" って怒られるけど何なん！

Buildしてたら途中で"unable to merge android manifests see the console for more details"と表示されてエラーになった！！

こちらに解決策が載っていました。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10168573200

なるほど、
Assets > Plugins > Android > gvr-permissionsupport-release.aar
をDeleteすればいいんですね。
今回のケースではこれで無事解決。
rpmをlessで開いてみた


ruby-1.9.3-p545.tar.gzのrpmを作成していて試しにlessで見てみた

~~~
$ less ruby-1.9.3p545-1.el6.x86_64.rpm
~~~


以後、中身。

~~~
Name        : ruby                         Relocations: (not relocatable)
Version     : 1.9.3p545                         Vendor: (none)
Release     : 1.el6                         Build Date: 2017年01月31日 17時52分26秒
Install Date: (not installed)               Build Host: an-vs1-g21
Group       : Development/Languages         Source RPM: ruby-1.9.3p545-1.el6.src.rpm
Size        : 257559903                        License: Ruby License/GPL - see COPYING
Signature   : (none)
URL         : http://www.ruby-lang.org/
Summary     : An interpreter of object-oriented scripting language
Description :
Ruby is the interpreted scripting language for quick and easy
object-oriented programming.  It has many features to process text
files and to do system management tasks (as in Perl).  It is simple,
straight-forward, and extensible.
* 木  9月 19 2013 Daniel Haskin <djhaskin987@gmail.com> - 1.9.3-p448
- Added man pages entries

～　省略　～

* 金  2月 24 2012 Ian Meyer <ianmmeyer@gmail.com> - 1.9.3-p125-1
- Spec to replace system ruby with 1.9.3-p125

drwxr-xr-x    2 root    root                        0  1月 31 17:52 /usr/bin
-rwxr-xr-x    1 root    root                     4393  1月 31 17:51 /usr/bin/erb
-rwxr-xr-x    1 root    root                      542  1月 31 17:51 /usr/bin/gem
-rwxr-xr-x    1 root    root                      314  1月 31 17:51 /usr/bin/irb
-rwxr-xr-x    1 root    root                     1227  1月 31 17:51 /usr/bin/rake
-rwxr-xr-x    1 root    root                      784  1月 31 17:51 /usr/bin/rdoc
-rwxr-xr-x    1 root    root                      184  1月 31 17:51 /usr/bin/ri
-rwxr-xr-x    1 root    root                     5344  1月 31 17:52 /usr/bin/ruby
-rwxr-xr-x    1 root    root                      294  1月 31 17:51 /usr/bin/testrb
drwxr-xr-x    2 root    root                        0  1月 31 17:51 /usr/include
drwxr-xr-x    2 root    root                        0  1月 31 17:51 /usr/include/ruby
drwxr-xr-x    2 root    root                        0  1月 31 17:51 /usr/include/ruby/ruby-1.9.1
drwxr-xr-x    2 root    root                        0  1月 31 17:51 /usr/include/ruby/ruby-1.9.1/ruby
-rw-r--r--    1 root    root                      834  1月 25  2010 /usr/include/ruby/ruby-1.9.1/ruby.h
drwxr-xr-x    2 root    root                        0  1月 31 17:51 /usr/include/ruby/ruby-1.9.1/ruby/backward
-rw-r--r--    1 root    root                      529  6月 18  2011 /usr/include/ruby/ruby-1.9.1/ruby/backward/classext.h

～　省略　～

drwxr-xr-x    2 root    root                        0  1月 31 17:51 /usr/share/ri/1.9.1/system/fatal
-rw-r--r--    1 root    root                      396  1月 31 17:50 /usr/share/ri/1.9.1/system/fatal/cdesc-fatal.ri

~~~

「rpm -qlp」でみていた自分が悲しい・・・

ファイルの権限とかもみれるじゃん・・・・
[Rails] Assets Precompile時にExecJS::ProgramError: Unexpected token operator «=», expected punc «,» というエラーで失敗する

## 現象

環境: Amazon Linux AMI 2015.09 release node
Asset Precompile時に以下のエラーがでてこける。

```
ExecJS::ProgramError: Unexpected token operator «=», expected punc «,»　(line: 46689, col: 76, pos: 1683118)
```

エラー発生行数が出ているので簡単かと思いきや、これは結合途中のもので全くあてにならないため、一筋縄では見つからず雲中模索していた。


## 解決方法

rails consoleでuglifyを直接実行することで、ファイルを特定することができた。

http://stackoverflow.com/questions/30422437/execjsprogramerror-unexpected-token-punc-expected-punc-when-running


```
bundle exec rails c -e production
```

```rb
JS_PATH = "app/assets/javascripts/**/*.js"; 
Dir[JS_PATH].each do |file_name|
  puts "\n#{file_name}"
  puts Uglifier.compile(File.read(file_name))
end
```

これを実行すると、今度はファイル名とその後にファイル単体でのエラー行数が表示される。

```
app/assets/javascripts/path/to/hoge.js
ExecJS::ProgramError: Unexpected token operator «=», expected punc «,» (line: 131, col: 76, pos: 3564)
```

ちなみに原因は以下のように、es5で対応していない関数のデフォルト値入力でエラーになっていた。
chromeだとエラーが起こらないのと、precompileもenv=developmentだと普通に通ってしまうようなので厄介。

```js
function hoge(a, b = 0) {
...
}
```

## 事前対策

検討中
なにかいい方法があれば教えてくださいm(__)m

Webサービスを1年ほど運用中で、
JSに関しては最近 [Shopify/sprockets-commoner](https://github.com/Shopify/sprockets-commoner) を使ってes6の導入を始めたんですが、既存部分の多くはes5で書かれていて、絶賛移行途中といった状況です。
Evilで、スペースキーを起点としたキーバインドがかなり快適

これを書いたら、EmacsでSpacemacsっぽい挙動になってめっちゃ快適。
素直にSpacemacs使えよって話ですが・・・

```lisp:~/.emacs.d/init.el
(require 'evil)
(evil-mode t)

(if (evil-mode)
    (progn
      (bind-keys :map evil-visual-state-map
                 ("TAB" . indent-for-tab-command))
      (bind-keys :map evil-normal-state-map
                 ("SPC b" . ido-switch-buffer)
                 ("SPC f" . projectile-find-file)
                 ("SPC a" . helm-do-ag-project-root)
                 ("SPC x" . smex)
                 ("SPC s" . save-buffer)
                 ("SPC d" . dired-jump)
                 ("SPC k" . kill-this-buffer)
                 ("SPC r" . ido-recentf-open)
                 ("SPC 1" . delete-other-windows)
                 ("SPC 0" . delete-window)
                 ("SPC q" . delete-frame)
                 ("SPC t" . xref-find-definitions-other-window)
                 ("SPC y" . browse-kill-ring)
                 ("SPC u" . undo-tree)
                 ("TAB" . indent-for-tab-command))
      (bind-keys :map evil-insert-state-map
                 ("C-g" . evil-normal-state)))
```

ただ、相性の問題なのか、`web-mode`でちょいちょい不具合が起こったので、Evilを使うのはやめておきます。

GUIのEmacsならもうちょっとまともに動くかもしれない。

# ポエム

しかしながら、Vimの操作性も捨て難いですな。
`ci(`とか、テキストオブジェクトの使い勝手が良い。
あとは`gi`、`gv`、`dd`あたりがやっぱり馴染むなあ。

究極カスタマイズした、こちらの記事も気になる。

Emacsでのmyvim-mode、その結果のガラパゴスインターフェース
http://d.hatena.ne.jp/mizchi/20100807/1281106431

スペースキーは押しやすいから、もっと使っていきたいんだよなあ。

`evil-mode`からインサートした時に、`evil-mode nil`したいんだけどやり方がわからない。

```lisp
(bind-key* "ESC" evil-mode)
(add-hook 'evil-insert-mode-hook 
          (lambda() (evil-mode nil)))
```

みたいなことがしたいんだけど、やり方が分からない。

`post-command-hook` 使えばいいのか・・・？

* 追記

普通にできました。

```lisp
(defalias 'evil-insert-state 'evil-emacs-state)
(define-key evil-emacs-state-map (kbd "<escape>") 'evil-normal-state)
```

Spacemacsの `C-z` が `evil-emacs-state` に割り当てられていたので、見つかった。

http://stackoverflow.com/questions/25542097/emacs-evil-mode-how-to-change-insert-state-to-emacs-state-automaticly
selectのonChangeがpopupBlockされるのを甘んじて受け入れる

したかったこと
===

簡易メニュー的なの。
select-optionで選択された画面を開くようにしたい。


最初に書いたコード
---

```html
<select onChange='window.open(this.options[this.selectedIndex].getAttribute("url"),this.value)'>
<option value='a' url='./a'>A</option>
<option value='b' url='./b'>B</option>
</select>
```

面倒なのでoptionに適当なattributeもたせて、それ参照させる、

しかし、これだと、動かない。ウンとも、スンとも。
onChangeはuserのdirect actionでないので、Safariはwindow.openをブロックします。
うん、まあそうだな。仕方ないな。

onClickにする
===

```html
<select onClick='window.open(this.options[this.selectedIndex].getAttribute("url"))'>
<option value='a' url='./a'>A</option>
<option value='b' url='./b'>B</option>
</select>
```

よし、完璧。
そのはずだった。
しかし、世界にはWindowsとかいうクs…残念が。

selectの横にプルダウンできそうなアイコンを表示してくれて
実際クリックでプルダウンできるのだが、プルダウン開いた瞬間にonClickが走る。
＊MacのSafariだとプルダウンを閉じるまで待ってくれる。

クリックでなく、マウスボタンを離さずにプレス、ドラッグで選択する分には問題ない。
が、普通に考えてユーザーがそんな面倒をしてくれるとは思えないので、本当にwindowsとか以下略。

つまり
===
- onClickにするとwindowsで問題が出る
- onChangeにするとSafari(Chromeも?)で無言でpopup-blockされる

妥協策
===

```js
function openOthers(item){
	var selector = document.getElementById('selector')
	var btn   = document.getElementById('btn')
	var url = selector.options[selector.selectedIndex].getAttribute("url")
	var kind = selector.options[selector.selectedIndex].getAttribute("value")
	var w = window.open(url,kind);
	if(!w){
		btn.style.display=''
		return
	} 
	btn.value = '{{defaultValue}}'
	btn.style.display='none'
}
```

```html
<select onChange='openOthers(this)'>
<option value='a' url='./a'>A</option>
<option value='b' url='./b'>B</option>
</select>
<input type='button' id='btn' onClick='openOthers(this)' style='display:none' value='開く'>
```

Windowsとかいうのに遠慮して、ブロックされる前提で開く。
ブロックされたらwindow.openに返値がnullかなんかになるので
それを拾って横に送信ボタン的なのを出す。
送信ボタン的なのはonClickなのでdirect actionとしてブロックされない。

FireFoxとかだとポップアップブロックしました、の通知バーが出てそこで止まるみたい。IE Edgeでもそうなるみたいね。

利用ユーザーがwindows多そうだったから妥協した。いや、無理っすねえ。何も起きない方が問題ですしねえ。で押し通すところ。

他に良い方法、あったら教えて欲しいです。
Raspbinan JessieLite にanyenvを使ってPHP 7.1.1をインストールする

#概要
RaspberryPiのOS=RaspbianにPHP7.1.1をインストールします。

rubyでは有名なrbenvなるものがある様に、
php版のphpenvがありましたので、[自分のruby環境と同じ様に](http://qiita.com/KurokoSin/items/3c5ce6e212b9f6d3d09c)
インストールします。

ところが、いざやってみるとrbenvとphpenvが競合してしまい、
ロクに使えません。調べてみると**env系をまとめて扱える[anyenv](https://github.com/riywo/anyenv)の存在に出会いました。
素晴らしい！
というわけで、anyenvを使ってphpをインストールします。

#インストール手順
##ユーザアカウント作成
```
$ sudo bash
$ mkdir /opt/php
$ useradd -r -g web -d /opt/php -s /usr/sbin/nologin php
$ exit
```

##anyenvインストール
```
$ sudo bash
$ cd /opt
$ mkdir anyenv
$ git clone https://github.com/riywo/anyenv /opt/anyenv 
$ vi /etc/profie.d/anyenv.sh
```
> ```
> export ANYENV_ROOT="/opt/anyenv"
> export PATH="$ANYENV_ROOT/bin:$PATH"
> eval "$(anyenv init -)"
> ```

```
$ chmod -R a+w /opt/anyenv/
$ exit
$ exec $SHELL -l
```

##phpenvインストール
```
$ anyenv install phpenv
$ exec $SHELL -l
```
##phpインストール
```
$ sudo apt-get install libxml2-dev re2c libcurl4-openssl-dev libjpeg-dev libmcrypt-dev libtidy-dev 
$ phpenv install 7.1.1
```
```
-----------------------------------------
configure: WARNING: unrecognized options: --with-mysql
configure: WARNING: unrecognized options: --with-mysql
/tmp/php-build/source/7.1.1/ext/mysqlnd/mysqlnd_ps_codec.c: In function ‘mysqlnd_stmt_execute_store_param_values’:
/tmp/php-build/source/7.1.1/ext/mysqlnd/mysqlnd_ps_codec.c:790:6: warning: right shift count >= width of type
      int8store(*p, Z_LVAL_P(data));
      ^
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
-----------------------------------------
```
なんとか入りました。Warningが残っているのであまりいい感じでは無いですが。。。
とりあえずインストールは終わりましたので、またの機会に対処しようと思います。

###　アップデート
```
$ phpenv rehash
$ cd /opt/anyenv/envs/phpenv
$ git pull
```



### （補足）rbenvとphpenvが競合している時にphp-buildを行なった結果
```
$ git clone https://github.com/php-build/php-build.git /opt/php/.phpenv/plugins/php-build
$ phpenv rehash
$ phpenv install --list
phpenv v0.0.4-dev

$
```
インストール可能なバージョンが見つかりませんでした。。。。
Ubuntu 16.04 LTSになでしこ2をインストールする方法

日本語プログラミング言語[なでしこ](http://nadesi.com/)の後継版[なでしこ2](http://nadesi.com/dev/wiki/index.php?%E3%81%AA%E3%81%A7%E3%81%97%E3%81%932.0)をUbuntu 16.04 LTSにインストールする方法についてまとめます。

#手順
1. 以下のコマンドを実行し、必要なパッケージをインストールします。

```bash
$ sudo apt install mono-complete mono-vbnc git
```

1. 以下のコマンドを実行し、なでしこ2をダウンロードします。

```bash
$ git clone https://github.com/kujirahand/nadesiko2.git
```

1. 以下のコマンドを実行し、カレントディレクトリを移動します。

```bash
$ cd nadesiko2/cnako2
```

1. 以下のコマンドを実行し、なでしこ2をコンパイルします。

```bash
$ xbuild /p:TargetFrameworkVersion="v4.5"
```

#動作確認
以下のようになればインストール成功です。

```bash
$ ./bin/Debug/cnako2.exe -e 3に5を足して表示
8
```

#参考文献
* [なでしこ2/Ubuntu - なでしこ:日本語プログラミング言語](http://nadesi.com/dev/wiki/index.php?%E3%81%AA%E3%81%A7%E3%81%97%E3%81%932%252FUbuntu)
* [c# - Compiled mono missing default .NET libraries - System.Object is not defined or imported - Stack Overflow](http://stackoverflow.com/questions/27594393/compiled-mono-missing-default-net-libraries-system-object-is-not-defined-or-i)
Karabiner の Command+Q なあれ（Hammerspoon版）

Sierra にアップグレードして困らないための準備
`Press Command+Q twice to Quit Application`　の代替

## 前準備

[Hammerspoon](http://www.hammerspoon.org/) のインストール

```
$ brew cask install hammerspoon
```

## init.lua

```lua:init.lua
local quitModal = hs.hotkey.modal.new('cmd','q')

function quitModal:entered()
    -- hs.alert.show("Press Cmd+Q again to quit", 1)
    hs.timer.doAfter(1, function() quitModal:exit() end)
end

local function killApp()
    hs.console.printStyledtext('killApp')
    hs.application.frontmostApplication():kill()
    quitModal:exit()
end

quitModal:bind('cmd', 'q', killApp)
quitModal:bind('', 'escape', function() quitModal:exit() end)

```

## 参考情報

* https://github.com/raulchen/dotfiles/blob/master/hammerspoon/double_cmdq_to_quit.lua ･･･ 他のスクリプトも参考になる
複数のマスタについて、一つのSQLで一括でコード→名称の変換がしたい。

結論: DUALを使用した

ちょっと悩んだポイントとしては、それぞれが独立なマスタなためどれか一つを主としてJOINする方式では主としたテーブルに対するWHERE句が思い浮かばなかった。
存在しないと全体の結果が空になる。

SELECT HOGEHOGE_MEI, HUGOHUGO_MEI 
FROM M_HOGEHOGE 
LEFT JOIN M_HUGOHUGO ON HUGOHUGO_CODE = :HUGOHUGO_Code 
WHERE HOGEHOGE_CODE = :HOGEHOGE_Code 

色々整形しているうちに、結合したマスタの数だけ行数が出てきたり(n行目はテーブルnの名称以外はNULL)とうまくいかない。

↓

常に1行の結果を返すというDUALを使い、そこにそれぞれのマスタをJOINする方式に変更。

SELECT 
  HOGEHOGE_MEI 
  , HUGOHUGO_MEI 
  , HOGAHOGA_MEI 
  , HUGIHUGI_MEI 
  , HOGUHOGU_MEI 
FROM (
SELECT 1 
  , T1.HOGEHOGE_MEI 
  , T2.HUGOHUGO_MEI 
  , T3.HOGAHOGA_MEI 
  , T4.HUGIHUGI_MEI 
  , T5.HOGUHOGU_MEI 
FROM DUAL 
LEFT JOIN M_HOGEHOGE T1 ON T1.HOGEHOGE_CODE = :HOGEHOGE_Code 
LEFT JOIN M_HUGOHUGO T2 ON T2.HUGOHUGO_CODE = :HUGOHUGO_Code 
LEFT JOIN M_HOGAHOGA T3 ON T3.HOGAHOGA_ID = :HOGAHOGA_Id 
LEFT JOIN M_HUGIHUGI T4 ON T4.HUGIHUGI_ID = :HUGIHUGI_Id
LEFT JOIN M_HOGUHOGU T5 ON T5.HOGUHOGU_ID = :HOGUHOGU_Id

望んだとおりの出力が得られた。
存在しないコードのもののみNULLとなり、一行で全部帰ってくる。

もっといい方法とか、DUALなしでもうまくやる方法とありそう・・・。
diff コマンドの仕組みを知りたい。あわよくば挙動を変えられるのかどうかも知りたい。

## diff で、自分が望んでいるのとは違う認識をされてしまう
git diff とかをする時、下のような表示をよく見かける。

```diff
--- /dev/fd/63	2017-01-31 23:30:32.000000000 +0900
+++ /dev/fd/62	2017-01-31 23:30:32.000000000 +0900
@@ -6,4 +6,9 @@

 func main() {
 	fmt.Println("Learn about `git rebase`")
+	A()
+}
+
+func A() {
+	fmt.Println("Commit A")
 }
```

本来、コードを追加した感覚的には下のような diff 表記となってくれるとスッキリするのだけども。。。

```diff
--- /dev/fd/63	2017-01-31 23:30:32.000000000 +0900
+++ /dev/fd/62	2017-01-31 23:30:32.000000000 +0900
@@ -6,4 +6,9 @@

 func main() {
 	fmt.Println("Learn about `git rebase`")
+	A()
 }
+
+func A() {
+	fmt.Println("Commit A")
+}
```

StackOverFlow あたりでちょっと調べてみた感じでは、 「diff (少なくとも git-diff) のアルゴリズムは、差分をできるだけ少なく、まとまった単位で表示しようとするから」みたいな感じの回答があったけど、実際どうなんでしょう？
WordpressのJP Markdownをカスタムフィールドでも使う方法

JP Markdownは便利なのですが記事本文とコメントでしか使えません（たぶん）。
カスタムフィールドでもMarkdownを使いたかったので無理矢理実装しました。

```php
require( WP_PLUGIN_DIR.'/jetpack-markdown/markdown/lib/extra.php' );
require( WP_PLUGIN_DIR.'/jetpack-markdown/markdown/lib/gfm.php' );
$md = new WPCom_GHF_Markdown_Parser();

// $str の中にはカスタムフィールドから取り出した文字列を入れてあると思ってください
echo $md->transform( $str );
```

もっとエレガントなやり方があったらぜひ教えてください。
俺得メモ : UbuntuでNVIDIAのグラフィックボードを認識させる

※この記事はysakさんの記事を参考に書いています。

UbuntuのパソコンにNVIDIAのグラフィックボードを認識させる方法を簡単に説明します。

>sudo apt-get install nvidia-367
sudo apt-get install mesa-common-dev
sudo apt-get install freeglut3-dev

まずはGeForceのグラフィックドライバーをインストールします。

>sudo apt install linux-generic
sudo apt install nvidia-cuda-toolkit

CUDAを導入するにはこのコマンドを入力します。
(わからなければとりあえず入れましょう。困ることはありません。)

![1.png](https://qiita-image-store.s3.amazonaws.com/0/161123/72460df0-af6c-3906-20c7-79efb790afae.png)

ホームから.bashrcを開きます。
(非表示になっている場合はCtrl+Hで表示できます。)

`export PATH=/usr/local/cuda-7.5/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda`

このコードを下に書き足して保存します。

再起動すればグラフィックボードが認識されるはずです。
js 数値を降順に並べかえる

##お題
引数で与えられる正の整数を降順に並べ替えて返す。

```script.js
function descendingOrder(n){
 //write your code.
}
descendingOrder(123456789);//987654321

```

##考え方
・引数の値を切り分けるために文字に変換する。
・文字にしてから切り分け、並べ替え、降順、結合の手順を踏む。
・最後に文字にした値を数値に変換しておわり

##コード
```script.js
function descendingOrder(n){
  return parseInt(String(n).split('').sort().reverse().join(''))
}
descendingOrder(123456789);//987654321

```

##ES6

```js
descendingOrder = n => Number(n.toString().split("").sort((a,b) => b - a).join(""));
```

##The unary + operator

```js
function descendingOrder(n){
  return +(n + '').split('').sort(function(a,b){ return b - a }).join('');
}
```
参考リンク
[The unary + operator](http://xkr.us/articles/javascript/unary-add/)

##他にもコードが浮かんだ方、コメントお待ちしております
俺得メモ : Ubuntuに日本語化けしないBlenderをインストールする

UbuntuにBlenderをそのままインストールすると文字化け(UCが対応しないこと)が発生します。

>sudo add-apt-repository ppa:thomas-schiex/blender
sudo apt-get update
sudo apt-get install blender

このコマンドで日本語化けしないBlenderをインストールすることができます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/161123/40601c9c-cf0d-8189-e906-1a165433e152.png)

>blender

端末から実行するかメニュー画面から探して起動します。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/161123/d45fde91-7b7f-3a3a-8a2b-a13ef7be1a6d.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/161123/07e81c14-8f3b-1ee7-861a-08fb7b6a0d70.png)

ユーザープロフィールをクリックします。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/161123/eae11148-5ec2-d17a-20b0-79498eaf4734.png)

システムのタブへ移動します。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/161123/11fbedc3-05a2-c736-badd-27c31dffc0cc.png)

下にあるインターネイション・フォントの言語をクリックします。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/161123/b5e9bc2c-3cb3-5c4c-dfab-233c5e05ac70.png)

日本語を選択します。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/161123/3bd7af0e-6c30-ae3a-9084-845871e1d60f.png)

インターフェイスと書かれたボタンを押すと反映されます。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/161123/7beea0ba-d71a-6bad-eada-ce97ee75017f.png)

しっかりと設定は保存しておきましょう。
ubuntuでLAMP構築

初心者がサーバを立てたい！って言って立てるだけなので、自分用メモです。

LAMPとは
L linux
A apache
M mysqlとかsql
P phpとか言語
の略です

環境
-ubuntu16.04、OSインストールしてssh入れただけ
-macからsshで操作


#インストール

このコマンドだけです。

```
$ sudo apt-get install apache2 php php-gd mysql-server php-mysql
```
| 名前 | 意味 |
|:-:|:-:|
| apache2 |  httpd、サーバー |
| php  |  php、言語 |
| php-gd  | PHPでJPEG,PNG,GIFなどの画像処理が出来る  |
| mysql-server  | sqlサーバー  |
| php-mysql  |  phpからsqlを操作できるようにするやつ |


#鍵認証
apacheを起動させる前にセキュリティ対策をしましょう

クライアント側で鍵を作ります。
その後、Macのキーチェーンに登録

```
ssh-keygen -t rsa -f ~/.ssh/
ssh-add -K ~/.ssh/id_rsa
```

ssh-copy-idでサーバ側に公開鍵を渡します。

```
brew install ssh-copy-id
ssh-copy-id xxx@xx.xx.xx.xx
```

#sshd_config
サーバ側に戻ってバックアップとって編集します

```
$ sudo cp /etc/ssh/sshd_configsudo /etc/ssh/sshd_config.org
$ sudo vi /etc/ssh/sshd_config
```
 
ポート、ルートログイン、パスワード認証を変えます。

```
port 9822
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no

```

とりあえずこれで
・鍵
・ポート9822
・root以外のユーザ
じゃないとsshできません。

```
$ sudo service sshd restart
```
別窓でssh確認　(exitしちゃうとログインできなくなる可能性があります)

```
$ ssh -p 9822 xxx@xx.xx.xx.xx
```
をしてみて接続できればオッケーです。




サーバ起動

```
$ sudo service apache2 start
```

無事起動ですね

最後に起動時に自動的にデーモン起動させます。

```
$ chkconfig httpd on
$ chkconfig mysqld on
```

ubuntuだと上のコマンドが使えないみたいなので

```
$ sudo apt-get install sysv-rc-conf
$ sudo sysv-rc-conf apache2 on
$ sudo sysv-rc-conf mysql on
```

こっちで。

一応、再起動させてみたりして、サーバが動いてるのを確認

```
sudo shutdown -r now
```


#最後に
監視ソフトなり改ざん検知、侵入検知を入れないといけないのですが、まとまり次第別記事に追加します
[Unity] 動的に生成したオブジェクトへのアクセス(List<>での保持、追加、削除)


ある人に「動的に生成したオブジェクトを後から参照したい」と相談したところ
「Listで保持すればいいよ」と教えてもらった。
そうすることで、後からListでオブジェクトにアクセスできる。
（この方法を聞くまでは、オブジェクトに名前をふって、Findで名前検索する方法を考えていた）

以下の例は
インスタンス作成 -> Listで管理 -> Listから削除
という流れ

失敗例は実際にやってしまったケース。



#期待通りに動いた例
生成したオブジェクトをListで保持して使うということはできるようになったが、その後、インスタンスを削除したくなった。
以下の方法で削除できた。
ただし方法として正しいかどうかは不明。（もっと王道のやり方があるかもしれない）

GameObjectを作り、GameObjectをListで管理し、GameObjectを削除する流れ

```test.cs
    //生成したObjectを持っておくためのList
    List<GameObject> list_toggle_ = new List<GameObject>();

        //インスタンスを作成
        GameObject toggle_instance = Instantiate(toggle_prefab_) as GameObject;

        //生成したインスタンスをリストで持っておく
        list_toggle_.Add(toggle_instance);

        //リストで保持しているインスタンスを削除
        for (int i = 0; i < list_toggle_.Count; i++)
        {
            Destroy(list_toggle_[i]);
        }

        //リスト自体をキレイにする
        list_toggle_.Clear();

```


#失敗例1
リストをClearすればインスタンスも削除されると勘違いしている。
あくまでリストで参照を保持しなくなるだけ。インスタンスは残り続ける。

```test.cs
    //生成したObjectを持っておくためのList
    List<GameObject> list_toggle_ = new List<GameObject>();

        //インスタンスを作成
        GameObject toggle_instance = Instantiate(toggle_prefab_) as GameObject;

        //生成したインスタンスをリストで持っておく
        list_toggle_.Add(toggle_instance);

        //リスト自体をキレイにする
        list_toggle_.Clear();
```


#失敗例2
Toggleを使いたいのでGameObjectではなくてToggleを取り出してリストで保持しているケース。
この状態でDestroyを呼ぶとインスタンスのToggleコンポーネントだけ削除される。
つまりGameObjectのインスタンス自体は残り続ける。

GameObjectを作り、ToggleをListで管理し、Toggleを削除する流れ(GameObjectは残ってしまう)

```test.cs
    //生成したObjectを持っておくためのList（ただしToggleクラスのリストを保持する)
    List<Toggle> list_toggle_ = new List<GameObject>();

        //インスタンスを作成(ただしGameObject)
        GameObject toggle_instance = Instantiate(toggle_prefab_) as GameObject;

        //生成したインスタンスをリストで持っておく(GameObject内部のToggleを取り出してリストに入れる)
        list_toggle_.Add(toggle_instance.GetComponent<Toggle>());

        //リストで保持しているインスタンスを削除（）
        for (int i = 0; i < list_toggle_.Count; i++)
        {
            Destroy(list_toggle_[i]);
        }

        //リスト自体をキレイにする
        list_toggle_.Clear();

```
サボり指定をサボらない

正規表現でよくハマるミスがありますが、それがバグの原因になっていることに気づいた、そんな一幕がありました。

## InstantClickとは

最近は「全部JavaScriptで組んでシングルページアプリケーション」というサイトも多いですが、[InstantClick](http://instantclick.io/)は、ページ遷移をJavaScriptで乗っ取る＆クリック前にプレロードを始めることでページ遷移を高速化する、というライブラリです。単体で使う分には、Turbolinksより取り回しも機能性もいいかな、というイメージです。

## 画面も頭の中も真っ白
そして、既存のサイトにInstantClickを入れて高速化しようと、試験的に入れてみたのですが、ページ遷移した後に得られる画面が真っ白になってしまうというトラブルに見舞われました。

WebサイトのHTMLや、InstantClick自体のコードも検証していったところ、原因を見つけ出しました。

```js:instantclick.js
  function removeNoscriptTags(html) {
    /* Must be done on text, not on a node's innerHTML, otherwise strange
     * things happen with implicitly closed elements (see the Noscript test).
     */
    return html.replace(/<noscript[\s\S]+<\/noscript>/gi, '')
  }
```

## ありがちなミス
多くの処理系では、正規表現はデフォルトで**最長一致**するようになっています。`"foo" and "bar"`のような例で、`/".*"/`のような正規表現でヒットさせると、文字列全体にヒットしてしまいます。けっこうやらかしがちです。

1文字なら`/"[^"]*"/`のように除外指定で書いてもそこまで手間ではないのですが、たとえば「`</p>`が出てこないうち」というようなものは（否定先読みが使えるかもしれませんが）書くのが煩雑になります。そこで、`+`や`*`といった量指定子につける`?`というオプションがあって、条件を満たす最短の文字列にヒットさせられるようになります。これを使えば`/<p>.*?</p>/`で「`<p>`要素全体」という形でヒットさせられます[^1]。

ここでは、文書の最初の`<noscript`から最後の`</noscript>`まで、問答無用でヒットしてしまいます。さすがにおかしいので、[Issueを立てました](https://github.com/dieulot/instantclick/issues/150)。もっとも、ここまでわかっているのならプルリクのほうがよかったかもしれませんが。

[^1]: なお、多重に書けない`<p>`や`<noscript>`で気にする必要はないのですが、`<div>`や`<span>`のような、同じタグでネストできるものを正規表現で処理しようとすると厄介です（数学的に純粋な正規表現や、JavaScriptの範囲内の正規表現では不可能です）。
俺得メモ : UbuntuにHamachiを導入する

Minecraftのサーバーを公開する時などに使うHamachiの導入方法を簡単に説明します。

>sudo add-apt-repository ppa:webupd8team/haguichi
sudo apt-get update
sudo apt-get install haguichi

まず、Haguichiというものをインストールします。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/161123/e9ae080b-33c3-7464-451d-0cd116c08195.png)

https://www.vpn.net/linux から
"logmein-hamachi_~~2.1.0.174-1~~_i386.deb"をダウンロードします。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/161123/c2d3d9da-422b-faff-5b2c-6fa63ecf736a.png)

ダウンロードしたファイルを右クリックし、端末を開きます。

>sudo dpkg -i logmein-hamachi_~~2.1.0.174-1~~_i386.deb

コマンドを入力すればHamachiが使えるようになります。
(ファイル名をそのまま入力してください。)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/161123/9649df91-1c41-7a06-016f-f117aae8312d.png)

>haguichi

端末から実行するかメニュー画面から探して起動しましょう。
vimでインサートモードを抜ける時のあれ（Hammerspoon版）


[vimでインサートモードを抜ける時のあれ（Hammerspoon版その2)](http://qiita.com/oppara/items/5f70c9e67415a0a16979)
`hs.eventtap` を使用したものに書き換え。

---

Sierra にアップグレードして困らないための準備

## 前準備


### [Hammerspoon](http://www.hammerspoon.org/) のインストール

```
$ brew cask install hammerspoon
```
### [Lutzifer/keyboardSwitcher](https://github.com/Lutzifer/keyboardSwitcher) のインストール

本家の `brew install` はコケるので、とりあえず以下でインストール。

```
$ brew install oppara/homebrew/keyboardswitcher
```

### 入力ソースの設定

以下の設定
![input_source.png](https://qiita-image-store.s3.amazonaws.com/0/4771/c95490e9-4cef-6ec9-f451-a860abfebc19.png)




## init.lua

```lua:init.lua
local function keyCode(key, modifiers)
   modifiers = modifiers or {}
   return function()
      hs.eventtap.event.newKeyEvent(modifiers, string.lower(key), true):post()
      hs.timer.usleep(1000)
      hs.eventtap.event.newKeyEvent(modifiers, string.lower(key), false):post()
   end
end

local function switchToUs()
    local cmd = '/usr/local/bin/keyboardSwitcher select U.S.'
    os.execute(cmd)
    hs.console.printStyledtext(cmd)
end

local ctrlBracket = hs.hotkey.bind({'ctrl'}, '[', keyCode('escape'), switchToUs)


local function handleGlobalEvent(name, event, app)
    if event == hs.application.watcher.activated then
        local bundleId = string.lower(app.frontmostApplication():bundleID())
        if bundleId == 'com.apple.terminal' then
            ctrlBracket:enable()
        else
            ctrlBracket:disable()
        end
    end
end
watcher = hs.application.watcher.new(handleGlobalEvent)
watcher:start()

```

## 備考

read は出来る

```
$ defaults read com.apple.HIToolbox AppleSelectedInputSources
$ defaults read com.apple.HIToolbox AppleSelectedInputSources | xargs | cut -d';' -f3 | cut -d'=' -f2
```

write が:confounded:
```
$ defaults write com.apple.HIToolbox AppleSelectedInputSources -array '{ InputSourceKind = "Keyboard Layout"; "KeyboardLayout ID" = 0; "KeyboardLayout Name" = "U.S."; }'
```

多分、こっちが王道。escapeのループ問題も解決できそう。。
[IntelliJとかJVMのIDE使いでもKarabinerなしでバックスラッシュを片手入力したい](http://qiita.com/tanakahisateru/items/d8a67ad89c07baf8c0da)
コード読みたくないので全てのクラスに日本語３行で概要を付けて欲しい

全てのクラスに日本語３行で概要を付けて欲しいと最近よく思う。

*Docに則ってればなおいいですが、それほど細かくなくても、概要があるだけでも十分だと思います。

これがない状態で全貌を知ろうとすると、無駄にソースコード読むことになるし、そこに手を加えるとき、どうなってるのが設計的に正しいのかわからないから。

そもそもそこに課題意識は皆ないのだろうか。

自分はとにかく楽したくて、てっとり早く内容が知りたい。

１００％まで知らなくていい、６０％くらいつかめればいい。

けど大体の場所でそういう提案をすると、

読めばわかるじゃん

聞けばわかるじゃん

に跳ね返されてしまう。

皆そんなもんなんだろうか。

PHPだとdoc書いてる人が多いように感じる。（自分もPHPだと書く）

最低限書いておきたいPHPのDocコメント
http://qiita.com/motoyan-qwt/items/ee973666f1105435822c

ちなみに筆者は

- iOSアプリエンジニア
- ドキュメントはメンテされてない
- コードにコメント少ない
- 同時並行で１０くらい案件動いてる

という環境で働いています
俺得メモ : UbuntuでWindowsの実行ファイル(.exe)を実行させる

UbuntuでWindowsの実行ファイル(.exe)を実行させる方法を簡単に説明します。

>sudo add-apt-repository ppa:wine/wine-builds
sudo apt-get update
sudo apt-get install --install-recommends winehq-devel

Wineというプログラムをインストールして終わりです。
あとは開きたいexeファイルをダブルクリックするだけです。(最初は少し時間がかかります。)
python モジュール名から homebrew 検索（ShellScript）

こんにちは。
homebrew では、幾つかの python モジュールをインストール可能ですので、モジュール名から homebrew 検索してみました。

```
$ pip list --format=legacy --outdated | cut -d' ' -f 1 | ./pip_homebrew_search
.sh
numpy numpy ✔
GDAL osgeo/osgeo4mac/gdal2-python ✔
Pillow homebrew/science/pillow ✔
```

```pip_homebrew_search.sh
#!/bin/sh
if [ $# == 0 ] && [ ! -p /dev/stdin ] ; then
  declare -a pymodules=(numpy GDAL Pillow)
else
  pymodules=(`cat "$@" | tr '\n' ' '`)
fi

brewModuleName () {
  GDAL="gdal2-python"
  eval mName=\$"${1}"
  [[ -z "${mName}" ]] && mName=`echo "$1" | tr '[A-Z]' '[a-z]'`
  echo "${mName}"
}

for e in "${pymodules[@]}"; do
  /bin/echo -n "${e} "
  brew search `brewModuleName $e`
done
exit $?
```
俺得メモ : UbuntuにJavaを導入する

UbuntuでMinecraftを起動させるために必要なJavaの導入方法を簡単に説明します。

>sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

このコマンドを端末に打つだけです。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/161123/be82a0a3-7bfd-6047-6175-08fd39ad1ec4.png)

おっと、"プログラムとして実行可能"のチェックボックスをオンにしてから実行してくださいね！
WPFでWindowのCloseをプロパティ化する

# Windowを継承してIsOpenプロパティを実装したWindowExを作成する

```csharp
    public class WindowEx : Window
    {
        public static readonly DependencyProperty IsOpenProperty = DependencyProperty.Register(
            "IsOpen", typeof(bool), typeof(WindowEx), new PropertyMetadata(default(bool)));

        public bool IsOpen
        {
            get { return (bool)GetValue(IsOpenProperty); }
            set { }
        }

        protected override void OnContentRendered(EventArgs e)
        {
            base.OnContentRendered(e);
            SetValue(IsOpenProperty, true);
        }

        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);
            SetValue(IsOpenProperty, false);
        }
    }
```

# Windowの継承元はWindowExに置き換えるてIsOepnプロパティをBind設定する

```csharp
    public partial class MainWindow : WindowEx
    {
        public MainWindow()
        {
            InitializeComponent();       
            
        }        
    }
```

```xml
<local:WindowEx x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d" IsOpen="{Binding IsOpen.Value , Mode=OneWayToSource}"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>
    <Grid>
        
    </Grid>
</local:WindowEx>
```

# ViewModelクラス
```
    public class MainWindowViewModel
    {
        public MainWindowViewModel()
        {
            IsOpen.Subscribe(x =>
            {
                Debug.WriteLine(x);
            });
        }

        public ReactiveProperty<bool> IsOpen { get; set; } =
            new ReactiveProperty<bool>();
    }
```
(C#)フォルダ構造を保持して別フォルダを作成する

### やりたいこと
ファイルが格納されているフォルダの構造を引き継いだ、別名のフォルダを作成したい。

### 対象のフォルダ構造
* 元フォルダ

```
フォルダ構造
orig - orig - aaa - ddd - g.txt
            |     |
            |     - eee - fff - h.txt
            - bbb 
            |
            - ccc - i.txt
```

* 変化後フォルダ

```
フォルダ構造
TestDir - orig - aaa - ddd
               |     |
               |     - eee - fff
               - ccc
```

### ソース
```C#
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;

namespace testconsole
{
    class Program
    {
        /// <summary>
        /// 元ディレクトリの構造を引き継いで別名でディレクトリを作成する
        /// </summary>
        /// <param name="sourceDir">元ディレクトリ</param>
        static void CreateDestDir(string[] sourceDir)
        {
            // 作成する別名ディレクトリのリスト
            List<string> destDir = new List<string>();

            // 1つ目の文字列だけ置換するためRegexインスタンス作成
            Regex reg = new Regex("orig");

            // 取得したパスから重複を抜いてリストに登録
            foreach (string dir in sourceDir)
            {
                // リスト内に既に文字列がある場合はAdd処理を飛ばす
                if (destDir.Contains(reg.Replace(dir.Remove(dir.LastIndexOf('\\')), "TestDir", 1)))
                    continue;

                // 最初に出現した文字列をTestDirに置き換える
                destDir.Add(reg.Replace(dir.Remove(dir.LastIndexOf('\\')), "TestDir", 1));
            }

            // ディレクトリの作成
            foreach (string dir in destDir)
            {
                // 取得したパスはエスケープがされている状態なので、そのままディレクトリ作成
                Directory.CreateDirectory(dir);
            }
        }

        static void Main(string[] args)
        {
            // メンバ変数
            string directoryPath = @"C:\Users\watame\Desktop\orig";
            string searchFileName = "*.txt";

            // 対象のフォルダ以下の .txt ファイル一覧を取得
            string[] filePaths = Directory.GetFiles(directoryPath, searchFileName, SearchOption.AllDirectories);

            // ディレクトリの作成
            CreateDestDir(filePaths);
        }
    }
}
```
### メソッド説明
コメントでほとんど説明を記載してしまったので、メソッドについて特筆すべきことはありません。
フォルダ名の都合上、最初の `orig` 部分のみ置換して別名に変更したかったので `Regex` を利用して、最初に出現する `orig` のみを置換しています。
(他にもっと良いやりかたがあると思いますが、自分では見つけられませんでした)

### 課題
~~上記のソースではファイルが格納されていないフォルダは作成されません。~~
~~ファイルが格納されていないフォルダも作成されるように出来ればと思います。~~

* 以下の方法で元のディレクトリでファイルが格納されていないフォルダも作成可能です  

```C#
var orig = @"C:\orig\";
var dest = @"C:\dest\";
System.IO.Directory.EnumerateDirectories(orig, "*", SearchOption.AllDirectories)
    .Select(d => d.Replace(orig, dest))
    .Where(d => !Directory.Exists(d))
    .ToList()
    .ForEach(d => Directory.CreateDirectory(d));
```

### 参考サイト
[文字列を置換する。置換回数を指定する](http://noriok.hatenadiary.jp/entry/2015/09/21/184424)


### 変更履歴
* 20170203 ファイルが格納されていないフォルダの作成方法を追記しました。
NSViewとNSViewController【swiftでmacOSのアプリ開発、情報が少ないから少しずつでも書いていこうと思う】

どこで見たかは忘れてしまったけど、NSbutton のデザインを変更するのは
あまりオススメしないからNSViewを使ったほうがいい。
っていうのを見た記憶があるので、それに従おうと頑張ってます。（鵜呑みにしていいものか...）

以下のようなNSViewのクラスを作り、

```swift:NavButton.swift
class NavButton: NSView {
    
    private var color: NSColor?
    private var text: String?
    
    init(frame frameRect: NSRect, str: String, color: NSColor) {
        super.init(frame: frameRect)
        
        self.text = str
        self.color = color
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }

    override func draw(_ dirtyRect: NSRect) {
        self.color!.setFill()
        NSRectFill(self.bounds)
        
        NSString(string: self.text!).draw(in: self.bounds, withAttributes: nil)
    }
    
    override func mouseDown(with event: NSEvent) {
        if event.clickCount == 2 {
            Swift.print("double clicked")
        }
        else {
            super.mouseDown(with: event)
            Swift.print("clicked")
        }
    }
}
```

NSViewControllerで次のようにViewに描写してみる

```swift:ViewController.swift
class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let item = NavButton(frame: NSMakeRect(0, 0, 200, 50), str: "test", color: NSColor.blue)
        
        self.view.addSubview(item)
    }
```

すると、こんな感じに表示される。
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/129283/489d82f5-2071-aa86-ef01-9b461bfada9e.png)
FuelPHPのViewでHTMLタグが表示されてしまう問題

#はじめに
バイトで長い時間苦しんだ部分についてメモを残していきたいと思います。

#ControllerからViewに値を渡す
基本的にControllerからViewに値を渡す場合Viewクラスのforge()メソッドを利用する

```Controller.php
public function action_index() {
    return Response::forge(View::forge('第一引数', '第二引数', '第三引数'));
}
```

#forge()メソッド
forge()メソッドはオブジェクトを生成するメソッド

##Viewクラスのforge()メソッド
Viewオブジェクトを返すメソッド

```Controller.php
View::forge($file, $data, $filter)

// $file = ビューファイル名を受け取る。app/viewsからの相対パス (ex: View/View.php)
// $data = Viewに渡したい値の配列 (ex: {'hoge' => $hoge})
// $filter = 自動エンコーディングを行うかを決める (デフォルトはtrueでエンコーディングを行う)
```

##Responseクラスのforge()メソッド
Responseクラスの新しいインスタンスを生成する
HTTPレスポンスとブラウザ出力を扱うメソッドを持つ

```Controller.php
Response::forge($body, $status, $header)

// $body = レスポンス本文。ユーザーに返したいレスポンス
// $status = HTTPステータスコード
// $header = レスポンスになりうる、あらゆる HTTP ヘッダ
```

#ViewでHTMLのタグが表示されてしまう理由
View::forge()の第三引数を省略するとtrueになり、デフォルトでエスケープを行ってしまう
よって、DBなどに入っているHTMLタグが入った文字列をエスケープした状態でViewに渡してしまい、HTMLタグが表示されてしまう
解決策としては以下の２つある

##第三引数をfalseにする
falseにすることにより$dataにエスケープ処理を与えずにViewに渡すことができる

```Controller.php
View::forge('/View/View.php', {'hoge' => 'Hello World!<br>'}, false)
```

##set_safe()メソッドを利用する
ビューに変数を割り当てるメソッド
変数に値を入れる際にエンコーディングを行わない

```Controller.php
View::forge()->set_safe('hoge', 'テスト');
```

```View.smarty
{$hoge}
  ↓  出力
テスト
```
LÖVEでAndroidでHello World!する

こんにちは@xsotaです。

Love2Dを使ってAndroidでHello World!をやってみようと思います:D

macOSです。

# 前提
- Android SDKの導入済
- Android NDKの導入済
- Love2Dの導入済([LÖVEでHello World](http://qiita.com/xsota/items/e359200df7b6a30703a4))
- macOS

# antインストール

```zsh
$ brew install ant
```

# 環境変数の設定とかPATH通したりする
既に設定済みの人は飛ばしてください。
pathとか.zshrcは適宜読み替えてください。

~/.zshrcに以下の内容を書きます。

```zsh
$ emacs ~/.zshrc
```

```zsh:.zshrc
export ANDROID_HOME=/path/to/android-sdk
export ANDROID_NDK=/path/to/ndk
```

/etc/paths.d/android-sdkに以下の内容を書きます。

```zsh
$ sudo emacs /etc/paths.d/android-sdk
```

```zsh:/etc/paths.d/android-sdk
/path/to/android-sdk/platform-tools
/path/to/android-sdk/tools
/path/to/android-sdk/ndk-bundle
```

# love-android-sdl2をクローン&ビルド

```zsh
$ git clone https://bitbucket.org/MartinFelis/love-android-sdl2.git
$ cd love-android-sdl2
$ ndk-build
```
ndk-buildにそこそこ時間がかかるのでジンジャーエールとか飲んで待ちましょう :D

assetsディレクトリを作成しておきます。

```zsh
$ mkdir assets
```

# Hello World!
Hello World!用のプログラムを作成します。

```zsh
$ mkdir hello
$ cd hello
$ emacs main.lua
```

main.luaに以下の内容を記述します。

```lua:main.lua
function love.draw()
  love.graphics.print('Hello World!', 400, 300)
end
```

zipで固めます。

```zsh
$ zip -9 -r game.love .
```

プログラムは完成したので先ほど作成したassetsディレクトリにほうりこみます。

```zsh
$ cp game.love ~/love-android-sdl2/assets/game.love
```

ビルドします。

```zsh
$ cd ~/love-android-sdl2
$ ant debug
```

これでapkができあがるのでインストールします。

```zsh
$ adb install -r bin/love-android-debug.apk
```

実行するとこんな感じになります
![20170131215332.png](https://qiita-image-store.s3.amazonaws.com/0/113692/ea3fa155-a9d6-630f-32c3-cab992f940d8.png)

めっちゃ文字がちっさいけど「Hello World!」できました！

それではこれで終わります。お疲れ様でした。
Cygwin XのstartxwinrcでXDG-menuの設定をする

はじめに
=======

だいぶ前ですが，cygwinにxdg-menuというアプリケーションが追加されて
Windowsのタスクバーにアイコンとメニューが表示されるようになりました。

ただし`.startxwinrc`を使うとCygwin用メニュにならなかったので，
うまく動作した設定を残しておきます。


startxwinrc記述例
----------------

`XDG_CURRENT_DESKTOP` に`X-Cygwin` を設定すればCygwin用のメニューになります。

```
export XDG_CURRENT_DESKTOP="X-Cygwin"
mintty
mintty
exec /usr/bin/xwin-xdg-menu
```
Windows 7で管理者権限が必要なソフトウェアを起動時に実行する

スタートアップのフォルダに管理者権限が必要なアプリを放り込んでも起動時にうまく実行されません。
そこで、Windowsにプリインのタスクスケジューラというアプリケーションを使って起動時に正しく実行されるように設定してみましょう。

## やりかた

* タスクスケジューラを開く
    * Win + R で「ソフトウェアを指定して起動」ダイアログを呼び出す
    * `Taskschd.msc` と入力
    * Enter
* タスクを登録する
    * 右ペインの「基本タスクの作成」を押下
    * 名前は適当に「○○を起動」とか
    * 「いつタスクを開始しますか？」→「ログオン時」
    * 「タスクでどの操作を実行しますか？」→「プログラムの開始」
    * プログラム（exeファイル）を選択
    * 完了

これで、次に起動した時からこのタスクが走ります！
なお管理者として実行しますか？のダイアログは開きますのでご了承ください。
Linux mint 17.2で vSphere Clientを動かしてみる

この記事は個人ブログからの移行した自分用のメモ書きです。
2015年12月にLinux mint 17.2環境で実施した内容です。
* * *
以下のサイトを参考に、Linux mint 17.2 上で vSphere Client を動かしてみる。
https://www.higebu.com/vsphere-client-on-ubuntu-en.html#.Vl2utSDhD0o
https://appdb.winehq.org/objectManager.php?sClass=version&iId=32171
http://atmosphere147.blogspot.jp/2014/05/how-to-install-vsphere-client-55-on-mac.html


# wineの導入
```
sudo add-apt-repository ppa:ubuntu-wine/ppa
sudo apt-get update
sudo apt-get install -y wine1.7 wine-mono4.5.4 wine-gecko2.34`
```
##wineのバージョン確認
```
$ wine --version
```

##wineの設定
vSphere Client が WindowsXP/Windows2003 環境では動作しない。
忘れずに Windows7 以降を選択しておく。

```
$ WINEARCH=win32 WINEPREFIX=~/.wine32 winecfg
```

※厳密には、WindowsXPでもESXi側の設定次第で接続できるみたいだけど・・・

## .NETのインストール ※ここが難関※
下記サイトの情報が参考になった。
http://kakurasan.blogspot.jp/2015/07/dotnetframework-on-wine.html
dotnet30を自動ダウンロードしてインストールするには、最新のwinetricksを使用したほうが良い。
その際、winetricks に-qオプションを指定してインストールしないと終了しない。
dotnet35のインストール前にmsxml3のインストールが必要らしい。

```
$ WINEARCH=win32 WINEPREFIX=~/.wine32 winetricks dotnet20
$ WINEARCH=win32 WINEPREFIX=~/.wine32 ./winetricks -q dotnet30
$ WINEARCH=win32 WINEPREFIX=~/.wine32 winetricks dotnet20sp1
$ WINEARCH=win32 WINEPREFIX=~/.wine32 winetricks dotnet30sp1
$ WINEARCH=win32 WINEPREFIX=~/.wine32 ./winetricks msxml3
$ WINEARCH=win32 WINEPREFIX=~/.wine32 winetricks dotnet35
$ WINEARCH=win32 WINEPREFIX=~/.wine32 winetricks dotnet35sp1
```

今回は、dotnet30とmsxml3だけ最新のwinetricks使ったけど・・・全部最新版のほうが良かったのかも。

#vSphere Client 6.0 のインストール
インストール用のファイルは事前にカレントディレクトリにダウンロードしておく。

```
WINEARCH=win32 WINEPREFIX=~/.wine32 wine ./VMware-viclient-all-6.0.0.exe
```

#vSphere Client 6.0 の実行
```
WINEARCH=win32 WINEPREFIX=$HOME/.wine32 wine $HOME/.wine32/drive_c/Program\ Files/VMware/Infrastructure/Virtual\ Infrastructure\ Client/Launcher/VpxClient.exe
```

これで、vSphere ClientのためだけにWindows PCを起動する必要はなくなりました。
コンソールは使えないみたいだけど、ゲストOSは CentOS7 くらいだしsshログインするので支障なし。
仮想マシンの起動と状態確認程度であれば、問題なく使えそうです。
Azure ARM のJSONファイルを編集する環境

# 概要

Azure の Azure Resource Manager の JSON ファイルを編集するのに、よさそうな環境を探したい

# まとめ

Microsoft の記事だからというのもあるだろうけど、
Visual Studio Code に、プラグインをいれるのがよいらしい

* [VS Code で Resource Manager テンプレートを操作する | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/resource-manager-vs-code)

紹介されているもの

* [Azure Resource Manager Tools - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=msazurermtools.azurerm-vscode-tools)

## カッコを畳みたい

現在不要な部分を畳みたいなぁと思って調べた。

以下をみるのがよい

* [vscode - How do I collapse sections of code in Visual Studio Code for Windows - Stack Overflow](http://stackoverflow.com/questions/30067767/how-do-i-collapse-sections-of-code-in-visual-studio-code-for-windows)

そのうち

|キー|内容|
| :----: | :----: |
| Ctrl+Shift+[ | カッコをたたむ |
| Ctrl+Shift+] | 閉じたものを開く |


## よかったところ

定義されていない値などが強調される(赤い波線とか)

![Screenshot from 2017-01-31 21-30-20.png](https://qiita-image-store.s3.amazonaws.com/0/82011/85b2c1c3-bcbb-cc46-350b-3c32ed7fd941.png)
梅村流Python探検隊 0日目

ご無沙汰しております。一年以上たった過去のポストの落ちをつけないまま、投げっぱなしジャーマンをしたきりなのは重々承知の上なのですが、改めまして新シリーズを開始してやろうかと思っています。

その名も、「梅村流Python探検隊」。

なんの因果かPythonを使い始めてしまい、とてつもなくPythonが好きになってしまいました。Pythonもたぶん私のことが好きに違いない、と錯綜した思いを持つ一方で、自分、Pythonのことをほとんどしらないときづいたのです。きっかけはEffective Pythonを見始めたのがきっかけで、自分のコーディングのくそさ加減に嫌気がさしました。

そこで、もっとPythonを梅村流にちょっと掘り下げていきながら見つけたこと、わかったことをここに記録していこうかと思います。完全な独自研究であり、きっちりした指針もなく、行き当たりばったりの末、グダグダな結論になるかもしれませんがそれでもいいのです。だってそれが恋じゃない（錯綜2回目）。

というわけで、次回からちびちびと始めていきますので、もしご覧いただきなにかアドバイス等いただけましたら幸いに存じます。




英語・・・？なにそれ、おいしいの？
Deep Security Manager 9.6SP1 Relay有効化

Deep Security Manager(以降DSMとする)はversion 9以降にRelay用の機能をDSMの機能ではなくDeep Security Agent（以降DSAとする）の一機能として持たせる構成となりました。
Deep Security Relayは脆弱性やウィルスや定義ファイルなどをDSMを経由せず直接Trend Micro社のサイトからダウンロードする機能を持ちます。Deep Securityを構成するためには必須のコンポーネントとなります。

そんなRelay機能ですが、インストールの際に有効化ができないという事象に出くわしましたので、本稿ではその詳細と対応について記載します。

#前提
AWS EC2インスタンス上にDSMを構築
Deep Security ManagerとRelayは同一インスタンス上に構築（もちろんAgentも同居）
OS：RHEL7.2
DB：RDS（Oracle 11g）
DSM：Linux 版 Deep Security Manager 9.6 Service Pack 1 Patch 1 Update 4

#Relay有効化失敗

EC2インスタンス上にDSM、DSAをインストール後、DSMのコンソール画面から自分自身のサーバーを管理下に登録します。次に自分自身のサーバープロパティから”Relayの有効化”ボタンをクリックします。
参照：http://esupport.trendmicro.com/solution/ja-JP/1097172.aspx#step3

、、しかし、Relay有効化ボタンがありません。
![NoRelayButton.png](https://qiita-image-store.s3.amazonaws.com/0/142407/08e57679-5842-b75d-337a-3082daba64f7.png)

DSAを再インストールしても状況変わらずでした。

#対処方法

RelayはDSAの機能のため、DSAのインストールに問題があると疑っていましたが、実はDSMのインストールに問題がありました。

DSMはLinuxサーバー上に構築したため、インストールの際は応答ファイル（dsm.propertiesファイル）を作成し、その応答ファイルを読み込む形でインストールを実行しました。今回遭遇した事象はこの応答ファイルが原因でした。

インストールガイドを参照するとRelay有効化のためには、”**RelayScreen.Install=True**”の一行を入れる必要があるとのことでした。

上記１行を追加しインストールをし直した結果、無事有効化ボタンが表示されました。
![RelayButton.png](https://qiita-image-store.s3.amazonaws.com/0/142407/a73face1-a3c8-ae66-0b84-364a50124b2c.png)



実際に使用した応答ファイルはこちら。

```dsm.properties
CredentialsScreen.Administrator.Username=<user_name>
CredentialsScreen.Administrator.Password=<password>
DatabaseScreen.DatabaseType=Oracle
DatabaseScreen.Hostname=xxxxxx.ap-northeast-1.rds.amazonaws.com
DatabaseScreen.DatabaseName=<db_name>
DatabaseScreen.Transport=TCP
DatabaseScreen.Username=<db_user_name>
DatabaseScreen.Password=<db_user_password>
RelayScreen.Install=True
```

Trend Micro社の[KB](http://esupport.trendmicro.com/solution/ja-JP/1107246.aspx?print=true)には”RelayScreen.Install=True”の情報書かれておらず単に有効化ボタンをクリックしてくださいとの記載のみでした。
Deep SecurityはRelayが必須の構成となるなら、Relay有効化ボタンはデフォルトで表示してほしかった。。


#参考
[Deep Security Manager 9.6 SP1インストールガイド (基本コンポーネント)](http://files.trendmicro.com/jp/ucmodule/tmds/96/sp1/Deep_Security_9.6_SP1_Install_Guide_basic_JP.pdf)