OmniAICreator/Qiita-1.07M huggingface dataset:
Try JupyterでPythonを動かしてみる

最近は個人的にPythonの学習をしているので、それに関する記事を書いていこうかと思います。
とりあえず今回は、わたしがPythonの実行に使用しているTry Jupyterについて説明します。
まず、Try Jupyterにアクセスするには以下のURLをクリックします。

https://jupyter.org/try

すると、以下のようなページが表示されるので、「Try Classic Notebook」をクリックしてください。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306544/43e96f94-603b-f9e4-c2ba-e23a9bf6968d.png)

次に以下のような画面が表示されます。
環境構築中なので、画面が変わるのを待ってください。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306544/2f4c4a01-6ac1-e167-ef0b-18dbd25cf8a3.png)

しばらく待つと、以下のように画面が変わります。
「File」にカーソルを合わせてください。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306544/63f722e8-a224-ba8e-ef5c-7040e7ca24fb.png)

すると、以下のようなメニューが表示されるので、
「New Notebook」→「Phthon 3」の順番で選択していってください。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306544/140a566a-bec9-d28c-6610-99e408cdcde5.png)

以下のような画面が新規作成されます。
この画面の中にあるセルにPythonのコードを記述すると、そのコードを実行することができます。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306544/d6d0f325-3ac6-3493-6cd0-2482ab1960dd.png)

まずは基本中の基本ですが、以下のコードを入力してみましょう。

```ruby:Python
print('Hello World')
```

上記のコードを、以下のようにセルに入力し、
ページ上部の「Run」を押下すると、コードを実行することができます。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306544/e7ddd87f-29e0-1966-69c2-a3a294090685.png)

実行すると、以下のように実行結果が表示されます。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306544/51324186-a24d-eb4f-27b1-6ad321f2771a.png)

Try JupyterからPythonを実行する方法はこんな感じになります。
わざわざ開発環境を導入したりしなくてもWebですぐに使うことができてお手軽なのでおすすめです。
ただ、操作しないまま一定時間が経過してしまうとWebサーバーとの接続が切れてしまうので注意しましょう。
Azure CLI コマンド例

# はじめに

これは、Azure CLI でよく使うものなどをメモしたものである。

## 準備

* CLI によるAzure リソースの操作もあるので、各 OS 用の CLI をインストールしておく
* [Azure CLI ドキュメント](https://docs.microsoft.com/ja-jp/cli/azure/?view=azure-cli-latest)
* [Azure CLI のインストール](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest)


# コマンド例

## 最初の一歩

* ログイン

たとえば PowerShell で実行するとブラウザが起動し、そこから Azure のアカウントでログインする。
以下は PowerShell での実行例。（ただし各 ID は適当な値に変更してある）
homeTenantId の値が、規定のディレクトリのテナント ID にあたる。

```
PS C:\Users\hoge> az login
You have logged in. Now let us find all the subscriptions to which you have access...
The following tenants don't contain accessible subscriptions. Use 'az login --allow-no-subscriptions' to have tenant level access.
0301a880-bab5-4316-842b-1d81ca124eb2
b71a38d0-b08e-41e1-845b-1a1e0eb6e4e8
[
  {
    "cloudName": "AzureCloud",
    "homeTenantId": "19bdce1b-78d7-46e1-8fb8-4e735c6a02d4",
    "id": "34a01316-3b6f-4309-a9b1-4193b0ba4adf",
    "isDefault": true,
    "managedByTenants": [],
    "name": "subsc1",
    "state": "Enabled",
    "tenantId": "90b542a1-71a5-4995-9660-614f23b7a29d",
    "user": {
      "name": "hoge@example.com",
      "type": "user"
    }
  }
]
PS C:\Users\hoge>
```


## サブスクリプション

* サブスクリプション一覧の表示

```
az account list --output table
az account list -o table
```


## リソースグループ

* サブスクリプション内のリソース グループ 一覧の表示

```
az group list --output table
```

* サブスクリプション内にリソースグループを作成

```
az group create  --name <resource-group-name> \
 --location <resource-group-location>
```


## リソース

* リソースグループ内のリソース一覧の表示（オプションとしてリソースタイプを指定）

```
az resource list --resource-group リソースグループ名 \
 --resource-type Microsoft.Web/sites
```

* リソース一覧のうち、名前の列だけ取り出し

```
az resource list --query "[].{name:name}" -o table \
 --resource-type Microsoft.web/sites
```


## ストレージアカウント

* ストレージ アカウント 一覧

```
az storage account list -o table
```


## ネットワーク

* Azure DNS のゾーン一覧を JSON 形式で出力

```
az network dns zone list -o json
```

## 仮想サーバー

* 作成（例として Ubuntu 16.04 , 管理者アカウント azureuser とする）

```
az vm create \
  --resource-group リソースグループ名 \
  --name 仮想サーバー名 \
  --image Canonical:UbuntuServer:16.04-LTS:latest \
  --admin-username azureuser \
  --generate-ssh-keys
```

* ポート開放（例：後で作成する Web アプリに対し HTTP でアクセスできるようにする）

```
az vm open-port  --port 80 \
  --resource-group リソースグループ名 \
  --name 仮想サーバー名
```

* 仮想サーバーの IP アドレス取得

```
ipaddress=$(az vm show \
   --name 仮想サーバー名 \
   --resource-group リソースグループ名 \
   --show-details \
   --query [publicIps] \
   --output tsv)
```


## Web アプリ

* Azure App Service で作成したWeb アプリの起動/停止

```
az webapp start --resource-group リソースグループ名 \
 --name <App Serviceのwebアプリ名>
az webapp stop --resource-group リソースグループ名 \
 --name <App Serviceのwebアプリ名>
```



以上。
■【Google Colaboratory】形態素解析（MeCab）を使う


#1. MeCabインストール方法
MeCabを pipでインストール

```py
!pip install mecab-python
```

#2. MeCabで形態素解析

```py
import MeCab
# Example 1
s = MeCab.Tagger('-Ochasen')
print(s.parse('にわにはにわにわとりがいる'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/a07ed2df-dffb-01d3-de8b-32e91c5f61de.png)


```py
# Example 2
s = MeCab.Tagger('-Ochasen')
print(s.parse('庭には二羽ニワトリがいる'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/632d6568-c18d-81c5-4f65-b3e825d8c539.png)



#3. MeCabとjanomeの形態素解析結果比較
##3.1 漢字・ひらがな・カタカナ
**Result of Analysis by MeCab(mecab-python3-0.996.5)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/c27452c8-41ba-5530-9c24-f9330297fe6e.png)

**Result of Analysis by janome(janome-0.3.10)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/ac070348-1d52-0412-6b14-3e496d49190c.png)

##3.2 ひらがな
『ワニ』と『ハニワ』と『ニワトリ』によるコラボになった

**Result of Analysis by MeCab(mecab-python3-0.996.5)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/d869541e-849f-cb7f-7830-37c9fd7354be.png)

**Result of Analysis by janome(janome-0.3.10)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/950dca9e-a25e-3aba-db39-6aedfe8e6130.png)


# Reference
> [■【Google Colaboratory】 Preprocessing of Natural Language Processing & 形態素解析(janome)](https://qiita.com/O-Mik/items/99f7f35987e1f5ad70d8)
>[■【Google Colaboratory】形態素解析（janome）を使う](https://qiita.com/O-Mik/items/7e45d03115497b3beb11)
>[ソースからPythonをインストール](https://qiita.com/hasegit/items/6228da974c5837a1c393)
>[configure, make, make install とは何か](https://qiita.com/chihiro/items/f270744d7e09c58a50a5)
>[自分でソフトウェアをビルド・インストールするときに/usrや/usr/localへインストールしない](https://qiita.com/kuchida1981/items/d028940ade41096490de)
Mac 初期セットアップ

新しい MacBook Pro 13インチがもうすぐ届くので、改めて Mac の初期セットアップでやることをまとめておく。



## システム設定

### トラックパッド

- 軌道の速さを最大にする



### キーボード

#### 「キーボード」タブ

- キーのリピート : 最速
- リピート入力認識までの時間 : 最短
- Touch Bar に表示する項目 : F1、F2 などのキー
- 修飾キー : Caps Lock キーを Control に設定する

#### 「ユーザ辞書」タブ

以下の設定のチェックを外す

- 英字入力中にスペルを自動変換
- 文頭を自動的に大文字にする
- スペースバーを2回押してピリオドを入力
- Touch Bar に入力候補を表示
- スマート引用符とスマートダッシュを使用

#### 「ショートカット」タブ

- 入力ソース > ショートカットを無効にする
- スクリーンショット > 「ファイルとして保存する」ほうを ctrl キーありのキーにする



### Spotlight

「検索結果」を以下の項目だけ有効にする

- アプリケーション
- システム環境設定



### 日付と時刻

- 「秒を表示」にチェックする



### Dock

- 「Dock を自動的に表示/非表示」にチェック
- 「最近使ったアプリケーションを Dock に表示」のチェックをはずす



### 一般

- 「スクロールバーの表示」を「常に表示」にする



## ソフトウェアのインストール＆設定変更



### Google Chrome

ダウンロードリンク : https://www.google.com/intl/ja_ALL/chrome/



### Clipy

ダウンロードリンク : https://clipy-app.com/
My Snippets をインポート : https://github.com/y-u-t-a/clipy-snippets

#### 設定

- ショートカット > メイン を「option × 2」に設定



### SF Mono（フォント）

ターミナルに使用するフォント
ダウンロードリンク : https://developer.apple.com/fonts/



### iTerm2

ダウンロードリンク : https://www.iterm2.com/
My Profile をインポート : https://github.com/y-u-t-a/iterm2-profile

#### 設定

- Preferences > General > Window にて Adjust window when changing font size を OFF にする

### Docker Desktop for Mac

ダウンロードリンク : https://hub.docker.com/editions/community/docker-ce-desktop-mac/



### VisualStudio Code

ダウンロードリンク : https://code.visualstudio.com/

Setting Sync で設定を同期することもできるが、あえて1からセットアップする。

#### 拡張機能

- Bracket Pair Colorizer 2
- Code Runner
- Draw.io Integration
- GitHub Theme
- google-search
- Material Icon Theme
- Remote Container

#### 設定

- "diffEditor.ignoreTrimWhitespace": false
- "editor.fontSize": 13
- "editor.mouseWheelZoom": true
- "editor.renderWhitespace": "boundary"
- "editor.tabCompletion": "on"
- "workbench.editor.enablePreview": false
    - ↑ ファイルを常に新しいタブで開く設定
- "workbench.startupEditor": "newUntitledFile"
- "window.zoomLevel": 1
- "files.autoSave": "afterDelay"
- "files.defaultLanguage": "markdown"
- "explorer.confirmDelete": false
- "explorer.confirmDragAndDrop": false
- "extensions.ignoreRecommendations": true
- "terminal.integrated.copyOnSelection": true
- "terminal.integrated.fontSize": 13



### GitHub Desktop

ダウンロードリンク : https://desktop.github.com/



### HyperSwitch

ダウンロードリンク : https://bahoom.com/hyperswitch

#### 設定

- Include windows from other spaces をチェック
- Include windows from other screens をチェック
rubyにおける変数の種類

# rubyにおける変数の種類

変数の種類が色々あってどう使い分けるかわからなかったので，自分用にメモを残す．

# 目次
1. [ローカル変数]
2. [インスタンス変数]
3. [クラス変数]
3. [グローバル変数]

<a id="anchor1"></a>
# ローカル変数
* 小文字or_(アンダーバー)で始まる.
* メソッドや，ブロック内のローカルなスコープで参照できる．

```ruby:local.rb
def local()
  a = 3
end
p a

# =>Traceback (most recent call last):
local.rb:5:in `<main>': undefined local variable or method `a' for main:Object (NameError)
```
localメソッドで定義されたaは，メソッドの外からは呼び出せない．


<a id="anchor2"></a>
# インスタンス変数
* @で始まる．
* 同じクラス内であれば，違うメソッドからも参照可能．
* インスタンスごとに値を保持できる．

```ruby:instance.rb
class Instance
  def set_val(val)
    @val = val
  end

  def put_val
    p @val
  end
end

test1 = Instance.new
test1.set_val("aaa")
test1.put_val

test2 = Instance.new
test2.put_val


# =>
"aaa"
nil
```
インスタンスtest1の@valに，set_valメソッドを用いて，"aaa"を入れる．
その後，インスタンスtest2において，put_valを呼び出すが，nilが返ってくる．
ここから，各インスタンスごとに値を保持していることがわかる．

```ruby:instance.rb
class Instance
  def set_val(val)
    @val = val
  end

  def put_val
    p @val
  end
end

test1 = Instance.new
test1.set_val("aaa")
test1.put_val

test2 = Instance.new
test2.set_val("bbb")
test2.put_val
# =>
"aaa"
"bbb"
```
インスタンスtest2に対してもset_valメソッドを用いる必要がある．

<a id="anchor3"></a>
# クラス変数

* @@で始まる．
* 同じクラスのすべてのインスタンスで共有される．

```ruby:class.rb
class Instance
  def set_val(val)
    @@val = val
  end

  def put_val
    p @@val
  end
end

test1 = Instance.new
test1.set_val("aaa")
test1.put_val

test2 = Instance.new
test2.put_val
# =>
"aaa"
"aaa"
```
先ほどのインスタンス変数とは違い，値が同じクラスのすべてのインスタンスで共有されている．

```ruby:class.rb
class Instance
  def set_val(val)
    @@val = val
  end

  def put_val
    p @@val
  end
end

test1 = Instance.new
test1.set_val("aaa")
test1.put_val

test2 = Instance.new
test2.set_val("bbb")
test2.put_val

test1.put_val

# => 
"aaa"
"bbb"
"bbb"
```


<a id="anchor4"></a>
# グローバル変数

* $で始まる．
* プログラムのどこからでも参照できる．

```ruby:global.rb
class Global
  def set_val(val)
    $val = val
  end
end

test1 = Global.new
test1.set_val("aaa")

p $val

# => 
"aaa"
```
tblsでBigQueryのデータセットのドキュメントを生成する

本エントリでは、[tbls](https://github.com/k1LoW/tbls)でBigQueryのデータセットのドキュメントを生成するところまでを紹介します。

"**既にGCPでプロジェクトとデータセットは作成済み**" というところから説明したいと思います。

ただ、今回はGCPが公開しているプロジェクト `bigquery-public-data` と、そのデータセットの1つ `census_bureau_international` を利用しますので、必ずしもデータセットを用意する必要はありません。

## 1. サービスアカウントの作成とキーファイルのダウンロード

tblsでBigQueryのデータセットにアクセスするときは、設定ファイル `tbls.yml` で、以下のようにDSNを指定します。

```yaml
# tbls.yml
dsn: bq://bigquery-public-data/census_bureau_international?creds=/path/to/google_application_credentials.json
```

まず上記の `?creds=/path/to/google_application_credentials.json` のクレデンシャルファイル `google_application_credentials.json` を作成します。

![tbls-bq-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808/49064aa8-61c3-c05b-a530-4300bbf1570c.png)

まず、コンソールの「IAMと管理 > サービスアカウント」で「サービスアカウントを作成」をクリックします

![tbls-bq-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808/8a4bd710-1ae2-c073-840b-a6d9fab5feef.png)

サービスアカウントの詳細を入力します

![tbls-bq-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808/a517ea19-94c8-ef3b-6d16-39d73d3037e0.png)

サービスアカウントの権限は「BigQueryメタデータ閲覧者」で良いです。
（ちなみに、詳しい人用に必要なPermissionを挙げると `bigquery.datasets.get` `bigquery.tables.get` `bigquery.tables.list` の3つです）

![tbls-bq-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808/1519021c-4489-8497-8d90-1ddd8101c6e3.png)

「キーを作成」をクリックします。

![tbls-bq-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808/af0b5028-8fd2-fe52-cab8-4aa16624478a.png)

キーのタイプは「JSON」です。

で、ダウンロードされたJSONを、今回は

「 `google_application_credentials.json` にファイル名を変更して `/path/to/google_application_credentials.json` に置いた」

ということにしましょう。

## 2. tblsのインストール

MacユーザはHomebrewでインストールするのがいいでしょう。

```console
$ brew install k1LoW/tap/tbls
```

その他のOSを使っている方は、[tblsのREADME#install](https://github.com/k1LoW/tbls#install)を見て適切なインストール方法を選択してください。

## 3. tbls.yml の作成

任意のディレクトリでtbls.ymlファイルを作成します。

```yaml
# tbls.yml
dsn: bq://bigquery-public-data/census_bureau_international?creds=/path/to/google_application_credentials.json
```

## 4. ドキュメントの作成

ドキュメントを作成します。tbls.ymlがあるディレクトリで以下のコマンドを実行してください。

```console
$ tbls doc -f
```

`dbdoc` ディレクトリが作成されて、その中にMarkdown形式でドキュメントが生成されていると思います。

GitHubのリポジトリにコミットしてみると、[ちょうどこんな感じです](https://github.com/k1LoW/tbls/tree/master/sample/bigquery_census_bureau_international)。

## おまけ. Excelのテーブル定義書の出力

tbls.ymlがあるディレクトリで以下のコマンドを実行してください。

```console
$ tbls out -t xlsx -o tbls.xlsx
```

<img width="667" alt="スクリーンショット 2020-05-21 1.32.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808/17229dba-35ba-20a9-c502-e63439fed331.png">

出力されますね。

 `Columns` や `Name` を日本語にしたい場合は[tbls.ymlの`dict:` の設定を追加してみてください](https://github.com/k1LoW/tbls#dictionary)。

以上、[tbls](https://github.com/k1LoW/tbls)でのBigQueryのデータセットのドキュメント生成の紹介でした。
Webを支える技術 第5部 まとめ

Webを支える技術 第5部 まとめ

#Webサービスの設計
WebサービスやWeb APIの設計では、HTTPやRESTだけなく様々な知識が必要になってくる。

# 第15章 読み取り専用のWebサービスの設計
WebサービスやAPIの設計には、システム全体の設計や内部クラス、DBといったような広範囲に渡る設計が必要になってくる。

###リソース設計とは
その中でもリソース設計とは、以下のようなクライアント-サーバ間のインターフェースの設計を指す。(URIの命名、リソースの分割など)

尚リソースを設計する際には、「人間向けののWebサービス」と「プログラム向けのWeb API」を分けずに設計することが重要になってくる。(分けて設計すると機能が違ったものになりがち)

###リソース指向アーキテクチャのアプローチ
以下は「リソース指向アーキテクチャ」に基づいた開発アプローチである。

1. Webサービスで提供するデータを特定する
2. データをリソースに分ける
3. リソースにURIで名前を付ける
4. クライアントに提供するリソースの表現を設計する
5. リンクのフォームを利用してリソース同士を結び付ける
6. イベントの標準的なコースを検討する
7. エラーについて検討する

### 1. Webサービスで提供するデータを特定する
リソース設計の最初の工程であり、サービスで提供するデータを特定する作業。

### 2. データをリソースに分ける
1で特定したデータをリソースとして分割する作業。
何をもってリソースとするか、リソースをどのような単位で分割するかなど非常に重要な取り決めを行う工程である。
また、最適なリソース分割を行うため、この工程を何回も繰り返すのが一般的である。

###3. リソースにURIで名前を付ける
リソースにURIを命名する作業。
WebサービスやAPIを利用する相手にとって、なるべく使いやすいURIを検討することが重要である。

###4. クライアントに提供するリソースの表現を設計する
リソースの表現形式を設計する作業。
表現形式には以下のようなものが挙げられる。

- XML表現
    - XHTML
    - Atom
    - 独自XML
- 軽量フォーマット表現
    - JSON/JSONP
    - YAML
    - CSV
- マルチメディア表現
    - 画像(jpg,png,bmp,gif)
    - 映像(mp4,wmv,avi,webm)
    - マルチページ(pdf,tiff)

各表現形式には得意不得意があり、1つのリソースが複数の表現形式に対応していると便利。

###5. リンクのフォームを利用してリソース同士を結び付ける
1~4で設計してきたリソース同士をリンクで接続する。
通常のWebページでは、トップページへのリンクやパンくずリスト、グローバルナビゲーションを用意しておくことで、クライアントが他のリソースに移動しやすく設計されていることが多い。

###6. イベントの標準的なコースを検討する
利用者がどのようなフローで利用するか検討する。

###7. エラーについて検討する
利用時に起こりうるエラーの検討。

# 第16章 書き込み可能なWebサービスの設計
最近のWebサービスは、何らかの形で書き込み機能があるものがほとんどである。
書き込み機能を実装する場合、読み取り専用のサービスと比較して、より多くの処理を考えなければならない。

###リソースの作成
リソースの作成にはHTTPの「POST」もしくは「PUT」を使う方法があり、一般的にはPOSTを使う方が無難。

###リソースの更新
リソースの更新に置いては「PUT」で行う。但し、バッチ処理を行う際には「POST」を利用する。

###リソースの削除
削除したいリソースのURIに「DELETE」を送ることで削除できる。
削除設計においての注意点は、親子関係にあるリソースの削除についてである。一般的には親リソースを削除した場合、付随して子リソースも削除すべき。

###バッチ処理
処理を大量に行う場合、一つ一つリクエストを送信していてはサーバに負荷がかかってしまう。これはリクエストを一括して送信(バッチ処理)する機能を実装することで解決できる。(POSTで送信)

###トランザクション
トランザクションは複数のリソースにまたがって行う処理を一つの処理として扱うことで、「一つでも処理に失敗したら全て失敗」というような一貫性を保証する。

###排他制御
複数のクライアントが一つのリソースを変更しようとした際に、競合を起こさないよう一つのクライアントのみが変更できるように制御する処理。大きく分けて「悲観的ロック」と「楽観的ロック」の二つがある。

- 悲観的ロック
    - ユーザをあまり信用せず、絶対に競合が発生しないように制御する方法

- 楽観的ロック
    - 悲観的ロックに対して、競合が起きたときにのみ排他制御をする方法

##設計のバランス
- なるべくシンプルに保つ
    - 設計が複雑になったり無駄な機能が増えてきた場合、一段階メタな視点で全体を考え直すこと。
    - 全体をシンプルに保つことは、設計のバランスにおいて最も重要
    
- 困ったらリソースに戻って考える
    - HTTPメソッドで実装出来ない機能があると感じたら、独立した別リソースで代替できないか検討する
    
- 本当に必要ならPOSTで何でも出来る
    - PUTの方が処理が簡単になるとしても、バッチ処理などで複数のリソースが対象になった時点で、POSTにシフトした方が賢明である。

# 第17章 リソースの設計

##リソース指向アーキテクチャの落とし穴

第15章の「リソース指向アーキテクチャ」にある

1.Webサービスで提供するデータを特定
2.データをリソースに分ける

について何を基準にこれらを行っていくのかが曖昧である。

この基準を明確にするため、既存の設計手法で得られる以下の成果物を元にリソースを設計する。

- 関係モデルのER図
- オブジェクト指向モデルのクラス図
- 情報アーキテクチャ

###関係モデルからの導出
関係モデルはRDBMSの基礎となっているデータモデルで、データの正規化の手法が確立されているため、効率的なDB設計を行える。

###オブジェクト指向モデルからの導出
オブジェクト指向設計の成果物であるクラス図やシーケンス図を使い、リソースの導出を検討する。

###情報アーキテクチャからの導出

情報アーキテクチャは、知識やデータの組織化を意味し「情報を分かりやすく伝える」「受け手が情報を探しやすくする」といったことを実現するための表現技術

難易度は高いがWebデザインにおける

- ユーザの操作
- ページ遷移
- ネットワーク通信
- アプリケーションの実行

などといった複雑なデザインをリソースの設計と共に整理して、ユーザビリティを高めることが可能である。

##リソース設計で最も重要なこと
**リソース設計する際に、WebサービスとWeb APIを分けて考えないことが最も重要である**

##※参考
・Webを支える技術
https://www.amazon.co.jp/dp/4774142042/ref=cm_sw_em_r_mt_dp_U_LiIUEbQ3NJSJH
コメントの投稿者名を表示したい

User,Post,Commentの３つのリレーションが、以下の時にコメント一覧でコメントの投稿者名を表示させたい。

```ruby:user.rb
has_many :posts
has_many :comments
```

```ruby:post.rb
belongs_to :user
fas_many :comments
```

```ruby:comment.rb
belongs_to :user
belongs_to :post
```

```ruby:show.html.erb
<p>コメント一覧</p>
<% @comments.each do |c| %>
    <hr>
    <a href="/users/#{c.user_id}"><%= c.user.name %></a>
    <%= c.content %>
<% end %>
```

c.user.nameのnameがNoMethodErrorとなるので、posts.controllerに以下の１行追加することでcommentに関係したuserの情報を取り入れることができる。

```ruby:posts.controller.rb
def show
   @comments = @post.comments.includes(:user).all
end
```
WSL2にCentOSを設定する

前回の記事で準備したWSL2にCentOSを設定します。

[WSLを２に更新する](https://qiita.com/nanaki11/items/a12a76c00e210ac45b98)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/c65a9a8d-dae5-3593-fc96-6e3699c7e474.png)

こんな感じでCentOSがないです。
UbuntuをWSL2に更新しました。
UbuntuはGUIで使う場合、Windowsに似ていて使いやすいはいいですがCLIで使うのはLinux RH系（CentOS）がいいかなと思います。
一般的にサーバーとかに使われているディストリビューションですしね！

#2020/05/31追記
Githubのコメントに書いてあるとおりまだ8は正式版ではないためか動作がおかしくなりました。

[Docker Desktop for Windows を使ってみる](https://qiita.com/nanaki11/items/97e5685ed84547526be2)
こっちの記事書いたときには7使ってます。
Dockerをいれたことで下記の方法ができるようになったのでおかしくなった人は試してください。


```
#DockerでCentSO8イメージをPullしてくる
PS C:\Users\XXX> docker run --name centos8 centos:8
Unable to find image 'centos:8' locally
8: Pulling from library/centos
8a29a15cefae: Pull complete
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:8
#イメージをtarでエクスポート
PS C:\Users\XXX> docker export -o centos8.tar centos8
#既存のディストリビューションを削除
PS C:\Users\XXX> wsl --unregister centos8                  
登録を解除しています...
#インポート
PS C:\Users\XXX> wsl --import centos8 .\centos8 centos8.tar
#起動
PS C:\Users\XXX> wsl -d centos8
[root@LAPTOP-4HT7SUTT XXX]# 
```


#ダウンロード・インストール
https://github.com/yuk7/CentWSL
上記Githubからzipをダウンロードします。
解凍後、exeを叩いてインストールしてください。


#CentOSを設定

```
PS C:\Users\XXX\VSCode> wsl -l -v       #CentOSがインストールされていることを確認    
  NAME          STATE           VERSION    
* Legacy        Stopped         1      
  kali-linux    Stopped         1      
  Ubuntu        Stopped         2
  CentOS7       Stopped         2
  CentOS8       Stopped         2  
PS C:\Users\XXX\VSCode> wsl -s CentOS8  #wslにCentOS8を設定
PS C:\Users\XXX\VSCode> wsl -l -v       #確認
  NAME          STATE           VERSION
* CentOS8       Stopped         2      
  Legacy        Stopped         1      
  kali-linux    Stopped         1      
  Ubuntu        Stopped         2
  CentOS7       Stopped         2
```
 「wsl -e」とかでデフォルトに設定したCentOS8を起動して使います。



#参考
[Windows Subsystem for Linux のコマンド リファレンス](https://docs.microsoft.com/ja-jp/windows/wsl/reference)
【laravel】ペジネーションの作成

# 概要
素のPHPでペジネーションを作成するなら仕組み定義する必要がありますが、laravelではその仕組みが用意されています。
また、クエリビルダで記述するためDBクラスでもモデルクラスでも同じように記述できます。

# ペジネーションの作成
laravelでのペジネーションはとてもシンプルで`paginate(表示数)`をクエリビルダで記述するだけです。
`paginate()`で作成されたペジネーションはテンプレートで`links()`により取得します。

```php:Contoller（DBクラス）
public function index() {
  $items = DB::table('sample')->paginate(5);
  return view('sanmple.index',['items'=>$items]);
}
```

```php:Contoller（モデルクラス）
public function index() {
  $items = Sample::paginate(5);
  return view('sanmple.index',['items'=>$items]);
}
```

```php:view
{{ items->links() }}
```

## linksメソッド
値を取得する`links()`ではペジネーションの表示を行うコードが生成されます。
生成されるHTMLがわかればCSSでデザインを編集できるので参考にタグとクラスだけざっくりと書きます。
また、laravelのペジネーションで生成されるHTMLはBootstrapのCSSと互換性があるため、cssを上書きすることでデザインを編集できます。

```php:
<ul class="pagination">
// 前のページのリンク
  <li class="page-item disabled" ...>
    <span class="page-link" >&lsaquo;</span>
  </li>
// 現在のページ
  <li class="page-item active">
    <span class="page-link">1</span>
  </li>
// ページリンクのリンク
  <li class="page-item">
    <a class="page-link" href="http://...?page=2">2</a>
  </li>
// 次のページのリンク
  <li class="page-item">
    <a class="page-link" href="http://...?page=2" ...>&rsaquo;</a>
  </li>
</ul>
```


## 並び替えて表示
クエリビルダの`orderBy(値, 並び順)`でレコードを並び替えて表示します。
`orderBy()`の並び順はデフォルトでascとなっているので、昇順で並び替える場合は指定する必要はありません。

ここでは`id`と`name`のリンクを作成して、リンクのクエリーから並び替える値（カラム）を取得する例にしています。

また、ページが変わっても並び順が変わらないようにペジネーションのリンクコードに、`appends()`という生成するリンクにパラメータを追加するメソッドを追加しました。
`appends('sort' => $sort)`でリンク先にsort=◯◯というパラメータが追加されるようになります。

```php:view
<a href="/hello?sort=id">id</a>
<a href="/hello?sort=name">name</a>
```

```php:Contoller（DBクラス）
public function index() {
  $sort = $request->sort;
  $items = DB::table('sample')->orderBy($sort,)->paginate(5);
  return view('sanmple.index',['items'=>$items]);
}
```

```php:Contoller（モデルクラス）
public function index() {
  $sort = $request->sort;
  $items = Sample::orderBy($sort,)->paginate(5);
  return view('sanmple.index',['items'=>$items]);
}
```

```php:view
{{ $items->appends(['sort' => $sort])->links() }}
```

# 参考
[Laravel 6.x データベース：ペジネーション]
(https://readouble.com/laravel/6.x/ja/pagination.html)
[Bootstrap / Pagination]
(https://getbootstrap.jp/docs/4.5/components/pagination/)
[phpのページングは難しくない!シンプルに覚えるサンプル付き解説]
(https://www.sejuku.net/blog/70234)
2020年から始めるAzure Cosmos DB - 目次

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/000b59b3-df7a-94e9-e70f-1c21c0cb3839.png)

# はじめに

本記事は、2020年3月6日 (米国時間) にて、`Azure Cosmos DB` に新しく **Free Tier (無償利用枠)** が登場したことに伴い、改めて Azure Cosmos DB を色々と触っていこうということで書いた記事を一元管理できるよう、目次ページとして作成しているものです。
※新しい記事を作成するたびに、この記事は随時更新する予定です。


# Serverless

- [Azure Cosmos DB サーバレス (preview) 情報まとめ][about-serverless]


# Azure Synapse Link

- [Azure Synapse Link を試してみる][synapse-link-01]
- [Azure Synapse Link Demo (Part. 1)][synapse-link-demo-01]
- [Azure Synapse Link for Azure Cosmos DB API for MongoDB を試す][synapse-link-demo-mongo-01]
- [Azure Synapse Link for Azure Cosmos DB に T-SQL 対応が来たので早速試してみる][synapse-link-tsql]


# 環境

- [環境構築][create-env]
- [Azure Cosmos DB の無償枠 (Free Tier) の注意点][note-free-tier]


# アプリ開発

- [Node.js で CRUD アプリを作る][crud-app-nodejs]


# ライブラリ関連

- [JavaScript SDK (SQL API)を見てみる (Part.1)][js-sdk-sql-1]
- [JavaScript SDK (SQL API)を見てみる (Part.2)][js-sdk-sql-2]
- [JavaScript SDK (SQL API)を見てみる (Part.3)][js-sdk-sql-3]


# Azure Cosmos DB Workshop

## .NET (V3) Labs

- [.NET (V3) Labs Part.1 - .NET SDK を使用したパーティション化されたコンテナーの作成][dotnet-labs-01]
- [.NET (V3) Labs Part.2 - Azure Data Factory を使用した Cosmos DB へのデータのロード][dotnet-labs-02]

# ブログ記事

- [Azure Cosmos DB デザインパターン][cosmos-designpattern]

# JCDUG

## YouTube

- [Japan Azure Cosmos DB User Group][jcdug-youtube]

## connpass

- [Japan Azure Cosmos DB User Group][jcdug-connpass]


---

[create-env]:https://qiita.com/ymasaoka/items/3784c64baf30bbe7b761
[crud-app-nodejs]:https://qiita.com/ymasaoka/items/0b0b726354c3cfd38021
[js-sdk-sql-1]:https://qiita.com/ymasaoka/items/18ec24f29fd2a90af4a4
[js-sdk-sql-2]:https://qiita.com/ymasaoka/items/f4b2beef93ca1a84af7a
[js-sdk-sql-3]:https://qiita.com/ymasaoka/items/b543e09812d904f8f848
[dotnet-labs-01]:https://qiita.com/ymasaoka/items/010440c47919579645da
[dotnet-labs-02]:https://qiita.com/ymasaoka/items/63d39b64d3705e56e453
[synapse-link-01]:https://qiita.com/ymasaoka/items/3caac5045f0e5349504f
[synapse-link-demo-01]:https://qiita.com/ymasaoka/items/c177152672a8280ff4f7
[synapse-link-demo-mongo-01]:https://qiita.com/ymasaoka/items/48539b8994b357fba0be
[synapse-link-tsql]:https://qiita.com/ymasaoka/items/6f85beaad7695f53e18a
[about-serverless]:https://qiita.com/ymasaoka/items/6cd01d4215bb48b22b3e
[note-free-tier]:https://qiita.com/ymasaoka/items/ffc3a44eef75bda5a502

[cosmos-designpattern]:https://qiita.com/ymasaoka/items/fde3363e2ac1b41d250b

[jcdug-youtube]:https://www.youtube.com/channel/UCaOc9S5whXVQq7rjM3LvGsA/featured
[jcdug-connpass]:https://jcdug.connpass.com/
node.jsとnpmとwebpack、nodenvとanyenvメモ

ここら辺の用語が今だに混乱するのでこの機会にまとめておきます。

## node.js

昔node.jsでExpressを使ってシステムを組んだりした関係でJavaScriptをサーバサイドで使えるようにするもの、ぐらいの理解だったので、なぜフロントエンドでnode.jsが必要なのかわからなかった。

以下の方の説明がわかりやすかった。
https://qiita.com/kobalab/items/e0c2a3d5a9f4c172bad0

>Node.jsとは、Google Chromeに搭載されている高速なJavaScriptエンジンV8をコマンドラインから使えるようにしたJavaScript言語処理系
要はjavaコマンドやperlコマンドと同じです。node hoge.js で hoge.js に書かれたJavaScriptのプログラムを実行します。node とだけタイプすると対話モードに入るので、インタフェースはshに近いといえるかもしれません。

つまり本来はブラウザでの動作に特化したJavascriptをJavaScriptエンジンV8を使ってUnix系で使うときに必要なもの。上記のインタープリター機能やnpmも含まれている。

なぜフロントエンド開発でもnode.jsが必要なのか調べたところ、
大量のフロントエンド向けjavaScriptのモジュールが下記の**npm**向けに開発されていて、それを利用するためにnode.jsが必要だから、ということらしい

## npmとは
node.jsのモジュール、パッケージ管理ツール。
パッケージ管理システムでNode Package Managerの意。
Node.jsをインストールすると一緒にくっついてくる。

Ruby的に言えば、npmはBundler、パッケージはGem、package.jsonはGemfileのようなもの？
例えば**webpack**などを管理する。


##webpackとは
機能や関数単位ごとに別れたJavaScriptモジュールを一つのファイルに統合（バンドル）してくれるツールモジュールバンドラーと呼ばれています。
また、JavaScriptだけでなく、CSSや画像などのバンドルも可能。


##nodenvとは
node.jsのバージョン管理ツール

##anyenv
node.jsのnodenvやrubyのrbenvなどのバージョン管理ツールをまとめて管理してくれるツール。
【Swift】SVProgressHUDの表示がiOS13以上だとおかしくなる

結構古くからある「SVProgressHUD」というローダーのライブラリがあります。
癖が無くて使いやすいのですが、iOS13.0で動かしてみたら画面中央では無く何故か左上の隅っこに表示されてしまいました。

![72616955-f5fd9580-395d-11ea-93e3-9d0310f525bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55603/90e46151-1fde-4a66-71d7-f00666311bc6.png)

## 対応策
#### AppDelegate.swift

```Swift
static var standard: AppDelegate {
  return UIApplication.shared.delegate as! AppDelegate
}
```

#### SceneDelegate.swift

```Swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
  guard let _ = (scene as? UIWindowScene) else { return }
  AppDelegate.standard.window = window
}
```

以上のように変更するとiOS13系でもローディングが中央に表示されるようになった。
CentOS7のNW設定

# はじめに
CentOS7のネットワーク設定についてメモ

# ネットワークの設定
NetworkManagerサービスによってネットワーク設定を管理

* NICを表すデバイス
* 接続(デバイスに適用する設定)

デバイスに接続(設定)を紐付ける

定義済みのデバイスの確認
**CONNECTIONが接続**

```bash

# nmcli d
DEVICE   TYPE      STATE     CONNECTION 
enp0s25  ethernet  接続済み  enp0s25    
lo       loopback  管理無し  -- 
```

定義済みの接続の確認

```
# nmcli c
NAME     UUID                                  TYPE      DEVICE  
enp0s25  173098fd-54de-48b1-95a1-ceaa687089ab  ethernet  enp0s25 
```


# 新たな接続の定義
* **新しく接続したNICに対して新規の接続を紐付ける**
* nmcli -d でデバイスはあるが、接続がない状態


nmcliとnmtuiで接続を作成して、デバイスを紐付ける
nmtuiはGUIで設定できる

# VLANデバイスの作成
VLAN77を作成

```
# nmcli c add type vlan ifname vlan77 con-name vlan-vlan77 dev enp0s25 id 77
接続 'vlan-vlan77' (1092e677-f16b-4a35-8839-19739d20a011) が正常に追加されました。
```

```/etc/sysconfig/network-scripts/vlan-vlan77
  1 VLAN=yes
  2 TYPE=Vlan
  3 PHYSDEV=enp0s25
  4 VLAN_ID=77
  5 REORDER_HDR=yes
  6 GVRP=no
  7 MVRP=no
  8 PROXY_METHOD=none
  9 BROWSER_ONLY=no
 10 BOOTPROTO=dhcp
 11 DEFROUTE=yes
 12 IPV4_FAILURE_FATAL=no
 13 IPV6INIT=yes
 14 IPV6_AUTOCONF=yes
 15 IPV6_DEFROUTE=yes
 16 IPV6_FAILURE_FATAL=no
 17 IPV6_ADDR_GEN_MODE=stable-privacy
 18 NAME=vlan-vlan77
 19 UUID=1092e677-f16b-4a35-8839-19739d20a011
 20 DEVICE=vlan77
 21 ONBOOT=yes
```

上にIPアドレスを設定する

## vlanデバイスの稼働確認

```
 cat /proc/net/vlan/config 
VLAN Dev name    | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS
```

詳細

```
# cat /proc/net/vlan/vlan77 
vlan77  VID: 77  REORDER_HDR: 1  dev->priv_flags: 1
         total frames received            0
          total bytes received            0
      Broadcast/Multicast Rcvd            0

      total frames transmitted           13
       total bytes transmitted         1022
Device: enp0s25
INGRESS priority mappings: 0:0  1:0  2:0  3:0  4:0  5:0  6:0 7:0
 EGRESS priority mappings: 
```
表領域作成を簡略化するスクリプト

##目的
毎回create tablespace文を1から作るのは面倒なので、create tablespace文の可変部分のみを変数として指定するスクリプトを作成しました。
検証環境等で複数の表領域を作成するときに使用すると便利です。

##create_tbs.sql
```
set ver off echo off feed off
create tablespace &1 datafile '&2' size &3;
exit
```

＜置き換え変数の用途＞
&1：表領域名 
&2：データファイルのフルパスファイル名
&3：データファイルのサイズ以降の情報（サイズの指定以外は省略可）

##実行例
```
[oracle@test ~]$ sqlplus -s / as sysdba @create_tbs.sql test $ORACLE_BASE/oradata/test/test.dbf '1m reuse autoextend on'
[oracle@test ~]$ 
[oracle@test ~]$ sqlplus -s  / as sysdba
select tablespace_name from dba_tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS
TEST　<==追加された
SMALL
BIG

8行が選択されました。
```

##応用
###シェルスクリプトの使用
シェルスクリプトを使用すれば、リストファイルに記載した表領域をまとめて作成することができます。

###用意する資材
1.create_tbs.sh ・・・メインシェル。dbf.lstを読み込み、create_tbs.sqlとselect_tbs.sqlに引数として渡す。
2.create_tbs.sql・・・表領域作成SQL
3.select_tbs.sql・・・表領域作成状況の確認SQL
4.dbf.lst       ・・・作成する表領域一覧

####create_tbs.sh
```
#!/bin/bash

echo "表領域の作成を開始します。"
ERR_CNT=0

while read LINE
do
#各種変数
TBS=`echo $LINE | cut -d " " -f 1`
FILE=`echo $LINE | cut -d " " -f 2`
 
#既存データ重複判定
CNT1=`sqlplus -s / as sysdba @select_tbs.sql $TBS $FILE`
if [ $CNT1 -ge 1  ]; then
  echo -e "表領域名またはデータファイル名が重複しています。\n表領域：$TBS\nデータファイル:$FILE)"
  ERR_CNT=`expr $ERR_CNT + 1`
 else
  #表領域作成
  sqlplus -s / as sysdba @create_tbs.sql $LINE
  CNT2=`sqlplus -s / as sysdba @select_tbs.sql $TBS $FILE`

  #表領域作成後の状態判定
  if [ $CNT2 -eq 1 ]; then
    echo "表領域：$TBSを作成しました。(データファイル:$FILE)"
   else
    echo "表領域：$TBSの作成に失敗しました。(データファイル:$FILE)"
    ERR_CNT=`expr $ERR_CNT + 1`
  fi
fi
done < $1

#シェル自体の状態判定
if [ $ERR_CNT -eq 0 ] ;
then
  echo "すべての表領域が正常に作成されました。"
  exit_code=0
else
  echo "作成に失敗した表領域があります。"
  exit_code=1
fi

exit $exit_code
```

＜実行方法＞
./create_tbs.sh [リストファイル(dbf.lst)]

####create_tbs.sql
(既出のため省略)

####select_tbs.sql
```
set lines 100 pages 1000 echo off feed off ver off head off

select count(1) from dba_data_files where tablespace_name = lower('&1') or tablespace_name = upper('&&1') or file_name='&2';

exit
```

＜実行方法＞
select_tbs.sql [表領域名] [データファイルのフルパスファイル名]

####dbf.lst
```
test1 /u01/app/oracle/oradata/test/test1.dbf '1m reuse'
test2 /u01/app/oracle/oradata/test/test2.dbf '1m reuse'
test3 /u01/app/oracle/oradata/test/test3.dbf '1m reuse'
```

＜ファイルフォーマット＞
[表領域名] [データファイルのフルパスファイル名] '[サイズ以降の項目(サイズは必須)]'

###実行例
```
[oracle@test ~]$ . create_tbs.sh dbf.lst
表領域の作成を開始します。
表領域：test1を作成しました。(データファイル:/u01/app/oracle/oradata/test/test1.dbf)
表領域：test2を作成しました。(データファイル:/u01/app/oracle/oradata/test/test2.dbf)
表領域：test3を作成しました。(データファイル:/u01/app/oracle/oradata/test/test3.dbf)
すべての表領域が正常に作成されました。
```
個人アプリ制作２　WEBフォントの導入

# 今日の実装
①　controller users tweet
②　model　user(devise) tweet
③　haml scssの導入
④　viewの作成　tewwt index

## webフォントの導入　Google Web Fonts
今回はおしゃれフォントをにしするためにGoogle Web Fontsを使用した。
 <img width="1058" alt="study-support.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589433/2cfb76c5-03ae-99ae-591e-177b9059c484.png">

###導入方法
今回はscssで導入方法を記述する。
####１　使いたいフォントを探す
google fonts から使いたいフォントを探す。
[Google Web Fonts](https://fonts.google.com/)
<img width="1400" alt="google-fonts.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589433/a33b665b-89b5-cf1b-b8a2-16a99c68b67c.png">
右上にタブの

link href="https://fonts.googleapis.com/css2?family=Anton&display=swap" rel="stylesheetのURLをコピーする。

####２　SCSSに読み込ませる
```app/assets/stylesheets/application.scss
@import url(https://fonts.googleapis.com/css?family=Anton);
```
これでSCSS内でfontfamilyでAntonを使用することができる。

####3 SCSSに使う。
```app/assets/stylesheets/modules/_tweets.scss
font-family: 'Anton', sans-serif;
```
すると　下のstudy-supportにAntonフォントが適用される。
<img width="1058" alt="study-support.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589433/2cfb76c5-03ae-99ae-591e-177b9059c484.png">

####注意
上のサイトgoogle fontsは日本語が対応していないものがほとんどなので日本語は適用されない場合が多い。
私は、日本語だけ適用されないことに気づかず４０分ほど時間を浪費した笑

今回はapplication.scssに読み込ませたが他の導入方法をあります。

####参考サイト
[Google Web Fontsを使ってみよう](http://www.shurey.com/html/googlewebfont.html)

# 今日のアイディア
## 投稿機能に動画を埋め込む
投稿機能（アウトプット）を今日勉強したことの自分のアウトプット動画をいれる
## 経緯
昨今はyoutubeなどの動画をみて学習したり、Twitter等でアウトプットをすることが動画でアウトプットをしているのが少なく見えた。時代の流れから推測するにSNSは、文字による表現➯文字＋写真（インスタグラム）➯動画（youtubeにより個人の発信）となり、時代は動画にあると感じる。今よりももっと個人で発信できることを踏まえ、個人アプリstudy-supportでは、投稿機能に動画によりアウトプットもできるようにしたい。人に何かを伝えることが1番の勉強である。動画という選択肢はアウトプットの幅を広げることだと感じる。
GAS メモ（スプレッドシート編）

# GAS とは？

**G**oogle **A**pps **S**cript

Google スプレッドシート、 Google ドキュメント、Google フォームといった Google のサービスでもっと楽したいときに使えるスクリプト。ほぼ JavaScript。Google アカウントさえあれば誰でも使える。

この記事は Google スプレッドシートの GAS コーディングで使うメソッド等をメモしたもので、0 からのハウツーではないです。

# GAS コーディング メモ（スプレッドシート編）

ここでは基本、以下の変数名を使っています。
複数使う場合は通し番号付けています。

|変数名|内容|
|:--|:--|
|spread_sheet|スプレッドシートそのもの（ファイル）のオブジェクト|
|sheet|シート（タブで分かれてるやつ）のオブジェクト|
|cell|単一のセルのオブジェクト|
|range|セルの範囲のオブジェクト|

GAS のスプレッドシート操作は、基本これらのオブジェクトそれぞれに用意されているメソッドを使う。

## スプレッドシート（ファイル）のオブジェクトを作成
```javascript
var spread_sheet1 = SpreadsheetApp.getActiveSpreadsheet();  // 今開いているスプレッドシートを参照する場合はこれでOK
var spread_sheet2 = SpreadsheetApp.openById('スプレッドシートのID');  // スプレッドシートを指定して参照する場合はこっち
```
スプレッドシートの ID は、スプレッドシートの URL の↓
https://docs.google.com/spreadsheets/d/ここの長ったらしい英数文字列/edit#gid=0

## シートのオブジェクトを作成
```javascript
var sheet1 = spread_sheet.getSheetByName('シート1');  // シート名を指定して参照する場合
var sheet2 = SpreadsheetApp.getActiveSheet();  // 今開いているスプレッドシートの今アクティブになっているシートを参照する場合
```

## 単一のセルのオブジェクトを作成
```javascript
var cell1 = sheet.getRange('A3');  // セル A3 のオブジェクトを作成
var cell2 = sheet.getRange(1, 1);  // セル(1, 1) = A1 のオブジェクトを作成
```
行列を数字で指定する場合、数えは 0 ではなく 1 から始まる。

## セルの範囲のオブジェクトを作成
```javascript
var range2 = sheet.getRange('A1:B2');  // A1～B2 の 4 セルが対象
var range1 = sheet.getRange(1, 1, 2, 2);  // こういう書き方もできる（↑と同じ A1～B2 の意味）
```
行列を数字で指定する場合、数えは 0 ではなく 1 から始まる。

## セルの値を取得
```javascript
var value = cell.getValue();
```
値の型まで取得する。
例えば、日付は「4/20」が入っていても、文字列の "4/20" ではなく、"Fri Apr 10 00:00:00 GMT+09:00 2020"を取得する。

## セルの値を見たまま（文字列として）取得
```javascript
var value = cell.getDisplayValue();
```
スプレッドシート上の見たままの文字列を取得する。
例えば、日付「4/20」のセルの値を取得すると、そのまま "4/20"を取得できる。

## セルの範囲の値を配列として取得
```javascript
var value = range.getValues();
```
スプレッドシートに対する処理は基本重い。
例えば、スプレッドシートの値を全て取得したい場合、for ループでそれぞれのセルから順番に値を取得することも可能だが、基本は ``getValues()`` で一度に取得しておいたほうがよい。

## セルの範囲の値を見たまま（文字列として）取得
```javascript
var value = range.getDisplayValues();
```
スプレッドシート上の見たままの文字列を取得する。

## スプレッドシートの最後の行番号を取得
```javascript
var last_row = sheet.getLastRow();
```

## スプレッドシートの最後の列番号を取得
```javascript
var last_column = sheet.getLastColumn();
```
## セルの初期化
```javascript
cell.clear();
```

## セルへの書き込み
```javascript
cell.setValue('書き込む値');
```

## セルのテキスト揃えを指定
```javascript
cell.setHorizontalAlignment('left');    // 左揃え
cell.setHorizontalAlignment('center');  // 中央揃え
cell.setHorizontalAlignment('right');   // 右揃え
```

## セルのテキストの装飾（線）
```javascript
cell.setFontLine('underline');     // 下線
cell.setFontLine('line-through');  // 打ち消し線
cell.setFontLine('none');          // 線なし
```

## セルの背景色を指定
```javascript
cell.setBackground('#ffffff');
cell.setBackground('transparent');  // 背景色透明
```
MQTT待ち受け方法改善

## はじめに

こちらは以下の記事の続きになります

**[【MQTT】AWS IoT CoreとSoracom Beamを使ってデバイスとお喋りしてみた](https://qiita.com/yuki-0/items/72864017b18d031b3109)**

結論からですが、こちらの記事で書いたMQTT待ち受け方法では、安定して動作しませんでした。
ネットワークの問題があり、wifiや有線での環境であれば問題ない可能性はあります。

ただ、SoracomのSIMを使わない選択肢はなかったので
色々改善を試みた結果、以下の方法が一番安定して動作しました

## 安定版ソース

```mqtt_sub.py
import paho.mqtt.client as mqtt
import subprocess
import json
import requests
import logging

LOG_DIR = '/var/log/fluent/'
LOG_FILE = LOG_DIR + 'aws_iot_sub.log'
LOG_FORMAT = '[%(asctime)s %(levelname)s] %(message)s'

SORACOM_METADATA_URL = 'http://metadata.soracom.io/v1/subscriber'

logging.basicConfig(filename=LOG_FILE, level=logging.DEBUG, format=LOG_FORMAT)
logger = logging.getLogger("logger")

def get_imsi():
    subscriber = json.loads(requests.get(SORACOM_METADATA_URL).text)
    return subscriber["imsi"]

def on_connect(client, userdata, flag, rc):
    logger.info("Connected with result code " + str(rc))
    device_imsi = get_imsi()

    logger.info("start subscribe : " + str(rc))
    client.subscribe(str(device_imsi), 1)

def on_disconnect(client, userdata, flag, rc):
    logger.error("Unexpected disconnection. rc: " + str(rc))

def on_message(client, userdata, message):
    msg_pay = json.loads(message.payload)["message"]
    logger.info('received data = ' + msg_pay)
    if msg_pay == "REBOOT":
        reboot = "sudo reboot"
        subprocess.call(reboot, shell=True)
    else:
        pass

def on_subscribe(client, userdata, mid, granted_qos):
    logger.info("on_subscribe mid : " + str(mid) + " granted_qos : " + str(granted_qos))

def on_unsubscribe(client, userdata, mid):
    logger.info("on_unsubscribe : " + str(mid))

def main():
    try:
        client = mqtt.Client()
        client.on_connect = on_connect
        client.on_disconnect = on_disconnect
        client.on_message = on_message
        client.on_subscribe = on_subscribe
        client.on_unsubscribe = on_unsubscribe

        client.connect("beam.soracom.io", 1883)

        logger.info("start loop forever")

　　　　　# ネットワークが切れた時のエラーハンドリングはpahoに任せる
        client.loop_forever()
    except Exception as err:
        logger.error("main exception: " + err)

if __name__ == "__main__":
    main()
```


## 改善前のだめだったところ

前提条件として、SoracomのSIMで通信を行うデバイスで動作させるプログラムです。
どのSIMでも同様だとは思いますが、SoracomのSIMでは、ネットワーク状況が悪かったり、セッションが切れることがあります。
その際のエラーハンドリングとして、以下対策を行なっていました。

```
while True:
    try:
        mqttClient.subscribe(str(imsi), 1, customCallback)
        time.sleep(1)
    except Exception as err:
        pass
```

電波が悪い際にsubscribeがExceptionとなりpythonが落ちるためtry/exceptでループするように実装していましたが、こちらが強引でした。

初めの何度かは想定通りに、再度subscribeを行うのですが、
何回も繰り返していくうちにプロセス自体が死んでしまい、待ち受けが行えない状態が発生していました。

エラーの内容として出力されているのは、

```
"Subscribe error:
```

のみでこれといった原因はわかりませんでした。

そのため、ネットワークのエラーが発生したとしても、自力で復旧してくれるライブラリを探しました。


## 改善後のいいところ

まず、ネットワークが悪い状況になってもプロセスは死なず、復旧すれば、再びMQTTを待ち受けできる状態となります。
それが数時間続いたとしても同様です。

今回は、自前で復旧する処理を実装したくなかったので、その観点でライブラリを選びました。

```
client.loop_forever()
```

とすれば、ネットワークが悪くなったとしても、自動で復旧制御をしてくれます

ここ数ヶ月運用していますが、特に問題は起こっていません。
AWS SDK(AWSIoTPythonSDK)を使っていて、安定しない場合は、pahoも検討してみてください。

よりMQTTライフを！！
java(継承)

#継承を用いたクラスの定義


###元のHeroクラス
```java:Hero.java
public class Hero {
  String name = "勇者";
  int hp = 100;
  //戦う
  public void attack(Matango m) { 
    System.out.println(this.name + "攻撃！");
    m.hp -= 5;
    System.out.println("５ポイントダメージをあたえた！");
  }
  //逃げる
  public void run() {
    System.out.println(this.name + "は逃げ出した！");
  }
}
```

###継承を使わないSuperHeroクラス

```java:SuperHero.java
public class SuperHero {
  String name = "勇者";
  int hp = 100;
  boolean flying;
  //戦う
  public void attack(Matango m) { 
    System.out.println(this.name + "攻撃！");
    m.hp -= 5;
    System.out.println("５ポイントダメージをあたえた！");
  }
  //逃げる
  public void run() {
    System.out.println(this.name + "は逃げ出した！");
  }
  //飛ぶ
  public void fly() {
    this.flying = true;
    System.out.println("飛び上がった！");
  }
  //着地する
  public void land() {
    this.flying = false;
    System.out.println("着地した！");
  }
}
```
戦う、逃げるが重複している。
Heroクラスを変更した場合、SuperHeroクラスも変更しないといけない。


##継承を使用したSuperHeroクラス

```java:SuperHero.java
public class SuperHero extends Hero{
  boolean flying;
  //飛ぶ
  public void fly() {
    this.flying = true;
    System.out.println("飛び上がった！");
  }
  //着地する
  public void land() {
     this.flying = false;
     System.out.println("着地した！");
  }
}
```

`extend 元となるクラス名`でHeroクラスを継承する。
【Rails】Hamlの導入

# Hamlとは
Hamlとは、HTMLよりも簡単に書くためのビューテンプレートエンジンです。
今回の記事では、`haml`の導入方法についてまとめてみました。

## Hamlの導入手順
### 1. Gemfileへ記載
```:Gemfile
# 省略
gem 'haml-rails'
```

### 2. ターミナルで `bundle install` を実行
```:ターミナル
$ bundle install
```
**新規作成されるファイル**

- 
app/views/layouts/application.html.haml
- 
app/views/layouts/mailer.html.erb
- 
app/views/layouts/mailer.text.erb

### 3. ターミナルで `rails haml:erb2haml` を実行
```:ターミナル
$ rails haml:erb2haml
```
上記のコマンドを実行すると、自動的に拡張子をhamlに変換してくれます。
これで、hamlの導入は完了です。
【Gatsby.js】ポートフォリオ作成_環境準備

# Node.js をインストール
```
// nodeをインストール
brew install node
```
インストール後、バージョンチェック

```
// nodeのバージョンチェック
node -v
v12.16.3
```

#Gatsby.js をインストール
```
// gatsby をインストール
npm i -g gatsby-cli

// gatsby のバージョンチェック
gatsby -v
Gatsby CLI version: 2.12.29

// プロジェクトの雛形を生成(TypeScript)
gatsby new gatsby_sample01 https://github.com/haysclark/gatsby-starter-typescript
```
 スタータのひな形は以下にある。
https://www.gatsbyjs.org/starters/?v=2
FireBase-toolsで"Assertion failed: new_time >= loop->time"エラーが起きる

##はじめに
自粛期間中に買ったラズパイで遊ぶ延長として、今回おもむろにFireBaseに触りだしたのですが、謎のエラーで初っ端から盛大に躓きました。どうも実行環境というかプロセッサ依存の不具合らしく、かなり深刻に悩んだのでここにまとめておきます。初めてのFireBaseで意気揚々とチャレンジしたのに、見事に出鼻をくじかれました。はぁ…。

##実行環境
+ マシン：Surface Laptop3
+ OS：Windows10
+ ソフトウェア 
    + node.js : v12.16.3
    + npm：6.14.4
    + firebase-tools：8.3.0

##発生事象
Windowsにfirebase-toolsをインストールし、ログインまでは成功。
次に、`firebase init`を叩いた時に、ある程度までいったところで下記のエラーが発生して終了します。

```
Assertion failed: new_time >= loop->time, file c:\ws\deps\uv\src\win\core.c, line 309
```

##原因
Webで調査するもあまり情報がなく、どうもSurfaceの割と最近のモデルや、特定のプロセッサ(IntelのIce Lakeとか)でちょくちょく発生している模様。今回はたまたまFireBase-toolsの実行中に発生しましたが、npm-cli環境であれば他のモジュールでも発生することがあるようです。開発用に奮発して買ったSurface Laptopでいきなりプロセッサや端末依存のエラーにぶち当たるとは思いませんでした(泣)

##対策
海外の掲示板では「CMOSクリアすればいいよ」とか「BIOSいじればいいよ」みたいなことも書かれてましたが、(壊しそうだし)ちとハードルが高い…。結局、**WSLでUbuntuを入れて、その中でFireBase-toolsを実行し直す**ことで回避しました。何だかとても複雑な気持ちですが、動いたので良しとします。**FireBaseはWSL環境で、開発はWindows環境のVSCodeから行う**…という構成にすると良い具合でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285378/fa9692c2-f7a5-255c-04f6-a8ec10eeaa16.png)

**Docker使えば？**という声も聞こえてきそうですが、Dockerは当方が勉強不足のためご勘弁を…。次はDockerも触ってみよう。

##参考ページ
- [Firebaseの始め方](https://qiita.com/kohashi/items/43ea22f61ade45972881)
- [WSL (Windows Subsystem for Linux)の基本メモ](https://qiita.com/rubytomato@github/items/fdfc0a76e848442f374e)
- [Windows10＋WSL＋VSCodeでWindows環境を汚さないNode.js開発環境を構築](https://qiita.com/hikaruright/items/786c9dfe2ccb237e17a2)
【Python】listの使い方3 追加

#はじめに
とみーさんのブログの[Python入門者のための学習ロードマップ](https://obgynai.com/python-roadmap/)に沿ってPython学習を進めています。
今回は[【Python入門】list（リスト）の使い方の総まとめ（前編）](https://obgynai.com/python-list-1/)の後半を扱います。

#対象者
- とみーさんブログで学習中の方
- listの使い方の概要を知りたい方

#環境
Google Colaboratory

#学習内容
リストにデータを追加する方法は**追加メソッド**を使う
##追加メソッド
1. append
2. extend
3. insert

これらはメソッドなので、
```リスト変数.append()```
と使います。

```
list_a = [1, 2, 3, 4]   #1,2,3,4のlist_a
list_a.append(5)        #list_Aに5を末尾に追加
print(list_a) 
```

```text:実行結果
[1, 2, 3, 4, 5]         #5が最後に足されました。
```

###次は、list同士を足してみます

```
list_a = [1,2,3,4]
list_b = [5,6]
list_a.append(list_b)
print(list_a)
```
```text:実行結果
[1, 2, 3, 4, [5, 6]]    #appendはそのまま追加するので[]も追加される
```

###[]ごと合わせたくないときは
```
list_a = [1,2,3,4]
list_b = [5,6]
list_a.extend(list_b)    #extendを使いましょう
print(list_a)
```
```text:実行結果
[1, 2, 3, 4, 5, 6]       #数字だけ合わせられた!!
```
###extendはlist同士の結合なので、リスト作成しましょう
###appendのようには使えません
```
list_a = [1,2,3,4]
list_a.extend(5)
```
```text:実行結果
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-25c1d760cd29> in <module>()
      1 #注意　extendはlist同士の結合なので、リストを作って使う
      2 list_a = [1,2,3,4]
----> 3 list_a.extend(5)

TypeError: 'int' object is not iterable
```
エラーになります


###insertはlistの中の要素Noに追加できる!!
```
list_a = [1, 2, 3, 4]
list_b = [5, 6]
list_a.insert(1, list_b)    #要素No. 1にlist_bの[5, 6]を追加して
print(list_a)
```
```text:実行結果
[1, [5, 6], 2, 3, 4]        #追加して、printしました
```

###insertの謎
```
list_a = [1, 2, 3, 4]
list_b = [5]

list_a.insert(0, list_b)
print(list_a)

list_a = [1, 2, 3, 4]
list_a.insert(1, list_b)
print(list_a)

list_a = [1, 2, 3, 4]
list_a.insert(2, list_b)
print(list_a)

list_a = [1, 2, 3, 4]
list_a.insert(3, list_b)
print(list_a)

list_a = [1, 2, 3, 4]
list_a.insert(4, list_b)
print(list_a)
```
```text:実行結果
[[5], 1, 2, 3, 4]    #要素No. 0
[1, [5], 2, 3, 4]    #要素No. 1
[1, 2, [5], 3, 4]    #要素No. 2
[1, 2, 3, [5], 4]    #要素No. 3
[1, 2, 3, 4, [5]]    #要素No. 4
```
これはOK。ではこれは？

```
list_a = [1, 2, 3, 4]
list_b = [5]

list_a.insert(-4, list_b)    #要素No. -4
print(list_a)

list_a = [1, 2, 3, 4]
list_a.insert(-3, list_b)    #要素No. -3
print(list_a)

list_a = [1, 2, 3, 4]
list_a.insert(-2, list_b)    #要素No. -2
print(list_a)

list_a = [1, 2, 3, 4]
list_a.insert(-1, list_b)    #要素No. -1
print(list_a)

list_a = [1, 2, 3, 4]
list_a.insert(0, list_b)     #要素No. 0
print(list_a)
```
```text:実行結果
[[5], 1, 2, 3, 4]    #要素No. -4
[1, [5], 2, 3, 4]    #要素No. -3
[1, 2, [5], 3, 4]    #要素No. -2
[1, 2, 3, [5], 4]    #要素No. -1　　　　要素の最後に来ない？あれ？
[[5], 1, 2, 3, 4]    #要素No. 0
```
いまはよくわからず・・・

次回は削除clear, pop,remove, delについて予定しています。

#参考
[【Python入門】list（リスト）の使い方の総まとめ（前編）](https://obgynai.com/python-list-1/)
GitHubの色

GitHub のカラーバーの色をまとめるとこんな感じ
何かで使えるかな

|     Language     | Color     |
|:----------------:|:---------:|
|       HTML       | `#E34C26` |
|       CSS        | `#563D7C` |
|    JavaScript    | `#F1E05A` |
|    TypeScript    | `#2B7489` |
|   CoffeeScript   | `#244776` |
|       Java       | `#B07219` |
|      Groovy      | `#E69F56` |
|      Scala       | `#C22D40` |
|      Kotlin      | `#F18E33` |
|        C         | `#555555` |
|       C++        | `#F34B7D` |
|        C#        | `#178600` |
|    Objective-C   | `#438EFF` |
|   Objective-C++  | `#6866FB` |
|     Fortran      | `#4D41B1` |
|        Go        | `#00ADDB` |
|       Rust       | `#DEA584` |
|      Swift       | `#FFAC45` |
|       Ruby       | `#701516` |
|       PHP        | `#4F5D95` |
|      Python      | `#3572A5` |
|        R         | `#198CE7` |
|      Julia       | `#A270BA` |
|       Perl       | `#0298C3` |
|       Raku       | `#0000FB` |
|       Lua        | `#000080` |
|      Shell       | `#89E051` |
|    PowerShell    | `#012456` |
|    Batchfile     | `#C1F12E` |
|     Haskell      | `#5E5086` |
|       Yacc       | `#4B6C4B` |
|     Assembly     | `#6E4C13` |
|      Elixir      | `#6E4A7E` |
|      Erlang      | `#B83998` |
|      Crystal     | `#000100` |
|       Dart       | `#00B4AB` |
| Jupyter Notebook | `#DA5B0B` |
|    Dockerfile    | `#384D54` |
|     Makefile     | `#427819` |
|    Emacs Lisp    | `#C065DB` |
|    Vim script    | `#199F4B` |
|       Roff       | `#ECDEBE` |
|       Awk        | `#CCCCCC` |
|       TeX        | `#3D6117` |
|      other       | `#EDEDED` |
任意キーワードでWebスクレイピングして効率的に情報収集

#Webスクレイピング
Webスクレイピングとは、Webページからデータを抽出して、分類したファイルフォーマット、データベースに格納し、分析を行う技術です。
データセントリックとか、データが競争力を左右するとか言われる昨今（これを書いているのは2020年）ですが、人手では処理しきれないぐらい膨大なデータがあるWebのデータをいかに効率的に収集・整理・分析するかは、他者に先んじる付加価値となります。

ここではWebスクレイピングの1つの事例についてご紹介します。

##動機
###再建築不可など特定の不動産物件を効率的に検索
中古の一戸建て住宅を探している友人が、不動産販売会社のページから条件に合った物件情報だけ抜き出せないかと依頼してきました。

というのも、物件が東京だけでも1000件以上掲載されていて、地域とか面積とか価格などの条件では抽出できるものの、フリーキーワードで検索できないのだとか。しらみつぶしに全件確認するには件数が多すぎます。
![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/ac13c4ce-f940-d8fd-70f4-4474eff1240d.png)

また、Google検索などでも、特定のページをキーワード検索できたりしますが、それだとページ内にある広告やリンクの文字列などのノイズも含めて余計なものも沢山結果として挙がってきてしまいます。
このやり方は、ページ内の特定個所にある文字列のみを検索対象にすることが可能です。例えば物件情報の備考欄に「再建築不可」というキーワードを含むといった検索が可能で、無駄な検索結果を排除することができ、極めて効率的です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/bc607725-9a7f-817e-3374-ce530e121592.png)

Webページのテキスト解析を行って、キーワードが含まれたページだけ自動的に抽出できれば、マニュアル操作で見なくても、効率的に欲しい情報だけ取り出すことができます。業者さんなんかは効率化できるかもしれませんね。

##MATLABでのプログラミング
こういったことはMATLABのテキスト解析機能を使えば簡単にできます。

```matlab:ハイパーリンクを抽出
codeLinkPage = webread(getURL);  % Webページ読み込み
strLink = extractBetween(codeLinkPage,startTagTable,endTagTable);
tree = htmlTree(strLink);   
selector = "A";
subtrees = findElement(tree,selector);   % 特定タグを抽出
HtmlLinkList = getAttribute(subtrees, "href");   % HTML Linkを抽出
```

数千件のデータから例えば「ロフト付き」とか「再建築不可」とか「借地権」というようなフリーキーワードで、条件に合致したものだけ抽出できるので、物件情報を1つ1つ確認していく手間が大幅に省けます。

##GUI作成
App DesignerでGUIを作成して誰でも使えるように仕立てました。
GUIの画面と、GUI操作によって処理されるプログラムとの行き来がしやすいので、開発が行いやすい。

こちらはGUIの操作パネルを編集する「設計ビュー」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/8097e1cd-f31d-acd6-7dc2-e6b239793731.png)

こちらは処理されるプログラムを書く「コードビュー」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/69f754bb-5ec9-e816-7a3a-9d49115492af.png)

作成したのがこれ。不動産業者のWebページから検索キーワードを含んだ物件情報のみ抽出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/1e17ddd3-a27d-606c-ce75-108cdf2494b8.png)

MATLABというとどうしても高度な解析に使うツールと思われがちですが、業務の効率化や自動化にも使える良いツールだと思います。

また、こちらのようなアプリは各自独自の抽出条件があるためカスタマイズが欠かせませんね。もっと色々なWebページのデータを効率的に抽出・解析することにトライしてみたいと思います。

つづく
P.S.
Webスクレイピングのカスタムアプリを作成したい方は個別にお問い合わせ下さい。