OmniAICreator/Qiita-1.07M huggingface dataset:
Microsoft Flight Simulator(2020)の解像度を設定ファイルから無理矢理を変更する方法

# 概要
Microsoft Flight Simulator(2020)の解像度を設定ファイルから無理矢理変える方法について。

# トラブル内容
数年前に開発終了となっていたMicrosoft Flight Simulatorの新作が出ると聞き、喜び勇んで発売日に購入したものの、セットアップに詰まり、長過ぎるダウンロードに苦しみ、やっと動いたところで期待の4K表示ができないトラブルに見舞われました。

インストール後のセットアップ時にUIの位置がズレる不具合があり、OSの設定を3840×2160から1920×1080に変更して進めた結果、設定を戻しても、ゲームの設定画面上の解像度が1920×1080以下しか表示されなくなってしまいました。
ということで、以下解決策です。

とりあえず、この方法でゲームの表示解像度は変更できることを確認済みです。ただし、設定画面の表示は1920×1080のままになりますので、今後の修正に期待しましょう。

# 解決先
関係しそうなディレクトリを色々と探したところ、下記のファイルを発見。おそらくこれが設定ファイルと見て、関連しそうな部分を変更してみたところ大当たりでした。

```
C:\%USERPROFILE%\AppData\Roaming\Microsoft Flight Simulator\UserCfg.opt
```


ということで、このファイルのResolutionとFullScreenResolutionを変更すればOKです。ただのテキストファイルなので、普通のエディタで変更可能でした。

```UserCfg.opt
Version 66
{Video
	Adapter "NVIDIA GeForce GTX 1080 Ti"
	Monitor 0
	Windowed 0
	FullscreenBorderless 1
	Resolution 3840 2160
	FullScreenResolution 3840 2160
	PrimaryScaling 1.000000
	SecondaryScaling 1.000000
	VSync 1
	HDR10 1
	PosX 0
	PosY 0
}
{Graphics
	Version 1.1.0
	Preset Ultra
	{Texture
		MaxAnisotropy 16
		Quality 0
	}
	{SuperSampling
		SuperSampling 3
	}
	{Terrain
		LoDFactor 2.000000
	}
	{ObjectsLoD
		LoDFactor 2.000000
	}
	{Shadows
		MaxSliceCount 4
		Size 2048
		MaxDist 10000.000000
		DLightContributionCullingThresholdS0 0.100000
		DLightContributionCullingThresholdS1 0.100000
		DLightContributionCullingThresholdS2 0.100000
		DLightContributionCullingThresholdS3 0.100000
		OmniContributionCullingThreshold 0.000000
	}
	{HeightFieldShadows
		Enabled 1
		Size 1024
	}
	{SSRaytracedShadows
		Enabled 1
		Quality 3
	}
	{Water
		FFTSize 512
	}
	{VolumetricClouds
		Enabled 1
		Quality 3
	}
	{VolumetricLights
		Enabled 1
		Quality 3
	}
	{LightShafts
		Enabled 1
		Quality 3
	}
	{SSR
		Enabled 1
		HalfRes 0
		Quality 3
	}
	{WindShield
		Quality 3
	}
	{SSAO
		Enabled 1
		Quality 3
	}
	{SSSSS
		Enabled 1
		Quality 3
	}
	{AA
		Enabled 1
		Type 2
		Quality 3
	}
	{Bloom
		Enabled 1
		Quality 3
	}
	{DOF
		Enabled 1
		Quality 3
	}
	{Buildings
		Enabled 1
		Quality 3
	}
	{VegetationLarge
		Enabled 1
		Quality 3
	}
	{VegetationSmall
		Enabled 1
		Quality 3
	}
	{TextureSynthesis
		Quality 3
	}
	{PostProcess
		Enabled 1
		EyeAdaptation 1
		ColorGrading 1
		Sharpen 1
		Fringe 1
		LensDistortion 0
		Dirt 1
		LensFlare 1
		FilmGrain 1
		Vignette 1
		LensBlurMultiplier 1.000000
		FringeMultiplier 1.000000
	}
	{VectorDataTessellation
		Enabled 1
		Quality 3
	}
}
```

# まとめ
リリース直後のアプリは人柱になる覚悟が必要ですね。
結合文字列(合成文字)の濁点/半濁点をどうにかする(PHP)

# この２つの違いはなんでしょうか
1.ポセイドン
2.ポセイドン

見た目は同じだけど…

## 経緯
スクレイピングで取得した文字列を画像に出力するシステムを作っている時のこと
なんか出力結果がおかしい
![スクリーンショット 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505768/26780d9c-14d6-b45b-03e4-d656c03f31b0.png)

「ポセイドン」と綺麗に出力したいのに濁点と半濁点が分離した「ホ゜セイト゛ン」となってしまう。
もし読み込ませているデータ自体が「ホ゜セイト゛ン」ならわかるけど

読み込み先の文字列を見てみると「ポセイドン」…なぜだ


## Unicodeによる結合
どうやら2文字のデータを1文字に纏める結合というものが行われていて、特に今回スクレイピングみたいにwebからごちゃごちゃ取ってきたりすると混同しがちらしい。

どういう理屈で混同してるのかとか、なぜこんなものが生まれてしまったのかはさておき、とりあえずこの「ポセイドン」を「ポセイドン」にしたい。

## とりあえず文字コード見てみよう
```php:poseidon.php
<?php
$poseidon = "ポセイドン";

$moji_code = substr(json_encode($poseidon), 1, -1);

echo $moji_code;

```

```php:出力結果
\u30db\u309a\u30bb\u30a4\u30c8\u3099\u30f3
```

てことはつまり

\u30db\u309a => ホ　+ 半濁点
\u30c8\u3099 => ト　+ 濁点

ということで「\u309a」(半濁点)と「\u3099」(濁点)をこの状態で置換してjson_decode()すればよさそう。
かといって「ホ」(\u30db)を直で「ポ」(\30ddらしい)に直で変えるのはすごく面倒なので
[mb_convert_kana()のKとVオプション](https://www.php.net/manual/ja/function.mb-convert-kana.php)を使って元に(?)戻す。
こいつを使えば、「ﾎﾟｾｲﾄﾞﾝ」 => 「ポセイドン」に変換できる。つまり「ﾟ」と「ﾞ」に置換できればオーケー。


順序としては

①結合文字列を文字コードで出して
②「\u309a」(結合文字の半濁点)を「\u309c」に、「\u3099」(結合文字の濁点)を「\u309b」に置換
③デコードして
④全角カナを半角カナにして(ホ゜セイト゛ン => ﾎﾟｾｲﾄﾞﾝ)
⑤濁点付き半角カナを全角カナに変換(ﾎﾟｾｲﾄﾞﾝ => ポセイドン)

でいけそう

```php:poseidon.php
<?php
$poseidon = "ポセイドン";
//①
$moji_code = substr(json_encode($poseidon), 1, -1);

//②
$moji_code = str_replace("\u3099",'\u309b',$moji_code);
$moji_code = str_replace("\u309a",'\u309c',$moji_code);

//③
$decode_poseidon = json_decode(sprintf('"%s"', $moji_code));

//④
$decode_poseidon = mb_convert_kana($decode_poseidon,"aks","utf-8");

//⑤
$decode_poseidon = mb_convert_kana($decode_poseidon,"KV","utf-8");

echo $decode_poseidon;
```

気になる結果は…

```php:出力結果
ポセイドン
```

いやわからんわ。画像で出力して確認する

![スクリーンショット 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505768/96bb587d-6453-bb01-fa82-9830c8cbde5b.png)



やったーーーーーー！！！

## 感想
こんな地味なのがqiita初投稿になるなんて

ちなみになぜポセイドンなのかというと、濁点と半濁点を含む1単語がこれ以外「パリピギャル」くらいしか思い浮かばなかったからです。

最後まで読んでいただきありがとうございました。



## 8/25 追記
コメントで[Normalizerクラス](https://www.php.net/manual/ja/class.normalizer.php)を使うと1行で済むことをご教授頂きました。
誠にありがとうございます。無知を恥じるばかりです。
【jQuery】と【PHP】とダブルクォーテーションとシングルクォーテーションの使い分け

###要約
1. jQueryのHTML属性：ダブルじゃないとだめな時がある`getAttribute("src")`
2. PHP：基本シングル、文字列結合するときはダブル

###プロジェクトごとにルールで決まってたりするけど、結局どっちでもいいらしい

```javascript:HTMLのsrc属性を取得するときにエラーが出る違いがあった
$object.getAttribute("src") // src属性が取得できる
$object.getAttribute('src') // エラーが発生する
$object.getAttribute("id") // id属性が取得できる
$object.getAttribute('id') // id属性が取得できる
```

細かい違いは未経験者なのでわからないが、src属性を取得しようとしたときに違いが発生。

idはどっちでもよかった
srcはダブルじゃないとダメだった


###PHPはシングルの方が処理が早いとかなんとか
参考
https://pecopla.net/web-column/php-quote

シングルは早いらしい。ダブルより見やすい。

ダブルは中で変数を展開できる。

ダブルの方が便利だけど、文字列を扱う場合はシングルの方がいいみたい。
GitHubのREADMEをサクッと高品質で書けるサービス作ってみました。

みなさんは GitHub でオープソースソフトウェア(OSS)を開発して公開する時、README をどのように書いているでしょうか？

GitHub が自動で作ってくれる README に含まれるのはタイトルだけですし、OSS 開発初心者の場合、そもそも README に何を含めるべきかわからないという方もいらっしゃるのではないでしょうか？OSS 開発に慣れている方でも、コードを書くのはいいけれど README を書くのは面倒だと思ったことはありませんか？今回はそんな README 難民の方々向けの Web サービスを作ってみました。

# LEADYOU - README Generator

**[Web サイトへ](https://hacknock.github.io/leadyou/)**
![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/7acc7cec-c01a-5f3b-6577-d2757997803d.png)

# 使い方

使い方は簡単です。トップページで GitHub の Public リポジトリの URL を入力して`Next Step`ボタンを押すと、README に書くべき内容ごとにフィールドが設けられたフォームページに飛ぶので、そこで必要事項を入力するだけです。しかも、トップページで`Auto Fill`のチェックボックスに ✓ を入れると、リポジトリから取得可能な情報を自動で収集してある程度フォームを埋めてくれます！フォームページの右側には、README のプレビューがあるのでそこで実際の体裁を確認できます（ここの CSS は GitHub の利用している CSS を参考にしているので実際の体裁に遜色ないと思われます）。フォームを埋めることができましたら、フォーム下にある`Generate`ボタンを押せば README.md と画像リソースなどがまとまった zip ファイルがダウンロードされますので、お好きな方法でリポジトリにマージしてもらえれば反映されます。

![first-step.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/60747d19-56f2-45a9-1fcb-91eee3c14bc5.png)

![second-step.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/e1c11359-e9ea-3bcd-774a-96ff84b25c96.png)

# オススメポイント

1. 書くべき項目が決まっているので何を書けばいいか迷わない
1. フォーム形式で項目別に入力できるのでわかりやすい
1. `Auto Fill`をオンにすればある程度の情報を勝手に埋めてくれる（バッジとか貢献者とか）
1. 開発者がパット見てちゃんとしてそうと思える体裁の README を書ける
1. 再現性のある README を書ける
1. デモ画像の挿入が楽

# 開発に関わった人

- @AkiraKashihara
- @Kyome

OSS に興味がある方も、すでに公開している方も是非使ってみてください！そして使用感などコメントくだされば幸いです ☺️

# 追記

LEADYOU のアップデート情報を呟く Twitter アカウントを用意しました（[@hacknock_info](https://twitter.com/hacknock_info)）。
みなさまの意見を元に順次アップデートしていく予定ですのでご活用いただけると嬉しいです。
使わないなんてもったいない、E資格認定プログラムを半額で受講する制度！

#1.はじめに
　ディープラーニング のエンジニア資格である**E資格**を取得するためには**E資格認定プログラム**の受講が必須なのですが、かなり費用が掛かります。既にAI関連の業界にお勤めされている方だと会社が受講費用を出してくれる場合もあるかもしれませんが、そうでない私ににとって大きな負担です。

　なので私は、**専門実践教育訓練給付制度**を使って半額で済ませたので、その内容を説明します。

#2.専門実践教育訓練給付制度とは？
　「専門実践教育訓練給付制度」とは、厚生労働大臣が指定した専門実践教育訓練の講座を受講し、一定の要件を満たす場合は、教育訓練施設に支払った教育訓練経費の50%〜70%が支給される制度です。専門実践教育訓練の対象リストには**第四次産業革命スキル習得講座**があり、その中にE資格認定プログラムが含まれています。

　対象者は、会社勤務で過去２年以内にこの制度を利用していない人、あるいは失業後１年以内かつ過去3年以内にこの制度を利用してない人です。支給額は、会社勤務者は50％（年間上限40万円)、失業者で就職できた場合は70%（年間上限56万円)です。

＊詳細は[**こちら**](http://www.kansai-u.ac.jp/relearn/Downloads/benefit/senmonkyouiku_kyufu.pdf)をご覧ください。

#3.どのプログラムが対象なの？
　[第四次産業革命スキル習得講座一覧 (2020/4/28版)](https://www.meti.go.jp/policy/economy/jinzai/reskillprograms/pdf/kouzaichiran2.pdf) の中から、**JDLAが認定**しているものをピックアップします。

|No.|法人名              |講座名     |講義時間    |費用(税込)|
|--:|:---------|:----------|:---------|----------------:|
|20 |エッジテクノロジー株式会社|機械学習講座|18日(36h)|243,885円|
|34|株式会社キカガク|自走できるAI人材になるための6ヶ月長期コース|24日(175h)|792,000円|
|42|エッジテクノロジー株式会社|ケーススタディ実演講座+機械学習講座+深層学習講座|26日(52h)|403,229円|
|47|株式会社キカガク|ディープラーニングハンズオンセミナー(TensorFlow コース)E資格受験プラン|30日(50h)|330,000円|
|49|株式会社キカガク|ディープラーニングハンズオンセミナー(PyTorchコース) E資格受験プラン|30日(50h)|330,000円|
|71|株式会社zero to one|JDLA「E資格」向け認定プログラム (e-ラーニング)|80h|165,000円|
|82|スキルアップAI株式会社|現場で使える機械学習/ディープラーニング講座|12日(92h)|503,800円|
|83|スキルアップAI株式会社|現場で使える機械学習/ディープラーニング講座【オンライン講座】|17日(46h)|482,900円|
|84|スキルアップAI株式会社|0から始める機械学習/ディープラーニング講座【オンライン講座】|41日(133h)|904,200円|
|85|スキルアップAI株式会社|現場で使える機械学習/ディープラーニング講座/プランニング講座|14日(108h)|668,800円|
|86|スキルアップAI株式会社|0から始める機械学習/ディープラーニング講座|39日(200h)|1,128,600円|
|87|スキルアップAI株式会社|0から始める機械学習/ディープラーニング講座【基礎オンライン・応用対面講座】|43日(195h)|1,090,100円|
　じっくり時間を掛けるプログラムはそれ相応に価格が高い感じです。どれを選ぶかはあなた次第です。

#4.手続きはどうするの？

**1) 管轄のハローワークへ行く**
　自分の住所によって決まる管轄のハローワークへ行き、必要書類を貰い、事前キャリアコンサルティングの予約電話番号を聞いて来ます。

**2) 事前キャリアコンサルティングを受ける**
　電話予約した上で、**ジョブカード**を持参し、事前キャリアコンサルティングを受けます（約１時間くらい)。ジョブカードは、[**ここ**](https://jobcard.mhlw.go.jp)を利用して作成し、プリントアウトしたものを持って行きます。
　ポイントはジョブカードのフォーマットを**しっかり埋める**ことです。あとは、話の中でなぜ自分がE資格認定プログラムを受講すべきだと思っているかを伝えればOKです。簡単です。
　コンサルティングは、管轄のハローワーク内で行われますので、終了後にそのまま申請ができるように必要書類を用意して行きましょう。

**3) その他**
・申請は、講座が開始するおおむね1ヶ月前までに済ませる必要があるので、余裕を持って進めて下さい。
・事前キャリアコンサルティングの担当者は、「皆さんご存知ないのか、せっかくこんなお得な制度があるのに、利用する人は少ないですね。」と言っていました。使わにゃ損です。

#5.私は、どうしたか？
　私は、No.20 エッジテクノロジーの「機械学習」を受講しました。名称は機械学習となっていますが、中身は機械学習8回＋深層学習10回＝全18回の講義で、私にとっては十分なものでした。あっ！私、エッジテクノロジーの関係者ではありませんので、念のため。受講期間は、2019/10〜2020/4で、4月下旬に**半額の支給**を受けました。

　余裕を持って今年8月のE資格試験を迎えようとしていたら、なんとコロナで試験は来年2月まで伸びてしまいました（笑)。
【初学者向け】簡単！無料！ポートフォリオにおすすめAPI（使用例付き）

# APIとは
APIとは、Application Programming Interfaceのこと。
Web APIは, 外部に公開しているインターフェースのことです。

#なぜAPIが重要なのか？

今や大きいサービスなら、どこでもAPIを公開しています。[APIエコノミー](https://it.impress.co.jp/articles/-/15887)と言いまして、Webサービス同士がAPIを通じて繋がっているが、今のWeb業界で食っていくのなら、必ず抑えておきたいところです。



#ポートフォリオに導入が簡単なWeb API

#### 1. Twitter API
https://developer.twitter.com/ja

[使用例](https://wepicks.net/twitterapiv11_webapp/)

#### 2. LINE Messaging API
https://developers.line.biz/ja/docs/messaging-api/overview/

[使用例](https://qiita.com/fkooo/items/d07a7b717e120e661093)

#### 3. Slack API
https://api.slack.com/lang/ja-jp

[使用例](https://auto-worker.com/blog/?p=825)

#### 4. Google Maps API
https://developers.google.com/maps/documentation?hl=ja

[使用例](https://qiita.com/Haruka-Ogawa/items/997401a2edcd20e61037)

#### 5. ぐるなび API
https://api.gnavi.co.jp/api/manual/

[使用例](https://boccitabi.com/gurunaviwaebservice-use/)

#### 6. Zaim API
https://dev.zaim.net

[使用例](https://qiita.com/shutosg/items/6845057432bca551024b)

#### 7. OpenWheather API
https://openweathermap.org/api

[使用例](https://qiita.com/nownabe/items/aeac1ce0977be963a740)

#### 8. Pixabay API 
https://pixabay.com/ja/service/about/api/

[使用例](https://paiza.hatenablog.com/entry/2017/11/30/120万枚超えの画像をJavaScriptから無料で使える「Pixabay_API」で画)

#### 9. 郵便番号検索 API
http://zipcloud.ibsnet.co.jp/doc/api

[使用例](https://cpoint-lab.co.jp/article/202001/13729/)

#### 10. 図書館 API
https://calil.jp/doc/api.html

[使用例](https://qiita.com/keita69sawada/items/96ff459a948472984d45)


# まとめ
有名WebサービスのAPIを使うと、簡単にポートフォリオをいい感じに作ることができます。
ちなみに、私はTwitter、Slack、OpenWeather、Pixabayは利用したことがありますが、どれも手軽に利用できました！
※無料APIには、制限が設けられている場合があるので、ドキュメントをよく読んでから利用してください。
基本！省略の書き方

関数やif文など省略の書き方が色々ありますね。
積極的に使えるようになる為、まとめていきます。


##アロー関数

functionとアロー関数の基本の書き方

```javascript
const firstName = function (first) { 
  console.log(first);
}

const lastName = (last) => { 
  console.log(last);
}

firstName('Mike'); //結果: Mike
lastName('Smith'); //結果: Smith
```
アロ関数は関数名を持たない。とてもシンプル！
基本：　__(引数) => {処理内容}__
※アロー関数とfunctionの違いは書き方だけでなく、thisの束縛の違いなど色々ある為要注意。
詳細は[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions)


####本文が一文の時
{  }が省略可能　※returnの時だけに限る

```javascript
const age = (birthYear, thisYear) => thisYear - birthYear;
console.log(age(1990, 2020)); //結果: 30

```

####引数が一つの場合
(  )も省略が可能

```javascript
let jogCal = weight => Math.floor(1.05 * (8.3 * 0.5) * weight);
console.log(`体重50kgの人がジョギングした消費カロリーは${jogCal(50)}カロリーです`);
//結果：体重50kgの人がジョギングした消費カロリーは217カロリーです

```

##メソッドのfunction
オブジェクトのメソッド定義は「:function」を省略できる。

```javascript
let ob = {
  drink: 'Coke', food: 'rice', dessert: 'cake',
  print: function() {
    document.write('<p>Drink: ' + this.drink + '</p>');
  }
};

ob.print();

//省略パターン↓

let ob = {
  drink: 'Coke', food: 'rice', dessert: 'cake',
  print() {
    document.write('<p>Drink: ' + this.drink + '</p>');
  }
};

ob.print();

//結果はどちらも Drink: Coke
```



<br>
##if文

まずは基本の書き方

```javascript
let emily = 25;

if (emily <= 20) {
  console.log('Emilyは20歳以下です')
} else if (emily > 20 && emily < 30) {
  console.log('Emilyは20代です')
} else {
  console.log('Emilyは30歳以上です')
}
//結果: Emilyは20代です
```

####一行で書く場合：条件（三項）演算子

(条件) ? 値1 : 値2
値1にtrueの処理、値2にfalseの処理をかく

```javascript
let age = 30;
let fullAge = (age >= 20) ? '成人' :  '未成年'
console.log(fullAge); //結果: 成人
```

###true/falseを省略する

上と下は全く一緒の意味。
=== や !== を省略できます

```javascript
//trueの場合
if(a === true) {
  処理内容
} 

if(a) {
  処理内容
} 

//falseの場合
if(a === false) {
  処理内容
} 

if(!a) {
  処理内容
} 
```
<br>
##演算子

```javascript
x = x * 2; //基本
x *= 2; //省略ver

x = x + 10; //基本
x += 10; ////省略ver

```

####1の場合はもっと短く

```javascript

x = x + 1; //基本
x++; //省略ver

x = x - 1; //基本
x--; //省略ver

```
<br>
まだだまだ省略の書き方あると思いますが、一旦基本をまとめてみました。
Extension でのインスタンスの取り扱いに注意する

今回は以前書いた下記の記事で、アプリのパフォーマンスをさらにあげるための方法を簡単に紹介したいと思います。

https://qiita.com/yum_fishing/items/cee4d2ed3561bfae7fd7

### 改善方法

整数に3文字区切りのカンマをつけた文字列を返すプロパティを以前は下記のような形で書きました。

```swift
extension UInt {
    var withCommaString: String {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal
        numberFormatter.groupingSeparator = ","
        numberFormatter.groupingSize = 3

        return numberFormatter.string(from: NSNumber(value: self)) ?? "\(self)"
    }
}
```

仮に、下記のようなメソッドを用意して 10,000 件のデータをコンバートした場合は、同じ `NumberFormatter()` インスタンス が 10,000 件生成されることになります。特に `Formatter` はインスタンスを生成するコストは高いのでなるべくインスタンスを使いまわした方がパフォーマンスは向上します。

```swift
func getPriceList(source: [UInt]) -> String {
    return source.map { $0.withCommaString }
}
``` 

そして修正したコードがこちらになります。`static let` を用いることで遅延初期化され、呼び出し毎に初期化されることがなくなります。

```swift
extension UInt {
    private static let numberFormatter: NumberFormatter = {
        return NumberFormatter()
    }()
    var withCommaString: String {
        UInt.numberFormatter.numberStyle = .decimal
        UInt.numberFormatter.groupingSeparator = ","
        UInt.numberFormatter.groupingSize = 3

        return UInt.numberFormatter.string(from: NSNumber(value: self)) ?? "\(self)"
    }
}
```

### 参考


- https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW12


- https://medium.com/swift-column/singleton-398078bcc58d
各言語での日時クラスの使用感

各言語で日時クラスの使用感に違いがあるのか？という話題があり、ざっと動かしてみたため、メモ。
自分の感覚としては日時クラスは基本、ある時刻（点）を表している認識。
('2020/8/21 23:59'で初期化した場合、 59分全体を指しているわけではなく、大体は0秒を示している認識)

Ruby

```ruby
# https://docs.ruby-lang.org/ja/latest/class/Time.html

st_t = Time.new(2020,8,21,23,59)
p st_t

check_t = Time.new(2020,8,21,23,59,30)
p (st_t < check_t)
```

```
2020-08-21 23:59:00 +0900
true
```

JavaScript

```javascript
/*
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date
*/
// 月は0基点
const st_t = new Date(2020, 8-1, 21, 23, 59);
console.log(st_t.toLocaleString("ja"));

const check_t = new Date(2020, 8-1, 21, 23, 59, 30);
console.log(
```

```
2020/8/21 23:59:00
true
```

PHP

```php
<?php

# https://www.php.net/manual/ja/class.datetime.php

$st_t = new DateTime('2020-08-21T23:59');
echo $st_t->format('Y-m-d H:i:s.u');
echo "\n";

$check_t = new DateTime('2020-08-21T23:59:30');
echo $check_t->format('Y-m-d H:i:s.u');
echo "\n";


$res = ($st_t < $check_t);
if ($res){
  echo "true";
}
else{
  echo "false";
}
echo "\n";

```

```
2020-08-21 23:59:00.000000
2020-08-21 23:59:30.000000
true
```

どれも想定通り。
変数とインスタンス変数の違い


【概要】
----------------------------------------
<b>1.変数とはなにか</b>

<b>2.インスタンス変数とはなにか</b>

<b>3.変数とインスタンス変数はどういう時に使うのか</b>

<b>4.ここから学んだこと</b>



1.変数とはなにか
----------------------------------------
文字や数字を入れておくための入れ物です！

```ruby:変数
name = aiueo
```

上のように使用できます！

変数なので"name"のあとの部分（aiueo)は
お好きなものを入れることができます。
もちろん変数自体もお好きな名前で”定義”することができます。

”定義”するとは、

```ruby
name = aiueo
```
の状態をいいます。

”宣言”は変数名をつけて変数を作ることで、"name"単独にあたります。
<br>
2.インスタンス変数とはなにか
----------------------------------------
データが持つ属性を定義する変数です。
つまりクラスに定義されているインスタンスメソッドが持つ各々の設定です。

```ruby:インスタンス変数

class A
 def B
  @name = aiueo
 end
end
```
上記がインスタンス変数です。
Aクラスの中に、Bメソッドがあり
Bメソッドが適用されると"aiueo"が"@name"に代入された状態で使用できます。
<br>

3.変数とインスタンス変数はどういう時に使うのか
----------------------------------------

<b>変数</b>は、メソッド外は外でしか使えない。メソッド内は内でしか使えない。（ただ、インスタンスメソッド内で変数を定義するとインスタンスメソッド内でしか使用できないローカル変数という言い方になります）

<b>インスタンス変数</b>は同じクラス内であれば、別のインスタンスメソッド内でも使用できます。またMVCモデルではコントローラーからビューにデータを渡す際に、壁を飛び越えて渡せる超便利変数になります！

ローカル変数（インスタンスメソッド内での変数）ではスコープの概念があるので壁を飛び越えることはできません。
<br>

4.ここから学んだこと
----------------------------------------
コントローラーでローカル変数をつけており、
"NoMethodError"が出たことがありました。
またビューの受け取り先であるeachメソッドで、"@"をつけ忘れており"NameError"となったこともありました。

前者はローカル変数がコントローラーからビューに行く際にそもそもそんなものは定義がされていないと怒られてしまいました。（ローカル変数になってしまっているので）

後者の方は、"@"をつけていないことで配列として受け取れなくなってしまったのでeachメソッドが使えない（eachは配列を受け取るので）＝NameError(名前が違っているせいでeachが使用できません）という風に解釈されていると思います。
<br>
【Angular/Typescript】クラスや型の使い方のサンプル

コンポーネント以外の独自のクラスを作りたいときのメモ
サンプルを動かしてわかった気になりたい人向け

・AbstructClassと継承
・private/protectedの違い
・superの使い方
・リテラル型
・読み込み専用 readonly
…などのメモです。

例として
・動物クラス
・動物クラスを継承した分類クラス
・分類クラスを継承した種類クラス
を作っていきます

###AnimalClass
```typescript
abstract class Animal {
  //private name: string; //constructorの引数で宣言されていたらここに書き出してなくても変数として使える
  //protected canFly: boolean;
  protected color: string;
  protected type: "bird" | "dog" | "cat"; // リテラル型　指定した値以外は入力値にできない
  protected readonly xxx = 1;

  constructor(private name: string, protected canFly: boolean) {}

  setName(name: string) {
    this.name = name; // privateのフィールドは宣言されたクラスの中でなら書き込める
  }
  getParam() {
    return {
      name: this.name,
      color: this.color,
      canFly: this.canFly,
      type: this.type,
      xxx: this.xxx,
    };
  }
}

```
・abstractは継承して使ってもらうことを前提としたクラスだよ〜、
このクラスを直接使うことはできないよ〜ってこと。
・リテラル型を使うと、number型やstring型よりもより限定的な値を入力できるようにできる
上記の例だと、typeには"bird"または"dog"または"cat"の3つ以外の値が代入されたとき、エラーとなる
・privateは宣言したクラスでしか書き込み、読み込みができない。継承先で利用不可。

###BirdClassとCrowClass

```typescript
abstract class Bird extends Animal {
  constructor(name: string, canFly: boolean) {
    super(name, canFly); // Animalのコンストラクター
    super.type = "bird"; // protectedのフィールドは書き込める
    // super.name = name; // error privateのフィールドは書き込めない
    //super.setName(name); // privateのフィールドに書き込む用のメソッドなどを用意して書き込む
    // super.xxx = 2; // error readonlyは読み込みだけ可
  }
}

class Crow extends Bird {
  constructor() {
    super("crow", true);
    super.color = "black";
    //this.color = "black"; //superはthisでもいい
  }
}
```
Animalを継承した鳥クラス。そしてそれを継承した具体的な種類のカラスクラス。
・super は継承元のクラスを指す
・protectedで宣言されたフィールドはBirdやCrowクラスでも自由に使える。
・継承元のクラスで宣言されたフィールドを使うときはsuper.かthis.をつける
・privateのフィールドはBirdとCrowどちらからも直接書き込むことはできない
・書き込みたければsuperクラスに書き込むためのメソッドとか用意する必要がある
・readonlyのプロパティは、値を利用することはできるが、新たな値を代入はできない

###RabbitClass
```typescript
class Rabbit extends Animal {
  constructor(name: string, color: string) {
    super(name, false);
    //super.type = "rabbit"; // リテラル型で指定した以外の値なのでerror
    super.color = color;
  }
}
```
Animalクラスで動物の種類で指定できるのはbird,dog,catの三種類と指定したので
rabbitを代入しようとするとエラーになる

###コンポーネント
```typescript
import { Component, OnInit } from "@angular/core";

export class ClassTestComponent implements OnInit {
  //cat = new Animal(); // error abstractクラスは直接インスタンス化できない
  crow = new Crow();

  constructor() {}

  ngOnInit() {
    console.log(this.crow.getParam());
  }
}

```
・abstructのクラスはインスタンス化できない

![スクリーンショット 2020-08-22 21.19.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607742/07c118f7-090e-2f5b-1a35-e51633edd478.png)
SharePoint に保存された Excel ファイルをマナー良くブラウザで開く

## 経緯

Excel を開いた時に「セルを A1 にしたほうがマナーが良い」とかいう話を聞いて面白くなってきて、
SharePoint や OneDrive に保存された Excel ファイルを開く時にも制御できるのかな？と調べたメモ

## リンクを取得

ブラウザで Excel を開く
![excel01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118961/f11209fb-b0b6-3452-388a-121cae3dca1f.png)

アドレスバーから URL を取得し、file パラメータまでを使う
`https://<your-tenant>.sharepoint.com/:x:/r/sites/<site-name>/_layouts/15/Doc.aspx?sourcedoc=%7Bxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx%7D&file=<file-name>`

## 表示するシートとセルを指定する

表示するシートを指定するには、`ActiveCell` パラメータを使う

例：シート名「Sheet1」のセル「A1」を指定して表示する時
`&ActiveCell=%27Sheet1%27!A1`

取得したリンクの後ろに追加

`https://<your-tenant>.sharepoint.com/:x:/r/sites/<site-name>/_layouts/15/Doc.aspx?sourcedoc=%7Bxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx%7D&file=<file-name>&ActiveCell=%27Sheet1%27!A1`


## 閲覧モードで開いてもらう

デフォルトでは編集モードで開くので、共有された相手が間違って編集してしまって怒られるかもしれない

閲覧モードで開くには、`action` パラメータを使う

こちらのデフォルトが edit と同じ動作なので、view を指定する

例：閲覧モードで開く
`&action=view`

先程のリンクの後ろに追加

`https://<your-tenant>.sharepoint.com/:x:/r/sites/<site-name>/_layouts/15/Doc.aspx?sourcedoc=%7Bxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx%7D&file=<file-name>&ActiveCell=%27Sheet1%27!A1&action=view`


## 考察

普通に使えそう


## 参考

* [Embed your Excel workbook on your web page or blog from SharePoint or OneDrive for Business](https://support.microsoft.com/en-us/office/embed-your-excel-workbook-on-your-web-page-or-blog-from-sharepoint-or-onedrive-for-business-7af74ce6-e8a0-48ac-ba3b-a1dd627b7773)
【Laravel】ルート以外のページが404NOT FOUNDになる

#現象
[Laravel Quickstart](https://github.com/laravel/quickstart-intermediate)でgit cloneで諸設定をして、アクセスしたものの、ルートページ以外は全て`404 NOT FOUND`で見ることができなかった。

#原因
/etc/httpd/conf/httpd.confファイル内の/var/www/htmlディレクトリ設定の`AllowOverride All`に変更してなかった。

```
sudo vim /etc/httpd/conf/httpd.conf
```

```
<Directory "/var/www/html">

    #↓コメントアウト
    #AllowOverride None
    #↓追記
    AllowOverride All
```

これでApacheを再起動させるとルート以外のぺーじも見れる。

```
sudo systemctl restart httpd
```

#意味
AllowOverrideディレクティブは、.htaccessファイルに書かれたディレクティブの中で、どのディレクティブが適用されるかをカテゴリー単位で指定するもの。このディレクティブがAllに設定されている時には、.htaccess（ディレクトリ毎に設定を変更させる）というコンテキストを持つ全てのディレクティブが利用できる。
今回はデフォルトの`AllowOverride None`設定によって、このディレクトリ毎の設定を変更させる.htaccessファイルを無視したため、読み込めず、ルート以外`NOT FOUND`となった。

#参考
https://stackoverrun.com/ja/q/5042220
http://httpd.apache.org/docs/2.2/ja/howto/htaccess.html
http://httpd.apache.org/docs/2.2/ja/mod/core.html#allowoverride
UbuntuのJetbrains IDEでConsolas(フォント)を使う方法


# はじめに
WindowsでJetbrainsのCLionやIntelliJ IDEAを使っていたのですが、最近Ubuntu20.04を使ってみようとしていたところ、フォントが「Jetbrains Mono」というやつで見慣れていないせいかコーディングに集中できませんでした。そこでWindowsで愛用していた「[Consolas](https://ja.wikipedia.org/wiki/Consolas)」というフォントにしようと思いましたが、Microsoftで開発されたものだからかUbuntuでは標準装備のままでは使えませんでした。

そこで今回はこのConsolasをUbuntuで使えるようにする方法を記しておきます。

# Consolasが使えないことの確認

IntelliJなどのJetbrainsのIDEで左上のFileから
File->Settings->Editor->Font
と押して、下の図の`Font:`と書かれたところでフォントを変えるのですが、おそらく「Consolas」は存在しないと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575388/403f8e5c-df7c-c3d6-ad73-d5e24ab9ed28.png)



# フォントのダウンロード

まずは
https://freefontsdownload.net/free-consolas-font-33098.htm
からconslas.zipをダウンロードして適当にconsolasフォルダとかを作ってそこに展開します。

# フォントの有効化

zipファイルをconsolasフォルダに展開したらターミナルを開いて下のコードをコピペしてください。

```bash
cd consolas && 
sudo mkdir /usr/share/fonts/consolas && 
sudo cp CONSOLA.TTF CONSOLAB.TTF Consolas.ttf consolaz.ttf consolai.ttf /usr/share/fonts/consolas/
```

IDEを再起動します。
うまくいっていれば下のように、「Consolas」が選べる...はずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575388/a65b10a6-787f-5b98-456f-3b2f40496e21.png)

# 参考文献
- https://askubuntu.com/questions/269757/consolas-not-visible-in-intellij-idea-on-ubuntu-12-04
- https://www.it-swarm.dev/ja/fonts/ubuntu-1204%E3%81%AEintellij-idea%E3%81%A7%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%A9%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84/961545393/

# おわりに

自分のメモ程度のつもりで思い出しながら書いてます。間違っていたら[私のtwitter](https://twitter.com/a163236)などにご連絡いただけると嬉しいです。
(JavaScript)日付表示の簡便なフォーマット方法を見つけた


```javascript
const fmt_1 = new Intl.DateTimeFormat('ja', {
  year: 'numeric', month: 'long', day: 'numeric'
})
console.log(
  fmt_1.format(new Date())
)
//2020年8月22日
```
```javascript
const fmt_2 = new Intl.DateTimeFormat('ja', {
  year: 'numeric', month: '2-digit', day: '2-digit'
})
console.log(
  fmt_2.format(new Date())
)
//2020/08/22
```
```javascript
const fmt_3 = new Intl.DateTimeFormat('ja', {
  year: 'numeric', month: 'long', day: 'numeric',
  hour: 'numeric', minute: 'numeric',
  hour12: true
})
console.log(
  fmt_3.format(new Date())
)
//2020年8月22日 午後8:58
```
```javascript
const fmt_4 = new Intl.DateTimeFormat('ja', {
  year: '2-digit', month: '2-digit', day: '2-digit',
  hour: '2-digit', minute: '2-digit', second: '2-digit',
  hour12: false
})
console.log(
  fmt_4.format(new Date())
)
//20/08/22 20:58:05
```

各プロパティ用の値は以下から
> Intl.DateTimeFormat
> by [MDN Contributors](https://wiki.developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat$history) (CC BY-SA 2.5)
> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat

----

フォーマット用のインスタンスを作っておけば、後からいくらでも再利用できるというわけです。

「`new Date().getFullYear()`で年を求め、`new Date().getMonth() + 1`で月を求め、時間が12以上だったら12を引いて『午後』を付けて…」などとしていたのが馬鹿馬鹿しくなってきますね…。
相変化メモリ、ROM、SRAM、DRAM　説明

応用情報技術者平成30年秋期 午前問10


相変化メモリの説明として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/35f3690b-7836-8783-00db-0014b9d59636.png)


１、相変化(そうへんか)メモリ(PCM:Phase Change Memory又はPRAM)は、
カルコゲナイド系合金の結晶状態と非結晶状態(アモルファス状態)における電気抵抗の差を利用した**不揮発性メモリ**です。2つの状態は電気的に移行可能なので内容の書き換えが可能です。DRAMに近い記憶密度を実現可能であり、**DVD-RAMの基本材料**としても用いられています。

２、ROMの説明
一度だけ書込みが可能な不揮発性メモリ
ROMは英語の「Read Only Memory」(リード・オンリー・メモリ）の略語で、読み出し専用で書き込みができないメモリをさします。CDやゲームソフトなどがROMの代表例です。

３、SRAMの説明
フリップフロップ回路で構成された揮発性メモリ
SRAMとは、データの読み出し/書き込みが自由に行える半導体メモリ（RAM)の一種です。
記憶素子にフリップフロップ回路を用いており、一度書き込んだデータは電源を切らない限り記憶され、再書き込み（リフレッシュ）の必要がありません。

DRAMと比較して高速動作しますが、集積度を上げるのが難しため記憶容量あたりの単価が高く、主に**キャッシュメモリー**などに使用されています。

４、DRAM
リフレッシュ動作が必要な揮発性メモリ
「DRAM」とは揮発性の半導体記憶装置（半導体メモリ）の一種で、「Dynamic Random Access Memory」の頭文字を取った名称です。
DRAMは異なる規格同士では互換性を持たないという点です。例として「DDR3」と「DDR4」は規格が異なるため、DDR3からDDR4に換装したい場合は、パソコンのマザーボード（電子回路基板）自体を交換しなければなりません。

５、「RAM(ラム)」とは、
英語の「Random Access Memory」(ランダム・アクセス・メモリ)の略語で、CPUが何かの処理を行うときに使われる作業用のメモリのことです。

つまりRAMは、「デバイスの作業領域」と言い換えることができます。したがって、RAMの容量が大きいほど、多くのソフトやアプリを起動できるというわけです。

なお、RAMに展開されたデータは、デバイスの電源が切れるたびに消去されるのが一般的です。

 

一般的なPCに搭載されているRAMのサイズは4～16GB程度、業務用などハイエンドなものになると32GB以上のものが搭載されているケースもあるでしょう。一方、スマホやタブレットに搭載されているRAMは1～4GB程度が一般的で、ハイスペックなものでも6GB～8G程度です。（2020年3月現在）


参照：
RAM、ROM
https://join.biglobe.ne.jp/mobile/sim/gurashi/memory/

https://www.ap-siken.com/kakomon/30_aki/q10.html
VisualStudioCodeでDjangoをrunserverするまで

#プロローグ
VisualStudioCodeにDjangoを読み込んでWebサーバを起動します。
エディタがない場合、「python manage.py runserver」を手動実行する必要がありますが、
VSCを使えば、ボタン一つで開発用WEbサーバの起動が可能になり便利です。
設定するにあたって結構時間がかかってしまったところもあったので、記録しておきます。

#手順
左上部のエクスプローラ画面より「フォルダーの追加」を押下します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/4f6b3c46-d45b-0d15-b3fd-0d0aa6104e3c.png)

プロジェクトフォルダを選択します。
ここで指定するのはDjangoを「django-admin startproject プロジェクト名」で作成したプロジェクトフォルダです。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/4ca41461-eb60-4edd-cf95-cfc70c1c44fa.png)

これでワークスペースは設定できました。
続いて、開発用webサーバが起動できるように設定します。
続いて左の虫のアイコンのあるデバッグ画面を開き、「launch jsonファイルを作成します」を押下します。
上にワークスペースのフォルダ名が表示されるので、選択します。
※青色に塗りつぶしているところです。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/58afba1a-9b5c-4445-fa6a-7d387c660530.png)

続いて対象の環境を選択します。
しかし、残念ながら候補に「django」がありません。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/215057b4-7f91-e920-c9e9-994c9c31172c.png)

一旦djangoのファイルを開く必要があります。
views.pyを開いてもう一度試してみます。
候補にDjangoが表示されましたので選択します。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/c7309003-046a-c7fb-c02d-0b6336695a86.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/3a7052e7-6161-76d1-d84c-3c33a7ce8bde.png)

Django用のlaunch.jsonが作成されました。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/fd0ab7e3-b0a5-4b2e-d67c-12ecff7cc9f8.png)

これで設定が環境したので、開発用Webサーバーを起動してみます。
左上の三角のマークを押下します。
下側がオレンジになれば、起動できています。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/e7daf9ed-58c0-77b0-0b83-666c540078e0.png)

一応確認してみます。
画面が表示されたので、確認はOKです。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/81b88739-985e-5e32-b3d2-7525ddd8129e.png)

#アンチパターン
##① No such file or directory hogehoge manage.py
エラーメッセージの通り、manage.pyが見当たってません。ワークスペースの場所指定誤りです。
自分は、プロジェクトフォルダではなく、アプリのフォルダをワークスペースに指定してしまっていました。

```
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\work\\hogehoge\\manage.py'
```

##② SyntaxError: invalid syntax
エラー、メッセージはこんな感じ

```
  File "C:\Users\hoge\anaconda3\lib\runpy.py", line 236, in _get_code_from_file
    code = compile(f.read(), fname, 'exec')
  File "c:\work\02_実施\hogehoge\.vscode\launch.json", line 2
    // IntelliSense を使用して利用可能な属性を学べます。
     ^
SyntaxError: invalid syntax
```
原因はlaunch.jsonを作成するときに、Djangoではなくpythonを選んだことでした。
どうやらlaunch.jsonをpythonで実行しようとしている？のが直接の原因のようです。
英語ですが、[stack over flow](https://stackoverflow.com/questions/48435774/syntaxerror-invalid-syntax-when-starting-python-script-in-vs-code-on-macos)にも記載があります。

手順でやったようにDjangoを指定して、launch.jsonを作り直せば正常に起動できます。

#エピローグ
もっと、サクッとできるかと思っていましたが、意外と時間がかかってしまいました。
ストレートにいけば、5分ぐらいの作業になりそうです。
メモリの誤り制御方式（誤り検出、訂正）ーハミング符号、奇数パリティ、水平パリティ、チェックサム

応用情報技術者平成30年秋期 午前問9

メモリの誤り制御方式で，2ビットの誤り検出機能と，1ビットの誤り訂正機能をもたせるのに用いられるものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ae37a26f-d946-0c93-35fd-3f6194dafb7b.png)


１、ハミング符号は、
情報ビットに検査ビットを付加することで2ビットまでの誤りを検出し、1ビットの誤りを訂正できる手法です。ECCメモリ(Error Check and Correct memory)やRAID2の誤り訂正符号として使用されています。
・２ビット誤り検出可
・１ビット誤り訂正可

２、奇数パリティは、
データを構成するビット全体の中でビット「1」の数が奇数になるようにパリティビットを付加する方式です。1ビットの誤りを検出することができます。
・１ビット誤り検出可
・訂正不可

３、水平パリティは、
データの水平方向を対象としてパリティビットを付加する方式です。垂直方向と組み合わせた水平垂直パリティチェックでは1ビットの誤りを訂正できますが、水平パリティだけでは1ビットの誤りのみが検出可能です。
・１ビット誤り検出可
・垂直パリティと合わせて、１ビット訂正可

４、チェックサム
チェックサムは、データの合計値を検査用に付加し、誤りが発生しているかを検査する方式です。
・誤り発生していたかを検査する可
・訂正不可


----------------------------------------------
補足

図のように16ビットのデータを4×4の正方形状に並べ，行と列にパリティビットを付加することによって何ビットまでの誤りを訂正できるか。ここで，図の網掛け部分はパリティビットを表す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ca28427c-4472-5ac4-9bf5-2b4b6bb6ca78.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c344108e-8094-bc8e-e9c4-77395a0db1cb.png)

訂正：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/eacb25c1-8f3a-6a48-2ed7-40dddf19ae15.png)





参照：

https://www.ap-siken.com/kakomon/27_aki/q4.html

https://www.ap-siken.com/kakomon/30_aki/q9.html
Rust: Starttls でメールの送信

hi-ho.ne.jp で試した方法です。

```text:Cargo.toml
[package]
name = "hi-ho_send"
version = "0.1.0"
edition = "2018"


[dependencies]
lettre = "0.10.0-alpha.1"
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	hi-ho_send.rs

					Aug/22/2020
*/
// --------------------------------------------------------------------
use lettre::transport::smtp::authentication::Credentials;
use lettre::{Message, SmtpTransport, Transport};

// --------------------------------------------------------------------
fn main() {
	eprintln!("*** 開始 ***");

let str_from = "新美南吉 <*****@hi-ho.ne.jp>";
let str_to = "<****yahoo.co.jp>";

let str_title = "日本語のタイトル";
 
let mut str_body = String::new();
str_body.push_str("Hello\n");
str_body.push_str("Aug/22/2020\n");
str_body.push_str("\tPM 20:40\n");
str_body.push_str("\tSee you again!\n");
/*
str_body.push_str("今晩は\n");
str_body.push_str("さようなら\n");
*/
// let str_body = "今晩は\n";

let email = Message::builder()
	.from(str_from.parse().unwrap())
	.reply_to(str_from.parse().unwrap())
	.to(str_to.parse().unwrap())
	.subject(str_title)
	.body(str_body)
	.unwrap();

let smtp_server = "hi-ho.mose-mail.jp";
let username = "****@hi-ho.ne.jp";
let password = "******";

let creds = Credentials::new(username.to_string(), password.to_string());

// Open a remote connection to gmail
let mailer = SmtpTransport::relay(smtp_server)
	.unwrap()
	.credentials(creds)
	.build();

// Send the email
match mailer.send(&email) {
	Ok(_) => println!("Email sent successfully!"),
	Err(e) => panic!("Could not send email: {:?}", e),
}

	    eprintln!("*** 終了 ***");
}

// --------------------------------------------------------------------
```

本文に日本語を入れると送信できません。
速いビットカウントは bin().count('1') 

BitBoard を利用してリバーシを実装しています。
石の数は 立っている bit の数を数える（ビットカウントする）ことで求められます。

いくつか実装を比べてみましたが、お手軽な実装が速いです。

```python:bin_count
def count1(board):
    return bin(board).count('1')
```

当初、文字列を経由するので遅いのではないかと思いましたが、最適化されていて速いんだと思います。
試してみたコードは以下です。

```python:
# 呼び出しのオーバーヘッド計測のためのダミー関数
def dummy(board):
    return 0

# popcount の実装
def count2(board):
    board = (board & 0x5555555555555555) + (board >> 1 & 0x5555555555555555)
    board = (board & 0x3333333333333333) + (board >> 2 & 0x3333333333333333)
    board = (board & 0x0f0f0f0f0f0f0f0f) + (board >> 4 & 0x0f0f0f0f0f0f0f0f)
    board = (board & 0x00ff00ff00ff00ff) + (board >> 8 & 0x00ff00ff00ff00ff)
    board = (board & 0x0000ffff0000ffff) + (board >> 16 & 0x0000ffff0000ffff)
    return (board & 0x00000000ffffffff) + (board >> 32)

# 愚直な方法
def count3(board):
    result = 0
    while board:
        board >>= 1
        result += board & 1
    return result

def main():
    board = 0b0010000000100000000011000011010000111100000110000000000000000000

    import time

    temp = time.time()
    for i in range(100000):
        dummy(board)
    print(f"dummy : {time.time() - temp}")

    temp = time.time()
    for i in range(100000):
        count1(board)
    print(f"count1: {time.time() - temp}")

    temp = time.time()
    for i in range(100000):
        count2(board)
    print(f"count2: {time.time() - temp}")

    temp = time.time()
    for i in range(100000):
        count3(board)
    print(f"count3: {time.time() - temp}")

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

結果は以下です。

```
dummy : 0.010009050369262695
count1: 0.0470428466796875
count2: 0.152146577835083
count3: 1.0559582710266113
```

`count1` は 呼び出し（`dummy`）のオーバーヘッドと同じオーダーで計算できています。
`count2` のアルゴリズムは popcount と呼ばれる O(logN) のアルゴリズムを利用していますが、遅いです。
`count3` と比べると差は歴然です。
探索表の構成法


応用情報技術者平成30年秋期 午前問8

探索表の構成法を例とともに a～c に示す。探索の平均計算量が最も小さい探索手法の組合せはどれか。ここで，探索表のコードの空欄は表の空きを示す。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/a731dd42-7b86-905f-a39b-71e2a10ea13a.png)

探索表を平均計算量が最も小さいの手法ですね。
データの特性を確認するのは必要ですね。
aは整列済とか、
bは使用頻度順で格納したとか、
cはコードから一意に決まる場所に可能した
ですね。この情報を利用して、最も小さい探索方法を決めますね。


[a コード順に格納した探索表]
探索表はコード順に整列済みなので、線形探索または2分探索を使用可能です。各探索法の平均探索回数は、線形探索が (N＋1)／2 回、2分探索法が [log2N] 回ですので、探索表の要素数が同じならば平均探索回数は2分探索のほうが少なくて済みます。したがってa表には2分探索が適切です。(※[n]はnを超えない最大の整数を表します)

[b コードの使用頻度順に格納した探索表]
使用頻度が高いデータほど探索表の先頭のほうに位置していることになります。線形探索では探索表の先頭から順番に探索していくので、このような探索表に対しては効率的に探索できます。
2分探索法は、データが整列されていないと使えないという制限がありますし、この表はハッシュ法に対応していないので、b表に対しては線形探索が唯一使用できる方法となります。

[c コードから一意に決まる場所に格納した探索表]
ハッシュ法は、探索データのキー値から、そのデータの格納場所(アドレス)を直接計算する方法で、(シノニムが発生しなければ)1回の計算で一意に目的のデータにたどりつけます。
1回の探索でいいので、このc表に対して最も計算量が少なくなる探索法はハッシュ表探索です。

参照：
https://www.ap-siken.com/kakomon/22_aki/q6.html
【Go】値レシーバとポインタレシーバの違いについて

<font color="red">※注意: この記事ははあくまで個人学習用に整理しただけの記事で、内容としては不完全なものになります。読んでも参考にならない可能性が高いです。</font>

構造体のメソッドを作成するにあたり、値レシーバとポインタレシーバの二つの方法があった。
この二つの違いがわかっていなかった為、まとめてみる。

[A Tour of Go](https://go-tour-jp.appspot.com/methods/4) に良いサンプルがあったので、こちらで確認。

ポインタレシーバから確認。

**ポインタレシーバ**

```golang
package main
import (
	"fmt"
	"math"
)
type Vertex struct {
	X, Y float64
}
func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func (v *Vertex) Scale(f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}
func main() {
	v := Vertex{3, 4}
	v.Scale(10)
	fmt.Println(v.Abs()) // 50
}
```

50 と表示される。
上記の Scale メソッドがポインタレシーバになっている。

この Scale のレシーバの * を消して、値レシーバとして実行してみる。

**値レシーバ**

```golang
package main
import (
	"fmt"
	"math"
)
type Vertex struct {
	X, Y float64
}
func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func (v Vertex) Scale(f float64) { // * を削除して実行
	v.X = v.X * f
	v.Y = v.Y * f
}
func main() {
	v := Vertex{3, 4}
	v.Scale(10)
	fmt.Println(v.Abs()) // 5
}

```

`v.Scale(10)` で10倍にしているはずが、反映されず 5 になってしまった。

A Tour of Go の解説では以下のように書いてある。

> 変数レシーバでは、 Scale メソッドの操作は元の Vertex 変数のコピーを操作します。 （これは関数の引数としての振るまいと同じです）。 つまり main 関数で宣言した Vertex 変数を変更するためには、Scale メソッドはポインタレシーバにする必要があるのです。

なるほど。

変数を変更したい場合にポインタレシーバを使うんですね。
そして上記の例の Abs メソッドのように変数の変更をしない場合は値レシーバを使用し、戻り値で処理結果を戻し、呼び出し元でその値を使用すると。

なるほどです。一旦ざっくり理解した。
【jQuery】クリックイベント内でsetTimeoutで遅延実行する際のthisがうまく働かない

###要約
1. $.proxy(function, context)を使う
2. contextにthisと書いて対象オブジェクトを引き継ぐ
3. setTimeout($.proxy(function(){実行したいこと},this), 1000)
4. $object = thisを記述した方がわかりやすいのは自分だけ？

###setTimeoutを使うとthisはそのままだと使用できない

```javascript:エラーになるバージョン
    $('.unselected').click(function() {
        setTimeout(function(){
            $(this).removeClass('unselected');
        },1000);
    });
```

```javascript:エラー回避バージョン
    $('.unselected').click(function() {
        setTimeout($.proxy(function(){
            $(this).removeClass('unselected');
        } ,this),1000);
    });
```


###$.proxyでthisのとなるオブジェクトを引数として渡す

$.proxy(function, context)
function: 対象となる関数
context: functionの中でthisとなるオブジェクト

`$.proxy(function(){}, this);`
とすれば、直前のオブジェクトをthisで$.proxyの中のfunctionにthisとしたいオブジェクト渡すことができる。


```javascript:オブジェクトを別の変数で受け取ってから渡してもいい
    $('.unselected').click(function() {
        // 遅延実行したい対象のオブジェクト
        $object = this; 
        // 対象のオブジェクトを$.proxyの第二引数に引き継いで上げる
        setTimeout($.proxy(function(){
            $(this).removeClass('unselected');
        } ,$object),1000);
    });
```

これでクリックされたものだけイベントが発生するようになる。
AWSクラウドプラクティショナー試験を受けて合格したので、やったことを書いてみる

AWSクラウドプラクティショナー試験を今回受験し、合格したので
私なりの勉強方法と感想について記載してみようと思います。
（2020年8月22日時点での情報です）
Qiitaやwebにもすでに体験談いっぱいありますが、
私の記録もかねて書いておきます。

#1.はじめに
受験した理由はすごく単純で会社の目標管理に
AWSクラウドプラクティショナーとAZ-900に合格すると書いてしまったのが一番です。
（これは自分が所属するチームの方針でした）
後は会社や世間でもAWSの単語がでてきて、インフラエンジニアとしてこれは知る必要があるなと思ったからです。

ちなみに私について記載しておくと
・情報系大学卒業
・新卒入社した今の会社でインフラエンジニア（主にサーバーサイド）を3年ちょい
・AWSは先輩の補佐でEC2とClowdwatchをほんのちょっと触ったレベル
・保有資格はITパスポートのみ（しかも6回目で合格）

#2.やったこと
##4月下旬
・AWSクラウドプラクティショナー試験の概要のオンラインセミナー受講
（内容としては下記リンクと同じ感じです
<https://aws.amazon.com/jp/blogs/news/webinar-bb-practitioner-2018/>
・AWS公式のデジタルラーニングを受講

##5月
・GWの休み中にudemyでハンズオンを受講
「AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得 」
<https://www.udemy.com/share/101YbyAEIedVpaQnsH/>
非常にわかりやすかったです。
ですがクラウドプラクティショナーにおいては正直必要なかったかもなぁという感想

##7月下旬～8月受験日当日まで
業務多忙で少し間があきましたが、そろそろやらないと間に合わないぞ？と思い、
以下の内容を実施
・以前に購入しておいたテキスト「AWS認定資格試験テキスト　AWS認定 クラウドプラクティショナー」
<https://www.amazon.co.jp/dp/B07QX45RXM/ref=cm_sw_r_tw_dp_x_jQpqFbNDGG93P>
の内容をざっと読んで練習問題を2周ほど実施

・そして申し込みが遅くなりましたが、試験を8月22日に申し込み

・以前に購入しておいたudemyの
「この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）」
<https://www.udemy.com/share/101SaAAEIedVpaQnsH/>
の基本レベルと応用レベル1と2まで実施
→AWS公式の模擬問題後基本レベルをとにかく90％台になるまで実施

・Amazonでkindle版しかありませんが「AWS認定　クラウドプラクティショナー　模擬問題集」
というのがあったので購入
（kindle Unlimited会員だと無料です）
<https://www.amazon.co.jp/dp/B081D4ZJ5G/ref=cm_sw_r_tw_dp_x_iYpqFbWTN4KVE>
レベル的にはudemyの基本と応用の中間ぐらいに感じました
こちらをまずは1週
→AWS公式の模擬問題後さらにもう1週、当日に0.5周

・一応AWS公式の模擬問題も実施
（受験方法はほかの方参考に）
結果は75％でやばいと思い、udemyとamazonのやつをとにかくやりこみました。

#3.本番試験
ピアソンVUEで以前MCP受験した時と同じテストセンターに申し込みしていたので、
時間に余裕をもって到着し、申し込みしてた時間より前倒しで受験
知らない単語が結構でてきたり、意味わからない問題なども結構あって
受験しながら正直落ちたな…と思ってました
ただその中でもやってきた問題が一部でたので、
それは自信が持てました。
合格って表示された時の安心感がはんぱなかったですw
スコアレポートまだきてないのですが。700点台だと思います…

2020/8/23 追記
1000点満点中882点と思ってたよりも点数高かったです。

#4.まとめ
AWS試験の中でも一番下の試験ですがとにかく範囲が広く、
いろんなサービス名がでてきてこんがらがりました…
後本番試験で知らない単語はやはりでてきたので、そこでいかに焦らないかが重要かなと感じました。

Qiitaの記事久しぶりに書いたので、読みづらくて申し訳ないです…
スコアレポート載せようと思ったのですが、やめときます。
次回はAZ-900の取得に向けて頑張ります。
docker-composeで起動したmysqlコンテナに初期データをぶちこむ


## ファイル構造

```
yuta:~/mysql $ tree
.
├── docker-compose.yml
└── volumes
    ├── data
    └── init
        └── init.sql

3 directories, 2 files
```

## docker-compose.ymlを書く
- `/docker-entrypoint-initdb.d` にシェルやsqlスクリプトなどを配置しておくことで、mysqlのコンテナイメージ起動時に実行することができる


```docker-compose.yml
version: "3"
    
services:
  mysql:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: pass
    volumes:
      - ./volumes/init/:/docker-entrypoint-initdb.d
      - ./volumes/data/:/var/lib/mysql
```

## 初回に実行するsqlを用意

```init.sql
DROP DATABASE IF EXISTS sample;
CREATE DATABASE sample;
USE sample;
DROP TABLE IF EXISTS name;

CREATE TABLE name (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name TEXT NOT NULL
)DEFAULT CHARACTER SET=utf8;

INSERT INTO name (name) VALUES ("田所"),("浩二"),("令和");
```

## 起動
```
docker-compose up -d
```

## 確認
```
yuta:~/mysql $ 
yuta:~/mysql $ d ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
76412daa6954        mysql:latest        "docker-entrypoint.s…"   30 seconds ago      Up 30 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql_mysql_1
yuta:~/mysql $ vim docker-compose.yml 
yuta:~/mysql $ d ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
76412daa6954        mysql:latest        "docker-entrypoint.s…"   39 seconds ago      Up 39 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql_mysql_1
yuta:~/mysql $ d exec -it 76412daa6954 /bin/bash
root@76412daa6954:/# 
root@76412daa6954:/# mysql       
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
root@76412daa6954:/# mysql -uroot -ppass
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> 
mysql> use sample
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> 
mysql> show tables;
+------------------+
| Tables_in_sample |
+------------------+
| name             |
+------------------+
1 row in set (0.00 sec)

mysql> 
```


## 参考
https://qiita.com/juhn/items/274e44ee80354a39d872
https://noumenon-th.net/programming/2019/04/01/docker-entrypoint-initdb01/
[C++/CLI] 構造体のデータ部をバイナリデータとして取得する

```CPP
private ref class SafePointer sealed : IDisposable
{
private:
    int m_length = 0;
    IntPtr m_buffer = IntPtr::Zero;
    bool m_disposed = false;

public:
    SafePointer(Object^ object)
    {
        if (object == nullptr)
        {
            throw gcnew Exception();
        }

        m_length = Marshal::SizeOf(object);
        m_buffer = Marshal::AllocHGlobal(m_length);
        Marshal::StructureToPtr(object, m_buffer, false);
    }

    // デストラクタ
    ~SafePointer()
    {
        this->!SafePointer();
    }

    bool IsDisposed()
    {
        return m_disposed;
    }

    static operator void* (SafePointer^ v)
    {
        return v->m_buffer.ToPointer();
    }

    static operator IntPtr (SafePointer^ v)
    {
        return v->m_buffer;
    }

    // ファイナライザ
    !SafePointer()
    {
        if (m_disposed) return;

        m_disposed = true;

        if (m_buffer != IntPtr::Zero)
        {
            Marshal::FreeHGlobal(m_buffer);
            m_buffer = IntPtr::Zero;
            m_length = 0;
        }
    }
};
```

・以下のサイトを参考にさせていただきました。
[fixedしたポインタにスコープを越えさせる @株式会社CFlat](http://cflat-inc.hatenablog.com/entry/2014/09/16/074544)
２次元配列の要素数

応用情報技術者平成30年秋期 午前問7

2次元配列 A[i，j] (i，j はいずれも0～99の値をとる)の i＞j である要素 A[i，j] は全部で幾つか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7cac498f-378e-6a0d-2f4e-4fd0db2d374d.png)


本質問では、０～９９の値があるだけど、
まずは、少ない値からルールを探しましょう。

仮に、iは２とすると、1+2=３件ですね。
A[1,0]
A[2,1],A[2,0]

仮に、iは３とすると、1+2+3=６件ですね。
A[1,0]
A[2,1],A[2,0]
A[3,2],A[3,1],A[3,0]

つまりですね、iが９９の場合、１＋２＋３＋。。。＋９９が答えですね。
これは（１＋９９）×９９/２＝４９５０ですね。
木、枝、木の深さ、節点の個数

応用情報技術者平成30年秋期 午前問6

葉以外の節点はすべて二つの子をもち，根から葉までの深さがすべて等しい木を考える。この木に関する記述のうち，適切なものはどれか。ここで，深さとは根から葉に至るまでの枝の個数を表す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7fed3166-1261-5362-74f6-2651c077937e.png)


問題文にある「葉以外の節点はすべて二つの子をもち，根から葉までの深さがすべて等しい木」は次のような構造をもつ木です。
概念としては、
・枝は６本　※根から葉までの枝数の総数
・葉は４個
・深さは２　※根から葉までの枝数
・節点は７個

ア、イ、ウは間違いますね。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/88bbc911-0731-09d1-5091-b60e3ff761dc.png)


「葉以外の節点はすべて二つの子をもち，根から葉までの深さがすべて等しい木」は**完全2分木**と呼ばれ、木の深さが「n」であれば葉の数は「2n」、葉の数が「n」であれば、葉以外の節点の数(根を含む)は「n－1」であるという特徴を持っています。


参照：
https://www.ap-siken.com/kakomon/23_toku/q6.html
WordPressのURL構造からcategoryを消す方法【コピペでOK】

##はじめに

WordPressのカテゴリー配下のURL構造には、`/category/`の文字列が必ず含まれてしまいます。

例えば、`mobile`カテゴリーに所属する`iphone`というURLスラッグの記事を投稿した場合は、次のようなURL構造になります。

`https://hogehoge.com/category/mobile/iphone/`

SEO的には、次のようなURL構造にした方が検索エンジンに階層を伝えやすく、`/category/`を消したくなる場合があると思います。

`https://hogehoge.com/mobile/iphone/`

この記事では、WordPressのURL構造に含まれる`/category/`を消す方法について紹介していきます。

##WordPressのURLからcategoryを消す

WordPressのfunction.phpに以下のコードを設置してください。
管理画面から、外観→テーマエディター→テーマファイルで編集できます。

```function.php
//URL構造からcategoryを削除
function remcat_function($link) {
return str_replace("/category/", "/", $link);
}
add_filter('user_trailingslashit', 'remcat_function');

function remcat_flush_rules() {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
add_action('init', 'remcat_flush_rules');

function remcat_rewrite($wp_rewrite) {
$new_rules = array('(.+)/page/(.+)/?' => 'index.php?category_name='.$wp_rewrite->preg_index(1).'&paged='.$wp_rewrite->preg_index(2));
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_filter('generate_rewrite_rules', 'remcat_rewrite');
```

上記のコードは、パーマリンク設定が`/%category%/%postname%/`でサブカテゴリがある場合は、404になってしまい残念ながら使えません。
【Go】ポインタについて

<font color="red">※注意: この記事ははあくまで個人学習用に整理しただけの記事で、内容としては不完全なものになります。読んでも参考にならない可能性が高いです。</font>

今まで JavaScript のみをやっていたので、pointer という概念がなかなか入ってこないので一旦整理

## Pointer

一旦以下の挙動を確認

```golang
package main

import "fmt"

func main() {
	i := 1 // i という変数を定義し、1を代入
	fmt.Println(i) // 1
	p1 := &i // p1 という変数を定義し、& 演算子を使用して i のポインタを格納
	fmt.Println(&i) // 0xc0000b6001
	fmt.Println(p1) // 0xc0000b6001
	fmt.Println(&p1) // 0xc0000b6003
	fmt.Println(*p1) // 1
	*p1 = 2 // p1 を * 演算子を使用したものに、 2 を格納
	fmt.Println(i) // 2
}

```

上記の流れとしては以下の画像の通りになる

![スクリーンショット 2020-08-22 20.06.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298695/d14300ae-c400-1286-b63d-d4d9f8ae41c5.png)

![スクリーンショット 2020-08-22 20.09.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298695/edc76f56-4a74-b4df-5b53-ae17ed57f6c6.png)

![スクリーンショット 2020-08-22 20.10.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298695/11fa2bd3-b9d7-8803-dbf1-9c7ddfd685fd.png)

一旦アドレス演算子と間接参照演算子についての挙動は簡単に理解した。
【Android】画面遷移時に遷移元のActivityを終了する

Androidでアプリを作成する際に、戻るボタンでアプリを終了したいケースがあると思います。

Ex) ログイン画面から遷移後に戻るボタンを押したらアプリを終了させる。（ログイン画面に戻さない）

そのような際に、Activityを終了させる方法をまとめました。

# ActivityからActivityでの遷移時

```MainActivity.java
Intent intent = new Intent(getApplication(), SubActivity.class);
startActivity(intent);
finish();
```

# 画面A→B→C遷移時に、A,BのActivityを終了する（複数のActivityを終了したいとき）
Ex) A(初期画面)→B(サインイン画面)→C(メイン画面）でサインイン後、戻るボタンでアプリを終了させる時。

```BActivity.java
  Intent intent = new Intent(getApplication(), CActivity.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);
```

`finish()`だと、メイン画面で戻るボタンを押すとA(初期画面)が表示されてしまいます。
サインイン画面のみActivityが終了されているためです。

```
FLAG_ACTIVITY_NEW_TASK: 新しいタスクを作成し、起動するActivityをそのタスクのスタックに追加する
FLAG_ACTIVITY_CLEAR_TASK: Activityを起動する前に、既存のタスクを破棄する。このフラグはFLAG_ACTIVITY_NEW_TASKと組み合わせてのみ使用できる。
```


#Fragmentから遷移時にActivityを終了する

```currentFragment.java
Intent intent = new Intent(getActivity(), SecondActivity.class);
                                startActivity(intent);
                                MainActivity mainActivity = (MainActivity) getActivity();
                                mainActivity.finish();
```

Fragmentでは`finish()`を利用できないため、Activityをインスタンス化し使えるようにする必要があります。
#まとめ
基本的は`finish()`でActivityを終了できます。

たとえば、ログアウトをし、ログイン画面に遷移した後に戻るボタンを押した際は、ログアウト画面に戻らせたくないので、この実装が使えるかと思います！

# 参考
[Android ログイン後にログイン画面に戻れないようにしたい](https://qiita.com/takehilo/items/e677c343d689d239bf81)