OmniAICreator/Qiita-1.07M huggingface dataset:
ハッシュの基本

ハッシュとは、データとそれに対応する名前のセットを要素として持つ値のことです。
例えば、

```ruby
puts hash.keys
puts hash.values
```

それぞれのメソッドを実行したときに

```ruby
puts hash.keys
#ターミナルでの出力
one
two
three


puts hash.value
#ターミナルでの出力
1
2
3

```

のように表示させていけれど
どのように記述をすれば良いでしょうか？


ハッシュにおいてはデータをバリュー、それに対応する名前をキーと呼びます。
ハッシュの宣言は、

```ruby
#波括弧を使って生成する
変数 = {}

#ハッシュの生成はハッシュロケットを使って生成できる
変数 = { キー1 => バリュー1, キー2 => バリュー2, キー3 => バリュー3 }
```

つまり、

```ruby
hash = { one => 1, two => 2, three => 3 }
```

のように生成することで、上記のように出力できます。

またハッシュはシンボルという値が使用されることが多くなっています。
シンボルの中身は数値になります。
シンボルの宣言は文字列の先頭にコロン：をつけます。
ハッシュのキーには文字列よりもシンボルを使うことが多いです。

```ruby
hash = { :name => "Taro" }
hash = { name: "Taro" }

#どちらも同じ要素
```
１つ目はキーが文字列を表していて、
２つ目と３つ目はキーがシンボルの場合は２通りの記法が使えます。

```ruby
hash = { "one" => 1, "two" => 2, "three" => 3 }
```

```ruby
hash = { :one => 1, :two => 2, :three => 3 }
```

```ruby
hash = { one: 1, two: 2, three: 3 }
```



上記のように記述をすることができます。
Reactのdrag and dropをTypeScriptで書いてみた

# 概要
- 内容：SVGのドラッグアンドドロップのReactで書かれたコードをTypeScriptで書いてみました。　ReactによるSVGの操作についての記事は、あまり見つけられなかったので参考になれば嬉しいです。

- 元コード（sand box）： https://codesandbox.io/s/blov5kowy?from-embed=&file=/index.js:0-1686


- 変換後のコード（github）: https://github.com/dai-a/react_drag/commit/01161518db5c1d3f0b1a12de5549ce29bbb7fd6f?branch=01161518db5c1d3f0b1a12de5549ce29bbb7fd6f&diff=split

# 左：元コード　　右：変換後のコード
![スクリーンショット 2021-01-02 16.58.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/990981/726246c7-a798-ff3d-e7a8-a9c0cab08e89.png)

# 感想
- 相変わらずTypeScriptで書く意味があまりわかっていないものの、とりあえず動くコードになったためよしとします。
ActiveRecordのwith_lockとキャッシュの関係

# 背景
こんなコードを書いた時にふとこのコードってどうなっているんだ？
となったので実際のRailsのコードを読んでみました。

やりたいことは1つのHogeに対して外部APIを必ず1回しか呼ばないようにして、その結果をFugaに保存する。

```rb
class Hoge < ActiveRecord::Base
  has_oen :fuga

  def piyo
    return fuga if fuga.present? # <- ロック取りたくないから事前に関連があるか確認
    with_lock do
      reload # <- fugaのキャッシュを消したい ※1
      return fuga if fuga.present?

      result = call_api
      create_fuga(**result)
    end
  end

  private

  def call_api
    # call api
  end
end

class Fuga < ActiveRecord::Base
  belongs_to :hoge
end
```

当初※1のreloadがなくてこれってfugaがキャッシュされていてタイミングissue発生するのでは？と思ったのですが、
specでどうしてもエラーケースを再現できずRailsのコードを読んでみた。

https://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html

```rb
# https://github.com/rails/rails/blob/914caca2d31bd753f47f9168f2a375921d9e91cc/activerecord/lib/active_record/locking/pessimistic.rb#L82-L90

# Wraps the passed block in a transaction, locking the object
# before yielding. You can pass the SQL locking clause
# as argument (see <tt>lock!</tt>).
def with_lock(lock = true)
  transaction do
    lock!(lock)
    yield
  end
end
```
というわけでsee lock!

```rb
# https://github.com/rails/rails/blob/914caca2d31bd753f47f9168f2a375921d9e91cc/activerecord/lib/active_record/locking/pessimistic.rb#L63-L80

# Obtain a row lock on this record. Reloads the record to obtain the requested
# lock. Pass an SQL locking clause to append the end of the SELECT statement
# or pass true for "FOR UPDATE" (the default, an exclusive row lock). Returns
# the locked record.
def lock!(lock = true)
  if persisted?
    if has_changes_to_save?
      raise(<<-MSG.squish)
        Locking a record with unpersisted changes is not supported. Use
        `save` to persist the changes, or `reload` to discard them
        explicitly.
      MSG
    end

    reload(lock: lock)
  end
  self
end
```

なるほど〜ん
persisted?の時には内部でreload読んでくれてるんですね。。
どうりでテスト落ちないわけですわ
というわけでreload追加する必要がないとわかってspecのケースだけ追加しましたとさ
Javaで正規分布・対数正規分布の乱数を生成する

# はじめに

Javaで乱数を生成したい場合、まず思いつくのは `Math.random()` かと思います。
ただし、これで得られる値は一様分布であり、どの値もおなじ確率で現れるため、以下のようなダミー値を作りたい場合には適しません。

- テストの点数…平均点が最も現れやすく、平均点から離れるほど現れにくくなる分布 → **正規分布**
- 世帯年収…グラフ中心から右側に長く広がる分布 → **対数正規分布**

それぞれ頑張って計算式を書いても良いのですが（頑張って書いてしまったのですが）、ライブラリがあったのでそれを使いましょう。

# 正規分布

`java.util.Random` の `nextGaussian` を使います。

[Random.html](https://docs.oracle.com/javase/jp/6/api/java/util/Random.html)

```java
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class GaussianTest {

    @Test
    public void nextGaussianTest() {
        Random random = new Random();

        List<Double> results = IntStream.rangeClosed(1, 100000).boxed()
                .map(i -> random.nextGaussian() * 20 + 50) // 標準偏差20、平均50
                .collect(Collectors.toList());

        printResults(results);
    }

    private void printResults(List<Double> results) {
        for (int i = 0; i < 20; i++) {
            int start = i * 5;
            int end = (i + 1) * 5;
            double ratio = results.stream().filter(val -> (val >= start && val < end)).count() / 100000d * 100;
            System.out.println(start + "〜" + end + ": " + IntStream.rangeClosed(1, (int) ratio).mapToObj(val -> "■").collect(Collectors.joining("")));
        }
    }
}
```

こんな感じの分布になります。

```shell
0〜5: 
5〜10:  ■
10〜15: ■
15〜20: ■■
20〜25: ■■■
25〜30: ■■■■■
30〜35: ■■■■■■
35〜40: ■■■■■■■■
40〜45: ■■■■■■■■■
45〜50: ■■■■■■■■■
50〜55: ■■■■■■■■■
55〜60: ■■■■■■■■■
60〜65: ■■■■■■■■
65〜70: ■■■■■■
70〜75: ■■■■■
75〜80: ■■■
80〜85: ■■
85〜90: ■
90〜95: ■
95〜100: 	
# (※軸を揃えるためにスペースの数を調整してます)
```

# 対数正規分布

Apache Commonsの`LogNormalDistribution`を使います。

[LogNormalDistribution.html](https://commons.apache.org/proper/commons-math/javadocs/api-3.3/org/apache/commons/math3/distribution/LogNormalDistribution.html)

```java
import org.apache.commons.math3.distribution.LogNormalDistribution;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class GaussianTest {

    @Test
    public void logNormalDistributionTest() {
        double MU = 3.0; // ln(x)の平均μ 大きいほどグラフの右側が伸びる
        double SIGMA = 1.0; // ln(x)の標準偏差σ 大きいほどグラフが横に広がる
        LogNormalDistribution distribution = new LogNormalDistribution(MU, SIGMA);

        List<Double> results = IntStream.rangeClosed(1, 100000).boxed()
                .map(i -> distribution.sample())
                .collect(Collectors.toList());

        printResults(results);
    }

    private void printResults(List<Double> results) {
        // 略
    }
}

```

結果はこうなりました。

```shell
0〜5:   ■■■■■■■■
5〜10:  ■■■■■■■■■■■■■■■■
10〜15: ■■■■■■■■■■■■■■
15〜20: ■■■■■■■■■■■
20〜25: ■■■■■■■■
25〜30: ■■■■■■
30〜35: ■■■■■
35〜40: ■■■■
40〜45: ■■■
45〜50: ■■
50〜55: ■■
55〜60: ■■
60〜65: ■
65〜70: ■
70〜75: ■
75〜80: ■
80〜85: 
85〜90: 
90〜95: 
95〜100: 
```

# 参考

[keisan.casio.jp 正規分布（グラフ）](https://keisan.casio.jp/exec/system/1161228881)
[keisan.casio.jp 対数正規分布（グラフ）](https://keisan.casio.jp/exec/system/1161228861)
pip installで導入したモジュールのインポート時にVSCodeでエラーが発生するときの対処法

## 記事の対象者
[Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)導入者向けです。

## モジュールはあるのになぜかエラー

初学者は意外とハマったりするんじゃないかなと。
当時の自分はハマりました。

1. pip installで導入したdjangoのモジュールにコードジャンプできない
1. 自作モジュールをimportするとエラーが発生し、クイックフィックスが無効

![スクリーンショット 2021-01-02 16.45.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986732/4d731824-6174-7fe9-a979-c2aad42a6222.png "ex.インポートエラー")

## 環境 

- OS: macOS Catalina
- エディタ: VSCode
- 拡張機能として[Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)を導入


## 結論
検索パスが通っていませんでした。恥ずかしい。

[Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)の設定項目に対象モジュールの検索パスを追加すると解消できます。

### settings.jsonにモジュールの検索パスを追加する
```python.analysis.extraPaths```を追加し、検索対象モジュールのフルパスを記述します。

```Java:settings.json
    "python.analysis.extraPaths": [
       
        //Djangoライブラリの格納ディレクトリ
        "/Users/user_name/.pyenv/versions/3.9.0/lib/python3.9/site-packages",        
        //プロジェクトのルートディレクトリ
        "/Users/user_name/workspace/project_name",
    ],
```
---
エラーが解消され、コードジャンプ、クイックフィックスが有効。よかった。
![スクリーンショット 2021-01-02 16.43.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986732/478a0ba6-a1ea-bfbb-4b61-ce2e7d221702.png)
GitHubもCodeCommitも使いたい（Gitで複数リポジトリのアカウントを扱う方法）

# 何を解決するか？
1台のPCから GitHub と AWS CodeCommit の両方をCloneして扱うことができるようにします。
Git の使い方を説明した多くの記事では、単一のホスティングサービスを前提としており、複数のホスティングサービスの設定を持つ方法についての説明が不足してたので、この記事を書きました。

# 要約
GitHub と CodeCommit のアカウント(ユーザー名、メールアドレス）は当然ですが、別々のものになりますので、これを Git でどうやって設定するかという話になります。

簡単に説明すると、アカウント設定は .gitconfig に持ちますが、これをホスティングサービス毎に分け、Clone先ディレクトリ名で判断して、これを切り替えるように設定します。

この記事では Git for Windows (https://gitforwindows.org/) で試していますが、恐らく Linux や Mac でも同じです。

# 手順1: ホスティングサービス毎にClone先ディレクトリを作る
まず最初にホスティングサービスのClone先ディレクトリを作ります。今回は Cドライブの repos 直下に github, codecommit の2つのディレクトリを作りました。

```
mkdir C:\repos\codecommit
mkdir C:\repos\github
```

# 手順2: ホスティングサービス枚に.gitconfigを分ける
Windows では .giconfig は C:\Users\<user_name>\.gitconfig にあります。同じディレクトリに.gitconfig_github, .gitconfig_codecommit を作ります。ファイルの中身は次のようにします。

```text:.gitconfig_codecommit
[http]
[user]
	name = codecommitで使うユーザー名
	email = codecommitで使うメールアドレス
```

```text:.gitconfig_github
[http]
[user]
	name = githubで使うユーザー名
	email = githubで使うメールアドレス
```


# 手順3: git config を設定する
次のコマンドを実行して、Clone先パスに "github" が含まれる場合は .gitconfig_githubを使うように設定します。また、githubの場合も同様に.gitconfig_githubを使うように設定します。

```winbatch
git config --global includeIf."gitdir:**/codecommit/".path ".gitconfig_codecommit"
git config --global includeIf."gitdir:**/github/".path ".gitconfig_github"
```

上記のコマンドを実行すると、.gitconfig は次のように変更されます。

```text:.gitconfig
[http]
[user]
	useConfigOnly = true
~ ~ ~ 中略 ~ ~ ~
[includeIf "gitdir:**/codecommit/"]
	path = .gitconfig_codecommit
[includeIf "gitdir:**/github/"]
	path = .gitconfig_github
```

# 手順4: 設定の確認
設定が正しくできているか、codecommitディレクトリに確認用のtestrepoを作成して設定を確認します。

```winbatch
cd c:\repos\codecommit
mkdir testrepo
git init
git config user.name
rem codecommitで使うユーザー名が表示されます
git config user.email
rem codecommitで使うメールアドレスが表示されます。
```
同様にgithubディレクトリでも確認します。

```winbatch
cd c:\repos\github
mkdir testrepo
git init
git config user.name
rem githubで使うユーザー名が表示されます
git config user.email
rem githubで使うメールアドレスが表示されます。
```

以上で設定は完了です。

# まとめ
この記事では設定ファイルをパス名を条件に切り替える方法をまとめました。今回はcodecommit, githubで分けましたが、この方法を応用することでプロジェクトごとに設定を変えることも可能です。設定にはユーザー名やメールアドレスだけでなく、プロキシ設定なども分けることができます。うまく使うことで素晴らしいgitライフが待っていることでしょう。

## 参考
最後になりますが、今回の記事の参考にさせていただいたページをご紹介します。ありがとうございました。

- [kakakakakku blog: includeIf を使って git config をプロジェクトごとに読み替える](
https://kakakakakku.hatenablog.com/entry/2019/11/06/114926)
- [git-config (公式リファレンス)](https://git-scm.com/docs/git-config)
【express】POSTデータを受け取る

#やりたいこと
`express`でpostされたデータを取得したい

#環境
express: 4.16.1
(express-generatorでプロジェクト作成)

#やりかた
ぐぐると`body-parser`を入れて、`require('body-parser')`みたいなのしているのを見る
しかし、現在は最初からやってくれている

```js:app.js
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
// ここ
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
```

ので下記のように使うだけの模様
特定のプロパティとるならそのままアクセスする

```js:router/index.js
router.post('/', function (req, res, next) {
  console.log(req.body);
  console.log(req.body.name);
});
```
DockerをAWSで立ち上げる初学者へ

# 前提
- Dockerについてある程度理解がある
- 初学者(むしろ私が初学者)向け

# ゴール
AWSでDocker環境を立ち上げるためにどのような方法があるのかを知り、
次のステップへの足がけになる。

# なぜAWS?
別にAWSにこだわりがあるわけではなく、自社サーバーでDockerを動かす時のつらみです。
本番環境でアプリケーションを動かす場合には冗長構成を取ることが多いです(取られていないとなかなか...)
これを手動で行う場合、Dockerをn回起動して、プロセスが死んだらまたsshしてDocker起動して...みたいな運用が始まります。
そこでオーケストレーション層を入れることが検討されます。
この層ではDockerをnプロセス立ち上げてバランシングする。もしもプロセスが死んだら新しいプロセスを起動する。デプロイの時にはローリングアップデートしてといったことをやってくれます。
ここで一つの問題に当たります。
「オーケストレーションしてくれているプロセス(マスター)が異常をきたした時、サービス全体のデリバリーが危うくなる。」
なので手動でオーケストレーションを行う時にはマスターを冗長構成にして...ということが必須になります。
AWSではこのマスターの管理をフルマネージドでやってくれるサービスが複数出ているので、どんなDockerをいくつどういうふうに配置するのかということだけに集中できます。

# Dockerを稼働させるための候補
- [EB (AWS Elastic Beanstalk)](https://aws.amazon.com/jp/elasticbeanstalk/)
- [ECS (Amazon Elastic Container Service)](https://aws.amazon.com/jp/ecs/)
- [EKS (Amazon Elastic Kubernetes Service)](https://aws.amazon.com/jp/eks/)

## EBとは？
> お客様はコードをアップロードするだけで、Elastic Beanstalk が、キャパシティのプロビジョニング、ロードバランシング、Auto Scaling からアプリケーションのヘルスモニタリングまで、デプロイを自動的に処理します。

production環境で利用するためにはいくつか検討する必要がありますが、
コードをデプロイ(マネコンからアップロードも可能)するとネットワーク上にいい感じにEC2の配置・ロードバランシング・スケーリングなどをやってくれます。

#### 個人的メリデメ
- メリット
    - 学習コストが一番少ない(個人的感想)
    - インフラ要件が低い・インフラに強いエンジニアがいない場合において、バックエンドエンジニアでも管理がしやすい
- デメリット
    - EB依存のコードを一部書く必要がある
    - EC2の管理が必要になる

## ECSとは？
> フルマネージド型のコンテナオーケストレーションサービス

AWSが提供しているフルマネージド型のコンテナオーケストレーションサービスです。
AWS純正なので他のAWSサービスと親和性高くシームレスな連携がしやすい。
逆にいうとAWSの他のサービスを利用しないと要件満たないケースが多い印象。。
「Dockerを動かすこと」をしてくれるサービスなのでバッチの定期実行やデプロイ時にバッチを動かすなどはある程度自前でやる必要がある。

起動タイプとしてEC2とFargate(コンテナ向けサーバーレスコンピューティング)がある。

#### 個人的メリデメ
- メリット
    - ECSを利用するための固定費がない(EC2やfargateの値段のみ)
    - EKSより簡単(とよく言われる)
        - 設定項目が少ないのは事実
- デメリット
    - アプリを動かすことしかサポートしていないのでデプロイやバッチを流すといったことに対して周辺のシステムの知識が必要

## EKSとは？
> AWS クラウドまたはオンプレミスで Kubernetes アプリケーションを開始、実行、スケーリングする柔軟性を支援します。

ossのKubernetesのマスターノードをAWSマネージドで提供されているサービスです。
KubernetesはDockerオーケストレーションのデファクトになるのではと言われているサービスで、カスタマイズ性が高く、アプリ起動やデプロイなどもKubernetesで提供されています。
EKS自体に毎月8千円くらい(毎時課金 0.10USD)かかる

起動タイプとしてEC2とFargateがある。

#### 個人的メリデメ
- メリット
  - Kubernetesがオープンソースなのでエンジニアからは割と好かれている印象(Dockerのデファクトスタンダードになるのではないかと言われている)
  - Kubernetesが割と手厚くやってくれる
  - カスタマイズできる範囲が広い
  - Kubernetesに連携した各種サービス(oss)が割と多いイメージ(ECSはAWSロックなのでそう言うのが少ない)
- デメリット
  - 固定費が馬鹿にならない
  - 設定項目が多いので一定辛い

# 雑観
インフラ明るい人が少ないのであればEBで立ち上げ、インフラに興味がある・インフラエンジニアがいるならECS/EKSの導入検討かなと思ってます。(要件によりますが)
ECSとEKSに関してはECS->EKSに乗り換えた会社さんもあるし、逆もあるので一概にどちらがとはなかなかいえないかなと思いますが、
インフラの潮流に乗るのであればKubernetesが好かれているような気がします。
(とはいえ私が関わるスモール立ち上げでは毎月の固定費が気になる)
US キーボード使いが Mac の画面共有越しにリモートの Google 日本語入力のモードをキーボードショートカットで切り替えるには

# 困ってたコト。

ソフトウェアエンジニアならいまどきリモートワークなんだが、

- 複数の Mac 使ってて
- 英語キーボード使いで
- Mac の画面共有でちょいちょい別のチーム向けの作業してたりして
- 仕事仲間とは日本語使ってるけどちょいちょい横文字混じってくる文章書いてる

横文字カタカナとかだせえので半角英数打ちたいけど画面共有越しだと Google 日本語入力のモード切り替えるのも難儀なんだわ。　Control + Space がローカルのほうに食われちまって接続先の方でモード切り替わってくんないワケ。毎回イラつきながらマウスでメニューバーからモード切り替えんのダリーの。

んでいろいろやってたらちっと一個見っけたんだわ。



# Control + Option + Space 使えばいいんだわ。

![rock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/997536/af76e0e1-6b37-eaa5-7579-35b78a6059ac.png)


&#8963; + &#8997; + space だとフォーカスあたってる方のマシンで入力モード切り替わってくれるんだわ。

これで俺の悩みは解決した。同じようなことで悩んでるやつが救われるといいんだが。
オンラインオセロを作ってHerokuにデプロイしてみた

# 環境
バックエンド：Node.js(Express)
ソケット通信：socket.io
フロントエンド：javascript
データベース: Redis
描画：HTML5 Canvas
デプロイ環境: Heroku

# 作ったもの
https://hazama-online-othello-game.herokuapp.com/

# 感想
初めて扱うものばかりで苦戦しましたが、下記の参考記事を読むことで、オンラインで遊べるゲームを実装でき、公開まで行うことができました。勉強になったので、別のオンラインゲームも作って、公開してみようと思います。

# 参考
 - オンラインリバーシの作り方： [ブラウザで動くオンライン対戦リバーシ作ってみた](https://kazzstorage.com/websocket-reversi-dev/)
 - Herokuを使ったデプロイの仕方： [【HEROKUとは】これを読めばOK!デプロイの仕方まで徹底解説](https://tech-camp.in/note/technology/16108/)
Jetson Nanoにsshログインする

# 本記事について

個人でJetson Nanoを利用しようとした時に、
Jetson Nanoに対してsshでログインして外部から作業をしようとした際につまづいたのでメモ書きとして残そうと思います。
( 別にこれをしなくてもsshログインは可能です。ですが、毎回IPアドレスを確認するなど必要だったり色々するので。。 )

## Jetson Nano側での設定

avahi-daemonをインストールします。
avahi-daemonによってmDNSが使用できるようになってローカルにDNSがなくても、
名前解決が可能になります。

```
~$ sudo apt-get install avahi-daemon
```
次にホスト名を変更します。
Jetson Nanoでは、初期ホスト名が{ユーザ名}-desktopになってました。
( 自分で設定したかもだけど。。 )
{ユーザ名}-desktopだとどれがJetson Nanoか忘れそうなので、
今回はホスト名をjetson-nanoに変更します。
変更するファイルは、以下の２つです。( ホスト名は同一にしてください )

- /etc/hostname
- /etc/hosts


~$ sudo emacs /etc/hostname
上記ファイルを以下に置き換えます。
``` /etc/hostname
jetson-nano
```


~$ sudo emacs /etc/hosts
127.0.1.1 jetson-nano のjetson-nano部分を任意にホスト名にします。

```  /etc/hosts
127.0.0.1	localhost
127.0.1.1	jetson-nano

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
```

ここで一度Jetson Nanoを再起動させます。

再起動後にターミナルを開き以下のようになっていたればOKです。

```
{ユーザ名}@jetson-nano:~$
```

現在のavahi-daemonの状況を確認します。

~$ sudo /etc/init.d/avahi-daemon status
以下はコマンド結果の部分抜粋ですが、下から2行目のように `jetson-nano.local`となっていれば成功です。
反映されていない場合は以下のコマンドを実行して再度確認してください。

~$ sudo /etc/init.d/avahi-daemon restart

```
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
   Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2021-01-02 15:45:47 JST; 22min ago
 Main PID: 3803 (avahi-daemon)
   Status: "avahi-daemon 0.7 starting up."
    Tasks: 2 (limit: 4174)
   CGroup: /system.slice/avahi-daemon.service
           ├─3803 avahi-daemon: running [jetson-nano.local]
           └─3903 avahi-daemon: chroot helper

```
## 動作の確認

実際にsshでJetson Nanoにログインして正しく動作していることを確かめましょう。

じぶんは、iPadで確認しました。( Termiusというアプリ )

アプリにsshの情報を入力して、実行してみるときちんとsshログインできていることがわかりました。( 添付画像参照 )
![1D0FCDB0-0292-4AB5-9988-8EC6722547D6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430353/21e08c26-1025-cce7-3ab2-235a00c6c639.png)

## 最後
Jetson Nanoにsshログインできたけど、なに作ろう。。
それでは
JUCEでデバイスの回転を検知する

JUCEでiOS向けアプリを書いていて、デバイスの回転(orientation change)を検知する方法。

##前提##
Projucerを使ってアプリ/プラグインのプロジェクトを作っている。

##検知方法##
まず、起動した時のサイズをチェック。

```sample.cpp
auto r = juce::Desktop::getInstance().getDisplays().getPrimaryDisplay()->totalArea;
setSize (r.getWidth(), r.getHeight()); 
```
これでデバイスのスクリーンサイズがわかる。iPad Pro 9.7inchなら1024x768か768x1024が返ってくる。このサイズでeditorのサイズをセットしておく。

その後、デバイスを回転するたびにAudioProcessorEditorクラスのresized()が呼ばれる。widthとheightが入れ替わるので、それに応じて自分のeditorを調整。ただし、Projucerのプロジェクト設定でチェックしてないScreen Orientationの時は呼ばれない。デフォルトでは180度(ポートレートの逆さま)はチェックが外れてるので、これが必要な時は自分でチェックしておくこと。iPhoneとiPadで設定は別々。この設定はそのままXcodeのTARGETS>General>Deployment Infoに反映されてる。
![projucer_orientation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/2e9ce4da-3d20-3f73-558e-20c0ad085d57.png)
Josh Skeen, David Greenhalgh著　『Kotlinプログラミング』　章末問題に挑戦(第１９章)

　[Josh Skeen, David Greenhalgh著『Kotlinプログラミング』](https://www.shoeisha.co.jp/book/detail/9784798160191)には章末問題がある。残念なことに解答がないので、[第１８章](https://qiita.com/guijiu/items/18e904913a429aaa58ea/)に引き続き本を読み進めながら答案を記述する。
　もし回答に間違いや意見があれば、ぜひご指摘いただきたい。

#第１９章　章末問題 回答案

##19.6　チャレンジ！　Mapのキーと値の関係を反転させる
　２つの方法でflipを行った。ひとつはMapの要素を直接入れ替える方法。もうひとつはMapをListに変換した後、それぞれの要素を入れ替える方法。
　以下に私の考えた方法を掲載しましたが、関数型プログラミングによるより良いコードをご教示いただきましたので、そちらを確認された方が良いと思います。次のアドレスをご参照ください。
【Kotlin備忘録】コレクション関数 map, filter + [おまけ（generateSequence）](https://qiita.com/watame/items/87b7923d4f3f59ffb653#おまけ)
　　　　　(teratailで[Mapの使い方と関数型プログラミングについて](https://teratail.com/questions/312969#reply-436842)にて質問し、教えていただきました。）
　また、Qiitaの質問コーナーで次のような方法のご教示も頂きました。
https://qiita.com/guijiu/questions/7508d9daf8e1b4ab73e4#answer-9bb0cc0f1f334fb4f333
https://qiita.com/guijiu/questions/7508d9daf8e1b4ab73e4#answer-56be38bf1c2ce2861bb8
さらに変数ですが、
https://qiita.com/guijiu/questions/7508d9daf8e1b4ab73e4#answer-ecbc8fc599945ffb7682
https://qiita.com/guijiu/questions/7508d9daf8e1b4ab73e4#answer-83d3713ecc38c149580b

また、型推論の書き方についてもアドバイス頂きましたのでご紹介します。
https://qiita.com/guijiu/items/b3a5b58317095561e1eb#comment-b8ee727206972b3e81de



```kotlin
fun main() {
    val gradesByStudent = mapOf("Josh" to 4.0, "Alex" to 2.0, "Jane" to 3.0)
    println(gradesByStudent)

    println("List方式flip：${flipValuesList(gradesByStudent)}")
    println("Map 方式flip：${flipValuesMap(gradesByStudent)}")

}

// Mapの要素を組み立てなおす方法
fun flipValuesMap(gradesByStudent: Map<String, Double>): Map<Double, String> {
    var abc: MutableMap<Double, String> = mutableMapOf()
    gradesByStudent.forEach { (k, v) ->
        abc.put(v, k)
    }
    return abc
}

// MapをListに直し、組み立てなおしMapに戻す方法
fun flipValuesList(gradesByStudent: Map<String, Double>): Map<Double, String> {
    var names: MutableList<String> = mutableListOf()
    var values: MutableList<Double> = mutableListOf()
    // gradesByStudentをリストに変化してからその要素nameとvalueを取り出し、それぞれをリストにする方法
    gradesByStudent.toList().forEach { names.add(it.first) }
    gradesByStudent.toList().forEach { values.add(it.second) }
    return values.zip(names).toMap()    // valuesにnamesを結合
}

```


##19.7　チャレンジ！　関数型プログラミングをTavern.ktに法要
##19.8　チャレンジ！　スライディングウインドウ
（少し、無名関数、ラムダ式、型推論、関数型プログラミング辺りで息切れしてきたので、しばらく復習をしてから出直してきます。）




[第２章チャレンジ！答案](https://qiita.com/guijiu/items/dd3313f2a73401e29bc4)
[第３章チャレンジ！答案](https://qiita.com/guijiu/items/672b8daf014d4e6bb346)
[第４章チャレンジ！答案](https://qiita.com/guijiu/items/08dfa397b989b7ecdb3a)
[第７章チャレンジ！答案](https://qiita.com/guijiu/items/452cfa51bee6c4a4af9d)
[第８章チャレンジ！答案](https://qiita.com/guijiu/items/9a7871b1e41bdabd85e7)
[第１０章チャレンジ！答案](https://qiita.com/guijiu/items/9619abd4d5bf3488e58f)
[第１３章チャレンジ！答案](https://qiita.com/guijiu/items/5eda8682b1c05fa48c7d)
[第１５章チャレンジ！答案](https://qiita.com/guijiu/items/0f67138483e12641dfc3)
[第１８章チャレンジ！答案](https://qiita.com/guijiu/items/18e904913a429aaa58ea)
[第１９章チャレンジ！答案](https://qiita.com/guijiu/items/69579929129715e9cb75)
深さ優先探索

### 探索とは
探索とは、可能性を調べながら解を探す方法。

### 深さ優先探索とは
最も基礎的な探索の方法。

### 本記事で学ぶこと
* 深さ優先探索による「塗りつぶし」
* 深さ優先探索の再起関数による実装
* 深さ優先探索のスタックによる実装

### 問題
#### 入力
* 図のような迷路
* .が通れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922608/4c856568-f75d-0a8c-1bd7-10fc63717f59.png)

#### 出力
* sからgまでいけるか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922608/e941f757-d74b-d1e5-682d-7d2dadad412e.png)

### 塗りつぶし Flood-fill
#### 問題の解き方
1. sから行ける場所を全部調べる
2. gに行ければ'yes', 行けれなかったら'no'

塗りつぶしは「sから行ける場所を全部調べる」方法であり、とてもよく使われる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922608/88a8d04f-c07b-522f-0a84-67bc36aa9209.png)

### 深さ優先探索による塗りつぶし
#### 基本的な考え方
* 今いるところから隣に行こうとしてみる
* まだ行ってなかったらいく

ちゃんと塗りつぶすために
* 全箇所から4方向への移動をためし尽くす
* そのために、ためし尽くしてない場所を覚えておき、戻ってくる
* 戻ってきて別のところに行けたらそっちに行く
* スタート地点に戻ってきたら完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922608/8b8ac9ac-19a6-4957-eed9-563cda8ec5f2.png)

#### なぜ深さ優先探索というか
まだ4方向を試し尽くしていない場所の中で、一番「深い」ばよから探索を広げるから

### 再帰関数による深さ優先探索
#### 考え方
* 位置を引数にした再帰関数を使う
* 自分から4方向への呼び出しを行う

#### なぜこれで深さ優先探索になるか
* 再帰関数なので呼び出した後戻ってくる
* 戻ってきて違う方向へまた呼び出す

#### 擬似コード

```
関数 search(x, y) {
   if (場所 (x, y) が壁か迷路の外) return 
   if (既に (x, y) に一度到達している) return
   (x, y) に到達したということを記録

　　//4方向を試す
   //再帰関数なので1つの方向を試しおわた後帰ってきて次の方向を試す
   search(x + 1, y)
   search(x - 1, y)
   search(x, y + 1)
   search(x, y - 1)
}
```

### スタックによる深さ優先探索
#### 考え方
* 試すべき位置をスタックで管理
* 再帰呼び出しの代わりにスタックへpush

#### アルゴリズム
* 最初はスタート地点をスタックに投入
* 繰り返す：スタックから位置を取り出して、まだ訪れていない隣があればpush

再帰関数が深くなりすぎると「スタックオーバーフロー」が起こって実行時エラーになることがある。
スタックを用いる方法ならばこれを回避できる。

### 深さ優先探索のまとめ
#### 深さ優先探索の他の出番
* 組み合わせ全てを試す全探索
* その高速化である枝刈り探索

#### 深さ以外を優先する探索
* 幅優先探索
* 裁量優先探索　（→Dijkstra/Prim のアルゴリズム）

参考
[A - 深さ優先探索 ](https://atcoder.jp/contests/atc001/tasks/dfs_a)
FlutterのproviderパターンにてCleanArchitectureを学ぶ

- [こちらのチュートリアル](https://www.raywenderlich.com/6373413-state-management-with-provider)の学習と解説をします。
- 厳密にCleanArchitectureの図を再現しているわけではありません。

---
# チュートリアルの流れ

## 設計手法
<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779879/95e95ca2-a785-3e39-bd3f-b2e72ca44d12.png>
- **ビジネスロジックをUI, DB, network, 3rdパーティーpackageから分離する**
- **理由: コアのビジネスロジックは変化しにくいから**
    - UIはWebAPIに直接アクセスしてはいけない
    - 至るところからDBを呼ぶ状態にしてはいけない
- 方法: プラグイン的な設計にする
    - モバイルUIをデスクトップUIに入れ替えられる
    - DBを入れ替えられる
    - local storageを入れ替えられる

## State Management と Provider
<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779879/1fd39b6a-9629-d15c-994c-b11e7150d52d.png>
- このチュートリアルで扱うアプリケーションはこのような構成になる
    - Local Storage
    - web API
    - UI
- **ビジネスロジックがState managementをする**
- providerはそのState managementのhelperとなる
    - `ChangeNotifierProvider`によりUIビジネスロジックを挿入する

## ビジネスロジックによる連携
![mvvm_moolax-2-650x234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779879/30105ce3-6c79-aea0-8148-9ec9029400f3.png)

- MVVM
    - Data層がModelとなる（赤）
    - ビジネスロジックがViewModelとなる（紫）
    - UIがViewとなる(緑)
- UIはViewModelの変更の通知を受ける
- UIはViewModelにイベントを送る
- ViewModelはUIがどういうものかに関知しない
- ビジネスロジックはサービスのインターフェイスに対する処理をする
    - ローカルストレージかWebかについてビジネスロジックは関知しない
    - この形式はRepository Patternとも呼ばれる

## Service Locator
- `get_it` packageを用いる
- [制御の反転、依存性の逆転](https://martinfowler.com/articles/injection.html)を目的とする
- ビジネスロジックから実装する際、未実装のServiceはFakeを作成する
- 実装後に簡単に入れ替えられる

```dart
// 開発開始時にはFakeを用いる
// serviceLocator.registerLazySingleton<CurrencyService>(() => CurrencyServiceFake());

// Serviceが実装できたら入れ替える
serviceLocator.registerLazySingleton<CurrencyService>(() => CurrencyServiceImpl());
```

# 学んだこと
- CleanArchitectureの観点でMVVMを実装すると、**ModelとViewがそれぞれViewModelに依存する**
    - ViewModelがビジネスロジックとなる
- **ViewModelがData層(Model)を扱う場合、そのインターフェイスにのみ依存する**
    - 理由: ビジネスロジックであるViewModelは変化しにくいものであるから、Model等の他のオブジェクトに依存させたくないため
    - つまり、**制御の反転を行うためにインターフェイスに依存する**
    - 実装はService Locatorを用いて注入する
- **開発時は未実装のService（Data層）のFakeを作成する**
    - WebAPIから取得するModelのFakeとしては、ダミーのListを返すものやダミーのJSONを読み込むものを作成する
        - 実装が終わればFakeと置き換える
        - **VMがMのインターフェイスにのみ依存しているので置き換えが容易となる**
    - TDDではTestにてmockを作るが、このmockと同じ役割となる
ガリル　プログラムについて

この記事では[ガリル社のモーションコントローラー](https://www.galil.com/)を制御するプログラムについて記載する。ガリルはモーターなどのアクチュエータ（以下モーター）を制御するためのコントローラーであり、プログラムをコーディングし、ガリルへ転送・実行させることでモーター制御が可能となる。

##一般
- プログラムは簡単なスクリプト言語。
- プログラムの拡張子は.dmc。
- プログラムはコマンドの組み合わせで出来ている。
- コマンドは大文字アルファベット2文字からなる。
- コマンドはプログラムかターミナルで使用できる。
- プログラムは大文字小文字が区別される。
- コマンドの後にその引数を入力するが、間にスペースを入れても入れなくてもよい。
- 軸の指定はコマンドの後に対応するアルファベットを入力する。モーター起動コマンドはSHであり、例えば1軸目を起動させるならSHA,2軸目を起動させるならSHBとなる。

##プログラムの流れ
ガリルはモーターを制御するためのものであり、プログラムは大きく次の流れから構成される。
1. 準備フェーズ（モーターを適切に動かすためのパラメータ設定）
2. 実行フェーズ（モーターを動作させている間の挙動設定）
3. 終了フェーズ（モーターを停止させるためのパラメータ設定）


最低限必要なコマンドのみで示すと次のようになる。
1. SH（モーターを起動させるコマンド）
2. BG（モーターを動作させるコマンド）
3. ST（モーターを停止させるコマンド）
4. MO（モーターを終了させるコマンド）

簡単なプログラムを以下に記載する。準備フェーズに動作に必要なパラメータの設定（加速度・減速度・回転数）とデジタルIOへ出力（想定としてはモーターで動作させるまえに油圧・空気圧システムの電磁弁へ出力をするようなイメージ）を行っている。実行フェーズではBGコマンドで指定したパラメータ通りにモーターが動作する。ここでは２秒モーターを動作させた後に停止させている。終了フェーズでは、モーターを終了させ、デジタルIOへ出力を行っている。

```intro.dmc
'プログラム開始
#INTRO
'準備フェーズ
AC 10000 '加速度設定
DC 10000 '減速度設定
JG 30000 '回転数設定
SB1      'デジタルIOの１番目をオン
SH       'モーター起動
'実行フェーズ
BG       'モーター起動
WT 2000  '２秒待機
ST       'モーター停止
AM       'モーター動作が完全に指定するまで待機
'終了フェーズ
MO       'モーター終了
CB1      'デジタルIOの１番目をオフ
EN       'プログラムの終了
```
##コーディング上の注意点
- コメントは文頭に'またはREMをつける。
- ラベルは#のあとにアルファベット７文字までで指定する。なお、大文字小文字は区別される。
- プログラムの実行単位はラベルからENコマンドまでとなる。プログラムの呼び出しはラベルに対して行われ（ターミナルでXQ#{ラベル名}と入力するとプログラム実行）、ENコマンドが実行されるとプログラムは終了する。
- 関数の実行単位もラベルからENコマンドまでとなる。プログラム内での関数呼び出しはラベルに対して行われ（プログラム内でJS#{ラベル名}）、ENコマンドが実行されると呼び出し元に処理が戻る。
- 文法上のエラーはダウンロードをした時点でターミナルに表示される。
- プログラムは各行逐次実行されるが、各コマンドの動作が完全に終了するまえに次のコマンドに移行することがある。例えばSTコマンドでモーターを終了させた後にMOを実行させるとモーター動作が完全に停止する前にモーター電源を落とそうとする場合がある。このためSTコマンドの後にAMコマンドを入れることで安全にMOをすることができる。このAMに限らず、ガリルは完全に動作が終了するまえに次の動作に移行しようとすることがある。そのため、プログラムと実際の動きが違ったり、モーターが不穏な動き・音を発するなどが生じたらこの現象を疑うべきである。
- SBは各デジタルIOへ出力を行うコマンドだが、OPコマンドでは一括出力を行うことができる。OPとSBは2進数換算でき、SB2とSB4コマンドを個別に行うコマンドはOP10 (2^1+2^3)、SB1とSB5を個別に行うコマンドはOP17(1+2^4)と同じ操作になる。なお、すべてのデジタルIOをオフにするのはOP0となる（いちいちCB1,CB2,CB3,,,とやる必要はない）。
【PHP学習メモ】class定義のポイント

class定義、難しいですよね。
まだまだ綺麗なコードには程遠く、コツコツコードを書く日々です。
今回は、class定義のポイントを箇条書きでまとめました。
初学者故に間違いやツッコミどころがあるかもしれません。
ご意見やご指摘がありましたら、お気軽にコメントを頂けましたら幸いです。

【class定義のポイント】
・変わらない値は定数にする。
・定数を多数設定する場合は、項目毎で改行すると見やすい。
・メソッド内で、echo・改行しない。
・１つのメソッドには、１つの機能を持たせる。
・重複する処理はまとめる。
・プロパティに設定するのは、モノが持っている情報。
・外からアクセスする必要のないものは、privateにする。
・ずっと同じ値を扱う場合は、コンストラクタで設定する。
・プロパティの値を上書きするようなことは、コンストラクタ以外では、できる限りやらない。
フェルマーの小定理について

# はじめに
本記事では, 競プロや数論において題材となる「フェルマーの小定理」についてまとめたいと思います.

# フェルマーの小定理とは
整数 ${\it a}$ と素数 ${\it p}$ に対して, 以下の合同式が成り立つことをフェルマーの小定理という.

```math
a^{p-1} \equiv	1 ~ (\mathrm{mod ~p})
```

この式の意味は 「$a^{p-1}$ を ${\it p}$で割った余りは, 1 を ${\it p}$ で割った余りに等しい」である.
このフェルマーの小定理を用いることで, とても大きな数を素数で割ったときの余りをすぐに求めることができる.

# フェルマーの小定理の証明
まず準備として, 二項定理を考える. 二項定理から以下の式が成り立つことがわかる.

```math 
(x+y)^p = \sum_{k=0}^{p} \binom{p}{k} x^{p-k} y^k
```

上記において, 二項係数は以下のように書き下すことができる.

```math 
\binom{p}{k} = \frac{p(p-1)(p-2)\cdots(p-k+1)}{k!}
```

ここで ${\it p}$ が素数のとき, $1 \leq k \leq p-1$ とすると, ${\it k}!$ と ${\it p}$ に共通の約数は存在しないので, 二項係数の分母は ${\it p}$ で割り切れず, 分子は ${\it p}$ で割り切れることがわかる. よって, 二項係数全体は ${\it p}$ で割り切れる.

ここからは ${\it n}$ についての数学的帰納法を用いて, $a^{p-1} \equiv	1 ~ (\mathrm{mod ~p})$ が成り立つことを示す.

( i ) ${\it a}$ = 2 のとき

二項定理から,

```math 
\begin{align}
(1+1)^p 
&= \sum_{k=0}^{p} \binom{p}{k} 1^{p-k} 1^k \\
&= \sum_{k=0}^{p} \binom{p}{k} \\
&= 1 + \binom{p}{1} + \binom{p}{2} + \cdots + \binom{p}{p-1} + 1 \\
&\equiv 1 + 1 ~ (\mathrm{mod ~p}) \\
&= 2 ~ (\mathrm{mod ~p})
\end{align}
```

( iI ) ${\it a}$ = ${\it n}$ のとき
${\it a}$ = ${\it n} - 1$ のときは仮定が成り立つものとする. 二項定理より, 

```math 
\begin{align}
a^p 
&= (a - 1 + 1)^{p} \\
&= \sum_{k=0}^{p} \binom{p}{k} (a-1)^{p-k} 1^k \\
&= \binom{p}{0} (a-1)^{p} + \binom{p}{1} (a-1)^{p-1} + \cdots + \binom{p}{p-1} (a-1)^{1} + \binom{p}{p} (a-1)^{0} \\
&= (a-1)^{p} + \binom{p}{1} (a-1)^{p-1} + \cdots + \binom{p}{p-1} (a-1) + 1 \\
&= (a-1)^{p} + \binom{p}{1} (a-1)^{p-1} + \cdots + (a-1) + 1 \\
&\equiv (a - 1)^{p} + 1 ~ (\mathrm{mod ~p}) \\
&\equiv (a - 1) + 1 ~ (\mathrm{mod ~p}) \\
&= a ~ (\mathrm{mod ~p})
\end{align}
```

以上より, 数学的帰納法から, フェルマーの小定理が成り立つことが示された.

# おわりに
本記事ではフェルマーの小定理についてまとめました. この記事を読んで気になった方はぜひ[Pythonで学ぶアルゴリズムとデータ構造](https://www.kspub.co.jp/book/detail/5178034.html)を手にとって見てください.

# 参考文献
[Pythonで学ぶアルゴリズムとデータ構造](https://www.kspub.co.jp/book/detail/5178034.html)
【C言語】構造体へのポインタ本当に理解出来ていますか？

下記のプログラムを実行するとどのような出力が得られるかわかりますか？

```c:structure.c
#include <stdio.h>

typedef struct {
    int a;
    int b;
} t_structure;

int main(void){
    t_structure structure;
    structure.a = 5;
    t_structure *p_structure = &structure;

    printf("(1)structure.a...%d\n", structure.a);             //(1)
    printf("(2)p_structure->a...%d\n", p_structure->a);       //(2)
    printf("(3)(*p_structure).a...%d\n", (*p_structure).a);   //(3)
    printf("(4)p_structure[0].a...%d\n", p_structure[0].a);   //(4)
}
```
このプログラムを実行すると以下のような出力が得られます．

```c:実行結果
(1)structure.a...5
(2)p_structure->a...5
(3)(*p_structure).a...5
(4)p_structure[0].a...5
```
(1)~(4)のすべてで構造体のメンバ変数`a`が保持する値にアクセス出来ています．
つまり，(1)~(4)はすべて同じ意味です．
なぜ同じ意味になるのかを説明することが出来ますか？
この記事ではその理由を説明していきます．

##(1)structure.a##
これは簡単ですね．
構造体のメンバにアクセスしたいときは`.`を使用します．
`構造体変数.メンバ`と書くことでメンバにアクセス出来ます．

##(2)p_structure->a##
これは構造体へのポインタを使ったことがある人ならわかると思います．
`p_structure`は構造体変数`structure`へのポインタになっています．
構造体へのポインタを使って，メンバにアクセスするためにはアロー演算子`->`を使用します．
`構造体へのポインタ->メンバ`と書くことでメンバにアクセス出来ます．

##(3)(*p_structure).a##
これは(2)をなんとなく使っていた人はわからないかもしれません．
ポインタが保持しているアドレスにアクセスするためには`*`を使用します．
*p_structure`とすることで`p_structure`が保持している`structure`にアクセスしています．つまり，`*p_structure`と`structure`は等価です．
ここまでわかれば，(3)が(1)と同じ意味になるのは理解出来るでしょう．
また，(2)で使用したアロー演算子はこの書き方を簡単に書くための演算子です．

##(4)p_structure[0].a##
これを理解できる人はポインタへの理解が深い人でしょう．
`*p_structure`は`p_structure[0]`とも書き換えることが出来ます．
`p_structure[0]`は`*(p_structure + 0)`を簡単に書くための記法だからです．
これがわかれば(4)が(3)と同じ意味になる理由が理解出来ると思います．

##終わりに##
さて，ここまで(1)~(4)が同じ意味になることを説明してきました．
では，構造体へのポインタからメンバ変数を参照したい場合，どれを使うのがいいのでしょうか？
僕は，(2)が一番良いと思います．(2)が最も簡潔に書けるからです．
(3)や(4)は(2)をこのように書き換えられるよという程度のものです．聞かれて説明出来る必要はあると思いますが，実際に書く必要はないと思います．
【git】CSVファイルでのgit diffにおいてオプションをつけて見やすく差分を表示する

初めて投稿します。

##この記事でわかること
・CSVファイルのgit差分をみたいとき、差分のある箇所だけ見る方法

##比較例のファイル

file1.csv 変更前（タグ:version1）

```
1,aaa,あいうえお
2,bbb,かきくけこ
3,ccc,さしすせそ
4,ddd,たちつてと
5,eee,なにぬねの
```

file1.csv 変更後（タグ:version2）

```
1,aaa,あいうえお
2,bbb,kakikukeko
30,ccc,さしすせそ
4,ddd,たちつてと
5,efe,なにぬねの
```


##通常のgit diff
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704157/fcb8ec77-cd4f-58ba-5f80-7450862f8587.png)

どこの部分が変わっているかわかりずらい。
差分のない業も表示されてしまっています。

※git diff対象をコミットIDでなくタグで設定しています。
　コミットIDでも差分はとれます。


##git diffが見やすくなるオプション
###-U0（差分の行のみ表示できる）
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704157/d64bd5d0-240d-fc28-4812-d63e996fad18.png)


### --word-diff-regex="[^,]+"(カンマ区切りを対象に差分を確認する)
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704157/c6f88ca5-6c31-7b7a-85f7-f8025097937e.png)


ーU0のオプション、--word-diff-regexのオプションを組み合わせると
差分行のみかつカンマ区切りごとに差分が確認できるため、さらに見やすくなります。

![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704157/d15aa0ae-8d4d-5afe-1cdc-fe2214d2d593.png)


#参考リンク
[CSV ファイルの差分（git diff 利用）](https://qiita.com/kkdd/items/c0257b57ba562a9d9086)
(RubyMine)docker-composeでのデバッグができないとき確認すること

参考
[チュートリアル : リモートインタープリターとしての Docker Compose — RubyMine](https://pleiades.io/help/ruby/using-docker-compose-as-a-remote-interpreter.html)

参考ページの通りやろうと思って同じようにやっていたのですが、なぜかうまくいかず、未来の自分を含め参考になればと思い簡単にまとめます。

うまくいかない時は、

- 設定 / 環境設定ダイアログ>言語 & フレームワーク | Ruby SDK および Gemで使おうとしているリモートに
'debase'と'ruby-debug-ide'が入っているかどうか確認する
- うまくいかなかったら上記ですでに作っているものを一旦消してもう一度作る <= 僕はこれで解決。

- 設定 / 環境設定ダイアログ>言語 & フレームワーク | Ruby SDK および Gemで新規リモートを追加する際に、サービスにdocker-compose.ymlで指定したサービス名かどうかを確認する

- 違うコンテナが動いてないか確認する
- 試しに.ideaディレクトリ以下とdockerコンテナとイメージ、ネットワーク、ボリュームを消して最初からやる
- 実行・デバッグの構成でRails>Development:プロジェクト名かを見る。+ボタンでDocker>docker-composeを作る必要はない

これができると▷ボタンや虫ボタンでアプリが起動するので開発を始めるのが簡単になります。（コマンド打たなくて良い）
[SwiftUI]Appプロトコル

<p>XcodeでiOSの新規Appプロジェクトを生成すると雛形から作られるのが、Appプロトコルを実装する〜Appクラスだ。</p>

<pre><code>import SwiftUI
 
@main
struct LandmarksApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
</code></pre>

<p>計算型プロパティbodyの実装は必須となる。</p>

<p>WindowGroupはビュー階層のコンテナ。</p>

<p>ContentViewはアプリで独自に実装したビュー。</p>

<pre><code>import SwiftUI
 
struct ContentView: View {
    var body: some View {
        Text("Hello, World!")
            .padding()
    }
}
 
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
</code></pre>

<p>Viewプロトコルを実装したContentViewがアプリ独自のビュー。PreviewProviderプロトコルを実装したContentView_PreviewsはXcodeのプレビュー表示にContentViewを表示させるためのもの。</p>

<p>ContentViewの計算型プロパティbodyにビューの内容を実装する。</p>

<p>サンプルコードでは、文言"Hello, World!"をテキスト描画している。</p>

【関連情報】
<a href="https://developer.apple.com/tutorials/swiftui/creating-and-combining-views">Creating and Combining Views</a><br />
<a href="https://developer.apple.com/documentation/swiftui/app">App</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
【備忘録】クラス【TypeScript】

# クラス

TypeScript,JavaScript 初学者が関数の**クラス**について勉強したのでメモを残す。

# クラスの特徴

- 下記の例を読んでみる。

```typescript
class Person {
  constructor(name) {
    this.name = name;
  }
  static sayName = () => {
    console.log("私は${this.name}です。");
  };
  static explain = () => {
    cosole.log("${this.name}は人間です");
  };
}

class Man extends Person {
  construcror(name) {
    super(name);
  }
  sayGender = () => {
    console.log("${this.name}は男です。");
  };
}
```

- メンバーメソッドはアロー関数でも OK
- JavaScript にとってクラスとは**コンストラクタ関数**である

```typescript
> class sampleClass {
... constructor(name){
..... this.name = name
..... }
... }
undefined
> typeof sampleClass
'function'
```

`sampleClass`の型が関数であることがわかる。（TypeScriptが**プロトタイプベース**であるため。）


## TypeScript はプロトタイプベース（⇆クラスベース）

- クラスベース
  - 継承元がクラス
- オブジェクトベース

  - 継承元がオブジェクト（プロトタイ）
  - あらゆるオブジェクトがなんらかのプロトタイプを継承する（**プロトタイプチェーン**）
  - プロトタイプチェーンは空オブジェクト`{}`を経て`null`に行き着く

    ```typescript
    > const yasushinari = new Man("yasushi");
    >
    > yasushinari.__proto__
    Man{}
    > yasushinari.__proto__.__proto__
    Person{}
    > yasushinari.__proto__.__proto__.__proto__
    {}
    > yasushinari.__proto__.__proto__.__proto__.__proto__
    null
    ```

  - クラス構文をプロトタイプベースで書き直すと以下のようになる

  ```typescript
  function Person(name) {
    this.name = name;
    this.sayName = function () {
      console.log("私は${this.name}です。");
    };

    return this;
  }

  Person.explain(name) {
    cosole.log("${this.name}は人間です");
  }

  function Man(name) {
    Person.call(this, name);
    this..sayGender(name) {
      console.log("${this.name}は男です。");
    }

    return this;
  }

  Man.prototype.__proto___ = Man.prototype;
  ```

## なぜプロトタイプベースなのか（プロトタイプベースの良さ）

- クラスベースより**軽量**に実装可能。
- プロトタイプのメソッドを**編集**、**追加**、**削除**が容易にできる。

  ```typescript
  class Person {
    constructor(name) {
      this.name = name;
    }

    sayName = (name) => {
      console.log(`My name is ${this.name}.`);
    };
  }

  const yasushi = new Person("yasushi");

  yasushi.sayName(); // My name is yasushi.

  // メソッドを編集
  yasushi.sayName = function () {
    return console.log(`I'm ${this.name}.`);
  };
  yasushi.sayName(); // I'm yasushi.

  // メソッドの追加
  yasushi.sayHello = function () {
    return console.log("Hello!");
  };
  yasushi.sayHello(); // Hello!

  // メソッドの削除
  delete yasushi.sayName();
  yasushi.sayName(); // TypeError: yasushi.sayName is not a function
  ```

# 参考

- [りあクト！ TypeScript で始めるつらくない React 開発 第 3 版【Ⅰ. 言語・環境編】](https://booth.pm/ja/items/2368045)

_何か指摘等ございましたら、コメントでお願いいたします。_
【初心者でもわかる】太文字をさらに太く表示するCSSの裏技

# どうも7noteです。太字を更に太く見せる技。

***「太字効果の、`font-weight: bold;`よりももっと太く見せたい。」***

そんなときに使える、ちょっとした裏技を紹介します。

![sample02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/8dd9e2d4-47aa-805b-3d92-6d99e6d11ace.png)


## 文字に縁取りをつけて太く見せる方法（あまり綺麗でない）

```style.css
.big {
  text-shadow:  /* 縁取り1pxを同じ色でつける */
    1px 0 0 black,
    0 1px 0 black,
    -1px 0 0 black,
    0 -1px 0 black;
}
```

**結果**

![sample01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/f52d5981-68a9-2b8c-c5d2-4122d6f70ecd.png)

上側がただの50pxの太文字です。これに同じ色の1px分の縁取り（輪郭）をつけたものが下になります。
太くはなるのですが、この方法では**輪郭と輪郭のつなぎ目がカクカクしてしまう**のと、**もともとの文字サイズがそれなりの大きさがないと使いにくい**という難点があります。

## `text-stroke`を使えばつなぎ目も綺麗に！（※IE非対応）

```style.css
.big {
  -webkit-text-stroke-width: 2px;
  -webkit-text-stroke-color: black;
}
```

**結果**

![sample02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/0f945b6a-eeb2-145d-3596-3826e8efcc83.png)

いかがでしょうか？50pxの文字に2pxの黒縁をいれたものになります。
縁の部分だけ見るとこのように**角の部分も綺麗に色がついている**のがわかります。

**縁だけ色を変えて見てみるとこんな感じ。**

![sample03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/41ebf3c9-4375-ad7c-6101-a73cb68f1640.png)


## まとめ

**太文字を更に太く見せたい時は`text-stroke`を使うのが良いでしょう。**
ただし、IEには非対応なので注意が必要なのと、見本の画像でも「超」の文字のように太くしすぎると線と線がくっついてしまうので、ほどほどの大きさに調整する必要があると思います。
`font-weight: bold;`だけでは物足りなくなったときに役立ててください。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
herokuでサブドメインを設定する

# 前提 #

１、HerokuのPlanがHobby以上であること。
２、独自ドメインが設定済みであること。
その上でサブドメインを追加する

## herokuでサブドメインを設定する ##

HerokuのPointDNS(ドメインを管理するアドオン)を使用するため、以下のコマンドを実行します。

```
heroku addons:create pointdns:developer
```

以下のコマンドでPointDNSのダッシュボードが開きます

```
heroku addons:open pointdns
```

ダッシュボードが開いたら、ALIASの「Data」の文字列をコピーします。

![スクリーンショット 2021-01-02 14.13.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117960/3dba94f4-44ae-33ee-06f8-b4ab33bf4859.png)

「Add record」を押下し、以下情報を入力し、Add recordを押下します。
Record type:CNAME
Name:サブドメイン名
Hostname:先ほどコピーした文字列
TTL:3600

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117960/1c9a2eee-5d60-80d8-137f-5874ad0cc0fb.png)

以上で終了です。

参考：
https://qiita.com/hatsu/items/bad123c8a7bdb6918781
Db2 on Cloudを使ううえで必ず設定すべきJDBCパラメータ

# 経緯

Db2 on CloudはIBM CloudのDBaaSの1つです。それを利用する際に必ず設定すべき接続パラメータがありますので紹介します。なお、ここで紹介するのはJDBCを利用するケースです。

# enableSeamlessFailover=1

Java EEサーバでDB2に接続する場合、一般的には接続プールが使われます。接続をアプリで切断しても実際には切断されずにプール内に保管され、次に接続する際に再利用することで、時間のかかるデータベースへの接続時間を軽減することができます。

しかし、WebSphere Application ServerやWebSphere Libertyを使用しているケースで、もしプール内の接続を再利用する前にデータベースとの接続が裏で切断されてしまった場合、それを再利用しようとすると、アプリではSQLコード-4498でClientRerouteExceptionが発生します。

> IBM WebSphere Application Serverの古くからのユーザーであれば、StaleConnectionExceptionのことだと言えば記憶にある方もいるかもしれません

Db2 on Cloudの場合、障害だけでなく、IBM Cloudによるメンテナンス作業等のため、Db2のアクティブ機を切り替える場合があるため、普通にしていてもこの例外はしばしば発生します。

これが発生すると、アプリ側でそれをキャッチして接続をリトライする処理を実装していない限り、アプリとしてはエラーになります。

JDBCパラメータに``enableSeamlessFailover=1``を設定すると、このリトライ処理を自動的に行ってくれます。ただし全てのケースを救えるわけではありません。

> https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.apdv.java.doc/src/tpc/imjcc_r0052038.html
> IBM Data Server Driver for JDBC and SQLJはシームレス・フェイルオーバーを使用します。 このことは、以下の条件が満たされる場合には、失敗した接続が正常に再確立された後に、ドライバーは SQL エラー・コード -4498 の SQLException をスローしないことを意味しています。
障害の発生時に、接続がトランザクション用には使用されていなかった。
グローバル一時表などのグローバル・リソース、オープン状態の保留カーソル、または他のサーバーへのシームレス・フェイルオーバーを妨げる接続状態が残存しない。
シームレス・フェイルオーバーが行われる場合、新しいデータ・ソースへの接続が確立された後、ドライバーは元の接続の障害時に処理されていた SQL ステートメントを再発行します。

全てのケースは救えないですが、特にオンラインのアプリケーションではこの設定は必須と言っていいでしょう。経験上、この設定でかなりのケースを救えます。

# connectionTimeout

connectionTimeoutはJDBCプロパティとConnectionManagerの両方に同名のプロパティがあるので注意が必要です。ここで言っているのはJDBCプロパティの方です。

connectionTimeoutは、データベースに接続を開始してから接続が確立するまでの待ち時間です。デフォルトはタイムアウトなしです。このパラメータも必ず設定してください。

障害でDb2 on Cloudが停止した際、TCP的には疎通可能な状態なときがあります。TCP的にはESTABLISHEDかつKeepAlivedな状態です。しかしこれはDb2として認証をして接続が確立した状態ではありません。このとき、データソースの接続プールの1つがこの認証前の接続が占有してしまいます。オンラインアプリケーションの場合、その間も接続要求を受けてしまうので、早晩、接続プールがすべて認証前の接続で埋まってしまい、新規接続要求を受け付けなくなってしまいます。そしてDb2が回復してもプール内の接続はリセットされないので、結果としてアプリは再起動しない限り永遠にデータベースに接続できなくなります。connectionTimeoutを設定することで、プール内の認証前の接続を時間で切ることができます。

# blockingReadConnectionTimeout

connectionTimeoutは新規接続要求から認証含めた接続確立までの待機時間でしたが、blockingReadConnectionTimeoutはSQL実行後にサーバから応答がない場合の待機時間です。これもデフォルト値がタイムアウトなしのため、SQL実行後にDB2が停止し、TCP的に切断されなかった場合、アプリは永遠にサーバからの応答を待ってしまうリスクがあるため、それを回避するために設定します。

ただし注意点として、このパラメータは、結果が返ってくるまで時間がかかるSQLを実行した場合でも効いてしまいますので、アプリで想定する最も応答時間が長い処理よりも長く設定する必要があります。

# 設定例

```server.xml
	<dataSource id="xx" jndiName="jdbc/xx" isolationLevel="TRANSACTION_READ_COMMITTED">
		<jdbcDriver libraryRef="DB2JCCLib"/>
		<properties.db2.jcc databaseName="BLUDB"
			serverName="xxx" portNumber="xxx" user="xxx" password="xxx"
			enableSeamlessFailover="1"
			connectionTimeout="10s"
			blockingReadConnectionTimeout="30s"
		/>
	</dataSource>
```
python windows 環境構築

◆windows環境でのVSCodeを使用したpython開発環境構築

・構築環境
　　windows10
　　python
　　VSCode
　　tortoiseGit

・参考サイト
　Python環境構築ガイド
　https://www.python.jp/install/windows/install.html

---------------------------------------------------------------
◆python本体 
　　1.ダウンロード
　　　https://www.python.org/downloads/
　　　インストール時に "Add Python 3.x to PATH" をチェックする

　　2.インストール後に本体確認　
　　　C:\Users\testuser1>python
　　　quit()

　　3.pythonランチャー確認
　　　C:\Users\testuser1>py
　　　quit()

---------------------------------------------------------------
◆VScode
　　1.ダウンロードとインストール
　　https://code.visualstudio.com/download

　　2.エディタを立ち上げて拡張機能追加
　　・Japanese Language Pack for Visual Studio Code
　　・Git Graph

---------------------------------------------------------------
◆pythonサンプルコードを作成
　sample.py (pipでパッケージをインストールをしていなければ実行時にエラーがでる)
    
　　　import requests
　　　print(requests.get("https://www.python.jp").text)

---------------------------------------------------------------
◆仮想環境
　参考　https://www.python.jp/install/windows/venv.html

　　1.プロジェクトフォルダの作成　
　　　　C:\Users\user1>mkdir sample1

　　2.仮想環境フォルダ作成
　　　　C:\Users\user1\sample1>python -m venv .venv

--コマンドプロンプトの場合
　　3.仮想環境activate(cmd)
　　　　C:\Users\user1\sapmle1>.venv\Scripts\activate.bat
　　　　(.venv) C:\Users\user1\sample1>

　　4.pipで仮想環境にパッケージをインストール
　　　　(.venv) C:\Users\user1\sample1>python -m pip install requests

　　5.仮想環境deactivate
　　　　(.venv) C:\Users\user1\sample1> deactivate
　　　　C:\Users\user1\sample1>

--powershellの場合
　　・powershellの実行権限付与 
　　　　PS C:\> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force

　　・仮想環境activate(ps)
　　　　PS C:\Users\user1\sapmle1> .venv\Scripts\activate.ps1
　　　　(.venv) C:\Users\user1\sample1>

---------------------------------------------------------------
◆Cコンパイラインストール

　　1.「Visual Studio 2019のツール」を選択（downloadsページの下の方にある）
　　　　https://visualstudio.microsoft.com/ja/downloads/

　　2.「Build Tools for Visual Studio 2019」をダウンロード

　　3.インストーラを起動し、「C++ Build Tools」 を選択して インストール

---------------------------------------------------------------
◆仮想環境運用方法
　　1.使用している仮想環境のパッケージをrequirements.txtに出力
　　　　(.venv) C:\Users\user1\sample1>python -m pip freeze > requirements.txt

　　2.requirements.txtを参照して仮想環境にパッケージをインストール
　　　　(.venv) C:\Users\user1\sample1>python -m pip install -r requirements.txt


---------------------------------------------------------------
◆pythonのバージョンごとに仮想環境をわける

　　・3.7系
　　　　C:\Users\user1>py -3.7 -m venv py37env
　　　　C:\Users\user1>py37env\Scripts\activate.bat

　　・3.8系
　　　　C:\Users\user1>py -3.8 -m venv py38env
　　　　C:\Users\user1>py38env\Scripts\activate.bat

---------------------------------------------------------------
◆バージョン管理ツール
　　・git
　　　　https://git-scm.com/download/win

　　・tortiseGit & Language Packs
　　　　https://tortoisegit.org/download/

　　・tortiseGit参考動画
　　　　https://youtu.be/5NEuiuqElio
componentの自作

備忘録です。OctoberCMSだんだん使い方分かってきて、component試してみました。

```php
php artisan create:component my.company TestComponent
```

で雛形ができます。次にコンポーネントを利用するための登録を行います。

```vim
vim plugins/my/company/Plugin.php

public function registerComponents()
{
    //return []; // Remove this line to activate
    //ここで先程のcomponentを登録する
    return [
        'my\Company\Components\TestComponent' => 'TestComponent',
    ];
}
```
backendからlogout loginで登録されたcomponentが見えるようになります。
そこでテストページを作り、コンポーネントエリアからTestComponentをドロップダウンすると、コンポーネントとしての挙動開始します。
この段階では、

```
This is the default markup for component TestComponent
You can delete this file if you want
```
と表示されるだけで、コンポーネントのプロパティもエイリアスのみです。
作成したTestComponentを編集します。

```vim
vim plugins/my/company/components/TestComponent.php

//ここで定義したプロパティにアクセスできるようになります
public function defineProperties()
{
    return [
        'productid' => [
            'title'       => '商品番号',
            'description' => '指定された商品番号の商品を展開します',
            'default'     => '{{ :slug }}',
            'type'        => 'string'
        ],
    ];
}

//コンポーネントが実際にページから描画される際は onRun()が呼ばれるようです
public function onRun(){
    //コンポーネントエディタで登録したプロパティ値が取得出来てます
    dump($this->property('productid'));

    $db = new MyDB(); //モデルはここから呼び出せるものなら何でも良いはず
    $val =$db->hoge($this->property('productid'));
        
    dump($val); //コンポーネントがデータ受け取れていること確認

    //次が少しまごつきましたが、$this->pageに渡すことで,componentのdefault.htmでも、
    //呼び出す方の .htmでも使えるようになりました。
    $this->page['val'] = $val;
```

component側の default.htm

```vim
vim plugins/my/company/components/testcomponent/default.htm
<p>default.htm start </p>
{{ dump (val) }}
<p>default.htm end </p>
```

貼り付けた方のhtm

```vim
vim themes/test/pages/testcomponent.htm

{% component 'Test' %}
<p>呼んだ方の始まり</p>
{{ dump(val)}}
<p>呼んだ方終わり</P>
```
で２回valがdump表示されます。

component はpartialの拡張版みたいなものに感じました。
SWING入門

###メソッドの種類

---
####drawLine(x1, y1, x2, y2)
点 (x1, y1) から点 (x2, y2) へ直線を描く．

---
####drawString("文字列", x, y)
点 (x, y) を左下とする位置に文字列を配置する．

---
####drawRect(x, y, w, h)
点 (x, y) を左上とし，横幅 w，高さ h の長方形を描く．

---
####fillRect(x, y, w, h)
点 (x, y) を左上とし，横幅 w，高さ h の長方形を描き，内部を塗りつぶす．

---
####drawOval(x, y, w, h)
点 (x, y) を左上とし，横幅 w，高さ h の長方形に内接する楕円を描く．

---
####fillOval(x, y, w, h)
点 (x, y) を左上とし，横幅 w，高さ h の長方形に内接する楕円を描き，内部を塗りつぶす．

---
####drawPolygon(x, y, n)
x 座標の配列 x と y 座標の配列 y で定義した n 点で構成する多角形を描く．

---
####fillPolygon(x, y, n)
x 座標の配列 x と y 座標の配列 y で定義した n 点で構成する多角形を描き，内部を塗りつぶす．

---
####drawPolyline(x, y, n)
x 座標の配列 x と y 座標の配列 y で定義した n 点を連続的につながった直線で描く．

---
####drawRoundRect(x,y,w,h,aw,ah)
丸いコーナー付きの輪郭の長方形を描く．

---
####fillRoundRect(x,y,w,h,aw,ah)
丸いコーナー付きの輪郭の長方形を描き，内部を塗りつぶす．

---
###Classの種類

---
####JFrame
端末の画面上にフレーム(ウィンドウ)の表示させるclass

---
####JPanel
フレーム内に図形などのGUI部品を配置するclass

---
####Container
GUI部品を保持するためのコンテナclass

---
####Graphics
フレーム内に描画するclass

---
####Color
色を扱うclass

---
###ウィンドウ上の座標
![1キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/b857ee73-99d1-334c-baaa-1e72cab72616.png)
ショートカットでAPIを叩いた時にIF文に合致しない

# 概要
iOSのショートカットを使って休日判定をしたかったため、

>http://s-proj.com/utils/holiday.html

を用いてショートカット上で休日判定のロジックを構築した。
その際に、IF文を使ってもAPIのレスポンスとこちらで書いたテキストが一致しない状況に陥ったのでそれの解決方法を記載する。
後々考えれば、iOSのカレンダーを使って簡単に休日の判定ができるのでそれについても後述する。

## API概要
詳しくは、上記のURLを見て欲しい。
ざっくり説明すると、URLにアクセスした日や指定した日が休日か、それ以外かを判定するAPIを用いた。
レスポンスとしては、
休日だった場合は「holiday」
それ以外だった場合は「else」
が返却される。

## 原因
レスポンスの末尾にスペースが入っていたため、IF文に合致しなかった。
下記のスクリプトでは、IF文のholidayの後にスペースを入れている。

##実際のスクリプト
https://www.icloud.com/shortcuts/1de304d04e534569bba19e61421cc6e8

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246162/de4ac540-3a80-bbcc-602a-9e882c3ace3c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246162/c5a5937b-bf86-bcc5-1b1f-a1ef913ac87e.png)

##こんなことをしなくても...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246162/632cd238-aa6e-fc1f-c4fa-8af592a9ecfd.png)