OmniAICreator/Qiita-1.07M huggingface dataset:
Eclipseで構築したサーバーが起動しないときの対処法

古い環境で需要のある内容ではないですが、かなりハマったので残しておきます。

# 開発環境
macOS Monterey 12.3.1
Eclipse 2019-12 (4.14.0)
Tomcat v8.0

# 概要
環境構築中、Eclipseでサーバーを構築し、起動させるとすぐにエラーメッセージがコンソール上に表示されました。
```text:コンソール
重大: Begin event threw exception [火 7 05 15:48:49 JST 2022]
警告: Catalina.start using conf/server.xml: Error at (21, 76) : org.apache.catalina.startup.VersionLoggerListener [火 7 05 15:48:49 JST 2022]
重大: Begin event threw exception [火 7 05 15:48:49 JST 2022]
警告: Catalina.start using conf/server.xml: Error at (21, 76) : org.apache.catalina.startup.VersionLoggerListener [火 7 05 15:48:49 JST 2022]
重大: Cannot start server. Server instance is not configured. [火 7 05 15:48:49 JST 2022]
```
メッセージにある通り、`server.xml`を確認しても特に変なところは見当たりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517594/15d082b2-e7ec-b798-32e5-f2005db9e2b7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517594/fa2b11e4-c3ab-b21b-5d91-bf79d5760f60.png)

調べてもいい解決方法がなく、他の方に確認してクリーンや除去→追加などいろいろ試しても全く改善しませんでした。

# 解決方法
構築したサーバーを一旦削除し、再度構築し直すと解消しました。
結局原因は判明しませんでしたが、これだけで解決。
困った時は試してみるといいかもしれません。
Concrete CMS で強引にパスワードリセットをする方法


お客さんの Concrete CMS の診断をするときなど、SQL Dump データをいただいても、ID や Password がわからない時があります。

そんな時は、MySQL データベースの中に入り、スーパー管理者のメールアドレスを社内のプロジェクト用グループメールや自分のメールアドレスに直接変更し、パスワードリセットを通じてログインできるようにします。

下記の説明は SSH ログインで MySQL or MariaDB の CLI Client を使う想定ですが、PHPMyAdmin などのウェブ管理画面や Sequal Ace などのアプリでも同じようなことができます。

# スーパー管理者のパスワードリセット方法

- 開発の SSH にログイン
- MySQL にログイン
    - `mysql -u ユーザー名 --password="パスワード" 開発のDB名前`
- uID = 1 の情報を取得
    - `select * from Users where uID=1;`
    - ここの結果で出てくる uName のカラムがログインIDです
    - メールアドレスが uEmail のカラム
- uID=1 のメールアドレスを希望するメールアドレスに変更
    - `UPDATE Users SET uEmail="example@example.co.jp" WHERE uID=1;`
	    - `example@example.co.jp` の部分を変えて実行してください
- 開発サイトのパスワード再発行ページに訪問
	- `[サイトURL]/index.php/login/concrete/forgot_password`
- パスワード再発行にてさっき変更したメールアドレスでに確認メールを送信し、パスワードを自分が覚えているランダムなものに変更する
    - メールが届かなない可能性があります。その時は MySQL にまた入って Logs テーブルから探します。
        - MySQL にログイン
        - `select * from Logs ORDER BY logID DESC limit 1;` 一番新しいログの1件を表示するというコマンド
        - パスワード再発行の URL を取得します。
    - メールログの記録を停止しているサイトもありますが、その際は config ファイルを修正して再開させます。（長くなるので割愛。もしも知りたかったら、 [Concrete CMS ユーザーフォーラム](https://forums.concretecms.org/) で質問してください。
- これでスーパー管理者の ID & Password の変更が完了です。

# おまけ: ユーザーのメールアドレス匿名化

Concrete CMS の中にあるユーザー情報からメールアドレスを example.com などに一括で変更するSQL文サンプルです。

SSH からのMySQL/MariaDB の CLI や、PHPMyAdmin や Sequal Ace などの「SQL」の項目から実行できます。

フォーマット

```
UPDATE Users SET uEmail=REPLACE(uEmail, "original", "example");
```



```
# メールアドレスから特定の文字列「original」だけを「example」に変更する
UPDATE Users SET uEmail=REPLACE(uEmail, "original", "example"); 
# メールアドレスを「ユーザー名@example.com」に変更する
UPDATE Users SET uEmail=CONCAT(uName, '@example.com');
# メールアドレスを「ユーザー名@example.com」に変更するけれど「@example.co.jp」のメールアドレスは変えない。（例：自分の会社メールアドレスは匿名化しない）
UPDATE Users SET uEmail=CONCAT(uName, '@example.com') WHERE uEmail NOT LIKE  "%@example.co.jp";
＃メールアドレスを「数字の連番@example.com」に変更するけれど「@example.co.jp」のメールアドレスは変えない。（例：自分の会社メールアドレスは匿名化しない）
UPDATE Users SET uEmail=CONCAT(uID, '@example.com') WHERE uEmail NOT LIKE  "%@example.co.jp";
# ユーザー名もスーパー管理者以外は連番だけにする
UPDATE Users SET uName=uID WHERE uID NOT LIKE  "1";

```


以上。
NSURLErrorDomainの内容

[NSURLErrorDomainのコード一覧](https://qiita.com/temoki/items/aaf96408de14cb40b704)、参考になったのですが、それぞれどういった内容なのかも知りたくなり、説明を見つけたので残しておく。
→ [URL Loading System Error Codes](https://developer.apple.com/documentation/foundation/1508628-url_loading_system_error_codes)
故意的に、これらのエラーを発生させる方法も知っておきたいが、50コもあるので一旦保留。

［参考］[NSURLErrorDomainのコード一覧](https://qiita.com/temoki/items/aaf96408de14cb40b704)
WordPressプラグイン「All-in-One WP Migration」の容量制限に引っかかった時の対処

WordPressのバックアップを取ってくれ、復元できるプラグイン「All-in-One WP Migration」。これを活用してローカル→リモートサーバーへの移設をしようとしたのですが、無料範囲でのインポートファイル容量が32MBなことに引っかかりました。
初回のエクスポートで500MB超でしたので完全アウトです。

抜け道はあるみたいで先にいくつか紹介しておくと

https://aiworldexplore.com/allinone-migration/

こちらは古いバージョンをインストールしてプラグインのコードを書き換える方法ですね。
該当箇所の最大容量の数字を変更するだけなので容易です。

https://www.zbuffer3dp.com/seo/allinonewpmigration-file-extension-free-downloard

こちらは拡張プラグインが無料の時代にダウンロードしていた人限定なので使えませんでした。

というわけで、どちらも正攻法ではないように思えるので、自分なりにどうすればスムーズに移設ができるかを確認しながら作業してみました。

結論から言うとこのプラグインを利用する意味はあまりなかったように思えますが、サイトによっては部分的にエクスポートへ含めることができるので、手順を残しておきます。

### 不要なファイルやプラグインを削除する

エクスポート時にファイルサイズが大きくなってしまうものはいくつかありますが、まずは不要なファイルの削除をしました。

・メディアにアップされた使っていない画像などのファイル
・使用していないもしくは一時的に使っていたプラグイン
・使用していないテーマ
・テーマファイル内の使用していない画像などのファイル
・テストの投稿

私は上記のものを削除しましたが、まだ215MBほどありました。

### エクスポートするファイルを取捨選択

次はエクスポートするファイルを除外するようにしました。こちらを行うと完全に移設できるわけではないので、一部は手作業での作用になります。プラグインの「エクスポート」画面から「高度なオプション」から除外する項目を指定します。

![スクリーンショット 2022-07-07 13.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656335/59879dca-eb88-3704-578a-ffc66f3a5b46.png)

どれを外したらたくさん減るかはサイト自体で変わると思いますが、私はなかなか無料範囲内まで容量削減ができなかったので下記のものを除外しました。

・スパムコメント
・投稿リビジョン
・メディアライブラリ
・テーマ
・必須プラグイン
・プラグイン

ほとんどですね・・・。これか除外した部分を手動で移設していきますが、スパムと投稿リビジョンは必要なかったので今回は除外します。

### テーマファイルの移設

プラグインでエクスポートしたファイルをインポートした後に、公開側のサイトを見るとテーマファイルがない状態なので`The theme directory "テーマファイル名" does not exist.`とエラーが表示されていました。

今回は有料のテーマファイルと子テーマを使っていたので両方をアップロードしたところ、テーマが適用されて表示されました。
プラグインがまだ移設されていないため表示崩れやエラーになる部分もあったのでアップします。

テーマファイルのありかは下記になります。

`/wp-content/themes`

### プラグインの移設

`index.php`や`all-in-one-wp-migration`ディレクトリは必要ないと思いますので、その他のプラグインをアップロードしました。やっていて思いましたが、プラグインでエクスポートしたデータをインポートする前に手動での移設をやっておいた方がいいですね。（反省）

プラグインファイルのありかは下記になります。

`/wp-content/plugins/`

### メディアライブラリの移設

データベースは移設できているので「メディア」のページにアクセスすると、登録されている画像の一覧化はされていました。画像ファイル自体は存在しなかったので、サムネイルが非表示の状態です。SFTPで接続してファイルをアップしましたところ、サムネイルもサイト内画像もアップされました。

メディアライブラリのファイルのありかは下記になりますので、リモートサーバーの同ディレクトリに全部のファイルをアップしましょう。

`/wp-content/uploads`

### パーマリンクの設定

ファイルのアップは終了したのですが、下階層のページに移動したところリンク切れが発生している状態でした。管理画面の「パーマリンク」の設定を確認すると、ローカル環境と同等になっていなかったので書き換えました。

### おわりに

以上で足りないファイルのアップロードが完了したので確認作業に移ります。WEBサイト側や管理画面の表示も問題なく、登録してあるデータも無事に移設されているようでした。
まだざっと確認している段階なので、このあとチームで確認して移設できていない部分がありましたら本記事に追加していきたいと思います。

正直言うと、これだけ手動でやっているとプラグインの意味あんまりなくて、データベースをダンプしてきてやった方が早そうですね。。。。次からはそうします。
Tezosのghostnetにローカルノードをつなげて蛇口からお金をもらう方法

Tezosのテストネットワークはプロトコルごとに edonet→granadanet→hangzhounet→ithacanetなど名前が変わってきたけど、毎回変わって不便ということから `ghostnet` という名前が変わらないテストネットが爆誕したようです。

手元にtezos-nodeがある人は `--network` オプションで　`ghostnet` を指定して利用することができるみたい。

```console
./tezos-node run --data-dir /data/tezos/test-ghost --rpc-addr localhost --network ghostnet
```
```
tezos-node: Error:
              Specified --network has chain name TEZOS_ITHACANET_2022-01-25T15:00:00Z,
              but current configuration implies expected chain name TEZOS_MAINNET. Use:
              tezos-node config init --network <NETWORK> to configure your node.
```
最初にconfig initが必要だった。

```console
./tezos-node config init --network ghostnet --data-dir /data/tezos/test-ghostnet/
```

あらためて

```console
./tezos-node run --data-dir /data/tezos/test-ghost --rpc-addr localhost --network ghostnet
```

## 蛇口からお金をもらう

https://teztnets.xyz/ghostnet-faucet
にアクセスして `Get Ghostnet ꜩ` ボタンからJSON形式で activation key を発行してもらいます。
例えば私は以下のようなやつをもらいました。

```json
{
	"pkh": "tz1gFFNknhYbVbvKREWiMNRWkNtNpMeqkM1L",
	"mnemonic": [
		"match",
		"loop",
		"muscle",
		"category",
		"shiver",
		"sail",
		"spring",
		"genius",
		"mixed",
		"board",
		"frost",
		"drink",
		"menu",
		"forget",
		"syrup"
	],
	"email": "ucjmdtko.xdxqyruq@teztnets.xyz",
	"password": "gwNRhyD1Pq",
	"amount": "23458877470",
	"activation_code": "c7d8d8d7791fcfc5064f5e16fd27f67fe482a775"
}
```

↑このjsonを例えば `faucet-ghostnet.json` みたいなファイル名で保存して、tezos-clientでactivate。

```console
./tezos-client activate account faucet with faucet-ghostnet.json 
```
10数秒ほど待って:
```
Node is bootstrapped.
Operation successfully injected in the node.
Operation hash is 'onjsMfvVh7SJiDnys7RyXXfNNFr4zurDjJibu4jcJ5aKmcNigEe'
Waiting for the operation to be included...
Operation found in block: BMRY55ASHBJDFki68VmpfVTr6jmY7Wt8wCrhSfk7Vhrs3Tt3EXH (pass: 2, offset: 0)
This sequence of operations was run:
  Genesis account activation:
    Account: tz1gFFNknhYbVbvKREWiMNRWkNtNpMeqkM1L
    Balance updates:
      commitment(btz1hQkz7ihVFRasGoceXDwDkwU1FN5MvfBDd) ... -ꜩ56392.322914
      tz1gFFNknhYbVbvKREWiMNRWkNtNpMeqkM1L ................ +ꜩ56392.322914

The operation has only been included 0 blocks ago.
We recommend to wait more.
Use command
  tezos-client wait for onjsMfvVh7SJiDnys7RyXXfNNFr4zurDjJibu4jcJ5aKmcNigEe to be included --confirmations 1 --branch BL3c8pJZ2aJoBN6WCmTL5h4mHXRV5bo5n5MC5FJHdQcPCqeKZYK
and/or an external block explorer.
Account faucet (tz1gFFNknhYbVbvKREWiMNRWkNtNpMeqkM1L) activated with ꜩ56392.322914.
```

`list known addresses` で確認すると faucetという名前で `56392.322914 ꜩ` もらえていることがわかるね　。ラッキー。

```console
$ ./tezos-client list known addresses
faucet: tz1gFFNknhYbVbvKREWiMNRWkNtNpMeqkM1L (unencrypted sk known)
```
```console
$ ./tezos-client get balance for faucet
56392.322914 ꜩ
```
【Android】複数ビューの表示/非表示処理の一括化

# 概要
複数ビューの表示/非表示処理を一括化する方法について。
複数ビューをグループ化する手法を説明。
親ビューの中に子ビューを複数作成し、親ビューのvisibilityを変更させる手法もあるが、ネストが深くなる。

# コード
レイアウトファイルに```androidx.constraintlayout.widget.Group```を追加し、```app:constraint_referenced_ids```にIDをコンマ区切りで記述。

```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:app="http://schemas.android.com/apk/res-auto"
	android:id="@+id/chart"
	android:layout_width="match_parent"
	android:layout_height="match_parent">

	<TextView
		android:id="@+id/text1"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="text1"
		app:layout_constraintBottom_toTopOf="@id/text2"
		app:layout_constraintEnd_toEndOf="parent"
		app:layout_constraintStart_toStartOf="parent"
		app:layout_constraintTop_toTopOf="parent"/>

	<TextView
		android:id="@+id/text2"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="text2"
		app:layout_constraintBottom_toTopOf="@id/text3"
		app:layout_constraintEnd_toEndOf="parent"
		app:layout_constraintStart_toStartOf="parent"
		app:layout_constraintTop_toBottomOf="@id/text1"/>

	<TextView
		android:id="@+id/text3"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="text3"
		app:layout_constraintBottom_toBottomOf="parent"
		app:layout_constraintEnd_toEndOf="parent"
		app:layout_constraintStart_toStartOf="parent"
		app:layout_constraintTop_toBottomOf="@id/text2"/>

	<androidx.constraintlayout.widget.Group
		android:id="@+id/group"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		app:constraint_referenced_ids="text1,text2,text3"/>
</androidx.constraintlayout.widget.ConstraintLayout>
```

処理側のコード
```MainActivity.kt
binding.group.visibility = GONE
```
[C#]VSCodeのOmniSharpで「定義へ移動」したときにデコンパイルする

Visual Studio で言うところの「逆コンパイルされたソースへのナビゲーションを有効にする」と同じ機能。

# omnisharp.json

```json
{
    "RoslynExtensionsOptions": {
        "EnableDecompilationSupport": true
    }
}
```

VSCode で開いたディレクトリのルートか、`~/.omnisharp/`に配置する。

https://github.com/OmniSharp/omnisharp-roslyn/wiki/Configuration-Options#roslyn-extensions-options
puttyのsshが自動で切れないようにする(Keepalive)

スクリプトを垂れ流しているのですが、puttyのssh接続が30~60分くらいで切れてしまうので困っていました。
というわけで、putty側の設定から**Keepalive**を設定します。

### 1.puttyの[設定の変更]から、[接続]を開きます。
![putty_session.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1919799/ea0a9ad7-922a-ddd0-df3e-99d8b6153517.png)

### 2.[セッションをアクティブに保つためのnullパケットの送信]で、適当な秒数間隔を指定します。
![putty_keepalive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1919799/2aa495b0-1e22-e8d6-ce91-790b39a1012f.png)

### おわりに

自動でパケットを送ってくれるので、非アクティブ扱いの切断はなくなります。
ただ、**切らない限り繋げっぱなし**になるので、**セキュリティ面**は十分注意が必要です。
設定を保存せずに、セッションごとに設定するほうが良いかも。
APIサーバーから200が返ってくるのに画面では502になりハマった話

# はじめに
api開発に携わっているフリーランスエンジニアです。
今回はapi開発にあたって、単体テストを通過して結合テストの際にフロント画面で正常動作しているかを確認している際に起こった出来事です。

ネットで調べてもドンピシャな解決法が出てこなかったので、自分に対する備忘録も兼ねてシェアできればと思います。

### トピック
- 事象
- 原因
- 解決方法
- 教訓

### 環境
php  7.1
Laravel 5.5
nginx  /1.13.8

# 事象
api開発をし終わり、postmanを使って直接apiサーバーのエンドポイントを叩き、外部apiから情報を取得して、200でレスポンスを返すところまで確認。
テストも作成し、カバレッジも100%。

フロントサーバーからapiサーバーにリクエストを送り挙動を確認する結合テストにおいて、レスポンスは200なのに、フロント画面ではエラーになってしまった。調査してログを見るとフロントサーバーからのリクエストで返ってくるhttp_codeが502だった。

# 原因
apiサーバーのログを確認するが、正常の動作をしておりbodyの中を確認しても変なデータは入っておらず200で返していた。。。。

なぜ・・・・

あ、見逃していたログがあった。
サーバー内のアクセスログ。
確認してみると下記のようなエラーログが・・・

```
upstream sent too big header while reading response header from upstream,
```

どうやらレスポンスヘッダーサイズが大きすぎて怒られているみたい。

# 解決方法

調べてみたら下記記事で同じ事象について書かれていました。
https://oxynotes.com/?p=12011#:~:text=%E3%80%8C%20upstream%20sent%20too%20big%20header%20while,reading%20response%20header%20from%20upstream%20%E3%80%8D%E3%81%AE%E6%84%8F%E5%91%B3%E3%81%AF%E3%80%8C%20%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%99%E3%81%8E%E3%82%8B%20%E3%80%8D%E3%81%A8%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82

> FastCGIレスポンスのためのバッファサイズを大きくすると解決します。

らしい。

> proxy_buffers
> proxy_buffer_size
> proxy_busy_buffers_size

こいつらのバッファサイズを大きくすると・・・・いけた！！！！！！

# 教訓
明らかにphpのログで異常な動きをしていない場合は、サーバー自体の設定で怒られている可能性が高い。そこに仮説を立てて調べたらより早くデバックできます。
Google Colab  - 使用方法メモ

# Google Colab 使用方法メモ
- Linuxコマンド
  - Google Colab/juputernotebookではコマンドの頭に「!」や「%」を付けるとLinuxコマンドが使える
　　- 「!」: 一時的な処理
　　- 「%」: 永続的な処理。 e.g., ディレクトリの移動
　　
- tensorflowを使う場合：
　  - バージョンを統一するため、一度tensorflowをアンインストール→再インストールする。e.g., requirements.txtがある場合は、そのファイルに記載されているライブラリをインストールする。


- Google ColabとDriveの連動
　　　- Google ColabとGoogle Driveを接続：Google DriveにアップロードしたファイルをGoogle Colabで処理可能
　　　- 下記コマンドを入力すると認証用のURLと入力フォームが表示されるので、そのURLにアクセス→authorization codeをコピー→入力フォームにペースト。
```
from google.colab import drive
drive.mount('/content/drive')
```
【Python】glob.globで隠しファイルを検索する方法

## はじめに
globライブラリを用いた時に困ったことについてです。
隠しファイルのファイルを検索する際に、globライブラリでは、検索することができません。
その対処方法を書き記します。

## 対策案は2パターン
無理やりglobライブラリを隠しファイル検索できるようにしますが、別の対処法の仕方もあるので、基本そちらを使うようにしましょう。
### 1. 別のライブラリを使う
sbprocessを用いてファイル検索をする等…

### 2. glob.glob で隠しファイル検索をできるようにする
詳細は以降に

## glob.glob() で隠しファイルを検索する方法
検索する前に隠しファイルを排除している関数の結果を全て隠しファイルでないと設定するだけ。
検索する前に以下のソースを挿入する。
```
glob._is hidden = lambda x: False
```
<font color="Red">注意:関数を上書きするので、後続処理で元に戻したくても戻せなくなってしまうため、上書き前に関数を変数に代入して戻すことを推奨します。</font>
xdebugで504 Gateway Time-outが発生する

# 概要
xdebugでデバッグしていると、以下のようにタイムアウトが発生しました。
![スクリーンショット 2022-07-05 13.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761132/c82e4bf9-c99a-7a50-6669-178044b95a6a.png)

# 環境
エディター: VSCode
Docker: 20.10.12
Nginx: 1.20.1
xdebug: 3.1.4
PHP: 8.0.6
Laravel: 8.44.0

# 解決策
nginxの```fastcgi_read_timeout```がデフォルトだと60秒に設定されているため、すぐにタイムアウトしてしまいます。
これだと快適にデバッグが出来ないので、```fastcgi_read_timeout```を長めに設定します。
```defaut.conf
server {
    location ~ \.php$ {
        fastcgi_read_timeout 3600;
    }
}
```

設定を反映させるため、以下を実行します。
```
sudo nginx -s reload
```

これで快適にデバッグが行えます:raised_hands:
mvn dependency:tree 相当のことをgradleで実施するには

gradleにはデフォルトではmvn dependency:tree 相当のコマンドがない。
同じことをするには、project topにあるbuild.gradleに下記を追記し、`gradle allDeps`を実行する必要がある。
```
subprojects {
    task allDeps(type: DependencyReportTask) {}
}
```
フーリエ級数展開を可視化するMATLABスクリプトを書いてみた

何となくフーリエ級数展開を説明する可視化が欲しいなー，と思い立ちMATLABで書いてみました．類似の実装は世の中に山のようにあるはずですがあえて調べません．

出力はこんな感じになります．ライブスクリプトを実行するとアニメーションになってくれるので，MATLABをお持ちの方は下記ソースコードをコピペして実行してみてください．
![untitled2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570966/2da6be9c-9ee7-a992-7026-ac400fdf5be4.png)



``` MATLAB
clear
clc
close all

n=1:7; %項数の設定
b=zeros(max(n),1); %係数ベクトル
t=linspace(0,2*pi,200); %1周期の時刻

% fの設定
plot_f=[sign(sin(t))]; %矩形波
% plot_f=[t/pi];plot_f=plot_f-mean(plot_f); %のこぎり波
% plot_f=cumsum([sign(cos(t))])*(t(2)-t(1));
% plot_f=sin(t)+1/3*sin(3*t)+0.1*randn(size(t));
plot_f=plot_f-mean(plot_f); %平均を0にシフト

% 係数の数値積分(関数の内積)
for n1=n
    b(n1)=sin(n1*t)*plot_f'/(sin(n1*t)*sin(n1*t)');
end

figure
plot_t=[];plot_y=[];plot_x=[];
for t1=t
    xc=0;yc=0;
    clf
    axis equal;grid on;
    set(gca,'fontname','Arial','fontsize',12)

    hold on;
    for n1=n
        plot([xc,b(n1)*cos(n1*t1)+xc],[yc,b(n1)*sin(n1*t1)+yc],'b-o')
        plot(b(n1)*cos(n1*t)+xc,b(n1)*sin(n1*t)+yc,'k:')
        xc=xc+b(n1)*cos(n1*t1);
        yc=yc+b(n1)*sin(n1*t1);
    end
    plot_t=[plot_t;t1];
    plot_x=[plot_x;xc];
    plot_y=[plot_y;yc];
    plot(t, plot_f,'r--')
    plot([xc,plot_t(end)],[yc,yc],'b:o')
    plot(plot_x, plot_y,'b--')
    plot(plot_t, plot_y,'g-')
    hold off
    drawnow
end



```
設定するべき箇所は項数`n`と被展開関数の数値列`plot_f`です．時刻のベクトル`t`を1周期として$\sin nt$で展開したものを図示します． 

展開したい関数として` plot_f=sin(t)+1/3*sin(3*t)+0.1*randn(size(t)) `なんかを選ぶと基本波と3倍高調波のみ現れて雑音が消去されていることなんかもわかります．
![untitled3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570966/8f9edbc1-0571-c510-1e94-0587ffa3efae.png)

動画ファイルとしての書き出しは`VideoWriter`を参照してください．

https://jp.mathworks.com/help/matlab/ref/videowriter.html

`avi`を`gif`に変換したい場合，下記のプログラムが便利です．対話型で細かな設定(ループ回数，最初と最後の静止時間)が可能です．

https://jp.mathworks.com/matlabcentral/fileexchange/28772-avi-to-gif-convertor
rails sができない（Address already in use - bind(2) for "127.0.0.1" port 3000 ）

いつも通りrails sをしたら上記のエラーが出たので解決方法を載せておきます

現在動いてるRubyのプロセスを確認
```
$ ps -ax | grep ruby
```

このように表示される
```
49551 ?? 0:00.00 /Users/UserName/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/rb-fsevent-0.11.1/bin/fsevent_watch --format=otnetstring --latency 0.1 /Users/UserName/Rails_product/you_conect/config/locales
49552 ?? 0:00.00 /Users/UserName/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/rb-fsevent-0.11.1/bin/fsevent_watch --format=otnetstring --latency 0.1
```
動いてるプロセスを終了する
```
例：　kill 49551
$ kill ポート番号
```
それでも終了できない場合は強制終了
```
$ kill -9 ポート番号
```

これで普通はうまくいくはず
しかし自分の場合はこれでも上手くいかなかった
```
$ rails s
エラー文
（Address already in use - bind(2) for "127.0.0.1" port 3000 ）
```

そこでport3000を使ってるのを検索する
```
$ lsof -i :3000

COMMAND   PID           USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node    24955 UserName   26u  IPv4 0xae9f2b2917715115      0t0  TCP localhost:hbci (LISTEN)
```
このように使われているのがあったため
```
$ kill 24955
```
再度 rails sをしたら上手く動いた

```
$ rails s
=> Booting Puma
=> Rails 6.1.6 application starting in development 
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.6.4 (ruby 3.1.0-p0) ("Birdie's Version")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 48888
* Listening on http://127.0.0.1:3000
* Listening on http://[::1]:3000
Use Ctrl-C to stop
```

## 最終手段
めんどくさい時や上記の方法で解決しないときはPCを再起動しましょう
要は裏で動いてるのを再起動で、真っ白にするイメージです。
これで解決
Next.jsでベーシック認証をかける

[Vercelが公開しているサンプル](https://github.com/vercel/examples/tree/main/edge-functions/basic-auth-password)をベースに、微調整を加える。

まず、pages配下に_middleware.jsを作る。

```
cd pages
touch _middleware.js
```

TypeScriptを使っている場合は、冒頭のサンプルをそのまま流用すれば良い。
わたしの場合は、TypeScriptを使っていなかったため、型チェックの記述を削除する等、適宜調整を加えた。

```js:_middleware.js
import { NextResponse } from 'next/server'

export function middleware(req) {
  const basicAuth = req.headers.get('authorization')

  if (basicAuth) {
    const auth = basicAuth.split(' ')[1]
    const [user, pwd] = Buffer.from(auth, 'base64').toString().split(':')

    if (user === process.env.BASIC_AUTH_USER && pwd === process.env.BASIC_AUTH_PASSWORD) {
      return NextResponse.next()
    }
  }

  return new Response('Auth required', {
    status: 401,
    headers: {
      'WWW-Authenticate': 'Basic realm="Secure Area"',
    },
  })
}
```

続いて、ユーザー名、パスワードを設定する。ルートディレクトリにて、`.env.local` を作る。

```
touch .env.local
```

環境変数を記述。

```.env.local
BASIC_AUTH_USER='user'
BASIC_AUTH_PASSWORD='passowrd'
```

おそらくデフォルトで記載されているはずだが、もし`.gitignore`に記載されていなければ記載しておく。

```.gitignore
# local env files
.env.local
.env.development.local
.env.test.local
.env.production.local
```

以上で、ベーシック認証がかかる。
Vercelにデプロイする際は、Vercelの管理画面側で、環境変数を適宜設定する。


1. Vercelの該当プロジェクトに移動
2. `Setting`をクリック
3. `Environment Variables` から、それぞれ`NAME` `VALUE`を追加。

これでVercel側にもベーシック認証がかかる。

わたしの場合、上記の`_middleware.js`を追加してVercelにデプロイした際、以下のエラーが出て失敗した。

```
./pages/_middleware.js
Module not found: Can't resolve 'buffer' in '/vercel/path0/pages'
```

`buffer`というモジュールがないと言われているので、素直に追加。
[buffer](https://www.npmjs.com/package/buffer)は、バイナリデータを扱うために必要になる。

```
npm install buffer
```

`package.json`と`package-lock.json`が変更される。これを踏まえて再デプロイしたところ、今度は成功した。
【Flutter】Android Studioで作成したアプリをFirebaseに接続する【Android】

Android用のFirebaseの設定を次回やる時に忘れそうなのでメモしておきます。

# 1.Firebaseのプロジェクトを作成する



# 2.Androidボタンをクリック
Androidのアイコンをクリックしてね
![スクリーンショット 2022-07-07 11.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030574/ea6036b2-82b2-c8bb-ec13-8ab521125cb2.png)


# 3.アプリの登録をしていく
![スクリーンショット 2022-07-07 11.22.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030574/186aeced-1aa0-4564-89e1-de88d62583c0.png)

# 4.パッケージ名の取得
Firebaseに使いたいアプリのandroidフォルダ配下のbuild.gradleを開き、defaultConfig欄に進む。
applicationIdをコピーしてFirebaseのAndroidパッケージ名にペーストする。
![スクリーンショット 2022-07-07 11.36.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030574/091ee50e-942e-0e87-1eb8-a34cb25bac5f.png)

# 5.設定ファイルのダウンロード後の処理
## 5-1.ダウンロードしたあとはAndroidフォルダ配下のappフォルダ直下にドラッグ＆ドロップする。
![スクリーンショット 2022-07-07 11.42.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030574/b10a3a20-c482-bbc8-93ca-b9827c6f77b5.png)

## 5-2.Search for referencesに☑を入れる
![スクリーンショット 2022-07-07 11.58.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030574/08e5593a-03fd-7322-3031-c85c6dd2d96e.png)

# 6.プロジェクトに戻す
Flutterを使う際はFirebase上のAndroidの設定は必要ないので、画面に従って進む
コンソールに進むをクリックするとプロジェクトに戻る
![スクリーンショット 2022-07-07 12.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030574/0da2aedc-fa2f-ebe1-9adf-541743388d61.png)
Salesforce活動リストアクションの追加及び削除方法

Salesforceの活動リストの「▽」マークをクリックすると
・日付の変更
のように編集が簡単にできるアクションの設定が可能です

容易に活動の変更が可能なのでぜひ活用してみてください。

のように![活動リスト一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7f2a5d48-da25-fcb6-9f21-d51feed34469.png)


このアクションの設定場所は
Todoページレイアウト
の
「Salesforce モバイルおよび Lightning Experience のアクション」
にアクションを入れることにより対応可能です
![アクション１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/39bdd47e-c790-23da-b666-409544476050.png)


もしも入れられるアクションが無い場合、Todoオブジェクトのアクションを作成する必要がございます。
![新規アクション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/775340e7-0d56-b58c-ea9f-2e847aff7426.png)
同意が必要な主なケース

### [全体の目次](https://qiita.com/tetz1/items/da4eb31b920f2acf4349)
---
#### 「本人の同意」（個人情報の保護に関する法律についてのガイドライン（通則編）- 定義 - 2-16）

## 本人の同意が必要な主なケース

個人情報の取り扱い（法第18条第1項）
あらかじめ本人の同意を得ないで、第17条の規定により特定された利用目的の達成に必要な範囲を超えて、個人情報を取り扱ってはならない

#### 利用目的に関するもの
法第18条第2項及び第3項第2号から第4号まで（3-1-4（事業の承継）、3-1-5（利用目的による制限の例外）参照）
#### 要配慮個人情報の取得に関するもの
法第20条第2項（3-3-2（要配慮個人情報の取得）参照）
#### 個人データの第三者提供に関するもの
法第27条第1項及び第28条第1項（3-6-1（第三者提供の制限の原則）、3-6-4（外国にある第三者への提供の制限）参照）
#### 個人関連情報の第三者提供に関するもの
法第31条第1項（3-7（個人関連情報の第三者提供の制限等）参照）
「本人の同意」とは、本人の個人情報が、個人情報取扱事業者によって示された取扱方法で取り扱われることを承諾する旨の当該本人の意思表示をいう（当該本人であることを確認できていることが前提となる。）。

## 「本人の同意を得（る）」とは？
「本人の同意を得（る）」とは、本人の承諾する旨の意思表示を当該個人情報取扱事業者が認識することをいい、事業の性質及び個人情報の取扱状況に応じ、本人が同意に係る判断を行うために必要と考えられる合理的かつ適切な方法によらなければならない。

なお、個人情報の取扱いに関して同意したことによって生ずる結果について、未成年者、成年被後見人、被保佐人及び被補助人が判断できる能力を有していないなどの場合は、親権者や法定代理人等から同意を得る必要がある。

## 本人の同意を得ている例
例）本人からの同意する旨の口頭による意思表示
例）本人からの同意する旨の書面（電磁的記録を含む。）の受領
例）本人からの同意する旨のメールの受信
例）本人による同意する旨の確認欄へのチェック
例）本人による同意する旨のホームページ上のボタンのクリック
例）本人による同意する旨の音声入力、タッチパネルへのタッチ、ボタンやスイッチ等による入力

https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a2-16
公表が必要な主なケース


### [全体の目次](https://qiita.com/tetz1/items/da4eb31b920f2acf4349)
---

#### 「公表」（個人情報の保護に関する法律についてのガイドライン（通則編）- 定義 - 2-15）

## 公表が必要な主なケース

#### 個人情報の取得
個人情報取扱事業者は、個人情報を取得した場合は、あらかじめその利用目的を公表している場合を除き、速やかに、その利用目的を、本人に通知し、又は公表しなければならない

#### 利用目的に関するもの
法第21条第3項（3-1-2（利用目的の変更）参照）

#### 仮名加工情報に関するもの
法第41条第4項、第6項及び法第42条第2項（3-10（仮名加工情報取扱事業者等の義務）参照）

#### 匿名加工情報に関するもの
法第43条第3項、第4項及び第6項、第44条、並びに第46条（3-11（匿名加工情報取扱事業者等の義務）参照）

#### その他
法第57条第3項（5-2（適用除外）参照）
「公表」とは、広く一般に自己の意思を知らせること（不特定多数の人々が知ることができるように発表すること）をいい、公表に当たっては、事業の性質及び個人情報の取扱状況に応じ、合理的かつ適切な方法によらなければならない。

## 「公表」とは？
「公表」とは、広く一般に自己の意思を知らせること（不特定多数の人々が知ることができるように発表すること）をいい、公表に当たっては、事業の性質及び個人情報の取扱状況に応じ、合理的かつ適切な方法によらなければならない。

## 「公表」の例
例）自社のホームページのトップページから1回程度の操作で到達できる場所への掲載
例）自社の店舗や事務所等、顧客が訪れることが想定される場所におけるポスター等の掲示、パンフレット等の備置き・配布
例）（通信販売の場合）通信販売用のパンフレット・カタログ等への掲載

https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a2-15
cscの作法 その231

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題

コマンドプロンプトだけで、ソース書いて、コンパイル、実行せよ。

# 方針

- echoで、ファイルに書き込む。
- cscで、コンパイル。

# 手順

```
>echo using System; > hello3.cs
>echo class Hello { >> hello3.cs
>echo    static void Main()    { >> hello3.cs
>echo       Console.WriteLine("Hello, World"); >> hello3.cs
>echo    } >> hello3.cs
>echo } >> hello3.cs

>C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe hello3.cs

>hello3
Hello, World


```


以上。
本人への通知が必要な主なケース


### [全体の目次](https://qiita.com/tetz1/items/da4eb31b920f2acf4349)
---

#### 「本人に通知」 （個人情報の保護に関する法律についてのガイドライン（通則編）- 定義 - 2-14）

## 本人への通知が必要な主なケース

#### 個人情報の取得
個人情報取扱事業者は、個人情報を取得した場合は、あらかじめその利用目的を公表している場合を除き、速やかに、その利用目的を、本人に通知し、又は公表しなければならない

#### 利用目的に関するもの
法第21条第3項及び第4項（3-1-2（利用目的の変更）、3-3-5（利用目的の通知等をしなくてよい場合）参照）

#### 漏えい等に関するもの
法第26条第2項（3-5-4（本人への通知）参照）

#### 個人データの第三者提供に関するもの
法第27条第2項及び第3項、並びに第5項第3号及び第6項（3-6-2（オプトアウトによる第三者提供）、3-6-3（第三者に該当しない場合）参照）

#### 外国にある第三者への提供における情報提供に関するもの
法第28条第3項並びに規則第18条第4項及び第5項（3-6-4（外国にある第三者への提供の制限）参照）

#### 開示等の請求等に関するもの
法第32条第2項及び第3項、法第33条第3項（同条第5項において準用する場合を含む。）、法第34条第3項並びに法第35条第7項（3-8-1（保有個人データに関する事項の公表等）、3-8-2（保有個人データの開示）、3-8-3（第三者提供記録の開示）、3-8-4（保有個人データの訂正等）、3-8-5（保有個人データの利用停止等）参照）

## 「本人に通知」とは？
「本人に通知」とは、本人に直接知らしめることをいい、事業の性質及び個人情報の取扱状況に応じ、内容が本人に認識される合理的かつ適切な方法によらなければならない。

## 「本人に通知」の例
例）ちらし等の文書を直接渡すことにより知らせること。
例）口頭又は自動応答装置等で知らせること。
例）電子メール、FAX等により送信し、又は文書を郵便等で送付することにより知らせること。


https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a2-14
【Mac M1環境】インテルCPU用のDockerイメージをRosetta 2技術で動かす技！

コンテナ技術について、勉強中。
いくつも記事を読んだのですが、下記のサイトが、初心者には非常に分かりやすいと思います。

https://knowledge.sakura.ad.jp/13265/

１.
下記のアーキティクチャーの通りですが、下記の絵は、多少の誤解を招くと思います。
と言うのも、この絵で言う所の"Docker Engine"が、ホストマシンの差異（CPUの差異）とかを吸収している様に見えますが、実は、Docker　Engineは、「CPUの差異を吸収しないこと」が判明しました。

![0707x.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/7cccd9e5-36a2-985e-96fd-d6b383c1c33b.jpeg)


２.
よく読むと、上記サイトには、下記記載があります。
ホストマシーンのカーネルを利用しております。

>VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かします。それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。そのため、軽量で高速に起動、停止などが可能です。

まあ、こういう訳なので、移植性と言うことに注目すれば、ハイバーバイザー上で動く仮想インスタンスに劣るのでしょうが、「ちょっとテストしよう。」と言う場合は、コンテナは秀逸ですね。

３.
「ホストマシーンのカーネルに依存する」と言う前提に立てば、Docker　Hubのサイトで、インテルCPU向けかARM向けのDockerイメージか？　が分類されているのも納得できます。

https://www.docker.com/products/docker-desktop/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/8a551f2b-9faf-af6a-845f-cce5a97adfb6.png)

尚、私は、「差異を吸収する」と思い込んでいました。
従って、自分のMac M1　PCに、インテル用のDockerイメージを入れても、うまく立ち上がらないので、丸２日間悩んでおりました。（Runしても、すぐ落ちる。）

４.
さて、ここからが本題です。
では、Mac M1 PCにDocker Desktopをインストールして（Mac with Apple Chipをインストールする必要がある。）、Dockerイメージを使いまくろうと思って、Docker Hubのサイトを物色したが、殆どがインテルCPU用のイメージです。

https://www.docker.com/products/docker-desktop/

となると、「Mac M1でDockerイメージが使えないじゃん？」と、絶望的な気持ちになり、「Windows PCを選択すれば良かった。」と死ぬほど後悔しました。


５.
ところが、色々と調べまくったら、ソリューションがありました。

https://support.apple.com/ja-jp/HT211861

>Rosetta 2 を使えば、Apple シリコンを搭載した Mac でも、Intel プロセッサ搭載 Mac 用に開発された App を使えるようになります。

基本的に、Mac PCをそこそこ使っている人は、知らない内にRosetta２をインストールしている筈ですが、念の為、ターミナルで下記コマンドを走らせた方が良いです。
```
$ softwareupdate --install-rosetta
```

６.
Roseeta２がインストールされていれば、インテルCPU向けのDockerイメージも、Mac M1で動くことが確認できました。

例えば、インテルCPU専用のPython実行環境のDockerイメージは下記にあります。
https://hub.docker.com/r/circleci/python

下記のコマンドでインストールできます。
amd64のPlatformが指定されておりますが、Rosetta2のお陰様で、きちんとMac M1のDocker　Desktopでも動きます。

```
docker run -it --rm --platform linux/amd64 --entrypoint=/bin/bash circleci/python
```
【Flutter】カメラの使用許可を得るための設定【iOS】


# Runner.xcodeprojファイルの設定をする
簡単にできたのでメモ程度です。

## 設定を行いたいFlutterアプリのファイルを開きRunner.xcodeprojを開く

パスはおよそこんな感じかと思います
/Users/ユーザー名/StudioProjects/アプリ名/ios

### Runner.xcodeprojはこの青いファイル
![スクリーンショット 2022-07-05 12.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030574/9273c4aa-5161-919a-9128-bbfc75504d1a.png)

## RunnerディレクトリのInfoを開く
開いてみるとこんな感じになるかと思います。
![スクリーンショット 2022-07-05 12.06.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728559/edaae867-2a55-d753-e482-c1f86d3942df.png)

## Information Property Listで＋ボタンを押下
![スクリーンショット 2022-07-05 12.16.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030574/b4bb62d3-36de-fce5-ab58-09663eb08c6f.png)
そうするとこのように選択肢が出てくるので、以下の項目を追加する。


![スクリーンショット 2022-07-05 12.17.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030574/1cbfbd67-b8f8-1a17-b646-5d0a8e2aa49c.png)



## カメラ・アルバムの使用許可の設定
:::note info
追加する設定
Privacy - Camera Usage Description
　→カメラの使用許可


Privacy - Photo Library Usage Description
　→アルバムの使用許可
:::

これ追加するだけで使用許可の設定ができるなんてめっちゃ楽ですね。



今日はカレーを食べに行きます。
Python の実行ファイル（.py）の作成

# 概要
jupyter notebook などはノートブック形式で作業ができるため，見た目的にも非常に使い勝手が良い統合開発環境（IDE）が提供されるようになりました．こういった開発環境に慣れてしまい，いざ Python の実行ファイルである .py ファイルの形でプログラムを作成しないといけない場合に，どういった記述方法だったかパッと思い出せないときのために基本となる書き方の構造を記録しておきます．
Python プログラミングの初心者の方にもご参考になれば幸いです．

# プログラムの構成
早速ですが，プログラムの構成です．以下の記載しますが，基本的には，
① 先頭の import でプログラムに必要なライブラリを読み込む  
※ライブラリにはパッケージやモジュールも含む  
② プログラムの処理を実行する main 関数を記述する  
③ main 関数の処理を読み込んで実行する
といった構成になっています．

```
import # ここに必要なライブラリを記述

def main():
    # 実行する処理を記述

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

main で実行する処理は別途関数を定義して，main 関数から呼び出すこともできます．

```
import # ここに必要なライブラリを記述

def main():
    data = load_data() # データを読み込む関数
    # データ読み込み後，実行する処理を記述

def load_data():
    # データ読み込みの処理を記述

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

また，main 関数など定義せずに書きたいという場合には，以下のような記述方法もあります．

```
import # ここに必要なライブラリを記述

# 実行する処理を直接記述
```
いずれの方法でも作成したファイルを .py 形式で保存することで，Python の実行ファイルを作成することができます．
Qiitaの記事を書いてみる

# なぜ書くのか？
- 自分で得た知識をアウトプットすることで知識の定着につなげたい
- 忘れたときに見返したい
- 就活の際にQiitaのアカウントを書く欄があるのでとりあえずそこに乗せられるようなレベルにしたい

このような経緯でQiitaを書いてみようと思い至りました。

# 実際に書いてみる
競技プログラミングAtcorderで実際に書いたコードをQiitaで使える機能や文法をなるべく使いながら記載したいと思います
今回掲載しているAtcorderの問題は以下です。
[Atcorder](https://atcoder.jp/contests/typical90/tasks/typical90_d)

# 解説
**問題文**
H 行 W 列のマス目があります。上から i (1≤i≤H) 行目、左から j (1≤j≤W) 列目にあるマス (i,j) には、整数 A[i][j]が書かれています。すべてのマス (i,j) (1≤i≤H,1≤j≤W) について、以下の値を求めてください。
- マス (i,j) と同じ行または同じ列にあるマス（自分自身を含む）に書かれている整数をすべて合計した値

**制約**
- 2≤H,W≤2000
- 1≤A[i][j]≤99
- 入力は全て整数
以下ソースコードを記載します
```python:cross_sum.py
a=list(map(int,input().split()))
H=[]
C=[]
R=[]
Answer=[]
for i in range(a[0]):
    b=list(map(int,input().split()))
    H.append(b)

for i in range(a[0]):
    sum_c=0
    for j in range(a[1]):
        sum_c+=H[i][j]
    C.append(sum_c)

for j in range(a[1]):
    sum_r=0
    for i in range(a[0]):
        sum_r+=H[i][j]
    R.append(sum_r)


for i in range(a[0]):
    D=[]
    for j in range(a[1]):
        D.append(str(C[i]+R[j]-H[i][j]))
    Answer.append(D)


for i in range(len(Answer)):
    s=' '.join(Answer[i])
    print(s)
```

本来ならばこの後でコードについての解説をしていく流れになりますが、あくまで今回はQiitaの書き方の紹介なので、ここでは上記で使ったものについて記載していきます。

# 見出し
文章の最初に#をつけることでその文章が見出しになります。その際に半角スペースを入れることに注意してください。
また、##のように#の数を増やすにつれ文字のサイズが小さくなっていきます。
>### 見出し
```
### 見出し
```
このようにサイズを小さくすることが出来ます。
# 箇条書き
文章の最初に*をつけることで箇条書きが実現できます。
* 1
* 2 
```
* 1
* 2
```
文章と*の間に半角スペースを入れる必要があることに注意してください。
また、今回は使用していませんが番号付きリストについては「数字. 」をつけることで実現できます。
# リンク
今回使ったのは[Atcorder](https://atcoder.jp/contests/typical90/tasks/typical90_d)でしたが、このリンクは以下で実現できます。
```
[Atcorder](https://atcoder.jp/contests/typical90/tasks/typical90_d)
```
書き方としては
```
[Qiita上に表示させたいテキスト](リンク)
```
といった形です。
# 太字
太字を使うことで**このように強調することが出来ます。**
太字は以下で実現できます。
```
**強調したい文章**
```
# 参考
[Qiita 初心者向け書き方まとめ](https://qiita.com/ryu3/items/27e77aa35e44f8926933)
[Mac]VScodeで使えるショートカット

■設定を開く
`Command` + `,`

■ターミナルの表示/非表示
`command + J`

■サイドバーの操作

サイドバーの表示/非表示
`command`+`B`

サイドバーへカーソルを移動する
`command`+`0`

エディタへカーソルを移動する
`command`+`1`

■ワークスペース上のファイルウィンドウ切り替え

一つ右のウィンドウを開く
`command`+`option`+`→`

一つ左のウィンドウを開く
`command`+`option`+`←`
F
■検索

ファイル検索
`command`+`P`

grep検索
`command`+`Shift`+`F`

大文字小文字を区別する(Match case)
`command`+`option`+`C`

単語単位で検索(Match Whole word)
`command`+`option`+`W`

正規表現を使用(Use Regulation words)
`command`+`option`+`R`

シンボルで検索
`command`+`Shift`+`O`

■ジャンプ

関数の定義先にジャンプする。
(呼び出された関数を選択し)`F12`を押下

■入力補完

◎HTML

タグを楽に入力する
タグ名を入力後、`tab`を押下すると自動で<></>が入力される

例) <div></div>を自動入力したい時

 「div」と入力し、その後、`tab`を押すと下記のように自動入力される。

```
<div></div>
```
【MPAndroidChart】棒グラフの外枠の色を複数指定(renderer)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/b4f9cdfe-7eac-5ad3-dc12-3264877f01b0.png" width="30%">

# 概要
MPAndroidChartでのパラメータでの設定以上のことを行いたい場合。
棒グラフの色は```setColors()```を使用してリストで設定できるが、外枠は```barBorderWidth```で指定するので、リストで設定できない。

# 方法
rendererを使用。
```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<com.github.mikephil.charting.charts.BarChart
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/chart"
	android:layout_width="match_parent"
	android:layout_height="match_parent"/>
```

```MainActivity.kt
val value = listOf(
	BarEntry(0f, floatArrayOf(5f, 2f)),
	BarEntry(1f, floatArrayOf(6f, 3f)),
	BarEntry(2f, floatArrayOf(8f, 6f)),
	BarEntry(3f, floatArrayOf(12f, 9f)),
	BarEntry(4f, floatArrayOf(15f, 14f))
)

val set = BarDataSet(value, "")
set.setColors(getColor(R.color.bar1), getColor(R.color.bar2))
set.barBorderWidth = 2f
//単色の指定のみ
//set.barBorderColor = getColor(R.color.border1)
binding.chart.data = BarData(set)

//rendererを用いて外枠の色を複数指定。
binding.chart.renderer = object : BarChartRenderer(binding.chart, binding.chart.animator, binding.chart.viewPortHandler) {
	override fun drawDataSet(c: Canvas, dataSet: IBarDataSet, index: Int) {
		val buffer = mBarBuffers[index]
		buffer.setPhases(mAnimator.phaseX, mAnimator.phaseY)
		buffer.setDataSet(index)
		buffer.setInverted(mChart.isInverted(dataSet.axisDependency))
		buffer.setBarWidth(mChart.barData.barWidth)
		buffer.feed(dataSet)
		mChart.getTransformer(dataSet.axisDependency).pointValuesToPixel(buffer.buffer)

		val strokeWidth = Utils.convertDpToPixel(dataSet.barBorderWidth)
		mBarBorderPaint.color = dataSet.barBorderColor
		mBarBorderPaint.strokeWidth = strokeWidth

		var j = 0
		while (j < buffer.size()) {
			if (!mViewPortHandler.isInBoundsTop(buffer.buffer[j + 3])) break
			if (!mViewPortHandler.isInBoundsBottom(buffer.buffer[j + 1])) {
				j += 4
				continue
			}
			mRenderPaint.color = dataSet.getColor(j / 4)
			mBarBorderPaint.color = getColor(if (j / 4 % 2 == 0) R.color.border1 else R.color.border2)
			c.drawRect(
				buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
				buffer.buffer[j + 3], mRenderPaint
			)
			c.drawRect(
				buffer.buffer[j] + strokeWidth / 2, buffer.buffer[j + 1] + strokeWidth / 2, buffer.buffer[j + 2] - strokeWidth / 2,
				buffer.buffer[j + 3] - strokeWidth / 2, mBarBorderPaint
			)
			j += 4
		}
	}
}

binding.chart.invalidate()
```

[関連記事](https://qiita.com/nakashimaakio/items/d9ad48b3433c680e6f4c)
Jetpack ComposeとCoilで画像表示できなかった問題について

今まで約10年iOSアプリ開発を主にやっていたのですが最近はAndroidアプリ開発に挑戦しています。


#### Jetpack ComposeとCoilで通信処理を利用した画像表示をするコード

```kotlin
@Composable
fun ImageListItem(index: Int) {
    val imageUrl = "https://developer.android.com/images/brand/Android_Robot.png"
    Row(verticalAlignment = Alignment.CenterVertically) {
        Image(
            painter = rememberImagePainter(imageUrl),
            contentDescription = "Android Logo",
            modifier = Modifier.size(50.dp)
        )
        Spacer(modifier = Modifier.width(10.dp))
        Text(
            text = "Item #$index",
            style = MaterialTheme.typography.subtitle1
        )
    }
}

```

しかし
こんな感じで単純なComposableを書いてみたのですが、なぜか画像が表示されません。

![スクリーンショット 2022-07-07 10.06.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/d4a194b3-28bf-0413-c176-71bfa7b289ef.png)

AndroidManifest.xmlでもしっかり権限をつけているはずなんですが。
```xml
    <uses-permission android:name="android.permission.INTERNET" />
```

#### そこでログを確認できるようにコードを変更して再度実行。
```kotlin
@Composable
fun ImageListItem(index: Int) {
    val imageUrl = "https://developer.android.com/images/brand/Android_Robot.png"
    val painter = rememberImagePainter(imageUrl)
    Row(verticalAlignment = Alignment.CenterVertically) {
        Image(
            painter = painter,
            contentDescription = "Android Logo",
            modifier = Modifier.size(50.dp)
        )
        Spacer(modifier = Modifier.width(10.dp))
        Text(
            text = "Item #$index",
            style = MaterialTheme.typography.subtitle1
        )
    }
    Log.d("TEST", "${painter.state}")
}

```

するとこんなエラーログが出力されました。

```
D/TEST: Error(painter=null, 
..(省略)..
throwable=java.net.SocketException: socket failed: EPERM (Operation not permitted)))

```
権限の問題？AndroidManifestにはちゃんと書いてるのに何か他にも権限が足りないのか、、、

しかし調べてみると、なんと一度アンインストールして再度インストールすると解決するという、、、
ということなのでシミュレーターからアプリを削除
再度ビルドして起動してみると

![スクリーンショット 2022-07-07 10.15.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/2fcceef9-0d8a-b57f-11a7-a3db32f05898.png)

表示されました。

### 終わりに

こういう問題に遭遇するのは結構初歩的なAndroid開発あるあるなんですかね？
エラーログはこんな適当な書き方で通信の非同期処理のログを出力できてしまうなんてちょっと頭がこんがらがりそうですが、基本的にはJetpack Composeはシンプルにコードを書くことができて便利で楽しいです。
Ubuntu22.04＋Mozcで英語キーボードを利用している時に日本語入力と英語入力を切り替える

## はじめに

日本語キーボードを使っているときは「全角/半角」ボタンを押せば、英字入力と日本語入力が切り替わったが、英語キーボード（USキーボード）では「全角/半角」ボタンがないのでうまくいかない。「Super + Space」を使って切り替えるのが一般的だと思うが、Mozcの場合は直接入力がデフォルトになっているようで、そこからGUIを使った日本語入力への切り替えが発生してひと手間かかる。これを改善したい。

## やらなかったこと

Mozcのデフォルトを「ひらがな」にして、これまで通り「Super + Space」で切り替えること。
これを実行するためにはソースコードからMozcをコンパイルする必要があると説明しているサイトがあったので断念。
Mozcの設定を変更することで対応する方針とする。

## Mozcの設定

多くのページで解説されているように「Ctrl + Space」をMozc内部での「ひらがな」と「直接入力」切り替えに割り当てる。
これは「全角/半角」の動作と同じなので望ましい。

Mozcのツール→プロパティ→一般タブ→キー設定の選択で「編集」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/0fc3deba-ee01-4b5d-b877-c55545bfafbf.png)

Mozcキー設定のウィンドウが開きますので、編集→エントリーを追加をクリックして、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/4be0cead-d6e0-0a6e-d310-8fa840426e86.png)

|モード|入力キー|コマンド|
|--|--|--|
|直接入力|Ctrl Space|IME を有効化|
|入力文字なし|Ctrl Space|IME を無効化|

の２つのキー設定を追加します。

## ログインしなおす

新しいアプリケーションから設定は有効になりますという感じのダイアログが表示されますが、実際には一回ログアウト・ログインをするまでは設定が完全には適応されませんでした。（表示上は「ひらがな」入力になっているのに、直接入力になってしまう）なので、設定が終わったら一度ログアウト・ログインした方がいいです。

## 入力ソースをMozcにしぼる（オプション）

新しいショートカットに慣れるまでは、「Super」と「Ctrl」の打ち間違いが多数発生してしまうと思うので、Ctrl + Space が習慣化するまではMozc以外の入力方法を削除しておくことにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/427649b2-4295-69dd-bf0b-8157ae637d3b.png)

## ほぼ同じ内容の記事

https://qiita.com/donkonishi/items/1c147f0f9cffd59fe97d
Confluence REST APIで取得できるjsonのmediaType種類


REST APIにそんな詳しくないから、Json的には一般的な話なのかもしれないけど、自分メモ。

|種類|mediaType|
|--|--|
|png|image/png|
|swf|application/x-shockwave-flash|
|mp4|video/mp4|
|jpeg|image/jpeg|
|gif|image/gif|
|mov|video/quicktime|
|pdf|application/pdf|
|fla|application/octet-stream|
|psd|image/photoshop|
警察庁の交通事故統計情報のオープンデータの各種コード表のPDFをExcelでテキスト変換

警察庁の交通事故統計情報のオープンデータ
2020年（令和２年）から各種コード表を変換する

https://www.npa.go.jp/publications/statistics/koutsuu/opendata/index_opendata.html

https://www.npa.go.jp/publications/statistics/koutsuu/opendata/2020/opendata_2020.html

# データ

+ 各種コード表のPDFをダウンロード

https://www.npa.go.jp/publications/statistics/koutsuu/opendata/2020/codebook_2020.pdf

# 変換

## Microsoft 365のExcelを利用

![スクリーンショット 2022-07-08 085937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/95631773-3be3-0be5-7874-61859a9f70e0.png)


Mac版のExcelでは使えないようです

   ### PDFファイルを選択

   ![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/43d159d3-0e3e-a5e0-c0ef-e910ebea08ac.png)

1. メニューの「データ」
2. 「データの取得」－「ファイルから」
3. 「PDFから」で上記ファイルを選択

   ### Tableを選択

   ![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/92a7d54d-4e9e-3194-ffae-3e5d1c7e6d48.png)

4. テーブル単位でまとまってるのでTable004を選択
5. データの変換

   ### データ加工

   ![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/d08e16fa-73c1-f3ab-a149-85e5240c51a3.png)

6. 数値変換されて頭の0が消えているので「変更された型」の×ボタンを押して削除
7. 閉じて読み込む

   ### 完成

   ![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/4ea35f9d-8adc-eea7-4599-9500310781ea.png)

8. Excelに変換されたのでファイルに保存またはCSVに保存

# セル内の改行を削除

   ### Tableを選択

   ![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/48ec4250-ce4e-e7a7-5bc3-deef69083bf6.png)

Table055を選択

   ### 改行を削除する列を選択

   ![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/b75aa884-4d12-0a93-86eb-3f86f61d140a.png)

1. 列を選択
2. 値の置換を選択

   ### 改行を置換

   ![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/97e8d6f3-4653-5c2d-85a8-af2cc1f89d7e.png)

3. 詳細設定のオプション
4. 特殊文字を使用した置換
5. 改行を選択
6. 検索する値に改行の文字が挿入
7. OKで確定

   ### 完成

   ![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36151/00dfb0e4-89f6-cb2e-4c9c-78f5bf2fce94.png)

8. セル内の改行が削除され２行から１行に更新
asdfでterraform0.1系をM1 Macで使いたいときの方法

※　環境はMac([Apple M1](https://ja.wikipedia.org/wiki/Apple_M1))を想定。

## asdf
https://asdf-vm.com/

いろんなツールのランタイムバージョンを使い分けしたいときに利用。今回はterraformのバージョンを使い分けてインストールしたい。

### terraform 0.1系
https://releases.hashicorp.com/terraform/

2022/7 の時点では0.1系は古い。
今は、1.2.xが最新（0.14, 0.15, 1.0.0 ... と経由して）。

0.1系は古いが、使うことがある場合はasdfでインストールすることが可能。例えば、0.13.7
```
❯ asdf install terraform 0.13.7
```


#### Arm based Mac
```
❯ uname -m
arm64
```

しかし、M1ことArmベースのM1 Macの場合、その環境のためのバイナリが0.13.7だと存在しない。

```
❯ asdf install terraform 0.13.7

Downloading terraform version 0.13.7 from https://releases.hashicorp.com/terraform/0.13.7/terraform_0.13.7_darwin_arm.zip
Error: terraform version 0.13.7 not found
```

https://releases.hashicorp.com/terraform/0.13.7/

エラー内容より、環境に沿ったファイル `terraform_0.13.7_darwin_arm.zip` がないことが要因。これをダウンロードしてasdfでreshimすれば一応使える。

https://qiita.com/dodonki1223/items/314fd264cbcb4406c743

手順はこちらの通り。今回は、asdfコマンドだけで完結したい。

#### 公式のarm対応配布は1.0.2から
https://releases.hashicorp.com/terraform/1.0.2/

`terraform_1.0.2_darwin_arm64.zip` がある。よって、asdf経由でインストール可能。
1.0.1は以下のとおりファイルがないのでasdf経由のインストールは失敗する。

```
❯ asdf install terraform 1.0.1

Downloading terraform version 1.0.1 from https://releases.hashicorp.com/terraform/1.0.1/terraform_1.0.1_darwin_arm.zip
Error: terraform version 1.0.1 not found
```
```
❯ asdf install terraform 1.0.2
Downloading terraform version 1.0.2 from https://releases.hashicorp.com/terraform/1.0.2/terraform_1.0.2_darwin_arm64.zip
Skipping verifying signatures and checksums either because gpg is not installed or explicitly skipped with ASDF_HASHICORP_SKIP_VERIFY
Cleaning terraform previous binaries
Creating terraform bin directory
Extracting terraform archive
```

### asdf経由でterarform0.13.7をインストールする方法
しかし、0.15.xや0.13.xをどうしても使いたいとする場合は、対処は以下。

```
❯ arch -arch x86_64 asdf install terraform 0.13.7

Downloading terraform version 0.13.7 from https://releases.hashicorp.com/terraform/0.13.7/terraform_0.13.7_darwin_amd64.zip
Skipping verifying signatures and checksums either because gpg is not installed or explicitly skipped with ASDF_HASHICORP_SKIP_VERIFY
Cleaning terraform previous binaries
Creating terraform bin directory
Extracting terraform archive
```

`arch`コマンドを経由することで、指定ファイル名を変更する。
`terraform_0.13.7_darwin_amd64.zip` と、 `darwin_amd64` をインストールしてしまえばファイルがあるので導入が可能。
ただ、もちろんこのままではIntelアーキテクチャ想定なのでうまく実行できない。


```:エラー例
bash: Job 1, ‘terraform’ terminated by signal SIGSEGV (Address boundary error)
```

作業の途中で強制終了されることがある。

そこで、 実行時も`arch`でアーキテクチャを指定する。

#### arch -arch x86_64
```
❯ arch -arch x86_64 terraform -v
Terraform v0.13.7
```

これで、Intelアーキテクチャ指定で実行できるので、動くようになる。
M1 Macでsnowflake-connector-pythonを動作する環境を作成する

# 2022年7月6日での構築方法
M1チップ上では`snowflake-connector-python`を普通にインストールする場合には動かないケースがある。
結論として
- venv(もしくはpipenv)でPython環境を作成する
- `pip install cffi==1.15.0`でcffiのversionを落とす

以上をすることで、M1 Macで動作させる事ができる。

# 発生したエラー1

```
MemoryError: Cannot allocate write+execute memory for ffi.callback(). You might be running on a system that prevents this. For more information, see https://cffi.readthedocs.io/en/latest/using.html#callbacks
```

Conda環境下やbrewでインストールしたPython環境下で`pip install snowflake-connector-python`すると、上記のPyOpenSSLのエラーが発生します。
内容は以下のissueが該当します。
https://github.com/pyca/pyopenssl/issues/873
まだ解決されているわけではありませんが、venvを使った環境構築だとこのエラーが発生しないようです。

私は最初minicondaで構築していましたが、venvに変えると上記のエラーは発生しなくなりました。(謎)

`python3 -m venv snowflake_env`のあとに`source snowflake_env/bin/activate`でさっと環境は作れます

# 発生したエラー2

venvで構築したら次のようなエラーに変わります。

```
ImportError: dlopen(/-----/-----/snowflake/lib/python3.8/site-packages/_cffi_backend.cpython-38-darwin.so, 0x0002): Library not loaded: @rpath/libffi.8.dylib
  Referenced from: /----/----/snowflake/lib/python3.8/site-packages/_cffi_backend.cpython-38-darwin.so
```

これはcffiが参照するファイルが存在しないことで発生しています。
この問題はcffiのversionが1.15.0であれば発生しないことがわかってます。
（たまたま環境を移行する前に1.15.0でやっていました)
cffiは1.15.0でM1チップに対応していて、1.15.1へのアプデで不具合が出てるみたいですね。

# まとめ

- venv(もしくはpipenv)でPython環境を作成する
- `pip install cffi==1.15.0`でcffiのversionを落とす

両者とも綺麗な解決策ではないですが、、この時期に同様のエラーに遭遇したユーザーの手助けになるようにおいておきます。
Djangoでenviron利用時のエラーの対処法

# はじめに
Djangoでenvironモジュールを使用する際に
```
import environ


>raise ValueError, "No frame marked with %s." % fname
>                    ^
>SyntaxError: invalid syntax
```
上記のようなエラーが発生した時の対処法をまとめた

# 対処法
environではなくdjango-environモジュールを使う
ターミナルで下記コマンドを実行
```
pip3 install django-environ
```

```sample.py
import environ
```
django-environをインストール前のソースコードの"import environ"は
そのままで問題ないです。

```
python3 manage.py runserver
```
このコマンドを実行すれば正常実行すると思います。

何回も出くわすのでメモ書き程度に
Mac、ParallelsからのWindowsファイル共有が遅い

### 環境
macOS Monterey 12.4
Parallels Desktop 17

### Mac及びParallelsからWindowsファイル共有が遅い
Montereyにしたあたりから、
1. ネットワーク上のWindowsファイル共有フォルダへのアクセスが極端に遅い。
  macOSの「サーバへ接続」でも、Parallels上でも遅い。
2. Parallels上のWindows10からWindowsファイル共有しているサーバ上に、UTF-8のテキストファイルをコピーしたら文字コードがおかしくなるという謎現象にも見舞われました。

###　調べてみた

https://blog.naosan.jp/2021/02/9106/

https://weblog.malo.jp/macbook%e3%81%a7nas%e3%81%b8%e3%81%ae%e6%8e%a5%e7%b6%9a%e3%81%8c%e3%82%81%e3%81%a1%e3%82%83%e3%81%8f%e3%81%a1%e3%82%83%e9%81%85%e3%81%84%e3%81%ae%e3%81%8c%e8%a7%a3%e6%b1%ba%e3%81%97%e3%81%9f%ef%bc%81.html#.YsYru-z7Q-Q

### で、どうすりゃいいのさ
~/Library/Preferences/nsmb.confパケット署名を無効にする設定を追加し、再起動。

```sh:
$ cat ~/Library/Preferences/nsmb.conf
cat: /Users/hogehoge/Library/Preferences/nsmb.conf: No such file or directory
##通常はnsmb.confが無いため、作成する。
$ touch ~/Library/Preferences/nsmb.conf
##pico(nano)で編集し、以下の２行を加える
$ pico ~/Library/Preferences/nsmb.conf
[default]
signing_required=no
```


### 解決
再起動後、MacからのWindowsファイル共有アクセスが通常の速度に。謎現象も無くなりました。
但し、セキュリティが低くなるようです。
TypeScriptに手出す前に頭に入れておきたかったこと

TypeScriptとは
=
　<b>TypeScript</b>とは<b>JavaScriptが既存で持っている機能を全て含んだ上で、より機能が拡張して作られたプログラミング言語</b>です。
　<b>TypeScriptは「AltJS」のひとつ</b>であり、次世代のJavaScriptの最有力候補です。AltJSとは、「Alternative JavaScript」の略称で「JavaScriptの代わりになるもの」という意味が込められた造語です。<b>JavaScriptより優れた機能を持ち、コンパイル（トランスパイル）後はJavaScriptのコードが生成される言語</b>のことです。

TypeScriptについて知っておきたい事
=
　先程の記述した通り、TypeScriptはプログラミング言語であると同時にJavaScriptに変換するコンパイラでもあります。つまり、最終的にブラウザで実行されるものは、通常のJavaScriptです。つまり、TypeScriptを使うのは、コードを書いているときだけです。
　TypeScriptはJavaScriptの機能を拡張して作られているので、コード内でJavaScriptの構文を使うことができます。
　<b>JavaScriptに無い、新しい便利な機能（型の定義）が追加されたものがTypeScriptです。</b>

|JavaScript |TypeScript |
|:-----------|------------:|
|動的型付け|静的型付け|

<b>動的型付け</b>：
 『動的に型を付ける』とそのまま読んでの通り、プログラムを書く時に、変数や関数に何の種類が入ってくるかというのが特に決まっていない形を指します。つまり、プログラマーが変数や関数に「１」を代入すれば「なんとなく数値型だろう」とプログラム側が予測し入るデータの型を自動で決めてくれます。

<b>静的型付け</b>：
 プログラマーが変数や関数に型を予め定義しておき、その型以外のデータを変数では使えません！この変数は整数値を扱うのです！”Hello”は文字列じゃないですかこの変数では扱えません！ということを予め定義するものです。


メリット
-
<b> 強力な型推論</b>
　静的型付けであるTypeScriptでは型を明確にすることで、JavaScriptでは実行しないと知れなかったエラーを未然に防いでくれます。

<b>JavaScriptとの互換性がある</b>
　構文だけでなく、JavaScript向けのライブラリ・フレームワークをTypeScriptで使用することが可能です。

<b>可読性が高く読みやすい</b>
　「静的型付け」の効果もあり、JavaScriptよりもより人間が読みやすいコードになっていると感じます。

<b>エディタによるコード補完やチェックメッセージが強力</b>
　TypeScriptではエディタ [^1]のコード補完機能を使えばよりスムーズに解決し書くことが実現できます。


[^1]:個人的にはTypeScript向けのエディタとしては、開発元のMicrosoft社がリリースしている「Visual Studio Code」がオススメです。




デメリットとしてネットで見かける事
-
<b>型の種類が多いため学習コストがかかること</b>
　→TypeSciptに手を出そうとしている人なら今まで多少なりとも積み上げてきた学習経験があはずです。プログラミングの基礎を習得した時と比べればなんてことない気がします。。

<b>日本語訳が少ない</b>
　→JavaScript様には劣るとしても日に日にユーザーが増えていることもあり、翻訳サイトも出てきました。しかし、躓いている事に対してどう調べたら良いか検索の仕方として「TypeScript　◯◯」というように検索ヒントのサジェストはあまり期待できないかもしれません。そういう時はSNSやテラテイルやUdemyのQ&Aなど検索以外にも方法は多く存在するので試行錯誤していきましょう！
　私自身、「初歩的な質問で申し訳ございません」を申し訳程度に最後に付け加えるのが日常になってきました。。

終わりに
-

　TypeScriptは大都会出身の真面目で気配りができる子なわけです。