OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS関係過去記事

■Linuxホスト名変更
https://qiita.com/myabiot/items/4583baa472bd4a630c3c

■ntpサーバ(CentOS)と自動同期しない場合の設定
https://qiita.com/myabiot/items/273feef3912666c709d3

■CentOS6.7 virtualBOXでクローンを作成したOSがネットワークへ抜けない場合
https://qiita.com/myabiot/items/4aa8a87adae943469f33
[Python] 浮動小数点数floatの比較は要注意！！

# はじめに
最近Pyhonを勉強し始めた新人です。
今回は浮動小数点数floatの比較について書きたいと思います。

# float型の比較
皆さん、以下のコードの出力は何だと思いますか？

```python:test.py
def main():
    x = 0
    for i in range(10):
        x += 0.1

    if x == 1.0:
        print("OK")
    else:
        print("NG")


if __name__ == "__main__":
    main()

```
0.1を10回足すので、xは1.0になるはずです。
そのため、"OK"が出力されるはず・・・

# 実際に動かしてみると・・・
実際に動かしてみましょう。

```console:実行
$python test.py
NG
```

"NG"が表示されます。
数学的には0.1を10回足すと、1.0になるはずですが・・・

# xには一体いくつになっているのか？

以下のコードを実行して、型とxの値を確認します。

```python:test.py
def main():
    x = 0
    for i in range(10):
        x += 0.1

    print(type(x))
    print(x)

    if x == 1.0:
        print("OK")
    else:
        print("NG")


if __name__ == "__main__":
    main()

```
実行結果が以下になります。

```console:実行
$ python test.py
<class 'float'>
0.9999999999999999
NG
```

型はfloat型、そしてxの値は**0.9999999999999999**となっています。
一体なぜでしょうか？

# float型は小数を正しく表示できない！？
実はfloat型は10進数の小数を正しく表示することが出来ません。

以下のコード結果を見れば分かりますが、format()で表示桁数を増やすと誤差が存在するのが分かります。

```python:test.py
print(0.1)
print(format(0.1, '.20f'))
```

```console:実行
$ python test.py 
0.1
0.10000000000000000555
```

# float型は2進数で管理されている
表示こそ10進数ですが、内部的には2進数で管理されています。そして、**多くの10進数の小数は2進数で表現できません。**

例えば十進数の「0.1」を2進数に変換すると「0.0001100110011…」となり、「0011」の部分が永遠に循環します。このような値はどこかの桁数で丸めを行う必要があるため、上記のように誤差が生じます。

また、この話はpythonに限った話ではなく、[IEEE 754](https://ja.wikipedia.org/wiki/IEEE_754)の2進浮動小数点形式を採用して計算していれば、同じことが起こります。

- 追記  
float型だけではなく、int型も2進数管理されているみたいです。 

# 対策　math.isclose()を使う
mathモジュールの関数[isclose()](https://docs.python.org/ja/3/library/math.html#math.isclose)を使うことによって、近似的な比較を行えます。
これを用いることによってfloat型の比較ができますね。
実際に使ってみましょう。


```python:test.py
import math


def main():
    x = 0
    for i in range(10):
        x += 0.1

    if math.isclose(x, 1.0):
        print("OK")
    else:
        print("NG")


if __name__ == "__main__":
    main()

```

```console:実行
$ python test.py 
OK
```
"OK"と表示されました！

# まとめ
10進数の小数を比較するときは、誤差が生じることがあることを意識しておく必要がありそうです。
頭の片隅に置いておきましょう。
TECH 　DAY　３

勉強した項目：　Ruby、Rails
時間： 11:00
内容：

＊学習アウトプットです。なにぶん間違いなんかもあります。気をつけますがその際はご指摘いただけますと幸いです＊

###【attr_accessor】
　ゲッター、セッターを簡単に定義できるメソッド

```Ruby
class Dog
  attr_accessor :name, :type, :age
end
```

###【リファクタリング】
　コードの仕様を変えずに中身を改善すること

###Railsの環境構築　Homebrewについて

 •Homebrewは、Mac OS上でのソフトウェア管理を行うソフトウェアのこと
 •インターネット上から便利なアプリケーションを簡単にインストールしたり、そのバージョン管理をすることができる

###[rbenvとruby-build]について
 •rbenvとruby-buildは、Rubyのバージョンを管理する際に組み合わせて使う
 •benvを使用することでrubyのバージョンを切り替えることできる
 •バージョンを切り替える必要は、開発環境によってはRubyの特定のバージョンでなければエラーが出てしまうことがあるため

###[パスを通すとは]
 •本来アプリケーションを利用するためにはそのアプリケーションの実行ファイルが存在するディレクトリまで移動するか、実行ファイルの在処を絶対パスで指定する必要がある
 •しかし、設定ファイルにコードを書き設定することで、どのディレクトリからもアプリケーションを呼び出せるようになる、これを`「パスを通す」`という

###[MySQL]
 •データを保存するデーターベースサーバーの一種

###[gem]
 •Rubyを便利に扱うためのアプリケーションの総称


###【rails new コマンド】
　Railsで新規アプリケーションを作成する際に使用

ターミナル

```Ruby:
  $ rails new アプリケーション名
  # アプリケーションを新規作成

  $ rails new アプリケーション名 -オプション名
  # オプションを付けてアプリケーションを作成
```

###【リクエストとレスポンス】
　PCやスマートフォンを使ってウェブサイトにアクセスした時、PCからはリクエストというものが送信され、
　それに対して、リクエストを受け取ったサーバーはリクエストに対して適切なレスポンスを返すこと

•Railsでの処理は`ルーティング→コントローラ→ビュー`の流れで行われている•

###【ルーティング】
　ルーティングには、送られてきたリクエストに対してどのコントローラのどのアクションを動かすのかを設定する

###【コントローラ】
　コントローラはルーティングとビューをつなぐ役割
　リクエストが送られてきた際にルーティングが読まれると、それに対応するコントローラが動く
　コントローラでの処理が終わると、そのコントローラから指定したビューが読みこまれる

　＊コントローラはルーティングからビューへと処理を受け渡す役割*

###【モデル•ルーティング•コントローラー•ビュー】
　•モデルは、アプリケーションとデータベースを繋げる
　•ビューはブラウザに返すファイル
　•ルーティングはリクエストに応じて呼び出すアクションを指定する

###【rails s コマンド】
　`rails s` コマンドはアプリケーションを動かすためのテストサーバーを起動するためのもの
  rails sのsとはserverを省略したもの

###【 control c コマンド】
　`rails s`コマンドで立ち上げたサーバーは
  `「control + c」`(controlボタンとcを同時押し)で終了できる

###【テーブル】
　表形式の収納場所

###【レコードとカラム】
　テーブルの•横1行のことをレコード•縦1列のことをカラム

###【モデル】
　Railsの中でデータベースへのアクセスをはじめとする情報のやりとりに関する処理を担当

###【モデルの命名規則】


| 種類 | 概要 | 名前例 |
|:--|:--|:-----:|
| モデルクラス名 | 先頭は大文字、単数形 | Tweet |
| モデルクラスのファイル名 | 先頭は小文字、単数形 | tweet.rb |
| テーブル名 | 先頭は小文字、複数形 | tweets |

###【マイグレーションファイル】
　マイグレーションファイルは、テーブルの設計図である。
　マイグレーションファイルにどんなカラムを持つテーブルにするかを書き込み、実行することでテーブルが作成できる。
　
###【ActiveRecord】
　ActiveRecord(アクティブレコード)はRubyのGemの一つで、
　このGemはモデルとテーブルをつなぎ合わせることで、Railsからテーブルのレコードにアクセスできるようなる

###【allメソッド】
　allメソッドはApplicationRecordを継承したモデルと結びつくテーブルのレコードを全て取得できる

```Ruby:コンソール
[1] pry(main)> Tweet.all
```

###【newメソッド・saveメソッド】
　newメソッドはクラスのインスタンスを生成するメソッド
　saveメソッドを実行するとテーブルに保存される

```Ruby:コンソール
  [1] pry(main)> tweet = Tweet.new(name: "takamasa", text: "頑張ります")
  [2] pry(main)> tweet.save
```
###【ヘルパーメソッド】
　Railsでは主にviewでHTMLタグを出現させたりテキストを加工するために予めメソッドが用意してある
　他には、`form_tag`(フォームを出現させるメソッド)や`link_to`(aタグを出現させるメソッド)などもある

 3ビューファイル内で使用するメソッドである
PHPでGuzzleを使ったHTTPリクエスト

##はじめに
PHPからguzzleを使用して外部API(GithubやQiitaなど)をシンプルに実行するためのメモです。
エラー処理だけLaravel独自のメソッドがありますが、ほとんどフレームワークを選ばず使用できます。

#guzzleとは
シンプルなインターフェースで同期、非同期リクエストを行えるPHPのHTTPクライアントになります。

詳しくはこちら↓
https://github.com/guzzle/guzzle

#実装

まずはベース部分を実装します。

```php
    /**
     * @param string $base_url
     * @param string $path
     * @param array $headers
     * @param array $form_params
     * @param string $method
     * @return array
     */
    private function requestClient(
        string $base_url,
        string $path,
        array $headers,
        array $form_params = [],
        string $method = 'GET'
    ): array {
        try {
            $client = new \GuzzleHttp\Client([
                'base_uri' => $base_url,
            ]);

            $response = $client->request($method, $path, [
                'headers' => $headers,
                'form_params' => $form_params,
            ]);
            return json_decode($response->getBody()->getContents(), true);
        } catch (\GuzzleHttp\Exception\GuzzleException $e) {
            report($e); // ログ出力
            return [];
        }
    }
```

##### Qiitaからの取得

```php
    /**
     * @return array
     */
    public function getQiitaList(): array
    {
        $base_url = 'https://qiita.com';
        $path = '/api/v2/authenticated_user/items?page=1&per_page=20';
        $headers = ['Authorization' => 'Bearer xxxxxxxxxxxxxxxxx'];
        return $this->requestClient($base_url, $path, $headers);
    }
```

##### Githubからの取得

```php
    /**
     * @return array
     */
    public function getGithubList(): array
    {
        $base_url = 'https://api.github.com';
        $path = '/repos/terumichi1209/laravel-test/commits?sha=develop';
        $headers = [];
        return $this->requestClient($base_url, $path, $headers);
    }
```

##終わりに
要件によってはこの辺りのオプション使うと良さそうです。
http://docs.guzzlephp.org/en/latest/request-options.html
カテゴリ変数のエンコーディングについて

# はじめに
データ分析において対象データにカテゴリ変数が含まれる場合の対処法について調べた際のまとめです。

# カテゴリ変数
例えば下のような社員データに対して回帰分析など数理的な分析を行うケースを考えます。
年齢は数値自体に意味を持つので分析の際にそのまま扱うことができますが、職種のようなカテゴリデータはそのまま扱うことは難しく、扱いやすい数値表現に変換する(エンコーディングする)必要があります。

|  | 年齢 | 職種 |
|:------:|:-----:|:------------:|
| 社員A | 20 | エンジニア |
| 社員B | 35 | デザイナー |
| 社員C | 28 | 営業 |
| 社員D | 40 | エンジニア |

# エンコーディング方法
上の職種のようなカテゴリ変数に対するエンコーディングとしてここでは、One-Hotエンコーディング、ダミーコーディング、Effectコーディングを取り上げます。

### One-Hotエンコーディング
one-hotエンコーディングでは先程のカテゴリについて自身がそれに属する場合は1、属さない場合は0として表現します。

|  | 職種_デザイナー | 職種_営業 | 職種_エンジニア |
|:------:|:-----:|:-------:|:-------:|
| 社員A | 0 | 0 | 1 |
| 社員B | 1 | 0 | 0 |
| 社員C | 0 | 1 | 0 |
| 社員D | 0 | 0 | 1 |

個々で各社員のデータについて
職種＿デザイナー + 職種＿営業 + 職種＿エンジニア = 1
となることが必要です。

### ダミーコーディング
one-hotエンコーディングでは３種類の職種からなる職種カテゴリの表現に3つの変数(職種＿デザイナー, 職種＿営業, 職種＿エンジニア)を用いていますが、職種カテゴリを表現するには2つの変数で十分です(k種類のカテゴリに対してk-1個の変数があれば表現できます)。
ダミーコーディングでは変数が0のみで構成されるカテゴリ(参照カテゴリと呼ばれる)を用いて以下のように表現されます。

|  | 職種_デザイナー | 職種_営業 |
|:------:|:-----:|:-------:|
| 社員A | 0 | 0 |
| 社員B | 1 | 0 |
| 社員C | 0 | 1 |
| 社員D | 0 | 0 |

上の表ではエンジニアカテゴリが参照カテゴリとなっています。

### Effectコーディング
ダミーコーディングで扱った参照カテゴリの変数値を0でなく-1にしたものがEffectコーディングです。
データは以下のようになります。

|  | 職種_デザイナー | 職種_営業 |
|:------:|:-----:|:-------:|
| 社員A | -1 | -1 |
| 社員B | 1 | 0 |
| 社員C | 0 | 1 |
| 社員D | -1 | -1 |


# 各種エンコーディングの特性

端的に言うとone-hotエンコーディングのカテゴリ変数による表現自由度を下げ、回帰分析の際に回帰パラメータを一意に決定できるようにしたのがダミーコーディングです。
またダミーコーディングの場合線形回帰式の各パラメータは参照カテゴリに対する各カテゴリの差分として解釈されますが、Effectコーディングの場合パラメータは平均からのズレとして解釈できます。そのような解釈の容易さと対称性がEffectコーディングの売りです。
以下詳細に説明します。

### one-hotエンコーディングとダミーコーディング
エンコーディングによる違いを見るために線形回帰モデル

```math
y = w_0+w_1x_1+w_2x_2+w_3x_3
```
```math
x_i: データ, \quad w_i: パラメータ
```
を考えます。ここでデータ$x_i$がはone-hotエンコーディングされており、$x_1+x_2+x_3=1$の関係が成り立つとします。
上の式に対して

```math
(w_0, w_1, w_2) ⇒ (w_0+w_3, w_1-w_3, w_2-w_3, 0)
```
とした式を計算してみます。

```math
\begin{align}
(w_0+w_3)+(w_1-w_3)x_1 + (w_2-w_3)x_2 + 0 \cdot x_3 &= w_0+w_1x_1+w_2x_2 + w_3(1 - x_1 - x_2)\\
&= w_0+w_1x_1+w_2x_2 + w_3x_3
\end{align}
```
これはもとの回帰式です。したがってone-hotエンコーディングの場合は回帰パラメータ$(w_0, w_1, w_2)$と$(w_0+w_3, w_1-w_3, w_2-w_3, 0)$を区別することができず、回帰式のパラメータが一意に定まりません。この問題はone-hotエンコーディングされた変数が必要以上の自由度を持っていることに起因しており、ダミーコーディングのように自由度を必要最小限にすることで解決できます。

# ダミーコーディングとEffectコーディング
先程の回帰式に対して$x_3$に対応するカテゴリを参照カテゴリとしてデータをダミーコーディングした場合の回帰式は次式のようになります。

```math
y = v_0+v_1x_1+v_2x_2
```
```math
x_i: データ, \quad v_i: パラメータ
```
参照カテゴリデータは$(x_1, x_2)=(0, 0)$なので、その時の回帰式の出力値は$v_0$となります。
したがってダミーコーディング時の回帰式は切片が参照カテゴリに対する出力値、$v_1$, $v_2$はそれぞれカテゴリ1と参照カテゴリの出力値の差、カテゴリ2と参照カテゴリの出力値の差を表します。

一方Effectコーディングの場合、各カテゴリに対する出力値は以下のようになります。

|  | $x_1$ | $x_2$ | 出力$y$ |
|:------:|:-----:|:-------:|:-------:|
| カテゴリ1 | 1 | 0 | $v_0+v_1$ |
| カテゴリ2 | 0 | 1 | $v_0+v_2$ |
| カテゴリ3 | -1 | -1 | $v_0-v_1-v_2$ |

ここで各カテゴリの出力値の平均を取ると$v_0$になります。
したがってEffectコーディングを用いた場合、回帰式の切片が各カテゴリの回帰式出力値の平均となり、パラメータは各カテゴリの出力値と出力の平均値の差と解釈できます。この解釈のわかりやすさがEffectコーディングの利点です。

# 参考
- 機械学習のための特徴量エンジニアリング その原理とPythonによる実践  
  https://www.amazon.co.jp/dp/4873118689
- Pythonではじめる機械学習  
  https://www.amazon.co.jp/dp/4873117984
- one-hotエンコーディングとダミーコーディングについて  
  https://stats.stackexchange.com/questions/290526/problems-with-one-hot-encoding-vs-dummy-encoding
Javaパフォーマンス 2章 パフォーマンステストのアプローチ

[O'Reilly Japan \- Javaパフォーマンス](https://www.oreilly.co.jp/books/9784873117188/)
こちらの本の2章まとめ

[1章 イントロダクション \- Qiita](https://qiita.com/momosetkn/items/00035c30208d26b3e387) ←前回記事
2章 パフォーマンステストのアプローチ - Qiita←今回記事
[3章 Javaパフォーマンスのツールボックス \- Qiita](https://qiita.com/momosetkn/items/e00a59ed1672afb65df7)←次回記事
[4章 JIT コンパイラのしくみ \- Qiita](https://qiita.com/momosetkn/items/21d00b0a2d015624fc07)
[5章 ガベージコレクションの基礎 \- Qiita](https://qiita.com/momosetkn/items/e5ff2a8f6c11b959735c)

# 実アプリケーションでテストする
3種類のテストがある

## マイクロベンチマーク
名前の通り、小さい単位でテストするもの。

ちょっとした実装の差異を比較するときに使う。
テストコードを書くときは注意が必要で、処理結果を使うようなコードにしないと、コンパイラの最適化により計算処理が削除されてしまう。

マイクロベンチマークが、マルチスレッドかシングルスレッドかに関わらず、`volatile`（最適化しない。キャッシュしたくないときにも使われる。）をつけることは重要。
マイクロベンチマークは実運用ではほとんど問題にならない同期がボトルネックになることが多く、その解消に時間を取られるため。

↓volatileについての参考資料
[Declaring a Variable Volatile \(Writing Device Drivers\)](https://docs.oracle.com/cd/E19683-01/806-5222/codingpractices-1/index.html)

ベンチマークで、複数スレッドから`synchronized`メソッドを呼び出すような場合、同期がボトルネックになってしまうため、ベンチマークというよりは、JVMが競合を解消する時間の計測になってしまうことも注意が必要。

入力値をあらかじめ用意して、それを渡すといった工夫により、ベンチマークのコードに余分な処理をつけないようにする。

正しい入力値に基づいてテストを行うべき。たとえば、実運用ではありえない極端に大きな数字での計測などはしない。

４章で説明されるが、Javaはコードを繰り返し実行されると速くなっていくので、ウォームアップは行うべき。

## マクロベンチマーク
アプリケーションのパフォーマンスをテストするためには、使用される外部リソースを組み合わせてテストするのが一番。
このようなテストをマクロベンチマークという。

## メゾベンチマーク
実際の処理だが、完全なアプリケーションが使われるわけではないが、マイクロベンチマークよりは粒度の大きいテスト。
例えば、Webサーバーが応答する速度の測定するもの（セッションやログインの機能を試していない）。
メゾベンチマークは自動化テストにも適している。

# スループット、バッチ、レスポンスタイムを理解する スループット、バッチ、レスポンスタイムを理解する

## バッチ(一括)処理の測定
アプリケーションの開始から終了までを測定するもの。
全体として問題にならない場合は有効。
逆にウォームアップされる前が遅い場合に問題になる場合は別の測定方法が必要。
Javaの場合はウォームアップが必要なので、やや簡単にはできない。

## スループットの計測
一定時間内にどれだけ処理が行えるかの計測。
クライアント-サーバー型の場合は、シンクタイム(think time。何も処理を行わずに待つ時間)無しで計測する必要がある。
1秒間当たりのリクエストの数がよく使われる。TPS(transactions per second)、RPS(requests per second)、OPS(operations per second)など。

## レスポンスタイムのテスト
レスポンスタイムの算出方法は２つ。
１つは平均値。２つ目はパーセンタイル値。
パーセンタイル値は、例えば90パーセンタイル値1.5秒の場合は、90%のリクエストのレスポンスタイムは1.5秒以下で、残りの10%が1.5 秒以上となる。

本書では、↓のロードジェネレータが紹介されていた
[About Faban](http://faban.org/about.html)

# 不安定性を理解する

テストが時とともに変化する。
優れたベンチマークは実世界に近い実行の度に異なるランダム性を持ったデータを使う。
テスト結果を比較する時、コードに問題があるのか、それとも偶然なのかを判断するのが困難。

||ベースライン|標本|
|:--|:--|:--|
|1回目|1.0秒|0.5秒|
|2回目|0.8秒|1.25秒|
|3回目|1.2秒|0.5秒|
|平均値|1.0秒|0.75秒|
というテスト結果の場合、スチューデントのt検定により、43%の確率でパフォーマンスは同じとなる。

しかし、データには不確実性があるため、いくら分析を行ったとしても断定的な判断はできない。

# 早期から頻繁にテストを行う

頻繁にテストを行うのは重要だが、現状とのバランスを見てやる必要がある。

以下に適合するのであれば、早期の頻繁なテストが極めて有益。解決のヒントが得られやすいため。

- すべてを自動化する
- すべてを測定する
- ターゲットのシステム上で実行する
AWS認定試験受験記録

# はじめに
先日AWS認定ソリューションアーキテクトアソシエイト試験に合格したのでその記録です。
AWS認定試験は受験料がかなり高額(16,000円)なので、受験するか否かの判断の材料に使ってもらえればと思います。

# 背景
現在サーバーサイドエンジニア歴3ヶ月半で、AWS使用歴は2ヶ月くらいです。
以前応用情報処理試験の勉強を多少していたのでネットワークの基礎知識はあります(試験は未受験)。
受験した理由についてですが、AWS未経験で今後頻繁に利用することが予想されたので、AWSのサービスに関する体系的な知識を得たいと思い受験しました。また会社で資格取得報奨金が設定されていたこともモチベーションになりました。

# 学習
学習期間は約2ヶ月程です。
試験勉強は以下の順で勉強しました。

1. 参考書による学習
1. Web問題集による学習
1. AWS公式模擬試験

### 参考書による学習
以下の参考書を利用して学習しました。

- 徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書[^1]
 - 簡潔にまとまっており知識の暗記に向いていると思います。分量も多くないので読みやすかったです。模擬試験がついているので、学習した内容の定着度合いを測ることができました。付属の模擬試験は本番試験に比べると大分簡単です。

- Amazon Web Services エンタープライズ基盤設計の基本[^2]
 - AWSの代表的なサービスのユースケースについては上の本にはあまり書かれていなかったので、その辺を把握するために読みました。コーポレイトサイトシステムを例としてAWSを用いて如何にシステムを拡張・高可用化していくかについて書かれています。業務での利用経験が豊富な場合は不要だと思います。

### Web問題集
AWS認定試験用有料Web問題集です[^3]。
問題数が非常に多いです。細かい知識を問う問題が多く、その意味で難問が多かったです。
学習の際は知らない用語などが出てきたらAWS公式のドキュメントやネット上の記事を調べて理解するようにしました。

### AWS公式模擬試験
AWSの公式模擬試験です。本番試験1週間前に受けて、スコアは84%でした。
合格ラインが720/1000なので十分余裕があると判断し、本番試験を受験しました。

試験本番ではスコアが867で合格でした。
130分で65問なので時間にはかなり余裕がありました。

# 感想など
- 本番試験は公式の模擬試験よりも難易度高めに感じました。模擬試験スコアを余裕で超えれるようになってから本番試験に挑むのをおすすめします。
- 他の受験者の方の報告にもありますが、問題文の日本語がおかしいところがいくつかあったので、英語ができる or 機械翻訳の日本語に慣れておくと多少有利かもしれません。

[^1]: https://www.amazon.co.jp/dp/4295005495/
[^2]: https://www.amazon.co.jp/dp/4822292673/
[^3]: https://aws.koiwaclub.com/
[iOS / Android] ハイブリッド＆クロスプラットフォーム開発の簡潔なまとめと、良記事リンク集

# はじめに

私はiOS Nativeの実務経験しかなく、ハイブリッドやクロスプラットフォーム開発の実務経験はありません。
そろそろ何かターゲットを決めて学習を始めねば…と考えて、調べたことを簡潔に整理してみました。

**ご注意**

- 私個人のネット記事観測に基づき独断でchoiceしました。
    - この記事で取り上げている以外にも、たくさんのツール・フレームワーク・サービスがあります。
- 私の所属企業における立場、戦略、意見を代表するものではありません。
- この記事の情報は2019年7月時点です。

お気付きの点がありましたら、コメントをお願いします。

なお、PWAを含む、WebサイトをWebView（内部ブラウザ）で表示する形式のアプリは当記事の対象外です。

# ハイブリッド系

| 名称 | 提供元 |
|:--|:--|
| [PhoneGap／PhoneGap Build](https://phonegap.com/) | アドビシステムズ |
| [Monaca](https://ja.monaca.io/) | アシアル |
| [Ionic](https://ionicframework.com/) | Ionic |

**共通の特徴**

- UIはWebViewで表示します。
- HTMLとCSSでUIを構築し、ロジック実装はJavaScriptで行います。
- すなわち、Webフロントエンドの知識を活用できます。
- Native APIとの橋渡しを[Apache Cordova](https://cordova.apache.org/)が行います。
    - PhoneGapはアドビシステムズによるApache Cordovaの製品版です。
- 上のようなフレームワークやサービスを使わないで、HTML+CSS+JS+Cordovaで開発する選択肢もあります。
- ニュースアプリなど情報表示主体のアプリに向いています。
- 一方、入力に対する反応速度や微細なアニメーションを求められるアプリには向きません。

**PhoneGap BuildとMonacaの特徴**

- クラウド上で開発ができる統合サービスで、コンセプトはよく似ています。
- いずれも、無料枠がありますが、制約があるので注意が必要です。

**Ionicの特徴**

- 上記2つはクラウドサービスの部類ですが、Ionicはフレームワークです。
- Angularをベースにしているため、TypeScriptの知識も必要となります。

**良記事リンク集**

[Apache Cordovaで本格スマホアプリに挑戦しよう](https://codezine.jp/article/detail/9218)
[MonacaとPhoneGap Buildを試してみる](https://qiita.com/itagakishintaro/items/5b276a0ecee209d0c341)
[Ionicでのアプリ開発の始め方](https://qiita.com/clown0082/items/5405c53eb955f985edda)

# クロスプラットフォーム系

| 名称 | 提供元 |
|:--|:--|
| [Xamarin](https://docs.microsoft.com/ja-jp/xamarin/) | マイクロソフト |
| [React Native](https://facebook.github.io/react-native/) | Facebook |
| [Flutter](https://flutter.dev/) | Google |
| [Kotlin/Native](https://kotlinlang.org/docs/reference/native-overview.html) | JetBrains |

**共通の特徴**

- UIがNativeであるため、反応速度や画面描画に違和感がなく、ハイブリッド系が苦手なアプリ分野に強みがあります。
- 実現したい機能によっては、Native APIのラッパーを自作しなければならない場合もあり、その分の工数を見込まなければならない場合も。
- UIの作成方法はツール・フレームワークよってコンセプトが異なります。

**Xamarinの特徴**

- 開発言語はC#。
- Visual Studioに統合されています。
- Xamarin.iOS / Xamarin.Android
    - UIはOSごとに書き、ロジックのみを共通化します。
- Xamarin.Forms
    - C#もしくはXAMLでUIを記述でき、同じUIのコードをOSごとのUIコンポーネントにマッピングします。

**React Nativeの特徴**

- ReactはWeb UIフレームワークであり、ブラウザ上でのDOM制御を行う役割を担います。
- React Nativeは、ReactをiOS/Android Nativeで利用できるようにしたもの。
- 開発言語は、Reactと同様、JavaScriptと、JSXというマークアップ言語です。

**Flutterの特徴**

- 開発言語はDart。
- 2018年12月にVersion 1.0となり正式リリースとなりました。
- "Skia"という、GoogleがOSSとして開発している2Dグラフィックライブラリを用いて、UIを独自に描画します。

**Kotlin/Nativeの特徴**

- 開発言語はKotlin。
- iOSについては、まだUI部分を作ることはできません。（2019年7月時点）
    - AndroidStudioで共通ロジックを書き、framework形式でexportして、Xcodeに組み込むことができます。

**良記事リンク集**

[Xamarin(ザマリン) とはなんぞや](https://qiita.com/amay077/items/38ee79b3e3e88cf751b9)
[10分間で分かった気になれるXamarin概要](https://www.buildinsider.net/mobile/xamarin/01)
[React Nativeとは何なのか](https://qiita.com/Iwark/items/7c27e919bb71f8b256f6)
[Flutterとは？ エヌ次元が企業としてFlutter開発を採用する理由](https://nzigen.com/nzigen-flutter)
[Kotlin/Native を Android/iOS アプリ開発に導入しよう](https://qiita.com/irgaly/items/3e6ee5bc3f59302bb76a)
[クロスプラットフォームモバイルアプリ開発ツール総ざらい2019](https://speakerdeck.com/amay077/native-made-number-droidkaigi)
[Xamarin と React Native と Flutter の違いを正しく理解しよう](https://qiita.com/amay077/items/dff88e7ce6868615a9bb)
JFreeChart-XYPlot-チャートの拡大と縮小


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.Range;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import jp.avaj.lib.algo.ArUtil;

/**
■ JFreeChart-XYPlot-チャートの拡大と縮小

・チャートの中で左上から右下にドラッグすれば、チャートがドラッグ範囲に応じて拡大される。
・右下から左上にドラッグすれば元の画面に戻る。注、複数回拡大しても一回で元に戻る。

・プログラムから拡大あるいは縮小するにはどうすればよいか？
・X軸やY軸の上下限値を設定しなおせばよい。
・元に戻すためには、最初の軸の上下限値を記憶しておく必要がある。

 */
public class Chart18_06 {
  // 目次-ガAxis,目盛、グリッド.
  A_Chart18 a_Chart18;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    // 表示データを生成
    XYDataset dataset = createDataset();
    // 軸を生成
    ValueAxis xAxis = new NumberAxis();
    ValueAxis yAxis = new NumberAxis();
    // レンダラ ⇒ これが全体のレンダラになる
    XYItemRenderer renderer = new StandardXYItemRenderer();
    // Plotを生成してチャートを表示する
    XYPlot xyPlot = new XYPlot(dataset,xAxis,yAxis,renderer);
    JFreeChart jfreeChart = new JFreeChart("チャートの拡大と縮小",(Plot)xyPlot);
    ChartFrame cFrame = new ChartFrame("チャートの拡大と縮小",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);

    // 元の軸の大きさを保存しておく
    Range xRange = xAxis.getRange();
    Range yRange = yAxis.getRange();

    // 目で確認するために少し待つ
    ArUtil.sleep(2000);

    // 縮小する
    {
      xAxis.setRange(0.0D,30.0D);
      yAxis.setRange(0.0D,50.0D);
    }

    // 目で確認するために少し待つ
    ArUtil.sleep(12000);

    // 拡大する
    {
      xAxis.setRange(2.0D,7.0D);
      yAxis.setRange(5.0D,10.0D);
    }

    // 目で確認するために少し待つ
    ArUtil.sleep(2000);

    // 元の大きさに戻す
    {
      xAxis.setRange(xRange);
      yAxis.setRange(yRange);
    }
  }
  private static XYDataset createDataset() {
    XYSeriesCollection dataset = new XYSeriesCollection();
    // 一本目
    XYSeries xySeries = new XYSeries("data-0");
    for (int j=0; j<10; j++) {
    	xySeries.add(j,j+Math.random()*4.0D);
    }
    dataset.addSeries(xySeries);
    // 二本目
    xySeries = new XYSeries("data-1");
    for (int j=0; j<10; j++) {
    	xySeries.add(j,9-j+Math.random()*4.0D);
    }
    dataset.addSeries(xySeries);
    return dataset;
  }
}

```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/1a9ae39b-2f2b-73f5-ecb8-de0bb2576119.png)
JFreeChart-SymbolAxis,StepRender


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import java.io.IOException;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.SymbolAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYStepRenderer;
import org.jfree.data.Range;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.data.xy.XYDataset;

/**
■ JFreeChart-SymbolAxis,StepRender

・Y軸は最小値:0、最大値:5で、0の場合をA、5の場合をFと表示する.
・今回はY軸をシンボルとしたが、X軸でも同様のことができる.

・データ値が離散値なのでStepRendererを使用して描画する

 */
public class Chart18_05 {
  // 目次-ガAxis,目盛、グリッド.
  A_Chart18 a_Chart18;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) throws IOException {
    DefaultXYDataset dataSet = new DefaultXYDataset();
    double[][] data = createData();
    dataSet.addSeries("ステップ",data);
    //
    // SymbolAxisを生成してデータ範囲を割り当てる
    SymbolAxis yAxis = new SymbolAxis("symbol",new String[]{"A","B","C","D","E","F"}); // (1)
    yAxis.setRange(new Range(0,5));
    //
    NumberAxis xAxis = new NumberAxis();
    // 離散値なのでStepRenderを使用する
    XYStepRenderer renderer = new XYStepRenderer();
    // チャートを表示する
    XYPlot xyPlot = new XYPlot((XYDataset)dataSet,(ValueAxis)xAxis,(ValueAxis)yAxis,renderer);
    JFreeChart jfreeChart = new JFreeChart("SymbolAxis",(Plot)xyPlot);
    ChartFrame cFrame = new ChartFrame("SymbolAxis",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
  // 1～4のデータを生成する
  private static double[][] createData() {
    int COUNT = 10;
    int MIN = 1;
    int MAX = 4;
    double[] x = new double[COUNT];
    double[] y = new double[COUNT];
    int value = MIN;
    for (int i=0; i<COUNT; i++) {
      x[i] = (double)i;
      y[i] = (double)value;
      value++;
      if (value > MAX) {
        value = MIN;
      }
    }
    return new double[][]{ x,y };
  }
}

```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/21cf2312-be14-70e6-8a37-72a15aceafdb.png)
JFreeChart-LogAxis-対数軸


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.LogAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
■ JFreeChart-LogAxis-対数軸

 */
public class Chart18_04 {
  // 目次-ガAxis,目盛、グリッド.
  A_Chart18 a_Chart18;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    // 表示データを生成
    XYDataset dataset = createDataset();
    // X軸を生成
    ValueAxis xAxis = new NumberAxis();

    // Y軸はLogAxisを使用する
    LogAxis yAxis = new LogAxis();
    // 対数の底を指定できる⇒指定しなければ10となる
    yAxis.setBase(2.0D);
    // レンダラ
    XYItemRenderer renderer = new StandardXYItemRenderer();
    // Plotを生成してチャートを表示する
    XYPlot xyPlot = new XYPlot(dataset,xAxis,yAxis,renderer);
    JFreeChart jfreeChart = new JFreeChart("対数軸",(Plot)xyPlot);
    ChartFrame cFrame = new ChartFrame("対数軸",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
  private static XYDataset createDataset() {
    XYSeriesCollection dataset = new XYSeriesCollection();
    // 一本目
    XYSeries xySeries = new XYSeries("data-0");
    for (int j=0; j<10; j++) {
    	xySeries.add(j,1000*(j+Math.random()*4.0D));
    }
    dataset.addSeries(xySeries);
    // 二本目
    xySeries = new XYSeries("data-1");
    for (int j=0; j<10; j++) {
    	xySeries.add(j,1000*(9-j+Math.random()*4.0D));
    }
    dataset.addSeries(xySeries);
    return dataset;
  }
}


```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/dd7a3e01-b6a1-0284-7045-507b2ffaf3cc.png)
Pythonでzipファイルから特定の拡張子のファイルを抽出する

#概要
zipファイルから特定の拡張子ファイルのみ抽出したいことが何度かあったので、Pythonで実装しました。

例えば以下のような構成のzipファイルがあるとします。

```test.zip
$ tree
.
├── 01
│   └── 01
│       └── a.txt
├── 02
│   ├── b.txt
│   └── c.txt
└── 03
    └── 01
        ├── 01
        │   └── d.txt
        ├── 02
        │   └── e.txt
        └── 03
            └── 01
                ├── f.txt
                └── g.txt

9 directories, 7 files
```
ここから以下のように１つのディレクトリにテキストファイルを抽出します。

```
$ tree
.
├── a.txt
├── b.txt
├── c.txt
├── d.txt
├── e.txt
├── f.txt
└── g.txt
```

###treeコマンドのインストール
macでは、treeコマンドを以下コマンド実行でインストールできます。

```
$ brew install tree
```

#zipファイルから特定の拡張子のファイルを抽出する
以下のコードを実行すると、テキストファイルが抽出されます。
`extension`に代入する文字列を抽出したい拡張子にすれば、その拡張子のファイルのみ抽出できます。

```python

import os
import zipfile
import shutil
extension = '.txt'
os.mkdir("./extract_txt/")
my_zip = zipfile.ZipFile('test.zip')
my_zip.extractall()
for file in my_zip.namelist():
    if my_zip.getinfo(file).filename.endswith(extension):
        shutil.move(file, "./extract_txt/")
```

抽出したテキストファイルを１つにまとめるときは、以下のコマンドを実行します。

```
$ cat *.txt > all.txt
```

#参考
[zipfile --- ZIP アーカイブの処理 — Python 3.7.4 ドキュメント](https://docs.python.org/ja/3/library/zipfile.html)
[shutil --- 高水準のファイル操作 — Python 3.7.4 ドキュメント](https://docs.python.org/ja/3/library/shutil.html)
Googleアナリティクスにサポートスタッフからパスワード漏洩の危険性

# Googleアナリティクスに登録

[QiitaでGoogleアナリティクスを利用する手順](https://qiita.com/Qiita/items/c7f704e3786df3aa7a11)を見てGoogleアナリティクスに登録してみた。

すると、なんとGoogle子会社のスタッフがパスワードを使用することに同意させられてしまった :scream:

Googleアナリティクス利用規約に次のように書いてある。

![Googleアナリティクス利用規約](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311399/d4165512-c0f8-4f66-6dde-fecf038fca36.png)

>  \3. メンバー アカウント、パスワードおよびセキュリティ
>
> 技術的な問題または料金に関するトラブルが発生した場合にお客様にサポートを提供するなど、サービスの保全または改善を図る目的で、Google（またはその全額出資子会社）の**サポート スタッフが適宜お客様のパスワードを使用**して本サービスにログインすることがあります。

Googleはパスワードを平文で保存し、いざというときGoogle子会社のスタッフが使えるように備えているのだ。

Googleアナリティクスの利用規約に同意すると、Google子会社のスタッフがパスワードを使用することに同意することになる。


# Googleにセキュリティの問題が見つかりました

![セキュリティの問題](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311399/41a6f178-f84a-5c14-8523-a7d49f58c58c.png)

まさかそのようなことはやらないと信頼してはいるものの、悪意のあるGoogle子会社のスタッフがパスワードを漏洩させることに何の歯止めも見当たらない。

とりあえずGoogleとそれ以外で同じパスワードを使用しないことが無難だ。


# 検索結果

これは問題だと思い、同じように問題に思う人はいないかGoogleで検索してみた。

CNET Japanの記事[グーグル、「G Suite」の一部パスワードを暗号化せず14年間も保存していた](https://japan.cnet.com/article/35137309/)に次のように書いてある。

> Googleは米国時間5月21日のブログ記事で、「G Suite」の顧客に対し、一部のパスワードを暗号化せず社内サーバーに保存していたと通知した。これはつまり、これらのパスワードを見つけた人は誰もがそのパスワードを平文で読めたということだ。Google Cloud Trustのエンジニアリング担当バイスプレジデント、Suzanne Frey氏は投稿の中で、このバグは企業ユーザーにのみ影響すると述べた。

バイスプレジデントはパスワードを暗号化せず社内サーバーに保存していることをバグと語ったが、これはバグではない。
Googleの利用規約に平文で保存していることが書いてあるからだ。

Googleアナリティクス利用規約の下にGDPRが書かれているが、GDPRとはEU諸国で強化された個人情報保護のことではなかったか？
当然パスワードも個人情報であり、平文で保存するのをやめるべきじゃあないだろうか :thinking:

> 標準のセキュリティ慣行では、パスワードを暗号化して社内サーバーに保存するため、従業員はこれらのログイン認証情報を閲覧できないし、悪用もできない。

こういうセキュリティ慣行が標準だと思う。
シェルスクリプトでMySQLからデータ取得

シェルスクリプトからMySQLの実行結果を、Slackへの通知やPrometheusのexporter用データの生成などに利用しています。

```shell:mysqlSelect.sh
#!/bin/bash
# シェルスクリプトからMySQL実行
# コマンド例）$ sh mysqlSelect.sh 127.0.0.1 3306 mysql_user mysql_password
# 第１引数：MySQLホスト
# 第２引数：MySQLポート
# 第３引数：MySQLユーザ
# 第４引数：MySQLパスワード

# SQL
sql="select id, name from db_name.table_name;"
echo "sql=$sql"

# SQL結果出力先
nowDateTime=(`date '+%Y%m%d%H%M%S'`)
sqlResult="./logs/mysqlSelect_${nowDateTime}.log"

# SQL実行
$(mysql -h $1 -P $2 -u $3 -p"$4" -N -e "${sql}" > $sqlResult)

# SQL実行結果
cat $sqlResult
sqlCount=`cat $sqlResult | wc -l`
echo "sqlCount=$sqlCount"
```
scikit-buildとcmakeでPythonの拡張モジュールをビルドして配布する

[scikit-build](https://github.com/scikit-build/scikit-build)というPythonの拡張モジュールをビルドするための補助ツールがあります。

> Improved build system generator for CPython C, C++, Cython and Fortran extensions 
> http://scikit-build.org

これを使ってcmakeでビルドされたプロジェクトをPythonの拡張モジュールとして配布する方法についてまとめます。まとめたものは以下にあります：

https://gitlab.com/termoshtt/skbuild-example

全体のディレクトリ構成は以下の通りです：

```
├── CMakeLists.txt
├── hello
│   ├── CMakeLists.txt
│   ├── _hello.cpp      # これを拡張モジュールにコンパイル
│   ├── __init__.py
│   └── __main__.py     # python -m hello で呼ばれたときに実行されるファイル
├── LICENSE
├── pyproject.toml
├── README.md
└── setup.py    
```

setup.py
--------
まずは通常のPythonのパッケージと同様にビルド用のスクリプトして`setup.py`を用意しますが、`setuptools`ではなく、`skbuild`の`setup`を使います：

```py:setup.py
from skbuild import setup

setup(
    name="hello",
    version="1.2.3",
    description="a minimal example package",
    author="Toshiki Teramura <toshiki.teramura@gmail.com>",
    license="MIT",
    packages=["hello"],
)
```

pyproject.toml
--------------
依存関係は `requirements.txt` ではなく公式のドキュメントに従って `pyproject.toml` に記述します

```toml:pyproject.toml
[build-system]
requires = ["setuptools", "wheel", "scikit-build", "cmake", "ninja"]
```

最近は[pyproject.toml](https://www.python.org/dev/peps/pep-0518)の制定によって`setup.py`を書かなくても`pip install`できるようになってきているらしいですが、今回はまだ`setup.py`の拡張として提供されている機能を使用します。また[Poetry](https://github.com/sdispater/poetry)にはscikit-buildがどうも対応してなさそう（？）なので今回は使いません。

CMakeLists.txt
--------------
元のコード(scikit-build/tests/samples/hello-cpp)がCMakeLists.txtを分割していたので分けていますが、特に意味はありません。順番に見ていきましょう。

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.5.0)
project(hello)
find_package(PythonExtensions REQUIRED)
add_subdirectory(hello)
```

```cmake:hello/CMakeLists.txt
add_library(_hello MODULE _hello.cpp)
python_extension_module(_hello)
install(TARGETS _hello LIBRARY DESTINATION hello)
```

ポイントとしては `PythonExtensions` を探してきている部分と、`python_extension_module(_hello)`ですね。中身は調べられていないのですが、Pythonの拡張モジュールとして公開する際には必要のようです。

Build
------
setup関数が`setuptools`から`skbuild`に切り替わっていますが、基本的な使い方は同じで、

```
python setup.py bdist_wheel
```

とすればwheelを作成してくれます。wheelは[PEP 427](https://www.python.org/dev/peps/pep-0427)で定義された配布形式で拡張子は `*.whl` となります。whlファイルは実体としてはZIPアーカイブで、コンパイルされた共有ライブラリや他の静的なファイルを含めることができます。
上のコマンドで、`dist/hello-1.2.3-cp37-cp37m-linux_x86_64.whl`のようなファイルが出来上がっているはずです。これはそのままインストールが可能です

```
pip install dist/hello-1.2.3-cp37-cp37m-linux_x86_64.whl --user
```

（`--user`はお好みで）これでGlobalにインストールされたので **別のディレクトリに行って**

```console
$ python -m hello
Hello, World! :)  
```

となると成功です。別のディレクトリに行かないと現在のディレクトリ以下にある `hello` モジュールを読み込みますが、ここにはcmakeで生成された拡張モジュールがありません…(´・ω・｀)

Links
------
- [scikit-build document](https://scikit-build.readthedocs.io/en/latest/)
  - 正直これを読んでも分からん...(´・ω・｀)
- tests/samples https://github.com/scikit-build/scikit-build/tree/master/tests/samples
    - 上のリポジトリはここのhello-cppを拝借した

最後に
-----
Pythonユーザーはpip installできないツールは使わないとの噂ですが、scikit-buildのおかげでC++の拡張も簡単にpipで配布できる形にまとめられるのでこれで使ってもらえますね
Qiita初投稿とプログラム

---
title:Qiita初投稿とタイマープログラム
---
author:The_ren
##初投稿です
　本日初投稿いたしましたThe_renと申します。大学で本格的にpythonを学ぶようになってからアウトプットの場が足りていないと感じ、Qiitaを利用することにしました。
　ここでは自作したプログラムの質問の場として投稿をしていく予定なので、質問に答えられるQiitaの先輩方々はどんどん私にご指摘頂ければなと思います。また、Javaも今夏からやる予定なので、就職に繋げていきたいです。

##タイマーコード
学校の課題でプログラムをpythonで自作する課題が出たので、5分まで対応のカップ麺用のキッチンタイマーを作りたいと思います。以下は試作したコードです。

    from time import sleep
    import time
    import pygame.mixer

    minute_to_second=60

    def alert():
        print("時間です")
        Sound()
        exit()

    def Sound():
        pygame.mixer.init()
        pygame.mixer.music.load("Onmtp-Ding04-2.mp3")
        pygame.mixer.music.play(-1)
        input()
        pygame.mixer.music.stop()

    while True:
        print("タイマーを設定する時間を指定してください")
        minute=int(input("何分に設定するか選択してください。:"))
        second=int(input("何秒に設定するか選択してください:"))
        if minute==0 and second==0:
            print("設定を終了しました。")
            break

        try:
            if 0<=minute<=5:
                wait_time=(minute*minute_to_second)+second
            else:
                if 0>minute or 5<minute:
                    print("入力できる数字は0から5までです。")
                    continue
        except ValueError:
            print("数字以外は入力しないでください。")

        else:
            try:
                if 0<=second<=59:
                    print(str(minute)+"分"+str(second)+"秒にタイマーをセットしました。")
                    sleep(wait_time)
                else:
                     if 0>second or 59<second:
                        print("入力できる数字は0から59までです。")
                        continue
            except ValueError:
                print("数字以外は入力しないでください。")

        alert()

最終目標としては、時間になったらmp3から音楽を鳴らして知らせるだけでなく、tkinterで制限時間の表示も行いたいと考えています。
#質問内容
##その1
try文を使用することでエラー処理を行いたいと思っています。コードを見ていただければ分かると思いますが、なぜかエラー処理後のprint処理を実行してくれません。例えば、inputで読み取った値が「d」や何も押さずにENTERを押した場合の処理がループされずにpythonの既存のエラー処理で返されます。どのようにコードを変えれば良いでしょうか？
##その2
本来は5分までのタイマーにしたかったのですが、秒針の上限を59までに設定しているため、最大で5分59秒まで設定できてしまう状況になっています。どのようにコードを変えれば良いでしょうか？
##その3
この処理をtkinterのデジタル時計でカウントダウン形式で表示させたいのですがコンパクトなコードの書き方を是非ご教授してほしいです。
SQLアンチパターン-13章  恐怖のunknown-まとめ


## NULL値にもっと注意深くなろう
今回は値がないということに対する正しい挙動を学ぶことがゴールです。
プログラミング言語によって「値がない」ということをどう扱うかは様々です。

SQLではどのように扱われるでしょうか。
それは`NULL`です。

- SQLは`NULL`と(`false`、`0`、`空の文字列`）を区別します。
- `NULL`との四則演算の結果は必ず`NULL`になります。決して`0`の扱いではありません。
    - `coalesce`関数で`0`に変換はできる
- `NULL`との文字結合もまた`NULL`です。（DBの種類によっては違うそうです）


### NULLを含む検索

```sql

SELECT * FROM Books WHERE category = 'comedy';
```

この検索を行ったとき、`category`が`NULL`の行は当然取得されません。

```sql

SELECT * FROM Books WHERE NOT (category = 'comedy');
```
この検索を行ったときもまた、`category`が`NULL`の行は取得されません。
`ある値ではない`ということは等価演算になりますが
つまり、 `NULL != 'comedy'`が`TRUE`、もしくは
`NULL == 'comedy'`が`FALSE`を返せば良いのですが
`NULL`との等価演算は決して`TRUE`にはなりません。
どこまでいっても`NULL`です。

MySQLには、`NULL`に対応した演算子があります。
`<=>`です。

```sql
SELECT * FROM Books WHERE category <=> NULL;
```


#### プリペアドステートメントにNULLを渡せるか
プリペアドステートメントで予約語である`NULL`を値として渡すには
`bindValue()`を使うしかありません。第3引数に型を指定できるので
そこで`PDO::PARAM_NULL'を指定してあげます。
`excute`でそのまま渡すのでは対応ができないということです。


#### NULLから逃げるのも違う
そんな`NULL`は`TRUE`or`FALSE`で扱えるわけでもないので
また別の値を使った独自のルールを使うことで対応しようとすることもあるでしょう。
例えば数字でステータスを表す時に
`1以上は有効`、`-1は存在しない`というルールを決めたとします。
得点計算をするカラムがそのように扱われていたとしたらどうなるでしょう。
もし仮に、平均や偏差値などを算出する際に
単純に`-1`を計算に含めてしまうと、求めていない計算結果が出力されてしまいます。

ここでは、本来得点を意味するデータが入るところに
別論理の`存在しているかどうか`を定義する`-1`が混ざってしまっています。
これではまともなテーブル設計とは言えません。
アプリケーションレベルでも注意する必要のある厄介な仕様となってしまいます。

### NULLを理解しよう
`NULL`は真偽のロジックである`2値論理`とは別の、`3値論理`として理解する必要があります。
`4値論理`とかもあるそうで。
[参考](https://codezine.jp/article/detail/532)

#### NULLと演算子
`NULL`を使った計算がどうなるか、まとめてみましょう。

下記の計算結果は全て`NULL`です。

```sql
NULL = 0
NULL = 123
NULL <> 123
NULL + 123 (四則演算全て)
NULL = NULL
NULL <> NULL
```

特に
`NULL = NULL`はこういう論理です。
`不明な値と不明な値を比較しても、等しいかどうかはわからない`
`NULL <> NULL`は
`不明な値と不明な値を比較しても、等しくないかどうかはわからない`
ということになります。

#### NULLと論理式
`NULL AND TRUE`は、`NULL`となります。
`NULL AND FALSE`では、`AND FALSE`で`FALSE`が確定しているので`FALSE`になります。
`NULL OR FALSE`は`NULL`となります。
`NULL OR TRUE`は`OR TRUE`で`TRUE`が確定しているので`TRUE`になります。
`NOT (NULL)`は、`NULL`になります。
`AND FLASE`と`OR TRUE`がキーですね。
これはそのまま覚えるのが良さそう。

#### NULLで検索したい時
MySQLには`NULL`で検索するための構文が用意されています。
それが`IS NULL`です。

```sql
SELECT * FROM Books WHERE category IS NULL;
```

こう使います。

`IS NOT NULL`も存在します。



### 呟き
思ったけど、`NULL`って`虚数`みたいな感覚で扱うとわかりやすいんじゃ？？


###メモ
`a<=>b`は`aとbは等しい(NULLにも対応)` => `spaceship`というらしい
`a<>b`は`aとbは等しくない`
知らなかった。
Processingで丸い画像を表示する

# はじめに
こんにちは．ohayotaです．
この記事では，Processingで丸い画像を表示する方法を紹介します．
（画像自体を丸く加工する方法ではなく，画像を**丸く見せる**方法を扱います．）
内部を円形に切り抜いた正方形を，画像の上に描画して実現しようと思います．

# 準備
以下で扱うプログラム用に，600px * 600pxのダミー画像を用意します．
同じディレクトリ内に「data」というディレクトリを作成し，その中に`dummy600.png`という名前で保存します．
![dummy600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368192/fc1c6356-4b20-9dbd-9400-31c4078ab3ee.png)

# プログラム
以下が正方形の画像を丸く表示するプログラムです．
`setup()`内などに記述して実行します．

```java:CroppedImage.pde
PImage img = loadImage("dummy600.png");
color backColor = color(240);

size(600, 600);
image(img, 0, 0, width, height);

pushMatrix();
translate(width/2, height/2);
fill(backColor);
noStroke();
beginShape();
// 図形の外枠
vertex(-width/2, -height/2);
vertex(width/2, -height/2);
vertex(width/2, height/2);
vertex(-width/2, height/2);
// 切り抜く図形の描画
beginContour();
for (int i = 360; 0 < i; i--) {
  vertex(width/2 * cos(radians(i)), height/2 * sin(radians(i)));
}
endContour();
endShape(CLOSE);
popMatrix();
```
# 実行後
画像がしっかり丸く表示されましたね．
![CroppedDummy.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368192/582102d5-6306-d13a-cc9b-8a8a62241246.jpeg)

# 解説

```java
PImage img = loadImage("dummy600.png");
color backColor = color(240);
```

`loadImage`を使って，指定した画像名をdataディレクトリから読み込みます．
`backColor`は背景色に合わせます．

```java
size(600, 600);
image(img, 0, 0, width, height);
```

今回扱う画像が 600px * 600px のため，`size(600, 600)`でウィンドウサイズも同じにします．
`image(img, 0, 0, width, height)`で左上(0, 0)，縦横ともに600pxの画像を表示します．

```java
pushMatrix();
...
popMatrix();
```

`pushMatrix()`で，この文より前の時点の座標系を一時的に保存します．
描画を終えたら`popMatrix()`で座標系を`pushMatrix()`より前のものに戻します．


```java
translate(width/2, height/2);
fill(backColor);
noStroke();
```

図形の内部を円形に切り抜く準備として，`translate(width/2, height/2)`で基準点をウィンドウの中心にします．

```java
// 図形の外枠
vertex(-width/2, -height/2);
vertex(width/2, -height/2);
vertex(width/2, height/2);
vertex(-width/2, height/2);
```

4つの`vertex`を使い，画像の上に描画する正方形を作ります．

```java
// 切り抜く図形の描画
beginContour();
...
endContour();
```
`beginContour()`と`endContour()`で囲んだ部分で，`vertex`を使って切り抜く図形を作ります．

```java
for (int i = 360; 0 < i; i--) {
  vertex(width/2 * cos(radians(i)), height/2 * sin(radians(i)));
}
```
1度ごとに`vertex`を実行して，切り抜く円形を作ります．

```java
endShape(CLOSE);
```
`vertex`の始点と終点を結びます．

# 他の方法（書き残し）
必要のないpixelを書き換えると，図形を被せなくてもよくなるかもしれない．
`loadPixel`と`updatePixel`あたりが使えるかも．

# 参考ページ
[Language Reference (API) \ Processing 3+](https://processing.org/reference/)
[Processingのvertexについて解説！](http://blog.livedoor.jp/reona396/archives/55712534.html)
[Processingで描ける図形まとめ](https://qiita.com/reona396/items/5fa4babc8243c4ed4914)
知らないと色々まずいと思った技術一覧(組込み業界 下流工程編)


###はじめに
組込み業界で働き始めて、
評価：1年、開発プロセス関係の雑務：1年、開発：1年　
こんな経験をしてきています。

そしてこの記事では、
今までの業務で**「これは知っとかないとまずそう！」**
とか思ったものを更新していく予定です。

####〇汎用性高め(評価～ソフト実装～ソフト設計共通)
######・エディタ（サクラエディタ、秀丸 使用経験のみ）
	正規表現(何ができるか知っておくこと。チートシートなどすぐに見れるように)
	画面分割
	アウトライン
	grep単語検索
	タグジャンプ
	矩形選択
	ファイルツリー
######・エクセル
	マクロの記録
	VBA(何ができるか知っておくこと。目的に応じてその辺のコードから流用できるように)
	VLOOKUP関数
	エクセル同士の比較(エクセルのINQUIRE機能とWinmergeのプラグイン)
######・バージョン管理システム(SVN 使用経験のみ)
	リポジトリブラウザ
	更新、コミット
	ログを表示
######・HTML
	基本タグが理解できていること、少しの改変が発生したときに該当箇所がわかるレベル。
	単体テスト結果など、HTMLで吐き出すことができるツールを見かける(WinAMSなど)
	その際に、HTML→テキスト→エクセルに成形などの作業経験あり。
######・英語
	エラーメッセージの意図がわかる
	仕様書の目次くらいは読める
	仕様書内にある表の縦軸、横軸の要素がわかる
	翻訳機能で適切な訳を選択し、英語→日本語への変換ができる
######・ワード
	校閲→変更履歴
	参考資料→目次
	レイアウト→区切り
	レイアウト→段組み
	挿入→オブジェクト挿入
######・Linuxコマンド
	ls
	cd
	目的に応じてチートシートなどすぐに見れるように
######・コマンドプロンプト
	ipconfig
	ping
	tree 
	目的に応じてチートシートなどすぐに見れるように
######・batファイル
	コンパイル後の生成物リネームや削除など、
	ちょっとしたときに調べて作れるように	
######・付箋
	何回か出てくる単語をメモしておいて、コピペ用につかう。
######・バイナリ表示/編集(stiring)

######・DIFFツール(Winmerge)
####〇専門性高め(主に評価フェーズ)
######・オシロスコープ
	色々いじって所望の信号のHi、Low変化を画面に収めたい。
	タイミングも大事。
	回路図を読んでどこのピンに接続したらいいかわかる。
####〇専門性高め(主にソフト実装フェーズ)
######・IDE(VisualStudio、Eclipse、CS+ 使用経験のみ)
	ビルド方法
	デバッグ機能
	定義にジャンプ
	呼び出し箇所にジャンプ
######・C言語
	必須だが、難しい文法などはあまり使われてないイメージ。
	リーダブルコードやMISRA対応などを意識する必要もあるだろうが、
	まずはbit演算、構造体、ポインタ(ポインタのポインタを使用してるとことかはほぼ見たことない。)
	staticとグローバル、const、volatileあたりをマスターしておけば読解は何とかなってきた気がする。
######・C++言語
	オブジェクト指向、クラス、継承あたりは知っておかないとなーと思った感じ。
	体感的には3つ現場行ったとしたら、1つは何かしらで使ってるんじゃないだろうかレベル。
######・アセンブラ
	アセンブラでコーディングする作業はCと比べると少なめかな。
	デバッグ時にCからアセンブラに切り替えて追って行ったり、
	ブート処理をアセンブラで記述されていることは見かけるので、
	C習得後にやっておいた方が良さそうなイメージ。
####〇専門性高め(主にソフト設計フェーズ)
######・DFD
	データフロー図。
	各処理でINPUT/OUTPUTが何か、それがほかの処理とどう繋がっていくか。
	対象機能のコードからこのDFDに落とせれば大体理解できてる感じ。

######・シーケンス図
	あみだくじみたいなやつ。
	登場人物を洗い出し、そいつらの処理の流れを図解したもの。
	AがBに告る、BがCに相談する、C考える、CがAにNGを伝える、みたいなあれ。
	客先に説明資料として作成した経験あり。
######・タイミングチャート
	ラクダのこぶみたいなやつ。縦軸：信号、横軸：時間が主流なのかな。
	客先に説明資料として作成した経験あり。
######・フローチャート
	ひし形や楕円や四角の図形、矢印など駆使して処理の流れをかくやつ。
	CasePlayerというツールでコードから自動生成したり、
	visioやエクセルで作成の経験あり。

###おわりに
思いつくまま書きなぐったので、粒度や分類は超絶適当です。。
またそのうち更新するぞー
AWS Certified Machine Learning – Specialtyを受けてきた

AWS Certified Machine Learning – Specialtyを受けてきました。
取得を考えている方の参考になれば幸いです。

# 試験概要
https://aws.amazon.com/jp/certification/certified-machine-learning-specialty/

- 時間：170分
- 問題数：65問[^1]

[^1]: 試験ガイドに記載が無いので、問題数は変わるかもしれません

# 事前準備

1. courseraでStanfordが提供している機械学習のオンライントレーニングを受講する
    - https://www.coursera.org/learn/machine-learning/home/info
2. 模擬試験を受ける
3. 本を読む
    - [機械学習のための特徴量エンジニアリング](https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E7%89%B9%E5%BE%B4%E9%87%8F%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0-%E2%80%95%E3%81%9D%E3%81%AE%E5%8E%9F%E7%90%86%E3%81%A8Python%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5-%E3%82%AA%E3%83%A9%E3%82%A4%E3%83%AA%E3%83%BC%E3%83%BB%E3%82%B8%E3%83%A3%E3%83%91%E3%83%B3-Alice-Zheng/dp/4873118689)
    - [機械学習のための「前処理」入門](https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%80%8C%E5%89%8D%E5%87%A6%E7%90%86%E3%80%8D%E5%85%A5%E9%96%80-%E8%B6%B3%E7%AB%8B-%E6%82%A0/dp/4865941967)
3. サンプル問題を解く
    - [サンプル問題](https://d1.awsstatic.com/training-and-certification/docs-ml/AWS%20Certified%20Machine%20Learning%20-%20Specialty_Sample%20Questions.pdf)
4. AWSの無料オンライントレーニングを受講する
    - [The Elements of Data Science 他](https://aws.amazon.com/jp/training/learning-paths/machine-learning/exam-preparation/)

特に、1.courseraのオンライントレーニングはオススメです。

# 結果
幸い合格でした。
(スコアはAWSの認定のサイトからダウンロードします。)

受験者スコア: 871
>The AWS Certified Machine Learning - Specialty (MLS-C01) の試験結果は、100 から 1000 の間
の値で示されます。合格に必要な最低スコアは 750 です。

# 受験者のスペック
参考になるかわかりませんが。。。

- クラウド歴：5年
- クラウド関連の保有資格
    - AWS: アソシエイト×３＋プロフェッショナル×２＋Big Data＋Security＋Network
    - GCP: クラウドアーキテクト＋データエンジニア
- 外観：メガネぼーず

# 難易度について
AWSの知識よりも機械学習の知識が問われる問題が多かったです。
また、他のAWSの試験に比べ、要求されるAWSの知識はかなり浅めに感じました。
そのため難易度は、こんな感じではないかと思います。

機械学習を仕事で利用されている方　→ 簡単
AWSのエンジニアだが機械学習は初学者(=自分)　→ 難しい




# 感想
時間はかなり余りました。落ち着いてゆっくり解いても、十分試験時間内に収まると思います。
Qiitaの記事リンクを一発で生成する方法(Create Link)

# Create Linkのダウンロード
`chrome`の拡張機能に導入します
**・[Create Link - Chrome ウェブストア](https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm)**
インストール後はブラウザの右上に出るので(自動で設定タブが出なかった場合は)
`configure`で設定画面が出ます

# 設定
1.`Formats`でリンクやテキストの追加(`+`)や削除(`-`)ができます
(デフォで使えるのは`Plain text`~`mediaWiki`の4つ)
2.`Variables`, `Filter`を見ながら**オリジナルの設定**を行いましょう(翻訳で頑張ろう、、、)
![Qiitaの記事リンクを一発で生成する方法1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/034fcef8-a984-cbc7-1133-69b20033f306.png)
![Qiitaの記事リンクを一発で生成する方法2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/38f1dacc-f9e4-c70c-45e3-d8be6384f683.png)

#### 個人的Qiita参考記事用の設定
太字と・が欲しかったので`Format`に
`**・[%title%](%url%)**`
を設定

# 使い方
`**・[%title%](%url%)**`の場合は
・リンクにしたい記事の空白部分で右クリック→`Create Link`→`qiita Link`でクリップボードに・テキストにコピー
![Qiitaの記事リンクを一発で生成する方法3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/89c58539-312e-372c-4440-d2e68c013026.png)

・ペースト（↓こんな感じ）
**・[URLとページタイトルとかを1発コピーできるChrome拡張機能「Create Link」 | TeraDas](https://www.teradas.net/archives/2492/)**

他にもいろんなテキストやリンク、ショートカットの設定などもできるっぽいのでやってみてください

# 参考記事
**・[URLとページタイトルとかを1発コピーできるChrome拡張機能「Create Link」 | TeraDas](https://www.teradas.net/archives/2492/)**
EmmetをJSX内で利用する方法(VSCode)

## 概要

VSCodeは初期設定の状態でもEmmetが使えるようになっていますが、JSX内では下記のように使用できない。

初期設定でdivタグ入力時
![スクリーンショット 2019-07-16 0.02.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379873/ae63f45b-dc72-f8a8-4912-42bbd2738b35.png)

設定を変更して、emmetを機能するようにしていきます。

## 設定

1.設定を開く

VSCode内で
Mac: Command + ,
Windows: Ctrl + ,

2.設定変更

下記の手順で設定変更

①拡張機能
②Emmet
③setting.jsonで編集

![UNADJUSTEDNONRAW_thumb_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379873/523fbb1b-710b-52b3-4543-bb093c6996ab.jpeg)

setting.jsonに設定を追加

```js:setting.json
{
  "emmet.includeLanguages": {
     "javascript": "javascriptreact"
  }
}
```

これでdivを入力後tabを押すと以下のようになります。
![n52og-b8vsz.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379873/52db6db3-2841-7670-7240-c145b1ec4c81.gif)


以上です。
論文まとめ：Learning to Refine Human Pose Estimation

# はじめに 
CVPR2018 workshop 「Visual Understanding of Humans in Crowd Scene and Look Into Person Challenge」から以下の論文
[1] M. Fieraru, et. al. "Learning to Refine Human Pose Estimation"
のまとめ

arXiv:
https://arxiv.org/abs/1804.07909

アーキテクチャのみを簡潔にまとめる

# 概要
1. pose estimation を refine するためのしくみで、様々なモデルの後処理に使える
2. 別モデルで推定した pose を本モデルに入力し、refine した関節位置を出力する

# アーキテクチャの全体像 
以下の図が全体像 

<img width="810" alt="pose_refine_img00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/71ead917-08bb-0bf1-571f-29aea667fda7.png">

（１）左から元画像、及び別モデルで推定した関節位置をheatmapに変換したものを concatenate して本モデルに入力する

（２）出力は、関節位置のheatmapと、その位置に対するoffset vector。

# 感想 
他の pose estimation モデルの後にくっつけるだけでよいので、てっとり早く精度を上げるのに適してそう

以上。
MacBook Proがぶっ壊れたので、iPadでgot clone→編集→Pushをした話（iPhoneでも可）

大切な大切なMacbook proがぶっ壊れました、、、、、、、、、、

![9190EFD0-1A97-4759-B16E-4C60721CC0CE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265549/cb9e8446-eeab-2d9e-f7f3-daede2cf59e1.jpeg)

自覚はないのですが、ー何かの拍子に中の液晶が割れてこんな状態に

皆さん、液晶保護シートやケースなどでの保護。また、故障の場合に備えて常日頃のバックアップは忘れずにしましょう。(今回の画面の故障ではデータは消えませんでした)

Macbook proはApple Storeへ行き、修理に出してきました。画面だけですと、Apple careへ入っていない場合でもおよそ52000円＋消費税で修理をしてくれます。

この値段は他の非正規の修理業者とほぼ同じか安い値段だったので、画面の故障の場合はAppleの正規の修理センターで直してもらうことをお勧めします。

そんなこんなで現在Macbook proを修理に出してしまっているので、プログラミングができない。。
しかし、どうしてもgithubにあげたコードを編集したい。。

そう思っていたところ、色々ググってみるとiPad Proでgithubからcloneして編集→Pushまでができるということを知り、試してみることにしました。

# 今回使用したアプリ
<img width="489" alt="Screen Shot 2019-07-16 at 12.39.48 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265549/68b63b35-4927-3e08-d924-53b88d8786c0.png">

https://apps.apple.com/jp/app/working-copy/id896694807

# というわけでcloneから編集、Pushまでをやってみる

1.まずはgithubアカウントとの連携を済ましてください。
2.Reoisitories右上の＋ボタンをクリックして、「Clone repository」を選択します。
3.Githubのアカウントに紐づくrepositoryが一覧表示されます。

（ここからは画像付きで説明します。）

![IMG_0403 2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265549/a6301fd8-4bd8-1685-e300-aae4b08974b9.png)
3.cloneするレポジトリを選択して右上「clone」を押してください。

![IMG_0404.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265549/223de20c-298d-a1ac-9d70-d739073e568e.jpeg)
4.cloneしたファイルを自由に編集します。（自分の場合は.gitignoreを追加しました。）


![IMG_0405.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265549/d539569e-1ddd-8d87-46c2-a3e4ef3007c0.jpeg)
5.編集した後ファイル階層の上にある「Repository Status and Configuration」クリックします。
6.編集したファイルをcommitしたい場合は「commit changes」をクリック

![IMG_0407.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265549/172baccd-f429-6f1a-a9ff-19787eef84a1.jpeg)
7.コメントを記載して、右上「Commit」をクリックします。（同時にPushも行いたい場合は隣のPushを有効にしてください。）
8.remote上masterにPushしたい場合は、10日間のFree Trialへ申し込むとPushが可能です。（用が終わったら購読をキャンセルするのを忘れずに！）

以上になります。

# iPhoneでも全く同じことができます。
ちなみにこのアプリはiPhone用もあるので、上記の操作がiPhone上でも可能です。
通勤電車などでも軽微な習性であればできてしまいますね。
Notesのduration tickを計算する

MIDI.jlのNotesのdurationを計算する。
ほぼstructの要素を操作して最大を取る時のスニペット。

```julia

function duration_tick(notes::Notes)
    # notesはgetnotes時にpositionでソートされている.
    starttick = notes[1].position
    endtick = maximum(map(note->note.position + note.duration, notes))
    return endtick - starttick
end

notes = MIDI.getnotes(track, TPQ)
duration = duration_tick(notes)
```
自力でリバーシ(オセロ)を作っていく#00

# この記事なんなの？
まず最初に、これからの投稿の目的を書いておきます。
発信用というよりも、自分のアウトプット用です。
そして、あわよくば他の人に投稿を見てもらって、ダメなところをボコボコに叩かれたいという願望があります。(お願いします！！

基本的に自分のリバーシ作りの中で考えていることや、詰まったところを書いていくことになると思います。
どうぞよろしくお願いいたします。

#自力とは？
タイトルにある「自力で」という文言ですが、これが意味するのは
「リバーシの作り方を検索せずに、0から自分だけで進め方や、実装方法を考えていく」
ということです。
つまり検索するのは「javascript クラスから　要素取得」みたいな具体的なことだけで、「javascript リバーシ　作り方」といったことは検索しません。
ボードゲーム盤の作り方みたいな大きい塊の検索は基本無しでトライするつもりです。

#僕のレベル感
コーディングのお仕事ではだいたいjQueryを使用していて、最近は意識的にJavascriptで書くようにしているのですが、よく使う処理をなんども使っていてあまり熟達していない感じです。
なので、今回が過去最高のJavascript使用作品となりますね。
ただ、今回のリバーシ作成の目的はJavascriptの学習というよりも、処理を自分で考えるという気持ち良さ欲しさのためです笑
頭を使いたい！ただそれだけで始めました笑

# リバーシ作りの始まり

## リバーシ作りに必要な処理
まず、リバーシになるために必要な処理を「〜できる」という形式で列挙していきます。

- 8*8のマスを描画できる
- クリックで石を置くことができる
- 間なく別の色の石にはさまれたら色変更できる（タテ・ヨコ・ナナメ）
- 何もはさめない場所に石を置くのをブロックできる
- 全てのマスが埋まるか、どちらも石を置けなくなったら終了にできる
- 1つ石を置いたら相手のターンに変更できる
- 石を置く場所がなければスキップできる

とりあえず思いつくのはこれくらいですかね。
まずはこれらを実装していこうと思います。

##実装順序
先ほど挙げた処理をどれからやっていくか決めます。

1. 8*8のマスを描画
2. クリックで石を置ける
3. タテ・ヨコではさまれたら色変更
4. ナナメではさまれたら色変更
5. 一つ石を置いたら相手のターンに変更できる
6. 何もはさめない場所に石を置けなくする
7. 石を置く場所がなければスキップ
8. 全てのマスが埋まるか、どちらも石を置けなくなったら終了にできる
9. CPU作成

こんな感じで順番にやっていこうと思います。

実際の実装は次の記事で書き始めようと思います。
[自力でリバーシ(オセロ)を作っていく#01](https://qiita.com/taniguchi06/items/6d25a4055a5fa0ea1f8d)
オリジナルアプリ　構想、手順

#作成の順番

##全体に共通するUIを整える
##ユーザープロフィールのページ
##ユーザー情報編集ペーシ
##ユーザーモデル
##ポストモデル
###ユーザーとポストのアソシエーション
##一覧画面
##ログイン　ログアウト　

##ポストコントローラー
##削除
##ハッシュタグ
##フォローとフォロー解除
##お気に入り機能
a タグを Markdown 記法に変換する Python スクリプトを作った

# a タグを Markdown 記法に変換する Python スクリプトを作った

HTML の a タグを手で Markdown 記法にいちいち変換していたら負けている気がしてきたので作った.

```python
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import fileinput
import re
import sys

pattern = re.compile('<a href="([^"]+)">([^<]+)</a>')

for line in fileinput.input():
    sys.stdout.write(pattern.sub(r'[\2](\1)', line))
```