OmniAICreator/Qiita-1.07M huggingface dataset:
Udemyのコース「【作りながら覚える！】 Ruby on Rails を用いたウェブ開発(Airbnbを作ろう！) 」を学ぶ。part 3-6,7

Udemyの[こちらのコース](https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjBu4a35bfXAhXQ16QKHfxQCvIQFggyMAE&url=https%3A%2F%2Fwww.udemy.com%2Fruby-on-rails-g%2F&usg=AOvVaw2zf_7hwBdtTsJHjjVy_0-6)を受けながら、疑問に思ったこと、調べた結果、大事なことをまとめていきます。

#part3-6 プロフィール内容を編集するページを作成

user/edit に飛ぶとこのような画面になる。
<img width="526" alt="スクリーンショット 2017-11-14 13.58.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/163321/2281fc5a-65c6-ef86-2afd-7e308f9c1f0f.png">
現在のパスワードを入れないと変更できない仕様なので、これは面倒臭いということで変更する。

「devise edit without password」でググってみる。

[ここにしたがってやる。](https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password)

##editをコピペし、モデルを追加。
[こちらの記事がわかりやすい。](https://qiita.com/zaru/items/cde2c46b6126867a1a64)

    rails g migration AddExtraFieldsToUser phone_number:string description:string

とすると、Userデータベースに新しいカラムを追加できる。

##入力しても保存されないとき。

ストロングパラメーターというのを使う。これは、簡単にいうとDBに値を入れ、不正を防ぐもの。

[ここ](https://github.com/plataformatec/devise)にストロングパラメーターのdeviseにおける導入方法がある。

    
    class ApplicationController < ActionController::Base
      before_action :configure_permitted_parameters, if: :devise_controller?
    
      protected

      def configure_permitted_parameters
        devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
      end
    end

上のコードがサンプル。今回は、このように変える。

    class ApplicationController < ActionController::Base
      before_action :configure_permitted_parameters, if: :devise_controller?
    
      protected

      def configure_permitted_parameters
        devise_parameter_sanitizer.permit(:account_update, keys: [:name,:email,:phone_number,:description])
      end
    end

#自己課題
- 上記をやる
- プロフィール編集ページをnavbarに追加。


#part3-7 再びプロフィールページを編集

##登録済み情報にチェックを入れる。

このコードをshow.html.erbの上に書く。

    <script type="text/javascript">
      $(function(){
        <% if !(@user.email.blank?) %>
          $("#ver-email").attr("class","verification-checked");
        <% end %>
      });
    </script>

これは、emailに値があれば、verification-checkedというクラスを追加するということ。

javascriptのコードが間違っててもエラーは出ないから注意です。

#自己課題
- 情報が登録されていたらチェックマークが入るようにする。
HAProxyを使ってみた

## 最小設定

```rb:haproxy.cfg
# 数値の単位はミリ秒 (1秒=1000)
defaults
    timeout connect 5s # リトライまでの待ち時間
    timeout client  5s # クライアントとの間のタイムアウト時間
    timeout server  50s # サーバーとの間のタイムアウト時間

frontend  web_proxy
    bind *:80
    use_backend web

# 転送先のサーバー定義
backend web
    # ロードバランスのアルゴリズムを指定
    balance roundrobin
    # checkを付けることでhealthチェックをしてくれる
    server web1 192.168.100.11:80 check inter 2s
    server web2 192.168.100.12:80 check inter 2s
    # 
    # forwardforをするにはmode httpである必要がある。
    mode http
    # 接続元のIPアドレスがログでわかるようにheader追加
    option forwardfor
```

```sh:run.sh
docker run -it --rm \
 -v $(pwd)/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \
 -p 8080:80 \
 haproxy:alpine
```

http://localhost:8080 にアクセスすると
192.168.100.11:80、192.168.100.12:80
どちらかの表示が出ることを確認。


## ドメイン名でサーバー振り分け

```rb:haproxy.cfg
defaults
    timeout connect 5s # リトライまでの待ち時間
    timeout client  5s # クライアントとの間のタイムアウト時間
    timeout server  50s # サーバーとの間のタイムアウト時間

frontend web_proxy
    bind *:80
    #
    acl is_dev hdr_dom(host) -i dev
    use_backend dev if is_dev
    #
    acl is_staging hdr_dom(host) -i staging
    use_backend staging if is_staging

backend dev
    server web 192.168.100.11:80 check inter 2s
backend staging
    server web 192.168.100.12:80 check inter 2s
```

接続元でhostsにdev, stagingのIPアドレスをHAProxyのIPに指定すると
1つのIPでバックエンドの振り分けをしてくれる。
hdrはヘッダーの略っぽい

## IPで振り分け

* [Haproxy 運用の思いつきメモ | work.log](https://worklog.be/archives/2728)

```sh:dstで指定
acl is_srv1 dst 192.168.0.1
acl is_srv2 dst 192.168.0.2
acl is_srv3 dst 192.168.0.3
```

## Basic認証のユーザー別にバックエンドを振り分け

* [suz-lab - blog: HAProxyでBasic認証のユーザー別にバックエンドサーバを振り分ける](http://blog.suz-lab.com/2013/03/haproxybasic.html)

userlistを用いる。

## webサーバー側で接続元のIPアドレスがログでわかるように

### apacheの場合

`%h` にはロードバランサーのIPアドレスが記録される。
`%{X-Forwarded-For}i`には接続元のIPアドレスが記録される。

```diff:/etc/apache2/httpd.conf
- LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
+ LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
```

### nginxの場合 

HAproxyのIPを192.168.100.2とする。

```diff:/etc/nginx/nginx.conf
  # set_real_ip_from   192.168.100.2;
+ set_real_ip_from   192.168.100.0/24;
+ real_ip_header     X-Forwarded-For;
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
```


## 参考

* [WebSocket(node + socket.io)をstunnel + HAProxyでプロキシする - その2 - HAProxyの設定 - hrendohの日記](http://d.hatena.ne.jp/hrendoh/20120420/1334906858)
* [remote_addrとかx-forwarded-forとかx-real-ipとか - Carpe Diem](http://christina04.hatenablog.com/entry/2016/10/25/190000)
* [HAProxyでマルチドメインを処理する | work.log](https://worklog.be/archives/2058)
MATLAB > 実装 > 二次元arrayを10回シャッフルする

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
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)
```

### 参考

[MATLAB > random > 整数の乱数を得る > X = round(rand()*100)](https://qiita.com/7of9/items/1c3136e280ebd76d6415)
[MATLAB > array > サイズを得る > [ len1, len2 ] = size(tri)](https://qiita.com/7of9/items/488a40ceefba41ef1960)

### code

```matlab:shuffle_171115.m
% v0.1 Nov. 15, 2017
%    - shuffle 10 times

function shuffle_171115(tri)
    [len1, len2] = size(tri);
    for loop = 1:10
        % get index of [1:N-1]
        pos = round(rand()* (len1 - 2)) + 1;
        % swap
        tri([pos pos+1],:) = tri([pos+1 pos],:)
    end
```

```matlab
>> tri = [ 1 1 1; 2 2 2; ];
>> shuffle_171115(tri)

tri =

     2     2     2
     1     1     1


tri =

     1     1     1
     2     2     2
(後略)
```
MATLAB > array > サイズを得る > [ len1, len2 ] = size(tri)

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
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)
```

### 参考

[size](https://jp.mathworks.com/help/matlab/ref/size.html)

### code

各次元のサイズを得ることができる。

```matlab
>> tri = [ 1 2 3; 4 5 6;];
>> [len1, len2] = size(tri)

len1 =

     2


len2 =

     3
```
SpringBootActuatorを試してみる

## SpringActuatorとは

- アプリの稼働状況などの情報を返すエンドポイントを勝手に作ってくれる

## 使い方

- mavenの場合

```xml:pom.xml
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
```

- gradleの場合

```groovy:build.gradle
dependencies {
    compile("org.springframework.boot:spring-boot-starter-actuator")
}
```

## 動作確認

- アプリを起動して以下にアクセス
- http://localhost:8080/health

<img width="344" alt="スクリーンショット 2017-11-15 7.53.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/2da30120-07d9-ee76-1053-5075dd31d4f1.png">

## いろいろなエンドポイント
 
- アクセスできるエンドポイントはいろいろある
- https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html#production-ready-endpoints
- 表の中でSensitiveがtrueのものはSpringSecurityの認証を通っていないと見ることができないのでそのままでは401が返る
- <img width="435" alt="スクリーンショット 2017-11-15 7.57.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/b8eb1d2d-d329-4001-3bce-d49da401083b.png">

## 公開設定の変更

- 認証済みでないと公開しないかどうかは設定で変更できる
- sensitiveをtrueにすると認証が必要になり、falseにすると必要なくなる

```properties:application.properties
endpoints.sensitive=false # 全エンドポイントまとめて指定する
endpoints.info.sensitive=false # 個別に指定する場合はこんな感じ
```

- 各エンドポイントの有効無効の設定もできるので不要なものは閉じておくとよい
- 設定のしかたはsensitiveと同じ感じ

```properties:application.properties
endpoints.enabled=false  # 全エンドポイントまとめて指定する
endpoints.info.enabled=false  # 個別に指定する場合はこんな感じ
```
- SpringSecurityとの連動を解除することもできる

```properties:application.properties
management.security.enabled=false
```
MATLAB > random > 整数の乱数を得る > X = round(rand()*100)

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
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)
```

整数の乱数を得るには。

### 参考

- [rand](https://jp.mathworks.com/help/matlab/ref/rand.html)
- [round](https://jp.mathworks.com/help/matlab/ref/round.html)

```matlab
>> X = round(rand()*100)

X =

    77
```
【Git】clone〜pushまで

# 概要
sourcetreeを利用してローカルのリポジトリを管理していました。
そのため、CUIで行うリポジトリの管理を忘れてしまったため、備忘として記載します。

# 手順
① cloneする。または、ローカルリポジトリを作成する。

```
$ git clone https://xxx.git
```
or

```
$ mkdir xxx
$ cd xxx
$ git init
```

② はじめのcommitをする。

```
$ cd xxx (<- cloneした場合のみ)
$ git add .
$ git commit -m "First commit."
```

③ remoteにリモートリポジトリを追加する。

```
$ git remote add origin https://*******
$ git remote -v
```

④ リモートリポジトリにpushする。

```
$ git push origin master
```
Railsアプリをherokuで使用するための第一歩

# 概要
Railsアプリをローカルで開発していましたが、利便性などを考えてherokuを利用してみようと考えました。

# 手順
① herokuをアカウント作成する。

② heroku toolbeltをインストールする。

③ herokuへログインする。
アカウント作成時に指定した、メールアドレス、パスワードを入力する。

```
$ heroku login
Enter your Heroku credentials.
Email: example@example.com
Password (typing will be hidden):
Authentication successful.
```

④ herokuアプリを作成する。

```
$ heroku create
Creating app... done, stack is cedar-14
https://xxxxxxxxxx.herokuapp.com/ | https://git.heroku.com/xxxxxxxxxx.git
```

⑤ ローカルのリポジトリをpushする。

```
$ git remote add heroku https://git.heroku.com/xxxxxxxxxx.git
$ git push heroku master
```

⑥ RailsアプリのDBをmigrateする。

```
$ heroku run rake db:migrate
```

⑥ herokuのURLにアクセスする。

```
https://xxxxxxxxxx.herokuapp.com
```
SharePoint リスト の 内部名 などを Power Query で調べるには

SharePoint リストの 列の設定で InternalName(内部名)を使うとか、取得できたリストの列名がEntityPropertyName になっているとか、その都度調べるのはちょっと面倒なので Power Query で一覧として調べる手順。複雑な手順はないのだけど、プライマリキーを設定するの大事。

# きっかけ
[SharePoint Online モダン リストの Column formatting を試してみた | idea.toString();
](http://idea.tostring.jp/?p=3163)
内部名、、、ですよね。

# では、Excel から
## OData Feed
![1.png](https://qiita-image-store.s3.amazonaws.com/0/193509/18caac85-1329-144f-766e-d8375fcaefd6.png)
コネクターは OData Feed
URL は https://○○○○.sharepoint.com/_api/web/lists/
この場合、SharePoint Online のルートサイトに配置された SharePoint リストの情報を取得
サインインのことはここでは触れない

## 必ずクエリ エディターに
 ![2.png](https://qiita-image-store.s3.amazonaws.com/0/193509/793cc8de-1351-ecdc-2f64-86721ec46cba.png)
[編集] で クエリ エディターに

## リスト情報のプレビュー
![3.png](https://qiita-image-store.s3.amazonaws.com/0/193509/590d7538-3fde-7233-5a7d-b737c73ec4e2.png)
SharePoint リストに関する情報がプレビューできる

## 必要最小限の列に整理
![4.png](https://qiita-image-store.s3.amazonaws.com/0/193509/de8f2239-6984-d857-0363-f536cd62e1c9.png)
列が多いので整理した
Id：超大事 / Title：これがないとわからない / Fields：ここに列に関する情報がある

## プライマリキーの設定
![5.png](https://qiita-image-store.s3.amazonaws.com/0/193509/0d49747f-c82a-2558-6dd9-c2029c12ed5e.png)
SharePoint リストのタイトル(Title) は変更される可能性があるから、"Id" 列を プライマリキーを設定

一度しか調べないか都度作業するならプライマリキー設定をしなくても構わないはず

## 展開
![6.png](https://qiita-image-store.s3.amazonaws.com/0/193509/fea5ac92-4d65-3cd1-44ac-88c927e35167.png)
"Title" 列を確認して、意中のSharePoint リストを選択
"Fields" 列は リンクになっているのでテーブルを展開

## 展開した結果
![7.png](https://qiita-image-store.s3.amazonaws.com/0/193509/a346e15b-0b60-c2db-d8a0-9b85123bfa82.png)
プライマリキーに設定した "Id" 列が使用された行選択がされ 該当する "Fields" が展開される

## 完成
![8.png](https://qiita-image-store.s3.amazonaws.com/0/193509/7feb3eb6-0f34-297f-3b9c-13e8882d558d.png)
今回必要だった、Id , Title, InternalName, EntityPropertyName だけを選択
以下、ロードするなどご自由に。

## データ型などは
列のデータ型など、ほかも調べるなら"SchemaXml" も参照すればよい。XML でパースし意中のプロパティ値を抽出する感じで。

# その他
- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)
unlinkコマンドは使い方に注意しないといけない危険なコマンド

unlinkに関して勘違いをしていたのでメモ.

シンボリックリンクを貼る際に使うコマンドln. 第一引数にリンク元,第二引数に作成するリンクを指定する.

```
$ ln -s hoge fuga
$ ls -n
total 8
lrwxr-xr-x  1 user  staff  4 11 15 01:36 fuga -> hoge
-rw-r--r--  1 user  staff  0 11 15 01:36 hoge
```
上記のコマンドによってhogeのシンボリックリンクfugaを作成.

そして、コマンドunlinkはシンボリックリンクを削除するために用いるコマンド.

```
$ unlink fuga
```
このようにシンボリックリンクを削除する.

今回私は間違って、

```
$ unlink hoge
```
のようにリンク元を引数に指定してしまった。
その後、改めてリンク先を指定し、もう一度シンボリックリンクを貼ろうとすると、hogeが無いとエラーが発生.
確認してみるとたしかにhogeがなくなっている...

あれ？unlinkってリンク以外も削除しちゃうの？
unlinkの説明を見てみると、

```
NAME
     rm, unlink -- remove directory entries

SYNOPSIS
     rm [-dfiPRrvW] file ...
     unlink file
.
.
```

つまり、**オプションを指定しないrmと動作は同じ.**

これからはunlinkの使い方に気をつけたい.
Angularでprettierを使ってみた

JavaScriptのフォーマッタのprettierをAngluarプロジェクトで使ってみた際にやったことをメモしておきます。

prettierとは?とかの話は、以下のQiita記事にわかりやすい解説がされていました。
[prettierの使い方](https://qiita.com/kiida/items/405bb07c4b52bfee0219)

# 前提

次のバージョンのangluar-cliで`ng new`したプロジェクトで確認を行いました。

```bash
$ ng -v
@angular/cli: 1.4.9
node: 8.8.1
os: darwin x64
```
また、TSLintの設定も`ng new`した初期状態から変更はなしです。

# 手順

今回はnpm scriptでローカルインストールしたprettierをコマンドラインから実行してプロジェクト内の.tsファイルをフォーマットしてみます。

## インストール

ひとまずプロジェクトにprettierをインストールします。(今回はnpmを使用)

```bash
$ npm install --save-dev prettier 
```

## prettierの設定

package.jsonのscriptsに以下の行を追加

```json
"prettier": "prettier --parser typescript --single-quote --write \"./**/*.ts\""
```

まずは、prettierにTypeScriptを指定。
`--single-quote`オプションを付けて実行するよう設定しています。これは、angluar-cliで作成したプロジェクトのTSLintオプションにquotemark:singleが設定されており、これとのコンフリクトを防ぐためです。

```json:package.json
{
  "name": "tiqav-angular-frontend",
  "version": "0.0.1",
  "license": "MIT",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "prettier": "prettier --parser typescript --single-quote --write \"./**/*.ts\""
  },
...
```

## 試してみる

プロジェクトルートディレクトリで次のコマンドを実行

```bash
$ npm run prettier
```

フォーマット結果がファイルに反映されるはず。
更に詳しくフォーマット設定する場合は、フォーマットルールをnpm 
 scriptに直接オプションを記述するのではなく`prettier.config.js`などの設定ファイルに記述するのがよいかと思います。

# その他

TSLintとPrettierの設定のコンフリクトを防ぐためのプラグインもあるらしい。
https://github.com/ikatyang/tslint-plugin-prettier
https://github.com/alexjoverm/tslint-config-prettier

# 参考

https://github.com/prettier/prettier/issues/13
[Ionic]ion-contentのスクロールを止める方法


ion-contentは、ion-header、ion-footerのheightを考慮して表示領域を調整してくれて、しかもscroll設定までつきます。非常に便利です。
が、しかし、スクロールさせたくない画面が出てきた時、止め方がわかりませんでした。そこで、公式フォーラムとかStackOverflowとかでscrollを止める方法を調べたら色々あったのでまとめます。


# 私的な結論

no-bounceを使うのが良さそうな気がする


# ion-contentを使わない

ion-headerもion-footerもないようなページならそもそもion-contentを使わないのもありだと思います。


````html
<div class="fullscreen">
</div>
````

````css
.fullscreen{
    background-color: #fff;
	position: absolute;
	top: 0px;
	right: 0px;
	left: 0px;
	bottom: 0px;
	width: 100%;
	height: 100%;
}
````

ただし、この場合、ページ遷移時にion-navbarに自動的に「戻るボタン」が表示される恩恵が得られないので自分で戻るボタンを配置する必要があります。

また、ion-header、ion-footerを付けた場合、ion-contentのように表示領域の自動調整がないため、paddingなどでdivタグ内の要素とion-header、ion-footerがかぶらないように調節する必要がありそうです。


# CSSで止める

CSSでion-contentのscroll設定を止める方法です。具体的には以下のコードのような感じです。


````scss
.scroll-content{
    overflow: hidden;
}
````

ただし、scroll-contentというクラス名は、ion-scrollにも使用されているようなので、そちらもスクロールできなくなります。ion-scroll使わないならこの方法でも良いかもしれません。


# ion-fixedで止める

StackOverflowで見ました。ion-fixedを付けたdivタグで囲ってしまう方法です。この方法なら、ion-header、ion-footerを付けた時のサイズ自動調整の恩恵を受けつつ、スクロールを止めることが出来ると思います。

````html
<ion-content>
	<div ion-fixed>		
	</div>
</ion-content>
````

ちなみに、Chromeでion-fixedの中身を見てみたら下のCSSが適用されていました。

````css
.fixed-content{
	left: 0;
	right: 0;
	top: 0;
	bottom: 0;
	position: absolute;
	display: block;
}
````


さらに見てみるとion-fixedは自動的にfixed-content内に配下されるようで、固定したい領域とスクロールしたい領域を手軽に分けることが可能っぽいです。

````html
<ion-content>
	<div ion-fixed>
	 test1← fixed-content内		
	</div>
	<div>
	test ← scroll-content内
	</div>
</ion-content>
````

参考画像
![Screen Shot 2017-11-15 at 0.52.05.png](https://qiita-image-store.s3.amazonaws.com/0/165335/867c96c0-3f6c-c9f2-2ae4-46e58ae5655d.png "Screen Shot 2017-11-15 at 0.52.05.png")




# まとめ

私は、今までion-content使わない＆CSSで止める策を使ってきましたが、今回調べてみて他にも方法があることがわかったので今度、実践でも使ってみようかと思います。



# 番外編？no-bounce

初めて、その存在を知りましたが、ion-contentにno-bounceをつける方法もありそうです。
この属性をつけると、ion-contentの表示領域内だとスクロールしない。表示領域を超えるとスクロールするようになるといった動作になります。


````html
<ion-content no-bounce>
</ion-content>
````

厳密には、scrollを止めているわけではないので、番外編としましたが、スクロールを止めたいユースケースのほとんどはiOSのバウンススクロールが原因だと思うので、これが一番よいんじゃないかという気がします。
Python2.7でPyMySQLを使用してSQLを実行する

# 今回のお題
一部通知用のデータをとりあえずMySQLに溜め込もうかなと思いますので、
MySQLにSELECTしてみて、結果を取れればと思います。

# 簡単なテーブルの作成
とりあえずブログを書く人を順番に指名してSlackに通知するが最終目標なので、
仮で下記のような構造のテーブルを作ります。
テーブル名:test

| id | name | target_flag |
|:-:|:-:|:-:|
| 1  | Aさん  | 1  |
| 2  | Bさん  | 1  |
| 3  | Cさん  | 1  |
| 4  | Dさん  | 0  |
| 5  | Eさん  | 1  |

idはPK、nameは仮の名前、target_flagはこの処理の対象者か否かです（1が対象者)
こちらのテーブルにアクセスし、target_flag=1のデータだけ取得します。

# PyMySQLでのアクセスを試してみる
[Anaconda(python)からMySQLを使う
](https://qiita.com/zaburo/items/55347181be742b5109ea)
こちらを参考にさせていただきました。
書き方は違いますが、やってることが一緒ですね。

```mysql.py
# -*- coding: utf-8 -*-
# # モジュール読み込み
import pymysql.cursors

def lambda_handler(event, context):
    # MySQLに接続する
    conn = pymysql.connect(host='ホスト',
                                user='ユーザ名',
                                password='パスワード',
                                db='DB名',
                                charset='utf8',
                                cursorclass=pymysql.cursors.DictCursor)
    # select
    # SQLを実行する
    cursor = conn.cursor()
    sql = "SELECT * FROM test WHERE target_flag = 1"
    cursor.execute(sql)

    # Select結果を取り出す
    rets = cursor.fetchall()
    for r in rets:
        print(r)

    # MySQLから切断する
    conn.close()
```

実行すると、下記の状態で出力されましたので無事に取れているかと思います。

```
{u'target_flag': 1, u'id': 1, u'name': u'A\u3055\u3093'}
{u'target_flag': 1, u'id': 2, u'name': u'B\u3055\u3093'}
{u'target_flag': 1, u'id': 3, u'name': u'C\u3055\u3093'}
{u'target_flag': 1, u'id': 5, u'name': u'E\u3055\u3093'}
```

ちなみに、**cursorclass=pymysql.cursors.DictCursor**を外すと、結果は下記になります。

```
{1, 1, u'A\u3055\u3093'}
{1, 2, u'B\u3055\u3093'}
{1, 3, u'C\u3055\u3093'}
{1, 5, u'E\u3055\u3093'}
```

アクセスの仕方が変わるので、、**cursorclass=pymysql.cursors.DictCursor**は付けたほうが良いと思います！


## 今回ハマったこと
上記のソースなんですが、１回目は正常に取れましたが、２度目からコンソールに何も出力されない事象が起きました。
そこで、改めてソースを見直して、これか？と思う箇所を直して見ました。

```mysql.py
# -*- coding: utf-8 -*-
# # モジュール読み込み
import pymysql.cursors

def lambda_handler(event, context):
    # MySQLに接続する
    conn = pymysql.connect(host='ホスト',
                                user='ユーザ名',
                                password='パスワード',
                                db='DB名',
                                charset='utf8',
                                cursorclass=pymysql.cursors.DictCursor)
    # select
    # SQLを実行する
    cursor = conn.cursor()
    sql = "SELECT * FROM test WHERE target_flag = 1"
    cursor.execute(sql)

    # Select結果を取り出す
    rets = cursor.fetchall()
    for r in rets:
        print(r)
    # cursorを閉じる
    cursor.close()

    # MySQLから切断する
    conn.close()
```

そうです。CURSORのクローズをしていませんでした・・・今一ここでいうCURSORがどういったものか理解できてませんが、１回目の実行結果をfeatchallで全部取得→全て読み込み終える→closeしてないのでメモリ上残っている？→２回目以降も同じ箇所の読み取りなので、メモリ情報変わらず？
なんでしょうか・・・？ちょっとこの辺りが気になるので、落ち着いたら調べたり・色々試したりしたいですね。

## INSERTやUPDATE、DELETEについて
これはまぁ、単純にSQL文を書いて実行し、最後にcommitするだけでした。

```
    cursor = conn.cursor()
    sql = "DELETE * FROM test WHERE target_flag = 0"
    cursor.execute(sql)
    conn.commit()
```
動的ページ遷移のGoogle Analyticsについて

新旧でアナリティクスのコードがプロジェクトで混在してきたのでメモ。
Ajax等でアナリティクスがうまくトラッキングされない際に以下のコードを遷移時に実行させる

公式ドキュメントのまんまですが

# analytics.js 

```html
<!-- Google Analytics -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-XXXX-Y', 'auto');  // Replace with your property ID.
ga('send', 'pageview');

</script>
<!-- End Google Analytics -->
```
```javascript
ga('send', 'pageview', PATH); // URLが変わったらAPIを実行
```
https://developers.google.com/analytics/devguides/collection/analyticsjs/single-page-applications?hl=ja

# gtag.js

```html
<!-- Global Site Tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=GA_TRACKING_ID"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments)};
  gtag('js', new Date());

  gtag('config', 'GA_TRACKING_ID');
</script>
```
```javascript
gtag('config', 'GA_TRACKING_ID', {'page_path': PATH}); // URLが変わったらAPIを実行
```
https://developers.google.com/analytics/devguides/collection/gtagjs/single-page-applications
Angular 入門ノート

# CLI
#### 1. 新しいプロジェクトを生成:

```
ng new PROJECT-NAME
```

#### 2.Run local server:

```
ng serve
```

ポートを指定したい場合：

```
ng serve --host 0.0.0.0 --port 4201
```

#### 3.新しいコンポネントを生成：

```
ng g c COMPONENT-NAME
//Other: ng generate directive|pipe|service|class|guard|interface|enum|module

```

デフォルトで spec ファイルの追加を無効

```
ng set defaults.class.spec=false
ng set defaults.component.spec=false
```

# Binding
#### Interpolation

```
<h2>{{ title }}</h2>
```

#### Property Binding

```
<image [src]="imageUrl" />
```

#### Attribute Binding

```
<td [attr.colspan]="colspan"></td>
```

#### Class Binding

```
<button class="btn btn-primary" [class.active]="isActive"></button>
```
同期回路とFPGA

# 目的

[同期回路とVerilog](https://qiita.com/junjihashimoto@github/items/38acb9513e26f93e5179)の続編、組み合わせ回路と順序回路といった単純な論理回路でなく実デバイスとしてのFPGAとその特徴を述べる。

# FPGAとは

FPGAは内部にDFFと下記のような4入力1出力のLUT（Look up tableというメモリのようなもので入出力の数はものによってことなる）をペアにした回路を多数持ち、起動時に内部もしくは外部のROMからLUTの構成を読み取り動作する。

![LUT](http://www.ni.com/cms/images/devzone/tut/16.jpg)

[FPGAの説明の参考資料](http://www.ni.com/white-paper/6983/ja/)

すべてLUTで回路を構成するのでなく、下記のものはもともと搭載されている回路を使用する。

* 乗算器
* メモリ（RAM)
* クロックツリー
* PLL（入力クロックからクロックを生成する回路）

メモリは自動で割り当てられない場合が多いのでFPGA提供会社のマクロ（搭載されている回路をラップしたもの）を使用する。

チップの外部とデータのやりとりをするため、FPGAには優秀なIOが備わっていることが多い。
下記の項目や目的に応じて、データシートをみてLVTTLやLVCMOSなどを選択する。([参考資料](http://www.altima.jp/column/fpga_edison/io_std.html))

* 電流
* 電圧
* オープンドレイン
* 入力・出力・ハイインピーの切り替え
「PyCharm の auto-test が地味に便利」を初心者が試してみた

[PyCharm の auto-test が地味に便利](https://qiita.com/tag1216/items/52f5a9c9e586e163e642)を初心者が試してみた。
なるほど理解。


- Create New Projectからtesttestプロジェクトを作成

Location: C:\Users\ymko\PycharmProjects\testtest
interpreter: python3.6.1とか

でCreateをクリック

- testtestの下にp.pyを作成

```p.py
class azurlane(object):
    def favorite_chara(self):
        return 'unicorn'
```

- testtestの下にtestsフォルダを作成

p.pyのエディタ画面に戻り、`class azurlane`のところにカーソルを合わせて右クリック。
`Go to`の`test`をクリック。
Create New Test...をクリック。

Target directoryをC:/Users/ymko/PycharmProjects/testtest/tests
test_favorite_charaの左側にチェックを入れてOKをクリック

生成されたものにp.pyからclassをインポートしてテスト内容を追加

```test_azurlane.py
from unittest import TestCase

from p import azurlane

class TestAzurlane(TestCase):
    def test_favorite_chara(self):
        a = azurlane()
        self.assertEqual(a.favorite_chara(), 'unicorn')

```

test_azurlane.pyを開いた状態でCtrl+Shift+F10キーを実行するとテストが実行される

左下側のペインに Toggle auto-test のアイコンがあるので有効にする

p.pyを編集するたびに自動テストが走って便利！

# 参考

[Python3のimport・下位/上位階層のモジュールをインポートしたい【import】【Python3】 \- DRYな備忘録](http://otiai10.hatenablog.com/entry/2013/08/13/215034)

[PyCharm の auto\-test が地味に便利 \- Qiita](https://qiita.com/tag1216/items/52f5a9c9e586e163e642)

[PyCharm テストコード自動生成 \- Qiita](https://qiita.com/GushiSnow/items/6fcd9c5ec4f4d2ae0c34)

[Pythonでunittestを実行する（初心者用） \- Qiita](https://qiita.com/takus69/items/cde279266b46daf9972d)

[Creating and running a Python unit test \- PyCharm \- Confluence](https://confluence.jetbrains.com/display/PYH/Creating+and+running+a+Python+unit+test)
Xamarin.FormsでiOS11(iPhone X)対応してみた(SafeArea)

# Xamarin.FormsでiOS11(iPhone X)対応してみた(SafeArea)

Xamarin.Formsを使用したアプリで、iOS11(iPhone X)のレイアウト対応をしてみました。
Xamarin公式ブログの内容になりますが。。。

iPhone Xの実機を持っていないので、シミュレータで確認しています。

## 環境

### PC等

* Windows 10
* Mac Book Air (macOS Sierra)
* Visual Studio 2017 Community
* iPhone X (iOS 11.1)＠シミュレータ

### NuGetパッケージ

* Xamarin.Forms (2.4.0.74863) ★必須

## まずは見てください

### 対応前

画面いっぱいに表示されます。意図的に色をつけています。

![対応前(シミュレータ)](https://qiita-image-store.s3.amazonaws.com/0/203323/fa4b7855-f7d1-4b3d-6c33-4c20017976b0.png)

シミュレータだと分かりにくいため、苦肉の策で画面を写真で撮りました。こうなっています。

![対応前(写真)](https://qiita-image-store.s3.amazonaws.com/0/203323/59bba660-0e09-91d2-f881-e2f573476c1b.jpeg)

画面下部に広告などを表示していると、丸みに沿って広告の右下/左下が欠けるので対応する必要があります。

### 対応後

画面下部や左右に空白が生まれていますね！

![対応後(シミュレータ)](https://qiita-image-store.s3.amazonaws.com/0/203323/89f0abe1-f21e-a775-f4e2-55e367f90535.png)

写真だと分かりやすいです。

![対応後(写真)](https://qiita-image-store.s3.amazonaws.com/0/203323/25f71930-e751-322e-878d-61f37d784470.jpeg)

## ソースコード

大したことはしていません。

`On<Xamarin.Forms.PlatformConfiguration.iOS>().SetUseSafeArea(true);`を書いただけです。

```C#:MainPage.cs
using System.Linq;
using Xamarin.Forms;
using Xamarin.Forms.PlatformConfiguration.iOSSpecific;

namespace XamarinFormsiOS11Sample
{
    public class MainPage : ContentPage
    {
        public MainPage()
        {
            Title = "テスト画面";

            // iOS用のSetUseSafeArea設定
            On<Xamarin.Forms.PlatformConfiguration.iOS>().SetUseSafeArea(true);

            // ListView用のデータを作成
            var listData = Enumerable.Range(1, 100)
                                .Select(i => $"item {i}")
                                .ToList();
            // ListViewを作成
            var listView = new ListView
            {
                ItemsSource = listData,
                BackgroundColor = Color.LightSkyBlue
            };

            Content = new StackLayout
            {
                Children =
                {
                    listView
                }
            };
        }
    }
}
```

XAMLの場合は次のように書けます。（参考サイトを参照）

```xml:MainPage.xaml
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
    ios:Page.UseSafeArea="true" >
```

## 最後に

私自身、Xamarin.Formsで作成し、リリースしているアプリがあるので、簡単にiPhone X対応ができて嬉しいです！

Xamarinはいいぞ。Xamarin.Formsはいいぞ。

## Github

[こちら](https://github.com/gnk263/XamarinFormsiOS11Sample)にサンプルコードがあります。

## 参考サイト

* <https://blog.xamarin.com/making-ios-11-even-easier-xamarin-forms/>
デフォルト値か、デフォルト式か、それが問題だ。

## PythonとRubyは似ていると言ったな。あれは嘘だ。

```py:Python
def f(x = []):
    x.append(0)
    return x

print(f())
print(f())
```

```rb:Ruby
def f(x = [])
  x.push(0)
  return x
end

p f()
p f()
```

上のPythonとRubyのコードは一見同じ処理をしているように見えます。しかし、実際に実行するとその結果は異なります。

```Pythonの結果
[0]
[0, 0]
```

```Rubyの結果
[0]
[0]
```

一体何が起きたのでしょうか？

## Pythonはデフォルト値

少しコードを変えて、関数呼出しにしてみましょう。どのタイミングで呼び出されたかわかるように、適当に`print()`を付けておきます。

```py:Python
def g():
    print("default!")
    return []

def f(x = g()):
    x.append(0)
    return x

print("start!")
print(f())
print(f())
print(f([1]))
```

```
default!
start!
[0]
[0, 0]
[1, 0]
```

結果からわかるように`g()`が評価されたのはスタートの手前、`def f(...): ...`が読み込まれたところです。そう、Pythonで引数のデフォルトを書いた場合、**関数定義の時点で評価されます**。式が評価された後に残るのは評価値だけです。つまり、`f()`が定義された時点で、デフォルトの値は決定されており、既にもう変わることはありません。そしてこの値を**デフォルト値**といいます。デフォルトになるのは、あくまで値であり、どのような式が書いてあっても、評価された後の値だけが残ります。評価されるタイミングも、関数呼び出しでは無く、関数定義時です。

## Rubyはデフォルト式

続いて、Rubyも同じようなコードを書いて見ましょう。
 
```rb:Ruby
def g()
  puts 'default!'
  return []
end

def f(x = g())
  x.push(0)
  return x
end

puts 'start!'
p f()
p f()
p f([1])
```

```
start!
default!
[0]
default!
[0]
[1, 0]
```

`g()`が二回呼び出されています。それも、`f()`を呼び出した直後にです。そう、Rubyで引数のデフォルトを書いた場合、(引数が指定されていなければ)**関数呼び出しの時点で評価されます**[^1]。そして、その評価値がデフォルトの値として使われます。注意してなければならないのは、関数呼び出しが行われる度に、そのデフォルトが使われるのであれば、式が評価されると言うことです。そしてこの式を**デフォルト式**といいます。デフォルトになるのは、あくまで式であり、前回の結果がどのような値であったとしても、毎回評価された後の値が使われます[^2]。評価されるタイミングは、関数呼び出しの時であり、関数定義時に一切評価されることはありません。また、引数が指定され、デフォルト式が使われない場合は、その式の評価自体がなされません。

[^1]: Rubyでは全てがメソッドであり、関数は存在しません。関数形式のメソッド呼出しはありますが、関数呼び出しという言葉は正確ではありません。ただ、この文章ではPythonや他言語と用語を合わせるために、メソッド呼出しを含めて関数呼び出しという言葉を使っています。関数定義という言葉についても同様です。

[^2]: 一部のイミュータブルなオブジェクトになるリテラルは、内部でキャッシュを持っており、再利用される場合があります。キャッシュを使ったかどうかは言語仕様上は区別されません。

## デフォルト値 vs デフォルト式

ということで、似ているとか、パクリだとか、そんなことを言われている言語間でも細かい違いはあるものです。どちらが良い悪いと言う話ではなく、この違いは言語設計の思想の違いのようなものだと思います。

他の言語についても、さらっと調べてみました。

* デフォルト値
    * Python
* デフォルト式
    * C++
    * D
    * Crystal
    * Elixir
    * Scala
    * Kotlin
    * Ruby
    * JavaScript (ECMAScript 2015+) 
    * TypeScript
    * CoffeeScript
* デフォルト固定値(定数式または定数式に準ずる値型のみ、後述参照)
    * C#
    * PHP
* 未検証(保留)
    * Common Lisp
* 構文無し
    * C
    * Go
    * Java
    * Haskell
    * Scheme
    * Clojure 

引数の個数によるオーバーロードやパターンマッチ、レコードやマップを渡してデフォルト引数もどきにできる場合は除外してます。引数を取るコードに対し、デフォルト値/式を追加するだけで成立する構文が対象です。「構文無し」となっている言語について、引数の省略(オプショナル引数)ができないわけではありません。

**デフォルト固定値**(この名称は、今、私が名付けたので、正しい呼び方かはわかりません)の部分は定数式または定数式に準ずる式のみが記載され、その評価値が値型となるものです。デフォルト固定値を使う場合は**値はコピーされる**[^3]ため呼出し毎に同じオブジェクトを使うと言うことはありません。仕様上、評価のタイミングはいつでも良い事になりますが、実装上は、他の定数式と同じくコンパイル時と推測されます。__この部分は自信が無いので、誰か補足をしてくれると助かります。__

[^3]: 言語仕様上はコピーされることになりますが、PHPのCopy-on-writeの仕組みのように、実際は値の変更が行われるまではメモリ上のデータをコピーしない場合もあります。

あとで調べて追加するかもしれないもの。(もし、既に調べた方がいましたら、実証コードおよび結果を含めてコメントをくれると助かります。下記以外の言語でもかまいません。)
Rust、Swift、Perl6、F#、VB.NET、Erlang、Lua、D、Perl (5.x)、Objective-C、Delphi、OCaml
JavaScript オブジェクトの持つ値で要素を検証するSet


[JavaScriptで集合演算](https://qiita.com/toshihikoyanase/items/7b07ca6a94eb72164257)の記事に @miumiu0917 さんから、JavaScriptのSetはユーザ定義なオブジェクトが扱えないとコメントを頂いた。

たしかに、[MDN Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)の冒頭にSetはプリミティブかオブジェクトの参照を対象にしていると書いてあった。

> The Set object lets you store unique values of any type, whether primitive values or object references.


例えば、配列を要素とするSetでは、配列の実体をそのまま入れると、配列の要素の値が同じでも別物として扱われてしまう。

```example1.js
arrayA = [1,2];
arrayB = [3,4];
set1 = new Set([arrayA, arrayB]);
set2 = new Set([arrayA]);
set3 = new Set([[1,2]]);

set2.isSubset(set1);
// true

set3.isSubset(set1);
// false
```

※ isSubsetについては[JavaScriptで集合演算](https://qiita.com/toshihikoyanase/items/7b07ca6a94eb72164257)を御覧ください。


# 内容で要素を検証するSet

Setを拡張すれば、配列やユーザ定義のオブジェクトの持つ値で要素を検証するようにできるのでは、と思ったのでやってみた。

ContentSetという名前でSetを継承したクラスを作ってみた。変えたのは `has` と `add`。

`has` は親クラスの `has` で `true` ならそのままで、 `false` なら自分の要素を操作して一致しているかを検証するコードを足した。

JavaScriptは演算子の上書きができないみたいなので、値の同一性をどうやって検証しようかちょっと悩んだ。[JavaScriptで配列やオブジェクトを比較して等しいかチェックする方法](https://jmatsuzaki.com/archives/16866)で、一旦JSONでシリアライズして比較しているのを見つけ、それに倣った。

`add` は拡張した `has` で検証してから値を足すようにした。

```contentset.js
class ContentSet extends Set {
	has(value){
		if(super.has(value)){
        	return true;
    	}
	    for (var elem of this) {
    	    if (JSON.stringify(value) === JSON.stringify(elem)) {
        	    return true;
        	}
    	}
		return false;
    }
	add(value){
		if(this.has(value)){
			return;
        }
		super.add(value);
    }
}
```

ChromeとFirefoxのJavaScript Consoleで実行してみたけど、期待どおりに動いているみたい。

```example2.js
a = new ContentSet([[1]]);
// Set(1) {Array(1)}
a.has([1]);
// true
a.add([1]);
// undefined
a
// Set(1) {Array(1)}
a.size;
// 1
b = new ContentSet([[1], [1]]);
// Set(1) {Array(1)}
b
// Set(1) {Array(1)}
```

冒頭の例をContentSetで実行してみたけど、こちらも期待どおり。(Chromeで確認)

```example1.js
arrayA = [1,2];
arrayB = [3,4];
set1 = new ContentSet([arrayA, arrayB]);
set2 = new ContentSet([arrayA]);
set3 = new ContentSet([[1,2]]);

set2.isSubset(set1);
// true

set3.isSubset(set1);
// true
```

# 感想

* JSONでシリアライズして文字列として比較しているので、オブジェクトの要素の順序とか大丈夫なのかよくわからないけど、とりあえず動いている。
* 毎回シリアライズするので遅そう。
* コンストラクタとかはとくに変えてないけど、挙動が変わっているということは、ちゃんと自分の `has` を使ってくれているのだろうと思う。
* それなら `add` も変えなくてよさそうだけど、それだと要素が重複してしまったので必要な改変だったようだ。

JavaScriptは素人なので、間違っているかもしれないけど、ご参考まで。



# 参考文献

* [ES6 におけるJavaScriptのクラス定義](http://www.yunabe.jp/docs/javascript_class_es6.html)
* [JavaScriptで配列やオブジェクトを比較して等しいかチェックする方法](https://jmatsuzaki.com/archives/16866)
Python の eval と exec

# はじめに

これまで Python の `eval` と `exec` についてよく分かっていなかったので調べてみました。もし誤りがあれば指摘いただけたらと思います。

特に断りがない限り、Python のバージョンは 3.6.1 の内容になります。

# eval とは

`eval` は第1引数を**式**として**評価**します。次は簡単な例です。

```py
>>> eval('1 + 2')
3
```

次は第1引数が式ではなく文（代入文）になるので、エラーになります。

```py
>>> eval('a = 1 + 2')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    a = 1 + 2
      ^
SyntaxError: invalid syntax
```

Python の式と文について、詳しくは次のドキュメントを参考にしてください。

- [6\. 式 \(expression\) — Python 3\.6\.3 ドキュメント](https://docs.python.jp/3/reference/expressions.html)
- [7\. 単純文 \(simple statement\) — Python 3\.6\.3 ドキュメント](https://docs.python.jp/3/reference/simple_stmts.html)

また、出力結果の通り、評価の結果が戻り値となります。

```py
>>> a = eval('1 + 2')
>>> a
3
```

## compile について

`eval` の第1引数には文字列以外を指定する事ができます。次は `compile()` で生成したバイトコードを指定した例です。

```py
>>> eval(compile('1 + 2', '<string>', 'eval'))
3
```

## eval の第2引数、第3引数
`eval` は第2引数としてグローバル、第3引数としてローカルな名前空間を指定できます。

次はローカル名前空間に変数 `a` を指定した例です。

```py
>>> eval('a * 3', {}, {'a': 2})
6
```

次はグローバルとローカル名前空間に同じ名前の `a` を指定した例です。

```py
>>> eval('a', {'a': 20}, {'a': 10})
10
```

ローカル名前空間が優先して参照されることが分かります。

# exec とは
`exec` は第1引数を**文**として**実行**します。次は簡単な例です。

```py
>>> exec('a = 1 + 2')
```

ここでは代入が実行されるだけで、評価した値は返らないため結果は出力されません。`exec` の戻り値は常に `None` になります。

```py
>>> exec('a = 1 + 2') is None
True
```

ただし、変数 `a` に評価した値が代入されているため、例えば `print` によって内容を確認できます。

```py
>>> exec('print(a)')
3
```

第1引数には `eval` 同様に文字列だけでなく、例えばバイトコードを指定することが出来ます。

## exec の第2引数、第3引数

`exec` も第2引数、第3引数でそれぞれグローバル、ローカルな名前空間を指定することが可能です。

次はローカル名前空間として `a` に `10` を指定して実行した例です。

```py
>>> exec('print(a)', {}, {'a': 10})
10
```

次はローカルな名前空間として空のディクショナリを渡した例です。

```py
>>> a = {}
>>> exec('b = 3', {}, a)
>>> a
{'b': 3}
```

代入した値が参照できることが分かります。これに対して `eval` は式の評価なので、名前空間の値を変更する事ができません。

## 組み込み参照の制限

`exec` によってグローバル名前空間を変更または参照される事を制限したい事があります。例えば、ユーザから受け取った入力を実行する場合です。

この場合、第2引数に `__builtins__` ディクショナリを指定する事で、実行時の組み込みを制限できます。

```py
>>> exec('import os;os.system("echo danger!")', {}, {})
danger!
>>> exec('import os;os.system("echo danger!")', {'__builtins__':None}, {})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
ImportError: __import__ not found
```

この例では `__builtins__` ディクショナリに `None` を指定しているので `import os` 実行時の呼び出しで `__import__` が見つからずにエラーになっています。

# eval と exec の違い

簡単にまとめると次のようになります。

|         | eval | exec |
|-------- | ---  | ---- |
| 第1引数をどうするか | 評価 | 実行 |
| 第1引数  | 式　  | 文  |
| 戻り値    | 評価の結果 | `None` |


# 参考

- [2\. 組み込み関数 — Python 3\.6\.3 ドキュメント](https://docs.python.jp/3/library/functions.html)
- [dynamic \- What's the difference between eval, exec, and compile in Python? \- Stack Overflow](https://stackoverflow.com/questions/2220699/whats-the-difference-between-eval-exec-and-compile-in-python)
同期回路とVerilog

# 目的

[同期回路と設計上の注意点](https://qiita.com/junjihashimoto@github/items/7ca080592d745707cf2e)の続編?、勢いで書いただけです。

同期回路を意識したVerilogの書き方について述べる。

[Wikipedia](https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E5%9B%9E%E8%B7%AF)にあるように論理回路は組み合わせ回路と順序回路からなる。Verilogではそれぞれ分けて書くことが望ましい。

# 同期回路の構成要素

下記に同期回路の構成要素を列挙しそれぞれVerilogでどう書くか例を挙げる。

## DFF

下記は1bitのDFFの記述の例、クロック(CLK)とリセット(RESETN)をつけるのがよい。
DFFへの入力はDINから渡す。DFFへの入力はノンブロック代入がよい。

```
reg DFF;
always@(posedge CLK or negedge RESETN)
  if(!RESETN)
     DFF <= 0;
  else
     DFF <= DIN
```

簡単な順序回路（カウンタ）なら論理を書いても問題ない。

```
reg [3:0] CNT;
always@(posedge CLK or negedge RESETN)
  if(!RESETN)
     CNT <= 0;
  else
     CNT <= CNT + 1
```



## ラッチ回路

ラッチ回路は使わない方がいいが下記の記述で作成できる。

```
reg DFF;
always@(CLK or DIN)
　if(CLK)
    DFF <= DIN
```

## 論理ゲートを使った組み合わせ回路

下記は加算器の例、c=a+bを行う。

assign文の場合

```
wire [3:0] a;
wire [3:0] b;
wire [3:0] c;
assign c = a + b;
```

always文の場合、ブロッキング代入が望ましい。

```
wire [3:0] a;
wire [3:0] b;
reg [3:0] c;
always @*
  c = a + b;
```

## ステートマシン

下記はステートマシンの例、組み合わせ回路と順序回路をそれぞれ使用する。
NSTATは組み合わせ回路でSTATは順序回路である。

```
reg [2:0] NSTAT;
reg [2:0] STAT;

always @* 
  case (STAT)
    3'b000: NSTAT = 3'b001;
    3'b001: NSTAT = 3'b010;
    3'b010: NSTAT = 3'b100;
    defaut: NSTAT = 3'b000;
  endcase

always@(posedge CLK or negedge RESETN)
  if(!RESETN)
     STAT <= 0;
  else
     STAT <= NSTAT
```
カラーコードで使う0xFFFFFFなどの16進数(HEX)からRGBの各数値を計算で取得

HTMLやCSS、javascriptなんかでよく使う色指定のための16進数（16進法）のカラーコード。0xFF0000とか0x0033FFとか0xFF9900。一桁が0から9、そしてABCDEFの16種類の数字とアルファベットで表記される数値です。お馴染みだと思います。

今回はこのHEX値をjavascriptで計算によってRBGそれぞれの値(0から255まで)を取得したいと思います。

background-colorなどの16進法の値を rgb()やrgba()におきかえるときなどに使えそうです。


ちなみに僕は高一の時に数学で赤点をとったくらいなのでこういう計算はとても苦手です。

#式

```JavaScript

//例えばこのhex値
const hexcolor = 0xe2ccF0

//Rの値を出力
console.log( Math.floor(hexcolor/65536) )
=226

//Gの値を出力
console.log( Math.floor( ( hexcolor%65536)/256) )
=204

//Bの値を出力
console.log( hexcolor%256 )
=240

//RBGを出力
console.log( Math.floor( hexcolor/65536), Math.floor( ( hexcolor%65536)/256), ( hexcolor%256) )
=226, 204, 240

```
#なにをしてるか

##Rの値
Rの値を表しているのは 0xe2ccF0 のうち先頭の6,5桁目の0xe20000です。
0xe20000を0x010000(=65536=16*16*16*16)で割ってみます。
答えは0xe2。これは10進法で(14*16)+2で226です。

式で表現すると、

```js

console.log( Math.floor(0xe2ccF0/65536) )
```
Math.floorで切り捨てしているのは、Rの値には関係ない0x010000(65536)で割り切れない0x00ccF0を捨てているからです。

##Gの値
Gの値は上で出た(0xe2ccF0/65536)の小数点以下の数=あまりの数を今度は0x000100の数（=256）で割ることで出しています。ここでも小数点以下は切り捨てます。（%はあまりの数を求めることができます）

##Bの値
Bの値はこの256(=0x000100)で割った時のあまりの数になります。
RとGの桁(3-6桁目)の値はすべて256の倍の数になるので、256で割り切れます。

#ちなみに
式はこんな感じで16進数で計算することもできます。こちらのほうが覚えやすいかも？

```js
const hexcolor = 0xe2ccF0

//Rの値を出力
console.log( Math.floor(hexcolor/0x010000) )
=226

//Gの値を出力
console.log( Math.floor( ( hexcolor%0x010000)/0x000100) )
=204

//Bの値を出力
console.log( hexcolor%0x000100 )
=240

// R, G, Bの値を出力
console.log( Math.floor( hexcolor/0x010000), Math.floor( ( hexcolor%0x010000)/0x000100), ( hexcolor%0x000100) )
=226, 204, 240
```

#まとめ

JSでは16進数を文字列とし二桁ずつ取り出して10進数に変換する方法もありますが、
今回は計算によって割り出してみました。

計算で行うことによってJavascript以外のプログラムにも流用しやすいのかもしれません。パズルのようで意外とおもしろかったです。

うまく説明するのは難しいのですが、理解のきっかけにしてもらえたら嬉しいです。
SPAの課題と近年の改善状況

#概要
ReactやAngular等によるSPAでのサイト作成には色んな課題がありますよね。
私が2年程前にSPA(Angular2)でホームページを作ろうとした時、それら課題の為にSPAでの作成は諦めました。
それらについて、存在した課題と改善状況をまとめてみました。

##背景
2年程前までは、SPAで作るのは、ホームページではなく、Webアプリ、という時期だったかと思います。
でも、最近はブログ等、普通のホムペでもSPAで作られてたりしますよね！
そこで、再度WebサイトをSPAで作ろうと思った時に、課題の状況はどうだろうと、まとめてみた次第です。

##そもそも
いや、何で普通のウェブサイトをSPAで？
って話なんですが、メリットとして、ページビューが増えるという効果があるとの事。
[何故？]
以下のような理由があるとされています。
・ページの見え方が動的で面白くなる
・2ページ目以降の遷移が早い

#▼という訳で、課題とその解決についてです▼


###課題1-1．初回ロードが重い
[原因]
SPAでの初回ページ表示までには以下の２つのリクエストが必要になります。
①リソース取得
②データ取得

通常のWebサイトでは①のみで完了する為、どうしてもSPAページは遅くなります。

```
そして、普通のホムペであれば、1つのページだけ見て直帰というのはごく普通なので、この初回ロードの違いは大きいです。
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57219/3befa769-6de2-ddce-6bc8-02fa1c381542.png)


###課題1-2．SEO対策が出来ない
[原因]
クローラがJSを解釈出来ない為、IndexされるページはTopページの一部、などという事が起こります。
例えば、以下の２つのURLはクローラから見たら同じに見えるという問題です。
https://qiita.com/
https://qiita.com/harufumi_abe

これは、SNSにリンクを貼り着けた時にプレビュー表示されないという問題にも繋がっています。

```
[過去の解決方法]
クローラのIndex用の静的ページを作るという方法がありました。
[外部環境の変化]
最近ではGoogleのクローラはJSを解釈出来る為、一部解決したとも言われますが、完全とは言えないようです。
```

## [解決1]
上の1-1,1-2は、サーバサイドレンダリングという手で今は解決されました。
SPAサイトでも、初回リクエストで表示可能なページを取得します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/57219/eff74ed4-58d6-8786-e4b4-eb86ca4f7ddb.png)

※ただし、サーバサイドはNodeでなければならないはず。

---

###課題2-1．ページビュー(PV)が取れない
SPAサイトはページ遷移しない為、例えばGoogleAnalyticsでPVは取れません。
```
[過去の解決方法]
Ajaxでアクセスをカウントする仕組みを作るというものがありました。
```

###課題2-2．JSエラーが捉えられない
これまで、サーバ側でＨＴＭＬ生成していたから、その生成過程で発生したエラーの補足は容易だった。
では、クライアント側でのエラーはどう補足する？

```
[過去の解決方法]
クライアントサイドて蓄積して定期的にRESTで送るという方法がありました。
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/57219/d2ddf1bd-a255-2e78-b95c-39115517b318.png)

##[解決2]
これは、外部サービスですが、Googleのタグマネージャが解決してくれました。
こいつはURLの変更をPVとしてカウントして、クライアントのエラーも捕捉します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57219/6df72b53-80f2-77cf-f521-20337b09c6b1.png)

外部サービスかよ！
と思うかもしれませんが、個人的には使えるサービスは使った方が開発・保守費用の削減が出来ると思っています。

詳細は @OnederAppli さんのこちらの説明参照という事で(ノ▽｀)


★SPAの各ページビューをGoogleアナリティクス＋Googleタグマネージャーで簡単トラッキング！
　https://qiita.com/OnederAppli/items/0c35dc6c72da7bcada7a

★GoogleAnalytics＋GoogleTagManagerでJSエラーを収集する
　https://qiita.com/OnederAppli/items/0b64df149e352a8cc7c6

---

###課題3．SPAで開発したサイトは簡単に盗難できる
コードの大半をクライアント側に持って行くので、表示している側は簡単に見れてしまいます。
部分的に盗む事も出来ますし、何なら右クリックダウンロードで丸ごと動く状態で盗めます。

##[解決3]
これはJSを難読化する事で概ね解決出来たかと思います。
これまでも難読化の技術はありましたが、手順が増える為あまり浸透はしていなかったという印象。
フロント開発でWebpackがスタンダードになって、ビルド過程で一緒に難読化される事で広まった印象ですね。

---

#▼ここからは未解決(ないし不可能)と思われる課題です▼
※どなたかご意見、別の回避策等あれば教えて頂きたい所^^;

###課題4.セキュリティに関わるキー値を持たせられない
例えば別サーバのサービスを使う場合、何かしらのキー値と併せてリクエストを投げないといけない場合があります。
そのキー値が漏れてしまうと成りすましをされる危険がある為、フロントに持たせられない。

##[回避策4]
これは残念ですが、私の場合はサーバにリクエストを仲介させる事にしました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/57219/857426d2-066c-068e-63c2-174493bbf4c3.png)

---

###課題5．動かないブラウザがある
これはしょうがないんじゃないかなぁ、数あるフロントのフレームワークも切り捨てて行っているという印象ですね^^;

##[回避策5]
SPAにしない(笑)
いや、JS使わない(ノ▽｀)ｱﾁｬｰ

---

以上です、どうでしょう、Webサイト、SPAで作ってみたくなったのではないでしょうか(ノ▽｀)
teraterm風のコピペ方式を「Windows Subsystem for Linux」でも使いたい


teratermのコピペ方式は__「ターミナル上の選択範囲を右クリックするとコピー、同じくターミナル上で右クックするとペースト」__というもの。一般的な方式かどうかはともかく、個人的には大変慣れ親しんだ方式ではあります。ではこのteraterm風のコピペ方式を「Windows Subsystem for Linux」で利用したいという場合、どうすればよいでしょうか? 複雑そうに感じますが、実は以下の2ステップで実現することができます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/105859/3ebebcdf-d0d3-9990-4eb5-1b246026e675.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/105859/99c44476-f969-bafb-9143-31172220e034.png)

要は「簡易編集モード」にしてやるだけなのですが、これだけで「teraterm式」のコピペが実現できてしまいます! 素敵(´・ω・｀) なお以下の画像はその簡単なサンプルになります。

![result.png](https://qiita-image-store.s3.amazonaws.com/0/105859/b0650ae7-bd16-bd26-a36f-ce13fa638782.png)
同期回路と設計上の注意点

# 目的

同期回路の説明とその注意点を述べる。

わかりやすく書きたかったのですが、わかりにくいですよね。

# 同期回路とは

論気回路については[wikipedia](https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E5%9B%9E%E8%B7%AF)を参照すると詳しい。論理回路は電圧の低いLと高いHの状態を真理値の「真」と「偽」、あるいは二進法の「0」と「1」とみなして論理演算をするものである。
論理回路のうち、決まった周期でHとLを繰り返す[クロック](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF)を使って、演算をするのが[同期回路](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E5%90%8C%E6%9C%9F%E8%A8%AD%E8%A8%88)である。

# 回路の構成要素

同期回路の構成要素は下記である。
フリップフロップという記憶素子と論理演算を行う論理ゲートからなる。
フリップフロップはクロックに同期して動作する。
フリップフロップには種類がいくつかあるが、基本的にはDフリップフロップ(DFF)しか使用しない。

同期回路ではクロックに同期してDフリップフロップ(DFF)から出たデータを論理ゲートで演算し、またDフリップフロップ(DFF)でデータをうける。
DFFからDFFまでの時間はクロックの周期と等しく、DFFの間の論理ゲートでの演算はクロック周期内に完了するように設計される。

* フリップフロップ(FF)
    * Dフリップフロップ(DFF)
        * レジスタと呼ばれる。
        * クロックの立ち上がり（LからH）でデータ取り込む
    * ラッチ回路
        * クロックがHのときにデータを取り込む
* 論理ゲート
    * NOT
    * AND
    * OR
    * XOR

フリップフロップはクロックに同期して動作する素子である。

Dフリップフロップの場合下記のようにCLKがLやHを繰り返しているときに
CLKの立ち上がり（LからH）で入力(IN)を取り込み出力(OUT)に取り込んだ値を出力する。
CLKの立ち上がりの前後は入力(IN)が変化しないように設計する必要がある。
立ち上がり前の入力（IN)の変化しない期間をセットアップ
立ち上がり後の入力（IN)の変化しない期間をホールドである。

```
CLK _|""|__|""|__|""|__
IN  ""|_____|"""""|____
OUT XX""""""|_____|""""
```

ラッチ回路の場合下記のようにCLKがLやHを繰り返しているときに
CLKのHで入力(IN)を取り込み出力(OUT)に取り込んだ値を出力する。
DフリップフロップがCLKのエッジで動作するのにたいして、ラッチ回路はCLKのレベルで動作する。
立ち上がりで動作しないので、DFFよりタイミングの解析が難しく、基本的には使用しない素子である。verilogではラッチ回路が記述できるので不用意に使わない。

```
CLK _|""|__|""|__|""|__
IN  """""|_____|"""""|_
OUT XX"""""|_____|"""""
```

# 回路の出力

同期回路ではクロックに同期してDフリップフロップ(DFF)から出たデータを論理ゲートで演算し、またDフリップフロップ(DFF)でデータをうける。
そのため、回路の出力は論理ゲートでなくDフリップフロップ(DFF)の出力がタイミング上好ましい。

# 異なるクロック間（非同期）でのデータのやりとり

異なるクロック間で注意することは、2点ある。

1, 多数のbit列を異なるクロック間でやりとりするときに、回路の配線上の影響などにより
特定のbitのみが受け渡されデータが化ける場合ある。
例えばクロックAで動くDFFの出力が1111->0000->1111のようにデータが変化しているとして、
クロックBで動くDFFでこのデータをとるとする。ちょうど0000->1111と変化しているときに
クロックB側でデータをとると0000や1111ではなく0011のように中途半端な状態になる。

2, DFFのセットアップとホールドの制約を守らないとHでもLでもない[メタステーブル](http://www.altima.jp/products/software/mentor/fv/column/cdc-2.html)状態になる。

上記の問題があるため、異なるクロック間で受け渡す場合は多数のbit列のデータが中途半端な状態にならないようにデータが変わらないところで受け渡すようにする。また、メタステーブルのために[DFFの2段受け](http://www.kuis.kyoto-u.ac.jp/ecs/isle/le3a/Sync/index.html)をする。

# 設計上の注意点

* 回路の出力はDFFで受ける。
* ラッチ回路を使用しない
* 同期してない異なるクロック間でデータをやりとりは注意
* メタステーブルがあるところは注意
    * フリップフロップを2段受けしてとる。
    * データが安定している状態にして受け渡す。
[React] react-intlを使ってReactアプリを多言語化(国際化)する(Internationalize React apps)


**Reactアプリを多言語化**する **定番？ライブラリ** [react-intl](https://github.com/yahoo/react-intl)の使い方を紹介します。

## 定番の理由：

* あの有名なYahoo!社が開発
* 現時点星数6088（同類Componentの中では最多）
* 使いやすい
* ライセンス: BSD-3-Clause

## インストール

* 環境：MacBook Air OS X EI Capitan

```
$ npm install react-intl -save
```

**Safari**と **IE11以前** のブラウザーの場合は、
**intl**のインストールも必要です。

```
npm install intl --save
```

## 言語ファイルを作る

ここでは、英語と日本語言語ファイルを作ることにします。

```ja_JP.js
const ja_JP = {
            hello: "こんにちは，wang!",
            hello_name: "こんにちは，{ my_name } !"
        }
export default ja_JP;    
```

```en_US.js
const en_US = {
            hello: "Hello, wang!",
            hello_name: "Hello, { my_name } !"
        }    
export default en_US;
```

注： `{ my_name }`のようにすることで、値をパラメータとして動的に渡すことが可能です。

## Coding

### (1) インポートと設定

```ES6
import React from 'react';
import { render } from 'react-dom';
// 言語ファイルをインポート
import zh_CN from './ja_JP';
import en_US from './en_US';
import intl from 'intl';
addLocaleDate([...en,...zh]);

...
...

render(    
        <IntlProvider 
            locale={'en'} 
            messages={en_US}
        >
            <App />
        </IntlProvider>,    
        document.getElementById('container')
);
```

* 解説

`<IntlProvider />`で多言語化したいところ(ここでは `<App />`)を囲めば、
`<App />`中にある全てのComponentsが言語ファイル設定内容にアクセスすることができなるようになります。

### (2) 使ってみる

```
<FormattedMessage
    id='hello_name'
    description='say hello to wang.'
    defaultMessage='Hello, { my_name }'
    values={
        my_name:this.props.name,
    }
    />
```


## その他

  react-intlは 米Yahoo!が Webアプリケーションの多言語対応に向けたJavaScriptライブラリ[FormatJS](https://formatjs.io/github/)の一部です。
  
  **FormatJS**を利用することで、 **Webアプリケーションの国際化**を行うことができる。
  150以上の言語に対応し、セパレータを使った  **数字** や **日時の表現**などが可能となります。
  
  たとえば数字「1000.55」は、
  英語では「1,000.55」ですが、フランス語では「1000,55」のような場合に活用できます。
  

# 参考にしたリンク
http://aifan.jp/react-react-intlを使ってreactアプリを多言語化国際化するinternationalize-reac/
http://www.cnblogs.com/lonelyGentleman/p/6893907.html
http://www.cnblogs.com/videring/articles/7452078.html
今日学んだことを投稿する：Pandas CSV読み込みで日付意味付け列連結

***statコマンドの結果に日付・時間をつけてファイル出力するShellを作ったのだが
その結果をいざ編集・グラフ化する際、毎回Ｅｘｃｅｌで編集・グラフ作成をするのも実に面倒。

ということで
１．JenkinsからStatコマンドShellをリモート起動（データ採取開始）
２．JenkinsからSCPにてファイルを分析サーバに収集＋データ一次加工
３．PythonとJupyter Notebookで編集とグラフ描画

一日の内でことが済むのであれば大した問題はないのですが
２４時をまたぐ場合は時間だけではグラブ描画上困ったことがおきますね。。。

で、日付と時間を組み合わせた列が必要なのですがこれもそれなりにちょっと面倒な感じです。
そこでread_csvのparse_datesオプションを使って試行錯誤するわけなのですがこれがまた・・・

リファレンスを見るとparse_datesオプションで複数列をリストで指定すると
なんとアンダーバーで連結した列を自動で追加するとあります。連結基の列は消えると。。。。

まじか。。。。使ってみると便利です。
２４時マタギデータも綺麗にグラフ出力できました。


https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

連結元の列を残すオプションもあります。
スペイン語とポルトガル語の動詞の活用(ser, estar)

いずれ自然言語処理とかで使うかもしれないので、自分のためにまとめておきます。
スペイン語とポルトガル語は似ているので、並べて見たいのも動機にあります。

# ser
## 直接法
| 人称  | 現在(ス) | 点過去(ス) | 線過去(ス) | 現在(ポ) | 完了過去(ポ) | 不完了過去(ポ) |
|:----------|:-----|:--------|:------|:-----|:------|:------|
| 1人称単数 | soy  | fui     | era   | sou  | fui   | era   |
| 2人称単数 | eres | fuiste  | eras  | és   | foste | eras  |
| 3人称単数 | es   | fue     | era   | é    | foi   | era   |
| 1人称複数 | somos| fuimos  | éramos| somos| fomos | éramos|
| 2人称複数 | sois | fuisteis| erais | sois | fostes| éreis |
| 3人称複数 | son  | fueron  | eran  | são  | foram | eram  |

## 分詞
| 分詞  | (ス) | (ポ) |
|:---------|:------|:-----|
| 現在分詞 | siendo| sendo|
| 過去分詞 | sido  | sido |


# estar
## 直接法
| 人称  | 現在(ス) | 点過去(ス) | 線過去(ス) | 現在(ポ) | 完了過去(ポ) | 不完了過去(ポ) |
|:----------|:-------|:-----------|:---------|:-------|:----------|:---------|
| 1人称単数 | estoy  | estuve     | estaba   | estou  | estive    | estava   |
| 2人称単数 | estás  | estuviste  | estabas  | estás  | estiveste | estavas  |
| 3人称単数 | está   | estuvo     | estaba   | está   | esteve    | estava   |
| 1人称複数 | estamos| estuvimos  | estábamos| estamos| estivemos | estávamos|
| 2人称複数 | estáis | estuvisteis| estabais | estais | estivestes| estáveis |
| 3人称複数 | están  | estuvieron | estaban  | estão  | estiveram | estavam  |

## 分詞
| 分詞  | (ス) | (ポ) |
|:---------|:-------|:-------|
| 現在分詞 | estando| estando|
| 過去分詞 | estado | estado |