OmniAICreator/Qiita-1.07M huggingface dataset:
[swift]コードで画面を実装するときによく使う部品をモデルで定義してみた

#はじめに
ストーリーボードを使わずに画面を実装するとき、ロゴなどのよく使う部品をこのように毎回記述していると、可読性悪くなるしコピペする手間もかかるので嫌だなあと思ってコンポーネント化してみました。

###ロゴを実装するとき、毎回同じコードを書くのダルくないですか？
これを毎回書くなんてなんて非効率な・・・

```viewController.swift
import UIKit

class ViewController: UIViewController {
    //最初のページ
    
    var logoLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.backgroundColor = UIColor.white
        
        //ロゴ的な
        logoLabel = UILabel()
        logoLabel.text = "栞の森"
        logoLabel.textColor = UIColor.white
        logoLabel.font = UIFont(name: "Arial", size: 20)
        if #available(iOS 11.0, *) {
          logoLabel.frame = CGRect(x: 20, y: 40, width: self.view.frame.width / 6, height: self.view.frame.height / 20)
        }else{
             logoLabel.frame = CGRect(x: 20, y: 20, width: self.view.frame.width / 6, height: self.view.frame.height / 20)
        }
        let logoBackColor = #colorLiteral(red: 0, green: 0.6670674086, blue: 0.6729698777, alpha: 1)
        logoLabel.backgroundColor = logoBackColor
        self.view.addSubview(logoLabel)
        
        // Do any additional setup after loading the view, typically from a nib.
    }
}
```

###そこでコンポーネント化して一行でロゴを実装できるようにしよう！

モデルのファイルを作ってロゴをセットする関数を定義する

```LogoComponent.swift
import UIKit

class LogoComponent: NSObject {
  static let shared = LogoComponent()
  
  func setLogo(myView: UIView){
    //ロゴ的な
    let logoLabel = UILabel()
    logoLabel.text = "栞の森"
    logoLabel.textColor = UIColor.white
    logoLabel.font = UIFont(name: "Arial", size: 20)
    if #available(iOS 11.0, *) {
      logoLabel.frame = CGRect(x: 20, y: 40, width: myView.frame.width / 6, height: myView.frame.height / 20)
    }else{
      logoLabel.frame = CGRect(x: 20, y: 20, width: myView.frame.width / 6, height: myView.frame.height / 20)
    }
    let logoBackColor = #colorLiteral(red: 0, green: 0.6670674086, blue: 0.6729698777, alpha: 1)
    logoLabel.backgroundColor = logoBackColor
    myView.addSubview(logoLabel)
  }
}
```

ViewControllerで使用

```ViewController.swift
import UIKit

class ViewController: UIViewController {
    //最初のページ
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.backgroundColor = UIColor.white
        //なんと一行でロゴが実装できます。
        LogoComponent.shared.setLogo(myView: self.view)
        
        // Do any additional setup after loading the view, typically from a nib.
    }
}
```

じゃーん
<img width="380" alt="スクリーンショット 2018-11-11 3.34.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/243219/c44d2533-3bf7-4a98-2cfd-6eb8dcd497aa.png">


※ちなみにこのやり方だとviewController上でロゴをいじくりたいときに
参照できなそうなので注意

#終わりに
プログラミング初心者の戯言なので参考程度に
また、なにかおかしいときは遠慮せずにコメントで指摘してください
そのほうが投稿者は喜びますので
helmでクォーテーション付きのキーを使うときの注意

(18/11/15 06:22 追記)
コメントで教えて頂いた[quote関数](https://github.com/helm/helm/blob/master/docs/charts_tips_and_tricks.md#quote-strings-dont-quote-integers)の方が断然スマートだったので追記。
以下のような設定でOK。

```values.yml
ingress:
  read_timeout: 100
```

```ingress.yml
nginx.ingress.kubernetes.io/proxy-read-timeout: {{ .Values.ingress.read_timeout | quote }}
```

---

# 前段 (失敗例)

manifestで以下のような部分にvalueファイルからの値を使いたい場合

```ingress.yaml
nginx.ingress.kubernetes.io/proxy-read-timeout: "100"
```

以下のように設定するとこける。

```values.yml
ingress:
  read_timeout: "100"
```
```ingress.yml
nginx.ingress.kubernetes.io/proxy-read-timeout: {{ .Values.ingress.read_timeout }}
```

`values.yml`で数値を囲んだダブルクォーテーションは、値利用するときには消えるっぽい。

# 結論 (成功例)
というわけで、以下のように設定するとうまくいった。

```values.yml
ingress:
  read_timeout: 100
```
```ingress.yml
nginx.ingress.kubernetes.io/proxy-read-timeout: "{{ .Values.ingress.read_timeout }}"
```

# 参考ページ
[Deployment in version "v1beta1" cannot be handled as a Deployment: [pos 620]: json: expect char '"' but got char '1' #1603](https://github.com/kubernetes/dashboard/issues/1603#issuecomment-277033985)
Spring Data JPA：Repositoryの@QueryにpureなSQLでクエリを記述する

# TL;DR

Spring Data JPA の `@Query` に対して`nativeQuery = true` を指定することで、JPQL ではなくSQLによる問い合わせができるようになります。

```java
public interface PhotoRepository extends JpaRepository<Photo, Integer> {
  @Query(value = "SELECT * FROM PHOTO AS p WHERE p.USER_ID = 1", nativeQuery = true) // SQL
  Iterator<Photo> findPhotosByUserId(int userId);
}
```

# `@Repository`

Spring Data JPAでは、Repositoryインタフェース内にメソッドを定義+`@Autowired`でDIするだけで、RepositoryをDAO、すなわちテーブルアクセスできるオブジェクトとして使用することができます。

```java:PhotoRepository.java
@Repository
public interface PhotoRepository extends JpaRepository<Photo, Integer> {
// PHOTOテーブルがUSER_IDカラムを持つ場合、引数userIdとUSER_IDが一致するレコード取得
　　Iterator<Photo> findByUserId(int userId); 
}
```

```java:PhotoService.java
@Service
public class PhotoService {

  @Autowired // DI:インスタンス化済み
  private PhotoRepository repository;

  public Iterator<Photo> getPhotos(int userId) {
     return repository.findByUserId(userId);
  }

}
```

（簡単のため、JpaRepositoryを継承したRepositoryを直接使用しています。実際はJpaRepository継承/Entity定義をPhotoRepositoryが置かれるドメイン層から切り離します）

`@Repository` はSpringにおけるRepositoryコンポーネントであることを表していて、このアノテーションによって `@Autowired` によるDI対象になります。

ちなみにRepositoryに定義できるメソッドの命名規則は以下参照。
`BETWEEN`とか`ORDER_BY`とかも普通にできます。
[Spring Data JPA - Reference Documentation](https://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/#repository-query-keywords)

# `@Query`

Repository上のメソッドに`@Query`をつけると、メソッド命名規則からクエリを定義せず、クエリを文字列で直接定義できるようになります。

```java
public interface PhotoRepository extends JpaRepository<Photo, Integer> {
  @Query(value = "select p from photo p where p.userId = 1") // JPQL
  Iterator<Photo> findPhotosByUserId(int userId);
}
```

ただしデフォルトで定義できるのはJPQLと呼ばれる問い合わせ言語で、SQLではありません。そのため`@Query`の引数に普通にSQLを記述してしまうとエラーとなってしまいます。

参考：[10.2. JPQL Language Reference](https://docs.oracle.com/html/E13946_01/ejb3_langref.html)

SQLで実行するには、冒頭の通り`nativeQuery = true` をつけます。これでいつもどおりのSQLを使うことができます。

```java
public interface PhotoRepository extends JpaRepository<Photo, Integer> {
  @Query(value = "SELECT * FROM PHOTO AS p WHERE p.USER_ID = 1", nativeQuery = true) // SQL
  Iterator<Photo> findPhotosByUserId(int userId);
}
```
C/C++の__DATE__と__TIME__マクロ定数を使う事の是非

# はじめに
古の時代より存在する事前定義済みマクロ定数、\_\_DATE\_\_と\_\_TIME\_\_について、その使用の是非を考えます。
\_\_DATE\_\_はコンパイル時（正確にはプリプロセス時）の日付を文字列化した値で、\_\_TIME\_\_はコンパイル時の時刻（秒単位）を文字列化した値です。大抵の場合、OSのタイムゾーンと時刻に依存した値になるようです。

# 結論
\_\_DATE\_\_と\_\_TIME\_\_はそれを使わなければ絶対に解決できない課題を解決するためにのみ使い、それ以外の場合に安易に使うべきではありません。特に、バージョン値の代用としての使用は不適切です。GCCも警告を出しますし。

# \_\_DATE\_\_と\_\_TIME\_\_マクロ定数を使う目的
　最終的なオブジェクトファイルが、どの時点のソースファイルから生成されたのかを知る目的で\_\_DATE\_\_と\_\_TIME\_\_マクロを使う場合があるようです。何故でしょうか？

　エンドユーザーに対して実行ファイルやバイナリのライブラリファイルのみを提供し、ソースファイルを提供しない場合に、提供したそれらソフトウェアに不具合が発覚したとします。
　この場合、不具合を引き当てたエンドユーザーが使っているバイナリファイルから、それらのビルドに使ったソースファイルのバージョンを特定しなければ、ソフトウェア提供側で不具合を再現し、修正することはできません。

　提供したバイナリファイル群に代表バージョン値を割り当てておき、それらのビルドに使ったソースファイル一式を保存しておくという方法もあります。しかし、QAプロセスが確立されていない組織では、対応するソースファイル一式の組み合わせ情報が失われている、という事が往々にしてあります。（驚くべきことに、開発者一個人の裁量でローカル環境でビルドし、リリースしてしまうという事もあります。）
　時には、代表バージョン値が同一ではあるものの、バイナリ不一致になるバイナリファイル群が２つ以上、異なるエンドユーザーに提供されていた、ということすらあります。要は代表バージョン値の更新忘れですね。（SCMサーバへ上げ忘れている場合もあり、完全に復元不可能な場合はゲームオーバーです。SCMサーバ上のリビジョンのソースファイルを使ってバイナリファイルを提供し直しましょう。）
　代表バージョン値を信頼できないとなると、不具合が発生したバイナリファイル群を再現できるソースファイルの組み合わせを、ビルドしながら地道に探すしかありません。地獄の始まりです。

　こうなってしまった時のために、ソースファイルに変更を加える度にインクリメントするソースコードバージョン値を埋め込んでおけば、ソースファイルの組み合わせ探索範囲を減らせるかもしれません。
　しかし、ソースファイルが大量に存在するのであれば、代表バージョン値の更新忘れのように、ソースファイル単位でのバージョン値も更新忘れが発生します。全てのソースファイルのバージョン値が正しく更新されている確率は、ソースファイルが増えれば増えるほど低くなっていきます。また、C/C++は\#includeで指定されたファイル（いわゆるヘッダファイル）を結合してコンパイルするため、ヘッダファイルの変更が、それをインクルードしているソースファイルのビルド結果を変えてしまう場合もあり、変更の追跡には一定の技術力と労力が必要です。

　そこで誰かが「いいアイディアがある」と言い出して、\_\_DATE\_\_マクロと\_\_TIME\_\_マクロでコンパイル時刻を埋め込み始めるのです。「これならビルドする度に固有の値を埋め込めるので、バージョン値の代わりになるし更新を忘れることもない。」


# 何が問題なのか
　本質的な問題は、ソースファイルリビジョンと、ビルド日時は直接的には無関係ということです。過去のリビジョンのソースファイルを使って、今日ビルドするかもしれません。そうなると、ビルド日時は、それをビルドするために使ったソースファイルのリビジョンを特定する目的には使えません。

　さらに、ビルド日時を埋め込むようすることで、全く同じリビジョンのソースファイル一式を使ってビルドしても、同じバイナリファイルを生成できなくなってしまいます。ビルド日付を埋め込むことで、ビルドプロセスに再現性がなくなります。

　gccの警告オプション「-Wdate-time」を使用すると、\_\_DATE\_\_または\_\_TIME\_\_を使用している場合、「再現性のないビルド」である事を警告してくれます。

　警告を確認するためのコード。
https://wandbox.org/permlink/0qxHDXwHjKcahjVF

　C/C++は最終的に実行可能バイナリファイルを出力するコンパイル言語なので、ソフトウェアテストの対象はソースファイルではなく、コンパイルによって生成された実行可能バイナリファイルです。そのバイナリファイルの生成に再現性がなくなるということは、同じソースファイルからビルドしたバイナリファイルであっても、それらは複数のバージョンが存在し、それぞれにテストが必要だという事になります。
　そのため、過去にリリースしたバージョンを後々リリースしたいのであれば、二度と再現できないものとしてバイナリファイルを残しておくか、同じソースファイルリビジョンでバイナリファイルを作り直した場合は、過去に行ったテストをもう一度実行する必要があります。

# おわりに
　ビルド日付を埋め込むことは、結局のところ、バイナリファイルの元になったソースファイルの特定にほとんど役に立たないだけでなく、そもそもバイナリファイルとソースファイルの一対一関係も崩してしまい、ソフトウェアのリリースプロセスに対して取り返しのつかない運用コストを上乗せしてしまう可能性があります。

　ソフトウェア規模が小さく、開発関係者も少なく、過去にリリースしたバージョンのサポートがほぼ不要であれば、ビルド日付の埋め込みはバージョン値の埋め込みよりも低コストでうまく機能するかもしれません。しかし、いずれの日か、それこそ、そのソフトウェアがうまくいけばいくほど、やがて足枷になっていく事でしょう。

　バージョン追跡の仕組みとして、\_\_DATE\_\_と\_\_TIME\_\_マクロでビルド日付を埋め込む事はやめておきましょう。
Pythonでコード内でパスを設定する ~パスの結合~

#はじめに
Pythonで，現在のカレントディレクトリから別ディレクトリのファイルを読み込む際，また，現在のカレントディレクトリから別ディレクトリに保存する際など，今までは`os.chdir()`でいちいちディレクトリを移動していたのだが，もっと良さげな方法があった．

#Python osについて
[こちら](http://nonbiri-tereka.hatenablog.com/entry/2014/03/14/195241)が綺麗にまとまっていたので，参照．

#方法
`os.path.join`でパスを結合する．
カレントディレクトリがわからない場合は，コマンドプロンプトで`pwd`等を入力しましょう．

##例1 csvファイルの読み込み

例えば，`dir1`という別ディレクトリにあるcsvファイルを読み込みたい場合，

```Python:csv.py
import os
import numpy as np
dir1 = '/hoge/hoge/' #読み込みたいファイルのあるディレクトリ
f1 = np.loadtxt(os.path.join(dir1, 'hoge.csv'), delimiter = ',', skiprows=1) #np.loadtxt()でcsvファイルを読み込む #これで別ディレクトリdir1内の'hoge.csv'が読み込めた
```

##例2 グラフの保存
例えば，`save_dir`という別ディレクトリにグラフを保存したい場合，

```Python:save.py
import os
import numpy as np
import matplotlib.pyplot as plt
save_dir = '/hoge/hoge/' #ファイルを保存したいディレクトリ
plt.savefig(os.path.join(save_dir, 'hoge.png')) #plt.saveig()でグラフを保存 #これで別ディレクトリsave_dir内にグラフ'hoge.png'が保存された
```
#おわりに
もっといい方法があれば教えてください...
Solaris 11.4 に Wordpress をインストールする8ステップ


# Intro

実測25分程度で Solaris 11.4 に Wordpress をインストールする例です。
しょぼい仮想環境で実施しているため、実際はもっと速いと思います。



# 1. 必要なパッケージをインストールします。

```bash:パッケージインストール
$ pkg install amp
$ pkg install /web/php-71
```


# 2. データベース用のZFSファイルシステムを構成します。

MySQLデータ・ファイルを格納する個別のファイル・システムを作成します。
以下の例では、/mydata として用意しています。
さらに compress=on を設定して、デフォルトで圧縮するように設定しています。compressは任意です。

```bash:ZFSファイルシステムを構成
$ zfs create rpool/mydata
$ zfs set mountpoint=/mydata rpool/mydata
$ chown -R mysql:mysql /mydata
$ chmod -R 700 /mydata
$ zfs set compress=on rpool/mydata
```

MySQL側に作成したファイルシステムを構成します。

```bash:
$ svccfg -s mysql:version_56 setprop mysql/data=/mydata
$ svcadm refresh mysql:version_56
```

svcsコマンドを使用してMySQLが起動していることを確認します。

```bash:
$ svcadm enable mysql:version_56
$ svcs mysql:version_56
STATE          STIME      FMRI
online         23:46:58   svc:/application/database/mysql:version_56
```


# 3. データベースを構築します。
MySQLインスタンスにログインし、WordPressに必要なデータベースを作成します。

```mysql:データベースを構築
$ mysql -u root
mysql> create database wp01;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on wp01.* to 'wordpress'@'localhost' identified by 'oracle1';
Query OK, 1 row affected (0.00 sec)

mysql> flush privileges;
Query OK, 1 row affected (0.00 sec)

mysql> quit;
Bye
```


WordPressに必要なデータベース wp01 を作成しています。
oracle1というパスワードを持つユーザーwordpressのアクセス権を追加しています。


# 4. WordPress を用意します。

WordPress をダウンロードして、/var/tmp 配下に用意します。
この例では 4.9.8 を使用します。

```bash
$ cd /var/tmp
$ wget https://ja.wordpress.org/wordpress-4.9.8-ja.zip
```
WordPress を解凍して、配布ファイルをApacheのドキュメント・ルートにコピーします。

```bash:WordPress解凍・配置
$ cd /var/tmp
$ unzip -q wordpress-4.9.8-ja.zip
$ mkdir /var/apache2/2.4/htdocs/blog
$ cp -rp wordpress/* /var/apache2/2.4/htdocs/blog
$ chown -R webservd:webservd /var/apache2/2.4/htdocs/blog
```


# 5. PHP で MySQLi関数を有効化します。

wordpress は、MySQLi 関数使用しますが、PHP7をインストールしただけでは有効になっていません。
php.iniファイルに「extension=mysqli.so」を追記することで有効化します。

```bash:mysqliの有効化
$ cd /etc/php/7.1
$ vi php.ini

extension=mysqli.so <--追記
```

# 6. Apache の設定ファイルを準備します。

Apacheは、ポート80番でサービスを提供しています。
今回は、ポート8080で提供するように httpd.conf の Listen を 80 から 8080 に変更します。

```bash:ポートの変更
$ cd /etc/apache2/2.4
$ vi httpd.conf

Listen 8080
```

次にPHPの設定ファイルを用意します。
samples-conf.d 配下に php7.1.conf として雛形が用意されています。
そのまま conf.d配下にコピーします。

```bash:php.confの用意 
$ cp samples-conf.d/php7.1.conf conf.d
```
* カレントディレクトリは /etc/apache2/2.4


# 7. httpd を有効化します。

```bash:
$ svcadm enable http
```

# 8. セットアップを実行します。

Wordpressを配置したパスをブラウザからアクセスしてセットアップを実施します。

http://IPアドレス:8080/blog/wp-admin/setup-config.php

| 項目 | 入力内容 |
|:-----------|:-----------|
| データベース名 |作成した【データベース名 wp01】|
| ユーザー名 | 作成した【ユーザー名 wordpress】|
| パスワード | 作成した【パスワード oracle1】|
| データベースのホスト名| localhost|
| テーブル接頭辞 | wp_ |
DOS窓でCSVを結合(merge)

# とにかくデータはCSV...
遠隔データやシミュレーションデータなどで大活躍の標準フォーマットCSV。
ひたすら一つのCSVにログ出力を垂れ流しし続ける計測機器もあれど、やはりデータ整理やそこから分析するにあたり、ある程度の分割（例えば一日単位など）で区切って出力していると運用上応用が利きます。

で、それが裏目に出て困るのが、一部分とはいえ耐量のCSVデータを一つにまとめないと解析がしにくいので結合することになります。
EXELなどアプリケーション起動してコピーするのは10個くらいで腱鞘炎になりそうですから、ここは出来るだけ一般的なツールで結合できる方法を忘れないようにメモしておこうと思います。

#＜手法＞
DOS コマンドプロンプトで
> type `マージするファイル共通名`*.csv > `マージ先Pathとファイル名`.csv

もちろんマージ（結合）先同一フォルダでもOKです。
あらかじめマージするデータ群をTEMPフォルダに格納して実行すると分かりよい。 **(後で消して整理整頓も忘れずに)**

ところで、COPYコマンドでも同じことが出来るらしいのだが、どういうわけかファイルが見つからないとなる...タイプミスかな？
FOR UPDATEでロックがかからない時

FOR UPDATEでロックがかからない時。

#### 一般的な方法

###### 1.カウンタ取得(悲観的ロック)
SELECT count FROM counters FOR UPDATE;

###### 2.インクリメント
count++

###### 3.更新
UPDATE counters SET count = {#count};

通常は上記のような方法でロックをかけるが、上手くいかない場合。

######↓の方法であれば、接続毎に一意の識別子を生成・取得できる。

UPDATE counters SET count = LAST_INSERT_ID(count + 1);
SELECT LAST_INSERT_ID();
Ruby on Railsの概要

■ Ruby on Railsとは

□　ウェブアプリケーションとRails
・　Ruby on Railsは、ウェブアプリケーションを開発するためのフレームワークで、プログラミング言語Rubyで記述されている。ウェブアプリケーションとは、ウェブ（WWW）を介して何らかのサービスをユーザーに提供するもの。ウェブサイトがサーバー上のファイルをブラウザに送り返すだけなのに対して、ウェブアプリケーションは掲示板機能やショッピング機能などのサービスを提供するためにサーバー上にデータを保持し、読み書きする。

・　ウェブアプリケーションには次の３つが必要となる。1.データを保存し操作するためのデータベース管理システム（DBMS） 2.ユーザーに見せるためにHTMLやCSSで記述されたビジュアルデザイン 3.プログラミング言語で書かれたプログラム

・　フレームワークとは、効率よくアプリケーションを開発するためのツール、ライブラリ、設定ファイルなどのセット。RailsはMVCアーキテクチャを備えたウェブアプリケーション開発フレームワークの中で最も有名なものの１つ。MVCアーキテクチャとは、アプリケーションの構成をM（モデル）、V（ビュー）、C(コントローラ）の３つに分類する設計法。Mはデータベースに収めたデータ、およびデータの書式などのルールであり、データベースのデータを扱うオブジェクト。Vはユーザーに見せるインターフェイスのデザインであり、HTMLにデータを埋め込むためのテンプレート。Cはモデルを経由してデータベースからデータを取り出してビューに渡すプログラム。また、データをデータベースに格納する。具体的には、倉庫はデータベースのテーブルに、荷物はレコードに相当し、その倉庫番としてのモデルがテーブルに対するレコードの挿入を監視する。コントローラはウェブアプリケーションからモデルとビューを分離した残りの部分で、ブラウザやモデル、ビューに対して何でも屋として様々な仕事をする。コントローラが実行する具体的な仕事をアクションと呼ぶ。


■　設計哲学

□　Railsの設計哲学
・　DRY（Don't Repeat Yourself）　繰り返しを避けろ
効率よく高品質のアプリケーションを作るために、同じことを繰り返し記述するのを避ける。

・　設定より規約（Convention over Configuration）
あらかじめ用意された規約に従ってアプリケーションを開発することで、記述量を大幅に減らす。

■　Railsの構成と機能

□　Railsのコンポーネント
・　Railsの実体は、コンポーネント（Rubyで書かれたライブラリ）の集合体。ライブラリとは、汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもの。Rubyのコンポーネントは、Gemパッケージ（Ruby用のパッケージ管理ツール）の一部として提供されている。

・　RubyのGemパッケージ構成（各コンポーネント）
Action Pack（以下の２つを含む）
　Action Controller コントローラ
　Action Dispatch ルーティング
Action View ビュー
Action Mailer 電子メール送信
Active Model モデル
Active Record データベースと結びついたモデル
Active Job プログラムの非同期実行
Active Support 共有ライブラリ集
Active Storage クラウドストレージサービスへのアップロード
Railties railsコマンドなどのユーティリティ

□　Railsの便利な特徴（他のChapterまで学習が進んでから詳述し編集する）
・　ルーティング
・　テンプレート
・　マイグレーション
・　レコードの操作
・　バリデーション
・　国際化
・　テスト
・　セッション
・　モデル間の関連付け
・　クラウドストレージサービスとの連携

参考にしたテキスト：インプレス　『改定４版　基礎　Ruby on Rails』
スクロール表示時に特定のコンテンツにアニメーションを付加する方法

[プログラミング教室ITWORKS](http://listenmaker.1strentalserver.info/itworks/)のayakaです。

今回はスクロールで特定のコンテンツを表示した際にアニメーションを付加する方法について自分の備忘録も含め記述します。

ちなみにアニメーション自体は独自にCSSでゴリゴリ書いてもいいですが、今回は[Animate.css](https://daneden.github.io/animate.css/)使わせてもらいました。

#今回の実装概要

1.スクロールしたことを検知
2.特定要素が表示されているかの判定
　∟ 特定要素にアニメーションを追加する

#スクロールしたことを検知
特定コンテンツがページの最上部にある場合はアニメーションをロード完了時に付与したいため正確にはスクロール時とロード時を検知して処理を行います。

```html:index.html
$(window).on('load scroll', function() {
   	//ロード完了時及びスクロール時の処理
        addAnimation_by_scroll(target,animate);
});
```

#特定要素が表示されているかの判定

```javascript:index.html

//ロード完了時及びスクロール時の処理
//param target <div>等のクラス属性をもつコンテンツ
//param animate アニメーションを記述したクラス名
function add_class_in_scrolling(target,animate) {
    //画面のスクロール位置
    var scrollTop = $(window).scrollTop();
    //画面の高さ
    var winHeight = $(window).height();
    //表示している画面最下部の位置
    var scrollBottom= scrollTop + winHeight;
    //表示している画面最下部の位置よりtargetの表示位置が小さい場合
    if(target.offset().top < scrollBottom) {
        //targetにアニメーションを記述したクラスを追加します
    	target.removeClass(animate);
        target.addClass(animate);
    }
}
```

##特定要素にアニメーションを追加する
アニメーションを記述したクラスをaddClassで追加します。
ここで注意したいのは一度きりのアニメーションの場合
既に付けられたままだとアニメーションされません。
つまり、該当クラスを削除して追加する必要があります。
初心者のころには知らなかったJavaで配列の一括初期化する方法

# 配列の一括初期化
配列の要素を0で全初期化する方法
(C言語で言うmemset的なもの)

`Arrays.fill(配列, 初期化値)`

```java 
import java.util.Arrays;
public class HelloWorld {
    public static void main (String[] args) {
        int[] intArray = new int[10];
        Arrays.fill(intArray, 0); // 第二引数で初期化値を指定する
        System.out.println(Arrays.toString(intArray));
    }
}

// => [0, 0, 0, ...]
```

この方法は文字列にも対応できる


```java 
import java.util.Arrays;
public class HelloWorld {
    public static void main (String[] args) {
        String[] str = new String[5];
        Arrays.fill(str, "_"); // 第二引数で初期化値を指定する
        System.out.println(Arrays.toString(str));
    }
}

// => ["_", "_", "_", ...]
```


## 参考

- https://github.com/NAKKA-K/til/blob/master/java/init_array.md
ChatWork に画像をアップロード in Python

ChatWork に[ファイルをアップロードする API](https://blog-ja.chatwork.com/2018/07/20187.html) がリリースされていたので使ってみました。

## Requirement
- anaconda3-5.2.0(Python 3.6.5)

## Program
```python:
import requests

END_POINT = 'https://api.chatwork.com/v2/'
API_TOKEN = 'your api token'


def post_jpeg(room_id, file_path, message=''):
    url = '{}rooms/{}/files'.format(END_POINT, room_id)
    jpeg_bin = open(file_path, 'rb')
    headers = {'X-ChatWorkToken': API_TOKEN}
    files = {
        'file': ('kawaii.jpg', jpeg_bin, 'image/jpeg'),
        'message': message,
    }
    request = requests.post(url, headers=headers, files=files)

room_id = 'your room id'
file_path = './hoge.jpg'
message = '正義'
post_jpeg(room_id, file_path, message)

```
![kawaii.jpg](https://qiita-image-store.s3.amazonaws.com/0/245792/dddcf617-4009-56f5-efbc-09ae4a80e153.png)

## Hint
- message は必須ではないです。
- 'image/jpeg' の部分は [Content-Type](https://qiita.com/AkihiroTakamura/items/b93fbe511465f52bffaa) での記述になります、他のファイル形式でも試してみてください。

```python:post_jpeg
files = {'file': ('kawaii.jpg', jpeg_bin, 'image/jpeg')}
```

## Reference
- [ChatWork API ドキュメント](http://developer.chatwork.com/ja/endpoint_rooms.html)
フィードバックの速度が重要

ここで、実験してみよう。


たどり着きたい対象物に対して、30度右側に歩いていってみよう。少し歩いた先でも、30度右側に歩いていってみよう。ひたすらたどり着きたい対象物に対して30度右側に歩いていってみよう。

これを、広い場所でやってみてほしい。どうなっただろうか。


常に判断は、ほんとうにたどり着きたい場所の向きに向かって30度間違っている。そんな間違った判断を積みかさねているのだから、、、、、。


物事は、正しい判断が重要だ。間違った判断を積み重ねると、それが累積して良くない結果をもたらす。そう言われてきたはずだ。


その結果は、どうだったろうか。


ほんとうに正しい向きではないのに、それでもたどりつけたはずだ。
螺旋状に、対象物のまわりを回りながらたどりつけただろう。

正しくなくても、フィードバックを繰り返すこと（ここでは、対象物の向きの30度右側に進むということを繰り返すこと）で、目的のターゲットにたどり着ける。


こんな単純なことでも、フィードバックの速度が重要になる。


組織運営においてもフィードバックの速度が重要になる。
iOSエンジニアがAndroid StudioでHello World!するまで

普段はSwiftでiOS開発を行っていますが、仕事でAndroid開発にも関わることになったため、初めてAndroid Studioを触ってみました。
まっさらな状態からHello World!するまでの手順をまとめているので、これから始める方のお役に立てば幸いです。

# 手順
## Java(JDK)をインストール
JDK = Java Development Kit。
Android Studioを使うために必要らしいです。

あれ、Javaもう入ってるっけ？という方は、ターミナルで下記を入力。
すでに入っていれば、インストールされているJDKのバージョンが表示されます。

```
java -version
```

導入手順はこちらの記事を参考にしました。
[【Mac】JDKのインストール | ハジカラ　〜はじめからでも、プログラミング勉強〜](http://kk90info.com/%E3%80%90mac%E3%80%91jdk%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)

インストールは[Oracleのサイト](https://www.oracle.com/technetwork/java/javase/downloads/index.html)から。
Javaのマークをクリックしてください。
<img width="551" alt="スクリーンショット 2018-11-10 23.52.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/112818/6dbd3ebd-de71-014a-5018-6b2fa922bde4.png">
macOSが2つあるのですが、参考サイトにならって上の.dmgを選択。

## Android Studioをインストール
導入手順はこちらの記事を参考にしました。
[Android Android Studio をMacにインストールする](https://akira-watson.com/android/adt-mac.html)

記事に従ってやっていけばインストールはできるのですが、わからなかったのがSDKやToolのインストール。どれを選択すればいいのか？
実機テストをするならそれに合ったSDKを選べばいいのでしょうが、今回実機は使わないので、とりあえず最新版（Android9.0 Pie）が選択されていることを確認してその他はいじらないことにしました。あとで変更できるだろうし。

## Hello World!する
こちらの記事を参考にしました。
[Android 簡単なHello worldアプリをAndroid Studioで作成](https://akira-watson.com/android/helloworld.html)
これに沿ってやっていけば問題なくできました。Android Studioでの初めてのHello World!。うれしい☺
<img src="https://qiita-image-store.s3.amazonaws.com/0/112818/feaf7cd0-824f-10a0-c3f8-51b69c1b7b61.png" width=40%>

# 感じたことなど
## 必要なSDK・Toolがわからず不安になる
先にも書きましたが、どれを入れればいいのかわからず、果たしてこれで動くのかと不安になりました。
結果動いたので一旦これで大丈夫なのでしょうが、今後何を作るかによって必要なものを都度入れていくことになりそうです。

## 「APIレベル」がよくわからない
ある記事によると、
>APIレベルとは、Androidプラットフォームのバージョンによって提供されるフレームワークAPIリビジョンを特定するユニークな整数です。
簡単に言えば、Androidバージョンに対応したAPI レベルがあるということです。
[Android API レベルとバージョン一覧表と主なトピック – FeeeeeLog](https://feel-log.net/android/developer/api-level/)

とのこと。iOSにはない概念みたい(?)なのでまだ慣れませんが、バージョンに対応するユニークな整数なんだな〜くらいに認識しておきます。

追記：
「バージョンの示し方が一般大衆向けと開発者向けで二通りある」と考えるとわかりやすかったです:ok_hand:
（@links_2_3_4 様より有益なコメントをいただきました。ありがとうございます！）

## コードネームが可愛い
カップケーキにドーナツにアイスクリームにマシュマロにオレオ。
Android好きになれそうです。

# 今後やること
* Hello World!したプロジェクトをいじってみて、もうちょっと高度なこと（ボタンつけるとか遷移するとか）をやってみる
* Kotlinの文法をさらってみる
* ネットに落ちているAndroidプロジェクトを見てみる
Vue.jsで記事詳細のデータを取得

Vue.jsで記事詳細ページのURLを記事IDに設定して、その記事のdataを展開していくときの書き方です。

## routerを設定

「[vue-router](https://www.npmjs.com/package/vue-router)」をinstall

``` terminal
$ yarn add vue-router
```

vue-routerをインスタンスにして```#app```に読み込む。

``` javascript:main.js
import Vue from 'vue';
import VueRouter from 'vue-router';
import App from './App';
import routes from './routes';

Vue.use(VueRouter);

const router = new VueRouter(routes);

new Vue({
  el: '#app',
  components: { App },
  template: '<App/>',
  router,
});
```

``` javascript:routes.js
import Articles from './page/Articles';
import Detail from './page/Detail';

export default {
  mode: 'history',
  routes: [
    {
      path: '/articles',
      component: Articles,
      name: 'articles',
    },
    {
      path: '/articles/:id',
      component: Detail,
      name: 'detail',
    },
  ],
};
```

## 記事詳細ページにその記事のデータを取得

記事一覧で記事をClickして詳細ページに遷移したときに、その記事のデータをURLの「:id」を元に取得します。
まずは記事一覧で記事詳細の遷移先を```/articles/:id```にしました。

``` javascript:ArticleItem.vue
<template>
  <ul>
    <li　v-for="(article, index) in articles" :key="index">
      <a :href="'/articles/' + article.id">
        {{article.text}}
      </a>
    </li>
  </ul>
</template>

<script>
export default {
  computed: {
    articles() {
      return this.$store.state.articles; // storeから記事データを取得
    },
  },
};
</script>
```

詳細ページに遷移してURLが```/articles/:id```になったとき、```this.$route.params.id```でその「:id(記事id)」を取得できます。
そこで、storeのdataからそのidと一致するdataを抽出してcomponentのpropsに渡しています。

``` javascript:Detail.vue
<template>
  <div>
    <article-detail
      :data="ArticleData"
    >
    </article-detail>
  </div>
</template>

<script>
import ArticleDetail from '../components/ArticleDetail';

export default {
  computed: {
    ArticleData() {
      const dataId = parseInt(this.$route.params.id, 10);
      const data = this.$store.state.articles.find(a => (
        a.id === dataId
      ));
      return data;
    },
  },
  components: {
    articleDetail,
  },
};
</script>
```

``` javascript:ArticleDetail.vue
<template>
  <div>
    <p>{{data.title}}</p>
    <p>{{data.text}}</p>
  </div>
</template>

<script>
export default {
  props: {
    data: Object,
  },
};
</script>
```

こんな感じで合っっていますでしょうか？

## 参考サイト

- [vue-router](https://www.npmjs.com/package/vue-router)
- [これから始めるVue.js 2.0](https://app.codegrid.net/series/2016-vue)
MySQLとRuby on Railsの開発環境をDocker for Windowsで作ってみた

## ご挨拶
初心者ですが備忘録として今後も定期的に投稿するのが目標ですので温かく見守って頂けると幸いです！

## 背景
今回、後学のためにRailsの環境をDockerで立ち上げようとしたところ、参考にした記事に思わぬ落とし穴(記事が悪かったわけではありません)があり、手間取ってしまったので、そちらの回避策も含め改めて手順を整理してみました！
Dockerのインストール方法や各種コマンドの説明は割愛させて頂きますのでご容赦下さい。
以下は参考にさせていただいた記事になります。

[DockerのQuickstart:Compose and Railsをやってみた](https://re-engines.com/2017/03/12/docker%E3%81%AEquickstartcompose-and-rails%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/)

## 事前準備
任意のディレクトリ内にRails用のディレクトリを作成し、その配下に以下のファイルを作成してください。

+ Dockerfile
+ docker-compose.yml
+ Genfile
+ Genfile.lock

作成が完了したら各ファイル内に以下の記述を行います。

~~~docker:Dockerfile
FROM ruby:2.5.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /docker_rails
WORKDIR /docker_rails
ADD Gemfile /docker_rails/Gemfile
ADD Gemfile.lock /docker_rails/Gemfile.lock
RUN bundle install
ADD . /docker_rails
~~~

~~~yml:docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/docker_rails
    ports:
      - "3000:3000"
    depends_on:
      - db
~~~

~~~gemfile:Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.1'
~~~

Gemfile.lockはからのままで大丈夫です。

以上で、準備は完了です！
## ビルド
PowerShellを開き、今回作成したディレクトリまで移動したら以下のコマンドを打っていきましょう！

~~~
docker-compose run web rails new . --force --database=mysql --skip-bundle
docker-compose build
~~~
次に/config/database.ymlを修正します。

~~~yml:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password:
  host: db

development:
  <<: *default
  database: docker_rails_development

test:
  <<: *default
  database: docker_rails_test

production:
  <<: *default
  database: docker_rails_production
  username: docker_rails
  password: <%= ENV['DOCKER_RAILS_DATABASE_PASSWORD'] %>
~~~
今度はPowerShellに戻り、コマンド「docker-compose up」を実行します。

~~~
docker-compose up
~~~
最後に、別のPowerShellを開き、DBを作成します。

~~~
docker-compose run web rails db:create
~~~
localhost:3000でアクセスできればビルド成功です！

## まとめ
参考にさせていただいた記事(2017年3月投稿)ではMySQLを呼び出す際に、ver等の指定をしていないのですが、MySQLは今年(2018年)の春に最新ver8.0をリリースしており、それに伴って認証形式の選択ができるようになったそうです。
その為、別途設定を行わないとエラーが発生しアクセスどころかDBの作成もできません！
ただ、今回はビルドし、アクセスすることを優先した為に、あえて踏み込まず、MySQLのverを指定し回避しています。
今後、時間を見つけてMySQL8.0対応できたらなあ、と思いますが、先に手を付けたいものがある為、とりあえずは後回しに。。。
Emacsの使い方

Emacsを使ってみたい！という方や、Vimを使ってるけどEmacsも気になる！という方向けの記事ですが、Emacs使ってるぜ！って人も大歓迎です。
Let's emacs!

# インストール

※筆者はUbuntuでしか使ったことがないので、Ubuntuでのやり方しか説明できません。

ターミナルを立ち上げて、下のコマンドを入力します。typo(間違えてvimの部分をemacsとしてしまうなど)すると違うパッケージがインストールされてしまう場合があるので気をつけてください。

```
$ sudo apt install -y vim
```

また、よくあるトラブルを回避するため、以下の行を`.bashrc`に追記することをおすすめしています。

```bash
alias emacs=vim
```

# 起動

起動の仕方は2通りあります。

```
$ vim    #正統派

$ emacs  #ちょっと変わった人向け
```

# 基礎的な編集

起動したままの画面で何かキーを押してみましょう。あなたがよほどの強運の持ち主でない限り何も入力できないと思います。これは、Emacsで「コマンドモード」と呼ばれる状態だからです。ここが初心者の方がよくつまずくポイントだと思います。試しに<kbd>i</kbd>キーを押してみてください。何か入力するとちゃんと画面に反映されるようになったと思います。このモードは「挿入モード」などと呼ばれます。<kbd>Esc</kbd>キーを押すと先程の入力ができない状態に戻ります。Emacsではカーソルの移動は基本的にこのモードで行います。<kbd>i</kbd>で編集モードに入り、複数行のテキストを入力してください。そして<kbd>Esc</kbd>を押してください。<kbd>h</kbd>、<kbd>j</kbd>、<kbd>k</kbd>、<kbd>l</kbd>を押すとカーソルを移動できるのでやってみてください。また、<kbd>x</kbd>で1文字消去、<kbd>dd</kbd>で一行消去できます。

# ファイルを保存したり開いたりする

前のセクションで基礎的な編集ができるようになったと思うので、ファイルとして保存してみましょう。コマンドモードで`:w emacs.txt`と入力してみてください。これで編集内容が`emacs.txt`に保存されました。Emacsを閉じてみましょう。`:q`と入力してください。
また、先程のファイルを開くには、

```
$ vim emacs.txt
```

または

```
$ emacs emacs.txt
```

と入力します。

# おわりに

Emacsは非常に高機能で、ここには書ききれないほど多くの機能があります。Webで「vim 使い方」などと検索するといろいろな情報がみつかるので、試してみてください。

# 注意

本当はVimの説明です。Emacs使ってる方、ごめんなさい。
BigQueryで配列と構造体を使ったテストデータをJSONで作る

# はじめに

BigQueryのテストデータを作るときに、単純なデータならエクセルやスプレッドシートからcsvファイルかtsvファイルに変換して作ってました。
が、配列とか構造体を作るときにはJSONでテストデータ作らないといけなかったので忘備録。

# テストデータ

例えば、フツーのカラムと配列のカラムと構造体配列のカラムを持ったテストデータを作った時のサンプル

```
{'target_date':'2018-11-10', 'array': ['配列1', '配列2'], 'struct':[{'struct_array_string': '構造体配列1', 'struct_array_int': 1}]}
{'target_date':'2018-11-10', 'array': ['配列3', '配列4'], 'struct':[{'struct_array_string': '構造体配列2', 'struct_array_int': 2}]}
{'target_date':'2018-11-10', 'array': ['配列5', '配列6'], 'struct':[{'struct_array_string': '構造体配列3', 'struct_array_int': 3}]}
```

BigQueryのJSONは改行区切りなので、それぞれの行をカンマで区切りません。
地味にハマりました。

以下、スキーマはautodetect指定でロードした結果です。
逆順でスキーマ生成されてる。。。

<img width="349" alt="json_sample1.png" src="https://qiita-image-store.s3.amazonaws.com/0/231123/f290fce1-fece-bff8-cdc9-3cc43110be20.png">

<img width="437" alt="json_sample2.png" src="https://qiita-image-store.s3.amazonaws.com/0/231123/e9bc1a96-b717-79a6-c44c-e56ca981ab51.png">
devise使っててemailをrecofirm（再確認）しないで更新したい場合

多分、deviseは結構昔からあるgemだし、皆さんよく知ってるのだろうけど、せっかくなので残してみる。

deviseで対象のモデルに`:confirmable`を有効にしている（登録や、登録内容を更新する際に。確認メールを利用者に通知する仕組み）場合、emailを更新したいときは基本的に利用者の確認が取れていないと更新できないようにdeviseが制御してくれている。

ただ、たまにこの確認をスキップしてemailを更新をしたいときがあったりする。そういうときはどうするか？？？

## td;lr

```
skip_reconfirmation!
```

こういったメソッドがあって、中では確認作業をスルーするかどうかを判定するインスタンス変数`@bypass_confirmation_postpone`をtrueにしてるだけ。
このメソッドを実行した後なら、emailをupdateすることが可能。再確認作業をスキップできる。
ref: https://github.com/plataformatec/devise/blob/715192a770/lib/devise/models/confirmable.rb#L167-L169

（ちなみに登録時の確認もスキップさせる`skip_confirmation!`もある。 ref: https://github.com/plataformatec/devise/blob/715192a770/lib/devise/models/confirmable.rb#L155 ）

## 他の方法
```
update_column(email: 新しいメアド)
```

emailを更新したいときは`update_column`とかで**SQLを直接実行して**更新することもできる。けど、バリデーションを通さないし、updated_atなども更新しないので、その点を注意したほうが良さそう。まあでもこっちのが手軽っちゃあ手軽感はある。

## そもそも確認をスキップしたタイミングなんである？ 

なんで、こんなことを調べたかって言うと、テストを書いているときに「ある処理でメアドを更新して、それが正しく更新されているか」をテストしたかった（Rspec）。

```
use = User.find(1)
user.assign_attributes(email: "hoge@example.com")
user.save!
```
こんな感じでbefore句を書いて、`expect(user.email).to eq 変更したメアド`という感じで、emailが更新されるかをテストしたかったんだけど、通らない。

なんでだろうと思って、user.save!した後メアドが更新されているか見てみると、更新されていない（この辺、save!したときにdeviseさんがwarningやらalert出してくれるとありがたいな〜と思ったけど）。

いろいろ考えて、「そういえばdevise使ってるけど、それのせいかな？」と思い始め、ググって以下の記事を見つけ参考にさせていただいた。
http://docs.komagata.org/5436

確かに更新処理の前に`config.reconfirmable`をfalseにしたら更新できたけど、テストコードにそれを書くのはなんかな〜、、、となり、もうちょいdeviseを調べて「再確認をスキップしてメアドを更新する」みたいなことできないかな〜きっとできるだろ〜と思って調べてて、コードを追ってくのが辛かったので、とりあえずテストコードから漁っていたら関連してるっぽいもの発見。
https://github.com/plataformatec/devise/blob/715192a770/test/models/confirmable_test.rb#L379-L388

```
'should not regenerate confirmation token or require reconfirmation if skipping reconfirmation after changing email'
```
「メアド変えて、skipping_reconfirmationしたら、トークン作成と再確認はしない」。それっぽい！中も見てみると、`skip_reconfirmation!`してる。といった感じで探した。

（ちなみに、最初にテスト通らなかったとき更新されなかったのは、以下の`before_update`のせいっぽい。 ref: https://github.com/plataformatec/devise/blob/715192a770/lib/devise/models/confirmable.rb#L58
再確認とトークン再作成が済んでなかったらメアド更新は保留にするようにしてるみたい。）
PowerShellで日本語を含むJSONをPOST

リクエストボディを`[byte]`型の配列にしてから`Invoke-RestMethod`コマンドレットで送信します。

```
$postText = @{text="日本語"} | ConvertTo-Json -Compress
$postBody = [Text.Encoding]::UTF8.GetBytes($postText)
$postUri = "http://localhost:3000/api/texts"
Invoke-RestMethod -Method POST -Uri $postUri -Body $postBody -ContentType application/json
```
Windows環境でlibvpxをビルドする

libvpxをWindows環境で使いたい。けど、今一つ手順が良く分からない。
libvpxを、Windows環境でソースからビルドする方法を記します。

# Windows向けのビルド環境構築
https://github.com/webmproject/libvpx

libvpxは、ビルドの自動化をmakeによって提供しています。
Visual Studioを使用するオプションも提供されていますが、Windowsでmakeを実行できる環境を整える必要があります。
githubのREADMEでは、Cygwinをお勧めしていますが、ここでは最新のWindows 10ならではの方法で解決したいと思います。

## Bash on Ubuntu on Windows
Anniversary Update以降のWindows 10であれば、Bash on Ubuntu on Windowsを導入することでbashを使うことができます。
(最近、Windows Subsystem for Linuxに名前が変わったそうです）

```
> sudo apt-get install make
```

## Yasmのインストール
libvpxは、x86をターゲットにする場合はYasmを要求します。
yasmを[ここ](http://yasm.tortall.net/Download.html)からダウンロードし、実行ファイルの名前を、<b>yasm-&lt;version&gt;-&lt;arch&gt;.exe</b> から <b>yasm.exe</b> に変更します。
これはVisual Studioのカスタムビルドによって参照されるため、パスの通った場所に置いておく必要があります。

## (オプション)MSBuildのパスを通す
makeからlibvpxのビルドまでを行いたい場合は、MSBuildへのパスを通しておく必要があります。
makeによって生成されたプロジェクトファイルから、普段通りにビルドする場合は必要ありません。

# Visual Studioのプロジェクトファイルを生成する
まずbashを立ち上げ、libvpxのディレクトリへ移動します。
ここでは、x86向けのディレクトリを作成し、その中にvs15向けのソリューションファイルとプロジェクトファイルを作成する手順を説明します。
プロジェクトファイルの生成には`configure`コマンドを使用します。

```
> mkdir x86
> cd x86
> ../configure --help
> ../configure --target=x86-win32-vs15 --disable-docs --disable-tools --disable-examples --disable-webm-io --disable-vp8-encoder --disable-vp9-encoder
```

オプションについては、必要であれば有効にしてください。
この時点で、ソリューションファイルを生成するための`Makefile`が作成されます。

```
> make
```

問題がなければソリューションファイルとプロジェクトファイルが出力された後に、MSBuildからビルドが開始されます。
x86_64や他のプラットフォームも同様の手順でビルド環境を用意できます。

# PS4向けのビルド環境構築
PS4向けのvs15プロジェクトファイルの生成にはいくつかの手順が必要になります。
まず、x86_64向けに生成したプロジェクトファイルを開き、プロパティからPS4向けのツールチェインに変更します。
そして、`threading.h`と`vpx_thread.h`で、pthreadの定義を用意します。
これはPS4向けの専用APIを使用するか、pthreadライブラリをリンクする必要があります。
あとはWindows環境と同様です。
【Java】List型・Array型の変換

## List型をArray型に変換
```java:
Foo[] array = list.toArray(new Foo[list.size()]);
```
もしくは

```java
Foo[] array = new Foo[list.size()];
list.toArray(array);
```

## Array型をList型に変換
```java
String[] stringArray = {"aaa", "bbb", "ccc"};
List<String> stringList = Arrays.asList(stringArray); 
```
ただし、上記の書き方だと要素の追加・削除ができない。[(参考URL)](http://etc9.hatenablog.com/entry/2017/04/17/232505)
要素の追加・削除をする際は下記の通りに記述する。

```java
String[] stringArray = {"aaa", "bbb", "ccc"};
List<String> stringList = new ArrayList<>(Arrays.asList(stringArray));
```
Android版Apple Musicアプリの仕様メモ

itunesで登録出来るメタデータは1つの曲につき以下の5項目

- 曲名
- アーティスト
- アルバム
- アルバムアーティスト
- 作曲者

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/29c669de-7d46-8813-df3c-65cfd2bc129c.png)

Android版のapple musicアプリ(バージョン2.6.0 712)の、アーティスト・アルバム・作曲者 を選んだ時になんのデータが表示されるか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/63867dab-68b5-e94d-57ea-0f591a15a590.png)

```
アーティスト
└アルバムアーティストの項目で絞る/空欄の時はアーティストの項目を使う
  └アルバムで絞る。
    └曲の一覧を表示する

アルバム
└アルバムで絞る。一覧表示はサムネイルで表示される
  └曲の一覧を表示する

作曲者
└作曲者で絞る
  └曲の一覧を表示する。サムネイルで表示される

```
laravel-adminのviewをvendor外で動かす

最近、laravel-adminで管理画面を作成したので、役に立った事を記載。
###「\resources\views\」以下に任意の名前でフォルダを作成する。
今回は「laravel-admin」というフォルダ名で作成
![resources.PNG](https://qiita-image-store.s3.amazonaws.com/0/314837/846d4f92-0042-9e82-9c1d-f2a3e37d3e9c.png)

###「\vendor\encore\laravel-admin\resources\views\」以下のファイル・フォルダを「\resources\views\laravel-admin」フォルダへコピーする
![resources_laravel-admin.PNG](https://qiita-image-store.s3.amazonaws.com/0/314837/7858711e-0cf0-bac4-53b3-84c185f907bb.png)


###「app/Admin/bootstrap.php」に下記を追記

```app/Admin/bootstrap.php
app('view')->prependNamespace('admin',resource_path('views/laravel-admin'));
```

# 検証
###ログインページのタイトルを変えてみる

```\resources\views\laravel-admin\login.blade.php
<div class="login-box">
  <div class="login-logo">
    <a href="{{ admin_base_path('/') }}"><b>ららべるあどみん</b></a>
  </div>
```

###ブラウザで見てみる
![ららべるあどみん.PNG](https://qiita-image-store.s3.amazonaws.com/0/314837/56a3dc95-74af-b52d-e157-17374967ae77.png)
すごいH本読んだからまとめ 6 「カリー化」

## はじめに

* [すごいHaskellたのしく学ぼう](https://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86%EF%BC%81-%EF%BC%AD%EF%BD%89%EF%BD%92%EF%BD%81%EF%BD%8E%EF%BC%AC%EF%BD%89%EF%BD%90%EF%BD%8F%EF%BD%96%EF%BD%81%EF%BD%83%EF%BD%81-ebook/dp/B009RO80XY)を読んだのでちょっとずつまとめていきたい。まとめていきたい。

* シリーズ
  * [すごいH本読んだからまとめ 1 「関数の呼び方、関数の定義の仕方」](https://qiita.com/yumakkt/items/ce82eb3ffae874faf249)
  * [すごいH本読んだからまとめ 2 「リスト,タプル」](https://qiita.com/yumakkt/items/36d95c738a3bc17119bd)
  * [すごいH本読んだからまとめ 3 「型」](https://qiita.com/yumakkt/items/f47e8ee810679978869f)
  * [すごいH本読んだからまとめ 4 「関数の構文」](https://qiita.com/yumakkt/items/c50dcd286cf7521e31a0)
  * [すごいH本読んだからまとめ 5 「再帰」](https://qiita.com/yumakkt/items/ecb3244446de17aaa7fa)



## カリー化

+ `複数の引数を取る関数`が、`引数の一部`を受けとったとき、`残りの引数を受け付けて元の関数の値を返す`関数である場合、それは`カリー化された関数`である。
+ Haskellの関数はすべてカリー化されている。

```haskell

-- 複数の引数を取る関数
*Main Lib> sum' a b = a + b
-- 定義した関数に引数の一部を渡し（部分適用）、「残りの引数を受け付けて値を返す」関数を保存する。
*Main Lib> sum3 = sum' 3
-- 定義した関数に残りの引数を与えてみる（関数適用）
*Main Lib> sum3 5
8
```

部分適用は左側から行われる

```haskell

-- 3つの引数を受け取って値を帰す関数
function :: a -> b -> c -> d -- a -> (b -> (c -> d))
-- aだけ部分適用
functionA = function a -- b -> c -> d
-- aとbを部分適用
functionAB = function a b -- c -> d
-- aとbとcを適用（普通の関数実施）
functionABC = function a b c -- d

```

中置き関数は、書き方によって適用順が変わる。

```haskell
-- 10 「を」割る
*Main Lib> tenDivide = (10 /)
*Main Lib> tenDivide 5
2.0
*Main Lib> tenDivide 2
5.0

-- 10「で」割る
*Main Lib> divide10 = (/10)
*Main Lib> divide10 100
10.0
*Main Lib> divide10 1
0.1


-- マイナス(-)は負の値を表す演算子として定義される。
*Main Lib> minus10 = (-10)
*Main Lib> minus10 12

<interactive>:14:1: error:
    ? Non type-variable argument in the constraint: Num (t1 -> t2)
      (Use FlexibleContexts to permit this)
    ? When checking the inferred type
        it :: forall t1 t2. (Num t1, Num (t1 -> t2)) => t2

-- こういう書き方もできる。

isUpperAlphanum :: Char -> Bool  
isUpperAlphanum = (`elem` ['A'..'Z'])  
*Main> isUpperAlphanum 'S'
True
*Main> isUpperAlphanum 's'
False

```
入場前準備

私が研修で習ったことといえば

1.Java基礎
2.JavaSEのほんの一部分（API,GUIエディター）
3．JavaEEの機能について

ぐらいだ。

だが現場に入場する際に必要な知識は
postgreSQL,Linux環境でのshellでの開発、コマンドプロンプトを使っての開発。
設計書の読み方だった。

他にも漏れているかもしれない。

ここでは入場までの知識を棚卸するために個人的に使うスペースだ。

最初は散らかり放題で他人の目に触れることなど知ったことかという状態だが、
やがてはきれいに整理整頓し、現場入場まで過程のひとつの例として見て欲しい。

------------------------------------------------------------------------------------------
◎研修での勉強内容:stopwatch:
◇

-----------------------------------------------------------------------------------------
◎現場入りまでの勉強内容:hourglass:
◇
Node.jsって何だよ

# 前提知識
## 実行環境
プログラミング言語というのは、実行環境がないと動かすことができません。
プログラミング言語を、テキストファイル（.txt）に書いただけでは何も起こりません。
その言語をプログラムとして理解し、記述された通りに動かす必要があります。
それを行う”場”が、「実行環境」です。

# Node.js
Node.jsはJavaScriptのランタイム環境（実行環境）。
ランタイム環境とは、プログラムを実行するための環境。

一般的にwebサイトで利用されているJavaScriptの実行環境は、ブラウザです。
つまり、今までブラウザ上でしかJavaScriptは動かすことができませんでした。
ブラウザ上以外でもJavaScriptを動かしたいという思いで産まれたのが、JavaScriptの実行環境「Node.js」です。

他にも、以下のような機能も持っています。

* ライブラリ管理
* REPL
SORACOM ButtonでLambdaを使わずにSlack連携してみた

どうも若松です。

みなさん、SORACOM Button活用してますか？
Slackへの連携も公式に出ているので、簡単に実装できますね。
https://dev.soracom.io/jp/start/aws_button_slack/

これを今から帰るよメッセージに使ってる方もいるようです。

しかしながら、以下のような方もいらっしゃるかと思います。
-　そもそもLambdaって何者よ
-　例え公式から出ていようともコードなんて書きたくない

そこで、Lambdaを使わずに(意識せずに)Slack連携する方法を考えてみました。

# メール送信設定
Slack連携方法としてメール送信を利用します。
メール送信設定方法は以下などに記載があるので、割愛します。
https://blog.soracom.jp/blog/2018/10/25/are-you-ready-for-lte-m-button/

取り急ぎ、帰るよメッセージ送信を想定して、以下のように設定しました。
<img width="982" alt="スクリーンショット_2018-11-08_0_48_55.png" src="https://qiita-image-store.s3.amazonaws.com/0/94816/6eb4c0f6-399b-f301-c669-b0c4a6db5e8a.png">

# SlackのEmailインテグレーションを使う
SlackにはEmailインテグレーションが標準で備わっています。
Mailインテグレーションでメールアドレスを発行し、そこにメールを送るとSlackに通知する仕組みです。
なので、AWS IoTからメールを送る機能と組み合わせることで、Slackへ連携できます。
連携後の通知は以下のようになります。
<img width="691" alt="スクリーンショット_2018-11-08_0_54_41.png" src="https://qiita-image-store.s3.amazonaws.com/0/94816/3e41a418-6ae4-0df3-46b4-b4b428ef8e62.png">
ただ、このEmailインテグレーションはSlackの有償プランじゃないと使えないので、ややハードルが高いです。
なので、無償でできそうな仕組みも考えてみます。

# Microsoft Flow でメールから連携する
Office365を利用していると、Microsoft Flowというサービスを使うことができます。
https://japan.flow.microsoft.com/ja-jp/

簡単に言うと様々なサービスの間を取り持って連携させてくれるサービスです。
Microsoft Flow for Office 365はフリープランがあるので、無償で始めることができます。
https://japan.flow.microsoft.com/ja-jp/pricing/

今回はGmailをトリガーにしてSlackへ投稿します。
設定は以下の通りです。
<img width="614" alt="スクリーンショット 2018-11-10 23.31.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/94816/7b96af39-d3dd-367c-05d1-b2dc805a81a3.png">
Gmailのトリガーは最初に使うときにアカウント連携させる必要があります。(詳細は割愛)
簡単のために件名のみで引っ掛けてますが、他の項目も設定してトリガーするメールを絞り込みことが可能です。

実際にMicrosoft Flowで連携して投稿すると以下のようになります。
<img width="378" alt="スクリーンショット_2018-11-10_23_38_31.png" src="https://qiita-image-store.s3.amazonaws.com/0/94816/1c05b2ca-6730-bedd-7ca7-049ff9779fad.png">

上記ではメールの本文をそのまま投稿していましたが、以下のようにメールとは関係ないメッセージに変えることも可能です。
<img width="613" alt="スクリーンショット 2018-11-10 23.32.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/94816/796bc573-51cc-23c0-116f-7ad81a484e11.png">

これを投稿すると以下のようになります。
<img width="373" alt="スクリーンショット 2018-11-10 23.36.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/94816/8f1010c5-7b78-9ae3-2d1b-e6ff7261a566.png">

# まとめ
そもそもメール送る時点で自動生成されるLambdaは使ってるので、タイトルの表現が合ってるかは微妙ですが、コードを見なくていいという点ではアレルギーの少ない構成かと思います。

Microsoft Flowの連携はメールが到着してから5分程度のタイムラグが出るので、即時性を求める場合は難しいですが、Slackの有償プランを使わなくてもいいのは嬉しいですね。
sympyで「積分」をやってみた

何か次の行の表示がおかしい。
#∫[-∞,∞](sinx/x)^3 dx
(参考)東京大学大学院数理科学研究科理学部数学科・理学部数学科 |平成30年度（Ｈ29.8.28,29実施) | 専門科目A | A 第7問 
http://www.ms.u-tokyo.ac.jp/kyoumu/30a.pdf#page=4

(参考)Wolfram|Alpha Examples: 積分＞定積分
https://www.wolframalpha.com/input/?i=((sinx)%2Fx)%5E3
https://ja.wolframalpha.com/input/?i=%E2%88%AB%5B-%E2%88%9E,%E2%88%9E%5D((sinx)%2Fx)%5E3+dx
2.35619
2.356194490192344928846982537459627163147877049531329365731208444230862304714656748971026119006587801

(参考)Wolfram|Alpha Examples: 積分＞不定積分
https://ja.wolframalpha.com/input/?i=((sinx)%2Fx)%5E3%E3%80%80%E3%81%AE%E7%A9%8D%E5%88%86
((-4 Sin[x]^2 (3 x Cos[x] + Sin[x]))/x^2 - 3 SinIntegral[x] + 9 SinIntegral[3 x])/8

```fullscript.py
from sympy import *
var("x")
f=((sin(x))/x)**3
print(integrate(f,(x, -oo, oo)))
print(float(integrate(f,(x, -oo, oo))))
#3*pi/4
#2.356194490192345
```
①手計算の方法のヒントを教えて下さい。
②sympyライブラリーintegrateのどの箇所で計算していますか。検索の方法を教えて下さい。

#∫[0,1] log(x)/(x^2-1) dx
(参考)東京大学大学院数理科学研究科理学部数学科・理学部数学科 |平成29年度（Ｈ28.8.29,30実施) | 専門科目A | A 第7問 
http://www.ms.u-tokyo.ac.jp/kyoumu/a20170524.pdf#page=4

(参考)Integration in SymPy raises “no attribute '_eval_power'” error
https://stackoverflow.com/questions/53261761/integration-in-sympy-raises-no-attribute-eval-power-error/53262622#53262622

(google翻訳より）
Pythonでは、力は**（と^はXOR）で表されるので、f = log（x）/（x ** 2-1）を書いてください。このため、エラーがスローされます。しかし、SymPyは依然としてその関数を統合することができません。積分は未評価です。これらのポリロッグ型の非整数積分は、SymPyに多くの問題をもたらします。
あなたが浮動小数点の答えで大丈夫なら、数値の積分を使う：
print（Integral（f、（x、0、1））。evalf（））
1.23370055013617を返します...
このような積分を試す価値があるのは、数値積分の結果と似ている象徴的な答えを見つけるnsimplifyです。
>>> nsimplify（Integral（f、（x、0,1））、[pi、E]）
pi ** 2/8
ここでリスト[pi、E]には、積分に現れる可能性が高い2つの最も有名な数学定数が含まれています。 （頻繁に現れる別の定数はEulerGammaです）。


(再チャレンジ)
Eがなくても同じ結果でした。

```fullscript.py
from sympy import *
var("x")
f=log(x)/(x**2-1)
print(integrate(f,(x, 0, 1)))
print(Integral(f,(x, 0, 1)).evalf())
print(nsimplify(Integral(f, (x, 0, 1)), [pi]))
# Integral(log(x)/((x - 1)*(x + 1)), (x, 0, 1))
# 1.23370055013617
# pi**2/8
```

# integral_0^(π/2) sin(sin(x)) dx
(参考)東京大学大学院数理科学研究科理学部数学科・理学部数学科 |平成28年度（Ｈ27.8.28,31,9.1実施) | 専門科目A | A 第2問(3)  
http://www.ms.u-tokyo.ac.jp/kyoumu/20160210a.pdf#page=2

(参考)Wolfram|Alpha Examples: 積分＞定積分
0からpi/2の範囲でsin(sin(x))を積分
https://ja.wolframalpha.com/input/?i=0%E3%81%8B%E3%82%89pi%2F2%E3%81%AE%E7%AF%84%E5%9B%B2%E3%81%A7sin(sin(x))%E3%82%92%E7%A9%8D%E5%88%86
integral_0^(π/2) sin(sin(x)) dx = (π H_0(1))/2?0.893244
H_0(x)はシュトルーベ(Struve)関数です

(参考)Wolfram|Alpha Examples: 積分＞不定積分
integral sin(sin(x)) dx
Integrate[Sin[Sin[x]], x]
integral_0^π sin(sin(x)) dx = π H_0(1)?1.78649
H_0(x)はシュトルーベ(Struve)関数です

ストルーベ関数--------------------------------
(参考)>シュトルーベ関数 - 高精度計算サイト
https://keisan.casio.jp/exec/system/1200010675
(参考)wikipedia＞Struve function
https://en.wikipedia.org/wiki/Struve_function

```fullscript.py
from sympy import *
import sympy
var("x")
f=sin(sin(x))
print(integrate(f,(x, 0, sympy.pi/2)))
print(Integral(f,(x, 0, sympy.pi/2)).evalf())
print(nsimplify(Integral(f, (x, 0, sympy.pi/2)), [pi]))
# Integral(sin(sin(x)), (x, 0, pi/2))
# 0.893243740975026
# 2**(36/199)*3**(194/199)*5**(93/199)*7**(96/199)*pi**(551/398)/98
```

①ストルーベ関数:何に使うのですか？
laravel-adminインストール手順

##laravelインストール
### composerでバージョン指定インストール
```
> composer create-project "laravel/laravel=5.6.*" testlaravel
```
### バージョン確認

```
> php artisan -V
Laravel Framework 5.6.39
```

### xamppなどで表示させると下記のlaravelデフォルトの画面が表示される
![20181110_laravelTOP.PNG](https://qiita-image-store.s3.amazonaws.com/0/314837/a50d6680-0ee7-a633-8913-20246e468ad2.png)

## laravel-adminインストール

###インストール

```
> composer require encore/laravel-admin
```

### .envファイルにDBの情報を記載する

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
# 作成したDB名にする
DB_DATABASE=testlaravel
# 使用するユーザ名にする
DB_USERNAME=root
# パスワードを記載する
DB_PASSWORD=root
```

###下記でファイルの追加

```
> php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
```

###下記でmigrate等更にインストール

```
> php artisan admin:install
```

###DBにlaravel-adminのテーブルが追加される
![20181110_laravel-admin_DB.PNG](https://qiita-image-store.s3.amazonaws.com/0/314837/02eb0a31-d414-f517-ad61-1ab390df7a18.png)

###ログイン画面を表示する
[http://localhost/admin](http://localhost/admin)にアクセスするとlaravel-adminのログイン画面が表示される
![20181110_laravel-adminTOP.PNG](https://qiita-image-store.s3.amazonaws.com/0/314837/8fea4320-bfaa-8274-4237-146ff7dafa2f.png)


##参照元
laravel-admin
https://laravel-admin.org/docs/#/

Laravel-adminの立ち上げ方
https://qiita.com/masahirok_jp/items/227e4313ecf558fb9d11
Rでのデータ分析結果をmattermostに通知する 

## はじめに
- Rでの日々バッチ分析結果を要約した統計量等をMattermostに入ってる関係者に通知したい
- 要約結果から詳細に知りたいと思った人向けに、詳細リンク（htmlレポートや Shiny Dashboard）を貼り、そこからアクセスしてもらう導線にもなる

## 方針
- mattermostに通知したい分析結果をRで記述する(script.R)
- `httr::POST`でmattermostに通知する

`httr`はHTTPリクエストを操作するRのパッケージです。適当にググってみてください。

## 通知してるモノ

デザインはいろいろありますが、以下のフォーマットが基本的な感じです

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69266/be3cf388-9447-f402-7777-10e80e75e6c5.png)

## How To

### Incoming Webhook

Mattermostの[incoming webhook](https://docs.mattermost.com/developer/webhooks-incoming.html)にPayloadに必要なパラメータ名は書いてるので、それをみながら設定

```R
table.summary <- kable(data, format = "markdown")
URL <- "http://[mattermost URL]/hooks/[TOKEN]"
day <- Sys.Date()
text <- paste0("#### Test Summary : ", day, " (",wday(day, label = T), ") \n See [dashboard](http://-) for details. This notification is deployed [here](http://-). \n\n", paste0(table.summary, collapse = "\n"))
httr::POST(url = URL, body = list(username = "Reporter", text = text)) 
```

MattermostのメッセージはMarkdown表記ができるので、表やリンクをMarkdown表記で書きます。無理やり感がありますが。

### Attachments

mattermostでリッチな見た目のメッセージを送信するために、[Attachments](https://docs.mattermost.com/developer/message-attachments.html)という機能がある

それでも同じようにかけるが、　bodyへの渡し方がちょっとややこしい

```R
text2 <- list(attachments = list(list(pretext = text, text = "コメント募集", color = "#FF8000")), username = "Reporter")
httr::POST(url = URL, body = toJSON(text3, auto_unbox = T))
```

ポイントとしては、

- attachmentsパラメータはlistのlistで設定する。
- `jsonlite::toJSON`の`auto_unbox = T`が必要。これにより、要素が１つしかないvectorを展開してくれる
    - 参考 : [jsonliteで要素ひとつだけのベクトルをうまくtoJSON()するにはauto_unboxを使えばいい](https://notchained.hatenablog.com/entry/2014/10/02/080901)

結果は以下のように、ColorLineを入れることもできました。他にもいろいろとリッチにできると思います

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69266/d465a0cb-91ab-d503-4667-3029f4ce51cd.png)

### ggplotの図を添付するには？

`slackr`パッケージには、ggplotの結果をsaveしたpngファイルを添付することができるたみたいので、その[コード](https://github.com/hrbrmstr/slackr/blob/master/R/gg_slackr.R
)を参考にしましたが、mattermostの場合、attachmentsパラメータの中の`image_url`に図を示すURLを記述する必要があります。

しかし、`httr::upload_file()`をtoJSONの中で展開できないこともあるため、slackrのとおりにはいかないなと思いました。

これ適切なやり方あるのかな…
Rubyで素数を見つけてみた．（エラトステネスのふるい）

# 素数の定義
以下，[Weblio辞書：素数](https://www.weblio.jp/content/素数)より引用．
> 1 と自分自身以外には約数をもたない正の整数。 1 は素数の中に含ませない。

# エラトステネスのふるい
1.  `2`から数字を見ていって素数を見つける，
2.  素数の倍数は素数ではないので素数が現れるたびに，その倍数は素数ではないと確定していく．
3.  見つけた素数から見ていって，見つけた素数より大きい素数を見つける．
4.  2.と3.の動作を繰り返す．

以上の工程で素数を見つけることを`エラトステネスのふるい`と言います．
表が載っているサイトがわかりやすいので以下を紹介しておきます．
[こちらです．（エラトステネスのふるい）](http://izumi-math.jp/sanae/MathTopic/furui/furui.htm)

# 実装

```eratosthenes_sieve.rb
def eratosthenes_sieve(num)
  # nums = Array.new(num, true)
  nums = [*0...num]
  primes = []
  k = 2 # 0, 1 aren't  prime-nums
  while k*k<=num
    for i in k..num/k
      nums[k*i] = nil
    end
    k += 1
    while !nums[k]
      k += 1
    end
  end
=begin
  primes = nums.each_with_index.select {|num, index| index if num}
  primes.clone.each_with_index do |prime, index|
    primes[index] = prime[1]
  end
  primes
=end
  nums.compact[2...nums.size]
end

num = rand(100)
prime_nums = eratosthenes_sieve(num)
p "num: #{num}" # "num: 53"
p "prime_nums: #{prime_nums}" # "prime_nums: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]" 
```

# おまけ（Rubyのnilチェック？）
コーディング中に「ん？？？」と思うことがありました．
問題の部分を以下に記します．

```ruby
primes << i if nums[i] = true
```
この一文は，たまたま`if nums[i] == true`と書きたかったのを間違えちゃった一文です．でもこれでも通っちゃいました．ナゼだろう...と不思議に思って色々試して見ました．

```ruby
a = 'test'
p a # "test"
p a if a = 'change' # "change"
```

あ，`if`の条件式に配置した`a = 'change'`が影響して`"change"`が出力されてる！:open_mouth:

もしかして，**swift**の`if let`と同様の**nilチェック**の様な機能を果たしているのではないか！と考えました．

```ruby
a = nil
p a # nil
p 'hogehoge' if b = a # nil
a = 'test'
p 'hogehoge' if b = a # "hogehoge"
```
おーやっぱりそうなのか！:stuck_out_tongue_closed_eyes:
しかし...

```ruby
a = 'test'
p b if b = a
```

こうすると，**bなんて変数知りませんよ**と言われちゃいました．

```ruby
a = 'test'
if b = a
  p b # "test"
end
```

これだと大丈夫．Rubyの`if`のワンライナーで書く方法のうち，内容を前に持って来る場合はこの**nilチェック**は使えない様ですね．

**nilチェック**という言葉が正しいのかどうかは定かではありません．どなたかご存知でしたらこの様な動作の名称を教えていただけると発狂します:smiling_imp: