OmniAICreator/Qiita-1.07M huggingface dataset:
abstract(抽象化) で継承時のメソッドの入れ忘れを無くそう！

# 以下の2つのクラスを作ると想定します。

```Python
class Calc1():
    def calc(self, a, b):
        c = a + b
        return c

class Calc2():
    def calc(self, a, b):
        c = a - b
        return c
```

次のように使う予定です。

```Python
l = [Calc1(), Calc2(), Calc1(), Calc2()]

for calc in l:
    print(calc.calc())
```

こういった使い方をする場合、2つのクラスには `calc()` メソッドが必須です。

しかし久しぶりに新しい `Calc3` クラスを作る際、`calc` の実装を忘れてしまうかもしれません。

単純なプログラムならエラーを見てすぐに実装を忘れていたことに気付けるかもしれませんが、なるべく想定外の事態は避けたいです。

そんなときには `abstract` を使いましょう！

# abstractの使い方

abstract を使って継承前提のクラスを作成することができます。

定義の仕方は以下です。

```Python
from abc import ABC

class _Calc_template(ABC):
    pass

class _Calc_template(metaclass=ABCMeta):
    pass
```

どちらを使っても同じです。`ABC` は中に `metaclass=ABCMeta` が書かれているだけなので...

デコレータ `@abstractmethod` を使って抽象メソッドを定義します。

```Python
class _Calc_template(ABC):
    @abstractmethod
    def calc() -> float:
        pass
```

矢印で `->` 返り値の型を明確にしておくことで、エディターの補間が働くようになるので便利です。（abstractに限らず）

抽象クラスを継承したクラスで、メソッドの定義をせずにインスタンスを作ろうとするとエラーが出ます。

```Python
class Calc3(_Calc_template):
    pass

Calc3()
# >>> TypeError: Can't instantiate abstract class Calc3 with abstract method calc
```

# 変数定義はちょっと微妙？

デコレータは関数にしか使えませんが、Pythonでは関数の形でクラス変数を定義できます。ゲッター・セッターでGoogle検索すれば出てきます。

##### 使い方

```Python
class _Calc_template(ABC):
    @property
    @abstractmethod
    def hoge():
        pass
```

##### 動作

```Python
class Calc3(_Calc_template):
    pass

Calc3()
# >>> TypeError: Can't instantiate abstract class Calc3 with abstract method hoge
```

```Python
class Calc3(_Calc_template):
    hoge = 0
    def __init__(self, h):
        self.hoge = h

Calc3()
# エラーなし
```

しかし以下だとエラーが出る。

```Python
class Calc3(_Calc_template):
    def __init__(self, h):
        self.hoge = h

Calc3()
# >>> TypeError: Can't instantiate abstract class Calc3 with abstract method hoge
```

クラス変数があればインスタンス変数がなくても通ってしまう。

```Python
class Calc3(_Calc_template):
    hoge = -1
        
Calc3()
# エラーなし
```

純粋にインスタンス変数の作成を強制できる方法を知っている方がいればぜひ教えてください...
Qiitaの記事投稿：markdown記法について

# はじめに
Qiitaで初めて投稿しようと思ったら
「よく見るQiitaの書き方はどうやってるんだ？」
ってなりませんでしか？

私は、**なりました！**

そこで、色々調べた結果、Qiitaは ***「markdown記法」*** というもので書けるそうです。
なので、今回、少し調べたことをまとめようと思います。

# markdown記法とは
「markdown記法とは、なんぞや？」というとこから話ますと
下記、次のサイトから
[Markdown記法/書き方（見出し・表・リンク・画像・文字色など）](https://notepm.jp/help/how-to-markdown)
```参考
Markdown(マークダウン)とは、「# 見出し」「* リスト」など、シンプルな書き方で文書構造を明示でき、
装飾されたHTML文書に変換できる軽量マークアップ言語です。
```
ということらしいです。
「HTMLってなんぞや？」って人は「html/css」で調べてみてください！
Webページの見た目を作ってる言語みたいなものって思っておけば、ひとまずOKかと。。。

要はweb上で見せるためのものすごく簡単な形式の言語形式ということです！

# 書き方：例
このサイトは下記の感じに書いてます。
フォーマットとしてでも使ってください。
```
# 題1：勝手に下線が入ります。
※#の後には空白が必要です。

内容 ***強調したい文字*** 内容の続き

[リンクにしたい名称](URL)

上下に「```」をつけた部分が今の黒い引用フレームになる

リスト名
*1
*2
*3

```

# 最後に：投稿について
初投稿は、Markdown記法を理解してなかったので、うろ覚えのHTML形式で書いてたんですが
***結果、Webページが対応してくれる形式であれば、どの言語で表しても対応してくれそうです！***

単なる記事にするだけならば、極力簡単なフロントエンドに近い言語で書けるのが理想ですし、
Markdown記法をつかうのがいいのではないですしょうか？


また、ほかの人の書き方を参考にしたかったら
[Qiitaの投稿をMarkdown表示にする方法](https://help.qiita.com/ja/articles/qiita-show-raw-body)
を公式がやり方教えてくれてるので、どんどんパクッていい記事を増やしましょう！
他にもデベロッパーツールを使って、HTMLの構コピーする方法などもいいと思います。

# 参考サイト・参考記事
 * [Markdown記法/書き方（見出し・表・リンク・画像・文字色など）](https://notepm.jp/help/how-to-markdown)
 * [Qiita ヘルプ](https://help.qiita.com/ja/articles/qiita-markdown)
 * [Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
 下２つは、Qiita公式のヘルプ記事です。
ShopifyPOSを実機検証してみて～基礎編～

※記載内容は個人の見解であり、所属する組織の公式見解ではありません。内容は検証・導入の中で得た知見に基づき記載していますが、誤り等が含まれていましたらご指摘ください。

# はじめに
この記事はECカートShopifyに付随して提供されるShopifyPOSについて、「実機検証・導入してみて」シリーズの1つ目の記事です。
ShopifyPOSを中心にShopifyも絡めながら書いていきます。
導入検討されている企業の方等に参考になれば。

# ShopifyPOSとは
くわしくはこちら　https://www.shopify.jp/pos
まあ普通にPOSです。
![newpos-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/b361e5e4-4b35-8f88-1641-726a8891cddb.png)



レジ会計アプリはAndroid,iOSのアプリとして提供されており、管理画面はブラウザベースです。
「ShopifyでECサイトを展開している企業がリアル店舗も展開する」という前提で作られていると思います。
何といってもECプラットフォームである**Shopifyと100%リアルタイム連携**なので、
Shopify上でECサイト構築済みのブランドは、ShopifyPOSを使うことで
**実店舗とECサイトがシームレスに繋がり、いわゆるOMOを実現可能。**



その上で具体的には以下のようなメリットがありそうです。

:::note
実店舗とECサイトで在庫をシェアして、販売機会を最大化したい。
:::
:::note
実店舗とECサイトの売上を統合管理したい。
:::
:::note
ただPOSで販売するだけでなく、会員プログラムや他のアプリと連携させたい。
:::
***

#### 1. 実店舗とECサイトで在庫をシェアして、販売機会を最大化したい。
実店舗の在庫とECサイトで在庫をシェアさせたいけど、両者の連携IFを開発したり、あり物のIFでも実装するだけでも結構面倒。
そんな時にShopifyPOSはかなり便利です。最初から実店舗の在庫とECサイトで在庫をシェアしてます。
もちろん実店舗orECサイトでは販売したくない時は設定可能です。

:::note warn
実店舗orECサイトでは販売したくない時の設定は、標準機能ではImport等では設定できず、管理画面でポチポチ設定していく必要あり。若干面倒です。
:::

#### 2. 実店舗とECサイトの売上を統合管理したい。
実店舗とECで在庫共有できいて、そのプラットフォームで販売するんだから、そりゃ売上も統合管理できるよね。いたってシンプルです。
ただ実店舗とECを別々のプラットフォームで運用していたら、売上統合管理は結構ハードル高いはずです。
商品マスタの持ち方の違いや、受注から決済・発送までのどこのプロセスで売上を統合させるか、在庫と売上の連動はどうするか、などなどアークテクチャの設定結構大変だと思います。
Shopifyであれば、実店舗もECも勝手に売上は統合管理してくれ、Shopify上の分析画面である程度の分析まで出来ちゃいます。
![storeanalysis1_1024x1024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602424/f2fde994-2281-b6b1-dc42-6f71884db658.png)
引用元：https://www.shopify.com/jp/blog/analyzing-shopify-reports



#### 3. ただPOSで販売するだけでなく、会員プログラムや他のアプリと連携させたい。
そもそも論ですが、Shopifyには会員プログラムを提供する機能はデフォルトでは存在しません。（日本のユーザ企業にとってはShopify最大の弱点な気がする、、、）
なので、会員プログラムを別サービスとして採用して、Shopifyとつなげる必要があります。
でもここの仕組みはさすがShopifyという感じ。
Shopifyは様々なAPIを公開した上で「3rdPartyベンダさん、好きに連携アプリ作って良いよ」という仕組みになってます。
なので会員プログラムだけでも数十のサービスがShopifyと連携できるAPI実装済みの状態で有償・無償で提供されていて、
Shopifyユーザ企業は任意の会員プログラムサービスを選んでぽちっとするだけで、即時に会員プログラムとShopifyが連携されて、利用開始OKになります。
双方APIの仕様書を確認して、設計して実装して、、、みたいなことは一切不要です。

# 最後に
とまあこんな具合にShipifyPOSが実店舗を持つユーザ企業にとって最強のクラウドPOSです。
の一方で色々と限界もあり、、、だから日本での事例が伸び悩んでいるのかも、、、、
次回はそのあたり、ShopifyPOSの限界とウィークポイントについて触れたいと思います。
基本情報技術者試験 _コンピュータの構成

コンピュータの構成
コンピュータは、制御装置・塩酸装置・記憶装置・入力装置・出力装置の五つの装置から構成されています。このうち、制御装置と塩酸装置を合わせて中央処理装置(CPU：Central Processing Unit)といい、コンピュータの頭脳に当たります。
ぞれぞれ、以下のような役割を果たしています。
CPUの制御装置：記憶装置からプログラムの命令を取り出して解読し、名装置に指示を与える。
CPUの塩酸装置：四則演算(加減乗除)や論理演算などを行う。
記憶装置：データやプログラムを記憶する。
入力装置：コンピュータの外部からプログラムやデータを読み込み。
出力装置：コンピュータの内部で処理されたデータを外部へ書き出す。
スマートフォンもコンピュータの一つです。入力装置と出力装置が兼用になっていてPC(Personal Computer)など見た目は違いますが、CPUや記憶装置も内蔵されいてます。

ハードウェアとソフトウェア
ここであげた五つの装置はハードウェアです。機械として物理的に存在します。(制御装置や演算装置は、CPUの中に格納されています。)
これに対して、プログラムやアプリケーションソフトウェアはソフトウェアです。記憶装置に記憶された「１」と「０」の信号という形で存在しています。

プログラム記憶方式
現在のコンピュータは、主記憶装置（主記憶）に記憶されたプログラムを、CPUが順に取り出し、解読・実行する方式です。プログラム記憶方式（プログラム格納方式）と呼ばれています。ハードウェアを変更しなくても、ポログラムを変更することで、様々な処理を行うことができます。
クラス変数とインスタンス変数

# クラス変数とインスタンス変数

```Python
class A():
    hoge = 'HOGE'
    def __init__(self):
        self.fuga = 'FUGA'
```

`hoge` がクラス変数で、 `fuga` がインスタンス変数。

# インスタンス変数を変更するには？

```Python
class A():
    def __init__(self):
        self.fuga = 'FUGA'
    
    def set_fuga(self, value):
        self.fuga = value
    
    def print_fuga(self):
        print(self.fuga)

a = A()
a2 = A()
a.print_fuga() # >>> FUGA

a.set_fuga('FUGA2')
# または
a.fuga = 'FUGA2'

a.print_fuga() # >>> FUGA2
a2.print_fuga() # >>> FUGA # もちろん a2 は変更されない。
```

# クラス変数を変更するには？

```Python
class A():
    hoge = 'HOGE'

    def set_hoge(self, value):
        A.hoge = value

    @classmethod 
    def set_hoge2(cls, value): # クラスメソッド。
        cls.hoge = value
    
    @classmethod 
    def print_hoge(cls): # クラスメソッド。
        print(cls.hoge)

a = A()
a2 = A()
a.print_hoge() # >>> HOGE

a.set_hoge('HOGE2')
# または
a.set_hoge2('HOGE2')
# または
A.hoge = 'HOGE2'

a.print_hoge() # >>> HOGE2
a2.print_hoge() # >>> HOGE2 # クラス変数なので a も a2 同じものを指す。
A.print_hoge() # >>> HOGE2 # print_hoge() はクラスメソッドなので初期化しなくても使える。
```

# ちょっとキモイ仕様（Pythonのやさしさ？）

```Python
class A():
    hoge = 'HOGE'

    def __init__(self) -> None:
        print(self.hoge) # >>> HOGE
        self.hoge = 'NO_HOGE'
        print(self.hoge) # >>> NO_HOGE

A()
```

インスタンス変数を定義していない間に限り、`self` からクラス変数にアクセスできる。どうやら `self` を使ってアトリビュートにアクセスしようとした時、インスタンスに無ければクラス変数からも探してくれるようだ。

```Python
class A():
    hoge = 'HOGE'

    def __init__(self) -> None:
        self.hoge = 'NO_HOGE'
        print(self.hoge) # >>> NO_HOGE
        print(A.hoge) # >>> HOGE

a = A()
```

クラス変数が消えたわけではない。
AWS CLIを使ってみたい

AWS CLIを使ってみたいと思い立ったので、やったことをメモしていきます。


今回はSSH接続の復習も兼ねて
「自分のパソコンからEC２に対してSSHで接続し、EC２からその他のリソースに対してCLIで作業を行う。」という手順で作業を進めていきたいと思います。


## EC2の作成
SSH関連の部分だけを変更しました、せっかくなのでキーペアも新しく作成しました。
<img width="50%" style="text-align:center" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/b63f5880-b7e8-16b2-98cd-877bf42c0ca5.png">
<img width="70%" align="center" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/161eaf7c-2ba1-4409-1704-68c9bda10cd0.png">
<img width="50%" align="center" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/0236a3c3-670b-f4ae-665e-d72e7e8936e0.png"/>




## SSH接続
```
mv /Users/"端末上のユーザ"/Downloads/MyCLI.pem ~/.ssh/
ssh -i ~/.ssh/MyCLI.pem "IAMユーザ"@パブリックIPアドレス
```
<br>

エラーが出てしまいました、ダウンロードしたpemファイルのアクセス権限を変更する必要があるようです。
```
以下エラー文の抜粋
Permissions 0644 for '/Users/"端末上のユーザ"/.ssh/MyCLI.pem' are too open.
Load key "/Users/"端末上のユーザ"/.ssh/MyCLI.pem": bad permissions
```
<br>

pemファイルのアクセス制限を変更してから再度実行します。
```
chmod 600 ~/.ssh/MyCLI.pem 
ssh -i ~/.ssh/MyCLI.pem "IAMユーザ"@パブリックIPアドレス
```
<br>

まだエラーが出ます
```
ログインユーザ@IPアドレス: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```
<br>

試行錯誤（２時間ぐらい）していたところ
ユーザ名はインスタンスを作成したIAMユーザの名前ではなく、EC２上でデフォルトで作成される「ec2-user」を指定する必要があることがわかりました。なんとか無事ssh接続することができました。
```
ssh -i ~/.ssh/MyCLI.pem ec2-user@パブリックIPアドレス
〜省略
      __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|
```

<br>

## CLIのインストール、IAMロールの作成と付与
以下を参考にしてインストールします。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

<br>

CLIを使用するためのIAMロールを作成、付与します。
![スクリーンショット 2022-08-07 21.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/cf6d107a-9061-a7ec-e979-e5e4c56e1f71.png)

新しいIAMロールを作成を選択します。
![スクリーンショット 2022-08-07 21.30.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/e97e7575-0374-cb3c-b2e5-34831cb1d149.png)
![スクリーンショット 2022-08-07 21.32.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/c6ec0996-500f-d301-3927-b70a976d206a.png)
![スクリーンショット 2022-08-07 21.33.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/51e46c53-1302-6db4-b6aa-0922c831ec6f.png)
![スクリーンショット 2022-08-07 21.35.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/83f0a50d-a5f2-2d0a-26e3-ce7e40b79a8c.png)
今回は関係ないものもなんとなく付けてみました。
本来は最低限のポリシーをアタッチするべきだと思います。
![スクリーンショット 2022-08-07 21.36.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/5c980d3d-e627-fa8f-f852-3833837e8967.png)
作成したIAMロールをプルダウンから選択して、アタッチします。
![スクリーンショット 2022-08-07 21.39.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512706/e090dfca-0438-a6a8-45c4-5ae849d2a017.png)

## CLIの操作
https://docs.aws.amazon.com/cli/latest/reference/

リファレンスを見て操作してみます。
```
aws s3 ls
2022-07-18 バケット名
2022-07-20 バケット名
```

正常にCLIが動作して、作成されているS3バケットを確認できました。
リファレンス見てるだけで目が回りそうですね、、、、、、、、、、、

<br>

## 後書き
少しずつ慣れるためになんとなく触っていこうと思います。
それはそうと、Qiita上でリサイズした画像を真ん中に寄せる方法を誰か教えてください、、、、、、
Makefileでヘルプを表示する

下のようなhelpコマンドを記述して、コマンドの右に##説明を書くことでコマンドと説明を表示できるようになります。

```Makefile:Makefile
.PHONY: foo help
.DEFAULT_GOAL := help

foo: ## foobarpiyo と表示する
	@echo foobarpiyo

help: ## ヘルプを表示する
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
		awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'

```

```zsh
$ make help
foo                  foobarpiyo と表示する
help                 ヘルプを表示する
```


## コマンドの意味

#### ```grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) ```
Makefileから正規表現でコマンド行を取得

```zsh
$ grep -E '^[a-zA-Z_-]+:.*?## .*$' Makefile                                                
foo: ## foobarpiyo と表示する
help: ## ヘルプを表示する
```

#### ```awk 'BEGIN {FS = ":.*?## "}; ```
awkの前処理。文字列コマンドを```:〜##```を区切りにして分割
```zsh
$ grep -E '^[a-zA-Z_-]+:.*?## .*$' Makefile | awk 'BEGIN {FS = ":.*?## "}; {print $1, $2}' 
foo foobarpiyo と表示する
help ヘルプを表示する
```

#### ```{printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'```
```\033[36m%```で文字色を変更し、```\033[0m```で元に戻す
```%-20s```は左詰めで20文字分の幅でコマンド箇所の文字を出力。 ```%s```でコメント箇所を出力



```zsh
$ grep -E '^[a-zA-Z_-]+:.*?## .*$' Makefile | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $1, $2}' 
foo                  foobarpiyo と表示する
help                 ヘルプを表示する
```

## その他
```.PHONY```
makeコマンドと同じ名前のファイルやディレクトリがあるとうまく動かないので、ファイルターゲットでは無いことを明示するためのものです。

```.DEFAULT_GOAL```
.DEFAULT_GOALを設定すると```make```と打てば```make help```コマンドを実行できます。
自己紹介 2022年興味あること

<h2>自己紹介</h2>
<p>
初めまして<b>「 Dr.3(three)」</b>と申します。<br>
学生の頃、いろいろ中途半端にいろんな言語を学んだので復習しつつ、<br>
興味のあるものや作ってみたいものを作っていきます。<br>
わからないことも多々あるので、こうしたら面白いんじゃない？などのアドバイスもいただけると幸いです！
<table border=1>
<tr>
<th>No.</th><th>興味のあるものリスト</th>
</tr>
<tr>
<td>1</td><td>セグウェイ</td>
</tr>
<tr>
<td>2</td><td>AR/VR</td>
</tr>
<tr>
<td>3</td><td>ドローン</td>
</tr>
<tr>
<td>4</td><td>カメラ・スキャン技術</td>
</tr>
<tr>
<td>5</td><td>Ai/機械学習</td>
</tr>
</table>
</p>

<h2>最初は、AR/VRから</h2>
<p>
これから、2週間～1ヶ月くらいかけて<br>
2.AR/VRについて勉強していこうと思うので、メモ書きです。<br>
ほんとは1.セグウェイを作っていきたいのですが、、、<br>
資金不足でお金のかからない２からやっていきます。<br>
</p>

<h2>やろうとしてること</h2>
<p>
ESP8266の動作を検知して、スマホを用いたVRに表示させる<br>
最終的には、ESP8266でのセンサー値に反応させて<br>
画像を表示させたり<br>
波動を飛ばしたり<br>
ジェスチャーで空間上のものを操作したり</br>など出来ればなぁ、、、といった感じです！
</p>
<p>
<ol><b>考えている手順</b>
<li><a herf=>ESP8266の環境構築</a></li>
<li><a herf=>ESP8266→Unityに通信させる方法</a></li>
<li><a herf=>Unityでデータを受け取る環境構築</a></li>
<li><a herf=>連携させたいUnity上の物体作成</a></li>
<li><a herf=>スマホで表示させる方法</a></li>
<li><a herf=>ESP8266で加速度センサーを使う</a></li>
<li><a herf=>ESP8266と加速度センサーのカバー製作</a></li>
</ol>
少しIoT関係とUX/UIなどを過去に触っていたので、この辺りかなぁと想像のリストです。<br>
最後の方は、3Dデザインとかですかね;;<br>
</p>
<br>
<p>
進みは遅いかもしれませんが、お願いします。
</p>
Emmetとは何か

# Emmetとは
![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613261/10d08031-6ad9-3390-587d-cf2c6ee6775c.png)
コードの自動補完を行ってくれる便利なプラグイン。
VisualStudioCodeにおいては、デフォルトで設定がされているため、特に設定せずとも使うことができる。
※AtomやSublime Textではデフォルトで使えないので、外部プラグインの導入が必要。

# 使用するメリット
コードの記述量を減らすことができ、開発効率up・ミス防止につながる。
積極的に使っていくとよさそう。

# デメリット
デメリットというデメリットは特にないが、強いて言うなら、
Emmet記法の学習コストくらいじゃなかろうか。


# Emmet記法　代表例
世の中には、チートシートが出回っているので、自分が直近で触ったものだけここに紹介しておく。

**①divタグ-クラス生成**
.がポイント
```
  <!--「.hoge」と入力⇒ -->
  <div class="hoge"></div>
```

**②divタグ-id生成**
#がポイント
```
  <!-- 「#hoge」と入力⇒ -->
  <div id="hoge"></div>  
```

**③spanタグ-生成**
```
  <!--「span.hoge」と入力⇒-->
  <span class="hoge"></span>
```

**④divタグ -id 、入れ子でdivクラス生成**
「>.」 とすることで、入れ子構造を作れるというのがポイント
```
  <!-- 「#hoge>.fuga」と入力⇒ -->
  <div id="hoge">
    <div class="fuga"></div>
  </div>
```

**⑤divタグ -id, 複数クラス生成**
```
  <!--  「#hoge>.fuga*6」と入力⇒-->
  <div id="hoge">
    <div class="fuga"></div>
    <div class="fuga"></div>
    <div class="fuga"></div>
    <div class="fuga"></div>
    <div class="fuga"></div>
    <div class="fuga"></div>
  </div>
```

**⑥⑤divタグ -id, 連番で複数クラス生成**
「$$6」 で、01~06の数値を作れるのがポイント。
```
<!-- 「#container>.hoge$$*6」と入力⇒ -->
  <div id="container">
    <div class="hoge01"></div>
    <div class="hoge02"></div>
    <div class="hoge03"></div>
    <div class="hoge04"></div>
    <div class="hoge05"></div>
    <div class="hoge06"></div>
  </div>
```

以上、積極的に使っていきましょう～。


# 参考
チートシート
https://docs.emmet.io/cheat-sheet/
Sequel Ace でCSVファイルをインポートする手順

# 概要
Sequel Ace便利ですよね。
今回はSequel AceでMySQLのテーブルにCSVファイルをインポートする手順を備忘録として記録します。

なお、この記事は下記を前提にしているのでご了承ください。
1. MySQLとSequel Aceが接続済みであること
2. インポート対象のテーブルが作成済みであること

## 環境
- MySQL 5.7 (Amazon Aurora)
- Sequel Ace 3.52
- Mac OS Monterey 12.5

# 手順
## 1. CSVファイルの準備
今回は文部科学省の提供する学校名CSVを使用してみます。

https://www.mext.go.jp/b_menu/toukei/mext_01087.html

先頭の行はカラム名になるので、器となるテーブルのフィールド名（カラム名）と一致させておきます。
また、フィールド名がカンマ刻みであることを確認しておきます。

テーブルのフィールド名
![スクリーンショット 2022-08-07 23.39.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/f89eff25-47e8-6180-350c-cb9062e1313c.png)


CSVファイル
![スクリーンショット 2022-08-07 23.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/53f416d7-4742-643c-9e2d-e2481a744ad7.png)

idはオートインクリメントに設定されているためCSVファイル上では準備不要です。

## 2. Sequel Aceを起動し、Importを選択する
「Sequel Ace」を起動して対象テーブルを選択後、「File」→「Import」の操作でImport画面を呼び出します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/c7ffbc63-3e5e-046c-7965-62721daf1efd.png" width="600px">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/c89aa4a8-c7fb-2399-fc08-cdfd206c330a.png" width="300px">

## 3. ローカル上のCSVファイルを選択する
CSVファイル選択後、「開く」をクリックします。
![スクリーンショット 2022-08-03 17.30.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/0ec5ad41-a9b0-9e8f-80d2-c5e944d08899.png)
CSV選択時、CSVのフォーマットに併せてオプションで設定が変更できます。
```
First line contains field names
-> CSVの先頭行がフィールド名(カラム名)の場合はチェック

Fields terminated by: 
-> フィールド行の最終文字を指定

Fields enclosed by:
-> フィールド名が「" "」のように囲まれている場合は指定

Lines terminated by:
-> 行末の文字を指定
```

## インポートされる実データとフィールド名の対応を確認し、「Import」をクリック
最後にCSVファイルの実データとテーブルフィールド名のマッピングが表示されます。
問題なければ右下の「Import」をクリックします。![スクリーンショット 2022-08-03 17.30.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/535cb4e3-e1d9-cce9-f70e-cacfb4a2751d.png)

エラーが発生しなければ作業終了です。お疲れさまでした！
Javaの学習　~エントリーポイント~

### エントリーポイントとは
複数のメソッドが定義されている際に、どのメソッドから処理を始めるべきか決まっていなければいけません。
エントリーポイントとは、その一番最初に処理をするメソッドのことです。

### エントリーポイントのメソッドの定義
定義方法は、よく見かける下記のコードです！
※「args」は変数名の宣言にあたる為、別の名前に変更可能。
```java
public static void main(String[] args) {

}
```
### エントリーポイントのルール
・publicであること
・staticであること（インスタンスを作らなくてもよい）
・voidであること(戻り値は戻せない)
・メソッド名がmainであること
・引数はString配列型であること（可変長引数のString型でもよい）

こんなに細かくルールがあるからいつも同じ書き方なんですね...

##### 可変長引数のString型とは
可変長引数とは、引数の数が決まっていない引数のこと。
```java
public static void main(String... args){

}
```

### まとめ
当たり前ですが、コードには全てきちんと意味があるのですね...。
これまでは深く理解しないままコードを書いていましたが、しっかりと理解した上で学習を進めていきたいと改めて思いました。
最後まで閲覧いただき有難うございました！！！
JSのmapをSICP風に実装してみた。

#### SICPのmap


```scheme
(define (map f list)
    (if (null? list)
        '()
        (cons (f (car list)) (map f (cdr list)))
    )
)
```

実行結果

```scheme
(print (map (lambda(x) (* x x)) (list 1 2 3 4)))
            // -> (1 4 9 16)
(print (map (lambda(x) (* x 3)) (list 1 2 3 4)))
            // -> (3 6 9 12)
```

#### オレオレmap in js

同じように再帰で書くためにSchemeのlist構造にいったんして、最終的な出力をArrayにして戻した。

`MyArray([1,2,3,4]).map`などのように使う。


```javascript
class MyArray {
    cons;

    constructor(arr) {
        this.cons = this.toCons(arr)
    }

    toCons(arr) {
        if(arr.length === 0) {
            return []
        }else {
            return [arr[0], this.toCons(arr.slice(1))]
        }
    }

    toArray(cons) {
        if(cons.length === 0) {
            return [];
        } else {
            return [cons[0], ...this.toArray(cons[1])]
        }
    }

    myMap(f, cons) {
        if(cons.length === 0) {
            return []
        }else {
            return [f(cons[0]), this.myMap(f, cons[1])]
        }
    }

    map(f) {
        return this.toArray(this.myMap(f, this.cons));
    }
}


const myArr = new MyArray([1,2,3,4]);

console.log(myArr.map((x)=> x*x)); // -> [ 1, 4, 9, 16 ]

```

実際のmapの実装とどう違うのかはわからない。
できるだけ正確な周期で処理を繰り返す方法（シェルスクリプト・Python・Arduino IDE）

## はじめに
最近、Arduinoやラズパイ等でいろいろな時計を作成するのにはまっています。
サーボを動かしたり、7SEGを表示させたりと方法は様々ですが、その処理命令をsleep関数やdelay関数等を使って繰り返し実行していました。
複数の時計を作成して並べてながめていてようやく気がついたのですが、それぞれの秒の桁のカウント（もしくは秒針の運針）の間隔が微妙にずれていました。
よく考えるとあたりまえなのですが、sleepやdelayで次の実行まで待っても、実際の処理にかかる時間が加算されるため、実行間隔は
``sleepやdelayで処理を待つ時間　＋ 実際の処理にかかる時間``
ということになります。
当初は実際の処理にかかる時間を計測してsleep,delayで待つ時間を減算していましたが、処理時間も常に一定ではなかったりと限界を感じたため、根本的な対処を考えました。

## テンプレートプログラム
### シェルスクリプト
```シェルスクリプト
#!/bin/sh

interval=0.5 # 秒単位で実行周期を設定  

while :
 do
  next_time=$(echo "scale=3; `date +%s.%3N` + $interval" | bc ) # 次回実行時刻を取得
  # 処理（interval以下で終わるように設定する必要あり）
  sleep $(echo "scale=3; $next_time - `date +%s.%3N`" | bc ) # 次回実行時刻まで待つ
 done
```

### python
```python
from time import time
from time import sleep
interval = 0.5 # 秒単位で実行周期を設定
while True:
  next_time =  round((time() + interval),1) # 次回実行時刻を取得
  # 処理（interval以下で終わるように設定する必要あり）
  sleep( next_time - time() ) # 次回実行時刻まで待つ
```
### Arduino IDE
```Arduino IDE
void setup() {
  last_time = 0;    // 前回実行時刻を初期化
  interval = 500;  // ミリ秒単位で実行周期を設定
}
void loop() {
  unsigned long current_time = millis();         // 現在時刻を取得
  if ((current_time - last_time) >= interval) {  // 前回実行時刻から実行周期以上経過していたら
    // 処理（interval以下で終わるように設定する必要あり）
    last_time = current_time;                    // 前回実行時刻を現在時刻で更新
  }
}
```

## 課題
pythonとArduino IDEではそこそこ正確なのですが、シェルスクリプトがどうしても指定した実行周期よりも15/1000秒程度間隔が長くなってしまいます。
bcやdateの処理時間が原因なのかなと思いいろいろなスペックのLinuxで試してみましたが状況は同じでした。
基本pythonと同じ考え方で作っているつもりなのですが・・・。
解決方法が見つかったら更新します。
【Phaser3】JSONファイルを読み込む

# はじめに
Phaser3にて、jsonファイルでゲームのデータを管理し、読み込むタイミングがあったが注意するべき点があったので、メモ。

# 内容
Phaser3ではシーンという概念が存在し、指定のタイミングで実行される関数が用意されている（preload(), create(), update()）。
下記のように指定の関数内で処理を呼ぶことでjsonファイルを読み込み、ファイルの値を取得する。

```js:jsonファイル読み込み
    preload() {
        // jsonファイルの読込
        this.load.json("key", "./assets/json/test.json");
    }
    
    create() {
        // jsonファイルの読込結果を変数に代入
        let jsonObj = this.cache.json.get("key");
    }
```

# 詳細
`preload()`は画面表示前、`create()`は画面生成時、`update()`は各関数が終了した後、1フレームごとに呼ばれる。
肝心なのは、`preload()`にて`this.load.json("key", [jsonファイルのパス])`でファイルを読み込み、`create()`にて`this.cache.json.get("key")`を実行しオブジェクトを取得する。

ファイルを読み込んですぐオブジェクトを取得しようとしても、エラーになってしまうので注意。

# 参考文献
- [Phaser 3 | 各ファイルタイプ別のプリロード方法](https://1-notes.com/preload-by-file-type/)
インターネットレジストリ とは

## 勉強前イメージ

ちょっとわかってない・・・。

## 調査

### インターネットレジストリ とは

特定の地域などのIPアドレスを割り当てを行う機関になります。
それぞれ種類があるのでいかに記載しています。

- RIR : 地域別インターネットレジストリ

Regional Internet Registry の略で、特定地域内のIPアドレスの割り当て業務を行うレジストリになります。
APNIC(アジア太平洋地域)・ARIN(北米地域)・RIPE NCC(欧州地域)・LACNIC(中南米地域)・AFRINIC(アフリカ地域)の5つからなります。
IANAに変わって各地域にIPアドレスを割り当てる担当をしています。

- NIR : 国別インターネットレジストリ

National Internet Registry の略で、RIPに代わって国・地域でIPアドレスの割当業務を行っているレジストリになります。
NIRはすべての地域にあるわけでないです。
アジアのAPNICの管理下には
JPNIC(日本)・CNNIC(中国)・KRNIC(韓国)・TWNIC(台湾)・VNNIC(ベトナム)・APJLL(インドネシア)の6つがあります。

- LIR : ローカルインターネットレジストリ

Local Internet Registry の略で、NIR(ない場合はRIP)に代わってIPアドレスの割り当てや管理を行います。
LIPがエンドユーザに分配する組織で、
日本ではJPNICがNIRにあたり、 [JPNICのIPアドレス管理指定事業者](https://www.nic.ad.jp/ja/ip/member/cidr-block-list.txt) がLIPになります。
管理指定事業者とはインターネットプロバイダなどがこれにあたります。

また補足情報として以下も記載します。

- ICANN

The Internet Corporation for Assigned Names and Numbers の略で
インターネットの資源をグローバルに調整する目的で建てられた非営利団体
IPアドレス・ドメイン・DNSルートネームサーバ等調整しています。

- IANA

Internet Assigned Numbers Authority の略で
インターネットの資源のIPアドレス。・ドメイン名・プロトコル番号など管理をしていました。
運営にはアメリカの予算が使われていたので、IANAが行っていた役割を非営利団体のICANNに引き継ぎました。
ICANNへ移管後も、ICANNにおける資源管理の部門の名称として存続しています。

- まとめ

上記をまとめると

ICANNの中のIANAが5つのRIRをまとめている。
各地域のRIRはNIRをまとめています。
各国のNIRがLIRに依頼をしてエンドユーザにIPアドレスを割り当てたりしています。

![12022-08-04 # インターネットレジストリ とは - diagrams.net - Goog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/7085339a-0a34-6b98-0e9f-2be031f503c7.png)

## 勉強後イメージ

ICANNが世界をまとめていて、各地域だったり各国だったりそれぞれに分担していってるのね。
ドメインはどう管理してるんやろ

## 参考

- [インターネットレジストリ](https://wa3.i-3-i.info/word14747.html)
- [地域インターネットレジストリ(Regional Internet Registry)とは](https://www.nic.ad.jp/ja/basics/terms/rir.html)
- [NIRとは](https://www.nic.ad.jp/ja/basics/terms/nir.html)
- [LIRとは](https://www.nic.ad.jp/ja/basics/terms/lir.html)
ストロングパラメーターの基本的な書き方と対応できないオブジェクト例

## なぜ記事を書こうと思ったか
  Railsのアプリ開発している際に、ストロングパラメータで対応できないオブジェクトがあることを知った為、今回ストロングパラメータの基本的な書き方と一緒にこの記事にまとめようと思います。

## ストロングパラメーターの書き方
### 基本的なオブジェクト
```
{
  name: "田中",
  age: 23
}
```
```
params.permit(:name, :age)
```

### 配列が入っている場合
```
{
  name: "田中",
  hobbies: [
    "サッカー", "映画鑑賞"
  ],
  age: 23,
  favorite_food: [
    "ラーメン", "寿司"
  ]
}
```
**値に配列が入っているプロパティはストロングパラメーターで最後に記述する**
```
params.permit(:name, :age, hobbies: [], favorite_food: [])
```

### オブジェクトがネストした場合
```
{
  name: "田中",
  setting: {
    age: 23,
    department: "営業部"
  }
}
```
**ネストしたプロパティもストロングパラメーターで最後に記述する**
```
params.permit(:name, setting: [:age, department])
```

## ストロングパラメーターで対応できないオブジェクトについて
ストロングパラメーターで全てのオブジェクトを対応している訳ではなく、直接、値を取得しないといけない場合もある。
### 二次元配列が入っている場合
```
{
  person: [
    "田中", "佐藤"
  ],
  setting: [
    [
      23, "営業部"
    ],
    [
      28, "開発部"
    ]
  ]
}
```
**settingsをストロングパラメーターで取得しようとすると、エラーになる。**
```
params.permit(person: [], setting: [[]])
```
**settingsは直接取得する必要がある。**
```
params.permit(person: [])
params[:setting]
```


## 最後に
　正直、二次元配列のようにストロングパラメータで書く事ができないオブジェクトがあることは知りませんでした笑(開発中にたまたま見つけました)
もし他にストロングパラメーターで書くことができないオブジェクトや他のストロングパラメーターの書き方がある場合は、コメントで教えていただけると嬉しいです。読んで頂きありがとうございました。

## 参考資料
- [ネストするStrong Parametersの書きかた](https://qiita.com/kymmt90/items/4ce8618ca8f537b2ef7e)
- [Strong parameters doesn't permit array of arrays (nested arrays)](https://github-com.translate.goog/rails/rails/issues/23640?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=sc)
標準関数でstd::wstring(UTF-16)↔std::string(UTF-8)変換

# はじめに
マルチプラットフォームで実現するため、標準関数で変換する。
ただし、最近のC++では非推奨となっています。
|C++ バージョン|C++11|C++17で非推奨|
|---|---|---|


## 共通
インクルードファイルは共通です。
```c++
#include <string>
#include <locale>
#include <codecvt>
```
## std::wstring⇒std::string変換
```c++
static std::string ConvertWstringToUTF8(const std::wstring& src)
{
	std::wstring_convert<std::codecvt_utf8<wchar_t> > converter;
	return converter.to_bytes(src);
}
```

## std::string⇒std::wstring変換
```csharp
static std::wstring ConvertUTF8ToWstring(const std::string& src)
{
	std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
	return converter.from_bytes(src);
}
```
対処法:MacOSでReactの雛形を作成しようとしたらEPERM: operation not permitted, uv_cwdというERROR文が表示された

reactの雛形を create-react-app で作成しようとすると以下のようなERROR文が表示された.
 #### エラー文...EPERM: operation not permitted, uv_cwd


#### 原因


ターミナルあるいは開発しようとしている統合環境にフォルダの権限が与えられていない.

#### 解決方法
1.システム環境設定を開く


2.セキュリティとプライバシーを開く


3.プライバシーのタブを選択


4.ファイルとフォルダを選択


5.ターミナルあるいは統合環境を選択し権限を与える.
PHP　MAMPで環境構築　

PHPの環境構築をMAMPで行います。

環境{
Mac
MAMP
VScode
}

備忘録
## MAMPとは
Webアプリの開発に必要な環境をまとめたソフトウェア。
MAMPをインストールするだけでPHPの実行環境が整う。

従来、Mac向けに開発されたソフトウェアであり、Macユーザー向け。
（現在はWindows版も提供あり）

Macintosh（マッキントッシュ）：従来、Mac向けに開発されたため
Apache（アパッチ）：Webサーバー
MySQL（マイエスキューエル）：データベース
PHP：PHPで書かれたプログラムを実行するソフトウェア

## インストール
まず、公式からインストールします。
[MAMP公式](https://www.mamp.info/en/mac/)

```terminal
1,Free Download　をクリック

２、intel か　M1(2)　のいずれかを選択しダウンロードを開始

３、ダウンロード終了したら、インストーラーを実行し、ホップアップで「続ける」を選択

４、更に警告ホップアップ。移動したり名前を変更したりするな。とのこと。「続ける」を選択

5,使用許諾契約ホップアップで「続ける」を選択し、更に「同意する」を選択

6,「インストール」で実行し、完了しらた閉じる。
　　　
```

## MAMPの起動
MAMPを起動する。
どこにあるか分からない人は、Spotlightで検索してください。

```terminal
1,MAMPを起動する。ロケットが描かれている画面が登場。

２、PHP Version:7.4.21 or 8.0.8 のいずれか選択。８.０.８で良いかと。

３、警告ホップアップ。OKを選択

4,右上のStartをクリック。つながったら完了。

５,ブラウザURL欄に　｀localhost:8888｀と入力しMAMP〜〜となってればOK！

6,作業をしないときは、ロケットの画面の右上でStopする。
```

## Vscodeで設定

Visual Studio Codeで設定が必要です。

```terminal

1, Vscodeを起動し、`command + t `で検索バー出す

２、＃を消して、　` >Open Settings(JSON) `で該当するJsonファイルを開く

３、 "php.validate.executablePath":"/Applications/MAMP/bin/php/php8.0.8/bin/php"
と追加する。下の参考図のように。(8.0.8)のとこはロケット画面で選んだバージョンの数値。

4,セーブしてファイル閉じて終わり。

```
##### 参考図
ただし、既存の記述内容は人それぞれなので気にしないこと。
![スクリーンショット 2022-08-07 22.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280802/9ddddf5a-1a68-a35c-55e0-3479addb3a53.png)

## コードを書いてみる

１、Vscodeで`Command` + `O`でディレクトリ参照
２、検索バーで`htdocs`入力して該当するファイルを開く
３、Explorerに参照された`index.php`を開く
４、下記のように書いてセーブ
```php
// index.php
<?php echo "ありがとうございました"?>
```
５、ブラウザURL欄で`http://localhost:8888/php-db/index.php`と入力
６、下記のように表示されれば完成です。
![スクリーンショット 2022-08-07 23.04.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280802/6ebefe00-12c3-04cb-c875-2eb5b9dcf38f.png)


## 後書き
ご覧いただきありがとうございました。

最近、PHPを勉強し始めて、本格的な環境構築はさておきMAMPを使いました。

Vscodeでの設定中、私のキャプチャで「phpらしき設定が他にも、、、」となった方がらっしゃったかと思います。
御明察。フラグです。何を隠そう、みんな大好きコード補完の設定です。

おわり
Resume と GoTo は同じ?!

## Resume と GoTo は異なる

ResumeはErrオブジェクトをクリアするが、GoToはクリアしない


## 検証

エラーが発生している状態（Err.Number<>0の状態）では、ResumeとGoToはいずれも、
指定されたラベルにジャンプするので、同じではないかと感じるが、
Resumeはジャンプするだけでなく、Errオブジェクトをクリアする点がGoToと異なる（GoToはクリアしない）

__コード① Resumeの場合__

``` vb
Sub Sample()
    On Error GoTo errHandler1

    Dim Num As Long
    Num = 5 / 0 '0割り算エラー発生

errHandler1:
    Debug.Print Err.Number & " " & Err.Description
    Resume errHandler2
errHandler2:
    Debug.Print Err.Number & " " & Err.Description
End Sub
```

__出力__

``` sh
11 0 で除算しました。
0
```

__コード② GoToの場合__

``` vb
Sub Sample()
    On Error GoTo errHandler1

    Dim Num As Long
    Num = 5 / 0 '0割り算エラー発生

errHandler1:
    Debug.Print Err.Number & " " & Err.Description
    GoTo errHandler2
errHandler2:
    Debug.Print Err.Number & " " & Err.Description
End Sub
```

__出力__

``` sh
11 0 で除算しました。
11 0 で除算しました。
```
【学習記録】応用情報3

# はじめに
学習記録の３です。
今回はちょっと少な目。。。
# 間違えたところ・知らなかった単語
## サーバコンソリデーションについて
+ 仮想技術を用いることで、複数の専用サーバに分散・非効率化していたアプリケーションや機能を1台または少数の物理サーバに整理統合すること
+ 物理サーバの台数が減るため、保守費用、消費電力、設置スペースなどの維持管理コストの削減を図ることができる

## 技術のSカーブについて
+ 1つの技術進歩の過程を表す言葉
+ 技術開発の初期のうちは比較的緩やかに進歩し、或る時期を境に急激に進歩し、
+ やがて技術の限界に近づくと進歩の伸びが停滞気味になる
+ 上記の一連の状態をグラフにするとアルファベットSに似た形になることからこのように言われる
+ ある技術がこの曲線のどこに位置するかを分析し、今後の技術戦略や資源の配分に活かす

### ほかの選択肢から学んだこと
用語|説明|
---|---
ハイブ曲線|技術の期待度の推移を表すものであり、黎明期、流行期、反動期、回復期、安定期に分類される|
経験曲線（エクスペリエンスカーブ）|同一製品の累積生産量が増えるにしたがって、単位当たりの総コストが一定割合で低下していくというパターンを示す曲線のこと。高値の新技術製品が徐々に安くなっていくこともこの経験曲線で説明できる|
バスタブ曲線|縦軸に故障率、横軸に時間を取ってグラフ化すると、曲線がバスタブのようになることから|

## SOA(Service Oriented Architecture，サービス指向アーキテクチャ)について
+ 業務上の位置処理に相当するソフトウェアで実現されている機能や部品を独立したサービスとみなし、それらを組み合わせ連携させることで言語、プラットフォームに依存せずにシステムを構築する手法
+ SOAでは、機能単位の組み合わせでシステムを構築するので、ソフトウェアコンポーネントの再利用や機能の入れ替え、システムの再構築が容易になる特徴がある

### ほかの選択肢から学んだこと
用語|説明|
---|---
ERP(Enterprise Resource Planning)|会計、人事、製造、購買、在庫管理、販売など企業の業務プロセスを一元管理することによって、業務の効率化や経営資源の全体最適を図る手法|
フィット＆ギャップ分析|企業の業務プロセス、システム化要求などのニーズと、ソフトウェアパッケージの機能性がどれだけ適合、乖離しているかを分析する手法|

## プリエンプションについて
+ 実行状態にあるタスクがOSの制御により、CPUの使用権を奪われ実行可能状態に移されること
+ 以下を満たした場合に発生する
    + 実行状態のタスクより優先度の高いタスクが実行可能状態になる
    + 実行状態のタスクに割り当てられたCPU使用時間が終了する

## C＆Cサーバについて（コマンド＆コントロールサーバ）
+ 攻撃者がマルウェアに対して指令コマンドを送信し、マルウェアに感染した支配下のコンピュータ群（ボットネット）の動作を制御するために用いられる外部の指令サーバのこと

コンピュータに感染したボットは
数秒から須分間隔で外部のC＆Cサーバと通信を行うように仕込まれている。
C＆Cサーバは、それに応答する形で攻撃差の端末に指令コマンドを送り込む。
この仕組みを「コネクトバック通信」という。

### 
a|a|
---|---
a|a|

## ターンアラウンドタイムについて
+ 利用者がシステムに処理要求を開始してから、すべての結果を受け取るまでに要する時間のこと

## スタックポインタについて
+ スタックの最上位のアドレスを保持するレジスタ
+ スタック内で最後に書く参照されたアドレスを保持している

### ほかの選択肢から学んだこと
用語|説明|
---|---
プログラムカウンタ|次に読み出す機械語命令が格納されているアドレス|
命令レジスタ|メモリから読みだされた機械語命令|
ステータスレジスタ|読み込みの許可状態、および条件分岐の判断に必要な演算結果の状態|

## ABC分析について
* 重要度や優先度の高い要素・項目を明らかにするために行われるぶんっせき手法のこと
* パレート図を使って分析する項目・を大きい順に並べる
* 上位７割を占める要素群をA
* ７割～９割の要素群をB
* それ以外の要素群をCとしてグルーピングする
* これによって重点的に管理するべきグループがどれであるかを明らかにできる


## ファジング（fuzzing)について
* 脆弱性検査手法の一つ
* 検査対象のソフトウェア製品に、「ファズ(fuzz)と呼ばれる問題を引き起こしそうなデータを大量に送り込み、その応答や挙動を監視することで脆弱性を検出する

### ほかの選択肢から学んだこと
用語|説明|
---|---
ポートスキャン|サーバにFINパケットを送信し、サーバからの応答を観測して、稼働しているサービスを見つけ出す手法|
ログ分析|サーバのOSや、アプリケーションソフトが生成したログやコマンド履歴などを解析してファイルサーバに保存されているファイルの改ざんを検知する。|



## FPGA(Field Programmable Gate Array)について
* 製品出荷後に利用者がハードウェア記述言語を用いて、現場で回路の配線やロジックを書き換えることのできるプログラマブルな集積回路

* 用途が固定されているASICやASSPと比較して汎用性が高いので、様々な最終製品に使用することができる
* チップ単価は高くなりがだが、開発製造期間が短く済む、
* 少量多品種生産に向くなどの特徴がある
* プログラム方法として、SRAMセル方式、アンチヒューズ方式、EPROM方式、フラッシュメモリ内蔵方式などがある

### ほかの選択肢から学んだこと
用語|説明|
---|---
EEPROM|電気的に記憶内容の書き換えを行える不揮発性メモリ|
ASSP|特定の分野及びアプリ用に限定した特定用途向け汎用集積回路|
FPU|浮動小数点用演算装置。浮動小数点の演算を高速に実行する演算ユニット|
GitLabのCI/CDで使用するgitlab-runnerのインストールもろもろ

# Gitlab CI/CDで使うRunnerの種類
Shared Runner, Group Runner, Specified Runnerがある
https://docs.gitlab.com/ee/ci/runners/runners_scope.html

筆者は最初Shared Runnerを使おうと思ったが途中でクレジットカードを登録してくれと求められ、課金する気はなかったので無料で使えそうなSpecified Runnerを使うことにした。

で、Specified Runnerを使うにはgitlab-runnerというツールをインストールしないといけなかった。

# gitlab-runnerのインストール
公式でインストール手順が用意されているので、基本的にはこれに沿ってインストールする。
https://docs.gitlab.com/runner/install/osx.html

curlで取る方法とhomebrewで取る方法2パターン用意されているが、公式は前者を推してるっぽい。
> GitLab does not maintain the Homebrew formula.

公式手順だけだと`gitlab-runner`にPATHが通ってなかったので、↓を追加で実施した。
```sh
$ export PATH=$PATH:/usr/local/bin/gitlab-runner
```

# runnerをGitlabのレポジトリに登録する
gitlab-runnerをインストールしたら、次は各自のレポジトリにrunnerを登録する必要がある。
これも公式の手順があるので、参考に進める。
https://docs.gitlab.com/runner/register/#macos

手順7のrunner executorは手順では`docker`を推奨しているが、自分は`shell`を選択した。

registerが完了すると、ブラウザのGitlabでRunnerが登録されていることを確認することができる。

# トラブルシューティング
## Gitlabブラウザにて!runner has never contacted this instanceの警告が出るとき
`gitlab-runner verify`を実行すると解消される。
```sh
$ gitlab-runner verify
Runtime platform                                    arch=arm64 os=darwin pid=56801 revision=32fc1585 version=15.2.1
WARNING: Running in user-mode.                     
WARNING: Use sudo for system-mode:                 
WARNING: $ sudo gitlab-runner...                   
                                                   
Verifying runner... is alive                        runner=1ubm4htM
```

## runnerを登録したのにCI/CDのpipelineが永遠にpendingになるとき
`gitlab-runner run`しておかないとCIがpendingのままになってしまうもよう。
Ubuntu 18.04.3 構築時にやることリスト

## 環境
・Ubuntu 18.04.3 Desktop版
## やることリスト
### １．ソフトウェアの更新
```java:
> sudo apt update
> sudo apt upgrade
```
### ２．時刻同期の確認
```java:
> date
> sudo hwclock
```
### ３．ツールのインストール
```java:
//NW設定ツール
> sudo apt install net-tools
//vim
> sudo apt install vim
//SSH接続の許可
> sudo apt install openssh-server
```
### ４．固定IPアドレスの設定
```java:
//物理インターフェースの確認
> ifconfig -a
```
IPを設定するために必要なファイルについて、Ubuntu Desktop版だと/etc/netplan配下の全てのyamlファイルをNW設定ファイルとして認識します。
デフォルトだと/etc/netplan/01-network-manager-all.yamlが格納されており、先頭の数字が大きいものが優先されます。
ここでは新しく99-network-manager-all.yamlを作成し、固定IPアドレスを設定します。
```java:
//設定ディレクトリに移動
> cd /etc/netplan
//01-network-manager-all.yamlをリネーム
> mv 01-network-manager-all.yaml 01-network-manager-all.yaml.bak
//99-network-manager-all.yamlを新規作成
> vi 99-network-manager-all.yaml
```
99-network-manager-all.yamlに以下の内容を記載します。
※ens160：先ほど確認した物理インターフェース名。
```java:99-network-manager-all.yaml
//インターフェース"ens160"に対して192.168.1.10/24（GWのIP:192.168.1.1）を設定
network:
    version: 2
    ethernets:
        ens160:
            dhcp4: false
            addresses: [192.168.1.10/24]
            gateway4: 192.168.1.1
            nameservers:
                addresses: [192.168.1.1]
            optional: true
```

```java:
//NW設定適用
> sudo netplan apply
//確認
> ip a s ens160
```
### ５．ファイアウォールの設定
```java:
> vi /etc/default/ufw
```
以下の通りIPV6=yesをIPV6=noに変えます。
```java:ufw
    # Set to yes to apply rules to support IPv6 (no means only IPv6 on loopback
    # accepted). You will need to 'disable' and then 'enable' the firewall for
    # the changes to take affect.
#   IPV6=yes
    IPV6=no
```
```java:
//ポート全拒否
> sudo ufw default deny
//SSHのみ許可
> sudo ufw allow 22
//有効化
> sudo ufw enable
//確認
> sudo ufw status
```
もし、特手のFWルールを消したい場合は以下の通り。
```java:
//ナンバーも表示
> sudo ufw status numbered
//ナンバー2のルールを削除する
> sudo ufw delete 2
```
モデル駆動型アプリでログインユーザーの値をフィールドに自動設定する方法

![fotis-fotopoulos-LJ9KY8pIH3E-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734401/759adeab-caea-02de-1fcc-e06b23722c6d.jpeg)

キャンバスアプリでは、User関数を利用してログインユーザーの情報を簡単に取得することができます。
しかし、モデル駆動型アプリにはこの標準機能がありません。この機能を利用するためには様々な方法がございますが、そのひとつとして、JavaScriptを書くことで実現が可能になります。
この記事では、モデル駆動型アプリでログインユーザーの情報を取得、設定する方法を学ぶことができます。

# メインフォームを作成する
まずは、テーブルを作成し、ユーザーテーブルと関連付けた検索列を新しく作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734401/ae32a7c7-0f10-dc4f-785c-d7a496c56180.png)

次に、作成したメインフォームをデザインしていきます。既存のメインフォーム「情報」を選択します。そして、検索列をフォームに追加し、保存をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734401/c22ddfda-dcdd-8935-478b-68180dd5c1da.png)



# ログインユーザーの情報を取得するWebリソースを追加する
フォームが作成できたので、ログインユーザーの情報を取得するスクリプトを作成します。まず、以下のコードを記載したJavaScriptファイルを作成します。

:::note warn
注意点
*lookupfield*には設定する列の論理名に書き換えが必要です。
:::

```setCurrentUser.js
function setLookupFieldToCurrentUser() {
    //ログインユーザーの情報を取得
    var globalContext = Xrm.Utility.getGlobalContext();

    //Lookupフィールドに値をセット
    var currentUser = new Array();
    currentUser[0] = new Object();
    currentUser[0].entityType = "systemuser";
    currentUser[0].id = globalContext.userSettings.userId;
    currentUser[0].name = globalContext.userSettings.userName;

    Xrm.Page.getAttribute("lookupfield").setValue(currentUser);
}
```

次に、作成したスクリプトをフォームで利用できるようWebリソースとして追加します。
前の手順で作成したフォームをイベントをクリックし、「ライブラリの追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734401/09b0ee05-980f-d87b-0e72-43e842199abb.png)

次に、「新しいWebリソース」をクリックしします。先ほど作成したファイルをアップロードし、「保存して公開」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734401/201d5ebb-04a4-a980-8b19-35c4be37f923.png)

次に、追加したWebリソースをメインフォームに設定します。追加したWebリソースを選択し、「追加」をクリックします。そして、読み込み時のイベントハンドラーとして、新しくイベントを追加し、フォームを公開します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734401/7de5c0db-88ca-0839-049c-32613d836494.png)




最後に、モデル駆動型アプリを作成し、「新規」からフォームを開くと自動的にフィールドに値を設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734401/3f86ecde-27a8-5ebb-082c-cfa3e3b4dc56.png)


# 参考情報
- ログインユーザーを取得する方法
[Get current user id using JavaScript in Dynamics 365 CE CRM script](https://softchief.com/2022/04/29/get-current-user-id-using-javascript-in-dynamics-365-ce-crm-script/)

- Lookupフィールドに値をセットする方法
[How to Set Lookup Field Value Using JavaScript -Dynamics 365](https://crmminds.com/2022/04/12/how-to-set-lookup-field-value-using-javascript-dynamics-365/)
【SwiftUI】GeometryReaderを使うとレイアウトが変わってしまう件

# 22/8/8追記
こちらのページにGeometryReaderについて改めて整理しました

https://qiita.com/yocomaron/items/bf85b447826cc2ee335b

# 問題
動的にviewを作って各オブジェクトの位置を取得して、指定のY座標まで進んだら処理実行したい、なんてことありますよね。そんな時に`GeometryReader`使ったらレイアウト崩れちゃったんですけど！？ってお話。

1) これがGeometryReaderなし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734189/c2f1ed19-21cc-98e3-9b1d-47e38f3ca829.png)

2) これがGeometryReaderあり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734189/dc035349-8df8-367c-617c-2ae67fb2e1fa.png)
コンソールへのprint結果を見ると位置は取得できてそう。だけどレイアウト変わっちゃうと困ります・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734189/77eefbcc-bda8-f900-f77b-32cae3704609.png)


上記1,2の違いは、下記コードそのままが1, コメントアウトを解除したのが2
```swift
import SwiftUI
struct ContentView: View {
    var body: some View {
        VStack{
            ScrollView(.vertical, showsIndicators: false){
                VStack(spacing:0){
                    ForEach(1..<100) { num in
                        //GeometryReader {geometry in
                            Text("\(num)行目").background(Color.blue.opacity(0.1))
                        //    let _ = print(num, geometry.frame(in:.global).minY)
                        //}
                    }
                }
            }
        }
    }
}
```

# 解決
空のテキストを入れて、`GeometryReader`のサイズをゼロにしてやりました
```swift
import SwiftUI
struct ContentView: View {
    var body: some View {
        VStack{
            ScrollView(.vertical, showsIndicators: false){
                VStack(spacing:0){
                    ForEach(1..<100) { num in
                        GeometryReader {geometry in
                            Text("")
                            let _ = print(num, geometry.frame(in:.global).minY)
                        }.frame(height:0)
                        Text("\(num)行目").background(Color.blue.opacity(0.1))
                    }
                }
            }
        }
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734189/d6cf28f1-52f4-8394-2f0b-fffacb7d3fa4.png)
これで余計な余白はなくなって、コンソールで場所を取得できていることも確認できます（オブジェクトのサイズは取れてなくてスタート地点ですが）。

おしまい
IT未経験で「Java Bronze」合格を目指します！

IT未経験で「Java Bronze」合格を目指します！

【概要】
・まきさん（仮名）と申します。
・３０代前半で未経験からシステムエンジニアに転職を目指しています。
・すこしでも有利になればと思い、最初Java Silverを受験しましたが、正解率４０％弱で完敗。。。
　→８/７（日）に下位資格であるJava Bronzeを受験しましたが、正解率５１％でこちらも完敗。。。
・Java Bronzeは少なくとも受からないとまずいと思い、９月末までに再受験予定。
・毎日、勉強で気づいたことなどを投稿予定です。

-------------------------------------------------------------------------------------------

【勉強１日目】
■オーバーライドとオーバーロードの違い

＜オーバーライドのルール＞
・戻り値、メソッドのシグネチャ（メソッド名、引数の型、数、順番）がすべて同じ。
・アクセスレベルが親クラスと同じか緩い制限であること（例：親クラスがprotectedなら子クラスはpublicかprotectedを指定可能）。
備考：必須ではないが、オーバーライドするメソッド名の上に@Override（オーバーライドアノテーション）を付与するとメソッド名が間違っている時にエラーが出て気が付ける。

＜オーバロードのルール＞
・継承したクラスのメソッドをオーバーロードする際に、同じクラス内ではシグネチャ（この場合は、メソッド名以外の引数の型、数、順番）が重複してはいけない（メソッド名以外のシグネチャがどれかひとつは異なる）。

＜オーバーライドの例＞
```
// MainクラスでクラスBをインスタンス化しgreetingメソッドを実行
public class Main {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		B b = new B();
		b.greeting();
	}
}

// 英語であいさつするクラスAを作成
public class A {

	public void greeting() {
		System.out.println("Hello");
	}
}

// Aクラスをオーバーライド(上書き)して日本語であいさつするクラスBを作成
public class B extends A {
	@Override
	public void greeting() {
		System.out.println("こんにちは");
	}
}

```

＜オーバーロードの例＞
```
// Addクラスのインスタンスを２つ生成して、引数の型が異なるaddメソッドを２つ実行
public class Main {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ

		// 整数型の合計を求めるパターン
		Add ad1 = new Add();
		ad1.add(1, 2);

		// 浮動小数点型の合計を求めるパターン
		Add ad2 = new Add();
		ad2.add(1.5, 3.5);
	}
}

// Addクラスの中に、それぞれ引数がことなるaddメソッドを実行
public class Add {

	public void add(int a, int b) {
		System.out.println("aとbの合計は" + (a + b) + "です。");
	}

	public void add(double a, double b) {
		System.out.println("aとbの合計は" + (a + b) + "です。");
	}
}
```

【勉強２日目】
■アクセス修飾子について

アクセス修飾子についての問題が苦手なので、調べてみました。

|| 同じパッケージ内 | 同じパッケージ内 | 同じパッケージ | 別のパッケージ | 別のパッケージ |
|:-:|:-:|:-:|:-:|:-:|:-:|
| アクセス修飾子 | 同じクラス | サブクラス | 他クラス | サブクラス | 他クラス |
| public |〇|〇|〇|〇|〇|
| protected |〇|〇|〇|〇|×|
| なし |〇|〇|〇|×|×|
| private |〇|×|×|×|×|

-------------------------------------------------------------------------------------------

【勉強３日目】
■プリミティブ型について(基本型８つ)
boolean
byte
char
int
short
long
float
double
AWSで、RDSにdumpファイルをインポートする際にpvで進捗をみる


20GBぐらいのAWS Aurora (Mysql) のDumpファイルをリストアするのに10時間ぐらいかかっているため進捗が確認出来れば良いな、と。RDSなので、中から進捗を確認することもできず。

https://qiita.com/suzuki-navi/items/a851d9ec66d2cf4bf732

上記を参考。urlからインストール。

```
[root@ip-192-168-119-73 kd]# sudo rpm -ivh http://www.ivarch.com/programs/rpms/pv-1.6.20-1.x86_64.rpm
http://www.ivarch.com/programs/rpms/pv-1.6.20-1.x86_64.rpm を取得中
警告: /var/tmp/rpm-tmp.NvfZwm: ヘッダー V3 DSA/SHA1 Signature、鍵 ID 3fc56f51: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:pv-1.6.20-1.el6                  ################################# [100%]

```


```
[root@ip-192-168-119-73 kd]#  zcat newsdb_202208070000.dump.gz | pv | mysql -h renewal-db-development.cluster.ap-northeast-1.rds.amazonaws.com -pPassword -uroot dev_db --reconnect
28.5GiB 1:14:44 [6.50MiB/s] [                                         <=>                       ]
```

zcatで展開したdumpファイルをパイプに通して、リストア。

https://suzuki-navi.hatenablog.com/entry/2021/01/17/203303
 -L  オプションで、流す速度を制限できるので、リストアに関する負荷をコントロールすることができる。

```
$ COMMAND1 | pv -L 10 | COMMAND2
```
Windows Server 2016 構築時にやることリスト

## 環境
・Windows Server 2016 Standard
## やることリスト
毎回GUIでやるのは大変なのでコマンドでやっています。
ちなみに私の場合は、VBAでホスト名などを入れたら自動で設定コマンドを作成してくれるマクロを書いて使っています。
※全部一気にやろうとしたらおかしくなったので随所で再起動すること。

### １．IPの設定、確認
```java:
//インターフェース"Ethernet0"に対して192.168.1.10/24（GWのIP:192.168.1.1）を設定
> netsh interface ip set address "Ethernet0" static 192.168.1.10 255.255.255.0 192.168.1.1
//確認
> ipconfig /all
```
### ２．ライセンス認証
```java:
//ライセンスキーABCD-EFGH-IJKLM-NOPQR-STUWVの登録
> DISM /online /Set-Edition:ServerStandard /ProductKey:ABCD-EFGH-IJKLM-NOPQR-STUWV /AcceptEula
//再起動
> shutdown /r
```
### ３．ホスト名の変更
```java:
//ホスト名をVM01に設定
> wmic computersystem where name="%computername%" call rename name="VM01"
//再起動
> shutdown /r
```
### ４．ドメインへの参加
```java:
//ドメインMYDOMAINに参加
> wmic ComputerSystem WHERE "name='%computername%'" CALL JoinDomainOrWorkgroup Name="MYDOMAIN" Password="MYDOMAINPassword01" Username="MYDOMAIN\Administrator" FJoinOptions=3
//再起動
> shutdown /r
```
### ５．リモートデスクトップの許可
```java:
> reg add “HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server” /v fDenyTSConnections /t REG_DWORD /d “0” /f
```
### ６．ADサーバ上でドメインユーザの作成
リモートデスクトップ接続できるドメインユーザを作成していきます。
```java:
//ドメインremoteuser01@mydomain.comにremoteuser01を追加
> dsadd user "CN=remoteuser01,CN=Users,DC=mydomain,DC=.com" -display "remoteuser01" -pwd "RemotePassword01" -upn "remoteuser01@mydomain.com"
```
### ７．作成したユーザをローカルのAdministratorsグループに追加
```java:
> net localgroup Administrators mydomain\remoteuser01 /add
```
### ８．作成したユーザに対してリモートアクセスを許可
```java:
> net localgroup "Remote Desktop Users" mydomain\remoteuser01 /add
```
### ９．ファイアウォール穴あけ
これはGUIでやってます…
「セキュリティが強化されたWindows Defender ファイアウォール」
→「受信の規則」
→以下の規則をクリックして右クリック
→「規則の有効化」
・リモートデスクトップユーザモードTCP受信
・ファイルとプリンターの共有エコー要求ICMPv4受信
屋内測定技術まとめ


屋内測位技術（インドアマッピング）｜メリット・デメリット・事例・課題
https://club.informatix.co.jp/?p=4886

Metcom
https://drive.google.com/file/d/18ExaTwIradoJLRSxjpz3a7Bjo2ck8vss/view

その他：
https://asciistartup.connpass.com/event/251886/presentation/
PowerShellでテキストを処理する

# Powershellでテキスト処理

いまいちPowerShellにこなれていない感もあるがとりあえず。

PowerShellでテキストを処理するためのひな型
~~~PowerShell
$file = $args[0]

# input SJIS is ok (default)
# use -Encoding UTF8 if file in UTF8

$i=1
foreach ($l in Get-Content -Encoding UTF8 $file) {
    #行を選択する
    if( $l -match "ガーシー") {
        #行を処理する
        $l = $l -replace "ガーシー", "■■"
        $l = $l -replace "、", "▼"
        $l += "↓"
        Write-Output $l
    }
    $i++
}
~~~

# 注意点
* foreachの各行は行末の改行が取り除かれて渡される
* -match は大文字小文字を区別しない。大文字小文字を区別するときは -cmatch をつかう
* -replace は大文字小文字を区別しない。大文字小文字を区別するときは -creplace を使う
* -replace を左辺で使うと対象を変更する。また標準出力に出力する。右辺で使うと対象を変更しない。また標準出力に出力しない。
* -replace は置換対象を全て置換する。
* -replace のバリアントとして-creplace, -ireplaceがある。 -creplaceはケースセンシティブ、-ireplaceはイグノアケースである
* Get-Content のデフォルトはSJIS、UTF8のファイルを処理するときは明示的に -Encoding UTF8 を指定する。
* Write-Output は必ず最後に改行する。出力の文字コードはUTF16
ローカルにLaTeX環境つくるのクソめんどくさ。って人に


2022年3月に、情報理工系の大学を卒業しました。
「Microsoft Word ではなく、LaTeXで簡単に卒論を書きたい！」
「ローカルにLaTex環境構築すんのクソめんどくさ！！」という方に向けた記事です。　

#### 論文を書くために使用したツール

ラフ用にCloud LaTeXを使用し、Overleafを用いて先生と共有添削校正を行い卒論を完成させました。 


##### Cloud LaTeX

https://cloudlatex.io/users/sign_in

【利点】ローカルの面倒くさいLaTex環境が不要。PDF出力が簡単。
【欠点】基本1人で使用するためのデザイン。共著や先生から添削を頂く際は不便。

##### Overleaf, Online LaTex Editor

https://www.overleaf.com

【利点】リンクによるシェア機能によりリアルタイムで共同執筆が可能。チャット機能有り。
【欠点】説明が英語。
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

#### 余談

「うわ、関数なんだっけ、え、表ってどうやって書くんだっけ？」って時にめっちゃお世話になったサイトです。
##### LaTeX入門
https://medemanabu.net/latex/
フロントエンドからのJSonData、JAVA処理

```Java
String jsonData = "{" + "\"JsonDataTest\":" + "{\"id\":\"idTest\",\"name\":\"nameTest\"}"+"}";

// JSONObjectに変換
JSONObject jsonData1 = JSON.parseObject(jsonData);

// JSONのキーをもとに、value取得
JSONObject json1 = jsonData1.getJSONObject("JsonDataTest");
// JSONArray
JSONArray jsonArray = jsonData1.getJSONArray("JsonDataTest");

// 方法１
/*ObjectのJson value取得*/
// id取得
String idString = json1.getString("id");
// name取得
String name = json1.getString("name");

/*ArrayのJson value取得*/
for(int 1=0;i<jsonArray.size();i++){
 // id取得
 String idString1 = JSONObject.parseObject(JSONObject.toJSONString(jsonArray.get(i))).getString("id");
// name取得
String name1 = JSONObject.parseObject(JSONObject.toJSONString(jsonArray.get(i))).getString("name");
}

// 方法２ こっちのほうはよく使う
// dtoに変換　※TestDtoはid,name定義ある、get.setメソッドあるDto
TestDto testDto = JSON.parseObject(jsonData1.toJSONString,TestDto.Class);

List<TestDto> testDtoList = JSON.parseArray(jsonData1.toJSONString,TestDto.Class);
```
【Android】拡大・縮小させる！ZoomControlsについて

# はじめに
Androidには拡大ボタンと縮小ボタンを表示するZoomControlsというViewが存在します。
拡大ボタンと縮小ボタンを表示するだけであり、どのくらい拡大・縮小させるかは自前に実装しないといけません。

# ZoomControlsとは
ZoomControlsはLinearLayoutを継承しています。
また、子Viewとして2つのZoomButtonが存在し、
2つのZoomButtonはそれぞれズームインボタンとズームアウトボタンとして使用されています。

それぞれ
```
.setIsZoomInEnabled(false)
.setIsZoomOutEnabled(false)　
```

で無効化することができます。


また、
```
.setOnZoomInClickListener
.setOnZoomOutClickListener
```
で　クリックした時に呼ばれるコールバックインターフェースを設定することができます
Jetbrains IDEでページの一番上・一番下までの全選択

JetbrainsのIDEで`shift + cmd + up/down矢印`を押すと、デフォルトだとテキストが`Move statement up/down`と紐づけられてしまっています。（以下は`cmd + ,`コマンドからkeymap欄で見れます。）

![Screen Shot 2022-08-07 at 20.47.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/1acacbd8-fbce-8f65-3b19-8d1750498f7f.png)

ページ上・下まで全選択したい場合は`shift + cmd + fn + up/down`だそうです。

![Screen Shot 2022-08-07 at 20.46.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/ad42172e-3733-f7d7-9962-2915da797de1.png)

キーマップをこの際変えてしまってもいいかもしれないですね。このことについてもっと早く知りたかった。

2024年追記：いまだにこの`⇞`マークどうやって自分のMacbookで打つのかわからない。。。

## おまけ　`Always select opened files`

ここをチェックしておくことで、開けているファイルをセレクト状態にすることができます。

![Screen Shot 2022-08-09 at 22.13.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/978fcd58-0ad5-1524-af51-ace50b162acf.png)

参考：

https://intellij-support.jetbrains.com/hc/en-us/community/posts/360009478619-Navigate-to-current-file-on-the-folders-sidebar-