OmniAICreator/Qiita-1.07M huggingface dataset:
rubymine + ideavim 突然escapeキーが効かなくなった

## 環境

* MacOS High Sierra 10.13.3
* rubymine 2018.1
* ideavim 0.49

## 現象
突然rubymineのescapeキーが効かなくなった。ずっとrubymine+vimで開発してきた私が困っていた。再インストールしても直してくれなかった。

## 解決 
いつの間に「Vim Emulator」の選択を取り消した。そのせいだ！大騒ぎしました。再選択したら、効くようになった。

![Screen Shot 2018-04-18 at 9.18.56.png](https://qiita-image-store.s3.amazonaws.com/0/37718/0260c00a-08fb-ed45-fb30-e467afd1171e.png)

## 参照
https://www.jetbrains.com/help/idea/using-product-as-the-vim-editor.html
VirtualBox上のCentOSの解像度を変更する

## はじめに

[VirtualBox に CentOS7 をインストール](https://qiita.com/tamago3keran/items/260899458959d3214dcf)したはいいのですが、 ディスプレイの解像度が低すぎて、正直作業がやりづらい。。。ウィンドウを最大化しても解像度が低いまま。。。

調べてみると、解像度の変更は結構面倒くさそうだったので、忘れないためにもおこなった作業をまとめてみました。

## 環境

- VirtualBox: 5.2.6r120293
- ホストOS: macOS Sierra 10.12.6
- ゲストOS: CentOS 7.4-1708

## 解像度の変更方法

### Guest Additions のインストール

`CentOS7` を起動する。

![スクリーンショット 2018-04-17 23.50.18.png](https://qiita-image-store.s3.amazonaws.com/0/186009/59b0bf4d-498e-2b8a-bc08-c41170b46e39.png)

`VertualBox VM` のメニューバーにある `Devices` をクリックし、 `Insert Guest Additions CD image...` をクリックする。

![スクリーンショット 2018-04-17 23.52.48.png](https://qiita-image-store.s3.amazonaws.com/0/186009/1fa885fc-085b-8265-af21-668cbd67ec87.png)

### VBoxGuestAdditions.iso のマウント

先にインストールした `VBoxGuestAdditions.iso` を `/mnt/cdrom` にマウントする。

```console:実行コマンド
# mkdir /mnt/cdrom
# mount /dev/cdrom /mnt/cdrom
```

### 依存パッケージのインストール

```console:実行コマンド
# yum -y install bzip2
# yum -y install gcc
# yum -y install kernel-devel
```

### VBoxGuestAdditions をインストール

```console:実行コマンド
# sh /mnt/cdrom/VBoxLinuxAdditions.run
```

### grab ファイルの変更

```diff:/etc/default/grub
  GRUB_TIMEOUT=5
  GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
  GRUB_DEFAULT=saved
  GRUB_DISABLE_SUBMENU=true
  GRUB_TERMINAL_OUTPUT="console"
- GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
+ GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet vga=775"
  GRUB_DISABLE_RECOVERY="true"
```

`vga=xxx` で解像度を変更することができるようです。
`vga` と解像度の関係を表した表を以下のページで確認できます。

=> https://en.wikipedia.org/wiki/VESA_BIOS_Extensions#Linux_video_mode_numbers

### grab ファイルの反映

```console:実行コマンド
# grub2-mkconfig -o /boot/grub2/grub.cfg
```

### 再起動

```console:実行コマンド
# shutdown -r now
```

これで解像度が変わっているはずです。
電子工作 > Using Bipolar Transistors As Switches > Bipolar Transistorの式

### 対象

5V 120mA消費の負荷に対して電流のON、OFFをする。

### Bipolar Transistor or MOSFET

電流制御か電圧制御か。

その他の違いについても学習中。

### Bipolar Transistorの式

以下にBipolar Transistorの式が掲載されている。

Using Bipolar Transistors As Switches
http://www.rason.org/Projects/transwit/transwit.htm

式について整理する。

#### R1の式

以下のカッコ内の表記はこちらで定義したもの。

- Maximum required current (I_req): 100 mA
- minimum hFE (hFEmin): 100
- 1.3 : 30% more current than what is needed
- Minimum base current (I_base_min) = I_req / hFEmin 
- 余裕を持ったベース電流 (I_base_margin) = I_req / hFEmin * 1.3
- Supply Voltage (Vcc): 12 V

```math
R1 = \frac{Vcc}{I_{req} / hFEmin * 1.3}
```

https://ideone.com/LSQX5D

```py

I_MARGIN = 1.3  # 30 % more current than what is needed
Vcc_V = 12.0  # supply voltage
hFEmin = 100  # minimum hFE
Ireq_A = 0.1  # required current

denom = Ireq_A / hFEmin * I_MARGIN
r1 = Vcc_V / denom
print(r1)

```

```txt:run
9230.76923076923
```

リンク先と同じ値になった。

自分の知りたい構成の場合のR1は。

https://ideone.com/QwaRMD

```txt:run
6410.25641025641
```

[R1=330Ωにしている例](https://raspberrypi.stackexchange.com/questions/62220/how-do-i-control-gpio-connected-fan-via-code-at-a-certain-cpu-temperature/62232)では電流が20倍流れることを期待するのだろうか?

20倍も流すと。。。

@ ハルロック by 西餅さん
@ 1巻 1Ω 電子の芽 
> 電気全部景気良く流したら部品がパーンってなるだろか！
> 君は電気全部流し侍か！

### link

トランジスタのスイッチ動作関連のリンク

- [モータのOn/Off制御法](http://www.picfun.com/motor03.html) @ 電子工作の実験室
- [トランジスタ回路入門](http://www.asahi-net.or.jp/~bz9s-wtb/circuit.htm) by わたさん
    - [第2章 トランジスタをスイッチとして使う](http://www.asahi-net.or.jp/~bz9s-wtb/doc/circuit/No1/tic1c2a.pdf)  by わたさん
- [YouTube: Electronic Basics #22: Transistor (BJT) as a Switch](https://www.youtube.com/watch?v=WRm2oUw4owE) by GreatScott!
- [ダイオードとトランジスタの基本特性](http://www.ibe.kagoshima-u.ac.jp/edu/expIII/Files/diodeGr1.pdf) 
    - [電気・電子回路](http://www.ibe.kagoshima-u.ac.jp/edu/expIII/index.php?%E9%9B%BB%E6%B0%97%E3%83%BB%E9%9B%BB%E5%AD%90%E5%9B%9E%E8%B7%AF)
Python3 range関数を利用する

# python3でrange関数を利用する

range関数の引数は整数しか指定することが出来ません。

## 第1引数のみ指定する

for文でrange関数に第1引数のみを設定すると、0を開始値として第1引数で指定された回数まで処理を行うことが出来ます。

```python
for i in range(5):
    print('ループ：{}'.format(i))

ループ：0
ループ：1
ループ：2
ループ：3
ループ：4
```

## 第2引数まで指定する

第1引数(開始値)から第2引数(停止値)の１つ前の整数まで処理を続けます。

```python
for i in range(1 , 5):
    print(f'ループ：{i}')

ループ：1
ループ：2
ループ：3
ループ：4
```

## 第3引数まで指定する

第1引数(開始値)から第2引数(停止値)の１つ前の整数まで処理を続けます。第3引数で停止値までの増分を指定します。デフォルトは1です。

```python
for i in range(1 , 10 , 2):
    print(f'ループ：{i}')

ループ：1
ループ：3
ループ：5
ループ：7
ループ：9
```

## range関数で生成された変数の型を調べる

```python
r = range(100)

print(r)
print(type(r))

range(0, 100)
<class 'range'>
```
range型であることが分かります。

## range関数で生成された変数から指定範囲を取り出す

[shiracamus](https://qiita.com/shiracamus "shiracamus")さんから教えていただいたように、listのスライスのように、rangeのスライスを取り出せたりします。面白いですね。

```python

>>> r = range(100)
>>> r
range(0, 100)

>>> r[50:]
range(50, 100)

>>> r[-10:]
range(90, 100)

```
Python3 偶数判定

# pythonで偶数、奇数判定を行う

今更感満載ですが、メモ

```python
def is_even(num):
    if num % 2 == 0:
        return True
    else:
        return False

print(is_even(0))
print(is_even(1.5))
print(is_even(2))
print(is_even(3))

True
False
True
False
```

コメントで指摘いただいているように、もっと簡素化することもできますね！

```python

def is_even(num):
    return num % 2 == 0

```
range関数で0から9までの数が偶数か調べる

```python

for i in range(10):
    print('{}.is_even:{}'.format(i, is_even(i)))

0.is_even:True
1.is_even:False
2.is_even:True
3.is_even:False
4.is_even:True
5.is_even:False
6.is_even:True
7.is_even:False
8.is_even:True
9.is_even:False

```
Unityでマテリアルの未使用のプロパティを削除してサイズを減らす

マテリアルのシェーダを切り替えると未使用のプロパティがたまっていく。(Unity 2017.3.1p3で確認)
例えば次のようにしてマテリアルを作るとする。

- Createのメニューからマテリアルを作成する(デフォルトでStandardシェーダがつく)
- パーティクルで使うのでシェーダをParticle/Additiveに変更する

このときマテリアルのパーティクル用のシェーダにしてもStandardシェーダのプロパティが残ったままになる。

![material_property_debug_ss.png](https://qiita-image-store.s3.amazonaws.com/0/37221/a754690c-4be5-1c33-4c69-080fce1aae6a.png)


デバッグ表示すると `Unlit/Color` シェーダでも `_BumpMap` などのプロパティがついている。

## 未使用のプロパティを削除する

なので削除するエディタ拡張を書いた。マテリアルに割り当てられているシェーダのプロパティに存在しないプロパティは削除する。

```csharp
[MenuItem("Assets/Delete Unused MaterialProperty")]
public static void DeleteUnusedMaterialProperty()
{
    var m = Selection.activeObject as Material;
    if (m == null)
    {
        return;
    }

    if (m.shader == null)
    {
        return;
    }

    HashSet<string> properties = new HashSet<string>();
    int count = ShaderUtil.GetPropertyCount(m.shader);
    for (int i = 0; i < count; i++)
    {
        string propName = ShaderUtil.GetPropertyName(m.shader, i);
        properties.Add(propName);
    }

    var so = new SerializedObject(m);
    var sp = so.FindProperty("m_SavedProperties");

    var texEnvSp = sp.FindPropertyRelative("m_TexEnvs");

    for (int i = texEnvSp.arraySize - 1; i >= 0; i--)
    {
        string propName = texEnvSp.GetArrayElementAtIndex(i).FindPropertyRelative("first").stringValue;

        if (!properties.Contains(propName))
        {
            texEnvSp.DeleteArrayElementAtIndex(i);
        }
    }

    var floatsSp = sp.FindPropertyRelative("m_Floats");

    for (int i = floatsSp.arraySize - 1; i >= 0; i--)
    {
        string propName = floatsSp.GetArrayElementAtIndex(i).FindPropertyRelative("first").stringValue;

        if (!properties.Contains(propName))
        {
            floatsSp.DeleteArrayElementAtIndex(i);
        }
    }

    var colorsSp = sp.FindPropertyRelative("m_Colors");

    for (int i = colorsSp.arraySize - 1; i >= 0; i--)
    {
        string propName = colorsSp.GetArrayElementAtIndex(i).FindPropertyRelative("first").stringValue;

        if (!properties.Contains(propName))
        {
            colorsSp.DeleteArrayElementAtIndex(i);
        }
    }

    so.ApplyModifiedProperties();
}
```

## マテリアルのサイズ変化

- 削除前のマテリアルのサイズ：2000 byte
- 削除後のマテリアルのサイズ：715 byte

Androidでランタイムのサイズを `Profiler.GetRuntimeMemorySizeLong` で計測。ランタイムではプロパティを削除できないので2つマテリアルを用意して計測。

- 削除前のマテリアルサイズ：1440 byte
- 削除したマテリアルサイズ：984 byte
SVM①（概要）

# 概要
最近SVMに興味を持ったので、以下のように何回かに分けてまとめていこうと思います。
-SVM概要（本記事）
-SVM詳しい原理（次回以降）
-SVM発展（いつか）

では、さっそくSVNとは何なのか見ていきましょう。
# SVMとは
SVMは、あるデータXが与えられた時にXがAに分類されるか、Bに分類されるかを判別するものです。ディープラーニングが登場するまではSVMがとてもよく使われていたみたいです。
以下、全て線形SVMの説明を書いていきます。
非線形SVMというのもあるんですが、自分があまりよく理解できてないので。。。
非線形写像すれば、非線形も線形分離できるとかなんとか。誰か教えて下さい。

#SVMの原理（概要）
状況設定を以下のようにしましょう。
ラベルAとラベルBのデータがそれぞれいくつかあります。このとき、データXはAとBどちらに分類されるでしょうか？
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/250830/14899fb4-dd7d-a712-7cd7-cd48b6edfc79.png)

上記の例では、なんとなくAに分類されそうですね。

XがAとBどちらに分類されるかを決めるには、当然ですがAとBの分類ルールを決めればいいですよね！
SVMでは、分類ルールを以下のように設定しています。

**"マージンを最大化するような直線を分類の境界線とする"**

(*￣-￣)ふ～んって感じですよね。
単純に直線で分類するんだってことは分かると思います。
じゃあ、マージンって何？？

マージンとは、「境界線」と「境界線に最も近い点」の距離のことです。
＊「境界線」と「境界線に最も近い点」の距離を最大化すれば、「全ての点」と「境界線に最も近い点」の距離も最大化されるみたいですね。なぜかは知りません。教えて下さい。

マージンを図にすると、以下のような感じ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250830/4459b86a-c58c-b9ca-f225-aae0f47546f2.png)
とか
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250830/574c3470-fc6b-0f30-dd10-b1561e827af7.png)

とか。

この二つを見比べると、上の図の方がマージンが大きくとれていますよね。
このマージンが最大化となる直線を、境界線と定めるのがSVMです。

#まとめ
- [x] SVMは、マージンを最大化するように直線で分類するもの。
- [x] マージンは、「境界線」と「境界線から最も近い点」との距離のこと。

次回以降は数式使いながら、もう少し詳しい部分まで触れていく予定です。
では、お疲れさまでした。
![76_mini.png](https://qiita-image-store.s3.amazonaws.com/0/250830/5a7ca36e-9452-470b-83f5-826caf5a1cd0.png)
PPPについてのめも

# PPP

PPPはLCP（Link Control Protocol）と，NCP（Network Control Protocol）の2つのプロトコルから構成される。

* LCP ･･･ PPPのリンクの確立，維持，解放に使用される
* NCP ･･･ 上位レイヤ3プロトコルの設定に使用される

http://itpro.nikkeibp.co.jp/article/COLUMN/20060704/242430/

# chat scrpit

コンピュータとモデムの間のメッセージのやり取りを記載する言語

https://linuxjm.osdn.jp/html/ppp/man8/chat.8.html
ProgateでのRuby学習　Lesson1【出力】

初心者でも分かりやすいとのことでProgateを始めました!


フロントエンドを触ったことのない私ですが、
バックエンドから学んだ方がフロントを理解しやすいかなと思い、
Rubyからスタートしてみました！

学習したことを自分なりの言葉で書いていきます！

##Ruby Lesson1
**⑴出力する**
コードを入力する画面で、単純に表示したい文字を打っただけでは表示されず、
コンピューターに命令して実行させるということをしなくてはならない。

putsは文字列or数値を表示しなさい！って命令。
表示したい文字は『 "" 』(ダブルクォーテーション)で囲むこと。
文字というか、文字列というんですね！
表示したいものが数字の場合はダブルクォーテーションなし。
数字ではなく、数値と呼ぶ！

例① 画面に文字列 Hello World! と表示させたい時
コード　：puts "Hello World!"
表示画面：Hello World!

例② 数値 31 と表示させたい時
コード　：puts 31
表示画面：31


**⑵コメントとして残す**
自分の中のメモのような感覚で、コードの中にコメントを残すことができる。
この場合、画面には表示されない。
文字列・数値関係なく、『 # 』の後にコメントを記入。


**⑶数値の計算**
足す(+)、引く(-)、かける(*)、割る(/)、余り(%)など、数値の計算をさせる。

コード　　　　　　　　　表示画面
puts 3 + 2　　　　　　　　５
puts 4 - 1　　　　　　　　 ３
puts 2 * 5　　　　　　　　１０
puts 6 / 3　　　　　　　　 ２
puts 7 % 4　　　　　　　　３

※数値と文字列の違い
puts 3 + 2　　　　　　　　５
puts "3 + 2"　　　　　　 ３＋２
ダブルクォーテーションで囲むことで数値ではなく文字列となる！


**⑷連結**
文字列同士を『 + 』で連結させて、繋げて表示することができる

コード　：puts "赤い" + "りんご"
表示画面：赤いりんご

文字列と数値の違い
コード
puts 3 + 2　　　　　　　　５
puts "3" + "2"　　　　　３２
ここでも、ダブルクォーテーションで囲むことによって文字列となる！

---

プログラミングの最初の一歩とも言える出力！
初めて画面に『Hello World!』と表示された時には
おぉー！パチパチパチパチってなりました！

次は変数をまとめます〜！
未経験者がITエンジニアになるための基礎のキ

※一部個人の見解がありますので、参考程度にしてください。※
#IT企業の主な種類
- SIer　例：NTTデータとか 
 - 基本的に実装しない、要件定義とかＰＪ管理とか
- SIerの下請け（基本客先常駐）いろいろ
 - 設計、実装、テストとかを行う
- 自社サービスを持つIT企業 楽天やLINEとか   
 - すべて自分でやる、もちろん業務委託にお願いしているところもある

#ＳＥとプログラマー、テスターについて
基本的にシステムを作るにあたって
要件定義→設計→プログラミング→テスト

- システム全体のアーキテクチャを設計する人　→　SE
- 主に実装　→　プログラマー
- テストをする人　→　テスター

#システムとは
ユーザーにサービスを提供するためのすべてのプログラムをまとめてシステムといいます。
基本的に：

- フロントエンド：ブラウザのwebページ、アプリとか
- バックエンド：サーバ(サービスを提供するコンピューター)、データベースなど

webページでなにかをインプットして、ネットワークを介して必要に応じてＤＢから情報を読み書きしながらサーバで処理する。処理結果をまたwebページにアウトプットする。

フロントエンドとバックエンドをつなぐ役目としてAPIがあります（jsoｎやxml形式が多い）

当然ですが、システムはプログラムからできている。

#プログラムとは
コンピューターに対する命令文のかたまり

javaとかC言語とか
いろいろな種類がある

基本１つさえ習得すれば、ほかの言語も学びやすい。
基本的な概念は一緒なので、条件分枝や繰り返し処理など

プログラミング言語は基本2種類

- コンパイルが必要な言語：pcが理解できる言語に変換してから実行 
- コンパイルが必要ない言語：一行ずつコンパイルしながら実行してくれる

#プログラミングの独学に関して
・本を買って、読むのは大事ですが、実際手を動かしてやってみるのはもっともっと大事です。
・エラーは友達です！！出たらおちついてエラーの内容を見て、わからなければぐぐりましょう。
・便利なツールやサイトを有効に使いましょう！


#便利なツールなど
・git  ※すごく大事、バージョン管理システム
・ide　※プログラミングが楽になります、基本みなさん使います。

#アプリに関して
・ネイティブとハイブリッドがある、ネイティブはosによって言語が異なる
・ハイブリッドはosを問わないが、正式にサポートされていないのがデメリット

#その他
ライブラリ　→　なにかの機能を実現できるようなプログラムをまとめたもの
フレームワーク　→　システムを書きやすいように、あらかじめ用意された骨組み
action追加とメンバー(member) とコレクション(collection) 

# はじめに

actionを追加する時のルーティングの設定について、メンバー(member) とコレクション(collection)について調べたことをまとめています。
※actionを追加時のcontrollerやviewの設定については割愛しています。

## やりたかったこと

**hoge**というactionをarticle controllerに追加したい。routesは、こうなる予定。

```
$ rails routes | grep hoge

=> hoge_article GET    /articles/:id/hoge(.:format) 
articles#hoge
```

ちなみに編集前のroutesはこちら。

``` ruby:routes.rb

Rails.application.routes.draw do
  resources :articles do
    resources :comments
  end
  root 'welcome#index'
end

```

## 困ったこと

`article`の中に`get :hoge`を書いてOKと思いきや、意図と異なるルーティングになってしまった。

``` ruby:routes.rb

Rails.application.routes.draw do
  resources :articles do
    resources :comments
    get :hoge
  end
  root 'welcome#index'
end

```

```
$ rails routes | grep hoge

=> article_hoge GET    /articles/:article_id/hoge(.:format)              
articles#hoge
```

## 原因

デフォルトで作成される7つのaction（index,new,create,show,edit,update,destroy）以外のルーティングを追加する場合は、適切なルーティングブロックの追加が必要でした。

## メンバールーティングとコレクションルーティング

適切なルーティングブロックの追加=メンバールーティングまたは、コレクションルーティングをリソースブロックに追加します。
ざっくりとこのような機能を生成してくれます。

- GETリクエストとパスを認識
- リクエストを、リソースブロックで指定したコントローラのコレクションルーティングで指定したアクションにルーティング
- パスに対応した`xxxx_url`ヘルパー、`xxxx_path`を作成

`GETリクエストとパスを認識`の挙動に大きな違いがあります。

### メンバールーティング

memberブロックを追加すると

- GETリクエストとそれに伴う/articles/[:id]/hogeを認識する
- リソースid値をparams[:id]に渡す

``` ruby:routes.rb
resources :articles do
  member do
    get :hoge
  end
end
```

### コレクションルーティング

collectionブロックを追加すると

- GETリクエスト+/articles/hogeなどの (idを伴わない) パスを認識する

``` ruby:routes.rb
resources :articles do
  collection do
    get :hoge
  end
end
```

## 実際に修正

### memberブロックを追加

idを認識する必要があったため、メンバールーティングを用いてroutesを修正。

``` ruby:routes.rb

Rails.application.routes.draw do
  resources :articles do
    resources :comments
    member do
      get :hoge
    end
  end
  root 'welcome#index'
end

```

### on:オプションを使用して更にソースをすっきりさせる
メンバールーティングまたは、コレクションルーティングが一つしかない場合は、`on:`オプションを利用することができる。

``` ruby:routes.rb

Rails.application.routes.draw do
  resources :articles do
    resources :comments
    get :hoge, on: :member 
  end
  root 'welcome#index'
end

```
　　

意図したルーティングを実現することが出来ました。

```
$ rails routes | grep hoge

=> hoge_article GET    /articles/:id/hoge(.:format) 
articles#hoge
```

# 参照サイト
[Rails のルーティング - Ruby on Rails ガイド](https://railsguides.jp/routing.html)
Bootstrapのモーダルダイアログを使う

##Bootstrapモーダルダイアログの使い方

1.準備

 - jQueryをダウンロードする
   https://jquery.com/download/

 - bootstrapをダウンロードする
   https://getbootstrap.com/docs/4.1/getting-started/download/

2.html

```index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>bootstrapモーダル</title>
<script src="js/jquery-3.3.1.min.js"></script>
<link rel="stylesheet" href="css/bootstrap.min.css">
<script src="js/bootstrap.min.js"></script>
<body>

<button data-toggle="modal" data-target="#modal1" >モーダル表示</button>

<!-- モーダルダイアログ -->
  <div class="modal" id="modal1" tabindex="-1" role="dialog" aria-labelledby="staticModalLabel" aria-hidden="true" data-show="true" data-keyboard="false" data-backdrop="static">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h4 class="modal-title">タイトル</h4>
          <button type="button" class="close" data-dismiss="modal">
            <span aria-hidden="true">&#215;</span>
          </button>
        </div><!-- /modal-header -->
        <div class="modal-body">
          <p class="recipient">本文</p>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">閉じる</button>
        </div>
      </div> <!-- /.modal-content -->
    </div> <!-- /.modal-dialog -->
  </div> <!-- /.modal -->
</body>
```

3.構成

```
index.html
│  
├─css
│      bootstrap-grid.css
│      bootstrap-grid.css.map
│      bootstrap-grid.min.css
│      bootstrap-grid.min.css.map
│      bootstrap-reboot.css
│      bootstrap-reboot.css.map
│      bootstrap-reboot.min.css
│      bootstrap-reboot.min.css.map
│      bootstrap.css
│      bootstrap.css.map
│      bootstrap.min.css
│      bootstrap.min.css.map
│      
└─js
        bootstrap.bundle.js
        bootstrap.bundle.js.map
        bootstrap.bundle.min.js
        bootstrap.bundle.min.js.map
        bootstrap.js
        bootstrap.js.map
        bootstrap.min.js
        bootstrap.min.js.map
        jquery-3.3.1.min.js
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/0eb745f5-265e-c80c-6c71-e52d13c3ef48.png)

ボタンを押すと、モーダルダイアログが表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/11a82ef5-0160-2c24-050f-b317077ad916.png)
[CSS] borderの重なり方を調整する

# borderの角の部分の描画について

CSSの`border`プロパティで枠線を描くとき、隣り合う2辺で異なるスタイルを指定すると、角の部分はどのように描画されるでしょうか。
試してみましょう。

<p data-height="265" data-theme-id="0" data-slug-hash="JvPrMw" data-default-tab="css,result" data-user="snocchy" data-embed-version="2" data-pen-title="box-border" class="codepen">See the Pen <a href="https://codepen.io/snocchy/pen/JvPrMw/">box-border</a> by snocchy (<a href="https://codepen.io/snocchy">@snocchy</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

恐らく、角の部分は斜めに分割されてそれぞれの枠線が描かれていると思います。
実はCSSの仕様は角の部分の処理を規定しておらず、ブラウザの実装依存となっているようですが、手元のいくつかの環境で確認したところ、いずれも斜めに分割されて表示されました。

> *[4.2. Line Patterns: the border-style properties](https://www.w3.org/TR/css-backgrounds-3/#the-border-style)*
Note: This specification does not define how borders of different styles should be joined in the corner.

昔は[ブラウザによる違いがもっとあった](https://stackoverflow.com/questions/10884008/border-color-order)みたいですが、一応統一されてきたのかもしれません。
上記のような実装を前提としたCSSのテクニック（吹き出しの三角形を作る系など）も珍しくないですね。

# borderの重なりに優先順位をつける

それでは、もし次のような枠線を付けたいと思ったら、どのようにマークアップすればよいでしょうか。
![box-border--ordered.png](https://qiita-image-store.s3.amazonaws.com/0/251434/fdbdb668-49f3-0114-a32f-35cd4abc1b99.png)
`div`を入れ子にしたりすれば出来そうな気はしますが、装飾だけのためにHTMLの構造に手を加えるのは、避けられるに越したことはないですよね。

ということで、疑似要素を使ったマークアップを紹介します。

<p data-height="265" data-theme-id="0" data-slug-hash="YLKapW" data-default-tab="css,result" data-user="snocchy" data-embed-version="2" data-pen-title="box-border--ordered" class="codepen">See the Pen <a href="https://codepen.io/snocchy/pen/YLKapW/">box-border--ordered</a> by snocchy (<a href="https://codepen.io/snocchy">@snocchy</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

`::before`でも`::after`でもいいので疑似要素を重ね、はみ出させたい枠線（青いほう）をそちらに付けることで意図どおり表示させることができました。
はみ出させる枠線の長さ（縦線なら`height`）が固定値である必要がありますが、参考になれば幸いです。
ACID特性

# ACID特性
## 原子性(Atomicity)
トランザクションが終わったとき、含まれている更新処理がすべて実行されるか、すべて実行されない状態で終わることを保証する性質
COMMITかROLL BACKの二者択一

## 一貫性(Consistency)
トランザクションに含まれる処理は、データベースにあらかじめ設定された制約を満たすという性質
※整合性とも呼ぶ

## 独立性(Isolation)
トランザクション同士が互いに干渉を受けないことを保証する性質
あるトランザクションによる変更は、トランザクション終了時までは、別のトランザクションから隠蔽される
⇒コミットされるまでは、他のトランザクションからは変更が見えない

## 永続性(Durability)
トランザクション終了したら、その時点でのデータの状態が保存されること保証する性質
障害発生時に何らかの手段で復旧させる手段を持つ必要がある
アルファベット２文字の単語、全て何らか略語になっている説

初投稿です。
#アルファベット２文字の単語、全て何らか略語になっている説
「AA」「WC」「KY」…
アルファベット２文字で構成される略語は数多くあるものの<b>「逆に略語になってない２文字は存在するのか…？」</b>と思ったことは無いですか？

凄くどうでもいいネタなんですけど、せっかくなので調べてみる事にしました。

#アルファベット２文字の単語、全てwikipediaの記事になっている説
分からない単語が出てくる度にお世話になっているwikipedia。
<b>「略語として存在する」&hArr;「wikipediaの記事が存在する」が成立する</b>という考えのもと、２文字の全組み合わせに対してページの存在をチェックする事で検証してみます。

###記事が存在する場合
「AA」に関する記事は存在していました。
「ドイツ外務省」「アミノ酸」「アスキーアート」等をAAと略すらしいです。
https://ja.wikipedia.org/wiki/AA
###記事が存在しない場合
「AAAAA」に関する記事は存在していませんでした。
(少なくともwikipediaからは)「AAAAA」という略語の存在は確認できませんでした。
https://ja.wikipedia.org/wiki/AAAAA

##記事の存在確認
記事の存在確認は、指定したURLから404 errorが返ってくるかどうかで確認できます。

まずは、urllib2のurlopenからHTTPError(404)が返ってきたかどうかを判定できるスクリプトを作成してみました。

```python:pagecheck.py
# coding: UTF-8
import urllib.request, urllib.error
from bs4 import BeautifulSoup
import sys

args = sys.argv
query = str(args[1])

# HTTPErrorチェック
try: 
    page = urllib.request.urlopen("https://ja.wikipedia.org/wiki/" + query)
    flag = 1
except urllib.error.HTTPError as e:
    flag = 0

# 記事の有無を出力
if flag == 1:
    print(`記事「` + query + `」は存在していた。`)
elif flag == 0:
    print(`記事「` + query + `」は存在していなかった。`)
```

###結果

```
>python pagecheck.py AAAAA
記事「AAAAA」は存在していなかった。

>python pagecheck.py AAA
記事「AAA」は存在していた。
```

##全組み合わせの確認
それではアルファベット２文字の全組み合わせ(26*26=676通り)に対して、記事の有無を確認していきます。

```python:allpagecheck.py
# coding: UTF-8
import urllib.request, urllib.error
from bs4 import BeautifulSoup
import sys
import time

charalist = [chr(i) for i in range(65,65+26)]
nonlist = []
t = 0

for s1 in charalist:
    for s2 in charalist:
        query = s1+s2
        t = t + 1
        print("現在:" + str(t) + "/676件目")
        time.sleep(1)

        try:
            page = urllib.request.urlopen("https://ja.wikipedia.org/wiki/" + query)
        except urllib.error.HTTPError as e:
            nonlist.append(query)

# 結果出力
if nonlist == []:
    print("676通り全ての記事の確認が出来ました！")
else:
    print("記事の存在しない２文字は、以下の" + str(len(nonlist)) + "件です。")
    for item in nonlist:
        print(item)
```

###結果

```
>python allpagecheck.py
現在:1/676件目
現在:2/676件目
……
現在:675/676件目
現在:676/676件目
676通り全ての記事の確認が出来ました！
```

これで<b>wikipediaには２文字の単語全てに対して記事がある</b>ことが確認できました！！

#まとめ
<b>wikipediaには、アルファベット２文字からなる全単語に対して記事があることが確認できた。</b>

本当に676通り存在するものなんですねぇ。

「wikipediaなんて信用できない！調べるなら国語辞書で確認しろ！」と思ってる人も居ると思うので、次回はコトバンクを使って検証してみようと思います。
~~今回は結局Beautifulsoupを使わずに終わっちゃったので、次回は使います~~
ディープラーニングで日経平均を予測 <2> ～時系列予測AI Prophet利用～

# これまでの取り組み

前回の [ディープラーニングで日経平均を予想してみる](https://qiita.com/AfricaUmare/items/4317fb88299995e54e5f) の投稿では、Google TensorFlowとkerasを使い、LSTMという手法で日経平均を予測しようとしたけれどもうまく予測できませんでした。
うまく行かなかったことは残念でしたが、Google TensorFlowとkerasを使うことで、データサイエンティストでない初心者でも、特に数学の知識も必要なく、簡単にディープラーニングを使うことができるということが分かりました。

# 今回やりたいこと
Google TensorFlowは、様々な分野で使うことを想定した汎用的なディープラーニングのライブラリでした。今回は、このTensorFlowではなく、Facebookが公開している時系列データ予測のための、人工知能ライブラリProphetを使って、日経平均を予測してみます。

### Facebook Prophetとは

> "Tools that help analysts to use their expertise most
effectively enable reliable, practical forecasting of business time series."

Prophetは、信頼でき、実用的な、ビジネスの時系列予測を、最も効率的に容易にするツールだそうです。
また、ビジネスでの使用を想定しているため、アナリストの専門知識を反映させたり、調整したりすることもできるように設計されているようです。

**Prophetについて、詳しくはこちら:**
[Prophet入門【Python編】Facebookの時系列予測ツール](https://www.slideshare.net/hoxo_m/prophet-facebook-76285278)
[【Day-13】『Prophet入門』簡単に高精度を実現するFacebook謹製の時系列予測ライブラリ](http://www.procrasist.com/entry/13-prophet)
[Prophet Quick Start](https://facebook.github.io/prophet/docs/quick_start.html#python-api)

# Prophetを使った日経平均予測

ものは試しで、早速、Prophetを使ってみましょう。

### 日経平均のデータ取得

Yahoo!Financeから過去5年分の日経平均データを取得します。(CSV File形式)
[Yahoo!Finance Nikkei 225 (^N225)](https://finance.yahoo.com/quote/%5EN225/history?period1=1366124400&period2=1523890800&interval=1d&filter=history&frequency=1d})

### Prophetを使って予測するコード

Prophetのコードは、TensorFlowとkerasのコードよりずっと短いです。
(その分、中身はほとんどブラックボックスですね。。。)

```python:nikkei.py
import pandas as pd
import numpy as np
from fbprophet import Prophet

df = pd.read_csv('^N225.csv') #日経平均のCSVを読み込み
# print(df.head())

df2 = df.loc[:, ['Date', 'Close']] #日付と終値を抽出
df2 = df2.rename(columns={'Date': 'ds', 'Close': 'y'}) #系列名をds, yに変更 
# print(df2.head())

df2['y'] = np.log(df2['y']) # logで正規化

m = Prophet()
m.daily_seasonality = True #オプション
m.fit(df2) 

future = m.make_future_dataframe(periods=180) #180日将来まで予測
future.tail()

forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

m.plot(forecast).savefig('n1.png') #予測結果のグラフをpngファイルで保存
m.plot_components(forecast).savefig('n2.png')　#予測結果のグラフをpngファイルで保存
```

### 予測結果

180日先までの日経平均予測結果です。なかなか、それっぽい株価が予測されています。
中央の青線によると、半年後の株価は、年初の最高値付近まで上昇する可能性が高いといったところでしょうか。しかし、ばらつきが非常に大きいので、予測の精度は低そうと言えます。
![n1.png](https://qiita-image-store.s3.amazonaws.com/0/80231/92836ddb-d892-7e96-347f-55372238ed29.png)

Prophetは、予測結果をトレンドと年、週の周期に分けて分析してくれます。トレンドは、2017年以降は上昇トレンド、年の周期では、年末年始は株価が上がりやすいという分析結果が出ていますね。
![n2.png](https://qiita-image-store.s3.amazonaws.com/0/80231/9e6b0df8-9ac6-cd8d-d515-41b41ec55e11.png)

# まとめ

FacebookのProphetは、LSTMを使った分析よりも、はるかに妥当そう(に見える)分析結果を出してくれるようです。さすが、時系列分析に特化したツールと言うだけありますね。Prophetの中身がどうなっているのかも、気になってきました。
なお、この株価予測があっているかどうかは、また半年後ということで、、、
“プログラミング言語Rust: 2nd Edition”の日本語版PDFを作成した

# はじめに

**https://doc.rust-jp.rs/book-ja-pdf/book.pdf**

:point_up: プログラミング言語Rust: 2nd Edition[^2018]の日本語版PDFを公開しました！ :point_up:

[^2018]: 2020/09/26追記: 現在は日本語化されている最新版である2018版となっています。


- 組版上のエラーなどを見つけたら気軽にIssueなどで報告してほしいです
- 改善してほしい点なども歓迎します！
- ~~頃合いをみて[rust-lang-ja](https://github.com/rust-lang-ja)に移すかも~~ 移した:tada:
- **実はWeb版もあります！**
    - https://doc.rust-jp.rs/book/second-edition/
    - HTML版のソースはhazamaさんのMarkdownからRustコミュニティがフォークしたもので、PDF版と同じものを参照しています

<dl>
  <dt>GitHub Repository</dt>
  <dd><a href="https://github.com/rust-lang-ja/book-ja-pdf">https://github.com/rust-lang-ja/book-ja-pdf</a></dd>
</dl>

:point_up: エラー報告などをお待ちしています。

## 追記

- アスキードワンゴさんから出版されました！もちろん僕の自動組版ではなくてプロによって組版されています
    - [プログラミング言語Rust 公式ガイド](https://asciidwango.jp/post/185381172080/%E3%83%95-%E3%83%AD%E3%82%AF-%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%AF-%E8%A8%80%E8%AA%9Erust%E5%85%AC%E5%BC%8F%E3%82%AB-%E3%82%A4%E3%83%88)
    - **2020/09/20追記** 出版されたバージョンと比べると、それぞれ内容が修正されていたりして微妙に異なると思います
- 達人出版会さんからPDF・EPUB版も出版されています
    - https://tatsu-zine.com/books/the-rust-programming-language
- アスキードワンゴさんはもおそらく$\mathrm{\LaTeX}$で組版しているので、僕の自動組版と比べて遊ぶこともできます（？）

# やっていること・感想

- ~~このPDFはhazamaさんのリポジトリ :point_down: をTravis CIの上でPandocと$\mathrm{\LaTeX}$を動かして自動コンパイルしています~~ 現在はrust-lang-jaがフォークしてメンテしているリポジトリーのMarkdownソースを元にしています
    - ~~https://github.com/hazama-yuinyan/book~~ https://github.com/rust-lang-ja/book-ja
- ~~Travis CIのcron機能で少なくとも1週間に一度は最新の状態で自動コンパイルされます~~
    - 1日に一回は少なくとも自動コンパイルされるようにしました
- A4で540ページ以上あるにも関わらず、ほとんどを翻訳しているコミュニティの凄まじさに驚くばかりです……
- Pandocの洗練された柔軟性と$\mathrm{\LaTeX}$の美しい組版をぜひご覧ください
- Travis CIでMarkdownをPDFへ変換して自動デプロイする知見は大分たまりました
    - いずれドキュメント化したいです

# まとめ

- https://doc.rust-jp.rs/book-ja-pdf/book.pdf
- なにか不具合などがありましたら :point_down: へ報告をおねがいします :pray: 
    - https://github.com/rust-lang-ja/book-ja-pdf/issues
バグ/IE11で横並び要素が落ちる（3カラム）

## 状況
flexで３つの要素を横並びにしていたが、IE11でだけ一つ分落ちる。
![ならび](https://qiita-image-store.s3.amazonaws.com/0/237008/59480215-1b80-7a94-f7f9-c115720010ac.png)
↑こうしたいのに

![ならび](https://qiita-image-store.s3.amazonaws.com/0/237008/ca814d2a-5f7e-5c3e-6c1c-f75503afc677.png)
↑こうなる。

```html
<ul class="target">
  <li>1</li>
  <li>2</li>
  <li>3</li>  
</ul>
```
```css
.target {
  display: -webkit-flex;
  display: -ms-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-flex-flow: wrap;
  flex-flow: wrap;
}
.target > li {
  width: calc(100% * 1/3);
}
```

## 原因
flexのIE特有のバグかと思って調べてたのですが```width: calc(100%*  1/3);```こいつが犯人だと判明。IE11の 1/3 と 他ブラウザの 1/3　は違う値になるみたいです（ブラウザによる小数点の扱いの違いなのかな）。

## 解決方法
IE11のみwidthの指定を変える必要がある。
以下のコードを追加。

```css
*::-ms-backdrop, .target > li {
  width: 33.33%
}
```
で、解決。
先輩に聞いたらすぐに、あーそれ33.33の…って言われたので有名みたいですね。
（もっと早く聞けばよかった…）
AR.jsでカスタムマーカーが認識されない場合の対処法

# はじめに
AR.jsでカスタムマーカーを使おうとしてハマったので備忘録もかねて残しておきます。

# 症状
[A-Frameのmarker generator](https://aframe.io/blog/arjs/#customize-your-marker)で作成したカスタムマーカーをAR.jsが認識しない。

# 考えられる原因と対処法
## 参照しているライブラリが古い可能性がある
カスタムマーカーはバージョン1.5.5以降に追加された機能です。CDNで公開されているライブラリを参照している場合、バージョン1.5.5以降のライブラリ、またはgithubの最新のコードを参照しているか確認してください。

* 1.5.5 ： https://cdn.rawgit.com/jeromeetienne/AR.js/1.5.5/aframe/build/aframe-ar.js 
* githubの最新 ： https://jeromeetienne.github.io/AR.js/aframe/build/aframe-ar.js 

ちなみに、npmに公開されているAR.jsはバージョンが古いため（おそらく1.5.0）、モジュールの入れ替えが必要です。

## タグ／属性が誤っている可能性がある
18/4/17時点の公式サイトにて、カスタムマーカーの使用法は下記のように説明されています。

````html
<a-marker-camera type='pattern' patternUrl='path/to/pattern-marker.patt'></a-marker-camera>
```

上記コードでは、patternUrl属性にカスタムマーカーのパターンファイルを参照させることでカスタムマーカーを認識させる、というものですが、正しくはurl属性に指定する必要があります。
また、認識しないことの直接の原因ではありませんが、\<a-marker-camera\>を使用した場合、カメラがマーカーを外れたときにオブジェクトが消えずに残るという事象が発生します。そのため、\<a-marker\>を使用するのが正しいです。

# 修正後のサンプルコード
上記の原因を見直し、下記のように修正した結果、無事にカスタムマーカーを認識することができました。

```html
<script src="https://jeromeetienne.github.io/AR.js/aframe/build/aframe-ar.js"> </script>

～省略～

<a-marker preset="custom" type="pattern" url="pattern-marker.patt"></a-marker>
```

# おわりに
個人的には「ライブラリが古かった」という点でハマりました。
AR.jsは日本語の情報が少ないので、今後利用を検討されている方の参考になれば幸いです。
Mac OS X で各種アプリのデーモン化


インスタレーションなどやるときに、Mac OS X でファイルオープンが必要な各種アプリをデーモン化する方法のメモです。

launchd とか、 supervisord とか、いろんなやり方があるぽいのですが、今回は、以下をつかいました

- mongroup
- automator
- スタートアップ項目

まず mongroup を install して。

```
npm install -g mongroup
```

特定ディレクトリ移動して、 mongroup.conf をつくって、以下のような設定をする。

```
on-error = ./bin/on-error.sh
on-restart = ./bin/on-restart.sh

attempts = 3
logs = ./logs
pids = ./tmp/pids

# ファイルオープンが必要なアプリの場合（maxmspなど。）
app1 = open -W (特定のファイルへのパス)

# コマンドで実行できるアプリの場合
app2 = cd （ディレクトリへのパス) && ./(実行したいバイナリファイル)
```

※ ファイルオープンが必要なアプリの場合、`mongroup stop`でキレイに終了してもらないので、改善の余地がありまくり。

automator で以下のような shell script を実行する。

```
export PATH=$PATH:/usr/local/bin
cd (mongroup.conf があるディレクトリへのパス) 
mongroup start 
```

で、automator のファイルを system 環境設定のスタートアップ項目へ。
サブスクリプションモデルでの会員の平均継続期間をどう見積もるか？

サブスクリプションモデルのビジネスをやっている時に気になるのが平均継続期間だと思います。平均で3ヶ月継続しているのか、平均で10ヶ月継続しているのかでサービスの粘着性の指標になるし、広告予算にいくら使っていいかも変わってくる。じゃあ具体的にどう平均継続期間を見積もるかというところで過去のデータを全てとってきて平均するのは大変だし、過去の情報だけからは将来のことがわからないし、数理的に簡単に計算できないかその辺考えてみました。

# 結論
簡単に結論から先にいうと、1ヶ月サブスクリプションモデルの平均継続期間(月)は以下で定義できる。

```math
平均継続期間 = \frac{1}{1-継続率}
```
つまり、継続率が90%なら平均継続期間は10ヶ月だし、継続率が80%なら5ヶ月。簡単に計算できますね。
もし6ヶ月サブスクリプションの平均継続期間を計算したいなら以下のように分子にベースの期間を持って来ればいい。

```math
平均継続期間 = \frac{6}{1 - 継続率}
```

1ヶ月、6ヶ月、12ヶ月のサブスクリプションが複合で存在するならそれぞれを加重平均とする。

```math
\begin{align}
平均継続期間 = &1ヶ月会員割合 * 1ヶ月会員平均継続期間 + \\
&6ヶ月会員割合 * 6ヶ月会員平均継続期間 + \\
&12ヶ月会員割合 * 12ヶ月会員平均継続期間 
\end{align}
```

# なぜ平均継続期間は(1-継続率)の逆数となるか
このモデルは、サブスクリプションの会員が等比数列で減っていくことを前提としています。実際担当しているサービスの継続率をプロットしてみるとだいたい毎月一定の割合で減少するような傾向は確認しています。
例えば継続率90%の場合当月100人であれば翌月90名、翌々月81名、みたいな。この場合の平均継続期間は全ての契約の継続の累計を全体の人数で割ればいいので以下のようになります。

```math
平均継続期間(月) = \frac{100 + 100*0.9 + 100*0.9^2 + ...}{100}
```

初期人数a人、継続率rとすると、

```math
\begin{align}
平均継続期間 &= \frac{a + ar + ar^2 + ar^3 + ...}{a} \\
&= 1 + r + r^2 + r^3 + ... \\
\end{align}
```

これは無限等比級数の公式を使えばシンプルに以下のようになります。

```math
平均継続期間 = \frac{1}{1-r}
```

カンタン！

# 無限等比級数の公式

無限等比級数の公式の導出について簡単に。

```math
\sum_{k=0}^{n} r^k = 1 + r + r^2 + ... + r^n　\tag{a}
```

両辺にrをかけると

```math
r\sum_{k=0}^{n} r^k = r + r^2 + r^3 + ... + r^{n+1}\tag{b}
```

(a)-(b)をするといろいろ相殺されて

```math
\begin{align}
(1-r) \sum_{k=0}^{n} r^k &= 1 - r^{n+1} \\
\sum_{k=0}^{n} r^k &= \frac{1-r^{n+1}}{1-r}
\end{align}
```

r -> ∞、r<1とするならばr^{n+1}は限りなくゼロに近くので

```math
\lim_{\substack{n \to \infty }} \sum_{k=0}^{n} r^k =  \frac{1}{1-r}
```

よって、

```math
平均継続期間 = \frac{1}{1-継続率}
```


# なぜ1、6、12ヶ月のプランがある場合に加重平均となるか

自明。

以上！
utopのプロンプトのカスタマイズは地味に楽しい

utopのプロンプトは`UTop.prompt`を介してカスタマイズすることができます。

```text
utop # UTop.prompt;;
- : LTerm_text.t React.signal ref = {Pervasives.contents = <abstr>}
```
　*何だこれは・・・*
　*文字列じゃダメなのか？*
　*プロンプトごときのためにドキュメント読みたくねーよ*
などと思われるのはもっともですが、例を見ていただければそれほど煩雑でないことが分かってもらえるかと思います。それどころか

- 型がつく!
- REPLで開発できる!

と思えばむしろ楽しいくらいです。

ちなみに`LTerm_text.t`と`React.signal`はそれぞれターミナル操作のためのライブラリである`Lambda-Term`とFRPライブラリの`React`から来ています。

以下では例を挙げて説明しますが、私はそれぞれのライブラリ(特に`React`)の使い方をちゃんと理解していないので、下手な書き方になっているかも知れません。

# その前に
utopはいくつかプロンプトをディレクティブの形で用意してくれています。ぜひチェックしてみてください。

- `#utop_prompt_dummy`
- `#utop_prompt_fancy_dark`
- `#utop_prompt_fancy_light`
- `#utop_prompt_simple`

# シンプルなプロンプト
デフォルトのプロンプトは派手なので、シンプルに`utop # `とだけ表示するようにしてみましょう。色も一色だけにします。

```ocaml:.ocamlinit
#require "lambda-term";;

let open LTerm_text in
UTop.prompt := 
  [B_fg (LTerm_style.rgb 191 255 0); S "utop # "]
  |> eval
  |> React.S.const
;;
```
各要素の型を確認してみます。

```text
utop # [B_fg (LTerm_style.rgb 191 255 0); S "utop # "];;
- : item list = [B_fg (LTerm_style.RGB (191, 255, 0)); S "utop # "]
utop # LTerm_style.rgb;;
- : int -> int -> int -> LTerm_style.color = <fun>
utop # eval;;
- : markup -> t = <fun>
utop # React.S.const;;
- : 'a -> 'a React.signal = <fun>
```
詳しく言うと`B_fg`と`S`は`item`型のコンストラクタで、前者は`LTerm_style.color`を受け取って文字色を指定し、後者は文字列を指定するものです。これ以外のコンストラクタについては[ドキュメント](http://docs.mirage.io/lambda-term/LTerm_text/index.html#type-item)をご覧ください。
また`markup = item list`です。

これだけ見れば使い方も大体分かってしまったかと思います。


# 動的なプロンプト
プロンプトの表示ごとに内容を変更することもできます。個人的にはここでどう書けばいいのか悩みました。動的に内容を変更するなら`unit -> 'a`を用意してやれば良さそうですが、代わりにここでは`React`の仕組みに頼ることになります。

プロンプトとして`<ユーザー名>@<カレントディレクトリ> # `を表示してみましょう。

```ocaml:.ocamlinit
let open LTerm_text in
let make_prompt (c : int) =
  eval [S (Printf.sprintf "%s@%s # " (Sys.getenv_exn "LOGNAME") (Sys.getcwd ()))] in
UTop.prompt := React.S.l1 make_prompt UTop.count
;;

```
`React.S.l1`と`UTop.count`の型を見てみます。

```text
utop # React.S.l1;;
- : ?eq:('b -> 'b -> bool) -> ('a -> 'b) -> 'a React.signal -> 'b React.signal
= <fun>
utop # UTop.count;;
- : int React.signal = <abstr>
```
`React.S.l1`はその名の通り1引数関数を受け取ります。そのような関数が`l6`まで用意されています。また`UTop.count`の中身は、プロンプトが表示されるごとに1だけ加増されます。このカウント値を`make_prompt`の中で使っていないので奇妙に見えますが、こうしないとプロンプトが更新されません。この辺りの理由をうまく説明できないのは私の力不足のせいです。

# まとめ
何となくでも使い方が分かっていただけたでしょうか。残念ながらこの記事を書いている時点では情報がほとんどないようです。ライブラリのドキュメント以外ではutopのソースが理解の助けになりました。
[utop/uTop.ml at master · diml/utop · GitHub](https://github.com/diml/utop/blob/master/src/lib/uTop.ml#L364)
[LTerm_style (lambda-term.LTerm_style)](http://docs.mirage.io/lambda-term/LTerm_style/index.html)
[LTerm_text (lambda-term.LTerm_text)](http://docs.mirage.io/lambda-term/LTerm_text/index.html)
[React.S](http://erratique.ch/software/react/doc/React.S.html)
SublimeText 3のPlugin「SFTP」のencoding errorを解決した

#Sublime「SFTP」でトラブった

##エンコードエラーの問題発生
Sublime text 3のPlugin「SFTP」を便利に使っていた。広告ダイアログも嫌なので、数十ドル支払っていた。

https://wbond.net/sublime_packages/sftp

しかし半年ぶりに使用したところ、サーバー(さくらインターネット)に接続できなくなっていた。。私はなんも設定を変えてないのに。

エラーメッセージは、以下のとおり。エンコード設定を修正しろというもの。

>コンソールのエラーメッセージ
>Connecting to SFTP server "username.sakura.ne.jp" as "username" ......... success
>Validating remote folder "/home/username/www/" .... failure (Encoding error)

>メッセージボックスのエラーメッセージ
>An encoding error was encountered trying to read from the server. Please adjust the "remote_encoding" setting in sftp-config.json.
>Common encodings include:(以下略)


##解決方法を調査
ネットを調べると日本語、英語、韓国語のトラブル例が見つかった。sftp-config.jsonの"remote_encoding"の部分を”cp1253"や"cp932"に変えるとうまくいくとか(デフォルトはUTF-8)。Plugin作者がファイル名やパスに特殊文字がないかと指摘しているのも見かけた。

https://teratail.com/questions/16615
https://forum.sublimetext.com/t/encoding-problem-with-sftp-and-syncing-folder/13301
https://superuser.com/questions/1061109/why-does-sublime-sftp-report-encoding-error
http://naminsik.com/blog/2916

しかし実際どれを試してももうまくいかない。。ConvertToUTF8のPluginをダメ元で入れたけど、やっぱりだめ。サーバーの問題も勘ぐったが、WinSCPでSFTP接続できているので、やはりPluginが原因と思われた。

作者に問い合わせるのも面倒だなぁと諦めかけていた。

##これが正解
こういうときに経験的にうまくいく方法として、思いついたものを全部試すというのがある。

エラーメッセージはエンコード云々だけど、そのタイミングに注目してみた。ログイン成功後のディレクトリのチェックの段階でエンコードエラーが出ている。ディレクトリでこのメッセージ意味不明。

そこで<b>リモートパスがおかしいかも</b>、と思い少し削ってみた。

```json:sftp-config.json
古: "remote_path": "/home/username/www/",
新: "remote_path": "/home/username/",
```

すると、ビンゴ。<b>encoding errorが出なくなった</b>。

まぁこのままだとwwwがない別のフォルダを作ってアップロードしてしまうので、ちょっと調整。ローカルに「wwww」という名前のフォルダを作り、ここにファイルを全部移した。sftp-config.jsonを「www」のひとつ上の階層に移した。

これで以前と同様に便利に操作できるようになった。

以上
Prometheus + mtail で簡単なログ収集をしてみる

# やること
prmetheusとmtailを一台のインスタンスに入れて、mtailで`/var/log/messages`の行数をカウントした結果をprometheusのメトリクスとして収集してみる。

mtailを初めて使うので、mtailの使い方を調べながら。

# 環境
- Instance: t2.micro
- OS: centos7
- Prometheus： 2.01
- mtail: 3.0.0


# mtailの準備
何も無い状態からはじめます。

##Goのインストール
まずは、Goのインストール(1.7以上）

###GOPATHの設定・作成

```
sudo su -
```

`.bash_profile`を編集する

```
vi .bash_profile
#以下の二行を追加する
export GOPATH=$HOME/go
PATH=$PATH:$HOME/bin:$GOPATH/bin
```

`.bash_profile`の読み込み

```
source ~/.bash_profile
```

GOPATHは以下にsrcディレクトリの作成

```
mkdir -p $GOPATH/src
```


Goとgitをインストールする

```
cd $GOPATH/src
yum install go git
go get github.com/google/mtail
cd github.com/google/mtail
make
```

##プログラムファイルの作成
mtailの動作設定ファイルであるプログラムファイルを作成する。
まず、プログラムファイル格納用のディレクトリを作成する
どこでもよいですが、公式を参考に/etcの下に作成。

```
mkdir /etc/mtail
```

複雑な記載が可能ですが、今回はもっともシンプルなプログラムファイルを作成します。
あるログファイルの行数をカウントするだけのプログラムファイル。
対象のログファイルはmtail起動時に指定する。
このとき、`line_count`がPrometheus上で表示されるメトリクス名になります。

```
cd /etc/mtail
vim test.mtail
# simple line counter
counter line_count
/$/ {
  line_count++
}
```

##mtail実行
作成したプログラムファイルを読み込むように、mtailを起動する。
`-progs`で読み込むプログラムファイルを指定
`-logs`で参照するログファイルを指定
ちなみに、プログラムファイルの修正は動的に反映されます。mtailプロセスの再起動は必要ありません。

```
# /var/log/messages を対象に、行数カウントのプログラムファイルを指定してmtailを起動
mtail -progs /etc/mtail/test.mtail -logs /var/log/messages &
```

mtailが出力するメトリクスの取得には、mtailのエンドポイントに3903ポートでアクセスすれば参照可能です。
json,prometheus,varz形式のデータで出力されています。

###mtailの素の画面はこんな感じ
xx.xx.xx.xx:3903にアクセスした画面

![ScreenShot 1.JPG](https://qiita-image-store.s3.amazonaws.com/0/152250/76185fc6-662d-f49b-9f02-0bd664e0d7a8.jpeg)

```
mtail on :3903
Build: mtail version v3.0.0-rc5-48-g6e17f80 git revision 6e17f8086ba73fe59c17e2156417bffdc4015d13 go version go1.8.3

Metrics: json, prometheus, varz

Debug: debug/pprof, debug/vars

Program Loader
test.mtail

No compile errors

Total load errors ; successes: 1

Log Tailer
/var/log

/var/log/messages
```

###json形式
xx.xx.xx.xx:3903/json

```
[
  {
    "Name": "line_count",
    "Program": "test.mtail",
    "Kind": 1,
    "Type": 0,
    "LabelValues": [
      {
        "Value": {
          "Value": 0,
          "Time": 0
        }
      }
    ]
  }
]
```

###prometheusフォーマット
xx.xx.xx.xx:3903/metrics

```
# TYPE line_count counter
# line_count defined at test.mtail:2:9-18
line_count{prog="test.mtail"} 2
```

問題なくmtailが起動したので、次はprometheusの準備


#Prometheusの準備

##監視対象を追加
mtailのエンドポイントをPrometheusが参照するように、Prometheusの設定ファイル`prometheus.yml`を修正します。
デフォルトのprometheus.ymlに、`localhost:3903`のジョブを追加します。

```
    static_configs:
      - targets: ['localhost:9090']
      - targets: ['localhost:3903']　←追加した行
```

設定ファイル修正後、Prometheusを起動して、メトリクスを収集できているかを確認します。

```
cd ~
cd prometheus-2.1.0.linux-amd64
./prometheus &
```

prometheusのtargetsの画面
xx.xx.xx.xx:9090にアクセスして確認
![ScreenShot.JPG](https://qiita-image-store.s3.amazonaws.com/0/152250/add72c32-0f0f-5f4a-38ff-f2c4897c87ea.jpeg)

##メトリクスの確認
graphで`line_counter`メトリクスの値を表示して見る
loggerでテストメッセージを/var/log/messasgesに出力してカウント値が増えるか確認。
行数3でスタートして、loggerで適当に出力して、4,5と増えることを確認した。
![ScreenShot 2.JPG](https://qiita-image-store.s3.amazonaws.com/0/152250/ddc3e7da-f279-089c-c776-c3595772034a.jpeg)

#以上
Re:VIEWで作成したpdfファイルでページ操作

Re:VIEWを使って印刷原稿を作っていて、PDFで入稿と考えてました。
今まではコピー本だったので適当で済みましたが、今回ちゃんと印刷したいと考え、表紙をフルカラー印刷、本文を黒で印刷とすると、表紙、裏表紙で使う4ページ分に何を割り振りするかを考えたいところです。しかしながらページコントロールがなかなかうまくいきません。
表紙の裏を白紙にしたり、裏表紙にイラストをあしらいたいと思い、config.ymlをいろいろ指定したりしましたが全くできませんでした。

Re:VIEW標準出力した時のページ割

- 表1 カバーページ
- 表2　タイトルページ
- 本文1 前書き→目次→本文→あとがき
- 表3　あとがき最終
- 表4 奥付

希望のページ割

- 表1 カバーページ
- 表3 奥付
- 本文　タイトルページ→前書き→目次→白紙→本文
- 表3 あとがき
- 表4　あとがき最終

やっているうちに気がついたのは、config.ymlは文書構造を記すところであり、ページ割についてはpdfなどの最終出力に依存するのでre:viewとは別のところでやったほうがいいのでは、と。

ということで、一旦標準のページ割でpdfファイルを作成し、それをpdftkで加工することにしました。

```

 pdftk A=book.pdf B=blanksheet-a4-portrait.pdf cat A1 Aend A2-7 B A8-r2 output booksort.pdf
```

として、

* 表紙
* 表2として奥付
* タイトルページ〜目次 
* ページ調整のための白紙
* 本文残り〜後書き。後書きが表3,表4に割り当てられる。

を実現しました。
これにはA4の白紙のpdfファイルが必要なのですが、こちらからダウンロードしたものを使いました。

http://kujiraiken.sit.ac.jp/blog/files/blanksheet-a4-portrait.pdf

これでマスターとなる booksoft.pdf ができた。これから印刷所に出すファイルを作成します。
印刷所用には、表1~表4のファイルとそれ以外のファイルを分離しないといけないので

```

pdftk A=booksort.pdf cat A1 A2 Ar2 Ar1 output bookhyousi.pdf
pdftk A=booksort.pdf cat A3-r3  output bookhonbun.pdf
```

さて、印刷はA5を希望中ですが、データのペーパーサイズはA4。

以下のサイトを参考に、
https://unix.stackexchange.com/questions/185145/convert-pdf-to-a-different-page-size-us-letter-a4

ペーパサイズの変更をしました。

```

pdfjam --outfile bookhyousiA5.pdf --paper a5paper bookhyousi.pdf
pdfjam --outfile bookhonbunA5.pdf --paper a5paper bookhonbun.pdf
```
TypeScriptでタプルへの型推論を行う方法

TypeScriptで以下のようなコードでタプルを定義しようとしても、`[string, number]`型ではく`(string|number)[]`のような共用体(Union)の配列と型推論されてしまいます。

```notuple.ts
const tupleStrNum = ["X", 2]; // (string|number)[]
```

以下のように型定義をすることもできますが

```tuple.ts
const tupleStrNum = ["X", 2] as [string, number];
// or
const tupleStrNum: [string, number] = ["X", 2];
```

以下のような関数を定義しておくことで

```util.ts
export function tuple<T1, T2>(t1: T1, t2: T2): [T1, T2];
export function tuple<T1, T2, T3>(t1: T1, t2: T2, t3: T3): [T1, T2, T3];
export function tuple(...args: any[]) {
    return args;
}
```

以下のようにしてタプルへの型推論を行うことができます。

```tuple.ts
import { tuple } from "./util";

const tupleStrNum = tuple("X", 2); // [string, number]
```
ディレクトリ構成をファイル名も含めてtxtで出力する方法

# 環境

OS : Windows7

 

# 構文

tree [対象ディレクトリの絶対パス] /f > [ファイル名+”.txt”]

 

# コマンド例

 

treed:\UserArea\User\Desktop/test /f > tree.txt

 

# 結果

コマンドプロンプトのカレントディレクトリに出力されました。

 

├─test1
├─test2
└─test3
JupyterLab Basic Customizing of index.html

# local jupyterlab index.html
we can see jupyterlab html source code easily for the sake of browser. it is like below.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/c94aace8-43ca-4d8c-bdf3-042bd60f973e.png)

in this document, we are going to discuss how to customize the index.html

# index.html places
there are 2 places to show index.html

- when you run jupyterlab with `jupyter lab --dev-mode`, it shows jupyterlab/jupyterlab/dev_mode/static/index.html
- when you run jupyterlab with `jupyter lab`, it shows %conda_prefix%/share/jupyter/lab/static/index.html
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/ae037451-26d0-228a-58e2-005fca87ea4e.png)

# static/index.html
now, let's see the index.html. It is a python jinja2 template file.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/e78e4e26-d425-fab2-483b-ebabda746e02.png)
then, where is the python file to render with this index.html?

# jupyterlab_launcher
http://github.com/jupyterlab/jupyter_launcher
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/05e0a795-3fa8-c10e-287c-909780554806.png)

Okay, let's install jupyterlab_launcher to see what is in it and do some customizing it later.

```
pip freeze | grep jupyter
git clone http://github.com/jupyterlab/jupyterlab_launcher
cd jupyterlab_launcher
pip install -e .
cd ../jupyterlab
pip install -e .
pip freeze | grep jupyter
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/a7a471dd-e981-c872-fe27-c18ccd461711.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/90f46933-91c2-5763-ffcf-13c39dfd9661.png)


then, open the handlers.py under the directory. you can find code for loading index.html and rendering it with page_config

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/c3de5a7a-f726-09b9-76e7-e90a20dfb354.png)

so, we can customizing jupyterlab html document by modifying this index.html. right? NO. index.html is composed with some template files.

# templates
when you do `jlpm run build`, the a webpack script will produce index.html by rendering templates/*.html. so what we are gonna do is playing with these files. especially, we could have a focus on partial.html

/jupyterlab/dev_mode/templates/partial.html

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/212f6a11-7cb1-26c0-c5d6-bf9c9f9b1d41.png)

# let's make some modification.
```
<script>alert('hello world');</script>
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/16f0eebc-ecd1-7a9d-ea90-fff61b70de87.png)
```
jlpm run build
jupyter lab --dev-mode
```
you might need to press `shift+f5` to flush the cache files.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/72b572a7-610c-46a1-6e5d-b4ea67e533e3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/16b5d4b0-9608-5fc0-d59e-997f052c2a90.png)

and the html source code is like below
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/431287ab-dae3-a81b-e27b-6df44173eca9.png)
FRBの金利データをRSSから抜き出してみる

#はじめに
　ここのところ、どうしてもアメリカの金利が気になる。だが、毎日確認するのも非常に面倒だ。一応イールドカーブを確認するサイトはあるのだが、他のデータとの比較がし辛い。
[Dynamic Yield Curve](http://stockcharts.com/freecharts/yieldcurve.php)
　そこで、プログラミングの練習ついでにPythonでスクレイピングを試してみようと考えた。

#データの抜き出し
##初期の考案
　アメリカの金利は、FRBが毎日配信している。
[Daily Treasury Yield Curve Rates](https://www.treasury.gov/resource-center/data-chart-center/interest-rates/Pages/TextView.aspx?data=yield)
　最初はこのグラフからCSSセレクタを使ってスクレイピングを、と考えたのだがあまりにめんどくさい。また、当該ページのXMLからスクレイピングすることも試したが、毎日更新されるものであることを考えると、重複データの削除等の処理が煩雑になる。

##実行した案
　そこで、FRBが毎日RSSで配信している金利データをスクレイピングすることにした。
[Data: Selected Interest Rates (H.15)](https://www.federalreserve.gov/feeds/h15_data.htm)
　例えば、30年もの国債の利回りは次のようなXMLで公表されている。
[FRB:Data:H.15 Selected Interest Rates](FRB:Data:H.15 Selected Interest Rates)

#コード
　形式がわかったところで、早速スクレイピングしてみよう。
　まずは、定石通り、urllibでリンクからXMLを抜き出す。ただ、どうやらタグに名前空間(コロンのこと)がついているため、find("value")としただけでは検索できないらしい。この問題は、find("cd:value")とすれば解決するようだ。
　それで、動くコードはこちら。

```test.py
import urllib.request as req
from bs4 import BeautifulSoup 

url= "https://www.federalreserve.gov/feeds/Data/H15_H15_RIFLGFCY30_N.B.XML"
res=req.urlopen(url)
soup=BeautifulSoup(res,"lxml")
d=soup.item
print(d.find("cb:value").string)
```
出力(日によって変わります)
```
3.03
```

とりあえず今日はここまで。次は1ヶ月ものから30年ものまでをまとめて抜き出せるようにしたい。
Vuepress入門

# Vuepressとは
* VuepressはVue.jsの作者が作った、Vueで動く静的ページジェネレーターです
* markdownで書かれたファイルをhtmlに変換してくれます
*  **markdownの中でvueが書けます**
* イメージはGitbookのVue版に近いです

開発リポジトリは以下です。 [(Github:vuejs/vuepress)](https://github.com/vuejs/vuepress)

# Vuepressを使うメリット
* ドキュメントドリブンで運用しやすい(1マークダウン1ページ)
*  **Vueのコンポーネントを使えるので、markdownを拡張しなくてもよい**
* 快適なmarkdown環境が最初から用意されている [(Config Reference:Markdown)](https://vuepress.vuejs.org/config/#markdown)



# 導入
node環境が用意されていることが前提です。
公式の手順は https://vuepress.vuejs.org/guide/getting-started.html を参照してください。

**作業用フォルダを作成し、移動。**

```shell

mkdir vp_test
cd vp_test
```

**プロジェクトを初期化**

```shell

npm init //とりあえずenter連打
```


**vuepressの導入**

```js
npm install --save-dev vuepress //公式ではグローバルだけどローカルにインストール
```

**コマンドを用意**
グローバルにインストールしていない(vuepress devを叩いても動かない)ので、package.jsonにコマンドを用意します。

```js
"scripts": {
  "dev":"vuepress dev", //開発中
  "build":"vuepress build" // 静的ファイルをジェネレート
},
```

これで環境が用意できました:clap:

# ディレクトリ構造
プロジェクトフォルダ直下にあるmarkdownファイルは、自動でコンパイルされるようです。
今回はこのような構成でいきます。

```shell

vp_test
├ .vuepress 　　//vuepress関連のファイルが配置される
│　　　　├ dist 　　// npm run buildで生成されたファイルが入ってる
│　　　　├ components 　　// vueコンポーネントを入れる。vueファイルは自動で登録され、markdown内で自由に使用できます。
│　　　　│  └ ColorTip.vue 　　
│　　　　├ public 　　// ドキュメントの生成に直接関係ない静的ファイル(画像とか)
│　　　　└ config.js　　  // vuepressの設定ファイル
├ Readme.md 　　// ルートとなるmarkdown
└ docs // markdownファイルを置くディレクトリ
 　　　　└ color.md  // ページのmarkdown
```

# config.jsの編集

```js

module.exports = {
  head: [
    ['link', { rel: 'icon', href: `/logo.png` }] //[タグ名,{キー:バリュー}]
  ],
  port:'3000', //開発中のポート番号
  themeConfig:{
  // Vueファイル内で、$site.themeConfigでアクセスできます
  // 今回は出てきませんが、テンプレートの出し分けなどに使います
  // この辺を参照 https://github.com/vuejs/vuepress/blob/master/lib/default-theme/Layout.vue
  },
}
```

# markdownファイルを書く
```markdown

# カラーコード一覧

* 色を一覧にします
* components以下は自動でグローバルに登録

<color-tip v-for="color in colors" :hex="color" /> 

<script>
const colors = ["#FF0000","#00FF00","#0000FF"]
export default{
  data(){
    return{
      colors
    }
  }
}
</script>
```

```vuejs

<template lang="html">
  <span :style="{ color: hex }">{{hex}}</span>
</template>

<script>
export default {
  props:{
    hex:{
      type:String,
      reqire:true
    }
  }
}
</script>

<style lang="css">
span{
  display: inline-block;
}
</style>

```

# Scssの導入

# カスタムテーマ
カスタムテーマを使いたい場合は、config.jsに下記を追加します。

```
 theme:"customtheme" // node_modules/vuepress-theme-customtheme を用いる
```
与えた値がそのままディレクトリ名に反映されます。node_module以下なので別途リポジトリを立ててそこでテンプレート管理するほうが楽でしょう。
(まだ出来たてなので特に記述ないですが、多分そういう運用前提なのでは)




# 参考サイト
* [公式サイト](https://vuepress.vuejs.org/)
* [VuePress をお試ししてみた](https://qiita.com/dojineko/items/aae7e6d13479e08d49fd)
sphinxの数式機能を拡張する

# 環境

Windows7

 

# ファイルのダウンロード

- 以下リンク先よりjsMathとjsMath Image Fontsディレクトリから最新ファイルをzipでダウンロード

    - [jsmath](https://sourceforge.net/projects/jsmath/files/?source=navbar)
 

# ファイルの展開

- それぞれdoc/_staticに展開する

 

# conf.pyの設定

- General configuration に以下を追加

 ```python:conf.py
# load sphinx.ext.jsmath module
extensions += ['sphinx.ext.jsmath']

# arrange path jsMath (relative path from _static/)
jsmath_path = 'jsMath-3.6e/easy/load.js'

 ```

# ビルド

- 以下を追記しmake htmlを実行

.. math:: F = ma
RHEL7で環境変数を永続的に設定する

#RHEL7で環境変数を永続的に設定する
参考：
https://www.kannon.link/fuku/index.php/2016/09/09/01-3/

## 結論
- 特定ユーザに環境変数を設定したいのであれば、全ユーザに環境変数を設定したいのであれば、/etc/profile
- 特定ユーザに環境変数を設定したいのであれば、特定ユーザに環境変数を設定したいのであれば、~/.bash_profile 

ということなので、ログイン時のbash設定ファイルの読み込み順序は以下順。
    1. /etc/profile
    2. ~/.bash_profile

/etc/profile.d/内にある、*.shが自動で呼ばれる。
~/.bash_profileに記述されている内容が、ユーザログイン時に実行される（ユーザ毎に用意）


設定ファイルの内容を反映(または再ログイン)

```bash
$ source ~/.bash_profile
```