OmniAICreator/Qiita-1.07M huggingface dataset:
[Google FireBase] FirebaseでWebサイトを無料で公開する手順


# Step1. firebase にログインしProjectを作る

https://console.firebase.google.com/

注： Google Accountがなければ作ってください。

# Step2. ターミナル（コマンド）から Firebaseにアクセスできるようにfirebase-toolsをセットアップ

```
npm install -g firebase-tools
```

注： `npm` は事前にインストールしておいてください。

# Step3. ターミナルから firebase-tools のコマンドで Firebaseにログインする。

```
firebase login
```

をするとブラウザでOAuth認証画面が開きますので、
ボタンを押せばログイン完了です。

# Step4. プロジェクトの初期化とデプロイ

## (1). 初期化
ローカルのプロジェクトディレクトリに入り、
下記のコマンドでそのプロジェクトを初期化します。

```
firebase init
```

## (2). Project種類選択

Projectの種類の選択が聞かれます。
今回は **Hosting**　を選択します。

```
? Which Firebase CLI features do you want to setup for this folder? Press Space to select features, 
then Enter to confirm your choices. (Press <space> to select)
❯◯ Database: Deploy Firebase Realtime Database Rules
 ◯ Firestore: Deploy rules and create indexes for Firestore
 ◯ Functions: Configure and deploy Cloud Functions
 ◯ Hosting: Configure and deploy Firebase Hosting sites
 ◯ Storage: Deploy Cloud Storage security rules
```

## (3). Deploy先を選択

さっき作ったプロジェクトを選択します。　

```
 Select a default Firebase project for this directory:
 ❯ test(project-00000) 
  [create a new project] 
```

## (4). Deploy設定を行なう

```
#説明： Deployされるフォルダを設定（Defaultでは **public** です。異なる場合はフォルダ名を入力）
? What do you want to use as your public directory? dist
#説明： Webサイトの入り口ファイル( **index.html** )を自動生成するか既存のファイルを利用するかを選択します。
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
? File dist/index.html already exists. Overwrite? No
i  Skipping write of dist/index.html

i  Writing configuration info to firebase.json...
i  Writing project information to .firebaserc...

✔  Firebase initialization complete!
```

## (5). Deployする

```
$ firebase deploy
```

Deploy終了後 **Hosting URL** が表示されますので、
それにアクセスして確認してください。

```
=== Deploying to 'test-0000'...

i  deploying hosting
i  hosting: preparing dist directory for upload...
✔  hosting: 45 files uploaded successfully

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/test-0000/overview
Hosting URL: https://test-0000.firebaseapp.com
```
macの魔法の数字を実験してみた！[Wifi速度テスト]

#魔法の数字
いいですねぇ・・魔法の数字
それだけでwifiが速くなればいいんですけどねぇ
という淡い期待を胸に実験！
~~*(ただし、wifiの速度には困ってない模様)*~~
#実験環境
**PC**:macbookpro2016タッチバー＆タッチID搭載モデル
**macOSバージョン**:sierra
**使用ブラウザ**:GoogleChrome　65.0.3325.181（Official Build） （64 ビット）
**Wifi速度測定方法**:[Googleのスピードテスト](https://www.google.co.jp/search?rlz=1C5CHFA_enJP745JP745&ei=8F7AWvu7BISp0AS_oIOQDw&q=%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%86%E3%82%B9%E3%83%88&oq=%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%86%E3%82%B9%E3%83%88&gs_l=psy-ab.3..35i39k1j0i4k1l7.208781.211735.0.211952.16.15.1.0.0.0.147.1254.12j2.15.0....0...1.1j4.64.psy-ab..1.15.1293.6..0i67k1j0i131i4k1j0i30k1.108.tIwx0ZQuHig)

#準備
とっても簡単ですコードとか打たないから安心してください

システム環境設定　
↓
ネットワーク　
↓
（左のタブでwifiを選択）右下にある「詳細」を選択
↓
上のタブの一番左にある「ハードウェア」を選択
↓
構成を「自動」から「手動」に変更
↓
MTUを「標準」から「カスタム」に変更
↓
数字を「1453」に変更
↓
**右下の「OK」を選択
↓
右下の「適用」を選択**

これでOK

#実験開始！
速度計測には[Googleのスピードテスト](https://www.google.co.jp/search?rlz=1C5CHFA_enJP745JP745&ei=8F7AWvu7BISp0AS_oIOQDw&q=%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%86%E3%82%B9%E3%83%88&oq=%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%86%E3%82%B9%E3%83%88&gs_l=psy-ab.3..35i39k1j0i4k1l7.208781.211735.0.211952.16.15.1.0.0.0.147.1254.12j2.15.0....0...1.1j4.64.psy-ab..1.15.1293.6..0i67k1j0i131i4k1j0i30k1.108.tIwx0ZQuHig)を使いました

##自動（ノーマル）の場合
まずは自動（ノーマル）の時のですね
<img width="393" alt="ノーマル.png" src="https://qiita-image-store.s3.amazonaws.com/0/237205/3a25d024-e6c1-536d-5a1c-ceb5536b0ad1.png">

うん・・まぁ・・・**速いでしょ！**

##魔法の数字を使った時
<img width="371" alt="1453ver.png" src="https://qiita-image-store.s3.amazonaws.com/0/237205/c8121dc1-5d2c-a223-23b3-19d7ed7fe35c.png">

うん・・・**ほんのちょっとだけ速くなった**

##一回ずつじゃ正確じゃない！
というわけで、１０回計測してみました

|回数|ノーマル（ダウンロード）|ノーマル（アップロード）|魔法の言葉（ダウンロード）|魔法の言葉（アップロード）|
|:-:|:-:|:-:|:-:|:-:|
|1|260.5|394.8|282.7|407.8|
|2|232.5|394.0|279.5|418.1|
|3|205.9|470.1|307.2|426.1|
|4|292.5|384.2|211.9|439.0|
|5|293.1|437.2|221.7|438.5|
|6|285.6|462.4|294.5|445.0|
|7|226.2|240.4|281.7|462.5|
|8|284.1|450.0|248.8|454.6|
|9|223.3|435.1|262.2|396.4|
|10|268.2|442.8|268.2|451.5|
|平均|257.19|411.1|265.84|433.95|

**※単位はMbps**

##結果
ほんのちょっとだけ**速くなる**　ただし、ほんのちょっと
なので**「遅い！少しでも速くしたい！」**という人はしたほうがいいのではないのでしょうか

#最後に
うん頑張った・・・俺頑張った
平均を出すんだったら*Numbers*にまとめとけばよかったと後から後悔しました
とりあえず、**花粉なんて大っ嫌いだ！**
一生許さんリストに花粉って*5000兆回*書いてやるよ！（古い）
Android P の ImageDecoder を触ってみる

Android P Previewから`ImageDecoder`が使えるように。

* [Android Developers Blog: Previewing Android P](https://android-developers.googleblog.com/2018/03/previewing-android-p.html)
* [ImageDecoder | Android Developers](https://developer.android.com/reference/android/graphics/ImageDecoder.html)

> Android P gives you an easier way to decode images to bitmaps or drawables -- ImageDecoder, which deprecates BitmapFactory.

# 画像の表示

```kotlin
val uri = Uri.parse("android.resource://${packageName}/drawable/image")
val source = ImageDecoder.createSource(contentResolver, uri)
val bitmap = ImageDecoder.decodeBitmap(source)
imageView.setImageBitmap(bitmap)
```

![normal.png](https://qiita-image-store.s3.amazonaws.com/0/94929/4fcc776c-0c6c-4267-0ed6-4ae2052f2c1d.png)

`drawable`をURIにして読み込む。

* [android - Get URI from drawable image - Stack Overflow](https://stackoverflow.com/questions/19566840/get-uri-from-drawable-image?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa)

# リサイズ

```kotlin
val uri = Uri.parse("android.resource://${packageName}/drawable/image")
val source = ImageDecoder.createSource(contentResolver, uri)
val bitmap = ImageDecoder.decodeBitmap(source, { decoder, info, source ->
    decoder.setResize(300, 300)
})
imageView.setImageBitmap(bitmap)
```

`decode...`にコールバックを指定すれば、decoderからリサイズなどができる。

![resize.png](https://qiita-image-store.s3.amazonaws.com/0/94929/fc205a7c-80ea-16a9-8d7a-2e9084424d5c.png)

# 加工

```kotlin
val uri = Uri.parse("android.resource://${packageName}/drawable/image")
val source = ImageDecoder.createSource(contentResolver, uri)
val bitmap = ImageDecoder.decodeBitmap(source, { decoder, info, source ->
    decoder.setResize(300, 300)
    decoder.setPostProcessor { canvas ->
        val path = Path()
        path.fillType = Path.FillType.INVERSE_EVEN_ODD
        path.addCircle((canvas.width/2).toFloat(), (canvas.height/2).toFloat(), (canvas.width/2).toFloat(), Path.Direction.CW)

        val paint = Paint()
        paint.isAntiAlias = true
        paint.color = Color.TRANSPARENT
        paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC)

        canvas.drawPath(path, paint)

        return@setPostProcessor PixelFormat.TRANSLUCENT
    }
})
imageView.setImageBitmap(bitmap)
```

`setPostProcessor`で読み込んだ画像の加工ができる。

![preprocess.png](https://qiita-image-store.s3.amazonaws.com/0/94929/de52e41d-f4cb-1b03-3e60-8292585a2fc6.png)

こんな感じに円形にクリッピングなど。

---

使用した画像

Charlesjsharp / Cassius blue (Leptotes cassius theonus), Cuba / CC BY-SA 4.0
[File:Cassius blue (Leptotes cassius theonus) underside.JPG - Wikimedia Commons](https://commons.wikimedia.org/wiki/File:Cassius_blue_(Leptotes_cassius_theonus)_underside.JPG)
DNS（BIND）の構築-named.conf（optionステートメント）編

#目的

ローカルな検証用DNSの構築
named.conf設定

#環境

1:centOS7

2:BIND

#手順

##1.BINDのインストール

[root@localhost ~]# yum -y install bind

##2.named.confの編集と追加

クエリをリッスンするポートとインタフェースを指定する

**listen-on port 53 { 127.0.0.1; xxx.xxx.x.x; };**


クエリを許可するホストを指定する。

**allow-query     { any; };**

ゾーン転送を許可するホストを指定する。

**allow-transfer  {127.0.0.1;　xxx.xxx.x.x; };**


notify の送信を許可する
**notify yes;**
※**NSレコード**に乗っているサーバ、**allow-notify**オプションで指定されたサーバに対して送信する。
　スレーブサーバを用意する場合はゾーン転送が行われるかしっかりと確認が必要。

クエリを転送するネームサーバを指定する。
**forwarders      {xxx.xxx.x.x ;};**


再帰的な問い合わせを要求を行わない
**recursion no;**


細かい設定はまだまだあるがとりあえず良く設定する必要最低限な設定だけ、
その他は状況に応じて設定していく感じ。

次はログステートメントの設定について書いていこうと思います。
ログのステートメントを記述するのが一番苦戦した。
RaspbianのSSH有効化、ユーザ作成

RaspberryPi3のRaspbianを再セットアップした。
ユーザ作成やSSHの有効化を覚えられないため、メモとして残す。

行った作業は次の通り。

* Raspbianの再インストール
* sshの有効化
* ユーザの作成
* piユーザの削除
* シェルの変更
* SSHの接続方法をパスワードから鍵方式に変更

なお、環境は次の通り。

* 作業クライアント：Chromebook
* Raspbianのバージョン：9.4（stretch）

Raspbianのバージョン確認方法

```
cat /etc/debian_version
```

#Raspbianの再インストール
起動時にShiftを押して、インストールメニューを表示する。
Raspbianを選択し、インストールする。

インストールが完了すると、無線LANの接続設定が残っていて、そのままネットワークに接続された。


#sshの有効化

2018/12/4 追記
プルダウンメニューから[設定]→[Raspberry Piの設定]にある[インターフェイス]にて設定できる。

/boot以下にsshファイルかフォルダがあれば、sshが有効になる。

```
cd /boot
mkdir ssh
```

#ユーザ作成、piユーザの削除


####ユーザ作成、パスワードの設定
```
sudo /usr/sbin/useradd --groups sudo -m 任意のユーザID
sudo passwd 任意のユーザID
```

####ルートパスワードの変更
```
sudo passwd root
```
####piユーザの削除
```
userdel -r pi
```

##シェル表示の変更

標準のシェルをbashに変更する。

```
sudo chsh ユーザ名
```
(2018/12/4 追記)
プルダウンメニューから[設定]→[Raspberry Piの設定]にある[インターフェイス]で設定できる。

/ect/skel/にデフォルトの設定があるため、このファイルをhomeにコピーする。

```
cp -r /etc/skel/ ~/
```


# SSHの認証をパスフレーズから鍵認証に変更

####キーフレーズの生成
Chromebookでは開発モードに変更しないと、キーを生成できないため、Raspberry piで鍵を生成する。

```
ssh-keygen
```

公開鍵を認証済みのリストに登録し、アクセス権を変更する。

```
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```

####クライアントに鍵を設定

SFTPなどを使って、ローカルに公開鍵と秘密鍵の両方をコピーする。
sshクライアントに公開鍵と秘密鍵を設定する。

####Raspberry Piのパスワード認証をオフにする。
viでsshの設定ファイルを編集する。

```
sudo vi /etc/ssh/sshd_config
```

次の設定をyesからnoに変更する。

```
PasswordAuthentication 
```

####viの使い方メモ
* i 挿入モード
* R 上書きモード
* :w 保存
* :q 終了

困ったらESCを押すか、日本語入力モードを確認する。

##sshの再起動をする。
```
sudo systemctl restart ssh
```

以上。
俺言語 その26

#概要
俺言語をやってみた。
avrにアセンブラで実装してみた。
３軸、サーボモータをぐりぐり。後編。

#環境
avr studio 4
attiny85 1mhz
tera term
usb-serial

#写真

![MVC-003F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/9c903503-eaba-7bd6-d80b-40b6bc6d80d3.jpeg)

#6ボタンの件

抵抗5本では、状態6なので、足りない。6本にした。
PB5をプルアップ必要。
ADCの値は、0,41,85,127,170,213,255

#sg90の件

-90度から90度が、6から30の24分割は、分解能が足りない気がする。

#サンプルコード
初期値18で、PB2でsg90をコントロール。
ボタン0押しで、インクリメント。
ボタン1押しで、デクリメント。

```
10 '=16
20 e=18
25 p=32
30 a=x
40 #=a<30*80
50 #=a<50*100
60 #=30
80 e=e+1
90 #=30
100 e=e-1
110 #=30
```

以上。
Hanamiを本番に載せたらdotenvを読まなくって困った話

## はじめに

Hanamiの設計は良いですね。  
Hanamiを使うことで、RubyでDDD(ドメイン駆動設計)を実践できるようになった感があります。

はじめてHanamiを使って本番環境構築をした時に環境変数周りで詰まったので、後続の方のためにここにメモを残します。

## バージョン情報

```bash
cat .ruby-version
# 2.5.1
cat Gemfile.lock | grep hanami\ 
#   hanami (1.1.1)
# hanami (~> 1.1)
```


## TL;DR

* `HANAMI_ENV=production`だと、dotenvファイルを読み込まない件
  * `/etc/environment`なり、環境変数に諸々入れておいてください

### 何が起きたか

Hanamiをnewするとわかるのですが、development環境、test環境では[dotenv](https://github.com/bkeepers/dotenv)というgemを使って環境変数を管理しているのです。

見てみましょう。

```bash
mkdir tmp && cd tmp
rbenv local 2.5.1
bundle init
echo "gem 'hanami'" >> Gemfile
bundle install
bundle exec hanami new my_first_hanami -d mysql2 --application-name=web --test=rspec --template=slim

#      create  .hanamirc
#      create  .env.development
#      create  .env.test
#      create  README.md
# ~~~~~~~~~~~~~~~~(略)~~~~~~~~~~~~~~~~~~~~~~
#      append  .env.development
#      append  .env.test

cat .env.development

# # Define ENV variables for development environment
# DATABASE_URL="mysql2://localhost/my_first_hanami_development"
# SERVE_STATIC_ASSETS="true"
# WEB_SESSIONS_SECRET="f76e2a0ea820350436c3fe95fdd1b4999969fbad993fe112baae4e480d784839"

```


`.env.development`、`.env.test`というファイルが作られ、`DATABASE_URL`などの変数が定義されているのがわかるかと思います。

起動してアクセスしてみましょう。

```bash
bundle exec hanami s
curl http://localhost:2300 -D - -s  -o /dev/null # Responseヘッダーのみを取得する

# HTTP/1.1 200 OK
# Content-Length: 14911
# Server: WEBrick/1.4.2 (Ruby/2.5.1/2018-03-29)
# Date: Sat, 31 Mar 2018 14:06:04 GMT
# Connection: Keep-Alive
```

無事、`200 OK`が返ってきていることがわかるかと思います。

では、この調子で本番で動かすとどうなるでしょうか。`HANAMI_ENV=production`で動かしてみます。

```bash
HANAMI_ENV=production bundle exec hanami s
curl http://localhost:2300 -D - -s  -o /dev/null

# HTTP/1.1 500 Internal Server Error
# Content-Type: text/html;charset=utf-8
# Server: WEBrick/1.4.2 (Ruby/2.5.1/2018-03-29)
# Date: Sun, 01 Apr 2018 03:30:37 GMT
# Content-Length: 7453
# Connection: Keep-Alive
```

`500 Internal Server Error`が返ってきました。どういうことでしょうか。

<img width="1126" alt="スクリーンショット 2018-04-01 12.32.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/52461/121dd7b0-2cd1-cbf1-8c23-e9d300ba596d.png">


```
Boot Error
Something went wrong while loading /Users/shinse/go/src/github.com/mrdShinse/my_first_hanami/config.ru

Hanami::Model::Error: LoadError: cannot load such file -- sequel/adapters/
```

起動時のエラーで、`Hanami::Model`あたりで`sequel/adapters/`というファイルがない？？なんのこっちゃ？

これ、実はproductionで動かすことで環境変数`DATABASE_URL`が空になり、DB接続する[sequel](https://github.com/jeremyevans/sequel)というgemが吐いたエラーをHanami::Modelがキャッチしているのですが...

**メッセージが判りづらい笑**

これは結構ハマりましたw

Hanamiは[dotenv](https://github.com/bkeepers/dotenv)を使ってるので`.env`とか`.env.local`とか`.env.production`とか試したのですが、僕が使っているバージョンのHanamiはproductionの場合に`.env`を読んでいなかったのもハマりポイントでした。

`DATABASE_URL`さえ渡してあげれば解決するので、

```
HANAMI_ENV=production DATABASE_URL="mysql2://localhost/my_first_hanami_production" bundle exec hanami s
```

とかでも解決するのですが、後々capistranoでdeployする場合にbundler経由で環境変数を渡す方法が面倒だったこともあり、僕は`/etc/environment`に環境変数を定義することにしました :thumbsup: 

こちらからは以上です！
build.gradle 日本語訳

build.gradle に記載されているコメントの日本語訳。

#build.gradle

本ビルドファイルは ``gradle init`` タスクによって生成されたファイルである。

本ファイルは Java プロジェクトの見本をコメントアウトしたものだ。
詳細は Gradle user guide の [Java Quickstart](https://docs.gradle.org/4.4.1/userguide/tutorial_java_projects.html) を参照。

##apply plugin
Java サポートを追加するプラグインを適用する。

```gradle
apply plugin: 'java'
```

##repositories
本セクションではプロジェクトの依存ライブラリの取得元を宣言する。

``jcenter`` から依存ライブラリを取得する。 
Maven/Ivy/file リポジトリを宣言することができる。

```gradle
repositories {
   jcenter()
}
```

本セクションではプロダクションとテストコードの依存ライブラリを宣言する。

```gradle
dependencies {
   compile 'org.slf4j:slf4j-api:1.7.25'
   testCompile 'junit:junit:4.12'
}
```

###compile
プロダクションコードのコンパイル時に SLF4J logging API を使用する。

###testCompile
テストに使用するテストフレームワークを宣言する。 ``gradle test`` タスクでは 
TestNG もサポートしている。 
``testCompile`` の依存情報を ``testCompile 'org.testng:testng:6.8.1'`` へ変更し、 
``test.useTestNG()`` をビルドスクリプトへ追加するだけで適用することができる。
Sequelizeのリレーションを図にしてみた

# はじめに
Sequelizeを使っていたがリレーションの関数の動きが分かりづらいのでUMLを用いて図にしてみた

以下の2つのテーブルを例に進める。

```javascript:run.js
const TableA = this.sequelize.define('TableA');
const TableB = this.sequelize.define('TableB');
```

![テーブル例](http://www.plantuml.com/plantuml/png/SoWkIImgAStDuKhDAyaigLG8IKpAINLKgEPIKD1My7JXgkL2aN52bd58pKi1QWK0)

## belongsTo

```javascript:run.js
TableA.belongsTo(TableB);

tableA.getTableB();
```
![belongsTo](http://www.plantuml.com/plantuml/png/SoWkIImgAStDuKhDAyaigLG8IKpAINLKgEPIKD1My7JXqjNL1J9r8U9EG85QBXIbJb2b41ceRjsQ6gWibqDgNWhGU000)

## hasOne

```javascript:run.js
TableA.hasOne(TableB);

tableA.getTableB();
```
![hasOne](http://www.plantuml.com/plantuml/png/SoWkIImgAStDuKhDAyaigLG8IKpAINLKgEPIKD1My7JXgkL2aN52oEZgwWAPkb0T4ALGtJKrK64dBeVKl1IWyG00)

## hasMany

```javascript:run.js
TableA.hasMany(TableB);

tableA.getTableBs();
```
![hasMeny](http://www.plantuml.com/plantuml/png/SoWkIImgAStDuKhDAyaigLG8IKpAINLKgEPIKD1My7JXgkL2aN52oEZgwWAPkb0T4ALGtRhLKDLS3gbvAK3J0G00)

## belongsToMany

```javascript:run.js
TableA.belongsToMany(TableB, {through: 'TableC'});
TableB.belongsToMany(TableA, {through: 'TableC'});

tableA.getTableBs();
tableA.setTableBs();
tableA.addTableB();
tableA.addTableBs();

tableB.getTableAs();
tableB.setTableAs();
tableB.addTableA();
tableB.addTableAs();
```
![belongsToMany](http://www.plantuml.com/plantuml/png/SoWkIImgAStDuKhDAyaigLG8IKpAINLKgEPIKD1My7JXgkL2aN52aO4ghjMjXigYAdO6AzQ5ckdfWk0uWVKxfEQb0Aq60000)

# おわりに
図式化するとなんとなくわかりやすくなった気はする。(なんとなく

わからないときは素直に[API Docs](http://docs.sequelizejs.com/manual/tutorial/associations.html#one-to-one-associations)を見よう！
[HTML] [CSS] textareaのスクロールバーを少し左に寄せる

# やったこと
textareaにの親要素にdivをつくる。
親div内にtextareaとdivをつくる。
textareaのwidthを95%くらいに設定する。
（もっといいやり方がある気がする）
# demo
https://jsfiddle.net/qx263s5y/
# HTML
```textarea.html
<!DOCTYPE html>
<head>
</head>
<body>
    <div>
        <p>textareaのスクロールバーを少し左に寄せる</p>
    </div>
    <div class="wrapper">
        <textarea class="wrapper__left">
        1
        2
        3
        4
        5
        </textarea>
        <div class="wrapper__right"></div>
    </div>
</body>
```
# CSS
```textarea.css
.wrapper {
    width: 16em;
    height: 4em;
    border: solid 1px; /* wrapperクラスでtextareaぽく演出する */
    display: flex;     /* .wrapper__leftとwrapper_rightは横並びにする */
}
.wrapper > .wrapper__left {
    width: 95%;
    border: none;               /* textareaのborderは表示しない */
    padding: calc(0.5em - 2px); /* .wrapperのborderのpxを引く */
    overflow-y: scroll;         /* 縦方向にスクロールさせる */
    resize: none;               /* 右下に出る拡張するやつを表示しない */
}
.wrapper > .wrapper__right {
    width: 5%;
}
```
もっといい書き方がある気がする。
CSS難しいぜ。
型クラスで見るPureScript

<!--# 型クラスで見るPureScript-->

## あるいは、PureScriptで見る代数学

最近、PureScriptの勉強を始めました。初めはHaskellをやろうとしたのですが、なんだか分からないことが多く、JavaScriptの知識を活かせるPureScriptの方が敷居が低く感じたので、今はPureScriptを勉強しています。

PureScriptというのは、AltJSの１つで、JavaScriptエンジン上で動作する関数型言語です。同じく関数型言語であるHaskellの文法を元にしつつ、JavaScriptエンジン上で動くように、JavaScriptとの相互呼び出しできるようにしたり、Haskellの持つ課題への対策などをしたりなどして、作られた言語らしいです。

関数型言語というのは、数学の「圏論」という理論を元に構築されているらしく、PureScriptの勉強をしていても、数学用語をたくさん見かけます。理論物理学の出身で、学生時代は群論や線形代数が大好きだった私にとっては、とても面白いのですが、数学が苦手な人にとっては敷居が高いだろうなと感じます。

そこで、PureScriptの特徴である型クラスに着目し、PureScriptの持つ代数的な側面について、プログラマ視点からまとめてみようと思います。

この記事では、PureScriptの文法など、言語の解説は行いません。言語について勉強したいという方は、[「実例によるPureScript」についての記事](https://qiita.com/hiruberuto/items/f1e048fc9a8ca51eddb2)が参考になると思います。日本語訳はだいぶ古く、サンプルコードのほとんどは動きませんが、考え方の理解には役立ちます。サンプルコードや演習問題は英語版の方を使うのが良いでしょう。

また、圏論について興味がある方は、[「物理学者のための圏論入門」（名古屋大学 谷村省吾 教授）](http://www.phys.cs.is.nagoya-u.ac.jp/~tanimura/lectures/tanimura-category.pdf)や [檜山正幸のキマイラ飼育「はじめての圏論」](http://d.hatena.ne.jp/m-hiyama/20060821/1156120185)が参考になります。ただ、あまり厳密な数学よりも、現実世界とどう結びつけるかという部分が重要だと思っているので、この記事でも数学的な厳密性よりも、使い方にフォーカスをあてられるように書きたいと思っています。

偉そうなことを書き始めてしまいましたが、私自身、PureScriptを始めたばかりの初心者ですので、不備等ありましたら教えていただけるとありがたいです。

また、PureScriptはHaskellのそっくりさん言語なので、Haskell勉強してるけど数学用語分からんよ（＞_＜）って人にも役立つかもしれません。（自分は先にPureScript勉強して、気が向いたら後からHaskellやって見ようかなってノリですが。。。）Haskellの型クラスとも若干の違いがあるようなので適当に読み替えてやってください。

それでは、はじまりはじまり〜〜〜👏

## 目次

1. イッツ、ショータイム！！
    1. [Show型クラス](https://qiita.com/u4da3/items/f002c061ecb40c1fa5a1)
1. 等しいやつと、大きいやつと、小さいやつ
    1. [Eq型クラス](https://qiita.com/u4da3/items/083a61459dd3f95e4138)
    1. [Ord型クラス](https://qiita.com/u4da3/items/653a03ae87c9d34ad241)
    1. [Bounded型クラス](https://qiita.com/u4da3/items/db1a8b1169f4fa1329b9)
    1. [Enum型クラス](https://qiita.com/u4da3/items/89ba9918374559d169c5)
    1. [BoundedEnum型クラス](https://qiita.com/u4da3/items/b1b14db510d26a5f60e7)
1. グループで群れているやつら
    1. [SemiGroup型クラス](https://qiita.com/u4da3/items/a8448acdf607b4354e8f)
    1. Monoid型クラス
    1. Group型クラス
    1. Commutive型クラス
    1. LeftAction型クラス・RightAction型クラス
1. かんかん照りのビーチと浮き輪
    1. SemiRing型クラス
    1. Ring型クラス
    1. DivisionRing型クラス
    1. CommutiveRing型クラス
    1. EuclideanRing型クラス
    1. Field型クラス
1. 真偽のほどはいかに
    1. HeytingAlgebra型クラス
    1. BooleanAlgebra型クラス
1. カテゴリー５接近中
    1. Semigrpoupoid型クラス
    1. Category型クラス

<font color="red">※書き上がったものから公開していくので順番通りではないかもしれません。</font><br><br>
Python > lambda expression > defで定義した方が良い例

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

PyMieScattというコードでlambda expressionが使われている。
https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py#L446

lambda expressionは本来、一行であらわせる実装を匿名関数として実装する方法だと認識している。
その「一行」が長いためにコードの可読性が悪くなる。

lambda expression実装と関数での実装と比べてみる。

```lambdaEquation_180401.py
import numpy as np

# on Python 3.5.2


# function
def get_ithPart(gammai, dp, dpgi, sigmagi):
    exponent = -(np.log(dp) - np.log(dpgi))**2 / (2 * np.log(sigmagi)**2)
    res = gammai * np.exp(exponent)
    res = res / (np.sqrt(2*np.pi) * np.log(sigmagi) * dp)
    return res

# lambda expression (PyMieScatt > Mie_Lognormal())
ithPart = lambda gammai, dp, dpgi, sigmagi: (gammai/(np.sqrt(2*np.pi)*np.log(sigmagi)*dp))*np.exp(-(np.log(dp)-np.log(dpgi))**2/(2*np.log(sigmagi)**2))


gammai = 2.0
dp = np.linspace(0.1, 1.0, 20)
dpgi = np.mean(dp)
sigmagi = np.std(dp)
print(dp)
print(dpgi)
print(sigmagi)

print('---')
res1 = ithPart(gammai, dp, dpgi, sigmagi)
print(res1)
res2 = get_ithPart(gammai, dp, dpgi, sigmagi)
print(res2)

```

```shell-session
$ python3 lambdaExpression_180401.py 
[0.1        0.14736842 0.19473684 0.24210526 0.28947368 0.33684211
 0.38421053 0.43157895 0.47894737 0.52631579 0.57368421 0.62105263
 0.66842105 0.71578947 0.76315789 0.81052632 0.85789474 0.90526316
 0.95263158 1.        ]
0.55
0.2731396404000978
---
[-2.59445803 -2.49295058 -2.29247964 -2.07935553 -1.87938603 -1.69949734
 -1.54021309 -1.39991425 -1.27640001 -1.16746918 -1.0711235  -0.98562108
 -0.9094711  -0.8414078  -0.78035932 -0.72541773 -0.67581241 -0.63088744
 -0.59008261 -0.55291772]
[-2.59445803 -2.49295058 -2.29247964 -2.07935553 -1.87938603 -1.69949734
 -1.54021309 -1.39991425 -1.27640001 -1.16746918 -1.0711235  -0.98562108
 -0.9094711  -0.8414078  -0.78035932 -0.72541773 -0.67581241 -0.63088744
 -0.59008261 -0.55291772]
```

可読性の観点からは長い式をlambda expressionにしない方が良いと思う。

可読性の悪いコードは以下の問題を孕む:

- 実装時にしかチェックされない
- 実装者にしかチェックされない
- 機能変更時にミスを誘発する

PEP8でもdefで定義するように表示される。

```shell-session
$ pep8 lambdaExpression_180401.py 
lambdaExpression_180401.py:14:1: E731 do not assign a lambda expression, use a def
lambdaExpression_180401.py:14:80: E501 line too long (151 > 79 characters)
```

### link

http://www.diveintopython.net/power_of_introspection/lambda_functions.html

### 謝辞

@shiracamus さんのコメントにてPEP8日本語訳の該当箇所を教えていただきました。

@koji-kojiro さんのコメントにてexplicit def statement, lambda expression, embedded inside a larger expressionの内容理解に役立ちました。

情報感謝です。
Grove Pi+のブロック図

RasPiにGroveモジュールを接続する定番商品、Grove Pi+。
PythonやNodeだけでなく、Scratch, Ruby, C#といった結構幅広い言語を[サポート](https://github.com/DexterInd/GrovePi/tree/master/Software)していて、ちょっとビックリ。

どんな仕組みで動かしているのか気になったので、、、回路図を見てブロック図を書きました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/14578ceb-54cb-0ffb-07a6-d0a64a6140d4.png)

* [Grove Pi+ 販売ページ](https://www.seeedstudio.com/GrovePi%2B-p-2241.html)
* [Grove Pi+ Wiki](http://wiki.seeedstudio.com/GrovePi_Plus/)

# 回路図

[Grove Pi+ Wiki](http://wiki.seeedstudio.com/GrovePi_Plus/)の下の方にあります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/673d37a5-2b10-291e-1012-1cabae546adc.png)

# ブロック図

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/c73227ce-1075-aff2-be2f-53ca6d546f62.png)

# 気になる点

* Groveコネクタは全て5V系。3.3V系は接続ダメ。
* Groveコネクタのピン割当が変則な感じ。D2コネクタはD2,D3で、D3コネクタはD3,D4。
* Groveコネクタ"SERIAL"はUART用途では使えないっぽい。Firmwareにコマンドが存在しない。
* タイムクリティカル（シリアルRGB LEDとか）な処理はATMEGA328のFirmwareに実装。
* DIO,AIはATMEGA328を経由。I2C,UARTはATMEGA328経由せず。（詳しくは回路図見てください）

# 参考

* [Raspberry pi board GPIO pinout](http://www.panu.it/raspberry/)
* [GrovePi Software Architecture](https://www.dexterindustries.com/GrovePi/engineering/software-architecture/)
* [GrovePi repo on github](https://github.com/DexterInd/GrovePi)
* [GrovePi Firmware Commands](https://github.com/DexterInd/GrovePi/tree/master/Firmware/Source/v1.2/grove_pi_v1_2_7#commands)
vargrant パッケージ化のメモ

* `vagrant package --vagrantfile Vagrantfile --include a.txt,b.sh,c.md`
    * パッケージ化するときにVagrantファイルやそれ以外のファイルをパッケージング
* `vagrant box add package.json`
    * jsonファイルの中身に従ってboxの追加やバージョニング

```json:package.json
{
    "description": "Archlinux x86_64",
    "short_description": "Archlinux with GUI (xfce4), docker, Japanese man/font/keyboard",
    "name": "u1and0/archlinux",
    "versions": [{
        "version": "1.0.0",
        "status": "active",
        "description_html": "<p>Archlinux x86_64</p>",
        "description_markdown": "Archlinux x86_64",
        "providers": [{
            "name": "virtualbox",
            "url": "file:package.box"
        }]
    }]
}

```

* `tree -C ~/.vagrnt.d/boxes/myname-VAGRANTSLASH-boxname`
    * パッケージ化してaddしたファイルのツリー構造を確認。(ちゃんとa.txtやc.mdが含まれているのか)
* `vagrant box update --box myname/boxname`
    * package化してからバージョンの最新はどれなのか教えてあげる
* `vagrant init myname/boxname --box-version 1.0.0`
    * バージョンが複数あるときはboxバージョン指定しないと＞
* `vagrant remove myname/boxname --box-version 1.0.0`
    * 古いboxは消す
* `tar tvf package.box`
.boxファイルはtar.gzファイルなのでtarコマンドで中身を見れる
FuelPHP 1.8 Not Found

# 1.問題点
FuelPHPでページ遷移すると「Not Found」と表示されてcontrollerの読み込みができない。

# 2.エラー内容
```
Not Found
The requested URL /***** was not found on this server.
```

# 3.環境
AWS linux
Apache 2.4
PHP 7.0.27
FuelPHP 1.8


# 4.原因
Apache設定漏れ

#### 修正前
```Apache:httpd.conf
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride none ← ここがNG
Require all granted
</Directory>
```

#### 修正後
```Apache:httpd.conf
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride All ← これに修正
Require all granted
</Directory>
```

#### 最後にApache再起動をして解消
`service httpd restart`
SORACOM Kaleidoscopeでデータの温かみを可視化する

4月1日、「SORACOM Kaleidoscope」がリリースされたので、さっそく使ってみました！
## SORACOM Kaleidoscopeとは？
>SORACOM Kaleidoscope(以下、Kaleidoscope) は、SORACOM Harvestで蓄積されたデジタルデータに対して、そのデータが織りなす模様を可視化するビューを提供するサービスとなります。
>
>SORACOMユーザーコンソールに浮かび上がる模様は、元となるデジタルデータにより刻々と変化するため、利用者はその模様を見ることで、デバイスの状態やデータの良し悪しを模様のニュアンスで感じることができます。
>またKaleidoscopeの利用には難しい設定やサーバの準備などは必要なく、弊社独自のAXロジック(※)が自動的に模様を生成するため、非常に簡単に利用して頂くことができます。
>(※) アナログトランスフォーメーションロジック。当社自身も内容を理解していないことから、内容は非公開となります。

とのこと。

詳細はこちら！
リリース
https://soracom.jp/press/2018040101/

リリースブログ
https://blog.soracom.jp/blog/2018/04/01/kaleidoscope/

サービス 
https://soracom.jp/services/kaleidoscope/ 
※getting startedもあります

## さっそく使ってみる

### 1. 準備
[以前のエントリー](https://qiita.com/haruka925/items/dad30f0f47c63296d4c4)で使用した、HUAWEIのUSBドングルとGlobalSIMを利用します。
※WioLTE PoCセットでちゃんとセンサー値とって流すのも面白いですね！
　今回は手っ取り早くデータを流すため、pythonで書いたシミュレータを使いました。

<img width="250" alt="画像 今日 10_59_36.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/46882/4166ab3c-b4ac-6665-3a80-bed7210684bd.jpeg">

HUAWEIのUSBドングルとGlobal SIMでの通信開始については、[「SORACOM Global SIMをミャンマーで使ってみた」](https://qiita.com/haruka925/items/dad30f0f47c63296d4c4)をご覧ください。

Kaleidoscopeでデータを可視化するには、SORACOM Harvestにデータを蓄積する必要があります。
SORACOM Harvestの利用方法は[公式ページ](https://dev.soracom.io/jp/start/harvest/)、もしくは、[「2016-12-24
SORACOM Harvest ＋ AWS Lambdaでウィンドウ処理やってみた」](http://acro-engineer.hatenablog.com/entry/2016/12/24/100000)をご覧ください。

### 2. Kaleidoscope!!

データがある程度蓄積されたら、SORACOMコンソールの[Kaliedoscopeページ](https://console.soracom.io/#/data_kaleidoscope?coverage_type=jp)にアクセスしてみましょう！

https://console.soracom.io/#/data_kaleidoscope?coverage_type=jp

#### デバイス選択前
「リソースを選び、感じなさい・・・」
![Kaleidoscope_top.png](https://qiita-image-store.s3.amazonaws.com/0/46882/b73d58fc-9df7-5968-bd02-89ac8cbe674d.png)

怪しい。。。。

#### デバイスを選択
SIMを選択すると、まずは普通のHarvestによる可視化がされます。
![start.png](https://qiita-image-store.s3.amazonaws.com/0/46882/a2d08dec-10ab-85fd-a1de-f38c10b88ea0.png)

図中の赤で囲った部分、Kaleidoscopeボタンを選択すると、Kaleidoscopeが表示されました！！
綺麗な紋様だけでなく、見慣れた、あのアイコンもありますね。
どうも、「データの温かみ」だけではない要素も可視化されるようです。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/46882/b2709124-7b3b-ddbe-4e32-a533069be70c.jpeg)

コンソール右上の自動更新をONにしておけば、蓄積されているデータの量に合わせて、Kaleidoscopeも変化していくようです。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/46882/0c16ae7c-b679-5652-9a7f-b3e6bdd93010.jpeg)
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/46882/7809ef90-c9eb-d5ce-f0cc-76f8c859912b.jpeg)
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/46882/dd6501b5-0475-619b-40be-630ee60f6feb.jpeg)

データの可視化で癒しを得られるなんて、画期的なサービスですね！

## おまけ

私の所属するAcroquest Technologyは、このKaleidoscopeのプレスにエンドースメントを出しています。
[英訳プレス](https://soracom.io/en/press/2018040101/)で、何とかニュアンスを伝えようとしているのが、面白いwww
ぜひ、日本語版、英語版、見比べてみてください。

日本語プレス：https://soracom.jp/press/2018040101/
英訳プレス：https://soracom.io/en/press/2018040101/
Laravel 最初触れためも

.evvを編集した時
```php:.env
php artisan config:clear
```

コンストラクタとは
コンストラクタとはクラスからインスタンスを生成するとき（オブジェクトがnewによって作成されるとき）に自動的に呼び出されるメソッドです。

このようなメソッドをマジックメソッドと呼びます。

オブジェクト作成時に初期化処理が必要な場合、コンストラクタ内に記述しておけば自動的に実行してくれます。
```php:hogehoge.php
public function __construct()
```
Tableいじったとき
```php artisan migrate:refresh
```
AWS Cloud9でFlaskアプリサーバーを起動する方法

# AWS Cloud9でFlaskアプリサーバーを起動する
[Falaskのチュートリアル](http://flask.pocoo.org/docs/0.12/tutorial/)でFlaskサーバーを立ち上げる際に若干作業が必要だったのでメモしておきます。
結論から言うと、AWSのファイアーウォールとflaskのホスト制限を外します。
## 環境
### AWS Cloud9
[AWS Cloud9](https://aws.amazon.com/jp/cloud9/)はクラウドベースのIDEです。EC2の料金がかかってしまいますが、仮想環境をローカルに作る手間が省けて重宝しています。
### Flask
[Flask](http://flask.pocoo.org/docs/0.12/)はPythonのフレームワークです。マイクロと謳っている通り、必要最低限と行った感じで扱いやすいです。

## 問題点
tutorialの[Step 3: Installing flaskr as a Package](http://flask.pocoo.org/docs/0.12/tutorial/packaging/)で、以下のコマンドをterminalで叩いてサーバーを起動してくださいと記載されています。

```terminal
export FLASK_APP=flaskr
export FLASK_DEBUG=true
flask run
```
しかし、この方法ではアプリサーバーは起動していますがAWSのファイアーウォールとflaskのホスト制限で外部からアクセスすることができません。

## 解決方法
### EC2のセキュリティーグループを設定してポートを開ける
#### EC2へアクセス
以下の画像のようにAWS Clooud9のタブを開いてダッシュボードに移動します。
![スクリーンショット 2018-04-01 10.43.49.png](https://qiita-image-store.s3.amazonaws.com/0/162536/2c5e5897-7cf7-b3d7-e934-61c6be242fdc.png)
その後EC2のダッシュボードを開いてください。
#### インバウンドのポートを開ける
起動中のEC2のインスタンスを選択し、説明タブにあるセキュリティーグループを選択します。
そうすると画面が遷移するので、インバウンドタブを開きます。
![EC2 Management Console.png](https://qiita-image-store.s3.amazonaws.com/0/162536/f96f9ae5-59ca-3627-5a46-3e64ca5eca6f.png)
編集ボタンを押すとインバウンドのルールを設定できるようになるので、「ルールの追加」をクリックし、TCPカスタムを選択し、ポート欄に5000を入力します。最後に保存を押せば設定が更新されて、5000番ポートのアクセスが許可されます。
![part2_EC2 Management Console.png](https://qiita-image-store.s3.amazonaws.com/0/162536/b2dbb37f-6435-f9bb-f25f-71e1981cd654.png)

### flask runの引数にパブリックDNSを渡す
EC2のダッシュボードに戻り、起動中のインスタンスを選択します。パブリック DNSが記載されているので、コピーしてきます。（EC2インスタンスが落ちるたびに、この値は変更されます。解決は可能ですが、お金がかかります。）
コピーしてきたら、flaskアプリケーションのディレクトリで以下のコマンドを打ちます。

```terminal
flask run --host=your-public-DNS
```

サーバーが起動できたら、以下のURLにアクセスできるようになっているはずです。
http://your-public-DNS:5000

## 参考
- [flask tutorial](http://flask.pocoo.org/docs/0.12/tutorial/)
- [AWS Cloud9でDjangoアプリを作成| Django 入門](https://tech-joho.info/aws-cloud9%E3%81%A7django%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90-django-%E5%85%A5%E9%96%80/)
Numpy > np.linspace()に対するlist() > 不要のようにも思われる | リスト内包表記なしの実装検討

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

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

```py
xValues = list(np.linspace(xRange[0],xRange[1], nx))
...
dValues = [1000*x/np.pi for x in xValues]
```

np.logscape(), np.linspace()に対してlist()を取る必要はあるのだろうか？

https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html
> Returns: samples: ndarray

```list_nparray_180401.py
import numpy as np

# on Python 3.5.2

# 1. without list()
npary = np.linspace(1e-4, 1e0, 7)
print(type(npary))
print(npary)

# 2. with list()
lists = list(np.linspace(1e-4, 1e0, 7))
print(type(lists))
print(lists)

# list comprehension
print('---')
work = [1000*x for x in npary]
print(type(work))
print(work)
work = [1000*x for x in lists]
print(type(work))
print(work)

```

```shell-session
$ python3 list_nparray_180401.py 
<class 'numpy.ndarray'>
[1.0000e-04 1.6675e-01 3.3340e-01 5.0005e-01 6.6670e-01 8.3335e-01
 1.0000e+00]
<class 'list'>
[0.0001, 0.16674999999999998, 0.3334, 0.50005, 0.6667, 0.8333499999999999, 1.0]
---
<class 'list'>
[0.1, 166.74999999999997, 333.4, 500.05, 666.6999999999999, 833.3499999999999, 1000.0]
<class 'list'>
[0.1, 166.74999999999997, 333.4, 500.05, 666.6999999999999, 833.3499999999999, 1000.0]
```

最終的に得られるworkについてはlist()があってもなくても同じになった。

list()を付けておく方がよいかは未消化。


### link

https://stackoverflow.com/questions/21360028/numpy-list-comprehension-syntax

### リスト内包表記なしの実装
(追記 2018/04/04)

@skotaro さんのコメントを参考に、リスト内包表記なしの実装を検討してみました。

```list_nparray_180404.py
import numpy as np

# on Python 3.5.2

# 1. without list()
npary = np.linspace(1e-4, 1e0, 7)
print(type(npary))
print(npary)

# 2. with list()
lists = list(np.linspace(1e-4, 1e0, 7))
print(type(lists))
print(lists)

# list comprehension
print('---')
#work = [1000*x for x in npary]
work = 1000 * npary
print(type(work))
print(work)
work = [1000*x for x in lists]
print(type(work))
print(work)

```

```txt:run
$ python3 list_nparray_180404.py 
<class 'numpy.ndarray'>
[1.0000e-04 1.6675e-01 3.3340e-01 5.0005e-01 6.6670e-01 8.3335e-01
 1.0000e+00]
<class 'list'>
[0.0001, 0.16674999999999998, 0.3334, 0.50005, 0.6667, 0.8333499999999999, 1.0]
---
<class 'numpy.ndarray'>
[1.0000e-01 1.6675e+02 3.3340e+02 5.0005e+02 6.6670e+02 8.3335e+02
 1.0000e+03]
<class 'list'>
[0.1, 166.74999999999997, 333.4, 500.05, 666.6999999999999, 833.3499999999999, 1000.0]
```

numpy arrayに対しては以下のようにすることで、要素の値を1000倍にすることができました。

```py
#work = [1000*x for x in npary]
work = 1000 * npary
```

一方でlistに対して同じ`work = 1000 * lists`にした場合は、要素数が1000倍になりました。

### link

http://www.scipy-lectures.org/intro/numpy/operations.html
アプリのバージョン管理のルール（セマンティックバージョニング）

# アプリのバージョン管理
iOSやAndroidについて、バージョン管理する際のルールについてまとめる。
主に下記のような形でバージョン管理する方法が主流。

バージョン：**1.3.2.(1)**

上記の様なバージョニング方法については、**セマンティックバージョニング**と呼ばれ、以下の記事が詳細な記述が書かれている。
https://semver.org/lang/ja/

抜粋すると以下である。
1. **APIの変更に互換性のない場合はメジャーバージョンを、**
2. **後方互換性があり機能性を追加した場合はマイナーバージョンを、**
3. **後方互換性を伴うバグ修正をした場合はパッチバージョンを上げます。**


# バージョン管理のフロー
```
1.0.0. -> 1.0.1(bug-fix) -> 1.1.0(add-function) -> 1.1.1(bug-fix) -> 2.0.0(app-renewal)
```

# メジャー番号
一番最初の数値は、メジャーバージョン管理であり、アプリ全体をリニューアルした場合や破壊的な変更が起きた場合に変更させる数字である。

# マイナー番号
機能追加や機能向上の場合には、この番号を変更させる。メジャー番号が変化した場合には、0に戻す。

# リビジョン番号
バグ修正や軽微なデザイン修正の際に変更する数字である。メジャー番号やマイナー番号が変化した場合には、0に戻す。

# ビルド番号
AppStoreにアップロードする際の判別番号として使用される。
unityでシンプルタイマーを表示する方法


今回は、ゲームでもよく使う　タイマーを表示する方法を見ていきます。　


#　ステップ1　　　下準備

<br>
ＵＩから　Canvasを追加する。　

ＵＩから　Textを追加する。　

そして、TextをCanvasにドラッグします。　

Textの中は　00:00と　書いておきます。

大きさも微調整して、画面の右上に出るようにしておきます。


次に　Add　componetから　NewScriptを追加します。　


<br>
![bandicam 2018-04-01 10-38-38-543.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/24b06d91-5138-719f-98b1-3077f0c25078.jpeg)



<br><br>


#　ステップ２　コードを書く
<br>
Scriptの中のコードは　こんな感じ。　数字が増えていくだけの　

シンプルタイマーです。
<br><br>



``` 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class time : MonoBehaviour {

	float countTime = 0;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		countTime += Time.deltaTime; 
		GetComponent<Text>().text = countTime.ToString("F2"); 
	
	}
}


```

<br><br><br>

結果


Ｇａｍｅ画面にタイマーが表示できる。

![bandicam 2018-04-01 10-46-13-904.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/2a2bbd82-d9c0-0e6d-ee65-154c1e905b04.jpeg)

<br><br><br>


ＰＳ

<br><br>


ＵＤＥＭＹでUnityやＣ＃講座などを出しています。　よかったら見てね～。　

私の名前で検索すれば　出てきますので。
スーパーマリオ.css

なんか変なのを見付けた。
だいたいタイトルどおりです。

以下は[Super Mario World made only with CSS gradients - no JS, no embedded images/data URIs, no external images and using a micro HTML =)](https://medium.com/@alcidesqueiroz/super-mario-world-in-css-100-css-no-javascript-no-embedded-images-data-uris-no-external-e43dc0c2b1f4)の日本語訳です。
タイトル長い。

# Super Mario World made only with CSS gradients - no JS, no embedded images/data URIs, no external images and using a micro HTML =)

この投稿では、簡単に、単刀直入に解説します。

![01.gif](https://qiita-image-store.s3.amazonaws.com/0/26088/75e867e5-72fc-03df-e692-08ce88b68b9a.gif)

このgif画像は、CSSだけで作られたスーパーマリオのアニメーションです。
埋め込み画像も外部画像も、ましてやJavaScriptも一切使用していません。
CSSと小さなHTMLだけで作られています。

```html
<main class="game">
  <div class="game__background"></div>
  <div class="game__foreground">
    <div class="foreground__mario"></div>
    <div class="foreground__ground"></div>
  </div>
</main>
```

比較用に、以下はSNESの本家スーパーマリオワールドです。

![02.gif](https://qiita-image-store.s3.amazonaws.com/0/26088/14e60307-840d-0a9c-8bc7-e7ed132beab1.gif)

残念ながら、スーパーマリオCSSはプレイ可能なゲームではなく、単なるアニメーションです。

これがどのように作られたかについては、コメントに記載してあります。

森や草原、マリオ自身など、表示されている内容の99.99%はCSSグラデーションで実装されています。

MacのChrome64では正常に動作することを確認しています。
Firefoxでも正しく動作しますが、動作が少し遅くなります。
Safariでは全く動きませんし、わざわざ対応させるほどの根気と時間はありませんでした。
他のブラウザやデバイスでは動作確認をしていません。

CodePenはこちらです。

<p data-height="265" data-theme-id="0" data-slug-hash="MVJEwd" data-default-tab="css,result" data-user="alcidesqueiroz" data-embed-version="2" data-pen-title="Mario made only with CSS gradients - no JS, no embedded images/data URIs, no external images and using a micro HTML =)" class="codepen">See the Pen <a href="https://codepen.io/alcidesqueiroz/pen/MVJEwd/">Mario made only with CSS gradients - no JS, no embedded images/data URIs, no external images and using a micro HTML =)</a> by Alcides Queiroz (<a href="https://codepen.io/alcidesqueiroz">@alcidesqueiroz</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

新たな実験もリリースしました。
この記事を読んだ後、ぜひ[こちら](https://medium.com/@alcidesqueiroz/experiment-2-360-view-skyscraper-at-night-made-only-with-css-gradients-and-3d-transforms-no-js-520be4f22a19?source=user_profile---------4-------------------)も見てみてください。

## Bonus

[atom-pigments](https://github.com/abe33/atom-pigments)を使ってスプライトを表示してみるとこんなかんじです =)
![03.png](https://qiita-image-store.s3.amazonaws.com/0/26088/abbc6cb9-d328-5d03-1c55-0ea066c8f294.png)

# 感想

数秒歩いてるだけなので、次は1ステージ全部やってほしいですね(無茶振り)

CSSだけでキャラクターやアニメーションを作る試みというのはわりとよくある話で、少し調べただけでもいくつも出てきます。
もちろん自分には全く作れませんけどね。
ちなみに2日、8時間程度で作成したそうです。
Python3 + Numpy > 5列の要素を持つ二次元リストから１列だけ取出す > PyMieScatt実装(内包表記) | np.array(lists)[:, 2:2+1].flatten() > よりシンプルな書き方

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

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

_qDにはリスト形式でMie散乱の計算結果(qext, qsca, qabs...)が二次元データとして格納されている。
その取り出しは以下の内包表記で実施している。

```
qext = np.array([q[0] for q in _qD])
```

他の方法も考えてみた。

```extractArray_180401.py
import numpy as np

# on Python 3.5.2

# 1. preparation
template = [3, 1, 4, 1, 5]
print(template)
lists = [template for loop in range(5)]
print(lists)
print('---')

# 2. Extract
PICKUP_INDEX = 2

# 2a. based on the PyMieScatt > MieQ_withDiameterRange()
item1a = np.array([q[PICKUP_INDEX] for q in lists])
print(item1a)

# 2b. this time
item1b = np.array(lists)[:, PICKUP_INDEX:PICKUP_INDEX+1].flatten()
print(item1b)
```

```shell-session
$ python3 extractArray_180401.py 
[3, 1, 4, 1, 5]
[[3, 1, 4, 1, 5], [3, 1, 4, 1, 5], [3, 1, 4, 1, 5], [3, 1, 4, 1, 5], [3, 1, 4, 1, 5]]
---
[4 4 4 4 4]
[4 4 4 4 4]
```

np.array(lists)[:, 2:2+1]のままでは[[4][4][4][4][4]]のようになる。[4 4 4 4 4]にするため、flatten()を加えている。
https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flatten.html

上記のような実装の場合、内包表記の方が可読性が良さそう。


### 関連

- [Python3 + Numpy > 5列の要素を持つ二次元リストから3列だけ取出す > 思いつき実装 | より良い実装 | 内包表記](https://qiita.com/7of9/items/5dcdfc295f942634b888)


### 謝辞 > よりシンプルな書き方

@shiracamus さんの[コメント](https://qiita.com/7of9/items/ee23d7a4ada181c484ea/#comment-4ae4dd12a1909a55f34c)にて、よりシンプルな書き方を教えていただきました。

情報感謝です。
組込みシステム開発技術研究会(CEST) まとめ 「名古屋のIoTは名古屋のOSで」

CEST
http://www.ertl.jp/CEST/

2004.7.
「自動車業界のCコーディング標準 MISRA-Cについて」

MISRA C まとめ #include 
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9
どうやって MISRA Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

2007.6.13
組み込みLinux研修の概要とPOSIX、GCC　TestSuiteについて, 小川清（名古屋市工業研究所）

2009.3.19
斉藤直希氏（名古屋市工業研究所）
最小の機能セットをもつカーネルの検討について

Dockerどっかー使い方おかしかったんでしょうか。TOPPERS/SSP on RaspberryPi with Macintosh編：９つの関門
https://qiita.com/kaizen_nagoya/items/cbf40186ae4da48ec4c7

日時: 2011年3月22日（火）
渡部謹二氏(名古屋工業研究所)
話題：画像処理研究会の取り組み

日時: 2011年9月28日（金）
場所: ウインクあいち 907会議室
話題提供者：松浦光洋氏（個人会員）
話題：RXマイコンでオリジナルMP3プレーヤを作ろう――雑誌付属基板を使って楽しく電子工作！

日時: 2012年6月20日（水）18:30 ～ 21:00
場所: 豊橋商工会議所
話題提供者：小川清（名古屋市工業研究所）
話題：HAZOP
ちょけねこ　たんじょうびのおくりもの　
https://qiita.com/kaizen_nagoya/items/fc9675686c229f7a155e
効率的なHAZOPの進め方
https://qiita.com/kaizen_nagoya/items/2b8eae196945b7976446


日時：2013年6月25日（火）18:30～21:00
場所：豊橋商工会議所
話題提供者：松浦光洋氏(個人会員）
話題：オープンソースの組込み開発環境 .NET MicroFrameworkを使って雑誌付録の富

2014年2月18日（火）18:30～21:00
場所：ウインクあいち
話題提供者：小川清（名古屋市工業研究所）
話題：MISRA－C：2012で楽しいCプログラミング
MISRA C まとめ #include 
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9
どうやって MISRA Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00


2014年8月26日（火）18:30-21:00
場所：ウインクあいち
話題提供者：小川清（名古屋市工業研究所）
話題：TOPPERS/sspカーネルソース勉強会の進捗、成果と今後

# Reference
名古屋のIoTは名古屋のOSで Raspberry PI & TOPPERS
https://qiita.com/kaizen_nagoya/items/4c46153324a8081fe18c
TOPPERS/SSPカーネルソース四段活用。落とし方、読み方、コンパイルの仕方、アプリの作り方　７つの壁
https://qiita.com/kaizen_nagoya/items/cdce810943ba063efc47
TOPPERS/SSPカーネルソース勉強会(0) docker, build_ssp.sh, build_ssp_ruby.sh
https://qiita.com/kaizen_nagoya/items/20e382d58c6dd0e40534
TOPPERS/SSPカーネルソース勉強会(1) start.S
https://qiita.com/kaizen_nagoya/items/fa0d482bfaacf37dbe62

物理記事　上位100
https://qiita.com/kaizen_nagoya/items/66e90fe31fbe3facc6ff

数学関連記事１００
https://qiita.com/kaizen_nagoya/items/d8dadb49a6397e854c6d

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

医工連携関連記事一覧
https://qiita.com/kaizen_nagoya/items/6ab51c12ba51bc260a82

通信記事１００
https://qiita.com/kaizen_nagoya/items/1d67de5e1cd207b05ef7

自動車　記事　１００
https://qiita.com/kaizen_nagoya/items/f7f0b9ab36569ad409c5
<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
### 文書履歴(document history)
ver. 0.01 初稿 　20180401
ver. 0.02 ありがとう追記　20230513
## 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
PyMieScatt > MatrixElements() > Equation of S11, S12, S33, S34

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

### Reference

- Bohren C.F. and D. R. Huffman, "Absorption and Scattering of Light by Small Particles", John Wiley, New York, NY (1983)
- PDF: [MATLAB Functions for Mie Scattering and Absorption, Research Report No. 2002-08, June 2002](https://omlc.org/software/mie/maetzlermie/Maetzler2002.pdf) by Christian Mätzler

### Equation of S11, S12, S33, S34

MatrixElements()という関数で使うS11, S12, S33, S34の実装と式の説明。

https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py#L378
http://pymiescatt.readthedocs.io/en/latest/forward.html#MatrixElements

S33に関して式の説明の方が間違っている。

Bohren and Huffman (1983)
p112
Eq. (4.77)

```math
S_{33} = \frac{1}{2}(S^*_2 S_1 + S_2 S^*_1),
```

http://pymiescatt.readthedocs.io/en/latest/forward.html#MatrixElements
では初項のS_1についてもcomplex conjugateを取ってしまっている。

膨大なuser's guideを一人で作っているので、こういう間違いはあるだろう。
また連絡しておこう。


### 訂正された
(追記　2018/04/08)

上記の間違いは訂正された。
RMagickで文字を傾いた文字を描画する方法

# この記事について
RMagickを使って傾いた文字を描画しようとしたときに軽くハマったので忘れぬようにメモ

# 傾いた文字の描画方法
文字を描画するにはDrawクラスの`text`か`annotate`を使うが、それに傾きを入れるとそれぞれ傾かせるために使うメソッド、プロパティが異なるので両方解説

## text メソッドを使う場合
https://rmagick.github.io/rotate.rb.html のコードを拝借して必要箇所のみ抜粋

ポイント

* 座標系を回転させて描画時の文字を回転させる
* `RMagick::Draw#rotate` メソッドで回転させる

```rotate_text.rb
require 'RMagick'

imgl = Magick::ImageList.new
# 200x200 で画像を準備しつつ、わかりやすいように薄い色でグリッドを描画しとく
imgl.new_image(200, 200, Magick::HatchFill.new('white','lightcyan2'))

gc = Magick::Draw.new

# 座標系の原点を左上から中央に移動
gc.translate(100, 100)

# 45度回転（時計回り方向に）
gc.rotate(45)

# 文字を描画
gc.fill('black') # 見やすいように黒で

gc.text(0, 0, "Hello")
gc.text(100, 0, "100,0")
gc.text(-100, 0, "-100,0")

gc.draw(imgl)

imgl.write("png32:rotate.png") # ファイルに書き出し
```

## annotate メソッドを使う場合
* `RMagick::Draw#annotate` メソッドのブロック内のプロパティ `rotation` で回転させる

```rotate_annotate.rb
require 'RMagick'

imgl = Magick::ImageList.new
# 200x200 で画像を準備しつつ、わかりやすいように薄い色でグリッドを描画しとく
imgl.new_image(200, 200, Magick::HatchFill.new('white','lightcyan2'))

gc = Magick::Draw.new

# 座標系の原点を左上から中央に移動（annotateメソッドはtranslateの影響を受けないので↓は実は無意味）
gc.translate(100, 100)

# 45度回転（時計回り方向に）（このrotateも無意味）
gc.rotate(45)

# 文字を描画
# translateで移動した座標系の影響を受けないので中心の位置に描画できるように100,100を指定
gc.annotate(imgl,0,0,100,100,'Hello') do
  self.fill = 'black' # 見やすいように黒で
  self.rotation = '45'
end
# 元の座標系の100,0の位置に描画される
gc.annotate(imgl,0,0,100,0,'100,0') do
  self.fill = 'black' # 見やすいように黒で
  self.rotation = '45'
end
# 元の座標系の-100,0の位置に描画されるが、画像の外なので見えない
gc.annotate(imgl,0,0,-100,0,'-100,0') do
  self.fill = 'black' # 見やすいように黒で
  self.rotation = '45'
end

gc.draw(imgl)

imgl.write("png32:rotate.png") # ファイルに書き出し
```

# はまりポイント
* もともと文字描画に `annotate` を使い慣れていると
    * `rotate` メソッドが効かないので何で？って思う
    * 座標系を移動したり回転しても `annotate` に影響が出ない
    * `annotate` のブロック内は `rotate` メソッドではなく `rotation` プロパティなので間違えやすい
    * 最新のドキュメントに詳しい記載が無い
        * http://www.rubydoc.info/gems/rmagick/Magick/Draw#annotate-instance_method
        * ↑に `- Additional Draw attribute methods may be called in the optional block, which is executed in the context of an Draw object.` とあるが "Additional Draw attribute" がどれのことなのか詳しく書いてない :cry: 
    * 昔のドキュメントには記載あるけど
        * http://www.simplesystems.org/RMagick/doc/draw.html#annotate
Array splice same function

### Attention the return value;
```js
let data=['a','b','c','d','e'];
//splice NO chain array; return value NO self.
//
//data.splice(0,0,'f'); //unshift//f a b c d e
//data.splice(data.length,0,'f');//same push// a b c d e f

//if(~data.indexOf('c'))
//data.splice(data.indexOf('c'),1,'f');//replace c->f//a b f d e

//if(~data.indexOf('c'))
//data.splice(data.indexOf('c'),0,'f');//before push//a b f c d e

//if(~data.indexOf('c'))
//data.splice(data.indexOf('c')+1,0,'f');//after push//a b c f d e
;
data.splice(data.indexOf('c'),1);//remove me
console.log(data)
```
### [].splice(target_number,change_count,target_data)
spliceは破壊的なので、データ自体が更新対象の場合に多用する機会が多い。splice一つでおおよその配列操作を完了させることが出来る。

```html
<script type="text/plain" name="cheat-sheet">
let data=['a','b','c','d','e'];
//splice NO chain array; return value NO self.
//[].splice(target_number,change_count,target_data)
//data.splice(0,0,'f'); //unshift//f a b c d e //parent.prependTo
//data.splice(data.length,0,'f');//same push// a b c d e f //parent.appendTo
//if(~data.indexOf('c')) data.splice(data.indexOf('c'),1,'f');//replace c->f//a b f d e// element.replace 
//if(~data.indexOf('c')) data.splice(data.indexOf('c'),0,'f');//before push//a b f c d e// prepend siblingsTo
//if(~data.indexOf('c')) data.splice(data.indexOf('c')+1,0,'f');//after push//a b c f d e// siblingsTo
//if(~data.indexOf('c'))
data.splice(data.indexOf('c'),1);//remove me
console.log(data)
</script>
```