OmniAICreator/Qiita-1.07M huggingface dataset:
SQL Server: パスワード変更時に「パスワードは最近変更したばかりです。」というエラーがでる挙動を調べてみた

#背景
自分のパスワードは、以下のクエリで変更することが可能です。

```sql
ALTER LOGIN [ログイン名] WITH PASSWORD = '新しいパスワードをここに' OLD_PASSWORD = '今のパスワードをここに';
```
ただ、検証時に何度か連続でパスワードの変更を実施したところ以下のエラーが発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/25fe573f-0c45-c14a-8a44-f4100f195ee3.png)
「パスワードの検証に失敗しました。このユーザーのパスワードは最近変更したばかりです。」

このエラーがでるとパスワードが更新できません。
この挙動について原因を調べてみました。

#調査結果
DBが稼働しているサーバーにログインしてコマンドプロンプトを管理者として実行し、「rsop.msc」と入力して「ポリシーの結果セット」を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/417d6133-7854-cb04-9a47-414fb5a467bb.png)
[Windowsの設定]-[セキュリティの設定]-[アカウントポリシー]-[パスワードのポリシー]と進むと、
「パスワードの変更禁止期間」が表示されます。

ソースGPOがDefault Domain Policyになっているため、パスワードのポリシーは、ドメインのグループポリシーで設定されていることが分かります。

最後にパスワード変更したタイミングから、ここで設定している日数（例えば3日）が経過するとパスワードの変更が可能となるようです。
ちなみに、日数が1日の場合は、24時間という意味で、2020/08/07 15:00にパスワードを変更した場合、次回変更可能となる日時は2020/08/08 15:00となります。

# まとめ
パスワードを変更した際にでる「パスワードの検証に失敗しました。このユーザーのパスワードは最近変更したばかりです。」というエラーについて、関連している設定値「パスワードの変更禁止期間」を調べる方法について書きました。

※ただし、「パスワードポリシーを適用する」にチェックを入れていない場合は何度も変更できるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/ad08c164-3982-d65b-18e9-a9a384dd9b75.png)
Java で Mustache テンプレートエンジンの JMustache を使うサンプルコード

## 概要

- Java で Mustache テンプレートエンジンの JMustache を使う
- 今回の動作確認環境: Java 14 (AdoptOpenJDK 14.0.2+12) + JMustache 1.15 + Gradle 6.5.1 + macOS Catalina

## サンプルコード

### ソースコード一覧

```
├── build.gradle
└── src
    └── main
        ├── java
        │   ├── SampleApp.java
        │   └── SampleData.java
        └── resources
            └── my_template.html
```

### build.gradle

```groovy
plugins {
  id 'application'
}

repositories {
  mavenCentral()
}

dependencies {
  // https://mvnrepository.com/artifact/com.samskivert/jmustache
  implementation 'com.samskivert:jmustache:1.15'
}

application {
  mainClassName = 'SampleApp'
}
```

### src/main/java/SampleApp.java

```java
import com.samskivert.mustache.Mustache;
import com.samskivert.mustache.Template;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

public class SampleApp {

  public static void main(String[] args) throws IOException {
    new SampleApp().invoke();
  }

  public void invoke() throws IOException {

    // Mustache テンプレートファイルを読み込む
    String templateText = getResourceText("my_template.html");
    Template template = Mustache.compiler().compile(templateText);

    // オブジェクトを Mustache テンプレートに流し込む
    SampleData data = new SampleData();
    String out = template.execute(data);

    // 結果を出力する
    System.out.println(out);
  }

  // リソースのディレクトリからファイルを読み込む
  public String getResourceText(String path) throws IOException {
    try (InputStream is = getClass().getResourceAsStream(path)) {
      return new String(is.readAllBytes(), StandardCharsets.UTF_8);
    }
  }
}
```

### src/main/java/SampleData.java

```java
import java.util.List;
import java.util.Map;

public class SampleData {

  public String foo = "foo";

  public String getBar() {
    return "bar";
  }

  public String[] strings = {"S1", "S2", "S3"};

  public List list = List.of("L1", "L2", "L3");

  public Map map = Map.of("key1", "value1", "key2", "value2", "key3", "value3");
}
```

### src/main/resources/my_template.html

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
foo: {{foo}}<br>
getBar(): {{bar}}<br>
<br>
strings:<br>
{{#strings}}
  value: {{.}}<br>
{{/strings}}
<br>
list:<br>
{{#list}}
  value: {{.}}<br>
{{/list}}
<br>
map:<br>
{{#map}}
  {{key1}}, {{key2}}, {{key3}}
{{/map}}
</body>
</html>
```

## Gradle で実行

```
$ gradle run

> Task :run
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
foo: foo<br>
getBar(): bar<br>
<br>
strings:<br>
  value: S1<br>
  value: S2<br>
  value: S3<br>
<br>
list:<br>
  value: L1<br>
  value: L2<br>
  value: L3<br>
<br>
map:<br>
  value1, value2, value3
</body>
</html>
```

## 参考資料

- [GitHub \- samskivert/jmustache: A Java implementation of the Mustache templating language\.](https://github.com/samskivert/jmustache)
- [mustache\(5\) \- Logic\-less templates\.](https://mustache.github.io/mustache.5.html)
0からはじめる「Python AIプログラミング」 for PC

# はじめに
ここでは、PC(windows10)で、AIプログラミングを**「手っ取り早く動かしてイメージをつかみたいと思っている方」**向けの手順を説明いたします。

**初心者向け**のもので、目的は開発環境を整えてプログラム (プログラミングはしません。コピペでOKです^^;) を実行し、**「ほぉ、AIプログラミングってこんな感じか～」**というところが**GOAL**です。

![pic6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/c45e8faf-bec0-ca0b-2367-7a532a52834a.png)

※ クラウド版の『[0からはじめる「Python AIプログラミング」 for Google Colab](https://qiita.com/kenT100/items/f6b7205c4c20948e9c0d)』は、こちらです

### `記事構成`
※[作業フロー](#作業フロー)からリンク先に飛んでください。
![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/2cff4856-401d-d9fb-6ff5-527db74e7616.png)

# どんなことをやるか
まず`手書きの数字0～9とその正解ラベル(0～9)がセットになった教師データ60,000枚`を**AIに学習**させます。

その後、`手書きの数字0～9とその正解ラベル(0～9)がセットになった検証データ10,000枚`を**AIに検証**させて、認識率や検証データの手書き数字がAIによって0～9のどの数字と認識したのかを試してみます。

### (1) AIに学習させる
`教師データ(60,000枚)`を使用して、手書き画像を正解ラベルに沿って、0～9の数字として覚えさせます。
![gaku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/b5bee319-d8e8-c675-5f27-17b6bae6e5b4.png)

### (2) AIに検証させる
検証データ(10,000枚)`を利用して、手書き画像をAIにより0～9の数字に分類(クラス分類)させ、正解データと比較し当たったかどうかを判定。
![kenshou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/524ad1c2-0b31-a067-4d46-dd831d12a7ad.png)

※上記データは プログラム実行時に [MNISTデータベース](https://en.wikipedia.org/wiki/MNIST_database) から自動的にダウンロードされますので、`画像ファイルの収集`や`正解ラベリング(画像データと正解ラベルの結びつけ)`等の**前準備は一切不要**となっています。

# 開発環境インストール
まず開発に必要なものをインストールします。
開発環境に必要なソフトウェアは以下の2つです。
![pic11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/f2efb516-c898-cf9a-7816-176f34ef5235.png)

|No.|開発環境|ソフトウェア|今回使用したバージョン|説明|
|:-:|:-:|:-:|:-:|:--|
|1|python言語|Anaconda|Anaconda Navigator 1.9.12|Anacondaは、Python言語の無料のオープンソースディストリビューションであり、パッケージ管理とデプロイメントの簡略化を狙ったものです。大変便利です。|
|2|IDE(統合開発環境)|pycharm|Community 2020.2版|コード解析やグラフィカルなデバッガが可能です。Community Editionは無料です。|

ちなみにAIを動かすのに [Keras](https://keras.io/ja/) というオープンソースのニューラルネットワークライブラリを使用します。

# 作業フロー
下記の表のNo.1 → 4 の順で実行していってください。

|No.|作業概要|作業内容|説明|
|:-:|:--|:--|:--|
|1|![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/1cb79e26-7814-3d1e-202e-152cf4fc70d7.png)<BR>[Anaconda設定](https://qiita.com/kenT100/items/1134acb2bd1d68bfe2ec)|①Download<BR>②Install<BR>③アプリ設定| Kerasというオープンソースのニューラルネットワークライブラリを動かすため、Python言語を使えるようにします。Pythonのバージョンはライブラリを呼び出せる3.7.Xを用意します。|
|2|![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/57890dd8-42ec-7a27-0349-32965c4514cf.png)<BR>[Pycharm設定](https://qiita.com/kenT100/items/563a53639d499f3a7adc)|①Download<BR>②Install<BR>③アプリ設定|python言語での開発を簡単にし易くするため、統合開発環境を使えるようにします。|
|3|![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/69c9f0db-bc68-57fc-5ce3-c09cc54fe7b8.png)<BR>[PythonによるAIプログラミング](https://qiita.com/kenT100/items/38049d7c6cd960229966)|①AIプログラミング<BR>②ライブラリ追加<BR>③AIプログラミング実行|安心してください。プログラミングはしません。プログラムはコピペでOKです。|
|4|目的達成|思いにふける|お疲れ様でした！|


# 以上
- お疲れ様でした！
sam cli の [SSL: CERTIFICATE_VERIFY_FAILED] エラー回避


# sam deploy時の[SSL: CERTIFICATE_VERIFY_FAILED]回避策（暫定）

samのバージョン 0.53.0 

会社のイントラネットでsam deployコマンド実行すると以下のようなエラーが出て困ってました。
(Windows, Linux)

```
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)
```

StackOverflowを見ても困っている人が沢山いそうなので記事にしてみます。

おそらくはGit Hubのこのissueが該当するんじゃないかと。
まだOpen issueなんですよね。
[GitHub awslabs/aws-sam-cliSSL => proxy causing issues with deploy](https://github.com/awslabs/aws-sam-cli/issues/1855)

awc cli configファイルのca_certにルート証明書を設定する。他
色々試しましたが、全然ダメです。

諦めて禁忌に手を出します（笑）


# 回避策

**自己責任でお願いいたします。**

仕方がないので、sam cliに内包しているPythonのコードにパッチを当てます。

* パッチをあてるファイルの場所

例はWindows
sam cliのインストールフォルダ\Amazon\AWSSAMCLI\runtime\Lib\site-packages\botocore\httpsession.py

```python:httpsession.py
    def __init__(self,
                 verify=True,
                 proxies=None,
                 timeout=None,
                 max_pool_connections=MAX_POOL_CONNECTIONS,
                 socket_options=None,
                 client_cert=None,
    ):
        self._verify = False #ここをFalseに書き換え
        self._proxy_config = ProxyConfiguration(proxies=proxies)
        self._pool_classes_by_scheme = {
            'http': botocore.awsrequest.AWSHTTPConnectionPool,

```

sam deploy時にSSLの検証エラーメッセージ(warning)は表示されるものの無事、sam deployできました。

冒頭のissueがcloseされるまで、これで対応しておこうと思います。

## 余談

開発PCはWindowsですが、AWS CLI関係は公式のDockerコンテナを使わせてもらってます。
コンテナをPullすればすぐに使えるメリットはもちろんのこと
上に書いたパッチコードもvolumeとしてマウントしているので、いつでも元に戻せて便利です。

[Docker Hub. amazon/aws-sam-cli-build-image-nodejs12.x](https://hub.docker.com/r/amazon/aws-sam-cli-build-image-nodejs12.x)
・＜Slack＞Slackに通知する関数を書いて、いつでも引用できるようにする(Python)



結論
-------


```python:結論
#Slackを定義する
slack_url = "https://hooks.slack.com/services/XXXXXXXXXX"
slack = slackweb.Slack(url=slack_url)

#メッセージを定義する
message = "hello!"

#メッセージを送信する
slack.notify(text=message))

```
チームが目標を見失わない為に重要な事

# はじめに
技術力が低い（社内に圧倒的な実力者がいない）チームがどうやったら道に迷わず歩き続けられるか。
というトピックについて、僕の思う節を書いてみました。

# 圧倒的な実力者がいないチームは道に迷いやすい
人が継続的な成長を遂げる為には目標が必要です。
子供の頃は、身近にいた両親や、友人、先輩から生き方を学んできました。

プログラマーも同じです。
身近にいる優れた先輩などから正しいコードや設計を学びます。

ですが、スタートアップなどでは金銭的な理由等で優秀なCTOを雇う事などが難しく、エンジニアが切磋琢磨してプロダクトを開発しているというところも多いのでは無いでしょうか。

**このような身近に圧倒的な実力者がいないチームは何を見て成長すれば良いのでしょうか。**

# コミュニティに参加する
プログラマとして沢山の情報を吸収する上で、コミュニティはとても重要な情報源になります。
仲良くなれば、いざという時の相談できる強力な相談者にもなります。

関東であれば毎日のようにイベントが開催されています。
コロナ禍でもオンラインイベントが沢山あります。
イベントハッシュタグをつけて呟けば、同じイベントの参加者と沢山繋がれます。

**横のつながりを増やして効率的にノウハウを吸収しましょう**

# 継続的な課題設定
何事も改善点を見つけて改善しなければ成長はありません。

**どのようなチームになりたいのか**
**自分達に足りないものは何か**
**それぞれの理想とするエンジニア像**

について徹底的に話し合う必要があります。
そして、これらは常に問い続けていかなければなりません。

目標に向かって切磋琢磨していれば、価値観も視野も変わってくるものです。
常に高みを目指し続ける為には、継続的に課題設定を更新し続けましょう。

# 井の中の蛙にならない
チームが一定のレベルまで成熟してくるとマンネリが生じます。

**自分達はそれなりに強いのでは無いか**

という錯覚にも陥ります。
これでは井戸の中で最強を謳う愚かな蛙と何も変わりません。

勿論、外の世界にはもっと優れた人材やチームが存在します。
業界における自分の市場価値を確認し続けることで、自分の課題を見つけ出し、成長の糧にする必要があります。

**積極的に外の世界と触れ合い、自分の中の定規は常に更新し続けましょう。**

# 失敗を隠さない文化作り
自分の失敗は誰かの糧になります。

**「自分が苦労して得た経験を安く売りたく無い」**

という意見も耳にしますが言語道断です。
その苦労はどこかの誰かが使うはずだった苦労を先に解決する素晴らしい鍵になります。
チームのメンバーに共有することで、その学びは誰かの糧となり、チーム全体の成長を促します。

**チームにとっての最善という目線でみたら、失敗の共有は歓迎されるべきです。**

# 自分にできる最大限の貢献を
イベントに参加するにしても、何かを学習するにしても、どうやったらチームに貢献できるかを考えましょう。

イベントに参加したなら、勉強になった資料や意見を持ち帰ってメンバーに共有しましょう。
新しい学びがあったなら、よりわかりやすく噛み砕いでメンバーに共有しましょう。
失敗をしたなら、なぜ起きたのか、どうしたら解決できるかをメンバーに共有しましょう。

**個の学びはチームの学びとして全て大切な財産になります**

# メンバーを良きライバルに
年齢や技術力は勿論リスペクトすべきです。
ですが、年齢や技術力を言い訳に負けを認めていては、その人以上の人材にはなれません。

**負けず嫌い精神のもとに競争しあえる関係が最も良いスピード感を生み出します。**

その為には、年齢や学歴などといった無意味なカーストを辞めて、素の状態を評価しあう文化が必要不可欠です。
正々堂々と競い合ってこそ強い絆が生まれるのだと僕は思います。

# 無理のないペースを一定に保ち続ける

当たり前の事ですが、人間には許容量が存在します。

目の前の仕事だけを片付けていては、長期的な成長率が下がってしまいます。
８割の力でタスクをこなしてもらい残りの２割は緊急時や自己学習に当てるべきです。

常に100%の力で作業していたら、たった1%のタスクが降ってきただけで壊れてしまいます。

作業量に波が生まれないように業務に取り掛かり、心身共に健康な状態で効率的な成長をしていきましょう。

# さいごに
圧倒的な実力者が身近にいない中での成長はとても大変です。

ぶっちゃけ修羅の道だと思います。
レールに引かれたキャリアの上を確実に歩んでいき、確実に実力をつけるという方法もあります。

ですが、チームのメンバーと一緒に切磋琢磨し、成長を噛み締め、ゆっくり確実に成功体験を積み重ねていくという道も悪く無いと僕は思っています。

最後まで読んでくれてありがとうございました！
一緒に頑張っていきましょう！
中央値と平均値の関係

若干迷ったので、メモとして残します。

## 実戦

１、３、６、８、９、１０、１１、１２、13

のデータで考えた時、

中央値は、「9」
平均値は、「8.11」

となる事が分かる。

平均値よりも中央値が若干大きいので、
若干、データの分布は大きい方向に偏っている事が言える。


## 理由（解説）

１、３、６、８、９、１０、１１、１２、13

のデータを平均値から見て考えると分かりやすい。

平均値以下は、「１、３、６、８」
平均値以上は、「９、１０、１１、１２、13」

よって、値は大きい方に偏っている。
Mongooseでタイムスタンプを利用する

##タイムスタンプとは
ある値が作られた時間を記録するもの。
サーバー側からもクライアント側からも使用することができる。

##Mongooseにタイムスタンプを設定

Mongooseの設定から、オプションでタイムスタンプを自動作成させることができる。
＜公式ドキュメント＞　https://mongoosejs.com/docs/guide.html#timestamps

<img width="1204" alt="スクリーンショット 2020-08-06 21.16.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/ecc13f0d-5735-4d37-f941-c663e69beacc.png">

```javascript
const mongoose = require('mongoose')

const userSchema = new mongoose.Schema({
  {..},
  {timestamps: true}

})

```
↓
新しくuserShemaを用いてuserを作成するたびに、

「createdDt:"...(時刻)"」と「updatedAt:"...(時刻)"」

が作成される。
【PHP】標準エラー出力する４つの方法

<h1>PHP で標準エラー出力にメッセージを出力する方法（各種）</h1>

[Qiita 記事に絞って「php 標準エラー出力」でググって](https://www.google.com/search?q=site:qiita.com+php+%E6%A8%99%E6%BA%96%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%BA%E5%8A%9B&tbs=qdr:y)も、ピンポイントのタイトルの記事がなかったので、自分のググラビリティとして。

## TL; DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

![](https://img.shields.io/badge/PHP-%3E%3D5.2.1-blue)

```php:シンプルで確実な標準エラー出力
fputs(STDERR, 'my error message');
```
```shell-session:標準出力を潰して標準エラー出力だけ確認してみる
$ # 標準出力（STDOUT）へ出力するも 1>/dev/null で標準出力を潰してみる
$ php -r 'fputs(STDOUT, "hoge". PHP_EOL);' 1>/dev/null

$ #  1>/dev/null で標準出力を潰しつつ標準エラー出力（STDERR）へ出力
$ php -r 'fputs(STDERR, "hoge". PHP_EOL);' 1>/dev/null
hoge

$ # STDERR定数の内容確認
$ php -r 'echo STDERR . PHP_EOL;'
Resource id #3
```

- [オンラインで動作をみる](https://paiza.io/projects/XBWrk5u6bRN1YHVlmvrPPg) @ paiza.IO

## TS; DR

PHP で標準エラー出力に出力するには、いくつかの方法があります。

### I/O ストリーム編

#### fwrite + STDERR定数

> `fwrite()` で `STDERR` に書き込む

「`STDERR`」定数は、標準エラー出力への「出力ストリームのリソース」が割り当てられた定数です。つまり、標準エラー出力へのファイルポインタです。利用後の `fclose()` の心配はいりません。

```php:入出力ストリーム定数を使った方法
$msg_error = 'standard error' . PHP_EOL;
fwrite(STDERR, $msg_error);
```

- 参考文献
    - [入出力ストリーム定数](https://www.php.net/manual/ja/features.commandline.io-streams.php) | コマンドラインの使用法 @ PHP 公式マニュアル
    - [fwrite](https://www.php.net/manual/ja/function.fwrite.php) | ファイルシステム関数 @ PHP 公式マニュアル

#### fputs + STDERR定数

> `fputs()` は `fwrite` のエイリアス（別名）

`fwrite` を使うと `fopen` や `fclose` も使わないといけない印象を与えてしまうため、可読性を優先するなら `fputs` が良いと思います。

```php:fwriteのエイリアス関数fputsを使ってもOK
$msg_error = 'standard error' . PHP_EOL;
fputs(STDERR, $msg_error);
```

- 参考文献: [fputs](https://www.php.net/manual/ja/function.fputs.php) | ファイルシステム関数 @ PHP 公式マニュアル

### エラー処理関数編

> `error_log()` 関数の出力先を、標準エラー出力のファイル・ポインタ（`php://stderr`）に設定する

後日、ファイル出力が必要な場合にも対応できるメリットがあります。[バイナリセーフ](https://qiita.com/dodonki1223/items/e3d2c4a032b129e1f6ce)ではありません。

```php:PHPの設定ディレクティブ"error_log"に標準エラー出力へのファイルポインタを割り当てておいて使う
ini_set('error_log', 'php://stderr');

$msg_error = 'standard error' . PHP_EOL;
error_log($msg_error);
```
```shell-session
$ # 設定ディレクティブの確認（未設定を確認）
$ php -r 'echo ini_get("error_log") . PHP_EOL;'

$ php -r 'error_log("hoge");' 1>/dev/null
hoge

$ # 設定を変更してログ出力
$ php -r 'ini_set("error_log", "php://stderr"); echo ini_get("error_log") . PHP_EOL;'
php://stderr
$ php -r 'error_log("hoge");' 1>/dev/null
hoge
```

- 参考文献: [error_log]() | エラー処理関数 @ PHP 公式マニュアル

### ファイル・ストリーム編

#### `php://` ファイルストーリム

> 標準エラー出力のファイル・ポインタ（`php://stderr`）を開き、書き込む

[「site:php.net/manual/ja 標準エラー出力」と PHP 公式マニュアルに絞ってググる](https://www.google.com/search?q=site%3Aphp.net%2Fmanual%2Fja+%E6%A8%99%E6%BA%96%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%BA%E5%8A%9B)と出てくる方法で、古いブロクでも良く見かける方法です。

「ファイルを開く」「書き込む」「クローズ」という**ファイルの読み書きの基本を使った方法**であるものの、標準エラー出力の場合は前述の `STDERR` が用意されているので、`fputs()` を使った方がコードがスッキリします。

```php
$msg_error= 'standard error' . PHP_EOL;

$stderr = fopen('php://stderr', 'w');
fwrite($stderr, $msg_error);
fclose($stderr);
```

- 参考文献
    - <code>[php://](https://www.php.net/manual/ja/wrappers.php.php)</code> | プロトコルラッパー @ PHP 公式マニュアル
    - [コメント](https://www.php.net/manual/ja/function.error-log.php#83891) | error_log @ PHP 公式マニュアル
【GoネットワークプログラムでIPv6対応させる】IPv6対応httpサービスの作り方


# 理由
Goで書かれたネットワークプログラムをIPv6に対応させるためにはどうすればいいのかコード例をメモしておく

# 参考コード

```golang:main.go
package main
import (
	"log"
	"net/http"
)
func main() {
	log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir("/var/www/html"))))
}
```

```html:/var/www/html/index.html
<html>
 <head>
  <title>test</title>
 </head>
 <body>
 <h1>This is ipv6 http server test.</h1>
 </body>
</html>
```

## 解説
Goのhttp.ListenAndServeの場合、何も意識する必要はありません


- サーバのIPv6アドレスは

```shell
$ ip address show dev eth0 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq state UP group default qlen 1000
    link/ether 06:0a:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.92/25 brd 192.168.100.127 scope global dynamic eth0
       valid_lft 3558sec preferred_lft 3558sec
    inet 192.168.100.106/25 brd 192.168.100.127 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 2406:da14:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/128 scope global dynamic 
       valid_lft 393sec preferred_lft 93sec
    inet6 fe80::40a:eaff:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever
```

- runする

```shell
$ go run main.go  
```

- 確認

```shell
$ netstat -an | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN    
```

- アクセスしてみる

```shell
$ curl -i 'http://[2406:da14:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]:8080/' 
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Length: 112
Content-Type: text/html; charset=utf-8
Last-Modified: Thu, 06 Aug 2020 12:17:04 GMT
Date: Thu, 06 Aug 2020 12:22:11 GMT

<html>
 <head>
  <title>test</title>
 </head>
 <body>
 <h1>This is ipv6 http server test.</h1>
 </body>
</html>
```


# まとめ
サーバにIPv6アドレスつけて、フィルタ/ファイアーウォール/セキュリティグループ等開けてあげれば、なにもしなくていいよ。
参考）[AWS VPCでIPv6を使う](https://qiita.com/skubota/items/89e0c1addd52c6809134)
タイムゾーンはちゃんと設定しよう

サービスを開発する際、最初にタイムゾーンをしっかり設定していないと、MySQLのcreated_at や updated_at などをうまく使えないというようなことになります。

MySQLでは、カラムにcreated_at や updated_atなどを加えると、それぞれSQLのinsertやupdateが実行されたときに自動でtimestampを入れてくれたりします。

始めにしっかり設定しておかないと、あとから必要になったときに、自力でそれらの値を取得して挿入するはめになってしまいます。（実体験）
""（ダブルクォーテーション）で囲まれたカンマを含むCSVをパースする

プログラムでちょっとした、ほんの数行の.csvをパースする必要があったので、
横着して

```cs
string[] infoOneArr = line.Split(",");
```
とやったのですが・・・
```山田太郎,"ABC Inc,Japan",2,研究,```
ありましたよ"ABC Inc,Japan"が。ほんの数行の中に。
""で囲ってあって中にカンマが入っているやつ。
ガッツリと.csvを扱うのならパーサー用意するとか考えるのですが、
ちょっとした.csvなだけになんとなく躊躇してしまいます。曰く

**「何とかインチキできんのか？」**

答え：こんな感じでどうでしょう？

```
using System.Text.RegularExpressions;
    ：
Regex reg = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
string[] infoOneArr = reg.Split(line); // ""で囲まれたものは分割しない
for (int n = 0; n < infoOneArr.Length; ++n)
    infoOneArr[n] = infoOneArr[n].Trim('"'); // 先頭と最後尾の '"' を削除
```
Automation Anywhere v11からA2019にEメールコマンドを移行してみる

Automation Anywhere v11.x以前からA2019に移行する際には、アーキテクチャが大きく変わるためBotファイルも移行が必要になります。A2019には**「Bot の移行」**アクションがあり、以下のような1ステップのBotを作成して、入力ファイルにv11.xの.atmxファイルをしていするだけで、A2019のControl Roomに新しい形式でBotを出力してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b89bdb6c-801b-9a4b-2cc1-cff13538e422.png)
また、.atmxファイルが複数ある場合は、ループを組んで入力ファイルを変数にして必要なフォルダーを探索するようにすれば、一括移行も可能です。

# 結構使える移行ツール
移行コマンドを使えば、よく使うコマンドは意外とうまく移行することができます。(参考: 『[Automation Anywhere v11.xのBotファイル「.atmx」の正体](https://qiita.com/RPAbot/items/98db4ae9bc9391d8b164)』) たとえば、[RPA Challengeを解いたときのBot](https://qiita.com/RPAbot/items/961e75fcd6fe0b63bfdb)も、移行ツールでそのまま使えます。

移行前:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ab7285c5-89e5-9c52-369c-41f6d48cf382.png)
移行後:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/48fb4c9b-534d-b821-6c5b-10e5ac42d20d.png)

# Eメールコマンドを移行してみる
そんな中、移行時に注意が必要なコマンドもあります。その一例が**「Eメール」**コマンドです。このコマンドはv11 Enterprise Clientでは送信用アカウントの設定があり、またHTMLメールを出す場合はそのコンテンツがどの程度保持されるか、ということがあります。

v11で以下のような1ステップのアクションリストを作って移行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/83ac3ef4-67a2-83d4-a029-b792671a2cbd.png)
設定は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/fbe00277-e864-386c-e72e-55543e5b57c9.png)

移行すると、以下のようになります。A2019では**全体の設定ではなく、アクションの中に送信用アカウントの設定があります**ので、それぞれダミーの文字列が入っているところは、適切なアカウントに置き換えてください。また、アカウントの名前とパスワードも資格情報を使うことが前提の設定になっているので、適切に書き換えてください。(ここも、資格情報が自動的にできるわけではない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/9ff855c7-dbcf-8275-5241-661b35419b17.png)

加えて、メール本文については、HTMLになっている場合、A2019では残念ながらいまのところビジュアルエディターではなく。HTMLソースが入っています。これは今後改善されるとうれしいポイントです。(v11.xでは.NET Frameworkのクライアント上でIEのエディットコントロールを使った実装になっていましたが、A2019ではブラウザーベースになった分、エディットコントロールもブラウザー依存になってくるため、実装が難しくなっているはずです)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/307eac15-0ecb-32a5-f063-a3530d2fa5ce.png)

# まとめ～送信用メールアカウントとHTML本文
まとめると、**「Eメール」**コマンドの移行では、送信用メールアカウント設定と、メール本文のHTMLメールの内容に気を付ける必要があります。
Vue CLI のインストールで躓いた場合

公式サイトのインストールコマンドを打ったのにインストールできない。

>環境 : Mac OS Catalina 10.15.6
シェル : ZSH
nodenv : 1.3.2
node : v8.11.3

インストールコマンド

```
% npm install -g @vue/cli
```

エラーメッセージ

```
npm ERR! code E404
npm ERR! 404 Not Found: @vue/cli-ui@^4.4.6

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/whoami/.npm/_logs/2020-08-06T07_59_42_517Z-debug.log
```

##解決方法

以前インストールした（インストール失敗した？）すべてのvue cliを削除します。

```
sudo npm uninstall --global vue-cli
sudo npm uninstall --global @vue/cli
```

最新バージョンをインストールします。

```
sudo npm install --global @vue/cli@latest
```

バージョンを確認

```
vue -V
```
Salesforceのテーマ色変更の方法

複数の環境を操作するときに区別したいと思ったので、調べました。

- 設定
- ＞ユーザインターフェース
- ＞テーマおよびブランド設定
- 変更したいテーマのレコードの右のボタンをクリック
- 「有効化」を選択

デフォルトは青ですが、結構青系のテーマが多い印象です。
自分でテーマの作成も可能なので、気に入らなかったら自分でテーマを作成することも可能です。
Vimでソースコードを画像化してクリップボードにコピー

こんにちわ
ゴリラです

[Goでソースコードを画像化するCLIを作った](https://qiita.com/gorilla0513/items/013aea9060bca1455137) でソースコードを画像化するCLIを紹介しましたが、Vimからもう少し使いやすくするためプラグインを作りました。

<a href="https://github.com/skanehira/code2img.vim"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/skanehira/code2img.vim.png" width="460px"></a>

## 使い方
次のとおりです

```vim
" 選択した範囲を画像化してクリップボードにコピー
:'<'>Code2img

" ファイル全体を画像化してクリップボードにコピー
:Code2img

" ファイルに出力
:Code2img image.png

" 選択範囲を画像化してファイルに出力
:'<'>Code2img image.png
```

## 仕組み
Vimの`job_start`を使って`code2img`を実行しているだけです。
引数がなければクリップボードにコピー、引数があればファイルに出力するように引数を組み合わせています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/32395da9-4f89-5baf-12e3-934d3fddd221.png)

## さいごに
久しぶりにVimプラグイン作りましたが、楽かったです
あとやはり書かないと色々忘れるなと思いました
定期的にプラグインを作りたい（気持ちはある）
Beamer(LaTeX)にMathematicaのグラフの色を表示する

自分用メモも兼ねて．
Beamerでスライドを作る際に，Mathematicaで作ったグラフを映す場面もあるかと思います．青は〇〇，黄色は〇〇と黒字で書くのはなんとなくカッコ悪いので，Mathematicaのグラフの色で文字を表示させたいです．
以下のサイトを参考にしました．
[[Matplotlib][Mathematica][Matlab] グラフのデフォルトのブルー](https://cyanatlas.hatenablog.com/entry/2018/01/17/180000)
[LaTeXにおける文字の色指定](https://github.com/uribo/LaTeX_tips/issues/4)
#Beamerの設定
使っているthemeの関係で，XeLaTeXを使用する場合について書きますがpLaTeXでも同様です．スライド.texのプリアンブルに

```latex:slide.tex
\usepackage[]{graphicx,xcolor}
```

と記述します．
#Mathematicaで色を調べる
あまり私自身よく理解していないのですが，Mathematicaで

```:math.nb
ColorData[97, "ColorList"][[1]] // InputForm
```

と打つと，デフォルトのグラフで出てくる青色が判ります．また，グラフを二つ以上描いた時の二番目に出てくる黄色は

```:math.nb
ColorData[97, "ColorList"][[2]] // InputForm
```

で判ります．
#LaTeXに色を入れる

```latex:slide.tex
  {\color[rgb]{0.368417,0.506779,0.709798}{Mathematicaの青}}
  {\color[rgb]{0.880722, 0.611041, 0.142051}{Mathematicaの黄色}}
```

で表示できます．
GithubDesktopで作業中のブランチにmasterの最新コードをマージさせる

#####1.GithubDesktopのmasterブランチを最新にする
GithubDesktopにて【CurenntBranch】をmasterに選択し、Fech originをクリックして最新の状態にする

#####2.開発中のブランチに移動
【CurrentBranch】で作業をすすめたいブランチを選択

#####3.masterブランチを開発中のブランチにマージさせる
【CurenntBranch】の選択画面の下のほうにある【Choose a branch to merge into〜】というボタンをクリック
（下記画像の緑色の線で囲っているボタン）
![632257284cf1e1468313f6e14bfb01ba.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630368/2d89a17f-5c3f-f98f-680a-29ef52183b56.jpeg)

すると下記のような画面が表示されるので、マージさせたいブランチ（今回はmaster）を選択されていることを確認し、下の方にある青いボタン【Merge マージさせたいブランチ名 into 作業中のブランチ】をクリックで完了
<img width="552" alt="85baa8059cf34173707c17dcab1a1283.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630368/b69e742a-35b7-81a9-8a4c-9135c24686b9.png">
Fastlane Match利用中にProvisioning ProfileをApple Developer Program上で誤って削除しちゃったら

Apple Developer Program上で複数のApp IDを管理してると、期限切れや利用不可の証明書とProvisioning Profileを一掃してくれるコマンド`fastlane match nuke`が使えなくてハマったのでメモです

## 前提
- Fastlane Matchで証明書/Provisioning Profileを管理
- 1つのApple Developerアカウントで複数のアプリ(App ID）を管理

## 現象

Fastlane Matchで生成されたProvisioning Profileを[Apple Developer Program](https://developer.apple.com/account/resources/profiles/list)で直接削除したら、

```
$ fastlane match development
```

コマンドを実行したときに以下のエラーが出てきた
> [15:50:22]: Provisioning profile 'XXXXX' is not available on the Developer Portal
[15:50:22]: for the user abc@abc.com
[15:50:22]: Make sure to use the same user and team every time you run 'match' for this
[15:50:22]: Git repository. This might be caused by deleting the provisioning profile on the Dev Portal

>[!] To reset the provisioning profiles of your Apple account, you can use the `fastlane match nuke` feature, more information on https://docs.fastlane.tools/actions/match/



「`fastlane match nuke`を実行すれば解決するよ」とは教えてくれるが、私の環境ではnukeはできない。
なぜならば、Apple Developer Program上で複数種類のApp IDを管理している状態だと、nukeはApp ID関係なくあらゆる期限切れの証明書やProvisioning profileを削除しちゃうから使えない。（関係ないApp ID関連の物まで消しちゃう）

## 対応

`Matchfile`の`git_url("git@github.com:XXX/XXX.git)`で指定してるプライベートレポジトリ上で、Developer Program上で消してしまったProvisioning profileを直接削除すると、`match`コマンドがまた使えるようになる


#### 参考URL
https://stackoverflow.com/questions/37520489/what-should-i-do-with-fastlane-match-after-certificate-revoked
続：オブジェクト指向プログラミングの基本的な概念の話【コンポジション】

前回：[オブジェクト指向プログラミングの基本的な概念の話【カプセル化・抽象化・ポリモーフィズム・継承】](https://qiita.com/alumite/items/7bba694517701b032225)
今回は前回の続きで、扱っていなかった概念である「コンポジション」をまとめます。
参考書：[独学プログラマー Python言語の基本から仕事のやり方まで]
(https://www.amazon.co.jp/dp/B07BKVP9QY/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)（第13章）
参考記事：[オブジェクト指向によるクラス設計](https://thinkit.co.jp/article/13112)

# コンポジション
### やること・出来ること
- 「is-a関係」（継承）に対応する「has-a関係」を実現する。（例えば飼い主と飼い犬の関係など）これにより、オブジェクトで表現できる幅が広がる。具体的にはクラス間の関係を表現することができる。（＝人間の思考に合わせたデータの持ち方・処理を実現できる）

### お気持ち
　個人的な理解としては、人間は人間の思考で考えるので、基本的に人間の考える方法で処理できるほうがわかりやすい。そのためデータや処理の持ち方も、人間の言語や思考と似た形にしたほうが扱いやすい。
（高水準言語は、低水準言語より扱いやすいという話と同じ）

　となると、思考方法が文化によって異なるので、日本語文化圏に合った処理方法、プログラミング言語もあるのだろうか。（研究されてそう。）

### 具体例

```python:Composition.py
class Dog:
    def __init__(self, name, breed, owner):
        self.name  = name
        self.breed = breed
        self.owner = owner
class Person:
    def __init__(self, name):
        self.name = name

## 飼い主
gian = Person("Goda Takeshi")
## 飼い犬（引数にPersonオブジェクトを渡している）
muku = Dog("Muku", "Crossbreed", gian)

## Dogオブジェクトに内包(コンポジション)されている
## Personオブジェクトのnameメソッドを呼び出している
print(muku.owner.name)
```

実行結果

```python:
Goda Takeshi
```
Xcode ショートカットキー一覧

# この記事について
Xcodeのショートカットキーについて、いつも忘れてしまうので自分用としてのメモです

# Xcodeの画面表示系
## ナビゲーター
閉じる or 開く
`Command(⌘) + 0`

プロジェクトナビゲーターの表示/非表示
`Command(⌘) + 1`

エディターのみ開く/閉じる
`Command(⌘) + Enter`

キャンバスの表示/非表示
`Command(⌘) + Option(⌥) + Enter`

デバッグエリアの表示/非表示
`Command(⌘) + Shift + Y`

# 検索系
ファイル検索
`Command(⌘) + Shift + O`

# エディタ
コードを一行上に移動する
`Command + Option(⌥) + [`

コードを一行下に移動する
`Command + Option(⌥) + ]`
class名をインスタンスを作らずに取得する

#概要
クラスオブジェクト自身からclass名を取得する方法が書いてある日本語の記事がなかったので、備忘録として書いておきます。

#class名を取得する方法
##インスタンスから取得する
ググってもほとんどがこの方法を使って取得していました。

```Python
class A:
  pass

a = A()
print(a.__class__.__name__)
>>> A
```


##クラスオブジェクト自身から取得する
Python3.3から実装された`__qualname__`で取得できます。
追記：`B.__name__`でも取得できるようです。@shiracamusさん、ありがとうございます。
また、`__qualname__`はクラスオブジェクト内では`B.__qualname__`ではなく単純に`__qualname__`とだけでも書けます。

```Python
class B:
  pass

print(B.__qualname__)
>>> B

# 追記
class C:
  qualname = __qualname__

print(C.__name__)
print(C.qualname)
>>> C
>>> C
```

#おわりに
~~`__qualname__`なら、クラスオブジェクト内やクラスオブジェクトを引数に取る関数の中でも取得できますね。~~
追記：先ほど追記した通り、`__name__`を使っても取得できるようです。

#参考文献
[現在のクラスの名前を取得しますか？](https://www.it-swarm.dev/ja/python/現在のクラスの名前を取得しますか？/940596062/)
JQueryでのDOM操作まとめ ～Javascriptでテストを自動化したい～

僕が最初にやったプログラミングは求人サイトに載っている求人の自給を自動取得だったのですが、この時の経験が今やっている開発でも生きているので記事にしてみました。
バイトの時給なんて大体同じなのでデータを集めてもあまり意味はなかったのですが、その代わりにWebのデータを集めるためにDOM要素について調べたおかげでかなりWebのことを知ることができました。

> その時読んだ記事：[Python Webスクレイピング テクニック集「取得できない値は無い」JavaScript対応@追記あり6/12](https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a)

DOMのことが知れればWeb開発・RPA・スクレイピング・テスト自動化と色々なことができます。

DOM操作のやりかた～的な良記事は他にたくさんあるため、ここでは入力フォームの操作に焦点を当てて記事を書いていこうと思います。

## テキストボックス
```html

<input type="text" name="hoge" value="入力値" data-target="fuga" id="input-1" class="target">
```
画面上の表示はこんな感じ。
![input-pre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/241aa8c3-9da6-fcfa-28bd-780f1b70b92a.png)

このテキストボックスへの入力をプログラムでやりたい時は以下のようにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/fa7b13fc-1817-f649-d1cd-a601e04d6702.png)
↑ Javascriptなのでブラウザで動かせる

```javascript

$('input[name="hoge"]').val("変更後")
```

上のコードは、`$('input[name$="hoge"]')`でName属性で要素を指定してに入力フォームのオブジェクトを取得し、`.val("変更後")`でそのオブジェクトのValueに文字列を入れています。

> DOMオブジェクト（入力フォーム）の取得方法は属性指定以外にも色々あります。
> ↓これが全部
> [CSSの基本～セレクタの種類～](http://www.htmq.com/csskihon/005.shtml)

## セレクトボックス
以下のようなセレクトボックスがあるとします。

```html

<select class="form-control" name="WorkingShift">
 <option value=""></option>
 <option value="0">朝登板</option>
 <option value="1">昼登板</option>
 <option value="2">夜登板</option>
</select>
```

```javascript

$('select[name$="WorkingShift"]').val(2)
```

と打ち込むと。入力フォームの値が「夜登板」に変わるはずです。

## チェックボックス

```html

<input class=​"form-control" name=​"SampleCheckbox" type=​"checkbox" value=​"さんぷるでーた">​
```

チェックボックス・ラジオボタンはDOMの構造がテキストボックスと違うためコードも少し違う。
disabled, hidden属性の追加も同じやり方でできる。

```javascript

$('input[name$="SampleCheckbox"]').val("さんぷるでーた").prop('checked', true)
```
<hr/>
以上Javascriptを使ったデータの入力方法でした。
Xcode  の Swift Package : Unit テストのメソッド名の先頭は "test" 縛り

作業手順

Xcode Version 11.6 (11E708)
1. File → New → Swift Package で MyLibrary プロジェクトを作成。
2. MyLibraryTest.swift を変更
3. Command+U でテストを実行
<img width="1234" alt="スクリーンショット 2020-08-06 19.41.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226677/18118648-bfca-1524-d954-44556f723563.png">
"noTest" は呼び出されていない。allTests に追加していけば実行してくれるのかと思いきや無視されていた。

Xcode では "test" で始まるメソッドを自動的に実行する。

---
ドキュメントの何処かにあるのかもしれないが探せなかった。忘れた頃に同じ事でハマるのでメモっておく。
AkkaHTTP 公式 introduction を日本語訳する

# Akka HTTP introduction

## 1. introduction

* [元ネタ: 1. Introduction・AkkaHTTP](https://doc.akka.io/docs/akka-http/current/introduction.html)

### Def:
Akka HTTP モジュールは、「akka-actor」と「akka-stream」の上にフルのサーバサイドと、クライアントサイドのHTTPスタックを実装したもの

フレームワークというよりは、HTTPベースのサービスを提供したり、使ったりするための標準的なツールキット、という立ち位置らしい。
(詳細: Philosophy にて後述)

### 性質:

**オープンなデザイン**

同じことをするのに、いくつかのAPIのレベルの選択肢がある(が提供されている)。

「自分の提供したいアプリケーションに最適なレベルのAPIを選んで使ってね。
高レベルで実現するのが辛かったら、低レベルなAPIを使って実現できる可能性があるよ」
とのこと。

ここでいう「高レベル」は「ガチガチに色々揃った、準備されたもの」
「低レベル」は「より生に近く、柔軟性の高いもの」らしい。

なので、低レベルのAPIを選択するということは、コードをより多く書くことが要求されるということとなる。


## Philosophy:

アプリケーションのコアを提供するフレームワークではなく (というよりも、むしろ) レイヤーを統合するツールを提供することに明確に焦点を当てて開発されてきた。


X: フレームワーク
O: ライブラリの集合体

### フレームワーク

「フレームワーク」というと **結構完成されたもの(フレーム)が前もって作られていて、その提供されたものと、それを自分なりに組み替えるに当たって用意されているサポートを使って、素早く目的ものを作成する** というイメージがある (し、実際にそういうものである) 。

ある意味では、フレームワークは、「肉 (flesh) 付け」をするための「骨組み (skeleton)」であり、骨に肉をつけていくことで、アプリケーションが活き活きしてくるものである。

このように、**開発を進める前にどのフレームワークを使うかを決めて**、
**そのフレームワークのやり方に沿って (開発を) 進めていけば**、
フレームワークは最高の働きをする (だろう) 。

<!--
For example, if you are building a browser-facing web application ...
-->

例えば、ブラウザ越しに使われる web-application などを作る場合には、フレームワークを使うのが**賢い選択**である。


### Akka HTTP の目指すもの

もし、開発しようとするものの「コア」がブラウザインタラクションなものではなく、「特殊で、複雑なビジネスサービス」であったり、「単に `REST/HTTP` インターフェースを介して世界に発信したいんだ！」という場合には、フレームワークは必要ないかもしれない...
(大道具すぎる、ということ?)

こう言った場合には、アプリケーションのアーキテクチャは、インターフェース層ではなく、"コアにとって意味あるもの" によって決定されるべきである。

また、ブラウザ固有のフレームワーク ( のコンポーネント ) にありがちな
「view のテンプレ化」であったり「アセットの管理」であったり、
「JavaScript や CSS 周りの取り扱い」や
「localization のサポート」、「AJAX のサポート」
といったことの恩恵を受けることは恐らくないだろう (と思われる) 。


Akka HTTP は、**「フレームワーク嫌い」** をしている訳ではない。


**「フレームワークを選択するのが適切でない場合に (も)
そぐうように」** `not-a-framework` として作られているのである。

Akka HTTP は HTTP をベースにした
レイヤーの統合を目的として作られている。

なので、通常は Akka HTTP の上にアプリケーションを構築する、という
( フレームワーク的な使い方をされる) ことはない。

他方で、もしフレームワークに沿ったアプリケーションを構築したいのであれば、[Play Framework](https://www.playframework.com/?_ga=2.171308712.901532546.1596607703-1136150064.1595414827) や [Lagom](https://www.lagomframework.com/?_ga=2.171308712.901532546.1596607703-1136150064.1595414827) をオススメする。

(これらは内部的に、Akka HTTP を利用している)


## Next:

[Using Akka HTTP](https://doc.akka.io/docs/akka-http/current/introduction.html#using-akka-http)
【Python, PyPDF2】見開きのPDFを左右に2分割するスクリプト

## 今回の内容
PyPDF2を使って、見開きでスキャンした資料などのpdfファイルを左右に2分割するスクリプトのメモです。

## 座標参照の改善（追記：2021-12-21）
表示領域を変更しているだけで本体はそのままのようです。ファイルサイズも変わらないためあまり問題はないように思いますが、例えばこのスクリプトを二度がけすると本体の座標を参照するため想定通りの挙動にはなりません。
なので、切り取り領域の座標を参照し、原点が変動することを考慮して計算するよう以下のように修正しました。
ついでに、縦長か横長かを判定して長辺を2分割する機能もつけております。


```
from PyPDF2 import PdfFileWriter, PdfFileReader
import copy
 
def split_pdf(input_pdf,  output_filename):
     pdf_file = PdfFileReader(open(input_pdf, 'rb'))
     marged = PdfFileWriter()
     page_num = pdf_file.getNumPages()
 
     for i in range(0, page_num):
         page_L = pdf_file.getPage(i)
         page_R = copy.copy(page_L)
 
         lx,ly,ux,uy = page_L.cropBox
         (w,h) = (ux-lx),(uy-ly)
         if w > h:
             page_L.cropBox.lowerRight = (lx+w/2, ly)
             page_R.cropBox.lowerLeft = (lx+w/2, ly)
         else:
             page_L.cropBox.lowerLeft = (lx, ly+h/2)
             page_R.cropBox.upperLeft = (lx, ly+h/2)
 
         marged.addPage(page_L)
         marged.addPage(page_R)
    outputStream = open(output_filename, "wb")
    marged.write(outputStream)
    outputStream.close()
```

## ソースコード
```
from PyPDF2 import PdfFileWriter, PdfFileReader
import copy


def split_pdf(input_pdf,  output_filename):
    pdf_file = PdfFileReader(open(input_pdf, 'rb'))
    marged = PdfFileWriter()
    page_num = pdf_file.getNumPages()

    for i in range(0, page_num):
        page_L = pdf_file.getPage(i)
        page_R = copy.copy(page_L)

        (w, h) = page_L.mediaBox.upperRight

        page_L.mediaBox.upperRight = (w/2, h)
        marged.addPage(page_L)

        page_R.mediaBox.upperLeft = (w/2, h)
        marged.addPage(page_R)

    outputStream = open(output_filename, "wb")
    marged.write(outputStream)
    outputStream.close()


def sample():
    input_pdf = "input.pdf"
    output_filename = "output.pdf"
    split_pdf(input_pdf, output_filename)


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

## 使い方
split_pdf()に対して、分割するpdfファイルと、出力する際のファイル名を与えることでpdfファイルを2分割します。


## 簡単な解説
一つのページを左ページ用と右ページ用に2つ用意します。（page_L, page_R）

ページは左下を始点とするので、右上の座標から横幅と高さを取得します。(w, h)

左ページには右側の、右ページには左側の座標を指定することで、それを基準にそれぞれ切り取ります。

今回は、左ページには右上の座標を (w/2, h)、右ページには左上の座標を (w/2, h)として指定し、左右に2分割しています。

蛇足、右ページについては`page_R.mediaBox.lowerLeft = (w/2, 0)`とした方が分かりやすいのかもしれません。


## 使い方の例
自分は以下のように使っています。追加、変更分のみ書きます。

```python
import sys, os

def main():
    argv = [sys.argv[i] for i in range(1,len(sys.argv))]
    for input_pdf in argv:
        basename_without_ext = os.path.splitext(os.path.basename(input_pdf))[0]
        output_filename = "split_{}.pdf".format(basename_without_ext)
        print("{}を2分割します。".format(os.path.basename(input_pdf)))
        split_pdf(input_pdf, output_filename)
        

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

引数を取得して、for文で回してsplit_pdfに渡します。出力ファイル名は入力ファイル名の先頭にsplit_を付けたものになります。


## 参考にさせていただいたもの
[見開き中央綴じ資料をスキャンしたPDFをページ毎に分割する（Qiita：
@hrb23m）](https://qiita.com/hrb23m/items/0a453377d853800fc585)

[中心のずれた見開きスキャンPDFを２ページに分割する方法（Python,pypdf）（技術メモ集）](https://www.robotech-note.com/entry/2018/04/28/中心のずれた見開きスキャンPDFを２ページに分割す)
icaclsコマンドで削除できないファイルを作る

# 概要

ファイルの削除失敗時の処理を実装する場合など、動作の検証用として削除できないファイルを作りたいことがあると思います。
Windowsのファイルのプロパティのアクセス許可からGUIの操作で削除を禁止することもできますが、本記事ではicaclsコマンドを使用した方法を紹介します。

# icaclsコマンドとは

Integrity Control Access Control Listの頭文字を取ったWindowsのネイティブコマンドです。
ファイルやフォルダーのセキュリティ記述子の表示や変更を行うことができます。
このコマンドはWindows Server 2003以降であれば使用できます。

# ファイルの削除を禁止するための手順

## 1. ファイルの所有者を確認する

PowerShellのGet-Aclコマンドが便利ですので、このコマンドを使用して削除を禁止したいファイルの所有者を確認します。
コマンドプロンプトから以下のコマンドを実行します。

```
PowerShell Get-Acl (削除を禁止したいファイルのフルパス)
```

コマンドを実行すると以下のような内容が表示されます。

```
C:\>PowerShell Get-Acl C:\test\can_not_delete.txt


    ディレクトリ: C:\test


Path               Owner          Access
----               -----          ------
can_not_delete.txt test           BUILTIN\Administrators Allow  FullControl...
```

Ownerの列を確認することでファイルの所有者が分かります。
この例ではtestユーザーがファイルの所有者となっています。

## 2. icaclsコマンドで削除のアクセス許可を拒否する

ファイルの所有者が確認できたらicaclsコマンドを使用して削除のアクセス許可を拒否します。
コマンドプロンプトから以下のコマンドを実行します。

```
icacls (削除を禁止したいファイルのフルパス) /deny (ファイルの所有者):D /T /C /L /Q
```

コマンドを実行すると以下のような内容が表示されます。

```
icacls C:\test\can_not_delete.txt /deny test:D /T /C /L /Q
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
```

コマンドが正常に処理されると削除のアクセス許可が拒否となり、ファイルの削除が行えなくなります。
試しにエクスプローラーからファイルの削除を行うと、アクセスの拒否が発生することが確認できます。
ファイルの削除を行うためには管理者の権限が必要となり、現在のログインユーザーではファイルの削除が行えません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/103150a8-1ebd-6268-a6bc-77fba92e2416.png)

PowerShellのGet-Aclコマンドからも削除が禁止されていることが確認できます。

```
C:\>PowerShell Get-Acl C:\test\can_not_delete.txt


    ディレクトリ: C:\test


Path               Owner          Access
----               -----          ------
can_not_delete.txt test           test Deny  Delete, Synchronize...
```

## 3. 削除のアクセス許可を元に戻す

削除の禁止を解除する場合は以下のコマンドを実行します。
/remove:dオプションによってアクセスの拒否が設定された権限がすべて解除されます。

```
icacls (削除を禁止を解除したいファイルのフルパス) /remove:d (ファイルの所有者) /T /C /L /Q
```

コマンドを実行すると以下のような内容が表示されます。

```
icacls C:\test\can_not_delete.txt /remove:d test /T /C /L /Q
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
```

ファイルのアクセス許可がフルコントロールに戻りました。

```
C:\>PowerShell Get-Acl C:\test\can_not_delete.txt


    ディレクトリ: C:\test


Path               Owner          Access
----               -----          ------
can_not_delete.txt test           BUILTIN\Administrators Allow  FullControl...
```

# オプションリファレンス

## アクセス許可

|オプション|説明|
|:---|:---|
|/grant:r|アクセス許可を新しいアクセス許可に置き換えます|
|/grant|既存のアクセス許可に許可を追加します|
|/deny|既存のアクセス許可に拒否を追加します|
|/remove:g|アクセス許可のうち許可された権限をすべて削除します|
|/remove:d|アクセス許可のうち拒否された権限をすべて削除します|

## 権限の種類

### 単純な権限

|オプション|説明|
|:---|:---|
|N|アクセス権なし|
|F|フルアクセス権|
|M|変更アクセス権|
|RX|読み取りと実行のアクセス権|
|R|読み取り専用アクセス権|
|W|書き込み専用アクセス権|
|D|削除アクセス権|

### 特定の権限

|オプション|説明|
|:---|:---|
|DE|削除|
|RC|読み取り制御|
|WDAC|DAC の書き込み|
|WO|所有者の書き込み|
|S|同期|
|AS|システムセキュリティへのアクセス|
|MA|無制限|
|GR|一般的な読み取り|
|GW|一般的な書き込み|
|GE|一般的な実行|
|GA|一般的なすべての操作|
|RD|データの読み取り/ディレクトリの一覧表示|
|WD|データの書き込み/ファイルの追加|
|AD|データの追加/サブディレクトリの追加|
|REA|拡張属性の読み取り|
|WEA|拡張属性の書き込み|
|X|実行/スキャン|
|DC|子の削除|
|RA|属性の読み取り|
|WA|属性の書き込み|

特定の権限を使用する場合は括弧内にカンマ区切りで指定します。

## その他

|オプション|説明|
|:---|:---|
|/T|指定されたディレクトリ以下のすべての一致するファイルとディレクトリに対してアクセス許可を設定します|
|/C|エラー発生時はエラーメッセージを表示して処理を継続します|
|/L|シンボリックリンクに対して処理を行います|
|/Q|処理が成功した際にメッセージを抑制します|
Windows の Atom で Pylint

# 本題

**C:\Users\\<ユーザー名>\AppData\Roaming\Python\Python38\Scripts\pylint.exe**

設定（`ctrl` + `,`）> パッケージ > コミュニティパッケージ > linter-pylint > 設定 > Settings > Executable Pathに上記のパスを設定する。Pythonのバージョンとかは適宜変更してください。

# おまけ

## 概要

Atomのセットアップするたびに躓くので設定手順を書き残しておこうと思いました。

## インストール

Atomのパッケージ（linter-pylint）は、Atom内でインストールすればいいと思う。

```setup_pylint_atom.sh
pip install pylint
apm install linter-pylint
```

## 環境

- Windows Home 10 2004
- Atom 1.49.0
    - linter-pylint 2.1.1
- Python 3.8.5
    - python.org からダウンロード
    - 全ユーザーにインストール
    - PATH追加済み
    - pylint 20.2.1


## さいごに

解決しましたか？
AWS CLI DynamoDBのテーブル作成時にJSONにテーブル名を指定せずに作成する方法

## 概要

AWS CLIでDynamoDBのテーブルを作成するときにテーブル名はcliで実行時に指定したかったので、その方法のメモ。

## JSON

```json
{
    "AttributeDefinitions": [
        {
            "AttributeName": "id",
            "AttributeType": "S"
        },
        {
            "AttributeName": "artist",
            "AttributeType": "S"
        }
    ],
    "KeySchema": [
        {
            "AttributeName": "id",
            "KeyType": "HASH"
        }
    ],
    "TableName": "testTable",
    "BillingMode": "PAY_PER_REQUEST"
}

```

上記のように`TableName`を指定するサンプルは多いと思います。

それを以下のように`TableName`を削除します。

```json
{
    "AttributeDefinitions": [
        {
            "AttributeName": "id",
            "AttributeType": "S"
        },
        {
            "AttributeName": "artist",
            "AttributeType": "S"
        }
    ],
    "KeySchema": [
        {
            "AttributeName": "id",
            "KeyType": "HASH"
        }
    ],
    "BillingMode": "PAY_PER_REQUEST"
}
```

## CLI

`--table-name`オプションを使用して、以下のようにするとJSONでテーブル名を指定せずにテーブル作成が出来ます。
こうすることで、基本構造だけを定義したJSONを使用して、デモ環境用のテーブルを作成しやすいかと思います。

```sh
aws dynamodb create-table --table-name 'TestTable' --cli-input-json file://hoge.json
```
pythonでcodec can't decode byteが出たときのこと

# こんなエラーが出る

```
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x98 in position 6615: invalid start byte
```
```
UnicodeDecodeError: 'shift_jis' codec can't decode byte 0xff in position 4729: illegal multibyte sequence
```

# こういうときはエンコードを指定する

```python:
f = open(filename, encoding='CP932')
```

|encode|
|:--|
| UTF-8 |
| Shift_JIS |
| EUC-JIS |
| ISO-2022-JP |
| CP932 |

# Shift_JISって聞いてるのにエラーになるとき

CP932を指定したらうまくいくかも（重要）
[Git] fatal: refusing to merge unrelated historiesを解決する話

## TL;DR

`git merge --allow-unrelated-histories origin/master`をする!

※ 2020/12/01追記
2020年10月より， デフォルトブランチがmasterからmainに変更になりました.(https://github.com/github/renaming) なので， 新しく作った方は

`git merge --allow-unrelated-histories origin/main`になります！

## なにが起きたの?

1. GitHub上でリポジトリを作り， READMEを作成した．
1. ローカルで`git init`してリポジトリを作り， `git remote add origin <GitHubのリポジトリ>`でリモートリポジトリを指定．
1. ローカルで作業を行い，コミットしプッシュを行おうとした．

プッシュを行おうとしたら, 下のようになった．

```bash
To https://github.com/<user>/<repo_name>.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/<user>/<repo_name>.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

```

プッシュできなかったので，言われた通りにプル `git pull origin main` ~~`git pull origin master`~~を行なった．※2020/12/01　追記 
すると, 下のようになった．

```bash
From https://github.com/<user>/<repo_name>
 * branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories
```

`fatal: refusing to merge unrelated histories`と表示されプルできなかった．

## 解決策

git mergeコマンドに`--allow-unrelated-histories`のオプションを使いして実行する．


```bash
git merge --allow-unrelated-histories origin/master
```

mainブランチがデフォルトのとき

```bash
git merge --allow-unrelated-histories origin/main
```

すると![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487681/6b8dd378-1f39-04fd-a711-4be03ccc1863.png)

のようにマージが行われ，無事にプッシュ作業が行うことができる！

## どうしてこうなった?

通常のマージでは，共通の祖先から分岐したブランチ同士が結合される．しかし，今回の例では，Githubでのコミット，ローカルでのコミットはそれぞれ共通の祖先がない状態から行われてしまっている．このため，マージを行うことができなかった．

しかし`--allow-unrelated-histories`オプションをつけると，共通の祖先を持っていないブランチ同士でもマージ作業を行うことができる．

## 所感

今回起きた問題は， リポジトリ作りたての一番はじめだけしか起こることがない珍しいケースだと思う．

(--orphan　オプションをつけてブランチを作成すると，既存ブランチと完全に独立したブランチを作れるため，一応おこりえる?)

## 参考にしたサイト

https://blog.clock-up.jp/entry/2018/12/01/git-merge-allow-unrelated-histories
AWS firelens(Fluent Bit)でログを分割する方法と複数の場所に転送する方法

aws firelensを使って、ECSのログ収集をする時に以下のような複雑なことをやろうとする場合は自前でfluent bitの設定を変更する必要があって、具体的にはfluent bitの設定を自分で定義してそれを読み込んだコンテナを用意する必要があります。

* 複数の場所にログを転送する
* ログを分割する

## やり方
extra.confを用意して、用意したファイルを読み込んだコンテナを作成する。
コンテナの作成の仕方は[こちら](https://qiita.com/SoarTec-lab/items/4e098da16b787841d423)を参照してください。
この記事ではextra.confの書き方だけを残しています。

```
# cw logs
[OUTPUT]
    Name cloudwatch
    Match   *
    region us-east-1
    log_group_name fluent-bit-cloudwatch
    log_stream_prefix from-fluent-bit-
    auto_create_group true

# kinesis
[OUTPUT]
    Name   firehose
    Match  *
    region us-west-2
    delivery_stream stream-one

[OUTPUT]
    Name   firehose
    Match  *
    region us-west-2
    delivery_stream stream-two
```

`Match`の正規表現を作り込むことで例えば、ログレベルごとにログを収集することができます。
また`[OUTPUT]`を複数定義することで複数の場所にログを転送することができます。
ECSでFirelensを使ってsidecar方式で複雑なログ収集を実現する方法

aws firelensを使って、ECSのログ収集をする時に以下のような複雑なことをやろうとする場合は自前でfluent bitの設定を変更する必要があって、具体的にはfluent bitの設定を自分で定義してそれを読み込んだコンテナを用意する必要があります。

* 複数の場所にログを転送する
* ログを分割する

## やり方

### 1. docker imageを作成する

以下の様に設定ファイルを作ってそれを取り組んだdocker imageを作成してECSで使うパターン。

例えば、docker/fluent-bitディレクトリを作って以下の様にファイルを配置する

```
Dockerfile
fluent-bit.conf
parser.conf
stream_processing.conf
```

Docker file内で設定ファイルをADDしていってます。

```
FROM amazon/aws-for-fluent-bit:latest
ADD fluent-bit.conf /
ADD parser.conf /
ADD stream_processing.conf /
```

このDockerfileで作ったimageをECS task definitionで起動する。

#### 参考 

https://github.com/aws-samples/amazon-ecs-firelens-examples/blob/mainline/examples/splitting-log-streams/fluent-bit/custom-fluent-bit-image/Dockerfile

### 2. task defで設定ファイルを読み込むパターン

task definitionに設定ファイルを読み込ませるオプションを渡して、その設定ファイルを読み込ませたECS taskを起動させるパターン

task definitnionの中のoptionでextra.confを渡してあげる事で、その設定でfluent bitを起動してくれる。

imageを自分で作って管理する必要がない。

```
"options": {
	"config-file-type": "s3",
	"config-file-value": "arn:aws:s3:::yourbucket/yourdirectory/extra.conf"
}
```

#### 参考
https://github.com/aws-samples/amazon-ecs-firelens-examples/blob/mainline/examples/fluent-bit/send-to-multiple-destinations/task-definition.json#L13-L14
Github Action内でDynamoDB Localを使用する

## 概要

DynamoDB Localを使ったテストをGithub Action内で実行するためのyml


## github action

`.github/workflows/main.yml`

```yml
steps:
  - name: Setup DynamoDB Local
    uses: rrainn/dynamodb-action@v2.0.0
    with:
      port: 8000
      cors: '*'
  - name: Create Table
    run |
      aws dynamodb create-table --cli-input-json ./hoge.json --region ap-northeast-1 --endpoint-url http://localhost:8000
    env:
      AWS_ACCESS_KEY_ID: hoge
      AWS_SECRET_ACCESS_KEY: hoge
  - name: test
    run: go test
    env:
      AWS_ACCESS_KEY_ID: hoge
      AWS_SECRET_ACCESS_KEY: hoge
```

のようにする必要がある。

## ハマりポイント

ハマりポイントとしては、テーブルを作成するセクションでawsのキーを設定する必要があり、これはDocに書いてなかったので、結構ハマった。

## テスト

テスト側では、http://localhost:8000をエンドポイントに指定して、リージョンに`ap-northeast-1`を指定するとDynamoDB Localに接続出来ると思います。
docker-composeでjenkins構築

## 目的
[「Docker/Kubernetes実践コンテナ入門」](https://www.amazon.co.jp/dp/4297100339/ref=cm_sw_em_r_mt_dp_FP9kFbV4CBA7T)を読んでいて、
手順通りでは進まない箇所があったのでエラーを出さず進めるために書きます。

[追記2020/08/10]
出版社さんのページで正誤表が掲載されています。
この本で詰まっているところがありましたら確認してもらえると解決するかもしれません。
https://gihyo.jp/book/2018/978-4-297-10033-9/support

## 修正箇所
コメントアウトで修正箇所と気になったとことをメモしています。

```docker-compose.yml
version: "3"
services:
  master:
    container_name: master
    # jenkins:2.60.3からjenkins/jenkins:ltsに修正します。
    image: jenkins/jenkins:lts
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
    links:
      - slave01

  slave01:
    container_name: slave01
    # slaveのイメージはこのままでOK。
    image: jenkinsci/ssh-slave
    environment:
    # id_rsa.pubのキーをコピーします。
      - JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa AXXXXXXXX

```

## 気になって調べた所
1. imageの取得元であるDockerHubの[jenkins公式ページ](https://hub.docker.com/r/jenkins/jenkins
)に行くと、使い方が書いてありました。
>To use the latest LTS: docker pull jenkins/jenkins:lts

2. jenkinsci/ssh-slaveはそのままで使えました。
slaveの方もこのままで良いのか疑心暗鬼になったので、調べたら
[DockerHubにページ](https://hub.docker.com/r/jenkinsci/ssh-slave/)が有りました。
進捗管理について

※　随時更新する

### 進捗管理で気をつけていること

##### 進捗率の認識のズレを防ぐ
進捗率で管理すると、個々人で進捗率の意味が違うことがよくあります。
10% = 作業開始、80% = レビュー前完了　など、進捗率の定義を行い、認識合わせを行いましょう。

または進捗率に頼らず、作成物の想定ページ数などで管理できるといいかもしれません。

##### 報告しやすい雰囲気作り
人間同士のやり取りのため、信頼関係が重要ですね。

遅れたことは仕方がないので許容する、しかし、次に同じことが起きないように原因と対策を考えることを心がけてもらうようにする。

##### 報告スパンを考えてタスクの粒度を決める

日次での報告なのに、5日間のタスクがあると進捗状況がわかりづらくなってしまいます。
3日目までは遅れていても、最後に帳尻合えばいいと思って、オンスケで報告しがちではないでしょうか。
報告スパンを考えて、タスクを分解すべきかと思います。日次の場合、理想は8hかと思っています。週次であれば40h。
完了したや50%など状況がわかりやすいレベルにタスクを落とし込んで管理するのがベスト。
React のトラブルについて

<h1>Reactの設定とHttpのシステムがわからない</h1> 
<p> 環境開発からつまづいた。Macbook Proを買ったのはいいけれど、システムを知らなかった。</p>    
<dl>
  <dt>1.local HTTP serverとは何か？</dt>
  <dd>local serverでは、ダメだと出て、Firefoxとsafariで試すもエラーが出た</dd>
  <dt>2.クロスオリジン要求を拒否をされましたという警告が出た</dt>
  <dd>リモートソースの要求は拒否されますという理由の意味が分からない</dd>
<dt>3.1,2の問題に大して、いずれもReactのHPにあるコードをどこで入力するのか？</dt>
  <dd>HTTPS=true npm startのコードは、zshの場合を試してみます。
</dl>