OmniAICreator/Qiita-1.07M huggingface dataset:
[OutSystems]Request_GetKeyでログの関連付けを見られる

OutSystemsで出力するログには、1つのリクエストに紐づく一連のログに共通のキーがあることを最近知りました。
折角なので動作確認してみました。

# OutSystemsのログについて概説
OutSystemsでは、デフォルトで様々なログを取得しています。
また、(System)モジュールのLogMessage Actionを使うことでAction Flowの任意の位置からログ出力を行うことも可能です。

出力されたログはService CenterのMonitoringタブで確認できます。
LogMessageで出力したログはMonitoringタブの下のGeneralタブです。
このログには、PlatformLogs ExtensionのEntityを経由してアクセスすることも可能です。

# 共通キー：Request_Key
ログ関連の要求事項としてよく聞くのが、1つのリクエストから発生する複数のログ同士を関連付けられるようにしたい、というもの。

例：ボタンをクリックしたら
1. まず開始ログ
2. 別のServer Actionを呼び出したのでそこで出力されるログ
3. 復帰可能な例外が発生したのでログだけ記録して処理を継続
4. 終了ログ

といったように、一回のリクエストに複数ログが発生する場合、各ログを紐付ける属性としてRequest_Keyというものがあります。
障害発生時の調査などで、必要な情報だけ抜き出すなどの目的に使えます。

# 実際のログで確認してみる
## テスト実装
Traditional Webで以下のような簡単な処理を作って出力されるログを確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/03df79c4-c7bb-868a-ac37-652708ce5385.png)
LogMessageでGeneralに3回、またException Handlerで処理する例外が発生するのでErrorに1回、計4回のログが出る処理です。

## ログ確認
Service CenterにはRequest_Key属性が表示されません。
各ログ検索画面の右上あたりに「Export to excel」というボタンがあるので、これでExcelを取得するとRequest_Keyも含めたログがあります。



### 画面リクエストログ（Traditional Web Requests Log）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/96aeb90a-7bec-9733-a448-7229a71e0ae4.png)
ボタンクリックで出たログは一番上の行。
Request_Key列が出ていますね。この列の値が以降の各種ログにも出力されていて、紐付けが可能であるはず。

### LogMessageで出力したログ（General Log）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/b03cc01e-02b1-4380-a371-9a733a8b0854.png)

3つのログにちゃんと同じRequest_Keyが出力されています。

### 例外ログ（Error Log）
エラーログの場合は、Excelにエクスポートする以外に、詳細画面でもRequest_Keyを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/1251a4ee-2589-06ce-ade2-e56eaf9a5315.png)

# Request_Keyを持っているログの種類
[ログデータに関するレファレンス](https://success.outsystems.com/ja-jp/Documentation/11/Managing_the_Applications_Lifecycle/Monitor_and_Troubleshoot/Logging_database_and_architecture/Log_data_reference)に、ログのデータベース上での列情報が載っています。

Request_Keyを持っているのは
- Error
- General
- Screen
- Integration (SOAPやRESTのログです）
- Cyclic Job (Timer)
- Extension
- Mobile Request

ですね。
実際には、Errorおよび（または）Generalと他のテーブルを結合またはユニオンしてみることになるでしょう。

# Log Entityを使ってみる
PlatformLogsから必要なEntityへの参照を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3c5c7021-8e7d-3702-858f-2e26f8169a07.png)

ちなみに、_Previousがついているのは前週のログ、ついていないのは当週のログです。

このEntityは普通にEntityとして検索できます。
（ただし、ログ用テーブルは書くことを重視しているため、直接検索されることは想定されていないそうです。負荷が高い検索をしたいなら、ログを別の場所に退避してそこで検索すべきとのこと）

3つのテーブルを画面で入力したRequest_Keyで検索して表示してみた例。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/f3454a56-d1ef-729a-66a4-286cb69b9e5b.png)

# Action Flow中で任意にRequest_Keyを取得する
多分独自にログの仕組みを構築するためでしょうか。
PlatformRuntime ExtensionにRequest_GetKeyというActionが用意されています。
QGISをローカルネットワークのPostgreSQL(postGIS)に接続

QGISクライアントから、ローカルネットワークで繋がっているPostgreSQL(postGIS)に接続しました。

+ クライアントサイド:maoOS Catalina、QGIS3.10.12
+ サーバーサイド：macOS BigSur、PostgreSQL.APP（ver9.5)

#サーバーサイド
###postgresql.confの変更
listen_address = 'localhost'をコメントアウトし、'*'に置き換える。ポート設定はデフォルト5432だが、変えている場合はconfファイルの設定も変えておく。
![スクリーンショット 2020-12-19 0.44.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128611/fdd2eb77-ff52-bc4a-337a-d5f29fd90d62.png)

###pg_hba.confの変更
クライアント側のIPアドレスを追記する。サブネットマスクも正しく追記すること。
![スクリーンショット 2020-12-19 0.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128611/4229a00f-57b5-a74b-11db-2bfe2d96edb3.png)

#クライアントサイド
###新しいpostGISを作成する
+ 名前：（任意）
+ ホスト：（postgreSQL側のIPアドレス）
+ ポート：（設定ポート）
+ データベース：（接続したいデータベース名）

![スクリーンショット 2020-12-19 1.05.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128611/2e4c4e02-a0b6-3636-195a-9428fcaf2cdc.png)

+ ユーザー名：（データベースのユーザー名）
+ パスワード：（データベースのパスワード）

![スクリーンショット 2020-12-19 1.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128611/e8566551-174f-88c3-1522-ac9b58243ff7.png)
Oracle ApexでCRUD画面を爆速開発 - その8（ロード時の条件に応じて別ページにリダイレクト） 



# シリーズ
[Oracle ApexでCRUD画面を爆速開発 - その1（構成周り、一覧表示）](https://qiita.com/harukb/items/bad041174f59a9f07141)
[Oracle ApexでCRUD画面を爆速開発 - その2（詳細表示）](https://qiita.com/harukb/items/d4996b5a9a11ee2f3165) 
[Oracle ApexでCRUD画面を爆速開発 - その3（登録/更新処理,Validation,アクセス制限など）](https://qiita.com/harukb/items/f63c9035de34282320d6) 
[Oracle ApexでCRUD画面を爆速開発 - その4（選択リストの内容で一覧表示内容を更新させる）](https://qiita.com/harukb/items/7b86706f010f886b89f0) 
[Oracle ApexでCRUD画面を爆速開発 - その5（Classic Reportのヘッダの上にグループヘッダ行を作る）](https://qiita.com/harukb/items/2746a766228da48c93ed)
[Oracle ApexでCRUD画面を爆速開発 - その6（Classic Reportのレコード条件に応じて行の背景色を変える）]
(https://qiita.com/harukb/items/b976f3fad9d58bdb4587)
[Oracle ApexでCRUD画面を爆速開発 - その7（積み上げグラフを作成する）]
(https://qiita.com/harukb/items/725a8fedf077bbc3c106)

# 今回の主な内容
- ページロード時の条件に応じて別ページにリダイレクトする

# ページロード時の条件に応じて別ページにリダイレクトする

※　例えばトップページを表示したときに初期パスワード状態のユーザーのみパスワード変更画面にリダイレクトするようなケースです。
知ってしまえば簡単なんですがどう実装するか戸惑ったので書いておきます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/cce5229d-aaf4-ed77-e578-762cf8f5dc0d.png)|
|:-:|

## 遷移元画面のDynamicActionの設定

出来上がりはこんなイメージ
ページロード時に条件に応じてSubmit Pageしています。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/7049d4fb-22e7-e838-af61-542a77050408.png)|
|:-:|

1 Page Designer>Dynamic Actionを開きます。

2 Page LoadのDynamic Actionを作成します。
IDENTIFER=ISFIRSTTIME

行が返るか否かの条件を設定
ログインユーザーが'FIRST_PASS'という初期パスワードを持っているかをチェックしています。
もちろん実運用で平文はあってはいけない話ですがサンプルですのでご承知を。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/807ddd38-455b-a96c-ee78-8db810348e1f.png)|
|:-:|


3 TRUEの場合の処理を設定

RequstNameをつけておきます　⇒ISFIRST

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/47e784f7-e3cc-37cf-fdbe-67105e4bc7bf.png)|
|:-:|


## 遷移元画面のProcessingの設定

出来上がりはこんなイメージ

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/4751c515-2b9a-bb14-6d6d-4ef58593a52c.png)|
|:-:|

1 Branchの作成

Server-side Conditionで、届いたRequestのうち"ISFIRST"だけに絞るのがポイントです。 
その時だけリダイレクトが発生します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/83ead09c-9c10-933b-6fb8-a4815960e221.png)|
|:-:|



2 Saveして実行

遷移元画面を表示するとログインユーザーのパスワード状態に応じてページがリダイレクトされるのを確認できました。
AWSCLIでCloudFormationのOutputsから値取得

結構めんどうだったのでメモ

```
$ aws cloudformation describe-stacks\
 --region リージョン\
 --profile プロファイル\
 --stack-name "スタック名"\
 --output text\
 --query 'Stacks[].Outputs[?OutputKey==`Outputsのキー`].[OutputValue]'
```

`--query`に指定している値は、`--query`オプションなしで`--output json`で出力してから作りました。

```
$ aws cloudformation describe-stacks\
 --region us-east-1\
 --profile xxxxxxxxxxxx\
 --stack-name "xxxxxxxxxxxx"\
 --output json
{
    "Stacks": [
        {
            "StackId": "arn:aws:cloudformation:us-east-1:xxxxxxxxxxxx:stack/xxxxxxxxxxxx/xxxxxxxxxxxx",
            "StackName": "xxxxxxxxxxxx",
            "ChangeSetId": "arn:aws:cloudformation:us-east-1:xxxxxxxxxxxx:changeSet/xxxxxxxxxxxx/xxxxxxxxxxxx",
            "Parameters": [
                {
                    "ParameterKey": "Env",
                    "ParameterValue": "dev"
                }
            ],
            "CreationTime": "2020-12-15T06:25:42.183Z",
            "LastUpdatedTime": "2020-12-15T06:25:53.614Z",
            "RollbackConfiguration": {},
            "StackStatus": "CREATE_COMPLETE",
            "DisableRollback": false,
            "NotificationARNs": [],
            "Capabilities": [
                "CAPABILITY_NAMED_IAM"
            ],
            "Outputs": [
                {
                    "OutputKey": "xxxxxxxxxxxx",
                    "OutputValue": "xxxxxxxxxxxx",
                    "Description": "xxxxxxxxxxxx"
                }
            ],
            "Tags": [],
            "EnableTerminationProtection": false,
            "DriftInformation": {
                "StackDriftStatus": "NOT_CHECKED"
            }
        }
    ]
}

```


参考：https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-output.html
PWAで自社サイトを無駄にネイティブっぽくしてみた

# はじめに
　自社サイトのPWA化はiphoneのホーム画面に自社サイトを登録する ~~変な人~~ 経営陣のみが少し嬉しい内容となります。実際にPWA化を検討される際はPWAの特徴を活かせるwebサービスなどで導入を検討してみてください。
（真面目な内容やコードは[こちらのブログ](https://www.sink-capital.com/blogs/s3_hosting_pwa/)に記載しているのでそちらをみてください）

# PWA化した結果（gif動画）

[PWA化した自社サイトのURL](https://www.sink-capital.com/)

| PWA | 元のsafari |
|:-----------:|:------------:|
|![pwa.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198985/91d0ffab-5caa-f93f-67ad-b5a002e97314.gif)|![web.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198985/08e022e2-dbb0-5707-de4a-215ec928bc9b.gif)|

※ PWA化してから記事を書くまでにwebサイトのスピード改善(重いと有名なNoto Sans JPの削除など)をしてしまったので大きな差が感じられませんが元々は結構な速度差がありました。。。

# PWAの特徴
　wikipediaに様々な特徴が載っていますが、ネイティブアプリみたいに動くwebアプリが作れるもののようです。今回は勉強のために手元にあった自社サイトをPWA化しただけなので、この中でいうと「High performance」と「An icon on the phone‘s home screen」の部分が一番恩恵がありました。


```
・Work offline
・High performance
・Background processing in service workers in a separate thread
・Access to the phone's sensors
・Support for push notifications
・An icon on the phone‘s home screen
```
※ wikipediaより抜粋( https://en.wikipedia.org/wiki/Progressive_web_application )

# 感想
　PWAのメリットの内ほぼ一部しかまだ試せていないですが、UIUXが通常のwebとは違い体感としてはかなりよく感じられるようになりました。
キャッシュなどに限っていうと実装方法自体がとても簡単なので、自社サイトがある方はやってみると ~~変な人になれる~~ とてもテンションが上がるのでオススメです。
push通知はが送れるのは知っていたのですが機体のセンサー（カメラなど？）にアクセスできるのは知らなかったので、
機会があればそういった機能も触っていければと思います。
【冬だけどアツい機能】LINE Messaging APIを使って来店者管理したい


ひょんなことでシステムを作ることになったので
やりながらまとめます！
（ひょんの語源ってなんなのだろうか！）

#こんなのあるよって方は教えていただけると幸いです！


5W1Hで書いていきます！

#Why・どうして必要なの？
<h3>人気なカフェ！冬とともに外で待つが限界が来た！</h3>
大変だ！

#What・なにするの？
<h3>カフェの人数を管理</h3>
・来店中の人数表示（全員）
・入店ボタン(来店者が押す)
・退店ボタン(来店者が押す)
・10人以上だと入店ボタンが活性化されない
・事前予約可能(予約者が押す)

#How・どうやってつかうの？
<h3>暫定だがLINEで閲覧できると気軽</h3>
LINEを選定した理由：スプレッドシートより楽

#Who・だれが使うの？
<h3>カフェのお客さんと亭主</h3>

#Where・どこでつかうの？
<h3>カフェとカフェ以外</h3>

#When・いつつかうの？
<h3>カフェに来る前後</h3>

#乞うご期待！
<h3>12月中にできたらかっこいい！</h3>

いったん、以上！
よいクリスマスを！🎅


参考になりそう
[ChatBotを構築する場合に最適な構成（Dialogflow）](https://qiita.com/bamiyanapp/items/cb1df0b14d3df2a7c32c)
[【個人的備忘録】GASでGoogle Spread Sheet の値を読み取ってLINE Botに送った話 - Qiita](https://qiita.com/white_fox_byacko/items/d347a8693c022e32f999)
electron typescript react構築


ボイラーテンプレートのこちらを使用する。
https://github.com/diego3g/electron-typescript-react


```
git clone git@github.com:diego3g/electron-typescript-react.git
cd electron-typescript-react
yarn install
yarn dev
```

これだけでelectron x typescript x react環境が立ち上がる。

![スクリーンショット 2020-12-19 0.54.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278474/3af36930-0325-79ff-3656-90bf52655633.png)
映画.comから人気映画をスクレイピング

こんにちは、３年のまるです。アドベントカレンダー20日目です。
前回は、@hcpmiyukiさん(先輩)の<a href="https://qiita.com/hcpmiyuki/items/05f323ff79772c6efaff">【GCP】【Python】Google Cloud FunctionsでサーバーレスにAPIをデプロイ!</a>でした！
最近はあまり外出していないので、コロナが収まったら美味しいご飯を食べにいきたいです。
よろしくお願いします。

# 目標

<a href="https://eiga.com/ranking/">映画.com</a>のホームページから今人気の映画のタイトルと公開日を数行のコードでスクレイピングします。

# 方法

Webスクレイピングには色々なやり方がありますが、今回はめっちゃ簡単な、XPathとCSSセレクターを利用する方法でやっていきます。
初めてスクレイピングする方は一度この方法でやってみて欲しいです！爆速で出来ます


# 準備

ライブラリをインストールします。
Requests、lxml、cssselectの３つを使います。

``` 
$ pip install requests
$ pip install lxml
$ pip install cssselect
```
# CSSセレクターとXpathの確認方法

Chromeのデベロッパーツールを使います。


要素を右クリック > Copy > Copy XPath(または Copy selector)
でコピーできます。


![映画.comスクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906750/9ba5f035-db2b-431d-1ddf-23e2c4b23580.png)




# 実際にコードを書く

コードはこれだけです。少なくて素敵！関数使うと尚良きですね。


``` scray.py

import requests
import lxml.html

#映画.comのURLを指定して、HTMLソースを得る
r = requests.get("https://eiga.com/ranking/")
html = r.text

#HTMLをHtmlElementオブジェクトにする
root = lxml.html.fromstring(html)

print("映画ランキング第1位")

#Xpathを指定して、映画タイトルをスクレイピング
rank1_title = root.xpath("//*[@id='document_2575126293']/main/div/div/section[1]/table/tbody/tr[1]/td[2]/div/h2/a")

print(rank1_title[0].text)

#CSSセレクターで指定して、公開日をスクレイピング
rank1_day = root.cssselect("#document_2575126293 > main > div > div > section:nth-child(4) > table > tbody > tr:nth-child(1) > td.img > small")

print(rank1_day[0].text)

#2位, 3位も同様にコードを書きます

print('----------------------------')
print("映画ランキング第2位")

rank2_title = root.xpath("//*[@id='document_2575126293']/main/div/div/section[1]/table/tbody/tr[2]/td[2]/div/h2/a")

print(rank2_title[0].text)

rank2_day = root.cssselect("#document_2575126293 > main > div > div > section:nth-child(4) > table > tbody > tr:nth-child(2) > td.img > small")

print(rank2_day[0].text)

print('----------------------------')
print("映画ランキング第3位")

rank3_title = root.xpath("//*[@id='document_2575126293']/main/div/div/section[1]/table/tbody/tr[3]/td[2]/div/h2/a")

print(rank3_title[0].text)

rank3_day = root.cssselect("#document_2575126293 > main > div > div > section:nth-child(4) > table > tbody > tr:nth-child(3) > td.img > small")

print(rank3_day[0].text)

```

#結果

実行すると、

```
映画ランキング第1位
劇場版「鬼滅の刃」無限列車編
劇場公開日：2020年10月16日
----------------------------
映画ランキング第2位
新解釈・三國志
劇場公開日：2020年12月11日
----------------------------
映画ランキング第3位
天外者（てんがらもん）
劇場公開日：2020年12月11日

```
うまく取ってこれました！

# おわりに
読んでくれてありがとうございました。
間違っている点などございましたら、ご指摘いただけると嬉しいです！

#参考文献
* <a href="https://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC-%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E8%A8%AD%E8%A8%88%E3%83%BB%E9%96%8B%E7%99%BA%E3%81%8B%E3%82%89%E5%8F%8E%E9%9B%86%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%A7%A3%E6%9E%90%E3%83%BB%E9%81%8B%E7%94%A8%E3%81%BE%E3%81%A7-%E5%8A%A0%E8%97%A4-%E5%8B%9D%E4%B9%9F/dp/4798149128">Pythonによるクローラー＆スクレイピング入門 設計・開発から収集データの解析・運用まで</a>  ( 著者：加藤勝也 , 横山祐季 )

* <a href="https://eiga.com/ranking/">映画.com</a>
Proxyを華麗にスルーしてWi-Fiを飛ばすには

## はじめに
これは 限界開発鯖 Advent Calendar 2020 の19日目の記事です
14日目は[soshi_harami](https://qiita.com/soshi_harami)さんの[湯婆婆で学ぶScalaのエラーハンドリング](https://qiita.com/soshi_harami/items/c9754d4d2c810d6a7345)です。
16日目は[こるく](https://qiita.com/Colk-tech)さんの[ちょっとまって！そのFDD、捨てないで演奏してみませんか？
](https://qiita.com/Colk-tech/items/6fc32742ebad21710024)です

某高専生をしている学生です。
Twitter: [@yangniao23](https://twitter.com/yangniao23)
GitHub: [@yangniao23](https://github.com/yangniao23)

よろしくお願いします。


## Proxy下でスマホを使うのは不便ですよね？
Proxy接続が強制される環境になったため，非常に感じております。

###そのままだとできないこと
- LINE     : トークでは一部の通信がProxyを無視して443ポートへ繋がろうとします。通話は言わずもがな。
- Discord  : Proxyに非対応の模様です。
- などなど......

## 方針
- Proxyに非対応のアプリをどうにかしてProxy経由で通信させたい！！
- 自由に通信したい！ → 自分でProxyサーバを立てる

## 環境
- Host PC: ThinkPad T490 ~Arch Linuxを添えて~
- Smartphone: Galaxy S10
- 22番ポートが開放済み (が開放されていない場合は，こちらの記事などを参考にSSH over HTTPSの環境を整えましょう。  [Proxy下でSSHを使いたい!!! | Qiita](https://qiita.com/isso0424/items/e54e528e90950b5f0c38)
- 53番ポートが開放済み(開放されていない場合は，Proxy経由で通信するなりDNS over HTTPSを使うなり工夫が必要です。)

## 自分のProxyサーバを立てる
適当なサーバを借ります。もしくは自宅等にサーバを用意します。
学生だとAzureで年間100$分のクレジットが貰えるので，期限を気にせずに運用できます。
参考までに自分の設定を掲載しておきます。
    - リージョン: 東日本
    - インスタンス: B1LS
    - ディスク: Standard SSD 30GiB

Proxyサーバの立て方は記事が大量に投稿されているので，解説は割愛します。
私が参考にした記事
[Squid の設定と使い方 | Qiita](https://qiita.com/ekzemplaro/items/3b0e6e29d6673ce96281)

## PCに外部のProxyを持ってくる
SSHポートフォワーディングを活用します。

```
ssh -gNfL 0.0.0.0:8888:127.0.0.1:3128 user@example.com
```
上のようにして0.0.0.0:8888へHTTP Proxyを持ってきます。

また，動的ポートフォワーディングを活用しても構いません。この場合上のHTTP Proxyの構築作業は不要です。

```
ssh -gNfD 0.0.0.0:1080 user@example.com
```
動的ポートフォワーディングの場合，HTTP ProxyではなくSocks Proxyとなります。

## Wi-Fiを飛ばす！
[create_ap](https://github.com/oblique/create_ap) を使ってWi-Fiを飛ばします。

```
sudo create_ap [無線LANのNIC名] [有線LANのNIC名] --no-dnsmasq -d --ieee80211n --redirect-to-localhost [SSID名] [パスフレーズ]
```

## スマホでの作業 ~Wi-Fiに接続する~
Wi-Fiに接続する際は，IPアドレスを静的にしてください。デフォルトゲートウェイは`create_ap`を実行して作成された仮想NIC(ap0など)のIPアドレスに設定しましょう。
そして，HTTP Proxyの設定にはホスト名にデフォルトゲートウェイのIPアドレス，ポートはSSHで0.0.0.0へ持ってきたのと同じ値(今回の場合は8888)に設定してください。Socks Proxyの場合はここで設定する必要はありません。

設定例

```
IP            : 192.168.42.100
Gateway       : 192.168.42.1
Proxy Hostname: 192.168.42.1
Proxy Port    : 8888
```

## Dronyを導入する
Playストアから[Drony](https://play.google.com/store/apps/details?id=org.sandrob.drony&hl=ja&gl=US)をダウンロードしてきましょう。
これはProxyをVPN接続に見せかけるソフトウェアです。

Dronyのインストールが完了したら，先程と同様にProxyの設定を行ってください。
Rulesは，443, 80番に届いた通信をProxyのポートへ転送するように設定するとうまく行きます。

## 個人的にハマったところ
- DronyでSocks Proxyがうまく動かない
    - GitHubのIssueを見ると，どうやら未解決のようです。https://github.com/SuppSandroB/sandrop/issues/134
- スマホからProxyにつながらない！
    - sshdの設定に問題がある可能性があります。`/etc/ssh/sshd_config`で`AllowTcpForwarding`が`yes`になっているか確認してください。
    - create_apを再起動する，sshコネクションを一度切断して再度接続してみる，なども試してみるべきです。
ロボット工学＜オドメトリ＞

# #ロボット工学＜オドメトリ＞

##はじめに
ロボットの基礎を学習している．その中で，勉強したことを記録していこうと思う．ランダムだが，まずはオドメトリについてまとめておく．

##オドメトリとは
自己位置姿勢推定法の一つ．
「単位時あたりの車輪の回転角の積分によって，移動ロボットの現在位置や姿勢を推定する」

(式)
$\theta(t) = \int_{t_0}^t\omega(\tau)d\tau+\theta(t_0)$
$x(t) = \int_{t_0}^tv(\tau)cos(\theta(\tau))d\tau+x(t_0)$
$y(t) = \int_{t_0}^tv(\tau)sin(\theta(\tau))d\tau+y(t_0)$

$\theta$：方向（姿勢）
$x$：位置（$x$成分）
$y$：位置（$y$成分）
$\omega$：角速度
$v$：並進速度
$t$：現在時刻
$t_0$：初期時刻
※右手系


この式により，理論上，自己位置推定ができる．しかしながら，実際のロボットではこれらの式を漸化式の形で近似して用いる．

##なぜ，漸化式へ近似するのか？
ロボット上で積分（近似）を行うため．
移動ロボットに搭載した計算機ができることが，
「ごく短い時間間隔$\Delta t$ごとに$v(t)$や$\omega(t)$を計測すること」
であるから．

##漸化式（短冊近似）
**短冊近似**（区分求積法と同じ考え方）
積分区間を$\Delta t$間隔で分割し，前後の時間における値を結んだ短冊の面積を累積する近似法．

ここで，$v(t), w(t)$をロボット上での得られる形として，次のようにする．
$v(N\Delta t), w(N\Delta t)　　N=0,1,2,...$
これは，$\Delta t$が経過するごとに，経過回数$N$が増加し累積されていくという変換である．
これを基に，理論式を次のように書き換える．ただし，$\tau_N=N\Delta t$とする．
※$\Delta t$は通常$5ms$～$20ms$くらいらしい

(式)
$\theta(\tau_N) = \omega(\tau_N)\Delta t+\theta(\tau_{N-1})$
$x(\tau_N) = v(\tau)cos(\theta(\tau_N))\Delta t+x(\tau_{N-1})$
$y(\tau_N) = v(\tau)sin(\theta(\tau_N))\Delta t+y(\tau_{N-1})$

いま$\theta(\tau_N)$の状態を一つ前の時刻$\tau_{N-1}$の状態を用いて表現しているため，漸化式である．漸化式にしてしまえば，アルゴリズムの基本に基づいて，繰り返し処理を負担なく行える形となる．これならば，ロボットに搭載する計算機で計算でき，実際に推測することができるようになる．なお，計測の必要な速度はエンコーダなどを用いて計測できる．

##これから
オドメトリの理論についての話は簡単ながら，このあたりで終わり，今後は実際にプログラムでシミュレーションでもできればと思っている．また，ROSを搭載したラジコンが完成したときには，自己位置推定にお世話になるであろう．

##感想
オドメトリというものは何度も勉強してきて，実際にOEDでのシミュレーションを行う授業も受けたこともあり，ようやくその概念をつかんだ気がする．とりあえず，今回は忘れないように必要なことを簡潔にまとめてみた．頭の整理にはなったと感じている．

##参考文献
はじめてのロボット創造設計
　　　　　　　　　米田 完・坪内 孝司・大隅 久　著　　講談社
Style/BracesAroundHashParametersの解消

#概要

RuboCopの`Style/BracesAroundHashParameters`でハマったのでメモ。

#内容

以下の様に書いていたら警告が出た。

```
config.add_notifier :slack, {
  webhook_url: 'url',
  channel: '#エラー通知'
}
```

原因は、余計な`{...}`がついていることなのだが、単純にカッコを消しても警告が消えなかった。

#解決方法

結論から言うと以下の様に書けば警告は消える。

```
config.add_notifier :slack, webhook_url: 'url', channel: '#エラー通知'
```

これはRuby文法では、最後の引数がハッシュの場合は`{...}`を省略できるからと言うもの。
単純に消してうまくいかなかったのは、１行で書けと警告が出ていたから。
詳細は参考文献を参照。

以上

#参考文献
[Rails初心者が躓くRuby文法](https://qiita.com/kterui9019/items/fefc0f690a449722dc6d)
[RuboCop | Style/BracesAroundHashParameters EnforcedStyle](https://qiita.com/tbpgr/items/8932a19d154fc3d7c142)
【初心者でもわかる】ふわっと動く、ページ内リンクの作り方



# どうも7noteです。クリックしたら同じページ内でふわっと自動スクロールさせて任意の場所に移動させる方法

この記事では実際に導入する時に自分が躓いた点や気づいた点をまとめました。
クリック（タップ）すると、同ページ内で任意の場所にスクロールさせるのを「ページ内スクロール」と言います。

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/8151315c-2039-e686-58db-8ea1a6201424.gif)


HTMLだけで書くなら、こんなかんじで書きます。


```index.html
<ul>
  <li><a href="#item01">項目１へリンク</a></li>
  <li><a href="#item02">項目２へリンク</a></li>
</ul>

<!-- ～中略～ -->

<h2 id="item01">項目１</h2>

<!-- ～中略～ -->

<h2 id="item02">項目２</h2>

<!-- ～中略～ -->
```

これでページ内リンクが実装できました。
クリックする要素をaタグで囲み、href属性にはとび先のid名を#付きで記述するだけです。
これは**idでのみ動作し、classでは動かないので注意**してください。

動作はするが、、、
**ただ、これではあまりにも機械的すぎる！**

ページもバッと瞬時に切り替わるし、上に動いたのか下に動いたのかも分からないような状態。
では、スクロールをもっとスムーズにしましょう。

## ふわっとスムーズにスクロールしてページ内リンクさせる方法

※jQueryを使用しています。jQueryってなんだ？という方は[こちら](https://qiita.com/7note/items/45bd8efbedd557667218)

```script.js
$(function(){
  $('a[href^="#"]').click(function() {     /* リンク先が#から始まる時 */
    var speed = 400;                     /* スクロールにかける時間を設定 */
    var href = $(this).attr("href");     /* hrefの内容を取得 */
    var target = $(href == "#" ? 'html' : href);  /* hrefが#だけだった場合、htmlに置き換えて、そうでない場合はhrefの値をtargetに格納 */
    var position = target.offset().top;  /* 飛び先のIDの上からの位置を取得 */
    $('body,html').animate({scrollTop:position}, speed, 'swing'); /* cssのアニメーションを使ってスクロールさせる */
    return false;
  });
});
```

上のスクリプトを追加することで、ふわっとスクロールすることができます。


しかし、これだけではまだ問題が出る場合も・・・

固定ヘッダーと一緒に利用すると、かぶってしまって見出しが見えなくなるかもしれません！

**失敗例**

![miss.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/071cd308-ea5e-1c25-155c-7cff9777638b.gif)



これを対策するために、以下の部分に1行追加します。

```script.js
$(function(){
  $('a[href^="#"]').click(function() {
    var speed = 400;
    var href = $(this).attr("href");
    var target = $(href == "#" ? 'html' : href);
    var position = target.offset().top;

    /* この行を追加 */
    position -= 75; /* ヘッダーの高さ分のpxをマイナスする */

    $('body,html').animate({scrollTop:position}, speed, 'swing');
    return false;
  });
});
```

これによって、隠れてしまう見出しより少し上までしかスクロールしないので、上部固定ヘッダーがあっても問題なくスクロールすることができます。

## まとめ

HTMLだけでページ内スクロールさせるのは何も難しいことはありません。

しかし、ふわっと動かしたりスムーズに動かしたり、はたまた固定ヘッダーがあるページでページ内リンクを入れるとなると工夫が必要です。
でもページ内リンクの方法は他にも多く記事が出ているので、参考になるサイトややり方を調べて実装できるので、実装自体はそこまでハードルの高いものではないかなと思います。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
Ruby on Rails のエラーメッセージ表示から日本語化まで

プログラミング勉強中、機能を実装したので備忘録として残します。
初心者のため、間違っている箇所あるかもですがご了承ください。
## エラーの表示方法
### 参考資料

[https://qiita.com/satreu16/items/a072a4be415f30087ed7](https://qiita.com/satreu16/items/a072a4be415f30087ed7)

[Rails エラーメッセージの表示 - Qiita](https://qiita.com/ryuuuuuuuuuu/items/1a1e53d062bff774d88a)

[https://note.com/hbkk/n/ndc2c306696b2](https://note.com/hbkk/n/ndc2c306696b2)

[https://blog.yuhiisk.com/archive/2018/05/22/rails-display-error-message.html](https://blog.yuhiisk.com/archive/2018/05/22/rails-display-error-message.html)

[Rails エラーメッセージの出し方　バリデーションエラー - Qiita](https://qiita.com/nakanishi03/items/d1be27c74c98855423ab)

### Model

post.rb

```ruby
class Post < ApplicationRecord
  belongs_to :user
	# content カラムのみ入力を禁止。140文字までしか入力を認めないよう設定。
  validates :content, presence: true, length: { maximum: 140 }
end
```

### View

new.html.erb

```ruby

<%= form_with model: @post, local: true,  html: {class: "form_area"} do |f| %>
        <div class="form_area__field">
					# エラーの場合 layouts/error_messages に遷移, object という名前で遷移先にエラーメッセージを渡す。
          <%= render 'layouts/error_messages',  object: f.object %>
          <%= f.text_area :content, id: "post_text", placeholder: "投稿内容を入力", rows: 10 %>
            <div class="form_area__hidden_field">
              <%= hidden_field :post, :user_id, value: current_user.id %>
            </div>
            <div class="form_area__action">
              <%= f.submit "投稿", class: "form_area__action__btn" %>
            </div>
        </div>
```

error_messages.erb

```ruby
# error が格納されているか確認
<% if object.errors.any? %>
    <div class="vali_alert">
      <ul>
				# エラーメッセージを全て取得。each 文で回す。
        <% object.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
```

他のフォームでも使用できるようにエラーメッセージを部品化することをパーシャルという。

## エラーメッセージの日本語化

### 参考資料

[[初学者]Railsのi18nによる日本語化対応 - Qiita](https://qiita.com/shimadama/items/7e5c3d75c9a9f51abdd5)

[【Ruby on Rails】エラーの日本語表記](https://laptrinhx.com/ruby-on-rails-erano-ri-ben-yu-biao-ji-2116344453/)

### Gem のインストール

```ruby
gem 'rails-i18n'
```

bundle install 実施

### config/application.rb に追記

```ruby
config.i18n.default_locale = :ja
config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
```

### locales/ja.yml を作成

```yaml
ja:
  activerecord:
    attributes:
		# 日本語設定したいモデル名
      post:
		# カラム名と対応させたい日本語
        content: 'コンテンツ'
```
Qiitaでメールアドレス認証できない場合の対処法

## Qiitaでメールアドレスが認証されなかった話…
試しにQiitaをやってみようということになり、早速Twitterアカウントと連携して新規登録してみることに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964269/bb40dd66-e36d-ae2a-ff99-fc4cbad497a6.png)
しかし、メールアドレスアドレスを登録してもなぜか「メールアドレスの認証が完了していません。認証用メールを送信するにはこちらをクリックしてください」との文字が。

早速クリックしてみるとメールが届いたので、「メールアドレスを認証」をポチってみました。

しかし、結局さっきの画面にまた飛ばされただけでした…

## 対処法
- 一番最初のメールのリンクからログイン
- 再度認証用のリンクからログイン
    - [参考記事](https://qiita.com/almajiro121212/items/56ef70f6e4b8f00d730f#_reference-01e555b90507dd31f833)



どうやらメールアドレスに一番最初に届いた認証メールのリンクから飛ばないと正常に認証されないらしいです。
自分は一番最初のメールではないリンクから飛んでいたので認証できませんでした。

一番最初に送られてきたメールのリンクからしてみると、無事認証してくれました。

## 関連ページ

https://qiita.com/Teba_eleven/items/4d54b23e0fea8519b932

https://www.chickensblog.com/git-ssh-asked/

https://www.chickensblog.com/vscode-runcode-run/

https://www.chickensblog.com/homebrew-cask-mac/
Processingによるオーディオプログラミング例

Processing
===

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)

# 概要

https://processing.org/

アート、デザイン、研究、教育など、クリエイティブコーディングを目的とした言語。基本はグラフィックプログラミング用であるが、追加ライブラリによりオーディオプログラミングも可能。

MITメディアラボのJohn Maedaグループに在籍していたBen FryとCasey Reasが2001年に開発。2012年からはProcessing Foundationによって管理されている。当初、processing.orgのドメインが使えずproce55ing.orgを使用していた。そのためProce55ingと呼ばれることもあったが正式な名称ではなく、現在ではほとんど使われることはない。（p5.jsなどに名残がある）

# 実装例

Processingのオーディオライブラリとしては、Minim( http://code.compartmental.net/minim/index.html )またはSound( https://processing.org/reference/libraries/sound/index.html )を使用することが多いようです。Processing 2ではMinimが標準バンドルされていました。SoundはProcessing 3用にProcessing Foundationが開発した公式ライブラリです。どちらもスケッチメニューから追加インストールすることで使えるようになります。

## サイン波生成

### Minimライブラリの場合

```javascript

import ddf.minim.*;
import ddf.minim.ugens.*;

Minim minim;
Oscil osc;
AudioOutput out;

void setup(){
  float frequency = 440;
  float gain = 0.5;

  minim = new Minim(this);
  osc = new Oscil(frequency, gain);
  out = minim.getLineOut();

  // routing and play
  osc.patch(out);
}

void draw(){
}
```

### Soundライブラリの場合

Soundライブラリでのオシレーターは非常にシンプルに書くことができます。初期化と同時に音を出すとノイズが乗るようなので500msec待ってからplay()を呼ぶようにしました。

```javascript

import processing.sound.*;
SinOsc osc;

void setup() {
  osc = new SinOsc(this);
  osc.freq(440);
  osc.amp(0.5);
  delay(500);
  osc.play();
}

void draw() {
}
```

## Delayエフェクト

### Minimライブラリの場合

Minimライブラリは、さらにMinim Core系列とUGen系列とがあります。単純なwavファイル再生の場合、Minim CoreのAudioPlayerを使用することもできますが、UGenの方がエフェクトも充実し、オーディオグラフのルーティングも柔軟におこなえるため、以下の例ではUGenを使用しています。

```javascript

import ddf.minim.*;
import ddf.minim.ugens.*;

Minim minim;
Sampler voice;
Delay delay;
Gain wet;
AudioOutput out;

void setup(){
  float delayTime = 0.4;
  float feedback = 0.5;
  float wetLevel = -6; // dB

  minim = new Minim(this);
  voice = new Sampler("../../voice.wav", 1, minim);
  delay = new Delay(delayTime, feedback, true, false);
  wet = new Gain(wetLevel);
  out = minim.getLineOut();

  // routing
  voice.patch(out);  // dry
  voice.patch(delay).patch(wet).patch(out); // wet

  // play 
  voice.trigger();
}

void draw(){
}
```

### Soundライブラリの場合

Soundライブラリはシンプルで扱いやすい一方で、あまり複雑なことはできず、ディレイもDryとWet個別に調整することはできないようです。

```javascript

import processing.sound.*;
SoundFile voice;
Delay delay;

void setup() {
  voice = new SoundFile(this, "../../voice.wav");
  delay = new Delay(this);
  
  delay.process(voice, 1.0);
  delay.time(0.4);
  delay.feedback(0.5);

  voice.play();
}      

void draw() {
}
```

# 感想

Processingはクリエイティブコーディングという概念を一般に広めた言語だと思います。構文のわかりやすさ、IDEの使いやすさなど、気軽に使うことができるのが特徴です。また、setup→drawのプログラム構造は、openFrameworksやCinderなどにも引き継がれており、クリエイティブコーディングを学ぶ最初の言語として最適だと思います。

オーディオプログラミングに関しては、Processing 3になって公式ライブラリとしてSoundが提供されるようになり、それまで多用されてきたMimimと混乱の原因になっているようにも思います。今回両方使ってみた印象では、シンプルなオーディオ処理であればわかりやすいSound、少し凝ったエフェクト処理をおこなう場合は機能が豊富なMimimのUGenを選択するのが良さそうでした。

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)
2020年を終えて結局一番使ったVSCODEの拡張機能ベスト５

# はじめに
結局毎回入れている鉄板のおすすめ拡張機能をまとめました。
Visual Studio CodeはまだSublimeやAtomが幅を効かせていたころから使っているのですが、例えば当初はなかったミニマップだとかGit連携だとかどんどん標準搭載の機能が充実しました。
もう今となってはVSCODEは拡張なしでも十分な機能を有してはいますが、それでも便利で生産性が上がる拡張はたくさんあります。
基本的には何系の職種の人でも使える拡張のみ選んでます。（特定言語向けや特定環境向けは入れていません）

## 1位 Japanese Language Pack for Visual Studio Code
https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja

VSCODEの日本語化の拡張機能。
いきなり出落ちですが、結局これは毎回いれます。
PC乗り換えてVSCODEを入れたあと英語のままで開発していたりもするのですが、途中でなにがしかの理由でいれちゃってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/811027/bb03adc8-24d8-8d5c-deab-de98f594ccff.png)



# 2位 Bracket Pair Colorizer 2
https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer-2
カッコ同士の対応をわかりやすくつなげてくれる拡張機能。
私はCやC#を使うことが多いというのもこれが入っているととてもやりやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/811027/6d95b5ee-449f-33a5-f092-f87d1c6565c8.png)




# 3位 indent-rainbow
https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow
インデントを色で見やすくしてくれる拡張機能。
インデントがずれているときに濃い赤で教えてくれる機能はありがたい反面、あえてそうしているときに気になって困る。
これと2位で挙げたBracket Pair Colorizer 2はセットで入れて間違いなし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/811027/05762204-dbe5-816f-1f7e-ba246ea187f0.png)



# 4位 Git Graph
https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph
Gitのコミットログをいい感じで表示（GitHubみたいに）表示してくれる拡張です。
職場では２〜３年前からSubversionからようやくGitに統一されてきました。うれしい。
Git管理自体はだいぶ前からVSCODEの標準機能になってますが、これがあるととても見やすくなります。
以前はGit Historyという拡張を使っていたのですが、こっちに乗り換えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/811027/ed363340-0a29-ef95-f148-5b8c0cd75ab6.png)



# 5位 GitHub Theme
https://marketplace.visualstudio.com/items?itemName=GitHub.github-vscode-theme
VSCODEをGithub配色テーマにできる拡張。
標準の配色は好きではないので、いつも配色テーマを変えています。
今では最初からいい感じの配色テーマが入っていますが、一番よく使っている配色がGitHubのDarkです。
エディタの見た目系拡張はアイコン系も一時期入れていたのですが、今は入れなくなってしまいました。

↓標準の配色
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/811027/87aad37f-1c84-42f4-2faa-f20f9d6070fe.png)

↓GitHub Darkの配色
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/811027/ff8f4283-08c9-f391-9b2c-77082230c81c.png)




# おわりに
いかがだったでしょうか？
有名どころばかりなのであまり参考にならなかったというかたも多いかと思いますが、VSCODEデビューしたてで拡張を探しているという方は参考にしてみてください。
s3をちゃんと調べてみた

## 勉強前イメージ

バケットごとにデータを保存していくAWSのサービスって概要は知ってる
データの保存方法とかストレージクラスとか細かいところがわからん
今回は知りたいこと中心に書いてます。

## 調査

### s3とは

Simple Storage Service の略で、AWAのサービスの一つです。
破格な安さと、99.999999999%という耐久性を兼ね揃えています。

### 用語

- バケット
	- バケットはデータを置いておく箱のようなもの
	- バケットはs3の中で一番大きな単位
	- バケットは複数作成し、用途ごとに分けることが出来る
	- バケットごとにアクセス制御を行う
	- バケット作成時にリージョン指定を行うことが出来る
- オブジェクト
	- オブジェクトはアップロードするデータのこと
	- バケットに格納されるのがオブジェクト
	- オブジェクトにはキーとバージョンIDによってバケット内で一意である
- キー
	- オブジェクト(アップロードデータ)の固有識別子
	- オブジェクト1つに1つキーが割り振られる

### ストレージクラス

#### S3 標準（高頻度アクセスの汎用ストレージ用）

- 低レイテンシーで高スループットなパフォーマンス
- 複数のアベイラビリティーゾーンにわたってオブジェクトに耐久性 99.999999999% を達成するよう設計
- 1 年で可用性が 99.99% になるように設計
- → いわゆる普通のやつ

#### S3 Intelligent-Tiering（未知のアクセスパターンのデータ、またはアクセスパターンが変化するデータ用）

- アクセスパターンが変化したときに 4つのアクセス階層の間でオブジェクトを自動的に移動することで、コストを削減するストレージクラス
- アクセス階層
	- アクセス用に最適化された 2つの低レイテンシーのアクセス層
	- 非同期アクセス用に設計された 2つのアーカイブアクセス層
- 30日間オブジェクトを監視して、適するアクセス層に移動します

#### S3 標準 – 低頻度アクセス（S3 標準 - IA）

- アクセス頻度が低いデータ向け
- 長期保存、バックアップ、災害対策ファイルのデータストアとして適している

#### S3 1 ゾーン - 低頻度アクセス（S3 1 ゾーン - IA、長期間使用するが低頻度アクセスのデータ用）

- アクセス頻度が低いデータ向け
- 通常3つのAZに保存しているが、1つのAZにのみ保存するのでコストを削減できる
- オンプレのデータのバックアップやセカンダリバックアップなどに適している

#### Amazon S3 Glacier（S3 Glacier）

- データのアーカイブに適している
- 低コストでセキュリティや耐久性が高い
- 取得時間を設定可能

#### Amazon S3 Glacier Deep Archive（S3 Glacier Deep Archive、長期アーカイブおよびデジタル保存用）

- 最も低コストのストレージクラスであり、1年のうち 1,2回しかアクセスされないようなデータに適しています
- 長期間のデータを保存し、あまりアクセスしないデータを対象としている
- 取り出し時間は 12 時間以内

#### S3 Outposts

- オンプレ環境でデータを管理
- S3 Object 互換性、および、S3 SDK を介してのバケット管理が行われる

### バージョニング

- 同じバケット内でオブジェクトの複数のバリアントを保持する
- バージョニングが有効なバケットでは、誤ってオブジェクトを削除したり上書きした際でも復元できる
- 固有のバージョンIDが割り振られる
- デフォルトでバージョニングは無効
	- 一度バージョニングを有効にすると無効には戻せないが、停止させることは出来る

### ライフサイクルポリシー

- 別の `ストレージクラス` にオブジェクトを移行する・削除するタイミングを定義すること
- 2通りのアクションがある
	- 移行アクション
		- 別のストレージクラスにオブジェクトを移行するタイミングを定義
	- 有効期限アクション
		- オブジェクトの有効期限を定義します。Amazon S3 はユーザーに代わって有効期限切れのオブジェクトを削除します。

### レプリケーション

- 異なるバケット間で自動的に非同期コピーが出来る
- 同一アカウントOK、別アカウントにコピーもOK
- 同一リージョンでもOK、別リージョンでもOK
	- 同一リージョン : 同一リージョンレプリケーション(SRR)を使用
	- 別リージョン : クロスリージョンレプリケーション(CRR)を使用
- メタデータを保存しながらのレプリケーション
- 別のストレージクラスにレプリケーションも出来る
- オブジェクトを別のAWSアカウントの所有権に変更できる(所有権オーバーライドオプション)
- `S3 Replication Time Control (S3 RTC)` を使用して、15分以内にレプリケーションが出来る

## 勉強後イメージ

ストレージクラスが、1,2個かなって思ってたらめっちゃあった...
実際に手を動かして、ストレージクラスの変更させたり、ライフサイクル設定したり、レプリさせたりしないとピンとこないかもー
それにしても、s3ってこんないっぱい機能あったなんて知らなかった

## 参考

- [Amazon S3](https://aws.amazon.com/jp/s3/)
- [【AWS】S3ストレージクラスについて](https://qiita.com/naoki202005/items/fd6bf43ff7f31d241b6d)
- [バージョニングの使用](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Versioning.html)
- [オブジェクトのライフサイクル管理](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/object-lifecycle-mgmt.html)
- [レプリケーション](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/replication.html)
- [Amazon S3](https://qiita.com/leomaro7/items/e6bfc93f03ca4235f14a)
デイトラ　Webデザインコース　DAY1〜8

DAY1〜8ではデザインの基礎・figmaの使い方・LPトレースを学びました。
簡単に整理していきたいと思います。

#はじめに
デイトラをはじめる以前はコーディングについては少し勉強していましたが、Webデザインはあまり触れたことがありませんでした。
**「デザインはセンスなので難しいのでは？」**
と思っていました。

ですが、コーディングを学ぶ中でデザインにもとても興味が湧いてきて、
**「良いデザインは理論を勉強することで作れるようになっていく」**と知り、
勉強を始めようと思いました。

#figma
全く使ったことのないツールなので、初めてのことばかりで慣れるのが難しかったです。というか今もまだ慣れていません。
初心者の私が詰まったところを今後共有していきます。

#LPトレース
トレースは地道に一つ一つ見本と同じように作り上げていくものです。
初心者の私がやると何時間もかかりましたが、今回のLPトレースでは慣れると1時間ほどでできるということで、驚きましたが一つの目安にして頑張ります。

#フォントのインストール
figmaに入っていないフォントを使用したい時
・フォントをGoogleなどで検索してダウンロードページからダウンロード
・解凍（１つのフォルダに何種類もある時は必要なものをダウンロード）
・自動でfigmaに反映
　反映しなければfigmaを再起動

#まとめ
良いデザインを作れるようになるためには
**理論を学ぶ
良いデザインにたくさん触れる
実践する**
ことが重要です。
whereメソッドについて（rails）

## whereメソッドとは？
　テーブル内の条件に一致したレコードを配列の形で取得することができるメソッド。

```ruby:コントローラー
モデル名.where("条件")
```

## 基本的な記述方法
　whereメソッドはシンボル指定と文字列指定がある。
#### ①シンボル指定

```ruby:コントローラー
モデル名.where(カラム名: 条件)

# usersテーブルのnameカラムから「太郎」という文字が入っているレコードを全て取得する場合
User.where(name: "太郎")
```
#### ①文字列指定

```ruby:コントローラー
モデル名.where("カラム名 = 条件")

# usersテーブルのnameカラムから「太郎」という文字が入っているレコードを全て取得する場合
User.where("name = '太郎'")
```

## 様々な検索方法・複雑な指定方法
#### ①比較して条件を定義する方法

```ruby:コントローラー
User.where("id > ?", 5)
# idが5以上のレコードを全て取得できる。
```
#### ②複数カラム指定でのAND検索方法

```ruby:コントローラー
User.where(name: "太郎", age: 25)
# nameカラムが「太郎」かつageカラムが「25」のレコード全てを取得できる。
```
#### ③複数カラム指定でのOR検索方法

```ruby:コントローラー
User.where(name: "太郎").or(User.where(age: 25))
# nameカラムが「太郎」またはageカラムが「25」のレコード全てを取得できる。
```
Elixirで竹内関数を計測してみた

この記事は Elixir Advent Calendar 2020 19日目の記事です。

昨日は @zacky1972さんで[Elixirで速度を追い求めるときのプログラミングスタイル](https://qiita.com/zacky1972/items/5963a8bf5f2a34c67d88)でした。
***
## 竹内関数
竹内関数はベンチマークに使われる再帰的に定義された関数です。
下記のように定義されているので、たらい回し関数とも呼ばれています。

```math
tarai(x,y,z) =
\left\{
\begin{array}{lll}
y & \textrm{if} & x \leq y\\
tarai(tarai(x-1,y,z), tarai(y-1,z,x), tarai(z-1,x,y)) & \textrm{else} & 
\end{array}
\right.
```

## Elixirで実装
定義通りにに実装しました。

```elixir
defmodule Takeuchi do
  def tarai(x,y,_) when x <= y do
    y
  end
  def tarai(x, y, z) do
    tarai(tarai(x-1,y,z), tarai(y-1,z,x), tarai(z-1,x, y))
  end
end
```

[動的計画法を使う問題をElixirで関数型っぽく解いてみる](https://qiita.com/masatam81/items/0306163bb15d9cfbe092)で知った`:timer.tc`を使って計測してみました。

```
iex(1)> :timer.tc(Takeuchi, :tarai, [10,5,0])
{15000, 10}
iex(2)> :timer.tc(Takeuchi, :tarai, [12,6,0])
{156000, 12}
iex(3)> :timer.tc(Takeuchi, :tarai, [14,7,0])
{7234000, 14}
iex(4)> :timer.tc(Takeuchi, :tarai, [16,8,0])
{503249780, 16}
iex(5)> :timer.tc(Takeuchi, :tarai, [18,9,0])
{29903428454, 18}
```

***
時間がかかるということは知っていたんですが、実際に実行して見ると予想以上でした。

明日20日目の[Elixir Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir)は @sanpo_shiho さんのPhoenix現代アーキテクチャ入門です。よろしくお願いします。
加速度と角速度

#加速度
## 加速度とは	
単位時間あたりの速度の変化を表す単位
1秒間にどれだけ速度m/sが変化しているかという意味で、国際(SI)基準ではm/s2という単位が使われる。
例えば、10m/sの電車が10秒後に20m/sに変化した場合、加速度は10m/s2となる。
	
また、物体を落とした時の加速度、つまり重力加速度（9.80665 m/s²）は1Gという単位で表す。

## 加速度、速度、位置の関係	
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/2cee0e56-cf33-9597-e291-5dc0d3dfb7cd.png)	
	
## 加速度センサ	
加速度センサとは、加速度を測定するセンサのこと。
加速度を測定することで、傾きや動き、振動や衝撃のような情報を得られる。
振動センサとは異なり、重力の検出が可能なのが特徴

#角速度
## 角速度とは	
直線上を物体が移動するときの速度は、単位時間（1秒）あたりどれぐらいの距離l[m]を進むかで表す。
__速度v(m/s)(メートル毎秒)＝距離l(m)÷時間t(s)__　

一方、円周上を物体が移動（回転）するときの速度は、単位時間（1秒）あたりどれくらいの角度θ[rad]を進むかで表す。
この速度のことを角速度といい、ω[rad/s]で表す。
角速度ω(rad/s)(ラジアン毎秒)＝角度(回転角)θ(rad)÷時間t(s)
※当然動いていない時は0になる
デザイナーのエゴと向き合う

この記事は[Life is Tech！Advent Calendar](https://qiita.com/advent-calendar/2020/life-is-tech) 18日目の記事です！

# はじめに
普段開発しているときにコードを書く中で、渡されたデザインに対して
「いや、このデザインどうやって実装すんねん！」
「できるか！こんなデザインめちゃ時間かかるわ！」
もっと言えば
「**こんなのデザイナーのエゴやろ！！**」
って思ったことありませんか？

そんなことを思ったことのあるエンジニアの方や、
そう思われたくないなと考えているデザイナーの方に向けた
デザイナーとエンジニアの関わり方を僕なりに考えたものを共有できればなと思います。

# 結論
**デザイナーとエンジニアの密なコミュニケーションを取っていこうぜ**

僕自身の考えとしては

>デザイナーはエゴを突き通すべき
エンジニアはデザイナーのエゴを実装できるべき

と考えています。

デザイナーが実装コストなどを考え始めると、デザインの幅が確実に狭まります。
これどうやって実装するんだろうとか考え始めるのは二の次。
まずはアイデアを形にしてみる。

エンジニアはこのデザインどうやって実装するねん、無理やろ！と思っているぐらいだったら
デザイナーにどういう意図があってそのデザインになって聞いてみるべき。
そこで話し合うことに意味がある。

# どうやって歩み寄るのか
## 1.共通のルールを決めておく（エンジニア、デザイナー向け）
デザインの原則とは使用する色やフォントサイズ、余白の大きさなどを決めておくということです。
以下の画像は僕が実際にチームハッカソンで出た際に使用したルールの一例です。
![デザイン原則.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429660/139e1ae1-eff0-1c4b-7465-31d04be84953.png)

この例はあくまで一例で、
例えば行間の広さであったり、角丸の大きさ、影の付け方なども規則になりうる要素だと思います。

## 2.デザインによる印象の違いを知っておく（エンジニア向け）
まずは以下の画像をご覧ください。
![デザイン違い.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429660/6db092f9-3fa5-fe13-f918-fe6414ac3865.png)

この二つの画像には大きく３つの違いがあります。
 
1.タイトルの文字間（Letter Spacing）
2.テキストの行間（Line Hight）
3.背景色のカラーコード（#000000 #333333）

この３つの違いでも見易さが変わっていることがわかるかと思います。
こうしたデザインの違い、いうなればデザイナーのこだわりによって
届けるユーザー体験は少しずつ変わってくると思っています。

以下の画像は、UIデザインにおけるちょっとしたデザインの違いを示したものです。
是非、印象の違いを感じ取ってください。そしてその印象の違いはどこから生じているのか考えてみてください。
（左の画像は全て同じです。）


![ちょっとした違い.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429660/8baa3e35-2f3b-91c5-de18-857cc61bf1b7.png)
それぞれどこが違うかわかったでしょうか？
上から文字の太さ、コンポーネント（セル間）の余白、文字の間隔が変わっています。

## 3. 実装の仕方コスト感を知っておく（デザイナー向け）
以下の動画をみてみてください。
![Videotogif (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429660/88f4bfb6-262f-2c04-28e9-699c480bdfcf.gif)
ある程度UIデザインツールを使ったことある人なら比較的簡単にこちらので
詳細をみるボタンの動きは作成できるのではないでしょうか？

しかしいざ実装をするといろいろな障壁があります。
①詳細をみるボタンの位置
②可変するセルの高さ
③詳細をみるボタンを押した後の閉じるボタンはないのか

僕自身もデザインするとき、③のケースはよく見落とします。
実装にいざ取りかかり始めてから、「このパターンのデザインはないの？」みたいなことが起きると
出戻りが発生してあまり良くないです。

ここの実装の仕方に関しては僕自身もまだまだ勉強中で知識が足りない部分が多いですが、
少しずつ知識を増やしていて実装方法を知っていればコミュニケーションも取りやすいと考えています。

# 終わりに
デザインもエンジニアリングもどっちもめちゃめちゃできる人っていうのはまだ少ない印象ですし、
各プロフェッショナルがお互いに歩み寄っていくことでさらにいいものができると思っているので、
エンジニアは
**「こんなデザインできるか！！」**から
**「このデザインはどういう意図なの？」**へ

デザイナーは
**「ここデザインと違う実装なんだけど...」**から
**「実装コストかかるかもしれないけど拘って欲しい」**へ

と意識が変わってくれるといいなと思っております！
HTML/Canvasでオラオラオラオラ無駄無駄無駄無駄のフキダシを作る

この記事は [Web グラフィックス Advent Calendar 2020](https://qiita.com/advent-calendar/2020/webgraphics) の18日目の記事です。

# はじめに

筆者は趣味でベクター系のお絵描きツールを作っています。いずれ文字入れやフキダシの機能を入れたいと思っていまして、今回の記事ではCanvasで文字とフキダシの描画を実装してみたものを紹介します。

![実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/ff695096-256d-766b-5fa4-3161c2019431.jpeg)

# やっていること

あまり理論的に高度な内容はありませんが、以下のようになります。

①角丸矩形の頂点位置を計算
![①角丸矩形の頂点位置を計算](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/593f5525-6bb3-88ff-d273-171315f4236c.jpeg)

②等間隔に分割したストロークの頂点を計算
![②等間隔に分割したストロークの頂点を計算](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/4d045474-424d-6fe4-d8e3-3a916c7e5519.jpeg)

今回はあまり意味はありませんが、こうすることで後の色々な処理がやりやすくなります。もっと複雑な形状に対応するには必要になることもあるはずです。

③波線フキダシの頂点位置を計算
![Image6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/1cb7f01c-79ee-8ac8-c8f8-401963e749a1.jpeg)

下のような感じでa、b1、b2をランダムに決めてベジエ曲線を計算するという処理をストロークに対して時計回りで繰り返しています。b2を次の繰り返しのb1として使うことで、連続した波線になります。
![Image5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/edd5e487-6d69-00f7-9261-1b4ea654da9c.jpeg)

④文字の厳密な寸法の計測
canvasにはgetImageDataというメソッドがあり、canvasのピクセルデータを取得できます。これを利用して、実際に描画されるフォントの寸法をピクセル単位で計測します。
measureTextというメソッドもあるのですが、ピクセル単位で縦横の寸法を取ることはできないようです。

![Image7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/2a5c002b-e9f1-07ee-9517-5d5b1434676f.jpeg)

⑤文字の描画
ひたすら描画します。

![Image9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/28acb0b6-696d-2691-3d1e-e845afb8e7a1.jpeg)

実は原作ではやってないみたいですが、フキダシをはみ出す表現もやってみました。

```js

context.globalCompositeOperation  = 'source-atop'
```

globalCompositeOperationでアルファ値が無い部分の描画がされないようにしています。
他のフキダシと被ると描画されてしまうのが問題ですけど・・・

![Image8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/77960afb-f4f4-f3f8-e197-3ea6ba4d8ef0.jpeg)

# 動くもの

<p class="codepen" data-height="800" data-theme-id="light" data-default-tab="js,result" data-user="warotarock" data-slug-hash="LYRLLee" style="height: 800px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="OraMudaFukidashi">
  <span>See the Pen <a href="https://codepen.io/warotarock/pen/LYRLLee">
  OraMudaFukidashi</a> by 柏崎ワロタロ (<a href="https://codepen.io/warotarock">@warotarock</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>


# 終わりに

今回はCanvasでフキダシを描画してみました。ルビを入れたところがちょっとこだわりでした！

それでは皆様よいお年を・・・（二回目）
Watson Assistant 2020

#Watson Assistant 
Watson Assistant は 旧Watson Conversation、お問い合わせ窓口のサポートやチャットボットなどで活用される人気のあるサービスです。
サービスリリースから毎年すこしずつ使いやすく変わっています。
今回は、さくっと立ち上げる方法や最近のWatson Assistantがどのような機能を提供しているのかをご紹介します。
通販番組と同じでよくなったなど良し悪しはあくまで**個人の感想です。**
#外部アプリとの連携が簡単に
スキルに「統合の追加 (Add integration)」機能が提供され、「サード・パーティーの統合 (Third-party integrations)」の選択が可能になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/99be6c2f-7523-e19b-8b70-022aa1e651fa.png)

#JSONファイルでさくっと作成
「ダイアログ・スキル (Dialog skill)」で「スキルのインポート (Import skill)」をクリック、「JSON ファイルを選択 (Choose JSON file)」の選択ができるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/fce38286-58e4-314b-9ce1-5813a677c534.png)
もちろん、エクスポートもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/29233b91-d1df-de84-45b1-45ae797533ec.png)

#Sampleコードが分かりやすくなった
Intent、Entity、Dialog　ともに理解するために充分なパターンが提供されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245231/8207cd53-d97c-846f-4244-8939721c8902.png)
VS Code でデバッグ時の「Could not read source map for...」について

こやつに苦しめられた話。

```console:
Could not read source map for file:///d:/hoge/node_modules/fecha/lib/fecha.umd.js:
ENOENT: no such file or directory, open 'd:\hoge\node_modules\fecha\lib\fecha.umd.js.map'
```
<br>

下記のように`.vscode/launch.json`内の`"type"`を`"node"`から`"pwa-node"`へ変更したら出なくなりました。詳細分かる人いましたらぜひ共有いただきたいです！！！

```json:launch.json(変更前)
{
    "version": "0.3.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "MAIN",
            "program": "${workspaceFolder}\\index.js",
            "outputCapture": "std"
        }
    ]
}
```


```json:launch.json(変更後)
{
    "version": "0.3.0",
    "configurations": [
        {
            "type": "pwa-node",
            "request": "launch",
            "name": "MAIN",
            "program": "${workspaceFolder}\\index.js",
            "outputCapture": "std"
        }
    ]
}
```
Vim覚書

# Vim覚書

## モード
| モード  | 状態 |コマンド|
|:-:|:-:|:-:|
| ノーマルモード  | カーソル移動やテキストの削除、コピー、ペーストなどの簡単な指示を行う。  | Esc|
| ビジュアルモード  | テキストを選択するだけのモード。  | Esc-v|
|  インサートモード | 実際にテキストを入力するモード。  | Esc-i|
| コマンドラインモード  |  ファイルを開いたり、検索・置換などの様々な指示を行う。 | Esc :|
|  ターミナルモード | エディタ上でターミナルが開ける |Esc :terminal|
| 置換モード| 文字置換|Esc-R|
|バイナリモード|バイナリエディタ| Esc :set binary :%!xxd ファイル名|

## カーソル移動
| キー | 移動 |
|:-:|:-:|
|  h | 左一文字  |
|  l | 右一文字 |
|  j | 折り返しを考慮して下一行 |
|  k | 折り返しを考慮して上一行 |
| gj | 折り返しを考慮せず下一行 |
| gk | 折り返しを考慮せず上一行 | 
| [n]h  | 左n文字  |
| [n]l  | 右n文字  |
| [n]j  | 折り返しを考慮して下n行 |
| [n]k  | 折り返しを考慮して上n行 |
| [n]gj | 折り返しを考慮せず下n行 |
| [n]gk | 折り返しを考慮せず上n行 | 
| gg | 先頭行に移動 |
|[n]gg| n行目に移動 |
| w | 次の単語 |
| b | 前の単語 |
| [n]w | n個先の単語 |
| [n]b | n個前の単語 |

## 置換
| コマンド | 操作 |
|:-:|:-:|
| `:%s/置換前/置換後/`  |  一つずつ置換 |
| `:%s/置換前/置換後/g` | 全部置換  |

## バイナリモード

### 起動方法
1. `vim -b file_name` ` :%!xxd`
2. `:set binary` ` :%!xxd`

### 保存方法
`:%!xxd -r` `:w`
Visualforce非同期更新処理とlayout="none"

###本文はVisualforce非同期にactionメソッドの結果がクライアントに返されるときに指定される部分が更新されないことを説明する。


####Visualforce非同期処理
Visualforceに\<apex:actionFunction\>などの非同期処理タグに属性reRenderがあって、
actionメソッドの結果がクライアントに返されるときに更新される部分のIDです。
通常は更新したい部分について、\<apex:outputPanel\>タグを利用することです。

実装例は以下の通りです。ボタンをクリックしたら、testIdのエリアが非同期に更新される。

```非同期検証.v
<apex:outputPanel id="testId">
　　<apex:inputText value="{!testInput}" /><br/>
   <apex:outputText value="{!testOutput}" /><br/>
</apex:outputPanel>
<input type="button" value="非同期送信" onclick="testAf()" />
<apex:actionFunction name="testAf" action="{!testAf}" reRender="testId" />
```

####\<apex:outputPanel\>のlayout属性
layout属性に使用できる値は以下の３つです。
・block　　⇨　HTML div タグを生成
・inline　　⇨　HTML span タグを生成（デフォルト）
・none　　⇨　HTML タグを生成しない

####なぜ「layout="none"」を設定する必要か
既存システムや静的HTMLが既に提供されている場合など、特定なエリアが\<apex:outputPanel\>タグで指定する。
例えば、非同期処理の結果がクライアントに返されるときに指定される更新部分を指定する。
\<apex:outputPanel\>タグはSPANがデフォルト生成されるので、特定なエリアが\<apex:outputPanel\>タグで指定することにより、画面レイアウトが崩れる場合があるから。つまり、\<apex:outputPanel\>タグにより、既存の画面レイアウトに影響がある場合に「layout="none"」を指定する。
####「layout="none"」を設定したら、非同期処理に何の影響か。
では、\<apex:actionFunction\>の属性reRenderに指定される部分に「layout="none"」を設定したら、動作はどうなるかな。
結論から言うと、actionメソッドの結果がクライアントに返されるときに指定される部分が更新されないこと。
原因も簡単です。「layout="none"」は何も生成されないため、非同期処理が指定されるIDはそもそもHTMLに解析されなくて存在しない。

####まとめ
・\<apex:actionFunction\>の属性reRenderに指定されるIDは\<apex:outputPanel\>タグなら、「layout="none"」を設定しない。
・\<apex:outputPanel\>タグのせいで画面レイアウト崩れがある場合、更新したいエリアのDIVタグ、もしくはSPANタグを\<apex:outputPanel\>タグに切替えること。
【JavaScript】クラス構文について 2 〜継承〜

※当方駆け出しエンジニアのため、間違っていることも多々あると思いますので、ご了承ください。また、間違いに気付いた方はご一報いただけると幸いです。

こちらは、
[【JavaScript】クラス構文について　1](https://qiita.com/sho_U/items/aaf31fad5394edb70861)
の記事の続きとなります。


##継承の構文

```js
class 子クラス extends 親クラス {

}
```
継承することにより、親クラスの構造や機能を引き継ぐことができる。


子クラスから親クラスを呼び出す。

```js
class Parent {
    constructor(name) {
        console.log(name);
    }
}
// Parentを継承したChildクラスの定義
class Child extends Parent {
    constructor(name) {
        super(name); //superメソッドで親クラスのコンストラクタを呼び出す。
        console.log(name);
    }
}
const child = new Child("taro");

//taro  親コンストラクターが実行された結果
//taro  子コンストラクターが実行された結果
```

子クラスでコンストラクター関数を定義した場合、親コンストラクタ関数を上書き定義している。
子クラスでコンストラクターを定義しなかった場合は、当然親のメソッドを引き継いでいるので親のコンストラクタを子クラスは保持している。

```js
class Parent {
    constructor(name) {
        console.log(name);
    }
}
// Parentを継承したChildクラスの定義
class Child extends Parent {
     //constructor(name) {
        //console.log(name);
     // }   親のコンストラクターを引き継いでいる。
}
const child = new Child("taro");

//taro  親コンストラクターが実行された結果
```

##プロトタイプ継承

親クラスが保持するメソッドは子クラスに引き継がれる。

```js
class Parent {
    say() {
        console.log("oya");
    }
}

class Child extends Parent {
  //子クラスではsayメソッドを定義していない。
}

const instance = new Child();
instance.say(); 

//oya
```
これは、プロトタイプチェーンの仕組みにより、子クラスから親クラスへ引き継がれることになります。
プロトタイプチェーンについての詳細についてはこちらの記事をご覧ください。

[【JavaScript】クラス構文について　１](https://qiita.com/sho_U/items/aaf31fad5394edb70861)

一方クラスから、インスタンス生成時にもプロトタイプチェーンの仕組みを使ってインスタンスへメソッドが引き継がれます。（参照情報が渡される。）

乱暴な言い方をすると、javascriptでは、メソッドの引継ぎに関して、親クラスから子クラスへと、クラスからインスタンスへとでは同じ方法でメソッドを引き継いでるイメージとなります。

##superプロパティ

上記の通り、親クラスのメソッドは子クラスが引き継いでいるので、呼び出すことができます。しかし、同名のメソッドを子クラスで定義した場合、メソッドチェーンの仕組みから子クラスで定義したメソッドが呼び出されることになります。

```js
class Parent {
  say() {
    console.log("oya");
  }
}

class Child extends Parent {
  say() { //親クラスと同名のメソッドを定義
    console.log("ko");
  }
}

const instance = new Child();
instance.say();

//ko
```
この時誤解してはいけないのは、sayメソッドは上書きされた訳では無いということです。
子クラスが親クラスを継承した時（メソッド定義前の段階）

```js
class Parent {
  prototype : {
    say(){console.log("oya");};
  }
}

//子クラスが親クラスを参照

class Child {
  prototype : { //子クラスのプロトタイプオブジェクト
   prototype : {  //親クラスのプロトタイプオブジェクト(注:実体ではなく親クラスのプロトタイプオブジェクトのメモリ上の位置情報を格納)
     say(){console.log("oya");};
   }
  }
}
```
この様に、子クラスのプロトタイプオブジェクトに、親クラスへのプロトタイプオブジェクトの参照情報が格納されます。
ここで、子クラスに同名のメソッドを定義した場合

```js
class Child {
  prototype : { 
    say(){console.log("ko");};//子クラスでsayメソッドを定義
     prototype : { 
     say(){console.log("oya"); };//親クラスのsayメソッド
   }
  }
}
```
当然、スコープチェーンより、子クラスから生成したインスタンスからsayメソッドを呼び出すと、子クラスで定義したsayメソッドが呼び出されます。

```JS
const instance = new Child();
instance.say();

//ko
```
この場合、親クラスのsayメソッドをsuper.メソッド名で呼び出すことができます。
親クラスのコンストラクタを呼び出すには、上記の通り super(); メソッドを使いますが、親クラスのメソッドもsuper.メソッド名で呼び出すことができるのです。

```js
class Child extends Parent {
  say() {
    console.log("ko");
  }
  parentSay() {
    super.say(); //親クラスのsayメソッドを呼び出している。
  }
}
const instance = new Child();
instance.parentSay();

//oya
```
[Swift5]githubにファイルをコミットしたいが、数が多すぎる時の対処法

#開発環境
Swift5 xcode12.2 
EngineerApp　という名前のプロジェクトを作成しているときに起きた問題です。
#エラー
![スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802266/bd296185-4bb0-53ea-374d-b68288f0899c.png)
このように、gitにファイルをコミットしようと思った際に、ファイルの数が多過ぎると、コミットができないです。
the working copy “EngineerApp” failed to commit files.
といったメッセージが出てきて、コミットに失敗します。
#原因
プロジェクト内に画像などのファイルを追加する際に誤って他のファイルも一緒に入れてしまった。自分の場合は、Macの中のダウンロードフォルダのデータが全て入ってしまってました。
#対処方法
ターミナルで下記を実行してターミナルを閉じ、プロジェクトを再起動し、再びコミット
```
cd EngineerApp
/Applications/Xcode.app/Contents/Developer/usr/bin/git reset
```
#参考
https://qiita.com/pgcmg00/items/0b94986290e8ae3a3b7e