OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】GitHubでセキュリティアラートが表示された時にcomposerで更新してパッケージをアップデートする

個人開発のプロジェクトBookMarkでセキュリティアラートが表示されていました。
今回はGitHubでセキュリティアラートが表示された時の対処法についてまとめておきます。

### 環境
| ツール | バージョン |
|:-----------|:------------|
| Composer       | 1.9.1        |


## 結論
`composer update {対象パッケージ}` でアップデート後、masterブランチに更新を取り込む。

## 手順
1.GitHubで表示されているアラート内容を確認
2.composer.jsonへ追記
3.updateするパッケージの依存パッケージを確認
4.アップデート実行
5.masterに取り込む

## 詳細
#### 1.GitHubで表示されているアラート内容を確認
<img width="521" alt="アプリ認定キットが起動できない.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/d087370d-06cb-c1ef-e8c1-e3cc0633b887.png">
GitHubで表示されているセキュリティアラートです。[See Dependabot alerts]をクリックして詳細を確認します。

<img width="521" alt="アプリ認定キットが起動できない.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/8fcbddb8-8fe8-0fca-6987-afe26ea7091e.png">

記載内容を見ると、「symfony/http-Kernel」「symfony/http-foundation」でアラートが上がっているようです。まずは、high securityとなっている「symfony/http-Kernel」を見てみます。

<img width="521" alt="アプリ認定キットが起動できない.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/35106e40-c86d-20b3-b54c-41f3bde73a83.png">
内容から、http-kernelを4.4.13以降のバージョンに更新する必要があることが分かります。自分のcomposer.lockを確認したところ「v4.4.2」となっていたので更新対象となっているようです。

```composer.lock
...
{
            "name": "symfony/http-kernel",
            "version": "v4.4.2",
...
```

#### 2.composer.jsonへ追記
「Remediation」に書いてあるように「http-kernel」を4.4.13にします。

```
...
    "require": {
...　　　{他パッケージ}
        "symfony/http-kernel": "4.4.13",
    },
...
```

#### 3.update対象の依存パッケージを確認

`--dry-run`オプションにより、更新される依存パッケージの確認ができます。
`composer update --dry-run symfony/http-kernel`を実行します。

#### 4.アップデート実行
表示内容を確認し、問題なければアップデートを実行します。

```
composer update symfony/http-kernel
```

#### 5.masterに取り込む
更新はdevelopブランチで行っていたので、まずリモートのdevelopブランチに取り込みます。この時点ではセキュリティアラートは消えていませんでした。この後、GitHub上でdevelop→masterへプルリクエストを送り、masterへ取り込み。

<img width="521" alt="アプリ認定キットが起動できない.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/ca209696-ea48-2b08-ad86-075966b2457b.png">

確認したところ、セキュリティアラートは消えていました。これでバッチリです。
同様の手順で「symfony/http-foundation」も更新を行い、すべてのセキュリティアラートが消えていることを確認しました。

### まとめ：セキュリティアラートは定期的にチェックしよう
今回更新を行ったパッケージのセキュリティアラートはかなり前に上がっていたものでした。そのため、更新を行うまでの期間はアプリに脆弱性があったことになります。大事なサービスを守るためにもセキュリティの意識は高く持つようにしたいです。

それでは！
PHP のバージョンを確認

###1.`php -v`で確認
アプリケーション→ターミナル→`php -v`を入力→エンターキー

このような順序で進めると、PHP のバージョンが表示されます。
![スクリーンショット 2020-10-30 9.00.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601015/6bd36a34-ae68-482a-bde7-2ad38fe02ed9.png)

参考元はこちら。(https://ex1.m-yabe.com/archives/2080)
AzureSQLServer とAccessでアプリケーションを構築する

##接続するIPアドレスを設定する

###サーバーファイアウォールの設定を開きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/6414f3a7-9e83-83b9-46a4-74d96f1049fc.png)

###接続を許可するIPアドレスを指定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/ffc3e951-ee33-827b-2362-5d2b64e6f475.png)


##SSMSからの接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/644ccc5d-3810-d5db-2bf7-84a9fbcd071a.png)

###該当のサーバーのユーザー名とパスワードを確認する
（キャプチャーはサーバー作成時の画面）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/6ac45db8-6a59-d0a2-8a25-9c91f400efcc.png)



##Accessから接続する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/969f85e1-7f07-5080-566c-ec79f98fe990.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/ee676037-8271-8ef1-3e6e-036adf1ad042.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/df021ba9-0e2b-f13f-e931-1784886b16b7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/4ac09de3-1697-5616-d803-142748b15c30.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/c850ad22-1055-72b0-fca4-595df883ca1e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/18afdb32-330a-69cc-9c77-cf3a7b68290c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/14d72323-d647-b7f9-5f1e-e13969bb5bcd.png)
SQLAlchemy flush(), commit()の違い

## PythonのO/R Mapper の１つであるSQLAlchemyを利用してテーブルのレコード操作する際に使用する flush(), commit()の使い分けについて説明します

最近、仕事で使うようになり少しずつ学習しています。

簡単に言葉で表現するなら
flush()：一時的にクエリ結果をデータベースに反映（ロールバック可能なので、commit()しないとクエリが無効になり、最後にcommit()する必要あり）
commit():永続的にクエリの結果をデータベースに反映（レコードの追加、更新、削除の完了）

それぞれの用途としては
エラー時にロールバックして、データベースへの反映を無かったことにしたい場合に使うと便利なのが`flush()`

例えば、

```
session.begin()
try:
    for item in session.query(Model).all():
       session.add(Model)
       session.flush() # <-保留状態
    session.commit() # <-ここで永続的にデータベースへ反映
except:
   session.rollback() # 保留状態を破棄して、データベースへの反映は全くない
finally:
    session.close() # エラー発生＆正常終了、どちらでもセッションを閉じる
```

逆にロールバックしたくない場合は`commit()`を使います

```
session.begin()
try:
    for item in session.query(Model).all():
       session.add(Model)
       session.commit() # <-都度都度、永続的にデータベースへ反映
except Exception as e:
   print('Error:{}'.format(str(e)))
   raise e
finally:
    session.close() # エラー発生＆正常終了、どちらでもセッションを閉じる
```

エラーが発生せず処理の最後でデータベースへ処理内容を反映させる場合には`commit()`を使います。


正式な説明は公式ドキュメントにあります
[Session.flush()](https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.flush), [Session.commit()](https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.commit)
(ドキュメント読んでも、ちょっと難しかったです；)

公式ドキュメントを読んでわかった範囲で、commit()の他の特徴 
・デフォルトモードのautocommit = Falseでセッションを使用すると、コミットの直後に新しいトランザクションが開始されます。

この機能があるから、session.close()しても その後でもセッションを生成せずにflush()とかcommit()ができちゃうんでしょうかね？
もしわかる方いたら教えてもらえると嬉しいです。
Azureの管理画面でよく使う項目

###料金

https://docs.microsoft.com/ja-jp/azure/cost-management-billing/manage/mca-check-azure-credits-balance?tabs=portal


###リソースの利用量を調査する
サブスクリプション別にどのリソースが多く使われているのかを調査する

コストの管理と請求⇒サブスクリプション名をクリック⇒グラフで確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/7614dce3-0d51-f756-868f-0e92cb1b4bb5.png)

###AzureSQLを止める
できないらしい
初心者がGitHubを利用したときのメモ

##公開を非公開に変更するとき


#####Github>Setting>Options>DangerZone

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/72588270-e6f5-786a-cf19-bd17dc931af1.png)


##最初にファイルを作るとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/4ae0e644-91ce-6b41-fa88-50580570d41b.png)
【初心者】 オブジェクト指向をまとめたもの

#はじめに

この記事はプログラミングをはじめたばかりの素人が、メモするのに利用しています。
内容には誤りがあるかもしれません。

オブジェクト指向を勉強している時に自分用に作成したものです。

良くも悪くも参考になればと思います。


#オブジェクト指向

![obj1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/478f94ef-d9e4-3d30-66ac-0cff1100980e.jpeg)

![obj2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/e9d44f37-29cb-a6f0-b73f-2576ef7d1c5a.jpeg)


#オブジェクト指向 作成例

![obj3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/c7ebb4be-bc89-cda3-f325-e9320db939d1.jpeg)

![obj4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760252/b08c3ab4-ef09-5cec-83f3-15f6a45795b7.jpeg)
JIRA APIをcurlで叩く

# はじめに

特定の作業に紐付いて自動で起票されたチケットが大量に溜まっていたので、[公式のリファレンス](https://developer.atlassian.com/cloud/jira/platform/rest/v3/intro/)を参考にAPIを叩いてクローズ依頼を出せるようにした。
具体的にやったことは下記。

1. 対象チケットを取得
1. クローズ依頼コメント
1. ステータス遷移


# 1. 対象チケット取得

```
HTTP_STATUS=`curl --silent --request POST \
  --url "https://your-domain.atlassian.net/rest/api/2/search" \
  --user "$USER:$PASSWORD" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --data "{
    \“jql\”: \”project = JIRA AND type = 1111 AND cf[2222] AND assignee = currentUser()\”,
    \"maxResults\": 1000,
    \"fields\": [
      \"key\"
    ],
    \"startAt\": 0
  }" \
  -w '%{http_code}\n' \    # エラーハンドリング用にHTTPステータスコードを変数に格納
  -o response.txt`
```

### JQL

コメント/ステータス遷移対象とするチケット群を検索するためのJQL( [参考1](https://www.atlassian.com/ja/software/jira/guides/expand-jira/jql]))を作る。
カスタムフィールドのキー/バリューは`Get edit issue metadata`API([参考2](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-issueidorkey-editmeta-get))を実行することで確認可能。

### チケットのキー取得

`search`APIを実行すると下記のように結果が返ってくる。

```
$ cat response.txt

{
  "expand": "schema,names",
  "startAt": 0,
  "maxResults": 1000,
  "total": 20,
  "issues": [
    {
      "expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
      "id": "3333",
      "self": "https://your-domain.atlassian.net/rest/api/2/issue/3333",
      "key": "JIRA-4444"
    },
    {
      "expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
      "id": "5555",
      "self": "https://your-domain.atlassian.net/rest/api/2/issue/5555",
      "key": "JIRA-6666"
    },
    ...
  ]
}
```

後続処理で使用するのは`key`だけなので、`jq`を使って抽出する。

```
$ cat response.txt | jq .issues[].key -r

JIRA-4444
JIRA-6666
...
```

以降のコメント/ステータス遷移処理は上記のkeyのリストでループさせる。

```
for ticket_key in `cat response.txt | jq .issues[].key -r`
```

# 2. コメント
```
HTTP_STATUS=`curl --silent --request POST \
  --url "https://your-domain.atlassian.net/rest/api/2/issue/$ticket_key/comment" \
  --user "$USER:$PASSWORD" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --data "{
    \"body\": \"クローズをお願いいたします。\"
  }" \
  -w '%{http_code}\n'`    # エラーハンドリング用にHTTPステータスコードを変数に格納
```
windowsのgitbashからだと日本語がうまく扱えなかったので、実際は`--data @comment.txt`のようにUTF-8のテキストファイルを読み込ませるようにした。

# 3.ステータス遷移
```
HTTP_STATUS=`curl --silent --request POST \
  --url "https://your-domain.atlassian.net/rest/api/2/issue/$ticket_key/transitions" \
  --user "$USER:$PASSWORD" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --data "{
    \"transition\": {
      \"id\": \"777\"
    }
  }" \
  -w '%{http_code}\n'`    # エラーハンドリング用にHTTPステータスコードを変数に格納
```

JQL作成時と同様に遷移先のステータスidは、既にそのステータスになっているチケットに対して`Get edit issue metadata`APIを実行することで確認可能。
あれっhoverしたときにtransitionが効かない！？

hoverさせたときにtransitionが効かなくて困った時の話です。

#動かなかったコード

```index.html
<div class="test">
 <a href="http://xxxxxxxxx" class="test-link">
  <img src="../image/test.png" alt="テスト">
　</a>
</div>
```

```style.scss
.test{
transition: opacity .3s linear;
 &:hover{
 opacity:.8;
 }
```

のように、親クラスに`transiton`をあてても効きませんでした。
最終的に下記のコードに書き換えたら`transiton`が効きました。

```stye.scss
.test{
  img{
    transition: all .3s linear;
    &:hover{
      opacity: .8;
    }
  }
```

あぁ間違っていたんだなとcodepenで再現しようとしたら、上記の書き方でも動いたんですよね。

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="okalog" data-slug-hash="GRqxZor" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="imgにhoverをあてる">
  <span>See the Pen <a href="https://codepen.io/okalog/pen/GRqxZor">
  imgにhoverをあてる</a> by TakahiroOkada (<a href="https://codepen.io/okalog">@okalog</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

結論、原因がよくわからなくなってしまったんですがとりあえず今は狙った動きができればOKとします。
もし、transionが効かない際には、imgに`transition`をあてるといいかもです。
【Android Studio】文字列を追加したいときはStringよりもStringBuilderのがいいよって話【Kotlin】


StringBuilderクラスは可変長の文字列を扱うクラスです。
append()メソッドを使って文字列を連結させていく時に使います。
String()クラスに+=していけば良くない？って感じですが、String()は一度生成すると値を変更することができません。
つまり下記のコードではstrに"abc"と"def"を足しているように見えますが、メモリ上の処理は新たにstrインスタンスを生成して"abcdef"を作成していることになります。

```kotlin:
fun main() {
    var str = "abc"
    println(str)
    str += "def"
    println(str)
}
```

こちらの記事に分かり易く説明されています。
参考：[Stringと StringBuilder](https://www.milk-island.net/document/java/kihon/i2/)

よって、StringBuilder()を使った以下のようなコードの方が処理速度が早くなります。

```kotlin:
fun main() {
    var sb = StringBuilder()
    sb.append("abc")
    println(sb)
    sb.append("def")
    println(sb)
}
```

こちらの記事に処理速度の違いがまとめられていました。
参考：[【String型 vs StringBuilder】文字列結合における処理速度の違い](https://qiita.com/Sirloin/items/2455ee3a8bbbfb447abb)
CircleCIでeslintのerrorを何個か許容するようにした

Lintは便利なので基本的には全て従いたいし、マージ前にはCircleCIで実行しておきたいのだけど、チーム内には譲れないものがあるメンバーがいたりして、時々メンバーからLintのルールに対するご意見をもらうことがあります

でも、Lintでerrorやwarningがでているコードを協議する暇もなく今すぐマージしたい場合がありますよね

そういう時に、個々のメンバーがルールを変えることを許容したりしてたら無法地帯になる気がするので、その場でLintの終了コードを0にする工夫をしてもらうのではなく「N個までのエラーは許容してマージします」という運用にしました

こういう感じのコードを書いて

```shell:lint-allow-errors.sh
#!/bin/bash
border=$1
npm run lint
if [ $? -ne 0 ]; then
  set `npm run lint | grep "problems" | tr -d "("`
  problems=${2}
  errors=${4}
  warnings=${6} # warningsの数は --max-warnings オプションがあるのでそっちを使うと良いでしょう
  if [ $errors -le $border ]; then
    echo "allow ${border} or less errors"
    exit 0;
  else
    echo "not allow errors greater than ${border}"
    exit 1;
  fi
fi
exit 0
```

`.circleci/config.yml`で走らせるのは`eslint`自体ではなく `lint-allow-errors.sh`にする

```yaml:.circleci/config.yaml
      - run:
          name: Lint
          command: sh ./lint-allow-errors.sh 50
```

何個のエラーを許容するかはお好みですが、50もあれば超えることはないでしょうし、50を超えているんだったら素直に直してくれよ頼むから...という感じです

また、別途タスク管理ツールに`complaints agains lint rules`みたいなIssueを立てて、👍と👎の数で投票...とかしておけば便利だと思います
neo4jでsandbox その17

#概要

neo4jでsandboxやってみた。
pythonでneo4j sandboxを叩いて、gistのデータを投入したのを取得したので、d3で表示してみた。

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d5a23623-8421-95c5-281b-9b02cbf89d95.jpeg)


#成果物

https://embed.plnkr.co/plunk/eBO4DAjeKibZJoyi

以上。
ベイズ推定での注意.1

# 記事の目的
この記事では、ベイズ推定での事前分布の設定で注意するべきポイントについてまとめました。
ベルヌーイ分布と共役事前分布のベータ分布を使用します。
ベルヌーイ分布のパラメータ(ベータ分布の値)をコインの表がでる確率だと考えて話を進めます。
# 目次

[1. 事前分布の設定](#1-事前分布の設定)
[2. データの生成](#2-データの生成)
[3. 事後分布の評価](#3-事後分布の評価)
[4. データ量が多い場合](#4-データ量が多い場合)

#1. 事前分布の設定
(1)コインの出る確率はほぼ間違いなく0.5だろう(確信が強い)と仮定している事前分布
(2)コインの出る確率は0.5かな(確信が弱い)と仮定している事前分布
(3)コインの出る確率はほぼ間違いなく0.2だろう(偏見が強い)と仮定している事前分布

```R:
par(mfrow=c(1,3))
curve(dbeta(x, 100, 100), 0,1) #(1)確信が強い
curve(dbeta(x, 2, 2), 0,1) #(2)確信が弱い
curve(dbeta(x, 2, 100), 0,1) #(3)偏見強い
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/46559bb0-6759-acca-5c88-13f4b75177cb.png)


#2. データの生成
コインの表が出る確率0.8の分布から、10個データを生成します。
このデータをもとに事前分布を更新して得られた事後分布で、0.8になる確率が高くなっていたら成功です。

```R:
N <- 10
set.seed(100)
X <- rbinom(N, 1, 0.8)
X
# 結果
[1] 1 1 1 1 1 1 0 1 1 1
```

#3. 事後分布の評価
(1)確信が強い事前分布を仮定すると、データが少し得られても変わらない。
(2)確信が弱いため、少ないデータでも左右されやすく、うまく推定できている。
(3)確信が強い事前分布を仮定すると、データが少し得られても変わらない。
→適切な事前分布を仮定できれば、少ないデータ量でもうまく推定できる。
→誤って仮定すると、少ないデータ量だと間違った結果をまねく。

```R:
library(dplyr)
a <- X[X==1] %>% length()
b <- N-a
curve(dbeta(x, 100+a, 100+b), 0,1)
curve(dbeta(x, 2+a, 2+b), 0,1)
curve(dbeta(x, 2+a, 100+b), 0,1)
```

>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/dda2fa39-ec45-cfaf-cff3-760dd79f7566.png)



#4. データ量が多い場合
データ量を10から10000に変えて同様のことを行う。
(1), (2), (3)全部うまく推定できている。
→データ量が多いと、事前分布に左右されずにうまく推定できる。

```R:
#データの生成
N <- 10000
set.seed(100)
X <- rbinom(N, 1, 0.8)
#ベイズ更新
a <- X[X==1] %>% length()
b <- N-a
curve(dbeta(x, 100+a, 100+b), 0,1)
curve(dbeta(x, 2+a, 2+b), 0,1)
curve(dbeta(x, 2+a, 100+b), 0,1)

```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/ae83c9b5-580a-f2ab-7904-29b3062cebb0.png)
[day:12]CSSで三角形と楕円を作る

# CSSで三角形と楕円を作る

## はじめに
ページ作成のタスクの中で、背景として`三角形`と`楕円`を使用することがありました。
普段見慣れている図形でもCSSになると「あれ？どうやって作るんだっけ」となってしまうこともあるかと思います。
今回は一緒にこれらの図形を作っていきましょう！

## 三角形を作ろう
三角形ってよくデザインで見ますが、いざcssで実装となるとどうやって作るのかと考えてしまいますよね。
今回は一緒に三角形をcssで作ってみましょう！
まずは以下のようにhtmlとcssを記述して四角を用意してみましょう。

```html
<div class="test">三角です</div>
```

```css
width:            100px;
height:           100px;
background-color: red
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584171/39fe80d2-79a0-dfdf-eb60-0cb9570bd46f.png)
かわいい四角形が表示されましたね。
では、この四角形を三角形に変化させてみましょう！

結果的には以下のcssを当てることで三角形が作れます。

```css
.test {
  width:        0;
  height:       0;
  border-style: solid;
  border-width: 100px 100px 0 0;
  border-color: #ff0000 transparent transparent transparent;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584171/2ded156e-6c20-6274-61fe-3b3cb5ff181a.png)
美しい三角様が出現しました！

作りたい形の三角形を指定することでそのCSSを教えてくれるサイト
[CSS三角形作成ツール])(http://apps.eky.hk/css-triangle-generator/ja)

CSSで三角形を作る仕組みの解説
[CSSだけで三角形を作ろう！その1](https://www.granfairs.com/blog/staff/make-triangle-with-css)

## 楕円を作ろう
早速楕円を作ってみましょう！
まずは楕円の元になる四角を用意します。

```html
<div class="test">楕円です</div>
```

```css
.test {
  width:            400px;
  height:           100px;
  background-color: red;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584171/f42fdf85-fe71-62b7-77d6-432f143bd412.png)
かわいい四角形が表示されました。
ではこれの角を削ぎ落として楕円に加工しちゃいましょう！

行うのは`border-radius: 50%;`の一文を加えるだけです。

```css
.test {
  width:            400px;
  height:           100px;
  background-color: red;
  border-radius:    50%;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584171/abfac4ef-a49c-78ad-2709-1265becaaa44.png)

楕円の完成！
たったの一文で完成しました。
デザインを見た時にはどうやるんだっけ？となりそうですが、実に簡単です。
ICOS(IBM Cloud Object Storage)の静的Webサイトを構成する機能(Static website hosting)でアクセスログを取得してみる

#1. はじめに

[この記事](https://qiita.com/testnin2/items/a34fa039296b4439166a)の続きです。
ICOS(IBM Cloud Object Storage)にて静的Webサイトを構成する機能(Static website hosting)が実装されましたが、Webサーバーとしては監査目的のためにもアクセスログは欲しいところです。本稿ではアクセスログを確認する手段としてActivity Tracker with LogDNAとの連携方法を記載したいと思います。

公式ドキュメントは[こちら](https://cloud.ibm.com/docs/Activity-Tracker-with-LogDNA?topic=Activity-Tracker-with-LogDNA-cloud_services_locations#cloud_services_locations_storage)。

#1. Activity Tracker with LogDNAを購入する
東京リージョンのICOSを利用する場合は、東京リージョンでActivity Tracker with LogDNAを購入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/45ddbe02-04ca-4a8f-837f-a98b627fbbc2.png)

#2. ICOSでActivity Trackerを有効化する

1. Buckets -> Configuration -> Activity Tracker<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/b7ae2aff-0223-7a89-6b15-38072d11078e.png)
2. データアクセスに関する記録を残したいので、`Track and events`オプションを有効化する（このオプションを付けないと、管理イベントしか記録されない）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/4663dffe-4223-d6bb-3503-2a8c7dbbd026.png)


#3. Activity Tracker with LogDNAで確認

1. `cloud-object-storage`でフィルタリング。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/051c613b-d5c1-008f-f25b-c66d006d6f88.png)
2. ICOSの静的Webサイトにアクセスしてみる。
3. すると、ちゃんと`index.html`等へのアクセスログが出力されている！![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/981a9710-a904-51b6-ca32-aa2352fffa2c.png)
4. 詳細情報を確認すると、アクセス元のIPアドレスやブラウザ情報などが取得されていることがわかる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/8de2e2b1-ee73-d82e-3556-aba2f18825ae.png)
neo4jでsandbox その16

#概要

neo4jでsandboxやってみた。
pythonでneo4j sandboxを叩いて、gistのデータを投入したのを取得してみた。

#nodeを取得。


```

from neo4j import GraphDatabase, basic_auth

driver = GraphDatabase.driver("bolt://18.233.67.98:32829", auth=basic_auth("neo4j", "convenience-patient-function"))
session = driver.session()
cypher_query = '''
MATCH (n)
RETURN n.id, n.tosi, n.tiku, n.sex, n.date
'''
results = session.run(cypher_query, parameters = {})
print("id tosi tiku sex date")
for r in results:
	print ("%s,%s,%s,%s" % (r["n.id"], r["n.tosi"], r["n.tiku"], r["n.date"]))




```

#linkを取得。

```

from neo4j import GraphDatabase, basic_auth

driver = GraphDatabase.driver("bolt://18.233.67.98:32829", auth=basic_auth("neo4j", "convenience-patient-function"))
session = driver.session()
cypher_query = '''
MATCH (n)-[]-(m)
RETURN n.id, m.id
'''
results = session.run(cypher_query, parameters = {})
print("n m")
for r in results:
	print ("%s,%s" % (r["n.id"], r["m.id"]))


```

以上。
neo4jでsandbox その15

#概要

neo4jでsandboxやってみた。
pythonでneo4j sandboxを叩いて、gistのデータを投入してみた。

#nodeを投入。

```

from neo4j import GraphDatabase, basic_auth

driver = GraphDatabase.driver("bolt://18.233.67.98:32829", auth=basic_auth("neo4j", "convenience-patient-function"))
session = driver.session()
cypher_query = '''
LOAD CSV WITH HEADERS FROM "https://gist.github.com/ohisama/20ff770bfda7d9dafbb1fc0e259aeb9f/raw/938b739af1e2627a66a3ee781d0c46559ca61663/covid0.csv" AS line
CREATE (:Person {id:line.id, tiku:line.tiku, tosi:line.tosi, sex:line.sex, date:line.date})
'''
results = session.run(cypher_query, parameters = {})
for record in results:
	print(record)



```

#linkを投入。

```

from neo4j import GraphDatabase, basic_auth

driver = GraphDatabase.driver("bolt://18.233.67.98:32829", auth=basic_auth("neo4j", "convenience-patient-function"))
session = driver.session()
cypher_query = '''
LOAD CSV WITH HEADERS FROM "https://gist.github.com/ohisama/20ff770bfda7d9dafbb1fc0e259aeb9f/raw/938b739af1e2627a66a3ee781d0c46559ca61663/covid1.csv" AS line
MATCH (a:Person {id:line.a}), (b:Person {id:line.b})
CREATE (a)-[:CONNCT]->(b)
'''
results = session.run(cypher_query, parameters = {})
for record in results:
	print(record)



```


以上。
音声合成で しゃべらせる バッチファイル

とりあえず しゃべらせる。
以下のファイルをダブルクリックで実行。
文字化けするときは UTF-8 じゃなく Shift-JIS (ANSI) で保存。
(Windows10, Window7 等)

talk.bat

```dosbatch

@echo off

PowerShell -Command "Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak('生麦 生米 生卵');"

call :_sp "生麦"
call :_sp "生米"
call :_sp "生玉子"

pause
goto :eof


:_sp
echo %~1
PowerShell -Command "Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak('%~1');"
goto :eof

```
しゃべらない？　なら、
マイクロソフトスピーチプラットフォームをインストール。

http://www.microsoft.com/en-us/download/details.aspx?id=27225

　x86_SpeechPlatformRuntime￥SpeechPlatformRuntime.msi
　　または
　x64_SpeechPlatformRuntime￥SpeechPlatformRuntime.msi

日本語を追加

http://www.microsoft.com/en-us/download/details.aspx?id=27224

　MSSpeech_SR_ja-JP_TELE.msi
　MSSpeech_TTS_ja-JP_Haruka.msi
バッチファイルで指定時間まで待つ

バッチファイルで PowerShell を使って指定時間まで待つ。
指定時間が過ぎていたら、次の日の指定時間まで待つ。
スケジューラ登録するほどでもない、管理者権限がない ときに。
(Windows10, Window7 等)

daily.bat

```dosbatch
@echo off
echo ２２時５９分まで待ちます。

powershell "if ((get-date) -lt (get-date -hour 22 -minute 59 -second 0)) { $w = get-date -hour 22 -minute 59 -second 0 } else { $w = (get-date -hour 22 -minute 59 -second 0).adddays(1)} ; $w = new-timespan -start (get-date) -end $w ; Start-Sleep -seconds $w.totalseconds ; $ws = New-Object -com Wscript.Shell"

rem バックアップ処理 robocopy , bunbackup 等

rem 自分自身を再実行
start /min %~dpnx0

```
バッチファイルで指定時間を過ぎているかどうかを知る

バッチファイルで PowerShell を使って指定時間を過ぎているかどうかを知る。
(Windows10, Window7 等)

PS: 自分で指摘するのもなんだけど、True,False が 0,1 という前提でプログラミングするのは BUG のもと。 良くない。

past_future.bat

```dosbatch
@echo off

set tm=2020/10/28 16:25:00

powershell "exit ((get-date) -lt ([DateTime]'%tm%'))"
if %errorlevel% == 0 echo もう時間が過ぎた
if %errorlevel% == 1 echo まだ時間がきていない

pause
goto :eof

```
プロゲート【JavaScript I 学習コース】変数,定数,if文,switch文

# prorate:JavaScript I 
実行

```javascript

console.log(“Hello World.”);
// コメントアウト
```


## var , let , constの使い分け
### varとは
varでは再宣言、再代入が可能です。

```javascript
var techacademy = ‘初期値OK’;
techacademy = ‘再代入OK’;
var techacademy = ‘再宣言OK’;
```

### letとは
letでは再宣言が禁止されています。

```javascript
let techacademy = ‘初期値OK’;
techacademy = ‘再代入OK’;
let techacademy = ‘再宣言NG’;
```

### constとは
constでは、再宣言、再代入が禁止されています。

```javascript
const techacademy = ‘初期値OK’;
techacademy = ‘再代入NG’;
const techacademy = ‘再宣言NG’;
```

> [JavaScriptで書く「var,let,const」の違いと使い分け方法](https://techacademy.jp/magazine/14872)

## 変数の値の更新

```javascript
let number = 7;
console.log(number); 
number += 3; //number = number +3の省略

console.log(number);
number /= 2;　//number = number /2 の省略

console.log(number);
```


## テンプレートリテラル
```javascript
console.log(`${name}は${age}歳です`);
// バッククオーテーションで囲む
// ${  }は変数や定数で定義したもの
```


## 条件分岐

```javascript

if(){
 
} 

```


```javascript
const level = 12;

if(level > 10){
 console.log("レベルが10より大きいです");
} 

```

## else

```javascript
const age = 17;

if (age >= 20) {
  console.log("私は20歳以上です");
} else{
  console.log("私は20歳未満です");
}

```


## else if
```javascript
if (age >= 20) {
  console.log("私は20歳以上です");
}else if(age >= 10){
  console.log("私は20歳未満ですが、10歳以上です");
}else {
  console.log("私は10歳未満です");
}
```

## && , ||
```javascript
&& 　// かつ
||　 // または

const age = 24;

if(age >= 20 && age <=30){ 
  console.log("私は20代です");
}
```

## switch文
- switch(条件の値){ 処理 }
- break;がないと処理が終わらない
- defaultはブロック処理。else類似

```javascript
const rank = 2;

switch (rank) {
  case 1:
    console.log("金メダルです！");
    break;

   case 2:
    console.log("銀メダルです！");
    break;
  
 
  case 3:
    console.log("銅メダルです！");
    break;

	default: //どれも当てはまらない時
		console.log("メダルはありません");
  		break;
  
}
```
プロトコルとクラスと構造体の違いをざっくり理解しよう！

今回は、,プロトコル、クラス、構造体の違いについて学習したので、アウトプットしていきます
※以下の内容は、学習内容のアウトプット用のため、誤りがある場合があります。予めご了承ください

#プロトコルとは？
プロトコル(protocol)とは、直訳すると「条約」、「議定書」、「規約」のような意味になります。
Swiftの言語においては「開発者とSwift言語との約束ごと」を意味します.

まずは、宣言の書き方を見ていきましょう。

```swift:qiita.rbvar 
protocol <プロトコル名> {
}
```
基本的にこのような形で宣言します。classとの違いは、「class」というキーワードが「protocol」になっただけです。
では、さらに深堀りしていきましょう。

#プロトコルでのメソッド
ここからが、プロトコルとクラスの明確な違いですが、***プロトコルではメソッドを書く時メソッドの中身を書きません。***
書き方は以下のようになります。

```swift:qiita.rbvar 
protocol <プロトコル名> {
     func<メソッド名>()
}
```

***一見、クラスと似た書式ですが、メソッド名（）の後に{}がありません！***

#プロトコルの使い方
プロトコルはメソッドの中身を書かないということは、宣言しただけでは意味がないということです。

では、どのように使用する深堀していきましょう。
基本的には、プロトコルは「クラス」とセットで使います。

```swift:qiita.rbvar 
class <クラス名> <プロトコル名> {
 }
```
クラス宣言の「:」の後にプロトコル名を書きます。
このように、クラスにプロトコルが参加する書き方を***批准***といいます.
プロトコルを批准した場合は、そのプロトコルに定義されているメソッドを実装する必要あります。実装されなければエラーになります。

次に具体的に見ていきましょう。

```swift:qiita.rbvar 
protocol MorningProtocol {
     func morningAction()
}
```

```swift:qiita.rbvar
class Date:MorningProtocol {
  func morningAction(){
  print("朝ごはんを食べます")
  print("歯を磨きます")
}
```

上記では、朝起きた後にすることをデバックエリアに出力しています。これがプロトコルの最も基本的な使い方です

#型としてのプロトコル
プロトコルには型としての機能があります。変数名を宣言する際に、変数名の後ろに「:」を付けてプロトコル名を指定すると、その変数はそのプロトコルを批准しているクラス専用の箱になります。

```swift:qiita.rbvar 
var <変数名>:<プロトコル名> = <クラス名> ()
```

#クラスとは？
クラスはテンプレートとして解釈されています。クラスは、たい焼きを作る時の金型をイメージしてくださいとよく例として用いられます。

クラスの宣言は以下の通りです。

```swift:qiita.rbvar 
class <クラス名> ()
```

#クラスにおけるメソッドの宣言
宣言方法は以下通りです

```swift:qiita.rbvar 
class <クラス名> {
  func<メソッド名>(){}

}
```

次は具体的に宣言していきましょう

```swift:qiita.rbvar 
class Hamburger {
   var nakami = "パティ"

 func sayNakami () {
 print("中身は"+nakami+"です") //中身はパティです
}
```

では、実際にクラスを上記で作成したクラスを使用して見ましょう。

```swift:qiita.rbvar
var hamburger = Hamburger()
hamburger.nakami = "パティとチーズ"
hamburger.sayNakami() //中身はパティとチーズです。
```

上記の例では、クラスを元にして、インスタンスを作り、インスタンスを操作して処理実行しています。
nakamiプロパティの値にチーズを加え、文字列を変更しています。

#構造体とは？
クラス、プロトコルとの違いを一言で言えば、
継承できないクラスのことです！

基本的な書き方は以下の通りです。

```swift:qiita.rbvar 
struct 構造体名 {
   var プロパティ名：プロパティの型 = 式
   let プロパティ名：プロパティの型 = 式
}
```

次は具体的な例を見ていきましょう

```swift:qiita.rbvar 
struct SomeStruct {
   var num1 = 246
   let num2 = 135
}

let someStruct = SomeStruct()
let a = someStruct.num1 //246
let b = someStruct.num2 //135
```

#構造体とクラスの違いを深堀する
上記では、クラスと構造体の違いは継承できるかできないかの違いかと書きましたが、ここでは、具体例を見ていきましょう。

```swift:qiita.rbvar
// 構造体(値型)
struct ColorStruct {
    var color:String
}

// クラス(参照型)
class ColorClass {
    var color:String

    init(color:String){
        self.color = color
    }
}

var colorStruct1 = ColorStruct(color: "青")
var colorStruct2 = colorStruct1
colorStruct2.color = "黒"
println("colorStruct1：\(colorStruct1.color)、colorStruct2：\(colorStruct2.color)")

出力結果 構造体の場合は、colorStruct2.colorを変更しても、colorStruct1は変更しない
"colorStruct1:青, colorStruct1:黒"


var colorClass1 = ColorClass(color: "青")
var colorClass2 = colorClass1
cardClass2.color = "黒"
println("colorClass1：\(colorClass1.color)、colorClass2：\(colorClass2.color)")


出力結果 構造体の場合は、colorClass2.colorを変更したら、colorClass1も変更される
"colorClass1:黒, colorClass2:黒"
```

上記のように、構造体は継承されることなく、一つずつ独立した概念を持っていることが分かります。


#まとめ
今回は学習していると、プロトコルとクラスと構造体の違いは...「あれ？、どうだったっけ？」となることが多かったのでざっくりまとめてみました！
デリゲートは部品を使いまわしたい時に使うと便利

デリゲートをようやくわかったので備忘録。

ボタンなど、小さな部品を使いまわしたいけれど、ページごとに違う処理をさせたい時に使うと便利。

今回は下のボタン群を使い回す。左から「戻るボタン」「解説ボタン」「次へボタン」。このボタンクラスをいろんなページで使いまわしたい。

![デリゲート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280131/966986ec-28f5-757d-e1fd-1a4006cee117.png)


[やりたいこと]
ページごとにボタン押下のアクションを切り替えたい。
戻るボタンを押すと、とあるページでは前画面に遷移、他のページではモーダルを終了させる。はたまた他のページでは保存処理をしてからページを終了させたい。などなど

[解決方法]
各々のページにボタン押下のアクションを書く。ボタンのデザイン部分は共通化してもよいが、アクション部分の機能は各々のページにデリゲートする。これが「移譲」と訳されるデリゲートの役割である。

[やり方]
１、ボタン部分のViewにプロトコルを書く。
footerViewクラスのボタンを使いたかったら、必ず決められたメソッド名を使って実装してねというお約束。

```
FooterView.swift
protocol TapLeftButtonVCDelegate {
    func tapLeftButton()
}
protocol TapCenterButtonVCDelegate {
    func tapCenterButton()
}
protocol TapRightButtonVCDelegate {
    func tapRightButton()
}
```
２、各々のページで、ボタンクラスをインスタンス化し、ボタンアクションのデリゲート先が自分であることを宣言。

```
ViewController.swift
    // このページでは右ボタンだけ使いたいので右ボタンのプロトコルのみ宣言。
    @IBOutlet weak var footerView: FooterView!
    override func viewDidLoad() {
        super.viewDidLoad()
        footerView.tapRightButtonVCDelegate = self
    }
```

３、各々のページでボタン押下後のアクションを実装。

```
extension ViewController: TapRightButtonVCDelegate {
    func tapRightButton() {
        // 次の画面にすすむ処理、保存処理、なんでも好きなように書く
    }
}
```
４、最後にボタンのFooterViewに戻り、ボタンを押したらデリゲート先の処理を行うように指示。

```
class FooterView: UIView {
    var tapRightButtonVCDelegate: TapRightButtonVCDelegate?

    @IBAction func tapRightButton(_ sender: Any) {
        tapRightButtonVCDelegate?.tapRightButton()
    }
}
```

これで、ボタンをいろんなページで使い回すことができます。

[感想]
用途から考えるデリゲートの使い方でした。他にも便利な使い方があるかも。
__typenameを持った無名union型のそれぞれに名前を付ける

無名型という呼び方が正しいのかはさておき、GraphQLとTypeScriptを使っていると[たまに遭遇するシチュエーション](https://stackoverflow.com/questions/59104086/why-does-typescript-mark-the-property-in-a-union-as-non-existent)です。

## Q

```typescript
type Pig = {
  name: string
  tail: {
    __typename: 'RedTail'
    smell: string
  } | {
    __typename: 'BlueTail'
    taste: string
  }
}
```

というPig型を元に

```typescript
{
  __typename: 'RedTail'
  smell: string
}
```

部分をRedTail型として導出せよ

## A1

```typescript
const toRedTail = (tail: Pig['tail']) => {
  if (tail.__typename !== 'RedTail') {
    throw 'BOO'
  }
  return tail
}
type RedTail = ReturnType<typeof toRedTail>
```

ReturnTypeは実装から型を生み出せるユニークなユーティリティ型です。私はユーティリティ型の中でも特によく使います。

## A2

```typescript
type Narrowing<T, TN> = Extract<T, { __typename: TN }>
type RedTail = Narrowing<Pig['tail'], 'RedTail'>
```

`Extract<T, U>`はT型の中からU型へ代入可能な型を返します。

## A3

```typescript
type TypeNames<T> = T extends { __typename: infer TN } ? TN : never // TypeNames<Pig['tail']> = 'RedTail' | 'BlueTail'
type Narrowing<T, TN extends TypeNames<T>> = Extract<T, { __typename: TN }>
type RedTail = Narrowing<Pig['tail'], 'RedTail'>
```

Tに存在しない__typename(たとえば'LedTail')をTNから渡そうとするとしばかれるので、A2のNarrowingよりも親切です。

## これが出来ると何が嬉しいのか

`{__typename: 'RedTail', smell: string}型`に名前が付くと何が嬉しいのかというと、名前が付いたモノは呼んだり切ったりくっつけたりしやすくなる、というのがあります。今回の例ではsmellというプロパティを1つだけ持った型が対象ですが実世界ではプロパティが20個ぐらい並んだ型が対象である事も多く、それを毎回オブジェクトリテラル型として羅列なんてしていられません。

```jsx
type RedPig = Omit<Pig, 'tail'> & {tail: RedTail}
const pigIsRedPig = (pig: Pig): pig is RedPig => pig.tail.__typename === 'RedTail'

type RedPigDetailProps = {
 redPig: RedPig
}
const RedPigDetail: FunctionComponent<RedPigDetailProps> = ({
  redPig
}) => (<p>{redPig.tail.smell}</p>)

// 中略

{ pigIsRedPig(pig) && <RedPigDetail redPig={pig} /> }
```

またPigから導出したRedTail型はPig型の変化に対して自動的に追従されますが、ハードコーディングしたRedTail型だとそうはいきません。これについてはどっちが嬉しいかはケースバイケースだと思いますが、GraphQLからジェネレートされた型定義に関して言えば前者の方が嬉しいでしょう。

## あわせてよみたい

- https://stackoverflow.com/questions/57674872/how-can-i-write-general-typeguard-for-graphql-unions
そもそもプログラミング言語って何ができるの？？？


# はじめに
そもそも何もプログラミングのことについて知らない！！！ということに気付きました。

それぞれのプログラミング言語が何をできるのかまとめてみました。

何か間違い等ございましたらご指摘お願いいたします。


#Java

+ WEBページ作成
+ WEBアプリ・Androidアプリ・デスクトップアプリ作成

などができる。　　
汎用性の高い言語でWEBで調べればやり方がすぐ見つかることもある。

〈使用されているアプリ〉
・Twitter
・Androidアプリ

#PHP

+ 簡単なWEBページ作成
+ ブラウザゲームの作成
+ 様々なサイトの開発（WEB系サービス開発に向いている。）
+ JavaScriptと連携すれば凝ったコンテンツやWEBページ開発ができる。
+ ECサイト・SNS・ブログ・お問い合わせフォーム・予約システム等が作れる。

などができる。
WEB系の開発にしか使えない。
簡単なホームページの作成には良いが、HTMLの知識は多少必要。

#JavaScript

+ ブラウザ上で動く言語。WEBサービスで高機能な画面の動きの実現に必要。
+ WEBサイト、WEBアプリ、スマホアプリが作れる。
+ HTMLにさまざまな動きや機能を与えられる→静的なサイトを動的にできる。
+ フォームの送信・マウスのドラッグ＆ドロップ・テキストの選択等ユーザーの操作で様々な処理が可能。
+ 非同期通信ができる。（ページを再度読み込みせずにリアルタイムで更新できる）

WEB開発において幅広く利用されている。プログラミングの自由度が高いため、エラーが出やすい。
しかし、コーディングの基本的な部分を見ると、他の言語よりもルールが少ないので比較的簡単にできる。

# Ruby

+ 簡単なWEBサービスから大規模なものまで開発が可能。
+ WEBアプリケーション・SNS・ブログ・オンラインショッピングサイト・API・スクレイピング・スマホアプリ・AIを作ることができる。
+ 主にサーバーサイドのWEBアプリケーションを作ることにつかわれる。
+ 手早くかけてすぐ動かせる。
+ 高性能なクラスライブラリが組み込まれているので重要でないところは自分で記述しなくてもOK。

他の言語に比べると柔軟性が高く、多くの企業のWEBサイトで採用されている。
システム管理系において効果的に活用ができる。
わずかなソースコードで多くの機能が実現できることは大きな魅力である。

〈使用されているアプリ〉

- Twitter(ruby on rails)
- hulu
- クックパッド(ruby on rails) 等

#C＃

+ 企業向け業務システムで利用されることが多い。
+ パソコン、サーバー用のプログラムによく使われている。
+ ゲーム、アプリ開発などにも幅広く使われている。

Javaと文法が似ているためJavaエンジニアが習得しやすい。
Windows環境でのみ利用が可能。

#Python

+ WEBアプリケーション、デスクトップアプリケーション、ロボットの開発が可能。
+ データ解析や自然言語の解析など数字を扱うことが得意。分析を任されやすい。
+ 人工知能を学ぶならPython
+ コードの読みやすさを重要視した文法。

少ないコード量で簡潔に記述できるので、読みやすく、書きやすい。
モバイルアプリケーション以外はなんでもできる。

〈使用されているアプリ〉

- Youtube
- Instagram
- Pinterest 等

#C

+ OS開発に役立つ。
+ 汎用性が高いため多くの分野で採用されている。
+ 元祖プログラミング言語

すべて記述した通りに動くため、必要な処理は全てコーディングが必要。
コンピュータのメモリを直接操作できるほど柔軟性が高い。→機会に組み込む系の現場では重宝されている。

#Swift

+ iOS向けのプログラミング言語
+ iPhone・iPad・Apple TV・Apple Watchのアプリケーション開発ができる。

Apple製品のソフトウェア開発をするならこれ以上に作りやすい言語はない。
コードが書きやすく読みやすい。

#参考文献
[初心者向けプログラミング言語](https://www.sejuku.net/blog/2439)
[プログラミングでできること](https://web-camp.io/magazine/archives/25985)


#最後に
できるものとできないもの、得意なものと不得意なものがそれぞれ言語にはあるのですね。自分が作りたいアプリによって必要言語が変わってきます。それを探し出すのも難しいけど、まずはアプリ開発の第一歩です！！
備忘録No.4「文字列を取得して、その周りを飾る」[Java]

#やりたい事
1.任意の文字数の文字列を一つ受け取る
2.受け取った文字列の周囲を"+"で囲うような見た目で出力する

例.「SUN」という文字列を受け取った場合

 +++++
 +SUN+
 +++++

#コード

```Java
        Scanner sc = new Scanner(System.in);
        String word = sc.nextLine();
        int wordNum = word.length();//単語の文字数
        int lineNum = wordNum + 2;//単語を囲うのに必要な文字数

        Character [][] plus = new Character[3][lineNum];//
        for(int i = 0; i < plus.length; i ++) {
            for(int j = 0; j < plus[i].length; j++) {
                plus[i][j] = '+';
                for(int k = 0; k < word.length(); k++) {
                    int l = k + 1;
                    plus[1][l] = word.charAt(k);//単語の文字をループで一文字ずつ抽出して、囲われるように要素を更新
                }
                System.out.print(plus[i][j]);
            }
            System.out.println("");
        }
```

#感想
かなりゴリ押しな作り方をしてしまっている気がする...。三重ループを使ってみた（というかなってしまった）が、こんな使い方をするのかどうかも分からず使ってしまっている。
抵抗器のカラーコードの語呂合わせ

#はじめに
「コンピュータはなぜ動くのか」という本を読み、抵抗器のカラーコードの語呂合わせを知りました。
誰かの役に立てたら幸いです。
（CSSのカラーコードではなくハードウェアについての方です。間違って開いた人はごめんなさい）

#語呂合わせ
黒い礼服、茶を一杯、赤い人参、第三の男、岸恵子、緑の五月、青虫、紫式部（ムラサキシチブ）、ハイヤー、ホワイトクリスマス

#解説
|数値  |色  |語呂合わせ  |
|---|---|---|
|0  |黒 |黒い礼服（黒い0ふく） |
|1  |茶 |茶を一杯（茶を1っぱい） |
|2  |赤 |赤い人参（赤い2にんじん）|
|3  |橙 |第三の男（橙3の男）|
|4  |黄 |岸恵子（黄4けいこ）|
|5  |緑 |緑の五月（緑の5がつ）|
|6  |青 |青虫（青6し）|
|7  |紫 |紫式部（紫7ぶ）|
|8  |灰 |ハイヤー（灰8）|
|9  |白 |ホワイトクリスマス（白9りすます）|

#最後に
これを暗記すれば抵抗器の色を見て抵抗値の計算ができると思います。
マイコンを組み立てるときに便利かもと思いました。
Git not found. Install it or configure it using the 'git.path' setting.

# はじめに
MacOSをアップデート後にVSCodeでgitを使用できなくなっていました。
右下にダイアログが出てきて`Git not found. Install it or configure it using the 'git.path' setting.`と表示されていました。

# Gitバージョン確認
バージョン確認したところ、下記のようなエラーが発生していました。

```console
$ git --version
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

# command line toolsのインストール
これでインストールすることでエラーを回避できるようなので下記コマンドを実行

```console
$ xcode-select --install
```

`このソフトウェアは、現在ソフトウェア・アップデート・サーバから入手できないため、インストールできません。`
と表示されてしまった場合は、手動でインストールします。

## 手動でcommand line toolsのインストール
下記ページから自分のxcodeのバージョンに合わせてダウンロードします。
https://developer.apple.com/download/more/

今回はXcode 12のものをダウンロードしました。

![スクリーンショット 2020-10-30 0.37.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/1dc84826-0363-e1c3-d440-68043aa25146.png)


ダウンロードが完了したら実行してインストーラを起動します。
流れに従ってインストールを完了できればgitを使用できるようになります。

# 動作確認
Gitのバージョン確認

```console
$ git --version
git version 2.24.3 (Apple Git-128)
```

VSCodeを再起動することで、左側のツールバーの`SOURCE CONTROL`の箇所も動作するようになりました。
PandasのDataFrameでグループごとにサンプルをN個抜き出す

グループ別にN個抜き出したく、その対処方法の一つに。
例えば、列の日別と売上上位n番目までを抜き出したい時とか。

` sort_values` 
並べ替え
` groupby` 
グループ化
` .head(n)` 
グループの中のはじめからn個
` .tail()` 
グループの中のうしろからn個

サンプルコード：　売上上位3番目まで
```newdf = df.sort_values(by=['日付','売上'], ascending=[True, False]).groupby('日付').head(3)```

参考記事：
https://blog.shikoan.com/pandas-groupby-head/
Laravelのバージョンをダウンさせる方法

まずはLaravelのバージョンをチェックしましょう。

```
$ php artisan --version
```

もしくは

```
php artisan -V
```

上記ので僕のLaravelを確認するとダウンロードされたのは
	
Laravel Framework 8.11.2

でした。

これをLaravelのバージョン7にするには…

「__Laravelとその中身を警告なしで削除する__」を意味する以下のコマンドを打ちます。

```
rm -rf laravel
```
		

Laravelをアンインストールして、それからバージョンを指定してLaravelをダウンロードしましょう！

バージョンの指定の方法は以下の記事を見てね。

https://qiita.com/PWuttam/items/1e7cc33949b831900c58
WebRTCでビデオ通話中に映像の解像度やフレームレートを動的に変更する方法

# はじめに

WebブラウザでWebRTCによるビデオ通話を行う際は、[getUserMedia](https://developer.mozilla.org/ja/docs/Web/API/MediaDevices/getUserMedia)で映像と音声を取得します。その際に、constraintsで制約条件を設定します。

この制約条件は一度設定したら変更出来ないと思っている方もいるかも知れませんが、実は柔軟に変更できるように、[applyConstraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/applyConstraints)というAPIが用意されています。このAPIを使うと、ビデオ通話中でも通話を途切れさせること無く映像や音声の制約条件を変更できます。例えば、通信状況が悪い時は解像度やフレームレートを小さく設定し、帯域を削減する等の機能を実装することが出来ます。

小ネタですが、便利なので紹介します。

# applyConstraintsでconstraintsを柔軟に変更する

`getUserMedia`で以下のようにconstraintsを指定してMediaStreamを取得します。

```javascript
const localStream = await navigator.mediaDevices
.getUserMedia({
  audio: true,
  video: {
    width: {ideal: width.value},
    height: {ideal: height.value},
    frameRate: {ideal: frameRate.value},
  }
})
.catch(console.error);
```

このlocalStreamを使ったビデオ通話を実施中に、以下のようにトラック毎に制約条件を再設定することが出来ます。以下の例では、ビデオの解像度、フレームレートを変更しています。

```javascript
function applyConstraints() {
  let videoTrack = localStream.getVideoTracks()[0];
  let currentConstraints = videoTrack.getConstraints();
  console.log('変更前の値:', currentConstraints);
  videoTrack.applyConstraints({
    width: {ideal: width.value},
    height: {ideal: height.value},
    frameRate: {ideal: frameRate.value}
  })
  .then(() => {
    currentConstraints = videoTrack.getConstraints();
    console.log('変更後の値:', currentConstraints);
  })
  .catch(e => {
    console.log('制約を設定できませんでした:', e);
  });
}
```

コードの中で利用している、`getConstraints`は現在の制約条件を取得するためのものです。`applyConstraints`と組み合わせて利用するのが良いのではないでしょうか。

尚、constraintsはメディアの種類（VideoかAudioか）やブラウザによって指定できる項目が変わってきます。プログラム中で動的に設定させる場合は、該当の項目が存在しない場合の例外処理も行いましょう。`getSupportedConstraints`で調べることが出来ます。

```javascript
let supported = navigator.mediaDevices.getSupportedConstraints();
console.log(supported);
```

出力結果(Chrome M86)

```javascript
aspectRatio: true,
autoGainControl: true,
brightness: true,
channelCount: true,
colorTemperature: true,
contrast: true,
deviceId: true,
echoCancellation: true,
exposureCompensation: true,
exposureMode: true,
exposureTime: true,
facingMode: true,
focusDistance: true,
focusMode: true,
frameRate: true,
groupId: true,
height: true,
iso: true,
latency: true,
noiseSuppression: true,
pan: true,
pointsOfInterest: true,
resizeMode: true,
sampleRate: true,
sampleSize: true,
saturation: true,
sharpness: true,
tilt: true,
torch: true,
videoKind: true,
whiteBalanceMode: true,
width: true,
zoom: true
```

余談ですが、Firefoxは昔からframeRateの指定ができません。`getSupportedConstraints`でtrueが返ってきますが、指定しても動きません。罠ですね。

# デモ

SkyWayで簡単なデモを作ってみました。room join後に解像度とフレームレートを変更できます。
https://codepen.io/yusuke84/pen/xxOVbVG


# 終わりに

`applyConstraints`を始めとするMedia Stream APIの制約条件設定に関しては、MDNに最高のドキュメントがあるので、実装する方は一度読んでみてください。

*能力、制約、そして設定*
https://developer.mozilla.org/ja/docs/Web/API/Media_Streams_API/Constraints
GitHubActionsにてCookiecutterで作ったiOS向けボイラープレートをCIしてみた

## はじめに

[以前投稿したCookiecutter用のiOS向けのボイラープレート](https://qiita.com/satoshin2071/items/82777dee4dbad5f04f94)を
今後も有効利用すべくGithubActionsで回してみた際の備忘録です。

**※GithubActions や Cookiecutter等の説明は省略します**

## GitHubActionsで設定しているyml

https://github.com/SatoshiN303/iOS-Blueprints-CleanArchitecture/blob/master/.github/workflows/swift.yml

![スクリーンショット 2020-10-30 0.17.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6691/9e96718c-a0a3-60b9-0d8d-05c8ad89aa4d.png)


### 前半部分： 実行環境の設定

前半部分でビルドをするための準備を各ステップにて設定しています。

後述の`bootstrap.sh`の中で実行している 
`carthage bootstrap --platform ios --no-use-binaries`で
`SwinjectStoryboard`のみビルドエラーになっていた為
Carhageのキャッシュディレクトリを削除して解決しました。

```.github/workflows/swift.yml
#前半部分省略

steps:
    - uses: actions/checkout@v2
    - name: Xcode Select
      run: sudo xcode-select -s '/Applications/Xcode_11.3.1.app/Contents/Developer'
    - name: Show version
      run: |
        xcodebuild -version
        pod --version
        carthage version
    - name: Carhtage Cache Clear
      run: |
        rm -rf ~/Library/Cache/carthage
        rm -rf ~/Library/Cache/org.carthage.CarthageKit
```

### 後半部分： Cookiecutterを実行してビルド

後半部分で`cookiecutter`コマンドでプロジェクトを生成した上で
プロジェクトに内包している`bootstrap.sh`にて 
`pod install`や `carthage bootstrap`を走らせます。

ちなみに
`--no-input --config-file default_config.yml(※デフォルト値のyml)` 
オプションでcookiecutterコマンドの対話を省略することが可能です。

```.github/workflows/swift.yml
## 上の続き
    - name: Install
      run: |
        brew install cookiecutter
        cookiecutter https://github.com/SatoshiN303/iOS-Blueprints-CleanArchitecture.git --no-input --config-file /Users/runner/work/iOS-Blueprints-CleanArchitecture/iOS-Blueprints-CleanArchitecture/default_config_for_actions.yml
    - name: Setup and Build
      run: |
        cd ./SampleApp
        ./bootstrap.sh
        xcodebuild build -workspace "SampleApp.xcworkspace" -scheme "SampleApp_Debug" -sdk iphonesimulator
```

## とりあえずcookiecutterで生成したプロジェクトがビルドできるところまでは回せました
[![Swift](https://github.com/SatoshiN303/iOS-Blueprints-CleanArchitecture/workflows/Swift/badge.svg)](https://github.com/SatoshiN303/iOS-Blueprints-CleanArchitecture/actions/runs/331599457)

## 参考にさせて頂きました🙇‍♂️
* [cookiecutter User Config](https://cookiecutter.readthedocs.io/en/1.7.2/advanced/user_config.html#user-config)
* [GitHub Actionsのバッジをリンク付きでREADMEに追加する](https://qiita.com/akameco/items/e474691964703033e18d)
* [GitHub Actions で Xcode プロジェクトをビルドしてみる](https://qiita.com/koogawa/items/ddf86b56d6b82ae11473)
プロゲート【JQuery上級-#3アニメーション、ページ内移動-】scrollTop,animate,offset,attr

# prorate:JQuery上級コース　その3
## アニメーション実装
> アニメーションをつけるにはanimateメソッドを用います。$(‘セレクタ’).animate({‘プロパティ’:’値’})のように、引数は連想配列で指定します。
> 2つ目の引数でアニメーションの時間を設定することができます。時間は下図のようにミリ秒で指定するか、’slow’や’fast’といった文字列で指定することができます。[-progate-](https://prog-8.com)


```javascript

$(‘セレクタ’).animate({

'プロパティ':'値'

}, 速度);
```


```javascript

 $('.social-icon').hover(
    function(){ //引数1
    $(this).animate({
    'font-size':'30px'
    },300);
    //マウスを乗せた時
  },
    function(){ //引数2
    $(this).animate({
    'font-size':'24px'
    },300);
    //マウスを外した時
  }
  );
```

## ページ内リンク
### aタグでのページ内リンク
> <a>タグは他のページへのリンクだけでなく、ページ内のリンクを作ることもできます。リンクの飛び先にidを指定し、<a>タグのhref属性に”#id名”と”ると、<a>タグをクリックするとそのidの要素が表示されている場所まで移動するようになります。[-progate-](https://prog-8.com)

```html
<a href=“#contact”>
お問い合わせ
</a>

<div id=“contact”>
</>
```

## scrollTopメソッド
> scrollTopメソッドは、$(‘html, body’).scrollTop(値); のように指定し、ページ最上部から値pxの位置に移動することができます。
> scrollTopは通常$(‘html, body’)に対して用いるので、セットで覚えておきましょう。[-progate-](https://prog-8.com)


```javascript
$('html, body').scrollTop(0); 
```

## スクロールにアニメーションをつける
```javascript

$('html,body').animate({
		'scrollTop':0　//一番上に戻る、セミコロン不要
	}, 'slow'); //速度

```

## ナビゲーション作成
## offsetメソッド
> offsetメソッドを使用することで、要素の表示位置を取得することができます。offsetメソッドは、右の図のようにページの上端からの距離とページの左端からの距離が連想配列の形で返ってきます。
> offset().topとすると、ページの上端からの距離が取得できます。[-progate-](https://prog-8.com)

```javascript
$(‘h1’).offset(); // h1の表示位置の取得

$(‘h1’).offset().top();　//ページ最上部から、h1までの距離の取得
```

## attrメソッドで飛び先を取得

```javascript

var id =$(this).attr(‘href’); // クリックしたボタンのhrefを取得

var position = $(id).offset().top; // 飛び先の最上部からの距離の取得
```

### ナビゲーションの完成形

```javascript

 $('header a').click(function(){
    var id= $(this).attr('href');
    var position = $(id).offset().top;
    
    $('html, body').animate({
      'scrollTop':position
      
    }, 500);
```
Outlookメールで作成時に件名（本文）に日付を設定する

#ひとことで
会社への勤怠連絡用に使えるテンプレートを作ってみました。
#概要
勤怠連絡のテンプレートは決まっているので、テンプレート自体は作成していたのですが...
件名や本文に入れていた日付は毎回、手直ししていました。
この日付を編集するのが煩わしかったので、本日日付を自動設定してくれるようなものを作成しました。
#環境
Windows10
Outlook
#手順
1. [メールテンプレート作成](#1メールテンプレート作成)
2. [マクロ作成](#2マクロ作成)
3. [動作確認](#3動作確認)
4. [使いやすくする（おまけ）](#4使いやすくするおまけ)

##1.メールテンプレート作成

メールを作成して、`Outlookテンプレート形式(*.oft)`で保存。
件名の`yyyy/mm/dd` と 本文の`mm`、`dd`　部分を置き換えます。
**[ファイル] > [名前を付けて保存]**
テンプレートファイルの保存場所はマクロ作成時に使うので控えておく。
デフォルトは`C:\Users\$ユーザ名\AppData\Roaming\Microsoft\Templates`配下

保存場所はマクロ作成時に使用するので控えておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/1c439b7f-7aec-4805-a50d-9410bea66798.png)

##2.マクロ作成
`Outlook`の`Visual Basic`を起動
**[開発] > [Visual Basic]**

(リボンに開発タブがない場合`リボンのユーザ設定`より追加する。)
<details><summary>開発タブ追加手順</summary>
`リボンのユーザ設定`は**リボンを右クリック** または **[ファイル] > [オプション]**から遷移可能。
`リボンのユーザ設定`の右側の`開発`チェックボックスを設定済みにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/3630e72f-b591-af84-033f-24e1c924c8e9.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/9efd632a-3c18-9c47-404e-412cf3531900.png)
</details>

`Project1.ThisOutlookSession`に以下を入力して、保存。

```vbscript:Project1.ThisOutlookSession
Sub 遅刻連絡()
    Dim MyItem As Outlook.MailItem

    Set MyItem = Application.CreateItemFromTemplate("$テンプレート保存場所\【勤怠連絡】山田花子　yyyymmdd 遅刻.oft")
    MyItem.Display
    ' 件名
    ' yyyy/mm/dd形式
    MyItem.Subject = Replace(MyItem.Subject, "yyyy/mm/dd", FormatDateTime(Now, vbShortDate))
    ' 本文
    ' mm
    MyItem.Body = Replace(MyItem.Body, "mm", Month(Now))
    ' dd
    MyItem.Body = Replace(MyItem.Body, "dd", Day(Now))
End Sub
```

## 3.動作確認
**[開発] > [マクロ] > [作成したマクロ]**で実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/25fb568c-28c3-34fc-8312-23ad40d9c4bc.png)
↓できました:hugging:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/5ebf672f-6e92-8ae3-0e6d-8d51ca147a7c.png)

## 4.使いやすくする（おまけ）
いちいち**[開発] > [マクロ]**から実行するのが面倒なので、[ホーム]タブの中に追加してみる。
`リボンのユーザ設定`より、
①
左側：[コマンドの選択]ドロップダウンより**マクロ**を選択
右側：ホーム(メール)配下に`新しいグループ`を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/c355184a-902a-9550-e2e3-dbc98bf25617.png)
②
左側で作成したマクロを選択し、右側で作成したグループに`追加`する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/c3076606-974c-d755-f963-87e0321b2a42.png)
③
アイコン・表示名を`名前の変更`より変える（変えなくてもいい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/7f89e483-fffc-79b4-e361-ac2779c7088b.png)
④
[OK]で`リボンのユーザ設定`を閉じる
　:raised_hand:
遅刻します  　　　　　←いました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/90ea6c0b-49b2-4b9a-b435-edc512f23799.png)




#参考
[新規作成のメッセージに日付を埋め込む方法](https://outlooklab.wordpress.com/2012/06/02/%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AB%E6%97%A5%E4%BB%98%E3%82%92%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%80%E6%96%B9%E6%B3%95/)
Dockerを使用してgo環境を構築

<head>今回は最近勉強しているDockerを使用してgo環境の構築を行いました。</head>

1.Dockerfileを作成
```FROM golang:latest
RUN mkdir /go/src/charts_server && apt-get update && apt-get install \
　　-y vim
WORKDIR /go/src/charts_server
ADD . /go/src/charts_server
```

・FROM golang:latest
　　golangの最新版をベースにします。

・RUN mkdir /go/src/charts_server && apt-get update && apt-get install \ -y vim
　　mkdirで作業場所の作成。エディタもインストールします。

・WORKDIR /go/src/charts_server
　　  Docker instructionの実行ディレクトリを/go/src/charts_serverへ変更。

・ADD . /go/src/charts_server
　　カレントディレクトリを/go/src/charts_serverへコピーします。


2.docker-compose.ymlを作成
```version: '3'
services:
app:
    build: .
    tty: true
    volumes:
      - ./work:/go/src/charts_server
    ports:
      - "8080:8080"
    depends_on:
      - mysql
  mysql:
    image: mysql:latest
    container_name: mysql_charts_container
    environment:
      MYSQL_ROOT_PASSWORD: ${ROOTPASS}
      MYSQL_DATABASE: ${DATABASE}
      MYSQL_USER: ${USERNAME}
      MYSQL_PASSWORD: ${USERPASS}
```

3.上記のファイルを作成後に以下のコマンドをターミナルにて実行
$docker-compose up -d
Dockerfileとdocker-compose.ymlの記述内容を元に環境が構築されます。

4.作成したDockerコンテナの中へ入るコマンドを実行
$docker exec -it charts_server_app_1 /bin/bashを実行し、コンテナ内に入る

上記コマンドを入力することでコンテナ内に入れます。
コンテナ内の/go/src/charts_serverをworkディレクトリへマウントしています。
そのため、/go/src/charts_serverへフォルダやファイルを追加するとマウントしているworkディレクトリにも追加されます。

所感
　今回はDockerを使用してgoの環境構築を実行しました。かなり難しかったです。
pythonに対しての環境構築は何度も行っているので、サクサクできるが、今回は時間がかかりました。
苦戦はしたが、Dockerで一度環境を構築してしまえば他の人に対しても配布できるし、環境構築で同じように時間がかかることがないのでメリットは大きいなと思います。
そして何よりも、pc内にgoをインストールしなくても、Docker内でgoを使用できるのはかなりいいです。(誰かと共同作業するわけでも無いので、意味ないんですけどね・・・)

環境構築をする際に参考にさせていただいたのは以下になります。
<a href="https://datawokagaku.com/">データサイエンティストかめさんのブログ</a>：わかりやすくておすすめです。
<a href="https://macroro.com/golang-docker-env/">dockerを使ってGolangの環境構築</a>：ほぼほぼ真似させていただきました。