OmniAICreator/Qiita-1.07M huggingface dataset:
散文的なElasticsearch のメモ

## 散文的な感じです

+ /etc/sysconfig/elasticsearch
  + ES_HEAP_SIZE=2g # サーバの半分くらいにしておく
  + MAX_LOCKED_MEMORY=unlimited
+ /etc/elasticsearch/elasticsearch.yml
  + bootstrap.mlockall: true
  + script.groovy.sandbox.enabled: true # カスタムのScore構築のため
  + discovery.zen.ping.multicast.enabled: false
  + discovery.zen.ping.unicast.hosts: ["gessy0129-test"] # 自動クラスタリングの防止（本番環境時はelasticsearch サーバーの名前を指定したい）

## ログpath

```
/var/log/elasticsearch
|--archive
|  |--gessy0129-test.log　←現在のログ
|  |--gessy0129-test.log.2015-08-24.gz  ← .gz形式でDailyでローテートされる
|--gessy0129-test_index_indexing_slowlog.log
|--gessy0129-test_index_search_slowlog.log
```

```bash
$ /usr/local/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/2.5.0

$ curl -XPUT localhost:9200/index_name/_alias/index_name_alias
$ curl -XPUT localhost:9200/index_name_v2/_alias/index_name_alias

$ curl -XPOST localhost:9200/_aliases -d '
  { "actions" : [{ "remove" : { "alias" : "index_name_alias", "index": "index_name" }}] } '
```

### メモ

+ 同じindex上異なるmapping があった時、mapping のnameが同じでも、type（string等）が違うった場合、mappingをまたいだ検索の時に適切な検索が行われない
  + どのmapping.typeのが表示されるかは基本的に「運」っぽい
  + 複数mappingで同じnamaを使用する場合はtypeをあわせよう。analyzeなども異なると動かないぞ！
Google Compute Engine で Windows2012 を起動する


あまり日本語の記事がなかったので、Google Compute Engine(以降、GCE)で、WindowsServer2012 のインスタンスを作成してリモートデスクトップで接続するまでの手順を書きます。
ちなみに用途は、検索順位チェックツールGRC を動作させるためです。

## 各変数の説明

変数は、各自の環境に合わせて変更してください

```
export CLOUDSDK_COMPUTE_ZONE="us-central1-f"
export CLOUDSDK_COMPUTE_REGION="us-central1"
export PROJECT_NAME="GoogleCloudプロジェクト名"
export INSTANCE_NAME="新規作成するインスタンス名"
```

ゾーンは、性能がよさげな ivy Bridge を使いたいので、今回は us-central1-f を使用します。

[各ゾーンの説明](https://cloud.google.com/compute/docs/zones?hl=ja&_ga=1.262519112.53542376.1445628250)

## gcloud のインストール

```
curl https://sdk.cloud.google.com | bash
exec -l $SHELL
gcloud init
```

## default 値の設定

```
gcloud config set app/zone $CLOUDSDK_COMPUTE_ZONE
```


## インスタンス作成
https://cloud.google.com/sdk/gcloud/reference/compute/instances/create

```
TODO: 作成途中
```

## インスタンス起動・停止

```
gcloud compute instances start $INSTANCE_NAME
gcloud compute instances stop $INSTANCE_NAME
```

## リモートデスクトップ用パスワードの初期化

Windowsの場合は RemoteDesctop から接続します

```
gcloud beta compute --project $PROJECT_NAME reset-windows-password $INSTANCE_NAME --zone $CLOUDSDK_COMPUTE_ZONE
```
FontFaceSet

# 新しくなったFontFaceSet
## はじめに
最近ChromeのWebFonts周りをいじっていて、練習がてら実装したFontFaceSetの機能を紹介します。JavaScriptからdocument.fontsで参照できるアレです。

## 仕様
[CSS Font Loading API](https://drafts.csswg.org/css-font-loading/)で定義されています。最近setlike、maplikeの仕様が出てきたので、FontFaceSetも追従してsetlike&lt;FontFace&gt;としての振る舞いを実装する事になりました。

## Chromeでの実装（47以前）
FontFaceSet自体は以前からChromeに入っていたのですが、setlikeとしての振る舞いが実装されておらず、最新の仕様書に追従できていませんでした。

## 新しい実装（48以降）
setlikeとしての振る舞いをフルに実装しています。具体的にはentries()、keys()、values()と言った関数が呼べるようになっており、for...of構文などでiteratorとして回せるようになりました。

# 余談: setlikeとWeb MIDI API
もともとECMA Script 6の機能としてSetとMapが定義されていたのですが、Web MIDIでMIDIInputMap、MIDIOutputMapの議論をしている際、標準的なツールとしてreadonlyなMapが欲しいよね、という議論から派生してmaplike、setlikeが誕生しました。WebIDLも更新され、今では当たり前のようにあちこりの仕様で利用されています。Chromeの実装ではmaplikeを使ったインタフェースはいくつかあったのですが、setlikeは今回が初めてです。

Web MIDI自体はまだまだ限られた一部のユーザのみが喜んで使っている状況ですが、仕様の面ではわりと普段使いの機能に食い込んでますね。

maplike、setlike以外にPromiseなんかも一番乗りでした。

[Permissions API](https://w3c.github.io/permissions/)でもWeb MIDIのためにPermissionDescriptorという概念を導入してもらっています。

[Prefer Secure Origins For Powerful New Features](https://www.chromium.org/Home/chromium-security/prefer-secure-origins-for-powerful-new-features)の方針に従って出荷されたAPIとしても最初期のものです。

AndroidでChromeベースのWebViewがOSとは独立してアップデートされるようになってから追加された（WebViewのAPIに影響を与えた）最初のAPIでもあります。今までAndroidはAPI levelで互換性を維持してきましたが、Web MIDI以降はAPI levelとは独立して[PermissionRequest](http://developer.android.com/intl/ja/reference/android/webkit/PermissionRequest.html)に渡る文字列のバリエーションが増える事になりました。（blacklistでpermission判定していた人はwhitelistに変更しましょう、将来追加される未知のpermissionを認めることになってしまいます）。SDK的にはAPI level 23以降でRESOURCE_MIDI_SYSEXが使えますが、22以前でも"android.webkit.resource.MIDI_SYSEX"を文字列として指定すれば判定できます。

# 閑話休題
さて、FontFaceSetの話に戻ります。知っている方は知っていると思いますが、[Chrome Platform Status](https://www.chromestatus.com/)というページでChromeにおける新機能の実装状況が確認できます。今回のFontFaceSetについては[こちら](https://www.chromestatus.com/feature/4594172182921216)がエントリとなります。[サンプルコード](https://googlechrome.github.io/samples/font-face-set/index.html)のリンクもありますので、ぜひご活用ください。
非公開なクラスの非公開なメソッドを呼び出したい

**自作のSDK・ライブラリ**を組み込んでテスト実装をしている時にどうしても非公開クラスの非公開メソッドを叩きたい、DBデータを参照したい。という時に使ったり使わなかったり。

いわゆるObjective-Cの黒魔術。
今回は黒魔術でも入門向けな黒魔術。

## 黒魔術の概要

どれも以下のインポートが必要です。

~~~objc
#import <objc/runtime>
~~~

#### 非公開なクラスオブジェクトを取得する

~~~objc
id classObject = objc_getClass("MyLibraryDataManager");
~~~

#### もう一つのアプローチ
コメントにて頂いた方法です。こちらはimportが必要ありません。

~~~objc
id classObject = NSClassFromString(@"MyLibraryDataManager");
~~~

#### メソッドを実行する
~~~objc
// クラスメソッド.
[[classObject class] performSelector:@selector(someMethod)];
// インスタンスの取得
id instance = [[classObject class] performSelector:@selector(new)];
// インスタンスメソッドの実行
id retValue = [instance performSelector:@selector(instanceMethod)];
~~~

クラス名は知っている前提、メソッド名も知っている前提でのみ動きます。

#### 実用編
非公開なDB管理クラスのコンテキストを取得して、格納されているデータの数が知りたい。みたいな状況。実用編と書きつつ、実用的でない限定的な話。

~~~objc
// undeclared-selectorのワーニングを出さないようにする
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"

// クラスを取得し、シングルトンなインスタンスを取得.
id managerClass = objc_getClass("MyLibraryDBManager");
id managerInstance = [[managerClass class] performSelector:@selector(sharedManager)];

// プライベートに実装されているmanagedContextメソッドを実行し、contextを取得
NSManagedObjectContext* context = [managerInstance performSelector:@selector(managedContext)];

// warning無視を終了
#pragma clang diagnostic pop

// 以下CoreData fetch
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyDBEntityName" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    
// 件数を取得
NSInteger count = fetchedObjects.count;
~~~

上記の実装は以下を知っていること前提です。
- 非公開なクラスの名前
- このクラスがsharedManagerというクラスメソッドでシングルトンインスタンスを取得できる
- managedContextというプライベートなメソッドが色々やっている
- DBのエンティティ名
- これらのインターフェースには変更がない。または変更を即時反映できる。

と、かなり限定的です。使う機会はないでしょう。

## 注意点

今回は、自分が知っているライブラリのデータを参照しました。

接続先サーバーのURLを生成するAPIを知っていて、それを実装側で確認したい。また、CoreDataに格納されているデータ数を公開APIにはない方法で取得したい。等です。
これくらいなら使っても良いと思います。

ただし、自分が開発中のプロジェクトでこのようにデータを参照しなければならなくなった場合、これは**設計ミス**です。
必要なAPIが実装されていない上に、それを変更できずに無理やり参照する必要があるのは**異常**です。

何が問題かというと、変更に耐えられないことです。
今回実装したものは全て決め打ちで文字列を打ち込んで実行しています。もちろんメソッド名が変更されたらクラッシュします。
しかもコンパイル時点では気づきません。リリース後なんて目も当てられません。

## まとめ
黒魔術は入門編であっても、黒魔術です。
用途はデバッグ、または単体テストにとどめましょう。
AdminLTEのdaterangepickerをDatePickerまたはDatetimePickerとして使いたい


AdminLTEを使ってる方で、DatePickerとdaterangepickerさらにDatetimePickerがpluginに入ってなかったから別でダウンロードして、結局同じようなpluginを３つも読み込んで使ってたりしてませんか？
それぞれオプションが全く違うし、イライラされてるんではないでしょうか。
そこで、daterangepickerのみ読み込んでDatePicker、DatetimePickerとして使う方法を紹介します。
##ソース
```html
<!DOCTYPE html>
<html>
  <head>
    <!-- Bootstrap 3.3.5 -->
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
    <!-- Theme style -->
    <link rel="stylesheet" href="admin_lte/css/AdminLTE.css">
    <link rel="stylesheet" href="admin_lte/css/skins/skin-black.css">
    <!-- daterange picker -->
    <link rel="stylesheet" href="plugins/daterangepicker/daterangepicker-bs3.css">
    <!-- jQuery 2.1.4 -->
    <script src="plugins/jQuery/jQuery-2.1.4.min.js"></script>
    <!-- Bootstrap 3.3.5 -->
    <script src="bootstrap/js/bootstrap.min.js"></script>
    <!-- AdminLTE App -->
    <script src="admin_lte/js/app.min.js"></script>
    <!-- daterange picker -->
    <script src="plugins/daterangepicker/moment-with-locales.js"></script>
    <script src="plugins/daterangepicker/daterangepicker.js"></script>
    <script type="text/javascript">
    $(function(){
    	moment.locale('ja');
    	$('input.form-control.date').daterangepicker({
    		timePicker: false,
    		singleDatePicker: true,
    		format: 'YYYY-MM-DD'
    	});

    	$('input.form-control.datetime').daterangepicker({
    		timePicker: true,
    		timePickerIncrement: 10,
    		singleDatePicker: true,
    		format: 'YYYY-MM-DD HH:mm'
    	});
    });
    </script>
  </head>
  <body>
  <div class="container">
    <div class="row">
        <div class='col-sm-3'>
            <div class="form-group">
                <div class="input-group">
                    <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span>日付</span>
                    <input type="text" class="form-control date" />
                </div>
            </div>
            <div class="form-group">
                <div class="input-group">
                    <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span>日時</span>
                    <input type="text" class="form-control datetime" />
                </div>
            </div>
        </div>
    </div>
  </div>
  </body>
</html>
```
##日付
<img width="170" alt="2016-01-12_13h42_49.png" src="https://qiita-image-store.s3.amazonaws.com/0/68254/a405ca7b-0b3a-30d1-3453-8088d237938e.png">
##日時
<img width="182" alt="2016-01-12_13h43_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/68254/84773b38-146c-9c91-61e0-1200435ec727.png">

##まとめ
これですっきりしましたね！
Mac OS Xでmkpasswdをインストールする

何かとよく出会う`mkpasswd`コマンドですが、MacではHomebrewで`expect`をインストールすると使えるようになります。

現バージョンだと次のコマンドでインストールできます。

```bash
brew install tcl-tk --without-tcllib
brew install expect --with-brewed-tk
```
Tableをアコーディオンにする。

テーブルのセルをクリックすると、下の行が表示される。もう一度クリックすると非表示になる。

```html5
<table class="table table-bordered ">
    <thead>
        <tr>
            <th>題名</th>
            <th>時間</th>
        </tr>
    </thead>

    <tbody>
	<tr class="item-done clickable" data-toggle="collapse" data-target="#accordion5">
        <td>このカラムをクリックするとメニューを出し入れできる。</td>
        <td>9m25s</td>
    </tr>
    <tr>
        <!-- ここのstleは!importantを使ってcssファイルにした方が良い -->
        <td colspan="2" style="padding:0px">

            <div id="accordion5" class="collapse">
                <ol type="a" style="background-color:white;">
                    <li><a>メニュー１</a></li>
                    <li><a>メニュー２</a></li>
                    <li><a>メニュー３</a></li>
                </ol>
            </div>
        </td>
    </tr>
```
Unity上からAndroidのステータスバーをいじる メモ



##■Unity上からAndroidのステータスバーをいじる

```
class StatusBarChanger {
    private static int newStatusBarValue;
 
    public static void Show() {
        #if UNITY_ANDROID
            setStatusBarValue(2048); // WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
        #endif
    }
 
    public static void Hide() {
        #if UNITY_ANDROID
            setStatusBarValue(1024); // WindowManager.LayoutParams.FLAG_FULLSCREEN; change this to 0 if unsatisfied
        #endif
    }
 
    private static void setStatusBarValue(int value) {
        newStatusBarValue = value;
        using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
            using (var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) {
                activity.Call("runOnUiThread", new AndroidJavaRunnable(setStatusBarValueInThread));
            }
        }
    }
 
    private static void setStatusBarValueInThread() {
        #if UNITY_ANDROID
        using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
            using (var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) {
                using (var window = activity.Call<AndroidJavaObject>("getWindow")) {
                    window.Call("setFlags", newStatusBarValue, newStatusBarValue);
                }
            }
        }
        #endif
    }
}

```

## ■Androidネイティブプラグイン等の参考ページ

http://qiita.com/otmb/items/98a4472674a561d93900

http://qiita.com/Gazyu/items/68ef5f8e60500575932b

http://tasogare66.blog.fc2.com/blog-entry-66.html

http://wannabe-jellyfish.hatenablog.com/entry/2015/02/22/000923

http://wannabe-jellyfish.hatenablog.com/entry/2015/02/22/000923
手動スクレイピングの話題

muran001さんの記事を拝見していて、自分だったらどう書くかやってみました。
[プログラムいらず！vimで手動スクレイピング - Qiita](http://qiita.com/muran001/items/7a76a1c70aa12ed68cb6)

bashからなら

```
wget  http://b.hatena.ne.jp/ctop/it -O- -q | grep -oP '(?<=href=").+?(?=")'
```

vimからなら

```
:r !wget  http://b.hatena.ne.jp/ctop/it -O- -q | grep -oP '(?<=href=").+?(?=")'
```
です。

必要に応じて aタグに限定したり、>を改行に変えたりします。
GNUなGrepが無い場合には動かないのでsedでやってみることが多いのですが、覚えきれていないので、今回試してみるうちに、grepのPオプションが簡単そうなのでメモ代わりに投稿します。

ひとまずこんな感じで書き捨てることが多いです。
元記事にある通りに、エディタの中で完結した方が、ヘッダとかを手動削除できたりできて
便利だと思いますが、今のところvimの編集処理にそんなに自身が無いので、
テンポラリのファイルを作りながら上記のような手順でやることが
多い気がします。
もう少しどうにかした方がよいのかもしれませんが…
自分で.gitignoreを書く

#自分で.gitignoreを書く時わからなくなったこと
普段frameworkに任せていたので、自分で.gitignoreを書こうと思ったらすぐに出てこなかったため残します。
##置く場所
基本はプロジェクト直下に起きますが、.gitignoreが置かれた階層以降を対象とするため何処でも機能するっぽい。

```
project
  files
  src
  .gitignore

```

##書き方
.gitignoreが起点になることに注意。
例えば、files直下を無視したい場合は、
```
files/aaa.txt
files/bbb.txt
files/ccc.txt
```

もしくは、ワイルドカードでまとめて無視する
```
files/*
```

bashで$git statusで確認すると、対象外になっていることがわかるであろう。
2016-01-12 Powershell > スクリプトを複数ファイルで実装する方法 > .(ドット)で別スクリプトを読込む

```txt:動作環境
Windows 8.1 pro (64bit)
```

Powershellのコードを実装するとき、１つのスクリプトファイルで実装すると見通しが悪い。

将来的には複数のスクリプトファイルに分割して実装を考えているが、そういうことができるのかどうか。

Cのincludeやpythonのimportのような機能があるか、調査中。

## .(ドット)を用いた読込み 
https://gallery.technet.microsoft.com/scriptcenter/b590021a-b311-47f9-8f48-3809658b7cbf

`. "c:\fso\include.ps1"`というやり方があるようだ。

## コード

以下で実装できた

```funcTest1.ps1
function helloTo ($name) {
	echo "hello $name"
}
```

```funcMain.ps1
. ".\\funcTest1.ps1"

helloTo("Hanako")
```

```txt:結果
hello Hanako
```
一行でCGIサーバー(1)python編

# はい、*ッターン!* 

> python -m CGIHTTPServer &

終わり。

☆以下の知識があることを前提とします。
下の方に実行例があります。


- このコマンドを **ッターン!** したディレクトリが、サーバールートになる
- 止めるときは後ろにいってしまったプロセスを探してkillする(ps ax | grep python)、もしくはエラーを起こして暴れる
- xxx.htmlがあれば http://127.0.0.1:8000/xxx.html になる
- CGIスクリプトは　**cgi-bin/○○.py** に配置　(フォルダが決まっているのがいやなら、普通にサーバー立ち上げて)
- スクリプトであるならば、実行権限を付与

> chmod 0755 cgi-bin/○○.py

- スクリプトであるならば、実行するプログラムのパスを指定する必要がある

```py

#!/usr/bin/python
# -*- coding: utf-8 -*-

```

- ページとしてブラウザに認識してもらいたければ自分でContent-typeを発する(逆に好きなヘッダを送信できるので)

```py

print "Content-type: text/html\n\n"


```

- スクリプトとして動かすならば　cgi モジュールは使うことになる

```py
#フォーム、クエリからhonyararaという値を取得する
import cgi
form = cgi.FieldStorage()
honyarara = form["honyarara"].value

```


- スクリプトが動くかやってみたいとき


> vi cgi-bin/test.py
> chmod 0755 cgi-bin/test.py
> python -m CGIHTTPServer &
> curl http://127.0.0.1:8000/cgi-bin/test.py?q=hello

あ、こんにちわ

```py:test.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import cgi
form = cgi.FieldStorage()

print "Content-type: text/html\n\n"
print form["q"].value
```
Sublime text > powershell用パッケージ > PowerShell

```txt:動作環境
Sublime Text2 on Windows 8.1pro (64bit)
```

PowershellスクリプトをノートパッドでなくSublime Textでコーディングしたくなった。

参考 http://kan3aa.hatenablog.com/entry/2015/02/05/164342

PowerShellというパッケージをインストールすればいい
_pathメソッドと_urlメソッドの使い分け

## 前提
次のルートが設定されている。

```rb:routes.rb
Rails.application.routes.draw do
  root 'static_pages#home'
  get 'help' => 'static_pages#help'
  get 'signup' => 'users#new'
  resources :users
end
```

このとき`rake routes`コマンドで得られるルートの一覧は次の通り。
一番左にある`prefix`がアクセスしやすくするためにルートにつけた名前。

```cmd:command
$ rake routes
   Prefix Verb   URI Pattern               Controller#Action
     root GET    /                         static_pages#home
     help GET    /help(.:format)           static_pages#help
   signup GET    /signup(.:format)         users#new
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy

```

## _pathと _urlの使い方と使う目的
### `<Prefix>+_path`と`<Prefix>+_url`
上記一覧の`Prefix`と`_path`や`_url`を組み合わせて使う。
例えば`root_path`や`root_url`といったメソッドを通してURLを参照することが出来る。

```
root_path => '/' ※ルート以下の文字列を返す
root_url  => 'http://www.example.com/'　※完全なURLの文字列を返す

help_path => '/help'
help_url  => 'http://www.example.com/help'
```

## _pathと _urlの使い分け
（自分の中でちゃんと整理できていないけど、あとで整理する）
・リダイレクトするときは`_url`を使用する。それ以外は`_path`を使う。
・ちなみに、testで`assert_template`の引数として`_path`や`_url`を渡してもだめ。ちゃんと`users/new`などで指定してあげないとダメ。


## おまけ

```
redirect_to @user
```

といった行がありますが、これは次のコードと等価になる。

```
redirect_to user_url(@user)
```

これはRailsが、redirect_to @userというコードからuser_url(@user)といったコードを実行したいことを(自動的に)推察してくれた結果になる、とのこと。実際にコードを見たり書いたりして体験して身に付けていこう。

## 参考
[第7章 ユーザー登録 -Ruby on Rails チュートリアル 実例を使ってRailsを学ぼう Michael Hartl (マイケル・ハートル)](http://railstutorial.jp/chapters/sign_up?version=4.2#sec-the_finished_signup_form)
powershell / slack > fileIO > Incoming Webhook URLをテキストから読み取る実装 > ファイル読込み: Get-Content

```txt:動作環境
Windows 8.1Pro
```

SlackのIncoming WebHookのURLをpowershellスクリプトに直打ちしておくと、スクリプトの公開時やWebHook URL変更時に面倒となる。

### やりたいこと
WebHook URLをテキストから読み取る

参考 https://technet.microsoft.com/ja-jp/library/ee176843.aspx

```webhook_url.txt
https://hooks.slack.com/services/xxxxxx/xxxxxxx
```

```readFile.ps1
$dsktp = [Environment]::GetFolderPath('Desktop')
$filename = "webhook_url.txt"

if (Test-Path $dsktp\$filename ) {
  $wbhk_url = ( Get-Content $dsktp\$filename )
  echo $wbhk_url
}
```

上記の２つのファイルをデスクトップに置いて実行。

```txt:結果
PS > powershell /c .\readFile.ps1
https://hooks.slack.com/services/xxxxxx/xxxxxxx
```

あとは$wbhk_urlをslack通信スクリプトで使う。
Project Eulerをシェル芸で解いてみる(Problem 10)

# 概要
Project Euler[^pe]は、数学的な問題解決能力を要求する、プログラミング問題集・オンラインプログラミングジャッジである。
一般的なオンラインプログラミングジャッジとは異なり、解答するプログラミング言語は、特に限定されていない。
フォームに入力した値だけで正誤を判別するため、適切なアルゴリズムさえ考案できれば、あらゆるプログラミング言語で解答することが可能である。
そのため、Web上では様々な手法による解答が公開されている。

しかし、シェル芸[^def]による解答は、私が探した限りでは、殆ど見つからなかった。
そこで、私自身の勉強も兼ねて、Project Eulerをシェル芸で解いてみることにした。
<br>

本記事では、Project EulerのProblem 10を、シェル芸で解いた際の過程を述べる。

# 実行環境
* Arch Linux (x86\_64, 4.3.3-2-ARCH)
* bash (4.3.42, POSIX互換モード)
* GNU coreutils (8.24)
* gawk (4.1.3)

* bsd-games (2.17)

# 問題文
[原文 ([https://projecteuler.net/problem=10](https://projecteuler.net/problem=10))]

> The sum of the primes below $10$ is $2 + 3 + 5 + 7 = 17$.
> Find the sum of all the primes below two million.

[日本語訳 ([http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2010](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2010))]

> $10$ 以下の素数の和は $2 + 3 + 5 + 7 = 17$ である.
> $200$万以下の全ての素数の和を求めよ.

正答は、注釈[^ans]に記載する。

# 解法1
```sh:prob_010.sh
1	#!/bin/sh
2	
3	seq 1 2000000 \
4	| # 入力の生成
5	factor \
6	| # 素因数分解
7	awk 'NF == 2 {print $2}' \
8	| # 素数の抽出
9	tr '\n' '+' \
10	| # 数式の生成_1
11	sed -e 's/\+$/\n/' \
12	| # 数式の生成_2
13	bc
14	  # 計算結果の出力
```

## 解説1
この解法による処理の詳細は、コードに記載してあるコメントの通りである。

また、bsd-gamesに含まれるprimesを用いたより短い解き方を、解法2として述べる。

# 解法2
```sh:prob_010_2.sh
1	#!/bin/sh
2	
3	primes 2 2000000 \
4	| # 2000000以下の素数の列挙
5	awk '{sum+=$0} END {print sum}'
6	  # 和の出力
```

## 解説2
この解法による処理の詳細は、コードに記載してあるコメントの通りである。

# 雑記
* 「こんな別解があるよ」や、「こうすればもっと効率化できるぜ」、「こう書けばエレガントですわよ」等の意見がありましたら、気軽に教えていただけますと幸いです🐺
* 現在の進捗状況 -> [https://github.com/gin135/Project_Euler/tree/master/sh](https://github.com/gin135/Project_Euler/tree/master/sh)
<br>

* 今回の問題も手抜き解説。
    - いやでも、今回はこれ以上説明のしようが無いと思うので...
* 数式の生成に関しては、`tr '\n' '+' | sed -e 's/\+$/\n/'`とするよりも、`xargs | tr ' ' '+'`としたほうがエレガントではある。
    - trで改行コードを演算子に変換する方法だと、末尾に余分な演算子がくっついてしまうので。
    - けれど、xargs(正確にはOS)には、一度に扱える引数の総バイト数に上限がある >> `$ getconf ARG_MAX`
    - 今回の問題はその上限に引っかかってしまい、数式がうまく生成できないため、`tr '\n' '+' | sed -e 's/\+$/\n/'`にした。
* 先に解答されちゃった＞＜
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">yes | sed -n = | factor | awk &#39;$0=$2*!$3&#39; | awk &#39;$0&gt;=2000000{exit}{s+=$0}END{print s}&#39;&#10;Problem 10. sed -n =といういい話を聞いたので使ってみた <a href="https://twitter.com/hashtag/%E3%82%B7%E3%82%A7%E3%83%AB%E8%8A%B8?src=hash">#シェル芸</a></p>&mdash; 卒論まで21日のMasaki Waga (@MasWag) <a href="https://twitter.com/MasWag/status/686750180041871360">January 12, 2016</a></blockquote>
    - ...ので、対抗してこちらも今日のうちにProblem 10も投稿することにするw
    - 1日1問のつもりなので、明日はお休みするかも？

- - -

[^pe]: About - Project Euler ([https://projecteuler.net](https://projecteuler.net))
[^def]: シェル芸の定義 >> シェル芸 - 上田ブログ ([https://blog.ueda.asia/?page_id=1434](https://blog.ueda.asia/?page_id=1434))
[^ans]: 142913828922
Unityからスマホ画面の向きの固定・解除（iOS・Android共通）

Unity側にて処理が用意されているのでそれを使います。

`Screen.orientation`

・ScreenOrientation.Portrait
　　縦画面(０度)

- ScreenOrientation.PortraitUpsideDown
　　上下反転の縦画面(１８０度回転)

- ScreenOrientation.LandscapeLeft
　　横画面(縦画面を０度とした時、左へ９０度回転)

- ScreenOrientation.LandscapeRight
　　横画面(縦画面を０度とした時、右へ９０度回転)

## 縦画面から横画面にして固定したい時

```csharp
switch (Screen.orientation) {
    // 縦画面のとき
    case ScreenOrientation.Portrait:
        // 左回転して左向きの横画面にする
        Screen.orientation = ScreenOrientation.LandscapeLeft;
        break;
    // 上下反転の縦画面のとき
    case ScreenOrientation.PortraitUpsideDown:
        // 右回転して左向きの横画面にする
        Screen.orientation = ScreenOrientation.LandscapeRight;
        break;
}
```

## 固定を解除したい時

`Screen.orientation = ScreenOrientation.AutoRotation;`

## AutoRotationをハンドリングしたい時

●AutoRotationとは？
　どの向きへの回転を許可するかの設定です。
●初期状態であればPlayerSettingsで設定可能です。
PlayerSettings->
　　　Resolution and Presentation->
　　　　　　Allowed Orientations for Auto Rotation

■■スクリプトからいじる時は下記のような書き方で制御可能です。■■

●trueで回転を許可、falseで回転を許可しない。

```csharp
// 縦
Screen.autorotateToPortrait = true;
// 左
Screen.autorotateToLandscapeLeft = true;
// 右
Screen.autorotateToLandscapeRight = true;
// 上下反転
Screen.autorotateToPortraitUpsideDown = true;
```
Windowsをコマンドで再起動する方法

# はじめに

定期的にWindows Server 2008 R2のサーバを日次再起動するジョブ（Powershellで「Restart-Computer -ComputerName %remotehost% -Force」を実行）を作成したところ、シャットダウン途中で固まってしまう事象が１ヶ月に１回くらい発生して悩まされました。
shutdown.exeを用いた場合は、シャットダウン途中で固まることがありませんでした。
どうもネットワーク共有接続された状態だとうまくいかないようでした。
Powershellの「-Force」はコンソールやターミナルセッションの強制ログオフには対応していますが、ネットワーク共有接続の切断には対応していないのかな？

再起動／シャットダウン方法を整理します。

# 再起動

### ■shutdown.exeを用いた場合

　shutdown.exe /r /m \\%remotehost% /t 3 /c "コメント"

　※オプション
　　/r：再起動
　　/m \\コンピューター名：再起動対象
　　/t 3：3秒後に強制(/f)実行
　　/c コメント：文字数制限があるのでshutdown.exe /?で確認すること

### ■Restart-Computerコマンドレットを用いた場合
　# ネットワーク共有接続の強制切断
　net session /delete /y
　# 再起動
　Restart-Computer -ComputerName %remotehost% -Force

# シャットダウン

### ■shutdown.exeを用いた場合
　shutdown.exe /s /m \\%remotehost% /t 3 /c "コメント"

　※オプション
　　/s：シャットダウン
　　/m \\コンピューター名：再起動対象
　　/t 3：3秒後に強制(/f)実行
　　/c コメント：文字数制限があるのでshutdown.exe /?で確認すること

### ■Restart-Computerコマンドレットを用いた場合
　# ネットワーク共有接続の強制切断
　net session /delete /y
　# シャットダウン
　Stop-Computer -ComputerName %remotehost% -Force
8,16,32,64 ☆4ステップで暗記できる、BIGINTの数値の範囲の覚え方



#データベースエンジンを渡り歩くときに躓かない、大きい整数と小さい整数の桁の覚え方


- 大きい整数や小さい整数って何桁なのか暗記できるようにしてみた。

## どのくらいバイト数使っていいかで桁が決まっている

- 符号ありでしたらこんな感じ。

データ型 |Range|ストレージ
|---------------|------------|------------|
bigint |-2^63 (-9,223,372,036,854,775,808) ～ 2^63-1 (9,223,372,036,854,775,807)|8 バイト
int|-2^31 (-2,147,483,648) ～ 2^31-1 (2,147,483,647)|4 バイト
smallint|-2^15 (-32,768) ～ 2^15-1 (32,767)|2 バイト
tinyint|0 ～ 255|1 バイト


## まずはビットとバイトの違い

> 1ビット=　0か1で　2通り

>１バイト＝８ビット

- 説明はしない。

### 1バイトで表せる範囲=2^8 (2の8乗)
- 2^8 (2の8乗)で256通りのデータ、ゼロをいれると　0-255 までが表せる

1バイトの数値型の範囲は0-255 (1しかないので符号はあらわせない)

### 2バイトで表せる範囲=2^16  (2の16乗)　符号に1個使うと±2^15(2の15乗)

- 2バイト(8×2=16ビット)では符号あり、なしで2通り

最初の1ビット | 数値の範囲
|---------------|------------|
|符号付き |1ビットは符号に使うとあとの15ビットで2^15(2の15乗)ゼロをはさんで2^15 -1 |
| 符号なし| 0 ~　(2^16 - 1　=　65,535)|


### バイト数　N　の場合
- 以後、パターンがある

最初の1ビット | 数値の範囲
|---------------|------------|
符号付き　|　-2^(8n-1) ~ {2^(8n-1)-1}
符号なし | 0 ~ (2^8n-1)

- 人間が使う範囲で押さえとく

型|TINY INT(1) | SMALL INT (INT2) | INT(4) | BIGINT (INT8)
|---------------|------------|---------|---------|---------|
バイト数 | 1バイト|2バイト|4バイト|8バイト
最大値| 2^8 (2の8乗) -1 | 2^16 -1 | 2^32 -1 |2^64 -1
符号あり| - | -2^15 ~　2^15-1 | -2^31 ~　 2^31 -1 | -2^63 ~　2^63 -1




### 2の16,32,64乗という単位くらい暗記したい
- だいたいで。

べき乗 |読み方|覚え方
|---------------|------------|---------|
2^64 |一千八百四十四京 六千七百四十四兆 七百三十七億 九百五十五万 一千六百十六 | K点超え、1千京
2^63 -1| 九百二十二京三千三百七十二兆三百六十八億五千四百七十七万五千八百七 |9百京
2^32|四十二億九千四百九十六万七千二百九十六　|42億
2^31 -1 |二十一億四千七百四十八万三千六百四十七 | 21億
 2^16 |六万五千五百三十六 | 6万
 2^15-1  |三万二千七百六十七 | 3万
2^8 | 二百五十六 | にごろ。

- 10進法ってどこまで数えられるんだろう、京の次が気になるかたはこちらを読むとなかなか面白い

※https://ja.wikipedia.org/wiki/%E5%91%BD%E6%95%B0%E6%B3%95


### BIGINTでギリギリを攻めるなら符号なしにするかしないかで範囲がかなり違う

- 2倍になるだけだけど、1000京ちかく増えるし。

### ちなみにRedshiftでは数値は符号つきしかなく、INT(1)はない

http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_Supported_data_types.html

- 符号なし整数とか、BIGINTに型定義しないと入らないので注意
terraformでRDSをさわるときに忘れがちな事

# TerraformでRDSを設定していた時に漏れてた事をメモ
## backup_retention_period が反映されない
Backup保持期間を7にしたかった。
下記のように設定すると反映されない。

```rds.tf
resource "aws_db_instance" "rds-setup" {
〜中略〜
  backup_retention_period = "7"
  backup_window = "22:29-22:59"
}
```

apply_immediatelyが足りていなかったので下記に編集

```rds.tf
resource "aws_db_instance" "rds-setup" {
〜中略〜
  backup_retention_period = "7"
  backup_window = "22:29-22:59"
  apply_immediately = "true"
}
```

apply_immediatelyをtrueにした場合apply後にrebootになるので注意

参考URL：
[TERRAFORMドキュメント](https://www.terraform.io/docs/providers/aws/r/db_instance.html)
CSS3で波紋(多重の円が広がり消える)アニメーション

業務で使ったのでメモ。
「電波飛んでます」
「通信中です」
みたいな表現などで使えるかもです。

![hamonGif.gif](https://qiita-image-store.s3.amazonaws.com/0/76843/70d20074-26ba-5036-9ce9-46675176e429.gif)


border-radiusで円を描いてます。


```html:hoge
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>波紋</title>
</head>
<body>

	<div>
		<div class="signal1"></div>
		<div class="signal2"></div>
		<div class="signal3"></div>
	</div>


	<style type="text/css">

	/* signal */
	.signal1 {
	  z-index: 9999;
	  border: 2px solid #2998ce;
	  border-radius: 150px;
	  width: 150px;
	  height: 150px;
	  margin: -15px 0 0 -15px;
	  opacity: 0;
	  position: absolute;
	  top: -50px;
	  left: -50px;
	  animation: pulsate 1.5s ease-out;
	  animation-iteration-count: infinite;
	  -webkit-animation: pulsate 1.5s ease-out;
	  -webkit-animation-iteration-count: infinite;
	  -webkit-transform: translate(-50%, -50%);
	}

	.signal2 {
	  z-index: 9999;
	  border: 2px solid #2998ce;
	  border-radius: 100px;
	  width: 100px;
	  height: 100px;
	  margin: -15px 0 0 -15px;
	  opacity: 0;
	  position: absolute;
	  top: -25px;
	  left: -25px;
	  animation: pulsate 1.5s ease-out;
	  animation-iteration-count: infinite;
	  -webkit-animation: pulsate 1.5s ease-out;
	  -webkit-animation-iteration-count: infinite;
	  -webkit-transform: translate(-50%, -50%);
	}

	.signal3 {
	  z-index: 9999;
	  border: 2px solid #2998ce;
	  border-radius: 50px;
	  width: 50px;
	  height: 50px;
	  margin: -15px 0 0 -15px;
	  opacity: 0;
	  position: absolute;
	  top: 0px;
	  left: 0px;
	  animation: pulsate 1.5s ease-out;
	  animation-iteration-count: infinite;
	  -webkit-animation: pulsate 1.5s ease-out;
	  -webkit-animation-iteration-count: infinite;
	  -webkit-transform: translate(-50%, -50%);
	}

	@keyframes pulsate {
	  0% {
	    transform: scale(0.1);
	    opacity: 0.0;
	  }
	  50% {
	    opacity: 1;
	  }
	  100% {
	    transform: scale(0.7);
	    opacity: 0;
	  }
	}

	@-webkit-keyframes pulsate {
	  0% {
	    -webkit-transform: scale(0.1);
	    opacity: 0.0;
	  }
	  50% {
	    opacity: 1;
	  }
	  100% {
	    -webkit-transform: scale(0.7);
	    opacity: 0;
	  }
	}


/* 調整方法 */

/*
円のサイズ  
width,height,border-radiusの値を変更

アニメーションの時間
animation: pulsate 1.5s ease-out;
-webkit-animation: pulsate 1.5s ease-out;
の1.5sの秒数変更

円の拡大率
transform: scale(0.7);
-webkit-transform: scale(0.7);
のスケールの値
*/
</style>

</body>
</html>
```


このDEMOだとアニメーションはずっと繰り返されます。


「水面のように、クリック時に一度、波紋を出したい」などは
こちらが参考になるかもです。
http://qiita.com/nekoneko-wanwan/items/c9f26ce049bd422e555c



アニメーションを途中で止める方法はこちらが参考になりました。
http://kimizuka.hatenablog.com/entry/2014/12/02/000000
Theta S で撮影した動画を Gear VR で見る方法


標準の Oculus Video アプリケーションで見ることが出来ます。

1. Theta S で動画を撮影する
2. Theta S アプリで動画を Galaxy S6 へ転送する
3. Theta S アプリで動画を書き出す
3. Galaxy S6 を Mac に接続して、Android File Transfer を開く
4. Android に `/Oculus/360Videos` ディレクトリを作成して、出力した動画（/Movies/RICOH THETA EXPORTED/***.MP4）を `/Oculus/360Videos` へコピー
5. Galaxy S6 を Gear VR に接続し、Oculus Video アプリを立ちあげ、「マイ動画」から撮影した動画を再生する

# 注意点

全周画像のフォーマットとして、 Dual Fisheye 形式と Equirectangular 形式があるのですが、アプリで書きだした Equirectangular 形式の動画を `/Oculus/360Videos` へ配置してください。


# 参考

- [Oculus 360 Videosでパノラマ動画を見る - OCULUSサポート](https://support.oculus.com/hc/ja/articles/204401983-Oculus-360-Videos%E3%81%A7%E3%83%91%E3%83%8E%E3%83%A9%E3%83%9E%E5%8B%95%E7%94%BB%E3%82%92%E8%A6%8B%E3%82%8B)
- [360度映像制作ガイド](http://www.orihalcon.co.jp/technologies/documents/how_to_make_immersive_movies.html)
vagrant upで失敗

vagrant up したらエラーが出てしまったので、
解決までの道のりを書いていこうと思います。

そして、初めてのQiita投稿なので、投稿の練習として使わせてもらいます。
※文章構成考えずに書いてます。ほんとただのメモです。



# 立ち上げたら失敗

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 3306 => 33060 (adapter 1)
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
The guest machine entered an invalid state while waiting for it
to boot. Valid states are 'starting, running'. The machine is in the
'poweroff' state. Please verify everything is configured
properly and try again.

If the provider you're using has a GUI that comes with it,
it is often helpful to open that and watch the machine, since the
GUI often has more helpful error messages than Vagrant can retrieve.
For example, if you're using VirtualBox, run `vagrant up` while the
VirtualBox GUI is open.

The primary issue for this error is that the provider you're using
is not properly configured. This is very rarely a Vagrant issue.
```

# 原因

どうやら、VirtualBox5.0.2のバグらしいということで、、、
※詳しくは、下記参照
http://qiita.com/medaka5/items/d70751a562a5604c2115

当時（2016/1/12）の最新バージョンVirtualBox5.0.12をインストール

再度、立ち上げてみたら成功しました。
Fix brew update error

When run `brew update`, I got an error:

```
$ brew update
error: The following untracked working tree files would be overwritten by merge:
	Library/Formula/tcpstat.rb
	Library/Formula/titlecase.rb
Please move or remove them before you can merge.
Aborting
Error: Failure while executing: git pull --ff --no-rebase --quiet origin refs/heads/master:refs/remotes/origin/master
```

By below steps, I resolved the issue:

```
$ cd `brew --prefix`
$ git fetch origin
$ git reset --hard origin/master
Checking out files: 100% (1704/1704), done.
HEAD is now at 4b0be8a openexr: fix build on 32-bit targets
$ brew update
To restore the stashed changes to /usr/local run:
  `cd /usr/local && git stash pop`
Already up-to-date.
```
heroku上のbrowserify-rails で Ensure you have installed it with npm.　

	

https://github.com/browserify-rails/browserify-rails

READMEにも書いてあったけど、heroku上でnpmを使うには、下記buildpacks追加する必要があるみたい。


```
$ heroku buildpacks:add https://github.com/heroku/heroku-buildpack-nodejs.git
$ heroku buildpacks:add https://github.com/heroku/heroku-buildpack-ruby.git
```
Project Eulerをシェル芸で解いてみる(Problem 9)

# 概要
Project Euler[^pe]は、数学的な問題解決能力を要求する、プログラミング問題集・オンラインプログラミングジャッジである。
一般的なオンラインプログラミングジャッジとは異なり、解答するプログラミング言語は、特に限定されていない。
フォームに入力した値だけで正誤を判別するため、適切なアルゴリズムさえ考案できれば、あらゆるプログラミング言語で解答することが可能である。
そのため、Web上では様々な手法による解答が公開されている。

しかし、シェル芸[^def]による解答は、私が探した限りでは、殆ど見つからなかった。
そこで、私自身の勉強も兼ねて、Project Eulerをシェル芸で解いてみることにした。
<br>

本記事では、Project EulerのProblem 9を、シェル芸で解いた際の過程を述べる。

# 実行環境
* Arch Linux (x86\_64, 4.3.3-2-ARCH)
* bash (4.3.42, POSIX互換モード)
* GNU coreutils (8.24)
* gawk (4.1.3)

<!---
* bsd-games (2.17)
--->

# 問題文
[原文 ([https://projecteuler.net/problem=9](https://projecteuler.net/problem=9))]

> A Pythagorean triplet is a set of three natural numbers, $a < b < c$, for which,
>
```math
a^2 + b^2 = c^2
```
> For example, $3^2 + 4^2 = 9 + 16 = 25 = 5^2$.
> There exists exactly one Pythagorean triplet for which $a + b + c = 1000$.
> Find the product $abc$.


[日本語訳 ([http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%209](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%209))]

> ピタゴラス数(ピタゴラスの定理を満たす自然数)とは $a < b < c$ で以下の式を満たす数の組である.
>
```math
a^2 + b^2 = c^2
```
> 例えば, $3^2 + 4^2 = 9 + 16 = 25 = 5^2$ である.
> $a + b + c = 1000$ となるピタゴラスの三つ組が一つだけ存在する.
> これらの積 $abc$ を計算しなさい.


正答は、注釈[^ans]に記載する。

# 解法
```sh
1	#!/bin/sh
2	
3	seq 1 332 \
4	| # a列の生成
5	awk '{for(b=1; b<500; b++) {print $1, b}}' \
6	| # b列の生成
7	awk '$1 < $2 && 500 < ($1+$2) {print $1, $2, sqrt(($1)^2 + ($2)^2)}' \
8	| # c列候補の生成
9	awk 'length($3) == 3' \
10	| # c列の抽出
11	awk '$1+$2+$3 == 1000' \
12	| # a+b+c = 1000 となる1組の抽出
13	tr ' ' '*' \
14	| # 計算式の生成
15	bc
16	  # 計算結果の出力
```

## 解説
$a, b, c$ の候補を列挙し、その中から $a + b + c = 1000$ を満たすものを抽出すれば良い。

$a, b, c$ の候補を絞り込むために、問題文から $a, b, c$ の性質を考える。
まず、 $a \lt b \lt c$ かつ $a + b + c = 1000$ より、 $a \le 332$ である。
次に、 $a + b + c = 1000$ かつ $b \lt c$ より、 $b \lt 500$ である。
よって、 $a + b + c = 1000$ 、 $a \lt b \lt c$ 、 $a \le 332$ 、 $b \lt 500$ を4つの条件全てを満たす $a, b, c$ の全候補を、列挙すれば良い。
<br>

初めに、 $a, b, c$ の候補を列挙する。
これは、3~9行目のsedとawkによっておこなう。
列挙する候補を減らすために、上記の性質を利用して、 $a$ の上限は332まで、 $b$ の上限は499までとする。

次に、 $a + b + c = 1000$ を満たす1組を抽出する。
これは、11行目のawkによっておこなう。

最後に、積 $abc$ を算出する。
積の算出は、13~15行目のtrとbcによっておこなっている。
<br>

以上が、 $a \lt b \lt c$ かつ $a + b + c = 1000$ を満たすピタゴラス数の積、 $abc$ を算出する方法である。


# 雑記
* 「こんな別解があるよ」や、「こうすればもっと効率化できるぜ」、「こう書けばエレガントですわよ」等の意見がありましたら、気軽に教えていただけますと幸いです🐺
* 現在の進捗状況 -> [https://github.com/gin135/Project_Euler/tree/master/sh](https://github.com/gin135/Project_Euler/tree/master/sh)
<br>

* 何だか、今回の解法は泥臭いというか、いつもに増して洗練されていない気がする...
    - 特に、3~9行目。もうちょっと良い方法があるような......
    - 実質、3重ループを回しているようなものだし、速度的にも少し不安。
    - この性質を利用すれば、もっとスマートな解法で解けるのかも。 >> "ピタゴラス数のある性質" http://www004.upp.so-net.ne.jp/s_honma/pythagoras/pythagoras2.htm

- - -

[^pe]: About - Project Euler ([https://projecteuler.net](https://projecteuler.net))
[^def]: シェル芸の定義 >> シェル芸 - 上田ブログ ([https://blog.ueda.asia/?page_id=1434](https://blog.ueda.asia/?page_id=1434))
[^ans]: 31875000
aws-cli + zshでcomplete:13: command not found: compdefが出る場合の対応

AmazonLinux上でyumでインストールできる最新(2016/1/12現在)のzsh(5.0.2)とaws-cli(1.9.11)の組み合わせでログイン時に「complete:13: command not found: compdef」というエラーメッセージが出て気持ち悪いので出ないようにする。

# 対応内容
```zsh
$ touch ~/.zshenv
$ echo 'autoload -Uz compinit
compinit' >> ~/.zshenv
```

# 原因など
## 発生場所
/etc/zprofile
↓
/etc/profile.d/aws-cli.sh
↓
/usr/share/zsh/site-functions/aws_zsh_completer.sh
最終行のcomplete関数の呼び出し
↓
/usr/share/zsh/5.0.2/functions/bashcompinit
complete関数の13行目

**complete関数呼び出し前にcompdef関数が定義されていないのが問題！**


## compdefが定義されている場所
/usr/share/zsh/5.0.2/functions/compinit の234行目

**実行前にcompinitを読み込む必要がある**

## /etc/zprofile の読み込み前に行うにはどうしたらいいか

[zshの設定ファイルの読み込み順序と使い方Tipsまとめ](http://qiita.com/muran001/items/7b104d33f5ea3f75353f)を参考に検討。
読み込まれる順番を考慮するとユーザー権限で行うには~/.zshenvに埋め込むしかないことがわかった。

## 最後に
本当にこれでいいのかよくわからない
やらなくてもよくなったら消したいけど、やらなくてもよくなるタイミングって確認しづらいなぁ。
[ awk ] if文サンプル

memo


```bash:sample.txt
cat sample.txt
#################
Alice 25 27 50
Bob 35 37 75
Caren 75 78 80
David 99 88 76

```


```awk
awk '{ avg=($2+$3+$4)/3; if (avg>=80 && avg<90) result="A"; else if (avg>=60 && avg<80) result="B"; else if (avg>=50 && avg<60) result="C"; else if (avg<50) result="FAIL"; else result="Other"; print $0,":",result; }' sample.txt

awk '{
avg = ($2+$3+$4)/3;
if ( avg >= 80 && avg < 90 ) result="A";
else if ( avg >= 60 && avg < 80) result ="B";
else if (avg < 50) result ="FAIL";
else result ="Other"
print $0,":",result;
}' 
```
Karabinerのprivate.xmlの参考にするためのデフォルトの設定の場所


[include/checkbox](https://github.com/tekezo/Karabiner/tree/version_10.15.0/src/core/server/Resources/include/checkbox/)の中にある。

Karabinerはprivate.xmlで設定を追加することができる。
Karabinerに欲しい機能がない場合で、ほとんど類似した設定があり、ちょっと修正すれば実現できるようなことも多い。

設定を参考にしたい場合は[include/checkbox](https://github.com/tekezo/Karabiner/tree/version_10.15.0/src/core/server/Resources/include/checkbox/)の中を確認してみるとよい。

ここの情報は、[private.xml Reference Manual](https://pqrs.org/osx/karabiner/xml.html.ja)をちゃんと書いてあるが見すごしやすいのでメモをしておいた。

参考・関連

* [private.xml Reference Manual](https://pqrs.org/osx/karabiner/xml.html.ja)
* [Karabinerのprivate.xml設定方法](http://qiita.com/altitude3190/items/bbef986ff8dd288b2641)
Scala: PartialFunctionはsealedのexhaustiveチェックがない

ScalaのPartialFunctionはsealedのパターンマッチング漏れチェックがコンパイル時に行われないので注意が必要ということに気がついた。

次のようなコードで、わざとパターンマッチングの漏れを作ってコンパイルすると、

```scala
sealed trait Alphabet
case object A extends Alphabet
case object B extends Alphabet

val toLowerCaseF1: Function[Alphabet, String] = {
  //    case A => "a"
  case B => "b"
}

val toLowerCaseF2: PartialFunction[Alphabet, String] = {
  //    case A => "a"
  case B => "b"
}

val toLowerCaseF3: Alphabet => String = {
  //    case A => "a"
  case B => "b"
}
```

`toLowerCaseF1`と`toLowerCaseF3`はコンパイルが`warning: match may not be exhaustive`を警告してくれるが、`PartialFunction`を使った`toLowerCaseF2`については何も言ってこない。

```
<console>:14: warning: match may not be exhaustive.
It would fail on the following input: A
       val toLowerCaseF1: Function[Alphabet, String] = {
                                                       ^
<console>:24: warning: match may not be exhaustive.
It would fail on the following input: A
       val toLowerCaseF3: Alphabet => String = {
```
【ES2.1.1】mysqlのデータをElasticsearchに突っ込む

[【ver2.1.1】CentOSにElasticSearchを入れて起動するまで](http://qiita.com/hata-yusaku/items/8645e4051b76ef63892c)の続きです！

## 環境(2016-1-12)
* CentOS6.5
* ElasticSearch2.1.1

## 概要
データのインポートには[Embulk](https://github.com/embulk/embulk)を使用します！！
EmbulkにはBigQueryやRedshiftそして今回のElasticSearchとめっちゃ助かってます

## 流れ
### Embulkインストール
Embulk本体は[https://github.com/embulk/embulk#linux--mac--bsd](ここ)からどうぞ

### 使用するプラグインをインストール
今回は
inputに[embulk-input-mysql](https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-mysql)
outputに[embulk-output-elasticsearch](https://github.com/muga/embulk-output-elasticsearch)
を使用する。
embulk-input-mysqlに関しては`embulk gem install embulk-input-mysql`でいけるんだが
embulk-output-elasticsearchに関しては2016/1/12時点ではそのままインストールしてしまうと
runさせた時に`Failed to deserialize exception response from stream`で怒られるのでgitcloneしてbuildしないといけない。

```
cd [任意のディレクトリ ※今回は/tmpを例にする]
git clone https://github.com/muga/embulk-output-elasticsearch.git
cd embulk-output-elasticsearch
./gradlew gem
```

### Elasticsearchの設定ファイルを編集
```lang:/etc/elasticsearch/elasticsearch.yml
# 下記を追加する。
# 今回はクラスタとかを組むわけではないので、このノードをマスターにする
# これを設定しないnodeないよ〜ってエラーになる。
node.master: true
```


### 設定ファイルを作成
```lang:config.yml
in:
  type: mysql
  user: [user名]
  password: [password]
  database: [データベース名]
  table: [テーブル名]
  host: [host]
  select: "*"
out:
  type: elasticsearch
  index: [index名]
  index_type: [indexのタイプ]
  nodes:
  - {host: localhost, port: 9300}
```

### preview
```lang:shell
embulk preview -I /tmp/embulk-output-elasticsearch/lib config.yml
```
ポイントは`-I /tmp/embulk-output-elasticsearch/lib`さきほど入れたembulk-output-elasticsearchを指定すること。
これを指定しないとエラーになる

### run
```lang:shell
embulk run -I /tmp/embulk-output-elasticsearch/lib config.yml
```

## 実装確認
マッピングされているかの確認

```
curl -XGET 'http://localhost:9200/[index名]?pretty' 
```

データの保持されている数を調べる

```
curl -XGET 'http://localhost:9200/[index名]/[indexタイプ]/_count?pretty'
```

## 最後に
Embulkには本当に感謝です。
Rubymineをインストールしたら最初にやるオススメ設定

## 環境

* OSX 10.11.2
* Rubymine 8.0.3

## 全体設定

### 行番号表示

なぜかデフォルトでは表示してくれないので設定する。

```
Preferences > Editor > General > Appearance > Show line numbersにチェック
```

### ファイル保存時に最後の行に改行追加

最後に改行がないテキストファイルのコミットを防止。

```
Preferences > Editor > General > Ensure line feed at file end on Saveにチェック
```

### メモリインジケータ表示

Rubymineがどのくらいメモリ食ってるか教えてくれる。

```
Preferences > Appearance Behavior > Appearance > Show memory indicator にチェック
```

### テーマ変更

これは完全に好みだが、テーマを変えたい人は変えておこう。筆者は黒いほうが好きなのでいつも変えている。

```
Preferences > Appearance Behavior > Appearance > Theme の「Darcula」 を選択
```


## 自動コードフォーマット設定

ファイル保存した時に、勝手にフォーマットしてもらえるよう設定。

### マクロ作成

##### 1. マクロの記録を開始する

```
Edit -> Macros -> Start Macro Recording
```

##### ２．コードフォーマットの設定をする

```
Code -> Reformat Code
```

##### ３．全てのファイルを保存

```
File -> Save all
```

##### ４．マクロの記録を終了する

```
Edit -> Macros -> Stop Macro Recording
```

##### ５．記録したマクロを名前をつけて保存

「Enter Macro Name」ダイアログに適当に名前を入力して(例：formatted save)、「OK」ボタンを押す

![save_macro.png](https://qiita-image-store.s3.amazonaws.com/0/39241/6aede7e8-d727-07cc-8467-f9df491e4e4c.png)


### キーボードショートカットへの割り当て

##### 1. キーボードにショートカット追加

```
Preferences > Keymap > Macros
```

先ほど入力した名前（formatted save）が出てくるので、右クリックして、「Add Keyboard Shorcut」をクリック

![1.png](https://qiita-image-store.s3.amazonaws.com/0/39241/d1a5d085-f80f-c25a-01a1-03495dd0fc0c.png)

##### 2. ショートカットの入力

First Strokeで「Command + s」（実際のキーボード操作が反映される）

「Assigned to [Main menu | File | Save All]」と赤文字で表示されるが無視して「OK」ボタンをクリック

![2.png](https://qiita-image-store.s3.amazonaws.com/0/39241/01015308-4b1e-d17b-b2ef-7c46577a3a38.png)

##### 3. 警告無視

再びWarningが出るが、これも華麗にスルーして「Remove」ボタンをクリック

![3.png](https://qiita-image-store.s3.amazonaws.com/0/39241/ba3a9661-ad88-53f5-e809-a8d2574e7841.png)

##### 4. 設定反映

「OK」ボタンを押して終了

![4.png](https://qiita-image-store.s3.amazonaws.com/0/39241/d8f76bff-49fc-daa3-3cc9-a8a3e342b9fb.png)



## プラグイン

```
Preferences > Plugins > Browse repositories...
```

で検索ウィンドウが立ち上がる。

ダウンロードランキングのトップ３をとりあえず入れておく。

* .ignore
* Markdown
* BashSupport

あとは、プロジェクトの特性に合わせて適当に。


## プロジェクト設定

新しいプロジェクトを作成したらやること。

### 想定環境

* rbenv + ruby 2.3.0 + bundler
* プロジェクト用のGemfileを作成し、事前にbundle install済み

### Bundler

RubymineにBundlerで管理しているgemを認識させるには、一度Rubymine上で、bundle installする必要があるっぽいので実行しておく。

#### bundle install

```
Tools > Bundler > Install
```

するとウィンドウが立ち上がる。

![bundle_install](https://qiita-image-store.s3.amazonaws.com/0/39241/b251cebc-9c01-3a73-15d8-3a2df40ebffd.png)

ここでbundleコマンドのオプションを入力して、Installボタンクリック。

#### 注意書き

筆者は事前にコマンドラインでbundle installしていたので、オプションは空のまま実行した。

はじめてbundleコマンドを実行するなら、オプションに"--path vendor/bundle"とかつけておくといいと思う。(未検証だけど)


## まとめ

これがオススメだぜ！ってのがあったらぜひ教えてください(´ε｀*)
iOSプロビジョニングプロファイルの更新

多くのネット上の情報では、プロビジョニングプロファイルの更新については画像入りで解説があって、簡単で「Edit」で更新すると、日付が伸びます。

証明書の更新も「Edit」で新しい証明書を選択して更新すればOKですが、古いプロファイルでコンパイルしたアプリは証明書の期限切れと同時にアプリは使えなくなります。

・・

**問題は、公式のマニュアルも含めてそこで終わってます。**

・・
クライアントにどう反映するのか、書いてないんです。
候補としては
(a) 何もしない
(b) 新しいプロファイルをダウンロード＆インストール
(c) 新しいプロファイルを使ってコンパイルしなおしたアプリで更新

ということが考えられます。

#何もしない
(a) だめです。自動的にはクライアントは更新されません。

#新しいプロファイルを使ってコンパイルしなおしたアプリで更新
(c) これは確実にいけます。

ただ、証明書やプロファイルを管理している会社と、ipaをコンパイルする会社が同じならいいですが、「うぉー！明日で期限切れじゃー！」などという事態は、企業内のアプリでは容易に発生するわけで、いつでもコンパイルと配布が可能とは限りません。

#新しいプロファイルをネットからダウンロード＆インストール
(b)なのですが、やってみると「まあ、うまくゆく」・・と微妙です。

iOS8以前なら、明示的にダウンロードしてインストールできたのですが、**iOS8からプロファイルの期限が表示されません。** 更に、押してもすぐにはインストールされずに何時間か経過した後に入った事になってるみたいなのはiPhoneをMacにつないでXCodeから確認できます。

例えば1000拠点に配布したiPhone端末について「リンクを押してください」と連絡するまではいいですが、全部が実行されたかどうだかわからないことを意味します。すべての端末をMacにつないでXCodeから確認することなどできません。

・・ここで終了です・・

きちんとした解決策がないです。

結局、コンパイルして配布しちゃうのが簡単ですが、世界はどう回ってるのかわからないです。
Grenning > strtok()は実際に文字列を変更する

@ テスト駆動開発による組み込みプログラミング by James Grenning

> strtok()は実際に文字列を変更する

http://ideone.com/qLUL5y

```test.c
#include <stdio.h>
#include <string.h>

int main(void) {
	char inpBuf[]= "abc,def";
	char *token1;
	
	printf("%s\n", inpBuf);

	token1 = strtok(inpBuf, "., ");
	
	printf("%s\n", inpBuf);
	return 0;
}
```

```txt:結果
Success	time: 0 memory: 2112 signal:0
abc,def
abc
```
技術英語 > Did you [have a chance to] read my paper on ...?

Star Trek movie > 叛乱

パーティーである男がピカード艦長に話しかけてきた。以前、会議で会ったという。

> Did you have a chance to read my paper on ...

字幕「私の...に関する論文を読んでいただけましたか?」

have a chanceを入れることで、「読む機会がありましたか」＞＞「読んでいただけましたか？」になる。

何かをしていただくという行為に対して、直接 Did you read ...?のように問い合わせするのでなく、Did you have a chance to read ...?のように問い合わせをしている。
WindowsのCaboChaでUniDicを使うメモ

# モデルファイルのコピー

Macの次のフォルダから関係ありそうなファイルをコピー

- /usr/local/lib/cabocha/model

Winの次のフォルダに置く

- C:\Program Files (x86)\CaboCha\model

ちゃんと同じバージョンのモデルファイルを使わないとエラーが出るっぽい。

# cabocharcの変更

cabocharcは次の場所にある。

- C:\Program Files (x86)\CaboCha\etc\cabocharc

次のように書き換える。

```
posset = UNIDIC
parser-model = $(rcpath)\..\model\dep.unidic.model
chunker-model = $(rcpath)\..\model\chunk.unidic.model
ne-model = $(rcpath)\..\model\ne.unidic.model
```

が、エラーが出る。

```
>cabocha -f1
dep.cpp(90) [decode_posset(p) == posset()] model posset and dependency parser's posset are different: UNIDIC != IPA
```

chasenrcに書かれているcharsetとpossetが認識されていない？
コマンドラインオプションで指定すれば、とりあえず動く。

```
>cabocha -f1 -P UNIDIC
```
CPU,DISKベンチマーク(何もインストールせずに)

# CPU

```bash:50万回ループ
LANG=C bash -c "time for ((i=0;i<500000;i++)); do :; done"

grep name /proc/cpuinfo
```

user値を見る。[【linux】timeコマンドの見方 at softelメモ](https://www.softel.co.jp/blogs/tech/archives/2354)

* 0m1.512s: i3-4130T CPU @ 2.90GHz
* 0m1.756s: Xeon(R) CPU E3-1220 V2 @ 3.10GHz
* 0m1.881s: Xeon(R) CPU X3450 @ 2.67GHz
* 0m1.940s: i3-2100 CPU @ 3.10GHz
* 0m2.132s: i3-3220T CPU @ 2.80GHz
* 0m2.581s: Xeon(R) CPU E5-2670 v2 @ 2.50GHz <--heroku
* 0m2.736s: Xeon(R) CPU E5-2665 0 @ 2.40GHz
* 0m3.244s: Xeon(R) CPU L5630 @ 2.13GHz
* 0m3.384s: Celeron(R) CPU B830 @ 1.80GHz
* 0m3.868s: Xeon(R) CPU L5320 @ 1.86GHz
* 0m4.202s: (L5320上のKVM)
* 0m4.267s: Xeon(R) CPU E5502 @ 1.87GHz
* 0m4.535s: Raspberry Pi 4 Model B Rev 1.2
* 0m5.012s: Xeon(R) CPU L5520 @ 2.27GHz <--CloudAtCost(2CPU)
* 0m6.244s: Intel(R) Atom(TM) x5-Z8550  CPU @ 1.44GHz
* 0m11.156s: i3-3217U CPU @ 1.80GHz(virtualbox+cpu性能60%に落とした)
* 0m11.951s: Raspberry Pi 3 Model B Rev 1.2
* 0m18.708s: Intel(R) Atom(TM) CPU N280   @ 1.66GHz
* 0m24.689s: RaspberryPi2
* 1m8.230s: RaspberryPi

# DISK

## 参考

* [第15章 ブロックデバイスのパフォーマンス測定](https://www.drbd.jp/users-guide/ch-benchmark.html)

## 計測

```bash:512MB
dd if=/dev/zero of=a.tmp bs=512M count=5 oflag=direct; rm a.tmp
```

```bash:512byte
dd if=/dev/zero of=a.tmp bs=4kb count=50000 oflag=direct; rm a.tmp
```

### 512MB

* 549 MB/s: VBOX HARDDISK (SSD)
* 324 MB/s: 2.5インチSAS 10,000回転
* 189 MB/s: [HFS128G32MND-331](http://kakaku.com/item/K0000801629/spec/) 128gb ssd
* 182 MB/s: CloudAtCost (2016/7/2調べ)
* 168 MB/s: 2.5インチSAS 10,000回転
* 131 MB/s: [HDS72105](http://kakaku.com/item/K0000067169/) 500gb
* 130 MB/s: [ST3500418AS](http://kakaku.com/item/K0000014805/spec/#tab) 3.5inch 500gb
* 114 MB/s: [WD30EZRX-00D](http://kakaku.com/item/K0000242118/spec/#tab) 3tb
* 80.3 MB/s: [HTS72502](http://kakaku.com/item/K0000083544/spec/#tab) 2.5inch 250gb
* 92.2 MB/s: CloudAtCost (ext4)
* 77.8 MB/s: CloudAtCost (LVM)
* 72.3 MB/s: [ST3160815AS](http://kakaku.com/item/05302015797/spec/) 3.5inch 160gb
* 66.6 MB/s: [HDT722520DLA380](http://kakaku.com/item/05300415729/spec/#tab) 3.5inch 200gb
* 65.7 MB/s : eMMC
* 59.4 MB/s: [ST9160827AS](http://kakaku.com/item/05360810606/spec/) 2.5inch 160gb
* 54.6 MB/s: LivaPC 
* 33.7 MB/s: 2.5インチSAS 10,000回転
* 12.7 MB/s: Raspberry Pi 2 (MicroSD 64gb)
* 5.7 MB/s: CloudAtCost (ext4:遅いホストの場合)

----

## CrystalDiskMarkっぽい計測

* [fioでCrystalDiskMarkっぽい計測を行うコマンドを作った - ぶていのログでぶログ](http://buty4649.hatenablog.com/entry/2015/02/09/fio%E3%81%A7CrystalDiskMark%E3%81%A3%E3%81%BD%E3%81%84%E8%A8%88%E6%B8%AC%E3%82%92%E8%A1%8C%E3%81%86%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F)

```bash:
apt-get install -y fio
curl -s https://raw.githubusercontent.com/buty4649/fio-cdm/master/fio-cdm | sh /dev/stdin /var/tmp/
```
標準入力の複製

標準入力を2つに分ける。

```
def splitter(source, number = 2)
	pipes = number.times.map{ IO.pipe }
	Thread.fork do
		source.each_line { |line|
			pipes.each{|r, w| w.puts line }
		}
		pipes.each{|r, w| w.close}
	end
	return pipes.map{|r, w| r }
end

src_0, src_1 = splitter($stdin, 2)
src0.each_line { |line| puts line }
src1.each_line { |line| puts line }
```