OmniAICreator/Qiita-1.07M huggingface dataset:
Linux の timezone


Linux の timezone についてちょっと調べた。

Ubuntu では、現在の timezone は /etc/localtime にある。このファイル自体はシンボリックリンクで、実体は `/usr/share/zoneinfo` 以下にある。ここに timezone には関係する色々な情報が入っているらしいが、バイナリファイルなので直接は読めない。中を調べる方法は二つある。

## zdump でファイルを読む

zdump は現在の時刻を指定された timezone で表示するツールだが、-v オプションを付けると timezone data の解釈を表示してくれる。

```sh
$ zdump -v /usr/share/zoneinfo/Japan | tail
/usr/share/zoneinfo/Japan  Sat May  6 16:59:59 1950 UT = Sun May  7 01:59:59 1950 JST isdst=0 gmtoff=32400
/usr/share/zoneinfo/Japan  Sat May  6 17:00:00 1950 UT = Sun May  7 03:00:00 1950 JDT isdst=1 gmtoff=36000
/usr/share/zoneinfo/Japan  Fri Sep  8 15:59:59 1950 UT = Sat Sep  9 01:59:59 1950 JDT isdst=1 gmtoff=36000
/usr/share/zoneinfo/Japan  Fri Sep  8 16:00:00 1950 UT = Sat Sep  9 01:00:00 1950 JST isdst=0 gmtoff=32400
/usr/share/zoneinfo/Japan  Sat May  5 16:59:59 1951 UT = Sun May  6 01:59:59 1951 JST isdst=0 gmtoff=32400
/usr/share/zoneinfo/Japan  Sat May  5 17:00:00 1951 UT = Sun May  6 03:00:00 1951 JDT isdst=1 gmtoff=36000
/usr/share/zoneinfo/Japan  Fri Sep  7 15:59:59 1951 UT = Sat Sep  8 01:59:59 1951 JDT isdst=1 gmtoff=36000
/usr/share/zoneinfo/Japan  Fri Sep  7 16:00:00 1951 UT = Sat Sep  8 01:00:00 1951 JST isdst=0 gmtoff=32400
/usr/share/zoneinfo/Japan  9223372036854689407 = NULL
/usr/share/zoneinfo/Japan  9223372036854775807 = NULL
```

それぞれの意味はマニュアルを読んでも良くわからなかったが、複数のゾーンが定義されている雰囲気は分かる。

## ソースコードを読む

`apt-get source tzdata` でソースコードを取得できるが、大本は [Time Zone Database](http://www.iana.org/time-zones) らしい。日本のタイムゾーンのソースは https://github.com/eggert/tz/blob/master/asia#L1512 にある。これが歴史的資料感を醸し出していて非常に面白い。

## timezone の変更方法

ここでも systemd の支配が及んでいて、timezone の変更も systemd で行う。コマンド名は [timedatectl](https://www.freedesktop.org/software/systemd/man/timedatectl.html)。

timezone を自動検出する方法としては [tzupate](https://github.com/cdown/tzupdate) というのを見つけた。[ip-api.com](http://ip-api.com/json) などの API を利用している。

現在位置を求める方法として [GeoClue](https://www.freedesktop.org/wiki/Software/GeoClue/) も使えそうだが TimeZone を返す API は見つからなかった。

## 参考

* [tzfile マニュアル](https://linuxjm.osdn.jp/html/LDP_man-pages/man5/tzfile.5.html) timezone data のフォーマット
* [zdump マニュアル](https://linuxjm.osdn.jp/html/LDP_man-pages/man8/zdump.8.html)
* [How can I examine the contents of /etc/localtime?](https://unix.stackexchange.com/questions/85925/how-can-i-examine-the-contents-of-etc-localtime)
* [how to read time zone information](https://askubuntu.com/questions/31842/how-to-read-time-zone-information)
* [Time Zone Database](http://www.iana.org/time-zones)
* [ubuntu パッケージ tzdagta](https://packages.ubuntu.com/ja/xenial/tzdata)

この調査の動機は現在使ってる AGL に timezone を設定したかったからだが、意外と面倒だったのでやめた。
ホームページ上の地図に、現在地を表示し、目的地までの距離を算出する

ホームページ上に地図が掲載されていることはよくありますね。現在地から目的地まで、どれくらい距離があるのか、を調べたいケースもあります。

今回は、位置情報を利用して、現在地を地図に表示する、現在地から目的地までの距離を算出する、をやってみました。

## geolocation

geolocation機能で、現在地を取ってくることができます。なお今回の記事は、
 https://developer.mozilla.org/ja/docs/Web/API/Geolocation/getCurrentPosition を参考にして、作成しています。

ホームページ作成ソフト(CMS)にconcrete5を使っている都合で、concrete5で使うコードが入っています。

```javascript
        // id="currentlocation" をクリックしたときに、現在地を取得する
        $('#currentlocation').click(function(e){
            e.preventDefault();
            navigator.geolocation.getCurrentPosition(ounziw_osm_successCallback, ounziw_osm_errorCallback);
        });

        // 現在地が取得できたときの処理
        function ounziw_osm_successCallback(position) {
            // point0が目的地。既に地図があって、そのマーカーの情報を取ってきている
            // <?php echo $unique_identifier?>は、concrete5ブロック識別用IDを出力する
            var point0 = L.latLng($('#map<?php echo $unique_identifier?>').data("markerlat"), $('#map<?php echo $unique_identifier?>').data("markerlng"));
            // point1 が現在地。
            var point1 =  L.latLng(position.coords.latitude, position.coords.longitude);

            // leaflet.js の機能を使って、2点間の距離を計算する
            var distance = L.CRS.Earth.distance(point0, point1);
            $("#distance").text(parseInt(distance)+' m');

            // 地図の縮尺を変更する。2点が収まる大きさにする。
            map.fitBounds(
                [point0, point1]
            );

            // 現在地の場所に、アイコンを置く
            var currentPosition = L.icon({
                // <?php echo $package_path;?>は、concrete5のパス出力する
                iconUrl: '<?php echo $package_path;?>images/current-position.png',
                iconSize: [32, 32],
                iconAnchor: [13, 32],
            });
            var markers = L.marker(
                point1, {icon: currentPosition}
            ).addTo(map);
        }

        // 現在地が取得できなかったときの処理
        function ounziw_osm_errorCallback(error) {
            var err_msg = "";
            switch(error.code)
            {
                case 1:
                    // <?php echo t('......');?> は、concrete5の多言語対応機能
                    err_msg = "<?php echo t('Location access is not allowed.');?>";
                    break;
                case 2:
                    err_msg = "<?php echo t('Current position is not obtained.');?>";
                    break;
                case 3:
                    err_msg = "<?php echo t('Timed out.');?>";
                    break;
            }
            document.getElementById("distance").innerHTML = err_msg;
        }
```
## 公式サイトで公開
concrete5の公式サイトで、[Free Map](https://www.concrete5.org/marketplace/addons/free-map)アドオンを公開しました。誰でも、ご自分のホームページなどに設置できます。

## 活用例
[一般社団法人　東海中小企業支援協会](https://tssa.or.jp/outline)、[レスキューワーク株式会社](http://rescuework.nagoya/access)などをごらんください。

## 動画
youtube に公開しています。
https://www.youtube.com/watch?v=oKEWAxCr_W0


## 注意点
位置情報を取得して送信するには、httpsでの接続が要求されるようです。(多くのブラウザで、http接続の場合は位置情報送信ができないように設定されています。)利用する場合は、https環境にてご利用ください。
Excel2013UPDのVBA注意点

Excel2013以前→Excel2013へ移行したときにVBA周りがてんやわんやしたときの話。

知識集約として載せる。

#### Excel2013で何がおこったか
https://blogs.msdn.microsoft.com/office_client_development_support_blog/2016/12/19/excel2013-changes-to-sdi/

平たく言うと、2013以前はExcelアプリケーションというウインドウに複数のBookが乗っかっていた(アプリケーション閉じるボタンの下の奴で最小化すれば、複数bookを並べられたやつ)。

2013以降は個別のBookごとにウィンドウが立ち上がる。

#### VBAにどんな問題が？
1Bookで閉じてる処理なら問題ない。
問題があるのは、複数bookに渡って操作をする場合だ。

2013以前は1アプリケーションに紐づく全てのBookがActiveな状態だった。
対して2013以降は、別ウィンドウとして表示されるBookが処理の過程で非Activeとなる可能性がある、と言う話。

VBA、ExcelApplicationの一部の処理が、Active Bookを前提とした動作をするため、そのときに対象が非Activeな状態だったらVBA処理がエラー落ちしてしまう。

####対処法は？
非Activeな操作の前に、意図的に対象をActive、もしくは明示してやる必要がある。

自分で分かっているActive前提の処理をいかに羅列する。

##### .Runでマクロを起動する処理
既にOpen済みのBookに対してだけなら、マクロ名を引数に渡せば実行してくれる。
だけど、Excel2013以降、Open済みでも非ActiveなBookが対象なら、ブック名!マクロ名で起動する必要がある。

##### .Deleteでシートを削除する処理
https://support.microsoft.com/ja-jp/help/2928902

ということで、Delete発効前に、非ActiveなBookをActivateさせなきゃいけない。

#### まとめ
現状動かないと分かったのは上記。
ExcelAppの中身が調べられればいいんだけど、その方法は知らないっす。
とりあえず、リネームやシートの移動は問題ないみたい。
また何か不具合があったら追記します。
プログラムど素人がVSCodeを使いNode.jsとSeleniumでChromeを動かしてみた

# はじめに
タイトルのとおりにvscodeのインストールからNode.jsとSeleniumでChromeを動かすまでの流れ書いています。
コードなんて仕事で少し読んだくらいで「何やってるのかはなんとなーく分かるけど書くことはできないし全部は理解できない！(ｷﾘ」みたいな程度のスキルしかないので、細かい所はご容赦ください。

# インストールする色々
* VSCode
    * 拡張機能: npm
* nodebrew : 0.9.8
   * node.js : 7.5.0
* selenium-webdriver : 3.6.0
* chromedriver : 2.36.0

## VSCode
[公式サイト](https://code.visualstudio.com/) より「Download for Mac」という緑色のボタンをクリックしてzipファイルをダウンロード。ダウンロードしたzipファイルを解凍すると、appファイルが展開されるのでそれを好きな場所に置く。無事に起動したら完了。

## nodebrew
seleiumuのサポートバージョンを考慮してNode.jsのバージョン管理ができるようにnodebrewをインストール。
[こちら](https://qiita.com/teratsyk/items/51d64010cb341b54491b)をご参考にさせて頂きました。

selenium-webdriver の [Node Support Policy](https://github.com/SeleniumHQ/selenium/tree/master/javascript/node/selenium-webdriver#node-support-policy) では`v6.9`と`v7.5`をサポートしているとのことで、新しい方の`v7.5`をインストール。

```terminal:nodebrewでnodeをインストール
$ nodebrew install-binary v7.5
$ nodebrew use 7.5
```
## npm install
npm installをするのはVS Code上で行う。
VSCode拡張機能のnpmをインストールして、コマンドパレットから以下をインストールする

```text:selenium-webdriver
> npm: install and save dependency
> selenium-webdriver@3.6.0
```

```text:chromedriver
> npm: install and save dependency
> chromedriver
```
# 実際にChromeを起動してみる
以下のコードでChromeを起動してYahooのTOPを表示する事ができる。JavaScriptでのプログラムお作法については全くの無知なのでお察しください。

```javascript:sample.js
webdriver = require('selenium-webdriver');

driver = new webdriver.Builder()
    .withCapabilities(webdriver.Capabilities.chrome())
    .build()

driver.get('https://www.yahoo.co.jp/');
```
# 次やること！
とりあえず起動してとあるページを開くというところまではできたので、次はページ内の要素にアクセスしてみたり、JavaScriptのお作法を覚えたり、そもそもWebdriverIOとなるものもあるので、そこら辺の勉強をしていきたい。

# この記事を書くときに詰まったときのメモ

### npmでpackageのversionを調べたいとき

selenium-webdriverをバージョン指定無しで実行すると4.0.0-alpha1がインストールされるので、alphaという安定してない感があったため存在するバージョンを調べるために使った。

```
npm info <package name> versions
```

### npmでversionを指定してインストールする

コマンドパレットからnpm installする場合は\<package name>@\<verison>をフォームに入れるだけ。以下はターミナルからコマンドで実行する場合に使う。

```
npm -g install <package name>@<version>
```

### npm install の "-g" って？？

-gはglobalを意味しており、他のプロジェクトでも利用するような横断的なpackageをインストールするときにつけるものらしい。
GPU搭載ノートPC (Lenovo P50)で、TensorFlow-GPU開発環境  セットアップ備忘録

# ポイント

- GPUノートPCに、高速 TensorFlow 開発・学習環境を構築
- TensorFlow は Google推奨 Virtualenv 利用でインストール
- CUDA 周りのバージョンは以下
    - CUDA 9.0（最新の 9.1 ではなく）
    - cuDNN 7.1.1.5

# 前提の環境

- PC : Lenovo [Thinkpad P50](https://www3.lenovo.com/us/en/laptops/thinkpad/thinkpad-p/ThinkPad-P50/p/22TP2WPWP50) モバイル・ワークステーション
- GPU: NVIDIA Quadro M2000M (4GB) (Optimus構成)
- CPU: Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
w- Storage: 512GB SSD (NVMe) + 512GB SSD (2.5-inch)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/111730/469e8ff0-838f-cf76-d078-1e10b62ccc29.png)


# OS インストール

- NVMe SSD にインストールされている Windows環境を保存するために、空きベイに 2.5インチ SSD をインストールした
- 下記パーツを利用
    - [Lenovo 4XB0L63274 Hdd_bo Thinkpad Storage Kit Kit](https://www.amazon.com/gp/product/B01DXK5PAS/)
- Ubuntu 16.04.4 をインストール (ubuntu-16.04.4-desktop-amd64.iso)
- 起動時に `Enter` キーを押して、その後 `F12` キーで、一時的に起動ドライブを選択して　Ubuntu を起動

![image.png](https://qiita-image-store.s3.amazonaws.com/0/111730/bfff7265-cd5c-93bc-25d0-8246d8919486.png)

# NVIDIA ドライバーのインストール

Ubuntu Software のメニューから「Software & Update」を選択。
Additional drivers タブで、NVIDIA binary driver を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/111730/dfff0865-0673-d7ac-7b35-f5a872a106f6.png)

再起動してから、以下を確認。

```bash
$ lspci | grep -E "VGA|3D"
$ nvidia-smi
```
# CUDA 周りのインストール

TensorFlow（少なくとも v1.5, v1.6）に求められる CUDA  9.0、cuDNN 7.1 の組み合わせをインストール

## CUDA インストール

Debファイルでレポジトリ・メタデータを登録する方法で。
CUDA 9.0 のアーカイブページから以下をダウンロード。

https://developer.nvidia.com/cuda-90-download-archive
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111730/101b0968-45d8-3c10-fb24-1323ddec746a.png)

```bash
$ cd Downloads
$ sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda
```

## cuDNN 

同じくDebファイルでレポジトリ・メタデータを登録する方法で。
cuDNN のダウンロードページは、NVIDIA Developer ログインが必要。（登録していない人は登録しましょう）

CUDA 9.0 用の cuDNN v7.1.1 の、Ubuntu 16.04 向け Runtime Library、Developer Libray、Code Samples and User Guide をダウンロード。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/111730/ae3e706d-e960-7603-70c7-a465cb748466.png)

```bash
$ cd Downloads
$ sudo dpkg -i libcudnn7_7.1.1.5-1+cuda9.0_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.1.1.5-1+cuda9.0_amd64.deb
$ sudo apt-get install cuda-command-line-tools-9-0
$ sudo apt-get update
$ sudo apt-get install cuda
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/extras/CUPTI/lib64
```
Ubuntu 16.04にRuby 2.5.0をインストールするメモ

# 概要
- Ruby 2.5.0をUbuntu16.04にインストールする
    - rbenv使う
    - 通常のリポジトリで提供されているのは2.3.0

# 手順


```
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git .rbenv/plugins/ruby-build
$ echo 'export PATH="~/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
$ rbenv install -l
$ sudo apt-get install gcc
$ sudo apt-get install build-essential
$ sudo apt-get install libssl-dev libreadline-dev zlib1g-dev
$ rbenv install 2.5.0
$ rbenv global 2.5.0
```
🔰プログラミング初心者の方へ


## 必読

プログラムを習得していくつもりがあるなら下記3つ。推奨します**強く**。

- その変数はどこからきているのか？という疑問をもつ
- いろいろサンプルをみて正しい引数（やオプション）の渡し方を身につける
- エラーを解読し、調べ、原因を特定する

## おかしなコードを書かないために

- インデントを揃えなさい(*1)
- 2行以上の改行がちらほら見られると、見た目が汚い
  - 改行の数では読み手にはよくつたわらない
- ローマ字で命名しない。日本語とかもってのほか。
- キャメルケースとスネークケースが入り乱れるのもご法度。迷ったらキャメルケース

何よりも何よりも**統一感**が大事

**＊1: 「インデントを揃えるってなに？」ってひとへ:**

- `{`の直後に改行がくる場合は改行後のインデントをあげなさい
- `{`とペアになる`}`のインデントは、`{`の行のインデントと合わせなさい
- そのプロジェクトで1インデントが何文字分なのかを覚えておきなさい
    - 2文字分なのに1インデント4文字分使うのはご法度です

これやらないと先輩エンジニアから叩かれますよ

## 良記事

>私もそうやってきたのですが、プライベートで何か作ることは、
*もっとも* 勉強になりますし、就活時、非常に有利になります。

>プライベートで何かサービスを思いつきそれを実際に作っている人は、基本的にプラグラムや作る人が好きなひとです。
好きこそものの上手なれで、そういう人は成長が早いと見られますし、実際自己解決力、応用力が高いです。

>最も勉強になるのはおろか、
面接時その熱意が伝わりますし、面接相手へいろいろな事が語れます。

>何かサービスを思いつきそれを実際に作ることは、この業界でとても重要です。


- オブジェクト指向
    - [初心者向けに徹底解説！オブジェクト指向とは？](https://eng-entrance.com/what-oop)

- Jsでのクラスの実装方法
    - [メソッド定義と呼び出し - Google流 JavaScript におけるクラス定義の実現方法](http://www.yunabe.jp/docs/javascript_class_in_google.html#メソッド定義と呼び出し)

- DRY
    - [DRY原則 | プログラマが知るべき97のこと](https://プログラマが知るべき97のこと.com/エッセイ/DRY原則/)
iPhoneのSafariでdisabledのinputの文字色を指定する

iPhoneのSafariにおいて、disabledのinputに入っている文字の色を変更するためには下記のように指定する必要がある。

```css:style.css
input {
  -webkit-text-fill-color: black;
  opacity: 1;
}
```

`-webkit-text-fill-color`で色を指定し、`opacity`で透過率を指定する。
Raspberry Pi2/3 でUSBメモリを使う

## :construction: USBの抜き差しは慎重に行うこと(mount/unmount)

### 用意するもの
***
1. Raspberry Pi2/3
1. USBメモリ

### Raspberry Pi2/3でUSBメモリを使う
***
1. USBメモリ差してリブート  

    ```
    $ sudo shutdown -r now
    ```

1. Raspberry Pi2/3がUSBメモリ( `/dev/sda1` )を認識しているか確認

    ```
    $ sudo fdisk -l
    ```

1. Raspberry Pi2/3がUSBメモリをマウントするためのディレクトリを作成
    ディレクトリが空であることを確認

    ```
    $ sudo mkdir /mnt/usb1
    $ ls -la /mnt/usb1
    ```

1. Raspberry Pi2/3にUSBメモリをマウント
    ディレクトリにUSBメモリの内容が表示されることを確認

    ```
    $ sudo mount /dev/sda1 /mnt/usb1
    $ ls -la /mnt/usb1
    ```

1. 後はしたいことをする

### Raspberry Pi2/3でUSBメモリを取り外す
***
1. Raspberry Pi2/3にUSBメモリをアンマウント
    ディレクトリが空であることを確認

    ```
    $ sudo umount /mnt/usb1
    $ ls -la /mnt/usb1
    ```

1. USBメモリを取り外す

### 感想
***
差したら(mount)、外す(umount)！
外したら(umount)、元の場所に戻す！
[Linux]共有ライブラリが見つからない時にやること 

## プログラムが実行できない。ライブラリが見つからない！

プログラムを実行するとなにやらエラーが！
なになに.. どうやら「libhogehoge.so.2」という共有ライブラリが見つかんないようだ。


```bash
$ ./server
$ ./server: error while loading shared libraries: libhogehoge.so.2: cannot open shared object file: No such file or directory
```

## はじめに確認すること

まずプログラムが必要とする共有ライブラリを 「ldd」コマンドを使って確認する。

```bash
$ ldd server
        linux-vdso.so.1 =>  (0x00007fffb21f1000)
        libhogehoge.so.2 => not found
        libboost_system.so.1.65.1 => /usr/local/lib/libboost_system.so.1.65.1 (0x00007f59aaaf1000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f59aa8ed000)
          ：
```

たしかに、「libhogehoge.so.2」が「not found」だ。
これを解決すれば動くようになりそう！
※まぁプログラム実行時のエラー内容からも分るが念のための確認ということで。

## ファイルはあるか？

漢らしくfindコマンドでファイルを検索だ！

```bash
$find /usr -type f -name "libhogehoge*"
```

ここでファイルが無ければ yum なり コンパイルするなりでライブラリを入れることとなる。
ファイルがある場合はどうするか？

その場合、次に確認しないといけない点は
「バージョンが一致しているか」と「検索パスに含まれているか」だ！

## バージョンが一致しているか

ライブラリは有志によりBUG修正や機能拡張が行われているためバージョンによっては互換性がないものもある。そのためプログラム実行時には、そのプログラムが作成された時に使われたライブラリと互換性のあるライブラリが必要となる。

ただ、バグ修正などでライブラリのバージョン番号は頻繁に上がっている。それを一致させる事は非常に難しい。ではどうすればよいか？バージョンは「メジャー番号」と「マイナー番号」に別れ、互換性が失われる場合に「メジャー番号」を繰り上げるルールとなっている。つまり、バージョンを完全一致させるのではなく、「メジャー番号」だけが同じであれば良いこととなる。

先ほど、ファイルが見つかったがライブラリが読み込まれていない場合、このバージョン番号不一致ではないだろうか？「libhogehoge.so.2」を必要としているが「libhogehoge.so.1」があるだけで「libhogehoge.so.2」がないのではないか？

その場合は、プログラムが必要とするメジャーバージョンのライブラリを yum なり コンパイルなりで入れる必要がある。

ファイルが存在する場合は、次に「検索パス」を調査だ。

## 検索パスの設定

プログラムを実行すると、一般的にそれに必要なライブラリを自動的に /lib(64) や /usr/lib(64) 配下から見つける。 つまり以外の場所でライブラリが見つかった場合、ライブラリの検索場所でない可能性が高い。たとえば、/usr/local/lib64 でファイルが見つかった場合、以下のコマンドを実行して ldd コマンドを試してみよう。

```bash
$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
```

これはライブラリを検索するパスを設定する環境変数となり、この配下に格納されているライブラリがプログラム実行時の検索対象となる。この設定でファイルが見つかれば、起動スクリプト内で設定してあげると良い。なおシステム全体に設定を反映する場合は、「/etc/ld.so.conf」に記載してあげよう。

## それでも見つからない場合

私のスキルではこれ以上の対策は思いつきません！
こういうことも確認すれば良いよ？ みないな事があれば是非教えてください！
AWS の CloudTrail の Dashboard では参照系の API のアクティビティが検索できない

https://aws.amazon.com/jp/cloudtrail/faqs/
> Q: AWS マネジメントコンソールから行われた API コールは記録されますか?
> はい。CloudTrail はあらゆるクライアントからの API の呼び出しを記録します。AWS マネジメントコンソール、AWS SDK、コマンドラインツール、および高レベルの AWS サービスから AWS API が呼び出されるので、これらの呼び出しは記録されます。

上記のように記載されているが、Dashboard では普段複数ユーザがコンソールを参照で使用しているAPIの状況は可視化できない。
これを実現するには、TrailDash や splunk 等を使用する必要がある。
[TrailDashでCloudTrailを可視化する](https://dev.classmethod.jp/cloud/aws/visualize-cloudtrail-using-traildash/)
フォームでドロップダウンを使用時に特定の選択肢が選ばれたら出す入力欄を入力必須にする方法（jQuery）

#やりたいこと
![スクリーンショット 2018-03-15 11.18.22.png](https://qiita-image-store.s3.amazonaws.com/0/240838/9e7457b9-6936-6344-d1bc-edfd44b0321a.png)


今回やりたかったのはドロップダウンメニューで「その他」が選ばれた時に表示する入力欄を入力必須にするためにrequiredをつけること。

その他を選択するまではこの入力欄はtype="hidden"のため、最初からrequiedをつけるとフォームの挙動がおかしくなり送信されない。その辺はこれを読むと理解がしやすい。https://developer.mozilla.org/ja/docs/Web/HTML/Element/Input

そこでjQueryを使って入力欄が出たタイミングでrequiedをつけることにした。今後この入力欄のことを隠し入力欄と呼ぶことにする。

#実装方法
前提：bootstrap4を使用している。

```html:ドロップダウンメニュー
<select class="form-control form-control-lg" id="inputState" name="〇〇" type="text" required>
   <option value="〇〇">〇〇</option>
   <option value="〇〇">〇〇</option>
   <option value="〇〇">〇〇</option>
   <option value="その他">その他</option>
</select>
```

```html:隠し入力欄
<input class="form-control form-control-lg" id="tr_writer" name="職種_その他" type="hidden" placeholder="職種を入力 [必須]"></input>
```


```js:使用したjQuery
$("#inputState").change(function() {
 var extraction_val = $("#inputState").val();
 if(extraction_val == "その他") {
  $('#tr_writer').attr({
     type: 'text',
     required: ""
  })
 }
});
```

これで実現する。jQueryについてはコードを見ればなんとなくわかる程度なのでもっと勉強したい。
Project Euler 53「組み合わせ選択」

ワンライナーって気持ちいい。
でも [次の問題](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2054) をチラ見したらクソ程めんどくさそうで若干萎え気味。

# Problem 53 「組み合わせ選択」
12345から3つ選ぶ選び方は10通りである.
123, 124, 125, 134, 135, 145, 234, 235, 245, 345.
組み合わせでは, 以下の記法を用いてこのことを表す: $\_5C_3 = 10$
一般に, r ≤ n について $\_nC_r = n!/(r!(n-r)!)$ である.
ここで, n! = n×(n−1)×...×3×2×1, 0! = 1 と階乗を定義する.
n = 23 になるまで, これらの値が100万を超えることはない: $\_{23}C_{10} = 1144066$
1 ≤ n ≤ 100 について, 100万を超える $\_nC_r$ は何通りあるか?

```python
def hoge(max_n, limit):
    f = lambda n: n * f(n-1) if n > 0 else 1
    C = lambda n, r: f(n) // (f(r) * (f(n-r)))
    return sum( 1 for n in range(1, max_n+1) for r in range(1, n+1) if C(n, r) > limit )

print(hoge(100, 1000000))
```
RxSwiftのHot/Cold簡易概要メモ

RxSwiftが使われているソースを見る,使う機会が増えて来たので、 Hot/Coldの概念を理解したいと思い立ち調べた内容のメモ書きを残す。

※言い訳なのですが、これは自分専用のメモなのでパッと見で理解しづらいと思いますがご了承ください。
※あくまで概要のメモなので詳細内容、ソースなどの記載はありません。詳細を見たい方は[今日こそ理解するHot/Cold](https://www.slideshare.net/yukitakahashi3139241/hot-cold)を参照ください。

# Hot/Coldの性質メモ
### Hot/ColdはObservableの性質
- Subject: Hot
- Operator: ほとんどがCold(一部Hotがある)

### ストリームが流れる契機
- Hot: subscribeされなくてもストリームが流れる
- Cold: subscribeされて初めてストリームが流れる

### Hot/Coldの組み合わせ
- HotのObservableをColdがsubscribeした場合は、subscribeされないとストリームが流れない
- ColdのObservableをHotがsubscribeした場合は、subscribeされなくてもストリームが流れる

### Hot/Coldをsubscribeした際のストリームの分岐挙動
- Hot: 一つのObservable(ストリーム)を複数のObserverでsubscribeできる
    - ストリームは一つのまま
    - Observableのスコープ内はストリームの数(=一度)しか実行されない
-  Cold: 一つのObservable(ストリーム)を一つのObserverしかsubscribeできない
    - 複数のObserverがsubscribeした場合は、Observerの数分だけストリームが生成される
    - Observableのスコープ内はストリームの数(=Observerの数分)だけ実行される

### Hot/ColdのObservableのストリーム共有
- Hot: 各Observerに対して同じストリームが共有されるため同じイベントが流れる
    - subscribe以降、すでに流れた過去のイベントは流れない
- Cold: ColdなObservableは一つのObserverしか持てない(ストリームが共有されない)のでObserverの数分だけイベントが流れる
CUI環境しかないときにグローバルIPを調べる簡単な方法

# 前提条件
正引きできる DNS 環境があること
ifconfig.io の名前解決エントリを /etc/hosts に書いてもいけると思います。

# 直接
`$ curl ifconfig.io`

# プロキシ経由
`$ curl --proxy ip_addr:port ifconfig.io`

# Windows の場合
Windows 用の curl をどっかに置いて PATH を通す

[curl / Download](https://curl.haxx.se/download.html)

使い方は Linux/Windows で同じ
branch/tag を指定して GitHub から pip install

# コマンド

pip install 時に `@` に続けて ブランチ or タグ を指定。

```sh
$ pip install git+{Clone URL}@{branch/tag}
```

## Django 各バージョンの安定版

[事情があって Django 1.3 を利用し続けるを得ない環境に身を置いていました。](https://speakerdeck.com/lighttiger2505/zi-she-sabisufalsedjangowo-1-dot-3kara1-dot-11-lts-ni-atupuguredosurumadefalsedao-falseri)

PyPI から 1.3.7 をインストールすると static/media 周りでうまく動かなかったのですが、 GitHub から安定版をインストールすることで問題なく動作させられました。

Django リポジトリでは、 `stable/バージョン` というブランチがあり、各バージョンの安定版 HEAD を参照しています。

```sh
$ pip install git+https://github.com/django/django.git@stable/1.3.x
Collecting git+https://github.com/django/django.git@stable/1.3.x
  Cloning https://github.com/django/django.git (to stable/1.3.x) to /tmp/pip-T_6pib-build
Installing collected packages: Django
  Running setup.py install for Django ... done
Successfully installed Django-1.3.8-pre-alpha
```

`Django-1.3.8-pre-alpha` というバージョン表記です。 https://github.com/django/django/blob/stable/1.3.x/django/__init__.py
Xcodeのエディタ画面の色を変えたい。黒くしたい。

Swiftを勉強し始めました。
やっぱり、編集画面は黒くしたいですよね。

1. メニュー左上の「Xcode」 -> [Prefarences...」 をクリック
2. 左から5番目の「Fonts & Colors」をクリック
3. Themeの上から6番目の「Midnight」をクリック
<img width="800" alt="Screen Shot 2018-03-15 at 10.39.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/216701/559727f8-2aa4-61ef-c6c5-13c95748bf7f.png">

midnightの他にも、CivicやDuskも黒くなりますし、
バックグラウンドやフォントだけの色を変えたい場合、画面右下のボタンで色の詳細を変更できます。

ちなみに、Midnightは黒すぎる気がしたので、私はDuskを選びました。
皆さんのオススメは、何ですか？
Javascript note


## Angular, React, Vue 比較

- 一番まとまってる気がする: http://iwasiman.hatenablog.com/entry/2018/04/23/200000
- [開発者はReactとAngularのどちらを選ぶべきか？ - WPJ](https://www.webprofessional.jp/react-vs-angular/)

## ES6で書いてJSに変換してくれるすげぇ簡単なタスクランナーの設定

1、以下を`npm install`

- babel-core
- babel-preset-env
- babel-preset-react
- babelify
- browserify

2、以下をnodeで叩く

```js
/*
INFO:
- process.argv[2]: 第一引数が代入されている `node node/compile.js {ここ}`
*/
compile(process.argv[2]);

function compile(SITE_ID) {
  var fs = require("fs");
  var browserify = require("browserify");
  browserify("./src/" + SITE_ID + ".js")
    .transform("babelify", {presets: ["env", "react"]})
    .bundle()
    .pipe(fs.createWriteStream("./build/" + SITE_ID + ".js"));
}
```

## その要素にbindされているイベントと、その定義場所を知る

`var ev = $._data(element, 'events');`

## 変数の監視について

- [Object.observe() でデータバインディング革命 - HTML5 Rocks](https://www.html5rocks.com/ja/tutorials/es7/observe/)
- [JavaScriptで変数が変更されたのを監視して、なんかする方法 - Qiita](https://qiita.com/zaru/items/adb0b07dd83bb97cac13)
- [RxJS の Observable / Observer の概要 - Qiita](https://qiita.com/bouzuya/items/63a6dfca0e3ebb0f5268)

## BookmarkLet

- [ブックマークレットで jQuery を使う魔法の 210 文字](https://qiita.com/otchy/items/5c4f2e1b2a93ac200f1c)

## DOMを拡張する方法

- [DOMを拡張してみる - Qiita](https://qiita.com/mHadate/items/6acb3abe095935aa6051)

## ES6で使えるメソッドまとめ:

- [ES2016 / ES2017で実装される機能まとめ - Qiita](https://qiita.com/Yuta_Yamamoto/items/573ecace8d8523c102b0)
- [ES仕様(es2015〜es2017)まとめ - Qiita](https://qiita.com/ozoneboy/items/9c11ac3323ca94919052)

## ヒアドキュメント関係:

- 変数も組み込める: https://qiita.com/_shimizu/items/837b529de9f3302e315c
- ES6: [Template literals - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)

## .styleより.setAttribute

.styleは挙動がおかしいときがある

```
// thumbEl.style.backgroundImage = 'url(' + imgPath + ')';
thumbEl.setAttribute('style', 'background-image: url(' + imgPath + ')');
```

## class関係:

- #わかりやすい [JavaScript (ES5) でクラスを実現するための基本](https://qiita.com/kotarella1110/items/9ee2404ef31f47932cc6)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17342/d70f5252-385b-e23d-a67e-b77e2d27d7ed.png)
- jsにおけるprivateの表現: [JavaScriptのクラスでprivateを実現してみたかった人生だった - 生涯未熟](https://syossan.hateblo.jp/entry/2016/08/09/225016)


## document.weite script問題

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17342/d51c0610-aad2-cb93-1f8c-2cf8b01ed1d2.png)

## scriptのasyncについて

- asyncをつけないと、jsファイルの実行が完了するまで、HTML のパースは再開されません。[続き...](https://qiita.com/phanect/items/82c85ea4b8f9c373d684)

## 評価されるタイミング #基本

```js

// evaluate $xxx immediately:
ready($xxx);

// doesn't evaluate $xxx immediately:
ready(function(){
  $xxx();
});
```

use properly.
使い分けると良い。
Laravelでmultipart/form-dataのPUT,PATCH,DELETEのパラメタが取れない


# 問題

RESTFulなAPIサーバを作るとき、パラメタのあるPUTやPATCHメソッドを定義することがよくあります。しかしLaravelで普通に実装すると、パラメタをapplication/x-www-form-urlencodedで渡したときはうまく動きますが、multipart/form-dataだとパラメタが取れません。これはかなり以前からある問題([Input from PUT requests sent as multipart/form-data is unavailable #13457](https://github.com/laravel/framework/issues/13457))でこのissueはcloseされているのですが問題は解決していません。(なぜ問題が残っているのにcloseされたのかはよくわかりません)

これはPHPがPOSTメソッド以外ではapplication/x-www-form-urlencodedやmultipart/form-dataで渡されたパラメタの処理をしてくれない仕様だからで、application/x-www-form-urlencodedについてはSynfonyの`Symfony\Component\HttpFoundation\Request`クラスがなんとかしてくれますが、multipart/form-dataについては誰も何もしてくれないからです。

# 対処方法

いくつかの対処方法を紹介します

## apiを呼ぶ側で_methodパラメタに本来呼びたいメソッドを設定してPOSTする。

proxyがPUT,PATCHに対応してないときなんかに使う代替手段を利用するやり方です。サーバ側は何もしなくていいですが、使う側には負担になります。

## multipart/form-dataを解釈するプログラムを用意する

先ほどのissueの議論の中でもこの方向でプログラムを書いた人がいて、https://gist.github.com/devmycloud/df28012101fbc55d8de1737762b70348 が紹介されています。

ただしいったんphp://inputの内容を変数に受ける実装なので、大きなファイルを扱うAPIなどではこのままでは使えないと思います。

## [pecl/apfd](https://pecl.php.net/package/apfd)を使う

apfdはPHPがPOST以外のメソッドでもパラメタの処理をするようになる機能拡張です。PHP本体がデフォルトでこちらの動作になっててもいいと思うのですが、やはり過去との互換性とかいろいろ事情があるのでしょうか。

# まとめ

もしextensionの追加ができるならapfdを使うのが一番楽だと思います。
AKSで動かすコンテナアプリ　Dockerからkubernetesまで実践入門 

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「AKSで動かすコンテナアプリ　Dockerからkubernetesまで実践入門 」で使われた資料のご案内です。</p>

- <strong>AKSで動かすコンテナアプリ　Dockerからkubernetesまで実践入門</strong><br>
https://speakerdeck.com/shin5ok/azure-antenna-aksdekontenaapuri-dockerkarakubernetesmadeshi-jian-ru-men

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
電子回路入門　温度センサー

#**はじめに**
[書籍](https://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AE%E5%88%B6%E5%BE%A1%E3%82%92%E5%AD%A6%E3%81%B9%E3%82%8B-Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E7%A6%8F%E7%94%B0/dp/4800711614 "電子部品ごとの制御を学べる! Raspberry Pi 電子工作実践講座")に沿って引き続き進めていきます。


#**温度センサー**
サーミスタが有名ですが、温度と内部抵抗が比例していないため扱いづらいので、LM60BIZを使用します。
LM60BIZは温度と出力電圧がある程度比例しています。
複合気象センサーも使用します。

LM60BIZの仕様書を見てみると、計算式は
`VO＝(＋6.25 mV/°C× T °C)＋424 mV`
なるほど、、0度のときに424mVになるわけですね。
1度につき∓6.25mVになるみたいですね。

#**使用部品**
- PSoC 5LP
- [LM60BIZ](http://akizukidenshi.com/catalog/g/gI-02490/)

#**回路図**
![LM60_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/9d84260b-7da8-070e-6be7-6f1a936f8a30.png)
![LM60_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/ee1fdce6-0100-1387-7ec6-ebf2832e20c7.png)

#**プログラム**
温度をコンソール出力するプログラムですが、ここで私は罠にはまりました(´・ω・`)
PSoCさんはなぜか小数点以下を扱ってくれませんでした。

設定を追加
Project　=> Build Settings => Linker => General => Use newlib-nano Float Formatting を Trueへ変更。
Workspace Explorer => System => HeapSize を0x400へ変更。 

```c
#include "project.h"
#include "stdio.h"

int main(void)
{
    CyGlobalIntEnable;
    ADC_Start();
    UART_1_Start(); 
    for(;;)
    {
      ADC_StartConvert();
      while(ADC_IsEndConversion(ADC_RETURN_STATUS) == 0);
      int val = ADC_GetResult16();
      //valは16進数なので、電圧値に変換する
      double t = (val * 2048 /4095);
      //計算式
      t = (t - 424) / 6.25;
      char s[255];
      snprintf(s, 255, "%f\n", t);
      UART_1_PutString(s);
      CyDelay(1000);
    }
}
```

動いた
![温度.png](https://qiita-image-store.s3.amazonaws.com/0/195542/2e676759-565e-3090-2b24-555d1c026cae.png)
日時の比較チートシート

#日付の比較備忘録
##投稿理由
日付の比較を行う際、毎回調べてしまっているので備忘録的に記載。
不等号の比較の書き方には慣れが必要で、特に日付関係ではバグを生みやすい印象があるため。

##内容一覧
###過去の日時
```rb
Post.where("published_at < ?", Date.current)
```

###現在の日時
```rb
Post.where(published_at: Date.current)
```

###未来の日時
```rb
Post.where("published_at > ?", Date.current)
```

####補足
「予約投稿機能」「使用制限日時」といった内容に対して利用されるかと思います。

###登録から1日以内
```rb
Post.where("published_at < ?", Date.current.yesterday)
```
###登録から1日
```rb
Post.where(published_at: Date.current.yesterday)
```

###登録から1日以降
```rb
Post.where("published_at > ?", Date.current.yesterday)
```

####補足
「登録から2週間無料」、「登録から1週間放置されたタスクに対して担当者に連絡」といった仕様があった際に利用されるかと思います。
昨日意外の場合は、[yesterday]を「tomorrow、X.days.ago、X.days.since」等に変更すれば利用可能です。
daysを「weeks,months,years」にすることも可能です。

```rb
#yesterday
Post.where(published_at: Date.current.yesterday)
SELECT 'posts'.* FROM 'posts' WHERE 'posts'.'published_at' = '2018-03-15'

#days_ago(1)
Post.where(published_at: Date.current.days_ago(1)) 
SELECT 'posts'.* FROM 'posts' WHERE 'posts'.'published_at' = '2018-03-15'

#ago(1.days) 時間も見るので注意
Post.where(published_at: Date.current.ago(1.days)) 
SELECT 'posts'.* FROM 'posts' WHERE 'posts'.'published_at' = '2018-03-15 00:00:00'
```


###来月1日以前
```rb
d = Date.current.beginning_of_month.next_month;
Post.where("published_at < ?", d)
```
###来月1日
```rb
d = Date.current.beginning_of_month.next_month;
Post.where(published_at: d)
```
###来月1日以降
```rb
d = Date.current.beginning_of_month.next_month;
Post.where("published_at > ?", d)
```

####補足
「月初からのキャンペーン」、「登録月は無料」といった仕様があった際に利用されるかと思います。
今月頭(beginning_of_month)の次の月(next_month)で来月の月初を指定しています。
来月末は

```rb
Date.current.end_of_month.prev_month
```

固定の日付の際は、

```rb
d = Date.new(2018, 12, 31)
Post.where("published_at > ?", d)
```

の様になります。

###A日から、B日の間

```rb
#A日から、B日の間
a =  DateTime.new(2018, 11, 1, 00, 00, 00)
b =  DateTime.new(2018, 12, 31, 23, 59, 59)
Post.where("published_at >= ?", a).where("published_at <= ?", b)
```

####補足
注意点としまして日時の比較で「beetween」は使わないで、whereを2つかけた方が良いということです。
それはdatetime型に対して使用をした際、

```
2018-11-01〜2018-12-31
```

とした時に、対象日付が、

```
2018-11-01 00:00:00　〜　2018-12-31 00:00:00
```

なのか

```
2018-11-01 00:00:00　〜　2018-12-31 23:59:59
```

なのかがひと目ではわからないからです。
これは他の比較でも起こりうることですが、DateTimeに対しDateの指定だけで比較を行う際は注意が必要です。
この指定は、「今期・来季のレポート」、「施策A期間と、施策B期間のデータ比較」といったケースでの利用が考えられます。

###あと何日？

```rb
time = Time.current

target_date = Time.mktime(2018, 12, 31, 0, 0, 0)

date_count = (target_date- time)/(60*60*24).truncate
date_count.truncate
```

単位が day の場合のみの話ですが、Date どうしの引き算で実現できます (@negito6 さんのコメントより)

```rb
[3] pry(main)> target_date.to_date - time.to_date
=> (291/1)
[4] pry(main)> (target_date.to_date - time.to_date).to_i
=> 291
```

####補足
「無料期間の残り日数」、「年末・リリース日」と言ったケースでしょうか、あまり利用頻度は高くないかと思います。
また、これは、残り「何ヶ月と何日」と出してほしい。といった仕様に変更される可能性もございます。

###参考記事
[2017年まであと何日？rake taskで書いてみた - Qiita](https://qiita.com/tono0123/items/c2430fbb539ba31d6469)
[[Ruby入門] 14. 日付と時刻を扱う（全パターン網羅） - Qiita](https://qiita.com/prgseek/items/c0fc2ffc8e1736348486)
Python3 > enum.auto() > ImportError: cannot import name 'auto' > Python 3.6から使用可能

```
CentOS 6.8 (64bit)
Python 3.4.5
```

### 関連

[enumって何だよ](https://qiita.com/Gonemy/items/53f8601a023d509a59aa)

### エラー

```enum_auto_180315.py
from enum import Enum, auto
class Youbi(Enum):
	MON = 1

print(Youbi.MON)
```

```bash
$ python3 enum_auto_180315.py 
Traceback (most recent call last):
  File "enum_auto_180315.py", line 1, in <module>
    from enum import Enum, auto
ImportError: cannot import name 'auto'
```

https://github.com/leelabcnbc/cnnvis-pytorch/issues/1
> The auto is unique in py3.6 and don't contain in py3.5, how can I change the code to let it work?

enumのautoはPython 3.6から使えるようだ。

https://docs.python.jp/3/library/enum.html
> バージョン 3.6 で追加: Flag, IntFlag, auto

ideone.comのPython3は3.5なのでRuntime errorが出る。
Project Euler 52「置換倍数」

たまには「これは問の性質上n桁～m桁の範囲のみチェックすればよい（ｷﾘｯ」とか言いたいけど思いつかないので右ストレートでぶっ飛ばす、まっすぐ行ってぶっ飛ばす。

# Problem 52 「置換倍数」
125874を2倍すると251748となる. これは元の数125874と順番は違うが同じ数を含む.
2x, 3x, 4x, 5x, 6x が x と同じ数を含むような最小の正整数 x を求めよ.

```python
def hoge(num):
    f = lambda n: sorted(str(n))
    n = 1
    while not all( f(n) == f(n*i) for i in range(2, num+1) ):
        n += 1
    return n

print(hoge(6))
```
Ruby: 「それっぽい」パスワードを生成する

いくつかの制限を設けた、初期値パスワードとして使うランダム文字列をユルく生成する。

要件
------

* 一部のまぎらわしい文字を使用しない（今回は o, O, 0）
* 同じ文字が３つ以上連続しない
* 記号を１〜２つ含むよう指示するオプションを設ける
* 最初と最後の文字には記号は使わない

制限
-------

* 生成できる長さは 32 文字までとする
  * これ以上増やすと、連続しないパターンを生成する計算量が爆発する

使用例
---------

```ruby
Password.new.generate(16)                  # hk84wnIskvCBDITz
Password.new(symbol: true).generate(16)    # EIf{7fpkexis.vvs
```

実装
-------

```ruby
class Password
  require 'securerandom'

  CHAR_LIST = 'abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ123456789'.split('').freeze    # omit o,O,0
  SYMBOL_LIST = '._-=[]{}+#^!?'.split('').freeze
  # SYMBOL_LIST = '"#$%&\'()*+,-./:;<=>?[\]^_`{|}~'.split('').freeze
  SYMBOL_LIST_ESCAPED = SYMBOL_LIST.reduce('') { |r, s| r + '\\' + s }.freeze

  def initialize(symbol: false)
    @symbol = symbol
  end

  def generate(len = 8)
    raise 'too short' if len < 4
    raise 'too long'  if len > 32

    loop do
      result = (0..len - 1).reduce('') { |r, n| r + pick_one(len, n) }
      return result if check(result)
    end
  end

  private

  def pick_one(len, n)
    list = char_list(len, n)

    list[(SecureRandom.random_number(1.0) * list.size).floor]
  end

  def char_list(len, n)
    !@symbol || (n.zero? || n == len - 1) ? CHAR_LIST : CHAR_LIST + SYMBOL_LIST
  end

  def count_symbol(str)
    str.scan(Regexp.new('[%s]' % SYMBOL_LIST_ESCAPED)).size
  end

  def check(str)
    # omit successive chars
    return false if /(.)\1\1/ =~ str

    # confirm the str contains 1..2 symbols
    if @symbol
      return false if count_symbol(str).zero?
      return false if count_symbol(str) > 2
    end

    true
  end
end
```
s3プラグインとaws-elasticsearchプラグインを併用するとエラーが発生する

s3プラグインとaws elasticsearch serviceプラグインを、1つのfluent.conf内で使用した場合にエラーが発生し、Fluentdコンテナが起動しないという事案が発生した。

#前提
今回、FluentdはDocker containerとしてECSクラスター上で動かしています。

#環境情報
・fluentd v1.1.0
・fluentd-s3-plugin v1.1.1
(2018/03/15時点での最近バージョン)
・fluent-plugin-aws-elasticsearch-service v1.0.0
(2018/03/15時点での最近バージョン)

#エラー内容

```error
/usr/lib/ruby/2.3.0/rubygems/specification.rb:2287:in `raise_if_conflicts': Unable to activate aws-sdk-s3-1.8.2, because aws-sdk-core-2.11.14 conflicts with aws-sdk-core (~> 3) (Gem::ConflictError)
```

#原因
どうやら2つのプラグインが、aws-adk-coreの異なるバージョン(v2,v3)を使用していることで、conflictを起こしてしまったらしい。

fluentd-s3-plugin　                      → **v3**を使用
fluent-plugin-aws-elasticsearch-service　→ **v2**を使用

#解決策
fluentd-s3-pluginのバージョンを**v1.1.1**から**v1.0.0**に変更


#まとめ
fluentd-s3-plugin v1.0.0は、aws-sdk-core v2を使用しているため、上記の対応でconflictは解消しました。
今回調べて分かったことを以下に示します。

- fluent-plugin-s3 v1.1.1は、aws-sdk-core (~> 3)が要件 
- aws-sdk-coreの2つのバージョンが同居していること自体は問題ない
- aws-sdk-coreの2つのバージョンが同居している状態で、S3プラグインか、Elasticsearchプラグインのどちらか一方を使用することは問題ない
- 上記の2つのプラグインの、インストールする順番を変えても問題は解決しない（同じエラーメッセージが吐かれる）


Fluentdを使用し、s3とaws elasticsearch serviceにログを転送することは、AWSを使用した場合のログ管理構成として、よくあるパターンであると思います。皆さんもお気をつけてください。
Pythonで標準入出力のバッファリングをオフにする

pythonで標準入出力のバッファリングをオフにしたい場合がある。
例えば、pipeで他のプロセスとつないで標準入出力経由でやりとりをしたい場合に、バッファリングがオフになっていないと途中で処理が一時停止してしまう。
強制的にバッファリングをオフにするには実行時コマンドラインオプションと使う方法と、コード内でやる方法がある。

# コマンドラインオプションを使う方法

標準出力のバッファリングをオフにするだけで良いのであれば、`python -u`を使えば良い。

```
-u     : unbuffered binary stdout and stderr, stdin always buffered;
         also PYTHONUNBUFFERED=x
         see man page for details on internal buffering relating to '-u'
```

# コード内で指定する方法

コード内で明示的に指定したい場合、どうすればよいか。

stack overflowに似た記事があるが、この方法はpython2でしか使えない。この方法を使うと`ValueError: can't have unbuffered text I/O`という例外が発生する。
https://stackoverflow.com/questions/881696/unbuffered-stdout-in-python-as-in-python-u-from-within-the-program

python3ではテキストI/Oの場合はbuffer sizeを0に指定することができない。（バイナリI/Oの場合は上記の方法で問題ない）
python3でテキストI/Oの場合には以下のようにすると良い。行単位のバッファリングになる。

```py
import os,sys

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', buffering=1)
sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', buffering=1)
sys.stdin = os.fdopen(sys.stdin.fileno(), 'r', buffering=1)

# これ以降、printなどを使うと、unbufferedになっている（はず）
print('out')
line = sys.stdin.readline()
print(line)
```

`os.fdopen` (`open`の別名）でのbufferingオプションについては[このページ](https://docs.python.jp/3/library/functions.html#open)で説明されている。

>
buffering はオプションの整数で、バッファリングの方針を設定するのに使われます。バッファリングを無効にする (バイナリモードでのみ有効) には 0、行単位バッファリング (テキストモードでのみ有効) には 1、固定値のチャンクバッファの大きさをバイト単位で指定するには 1 以上の整数を渡してください。
PythonとRubyでthreadとfiberをいくつ作れるか検証して見た

PythonとRubyでそれぞれthreadをいくつくらい作れるのか検証して見た。

また軽量スレッドのFiberでやるとどうなるのかも検証。

# 検証環境

- MacOSX 10.12 (Sierra)
- ruby 2.5.0
- python 3.6.1

スタックサイズなどは特にいじらずデフォルトのままで試している。

# Threadの場合

Pythonの検証用コード

```py:num_threads.py
import threading,time,sys

def t():
    time.sleep( 1000 )

tc = 0
try:
    while 1:
        p = threading.Thread( target=t, args=() )
        p.start()
        tc += 1
        print(tc, file=sys.stderr)
finally:
    print(tc, file=sys.stderr)
```

実行結果 : 2048スレッドまで。

```txt
...
2047
Traceback (most recent call last):
  File "num_threads.py", line 10, in <module>
    p.start()
  File "/Users/murase/.pyenv/versions/miniconda3-4.1.11/envs/ml/lib/python3.6/threading.py", line 846, in start
    _start_new_thread(self._bootstrap, ())
RuntimeError: can't start new thread
```

Rubyの場合

```rb:num_threads.rb
count = 0
begin
  loop do
    t = Thread.new do
      sleep 1.0
    end
    count += 1
    $stderr.puts count
  end
ensure
  $stderr.puts count
end
```

実行結果 : 2046まで。

```
...
2046
Traceback (most recent call last):
	4: from num_threads.rb:3:in `<main>'
	3: from num_threads.rb:3:in `loop'
	2: from num_threads.rb:4:in `block in <main>'
	1: from num_threads.rb:4:in `new'
num_threads.rb:4:in `initialize': can't create Thread: Resource temporarily unavailable (ThreadError)
```

どちらもほぼ$2^{11}$まで作れるのがデフォルトの挙動らしい。

# Fiberの場合

Pythonに言語レベルでFiberはないので、[fibers](https://python-fibers.readthedocs.io/en/latest/)というライブラリを使う。`pip install fibers`でインストールできる。
fiberの検証コードはこちら。

```py:num_fibers.py
import fibers,time,sys

def t():
    a = 10           # 検証用に適当なローカル変数を作っている
    f = fibers.Fiber.current()
    f.parent.switch()

tc = 0
try:
    fs = []
    while 1:
        f = fibers.Fiber(target=t, args=() )
        f.switch()
        fs.append(f)
        tc += 1
        print(len(fs), file=sys.stderr)
        if tc > 32768:
            break
finally:
    print(tc)
```

Rubyは標準ライブラリにFiberがある。コードは以下のようになる。

```rb:num_fibers.rb
count = 0
begin
  fs = []
  loop do
    f = Fiber.new do
      a = 10
      Fiber.yield
    end
    f.resume
    fs << f
    count += 1
    $stderr.puts count
    break if count > 32768
  end
ensure
  $stderr.puts count
end
```

どちらの場合も最大値までfiberを作ることができた。

# まとめ

どちらの言語もthreadは2000くらい、fiberは無尽蔵に作ることができる。
link > math > Special Functions (特殊関数) | 主に言語とシステム開発に関して

https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py

@ Mie_ab()

```py
nu = n + 0.5

sx = np.sqrt(0.5*np.pi*x)
px = sx*jv(nu,x)
```

0.5を足しているということは「半整数次数」のベッセル関数だろうか。

関連して特殊関数の資料のリンクを思い出した。

https://www23.atwiki.jp/physics/pages/21.html#id_c6ad25dd
色々な視点からのBessel function(と他の特殊関数）の資料が膨大に見つかる。


上記のリンクを探す過程でブックマークから見つかったのは以下のサイト。
[主に言語とシステム開発に関して](http://language-and-engineering.hatenablog.jp/entry/20140620/PDFLectureNotesOnUniversity)
こちらからも良質の資料を見つけることができる。分野は見てのとおり、「膨大」。
RailsTutorial 5章メモ

#第5章 レイアウトを作成する

##CSS
###クラスとidの違い
クラスはページ内で何度も使えるが、idは一度しか使えない。

###領域
- div・・・領域を分けるときに使う
- header・・・header領域に使う
- nav・・・？
- section・・・？
- container・・・？

###クラスに対してスタイルを適用
.クラス名 {
//適用するもの
}

\#id名 {
//適用するもの
}

###SCSSではネストが可能
####クラス
.center {
　text-align: center;
}
.center h1 {
　margin-bottom: 10px;
}
↓↓↓↓↓↓↓↓↓↓↓こうできる↓↓↓↓↓↓↓↓↓↓↓↓
.center {
　text-align: center;
　　h1 {
　　　margin-bottom: 10px;
　　}
}



##パーシャル
１つのファイルにコードを全て書いてしまうと１つのファイルが煩雑になり、何がどこに書いてあるか分かりにくくなる。
パーシャルは別のファイルに一部のコードを記述させてrenderで見に行くことで整理をしやすくする。

パーシャルを利用したい場所に下記のコードを入れると

<%= render 'layouts/header' %> 

views以下のフォルダ構造を見て、layoutsフォルダ内の_header.html.erbファイルのコードを挿入する。


##アセットパイプライン

//要調査

##RailsのルートURL
###routes.rb
root 'static_pages#home' 　　　⇒　'/'にアクセスするとStaticPagesコントローラのhomeアクションを呼ぶ
　　　　　　　　　　　 　　　⇒　さらにroot_pathが使えるようになる
get  '/help',    to: 'static_pages#help'⇒'/help'のURLでStaticPagesコントローラのhelpアクションを呼ぶ
　　　　　　　　　　　　　　　⇒さらにhelp_pathが使えるようになる
##リンクのテスト

assert_template 'static_pages/home'  　　　　⇒　Homeページが正しいビューを描画しているか確認
assert_select "a[href=?]", root_path, count: 2　⇒　同ページにroot_pathのリンクが2つあるか

assert_selectはHTML要素に関するテストを可能にする。結構なんでもテストできるっぽい。
VBAのソースファイルをGITHUBで公開する

EXCEL VBAを使ったアプリケーション（というほど、大げさなものではないが）
を公開しようかと思う。

いまはGITHUBの使い方を勉強中

まだマークダウンが分からないので取り合えず放置・・・


さて当面のやることを整理すると、

１）アウトルックのメール整理
・EXCELを使って、outlookメールのプルダウン
→　フォルダ一覧を読み込み　完成
→　メール内容の読み出し　→かなり時間がかかったが完成した
・結局自分のＰＣが32bitで能力が低く、ＭＳＧファイルを保存できない
・メールのメッセージ名でフォルダを作って、そこに添付ファイルと本文をＭＨＬ形式にして落とす。
・ＥＸＣＥＬのリストから、ハイパーリンクで閲覧できるようにした。

問題点
・時間がかかる　→　ＶＢＡなんで仕方がない


２）次の課題
・次はメール内容の要約である。
→　これはＰＹＴＨＯＮのＡＩで文脈解析までやりたい（いまはとりあえず本文中の、メアドを除去してメールを圧縮する）
・これを添付ファイルリンクという形で、ＥＸＣＥＬの別の課題シートなどに、さくっと持っていきたい
→　最終的にはoutlookでメールを読み終えた瞬間に、マクロボタンを押すと、メール自体をオブジェクト化して、それを一つの転用可能なファイル（もしくはデータベース内に置かれたメンバーとして）。課題シート、ガントチャートなど他のｅｘｃｅｌで使えるオブジェクトとしたい。
→　イメージはさくっと、簡単、だれでも使えるが目標である。


３）ＡＩでの要約
パイソンで要約
→これは学術レベルで公開されているＡＰＩはない
グーグルぐらいだろうか？　どうやってアクセスするのか？
pythonを使う必要性については、ようやくやってきたという感じ
（別の本でEXCELをPYTHONで使うような内容のことが書いてあったが、
正直、これは思案中。そもそも速度的な問題が気になるから）


# AI comment

VBAのソースファイルをGitHubで公開する、とのこと、とても素晴らしいですね。自分のコードを公開することは、自分のスキルを向上させるだけでなく、他の開発者との交流や、フィードバックの収集にもつながります。

GitHubの使い方を勉強中とのこと、頑張ってください。Markdownは、GitHubでソースコードやドキュメントを記述するためのマークアップ言語です。Markdownの基本的な文法は、比較的簡単です。GitHubには、Markdownのガイドが用意されていますので、参考にしてください。

アウトルックのメール整理の課題について、時間がかかるのが問題とのこと、理解できます。VBAは、処理速度が遅いというデメリットがあります。PythonのAIで文脈解析を行うことで、処理速度を改善できるかもしれません。

メール内容の要約については、PythonのAPIを利用する方法が考えられます。Google AIには、Text-to-Text Transfer Transformer APIというAPIがあり、テキストの要約を生成することができます。このAPIは、Google Cloud Platform上で利用できます。

Outlookでメールを読み終えた瞬間に、マクロボタンを押すと、メール自体をオブジェクト化して、それを一つの転用可能なファイル（もしくはデータベース内に置かれたメンバーとして）にする、というアイデアも素晴らしいですね。これを実現するためには、OutlookのAPIとPythonのAPIを組み合わせて、メールの情報を抽出する必要があるでしょう。

今後の開発が、ますます楽しみですね。応援しています。
bootstrapのボタンをカスタマイズする方法

Bootstrapのボタンをカスタマイズする方法です。

###サイズなどを変えたい場合

ステップ１　下記をCSSファイルに追加します。数字などの設定はお好きなものに変更してください。

```
.btn {
    padding: 14px 24px;
    border: 0 none;
    font-weight: 700;
    letter-spacing: 1px;
    text-transform: uppercase;
}
```

ステップ２　ボタンの`class`に`btn`がない場合は追加します。

例：

```
<%= link_to "こちらをクリック", something_path, class: "btn btn-primary" %>
```

###アウトラインのみのボタンにしたい場合

ステップ１　下記をCSSファイルに追加します。数字はお好きなものに変更してください。

```
.btn.outline {
	background: none;　 //背景をなしにします
	padding: 12px 22px;
}
```

ステップ２　ボタンの`class`に`outline`を追加します。
例：

```
<%= link_to "こちらをクリック", something_path, class: "btn outline btn-primary" %>
```

###好きな色に変えたい場合

CSSファイルの中に下記を追加します。”好きな色”の部分をお好きな色に変更してください。

```
.btn-primary {
    background: 好きな色; //ボタンの背景色
    color: 好きな色; //ボタンのテキストの色
}

.btn-primary:hover, .btn-primary:focus, 
.btn-primary:active, .btn-primary:active:focus, .btn-primary:active:hover, .btn-primary:active.focus,
.btn-primary.active, .btn-primary.active:focus, .btn-primary.active:hover, .btn-primary.active.focus,
.open > .dropdown-toggle.btn-primary, 
.open > .dropdown-toggle.btn-primary:hover,
.open > .dropdown-toggle.btn-primary:focus, 
.open > .dropdown-toggle.btn-primary.focus,
.btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover,
.btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus,
.btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus {
    background: 好きな色; //ボタンの上にポインタを持ってきたり、クリックしたりした時の背景色
    color: 好きな色; //ボタンの上にポインタを持ってきたり、クリックしたりした時のテキストの色
}

.btn-primary.outline {
	border: 3px solid 好きな色; //アウトラインのみのボタンの線の色
	color: 好きな色; //アウトラインのみのボタンのテキストの色
}

```

###クリック時のボタンの色について

上記のように`disabled`のクラスをCSSに追加しておかないと、クリックしてからページを移動するまでの間のボタンの色がオリジナルのままになってしまいます。

###メモ

上記は`btn-primary`を例にしていますが、基本bootstrapのボタンクラスであればなんでも変えられます(例：`btn-info`や`btn-warning`など）。
JavaScript でEventListenerを実装してみる

EventEmitterとかいうライブラリを使っていて、どういう仕組みになっているのか気になったので簡単な物を自分でも調べながら実装してみました。

以下ソースコードと簡単な解説。

```js
function Event(){}

Event.prototype = {
    constructor:EventTarget,
    
    addListener:function (type,listener) {
        if(!this.hasOwnProperty("_listeners")){
            this._listeners = [];
        }
        if(typeof this._listeners[type] == 'undefined'){
            this._listeners[type] = [];
        }

        this._listeners[type].push(listener);
    },
    fire:function (event) {
        if(!event.target){
            event.target = this;
        }
        if(!event.type){
            throw new Error("Event object missing 'type' property.");
        }
        if(this._listeners && this._listeners[event.type] instanceof Array){
            let listeners = this._listeners[event.type];
            for(let i=0;i<listeners.length;i++){
                listeners[i].call(this,event)
            }
        }
    },
    removeListener:function (type,listener) {
        if(this._listeners && this._listeners[type] instanceof Array){
            let listeners = this._listeners[type];
            for(let i=0;i<listeners.length;i++){
                if(listeners[i] === listeners){
                    listeners.splice(i,1);
                    break;
                }
            }
        }
    }
};

```

やっていることはシンプルで、***this._listeners[type]***という配列の中に、***listener(callback関数)***を格納していき、***fire***でそのcallbackを順番に実行していきます。

一応補足。***listeners[i].call(this,event)***は、第一引数はlisteners[i]が実行される際に実行される際のthisの値を指定(今回はthisの値をEventオブジェクトのthisにバインドしてる。)、第二引数のeventはlisteners[i]に渡す引数です。
EXCEL VBA CMD.exe コマンドラインのTreeを使ってフォルダをツリー表示する

FormにあったTreeViewという表示は64Bitではできません。
しかしコマンドラインのTreeは使用できます。
ActiveCellの フォルダ名からTree表示をしてそれを
Const cnsFileName = "C:\xlCmdFolderTree.txt"
で定めたファイルに記録します。毎回上書きするので注意してください。
しかしWindows10になるとフォルダの構造も複雑です。
そこでTree自体は最後の階層まで表示しているのですがMsgBoxやテキストファイルは3000文字で終了しています。
基本構造はOfficeTanakaさんの[MS-DOSコマンドの標準出力を取得する](http://officetanaka.net/excel/vba/tips/tips27.htm)

```visualbasic
Sub FolderTreeView()
'For Excel
'ActiveCellの値がフォルダーなら、コマンドラインからフォルダーをツリー表示する。
'階層が多いときは3000文字でカットする
'ただし探索してから3000字に絞るので、階層が深いとは時間がかかる
'FormのTreeviewが使えなくなっているのでこれで視覚的には多少代替できる
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Const cnsFileName = "C:\xlCmdFolderTree.txt"
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = ActiveSheet
Dim R As Range: Set R = ws.Range(ActiveCell.Address)
Dim WSH, wExec, sCmd As String, Result As String, tmp, buf As String, i As Long
Set WSH = CreateObject("WScript.Shell")
Dim fs, Ts, FileName, fileObj: Set fs = CreateObject("Scripting.FileSystemObject")
Dim sfrFolder As String
If IsNull(R.Value) = True Or IsEmpty(R.Value) = True  Then Exit Sub
sCmd = "tree """ & R.Value & """"
Set wExec = WSH.Exec("%ComSpec% /c " & sCmd)
Do While wExec.Status = 0
DoEvents
Loop
Result = wExec.StdOut.ReadAll
' Create the file, and obtain a file object for the file.
FileName = cnsFileName
fs.CreateTextFile FileName, True
Set fileObj = fs.GetFile(FileName)
' Open a text stream for output.
Set Ts = fileObj.OpenAsTextStream(ForWriting, TristateUseDefault)
tmp = Split(Result, vbCrLf)
For i = 2 To UBound(tmp) ''3行目以降を変数に格納します
buf = buf & tmp(i) & vbCrLf
If Len(buf) > 3000 Then buf = buf & vbCrLf & "3000文字をオーバーしたので終了します": Exit For
Next i
MsgBox buf
Ts.writeline buf
Ts.Close
Debug.Print buf
Set wExec = Nothing
Set WSH = Nothing
End Sub
```
RailsでページごとにTurbolinksを無効にする方法

RailsでページごとにTurbolinksを無効にする方法をご紹介します。

###ステップ１
`views/layouts/application.html.erb`の`<body>`タグの中に下記を追加します。

```
<% if content_for?(:body_attributes) %>
  <%= yield(:body_attributes) %>
<% end %>>
```

実際に入れるとこんな感じです（`.`は入れなくていいです）

```
<body>
<% if content_for?(:body_attributes) %>
  <%= yield(:body_attributes) %>
<% end %>>
.
.
.
</body>
```

###ステップ２

Turbolinksを無効にしたい`views`ページ（例：home.html.erbなど）の中に下記を追加します。

```
<% content_for(:body_attributes) do %>
    data-turbolinks="false"
<% end %>
```
以上で個別ページでTurbolinksを無効にすることができます。

###リンク先のTurbolinksを無効にしたい場合
リンク先のTurbolinksを無効にしたい場合は、`<div data-turbolinks="false"></div>`でリンクを囲むと移動さきのページでTurbolinksが無効になります。

例：

```
<div data-turbolinks="false">
 <%= link_to "Home", root_path %>
</div>
```
HerokuでRailsアプリをデプロイする時にCSSが反映されない場合の対処法

RailsアプリをHerokuでデプロイするときにCSSが反映されない場合は下記をコマンドラインで実行します。

###ステップ１　
```
$ RAILS_ENV=production rake assets:precompile
```
###ステップ２　
```
$ git add -A
```

###ステップ３　
```
$ git commit -m "コミットの理由" //コミットの理由は自由に変更してください
```

###ステップ４　
```
$ git push
```

###ステップ５　
```
$ git push heroku
```

###background-imageがきちんと反映されない場合

`bundle exec rake assets:precompile`をコマンドラインで実行するという方法もよく見かけますが、この方法だとbackground-imageがなぜか反映されません。なので、上のステップ１〜５の方法を実行してください。

さらにbackground-imageをきちんと反映させる方法として、`config/environments/production.rb`に下記を加えるという方法もあります。

```
config.assets.compile = true
config.serve_static_assets = true
```