OmniAICreator/Qiita-1.07M huggingface dataset:
vagrant ssh as root　メモ

vagrantにrsshでrootとしてログインする。めも。


### Vagrantfile

username = root, password = vagrantにする。

```Vagrantfile
  #config.ssh.private_key_path = "/c/Users\\hoge\\path\\to\\id_rsa" 
  #config.ssh.forward_agent = true 
  #config.ssh.username = 'vagrant'
  config.ssh.username = 'root'
  config.ssh.password = 'vagrant'
  config.ssh.insert_key = 'false'
```

### 設定確認

```
$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User root
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile 
XXXXX.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

### 一旦vagrant ssh

vagrantでログインしてrootになる。
vagrantユーザのauthorized_keysをrootにコピーする。
（別に作り直してもいい。）

```
$ vagrant ssh
$ su -
$ mkdir -p ~/.ssh
$ chmod 700 ~/.ssh
$ cp /home/vagrant/.ssh/authorized_keys ~/.ssh/
$ chmod 600 ~/.ssh/authorized_keys
```

### ssh 確認

Vagrantfileがあるフォルダに移動。
以下のsshコマンドでログインできればOK。

```
$ vagrant reload #必要か不明だが一応
$ ssh -p 2222 -v vagrant@127.0.0.1 -i .vagrant/machines/default/virtualbox/private_key
$ ssh -p 2222 -v root@127.0.0.1 -i .vagrant/machines/default/virtualbox/private_key
$ vagrant ssh
Last login: Wed May 30 14:47:36 2018 from 10.0.2.2
```

### おまけ

configを書いておく。

```
$ vagrant ssh-config --host asroot >> ~/.ssh/config 
$ ssh asroot
Last login: Wed May 30 14:55:40 2018 from 192.168.33.1
```
phpのインスタンス変数 と wp-cron のdebugはlog書き出しながらしよう

**wp-cron** のdebugがしづらすぎるので `echo` しながら `file_put_contents` するやつを書いた。
インスタンスが複数いても変数がかぶらないようにしましょう

```php
<?php

class MyLog 
{
    //// インスタンス変数の定義
    // logfile名
    private $logfile = "/var/log/apache2/MyLog.log";

    // instanceが持つlog履歴
    private $history = "";

    //// Methods
    // logfile locationを変更したいときに呼ぶ
    public function set($file) {
        $this->logfile = $file;
    }

    // logfile locationの確認したいときに使う
    public function where() {
        return $this->logfile;
    }

    // instanceが持つlogをすべて返す
    public function get() {
        return $this->history;
    }

    // echoしつつfileに出力するlog関数
    public function put($str)
    {
        if (empty($str)) {
            return false;
        } else {
          // 末尾に改行を追加（既にあれば付け足さない）
          $str = rtrim($str, "\n"). "\n";
        }
        echo $str;
        file_put_contents($this->logfile, $str, FILE_APPEND);
        // historyに記録
        $this->history .= $str;
        return;
    }

}


// ２つインスタンスが存在しても別々に扱われる
$log1 = new MyLog();
$log1->set("/var/log/apache2/my.log");
$log1->put("my message");
echo $log1->get();        // my message

$log2 = new MyLog();
$log2->set("/var/log/apache2/your.log");
$log2->put("your message");
echo $log2->get();           // your message

// Destroy instances
unset($log1);
unset($log2);
```
データ可視化のテクニック - Tableau vol.1

# はじめに
BIやDWHに関わる仕事をしているのですが、さまざまなベンダーのツールを触ったり事業戦略やコミュニティを見ているとTableauを無視できなくなってきました. どの案件でも「Tableauはどうなの？」というお言葉をいただくことが当たり前になっているとも思えます. Tableauの導入経験はあるもののなんちゃってエンジニアなので、対外的にアピれるようAssociateの資格でもとろうかと思い、自分が知らなかったり大切だと思った内容をメモって行きたいと思います.

Tableauの資格範囲や勉強方法などは他の記事にたくさんあるので、そちらを参考にしてみてください

### 追加
note にも載せてみています. 反応ややり易さを見てどちらかにシフトしようと思います.
https://note.mu/document

# 簡易表計算
Tableauがデフォルトで持っている簡単な計算式の事. ここにある
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95824/0399dcc5-80b4-747c-083f-89814ca0ad2b.png)


簡易計算の中で年度累計値の計算ができるのですが、デフォルトですと1月になっているので、日付のディメンションの設定から"会計年度の開始"を変更することができます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95824/bc6e49d1-5d76-81a0-32e5-01cb506adfe3.png)


#　レファレンスライン
レファレンスライン（Reference Line）とは、主たるグラフ上に付加情報を表示したい場合に、人の認知のしやすさ（＝スペースを最小限で使う）ための可視化方法です。特に前年比（YTD）等を表現するために用いられることが多いです。また同様なイメージが作れるグラフでブレッドグラフというものもありますが、今回はレファレンスラインで実装までします

![image.png](https://qiita-image-store.s3.amazonaws.com/0/95824/beb5e180-304e-c84f-e99e-16ddccd08d16.png)


やり方 - データ：スーパーストア
### 1. 去年値のカラムを作成
去年の売上値を持つカラムを新規に作成します. やり方は複数ありますが、今回は簡単にLookupで作成しました. ただこのやり方だとフィルターかけたりすると表示されなくなるので、表計算を使用したほうが実務よりです.

### 2. グラフ作成
Tableau のアナリティクス パネル（Analytics pane）からカスタムのリファレンス ラインを使用します. 表示する"線" を設定.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95824/67530975-0bc5-1971-9e12-c9986b83af99.png)

### 完成
簡単に作れたと思います。今回のグラフは極端な例になりますが、今年vs去年という味方はどこでも行う観点でしょう. こうすることで、分析のスペースを有効に使えるようになり、見やすいグラフが作れるようになると思います.

### 参考
悪いケースも載せておきます. 去年と今年を両方とも棒グラフで並べてしまうとスペースもとってしまうし、見なけれべならない値（＝今年）に対して人間の注意を引くことができません
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95824/da8acb8b-413c-4510-d217-230392e8bb63.png)

# まとめ
いかがでしたでしょうか. 
コンテンツも思いついたものを乗せているので、一度どこかで整理はしたいです.
[Android] コードで簡単にHash Keyをもらいたい。


# 以前には。
こんにちは。以前簡単にSHA(Secure Hash Algorithm)をもらう方を書いたことがあります。
[Android Studioで簡単なSHA-1発給](https://qiita.com/Dreamwalker/items/5888bfac4bfa65d3d68e)

#なぜ？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/bdfb4fdb-4bb3-2c83-080a-75ebfa1973cc.png)
あ。。。
面倒くさい

#今回は。

今回はコードで簡単にハッシュ キーを取得してみましょう。

#Code;

```java:method.java
     /**
     * これなら、簡単にSHA取得でしる。
     * @author : Dreamwalker.
     */
    
    private void printKeyHash(){
        try {
            PackageInfo info = getPackageManager().getPackageInfo("your Package Naem", PackageManager.GET_SIGNATURES);

            for (android.content.pm.Signature s : info.signatures){
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(s.toByteArray());
                Log.e(TAG, "printKeyHash: " + android.util.Base64.encodeToString(md.digest(), android.util.Base64.DEFAULT));
            }

        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

```

#なにをもらえる？

| Algorithm     |       API | 
|:-----------------|------------------:|
| MD5             |              1+ |   
| SHA-1           |            1+ |   
| SHA-224             |       1-8,22+|      
| SHA-256               |       1+ |        
| SHA-384             |         1+ |      
| SHA-512          |           1+ |     


#結局どっち？


Firebase - [Android Studioで簡単なSHA-1発給](https://qiita.com/Dreamwalker/items/5888bfac4bfa65d3d68e)
Facebook - [Android コードで簡単にHash Keyをもらいたい](https://qiita.com/Dreamwalker/items/23531880626e429b3329)
MavenのSpringBootで環境別の起動方法

springBootで開発中にキャッシュの設定など環境別に分ける方法です。

まず環境別のapplication.ymlを作成し、設定を書いて行きます。

```bash
$ touch resources/application-dev.yml
$ touch resources/application-test.yml
```

あとはmavenの起動時にオプションを追記します。
そうすると環境ごとのapplication.ymlが読み込まれます。

```bash
// application-dev.ymlが読み込まれる
$ maven spring-boot:run -Drun.profiles=dev
// application-test.ymlが読み込まれる
$ maven spring-boot:run -Drun.profiles=test
```

補足　SpringBoot2.0移行は以下の通りです。

```bash
$maven spring-boot:run -Dspring-boot.run.profiles=dev
$maven spring-boot:run -Dspring-boot.run.profiles=test
```
【SourceTree】差分抽出後のzipファイルに日付をつける【カスタム操作】

SourceTreeで差分抽出する方法はこちら
https://ics.media/entry/4475

上記の記事を踏まえて、少し手を加えたのがこちら
※Windows版

```
if "%2" EQU "" (
  set PARAM1=HEAD
  set PARAM2=%1
) else (
  set PARAM1=%1
  set PARAM2=%2
)
 
setlocal enabledelayedexpansion
set RET_DIR=
for /F "usebackq" %%i in (`git diff --name-only %PARAM1% %PARAM2% --diff-filter=ACMR`) do (
  set RET_DIR=!RET_DIR! "%%i"
)
 
set TODAY=%date:~0,4%%date:~5,2%%date:~8,2%

git archive --format=zip --prefix=diff_%TODAY%/ %PARAM1% %RET_DIR% -o diff_%TODAY%.zip
```

zipファイル名 => `diff_20180530.zip`
zipファイルのルートフォルダ名 => `diff_20180530`
GITを使いこなそう

# GITのブランチ(branch)を管理しよう

## ブランチの確認
自分がどこのブランチにいるか確認

```
$ git branch
* master
```
今現在はmasterにいます。

## ブランチをdevelopに切る
developブランチの作成

```
$ git branch develop
```
確認すると

```
$ git branch
  develop
* master
```
masterとdevelopの2つがあります。

delelopのブランチに切り替えます

```
$ git checkout develop
Switched to branch 'develop'
```
確認すると以下のようにdevelopに切り替わったことが確認できます。

```
$ git branch
* develop
  master
```

## masterに戻る

```
$git checkout master
```
確認すると

```
$ git branch
  develop
* master
```
JKにもわかるjupyterの操作一覧備忘録

#はじめに
Macでの使い方を備忘録的に書いていきます
間違った認識をしている場合もあるのであくまで参考程度に...

#起動
ターミナルで
```　　$ jupiter notebook
```
でブラウザが勝手に立ち上がってHome画面が出て来ます

#新規セルの作成
上のツールバーの+ボタンから作れます。
別のセルで作られたメソッドはそのままでは継承されないっぽいのでメソッドと実行したい文を一緒のセルに書くのがいい...?(この辺不鮮明なのでもう少し調査したいと思います。)

#セルの実行
Ctrl+Enter でセルの内容が実行されます。

#保存
File → Seve and CheckPointで保存できます

#終了
ターミナルで　Ctrl+C で確認の表示がでるので y を入力した後 Enter を押しましょう
5秒以内に行わないとタイムアウトになるのでなるはやで。
CentOS7のPHPをダウングレードしたのでメモ

　諸事情により、以下のクラウド環境におけるPHPを7.0から5.6にダウングレードした。

* CentOS 7系
* Apache 2.4
* PHP 7.0.3


## 1. インストールされているPHPのモジュールを確認
```
yum list installed | grep php
```

こんな感じでズラーとでる。

```
php70-php-common.x86_64              7.0.18-1.el7.remi               @remi
php70-php-fpm.x86_64                 7.0.18-1.el7.remi               @remi
php70-php-gd.x86_64                  7.0.18-1.el7.remi               @remi
php70-php-json.x86_64                7.0.18-1.el7.remi               @remi
php70-php-mbstring.x86_64            7.0.18-1.el7.remi               @remi
php70-php-mcrypt.x86_64              7.0.18-1.el7.remi               @remi
php70-php-mysqlnd.x86_64             7.0.18-1.el7.remi               @remi
php70-php-pdo.x86_64                 7.0.18-1.el7.remi               @remi
php70-php-pecl-zip.x86_64            1.14.0-1.el7.remi               @remi
php70-php-xml.x86_64                 7.0.18-1.el7.remi               @remi
php70-runtime.x86_64                 1.0-5.el7.remi                  @remi
```

## 2. PHP7を拡張モジュール含め全てアンインストール
正規表現でやってもいいが、こんな感じでスペースで指定
`-y`オプションは、依存関係も含めて確認なしでremoveしてくれる。

```
yum -y remove php70-php-common php70-php-fpm php70-php-gd ....
```

## 3. php5.6のremiをインストール

```bash
yum install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt
```

## 4. パスを変更する
　以下パスの更新コマンドが書いてあるので、コピペで実行する。

```
/opt/remi/php56/enable
```

```
export PATH=/opt/remi/php56/root/usr/bin:/opt/remi/php56/root/usr/sbin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/opt/remi/php56/root/usr/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export MANPATH=/opt/remi/php56/root/usr/share/man:${MANPATH}
```

## 5. Apache再起動
```
/bin/systemctl restart  httpd.service
```

## 確認して終わり

```
php -v
```

```
PHP 5.6.36 (cli) (built: Apr 25 2018 09:44:45)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
```
Realm Serverをインストールして見た

# はじめに
ある特定の単語が含まれたTwitterのつぶやき数を24時間保存して、それをグラフに描くiPhone アプリを作ろうと思ったのだけれど、過去のつぶやき数をサーバに格納しておくのにRealmが使えたら便利だなあと思ったので、こちらの記事を参考にしてRealm Serverをインストールしてみました。
https://www.gaprot.jp/pickup/tips/realm-object-server
しかし試してみたところ2018年5月現在ではだいぶ手順が変わっていたので備忘録の為に新たに記事を起こしてみます。
# 環境
* macOS X Sierra
* 
# インストール方法
## githubからインストール
ターミナルを起動し、以下のコマンドを実行。

```
curl -s https://raw.githubusercontent.com/realm/realm-object-server/master/install.sh | bash
```

## 環境変数の設定
インストールが無事終了すると以下のコマンドを入れるよう表示されるので実行。

```
export NVM_DIR="/Users/(ユーザ名)/.nvm"
    . "/Users/(ユーザ名)/.nvm/nvm.sh"
```

## ブロジェクトの作成
プロジェクトを作成する。my-rosがプロジェクト名。

```
ros init my-ros
```

## featuretokenの取得
サーバを起動する前に、featuretokenを取得する必要があります。これがないと、サーバが起動できません。
こちらから60日限定版を申し込んでください。
https://realm.io/trial/self-hosted-standard-plan/

しばらくするとメールにfeaturetokenが届きます。
![スクリーンショット 2018-05-30 14.08.02.png](https://qiita-image-store.s3.amazonaws.com/0/137274/25a1ee7b-1b9c-ff2f-c563-62e4c7abf880.png)

このfeaturetokenをコピーして、プロジェクトディレクトリ配下のsrc/index.tsの所定の場所に貼り付けます。
この時、メールに書かれていた = は取り外し、行末のセミコロンはカンマに置き換えて貼り付ける必要があります。

## サーバの起動
プロジェクトのディレクトリに戻り、すなわち今回の場合 /Users/(ユーザ名)/my-rosに移動し、 npm start と実行すると、Realm Serverが起動します。

# 終わりに
Twitterのつぶやき数という過去データを保管しておいて、参照するやり方が簡単にできそうだなあと考えたのですが、有料になってしまったので、せっかく試してみたのですが、他のやり方でどうにかならないかなと考えています。$30/月はぜんぜん払える額ですが、アプリの広告収入より高いからちょっと躊躇します。
Unity と Mac で開発する Oculus Go アプリ #6 フォルダ構成について考える

Oculus & Unity 初心者が開発するまでのメモ
もし「◯◯を考えると、こっちのほうがよい」的なものがあれば、ぜひコメント頂けれると幸いです

## フォルダ名のルール

Unity マニュアルにある[特殊なフォルダー名](https://docs.unity3d.com/ja/current/Manual/SpecialFolders.html)を見てみると...

> Unity に命令として読み取られる特殊なフォルダー名が存在します。
これらのフォルダー名は、そのフォルダー内のコンテンツが特定の方法で扱われるよう指定する機能を持っています。
例えば、エディタースクリプトが正しく機能するためには Editor フォルダーに置く必要があります。

原則、フォルダ名は自由だけど、予約名があるらしい

|特殊なフォルダ名|意味|
|---|---|
|Assets|Unity プロジェクトで使用するアセットが含まれているフォルダー<br/>要はroot|
|Editor|ここに置かれたスクリプトは、ランタイムスクリプトではなく、エディター用のスクリプトとして扱われるらしい|
|Editor Default Resources|エディター用スクリプト置き場<br/>Editor Default Resources フォルダーは 1 つしか作成できず、Project のルートに配置する必要がある|
|Gizmos|シーンビューにグラフィックスを追加して、目に見えないデザインの詳細を可視化することができる<br/>Gizmos フォルダーは 1 つしか作成できず、Project のルートに配置する必要がある|
|Plugins|プラグイン置き場<br/>大体は DLL ファイル<br/>Plugins フォルダーは 1 つしか作成できず、プロジェクトのルートに配置する必要がある|
|Resources|シーンのアセットのインスタンスを作成する代わりに、スクリプトから [Resources.Load](https://docs.unity3d.com/ja/current/ScriptReference/Resources.Load.html) 関数を使って読み込む|
|Standard Assets|標準のアセットパッケージをインポート ( Assets > Import Package) すると、アセットが Standard Assets フォルダーに入る<br/>Standard Assets フォルダーは 1 つしか作成できず、Project のルートに配置する必要がある|
|StreamingAssets|アセットを別のファイルで元の形式で使用するときに使う<br/>例えば、ビデオファイルをムービーテクスチャとして使用するのではなく、ファイルシステムからアクセスする際に配置する<br/>StreamingAssets フォルダーは 1 つしか作成できず、Project のルートに配置する必要がある|

## スクリプトのコンパイル順

Unity マニュアルにある[特殊フォルダーとスクリプトのコンパイル順](https://docs.unity3d.com/ja/current/Manual/ScriptCompileOrderFolders.html)を見てみると...

> * フェーズ 1： Standard Assets 、 Pro Standard Assets 、 Plugins のフォルダーに入ったランタイムスクリプト
* フェーズ 2： Standard Assets 、 Pro Standard Assets 、 Plugins のフォルダー内にある Editor フォルダーのエディタースクリプト
* フェーズ 3： Editor フォルダーに入ったもの以外のすべてのスクリプト
* フェーズ 4： 残りのすべてのスクリプト (つまり、Editor フォルダー内のスクリプト)

## フォルダ構成

以上を踏まえて、考えてみました
なお、フォルダは必要に応じて作成するので、予め全部作っておく必要はない

|フォルダ名|説明|
|---|---|
|Assets/|root|
|　∟Plugins/||
|　∟Editor Default Resources/||
|　∟Gizmos/||
|　∟Standard Assets/||
|　∟StreamingAssets/||
|　∟{app name}/|アプリケーション名まはた開発プロジェクト名|
|　　∟∟Scripts/|シーン共通のScript|
|　　∟∟Prefabs/|シーン共通のPrefabs|
|　　∟∟Scenes/||
|　　　∟∟∟{scene name}/|シーンごとにフォルダを作成|
|　　　　∟∟∟∟{scene}.unity|シーンファイル|
|　　　　∟∟∟∟Scripts/|このフォルダのシーンでしか使わないScript|
|　　　　∟∟∟∟Prefabs/|このフォルダのシーンでしか使わないScript|

基本的には、シーンごとに細かくフォルダ分けをするか、共通で持つかによってフォルダは異なる
例）Animationsなど

※ なんでフォルダ名にスペースありなしがあるねん...

## 参考にさせて頂きました

* [Unityフォルダ構成のルールについて](https://qiita.com/takish/items/8608ba9070755da3ae6d)
* [Unityのディレクトリ/フォルダ構成](http://www.project-unknown.jp/entry/2017/06/04/044524)
* [Unityのフォルダ構成ベストプラクティス](https://torini.hateblo.jp/entry/2017/06/15/Unity%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9)
* [Unityのフォルダ構成について考えてみる](http://r-ngtm.hatenablog.com/entry/2017/12/19/225951)
* [[Unity]オレオレおすすめUnityフォルダ構成とGit管理](http://komaken.me/blog/2016/09/01/unity%E3%82%AA%E3%83%AC%E3%82%AA%E3%83%AC%E3%81%8A%E3%81%99%E3%81%99%E3%82%81unity%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90%E3%81%A8git%E7%AE%A1%E7%90%86/)
nodejsのcentos運用まとめ

# インストール

[node.js 8.x をyumでインストールする(centos7.x)](https://qiita.com/you21979@github/items/4c9c382b9536effc590d)

# ssl対応

[nginx + nodejsでhttps経由のアクセスにする](https://qiita.com/you21979@github/items/82ffded7e786ff2d3bd1)

# 起動スクリプト・永続化

[centos7で標準のsystemdを使いnode.js製サーバーをデーモン化する](https://qiita.com/you21979@github/items/588bddb59378ce7303a2)
rails generate コマンドで作成されるファイル

#rails generate コマンド
rails generate controller home top を実行する。

---
①viewsフォルダの中に「homeフォルダ」と「top.html.erb」ファイルが作成される

app/views/**home/top.html.erb**

---
②controllerフォルダの中に「「home_controller.rb」ファイルが作成される

app/controller/**home_controller.rb**

homeコントローラーのtopアクションは、コントローラーと同じ名前のビューフォルダ(homeフォルダ)から、アクションと同じ名前のビューファイル(top.html.erb)を探し、ブラウザに返す。

---

③「route.rb」ファイルに書き込まれる。
```route.rb
get "home/top" => "home#top"　
```
app/config/route.rb

---

③app/assets/stylesheetsフォルダに
home.scssファイルも自動生成される。
Android HACK メモ


Androidでz-index、positionの設定が反映されない時に見直したい箇所メモ。


##Androidでz-indexが反映されない時

transform:translate3dを使ってzの値を指定する

```
transform: translate3d(x, y, z);
```

*Android5.1系でこの症状が出ました。


##Androidでposition: fixedが反映されない時

transform:translateZ(0)を指定する

```
transform:translateZ(0);
```

*Android5.1系でこの症状が出ました。
ViewPagerのスワイプを無効にする方法

## 概要
ViewPagerを使って画面を切り替える時、スワイプではなく別途用意したナビゲーションで操作させたい場合があります。そういった場合の実装をメモします。

## 実装
```kotlin:CustomViewPager.kt
class CustomViewPager(context: Context, attrs: AttributeSet?) : ViewPager(context, attrs) {

    private var isEnable = true

    override fun onTouchEvent(ev: MotionEvent?): Boolean = when (isEnable) {
        true -> super.onTouchEvent(ev)
        else -> false
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean = when (isEnable) {
        true -> super.onInterceptTouchEvent(ev)
        else -> false
    }

    fun setPagingEnabled(isEnable: Boolean) {
        this.isEnable = isEnable
    }
}
```

実際に使用する時はこんな感じで指定します。

```kotlin
viewPager.setPagingEnabled(false)

```

## 参考
- [[Android] How do disable paging by swiping with finger in ViewPager but still be able to swipe programmatically? android-viewpager | CODE Q&A [English]](https://code.i-harness.com/en/q/934059)
ThunderbirdでGmailのimapを使う際に[Gmail]フォルダに隔離させない

完全にこれ：[「IMAPサーバディレクトリ」を設定して、Gmail を整理する](https://android.benigumo.com/20130823/%E3%80%8Cimap%E3%82%B5%E3%83%BC%E3%83%90%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%80%8D%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E3%80%81gmail-%E3%82%92%E6%95%B4%E7%90%86%E3%81%99/)

しかしIMAPサーバディレクトリを知らねば辿り着けはしまい…

#ThunderbirdでGmailめんどい
初期設定はむしろ楽だが，Gmailにおけるラベルの扱いはThunderbirdと相性が悪いのか，こうなる．

======================
[-] xxx @gmail.com
受信トレイ
ごみ箱
[-]Gmail
├送信済みメール
├すべてのメール
├下書き
├迷惑メール
└ゴミ箱

======================

使いにくい．

デフォルトで存在するGmailのトレイは全て[Gmail]フォルダ内に入っているため，いちいちフォルダを開く必要があるわ余計なインデントで見にくいわで散々な目に遭う．

というかローカルだけで保持したいデータなど無いので，デフォルトのトレイを直接操作したい．つまり[Gmail]フォルダ内だけを以下のように弄れれば良い．

======================
[-] xxx @gmail.com
受信トレイ
送信済みメール
すべてのメール
下書き
迷惑メール
ゴミ箱

======================

#サーバーディレクトリの設定

解決策が件のサーバーディレクトリ．
最初に貼ったリンクと同様の作業を行う．

Thunderbirdにgmailアカウントを追加したら，[アカウント設定]から該当アカウントの[サーバー設定]へ移動し[詳細]へ．

![サーバ設定.jpg](https://qiita-image-store.s3.amazonaws.com/0/201962/9ef47d95-5561-52c7-a732-9ae402a9ac68.jpeg)

そこでサーバーディレクトリを変更する．
半角で"[Gmail]"としておけば，[Gmail]フォルダ内だけを見るようになり，フォルダ分けされずに済む．

![サーバ設定詳細.jpg](https://qiita-image-store.s3.amazonaws.com/0/201962/3e84cb22-e709-e18f-e187-00fca87c4a23.jpeg)

あとはアカウント設定を全て閉じて，
該当アカウントを右クリック->[購読]から，表示したいトレイを選択すればおｋ．

![購読.jpg](https://qiita-image-store.s3.amazonaws.com/0/201962/17b4bd67-f49d-91a6-3740-ea2ca0a40024.jpeg)
CentOSでphpのエラーログファイルを作成

## 何をする？
開発するときにきちんとエラーログを見ることが大事だときいたので、エラーログをみれるようにしたいと思います。なお、phpで開発しているのでphpのエラーログが見れるようにできれば。

## 環境
```
Docker
OSバージョン : CentOS release 6.9
phpバージョン　：　PHP 5.6.3
```

## php.iniを編集
ターミナルを開いて、

```
$ vi /etc/php.ini
```
```
//以下のように検索
/error_log
```
で検索すると

```
 //error_log
【修正前】;error_log = php_errors.log 575行目
【修正後】error_log = /var/log/php_errors.log 575行目
 
//log_errors
【修正前】;log_errors 116行目
【修正後】log_errors = On 116行目
```
のように修正

## php_errors.logを作る
```
$ touch /var/log/php_errors.log
```
## 権限付与
オーナー権限変更

```
$ chown apache php_errors.log
```
グループ権限変更

```
$ chgrp apache php_errors.log
```
## apacheの再起動
```
$ /etc/rc.d/init.d/httpd restart
```
これをやったときにdockerから抜けてしまったので再度入ろうとするとエラーがでる

```
Error starting userland proxy: Bind for 0.0.0.0:80: unexpected error (Failure EADDRINUSE)
```

これはmacのapacheと競合しているので、macのapacheを停止させればよし

```
sudo apachectl stop
```

もう一回dockerに入る

```
$ docker-compose up -d
$ docker-compose exec web bash
```
## 実際にログをみる
```
$ tail -f php_errors.log 
```

## 参考
https://qiita.com/tukiyo3/items/8f0dec5fe560729ba234
1 行でわかる Google Cloud Platform！ #gcpja #GCPUG #FJUG

#1 行でわかる！
　　　　　　　　　　　　　　　　　　　
公式がPDF公開したぞい！（）

[**A3版**](https://lp.google-mkto.com/rs/248-TPC-286/images/GCP_clearfile_A3_for_PaperPrint.pdf)
[**A4版**](https://lp.google-mkto.com/rs/248-TPC-286/images/GCP_clearfile_A4_for_PaperPrint.pdf)

[紹介ブログ](https://cloudplatform-jp.googleblog.com/2018/05/Google-Cloud-Platform-PaperPrint.html)（公式）


　

…だけだと流石にクソ記事すぎるので
ざっくり知ってる側としてつっこみ加えていきます．
GCPがどんなサービスなのか，上記PDFと併せて全体像把握の参考にしていただければと．


#つっこみ・補足情報
まず分類の順番おかしいｗ
コンピュートとか最初のほうでしょｗ読む気なくす気かｗ

##最近公開された新サービス
>[Cloud Memorystore](https://cloud.google.com/memorystore/)  for Redis　
Redis のインメモリー型データストア マネージドサービス

>[Cloud Armor](https://cloud.google.com/armor/)
DDoS 攻撃等から GCP 上に構築したサービスを保護

>[Cloud Composer](https://cloud.google.com/composer/) 
ワークフローを管理するための Apache Airflow マネージドサービス

あたりは最近ですね．
このあたりもしっかり記載されているのは好印象です．
## コンピュート
> [Google App Engine](https://cloud.google.com/appengine/)
自動で柔軟にスケール可能なフルマネージドかつサーバレスのウェブアプリ向けバックエンド

**サーバレス**も明記しててええな
Standard環境のみですが，実は昔からあるPaaSでありながら，アクセスのない時はサーバがお休みしているという意味でサーバレスです．

##機械学習（Machine Learning）
> [Cloud AutoML](https://cloud.google.com/automl/)
高品質かつビジネスニーズに即した独自の機械学習モデルを構築可能

一番重要な，手軽さのニュアンスが皆無になってる
**少ないデータ**で，しかも**GUIで**いけちゃうという．
ここアッピルせずにどうするの感…もったいない．
参考記事：[専門家なしで誰でも使える（ガチ勢でも便利），機械学習の大本命 Google Cloud AutoML 発表](https://qiita.com/Yatima/items/28132e8d0418c0852072)

##モバイル（Firebase）
記載されていないサービスもあります．
[ML Kit for Firebase](https://firebase.google.com/docs/ml-kit/)は先日のGoogle I/Oの目玉だったので記載してほしかったところ…
GCPの機械学習系のAPIを元に，モバイル向けにSDKを準備した，というようなものになります．


>[Cloud Firestore](https://firebase.google.com/docs/firestore/)
マルチデバイスにリアルタイムに同期でき、スケーラビリティが向上したデータベース

**障害耐性**とか**クエリの自由度**とかも向上してます．
まあこれは紙面の制約上仕方なかったかも．
参考記事：[まだ間に合う！着々と進化しているFirebaseをまとめてみるよ #Firebase #FJUG > Cloud Firestore](https://qiita.com/Yatima/items/23797ca868ee988c824b#cloud-firestore)

　
　

　

他にも気付いたらまた追記してくよ└(・∀・)┘ﾔﾘｨ!
【CoffeeScript】mapの小さなサンプルメモ

# メモ

JavaScriptの基本↓

Array.prototype.map() - JavaScript | MDN https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map

# サンプル

```coffeescript:test.coffee
arr = [1,2,3]
console.log arr.map (element) ->
  element * 2
```

```console:実行結果
[ 2, 4, 6 ]
```

JavaScript変換後↓

```javascript:test.js
  arr = [1,2,3]
  console.log(arr.map(function(element) {
    return element * 2;
  }));
```
angular-electronを使ってtodoアプリを作った。

## 概要
[前回](https://qiita.com/yasuaki0206/items/c03d285b95eca79cee42) の流れからangularを触ってみました。
ついでにelectronもやってみよーっということで、またまたtodoアプリつくってみました。

調べてみると自分でangularとelectronを合わせてゴニョニョできるみたいでしたが、よくわからなかった(orz)ので[angular-electron](https://github.com/maximegris/angular-electron)を土台として使わせてもらいました。

ソース：https://github.com/yasuakihirano/todoapp-angular-electron

<img src="https://lh3.googleusercontent.com/0uCaGshs8nix05k9ULbUJHa1nYoeaYcLMypYgxomdB99JtEn8DeKwpjZg_nFYsKCTxicFnL1VSgtbHDF5hsMNI8z89yurcKpPXVXngQy-AL7Op_3z9W-Fyhs-nbKfkdqMMFl28kBHk_JhRHWxxALIjAqavPwG0ITU5NRFukrWWk54kV8kjJnRE2KIYGTO_Cl1zRe3v4WkTFnbJAXFpVpjnwda3Wo-kamhvLaQYzEw6sAG_a6MHsJGDeuh9LHHxECiIxvpxa-sxEeRZsZp7y3ajU6qBmya_BUMQ7T9ISXbiM5PTRlL1ij3QkLSerODefS1ZBA2gLBYTNCoRgS4WagD2BOgemjWguMcQbNVI4v-l7XSf_M35A_ba3_Us0zR-lYfhFwEB2yzh2lmUqoHfUM4CfPhOYI1Ys1qFNIwrc6xx3IsRiUM5RUqqfypFBVtHNrzvr9JWSaf5sIb3PXyCER3qHr_UHdXkIBTFj5s1dUR5uGirzALQ8LtVcwUdPlPiozQJO0QKQxyUk4zICMsBN9p7PzZmqZnf-PdjKiRUX0605S2AS3TFAJv_Zre1bcdwEYLmaEKn0tH4eO6_CXlFxGIPWsDxnqdnmBwQjobdMGX2echJC1zwuEYoWY6DuRo-F_dNJB2Uoce1P5pLmRNymaIX4QhiANaUIT=w479-h733-no" width="300">

## やったこと
angular-electronをgit cloneする。

```shell
git clone https://github.com/maximegris/angular-electron.git
```
bootstrap4が使いたかったので、bowerでinstall、アイコンも使いたかったのでopen-iconicをインストール。

```shell
bower install bootstrap4 --save
bower install open-iconic --save
```
todoapp-angular-electron/src/app/components/home/ 配下を基本的にゴニョゴニョ

入力パネルの開閉のためのアニメーションとファイル出力のために@angular/animations, ngx-fsを個別インストール。

```shell
npm i @angular/animations --save
npm i ngx-fs --save
```

## 困った＆調べたこと
### bower_componentsディレクトリ配置位置がおかしい
.bowerrcをルートディレクトリに作って、下記のような設定にしておけばok

```javascript:.bowerrc
{
    "directory":"src/assets/bower_components"
}
```
### ファイル出力の方法がよくわからない
入力したtodoをもしかしたら見返すことがあるかもしれないので、ファイル出力したかったがファイル出力方法がわからなかった。
それっぽい `ngx-fs` とかいうパッケージがnpmに上がっていたので使ったらうまくいった。

### ブラウザとデスクトップ版の処理分岐
調べてもよくわからなかったですが、userAgentを見たらデスクトップ版にはelectronが入っているのでそれで分岐させた。

```javascript:home.component.ts(一部)
    if (-1 < window.navigator.userAgent.indexOf("Electron")) {
```

### 外部cssの読み込み記載箇所どこ？
最終的に `todoapp-angular-electron/src/styles.scss` に下記のような感じで書いた。

```scss:styles.scss
@import "./assets/bower_components/bootstrap4/dist/css/bootstrap.css";
@import "./assets/bower_components/open-iconic/font/css/open-iconic-bootstrap.css";
```

## よく使ったコマンドとかメモ

|  コマンド  |  内容  |
| ---- | ---- |
|  ng serve  |  webで実行する。 |
|  electron .  |  pjルートディレクトリで実行するとデスクトップ形式で実行される。 |
|  npm run electron:windows  |  windows用にビルドする  |
|  npm run electron:linux  |  linux用にビルドする  |
|  npm run electron:mac  |  mac用にビルドする  |

※electronコマンドでデスクトップ実行する場合にビルドしてからじゃないと変更が反映されないので注意
・gif画像作るのに[ScreenToGif](http://www.screentogif.com/)が便利だった。

### パッケージ化
electron-packagerを使う。windowsだとexeが出力される。すごい:rolling_eyes:

```
electron-packager . todoapp-angular-electron --platform=win32 --arch=ia32
```

## 所感
思っていたよりお手軽にできた気がする。意外と情報元が少ないように感じた。(英語弱者です。。)
デスクトップ版にビルドするのに時間がかかるので、基本はng serveしたまま開発するとよさそう（自動リロードしてくれる）
【CoffeeScript】findの小さなサンプルメモ

# メモ

### まず、JavaScriptの基本

Array.prototype.find() - JavaScript | MDN https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find

### サンプル
[1,2,3]のうち、1より大きい値の最初のものを出力

```coffeescript:test.coffee
arr = [1,2,3]
console.log arr.find (element) ->
          element > 1
```

```console:実行結果
% coffee array-test.coffee
2
```

JavaScriptの変換されたやつ↓


```javascript:test.js
  console.log(arr.find(function(element) {
    return element > 1;
  }));
```
TouchDesigner での論理演算

TouchDesignerで論理演算をする方法を紹介していきたいと思います。
#Logic CHOP
名前の通り論理演算(AndやOrなど)ができるCHOPです。
二つの値がどちらも1の時には1、それ以外の時は0にする、といったことができます。

###例
![スクリーンショット 2018-05-29 15.45.15.png](https://qiita-image-store.s3.amazonaws.com/0/175399/50e3bf6d-ce86-5e7c-c377-d6709369a349.png)
(この図のオペレータは全てデフォルト値)

二つのボタンがどちらも押されている状態の時にLogicCHOPの値が1になるようにしていきます。
それにはLogicCHOPのパラメータのCombine CHOPsをAndに変えるだけです。
![スクリーンショット 2018-05-30 11.04.46.png](https://qiita-image-store.s3.amazonaws.com/0/175399/01692743-e80f-8189-1909-76c4871ef31b.png)
これで二つの入力が１の時に１となるようにできました！
![logicCHOP.gif](https://qiita-image-store.s3.amazonaws.com/0/175399/3d8bb09c-22d5-1945-c408-62c68bebaaa0.gif)
###パラメータ
+ Convert Input

| 値 | 説明 |
|:-:|:-:|
| Off When Zero |  入力が0の時False、それ以外はTrue |
| Off When Zero Or Less |  入力が0以下の時False、それ以外はTrue |
| Off When Outside Bounds |  Boundsの範囲内なら1、範囲外ならFalse |
| On When Value Changed |  入力値が変化している時True |
| On When Channel Name Changed  |  チャンネル名が変わった時にTrue |

+ Combine Channel/CHOPs
    
複数のチャンネルやCHOPの入力を用いて論理演算をします

| 値 | 説明 |
|:-:|:-:|
| Off  | 何もしない(デフォルト)  |
| And  | 値が全てTrueの時にTrue (論理積 (A AND B)) |
|  Or |  値の一つでもTrueの時にTrue (論理和 (A OR B)) |
| Exclusive Or  | 2つの入力のどちらか片方がTrueでもう片方がFalseの時True、両方ともTrueあるいは両方ともFalseの時にFalse (排他的論理和 (A XOR B))  |
| Not And  |  値が全てTrueの時にFalse (否定論理積 ¬(A AND B)) |
| Not Or  | 値の一つでもTrueの時にFalse (否定論理和 ¬(A OR B))  |
| Equivalence | 値が等しい時にTrue (同値(A == B))  |
| Lowest Index On  | True となっている入力の中で最も小さいIndexを返す、全てFalseの場合-1   |
| Highest Index On  | True となっている入力の中で最も大きいIndexを返す、全てFalseの場合-1 |

<a href="https://qiita.com/joe_ohara/items/fa68bd138b682e0262f5">TouchDesigner での条件分岐(Expression CHOP)</a>の記事と組み合わせることでより複雑な処理を行うことができるでしょう！！
Oracle マルチテナント TIPS

###マルチテナント用語

|用語              |説明|
|:----------------|:---|
|マルチテナント・アーキテクチャ|Oracleのコンテナ型データベースの実装技術|
|CDB              |コンテナ型のDBインスタンス、文脈によりルートを指す場合もあり|
|非CDB            |非コンテナ型(従来型)のDB|
|コンテナID/名     |インスタンス内のコンテナを一意に識別するIDと名前|
|ルート(CDB\$ROOT)|共通オブジェクトを持つコンテナ。インスタンス名で接続するとCDB\$ROOTに繋がる。|
|PDB              |ユーザデータベースとなるコンテナ。PDB名はNET接続時のサービス名となる。|
|シード(PDB\$SEED)|PDBのテンプレートとなる読取専用PDB。コンテナ名はPDB$SEED。|

###主要ファイル

|用語             |ルート|PDB|補足説明|
|:----------------|:----|:--|:------|
|制御ファイル      |◎CDB全体|―||
|REDOログファイル  |◎CDB全体|―||
|UNDO表領域       |◎共通|△ローカル(12.2～)||
|TEMP(一時)表領域 |◎デフォルト|〇ローカル|基本はコンテナ毎のTEMPを使う|
|SYSTEM,SYSAUX   |◎共通部|◎個別部||
|ユーザ表領域     |〇USERS|〇USERS|PDB$SEEDにはない|
　＜凡例＞◎必須、〇作成、△作成可、－無

###sqlplusからPDBへの接続
```shell
#1.ROOTへ接続した後、PDBに接続変更（共通ユーザ）
#  DB作成時にサービス名がtnsnames.oraに追加される。別サーバからの接続は2.か3.で。
sqlplus system/パスワード@サービス名
alter session set container=pdb名;

#2.ホスト[:ポート]/サービス名の形式でPDBに直接接続。ポート1521の場合省略可
sqlplus system/パスワード@ホスト[:ポート]/pdb名

#3.tnsnames.oraにネットサービス名を追加し直接接続
vi $ORACLE_HOME/network/admin/tnsnames.ora
##下記を追加(ネットサービス名をpdb1とした場合)
pdb1=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ホスト)(PORT=ポート))(CONNECT_DATA=(SERVICE_NAME=pdb名)))
##接続
sqlplus system/パスワード@pdb1
```

###sqlplusのマルチテナント拡張(SQL Developerでも可)
```SQL
-- ROOTに接続
sqlplus / as sysdba
-- PDBの一覧(rootコンテナから実行した場合は全部。PDBからの場合今のPDBのみ)
show pdbs
-- 現在の接続コンテナID、名前の表示.ID=1はCDB,ID=2はseed
show con_id
show con_name
-- 接続コンテナの変更(PDB1へ)
alter session set container=pdb1;
-- 接続コンテナの変更(rootコンテナへ)
alter session set container=CDB$ROOT;
-- PDBの状態変更(CDBから実行) closeするとMOUNT状態となる。
-- デフォルトではDB起動時にPDBはclose状態
alter pluggable database all|PDB名 open [read only|read write];
alter pluggable database all|PDB名 close [immediate];
-- PDBの現在の状態を保存し、次回DB起動時にその状態にする。
alter pluggable database all|PDB名 save state;
```

###RMANバックアップ
+ CDB全体: ルートに接続しbackup database;
+ ルートのみ: ルートに接続しbackup database root;
+ PDB: PDBに接続しbackup database;
+ 複数PDB: ルートに接続しbackup pluggable database pdb1,pdb2,・・
+ アーカイブログのバックアップはルートに接続して実行。PDBでは対象なしとなる。
    + backup database plus archivelog [delete all input];
    + backup archivelog all [delete all input];
+ RMAN内では接続コンテナの変更(aleter session set container=xx)は不可

###更新履歴
2018/05/30 初版
初心者に優しいTDD開発

# 対象者
初心者にTDDは難しい！！
でも要求が綺麗に満たせて、思い描いたテストが思いのままに成功する感覚を味わいたい！！
という人に向けて、私が個人的によく使う方法を紹介します。

# 利点
この手法ではTDDの以下の欠点が解決されます。

- 考えすぎによる作業の遅延
- 想像した内容と、テストで実装される内容の乖離
- それなりの経験が要求される、テストの想定という大きな作業による消耗


# TDD振り返り
前提としてTDDの大まかな流れを説明します。

TDDとは
1. 実装後の動作を思い浮かべる
2. 実装後の動作をすれば成功するであろうテストを実装する
3. 実際の処理を実装する
4. テストを実行しながら、動作をテストする

色々と省略はしていますが、TDDとはこのような手順です。

# 初心者に優しいTDD手法とは
では今回の主題である初心者に優しいTDD開発とは？

TDDで一番辛いのは、実装後の動作をテストに落とし込める段階まで明確に思い浮かべる、という作業だと思います。
相当な経験があるか、相当小さく明確な動作出なければ明確に思い浮かべるのは意外と難しいものです。

私も最初にTDDを実践した時、
確かに明確に実装はできるけど、実務に耐えるほど熟練するには難しすぎるのではないか？
と思いました。

オレオレTDDとはTDDをもう少し現実的な実用レベルに落とし込んだ、初心者でも実践しやすく、TDDの良さである部分をある程度取り入れたものです。

# 初心者に優しいTDDの手順

1. ある程度の基本となる部分を**実装してしまう**
2. 一区切りついたら、現状までのテストを書く
3. テストが動くことを確認する
4. 追加したい新機能の動作を思い浮かべる
5. 実装後の動作をすれば成功するであろう、新機能のテストを実装する
6. 実際の新機能を実装する
7. テストを実行しながら、動作をテストする

まず最初の部分を実装してしまい、後で動くことを保証するテストを実装します。
その後本来のTDDのような流れに移ることによって、TDDで想像しなければならない問題を限りなく小さくすることができます。
TDDで問題を想像する上で、基本となる実装の部分がネックになり、細かい処理の部分を想像するのが難しくなります。
この手法では、1番の心配である基本の部分は通常の開発のように実装してしまうという大胆な手法です！

# まとめ
この手法では現実的な部分に視点を置いているので、あまり綺麗でないという指摘もあるかもしれません。
ですが、経験をさほど必要としない上で、それなりな利益を得られると考えると十分に実用たり得るのではないかと思います。

実際にこういう手法がもう存在しそうですが、そんなことは気にしません。
せっかくなのでそれっぽい名前も考えてみました。

### AFTDD(Additional Function Test Driven Development)

日本語で**追加機能テスト駆動開発**と名付けました！
今日からみなさん使ってくださいね！
全ブランチPULLするスクリプト組んでみた

# 概要
Gitリポジトリ移動したりする時に、自分のローカルブランチをすべてPULLするのが面倒だったのでスクリプト組んでみました

# 環境
OS: Mac OS EI Capitan

# スクリプト

```shell:git_pull.sh
#!/bin/sh

DIR=("RepoPath1" "RepoPath2")

for GitDir in ${DIR[@]};do

  echo "#################################"
  echo " $GitDir"
  echo "#################################"
  echo

  echo "# cd $GitDir"
  cd $GitDir
  echo 

  echo "# git fetch --all"
  git fetch --all
  echo 

  echo "# git branch -r"
  BRANCH=`git branch -r`
  echo 

  echo "# exec git pull"
  for br in $BRANCH;do
    if [ `echo $br | grep "^origin/" | grep -v "HEAD"` ]; then
      BR=${br:7}
      echo "# $BR"
      git checkout $BR
      git status
      git pull origin $BR
      echo "----------------------------"
      git status
      echo "----------------------------"
      echo 
      echo
      sleep 1
    fi
  done

done
```

# 説明
とりあえずリモートブランチの一覧を取得して、そのブランチすべてに対してgit pullしてるだけです。
複数のリポジトリを同時に実行したかったので、対象とするディレクトリを配列で持たせています。


もっといいやり方あると思うので、これのほうがいいよ！というのがあれば教えていただけると助かります。
Laravelでimmutableな日付の話

PHPユーザーズ（slack）の#laravelチャンネル眺めていたら、Chronosって日付を扱うライブラリの話題が出てて
少し調べてみました。

## CarbonとChronosの違い

[Carbon](https://github.com/briannesbitt/Carbon)はmutable(変更可能)で、DateTimeを継承。

[Chronos](https://github.com/cakephp/chronos)はimmutable（変更不可）で、DateTimeImmutableを継承。CakePHPのプラグインとして提供されているが依存しないので単体で利用可。

## そもそもimmutableとは

端的に言えば、インスタンス生成時の状態から値を変えられない。
状態を変化させる場合には、新たなインスタンスを生成する（広義や狭義によっては変わりそうだけど）。

### なにが嬉しいか

状態が変化しないので、コード作成がシンプルになる。
データが誤って更新されることが無いので、不具合が発生し辛いとか。

## Laravelではどうなっているか

最新のバージョン(5.6)では日付の操作にはCarbonが利用されている。

昨年、Carbonはメンテナス続くか怪しいのでChronos使おうぜと提案。
変更大変だよねとかありつつChronos勢優勢だったのだが、今年頭にCarbonの作者がコミッター追加してメンテナンスするとのコメントが入りtaylor氏がcloseしています。
https://github.com/laravel/ideas/issues/362

で昨日（5/29）、Laravel NewsでChronosおすすめ的な記事が上がってました。
[Working with Mutable and Immutable DateTime in PHP](https://laravel-news.com/mutable-and-immutable-date-time-php)

## 今後どうなるか

どうなるんでしょうね？

個人的には、今から作り始めるプロジェクトではCarbonではなくChronos使っていこうと思っています。
GAE/Goでメールを受信する

GAE(GoogleAppEngine)ではMail APIを使ったメールの受信が行えます。
メールをキーに何かの処理を行ったり、メールのテストに使ったり、とても便利に使うことが出来たので紹介させて頂きます。

# Receiving Mail with the Mail API
[Sending and Receiving Mail with the Mail API
](https://cloud.google.com/appengine/docs/standard/go/mail/sending-receiving-with-mail-api#receiving_mail)

上記のドキュメントを見ていただければわかる通り、このAPIは **[任意の名前]@[GAEのAppID].appspotmail.com** にメールを送ることで、GAEでメールをHTTPリクエストとして受け取ることが出来ます。

# 動かす
サンプルコードは[GitHub](https://github.com/keitaro1020/gae-email)にあげてあります。

## app.yaml
```yaml:app.yaml

inbound_services:
- mail
```

上の設定を追加することで、Mail受信を有効にします。

## メールの受信処理
```golang
package app

import (
	"github.com/nissy/bon"
	"google.golang.org/appengine"
	"google.golang.org/appengine/log"
	"io/ioutil"
	"net/http"
	"net/mail"
)

func init() {

	r := bon.NewRouter()

	r.Post("/_ah/mail/:ToAddress", func(w http.ResponseWriter, r *http.Request) {
		c := appengine.NewContext(r)
		defer r.Body.Close()

		m, err := mail.ReadMessage(r.Body)
		if err != nil {
			log.Errorf(c, "Error reading r.body: %v", err)
			return
		}

		header := m.Header
		log.Infof(c, "Date:", header.Get("Date"))
		log.Infof(c, "From:", header.Get("From"))
		log.Infof(c, "To:", header.Get("To"))
		log.Infof(c, "Subject:", header.Get("Subject"))

		body, err := ioutil.ReadAll(m.Body)
		if err != nil {
			log.Errorf(c, "Error reading m.body: %v", err)
		}
		log.Infof(c, "Body:", string(body))
	})

	http.Handle("/", r)
}
```

`/_ah/mail/[送信先に指定されたアドレス]` のpathにPOSTリクエストが来て、リクエストボディがメールの内容になるのでそれに合わせて実装します。
メールについては`net/mail`など適当なパッケージでパースして使うことが出来ます。

## ローカルでのデバッグ
admin server (http://localhost:8000) のInbound Mailからローカルで起動しているアプリに対してメールを送信することが出来ます。

<img width="809" alt="admin_server_inbound_mail.png" src="https://qiita-image-store.s3.amazonaws.com/0/126014/9e7c8943-0cc3-4cbd-73e0-9e065df15434.png">
GASからJSONでPOST(BASIC認証)する方法

#GASでPOST(BASIC認証)する

~~~
curl -X POST -H "Content-Type: application/json" -d @lead.json --user "user:password" https://post-url.com
~~~

このcURLと同じことをGASで実現したかった

~~~javascript
function sendPost(){
    const auth_data = Utilities.base64Encode(`${USER}:${PASSWORD}`);

    /* POSTするBODYを設定 */
    const data = {
        "A": "AAA",
        "B": "BBB"
    };

    /* POSTするためのOPTIONを設定 */
    const options = {
        "method": "post",
        "contentType": "application/json",
        "payload": JSON.stringify(data),
        "headers": {"Authorization" : `Basic ${auth_data}`},
        "muteHttpExceptions": true
    };
    const response = UrlFetchApp.fetch('https://post-url.com', options);
    Logger.log(response.getContentText());
}
~~~

意外と簡単だった。

POSTの実行自体は**UrlFetchApp.fetch**でできる。
headersにBasic認証用にAuthorizationを設定する。
**Utilities.base64Encode**が標準で用意されているので、簡単にBasic認証できる。
muteHttpExceptionsをtrueにしておけば、Exceptionが発生したときにresponseに内容を返してくれるので、ログを見れば、オールオッケー
Rails の view で classnames みたいなことをする

## 背景: classnames とは

HTML を書いていると、条件に応じて class 属性の値を変えたくなることがしばしばあります。

例えばある span 要素に `baz` のときだけ "bar" をつけたいとします。 slim で愚直に書くとたとえばこんな感じになります:

```slim
span[class="foo #{'bar' if baz}"]
```

条件が一つくらいならまだいいのですが、これが増えてくるとだんだんどういうときにどういう class になるのかわかりにくくなってきます。（しかも上のコードには実はバグがあります）

この問題を解決するのに JavaScript 界隈ではよく [classnames](https://github.com/JedWatson/classnames) という npm パッケージが使われます:

```js
const classNames = require("classnames")

classNames("foo", { bar: true })  //=> "foo bar"
classNames("foo", { bar: false }) //=> "foo"
```

## Rails で classnames 相当のものを実装する

Ruby も探してみると[一応 classnames という gem がある](https://rubygems.org/gems/classnames)のですが、広く使われているわけではなかったり、最終コミットから 2 年近く経過していたりであまり使いたくないと思う人もいるかも知れません。

幸いにして ActiveSupport が有効な環境では classnames のサブセットを実装することは非常に簡単です。

```rb
module ApplicationHelper
  # Create conditional css classes. Based on github.com/JedWatson/classnames
  #
  # @example
  #   classnames('foo', bar: true, baz: false)
  #   #=> 'foo bar'
  def classnames(*args)
    options = args.extract_options!
    (args + options.select { |_, v| v }.keys).join(' ')
  end
end
```

途中で使っている `.extract_options!` は ActiveSupport によって `Array` に追加されるメソッドです。これを使うと冒頭の spam 要素の例は

```slim
span[class=classnames('foo', bar: baz)]
```

のように書き直すことができます。

## Ref
- [JedWatson/classnames: A simple javascript utility for conditionally joining classNames together](https://github.com/JedWatson/classnames)
- [Array#extract_options!](http://api.rubyonrails.org/classes/Array.html#method-i-extract_options-21)
記事投稿テスト-Windows10にPostgreSQLをインストールする

Windows10環境のローカルシステムでPostgreSQLを採用することになったので、メモとして記事を投稿してみる。~~（投稿テストとかそもそもいらなくない？）~~

1. インストーラを探す

　どうやらオフィシャルはここらしい。
　→[PostgreSQLインストーラ](https://www.postgresql.org/)

　ダウンロードリンクはどこでしょうか・・・っと。
![20180530_1.png](https://qiita-image-store.s3.amazonaws.com/0/253681/edd5f583-8c4a-dc8a-6b5b-743b8b199adb.png)

　画面の右下に「ＤｏｗｎＬｏａｄ」のボタンがあるのでこれをクリック。
　選択する環境はもちろんＷｉｎｄｏｗｓ。
![20180530_2.png](https://qiita-image-store.s3.amazonaws.com/0/253681/f6d16e8c-9edc-57c9-a646-30776a7fa100.png)

　いろんなバージョンが出てきたんでとりあえずWindowsで一番新しいものにしましょう。
　・・・と思ったらリンクが見当たらないですし、、あ、英文の最初に「Download the installer」ってあった！
![20180530_3.png](https://qiita-image-store.s3.amazonaws.com/0/253681/3ebd5b5d-3282-168d-01fe-57d2024cb1a9.png)

　次の画面はバージョン選択ですかね。サクッと選択してＤｏｗｎＬｏａｄＮＯＷ。
![20180530_4.png](https://qiita-image-store.s3.amazonaws.com/0/253681/6d1264d5-8d87-666f-23a7-f96d1858d8c7.png)
　
※意外とサイズが大きいですぞ（表示で150ＭＢ）

インストーラ―の実行はほぼデフォルトで駆け足で。
![20180530_5.png](https://qiita-image-store.s3.amazonaws.com/0/253681/febcbfa2-44d6-0c2c-094f-3a7ce863f7e8.png)
![20180530_6.png](https://qiita-image-store.s3.amazonaws.com/0/253681/1048bd5e-0f76-e1ad-47b5-136ed5e3d950.png)
![20180530_7.png](https://qiita-image-store.s3.amazonaws.com/0/253681/5b0ac1c4-9d25-aab1-2a0a-54efe879fa48.png)
![20180530_8.png](https://qiita-image-store.s3.amazonaws.com/0/253681/d7b46933-4601-5dda-0b39-a5745c8e0b22.png)
![20180530_9.png](https://qiita-image-store.s3.amazonaws.com/0/253681/1e976c29-0362-fdc2-81c7-c29f9fd7e7b7.png)
![20180530_10.png](https://qiita-image-store.s3.amazonaws.com/0/253681/5c45556b-aa5c-6571-7a2f-89c7929039f7.png)

※ロケールだけは日本に変更「Japanese, Japan」
![20180530_11.png](https://qiita-image-store.s3.amazonaws.com/0/253681/50b9b50b-bc00-1b79-ec0b-dcb682a965a6.png)
![20180530_12.png](https://qiita-image-store.s3.amazonaws.com/0/253681/9ff169fe-4771-bfb6-deaa-6f9b95136dae.png)
![20180530_13.png](https://qiita-image-store.s3.amazonaws.com/0/253681/ab9e85e4-28d4-7d77-6852-17d260e3663d.png)

終わったーとおもったらむにゃむにゃチェックされてる英語が！
![20180530_14.png](https://qiita-image-store.s3.amazonaws.com/0/253681/9ef49798-c6ec-eb8e-f6c2-a41d09a5d333.png)

これはどうやらアドインか何かの追加のインストールをする場合に
チェックをつけたままFinishするものらしい。
~~面倒そうな~~チェックはしないでそのままFinish。

お疲れ様でした。
「現代数理統計学」問題集

<!-- 「現代数理統計学」問題集-->
# はじめに

ここでは， 「現代数理統計学」(竹村彰通) を読むにあたって，証明すべき命題をまとめています．
とくに，今まで数学を真面目に取り組んでいなかったが，機械学習の勉強をするにあたって基礎からやり直したい方に向けています．

***一週間に一つの練習問題を解くのペースで勉強しましょう!!***


# 1. 前書きと準備
## 練習問題 \#1
### \#1-1 P.4 (1.8)

$$
r = 1  \Leftrightarrow x_i = a + by_i,\quad b > 0,\quad i = 1,\ldots , n.
$$

$$
r = -1  \Leftrightarrow x_i = a + by_i,\quad b < 0,\quad i = 1,\ldots , n.
$$

### \#1-2 P.5

$R$および$S$は対称行列であることを示せ．

# 2. 確率と1次元の確率変数

## 練習問題 \#2
### \#2-1 P.9

$$
p(x) = F(x) - \lim_{x_n\rightarrow x- }F(x_n).
$$

### \#2-2 P.10

式(2.8)を示せ．

### \#2-3 P.10

確率密度関数 $f(x)$ を用いて，累計分布関数 $F(x)=P(X\leq x)$ を表わせ.
また，$F(x)$ の連続性を示せ．

## 練習問題 \#3
### \#3-1 P.11

式(2.9)から, 確率密度関数 $f(x)$ は，
$$
\int_{-\infty}^{\infty} f(x) dx = 1
$$
を満たすことを示せ．

### \#3-2 P.11 (2.10)

実数上の非負の関数 $h(x)$に対して，
$$
 f(x) = c \times h(x),\quad c =  \frac{1}{\int_{-\infty}^{\infty} h(x) dx},
$$
は確率密度関数となることを示せ．

## 練習問題 \#4

### #4-1  P.14 (2.17)

期待値演算の線形性
$$
 E[ag(X) + bh(X)] = aE[g(X)] + bE[h(X)]
$$
を示せ.

### #4-2 P.14 (2.19)

$$
Var(a + bX) = b^2 Var(X).
$$

### #4-3 P.13 (2.15),(2.16), 問2-1
平均周りの $k$ 次モーメント $\mu_k$ を原点周りのモーメント $\mu_i',~i = 1, \ldots,k$ を用いて表わせ．また $\mu_k'$ を $\mu_i,~i = 1, \ldots,k$ と $\mu := E(X)$ を用いて表わせ．


## 練習問題 \#5
###  #5-1  P.14
$$
E[ I_{(-\infty,c]}(X)] = F(c)
$$
を示せ.

### #5-2 P.14, 問2-2
2章の問2を示せ.

### #5-3 P.14,  問2-3
2章の問3を示せ．ここで，式(2.23)を満たすとき，期待値が存在するという．


#練習問題#6

### P.16-19
2章の問4を示せ.

### P.16-19
2章の問5を示せ.
ここで，一様分布$U$における確率密度関数$f$は
$$
f(x) =  
\begin{cases}
1 &\text{if}~x\in [0,1]\\\
0 &\text{else}
\end{cases}
$$
を満たす．
INNER JOINとOUTER JOINとは?

#INNER JOINとOUTER JOINとは?
　今回はテーブル結合をするために用いるSQL文の**INNERJOIN**と**OUTERJOIN**について説明していきます。

##INNER JOIN
INNER JOINとは、内部結合のことを指しています。  
例を使って説明してきます。

まず、このようなテーブルが２つあるとします。

**testGroupテーブル**

| id 	| author_id 	| title  	|
|----	|-----------	|--------	|
| 1  	| 1         	| title1 	|
| 2  	| 2         	| title4 	|
| 3  	| 1         	| title5 	|
| 4  	| 3         	| title3 	|
| 5  	| 3         	| title2 	|
| 6  	| 2         	| title7 	|
| 7  	| 3         	| title6 	|
| 8  	| 1         	| title8 	|

**authorIdテーブル**

| id | title   |
|----|---------|
| 1  | title10 |
| 2  | title13 |
| 3  | title11 |
| 4  | title9  |
| 5  | title12 |


* testGroupテーブルの[author_id]
* authourIdテーブルの[id]

これらが一致しているところを結合したいとき、このようなSQL文を書きます。

```
SELECT * FROM testGroup
INNER JOIN authorId 
ON testGroup.author_id = authorId.id
```

すると結果は


| id | author_id | title  | id | title   |
|----|-----------|--------|----|---------|
| 1  | 1         | title1 | 1  | title10 |
| 3  | 1         | title5 | 1  | title10 |
| 8  | 1         | title8 | 1  | title10 |
| 2  | 2         | title4 | 2  | title13 |
| 6  | 2         | title2 | 2  | title13 |
| 4  | 3         | title5 | 3  | title11 |
| 5  | 3         | title3 | 3  | title11 |
| 7  | 3         | title7 | 3  | title11 |


このように　**author_id = id** のところが全て表示されます。
この結果により、author_id 1番の人はtitle1,5,8,10を作ったことが分かります。




##OUTER JOIN
OUTER JOINにはLEFTとRIGHTがあり、外部結合のことをさしています。

上の例を使い説明していきます。

###LEFT OUTER JOIN
名前の通り左にくるテーブルに合わせて結合します。

```
SELECT * FROM testGroup
LEFT OUTER JOIN authorId 
ON testGroup.author_id = authorId.id
```

すると結果は

| id | author_id | title  | id | title   |
|----|-----------|--------|----|---------|
| 1  | 1         | title1 | 1  | title10 |
| 3  | 1         | title5 | 1  | title10 |
| 8  | 1         | title8 | 1  | title10 |
| 2  | 2         | title4 | 2  | title13 |
| 6  | 2         | title2 | 2  | title13 |
| 4  | 3         | title5 | 3  | title11 |
| 5  | 3         | title3 | 3  | title11 |
| 7  | 3         | title7 | 3  | title11 |

今回左のテーブルのauthor_idは１〜３番までであり、結合された右のテーブルのidも１〜３番まで全てあるので結果はINEER JOINと同じ結果になることが分かります。

###RIGHT OUTER JOIN
さっきとは逆になり、右にくるテーブルに合わせて結合します。

```
SELECT * FROM testGroup
RIGHT OUTER JOIN authorId 
ON testGroup.author_id = authorId.id
```
すると結果は

| id   | author_id | title  | id | title   |
|------|-----------|--------|----|---------|
| 1    | 1         | title1 | 1  | title10 |
| 2    | 2         | title4 | 2  | title13 |
| 3    | 1         | title5 | 1  | title10 |
| 4    | 3         | title5 | 3  | title11 |
| 5    | 3         | title3 | 3  | title11 |
| 6    | 2         | title2 | 2  | title13 |
| 7    | 3         | title7 | 3  | title11 |
| 8    | 1         | title8 | 1  | title10 |
| NULL | NULL      | NULL   | 4  | title9  |
| NULL | NULL      | NULL   | 5  | title12 |

今回は右のテーブルに合わせたのでid 4,5番は左のテーブルには存在しないのでNULLとはでるが表示はされていることが分かります。  
また、並び順に関しても右のテーブルが基準になっていることも分かります。


##まとめ
　今回はテーブル結合について説明しました。言葉で説明すると一見難しそうですが、実際にテーブルを作って実行してみれば理解が深まると思います。  
　この構文は時間短縮にもなるのでぜひ活用していきたいですね。
DNS情報の参照について 

新しいサーバへ移行する準備のときに遭遇したDNS（=名前解決の仕組み）でのNWの諸々の確認


##nslookupコマンド

①コマンドラインでDNS情報を取得する方法

```
$ nslookup www.qiita.com
Server:		192.168.1.1       # DNS情報を問い合わせる先
Address:	192.168.1.1#53

Non-authoritative answer:
Name:	www.qiita.com
Address: 13.113.218.131        # 得られたIPアドレス
Name:	www.qiita.com
Address: 54.64.239.23
Name:	www.qiita.com
Address: 52.197.145.144
```

オプション

**CNAMEレコード　：　ドメイン名の別名**

```
$ nslookup -type=CNAME www.example.com
Server:		192.168.1.1
Address:	192.168.1.1#53

Non-authoritative answer:
www.example.com  canonical name = www.hoge.com   #これぞCNAME

```
ドメインのニックネームみたいなもの



**Aレコード：アクセスして来た人が見るIPアドレス らしい**
``` ```



②対話的に問い合わせる方法


```
$ nslookup
> server 1.1.1.1            # 問い合わせ先を任意のDNSサーバに指定
Default server: 1.1.1.1
Address: 1.1.1.1#53
>
>
> exit
#exitかCtrl+Dで対話モードを終了
```

日経NETWORK「nslookupコマンド -- No.1 DNSサーバーへアクセスしてドメイン情報を検索」
http://tech.nikkeibp.co.jp/it/article/COLUMN/20060613/240763/
---分かりやすく解説しています

##digコマンド

nslookupよりも多くのオプションがあるコマンド
LaTeX web service 使い始めた


久しぶりに LaTeX を使いたくて、今時ならウェブサービスになってるだろうと ShareLaTeX を触り始めて気に入り始めたところ、Overleaf v2 と[統合される](https://www.overleaf.com/help/342-overleaf-v2-faq)というお知らせが目に入りました（[参考](https://qiita.com/kyushu_mm/items/009460d32c295a71a66d)）。なので Overleaf v2 を中心に。

v2.overleaf のデフォルトは pdfLaTeX で、[ドキュメント](https://ja.sharelatex.com/learn/Japanese)にあるように `CJKutf8` パッケージを使うと、日本語が出力できます。できるのですが、しばらく使っていると、どうもフォントが気に入らない……。

実は同じドキュメントに「外部フォントが使えないので、pdflatex より XeLaTeX がおすすめ」と書かれていますし、pdflatex は避けるべしという[記事](https://qiita.com/zr_tex8r/items/cdaac1500718eb9fa330)も見かけました。やはり日本語を使いたい場合は、デフォルトの pdflatex から切り替えたほうがよさそうです。「コンパイラ」設定で切り替えます。選択肢がいくつかありますが、意味は[この記事](https://qiita.com/yyu/items/6404656f822ce14db935)を読むとよく理解できました。私は今は LuaLatex を常用するようになりました。

LuaLatex / v2.overleaf で日本語を使う例：

```tex
\documentclass[a4paper, 12pt]{article}
\usepackage{fancybox}
\usepackage{amsmath}
\usepackage{fullpage}
\setlength{\parindent}{0em}
\usepackage{luatexja-fontspec}
\setmainjfont{IPAexMincho}
\begin{document}
ほげほげ
\end{document}
```

See also:

- LuaLaTex でなく LaTeX に切り替える例： http://doratex.hatenablog.jp/entry/20180503/1525338512
Macのスクリーンショットを直接フォルダに保存できるようにしたら便利だった話【簡単】

## 自己紹介
2018年新卒文系出身未経験エンジニアです。

## 背景
4月に初めて支給されたMac。簡単にスクリーンショットが取れることが便利で僕はすごく嬉しかったです。
覚えなければいけないこともたくさんあり、当時の僕は大切だと思ったことをひたすらスクリーンショットする日々。
そしたらデスクトップにはスクリーンショットの山がありました。
これはなんとかせねばと思い、設定したのでメモ。

## やり方

ターミナルにアクセスし、

```
:~ ka_takahashi$ cd Desktop/
:Desktop ka_takahashi$ mkdir スクリーンショット
```

デスクトップに移動しスクリーンショットフォルダを作成します。
このスクリーンショットフォルダに直接スクリーンショットを保存させたいので、

```
:Desktop ka_takahashi$ defaults write com.apple.screencapture location ~/Desktop/スクリーンショット
```

と記述します。
これでスクリーンショット専用フォルダにスクショは保存されデスクトップも綺麗なまま！

## 参考
https://pc-karuma.net/mac-customize-screencapture-location/
Pythonの再帰ラムダでピラミッドを建造した

# 「不動点コンビネータ」とは

Pythonのlambda式で再帰をやるには「不動点コンビネータ」を使うと良いと聞き、言葉の響きがかっこいいので実装した。不動点？？？

```python
print(lambda f:f("#\n",f))(lambda s,f:s if len(s)>99 else " "*int(50-len(s)/2)+s+f("#"*4+s,f))
```


# 様子


![スクリーンショット 2018-06-12 9.41.01.png](https://qiita-image-store.s3.amazonaws.com/0/72976/6dc2bbc5-d423-d94c-2d0e-cb4171f2ba87.png)
自然言語処理(NLP) を覗く

翻訳や日本語ドキュメントの校正を行う中で自然言語処理(NLP)にもっと知見を得られるんじゃないか？その仮定をモチベーションとしてNLPについて理解することに時間を割いてみようと考えたメモ。


#### 入門書

[自然言語処理の専門家に入門書を聞いてきた](http://esu-ko.hatenablog.com/entry/2016/03/03/自然言語処理の専門家に入門書を聞いてきた)
[『自然言語処理の基本と技術』](https://www.amazon.co.jp/exec/obidos/ASIN/479812852X/esuko-22/)が基礎の基礎となりそう。以下レビュー。
> 私は、自然言語処理を使って面白いことができないかな？、というのを調べたいと思っていたので、本書がとても合っていました。同様の方は、まず本書で概要を抑え、それから他の本で詳細を学ぶのが良いのではと思います。

こんな例が書いてある。
I saw a girl with a telescope. 
-> I saw / a girl with a telescope. 
-> I saw a girl / with a telescope. 

#### 勉強したいもの
[感情分析に用いる極性辞書を自動生成する](https://qiita.com/g-k/items/1b7c765fa6520297ca7c)
[fastTextの学習済みモデルを公開しました](https://qiita.com/Hironsan/items/513b9f93752ecee9e670)
[いますぐ使える単語埋め込みベクトルのリスト](https://qiita.com/Hironsan/items/8f7d35f0a36e0f99752c)


#### Sudachi

- [SudachiをElasticsearchで使用する手順#1](https://qiita.com/matsuda_vla/items/9922e34e7623900eadc1)
    - https://twitter.com/klmquasi
    - https://github.com/WorksApplications/Sudachi


#### キーワードを基礎から応用までカテゴライズ

##### 応用技術
情報検索 **翻訳** **日本語校正** **要約** レビュー解析 英文校正 情報抽出 Web応用 対話

##### 要素技術
言い換え 語義曖昧性解消 固有表現抽出 照応解析 知識獲得

##### 基礎技術
形態素解析 構文解析 述語項構造解析 または 形態素解析 構文解析 意味解析 文脈解析