OmniAICreator/Qiita-1.07M huggingface dataset:
Ionic+Cordova Camera PluginのアプリがiTunes側でplistどーたらこーたらで蹴られる件

iOS 10になってからアプリのPermissionに関するチェックがまたまた追加されたようで、自分の場合はcordova-plugin-cameraのplistに必要なエントリがない、という理由でアプリ更新を蹴られてしまいました。あ、Ionicフレームワークを使ったハイブリッド開発です

以下、そのエラーを通知してきたメール。

>Missing Info.plist key - This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

なぜこのアプリがフォトアルバムにアクセスするのかをNSPhotoLibraryUsageDescriptionに記入せい、ということですね。./plugins/<plugin名>/plugin.xmlを見てみると

```./plugins/cordova-plugin-camera/plugin.xml
<preference name="CAMERA_USAGE_DESCRIPTION" default=" " />
  <config-file target="*-Info.plist" parent="NSCameraUsageDescription">
     <string>$CAMERA_USAGE_DESCRIPTION</string>
  </config-file>

<preference name="PHOTOLIBRARY_USAGE_DESCRIPTION" default=" " />
   <config-file target="*-Info.plist" parent="NSPhotoLibraryUsageDescription">
      <string>$PHOTOLIBRARY_USAGE_DESCRIPTION</string>
   </config-file>
```

という記述があり、CAMERA_USAGE_DESCRIPTIONとPHOTOLIBRARY_USAGE_DESCRIPTIONに利用目的を入れてやればよい、ということがわかります。これらの変数はconfig.xmlから渡すのかな？と思って調べたら`cordova plugin add`コマンドからイケることを確認しました。具体的には

```
$ cordova plugin add cordova-plugin-camera --variable CAMERA_USAGE_DESCRIPTION="this app will use your camera" --variable PHOTOLIBRARY_USAGE_DESCRIPTION="this app will access to your photo library"
```

のようになります。[こちら](http://stackoverflow.com/questions/39566952/cordova-info-plist-nscamerausagedescription-key-is-missing/41883334)を参考にしました。

Happy Coding!
技術英語 > [The preceding text string] started with valid digit characters (99),

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

```
>>> int('99 bottles of beer on the wall')
...
```

> **<font color=red>The preceding text string</font>** started with valid digit characters (99), but it kept on going with others that the int() function just wouldn't stand for.

文章の前の例を示すために「preceding」を使っている。

自分がこれまでよく目にした言い方には以下のようなものがある。

- the above text string
- the before-mentioned ...
   - ただし、文章には適用した例を見たことがある


https://www.merriam-webster.com/dictionary/preceding
> :  existing, coming, or occurring immediately before in time or place <the preceding day> <preceding paragraphs>

https://www.vocabulary.com/dictionary/preceding
現在11th gradeで、前年が10th gradeという例がある。
プロジェクト単位でのソースコードの整備効率化(Windows初級編)

プロジェクト単位で仕事をする際に地味に足を引っ張るのがコーディングルール。
おおまかなルールについてはどこの現場も大差はないだろう。
しかし、細かいところ「()の中はスペース一個分入れる」「if文のtabキー一個でインデント」するなどは現場のチームやメインプログラマーの癖に合わせることになるし癖なんて十人十色人それぞれだ。
また個人個人が使うエディターによっては違うエディターを使ったとたんおじゃんなんてこともあるかもしれない。
いちいち間違いを指摘してルールを強いるよりは機械的に自動でソースコードを整備してくれる環境を作ったほうが効率的だ。
今回はそんな試みのなかで[Artisitc Style]（以後：Astyle）を導入したときのお話。
#Artisitc Style
Astyletとは Tal Davidson氏がフリーで提供しているソースコード用の自動整形ツールだ。
・C, C++, C#, Java のソースコードのインデントや整形を行える。
・オプションファイルを作ることでチーム、プロジェクト毎の整形の設定を適用できる。
・別のC++プログラムに内蔵できる。
などの利点がある。
詳しくは下記のサイトを参考にしてほしい。
・[Artistic Style 1.15.3(和訳済み)](http://www.6809.net/tenk/html/lib/doc/astyle_j.htm)
・[Artistic Style 2.06(原文)](http://astyle.sourceforge.net/)
#準備
まずは下記のサイトからAstyleをダウンロードする。
・[Artistic Style - Browse /astyle at SourceForge.net](https://sourceforge.net/projects/astyle/files/astyle/)

１．ダウンロードしたらファイルを解凍し、binファルダを開く。
２．フォルダ内の[Astyle.exe]を整形したいソースコードがあるフォルダに入れる。
３．exeを入れたフォルダのアドレスバーに"cmd"と入力し、Enterキーを叩いてコマンドプロンプトでフォルダを開いたらAstyleの準備は完了だ。
<img width="730" alt="astyle3.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/139388/5d5e4106-344e-45fb-8103-92e4f18d675a.jpeg">
↑この画像のような画面が出たら準備完了。

#Astyleの使い方
Astyleでは以下の形式でコマンドを叩く。
```astyle [Astyleコマンド] [Astyleコマンド]…　[ファイル名]…
例：astyle --style=ansi test.cs```

これを実行すると指定されたソースコードが整形される。
また、整形された際にソースコードのあったフォルダ内にorig拡張子のバックアップファイルが生成される。
また複数のフォルダを整形したい場合は下記のように叩けばいい。
```astyle [Astyleコマンド] [Astyleコマンド]…　*[ワイルドカード]
例：astyle --style=ansi --pad-oper *.cs
```
#Astyleのコマンド
Astyleは複数のコマンドを組み合わせることでそれぞれに適した整形を行う。
下記はおおまかなコマンド

1.mode…言語タイプの指定
2.style…インテンドの仕方などのコーディングスタイルの指定
3.intend…インテンドの際にスペース、タブを何回使うかの指定
4.break…空白行の挿入
5.pad…空白の挿入

その他にもバックアップファイルの生成を行わせないなどの設定も出来るが詳しくは下記のサイトを参考にしてください。
・[Artistic Style(AStyle) の スタイルオプション(引数)](http://algo13.net/astyle/options.html)
#オプションファイル
複数のコマンドをプロジェクト毎に打ち込むのは面倒。
そんな時はオプションファイルを作成しよう。
プロジェクト毎に細かいところを調整したい場合も複数のオプションファイルを作成すれば安心だ。
以下は、オプションファイルの作り方。

1.適当なテキストエディターでテキストファイルを作る。
2.テキストファイル内に上記のコマンド一覧を参考にしながら必要なコマンドを打ち込む。
<img width="248" alt="astyle.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/139388/03ccc7dc-6dff-b168-da7d-73620d4a9bcb.jpeg">
↑こんな感じでコマンドを書いていく。

3.テキストファイルを保存したらファイル名を「astylerc」に変更する。
4.上記の手順でコマンドプロンプトでAstyleを起動。
5.Astyleコマンドの欄に「--optoins=[作成したオプションファイルのパス]」を打ちこむとでオプションファイル内のコマンドが全て適用され成形される。
`例：astyle --options=### test.cs`

また、環境変数「ARTISTIC_STYLE_OPTIONS」を作りオプションファイルをフルパスで指定するとコマンドで指定しなくても適用される。

環境変数を設定した場合でもoptionsにより他のオプションファイルを指定することが可能。
その場合双方が有効になり、optionsで指定したほうが環境変数の指定分を上書きする形になる。
また、optionsで指定したほうのみを有効にすることも可能だ。
#最後に
Astyleを使ってみての感想だが使い慣れていないが使用感は悪くない。
劇的なまでに汚いソースコードにはまだ使用していないがケアレスミスの修正には丁度いいと思った。
これからはmacへの適応、より効率のいい運用に着手していこうと思う。
#参考サイト
・[Artistic Style(AStyle)でC++のコードをきれいに整形する](http://d.hatena.ne.jp/replication/20140209/1391912114)
・[Artisitc Style Ver2.02.1のドキュメントを訳してみた](http://xxxdatxxx.blogspot.jp/2012/07/artisitc-style-ver2021.html)
PyPIに登録するパッケージバージョンをGitから取得する

# 概要
PyPI にパッケージを登録する場合，setup.py で呼び出す setup 関数に version 引数を渡す必要がある．
このバージョン情報を今までは手作業で編集していたのだが，Gitのタグから引っ張ってこれたので備忘録として記しておく．

# [setuptools_scm](https://pypi.python.org/pypi/setuptools_scm)
setuptools_scm はバージョン管理システムから適当に情報を引っ張ってきて，setup.py を設定してくれるライブラリである．
これを使えば，タグ情報を元にバージョン番号を算出し設定できる．
また，トラッキングされているパッケージデータを自動的にパッケージへ追加する機能もある．

setuptools_scm を使用してバージョン番号を設定する場合， setup.py の setup 関数に次のようなパラメータを渡す．

```setup.py
from setuptools import setup

setup(
    use_scm_version=True,
    setup_requires=[
        "setuptools_scm"
    ],
    ... # 他の項目は省略
)
```

これで，`python setup.py sdist`とする時に適切にバージョン番号が計算される．
バージョン番号の計算方法は次のルールに従っている．

* 最新コミットにバージョンタグが付いており，更新されたファイルがない場合: そのバージョンタグ
* 最新コミットにバージョンタグが付いており，更新されたファイルがある場合: バージョンタグ＋現在の日付
* バージョンタグ付きコミット以降にコミットがあり，更新されたファイルがない場合: 次のバージョン.dev(何コミット離れているか)+n(ハッシュ)
* バージョンタグ付きコミット以降にコミットがあり，更新されたファイルがある場合: 次のバージョン.dev(何コミット離れているか)+n(ハッシュ).日付

より詳しい情報は[マニュアル](https://github.com/pypa/setuptools_scm/)を参照のこと．

# パッケージデータの追加
トラッキングされているパッケージデータを自動で追加する場合， setup 関数に `include_package_data=True` を追加する．
つまり，

```setup.py
from setuptools import setup

setup(
    use_scm_version=True,
    include_package_data=True,
    setup_requires=[
        "setuptools_scm"
    ],
    ... # 他の項目は省略
)
```

とする．
なお，トラッキングしているけれどパッケージには含めたくないデータファイルがある場合，
exclude_package_data で指定できる．詳細は[マニュアル](https://setuptools.readthedocs.io/en/latest/setuptools.html#including-data-files)を参照．
Myricaフォントをpowerline化する

Myricaフォント使い始めたけどpowerline使えなくて悲しかったのでpowerline化する

# 準備
## Myrica

Myricaフォントをダウンロードする
https://myrica.estable.jp/
今回はMyricaMをpowerline化する

## powerline-fontpatcher

powerline-fontpatcherをダウンロードしておく

```
$ git clone https://github.com/Lokaltog/powerline-fontpatcher
```

## fontforge

コマンドライン版、GUI版両方使います
Macならhomebrewで両方入れられる

```
$ brew install fontforge --with-python
$ brew cask install fontforge
```

# powerline-fontpatcherを当てる

```
$ fontforge -lang=py -script ./powerline-fontpatcher/scripts/powerline-fontpatcher ./MyricaM/MyricaM.TTC
```
カレントディレクトリに`MyricaM Monospace for Powerline.otf`が作成される

これで一応powerline化されるが▶がずれる
![スクリーンショット 2017-01-27 02.44.08.png](https://qiita-image-store.s3.amazonaws.com/0/21606/cb64257c-d4a6-41c1-c477-59adcbfe0763.png)

# fontforgeで調整

- GUI版のfontforgeを開く
- 先程作成したフォントファイル`MyricaM Monospace for Powerline.otf`を開く
- View → GoTo で`uniE0A0`を入力してpowerlineのシンボルまで移動する
- Shiftキー押しながらシンボルを全て選択したら右クリック → Transform


![スクリーンショット 2017-01-27 03.23.44.png](https://qiita-image-store.s3.amazonaws.com/0/21606/185b79ae-8200-cb6c-044c-14128185da56.png)

- MoveでYに93を指定する → OK

 ![スクリーンショット 2017-01-27 03.11.09.png](https://qiita-image-store.s3.amazonaws.com/0/21606/52029900-be7a-47c1-ab35-9ce861b96764.png)

変形が終わったら

- File → Generate Fonts → Generateでフォントを出力
- エラーが出るがGenerateでOK
- 出力されたフォントをインストールする

# 完成

![スクリーンショット 2017-01-27 03.15.57.png](https://qiita-image-store.s3.amazonaws.com/0/21606/b0c5c4f8-d6cc-8723-a65a-60dbd93a33ae.png)


# 参考
[Vim Powerline用のFont Patchをあてる - Qiita](http://qiita.com/osamunmun/items/6fcabd8dff0d5fded559)
[UbuntuMonoRegularのpowerlineフォントがずれる - Qiita](http://qiita.com/uplus_e10/items/85a2992eeaddf288684d)
PyPIに登録するパッケージの説明文を半自動生成する

# 概要
PyPI にパッケージを登録するとき，特に指定しなければ説明文として README.md が使用される．
しかし， Markdown 形式ではレンダリングされないため下記のように醜い文章が表示されることになる．

![Markdown形式による説明文](https://qiita-image-store.s3.amazonaws.com/0/62253/42ee26c6-3f0c-5cf7-88ca-7e1c2947536e.png)

この説明文は，reStructuredText 形式ならばレンダリングされる．
そこで，README.md から README.rst を生成し，説明文として設定する方法を備忘録として記す．

# Markdown から reStructuredText への変換
GitHub 等でコードベースを管理しているならば，README.md は用意されていると考えられるので，
この Markdown テキストを reStructuredText 形式へ変換する．

変換には，[Pandoc](http://pandoc.org/) を使う．

```shell-session
$ pandoc --from markdown --to rst README.md -o README.rst
```

なお，Pandoc は brew でインストールできる．

```shell-session
$ brew install pandoc
```

# パッケージ情報への登録
README.md と README.rst が両方ともパッケージに含まれている場合， 
README.md の方が優先されてしまうので， setup.py で README.rst を説明文として使用するように設定する．

具体的には，`setup` 関数の long_description キーワード引数に README.rst の内容を渡す．

```setup.py
from os import path
from setuptools import setup, find_packages

def read(fname):
    return open(path.join(path.dirname(__file__), fname)).read()

setup(
    long_description=read("README.rst"),
    ... # その他の項目は省略
)
```

以上の手続きでパッケージを登録すると，下記のように無事レンダリングされるようになる．

![rst形式による説明文](https://qiita-image-store.s3.amazonaws.com/0/62253/d78d8cec-1d71-bcc7-9926-48bdfaa80f51.png)
macOS に Java for OS X をインストールしてしまった場合の後始末

macOS Sierra、OS X El Capitan に、Java for OS X を使用して、JDK6 をインストールしてしまった場合、きれいに削除するのが、なかなかに大変だったのでメモ。

# 環境

- macOS Sierra 10.12
- [Java for OS X](https://support.apple.com/kb/DL1572?locale=ja_JP&viewlocale=ja_JP) (これを削除する)

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12
BuildVersion:	16A323
```

# 問題

「何が問題となるのか？」というと、Java for OS X をインストールした際に作成されるシンボリックリンクを変更 (`ln -fs`, `unlink`, `rm`) できなくなってしまう。

問題のシンボリックリンクは以下。

```
$ ls -al /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
lrwxr-xr-x  1 root  wheel  59  1 27 01:03 /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ->  /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents
```

これがなかなかに消えない。`ln` コマンドは通ったように見えて変化せず、`unlink`, `rm` コマンドに至っては、Permission denied が返ってくる。

# 原因

調べてみたところ、`OS X El Capitan` 以降、実装された SIP (System Integrity Protecton) という機能による保護が働いていたのが原因のようでした。

stackexchange でも同じようなことで困っている人がいたので、とても参考になりました。=> [delete-unnecessary-files-in-system-library-for-mac-os-x](http://apple.stackexchange.com/questions/214538/delete-unnecessary-files-in-system-library-for-mac-os-x)

# 解決

ここまで分かると、後の対処はそう難しくありません。
以下手順に従って操作します。

1. Mac の再起動を開始して、起動前から `⌘`+`r` を押し続けておきます。
2. macOS ユーティリティが起動するのを確認します。
3. メニューから、[ユーティリティ] > [ターミナル] を開きます。
4. 開いたターミナルで、`csrutil disable` を入力して実行します。(このコマンドで SIP が無効化されます。)
5. 実行を確認したら、今度は通常どおりに再起動します。
6. 再起動後、再びターミナルを開き、対象のシンボリックリンクを `unlink` したり、リンク先のディレクトリを削除したりします。
7. 削除後、切り替えたい JDK のパスなどがあれば改めて、`/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK` にシンボリックリンクを張ります。

以上で完了です。
すべての操作を終えたら、念のため再び macOS ユーティリティを起動して、`csrutil enable` を実行して、SIP を有効化しておくことをオススメします。

# JDK6 をインストールしたい場合

Homebrew でインストールしましょう。
以下コマンドで JDK6 をインストール可能です。

ただし、こちらの方法でも `/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK` が上書きされてしまう場合があるため、シンボリックリンクのパス確認と、張替えは準備しておいたほうがよいかもしれません。

```
$ brew cask install java6

$ ls /Library/Java/JavaVirtualMachines/
1.6.0.jdk/        jdk1.7.0_79.jdk/  jdk1.8.0_121.jdk/ jdk1.8.0_91.jdk/

$ ls -al /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
8 lrwxr-xr-x  1 root  wheel  59  2  4 20:11 /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK -> /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents 

$ sudo unlink \
> /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK

$ sudo ln -s \
> /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents \
> /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
```
SpringBootでCookie設定をする

# 基本
ServletContextInitializerを返すBeanを定義すればよい。

適当なApplicationクラスで下記のようなコードを書く

```java:Applcation.java


    @Bean
    public ServletContextInitializer servletContextInitializer(@Value("${secure.cookie}")boolean secure) {
        return servletContext -> {
            servletContext.getSessionCookieConfig().setName("hogeSession");
        };
    }

```


## httponlyにする

```java:

        return servletContext -> {
            servletContext.getSessionCookieConfig().setHttpOnly(true);
        };

```

## secure属性をつける

```java

        return servletContext -> {
            servletContext.getSessionCookieConfig().setSecure(true);
        }

```

ローカル開発するときに邪魔だったりするのでpropertiesから取得するようにしてprod用設定ではtrueにするなどしたほうが便利かもしれません

```java
    @Bean
    public ServletContextInitializer servletContextInitializer(@Value("${secure.cookie}")boolean secure) {
        return servletContext -> {
            servletContext.getSessionCookieConfig().setSecure(true);
        };
    }
```


## URLにJSESSIONIDを付与しない
Cookieが使用出来ない場合URLでセッション管理をしようとしてしまいますが、これは避けるべきです。
Cookieが使用できる場合でも初回アクセスのみURLにJESSIONIDが付与されてしまいます。
SpringBootはServlet3.0を使用しているのでSessionTrackingModeを設定することで、Cookieだけに絞ることが出来ます。


```java


        return servletContext -> {
            servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE);
        };

```

これはweb.xmlで下記のような設定をしたのと同義です。

```xml


<session-config>
  <tracking-mode>COOKIE</tracking-mode>
</session-config>

```

## まとめ
これらをまとめて設定するとこんな感じになります

```java


    @Bean
    public ServletContextInitializer servletContextInitializer(@Value("${secure.cookie}")boolean secure) {

        ServletContextInitializer servletContextInitializer = new ServletContextInitializer() {
            @Override
            public void onStartup(ServletContext servletContext) throws ServletException {
                servletContext.getSessionCookieConfig().setHttpOnly(true);
                servletContext.getSessionCookieConfig().setSecure(secure);
                servletContext.setSessionTrackingModes(
                        Collections.singleton(SessionTrackingMode.COOKIE)
                );
            }
        };
        return servletContextInitializer;
    }

```

参考
https://www.glamenv-septzen.net/view/1093
Windows7でAmazon DashButtonをハックする。

#概要
ネットにはMacOSでamazon dashボタンをハックしている人が多いけど、
自分はWindows7でネットに情報が少なく、セットアップなどにかなり時間がかかったのでメモ的なアレを書いておく。
ハックってどういうこと！？→amazon dashボタンを押したらSlackやLINE、Chatworkにメッセージを流したりできるってこと！
頑張れば家の鍵を開けたり、Githubのマージボタンやデプロイボタンみたいなのも作れる。
シェルが書けるので、お手軽なIoTデバイスとしてamazon dash buttonを使用できる。
IRKitというものを用いればエアコンも付けたり消したりできる。

#使ったものとか
- VMware(ubuntu64Bit)
- wireshark
- amazon dashボタン
- dasher(https://github.com/maddox/dasher)
- nodejs
- npm
- git

#0. ボタンのセットアップをしておく。
- ここ(http://qiita.com/jsoizo/items/3b8bba4160f41aef20f4) を見つつ、ボタンをネットに接続しておく

#1. ボタンのMACアドレスを調べる
- wiresharkをDL→http://forest.watch.impress.co.jp/library/software/wireshark/

- 起動

- 自分が接続しているネットワークを選択
![screenshot.17.png](https://qiita-image-store.s3.amazonaws.com/0/159050/28d1b5df-da67-4dd7-6427-33c8eb8fa516.png)

- フィルタにarpと打ち、フィルタリングする
- dashボタン押下
- AmazonTe..で始まるソースを見つける
![screenshot.18.png](https://qiita-image-store.s3.amazonaws.com/0/159050/676df81b-1fd7-b6d0-8072-a53311e16a36.png)
- ダブルクリックで詳細を表示し、MACアドレスをコピー

#2. VMware、ubuntuで実施すること
- VMware、ubuntu64Bitを用意し、立ち上げる
- ubuntuにてgit、npm、nodejsをインストール(全て最新版)
- 好きなフォルダにdasherをCloneする
- http://qiita.com/jsoizo/items/3b8bba4160f41aef20f4 を見つつ、config.jsonにリクエスト情報を書く

#3. ネットワークの設定をする。
- http://shepherdmaster.hateblo.jp/entry/20120122/1327248362 を見つつ、ネットワークの共有設定をする。

#3. アプリ(dasher)を立ち上げ、ボタンを押す
- Cloneしたフォルダ内に移動
- npm install
- sudo npm start run
- 起動する。
- ボタンを押すとconfig.jsonに書かれた処理が実行される。

※起動しない場合はnodeやnpmのアップデートなどを試してみてください。

#悩み
- 自分の環境ではたまにエラーとなる・・・要調査(EAI_AGAIN)
- わざわざvmwareでubuntu動かして・・ってやらなくてもいい気がする・・


#2017/03/01 追記

- 別にubuntuを立ち上げなくてもよかった・・！
- node、npmの最新版をWindowsにインストールするだけで[dasher]を起動できた。めでたい。
- もっと言うと、ubuntuで動かすと三回に一回エラーになるのでやめたほうが良い・・？
パラメタ調整による学習プログラム

# パラメタ調整

- プログラムの内部状態を数式で表現し、与えられた学習セットから式を正しく調整することを目標とした学習方法
- チェッカーを例にすると、過去の人間同士の対戦結果などを参照して、ある局面で指した着手がその後の展開において良い手だったか悪い手だったかを評価し、評価が良くなるようにパラメタを調整する。

- 学習データセットとして数値が与えられたときに、それらの数値を説明できるような数式を決定することを、**回帰分析**という。
- 回帰分析の代表的な手法に、**最小二乗法**がある。

## 最小二乗法による回帰分析
最小二乗法を用いて一次式の係数を求めることで、データの関係を機械学習するプログラムを考える。
ここではパラメタ調整による学習の例題として、気象データを扱ってみる。

- 学習データセット => 新潟県長岡市の年ごとの日平均気温

- 用いるデータを気象庁のサイトから入手した => [気象庁>過去の気象データ検索](http://www.data.jma.go.jp/obd/stats/etrn/index.php)

- 作成したプログラムはGithubに公開する => [プログラム](https://github.com/youichiro/FirstMachineLearning)

用意したもの：

- 最小二乗法による一次式の係数を決定するプログラム => lsm.c
- データから必要な行のみを取り出すプログラム => selectline.c
- データから指定した位置の数値を取り出すプログラム => cutfield.c
- 行番号をデータファイルに付け加えるプログラム => addnumber.c
- Webサイトからコピーした気象データ => rawdata.txt

手順：

- 気象データから日平均気温だけを取り出す
`$ ./selectline 2 < rawdata.txt | ./cutfield 5 > data.txt`
rawdataの2N行のみを抽出し、更に5列目のみを抽出。結果をdata.txtに保存。

- X軸となる数値を付け加える
`$ ./addnumber 1976 < data.txt > lsmdata.txt`
data.txtのデータの左に、1976年からの年号を追加。lsmdata.txtに保存。

- 最小二乗法により回帰分析を行う
`$ ./lsm < lsmdata.txt`
最小二乗法による計算式の係数を決定するプログラムに日平均気温データを挿入

最小二乗法による係数の計算結果 => y=12.206341 + 0.035819x

長岡市の年ごとの日平均気温の推移と最小二乗法による一次式での回帰分析
![スクリーンショット 2017-01-27 0.44.11.png](https://qiita-image-store.s3.amazonaws.com/0/145075/69a4f370-7d35-48c7-dcc3-92392a0c3d46.png)

- 年々気温は上昇していく？
- 100年後には約3.6度上昇する！？

最小二乗法で未来の気温を予測することはできるが、このような簡単な学習により求めた式が100年後の予想に利用できるとは考えにくい。

## データの変動傾向の学習

- 前年と比べて次の年の日平均気温がどうなるかについて、規則性を学習することを考える
- 例えば、平均気温の低い年が続いたら次の年は気温が上がる、などの規則性を得る
- 前年の気温と比べ、上昇しているなら+、下降しているならーの記号で表すこととする

例）1年前：15.4　　当年：15.9　　→　上昇"＋"
　　1年前：16.8　　当年：14.4　　→　下降"ー"


- 過去3年間のデータ変動パターンを抽出する => 8パターン
- 変動パターンが学習データセットに出現する頻度を数え上げる

|2年前|1年前|当年|頻度|
|:---:|:---:|:---:|:---:|
|+|+|+||
|+|+|-||
|+|-|+||
|+|-|-||
|-|+|+||
|-|+|-||
|-|-|+||
|-|-|-||

- 2年前、1年前の変動パターンから当年の変動を予測する

例）

|2年前|1年前|当年|頻度|
|:---:|:---:|:---:|:---:|
|+|+|+|0|
|+|+|-|6|

変動が＋、＋ときたら、当年が＋になる確率が低い => ＋、＋ときたら当年は"ー"と予測する

|2年前|1年前|当年|頻度|
|:---:|:---:|:---:|:---:|
|+|-|+|9|
|+|-|-|4|

変動が＋、ーときたら、当年が＋になる確率の方が高い => ＋、ーときたら"＋"と予測する

用意したもの：

- 気温の変動を調べるプログラム => updown.c
- 2年前、1年前の変動パターンから当年の変動を予測するプログラム => ml1.c

手順：

- 気温データから、前年と比較し変動を計算する
`./updown < data.txt > pm.txt`
結果をpm.txtに保存

- 変動パターンの頻度と当年の変動予測を行う
`./ml1 < pm.txt`

結果：

```
+
+
-
+
+
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
+
+
+
+
-
+
-
+
-
-
+
-
+
+
+
-
+
-
学習結果
+++ : 0
++- : 6
+-+ : 9
+-- : 4
-++ : 7
-+- : 7
--+ : 4
--- : 1
```

学習結果より、+++パターンは頻度0、---パターンは頻度1と、他のパターンに比べて特徴的である。
では、プログラムで予測した変動と、実際の変動を比べてみる。

![スクリーンショット 2017-01-27 2.01.33.png](https://qiita-image-store.s3.amazonaws.com/0/145075/03bc4a38-c7d6-01c6-9aa3-3ed35cec09bd.png)

- 2回連続で気温が低下/上昇した後の予測のように、特徴的な気温変化を示す場合の予測は良好
    => 気温データの特徴が学習されている

- 上昇と下降を繰り返すような場合は良い予測ができない
    => 気温データから注目するべき 特徴が見つけられなかった


# 参考文献
「はじめての機械学習」　小高知宏 著　オーム社
アプリ配布用のQRコード画像をアーティファクトで取得

# はじめに
BitriseのCI機能にはメンバー限定、非限定でアプリを配布できる機能があり、注目しています。
さらに調べていくと、Bitriseのworkflowから`ipaを配布できる機能`の先に

<img width="624" alt="スクリーンショット 2017-01-26 23.19.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/673fb2b4-3d32-a77b-d5d1-6db338eaaa2a.png">


<img width="719" alt="スクリーンショット 2017-01-26 23.17.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/701a2e94-0deb-4d1e-5b55-7e4f7ad81c4e.png">


`QRコードでURLを出す`があります。

<img width="558" alt="スクリーンショット 2017-01-26 23.20.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/0f73c6f8-4f95-0a04-5bb3-c2ee2e0d5b8d.png">

# 不満
ただこれだけではコンソールにechoで表示されるところまで、です。

<img width="778" alt="スクリーンショット 2017-01-26 23.27.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/664b2694-a767-420c-b7db-832dcc3b84fb.png">

画像を取得するにはURLをブラウザで入力し、画像をローカルPCに保存するか
そのままスマホアプリのQRコードリーダーで読み込んで・・・となります。
アーティファクトとしてBuildページで取得できたら！と調整してみました。

# 処理

## 画像ファイルをダウンロード

<img width="377" alt="スクリーンショット 2017-01-26 23.50.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/ba6b3b8f-afad-5db0-b4b0-a3edae8f8d24.png">

QRコード生成時に
`$BITRISE_PUBLIC_INSTALL_PAGE_QR_CODE_IMAGE_URL`という変数が追加されるのでこれを使います。

画像ファイル名は[アプリ名].png、としました。

<img width="646" alt="スクリーンショット 2017-01-26 23.52.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/ba11b914-d7df-5712-b961-b90f495a18f2.png">

## アーティファクトに追加

ダウンロードした画像ファイルを指定し、圧縮は不要としました。

<img width="624" alt="スクリーンショット 2017-01-26 23.19.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/f348fcf8-12de-4ba7-751c-4ccb5c255d26.png">

<img width="634" alt="スクリーンショット 2017-01-27 0.01.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/4ca2c34a-e6ae-edd3-f3f5-40c7d3671dc7.png">

# 結果

<img width="966" alt="スクリーンショット 2017-01-27 0.09.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/20680944-ddff-a9e3-e321-e3a4a21843e4.png">

# WorkFlowを分離

`GenQR_InstallURL`としてQRコード化からアーティファクト追加までを別にしました。

<img width="534" alt="スクリーンショット 2017-01-27 0.29.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/a61adf30-7169-1882-53c3-85a7f1e15ab6.png">

変数自体は引き継がれるのか、ビルド時間は分離されるのかを知りたくて。
変数は引き継がれ、ビルド時間は複数のWorkFlowの合算となりました。

<img width="310" alt="スクリーンショット 2017-01-27 0.31.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/a39b441e-9024-7af1-719e-99bef0c5e052.png">

# さいごに

bitrise.ymlについて、QR画像の指定をした時は当然出るのですが
<img width="547" alt="スクリーンショット 2017-01-27 0.41.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/9a216332-1a2a-6272-e500-366fdf928be5.png">

指定しないと省略される・・・ため、初期状態だとinputsに設定するパラメータ名すらわからない、という状態でした。
<img width="429" alt="スクリーンショット 2017-01-27 0.42.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/22fd57c1-9926-f176-e686-6db5476acd56.png">

https://github.com/bitrise-io/steps-deploy-to-bitrise-io

<img width="562" alt="スクリーンショット 2017-01-27 1.35.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/da6c4320-f280-e9b0-c263-def683d7255e.png">

ソースを見た上でbitrise.yml上でパラメータを指定がまだまだ難しい感じです。
Gmailで外部アカウントのメール受信の遅延を解消する

Gmailで外部アカウントのメール受信の遅延を解消する方法について記載


・手動で更新して取得する方法
設定>アカウントとインポート>他のアカウントでメールを確認:
で該当するメールアドレスの「メールを今すぐ確認する」をクリックする

・転送設定で対応する方法
Gmailの外部アカウントのアカウントの情報は削除して、
外部アカウントのメールサーバから、受信したいGmailアカウントに転送する。
postfixの場合は、ユーザーのホームディレクトリに「.forward」という名前のファイルを作成する。


外部メールアドレス：user@hoge.com
転送先メールアドレス：user@gmail.com
の場合の記載例

```
user@hoge.com,user@gmail.com
```

postfixを再起動

```
service postfix restart
```


以上
HerokuDeployerを使った GitHub から heroku への自動デプロイ

（注）2015年に書いた記事を試験的に Qiita にあげてみたものですので、内容が古くなっています。ご注意ください。

## 動作概要
[HerokuDeployer](https://github.com/himynameisjonas/heroku-deployer)
を参考に。ちと複雑。

役回りは3つ：

- github source：git@github.com:username/xxx-blog.git
- deployer: xxx-deployer.herokuapp.com
- blog: xxx-blog.herokuapp.com

とする。動作としては、

1. ローカルで post などを作成し、ローカルレポに commit
1. github に push (git push origin master)
1. github の hook が働き内容を deployer に渡す
1. それを受けて deployer が blog に deploy する

## 設定

github と blog はすでにあるはずなので、 deployer の作成と三者の接続の設定をする。

### deployer 用 heroku アカウント、アプリの作成
まずblog用のアカウント(username@address.com とする)とは別に、deployer としての heroku アカウントを作成する(username-deployer@address.com とする)。

そのアカウント上で、HerokuDeployer を clone し deployer のherokuアプリも作る。

```
% git clone https://github.com/himynameisjonas/heroku-deployer.git
% cd heroku-deployer
% heroku login
(deployer の e-mail/password を入力）
% heroku create xxx-deployer   # as deployer
% git push heroku master
```

### blog と deployer の接続
まず xxx-blog app と xxx-deployer app を接続する。

#### collaborator の設定
blog用アカウントで heroku の web にログインし、
Personal Apps => xxx-blog => Access => Edit で
deployer用アカウントのメールアドレスを入力し、collaborator に追加する。

#### SSH の設定
blog=deployer をつなぐ SSH Key を作成する。

```
% ssh-keygen -t rsa
(save it to "deploy_rsa")
(empty for passphrase)
```

つなぎ方としては、秘密鍵を deployer に、公開鍵を blog に持たせる。

秘密鍵：

```
% heroku config:set DEPLOY_SSH_KEY="$(cat deploy_rsa)"
```

公開鍵：

heroku の web: username@address.com => Account => SSH Keys => Edit
で deploy_rsa.pub の内容を追加し save。

### deployer - github の接続

続いて deployer app と github のレポをつなげる。

#### SSH の設定
秘密鍵を deployer に、公開鍵を github に持たせる。

```
% ssh-keygen -t rsa
(save it to "blog_rsa")
(empty for passphrase)
```

deploy 側：

```
% heroku config:set xxx-blog_SSH_KEY="$(cat blog_rsa)"
```

github 側：

web: username/xxx-blog repo => settings => Deploy keys => Add Deploy Keys
に blog_rsa.pub の内容を追加。

### secret key の設定

deployer 側：

```
% heroku config:set DEPLOY_SECRET=XXXX  # XXXX は当然秘密のコード
```

### github の web hook の設定

githubのwebから username/xxx-blog repo => settings => Webhooks & Servies に
"https://xxx-deployer.herokuapp.com/deploy/xxx-blog/XXXX"を追加。

これで当該レポに push されたら hook で deployer に更新内容を渡すようになる。

### レポジトリの設定

```
% pwd
heroku-deployer
% heroku config:set xxx-blog_GIT_REPO=ssh://git@github.com/username/xxx-blog
% heroku config:set xxx-blog_HEROKU_REPO=git@heroku.com:xxx-blog.git
```

## 動作確認
適当にポストを追加・修正し commit, git push origin master し、
少し待ってから xxx-blog.herokuapp.com の方に反映されるか確認。

heroku logs を見てみてもよい。

## おまけ

。。。。正直こんなメンドくさいことやらなくても、素直に herokuapp に push したほうがいいような気も。。。prose.io で編集したときは反映されないけど、
一旦 local で origin を pull(fetch+merge) して push heroku すればいいわけだし。
SaaS系負荷計測サービスまとめ 2017年1月

# SaaS系負荷計測サービスまとめ

## SaaS系負荷計測サービスとは
負荷試験を行う際、シナリオなどを元にHTTPリクエストを実行し結果を記録する環境を、SaaSとして提供しているサービスのこと。
一般的な負荷試験ツール(jMeter, Gatlingなど)は、実行する環境を必要とし、大規模なアクセスを行う際はそれに見合ったサーバスペックや台数を用意する必要がある。
一方、SaaSとして提供されている負荷計測サービスを利用する場合、実行環境に関する考慮は不要になる。
また負荷試験ツール単体では実現できない機能が提供されているものもあり、実行環境に関するメンテナンスコスト以外のメリットも享受可能になっている。

## SaaS系負荷計測サービス情報

### 比較表

|  | [loader.io](https://loader.io/) | [Load Impact](https://loadimpact.com/) | [BlazeMeter](https://www.blazemeter.com/) |
|:--------------------:|:---------:|:---------------------------------:|:------------------------------------------------:|
| freeプラン | ○ | ○ | ○ |
| シナリオフォーマット | URL指定 | Lua Script<br>(自動生成サポートあり) | URL指定<br>Taurus<br>jMeter<br>Gatling<br>Locust.io<br>Selenium |
| HTMLリソース読み込み | × | ○ | シナリオ依存 |
| 実行リージョン選択 | - | ○<br>(日本有り) | ○<br>(日本有り) |
| CircleCI連携 | ○ | - | ○ |
| Jenkis連携 | ○ | ○ | ○ |
| Github連携 | ○ | ○ | ○ |
| Slack連携 | - | ○ | - |
| Cloud Watch連携 | - | - | ○ |
| New Relic連携 | ○ | ○ | ○ |

### [loader.io](https://loader.io/)

* 1 URLに対するアクセスなどシンプルな負荷シナリオ向け
* 対象ホストに対して正当な持ち主か確認するVerification機能がある
* freeプランが1分間以内で1万リクエストとなかなか太っ腹

### [Load Impact](https://loadimpact.com/)

* ある程度複雑なシナリオをLuaを使ったシナリオスクリプトで記述可能
* WebページのURLを指定したシナリオ自動生成が可能
* ページレンダリング時のリソースリクエストが自動的に含まれる

### [BlazeMeter](https://www.blazemeter.com/)

* シンプルURL、jMeterやGatlingなどの主要な負荷ツールシナリオに対応
* TaurusというYAML形式で記述するシナリオフレームワークをOSSで公開
* Chrome拡張でシナリオ作成サポート
* スマホでのキャプチャ&リプレイも可能
* シナリオ実行時の帯域制限シミュレーションが可能
* 実行環境としてAWS, GCP, Azureやそれぞれのリージョンが選択可能
* お高い

### その他のサービス

* [Flood IO](https://flood.io/)
  * Selenium or JMeter or Gatlingのシナリオが実行可能
* [Blitz](https://www.blitz.io/)
  * 新規アカウント開設できないため不明
* [Apica LoadTest](https://www.apicasystem.com/load-testing/)
  * 新規アカウント開設できないため不明

## SaaS系負荷計測サービス 利用状況
### グローバル
* Stackshareだと、loader.io, BlazeMeter, Blitzあたりが人気
* https://stackshare.io/load-and-performance-testing

### 日本国内
* 聞いて回った範囲だとjMeter, Gatlingの利用実績はあるがSaaSは使用していないっぽい
* loader.io に関するブログ記事はいくつかある
文章の母音を取得して読み上げにかかる時間を推測する

かいつまんで言えば、「mecab-ipadic-NEologdがすごいという話」です。（すでに同名のタイトルの記事があったので別方向からアプローチしてみました。）

## [mecab-ipadic-NEologd]

形態素解析ライブラリMeCabで最初に用いる辞書にmecab-ipadicがありますが、その辞書は2007年ごろに整備されたもので長らく更新されていませんでした。

インターネット上で公開されている最新のキーワード等を加えたmecab-ipadic-NEologdが公開されています。

## 文章の長さを取得する

本題です。

Wordなどには文章の文字数を表示する機能があります。

しかし、日本語は漢字とかなの入り混じった文章のため、文字数自体が文章の長さとは言い切れない場合があります。（それを利用して文字数を切り詰めたり、水増ししたりでき、Twitterや文字数規定のあるレポートなどでお世話になるわけですが…。）

特にスピーチをする場合、この文章はいったいどれぐらいの時間がかかるのだろう？となり、事前に何回か読むことで時間を計る必要が出てきます。（慣れた人であれば文章の文字数から大体の時間は推測できるらしいですが…。）

読み上げる際の長さを左右する要素を考えてみると、文章の長さを決定するのは読み仮名の長さとほぼ等しいと推測することができます。
従来のmecab-ipadicでは辞書に含まれない単語が出てくると不正確な読み仮名を割り当ててしまい、実用性があるとはいえませんでした。
しかし、mecab-ipadic-NEologdを用いるとほぼ正確な形で読み仮名を得ることができ、実用に足るツールとなりました。

## [SEPSpeechTools]

[v0.0.1]**（必ず2つのZIPをダウンロードしてください。また、設定から辞書（dict）を指定してください。）**

![mainwindow-2.png](https://qiita-image-store.s3.amazonaws.com/0/26144/d45f474f-3fd6-8955-3e2d-5f15bafb94d7.png)

テキストボックスに文章を貼り付けると文章の文字数に加えて音数を表示します。

音数の算出方法は以下の通りです。

* 拗音（`ゃ` `ゅ` `ょ`等）を0母音とします。
* 促音（`っ`）を0.5母音として数えます。
* 記号のうち、句点（`。`）や長音（`ー`）といったタイミングに関わるものを1母音として数えます。
* その他の記号は0母音として扱います。
* 読みの取得できない未知の単語については文字数をそのまま適用します。

どのように読み仮名を得たのかルビで確認する機能も付けました。

![speechdialog.png](https://qiita-image-store.s3.amazonaws.com/0/26144/6422cf46-562c-bfe8-b9f5-75a7fd671bf5.png)

さらに、「Waveにする」ボタンを押すことで機械音声で読み上げたWaveファイルを出力する機能も付けました。

機械音声プログラムは[棒読みちゃん]に付いていた旧版のAquesTalkライブラリをハックして使ってみました。（旧版のライセンスをざっと読む限りは再配布可能であると理解したのですが、間違っていたら改めます。[AquesTalk2]というのも気になっているので…。）

ソフトウェアのライセンスはGPLv3で公開しています。
だいぶニッチなソフトウェアですがpull-reqや機能要望お待ちしています。

[mecab-ipadic-NEologd]: https://github.com/neologd/mecab-ipadic-neologd
[SEPSpeechTools]: https://github.com/info-labs/sep-speech-tools
[v0.0.1]: https://github.com/info-labs/sep-speech-tools/releases/tag/v0.0.1
[棒読みちゃん]: http://chi.usamimi.info/Program/Application/BouyomiChan/
[AquesTalk2]: http://www.a-quest.com/products/aquestalk.html
Excel VBA 選択されたセルの値を一括でX倍する

選択されたセルの値を一括でX倍することが出来るマクロです。
例えば実験データをまとめる時にVをmV単位に直したいといった時に便利です。

マクロを使わない場合は、近くに1,000倍や1/0000倍するためだけの表を作ったりしますが、
この記事のマクロを使うと、処理したいセルを範囲選択してマクロを実行するだけで済みます。

※VBAでの操作はUndoのための履歴が残らないので注意して下さい。


![image](https://qiita-image-store.s3.amazonaws.com/0/36514/7109429a-094a-13e1-ea04-20ccdb882973.png)

```

Sub MultiplyBy1000()
  Call MultiplyByX(Selection, 1000)
End Sub

Sub DivideBy1000()
  Call MultiplyByX(Selection, 0.001)
End Sub

Sub MultiplyByX(ByRef R As Range, X As Double)
    
  Dim TempValue As Variant
  Dim NumberOfRows, NumberOfColumns, AreaIndex, RowIndex, ColIndex As Integer
  
  For AreaIndex = 1 To R.Areas.Count
    
    TempValue = R.Areas(AreaIndex).Value ' 指定の範囲の値を変数にコピーする。
        
    ' TempValue (Variant変数)に格納される値はRangeオブジェクトが指す範囲に応じて配列かスカラのどちらかになる。
    ' 連続した複数セルが選択されている場合は2D配列(1行や1列でも2D)
    ' 単一セルの場合はスカラ変数
    
    If IsArray(TempValue) Then '複数セルの場合
      
      NumberOfColumns = UBound(TempValue, 1)
      NumberOfRows = UBound(TempValue, 2)
  
      For ColIndex = 1 To NumberOfColumns
        For RowIndex = 1 To NumberOfRows
          TempValue(ColIndex, RowIndex) = TempValue(ColIndex, RowIndex) * X
        Next
      Next

    Else '単一セルの場合
      TempValue = TempValue * X
    End If

    R.Areas(AreaIndex).Value = TempValue
  Next
End Sub
```


次のコードでコンテキストメニューに追加するととても便利です。
![image](https://qiita-image-store.s3.amazonaws.com/0/36514/7d2382a2-4935-0cf3-76a5-591c9124ebcf.png)

```
Sub AddContextMenu()  
  Dim myCommandBar As CommandBar
  Dim myCommandBarControl As CommandBarControl
  Set myCommandBar = Application.CommandBars("Cell")
  myCommandBar.Reset

  '↓常に必要な機能ではないのでExcelが終了したら自動で登録が解除されるようにTemporary=Trueにしています。
  Set myCommandBarControl = Application.CommandBars("Cell").Controls.Add(Before:=5, Temporary:=True, Type:=msoControlPopup) 

  With myCommandBarControl
    .Caption = "定数をかける"
    With .Controls.Add
      .Caption = "x1000"
      .OnAction = "MultiplyBy1000"
    End With
    With .Controls.Add
      .Caption = "1/1000"
      .OnAction = "DivideBy1000"
    End With

  End With
End Sub
```

参考
VBA(Excel)高速化対策 -配列化編-
http://qiita.com/sango/items/c46a30c62e154077a0c7

右クリックメニューやサブメニューにマクロを登録／削除するには
http://www.atmarkit.co.jp/ait/articles/1408/25/news030.html
ヘイトが溜まりがちなdcコマンドの活用方法を探る

# 紛らわしいdcコマンド

今まで何回、`cd`と`dc`をtypoしましたか？
私は数え切れません。

`cd`と`dc`を間違えて以下のように入力してしまうと、何も起こらず処理が返ってきます。

```bash
$ dc /tmp
```

移動したものと思ってコマンドを続けてしまい、何かを壊してしまった方も居るのではないでしょうか。
そのたびに`dc`コマンドへのヘイトが溜まり、`alias`で`cd`になるようにしている方も多いかと思います。

そんな不憫な`dc`コマンドですが、この記事では「使えるよ！」という所を紹介し、名誉挽回に努めたいと思います。

# そもそも何をするコマンドなのか

`dc`コマンドは逆ポーランド記法に対応した電卓です。
また、レジスタやマクロ、ファイル読み込みなども使える優れものです。

# 使い方

```bash
$ dc
1 2 + 3 + 4 * p
```

このようにすると、`24`が出てきます。
中置記法では `(1 + 2 + 3) * 4`ですね。
最後の`p`で出力です。

演算子は四則演算、平方根やべき剰余まであり、とても充実しています。
色々な機能があるので、気になった方はぜひ調べてみてください。

# どんな時に使えるか

## 計算が書き下せる

逆ポーランド記法なので、頭に浮かんだ計算をそのまま記述できます。
例えば、以下のような電卓に入力するのがめんどくさそうな式を考えます。

$$\frac{27}{(1+2)^{2}} * 2$$

こんな計算も、

「27を、1と2を足して2回掛け合わせたもので割って、2を掛ける」
=> 「27 1 2 + 2 ^ / 2 *」

と、日本語がそのまま式の順序になります。
括弧などが入って少し複雑な計算だと効果を発揮します。

## コードの行数を縮めたい時には便利

強力な演算子が多く、マクロやレジスタが使え、独特な記法で短く書けるため、コードゴルフには役立つと思われます。


# まとめ

上記のような利点があるdcコマンドですが、
複雑な式になってくると、他のコマンドやプログラムを書いたほうが分かりやすく、かつ楽なことが多いです。
「微妙に括弧とか多くて計算するのが大変、でもプログラムを書くほどではない」という絶妙な式に遭遇する人はどれくらいいるのでしょうか。

結局、「普通は使わないので`cd`に`alias`するのが良い」と思います。
名誉挽回、できませんでした。

活用されている方、是非コメントを下さい。
Atom のタイトルバーを custom-title で自由に変える


# custom-title について

- https://atom.io/packages/custom-title
- Atom のタイトルバーの表示を好きなように変更できるプラグイン

# 設定例

## フルパスを表示する場合

```
<% if (filePath) { %><%= filePath %><% if (gitHead) { %> [<%= gitHead %>]<% } %><% } else { %><%= fileName %><% } %>
```

=> `/Users/username/workspace/hoge_app/app/models/user.rb [master]` のように表示される

## プロジェクト以下のパスを表示する場合

```
<% if (relativeFilePath) { %><%= projectName + "/" + relativeFilePath %><% if (gitHead) { %> [<%= gitHead %>]<% } %><% } else {%><%= fileName %><%} %>
```

=> `hoge_app/app/models/user.rb [master]` のように表示される
ViewPager + FragmentPagerAdapterでFragmentが表示されたタイミングで処理させる

## 概要
ViewPagerとFragmentPagerAdapterを使ってFragmentをスワイプ操作で切り替える画面を作ると、デフォルトでは表示しているページの次のページも一緒に読み込むようになっています。

Fragmentの状態遷移でいうと、生成時に1ページ目と2ページ目が`onResume`まで呼ばれ、2ページ目に移動したら3ページ目が`onResume`まで呼ばます。

そのためFragmentが表示されたタイミングで何かしたい場合は`onResume`だと上手くいきません。

## 解決策
`onResume`ではなく`setUserVisibleHint`を使います。
https://developer.android.com/reference/android/support/v4/app/Fragment.html#setUserVisibleHint(boolean)

ViewPagerとFragmentPagerAdapterを使っている場合、`setUserVisibleHint`はページの移動が完了した時に呼ばれ、表示中のFragmentでは引数がtrueになり、両隣のFragmentでは引数がfalseになります。

実装はこんな感じです。

```java
public class SamplePageFragment extends Fragment {

    ....

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        
        if (isVisibleToUser) {
            // 表示時にさせたい処理を書く
        }
    }

    ....

}
```

## 注意点
`setUserVisibleHint`は新しくページを読み込もうとしたとき（Fragmentを新しく生成するとき）には`onCreate`や`onCreateView`よりも先に呼ばれます。
そのためViewの操作をしたい場合は、Viewが生成されているかチェックする必要があります。

例えば表示されたタイミングでWebViewの読み込みをさせたい場合は以下のようにします。

```java
public class SamplePageFragment extends Fragment {

    ....

    private WebView mWebView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_web, container, false);
        mWebView = (WebView) view.findViewById(R.id.web);

        if (getUserVisibleHint()) {
            // onCreateViewが呼ばれたときに、ページが表示中だった
            mWebView.loadUrl(getUrl());
        }

        return view;
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser && mWebView != null) {
            // ページが表示されて、Viewも生成されたときにURLを読み込む
            mWebView.loadUrl(getUrl());
        }
    }

    ....

}
```

## 参考
http://stackoverflow.com/a/25676323
快適なC++生活のためにスクリプト言語を使おう6　-Python用のライブラリとしてプログラムを開発してはどうだろうか

「Pythonでscriptableになるようにプログラムを開発してはどうだろうか」を改題しました。


C++で開発しているが開発速度があがらなくて苦労している。しかし、その苦労は、Pythonとの連携を前提とした枠組みを使えば、開発速度を上げることができることを知っている。その方策を示します。

　今までに、pythonの使える市販アプリケーションを利用したことがある。そのとき感じたことを元に、Pythonでscriptableになるようにプログラムを開発することを提案します。


###**GUI操作の限界**
　アプリケーションの機能を利用するために、GUIでメニューから選択して実行を繰り返すのでは、まとまった量の処理をするのが大変になります。
###**固有のスクリプトの限界**
　だからといって、そのアプリケーション固有のスクリプト言語を作るのは得策ではない。単なるジョブの投入だけの単純なものであっても、いつの間にか変数がほしくなったり、制御構文がほしくなったりするのはよくあることだ。そのような単純なはずの固有のスクリプト言語をメンテナンスするのは面倒な作業になっていく。
###**scriptableなアプローチ**
　このような状況を打破するアプローチのひとつが、アプリケーションをpythonでscriptableに作ることです。Pythonは商用製品に用いてもよいライセンスであり、C/C++言語で書かれたモジュールをpythonから利用することができます。
　私が利用したそのアプリケーションでは、そのアプリケーションにリンクされたpythonが最初から用意されていて、そのpythonから、そのアプリケーションのライブラリをpythonのライブラリとして利用できるようになっていました。そのことは次のような利点を持っています。

###**利用者にとっての利点**
・スクリプト言語としては、使い慣れたpython言語を使える。
・アプリケーションの機能は、pythonのクラスや関数として利用できる。
・python言語の豊富なライブラリを使える。
・site-packagesにライブラリを追加してinstallできるので、機能を追加できる。

###**アプリケーション開発者にとっての利点**
次にアプリケーション開発者として見たときの利点はこういうのがあると思う。
・アプリケーションのためのスクリプト言語として、使いやすい最強の言語の一つを使える。
・動作させたいことの検証を充実した標準配布のライブラリ、準標準的なサードパーティのライブラリで早めにできる。
・C/C++による最適化が必要ではないときには、Pythonの既存のライブラリ(標準ライブラリ、その他のPythonライブラリ)を使うことで開発の工数を節約することができる。

・Pythonの拡張としてC/C++言語で書かれたモジュールを実装するので、モジュールの設計を意識するようになる。
・C/C++で書かれたライブラリも、Pythonインタプリタからhelpで使い方を参照することができる。
・Python言語のインタフェースではモジュールの単体テストがしやすい。
・pythonインタプリタを使って対話的にモジュールの利用ができるので、モジュールを臨機応変の使い方ができる。
・OS依存性が少ないライブラリで、マルチスレッドのコードが書きやすい。(どのライブラリはthread safeだったはずなどと心配する必要がない。)
・プログラムの上位層の設計が、pythonのスクリプトにできるので、上位層の見直しをしやすい。
・プログラム全体ができあがっていない時点でも、実装済みのモジュールの評価ができる。
・モジュールの評価のためにpythonの[matplotlib](http://matplotlib.org/)などのグラフのライブラリでチェックするのが簡単です。
・そのような評価をプログラムの部品レベルで実行できるので、実装するプログラムの根幹をなすアルゴリズムについての理解を深め、早めに誤解を解く事ができます。
・C/C++で開発する部分は、Pythonの拡張モジュールとして実装するので、C/C++部分が依存性が込み入った厄介なライブラリになることを防げます。

・Python用のライブラリとして開発するので、作成したライブラリの単体テストがしやすくなります。
　C++の巨大なアプリケーションとして作成すると、必要な変数の初期化を完了させて、テストを可能な準備をして、テスト用のアプリケーションを作るまででも一作業になります。

・Python用のライブラリとして開発するので、組み込むモジュールの設計を十分に決定して、出戻りの生じない設計として確定させるのがしやすい。依存性を減らすことが必須になるので、externなどのC/C++言語で生じる設計上の荷物になるものが減らすことができます。


　[ROS](http://www.ros.org/)にしてもTensorFlowにしてもpythonインタフェースが提供されている。あなたの開発の分野でもPythonを使ってみてはどうでしょうか？

-----------------------------------------------------------------------
[Pythonをスクリプト環境として組み込んでいるもの](https://ja.wikipedia.org/wiki/Python%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E8%A3%BD%E5%93%81%E3%81%82%E3%82%8B%E3%81%84%E3%81%AF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E4%B8%80%E8%A6%A7)

画像関係のソフトウェアでは次のようにPythonをスクリプト環境が利用できるものが多い。
Maya
Blender
Corel Paint Shop Pro
GIMP
Inkscape
Metasequoia
Poser
RenderMan
BitBucket Pipelinesのテスト環境とデプロイ環境に違うイメージを使用する

BitBucket Pipelinesが便利そうだったので、いろいろ遊んでた。
その中で、作ってるアプリケーションがNodeだったのでテストはNodeのDockerイメージ使いたいんだけど、デプロイはPythonが必要なのでPythonのDockerイメージ使いたい。
っていうわがままを実現するためにやってみたことをまとめておく。
（もっとまとも？な方法を知ってる方がいたら教えてください）

# やりたいこと
- `node:7.4.0`のイメージでテストを実行したい
- テストが成功したら、`python:3.5.1`のイメージでデプロイを実行したい

# 結論
できました。

以下のことをやります。

## script/run_custom_pipelines.sh を作成
パイプラインのstepの中で、別のパイプラインをキックするためにcurlを実行するスクリプトを用意します。

```bash:script/run_custom_pipelines.sh
#!/bin/bash
###
# set variables:
#
# $PIPELINES_REQ_USER
# $PIPELINES_REQ_PASSWORD
# $CUSTOM_PATTERN
###

curl -X POST -is -u "$PIPELINES_REQ_USER":"$PIPELINES_REQ_PASSWORD" \
  -H 'Content-Type: application/json' \
  https://api.bitbucket.org/2.0/repositories/"$BITBUCKET_REPO_OWNER"/"$BITBUCKET_REPO_SLUG"/pipelines/ \
  -d '
  {
    "target": {
      "commit": {
        "hash": "'$BITBUCKET_COMMIT'",
        "type": "commit"
      },
      "selector": {
        "type": "custom",
        "pattern": "'$CUSTOM_PATTERN'"
      },
      "type": "pipeline_commit_target"
    }
  }'
```

## bitbucket-pipelines.yml を作成
masterブランチのパイプラインの最後で先ほどのスクリプトを実行しています。
（ここでは実際にデプロイするスクリプトではなく、pythonのバージョン出力しているだけです）

```yaml:bitbucket-pipelines.yml
# This is a sample build configuration for Javascript.
# Check our guides at https://confluence.atlassian.com/x/VYk8Lw for more examples.
# Only use spaces to indent your .yml configuration.
# -----
# You can specify a custom docker image from Docker Hub as your build environment.
image: node:7.4.0

pipelines:
  default:
    - step:
        script: # Modify the commands below to build your repository.
          - npm install --global mocha
          - npm install
          - npm test
  branches:
    master:
      - step:
          script:
            - npm install --global mocha
            - npm install
            - npm test
            - export CUSTOM_PATTERN=deploy_to_production
            - bash script/run_custom_pipelines.sh
  custom:
    deploy_to_production:
      - step:
          image: python:3.5.1
          script:
            - python -V
```

## リポジトリの環境変数を設定
`PIPELINES_REQ_USER`と`PIPELINES_REQ_PASSWORD`を設定します。
curl実行時に認証情報として使用するユーザー名とパスワードです。

![スクリーンショット 2017-01-27 0.png](https://qiita-image-store.s3.amazonaws.com/0/57377/7ddf15e6-86bf-c2be-7da5-bd3e731e0eb6.png)

##　確認
masterブランチにpushされるとテストが走って、成功したら`deploy_to_production`も実行されます。

masterブランチ以外にpushすると、テストをするだけです。

<img width="864" alt="スクリーンショット 2017-01-27 0.16.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/57377/a169e0ff-ac68-0b8a-46e7-0e1560cebc73.png">

<img width="864" alt="スクリーンショット 2017-01-27 0.17.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/57377/be8dfada-ca35-754d-a736-96501958894b.png">
「webpack備忘録、癖があるがクセになる。」　=　番外編　「 CSS hot Module Replacement 」

#####[webpack](https://webpack.js.org/) 使ってみると便利なんですが題目のように『癖があるがクセになる』 ----> なりまりました、私は。
#####webpack は build & bundle の tool であるのですが、中でも提供toolである webpack-dev-server で利用可能な機能に HMR(Hot module Replacement) という開発段階において、画面推移せずに変更箇所を更新する機能があるのは周知の事実ですが...　。
#####この機能において extract-text-webpack-plugin　を使用し stylesheet を link で使用すると HMR　が機能せず画面全体を reload しないといけません。
#####自動 reload は gulp grunt 等などで実現できることはもう当たり前ですが、しかし折角の機能を利用しないのも勿体無い。まあ、それが理由かは存じませんが link で使用した時に HMR を使おうと stackoverflow 等で話題になっているのを見かけました。

#####そんな中、javascriptを中心とした海外の情報共有site [60devs.com](https://60devs.com/webpack-hot-reload-css-modules.html) にて興味深い内容を見つけたので紹介したいと思います。

#####Author の一人である [ Ruslan Prytula](https://60devs.com/authors/ruslan.prytula/)　さんの記事です。

#Webpack: hot reload for CSS modules
######In this post, I’ll show you a way to make hot reloading work for stylesheets in a non-React project with enabled CSS modules. I’ll use SASS as my CSS preprocessor, but it’s going to be pretty much the same for other ones. By the way, it’s going to be a hackish way to get things done :)

#####React なんかでは可能なようなんですが、React を使わない（フレームワークに振り回されたくない）場合なんかを想定してるようですね。



#CSS modules in webpack
######Once css-loader is installed, CSS modules could be enabled / disabled using the modules parameter. For example:

```

// webpack.config.js
...
module: {
  use: [{
    test: /\.css$/,
    loaders: ['style', 'css?modules', 'sass']  // CSS を cssModule として扱います。
  }]                                           // React なんかではおなじみですかね。
}
...

```

```

// components/helloWorld.js

let style = require('./helloWorld.scss')

window.onload = () => {
  document.body.innerHTML = `<div class="${style.component}">hello world</div>`
}
// cssmodule にすると ${style.component} で参照できます。

```
```

/* components/helloWorld.scss */

.component {
  padding: 20px;
  background-color: gold;
  color: #fff;
}

```
```

// your-main-entry-file.js
...

if(module.hot) {
  const FILE_NAME = 'bundle.css'
  let file = ''
  let el = document.querySelector(`link[href*="${FILE_NAME}"]`)
  let {href} = el

  function httpGet(url, callback) {                    // httpGet関数を定義
    let xhr = new XMLHttpRequest()

    xhr.addEventListener('load', () => callback(xhr))
    xhr.open('GET', url)
    xhr.send()
  }

  module.hot.accept()                                 // これで module のやり取りが可能に。
  module.hot.dispose(() => {                          // dispose() で module の入替処理。
    let url = `${href}?d=${new Date().getTime()}`

    httpGet(url, ({responseText}) => {
      if(responseText == file)
        window.location.reload() // js was changed
      else
        el.href = url
    })
  })

  httpGet(href, ({responseText}) => {
    file = responseText
  })
}

```

######要するに、Ajax で bundle.css の変更前と変更後を取得して HMR をしているようです。github の sample コードを触ってみたんですが、バッチリ HMR できてました。
######フレームワークは便利なんですが、学習コストがかかるものも多いので良いのではないでしょうか？
HaskellのRank2Typesがだいぶわかるやつ

　存在型はheterogeneousリストなどの例がわかりやすいですけど、Rank2Types (or RankNTypes) はなかなかわかりやすい例がない気がしますー。
今回、存在型とRank2Typesを使って、いい感じなコード例を作ったので報告いたします :)

- What is Rank2Types ?
    - どのようなものであるかは、こちらで示されています
    - [haskell.org - Rank-2 Types](https://prime.haskell.org/wiki/Rank2Types)


# 仮定する知識
1. 存在型 (ExistentialQuantification)
    - ここでわかる -> [Haskell/存在量化された型 - Wikibooks](https://ja.wikibooks.org/wiki/Haskell/%E5%AD%98%E5%9C%A8%E9%87%8F%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E5%9E%8B)
2. IsString (OverloadedStrings)
    - 文字列リテラルを`Text`型や`ByteString`型として (`IsString a => a`型として) 扱えるようになるやつ
    - 具体的には`s = "ahoge" :: IsString a => a`が有効なコードになる


# ここでわかる知識
1. 2ランク多相 (Rank2Types)
    - が用いられた事例のうち一つがわかる

# 例

```haskell
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE Rank2Types #-}

import Data.String (IsString)
import Data.Text (Text)
import Shelly (run_)
import System.EasyFile (doesFileExist)

type FilePath' = forall s. IsString s => s

flagFile :: FilePath'
flagFile = "/tmp/flag"

-- ここに、shellyを使ったほうがいい事情があるとします。
-- 故にshelly使います (※)
createFlagFile :: IO ()
createFlagFile = shelly $ run_ "rm" ["-f", flagFile]

flagFileExists :: IO Bool
flagFileExists = doesFileExist flagFile
```

- ※ 実際は「xmonadでシェルスクリプトライクなことしたかったけど、`spawn`だと型付けできなかったりした」というあれがあった
- 問題は、期待する文字列型の不一致
    - `run_ :: FilePath -> [Text] -> Sh ()`
        - [**Text**]
    - `doesFileExist :: FilePath -> IO Bool`
        - **FilePath**
        - FilePath = String


# 解説
　ここで存在型とRank2多相を同時に用いた

```haskell
type FilePath' = forall s. IsStrings s => s
```
という型があって、
これは`ExistentialQuantification`が無いと　そもそも構文的に許されませんし（右辺に`forall`がある）
`Rank2Types`が無いと　この**深さ**のforallは許されないぷりっ！

## 深さ
　Rank2というのは`forall`の深さが2であるということらしいです！
（この時点で、2ランク多相が一般化された、Nランク多相(RankNTypes)のことについてわかっていない）

　ランク1多相というのは、つまりは通常の多相です。
具体的には
```haskell
f :: a -> a
```
これなの。

しかしこれは、[こちら](https://prime.haskell.org/wiki/Rank2Types)で示されている通り

```haskell
g :: (a -> a) -> (Bool, Char)
g f = (f True, f 'a')
```
このfがランク1多相なので
`f :: a -> a`　が
`f :: Bool -> Bool`　なのか
`f :: Char -> Char`　なのか
が決定できないぷり。 ぷりぃ……。

ここでランク2多相にすること

```haskell
g :: (forall a. a -> a) -> (Bool, Char)
g f = (f True, f 'a')
```
によって、解決されます！


## 解決
　という理由により「TextでもStringでもある型のシノニム」として

```haskell
type FilePath' = forall s. IsString s => s
```
を導入し

```haskell
flagFile :: FilePath'
flagFile = "/tmp/flag"

-- 1
createFlagFile :: IO ()
createFlagFile = shelly $ run_ "rm" ["-f", flagFile]

-- 2
flagFileExists :: IO Bool
flagFileExists = doesFileExist flagFile
```

このような2つの決定をすることができました！ ということなの！


かしこまっ！


# 終わり
この記事は、プリパラ2期を見ながら書かれたぷりっ。
ぷしゅ〜〜。
Rubyの環境構築

# やったこと
* CentOSにRubyをバージョンアップしようとしたが，うまくいかなかった．
なので，まず以下のサイトを参考に行った  
http://qiita.com/Fendo181/items/d14ebfb148223c8e5ecb

* rbenvを使ってインストールしようとしたが，うまくいかなかったので，手動でインストール作業をした．
http://ref.xaio.jp/ruby/install/linux

（追記）
以下のサイトを使ってトラブルシューティング
* http://ztbuz.hateblo.jp/entry/2013/12/14/193235

# 手動でインストールの手順
`curl`コマンドを用いてソースをダウンロードする

```
curl -O https://ftp.ruby-lang.org/pub/ruby/2.2/ruby-2.2.5.tar.gz
```

ダウンロードしたファイルを解凍する

```
tar xfvz ruby-2.2.5.tar.gz
```

解凍したディレクトリに移動する

```
cd ruby-2.2.5
```

コンパイルとインストールを行う
-> スーパーユーザで以下のコマンドを実行すること

```
./configure
make
make install
```

Rubyがインストールされていることを確認する

```
ruby -v
```