OmniAICreator/Qiita-1.07M huggingface dataset:
コマンドラインコンパイラ csc.exe で C# コードをコンパイルする

# はじめに
Windows には C# のコンパイラ（csc.exe）が既定で含まれており、Visual Sutdio をインストールしなくても C# コードをコンパイルすることができるということで、実際に試してみました。動作確認は以下の環境で行いました。OS をインストールしただけの素の状態です。

- Windows 10 Professional x64 Creators Update（英語版）

# ソースコード
素の状態でエディタもインストールしていないので、メモ帳でコードを書いていきます。デスクトップに HelloWorld.cs というファイルを作成して、以下のコードを入力します。Hello World と表示するだけの何の変哲もないコンソールアプリケーションです。

```csharp:HelloWorld.cs
using System;

class HelloWorld
{
    static void Main()
    {
        Console.WriteLine("Hello World");
    }
}
```

# コンパイル
早速コンパイルしていきます。PowerShell を開いて以下のコマンドを実行します。

```ps1
cd ~\Desktop
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe .\HelloWorld.cs
```

成功するとデスクトップに HelloWorld.exe が作られます。

# 実行
続けて PowerShell から HelloWorld.exe を実行します。


```ps1
.\HelloWorld.exe
```

「Hello World」と表示されれば OK です。

# アセンブリ参照について
csc.exe でコンパイルするときに参照されるアセンブリは以下のファイルに記述されています。

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.rsp"

参照したいアセンブリが書かれていない場合は追記しましょう。

# 蛇足
PowerShell っぽいコマンドでコンパイルするための Function も作ってみました。特に便利にはなっていません。気持ちの問題です。

```ps1:Invoke-Compilation
function Invoke-Compilation
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true)]
        [string]$Path
    )
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe $Path
}

# Invoke-Compilation -Path HelloWorld.cs
```
cakePHPのpaginateでinfinite scrollを使った無限スクロール

ふわっとしつつ、ぐるぐる行きましょう！

# 今回のお題
cakePHP2でページネート検索をし、結果を表示します
ただし、ページネートバーは使わず、「もっと見る」ボタンを用意し
「もっと見る」ボタンをクリックしてスクロールするように仕上げます
結果はmasonryを使ってタイル状に画像を表示させています

とまあ、いろんなものを盛り込んでいてなんのこっちゃ、ですが、
pinterestをイメージしてもらうとわかりやすいでしょうか

それでは、Worksというテーブルからwork情報を取得し表示する、という体でいきましょう


ぐるぐる


## controller
いたって普通にpaginateを行いsetします

```php
$this->paginate = array('limit' => 10, 'order' => array(...));
$works = $this->Paginator->paginate('Works', array(...);
$this->set(compact('works'));
```

## view
viewはこんな感じです
前回書いた[jQueryでNow Loadingからふわっと表示させたい](http://qiita.com/sanapon1020/items/61fe033040148b14dff2)を踏襲します

```html+php
<script src="/js/imagesloaded.pkgd.min.js"></script>
<script src="/js/masonry.pkgd.min.js"></script>
<script src="/js/jquery.infinitescroll.min.js"></script>

<!-- now loading -->
<span class="loading">
    <img src="/img/loading.gif" alt="Now Loading..." />
</span>

<div class="works">
    <?php foreach ($works as $work) : ?>
    <div class="works_item">
        <a href="...">
            <img src="...">
        </a>
    </div>
    <?php endforeach; ?>
    <?php echo $this->Paginator->next('もっと見る', array('tag' => 'p', 'class' => 'read_more'), null, array('style' => 'display:none;')) ?>
</div>
```

## javascript

```js
$(function () {
    // 総ページ数
    var pageCount = <?php echo $this->Paginator->params()["pageCount"] ?>;
    var nowPage = 1;

    $('.works').imagesLoaded(function(){
        $('.works').masonry({
            itemSelector: '.works_item',
            isFitWidth: true,
            isAnimated: true,
            isResizable: true
        });
    });
    $('.works').infinitescroll({
            navSelector  : ".read_more",
            nextSelector : ".read_more a",
            itemSelector : ".works_item",
            loading : {
                img : '...',
                msgText : '...',
                finishedMsg : '',
            },
    },
    function( newElements ) {
        var $newElems = $(newElements);
        $newElems.css({opacity: '0'});
        $newElems.imagesLoaded(function() {
            $('.works').masonry('appended', $newElems, true); 
            if (nowPage < pageCount) {
                $(".read_more").appendTo(".works").delay(300).fadeIn(600);  
            }
            $newElems.css({opacity: '0'}).animate({opacity: '1'}, 1500);
            $('.loading').hide();
        });
        nowPage++;
    });
    
    // クリックでスクロールさせるためinfinitescrollをunbind
    $('.works').infinitescroll('unbind');
    // クリック時の動作
    $('.read_more a').click(function(){
        $('.loading').show();
        $('.works').infinitescroll('retrieve');
        return false;
    });
});
```

どうでしょう、ぐるぐるできましたでしょうか？
ふわっと表示も引き続きできているかと思います

` $('.works').infinitescroll('unbind');`
これ以下を削除するとクリックではなくページ下部にスクロールした時点で
次の内容が読み込まれるようになるかと思います

今回はここまでで

ぐるぐる
C++で文字列が数字かチェックする

# stringからintに変換

stringをintに変えるには、`stoi()`が使える。

```hoge.cpp
#include <iostream>
using namespace std;

int main()
{
	string hoge = "123";
	string hoge2 = "123a";
	string hoge3 = "a123";
	cout << stoi(hoge) << endl;
	cout << stoi(hoge2) << endl;
	// cout << stoi(hoge3) << endl;
}
```

```hoge.cppの結果
123
123
```

数字ではない文字から始まっているとエラーになる。~~なので、数字かチェックするのには使えない。~~

追記：コメントをいただいて、stoi()のエラーを捕捉するのがいい方法だとわかりました。下記のcheck_init()だと、intを超える数字の場合でもチェックが通りますが、stoi()でout_of_rangeエラーになります。

# 文字列が数字かチェック
参考：[文字列が数字で構成されているかを判定する](http://program.station.ez-net.jp/special/handbook/cpp/string/all_of.asp)

```hoge.cpp
#include <iostream>
#include <cctype>
#include <algorithm>

int main()
{
	using std::string;
	string hoge = "123";
	string hoge2 = "123a";
	string hoge3 = "a123";

	if (std::all_of(hoge.cbegin(), hoge.cend(), isdigit))
	{
		std::cout << "Intになれます" << std::endl;
	}
}
```

チェックできてる。ちなみに、`#include <cctype>`と、`#include <algorithm>`を外しても動いちゃんだけどなんでだろう。あと、`using namespace std;`というのは、本番開発では使わない方がいいらしい。衝突が起こるらしい。上記も衝突が起こった。`std::all_of`というのの、`std`というのは違うやつらしい。c++は難しい。

```hoge.cpp
#include <iostream>
#include <cctype>
#include <algorithm>

bool check_int(std::string str)
{
	if (std::all_of(str.cbegin(), str.cend(), isdigit))
	{
		std::cout << stoi(str) << std::endl;
		return true;
	}
	std::cout << "not int" << std::endl;
	return false;
}

int main()
{
	using std::string;
	string hoge = "123";
	string hoge2 = "123a";
	string hoge3 = "a123";
	string hoge4 = "1234567890";

	check_int(hoge);
	check_int(hoge2);
	check_int(hoge3);
	check_int(hoge4);
}
```

```hoge.cppの結果
123
not int
not int
1234567890
```
Slackのトーク履歴を整形する

# 背景

Slackのトーク履歴を見やすいように整形したいと思います。
Slackのトーク履歴は、チャンネル/日付毎にファイル分けされたjsonでエクスポートされます。
このままではまともに見られないので、今回は、特定のチャンネルでの全期間の会話を一つのログに纏め、jsonをパースして出力させてみます。

# そもそもトーク履歴をエクスポートする方法

フリープランの場合は、
https://チャンネル名.slack.com/services/export
でエクスポートできます（admin以上の権限が必要）。

有料プランの場合は他にもいくつか方法があるようです。
https://get.slack.help/hc/ja/articles/204897248-Slack-データエクスポート-ガイド

# 作ったシェルスクリプト

作業場所: 整形したいトーク履歴が格納されたディレクトリのあるディレクトリ

```bash:slack_log_parser.sh
channel=hogeChannel #チャンネル名を指定
outputfile=after.txt #アウトプットファイル名を指定

for file in `\find ./${channel}/ -maxdepth 1 -type f | sort`; do
    json=`cat ${file}`
    len=$(echo $json | jq length)
    for i in $( seq 0 $(($len - 1)) ); do
        user=$(echo $json | jq -r .[$i].user)
        text=$(echo $json | jq -r .[$i].text)
        echo "${user}: ${text}" >> $outputfile
    done
done
```

findはそのままだと時系列順（ファイル名辞書順）にならないのでsortをつけています。

slack_log_parser.shを実行するとafter.txtが作られます。
ディレクトリ構造は以下のようになります。

```
 - slack_log_parser.sh
 - after.txt
 - hogeChannel
    - YYYY-MM-DD.json
    - ...
```

### 参考記事
bashでjqを使ってJSONの配列をループさせる
http://qiita.com/ryo0301/items/2ac9d11f355f1cf52ea5

bashやshなどのsh系スクリプトでJSON形式のデータを読み込む
http://satolabo.0t0.jp/2017/01/30/shell-script-parse-json/

# 出力例

```text:after.txt
U06THOGE1: ほげほげ
U06TFUGA9: ふが
U06TFOO63: ふーばー
```

ユーザ名はIDで格納されているので必要に応じて修正してください。

# 関連記事
こちらチャットログ整形記事第三弾でした。過去のものは以下からどうぞ。

Skype版
http://qiita.com/taumu/items/37f1baf0f6af3997d341
LINE版
http://qiita.com/taumu/items/278b2a3a1530498a62d1
[短文]JavaScriptのDateって、マイナスの値を引数に与えてもいいのかな?

これを見て。
http://qiita.com/QUENCH/items/3be4de21eeb5fdbf7fe8
最終週の金曜日を求めたかったら、
翌月から逆算したら、4週目か5週目か考える必要ないんちゃうん？って思って、やってみたら、

```js
function get_premium_friday(year, month) {
  return new Date(year, month+1, -((new Date(year, month+1, 0)).getDay()+2) % 7);
}
```

で、Firefoxでは動いた。
2017年5月0日は、2017年4月30日を指し、2017年5月-2日が2017年4月のプレミアムフライデーなわけである。

これが、Firefoxの独自仕様なのか、JavaScriptの仕様なのかは、[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date)からは読み取れなかったが、
[ECMAScript 5.1](https://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.1)を見る感じだと、日付のパラメータは、ToNumberされた後、[MakeDay](https://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.12)に渡され、とたらい回しを受けつつも、マイナスになっても動きそうな感じにはなっている。
きっと、日付をマイナスにする書き方は、許されているのだろう。
RailsアプリからBootstrapを無効化する

タイトル通りRailsアプリからBootstrap-sassを無効化する方法を残しておきます。
今までありそうでなかった。


##Gemfileから削除
まず最初にGemfileからbootstrap-sassを削除します。

```ruby:Gemfile
gem  'carrierwave'
gem 'rmagick'

gem 'jquery-ui-rails'
gem 'acts-as-taggable-on'
gem 'gon'

gem 'devise'
gem 'rails_admin'

gem 'kaminari'
gem 'ransack'

gem 'font-awesome-rails'
gem 'md_simple_editor'
gem 'redcarpet'
gem 'coderay'


gem 'therubyracer', platforms: :ruby
##↓を削除
gem 'bootstrap-sass'
```

次に

```
$bundle && gem uninstall bootstrap-sass
```

を実行します。



##sassとjsファイルから削除

```
app/assets/stylesheets/application.scss
```

からbootstrap-sproketsとbootstrapを削除。


```
app/assets/stylesheets/application.js
```

からbootstrap-sprocketsを削除。




##Gemfile.lockを削除
ここまできたらGemfile.lockを削除して

```
$bundle install
```


これで綺麗にbootstrapが取り外せる。
つける工程を考えれば逆のことをやっているだけなのだけれど、Gemfile.lockを消し忘れてはまった自分用に残しておきます。
ZCash を NVIDIA GPU でマイニングする(2017/04/29 時点)

漢なら GPU クラスタで CUDA でレイトレースしたり機械学習したいですね!

GPU を使っていないときはマイニングで機材費用の足しにしたいですね.

調べると nicehash とかでは, NVIDIA 系でも性能の出せるハッシュアルゴリズム(?)を使うことができるようです.

今回は(まだまだ先行者利益がありそうな) ZCash をマイニングすることにします.

https://z.cash/

アイコンが「ネ」に見えて素敵ですね.
匿名性を高めた決済用通貨を狙っているようなので, 今後期待できそうな暗号通貨かもしれませんね.

## Mining tool

今回は以下を使いました.

https://forum.z.cash/t/nicehash-eqm-zcash-nvidia-optimized-miner-maxwell-pascal-win-linux-cpu-mining-v1-0-4c-400-sol-s-gtx-1070-stock/8188

この miner だと, 現在は nicehash pool 専用のようで, ビットコインアドレスで使います(ビットコインに逐次変換されるのかな? ZCash で持ちたい場合は違うツールとマイニングプールを使うことになりそうです)

最高 400 Sols/s と謳っていますが, こちらで動かしたところ 1070 では 360 Sols/s くらいが最大でした. 

2017/04/29 現在のレートで, 1 ヶ月動かすとだいたい 0.94 ZEC が生成され, ZEC/USD = 90 なので, 1 ヶ月で 85 USD = 9300 円くらいになります.
(電気代を除く)

## 電力効率をあげる.

日本でマイニングするには, 電気代を節約しないといけません.

`nvidia-smi` の `-pl` オプション(Power Limit)で, 消費電力を制御してみます. 1070 ですとデフォルトは 150W です.

試したところ, 100 W くらいまではあまり変化せず, そこから結構下がっていき下限の 76 W では 250 Sols/s とかなり下がってしまいました.

GTX 1060 では 120W -> 60W と落としてもハッシュレートは  -10 % 程度の低下に収まっていたので, GPU ごとに最適値を探す必要がありますね.

1080 では 380 Sols/s(160W くらいで動作), 90W にパワーリミット設定では 320 Sols/s くらいでした.

### 追記

Pascal アーキテクチャでは, `nvidia-smi` などで 75% あたりに powerlimit することで, 1060, 1070, 1080, 1080 Ti いずれも概ね 3.6 Sol/W ~ 3.8 Sol/W が上限であることがわかりました.

1080 Ti については, さらに (Windows で MSI Afterburner を使い) memory clock を下げることで, 4.0 Sol/W(150W で 600 Sol/s)になるケースがあるのもわかりました(MSI 1080 Ti Armor 11G OC で確認).

2017/07/01 あたりでは difficulty が上昇して採掘益が減少しているので, 電力効率を高めていきたいですね!

また, EWGA の GTX 1060 では, うまく設定するとファンが回らずにイーサリアムをマイニングできていますので, これを ZCash マイニングでも実現できないか確認してみたいですね!
 
http://www.legitreviews.com/silent-ethereum-mining-evga-geforce-gtx-1060-22-mhs_195529

## TODO

* Linux で core/gpu clock を調整する方法を探す(Coolbit を設定した X11 を立ち上げないとダメ?)
* つくばもしくは生駒近辺に GPU クラスタを構築し, マイニングで構築費用をまかないつつ優秀な若人に GPU クラスタをレイトレーシングや機械学習で活用いただくスキームを確立したい.
* ディープラーニングで最適なマイニング用電力設定値を極めてくれる, 優秀なディープラーニング若人を探す旅に出たい.
CentOSにlua有効のvimを一般ユーザー権限でインストール


neocompleteを使えるようにするためにluaを有効にしたvimをインストール。
luaとvimは一般ユーザー権限でインストールした。

#環境
- CentOS 6.7
- vim  ~~7.4~~ 8.0
- lua 5.3.4

#luaのインストール
```
$ cd ~/usr/local/src/
$ wget "http://www.lua.org/ftp/lua-5.3.4.tar.gz"
$ tar xf lua-5.3.4.tar.gz
$ cd lua-5.3.4
$ make linux 
$ make install INSTALL_TOP=$HOME/usr/local
```
以下はvimのインストールのための設定

```
$ cd ~/usr/local/src/lua-5.3.4/src
$ mkdir include
$ ln -s *.h ./include
```

#vimのインストール
- ソースのダウンロード

```
$ wget "ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2"
$ tar xf vim-7.4.tar.bz2
$ cd vim74
```

最新版のvimはgithubのレポジトリに置いてある。
https://github.com/vim/vim.git
現在時点で最新のvim 8.0であれば下に書いたエラーは起こらない。

- インストール

```
$ ./configure \
	 --prefix=$HOME/usr/local \
	 --with-features=huge \
	 --enable-multibyte \
	 --enable-luainterp \
	 --with-lua-prefix=$HOME/usr/local/src/lua-5.3.4/src \
	 --enable-perlinterp \
	 --enable-pythoninterp \
	 --with-python-config-dir=/usr/lib64/python2.6/config \
	 --enable-rubyinterp \
	 --with-ruby-command=/usr/bin/ruby 
$ make
$ make install
```
- エラーが出たら

```less ./src/auto/config.log```でログを確認

今回は"undefined reference to 'luaL_optlong'"なるエラーが出た。

```
objects/if_lua.o: In function 'luaV_list_insert':
$HOME/usr/local/src/vim74/src/if_lua.c:777: undefined reference to 'luaL_optlong'
collect2: ld returned 1 exit status
```

これは```vim74/src/if_lua.c```を以下のように書き換えることで回避できる。

```
--- long pos = luaL_optlong(L, 3, 0);
+++ long pos = (long)luaL_optinteger(L, 3, 0);
```

#確認

```$ vim --version```でluaに+が付いていれば無事に完了。

#参考
[CentOS7でluaを有効にしたVimに入れ替える](http://qiita.com/silicsmz/items/b5ad3295863bb2b1de76)
[enable-luaなvim7.4をインストール](http://qiita.com/kbt48/items/a4ff903dd7a7b16e86af)
[vim で lua を使えるようにビルドしたメモ](http://d.hatena.ne.jp/satosystems/20130703/1372846553)
[Lua を一般ユーザでソースコードからインストールする](http://hatyuki.hatenablog.jp/entry/2014/04/10/140848)
働いている振りをサポートするイカれたツールを紹介するぜ！

# 前書き
 w3m！

[以上だ！](http://netyougo.com/2ch/10815.html)

# 検証環境
Debian8.6(64bit)

# w3m(ページャ/テキストベースWWWブラウザ)
[w3m(WWW-wo-Miru)](http://w3m.sourceforge.net/index.ja.html%0A)は、日本人が作成したテキストベースWebブラウザです。
その特徴は端末上でWeb検索作業できる事であり、この点はマウス無しで調査作業ができる事を意味します。
しかし、使いづらい部分が多々あったため、それらを補うスクリプトを本記事に記載しています。

# インストール方法
```
$ sudo apt-get install w3m
$ sudo apt-get install w3m-img   (注釈)端末上で画像を表示したい場合はインストールする。
```

# 起動画面
[起動書式]

```
w3m <URL>
```

[例]

```
w3m http://google.com
```

![Screenshot from 2017-04-29 12:34:54.png](https://qiita-image-store.s3.amazonaws.com/0/99011/66d900d7-588e-cfec-15f1-a4341b005342.png)


# スクリプトによる起動簡略化
w3mの使いづらい点の一つに、起動時にURLを記入しなければいけない事が挙げられます。
そこで、以下のスクリプトを用いれば、`ggle [検索ワード(複数可、スペース区切り)]`で検索ができます。

```ggle.
#!/bin/bash
# @(#) google to change argument of w3m command from URL to search word.
#
# Description : 
# Author : Nao1215
# Since  : 2017.04.29 ver 1.0.0
#
ARGS=""
ARG=""

function showUsage() {
    cat <<_EOT_
  Usage:
    ./google <search word>
  Description:
    Read this script
  Options:
    -h|--help : show usage.
_EOT_
exit 1
}

# Check args
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
    showUsage
fi

# Connect arguments as character string
for ARG in "$@"
do
    ARGS="${ARGS}+${ARG}"
done
ARGS=$(echo ${ARGS} | sed 's/^\+//')

# Start web searching
w3m http://www.google.co.jp/search?q="${ARGS}"       
```

インストール手順および使用方法は、以下の通りです。

```
$ git clone https://github.com/nao1215/BashScriptsCompilation.git -b master
$ cd BashScriptsCompilation
$ sudo ./installScripts

$ ggle ゴールデンウィーク
```
![Screenshot from 2017-04-29 13:34:55.png](https://qiita-image-store.s3.amazonaws.com/0/99011/048128d1-5acd-01c9-eb0c-6e9daad1b77d.png)

# 最後に
眠れなくて、カッとなって書いた。反省はしている。
Redisのインストールと操作感

#環境構築
Vagrant/CentOS 7でやるけど、
そのあたりは[こちら](http://qiita.com/Kenji_TAJIMA/items/3ebb65d5e81453384eee)を参照。

```
$ sudo yum install epel-release
$ wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo rpm -Uvh remi-release-7*.rpm
$ sudo yum --enablerepo=remi,remi-test,epel install redis
```

#起動
```
systemctl start redis
```

#操作感
```
[root@localhost vagrant]# redis-cli -p 6379
127.0.0.1:6379> set name kenji
OK
127.0.0.1:6379> get name
"kenji"
127.0.0.1:6379> set favorite starbucks
OK
127.0.0.1:6379> keys *
1) "name"
2) "favorite"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> append name " TAJIMA"
(integer) 11
127.0.0.1:6379> get name
"kenji TAJIMA"
127.0.0.1:6379>
```

#資料
set/getあたりが基本なの、そのあたりから読み進めるとよさげ。
https://redis.io/commands/set
androidでpush通知設定を確認、変更画面を開く

iOSだとダイアログを出してその場でpush通知を許可するか拒否するかをユーザーに促すことが出来る。
androidの場合はそのようにサッと通知設定を変更することは出来ない。

# androidのpush通知設定
そもそもandroidの場合はpush通知のパーミッション確認ダイアログが存在しない。Playストアでのダウンロード時の同意ボタンの内容に、push通知が含まれている。そのためandroidではデフォルトでpush通知許可ということになる。

じゃあandroidではpush通知を拒否するすべがないかというとそういうわけではない。アプリやpush通知を送るサーバー側で独自にフラグを持たせて通知するしないを管理することもできるが、システム設定からアプリごとに通知をブロックすることもできる。

端末 > アプリ
![Screenshot_1493477196.png](https://qiita-image-store.s3.amazonaws.com/0/2164/fb3537d2-4bb3-035b-7545-2c922063e2e8.png)

アプリを選択するとアプリごとの設定画面から「通知」を選ぶ
![Screenshot_1493477202.png](https://qiita-image-store.s3.amazonaws.com/0/2164/6f806aed-d4e9-01eb-08a0-4edc12e4c5e8.png)

このアプリからの通知をどうするか選択できる
![Screenshot_1493477208.png](https://qiita-image-store.s3.amazonaws.com/0/2164/2c4af0f9-7d54-32f8-8f98-730d672dafe3.png)


# システム設定値をいじれるのか
ここで問題になるのは、この値をアプリ側から操作できるのかということ。この値はアプリ側から操作することは出来ない。そのため、もしユーザーがここで通知をブロックしていた場合は上の画面を開いてから値を設定しないといけなくなる。

iOSのようにアプリ内でダイアログを表示して…というように比較的に簡単に操作はできず、ユーザーの手数が増えてしまうことになるがしょうがない。

# 通知設定値を取得する
通知に関して、ブロックされていたら解除を促したいという動作を要求されることは多そうだ。実際そういうものを作るとしたら、現在の設定値を取得=>ブロックされてたらアプリごとの設定画面を表示、というような流れになると思う。

というわけで、まずは現在の通知設定値を取得する。値の変更ができないだけで、現在値を取得することはできる。

```java
NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context);
boolean areNotificationsEnabled = notificationManagerCompat.areNotificationsEnabled();
```

これで今の設定値(boolean)を取得できる。ただし`areNotificationsEnabled`はサポートライブラリがv24でないと使えないので注意。
android4.3以下の場合、そもそもシステム側でアプリごとの通知許可orブロックという機能がないため、それと通知許可orブロックできるバージョンとの足並みを揃えるためにcompatを使っている。

https://developer.android.com/reference/android/support/v4/app/NotificationManagerCompat.html#areNotificationsEnabled()

# アプリごとの設定画面を開く

```java
 startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));
```

この1行でアプリごとの設定画面を開ける。ただし、これだけだと最近開いたアプリケーションにその設定画面が出てきたりスタックに入っちゃったりするので、お好みでintentのフラグを適当に設定したほうがいいかもしれない。

```java
Intent i = new Intent();
i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("package:" + context.getPackageName()));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(i);
```

参考: http://qiita.com/suzukihr/items/865e84b0a8c6b0783f42
【解決策】Sublime Textでパッケージがインストールできない（Ubuntu 17.04）

# 【解決策】Sublime Textでパッケージがインストールできない（Ubuntu 17.04）
Linuxデビューから30分程で業界の厳しさという名の冷や水を浴びせられました  

## 環境
Sublime Text 3 (Build 3126)
Ubuntu 17.04
非プロキシ

## 現象
Install Packageを行うと

> Package Control
> There are no packages available for installation 
> 公式のトラブルシューティングでも読めば解決するだろjk

と無慈悲な定型文が表示されパッケージリストが出てこない

## 解決
パッケージ追加できないSublimeなんてカツが入ってないカツ丼みたいなもんじゃないかとヤケクソに設定をいじりました。
どうやらurllibが悪さをしてるみたいで、

```json
"downloader_precedence": {
		"linux": ["curl"]
	}
```

curlさんに頑張ってもらうことで無事インストールできるようになりました。

## あとがき
己の検索スキル不足も有るかもですがこの現象に関しての情報は全くなくてちょっとこまりました。
苦し紛れに発見した解決策なのでこれが一番いい形かは不肖のnoobな私には分かりかねますが、ちゃんとした解決策が見つかるまでの繋ぎぐらいにはなるんじゃないかと思ったので投稿しておきます。
~~というか情報ないって事はこの現象にあってるのは私だけなのかな~~
LibreSSL を Visual Studio でビルドする

# はじめに

LibreSSL のポータブル版は Linux 等の Unix 系システムでは ./configure の後 make check で簡単にビルドすることができます。しかし Windows 上では少し違う手順が必要となります。

この記事では LibreSSL を Windows 上で Visual Studio でビルドする手順をまとめました。

LibreSSL を VisualStudio でビルドするためには cmake が必要となります。
以下の場所から cmake をダウンロードしてインストールしておきます。
https://cmake.org/download/

# LibreSSL の Visual Studio でのビルド手順

## (1) ダウンロードして解凍する

以下の場所から LibreSSL の .tar.gz をダウンロードして解凍します。
https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/

この記事の中では C:\work に解凍して作業しました。
ダウンロードした libressl-2.5.3.tar.gz を解凍すると libressl-2.5.3 というフォルダができます。

## (2) cmake で .sln を生成する

コマンドプロンプト(cmd.exe)を起動して解凍した LibreSSL のフォルダに cd し、build という cmake 実行用の作業フォルダを作成します。

```shell-session
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\user01>cd \work\libressl-2.5.3

C:\work\libressl-2.5.3>mkdir build

C:\work\libressl-2.5.3>cd build
```

cmake を実行します。ここではインストール先を C:\work\libressl としました。またこの後使用する Visual Studio のバージョンによって -G に指定する内容が異なるので注意が必要です。以下は Visual Studio 2015 の場合の例です。

```shell-session
C:\work\libressl-2.5.3\build>cmake -G "Visual Studio 14 2015 Win64" ^
-DENABLE_VSTEST=on -DCMAKE_INSTALL_PREFIX=C:\work\libressl ..

... 略 ...

-- Configuring done
-- Generating done
-- Build files have been written to: C:/work/libressl-2.5.3/build

C:\work\libressl-2.5.3\build>
```

cmake で -G に指定できるジェネレーターは cmake -help を実行すると Generators の所で参照できます。

![libressl_vs_01.png](https://qiita-image-store.s3.amazonaws.com/0/103043/2cafc040-5a60-f408-c872-b8ce247316ab.png)

これでビルドのファイルが作成されました。

## (3) ビルドする

cmake により作成された LibreSSL.sln をダブルクリックして Visual Studio を起動します。

![libressl_vs_02.png](https://qiita-image-store.s3.amazonaws.com/0/103043/4fb4f359-ce2a-9633-2651-07f7c9a65194.png)

メニューから「ビルド」→「ソリューションのビルド」を実行し LibreSSL をビルドします。

![libressl_vs_03.png](https://qiita-image-store.s3.amazonaws.com/0/103043/a3a9a681-ba49-1a8d-29ce-7eb7375fb0e4.png)

ビルドが完了すると上のスクリーンショットのように出力に表示されます。

## (4) テストを実行する

LibreSSL には回帰テストが付いてきます。cmake 実行時の -DENABLE_VSTEST=on というオプションはこの回帰テストを Visual Studio でも実行可能にするためのものでした。

Visual Studio 上でのテスト実行は RUN_TESTS をビルドすることにより行います。ソリューション エクスプローラー で RUN_TESTS を選択しておいて、メニューから「ビルド」→「RUN_TESTS のビルド」を実行して回帰テストを実行してみます。

![libressl_vs_04.png](https://qiita-image-store.s3.amazonaws.com/0/103043/3cb49b8e-af14-1b91-8d9c-c4d2e6729669.png)

## (5) インストールする

ビルドした LibreSSL をインストールしてみます。cmake 実行時に指定しておいた -DCMAKE_INSTALL_PREFIX=C:\work\libressl にインストールされます。

Visual Studio 上でのインストールは INSTALL をビルドすることにより行います。ソリューション エクスプローラー で INSTALL を選択しておいて、メニューから「ビルド」→「INSTALL のビルド」を実行してインストールを実行してみます。

![libressl_vs_05.png](https://qiita-image-store.s3.amazonaws.com/0/103043/4a2b9dd1-226c-cf52-4d5f-5fd46044ae78.png)

完了すると以下のように C:\work\libressl 以下に LibreSSL がインストールされます。

![libressl_vs_06.png](https://qiita-image-store.s3.amazonaws.com/0/103043/9b8e793c-bc2e-f4bd-0afd-706acdbf6fa7.png)

# まとめ

Windows 上で Visual Studio を使って LibreSSL をビルドしてみました。

OpenBSD プロジェクトは寄付を募ってます。
詳しくはこちら： https://www.openbsd.org/donations.html
chroot環境の作成

##### 下記条件でjail環境を作成しました
*    chrootを設定し自分のホームディレクトリ以上には行けない
*    実行できるコマンドは制限

### 作成手順
#### sshd_configの編集
```text:/etc/ssh/sshd_config
#Subsystem       sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp
# For chroot
Match group chroot
    PasswordAuthentication yes
    AllowAgentForwarding no
    AllowTcpForwarding no
    ChrootDirectory /home/%u
```
#### chrootグループの作成
```text:
groupadd -g 790 chroot
```
#### 制限ユーザーの作成
```text:
useradd guest
usermod -aG chroot guest
```
#### ユーザーディレクトリの設定
```text:
export CHROOTDIR=/home/guest
chmod 755 ${CHROOTDIR}
chown root. ${CHROOTDIR}
mkdir -p ${CHROOTDIR}/${CHROOTDIR}
```
#### システム系ディレクトリの設定
```text:
mkdir ${CHROOTDIR}/{etc,dev,proc,tmp,lib,lib64,bin,sbin}
chmod 755 ${CHROOTDIR}/{etc,dev,proc,lib,lib64,bin,sbin} 
mkdir -p ${CHROOTDIR}/usr/{lib,lib64,libexec,bin,sbin}
chmod 755 ${CHROOTDIR}/usr/{lib,lib64,libexec,bin,sbin}
mkdir -p ${CHROOTDIR}/usr/local/{lib,lib64,libexec,bin,sbin}
chmod 755 ${CHROOTDIR}/usr/local/{lib,lib64,libexec,bin,sbin}
mkdir -p ${CHROOTDIR}/usr/libexec/openssh/
chmod 755 ${CHROOTDIR}/usr/libexec/openssh/
mkdir -p ${CHROOTDIR}/usr/share/
chmod 755 ${CHROOTDIR}/usr/share/
```
#### システムディレクトリのマウント
###### ライブラリは１つ１つコピーするのは大変なのでディレクリをマウントさせる
```text:
DIRS="dev proc tmp lib lib64 usr/lib usr/lib64 usr/local/lib usr/local/lib64 usr/share etc/pam.d"
for DIR in $DIRS; do
    mount --bind /${DIR} ${CHROOTDIR}/${DIR}
done
```
#### GROUPSコマンド作成
```text:${CHROOTDIR}/usr/bin/groups
#!/bin/bash
id -Gn
```
#### 必要コマンドのコピー
###### コマンドは必要なものだけ限定してコピーする
```text:
COMMANDS="/usr/bin/tail /bin/sh /bin/date /bin/bash /bin/cat /bin/cp /bin/chmod /bin/ls /bin/more /bin/rmdir \
/bin/mkdir /bin/mv /bin/touch /bin/pwd /bin/rm /bin/vi /bin/env /bin/grep /usr/bin/whoami \
/usr/bin/id /usr/bin/scp /usr/bin/sftp /usr/bin/dirname /usr/bin/curl \
/usr/libexec/openssh/sftp-server /bin/ps /bin/netstat"

for COMMAND in $COMMANDS; do
    cp ${COMMAND} ${CHROOTDIR}/${COMMAND}
done
```
##### etcファイルのコピー
```text:
cp /etc/{ld.so.cache,ld.so.conf,localtime,resolv.conf} ${CHROOTDIR}/etc/
grep /etc/passwd -e "^root" -e "^guest" >> ${CHROOTDIR}/etc/passwd
grep /etc/group -e "^root" -e "^guest" >> ${CHROOTDIR}/etc/group
grep /etc/shadow -e "^root" -e "^guest" >> ${CHROOTDIR}/etc/shadow
```
ZSH 導入 Bookmarks

### Dependencies

```shell-session:
$ brew install zsh zsh-completions
```

### Bookmarks
* http://qiita.com/nenokido2000/items/763a4af5c161ff5ede68
* https://gist.github.com/mollifier/4979906
* http://bitarts.jp/blog/archives/003840.html
* http://qiita.com/takc923/items/08792b7188b5c11e0f21
* http://qiita.com/iwazer/items/5f57a80b8aac0f4e9839
* http://stackoverflow.com/questions/23399183/bash-command-prompt-with-virtualenv-and-git-branch
servletをlocal tomcat上で動かすまで

仕事でmavenを使っているのですが、pomとかは使いまわすことが多いので、
いざ自分のPCでやってみたらちょっと時間かかったので、メモ。

## 環境
PC: Macbook Pro (macOS Sierra)
JAVA:1.8.0_40
Maven:3.5.0
IDE:IntelliJ CE 2017.1

## やりたいこと
とにかくローカルでservletをtomcat7:runで起動させたい

## Mavenのインストール
brewが入っている前提ですが、

```
brew install maven
```
そうでない場合は、
http://maven.apache.org/install.html
を参考に。仕事のPCは手動で入れたので、リンクを参考に下感じになります。

```:確認コマンド
$ mvn -v
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T04:39:06+09:00)
Maven home: /usr/local/Cellar/maven/3.5.0/libexec
Java version: 1.8.0_40, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.12.4", arch: "x86_64", family: "mac"
```

## IntelliJでプロジェクト作成
New
-> Project
-> Maven
からプロジェクトを作成します。
`Create from archetype`にチェックをいれます。
archetypeに
`org.glassfish.jersey.archetypes`、`jersey-quickstart-webapp`を利用しますので
Add Archetypeから
* groupId:org.glassfish.jersey.archetypes
* artifactId:jersey-quickstart-webapp
* version:2.16

を追加して選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/03c00c85-c87b-ac21-d133-1b9362900d91.png)

あとはNextで画面のとおりに。
Finishを押すと、がががとMavenが動いて
ディレクトリ構成とサンプルのリソースpom.xml
などを生成してくれます。

こんな感じで生成されます。
gitとかは必要に応じて。
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/73788311-8e85-8ec6-558c-a82c85e5aea6.png)


## Tomcat Pluginの追加
TomcatPluginをpom.xmlに追加します。
これを
build -> plugins
配下に追加します。

```:pom.xml
:
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>9090</port>
                    <server>localhost</server>
                    <!--<path>/foo</path>-->
                </configuration>
            </plugin>
:
```



## さあ実行だ！
そして実行

```:command
mvn tomcat7:run
```

ぐりぐり動いてこんなメッセージが出てきます。

```:terminal
[INFO] Running war on http://localhost:9090/JerseySample
[INFO] Creating Tomcat server configuration at /Users/userName/Develop/Github/MyJerseySample/target/tomcat
[INFO] create webapp with contextPath: /JerseySample
4 29, 2017 10:37:28 午後 org.apache.coyote.AbstractProtocol init
情報: Initializing ProtocolHandler ["http-bio-9090"]
4 29, 2017 10:37:28 午後 org.apache.catalina.core.StandardService startInternal
情報: Starting service Tomcat
4 29, 2017 10:37:28 午後 org.apache.catalina.core.StandardEngine startInternal
情報: Starting Servlet Engine: Apache Tomcat/7.0.47
4 29, 2017 10:37:30 午後 org.apache.coyote.AbstractProtocol start
情報: Starting ProtocolHandler ["http-bio-9090"]
```

ブラウザでアクセスしてみます。
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/364e1273-9adc-a706-7c39-ab87ab8379a1.png)

Jersey resourceをクリックして
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/fdfb5485-229b-75f4-5aae-5cfd5d8ad2c6.png)

ちゃんとAPI叩けていますね！
ローカルで実行できると動作が目に見えるので、捗りますね
React.jsで二つのフォームをインライン表示したい

# React.jsで二つのフォームをインライン表示したい

teratailで[下記](https://teratail.com/questions/74299#)のように質問し、それが出来たので備忘録として書き残しておきます。


<img width="787" alt="notinline.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/c7dfc99f-29fd-b30b-8b93-233fe41ed5c3.png">

# 実装

```js
<form id="formid" onSubmit={this.handleClick}>

                    <input type="text" id="textinputspace" value={this.state.textValue} onChange={this.changeText}/>

                    <button type="submit" id="submitButton">ToDoリストを追加する</button>

                    <NewTodoLayout/>

</form>

```


# css

```css

#formid{
  display:inline-flex;
}

```

<img width="989" alt="スクリーンショット 2017-04-29 23.06.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/b7c13d76-267b-c15f-f3ac-73a9e37d9750.png">

# 参考

[React.jsで二つのフォームをインライン表示したい](http://off.tokyo/blog/2017/04/29/react-js-form-inline/)

[formタグを改行せずに横に並べる方法](http://hacknote.jp/archives/5218/)
ターミナルでLINEを起動する方法

##MacのターミナルでLINEを起動する方法

#1.LINEの場所を探す
```ruby:
$mdfind LINE.app 
```
#2.結果は以下の通り

```ruby:
/Applications/LINE.app
```
これは、Mac内のLINEapplicationの場所を示しています。

#3.2の結果をコピーし、LINEを起動する。

```ruby:
$open /Applications/LINE.app
```
特定の場所の部分を開きますという意味でもopenはわかりやすいですね。

これから、いかにターミナルだけで作業をするかを極めていきたいと思いますので、みなさん便利なコマンドがございましたら是非共有してください。
cassandraにG1GCを設定

#####
cassandraにG1GCを設定した際のjvm.optionsを内容をまとめました。

```text:jvm.options
-XX:+UseG1GC
-XX:G1RSetUpdatingPauseTimePercent=5
-XX:MaxGCPauseMillis=500
-XX:InitiatingHeapOccupancyPercent=70
-XX:ParallelGCThreads=32
-XX:ConcGCThreads=32
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintHeapAtGC
-XX:+PrintTenuringDistribution
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintPromotionFailure
-XX:PrintFLSStatistics=1
-Xloggc:/var/log/cassandra/gc.log
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=10M
```
setTimeout、setIntervalでコールバックに引数を渡したい！

以前、setTimeout()に引数を渡す際にけっこう躓いたので、備忘録。

#引数とか余裕やん？
という気持ちで初心者（私）が得意げに書いたコードが以下のもの、、

```js:test01.js
function hoge(word) {
  alert(word);
}
setTimeout(hoge('余裕やん？'), 3000);
```

三秒後にアラート表示されるだろうと思いきや、これではすぐに実行されてしまい、遅延が生じない。

あれ？なんかわからんけど関数宣言やったらダメなん・・・？
と思い、以下のコードを書いてみる。

```js:test02.js
var hoge = function(word) {
  alert(word);
}
setTimeout(hoge('え、余裕やん？'), 3000);
```

関数式でもやっぱりダメ。すぐ実行される。

#解決方法
**その1：コールバックに書けないなら、コールバックに無名関数を渡して、その中で呼び出せばいいじゃない**
なパターンが以下。これが一番主流っぽい。

```js:test03.js
function hoge(word) {
  alert(word);
}

setTimeout(function() {
 hoge('余裕やん？');
}, 3000);
```

**その2：第三引数に渡せるらしいやーん！**
一番、シンプルでわかりやすいのがこちら。ただ、IEで実現させるためには別途互換コードの記述が必要とのこと。

```js:test04.js
function hoge(word) {
  alert(word);
}

setTimeout(hoge, 3000, '余裕やん？');
```

**その3：文字列で指定もできる**

```js:test05.js
function hoge(word) {
  alert(word);
}

setTimeout("hoge('余裕やん？')", 3000);
```


####追記：

**その4：bindを使用する！（※コメントより）**

```js:test05.js
function hoge(word) {
  alert(word);
}

setTimeout(hoge.bind(this, '余裕やん？'), 3000);
```
上記の方法でも同じことが可能なようです！bind便利！

#まとめ
当時、js勉強し始めたばかりの頃に全然解決方法がわからずかなりはまりこみました。。
ところがどっこい！
ぜーんぶ！mozilla の API リファレンスページに載ってました。
>[window.setTimeout - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout)

初心者すぎるとそもそもリファレンスが読めないんですよね。。ちゃんとリファレンス読めるようになったのが、成長ということで。

※setIntervalも同じ方法で渡せます！

##追記：
第三引数を渡すパターン以外はthis値が変わってしまうようですね。
this値を変化させないことを踏まえた解決方法は以下になります。（コメントより）

```
setTimeout(function() { hoge.call(Function('return this')(),'余裕やん？'); }, 3000);

setTimeout("hoge.call(this, '余裕やん？')", 3000);

setTimeout(hoge.bind(Function('return this')(), '余裕やん？'), 3000);                 
```
[Rails] rails newする時にわりといつも行ってる手順メモ

### バージョン指定で rails new

```
gem install rails -v version
rails _version_ new app_name
```

### bundle installはパス指定で

```
echo "vendor/bundle" >> .gitignore
bundle install --path = vendor/bundle
```

### Gemfileのコメントを消す


### turbolinksは使わない

```
'data-turbolinks-track'
```

### generateコマンドで生成されるファイルを指定する 

```config/application.rb
config.generators do |g|
  g.stylesheets false
  g.javascripts false
  g.helper false
end
```

### Turbolinksは使わない

```app/views/layouts/application.erb
-    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
-    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
+    <%= stylesheet_link_tag    'application', media: 'all' %>
+    <%= javascript_include_tag 'application' %>
```

### よく使うGem

```Gemfile
gem 'slim-rails'
gem 'draper'

group :development, :test do
  gem 'pry-rails'
  gem 'pry-doc'
  gem 'pry-byebug'
  gem 'pry-stack_explorer'
end
```
CentOS7へのJenkinsインストールから立ち上げまでの手順

Jenkinsインストール　自分用メモ

	yum update -y
	yum install java-1.8.0-openjdk
	yum install wget
	wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
	rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
	sudo yum install jenkins
	vi /etc/sysconfig/jenkins
	JENKINS_PORT="8082"
	service jenkins start
	chkconfig jenkins on
	setenforce 0
	firewall-cmd --zone=public --add-port=8082/tcp --permanent
	firewall-cmd --reload
	cat /var/lib/jenkins/secrets/initialAdminPassword
	→表示されたパスワードを
	http://サーバのIPアドレス:8082/
	で入力する。
IntelliJ で Homebrew でインストールした Scala を利用する


Homebrew で scala をインストールすると以下のようなメッセージが表示されるが具体的にどのように設定すれば良いかわからなかったので整理する．

```
To use with IntelliJ, set the Scala home to:
  /usr/local/opt/scala/idea
```

1. ターミナルを開く
2. open /usr/local/opt/scala をじっこうし， Finder を開く
1. Scala Project を開く
2. File > Project Structure(Cmd + ;) を選択
3. Global Libraries を選択
4. 左上の '+' を選択
5. Scala SDK を選択
6. Browse ボタンをクリック
7. ファイルダイアログが表示される．
8. 2 で開いた Finder から idea ディレクトリをファイル選択ダイアログにドラッグアンドドロップする．
謎の座標系をEPSGに総当りして特定する

## 謎の直交座標系のファイルを目前に頭を抱えた事はないだろうか。
...普通はないと思う。
これはそんなDEMファイルを処理しないといけなくなった人の物語。
~~Qiita初投稿です。本業は海底火山ですがそれはまた別の機会に。~~

XとYがこんな感じの数字で与えられている海底地形のDEMがあった。
**(6811000, -2740000)**
CRSが分からないのでQGISに投影できない。

### まず勘で見当をつける。
数字的に直交座標系であることは間違いなさそう。単位をメートルとすると、1000kmのオーダーになるのでいかにもそんな感じである。
しかしUTM座標系であれば多くの場合Xが6桁、Yが7桁の正の数字になるところが、この座標はXが7桁、Yがなんと負の7桁である。
UTMではないか、UTMだとしても間違ったゾーン設定で作られた可能性が高い。
場所はニュージーランド沖なのでNZ国土地理院にある直交座標系をすべて試したが、全部違った。

### やっぱり自動化
そういう訳で特定は諦め、機械に頼ることにした。
方針は以下の3点。
1. [Projモジュールの座標変換機能(transform)](https://jswhit.github.io/pyproj/)を使ってEPSGコード(取り敢えず1000~40000まで)に総当りを行う
2. 事前情報としてこの座標がNZ北方、南緯-32~-30度の間にある事が分かっていたので、WGS84に変換を試みた後、これを用いて結果をフィルタリング(def isvalid)する
3. XとYが入れ替わっている可能性も考え、1つのEPSGコードごとに入力側と出力側合わせて4通りを検討する(def check)

````python:　GIS_WarpWarp.py
from pyproj import Proj, transform
x1, y1 = 6811000, -2740000
WGS84 = Proj(init='epsg:4326')

## 出力された座標が妥当かを返す。事前情報はここに。
def isvalid(x,y):
    if y<-32.0 or -30.0<y: return False
    return True

def check(epsg):
    if(epsg % 10000 == 0): print('=> ',epsg)
    ## 第1関門：未定義EPSGだった場合はここでRuntimeErrorが返る。
    try:
        if(epsg<10**4): proj1 = Proj(init=('epsg:%04d' % epsg))
        elif(epsg<10**5): proj1 = Proj(init=('epsg:%05d' % epsg))
        elif(epsg<10**6): proj1 = Proj(init=('epsg:%06d' % epsg))
    except RuntimeError: return None
    ## 第2関門：座標変換を試みる。変換不可能ならRuntimeErrorが返る。
    try: x2,y2 = transform(proj1, WGS84, x1,y1)
    except RuntimeError: pass
    else:
        if isvalid(x2,y2): print(epsg, x1,y1, x2,y2)
        if isvalid(y2,x2): print(epsg, x1,y1, y2,x2)
    ## 第3関門：XとYを入れ替えて座標変換。
    try: x2,y2 = transform(proj1, WGS84, y1,x1)
    except RuntimeError: pass
    else:
        if isvalid(x2,y2): print(epsg, y1,x1, x2,y2)
        if isvalid(y2,x2): print(epsg, y1,x1, y2,x2)

## という感じでリスト内包表記を使って1000~40000に総当り。
void = [check(i) for i in range(1000,40000)]
````
実行すると、**epsg, x1,y1, x2,y2**という形でブアーッと出力される。
> 3795 6811000 -2740000 -12.248595429748068 -31.56469346681908
> 3950 6811000 -2740000 24.482815965032906 -31.5999781135824
> **3994 6811000 -2740000 -179.0469481850484 -31.112571615808832**
> 4455 6811000 -2740000 1.938224862502011 -30.09909426737733
> 4855 -2740000 6811000 46.07814966253316 -31.334547234623837

さがしていたのはこれ(EPSG:3994 Mercator41)でした。なんじゃそりゃー。
どうもニュージーランド大気海洋局のCRSらしい。NZ国土地理院のサイトを探しても見つからないわけだ…。
[Unity]  アウトライン Outline - 概念篇

# Outlineはなんだ？
いわゆる以下の効果：
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/b965e25a-c5ed-5a81-20f1-881b752bdf15.png)
或いはエッジ、境界線など、物の外側の縁のこと。

これはとてもよく使われるエフェクトだけど、なぜか未だにネット上完璧なOpenSourceが見つかれない、シェルダーの勉強に兼ねていろいろ研究してみた。

# 作り方と問題
簡単に言えば、物をコピーして、ちょっと拡大して、全部同じ色にして、元の物の後ろで描画すればいい。

### モデル拡大法
モデルの点を法線の方向に沿って移動し、マテリアルは単色にして、背面描画すること。
これは一番よく見かける手法で、この方法で作った結果：
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/27d258db-7d70-433e-cc42-5441e82c76c1.png)
スフィアの場合問題ないけど、キューブの場合は破綻が生じる。
この方法なら、Outlineの幅が大きすぎることができない。

### 後処理による方法
元々Outlineは2Dの効果で、PHOTOSHOPなどのソフトウェアは常備の機能の一つだ。
概念は同じですが、こっちは2D的な拡大方法を使う。まずモデルのレンダリングして、そのレンダリングの結果を使って拡大する。
この方法の問題は、レンダリング後深度（カメラとの距離）がなくなる。だから、よく見かけた結果（人によってこっちが正しい場合もある）：
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/f9edc927-8fe8-aade-75bf-c786f6edeb0b.png)
キューブがスフィアの後ろなのに、Outlineだけ前になっている。

ちなみに、Unity5.5からエディター画面でOutlineが選んでいるものについている。上の状況なら、結果はこう：
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/49c58cc0-0a52-4d28-8b34-5c1b13490d70.png)

# 拡大について
実際、拡大は単純に物（3D的か2D的か問わず）を大きくすることではない。PHOTOSHOPの機能でその差別を見よう：
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/7868f747-03ff-3453-a76c-7f7d5aa64ab2.png)
左は単純に拡大、右はPHOTOSHOPの機能の結果。
左の結果が欲しい場合もあるが、普通Outlineは右の方だ。

# 研究成果
自分にとって完璧な結果はこう：
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/00bd1d2a-92b0-ef1f-94ad-9c3ecf47bc1d.png)
軽く実験したか、どの状況でも適用するかどうかはまだ不明。詳しくは詳細篇によろしく。
SSL系関数がインストールされている場所の確認


Apacheに静的モジュールでインストールした際に、
具体的にモジュール内で定義されている関数(今回はtls12_get_hash)が
どのような変わっていくのか確認してみました。

### opensslを共有ライブラリ、Apacheのmod_sslをDSOでインストールした場合
##### libsslにあるtls12_get_hashを利用
```text
# readelf -Ws /usr/local/ssl/lib/libssl.so.1.0.0 | grep tls12_get_hash
   757: 0000000000037950    85 FUNC    GLOBAL DEFAULT   11 tls12_get_hash
   825: 0000000000037950    85 FUNC    GLOBAL DEFAULT   11 tls12_get_hash
```

### opensslを非共有ライブラリ、Apacheのmod_sslをDSOでインストールした場合
##### mod_sslにあるtls12_get_hashを利用
```text
# readelf -Ws /usr/local/apache2/modules/mod_ssl.so | grep tls12_get_hash
  5529: 0000000000077c80    85 FUNC    LOCAL  DEFAULT   11 tls12_get_hash
```
### opensslを非共有ライブラリ、Apacheのmod_sslを静的モジュールとしてインストールした場合
##### httpdにあるtls12_get_hashを利用
```text
# readelf -Ws  /usr/local/apache2/bin/httpd | grep tls12_get_hash
  5915: 0000000000501860    85 FUNC    GLOBAL DEFAULT   13 tls12_get_hash
  8305: 0000000000501860    85 FUNC    GLOBAL DEFAULT   13 tls12_get_hash
```
今日がプレミアムフライデーの週なのか調べる

#プレミアムフライデーのお知らせを出したい
そんな依頼が舞い込んできて、久しぶりにJSを触りました。

###プレミアムフライデーの週、月〜金まで１週間表示させたい
****
ということだったので、その月のプレミアムフライデーの日付を取得する**[get_premium_friday()](http://qiita.com/pinoxox/items/dab127176d1f19936699)**を参考~~（丸パクリ）~~にさせて頂き、月〜金を判定するようにしました。

　
###わんぽいんと
****
getDate()では、時間まで取得されて比較されてしまうので、一度日付だけにして判定をしています。
if文がプレミアムでない日を判定していますので、間違えないようにしてください。

```js:premium_week.js

var today	= new Date();
var year	= today.getFullYear();
var month	= today.getMonth();
var date	= today.getDate();
	
var premium_friday = get_premium_friday(year,month).getDate();
	
if (date < (premium_friday - 4) || premium_friday < date ) {
	//※※※※※※※※※プレミアムではない処理を書く※※※※※※※※※※※※
	alert("not remium week...");
} else {
	//※※※※※※※※※プレミアムな処理を書く※※※※※※※※※※※※
	alert("PREMIUM WEEK!!!");
}



function get_premium_friday(year,month) {
	var date			= new Date(year, month, 1);
	var weekday			= date.getDay();
	var day_4week		= new Date(year, month, 7*3 + 6 - weekday);
	var day_5week		= new Date(year, month, 7*4 + 6 - weekday);
	var end_of_month	= new Date(year, month + 1, 0);
	return (day_5week > end_of_month ? day_4week : day_5week);
}


```
列挙型から文字列の配列を作る

列挙型の定数名を使って文字列の配列を作るときのテクニック
http://stackoverflow.com/a/10966395/4233892
関数型マクロを受け取る関数型マクロを使うことで、
情報の列挙を一回だけにすることができます。

```test.c
#include <stdio.h>
#define TABLE(FUNC) \
FUNC(red) \
FUNC(blue) \
FUNC(lime)

#define ENUM(COLOR) COLOR,
#define STRING(COLOR) #COLOR,

enum color{TABLE(ENUM) color_last}; /*{red,blue,lime,color_last} になる*/

int main(){ 
 char *table[color_last] ={TABLE(STRING)}; /*{"red","blue","lime",} になる*/
 int i;
 for(i=0;i<color_last;i++){
  printf("%d : %s\n",i,table[i]);
 }
 return 0;
}
```

結果

```
0 : red
1 : blue
2 : lime
```
Apache2.4を静的モジュールでインストール


#####
Apche2.4でデフォルトではDSOでモジュールがインストールされますが
パフォーマンスの観点からすべて静的モジュールでインストールする
場合には下記のようにconfigureでstaticを明示するようにしています。

```text
./configure \
--enable-authz_host=static  \
--enable-authz_core=static  \
--enable-mime=static  \
--enable-mime_magic=static  \
--enable-log_config=static  \
--enable-env=static  \
--enable-headers=static  \
--enable-setenvif=static  \
--enable-proxy=static  \
--enable-proxy_connect=static  \
--enable-proxy_wstunnel=static  \
--enable-proxy_ajp=static  \
--enable-unixd=static  \
--enable-status=static  \
--enable-dir=static  \
--enable-alias=static  \
--enable-ssl=static  \
--enable-socache_shmcb=static  \
--enable-cgi=static  \
--enable-slotmem_shm=static \
--enable-deflate=static \
--enable-rewrite=static \
--with-ssl=/usr/local/ssl \
--with-mpm=event \
--with-included-apr \
--with-expat=builtin
```
kintone データビューア・テンプレート

#kintone データビューア

簡単にアプリ検索とデータ表示が出来るデータビューアです。

- グリッド表示とピボット表示が選択できます。
- 対象レコード件数が多い場合は、REST APIをパラレル実行

ベータ版テンプレートを [STORES](https://rex0220.stores.jp/items/590487af997ee2a11f007285) で公開中です。
ご興味のある方は、お試しください。

グリッド表示
![2017-04-29_19h43_19.png](https://qiita-image-store.s3.amazonaws.com/0/100572/3e87e590-d7c4-4ec0-daa8-416cc3b35aa4.png)


ピボット表示
![2017-04-29_20h20_52.png](https://qiita-image-store.s3.amazonaws.com/0/100572/01a4ca06-eedd-e302-ec59-e9363993b762.png)


# kintone テンプレート

[アプリテンプレートとは](https://help.cybozu.com/ja/k/admin/whats_template.html)

kintone は、アプリをテンプレート化することができます。
テンプレートは、zip ファイルとして書き出し、他のkintone 環境に読み込むことができます。

![2017-04-29_19h45_15.png](https://qiita-image-store.s3.amazonaws.com/0/100572/7f2bb68c-6dcc-1956-e282-e8cc264c8ad7.png)



アプリには、JavaScript カスタマイズの内容も含まれますので、テンプレートからアプリを作成すると、そのままJavaSCript が動作します。

# テンプレートからアプリ作成

![2017-04-29_20h55_18.png](https://qiita-image-store.s3.amazonaws.com/0/100572/e71b8e69-72c9-8bc9-3192-7e74136321bc.png)


# データビューア操作例


![2017-04-29_21h02_44.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/9f8f9b47-1762-1ebd-15fd-278eb9e02582.gif)

# 操作方法

## アプリの選択

- クリックすると、アプリ一覧表示
- APPID、名称の一部を入力してフィルタリング

![2017-05-01_13h46_34.png](https://qiita-image-store.s3.amazonaws.com/0/100572/eb2ab83e-b9d9-3a99-b290-d41096a8d5d0.png)

## 一覧の選択

- クリックすると、一覧表示
- 名称の一部を入力してフィルタリング

一覧で設定された抽出条件・項目で対象レコードを抽出します。

![2017-05-01_13h49_51.png](https://qiita-image-store.s3.amazonaws.com/0/100572/ca1d270b-4947-2ce9-829c-8974874845e4.png)


## 表示

- グリッド
    - 項目の１文字フィルター
    - 項目のソート
    - 項目位置変更
    - 項目の表示／非表示
    - グループ表示
    - 全面表示
    - Excel/csv/html/json ダウンロード

- ピボット
    - 表示形式　Table/ Heatmap/ Bar chrat/ Line chart/ ...
    - 集計　Count/ Sum/ Average/ Max/ Min/ First/ Last/ ...
   
## 表示件数

最大抽出レコード数を指定します。

## パラレル度

レコード抽出APIを指定値（１～５）でパラレル実行します。

##　出力ファイル名

グリッド表示のダウンロード時のファイル名を指定します。

- タイトル
- タイトル_YYYYMMDD
- タイトル_YYYYMMDD_HHMM
cloudflareのTwitterを監視する

#####
cloudflareはTwitterアカウントの@CloudflareSysで障害情報を報告しているので
ここを監視して指定したキーワードに引っかかったら
メール通知するようにしました。

### 処理内容
---

*    @CloudFlareSysのTwitterタイムラインの最新メッセージを取得
*    前回のメッセージの違っていると更新されたと判断
*    キーワード(ここではTokyo,DNS)が含まれていたらメール送信
*    スクリプトはcronで定期実行

### スクリプト本体
---
```py3:cdn_tw_check.py
#! /usr/local/python/bin/python

from twitter import *
import configparser
import shelve
import pyzmail
import os

confpath = os.path.join(os.path.dirname(__file__), 'settings.ini')
dbpath =  os.path.join(os.path.dirname(__file__), 'twmsg')

conf = configparser.ConfigParser()
conf.read(confpath)

db=shelve.open(dbpath,"c")
twmsg={}

OAUTH_TOKEN = conf.get('twitter','OAUTH_TOKEN')
OAUTH_SECRET = conf.get('twitter','OAUTH_SECRET')
CONSUMER_KEY = conf.get('twitter','CONSUMER_KEY')
CONSUMER_SECRET = conf.get('twitter','CONSUMER_SECRET')
TARGET_NAME = conf.get('twitter','TARGET_NAME')

SENDER = conf.get('mail','SENDER')
RECIPIENTS = conf.get('mail','RECIPIENTS')
SUBJECT = conf.get('mail','SUBJECT')
PREFERED_ENCODING = conf.get('mail','PREFERED_ENCODING')
TEXT_ENCODING = conf.get('mail','TEXT_ENCODING')
SMTP_HOST = conf.get('mail','SMTP_HOST')

mail_flag=False

def msgsend(text_content):
   payload, mail_from, rcpt_to, msg_id=pyzmail.compose_mail(\
      SENDER, \
      [RECIPIENTS], \
      SUBJECT, \
      PREFERED_ENCODING, \
      (text_content, TEXT_ENCODING), \
      html=None, \
      attachments=None)

   ret=pyzmail.send_mail(payload, mail_from, rcpt_to, SMTP_HOST)

tw=Twitter(auth=OAuth(OAUTH_TOKEN,OAUTH_SECRET,CONSUMER_KEY,CONSUMER_SECRET))
nowmsg=tw.statuses.user_timeline(screen_name=TARGET_NAME)[0]["text"]


twmsg = {TARGET_NAME:db.get(TARGET_NAME,"")}
lastmsg = twmsg[TARGET_NAME]

db[TARGET_NAME] = nowmsg
db.close()

if lastmsg != nowmsg :
   for i in conf.get('keyword','ERROR').split(","):   
      if nowmsg.find(i) > -1:
         mail_flag=True

if mail_flag:
   msgsend(nowmsg)
```

### 設定ファイル
```ini:settings.ini
[twitter]
OAUTH_TOKEN=***
OAUTH_SECRET=***
CONSUMER_KEY=***
CONSUMER_SECRET=***
TARGET_NAME=@CloudFlareSys

[mail]
SENDER=<Sender Email Address>
RECIPIENTS=<Recipient Email Address>
SUBJECT="CloudFlare Tweet Message"
PREFERED_ENCODING=iso-8859-1
TEXT_ENCODING=iso-8859-1
SMTP_HOST=<SMTP HOST>

[keyword]
ERROR=Tokyo,DNS
```
[github](https://github.com/yan164/cloudflare_twitter_check)にも置きました
さくらのVPSでUbuntu16.04を建てた

[さくらのVPS](vps.sakura.ad.jp)
自分のノートPCが重すぎて、ブラウザで検索+開発が成り立たないので開発を外部でやろうという試み

## はじめに
コマンドなどの細かい説明は省きます。
また、正直なところiptablesはよく分かっていません。

## 契約する
2週間はお試し期間で無料なので使いにくかったらやめることも出来る。

## OSインストール
標準インストールでUbuntu16.04を選択
パスワードは適当に設定
(ここで、`root`ユーザパスワードを設定と書いてあるが、実際は **ubuntu** ユーザなので注意)
インストールが終わるまで待つ

## ログイン
### まずは標準ユーザにログイン
sshの設定などができていないはずなので、VNCコンソールからログイン

```
user: ubuntu
passwd: さっき設定したやつ
```
先ほども書いたが、ユーザは`root`ではなく`ubuntu`なので注意
(自分は気が付かずに30分くらい引っかかった)

### rootログイン
以下のコマンドでrootにログイン

```
$ sudo su -
パスワードはubuntuユーザのやつ
```

## OSのアップデートをかける
ソフトウェアが古い場合があるので、以下のコマンドで更新しておく

```
# apt update
# apt upgrade -y
```

## ついでの設定
`sudo`するときにいちいちパスワードを聞かれる
割と手間なので聞かれないように変える
`visudo` して変更

```diff
-%sudo ALL=(ALL:ALL) ALL
+%sudo ALL=(ALL:ALL) NOPASSWD: ALL
```
ちなみに visudo で起動するエディタは nano なので別のエディタに変えたい人は以下を参照
[Ubuntuのvisudoエディタが変nanoになる](http://takuya-1st.hatenablog.jp/entry/20110423/1303585363)

## sshの設定
まずはsshサーバをインストール

```
# apt install openssh-server
```

22番は有名すぎるのでをとりあえず変えておく
`/etc/ssh/sshd_config` を編集

```diff
-Port 22
+Port xxxxx
```
sshサーバを再起動

```
# systemctl restart ssh
```

## iptables(firewall)の設定
よく見かける方法だと、`iptables`コマンドで設定した内容を`iptables-persistent`を使って保存しておくようだが、さくらのVPSの標準では`/etc/iptables/iptables.rule`というファイルにiptablesの設定が記述されているみたい
この設定は`/etc/network/if-pre-up.d/iptables`の記述内で`iptables-restore`を使って取り込まれているっぽい
`/etc/network/if-pre-up.d/*`はネットワークの起動時に読み込まれるらしい(らしい)
なのでそのファイルを変更して設定を反映した
先ほど設定したsshのポートの部分だけ修正
`/etc/iptables/iptables.rule`

```diff
 *filter
 :INPUT ACCEPT [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [0:0]
 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 -A INPUT -p icmp -j ACCEPT
 -A INPUT -i lo -j ACCEPT
--A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
+-A INPUT -m state --state NEW -m tcp -p tcp --dport xxxxx -j ACCEPT
 -A INPUT -j REJECT --reject-with icmp-host-prohibited
 -A FORWARD -j REJECT --reject-with icmp-host-prohibited
 COMMIT
```
更新した`iptables.rule`を取り込み

```
# iptables-restore < /etc/iptables/iptables.rule
```
本当はufwを使って設定しようと思ったのだが、良くわからなかった...


## sshで接続する
ローカルのターミナルなどから`ssh`コマンドによってログインする
さくらのVPSコントロールパネルからipもしくはホスト名を取得しておく

```
$ ssh ubuntu@{$hostname}
```
ログインできれば成功