OmniAICreator/Qiita-1.07M huggingface dataset:
Rails5.1の新機能を使ってJS(yarn+webpack+react)で簡単なCRUD作ってみた

![crud.gif](https://qiita-image-store.s3.amazonaws.com/0/17353/27b7c877-1799-0131-8402-fc96efc013d9.gif)

---

## 概要

* Rails5.1ではJS関連の機能が大きく変わるらしいと知ったので、いまのedge railsで試してみた
* Railsが用意してくれるものにのっかりつつ、データを処理するrailsサーバーと見た目を処理するJSできれいに処理が分割されたアプリケーションをかなり楽に書けた
* 可能性を感じた
* 今回の内容は https://github.com/skuroki/hello_webpacker で見ることができます

---

## 作ってみた人はどんな人か

* Rails+ActiveAdminで管理ツール作る仕事をやってた
* Railsのapi modeでAPIサーバー作る仕事も最近はやっている
* JSは3年くらいまともに触っていない（ので、錆びついた知識を更新する目的もある）

---

## 今回登場するJS関連の技術

* yarn - bundlerみたいなやつ
* webpack - 1個の機能のために書いたJSとかCSSとかの複数のファイルを必要な変換とかを行った上で1個のJSファイルに固めてくれるやつ
* react - JSでUIを作るためのやつ

---

世では「あれとそれとこれと…を組み合わせるといいよ！」的な話があるかと思いますが、一気に新しいものに触れすぎるとわけがわからなくなってしまいそうだったので、今回は、上記３つ以外の新しい技術スタックは積まないという制約でやってます。

---

# ここから本題

---

## 下準備

* nodeはインストールしておく
* yarnもインストールしておく
    * npmで入れるのは非推奨とのことなのでbrewで
* いきなりやるよりは、webpackとreactの単独のチュートリアルは先にやっておくのがおすすめ
    * 自分はwebpackに1時間、reactに3時間かかった

---

## rails new

`bundle exec rails new hello_webpacker --webpack=react --edge --api`

* railsのedgeを使って、かつedgeオプションも使うことで、最新のgem構成でアプリを作れる
* yarnは言わなくても勝手に入ります
* webpack=reactと指定すると、webpackでreactを使えるように準備してくれます

---

### --api なの？

* なんかせっかくviewをJSで処理するんなら静的ページ+APIで作ってみようと思った
    * webpackとか動くんか？と思ったけどちゃんと動いた
* javascript_pack_tagとかのview機能はあったけど、簡単なscriptタグを吐くだけだったから使わなくてもいけそうと判断

---

## rails webpack:install

* rails newの最後に走る（けど今回はなんでか失敗しててあとから手動で流した）
* yarn関連のファイルとwebpack関連のファイルが追加される

---

### yarn関連のファイル

* vendor/package.json - Gemfileみたいなやつ
    * yarnコマンドで追加すると自動で書き換わるので、手で編集する必要はあんまりない
* vendor/yarn.lock - Gemfile.lockみたいなやつ
* bin/yarn - yarnのラッパー
* .gitignoreにvendor/node_modulesが追加される
    * 取ってきたパッケージの置き場所

---

### webpack関連のファイル

* app/javascript/packs/application.js　- JSアプリのサンプル
* bin/webpack - webpackのラッパー
* bin/webpack-watcher - ↑をwatchモードで起動するラッパー
    * これを立ち上げておくと、jsの変更を検知してビルドが自動で走る
* config/webpack/*.js - webpackの設定ファイル
    * 何形式のファイルをどうコンパイルして固めるかとかが書いてある

---

## rails webpack:install:react

* rails newの最後に走る（けど今回はなんでか失敗しててあとから手動で流した）
* reactを使ったJSアプリのサンプルが追加される
* webpackの設定にreactの内容が追加される
* yarnで管理されるパッケージにreactが追加される

---

## scaffoldの生成

* railsのapi modeでやるとCRUD用のapi scaffoldが生成される
* レスポンスはjson
* 今回のアプリ作成にあたって、scaffoldを生成した以降rubyのコード修正作業は一切行っていない

---

## reactを使ったコードを書く

* ES6で書ける
    * coffeeなくても、いい感じのコードが書ける（個人の感想）
* HTTPアクセスはfetch()がいい感じ
    * ブラウザネイティブ
    * 自分の知ってるものでは、UniRxに近い感じのメソッドチェーンで書ける
    * jsonからオブジェクトに落とすのもjson()メソッドで一発

---

## スタイルを追加する

* scssを使ってみた
* sass-loaderパッケージを追加
    * 依存するcss-loader style-loader node-sassも必要
* scssをビルドする設定を追加
    * これでwebpackの生成するjsの中にスタイルも含まれる

---

## これでできあがり

---

## 作ってみた感想

* 管理ツールを作ることを考えたときに、Rails+ActiveAdminとかと比べて「最終的に機能がサクサクつくっていけるようになりそうか」っていうと割とトントンになるんじゃねーかなっていう気持ち
    * 見た目部分の複雑さはJS側に寄っただけで低減はしてないという印象
    * もっと技術スタックを積めば違うのかもしれないけど、それはそいつらの使い方を結局覚えないといけないってことだし

---

* 重要な違いは、Railsのロジック/DBアクセスとJSのviewがほぼほぼ別物として作れているというところであるように感じた
    * RailsはJSのviewを作りやすい機能を提供してくれているだけという関係性、だからapi modeでも普通に動く
    * 別物であるということは、それぞれ別個に差し替えることがやりやすい事を意味している。たとえばサーバー側をnodeで書くようにしたり、同じapiを扱うUnityのエディタ拡張を書く、というようなことがやりやすくなる
RedHat OpenShift Container Local を使えるようにしてみる

# Overview
コンテナのオーケストレーションツール RedHat OpenShift の検証として、開発環境用に無償で提供されている "OpenShift Container Local" を macOS 上に用意する手順のまとめ。

# System Requirements
ここでは Red Hat Development Suite on Mac 1.2.0.Alpha1 に組込みのものを利用するため、対象は macOS 前提
VirtualBox は 5.0.x でなければならない。5.1.x もダメっぽい
Vagrantも新しいとダメな場合があるので、このInstallerで入れられるものにしとくのが良さそう

# Installation
## Download Red Hat Development Suite をダウンロードしてインストール
https://developers.redhat.com/products/devsuite/download/

## OpenShift を使用するための VM を起動
以下の２つの VM を起動する必要がある。それぞれのOSは RedHat Enterprise Linux
* rhel-ose : OpenShift Enterprise がインストールされたVM
* rhel-k8s-singlenode-setup : Kubernetes がインストールされたVM

### OpenShift Enterprise 用の VM を起動
```
cd ~/DevelopmentSuite/cdk/components/rhel/rhel-ose
vagrant up
```
### Kubernetes の ホストOSを起動
```
cd ~/DevelopmentSuite/cdk/components/rhel/misc/rhel-k8s-singlenode-setup
vagrant up
```
VM の ホストOS は RedHat Enterprise Linux のため、Subscriber (RedHat Developer Program に参加しているユーザ) として、登録する必要があるので、ユーザ名(メールアドレス)とパスワードの入力が求められる。
※多分やらないと使えない

```
default: Would you like to register the system now (default: yes)? [y|n]y
default: username: <username>
default: password:
```

# Usage
2つのVMが起動されたら、下記のURLにアクセスし、コンソールを開く
https://10.1.2.2:8443/console

![image](https://qiita-image-store.s3.amazonaws.com/0/57967/d01ab3bd-d754-e8e2-216f-77d3504a8771.png)
ユーザ名とパスワードはそれぞれ、以下の通り
Username : openshift-dev
Password : devel
技術英語 > Java was terribly slow [in its infancy], ... / its enhancements have been more gradual

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 359 / 12833)

> Java was terribly slow **<font color=red>in its infancy</font>**, ...

初期のころはすごく遅かったが、多くの研究と開発費が速度向上に注ぎ込まれた、とある。

一方で、Pythonは

> Python is not owned by a corporation, **<font color=red>so its enhancements have been more gradual</font>**.
vimで構文のハイライトを自作する

## 1. 構文の定義ファイル
vimでは「拡張子名.vim」というファイル内に各拡張子に対する構文が定義されます。
例えば、C言語（example.c）の構文の定義はc.vim、
HTML（example.html）であればhtml.vimというファイル内に記述されます。

これらの構文の定義ファイルは~/vim74/syntaxのフォルダ内に置かれています。
未定義の拡張子に対する構文定義を追加することもできます。

今回は例として.txtの構文定義を作成します。

txt.vimはデフォルトで存在しないので、
txt.vimを新たに作成して~/vim74/syntaxのフォルダ内に保存します。
ハイライトしたい構文を書き並べましょう。

```vim:~/vim74/syntax/txt.vim
syntax keyword txtComment コメント
syntax keyword txtConstant 定数
syntax match txtString /文字列/
syntax match txtIdentifier /何これ/
syntax match txtError /エラー/

highlight link txtComment Comment
highlight link txtConstant Constant
highlight link txtString String
highlight link txtIdentifier Identifier
highlight link txtError Error

let b:current_syntax = "txt"
```

書き方は構文を指定するときに
`syntax keyword [グループ名] [構文]`
や
`syntax match [グループ名] [構文]`
といった具合に記述します。
このときグループ名と構文は自由に決められます。
keywordとmatchの違いは正確なところは分かりませんが結果を後に示します。
keywordやmatchの他にもハイライト箇所を範囲で指定するregionがあるようです。

ハイライトする色を選択するときには
`highlight link [グループ名] [ハイライトカラー]`
とします。

ここでグループ名は自分で決めたものから選びます。
ハイライトカラーは多数用意されている中から選びます。
`:h syntax`
というコマンドで一覧を見ることができます。


## 2. vimrcに追加する内容
vimrcには次の一文を追加するだけでokです。

```vim:vimrc
au BufRead,BufNewFile *.txt set filetype=txt
```
他の拡張子の場合には「txt」の部分を変更してください。


## 3. test.txtで試す
test.txtの編集画面は次のように表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/159523/6672d053-4a6c-441e-561f-c038277742cc.png)

keywordで定義した「コメント」と「定数」は一行目ではハイライトされませんね。
どうやらkeywordで定義すると他の文字列と連続する形で構文が含まれる場合にはハイライトされないようです。
空白や記号と連続する場合はハイライトされています。
GitとGitHubの環境設定

# git
## 鍵作成
> ```bash:terminal
$ cd
$ mkdir ~/.ssh && cd ~/.ssh
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
$ Generating public/private rsa key pair.
$ Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):id_github_"your_name"_rsa
$ Enter passphrase (empty for no passphrase):
$ Enter same passphrase again:
```
- [Generating a new SSH key and adding it to the ssh\-agent \- User Documentation](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/)
- [gitHubでssh接続する手順~公開鍵・秘密鍵の生成から~ \- Qiita](http://qiita.com/shizuma/items/2b2f873a0034839e47ce)

## 設定
```bash:terminal
$ git config --global user.name "your_name"
$ git config --global user.email your_email@example.com
```

## github
- 公開鍵の確認

```bash:terminal
$ vi ~/.ssh/id_github_"your_name"_rsa.pub
$ 上記の中身をコピー
```

- 公開鍵の登録
https://github.com/settings/keys

- 接続確認

> ```bash:terminal
$ mkdir ~/.ssh/config
$ vi ~/.ssh/config
Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_github_"your_name"_rsa
  User git
$ ssh -T github
```

## 補完
- [Macでgitを利用した開発する際にやっておきたい準備 \- Qiita](http://qiita.com/NorsteinBekkler/items/a0622ee6a39d08d61b72)
Android向けアプリのデバッグにMali Graphics Debuggerを使用する方法 (+Unityで作った物にも)

#Mali Graphics Debugger
GPUにMaliを使用しているAndroid端末向けのデバッガに、「[Mali Graphics Debugger](http://malideveloper.arm.com/resources/tools/mali-graphics-debugger/)」といものがあります。

今回は、このデバッガの使用方法について教わったのでそれについてまとめてみました。
後半にはUnityで作成したアプリ用の方法についても触れています。


#手順
今回はroot化されていないAndroid端末で、32bit版(armeabi-v7a)を対象としておこないました。
ちなみに私の使用したものはGalaxy S6です。

##1. ダウンロード
まず[ARMのサイト](http://malideveloper.arm.com/resources/tools/mali-graphics-debugger/)から、Mali Graphics Debuggerをダウンロードします。
ダウンロードしたファイルを実行し、必要なファイルをインストール。インストール先はデフォルトのままで大丈夫です。

##2. libMGD.soファイルを移動
先程ダウンロードしたフォルダの
'C:\Program Files\ARM\Mali Developer Tools\Mali Graphics Debugger v4.1.0\target\android-non-root\arm\armeabi-v7a'
の中に、libMGD.soというファイルがあるかと思います。
このファイルを
'C:\android\arm\armeabi-v7a'
というフォルダ内に移動します。

##3. ポートフォワーディング
Android Studioを立ち上げ、デバッグしたい対象のアプリのファイルを開きます。
Android端末をPCに接続し、Android Studioのコマンドラインで、以下のコマンドを入力します。

```
adb forward tcp:5002 tcp:5002
```

##4. daemon programをAndroid端末にインストール
daemon programをAndroid端末側にインストールします。
コマンドラインに以下のコマンドを入力してください。

```
adb install -r C:\Program Files\ARM\Mali Developer Tools\Mali Graphics Debugger v4.1.0\target\android-non-root\MGDDaemon.apk
```

##5. build.gradleを編集
appのbuild.gradleに以下のjniLibs dirを追加します

```build.gradle
sourceSets.main.jniLibs.srcDir 'C:\\Android\\arm'
```

\は円マークに直さないとダメかもしれません


##6. MainActivityを編集
アプリのMainActivityに、以下のコードを追加します。

```MainActivity.java
static {
    	try {
        		System.loadLibrary("MGD");
    	}
    	catch( UnsatisfiedLinkError e ){
        		// Feel free to remove this log message.
        		Log.e("[ MGD ]", "libMGD.so not loaded.");
    	}
}

```

##7. アプリの実行
アプリをAndroid端末へインストールします。
そして、MGD Daemon appから対象のアプリを開いてください。

##8. デバッガの起動
PCの方で、
'C:\Program Files\ARM\Mali Developer Tools\Mali Graphics Debugger v4.1.0'
内にあるLaunch.batを起動してください。
起動後、左上のメニューのDebugからConnect to targetを選択することでトレースが開始されます。


#Unityの場合
Unityで作成れたアプリの場合ですが、この方のサイトに従って実行したらうまくいきました。

[Building a Unity Application with Mali Graphics Debugger Support](https://www.community.arm.com/graphics/b/blog/posts/building-a-unity-application-with-mali-graphics-debugger-support)


英語の読める方なら、このサイトを読めば問題なく実行することができるかと思います。
上記の手順6.の代わりにここに書いてあることをおこなえば大丈夫です。

一応日本語で必要だったところだけまとめます。

##1. StandardActivityクラスを作成
上記の手順6.はおこないません。
その代わり、新しくStandardActivity.javaクラスを作成し、以下のコードを記述します。

```StandardActivity.java
package test.application;  
import com.unity3d.player.UnityPlayerActivity;  
import android.os.Bundle;  
import android.util.Log;  
  
public class StandardActivity extends UnityPlayerActivity  
{  
    protected void onCreate(Bundle savedInstanceState)  
    {      
        try  
        {  
            System.loadLibrary("MGD");  
        }  
        catch( UnsatisfiedLinkError e)  
        {  
            Log.i("[ MGD ]", "libMGD.so not loaded.");  
        }  
        super.onCreate(savedInstanceState);  
    }  
}  
```
##2. AndroidManifestの編集
AndroidManifest.xml内のactivityのandroid:nameを書き換えます。

```AndroidManifest.xml
activity android:name=”StandardActivity” 
```

後は上記の手順同様にしていけばデバッグできると思います。
foreverした後console.logの出力先は何処へ...?

#はじめに
サーバー等で自分が作成した環境をずっと起動させておきたい場合、```node jsファイル```
とするのではなく、npmでforeverモジュールをインストールして、```forever start jsファイル```などとすれば、永遠にそのjsファイルを起動できます。
ただ、そこで思ったのが
**console.logの出力が消えた！！**
ということです。```node jsファイル```とするときは常時その端末(ターミナルとか)に出力されますよね。ただ、foeverでは端末に現れないのです。それを疑問に思ったので、今回はこのことについて書きます。
#環境
ローカル: Ubuntu14.04 LTS
レンタルサーバー: さくらVPS OS➞Ubuntu16.04 LTS
#結論
```forever list```で出力ログが書いてありましたw
思ったより簡単に見つかりましたね。
CodeIgniterをAWSでとりあえず動かす

きりょうです。個人メモとMarkdownのお試しを兼ねています。

###awsでcodeigniterを動かします。（ド初心者向け)
インスタンスIPがわかってて、秘密鍵でアクセスまでできる状況まで想定してます。

1. aws、出来立てホヤホヤのインスタンスにコマンドラインでアクセスします
2. [lamp環境設定](http://qiita.com/Ogaaaan/items/62fe033e4506863d2788)
3. [⬆︎の最後の方に出てくるsqldの設定](http://raichel.hatenablog.com/entry/2015/07/04/210206)
3. vi /etc/httpd/conf/httpd.conf 編集（これを変えないと.htaccessが効かない）

```httpd.conf

DocumentRoot "/var/www/html"　　　//お好みのドキュメントルート

<Directory /var/www/html>    //ドキュメントルートと一緒
    AllowOverride All　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　//NONEをALLにかえる
</Directory>
```


注意* mod_rewriteは超ひっかかりました。
.htaccess設定してるはずなのにmod_writeが動いてないんじゃないのコレっていう時は、まずmod_rewriteを確かめます。
僕の場合httpd.confの一番下の行に
LoadModule rewrite_module modules/mod_rewrite
の一文を追加しました。

service httpd restartをかけたら、
ターミナルに「お前LoadModuleしてるけどもうリライトモジュール持ってんぞ、再起動はOK」みたいな一言付け加えられた英語を吐き捨てられて再起動されました。
ので、LoadModuleは消しました。
/etc/httpd/moduleの中にmod_rewrite.soがあればオッケーみたいです。
最悪一旦.htaccessのことは忘れてwelcomeページだけ出しましょう。

4.codeigniterのconfigファイルのベースURLや.htaccess、データベース設定を変更
5.ファイルアップ(もちろんドキュメントルートにindex.phpが来るように)

**http://インスタンスのIP/index.phpでwelcomeページが出た〜（おしまい）**

###備考
作ったコントローラーをあげたのですが見事にアクセスできませんでした。
htaccessやhttpd.confをいじりまくったのですがどうにもこうにもなので、zipからcodeigniterパッケージを解凍して、再度コントローラー・ビューファイルimagesやjsなどシステムに関わらない部分だけ移し替えてアップしました。
自作コントローラー引っかかった時の確認事項です。
・igniterのconfigのbaseURLは最後にちゃんと'/'が付いているか
・自作したコントローラーの頭文字は大文字か（ローカルでは小文字でも動いてた）
・htdocsを作った場合index.phpのapplicationとsystemの参照先を変更しているか
・  print 'apple pen'; exit;でどのファイルまで行っているか確認
・何回か試して表示されなかったのですが新規にコントローラーを作成してプログラムだけコピペしたらつきました。なんだったんだ。。。


とりま以上です
関数の引数を（出来たら）推定する

できないこともたくさんある
# 実行イメージ
```
auto f=[](int){};
using  type = get_arg_type_t<decltype(f),   // 推測される関数
                             int,char,A>;  //推測できる型
```


# 実装原理
自由な型へ変換可能なクラスを作り、それを利用して関数を呼び出す
その際副作用を利用してどのような型に変換されるかを値として保存
それを型に戻す

# 実装
（説明の都合上、今回推定できる型はAとBのみとする）

```
struct A{};
struct B{};
```
型をidに変換する方法、idから型に変換する方法を何らかの方法で実装する

```
template<class T>struct wrap{
    using type=T;
};
template<int>struct Int{};

constexpr int toID(wrap<A>){return 1;}
constexpr int toID(wrap<B>){return 2;}

constexpr wrap<A> toType(Int<1>){return {};};
constexpr wrap<B> toType(Int<2>){return {};};

```
こんな型を用意する
型の変換時にidに変換先のidが保存される

```
struct ubiq{
    int id=0;
    template<class T>
    constexpr operator T(){
        id = toID(wrap<T>{});
        return {};
    }
};
```
関数に適用しidを取り出す

```
template<class F>
constexpr int get_arg_type_id(F f){
    ubiq a;
    f(a);
    return a.id;
}
```
idから型に戻す

```
template<class F>
constexpr auto get_arg_type(F f)
{
    constexpr int id = get_arg_type_id(f);
    return toType(Int<id>{});
}
```
完成

```
int main()
{
    auto a=get_arg_type([](A){});
    static_assert(std::is_same<decltype(a)::type,A>{},"");
    
    auto b=get_arg_type([](B){});
    static_assert(std::is_same<decltype(b)::type,B>{},"");
}
```



#推定の制限

+ 推定できる型は明示的に指定する必要があります
  + この関数にとって未知の型（上の例だとAB以外の型）は推定はできません
  + 「型をidに変換する」機能をあらかじめ実装しておく必要があるため
  + 何らかの方法(ハックとか魔法とか)でコンパイル時にすべての型に対しidを振れ、かつそのidから型に戻せるなら可能です
- constexprな（デフォルト）コンストラクタを持った型しか推測できません
 - ubiqで変換先の型を返す必要があるため
 - 変換先の型を生成する手段があるならばデフォルトコンストラクタを使う必要はありません
     - 例えば`make_foo<T>()`や`T{0}`で推定できる型が生成できるのならばそれでも良い



#参考
magic_getの実装
https://github.com/apolukhin/magic_get
WindowsでModelicaとPythonを連携する

『[お手軽にモデルベース開発環境を構築したい](http://qiita.com/ozawaat/items/7f7a3e4794a297195b8f)』で紹介した、ModelicaとPythonの連携方法についてです。



# 目的

下記のような操作を行うことが今回の目的です。

- **Modelicaで物理モデルを作成する。**
- **物理モデルをPythonのPyModelicaモジュール（JModelica）でFMU形式にコンパイルする。**
- **FMUファイルをPythonのPyFMIモジュール（JModelica）で計算する。**
- **計算結果をPythonのMatplotlibモジュールでグラフ表示する。**



# 環境設定

## 実行環境

- Windows 10 (64bit)

## Anaconda2のインストール

![Anaconda_Logo.png](https://qiita-image-store.s3.amazonaws.com/0/139905/340f5e46-aff1-8357-debd-1bc0a6885a22.png)

連成シミュレーション・マスタとしてのPython実行環境をAnacondaで構築します。後述のJModelicaがPython2 32bitのみに対応しているため、Anacondaもそれに対応したものを用います。（すでに別のPython環境がインストールされている場合も、追加でインストールすれば問題ないと思います。）

以下のページから『Python 2.7 version (32bit)』版のインストーラをダウンロードします。
[Download Anaconda Now! | Continuum](https://www.continuum.io/downloads#windows)

ダウンロードしたインストーラを実行し、基本的にデフォルトのまま進めます。インストール先フォルダは `C:\Anaconda2` に設定しておきます。

## JModelicaのインストール

PythonモジュールのPyModelicaとPyFMIを利用するため、JModelicaをインストールします。

![JM_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/139905/b3528597-ba66-861e-f366-414baa8d3555.png)

下記ページから最新のインストーラをダウンロードします。
[Download | JModelica.org](http://www.jmodelica.org/binary)

Pythonモジュールインストール時、インストール先が `C:\Anaconda2` になるように選択します。



# Modelicaモデルを作成する

今回は『[WindowsでOpenModelicaを使う](http://qiita.com/ozawaat/items/62403cbd9a6db7a8124b)』で紹介した `Modelica.Thermal.HeatTransfer.Exsamples.Motor` をModelica形式で保存したものを用います。

『[ozawaat/FMI_Motor](https://github.com/ozawaat/FMI_Motor)』の `Motor.mo` に保存しておきましたのでこちらをご利用ください。

`Motor.mo` を適当な場所に保存しておいてください。



# ModelicaモデルをFMU形式にコンパイルする

## JModelicaからPythonを起動する

`Motor.mo` が保存されているフォルダでPythonを操作します。Pythonの起動方法は以下のいずれかを用いてください。

1. [画面左下のWindowsマーク] → [JModelica.org-1.17] からIPythonを開き、コンソールに
   ```!cd C:\[Motor.moが保存されているフォルダ]\```
   を入力してフォルダを移動します。

2. `Motor.mo` と同じフォルダに `C:\JModelica.org-1.17` から `IPython.bat` をコピーしておきます。この `IPython.bat` をダブルクリックしてIPythonを開きます。

![IPython.png](https://qiita-image-store.s3.amazonaws.com/0/139905/4bf5fc13-e40c-0170-8ceb-db40edf04484.png)

## ModelicaファイルをFMUにコンパイルする

`Motor.mo` と同じフォルダに下記ファイルを保存します。

```python:Motor_Compile.py
from pymodelica import compile_fmu
model_name = 'Motor'
mo_file = 'Motor.mo'
my_fmu = compile_fmu(model_name, mo_file, target='cs')
```

IPythonコンソールから
```run Motor_Compile.py```
を入力すると、 `Motor.mo` がコンパイルされて `Motor.fmu` が作成されます。



# FMUをPythonで計算してグラフに表示する

`Motor.mo` と同じフォルダに下記ファイルを保存します。

```python:Motor.py
import matplotlib.pyplot as plt
from pyfmi import load_fmu

model = load_fmu('Motor.fmu')
opts = model.simulate_options()
opts["ncp"] = 1000

res = model.simulate(final_time=100000, options=opts)

T1 = res['Twinding.T']
T2 = res['Tcore.T']
t = res['time']

plt.plot(t, T1, label="Twinding.T")
plt.plot(t, T2, label="Tcore.T")
plt.legend(loc='best')
plt.xlabel('time [sec]')
plt.ylabel('Temperature [K]')
plt.show()
```

IPythonコンソールから
```run Motor.py```
を入力すると、 `Motor.fmu` がPython上で計算されて下記のグラフが表示されます。

![Motor_plot.png](https://qiita-image-store.s3.amazonaws.com/0/139905/09bbad72-3ebb-a814-4ccb-a8a7bf229cfe.png)
linuxコマンド終了したらSlackに通知するようにする 

## 背景

+ ダウンロードや、機械学習の学習など、長い時間がかかる処理が終わった時に、Slackに通知するようにしたい
+ [ntfy](https://github.com/dschep/ntfy/tree/bab1dc814d0244e74ebadf29cce1ff48beb8610f) があったので使ってみる

## 目的

+ ntfyを使って見る 

## 概要

+ ntfyについて
+ 使い方

## 結論

+ ほんの数分で環境を作ることができた。素晴らしい

```
sh some_task.sh; ntfy send "Finished"
```

のように通知が可能

すでに動いているプロセスがある場合は、

```
pstree -p
```

などでプロセスIDを調べて

```
while kill -0 <PID> 2> /dev/null; do sleep 1; done; ntfy send "Finished"
```

で通知が可能
 
## 内容

### ntfyについて

+ [LICENSE](https://github.com/dschep/ntfy/blob/bab1dc814d0244e74ebadf29cce1ff48beb8610f/LICENSE    )はGPL
+ pythonで実装されている
+ いろいろな通知との連携が実装されている
  + 今回はそのうち、Slackとの連携をやってみる

### 使い方

##### 1. Slackの部屋を作成する

今回は、`#general`の部屋に通知をする

##### 2. Slackのトークンを作成

[https://api.slack.com/web#authentication]
(https://api.slack.com/web#authentication)こちらから作成可能

##### 3. python環境の構築

pipが使える状態にする
 
```
- '2.7'
- '3.3'
- '3.4'
- '3.5'
```
[travis.yml](https://github.com/dschep/ntfy/blob/bab1dc814d0244e74ebadf29cce1ff48beb8610f/.travis.yml)を見ると、上記のバージョンで実行できそうである

##### 4. ntfyのインストール

```
sudo pip install ntfy
echo 'eval "$(ntfy shell-integration)"' >> ~/.bashrc
source ~/.bashrc
```

##### 5. 設定ファイルの追加(~/.ntfy.yml)

```
---
backends:
  - slack
slack:
  token: slacktoken
  recipient: "#general"
```

##### 6. 実行テスト

```
$ ntfy send "test"
```

これで、SlackにポストされていればOK!
numpyについて

# numpyの基本操作

* Arrayのコピーを作成する<br>

```
In [] : arr_copy = arr.copy()
```


* 行列の入れ替え
行列aarの行と列を入れ替える。入れ替え方法としては2通り。

```
In []: aar
Out[]: array([[0, 1, 2],
              [3, 4, 5],
              [6, 7, 8]])
```

```
In []: aar.T   or   aar.transpose()
Out[]: array([[0, 3, 6],
       　 　　[1, 4, 7],
     　　　   [2, 5, 8]])
```
Clean Architecture 開発ツールの話

これは [Swift Tweets](https://swift-tweets.github.io/) の発表をまとめたものです。イベントのスポンサーとして Qiita に許可をいただいた上で、このような形（ツイートの引用）で投稿しています。

---

<blockquote class="twitter-tweet"><p dir="ltr">"Clean Architecture 開発ツールの話"
自己紹介
廣瀬 雄大と申します。
あだ名はstar乞食です。
github: https://github.com/bannzai

よろしくお願い致します！

#swtws 
</p>&mdash; @yhirose741 <a href="https://twitter.com/yhirose741/status/820301688170893315"></a></blockquote>

<blockquote class="twitter-tweet"><p dir="ltr">@ktanaka117 さんの発表で登場した(iOSにおける) Clean Architectureの開発効率を計ったツール「Kuri」を作りました。
Swiftで作ったコマンドラインツールになります。
今回はその使い方や作った目的についてツイートしていきます。

#swtws
</p>&mdash; @yhirose741 <a href="https://twitter.com/yhirose741/status/820301798959218688"></a></blockquote>

<blockquote class="twitter-tweet"><p dir="ltr">Clean Architectureの欠点としてコードの記述の多さが挙げられます。
Kuriはこのコードの記述量に対する負担を軽減するために作ったライブラリです。
具体的にどういうアプローチで解決を試みたかをご紹介します。

#swtws
</p>&mdash; @yhirose741 <a href="https://twitter.com/yhirose741/status/820301935441952768"></a></blockquote>

<blockquote class="twitter-tweet"><p dir="ltr">Clean Architectureは細かくレイヤーを分割することにより役割や責務が明確になります。
導入してしばらく書き続けていて同じような処理の流れを書くことが多いことに気づきました。
これは役割や責務が明確に分かれていることによって起きていると考えられます。

#swtws 
</p>&mdash; @yhirose741 <a href="https://twitter.com/yhirose741/status/820302050051268609"></a></blockquote>

<blockquote class="twitter-tweet"><p dir="ltr">Kuriではこれに着目しました。
同じような処理の流れを書くということはテンプレートを用意することで
テンプレートからコード・ファイルをgenerateすることができるだろうと考えました。

具体的な使い方を紹介します。

#swtws 
</p>&mdash; @yhirose741 <a href="https://twitter.com/yhirose741/status/820302159195447299"></a></blockquote>

<blockquote class="twitter-tweet"><p dir="ltr">まず、Kuriでコードジェネレートするために必要なものが二つあります。

Kuri.yml
KuriTemplate

Kuriではこれを用意するコマンドが用意されています。
xcodeprojectがあるディレクトリで実行してください

$ kuri setup

#swtws
</p>&mdash; @yhirose741 <a href="https://twitter.com/yhirose741/status/820302370252865536"></a></blockquote>

<blockquote class="twitter-tweet"><p dir="ltr">これでKuriを使う準備ができました。
今度は本機能である`generate`機能を使ってみましょう。

`generate`用のコマンドは下記の通りです。
$ kuri generate [Prefix]

#swtws 
</p>&mdash; @yhirose741 <a href="https://twitter.com/yhirose741/status/820302449474838529"></a></blockquote>

<blockquote class="twitter-tweet"><p dir="ltr">一つ例を示します。
xcodeprojectがあるディレクトリで
$ kuri generate Kuri
を実行します。
するとKuriRepository, KuriEntityといったファイルが生成されます。

#swtws 
</p>&mdash; @yhirose741 <a href="https://twitter.com/yhirose741/status/820302588083982336"></a></blockquote>

<blockquote class="twitter-tweet"><p dir="ltr">そして、Kuriの特徴として`generate`コマンドで生成されたファイルは自動的に
xcodeprojectにimportされています。これ超便利。すごい(自画自賛)

これでファイルを作ってimportする手間
コードの記述量の削減を確認できたと思います。

#swtws </p>&mdash; @yhirose741 <a href="https://twitter.com/yhirose741/status/820302743357132803"></a></blockquote>

<blockquote class="twitter-tweet"><p dir="ltr">10-----------------------
Kuriにはこのほかにもより便利に使えるオプション等があります。
詳細はgithubのREADMEをご覧ください。

Kuri: https://github.com/bannzai/Kuri

いいねと思ったらStarください
ごTwieet聴ありがとうございました！

#swtws
</p>&mdash; @yhirose741 <a href="https://twitter.com/yhirose741/status/820302846096588803"></a></blockquote>
Unityとblenderのカメラを合わせる

モデリングした結果を即Unityでプレビューできないので
blender側のカメラをUnityのカメラの設定に合わせて確認するための手順。

カメラの設定はパースペクティブです。

#環境
Unity 5.5.0p3
blender 2.77a

#手順
##カメラの解像度を合わせる
blenderのカメラオブジェクトを選択して以下の画面で解像度を設定する。

![image](https://qiita-image-store.s3.amazonaws.com/0/36154/6cd0fdf2-d340-dcf3-d0bf-3e2f8c82a8fb.png)

##カメラの位置と回転を合わせる

![image](https://qiita-image-store.s3.amazonaws.com/0/36154/6dead210-b651-11b0-4684-fbd51da4dd86.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/36154/becb03a7-c74c-42b8-43de-1188a9557b74.png)

UnityのXYZ軸とblenderのXYZ軸は異なる。

| Unity | blender |
|-----------------:|------------------:|
| x | x |
| y | z |
| z | y |

Unityの単位はメートル。

X軸の回転する向きがUnityとblenderでは異なった。
(X軸しか調べていません)

Unityの角度をblenderの角度へ変換するには以下の式になる。

blenderの角度 = (360 - Unityの角度 + 90) % 360


##視野角とクリッピング領域を合わせる
クリッピング領域はお好みで。

![image](https://qiita-image-store.s3.amazonaws.com/0/36154/e0409cee-9e26-d941-0199-334d072a6d14.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/36154/0ecc2c1b-8b26-9b06-5149-2eac1c5a24a2.png)

blender側のテンキーの0を押すとプレビューできる。
これでUnityとblenderの見え方が同じになる。


#あとがき
Unityが公式のモデリングツールだしてくれないだろうか。
Unityのシェーダーでプレビューしたいなー。
Rails consoleでエラーが出た場合


MacでRails consoleをしたらこんなエラーが出た。

```bash
bundle exec rails c
```

```txt
Running via Spring preloader in process 33223
/Users/test/workspace/teacher/vendor/bundle/ruby/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require': dlopen(/usr/local/Cellar/ruby/2.3.1/lib/ruby/2.3.0/x86_64-darwin15/readline.bundle, 9): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib (LoadError)
  Referenced from: /usr/local/Cellar/ruby/2.3.1/lib/ruby/2.3.0/x86_64-darwin15/readline.bundle
  Reason: image not found - /usr/local/Cellar/ruby/2.3.1/lib/ruby/2.3.0/x86_64-darwin15/readline.bundle
```

このコマンドを打ったら、ちゃんと起動しました。

```bash
ln -s /usr/local/opt/readline/lib/libreadline.7.0.dylib /usr/local/opt/readline/lib/libreadline.6.dylib  
```
Cygwin環境作成、その３（hg/git設定、minttyテーマ）

前回に続いてCygwin環境の設定を続けようと思います。
１．git/hg設定
２．minttyのテーマ
# git/hgの設定
### git
~/.gitconfigを以下のように設定する。

```bash
[user]
	name = last first
	email = myname@domain.com
[core]
	preloadindex = true
	autoCRLF = input
	safecrlf = true
	editor = vim -c "set fenc=utf-8"
	quotepath = false
[color]
	diff = auto
	status = auto
	branch = auto
```

git設定の確認

```bash
$ git config --list
user.name=last first
user.email=myname@domain.com
core.preloadindex=true
core.autocrlf=input
core.safecrlf=true
core.editor=vim -c set fenc=utf-8
core.quotepath=false
color.diff=auto
color.status=auto
color.branch=auto
```

### hg
gitに比べマイナーだが、僕はmercurialも好きだ。gitは変更したファイルをaddしてからcommitする。hgはいきなりcommitできて手軽です。またglobalな設定ファイルにパスワードを入れられるのも便利で捗ります。gitはリポジトリ毎の設定に追記したりsshでやるんだっけ？ ほかの違いについては、以下を参照。
1. [Mercurial 対 Git：なぜ Mercurial を選ぶのか？ | Atlassian Blogs](http://japan.blogs.atlassian.com/2012/03/mercurial-vs-git-why-mercurial/)
2. [操作体系から見る、GitとMercurialの8つの違い: ニュースの社会科学的な裏側](http://www.anlyznews.com/2010/12/gitmercurial8.html)

~/.hgrcに以下設定する。

```bash
[ui]
username = First Last <myname@domain.com>

[auth]
bb.prefix = https://bitbucket.org/myname/
bb.username = myname
bb.password = password
```

hg設定を確認するといろいろ出てきます。

```bash
$ hg config
auth.bb.prefix=https://bitbucket.org/myname/
auth.bb.username=myname
auth.bb.password=password
merge-tools.kdiff3.args=--auto --L1 base --L2 local --L3 other $base $local $other -o $output
　：
　：
（以下略）
```

# minttyのテーマ設定
### その前にminttyのショートカット作成
"…\cygwin64\bin\mintty.exe --position 20,20 --size 120,45 -i /Cygwin-terminal.ico /bin/bash --login -i"
CraftLaunchを使っているとこうなる。

```python
( u"mintty", window.ShellExecuteCommand(None, portdir + u"cygwin64/bin/mintty.exe", "--position 20,20 --size 120,45 -i /Cygwin-Terminal.ico /bin/bash --login -i", "") ),
```

### solarizedをダウンロード、起動時設定
１．自分の作業用フォルダの作成
２．gitで取得

```bash
mkdir ~/my_work
cd mywork
git clone https://github.com/mavnn/mintty-colors-solarized
```

３．/etc/bash.bashrcの変更

```bash
echo "source ~/my_work/mintty-colors-solarized/sol.light" >> /etc/bash.bashrc
```

４．minttyを再起動するとsoloarized lightが適用されています。
# 参考先
[Gitをインストールしたら真っ先にやっておくべき初期設定 - Qiita](http://qiita.com/wnoguchi/items/f7358a227dfe2640cce3)
[hgrc - How to save username and password with Mercurial? - Stack Overflow](http://stackoverflow.com/questions/2584407/how-to-save-username-and-password-with-mercurial)
[CygwinのターミナルにカラースキームSolarizedを適用する - Qiita](http://qiita.com/baboocon/items/bdfd6f15f62d8ecb55d4)
素人の言語処理100本ノック:62


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第7章: データベース
>artist.json.gzは，オープンな音楽データベースMusicBrainzの中で，アーティストに関するものをJSON形式に変換し，gzip形式で圧縮したファイルである．このファイルには，1アーティストに関する情報が1行にJSON形式で格納されている．JSON形式の概要は以下の通りである．
>
>|フィールド|型|内容|例|
>|--------|--------|-----|----|
>|id|ユニーク識別子|整数|20660|
>|gid|グローバル識別子|文字列|"ecf9f3a3-35e9-4c58-acaa-e707fba45060"|
>|name|アーティスト名|文字列|"Oasis"|
>|sort_name|アーティスト名（辞書順整列用）|文字列|"Oasis"|
>|area|活動場所|文字列|"United Kingdom"|
>|aliases|別名|辞書オブジェクトのリスト||
>|aliases[].name|別名|文字列|"オアシス"|
>|aliases[].sort_name|別名（整列用）|文字列|"オアシス"|
>|begin|活動開始日|辞書||
>|begin.year|活動開始年|整数|1991|
>|begin.month|活動開始月|整数||
>|begin.date|活動開始日|整数||
>|end|活動終了日|辞書||
>|end.year|活動終了年|整数|2009|
>|end.month|活動終了月|整数|8|
>|end.date|活動終了日|整数|28|
>|tags|タグ|辞書オブジェクトのリスト||
>|tags[].count|タグ付けされた回数|整数|1|
>|tags[].value|タグ内容|文字列|"rock"|
>|rating|レーティング|辞書オブジェクト||
>|rating.count|レーティングの投票数|整数|13|
>|rating.value|レーティングの値（平均値）|整数|86|
>
>artist.json.gzのデータをKey-Value-Store (KVS) およびドキュメント志向型データベースに格納・検索することを考える．KVSとしては，LevelDB，Redis，KyotoCabinet等を用いよ．ドキュメント志向型データベースとして，MongoDBを採用したが，CouchDBやRethinkDB等を用いてもよい．

###62. KVS内の反復処理
>60で構築したデータベースを用い，活動場所が「Japan」となっているアーティスト数を求めよ．

####出来上がったコード：

```python:main.py
# coding: utf-8
import leveldb

fname_db = 'test_db'

# LevelDBオープン
db = leveldb.LevelDB(fname_db)

# valueが'Japan'のものを列挙
clue = 'Japan'.encode()
result = [value[0].decode() for value in db.RangeIter() if value[1] == clue]

# 件数表示
print('{}件'.format(len(result)))
```

####実行結果：

```console:実行結果
22821件
```

###LevelDBの列挙

登録内容の列挙は`LevelDB.RangeIter()`でイテレータを取得して行いました。

　
63本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。この第7章で用いているデータのライセンスは[クリエイティブ・コモンズ 表示 - 非営利 - 継承 3.0 非移植](https://creativecommons.org/licenses/by-nc-sa/3.0/)（[日本語訳](https://creativecommons.org/licenses/by-nc-sa/3.0/deed.ja)）です。*
ctrlp.vimでjvgrepを使う

grepツールである[jvgrep](https://github.com/mattn/jvgrep)が良い感じだったので、ctrlp.vimでも使うことにしました。

## 追記（2017-01-15）
Windowsで動かない場合以下のようにすると、動作すると思います。

```vim
let g:ctrlp_user_command = 'cd %s && jvgrep "" -i -r --no-color -l ./**/*'
```

Windowsで以下のように、`%s`を調べてみたところ`"C:\dev"`のようにダブルクォートで囲われて出力され、jvgrepのpath指定に渡すのが難しかったため、一旦`cd`で移動するという手法を取りました。

```vim
let g:ctrlp_user_command = 'echo %s'
" => "C:\dev"
```


## ctrlp.vimでjvgrep
ctrlp.vimの`g:ctrlp_user_command`に以下のように設定すると動きました（optionは好みで変更して下さい）。

```vim
if executable('jvgrep')
  let g:ctrlp_use_caching = 0
  let g:ctrlp_user_command = 'jvgrep "" -i -r --no-color -l %s'
endif
```

ag等を使用する場合、以下のように`%s`が`""`（ダブルクォート）より左に配置される例がよく見られますが、jvgrepでは右に配置しないと動きませんでした。

```vim
let g:ctrlp_user_command = 'ag %s -i --nocolor --nogroup -g ""'
```

そもそもctrlp.vimのhelpに

> Use %s in place of the target directory

とあるので、右側に配置する方が（個人的には）自然だと思います。
AngularJSまとめ ～フィルター～

AngularJSのフィルターについてまとめます。

以前に書いたAngularJS関連記事のリンクです。

- [AngularJSまとめ ~モジュール~](http://qiita.com/chihiro/items/35d0efb0b936f31552f5)
- [AngularJSまとめ ~ディレクティブ~](http://qiita.com/chihiro/items/ffa1607c6245cdb82bb4)


# フィルターとは
与えられたデータを整形するための仕組み。
Angular式(テンプレート上)で使うこともでき、コントローラやサービス(JavaScript上)でも使うことができる。
フィルターは様々な種類がある。AngularJS標準で提供されて入るものもあるし、自作することもできる。


# 基本的な使い方

### テンプレートからフィルターを使う

```lang:構文
{{expression | filterName [:param1 [:param2...]]}}

expression:整形対象のデータ
filterName:フィルター名
param1,param2...:フィルターのパラメータ
```

パラメータは必要に応じて指定します。(必要ない場合はなしでよいです)

例えば、AngularJS標準で提供されている**lowercase**フィルターを例にします。
lowercaseフィルターは、大文字を小文字に変換します。

```lang:html
<!-- strには"ABCDE"が入っています -->

{{str | lowercase}}
```

```lang:browser
abcde
```

### JavaScriptからフィルターを使う

```lang:構文
$filter(filterName)(expression [:param1 [:param2...]])

expression:整形対象のデータ
filterName:フィルター名
param1,param2...:フィルターのパラメータ
```

$filterサービスを利用します。
テンプレートで使用するときと同様、パラメータは必要に応じて指定します。

こちらでも、**lowercase**フィルターを例にします。

```lang:js
var str = "ABCDE";
console.log($filter('lowercase')(str));
```

```lang:console
abcde
```

# 様々なフィルター
AngularJS標準で提供されているフィルター以下のようなものがあります。

| フィルター名 | 概要 |
|:-:|:--|
| lowercase | 大文字を小文字に変換する。 |
| uppercase | 小文字を大文字に変換する。 |
| json | オブジェクトをJSON形式の文字列に変換する。オブジェクトに関数が含まれる場合は、その関数は無視される |
| orderBy | 配列を指定する条件でソートする。 |
| filter | 配列を指定する条件でフィルタリングする。 |
| currency | 通貨形式に整形する。 |
| date | 日付を整形する。 |
| number | 数値を文字列として整形する。 |


他にも様々あります。

# フィルターを自作する

フィルターを自作するにはModuleオブジェクトのfilterメソッドを使用します。
フィルターをモジュールに登録します。

```lang:構文
filter(name, factory)

name:フィルター名
factory:フィルター関数を生成するファクトリー関数
```

factoryには、フィルターを生成するための関数を指定します。

以下、例です。

```lang:js
1: angular.module('myApp' , [])
2:   .filter('myFilter', function(){
3:     return function(value){
4:       // filterの処理
5:       return filteredValue;
6:     }
7:   });
```

L2でfilterメソッドを使用しています。
ここで引数にしているfunctionは、フィルター関数ではなく、フィルター関数を返すための関数です。
このfunctionでreturnしているもの(L3~)がフィルター関数です。
フィルター関数であることの条件は2つあります。

- フィルターの整形対象となるデータを第一引数として受け取ること(L3:value)
- 戻り値として整形したあとのデータを返すこと(L5:filteredValue)

このようにして定義すると、AngularJS標準で提供されているフィルターと同じように使用できます。

```lang:html
{{str | myFilter}}
```
非 Virtual dom 系 UI ライブラリ/フレームワークメモ

React, Vue, cycle.js のような stateless な markup の tree を更新していくパラダイム (いわゆる Virtual dom) ではなく DOM を stateful な object として扱う前提のライブラリのメモ。

# DOM 操作系

- jQuery
    - https://github.com/jquery/jquery
    - 30KB
- Zepto
    - https://github.com/madrobby/zepto
    - jQuery 互換
    - 10KB
- Umbrella
    - https://github.com/umbrellajs/umbrella
    - 3KB
    - セレクタ / DOM 操作&編集 / イベント / AJAX
- Bliss
    - http://blissfuljs.com/
    - 3KB
    - セレクタ / DOM 操作&編集 / イベント / AJAX
- NodeList
    - https://github.com/eorroe/NodeList.js
    - 4KB
    - DOM のリスト操作ユーティリティ集

# MVC

- Backbone
    - http://backbonejs.org/
    - jQuery 依存
    - 8KB
- Flight
    - https://flightjs.github.io/
    - jQuery 依存
    - 6KB
- Re:dom
    - https://github.com/pakastin/redom
    - 依存無し
    - 1.6KB
- classclamp
    - https://github.com/kt3k/classclamp
    - 依存無し
    - 1.3KB
PostgresSQLの自分用メモ(v9.6)

# SQL関数

## シーケンスの現在値を取得

「現在値の取得」ならば`currval`関数が思いつきますが、`currval`関数は`nextval`関数を実行したセッションからしか実行できません。

https://www.postgresql.jp/document/9.6/html/functions-sequence.html

>現在のセッションにおいて、そのシーケンスから nextval によって取得された直近の値を返します。 (セッション内で、シーケンスに対し nextval が呼ばれていない場合には、エラーが報告されます。) これはローカルのセッション値を返すことから、その時点で別のセッションが nextval を実行していたとしても、予想に違わない回答をもたらすことに注意してください。

主キーとしての値ではなく、単に「現在のシーケンスの値はいくつかな？」と確認したいときは、以下のselect文を実行してください。

```sql
SELECT last_value FROM sample_sequence
```

最大値や増分値など、その他のシーケンス情報は、以下のSQLで取得できます。

```sql
SELECT last_value FROM sample_sequence
```

http://www.plusmb.jp/2009/04/17/3182.html

なお、「nextval関数でinsertして、そのIDを知りたい」ときは、必ず**currval関数**を使ってください。



## 便利だと感じた関数
https://www.postgresql.jp/document/9.5/html/functions-string.html

* regexp_split_to_table : POSIX正規表現を区切り文字に使ってstringを分割します。 



# PSQLコマンド関係

## PostgresSQL用の環境変数
接続用の情報を環境変数に設定すれば、psqlコマンドのオプションが簡潔になります。

https://www.postgresql.jp/document/9.6/html/libpq-envars.html

```bat
SET PGHOST=127.0.0.1
SET PGPORT=5432
SET PGDATABASE=sample_dbname
SET PGUSER=postgres
SET PGPASSWORD=password

psql --command "select * from sample_table;"
```

## よく使うオプション

https://www.postgresql.jp/document/9.6/html/app-psql.html

* -c / --command : SQLコマンド実行
* -e / --echo-queries : 実行したSQLコマンドも出力する
* -f / -- file : ファイルに書かれたSQLコマンドを実行
* -v / --variable : 変数の設定
* -W / --password : パスワードの強制入力を促す
* -1 / --single-transaction : 一つのトランザクションで実行（複数の-cオプション, -fオプションがある場合）

## SQL文で変数を使用
SQL文で変数が使えると便利です。

たとえば、「指定した日に更新されたデータ数を、テーブルごとに調べたい」場合、以下のようになります。

```sql:count.sql
-- 各テーブルにtimestamp型の列"t"が存在する
select `sample_A`, count(*) from sample_A where t = :update_date ;
select `sample_B`, count(*) from sample_B where t = :update_date ;
```

```count.bat
psql  --variable update_date='2017-01-01' --file count.sql
```


## 複数のSQLファイルを実行

* 標準入力で、全ファイルを渡す方法

```bat
type sample1.sql sample2.sql | psql 
```

* メタコマンド`\i`を使う方法

```sql:all.sql
\i sample1.sql
\i sample2.sql
```

```bat
type all.sql | psql 
```




## pg_dump

https://www.postgresql.jp/document/9.5/html/app-pgdump.html

formatの値は、以下の4種類から選択できます。

* plain
* custom
* directory
* tar

通常のバックアップの場合`custom`を選択するとよいでしょう。
`custom`が最も圧縮されます。

>pg_restoreへの入力に適したカスタム形式アーカイブを出力します。 ディレクトリ出力形式と一緒に使用する場合、リストア時に手作業で保管された項目の選択、再順序付けできますので、これはもっとも柔軟な出力形式です。 また、この形式はデフォルトで圧縮されます。
二乗とsqrt()の計算速度比較

中心からの距離を測って閾値などと比べるのにsqrt()を使っている例を見ました。比較であれば2乗したほうが早そうだなと思い、特に調べず速度測定してみました。

```cpp
#include <iostream>
#include <windows.h>


int main(void) {

	double tx = 5;
	double yy;

	int till = 500000000;
	double start = GetTickCount();
	for (int i = 0; i < till; i++) {
		yy = std::sqrt(tx);
	}
	double end = GetTickCount();

	double result = end - start;
	std::cout << "sqrt:" << result << std::endl;

	start = GetTickCount();
	for (int i = 0; i < till; i++) {
		yy = tx*tx;
	}
	end = GetTickCount();

	result = end - start;
	std::cout << "square:" << result << std::endl;

	return 0;
}
```

# 結果

```shell-session
sqrt:3125
square:1109
```
tillをどう変えても明らかに二乗が早かった（当たり前）
コマンドラインで壁紙を変更する【 macOS 】

#自己紹介

HAL大阪2回生のじゅんじゅんです。

普段は、学校とアルバイトで毎日を過ごしています。

よくイベントに出てるのでもしご一緒になることがあればお話ししましょう！

# コマンドラインで壁紙を変更する

ずばりコマンドをコピペしましょう！！

`osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/path/to/pic"'`

このパスの部分に画像のパスを当てはめると変わります！！！

shellとかで任意のタイミングや、自作のコマンドで壁紙を自由自在に変えてみてはいかかでしょうか！！
Colorクラスによる色指定


#Colorクラスでよく使うメソッド
Colorクラスの中でもよく使うメソッドをまとめました。
※alphaは透過度を指定

| 型              | メソッド               | 
|:----------------|------------------:|
| int             |              rgb(int red, int green, int blue) | 
| int             |             argb(int alpha, int red, int green, int blue)|  
| int             |            parseColor(String colorString) |   

※parseColorの引数には
透過度を含めて指定する”＃AARRGGBB”と
透過度を含めない”＃RRGGBB”を指定できます。


#公式ドキュメント
https://developer.android.com/reference/android/graphics/Color.html
Ruby｜継承について調べてみた

クラスの継承関係とか調べていたときに
「こんなんできるかな？」と思ったのでそのメモです。

## 動作環境

Ruby 2.3.1
OS X El Capitan 10.11.6

## やったこと

トップレベルにメソッドを定義するとプライベートなメソッドになる。

```ruby
def define_private_method
  :define_private_method
end

p self.private_methods.grep /define_private_method/ # => [:define_private_method]
```

`Class`クラスの継承関係の中に`Object`クラスがあるので、
`Class`クラスのインスタンスメソッドとして呼び出すことができる、ハズ

ということは、`String`クラスでも呼ぶことができるんじゃないか？？

```ruby
p Class.ancestors # => [Class, Module, Object, Kernel, BasicObject]
p String.send(:define_private_method) # => :define_private_method
```

おー！:yum: 良いではないか、良いではないか

`String`の継承関係にもObjectがあるので先に定義した`define_private_method`は、
`String`クラスのインスタンスメソッドとしても使える？

```ruby
p String.ancestors # => [String, Comparable, Object, Kernel, BasicObject]
p "Hello, World".send(:define_private_method) # => :define_private_method
```

なるほどなー！:yum:

`String`に限った話では決してありませんが、クラス全般にいえるんじゃないでしょうか？（多分）
MacBook Pro (Late 2016) を買ってやったことまとめ

# Development

- Vim
[Neovimとdein\.vimでエディタの環境構築 \- Qiita](http://qiita.com/nilllm/items/c16519d7c8db35de7514)

- Git/GitHub
[gitとgithubの環境設定 \- Qiita](http://qiita.com/nilllm/items/1638d6e86843fc7c5a41)

- [rbenv](http://mawatari.jp/archives/install-rbenv-by-homebrew)
- Swift3
- Perl
- PHP
- Go
- Elixir
- JavaScript/HTML

# Application
## GUI
- Slack
- Line
- Twitter
- Spark
- Alfred
- Google IME
- Xcode
- [ShiftIt](https://github.com/fikovnik/ShiftIt)
- Chrome
- Realm Browser
- Fantastical 2
- Freeman
- ~~Degrees Weather~~ WeatherBug
- Pocket
- HyperSwitch
- Sequel Pro
- Sophos Anti-Virus
- Dropbox
- ~~f.lux~~ macOS Sierra 10.12.4 から標準の Night Shift
- nvALT

## Command Line
- Homebrew

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

# Service
- Slack
- Line
- Twitter
- Gmail
- Qiita
- Hatena
- GitHub
- Simplenote
- Dropbox

# Hard
- MagSafe
[Snapnator: Your MacBook Snap feature is back\! \[MagSafe\] by Snapnator\.com — Kickstarter](https://www.kickstarter.com/projects/436147229/snapnator-your-macbook-snap-feature-is-back)

- Hub 1
[HyperDrive: Thunderbolt 3 USB\-C Hub for 2016 MacBook Pro by HYPER by Sanho Corporation — Kickstarter](https://www.kickstarter.com/projects/hypershop/hyperdrivetm-compact-thunderbolt-3-usb-c-hub-for-m)

- Hub 2
[Amazon \| Satechi スリム アルミニウム Type\-Cマルチポート アダプター（Type\-C充電ポート, 4K HDMI\(30Hz\)ビデオ出力, USB 3\.0ポートx2付き）MacBook 12インチと新MacBook Pro 2016用 \(スペースグレイ\) \| Satechi \| USBアダプタ通販](https://www.amazon.co.jp/gp/product/B01J4BO0X8/)

- Lightning MagSafe
[Amazon \| マグネット式 Lightning USB 充電 データ転送アダプター お手持ちのライトニングUSBケーブルでライトニングマグネット式に変換してくれるアダプター！ライトニング側の防塵機能 瞬間脱着 便利なマグネット式アダプター！ \(シルバー\) \| USB充電・データ転送ケーブル オンライン通販](https://www.amazon.co.jp/dp/B01L19IGO0/)

# Other
- [フェイスアイコンメーカーでオリジナル顔アイコンを作ろう \| Pocky Street](http://www.pocky.jp/enjoy/icon_generator/)
- [t\.y\.p\.o\.r\.g\.a\.n\.i\.s\.m : ASCII\-O\-Matic](http://www.typorganism.com/asciiomatic/)
React v15でカレンダーを作ってみた

React v15でカレンダーを作ってみた
==

仕事でもカレンダーをReactで作ることになったので、いろいろと参考にして作ってみた。
和暦の元号と年も表示します。
実際に作るのはCalendarというより、DatePickerですけどね。

表示はこんな感じです。

```
  平成29/2017年2月
 日  月  火  水  木  金  土
             1   2   3   4
 5   6   7   8   9  10  11
12  13  14  15  16  17  18
19  20  21  22  23  24  25
26  27  28				
```

## ソース

ソースはCDNを使ってHTMLで記述しました。

```html
<!DOCTYPE HTML>
<html lang="ja">
	<!-- http://qiita.com/LightSpeedC/items/8679c9d4069523b737ea -->
	<!-- http://qiita.com/ShibuyaKosuke/items/8c47ae51195ddc42ce67 -->
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
		html { font-family: 'ＭＳ Ｐゴシック'; font-size: 1.5em; }
		td { text-align: center; }
		</style>
		<script src="https://unpkg.com/react@15/dist/react.min.js"></script>
		<script src="https://unpkg.com/react-dom@15/dist/react-dom.min.js"></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.38/browser.min.js"></script>
	</head>
	<body>

		<div id="$calendar1"></div>
		<hr/>
		<div id="$calendar2"></div>
		<hr/>
		<div id="$calendar3"></div>

		<script type="text/babel">

const WAREKI_LIST = [
	{from: new Date(2019,4,1),   gengo: '令和'},
	{from: new Date(1989,0,8),   gengo: '平成'},
	{from: new Date(1926,11,25), gengo: '昭和'},
	{from: new Date(1912,6,30),  gengo: '大正'},
	{from: new Date(1868,0,1),   gengo: '明治'},
];
function toWareki(date) {
	let year = date.getFullYear(), str = year;
	WAREKI_LIST.some(wareki => date >= wareki.from &&
			(str = wareki.gengo +
				(year === wareki.from.getFullYear() ? '元' :
				year - wareki.from.getFullYear() + 1)));
	return str;
}

const DAY_OF_WEEKS = ['日', '月', '火', '水', '木', '金', '土'];

// カレンダー
const Calendar = props => {
	const year = props.year || (new Date().getFullYear());
	const month = props.month || (new Date().getMonth() + 1);
	const start_dt = new Date(year, month - 1, 1);
	start_dt.setDate(start_dt.getDate() - start_dt.getDay() - 1);
	const end_dt = new Date(year, month, 0);
	end_dt.setDate(end_dt.getDate() - end_dt.getDay() + 6);
	const numOfWeeks = (end_dt - start_dt) / (24 * 3600 * 1000) / 7;

	return <table>
		<caption>{toWareki(new Date(year, month - 1, 1)) + '/' +
			year + '年' + month + '月'}</caption>
		<thead>
			<tr>{DAY_OF_WEEKS.map(dayOfWeek => <th>{dayOfWeek}</th>)}</tr>
		</thead>
		<tbody>
			{range(numOfWeeks).map(() => <tr>
				{range(7).map(() => <td>
					{(start_dt.setDate(start_dt.getDate() + 1),
					(start_dt.getMonth() === month - 1 ?
						start_dt.getDate() : null))}
				</td>)}
			</tr>)}
		</tbody>
	</table>;
};

ReactDOM.render(<Calendar year={2016} month={12} />, $calendar1);
ReactDOM.render(<Calendar year={2017} month={1} />, $calendar2);
ReactDOM.render(<Calendar year={2017} month={2} />, $calendar3);

// range([from], to)
function range(from, to) {
	if (arguments.length === 1) to = from, from = 0;
	const arr = [];
	for (let i = from; i < to; ++i)
		arr.push(i);
	return arr;
}

		</script>
	</body>
</html>
```

## 参考

[non-jQuery でカレンダー生成スクリプトを書いてみた - Qiita](http://qiita.com/ShibuyaKosuke/items/8c47ae51195ddc42ce67)

[wareki - npm](https://www.npmjs.com/package/wareki), [wareki - GitHub](https://github.com/tohashi/wareki)
pythonのscipy.ioでarffフォーマットのデータセットを読み込み分析

# はじめに
arffフォーマットのweka用データセットを分析する必要があり、pythonで読みこんで、使えるようになるのに少し苦戦したので、まとめておきます。

# 読み込み
scipy.io の loadaiff() を使って読み込めます。 (scipy.io リファレンス 参照)
https://docs.scipy.org/doc/scipy-0.18.1/reference/tutorial/io.html

```python:readarff.py
from scipy.io import arff
import numpy as np
dataset, meta = arff.loadarff("DARPA99Week3-46.arff")
```

# Array 変換
scipy や scikit-learnで分析するには、通常のnumpyのarrayにしたいので、次のようなスクリプトで変換します。 (Stack Overflowの　「Prepare scipy.io loadarff result for scikit-learn」参照）

```python:arff1.py
ds=np.asarray(dataset.tolist(), dtype=np.float32)
target=np.asarray(ds[:,22].tolist(), dtype=np.int8)
train=ds[:, :21]
```
もしくは

```python:arff2.py
train_data = dataset[meta.names()[:-1]]
train_array = train_data.view(np.float).reshape(data.shape + (-1,))
```
# グラフ表示
いったんnumpyのarrayにできれば、matplotlibなどで、グラフ表示したり分析を行うことができます。

```python:hist.py
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

duration=ds[:,16]
plt.hist(duration, bins=50)
plt.show()
```

# 参照
scipy.io リファレンス
https://docs.scipy.org/doc/scipy-0.18.1/reference/tutorial/io.html

Prepare scipy.io loadarff result for scikit-learn (Stack Overflow) 
http://stackoverflow.com/questions/22873434/prepare-scipy-io-loadarff-result-for-scikit-learn
OpenSSLファイル暗号化・復号化コマンド

忘備録としてコマンドメモ

#ファイル暗号化
```bash
#内容 : sample_fileを暗号化したsample_file_encを作成します。
#enc : ファイルを暗号化・復号化するときに必要。のはず。。。
#-e : 暗号化する時に使用する
#-p : 暗号化した時の、salt(シード値)、鍵、IV値の情報を取得
openssl enc -e -aes-256-cbc -in sample_file -out sample_file_enc -p
```

#ファイル復号化
```bash
#内容 : 暗号化ファイルのsample_file_encを復号化します。
#-d : 復号化する時に使用する
#-p : 復号化した時の、salt(シード値)、鍵、IV値の情報を取得
#もちろん、暗号化時の暗号化方式とモードを指定する必要あり。
openssl enc -d -aes-256-cbc -in sample_file_enc -out sample_file_d -p
```

暗号化時はIVとか鍵を直書きできるけど、Opensslの自動生成機能は使用しないほうが良いのだろうか
[OpenSSLコマンドを用いた共通鍵暗号](http://kaworu.jpn.org/security/OpenSSL%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E5%85%B1%E9%80%9A%E9%8D%B5%E6%9A%97%E5%8F%B7)

元ネタ
http://gkisland.seesaa.net/article/280867065.html
なぜパスワードを入力するだけで暗号化されるのかを解説してくれてます。
SQL Developerを導入してみた。

業務でSQL Developer使っているんですが、

実は無料クライアントであること、
設定すればMySQLにもつながることを知って
最近私用のPCにも導入しました。

##やっぱりGUIは偉大である

初心者にはやっぱりグラフィカルで
マウスでカチカチやるのが理解しやすいと思います。

普段のWindows/Macの操作とほっとんど同じだからです。

コマンドラインはそれはそれでメリットあるのですが、
初心者中の初心者はそのメリットを享受しづらいです。


##無料。

**「でも、Oracleってお高いんでしょ？」**

いえいえ、SQL Developerは無償で使えるクライアントです。

Oracleがお金とっているのはデータベース本体の方ですね。

本体はMySQLという無料のヤツで作っちゃって、
クライアントはSQL Developerってやつを使えば
全部無料でやれちゃいます。

※別途MySQL JDBCドライバってのが必要です、もちろん無料。


#まずはともかくダウンロード

http://www.oracle.com/technetwork/jp/developer-tools/sql-developer/overview/index.html
![image](https://qiita-image-store.s3.amazonaws.com/0/158747/4f83536e-6a56-709d-9273-3fb9447a2b68.png)

Downloadってところをクリックすると、

![image](https://qiita-image-store.s3.amazonaws.com/0/158747/ada873aa-ce5c-707b-9979-d87e2ede2c01.png)

OSを選ぶところがあるので自分のOSのをクリック。
JDKあるし、Windowsなのでぼくは２番目のやつをダウンロードします。

　

早速ダウンロードがはじま・・・らない。
![image](https://qiita-image-store.s3.amazonaws.com/0/158747/e99d8fc7-5bb7-a504-585b-8ff7a5c68a35.png)

###OracleのIDが必要みたいです。　

「プロファイルの作成」ボタンから飛んで、
よくある入力フォームを埋めて、
自動送信されたメールをクリックしてID作成完了。

ログインするとすぐダウンロードが始まりました。
334MBですが、５分かかりませんでした。


#インストール！

（Windowsの場合です。Macの場合も似たような方法でできるとは思います。

まずはダウンロードしたzipをテキトーなところに解凍します。

![image](https://qiita-image-store.s3.amazonaws.com/0/158747/d8cae1a8-e0fa-2ad4-cc5d-78573449b132.png)

これ実はインストーラーではなく、そのまま使えるExeなので
C配下とかProgramFiles配下とかに置くのがいいと思います。


sqldeveloper.exeをダブクリすると、
![image](https://qiita-image-store.s3.amazonaws.com/0/158747/c8da5453-a6c3-8c3d-22fa-97ea3f7d0ef1.png)

JDKの場所聞かれます。

Java使っている人にはお馴染みなアレですね。
JDKが聞き覚えない人は、標準の場所でOK押せばいいはずです。


無事起動しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/158747/b1f69632-c90c-1648-1d88-844fde0023bc.png)


#DBに接続！

左上の「接続」ってやつの付近にある緑色の「＋」をクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/158747/d4365837-c21d-053a-765a-43d1eb1c6c4a.png)

接続名は任意の名前です。
ユーザー名、パスワード、ホスト名（接続先）、ポート、サービス名（インスタンス）は
DB先によって異なります。

これに接続情報を書けばDBに接続できます。

MySQLのDBに接続するには別途JDBCドライバが必要です。
http://dev.mysql.com/downloads/connector/j/


MySQL自体の導入方法とか書きたかったんですけど、
時間がなくなっちゃったので今回は割愛。

時間があるときに追記します。

急ぎの方は各自ぐぐって下さい（笑）


くぎゅう10