OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで見かける「if __name__ == '__main__':」について

Pythonで見かけた「if ＿name＿ == '＿main__':」について意味がわからなかったので
自分なりに調べたことをメモがてら以下にまとめる。

こちらのサイトを参考にさせていただいた。
https://blog.pyq.jp/entry/Python_kaiketsu_180207

ざっくり言うと、このPythonファイルが「"Pythonファイル名".py」というふうに実行されているかを判断するらしい。

まず、「if ＿name__ == '＿main__':」のないプログラムを考えてみる。
ーーーーーーーーーーーーーーーーーーーー
def main():
    print("Hello")

main()
ーーーーーーーーーーーーーーーーーーーー
このようなhello.pyというプログラムがあった場合
$Python hello.pyとすることで「Hello」と表示することができるが、
＞＞＞import hello.pyとしても同様に「Hello」と表示されてしまう。

そこでプログラムを以下のようにすることで、importした際のmain関数の実行を防ぐことができ
$Python hello.pyとした場合にのみ、main関数が実行される
ーーーーーーーーーーーーーーーーーーーー
def main():
    print("Hello")
if ＿name＿ == '__main＿':
　　main()
ーーーーーーーーーーーーーーーーーーーー

Pythonには__name__という特殊な変数があり、$Python hello.pyとすることで自動的に＿name__ = '＿main__'となるので
プログラムがPython hello.pyとして実行されたと判断することができるらしい。
【Mac】ショートカットキー抜粋

Windowsから初Macになったときに困惑したので、個人的によく使うものをまとめました。

# Finder

Windowsでいうところのエクスプローラー

| 動作 | コマンド |
|:-|:-|
|カット|⌘ + C|
|ペースト|⌘ + ⌥ + V|
|ファイル削除|⌘ + del|
|タブを閉じる|⌘ + W|
|次のタブ|⌘ + Tab|
|新規タブ|⌘ + N|
|新規ウィンドウ|⌘ + ⌥ + N|
|隠しファイル表示|⌘ + shift + .|
|アイコン表示|⌘ + 1|
|リスト表示|⌘ + 2|
|階層表示|⌘ + 3|
|プレビュー表示|⌘ + 4|
|先頭 or 最後（リスト表示時）|⌥ + ↑ or ↓|
|ファイルのプレビュー|space|
|ゴミ箱を空にする|⌘ + shift + del|

- ファイル右クリック時に + `⌥` 押下でパスのコピーが選択可能になる。

# 文字入力

| 動作 | コマンド |
|:-|:-|
|右の文字削除|fn +  del|
|Undo|⌘ + Z|
|Redo|⌘ + shift + Z|
|`\`（バックスラッシュ）|⌥ + ¥|

# ウィンドウ
| 動作 | コマンド |
|:-|:-|
|アクティブウィンドウを最大化|⌘ + control + F|
|アクティブウィンドウを最小化|⌘ + M|
|アクティブウィンドウを隠す|⌘ + H|
|画面をロック|⌘ + control + Q|
|アプリケーション終了|⌘ + Q|
|アプリケーション強制終了|⌘ + ⌥ + esc|
|Chrome スーパーリロード|⌘ + shift + R|

# スクリーンショット
| 動作 | コマンド |
|:-|:-|
|画面全体|⌘ + shift + 3|
|選択範囲|⌘ + shift + 4 <br>（space押すとウィンドウ指定モードと切り替え）|
|（画面録画）|⌘ + shift + 5|

- スクショは`control`も押すとクリップボードに保存される。
- 保存場所変更（例:  `~/Desktop/Screenshots`に保存）
```shell:
$ mkdir ~/Desktop/Screenshots
$ defaults write com.apple.screencapture location ~/Desktop/Screenshots/;killall SystemUIServer
```

# おまけ
## Excel
- フィルターの追加と削除を切り替え:	⌘ + shift + F
- オートSUM数式を挿入:	⌘ + shift + T
- テキストの中央揃え:	⌘ + E
- フォントサイズの縮小:	⌘ + shift + <（[）
- 選択したセルの周囲に外枠罫線を適用:	⌘ + option + 0

- 今日の日付: control + ;
- 形式を選択して貼り付け: ⌘ + control + V
- 選択範囲を挿入:	⌘ + shift + ＋
- 選択範囲を削除:	⌘ + -
- コンテキストメニューを表示:	shift + F10
- 選択した行を非表示:	⌘ + 9
    - 再表示: control + shift + 9
- 選択した列を非表示:	⌘ + 0
    - 再表示: control + shift + 9
- オートSUM数式を挿入: ⌘+shift+T
- フィルター: ⌘+shift+F
- 選択範囲の罫線を消去: ⌘ + option + -（マイナス）
- シート移動: option + ↔

## その他
- [【Macユーザー必見】これやっていないやつはwindowsにしろ](https://qiita.com/babasatoru21/items/2a0f587b29457a793441)
ストアドプロシージャ/ファンクションに配列を渡す

## はじめに

* 固定の数ではないパラメータをプロシージャに渡そうとして試行錯誤しました。
* 実装方法等を纏めます。
* ストアドプロシージャで確認していますが、ストアドファンクションでも同じだと思います。

## 環境

* 環境は以下です。おそらくこんな環境では開発しないと思いますが参考程度に。本質は変わらないとは思います。(jdkのバージョンが違っても本質は同じではないかと思います)

|項目|バージョン|
|---|---|
|JDK|1.5|
|Oracle|11|

## やりたいこと

* Oracleインスタンスに定義された、ストアドプロシージャをjavaから呼ぶ。
* ストアドプロシージャに渡すパラメータとして、数値の配列を渡したい。

## 実装

### 各種定義

* テスト用の簡単なテーブルを用意します。定義は以下です。

```
create table ARRAY_TEST (
  id number,
  name varchar2(256)
);
```

* TYPE_TABLE_OF_NUMBERという型を作成します。定義は以下です。

```
create or replace TYPE "TYPE_TABLE_OF_NUMBER" AS TABLE OF NUMBER
```

## 実装

### プロシージャ
* プロシージャは以下のとおり。
* 変数名などはいい加減です。

```
create or replace procedure arrayTest(idsin  TYPE_TABLE_OF_NUMBER)
  as
  begin
    FOR i IN ids.first..ids.last LOOP
      insert into ARRAY_TEST (id,name) values (ids(i),'dummy');
    END LOOP;
    commit;
  end;
```

### java側

* java側のコードは以下。
* パッケージ宣言やimportなどは省略しています。
* 接続情報は伏せてあります。

```
private static void executeStoredProcedure() throws SQLException {
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver");
	} catch (ClassNotFoundException e1) {
		e1.printStackTrace();
	}
	final String URL = "jdbc:oracle:thin:@xx.xx.xx.xx:port:sid";
	final String USER = "user";
	final String PASS = "pass";
	String procedureSQL = "{call arrayTest(?)}";
	Connection conn = DriverManager.getConnection(URL,USER,PASS);
	try {
		CallableStatement cs = conn.prepareCall(procedureSQL);
		ArrayList ids = new ArrayList<Integer>();
		ids.add(1);
		ids.add(2);
		ids.add(3);
		ids.add(4);
		ArrayDescriptor arrayDescriptor= ArrayDescriptor.createDescriptor(
				"TYPE_TABLE_OF_NUMBER", conn);
		ARRAY arrayParameter = new ARRAY(arrayDescriptor, conn, ids.toArray()); 
		cs.setArray(1, arrayParameter);
		cs.execute();
	} catch (SQLException e) {
		e.printStackTrace();
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		System.out.println("処理が完了しました");
	}
}

```

## 補足


* 古いjdkだと、Class.forName("oracle.jdbc.driver.OracleDriver")を呼ばないと接続できないようです。
* createDescriptorであらかじめ定義された型の名称を渡しています。ここがパッケージ内に定義された型の場合はこの方法では動かないようです。
  * <スキーマ名>.<パッケージ名>.<型名>という指定をしても見つからないというエラーになる。
* 以下のサイトに解決方法があるようなのですが、このやり方はたしかによくないと思います。(試していない)
  * https://ja.ojit.com/so/java/3987932


## 参考にしたサイト

* javaからストアドプロシージャを呼び出す方法
  * https://living-sun.com/ja/java/461487-pass-array-of-objects-from-java-to-plsql-stored-procedure-java-oracle-stored-procedures-jdbc-plsql.html
  * https://java-reference.com/java_db_procedure.html
【MySQL】ユーザーに権限を設定する(GRANT文)

## ユーザに権限を設定(GRANT文)

### 基本の構文
```
GRANT {{権限1}},{{権限2}} ON {{レベル}} TO {{ユーザ名}};
```

**ユーザ名**・・権限を与えるユーザ

**権限**・・ALL、SELECT、INSERTなど与えたい権限

**レベル**・・DB、テーブルなど権限を与える範囲を指定

## すべての範囲
```
GRANT ALL ON *.* TO {{ユーザ名}};
GRANT SELECT, INSERT ON *.* TO {{ユーザ名}};
```

## 指定のDBのみ
```
GRANT ALL ON {{DB名}}.* TO {{ユーザ名}};
GRANT SELECT, INSERT ON {{DB名}}.* TO {{ユーザ名}};
```

## 指定のテーブルのみ
```
GRANT ALL ON {{DB名}}.{{テーブル名}} TO {{ユーザ名}};
GRANT SELECT, INSERT ON {{DB名}}.{{テーブル名}} TO {{ユーザ名}};
```

## 指定のカラムのみ
```
GRANT SELECT ({{カラム名}}), INSERT ({{カラム名}}, {{カラム名}}) ON {{DB名}}.{{テーブル名}} TO {{ユーザ名}};
```
Dockerfileで上階層ディレクトリ内のパスを指定する


## やり方
- Dockerfileの上の階層にあるDocker-Compos.yamlで指定する
- `context`で`.`を指定
- `dockerfile`で./xxx/Dockerfile のように指定する


```dockerfile

  web:
    build:
      context: ./
      dockerfile: ./material-ui/Dockerfile
```
Angular.jsでプロジェクトを作ってみた

## サクッとAngular.jsでプロジェクトを作るところまでやってみる

### 環境

```
C:\>node -v
v12.13.1

C:\>yarn -v
1.22.5
```

以前、Vue.jsのプロジェクト作る際に、
インストール方法に少し触れているので、
インストールしていない場合は、[そちら](https://qiita.com/orihara-private/items/f3db337cb752997ae1dc#yarn-nodejs%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を参照。

## angular-cliのインストール
angular.jsのプロジェクトを作るために、
angular-cliのインストールを始める。

コマンドプロンプトを開いて、任意のパスにて、以下コマンドを実行する。

```cmd
$ yarn global add @angular/cli
```

今回は、インストールしたら以下のversionだった。

```
C:\>ng --version

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/


Angular CLI: 11.1.2
Node: 12.13.1
OS: win32 x64

Angular:
...
Ivy Workspace:

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.1101.2 (cli-only)
@angular-devkit/core         11.1.2 (cli-only)
@angular-devkit/schematics   11.1.2 (cli-only)
@schematics/angular          11.1.2 (cli-only)
@schematics/update           0.1101.2 (cli-only)
```

## プロジェクト作成
では実際にプロジェクトを作ってみる。

```cmd
$ ng new example-project
```
`new`の後にプロジェクト名を入れればいいらしい。  
今回は `example-project` という名前で作ってみる。

コマンドを実行すると、プロジェクトの設定をすることになるので、
各々好きな設定をする。

今回は、特にこれといった条件は無いので、
以下のように設定していった。

```
? Do you want to enforce stricter type checking and stricter bundle budgets in the workspace?
  This setting helps improve maintainability and catch bugs ahead of time.
  For more information, see https://angular.io/strict Yes
? Would you like to add Angular routing? Yes
? Which stylesheet format would you like to use? Sass   [ https://sass-lang.com/documentation/syntax#the-indented-syntax
 ]
```

以下のように、作られたプロジェクトのパスにて、
`ng serve`を実行。
したら、 ↓ のように進んでいった。

```
Compiling @angular/common : es2015 as esm2015
Initial Chunk Files   | Names         |      Sizesm2015
vendor.js             | vendor        |   2.68 MB
polyfills.js          | polyfills     | 472.80 kB015 as esm2015
styles.css, styles.js | styles        | 346.00 kB
main.js               | main          |  58.43 kB
runtime.js            | runtime       |   6.15 kB

                      | Initial Total |   3.54 MB

Build at: 2021-02-04T06:58:18.200Z - Hash: 8e7b978867d776fa90b0 - Time: 85761ms

** Angular Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ **


√ Compiled successfully.
√ Browser application bundle generation complete.

Initial Chunk Files   | Names  |      Size
styles.css, styles.js | styles | 346.00 kB

4 unchanged chunks

Build at: 2021-02-04T06:58:29.735Z - Hash: 6280dc2bb857617c036a - Time: 10615ms

√ Compiled successfully.
```

http://localhost:4200/ にアクセスしてくれって書いてあるので、
アクセスしてみる。

↓ アクセスしてみると、以下のような画面が出てきた。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479995/e4f94671-72bd-c226-d1b7-b224d3c64def.png)

今回の目標は、プロジェクトを作ってみるところまでなので、
とりあえずここまででいったん終了。

実際に使ってみた場合は、
また新しく投稿します。

以上。
cy.[command name] is not a function


## 事象
Cypress.Commands.addを使ってもcy.foo() が実行エラーになる。

## 原因
cypress.json にsupportFileのパスが通っていないときに出るエラー


https://docs.cypress.io/guides/references/configuration.html#:~:text=supportFile

```json
{
  "supportFile": "cypress/support/commands.ts"
}
```
Golangでひらがな、カタカナ、漢字を判定する

Golangで漢字を判定する必要があったので正規表現を使ってUnicodeの範囲を指定するみたいな事しないといけないのかなと思って調べていたんですが、[built inのunicode package](https://golang.org/pkg/unicode)に[Unicodeの範囲を示すRangeTable](https://github.com/golang/go/blob/master/src/unicode/tables.go#L3604)が既に用意されていたのでした。

というわけでunicode packageを利用してこんな感じで実装出来ます。

# ひらがなを判定する
```go
import (
	"unicode"
)

func IsHiragana(r rune) bool {
	return unicode.In(r, unicode.Hiragana)
}
```

# カタカナを判定する
```go
import (
	"unicode"
)

func IsKatakana(r rune) bool {
	return unicode.In(r, unicode.Katakana)
}
```

# 漢字を判定する
```go
import (
	"unicode"
)

func IsKanji(r rune) bool {
	return unicode.In(r, unicode.Han)
}
```

[UniHan](https://en.wikipedia.org/wiki/Han_unification)は日本漢字の他に繁体字、簡体字、韓国漢字、ベトナム漢字が含まれます。
厳密に日本の漢字のみを判定したいならRangeTableを独自に定義してUnicodeの範囲を指定してあげる必要がありそうです。

# 動作確認

```go
package main

import (
	"fmt"
	"unicode"
)

func main() {
	for _, s := range []string{"あ", "ア", "ｱ", "漢"} {
		rs := []rune(s)
		fmt.Printf("[%s]", s)
		fmt.Printf(" IsHiragana=%v", IsHiragana(rs[0]))
		fmt.Printf(" IsKatakana=%v", IsKatakana(rs[0]))
		fmt.Printf(" IsKanji=%v", IsKanji(rs[0]))
		fmt.Println()
	}
}

func IsHiragana(r rune) bool {
	return unicode.In(r, unicode.Hiragana)
}

func IsKatakana(r rune) bool {
	return unicode.In(r, unicode.Katakana)
}

func IsKanji(r rune) bool {
	return unicode.In(r, unicode.Han)
}
```

```
[あ] IsHiragana=true IsKatakana=false IsKanji=false
[ア] IsHiragana=false IsKatakana=true IsKanji=false
[ｱ] IsHiragana=false IsKatakana=true IsKanji=false
[漢] IsHiragana=false IsKatakana=false IsKanji=true
```

半角カナもちゃんと判定されてますね。良さそうです。
[備忘録] Enum DayOfWeek.ToString(string format)

「結局そのFormatStringで何が出るんじゃい」っていう一覧がどこにもなかったので備忘録
VS2019なのでC#8.x系だと思います。

``` csharp
var formats = new string[] { string.Empty, "G", "X", "F", "D" };

foreach (var f in formats) 
{
    Console.WriteLine($"FormatString = {f}");
    Console.WriteLine($"Monday = {DayOfWeek.Monday.ToString(f)}");
    Console.WriteLine($"Tuesday = {DayOfWeek.Tuesday.ToString(f)}");
    Console.WriteLine($"Wednesday = {DayOfWeek.Wednesday.ToString(f)}");
    Console.WriteLine($"Thursday = {DayOfWeek.Thursday.ToString(f)}");
    Console.WriteLine($"Friday = {DayOfWeek.Friday.ToString(f)}");
    Console.WriteLine($"Saturday = {DayOfWeek.Saturday.ToString(f)}");
    Console.WriteLine($"Sunday = {DayOfWeek.Sunday.ToString(f)}");
    Console.WriteLine();
}
```

```
FormatString =
Monday = Monday
Tuesday = Tuesday
Wednesday = Wednesday
Thursday = Thursday
Friday = Friday
Saturday = Saturday
Sunday = Sunday

FormatString = G
Monday = Monday
Tuesday = Tuesday
Wednesday = Wednesday
Thursday = Thursday
Friday = Friday
Saturday = Saturday
Sunday = Sunday

FormatString = X
Monday = 00000001
Tuesday = 00000002
Wednesday = 00000003
Thursday = 00000004
Friday = 00000005
Saturday = 00000006
Sunday = 00000000

FormatString = F
Monday = Monday
Tuesday = Tuesday
Wednesday = Wednesday
Thursday = Thursday
Friday = Friday
Saturday = Saturday
Sunday = Sunday

FormatString = D
Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
Sunday = 0
```

Enum.ToString()はこういうことらしい

列挙型形式文字列
https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/enumeration-format-strings

何も指定しないと`G`と同値になる。
`G`と`F`の違いが分からないが、EnumにFlags属性があると何か変わるらしい。
(公式の例示が微妙で分からないが、少なくともDayOfWeekには関係が無さそう)

`D`はint、`X`はbyte。

---
「何曜日」が欲しければ、`DateTime.ToString(String)`を指定するか、`CultureInfo.DateTimeFormat.GetDayName(DayOfWeek)`を使えばよさそう。
日付から取得するときは前者、一覧が欲しければ後者がいいと思う。凝らないなら素直に手打ちする。

``` csharp
var ci = new CultureInfo("ja-JP");
Console.WriteLine($"CultureInfoName = {ci.Name}");
Console.WriteLine($"{DateTime.Now.ToString("yyyy/MM/dd ddd dddd")}");
Console.WriteLine($"Monday = {ci.DateTimeFormat.GetDayName(DayOfWeek.Monday)}");
Console.WriteLine($"Tuesday = {ci.DateTimeFormat.GetDayName(DayOfWeek.Tuesday)}");
Console.WriteLine($"Wednesday = {ci.DateTimeFormat.GetDayName(DayOfWeek.Wednesday)}");
Console.WriteLine($"Thursday = {ci.DateTimeFormat.GetDayName(DayOfWeek.Thursday)}");
Console.WriteLine($"Friday = {ci.DateTimeFormat.GetDayName(DayOfWeek.Friday)}");
Console.WriteLine($"Saturday = {ci.DateTimeFormat.GetDayName(DayOfWeek.Saturday)}");
Console.WriteLine($"Sunday = {ci.DateTimeFormat.GetDayName(DayOfWeek.Sunday)}");
```

```
CultureInfoName = ja-JP
2021/02/04 木 木曜日
Monday = 月曜日
Tuesday = 火曜日
Wednesday = 水曜日
Thursday = 木曜日
Friday = 金曜日
Saturday = 土曜日
Sunday = 日曜日
```
FlutterとFirebaseでログイン画面を実装する

# はじめに
多くのスマホアプリには、ユーザーを識別する機能があります。
専用アカウントを作成してサインアップするものや、 Google や Facebook などの既存のサービスのアカウントを使ってログインするものなどがあります。

以前、[Flutter アプリに Firebase を追加する](https://qiita.com/nekoharuyuki/items/88ad77d8025ada858404) で、Flutterで作成したプロジェクトにFirebaseを追加する方法をまとめました。スマホアプリの「ログイン認証機能」は、Firebase の [Firebase Authentication](https://firebase.google.com/docs/auth?hl=ja) を使用すると簡単に実装することが出来ます。
![maxresdefault.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/3bea0b9b-991f-88da-b25d-1b4c0c9ce24a.jpeg)
今回は、FlutterとFirebaseでログイン画面を実装する方法を備忘録としてまとめました。

# 事前準備

- [Flutter によるスマホアプリ開発](https://qiita.com/nekoharuyuki/items/512cc6b10ee2744e799d) を確認
  - Flutterの開発環境構築とプロジェクトを作成
- Google アカウントを使って [Firebase](https://console.firebase.google.com/) にログイン
  - Firebase プロジェクトを作成
  - [Firebase プロジェクトについて理解する](https://firebase.google.com/docs/projects/learn-more?hl=ja) を確認
- [Flutter アプリに Firebase を追加する](https://qiita.com/nekoharuyuki/items/88ad77d8025ada858404) を確認

実装には以下のサイトを参考にしました。

**参考サイト**
https://bloclibrary.dev/#/flutterfirebaselogintutorial

**参考コード**
https://github.com/nekoharuyuki/flutter_test/tree/master/flutter_firebase_login

**完成イメージ**
<img width="167" alt="スクリーンショット 2020-05-06 22.22.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/efbb2d58-7571-0a80-77eb-5be27030e850.png">

# 実装

pubspec.yamlにパッケージを追加します。

```pubspec.yaml
environment:
  sdk: ">=2.6.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  bloc: ^6.1.0
  equatable: ^1.2.3
  flutter_bloc: ^6.1.0
  font_awesome_flutter: ^8.4.0
  formz: ^0.3.0
  google_fonts: ^1.1.0
  meta: ^1.1.8
  pedantic: ^1.9.0
  authentication_repository:
    path: packages/authentication_repository

dev_dependencies:
  flutter_test:
    sdk: flutter
  bloc_test: ^7.1.0
  mockito: ^4.0.0

flutter:
  uses-material-design: true
  assets:
    - assets/
```

プロジェクトのルートにassetsディレクトリを作成

```
flutter packages get
```

## Firebaseのセットアップ
アプリケーションをfirebaseに接続し、google_signinを有効にするには、firebase_authの使用手順に従う必要があります。

Androidのgoogle-services.jsonとiOSのGoogleService-Info.plistを更新することを忘れないでください。アプリケーションがクラッシュします。

# まとめ
今回は、FlutterとFirebaseでログイン画面を実装する方法を備忘録としてまとめました。
Firebaseを使用する事で、アカウントを使ってログインする実装が簡単に出来ました。
djangoを使って新しくTODOアプリを作る4

###<a href="https://www.udemy.com/course/django-3app/">【徹底的に解説！】Djangoの基礎をマスターして、3つのアプリを作ろう！（Django2版 / 3版を同時公開中です）</a>を受けさせていただいております。
前回：djangoを使って新しくTODOアプリを作る3
https://qiita.com/inazawaKeisuke/items/68411d7028cb57548da1

とっくにUdemy応援キャンペーンは終わってしまいましたが、せっかく始めたので完成まで頑張っていこうと思います。

今回は,サインインのページの完成、listの完成を目指していきたいと思います。

今回の目標
1.サインインページの作成
2.サインインの機能の実装
3.listのページの作成
4.modelのサンプル作成

##サインインの機能実装とlogin.html
サインインの機能は公式ドキュメントのコードを利用しましょう。
https://docs.djangoproject.com/ja/3.1/topics/auth/default/

```
from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        # Redirect to a success page.
        render(request,"list.html",{})
    else:
        # Return an 'invalid login' error message.
        render(request,"ligin.html",{"error","ログインに失敗しました"})
```
上のコードはほとんど公式ドキュメントを写しています。
redirect かrenderを使うのかは、好みというか、移動先のurlにそのurlのまま移動するのかどうかを選べるので、選んで使ってください。

htmlについては前回作ったhtmlファイルがそのまま引用できるので全コピペし、タイトルなどをLOGIN関係にします。

ログインページは以上で完成です。

##listページ作成
テンプレート内にmodelを表示させるのってどうやるんだっけとど忘れしてしまったので検索に頼った結果、このような記事を見つけましたので個々のコードを使わせてもらうことに。
python,djangoでのデータのhtmlへの表示方法。（関数編&汎用ビュー編）
https://qiita.com/sr2460/items/8526f797256822f47648
DjangoでModelからTemplatesにデータを渡す方法と考え方
https://hiropon-progra.com/?p=113

```python:views.py
from .model import モデル名

def 関数名(request)
    context = {
        'test_list': モデル名.objects.all(),
    }
    return render(request, 'アプリケーション名':html名.html', context)

```
今回はこのような感じにしました。

```python:views.py

def listfunc(request):
    todoModels = {'todo': todoModel.objects.all()}

    return render(request,'list.html',todoModels)

```
このリストを表示するために、listページにもコードを書いてあげなければなりません。
いつも通りの{% extends "base.html" %}など書いてあげて、

```html:list.html
    <main class="flex-shrink-0">
        <div class="container">
            {% for test in todo %}
            <h1>{{ test.title }}</h1>
            {{ test.content }}
            {{ test.author }}
            {{ test.dateline }}
            {{ test.now_date }}
            {{ test.priority }}
            {% endfor %}
        </div>
    </main>

```
を中身に入れてあげると、modelの表示ができました。
どんな表示の方法（CSS等)にするかは後で考えることにし、とりあえずこのような感じで表示することができました。
![スクリーンショット 2021-02-04 15.29.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764631/c19f3740-b1cc-a632-b0a6-bce50e27b597.png)

## modelのサンプル作成方法

前回の記事で実装した、modelのサンプル作成方法をど忘れして困っていましたが、adminの管理画面からmodelのdbをいじる方法があったようです。
方法はadmin.pyに追記するもので、

```python:admin.py
from django.contrib import admin
from .models import todoModel
# Register your models here.

admin.site.register(todoModel)
```

とすれば良いようです。
このような画面が出るようになります。
![スクリーンショット 2021-02-04 15.43.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764631/3d294c05-f3fd-a685-bb77-c8c2ed043d05.png)
![スクリーンショット 2021-02-04 15.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764631/bff3a7eb-ce1e-d2ba-3b95-dc5ec53e74a6.png)


次の記事では
listページのデザイン決め、detailページの作成を行いたいと思います。
PyInstallerで作ったファイルが止まる

## 原因
1. コンソールが出ている
2. 黒い部分をクリック（止まる。タイトルの先頭に「選択」が加わる）
3. キーボード入力（再開）


## 対策
フールプルーフ設計です。

`pyinstaller`を利用してexe化する際、オプションに`--noconsole`または`-W`を付けて、コンソールを出さないようにしましょう。

どうしても画面にログ出力が欲しい場合は、PyQt5とかTkinterを利用するとか。

あとは単にログファイル出力って言うてもありますね。

手動で止めるときにタスクマネージャとかを利用しないといけないのが面倒です。もしくは自動終了とか？

## 実験
以下のコードをコンソールありでexe化していじってみるとわかると思います。

```python:na_beats_u.py
import time

# 数字をひらがなにするための辞書
number_dict = {'0':'','1':'いぃち','2':'にぃ','3':'さぁん','4':'よぉん',
                '5':'ごぉ','6':'ろぉく','7':'なぁな','8':'はぁち','9':'きゅ～'}
digit_dict = {1:'', 2:'じゅ～', 3:'ひゃぁく', 4:'せん', 5:'まぁん', 6:'じゅうまぁん', 7:'ひゃくまぁん'}


def aho(msg: str) -> str:
    '''数字（文字列型）をアホにする'''
    result = ''
    length = len(msg)
    for i in range(length):
        if msg[i] != '1' or i == length-1:
            result += number_dict[msg[i]]
        result += digit_dict[length - i]
    result += '！'
    return result
        

if __name__ == '__main__':
    print('「3の倍数と3が付く数字のときだけアホになります！」')

    i = 1
    while True:
        time.sleep(1)
        # 数字に3が入っている、または3の倍数の時にアホになる
        msg = str(i)
        if(i % 3 == 0):
            print(aho(msg))
        elif '3' in msg:
            print(aho(msg))
        else:
            print(msg)
        i += 1
```
AutoHotkeyでChromeのブックマーク情報をぶっこ抜く

#😺はじめに

皆さんは**ブラウザのブックマークをよく使いますか？**
バリバリ活用してる人なんかだと、ブックマーク数が1000を超えて、フォルダ分けやタイトル付けに凝る人もいると思います。
そうやって**ブックマークが充実すればするほど、その情報をブラウザ外からも活用したくなりますよね？？(圧)**

もちろんエクスポートして活用する道もありますが、**ブックマークマネージャで選択中のブックマークから情報を取得したい**こともあります。

ここでは、ブックマークのタイトルが色んな形式で書かれているものとし、そこから情報を抜き出す単純なタスクをAutoHotkeyで実装してみましょう。これが出来ればコマンドライン引数に用いるなどして、色んなことができますね。


#🐺ブックマークマネージャを表示しているかの検知

「ブックマーク - Google Chrome」というウィンドウ名を検知したいというので、まずこう書いてみます。

```autohotkey:sample1.ahk
#If WinActive("ブックマーク - Google Chrome ahk_exe chrome.exe")
;any code here
#If
```

しかし、これではマッチ形式が明示的に指定されていないので、例えば「はてなブックマーク - Google Chrome」を開いたウィンドウにもヒットしてしまう場合があります。そこでこうします。

```autohotkey:mylib1.ahk
Set_TitleMatchMode(x){
    SetTitleMatchMode, %x%
    return 1
}
```

```autohotkey:sample2.ahk
#Include <mylib1>

#If Set_TitleMatchMode(3) and WinActive("ブックマーク - Google Chrome ahk_exe chrome.exe")
;any code here
#If
```


#🐘ypで商品名をコピー、ymでメーカー名をコピー、みたいな処理

例えばあるフォルダ下では色んな商品の記事をブクマしている。その中のあるブクマを選択した状態で「yp」と入力すると商品名をコピーし、「ym」と入力するとメーカー名をコピーできる、というような処理を実装しましょう。

タイトルは次の形式とします。

```
{商品名}◆{メーカー名}
```

コードはこうなります。

```autohotkey:sample3.ahk
y::
Input, c, L1 T2, {Enter},p,m
if(ErrorLevel = "Match"){
    if c in p,m
    {
        n := ({"p": 1, "m": 2})[c]
        SendInput, {AppsKey}
        Sleep, 10
        SendInput, {Down}{Enter}
        clipboard :=
        SendInput, ^c
        clipwait, 1
        If(ErrorLevel){
            MsgBox, failed to copy
        }else{
            SendInput, {Enter}
            RegExMatch(clipboard, "O)^(.+)◆(.+)$", mat)
            clipboard :=
            clipboard := mat[n]
            clipwait, 1
        }
    }
}
return
```

#🐾さいごに

この要領でタイトルやURLを解析して色んなコピーが可能ですね。ここではL1をInputに指定しているので1文字だけの入力を待機していますが、L2にして1文字目でブックマークの種別を指定して2文字目でコピー対象の種別を指定するといった処理も可能です。
ポップアップウィンドウを閉じたときに親ウィンドウの関数を呼ぶ (IE,Edge両対応)

## Edgeの場合

* onbeforeunload 

もしくは

* onunload 

```js
function popup(url) {
	if (! window.showModalDialog) {
		// IE以外 (Edgeなど)
		modalWin = window.open(url);
	} else {
		// IE
		modalWin = window.showModalDialog(url);
	}
	return modalWin;
}

//-----------------

var url = "https://qiita.com";
if (modalWin = popup(url)) {
	if (! window.showModalDialog) {
		// IE以外 (Edgeなど)
		modalWin.onunload = function () {
			alert("onunload");
		}
		modalWin.onbeforeunload = function () {
			alert("onbeforeunload");
		}
	} else {
		// IE
		alert("IE");
	}
}
```

```javascript:addEventListenerの例
function unloaded() {
	location.reload();
}

var modalWin = window.open(url);                 
if (! window.showModalDialog) {
	// IE以外
	modalWin.addEventListener('beforeunload', unloaded, false);
} else {
	// IE
}
```

## showModalDialog の代替

`window.showModalDialog` がない場合は以下を用いるとよいかも。

* http://niutech.github.io/showModalDialog/showModalDialog.js
[memo]ヘッダーのレイアウト固定

##ヘッダーのレイアウトと固定について

```html:html
<header>
      <div class="container">
        <div class="header-left">
          <img class="logo" src="###">
        </div>
        <div class="header-right">
          <a href="#" class="login">ログイン</a>
        </div>
      </div>
    </header>
```

###ヘッダーの固定
画面上に要素を固定する場合、`position: fixed;`を使います。
位置は、top、left、right、bottomを使って指定します。

```css:css
header {
  height: 65px;
  width: 100%;
  background-color: rgba(34, 49, 52, 0.9);
  position: fixed;
  top:0;
}
```

###要素の重なりを解消
`position`を使用すると要素の重なりが生じるため、優先順位を指定してあげます。
`z-index`プロパティを使って、要素の重なりの順序を指定します。
z-indexは整数値で指定し、値が大きいほど上に表示されます。
※z-indexプロパティは必ずpositionプロパティと併用する必要がある。

```css:css
header {
  height: 65px;
  width: 100%;
  background-color: rgba(34, 49, 52, 0.9);
  position: fixed;
  top:0;
  z-index: 10;
}
```
node_modulesをvolume マウントすることで、docker-composeでyarn add が遅い問題を解決する

# はじめに
Docker環境下でNuxt開発をしている際に、docker-composeでyarnを用いてパッケージをインストールすると、とてもノロノロになってしまっていたので、それを解決しました。
# 原因
node_modulesをバインドマウントしていたから。ホストとdockerコンテナ内で相互に連携しないといけないので、時間がかかっていた。
# 解決策
node_modulesだけバインドマウントから外して、volumeマウントにする。通常のバインドマウントの後にnode_modulesだけvolumeマウントにすることで、node_modulesをバインドマウントから外せる。

例↓

```yml:docker-compose.yml
# (略）
  front:
    build:
      context: ./front
  
    environment:
      NODE_ENV: "development"
    command: yarn run dev
    volumes:
      - ./front:/app # ホストとdocker内部でプロジェクトのソースコードを共有するためにバインドマウント
      - node_modules_volume:/app/node_modules # node_modulesはホストと共有しないでvolumeマウント
    ports:
      - 8080:8080

volumes:
  node_modules_volume:
```
# 最後に
node_modulesに限らず、railsのgemの管理にも応用できました(docker環境下でのbundle installの高速化)
# 参考
https://tkkm.tokyo/post-495/
スプラッシュ画面の実装方法

今回はFlutterでアプリを起動したときに表示されるSplash画面(Splash Screen)の、実装方法の解説になります。

# 画像の準備
スプラッシュ画面で表示するための画像を準備しましょう。

今回は下のようなPNG画像を準備しました。
この画像を使いSplash画面を実装していきます。
<img width="400" alt="スクリーンショット 猫画像png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607760/3301b0a2-8580-ce89-69fb-a5cbd9c1132f.png">
準備できたら使用するプロジェクトの中に適当なディレクトリを作成し、その中に入れておきましょう。
例としてこの記事ではassets/imagesの中に画像を保存します。


# パッケージの導入

次にパッケージの導入をしていきましょう。
今回の画面作成には[flutter_native_splash](https://pub.dev/packages/flutter_native_splash)というパッケージを使用します。
このパッケージを使用し作成するとiOS、Android両方でスプラッシュ画面が実装可能です。

パッケージの導入方法に関しては[こちら](https://qiita.com/Mono999/items/51c18cd30507fa208a41)に解説記事がありますので、よろしければ参考にしてください。

# スプラッシュ画面の作成
パッケージの導入が完了したらスプラッシュ画面の作成をしていきます。
pubspec.yamlに以下のような文を加えます。

```dart

flutter_native_splash:
  image: "assets/images/firstcat.png"
  color: "b5ce7f"
```

私は下の画像のように配置しました。
<img width="500" alt="スクリーンショット ソースコード" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607760/8a4e54ea-b7f0-de72-756d-6daad9627f3e.png">
imageは画像のパス、colorは16進数のカラーコードになります。
値やパスは自分のプロジェクトに合わせて、それぞれ変更してください。

その後、下記コマンドを作成プロジェクト内で順に実行します。
`flutter pub get`
`flutter pub run flutter_native_splash:create`
<br>
<br>
無事実装されました。
<img width="400" alt="スクリーンショット スプラッシュ画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607760/e1a47128-1610-599d-71f7-d4a0df2f23e7.png">

お疲れ様でした。
ここまでご覧戴き、ありがとうございました。

<br>
<br>
## iOSでスプラッシュ画面の不具合
iOSでスプラッシュ画面が更新されない、スプラッシュ画面が表示される前に白い画面が表示される、といったことが起こる場合があるようです。

その場合は`flutter clean`を実行。
その後再度
`flutter pub get`
`flutter pub run flutter_native_splash:create`
を実行してみてください。

またそれでも解決しない場合は[スタックオーバーフロースレッド](https://stackoverflow.com/questions/33002829/ios-keeping-old-launch-screen-and-app-icon-after-update)を確認してみると良いようです。
Microsoft Graphの認証時にエラーが返された「400 Bad Request」

# 結論

サポートされているアカウントの種類を`個人用Microsoftアカウントのみ`から`任意の組織ディレクトリ内のアカウントと個人のMicrosoftアカウント`に変更したら認証が通りました。

## エラー内容

[こちら](https://blog.hrendoh.com/oauth-to-microsoft-graph-with-laravel-socialite/)の記事をLaravelでMicrosoftアカウントを使用した[SSO](https://www.kagoya.jp/howto/network/single-sign-on/)を実装しました。

下記のコードでリクエストを送り、

```app/Http/Controllers/LoginController.php
class LoginController extends Controller
{
    public function redirectToMicrosoft()
    {
        return Socialite::driver('graph')->redirect(); 
    }
}
```

`400 Bad Request`エラーが返ってきました。デバックして詳しくエラーを見てみます。

```app/Http/Controllers/LoginController.php
class LoginController extends Controller
{
    public function redirectToMicrosoft()
    {
        return Socialite::driver('graph')->redirect(); 
    }

    public function handleMicrosoftCallback(Request $request)
    {
        dd($request);
        $user = Socialite::driver('graph')->user();
    }
}
```
詳しいエラー↓


```
"error" => "invalid_request"
"error_description" => "The request is not valid for the application's 'userAudience' configuration. In order to use /common/ endpoint, the application must not be configured with 'Consumer' as the user audience. The userAudience should be configured with 'All' to use /common/ endpoint."
```

翻訳してみると`commonエンドポイントを使用するには、userAudienceを「All」で構成する必要があります`とのこと。

## 解消方法

[Azure Active Directory 管理センター](https://aad.portal.azure.com/)を開き、アプリを再登録しました。その際にサポートされているアカウントの種類を`個人用Microsoftアカウントのみ`から`任意の組織ディレクトリ内のアカウントと個人のMicrosoftアカウント`に変更しました。

![スクリーンショット 2021-02-04 14.46.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264073/ea51a68c-78eb-119f-3721-f6533037a03f.png)


サポートされているアカウントの種類を変更したことで認証が通りました。
Gitlabで複数行に対して修正提案（サジェスチョン）をする

## 概要
オンプレ版のGitlabを普段の開発では使用しているが、複数行サジェスチョンのやり方がパッわからなかったので、メモしておく

## 答え
普通の１行サジェスチョンを出して
![スクリーンショット 2021-02-04 14.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152020/61c449e7-a722-244c-5072-f1ca1ac0fa1f.png)

suggestion:-0+0 となってるとこの数字を変えるだけでした！
![スクリーンショット 2021-02-04 14.46.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152020/3d3c63bd-d35b-7398-f0c9-c1b5e9357352.png)

上の例だと4行前からの修正提案ができます。
dockerメモ


#### bindingpy使う

```
docker attach {IMG_ID} #マウントする

biding.py #デバッグしたい箇所につける
```

#### docker rm works

```
docker ps -a
docker rm -vf $(docker ps -a -q)
docker rmi -f $(docker images -a -q)
docker volume ls
docker-compose down --volumes
docker volume ls
docker volumne rm some_volume_cache
docker rm some_volume_cache
docker volume rm $(docker volume ls -qf dangling=true)
docker volume ls
docker volume ls -qf dangling=true | xargs -r docker volume rm

docker network prune
```
PythonでLINEの新卒コーディングテストの問題を解いてみたメモ

コーディングテストのアルゴリズム問題
https://engineering.linecorp.com/ja/blog/algorithm-description-for-coding-tests/
この記事はpython2系で書かれているらしいのでpython3系で書き直してみて自分が理解できるようにまとめてみました。
今までエラー処理を全然書いてこなかったので、今回は書いてみました。うまくいっている自信がないのですが…


# 問題
> N番目の素数を探せ
>>1から昇順で数えたときに、N番目にあたる素数を出力するコマンドラインツールを作成してください。
>>入力：出力したい素数の番号　N
>>出力：N番目の素数

>入力例１：5
>出力例１：11

# 考え方
素数を求めるのでエラトステネスの篩を用いる。
まず、一番小さな素数である2をdata配列に入れる。
そして、data配列に見つけた素数をどんどん入れていき、N個の素数を見つけたらwhileループから脱出し、その時の最後の素数を出力するようにする。
素数を見つける際に、それまでに見つけた素数が入ったdata配列を用いる。


# 解答例1
```python:sieve_of_eratosthenes.py

n = int(input())

def get_prime_by_sieve_of_eratosthenes(n):
    if not isinstance(n, int):
        raise TypeError("n is int-type.")
    if n < 1:
        raise ValueError("n is more than 1.")
    data = [2]
    num = data[0]
    while len(data) < n:
        isPrime = True
        num += 1
        for d in data:
            if num % d == 0:
                isPrime = False
                break
        if isPrime:# numが素数ならば
            data.append(num)
    return data[n-1]

def main():
    print(get_prime_by_sieve_of_eratosthenes(n))
    
if __name__ == "__main__":
    main()
```

これでも正しく動作するが、素数かどうかを判定する処理であるisPrimeを独立させ、関数化するとすっきりとさせることができそう。
また、リスト内包表記でもうまくいくかも？そっちの方がきれいかな？

# 解答例2
解答例1のisPrimeフラッグを関数化してみた。

```python:sieve_of_etatoshtenes2.py
n = int(input())

def is_prime(num,data):
    for d in data:
        if num % d == 0:
            return False
    return True

def get_prime_by_sieve_of_eratosthenes(n):
    if not isinstance(n, int):
        raise TypeError("n is int-type.")
    if n < 1:
        raise ValueError("n is more than 1.")
    data = [2]
    num = data[0]
    while len(data) < n:
        num += 1
        if is_prime(num,data):
            data.append(num)
    return data[n-1]

def main():
    print(get_prime_by_sieve_of_eratosthenes(n))
    
if __name__ == "__main__":
    main()
```

for文の多重ループを抜け出す際にはそれらをまとめて関数化するとすっきりとすることが分かった。

# 参考
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)

[Pythonで作るエラトステネスのふるい]
(https://qiita.com/fantm21/items/5e270dce9f4f1d963c1e)

# 感想
久しぶり過ぎでQiitaの使い方から見直した。そして問題が解けてうまくいったときはやっぱり楽しいものだと思った。
Rの基本とPython

# はじめに
平均や分散などのRの基礎の基礎をPythonでも書き換えていく。

#Rの基礎（平均等々）

```R:コード
data <- c(10,13,8,15,8) #データ

sum(data) #合計
length(data) #データ数
mean(data) #平均
median(data) #中央値
var(data) #不偏分散
sd(data) #標準偏差
```

```:出力
[1] 54
[1] 5
[1] 10.8
[1] 10
[1] 9.7
[1] 3.114482
```

#Pythonへ

標準のモジュールを使うと以下の様になる。

```python:コード
from statistics import mean, median,variance,stdev

data = [10,13,8,15,8] #データ

print(sum(data)) #合計
print(len(data)) #データ数
print(mean(data)) #平均
print(median(data)) #中央値
print(variance(data)) #不偏分散
print(stdev(data)) #標準偏差
```

```:出力
54
5
10.8
10
9.7
3.1144823004794873
```

これをリストではなく`numpy.array`で書き直すと以下の様になる。numpy では分散を求める関数がデフォルトでは標本分散になっているので、不偏分散にするためには`ddof=1`の引数が必要になる。

```python:コード
import numpy as np

data = np.array([10,13,8,15,8]) #データ

print(np.sum(data)) #合計
print(data.shape[0]) #データ数
print(np.mean(data)) #平均
print(np.median(data)) #中央値
print(np.var(data, ddof=1)) #不偏分散
print(np.std(data, ddof=1)) #標準偏差
```

```:出力
54
5
10.8
10.0
9.700000000000001
3.1144823004794877
```

numpy で計算すると15桁くらいでずれてしまう。丸め誤差の影響か...。

何桁まで扱うかは注意が必要。
sln ファイルのヘッダーと Visual Studio のバージョン対応

# 概要

sln ファイルは、開いてほしい Visual Studio を知っているようです。

![2021-11-26_18h53_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/dcfed8bd-43c7-ecc3-36ec-e12139af06aa.png)

`.sln` ファイルの関連付けを `Microsoft Visual Studio Version Selector` にしておくと、その開きたいという願いが叶う模様です。

![2021-11-26_18h53_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/4f736cdc-b230-25e7-02e0-25de8a88ab06.png)

空のソリューションファイルは、つぎのような内容になっています。最初に空行があるのは UTF-8-BOM の BOM を置くためのものでしょう。

```sln

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31912.275
MinimumVisualStudioVersion = 10.0.40219.1
Global
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {94407CBC-3233-4638-AA24-0AC5BFD7F118}
	EndGlobalSection
EndGlobal
```

csproj ファイルに見られるような XML 形式という訳でもありません。
恐らく Visual InterDev など旧世代の製品で採用していたファイル形式を引き継いでこうなっている、という歴史的な事情によるものと思われます。

この行の中身で判別するようです。

```
# Visual Studio Version 17
```

という事は、この値を手修正すると、開きたい Visual Studio を変更できます。

参考値を並べておきますので、この値を変更しようという方は参考にしてください。

## Visual Studio 2022

### Pro

```
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31912.275
MinimumVisualStudioVersion = 10.0.40219.1
```

## Visual Studio 2019

### Pro

```
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31911.196
MinimumVisualStudioVersion = 10.0.40219.1
```

## Visual Studio 2017

### Pro

```
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27703.2026
MinimumVisualStudioVersion = 10.0.40219.1
```

### Desktop

```
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Express 15 for Windows Desktop
VisualStudioVersion = 15.0.27703.2047
MinimumVisualStudioVersion = 10.0.40219.1
```

## Visual Studio 2015

### Pro

```
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Express 14 for Windows Desktop
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
```

### Web

```
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Express 14 for Web
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
```

### Desktop

```
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Express 14 for Windows Desktop
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
```

## Visual Studio 2013

### Pro

```
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1
```
[memo]ボタンやリンクの装飾ついて

##ボタンに変化をつける

ボタンは\<a>タグで指定します。
しかし\<a>タグはインライン要素であり、インライン要素にはwidthやheightが指定できないなど不便な点があります。指定できるようにするためには、`displayプロパティ`を使います。

<b>▼displayプロパティ</b>
displayプロパティは、要素の種類(ブロックレベル要素、インライン要素)を変更することができるプロパティです。値には、変更したい要素の種類を設定します。

<b>▼値との組み合わせ</b>
display: block;　指定された要素は、ブロックレベル要素として表示されます
display: inline;　指定された要素は、インライン要素として表示されます
display: inline-block;　指定された要素は、並びはインライン要素だが、中身はブロックレベル要素として表示されます
display: flex;　指定された要素の子要素が横並びになる
display: none;　指定された要素は、非表示になる

<b>▼各要素のできること</b>
width,heightが指定できる:[ブロック要素][インラインブロック要素]
margin,paddingが指定できる：[ブロック要素][インラインブロック要素]
margin,paddingの`左右のみ`指定できる：[インライン要素]

<b>▼各要素の配置</b>
[ブロック要素]縦並び
[インラインブロック要素]横並び
[インライン要素]横並び

```html:html
<div class="top-wrapper">
    <div class="container">
      <h1>旅行に行こう。</h1>
      <p>旅行予約サイトです</p>
      <a href="#" class="btn signup">新規登録はこちら</a>
      <p>or</p>
      <a href="#" class="btn facebook"><span class="fa fa-facebook"></span>Facebookで登録</a>
      <a href="#" class="btn twitter"><span class="fa fa-twitter"></span>Twitterで登録</a>
    </div>
  </div>
```

####複数クラスの指定
「共通の部分があるが、それぞれ小さい変化をつけたいとき」にはクラスの名前を複数指定すると便利です。
上記の様に半角スペースで区切って複数のクラスを指定することができます。

```css:css
.btn {
 padding: 8px 24px;
 opacity: 0.8;
 border-radius: 4px;
}

.facebook {
 background-color: red;
}

.twitter {
 background-color: white;
}
```

####カーソルを乗せた時に色を変える
CSSで、`セレクタ:hover`とすることで、カーソルが乗ったときのCSSを指定することができます。

```css:css
.btn:hover {
  opacity: 1;
}

/*背景透過している場合は下記のように書くこともあります*/
.header-right:hover {
  background-color: rgba(255, 255, 255, 0.5);
}
```

`transition`を使うと「変化の対象」や、「変化にかかる時間」などを指定でき、アニメーションをつけることができます。「変化の対象」にはcolorなどのプロパティを指定しますが、allを指定すると全てのプロパティに適用出来ます。transitionはhoverと組み合わせて使います。

```css:css
.header-right {
  background-color: rgba(255, 255, 255, 0.3);
  transition: all 0.5s;
}
```

####行間指定
`line-height`プロパティを使うと、行の高さを指定することができます。
値が大きいほど行間が大きくなります。
`line-height`プロパティは要素の縦方向の中央に文字を配置するのにも使えます。
プロパティの「高さの中心」に文字が配置されるため、要素の高さとline-heightプロパティを同じ値にすると、文字がちょうど中央に配置されるようになります。



####角を丸める
`border-radius`プロパティを用います。数字が大きいほど角が丸くなります。

```css:css
.btn {
  border-radius: 4px;
}
```

####立体的なボタン
ボックスに影を付けるためには`box-shadow`プロパティを用います。
「影の位置」と「影の色」を指定します。

例えば、messageクラスに
・水平方向0　・垂直方向7px　・色　#1a7940　の影をつける場合は
 
```css:css
.message {
  background-color: #5dca88;
  box-shadow: 0 7px #1a7940;
}
```

####カーソルの変更
`cursor`プロパティを用いることでマウスのカーソルが要素に乗ったときのカーソルの形を変えることができます。

```css:css
.message {
  background-color: #5dca88;
  cursor: pointer;
  box-shadow: 0 7px #1a7940;
}
```
ScalaでEitherを利用したエラー処理のユースケース

Scalaではエラー処理に例外ではなくEitherを使うのが良いという話を聞いたのですが、実用ケースがうまく想像できなかったので、書いてみました。
※ あくまで私の考えた結果なので、ベストプラクティスであるかはわかりません。

## 参考
下記資料を参考にさせていただきました。
https://scala-text.github.io/scala_text/error-handling.html

## 例外処理について
一般にエラーが起きたときの挙動を制御するときは、例外をthrowすることが一般的だと思います。しかし、例外には下記のような問題点があります。

- 処理の流れがわかりづらい
- 非同期プログラミングで扱いにくい
- 型チェックが動作しない

そのため、Scalaでは例外を投げるのではなく、メソッドの返り値としてエラーを表現することが推奨されています。

## Eihterとは
エラーを表現することができる型の一つです。  
LeftかRightいずれかの値をとるような構造になっており、エラー処理で利用する場合は、Leftにエラー内容、Rightに正常時の返り値を格納するようにして使います。
map, flatmap, forなどを利用することにより、Left, Rightどちらであっても適用できるような処理を書くことができるので、メインの処理から、エラー対応のロジックを切り離すことができます。

## Eitherによるエラー処理の例
具体的なユースケースを見るために、
下記の処理フローを備えたプログラムを想定します。  

1. データを読み込む
2. データを加工する
3. データを書き込む

各ステップにおいて、読み込みエラー、加工エラー、書き込みエラーが想定されます。
以下、Eitherを利用したエラー処理の例となります。
(具体の処理メソッドの記述は省略しています)

まず、各処理のエラー型を定義します。

```scala
sealed trait ProgramError
case object ReadDataError extends ProgramError
case object ProcessDataError extends ProgramError
case object WriteDataError extends ProgramError
```

各処理からEither型の値を返すインターフェースを作成します。

```scala
def readData(read: () => String): Either[ProgramError, String] = {
    """
    read: データ読み込み用の関数
    """
    try {
        Right(read())
    } catch {
        case e: Exception => {
            Left(ReadDataError)
        }
    }
}

def ProcessData(process: () => String): Either[ProgramError, String] = {
    """
    process: データ加工用の関数
    """
    try {
        Right(process())
    } catch {
        case e: Exception => {
            Left(ProcessDataError)
        }
    }
}


def writeData(write: () => Unit): Either[ProgramError, Unit] = {
    """
    write: データ書き込み用の関数
    """
    try {
        Right(write())
    } catch {
        case e: Exception => {
            Left(WriteDataError)
        }
    }
}    
```

具体の処理プログラムは下記のようになります。

```scala
val inputData: Either[ProgramError, String] = readData(
    readSomething()
)

val processdData: Either[ProgramError, String] =  inputData.fold(
        l => Left(l),
        r => processData(processSomething(r))
)

val result: Either[ProgramError, Unit] = processdData.fold(
    l => Left(l),
    r => writeData(writeSomething(r)) 
)

// 発生したエラーに対応したメッセージを出力する。
result match {
    case Left(ReadDataError) => System.err.println("ReadDataError occured")
    case Left(ProcessDataError) => System.err.println("ProcessDataError occured")
    case Left(WriteDataError) => System.err.println("WriteDataError occured")
}

```

foldを利用することで、値がRight, Leftそれぞれの場合で処理を分岐させることができます。
Eihterの型を保ったまま、処理を続けていることがわかるでしょうか。
このような形式にすることで、各処理の途中でエラー対応を実施するのではなく、最後にまとめて扱うことができるようになります。
緯度経度からの距離計算 ヒュベニより航海算法の方が高精度説

##概要
以前、GoogleAppsScriptを用いて緯度経度から２点間の距離を求める関数を作成した。

Qiita記事：[【GAS】緯度経度から２点間の距離を求める](https://qiita.com/YasumiYasumi/items/7f6c19f5611707f7a6b3)

長距離で誤差が大きくなったり、緯度経度に負の値がある場合に計算できないなどの問題を抱えつつ、個人的用途の都内での使用に限れば使えていたため問題を放置していた。

当時は「ヒュベニの公式」と言う数式で計算していたけど、他にも球面上の線長を求める方法があるとのことで新たに試してみたのが「測地線航海算法」。

そしたら諸々の問題が解決したっぽいので、改めて投稿^^)b

##距離計算
ヒュベニ、航海算法ともに、ググると専門的なページがいっぱい出てくるので理屈や公式などは割愛。

###GoogleMap測地系
球面上の線長を求めるには、楕円体の長半径と短半径が必要。地球の長半径（赤道半径）と短半径（極半径）には時代や測地系などによって種類があるが、ここではGoogleMapの距離計算に近づけるためにGoogleMapで採用されている定数を使用。

ちなみにGoogleMapでは長半径短半径ともに6371008(m)と、地球を真球として距離を求めている模様。

Qiita記事：[【GoogleMap】地球を半径6371008mの球体として距離計算していた](https://qiita.com/YasumiYasumi/items/d72969aa35a96e9b7ad0)

###計算結果！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/c1dfbc20-5234-d836-09e4-258f026a4876.png)
ヒュベニの公式で明らかに結果がおかしかった「国会議事堂～ホワイトハウス」の距離も誤差無し！「東京タワー～スカイツリー」で誤差があるように見えるけど、有効数字的には問題なし。

やったぜ╭( ・ㅂ・)و ̑̑ ｸﾞｯ !

##コード
A地点の緯度、A地点の経度、B地点の緯度、B地点の経度を引数として、２点間の距離(km)を返す関数を作成。

```javascript
function geoSailing(latiA,longA,latiB,longB) {

  //定数（GoogleMap系）
  const A = 6371008; //長半径
  const B = 6371008; //短半径

  //定数（ベッセル楕円体 旧日本測地系）
  //const A = 6377397.16; //長半径
  //const B = 6356079;    //短半径

  //定数（GRS80 世界測地系）
  //const A = 6378137;       //長半径
  //const B = 6356752.31414; //短半径

  //扁平率（F)
  var F = (A-B)/A;

  //緯度経度をラジアンに変換
  var latA = latiA * (Math.PI/180);
  var lngA = longA * (Math.PI/180);
  var latB = latiB * (Math.PI/180);
  var lngB = longB * (Math.PI/180);

  //化成緯度（Φ）
  var phiA = Math.atan(B/A * Math.tan(latA));
  var phiB = Math.atan(B/A * Math.tan(latB));

  //球面上の距離（X）
  var f1 = Math.sin(phiA) * Math.sin(phiB);
  var f2 = Math.cos(phiA) * Math.cos(phiB);
  var f3 = Math.cos(lngA - lngB);

  var X = Math.acos(f1 + f2 * f3);

  //距離補正量（Δρ）
  var f4 = Math.sin(X)-X;
  var f5 = Math.sin(phiA) + Math.sin(phiB);
  var f6 = Math.cos(X/2) * Math.cos(X/2);

  var f7 = Math.sin(X)+X;
  var f8 = Math.sin(phiA) - Math.sin(phiB);
  var f9 = Math.sin(X/2) * Math.sin(X/2);

  var drho = F/8 * (f4 * f5*f5 / f6 - f7 * f8*f8 / f9);

  //測地線長（ρ）
  var rho = A*(X+drho); //距離(m)
  var rhokm = rho/1000; //距離(km)

  return rhokm;
}
```
算数苦手なので、お見苦しい途中式だらけに^^;

こちらのコードを１行に圧縮する記事(丿￣ο￣)丿 続編：[【ワンライナー】緯度経度から１行で距離計算](https://qiita.com/YasumiYasumi/items/9e8a6f185b00cba8c8bd)

##検討
コード内の定数を別の測地系に変えれば、その測地系に合わせた計算ができる。

上記の地点間の距離を、[国土地理院の距離計算サイト](https://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2stf.html)とGASの両方で計算。国土地理院、ヒュベニ、航海算法、すべてベッセルの定数を使用したところ、航海算法で完璧な計算結果！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/3e027e30-9253-7e33-d211-9879cd54c078.png)
利用する測地系に合わせた定数で航海算法を使うのが良さそう^^

###おしまい
駆け出しエンジニアのためのネットワーク関連知識・用語説明

# はじめに

駆け出しエンジニアのためにネットワーク関連知識・用語をまとめてみました。
Progate、railsチュートリアルを駆け抜けなんとなくアプリは作れるようになったがネットワーク関連の知識は曖昧なまま、ネットワーク用語は聞いたことあるけどなんとなくでしか理解していない。そんな人が対象です。自分も初学者なので間違いがあればご指摘ください。

為になれれば僥倖。

###LAN / WAN
* LAN
 LANはLocal Area Networkの略であり、事務所など局地的な狭い範囲を繋ぐネットワークのことを言います。ちなみに無線LANとはケーブルが要らないLANのことで、現状ではほとんどが無線LAN＝Wi-Fiとして使用されています。

* WAN
 LANだけでは当然事務所内や家庭内といった狭い範囲でしか情報がやりとりができないので、LAN同士を繋ぐ広域のネットワークが必要になります。それがWAN(Wide Area Networkの略)です。WANを利用することで世界中の人とのコミュニケーションが可能になります。 

###サーバ
私たちがインターネットで記事や画像を見る時、私たちがそれらのデータをネットを介して受領できると言うことは当然そのデータを提供するものがどこかにある必要があります。そういった役割の存在をまとめて「サーバ」と呼んでいます。（サーバという名前は英語では「Server」となり、「サービスを提供する物」という意味になります）
種類としてはファイルサーバ、プリントサーバ、データベースサーバ、WEBサーバといったものがあります。
ちなみにサーバーからサービスを受領する、つまり私たちがQiitaで記事を呼んでいるような立場を「クライアント」と呼びます。
尚、あくまでも「サーバ」や「クライアント」という言葉は役割を示す言葉であり、そうした名前の専用の機械があるわけではありません。

###インターネットプロトコル（IP)
 インターネットを通じてコンピューター同士がやり取りするための約束事のことです。
たとえば外国企業と取引する際に日本語100%で対応しようとしても当然うまくいかないように、コンピューター間でやりとりをする際にもある程度の決まり事が必要になります。そのため、インターネットを通じてコンピューター同士でやりとりをする際には決められている（というかみんなが使っている）IPを約束事として使用します。
IPの働きは、「経路制御を行い、ネットワークからネットワークへとパケットを運んで相手に送り届けること」です。要は「データを送る」という役割です。

###TCP(Transmission Control Protcol)
 IPでデータを送るだけでは通信品質の保証ができない為、TCPというプロトコルが活躍します。TCPは通信相手とのコネクションを確立してから、データを送受信するコネクション型のプロトコルです。つまり送信エラーが発生した際に再送するといった働きをすることが可能であり、「データ受信の信頼性を保証する」役割を果たしているといえます。
先述のIPとセットでTCP/IPと呼ばれ、現在のデファクトスタンダード（事実上の基準）となっています。

###IPアドレス
IPを介してデータを送信する際に必要となる送信先のアドレスのことであり、郵便で例えると住所にあたるものです。当然同じ住所が二つあると誰に送信すればいいのかわからなくなってしまう為、重複しない番号がそれぞれ割り当てられています。
尚IPアドレスには「パブリックIPアドレス」と「プライベートIPアドレス」の2種類が存在し、電話で例えるところの外線電話、内線電話のような役割にあたります。

- パブリックIPアドレス
 <br>インターネットに接続する際に用いるIPアドレスのこと。プロバイダーやサーバー事業者から貸し出される。
- プライベートIPアドレス
 <br>インターネットで使われないIPアドレス。主な用途として社内LANなどLANの内部で使用することができるIPアドレス。

###ポート番号
TCP/IP通信においては、 IPアドレスがあればネットワーク上のコンピュータを一意に識別することができますが、 該当コンピュータのどのプログラムに通信パケットを届けるかは、 IPアドレスだけでは決定できません。 どのプログラムに通信パケットを渡すのかを決定するために、 ポート番号を使用します。
例えばIPアドレスの宛先に或データが送信されたとして、そのデータをWebページとして処理するのか、メールとして処理するのか、ファイルとして処理するのかわからなければ当然処理しようがありません。そのため「どのプログラムにデータを渡すのか」という情報も必要になり、そのために使用されるのがポート番号です。

| プロトコル名 | ポート番号 |
|:-:|:-:|
| HTTP | 80 |
|  FTP | 転送用：20、制御用：21  |
| Telnet  | 23  |
| SMTP  | 25  |
| POP  | 110  |
| NTP  | 123  |

よく耳にするHTTPプロトコルとはハイパーテキスト(HTMLとか)を伝送するため通信規約のことであり、Webサイトにアクセスした際などに使用されるプロトコルのことです。

#まとめ
はじめてまともにQiitaの記事を書いてみましたが、自分が学んだことを整理・整頓する為にも非常に役に立つと感じました。なかなかいいね。
また続けていきます。
画像や文字が中央にならない時の解決方法(CSS)

#一般的な画像や文字を上下中央に寄せる方法といえば
**``text-align: center;``**や**``margin: 0 auto;``**が有名ですよね。
しかし、それをしたのに、画像が上下中央真ん中に寄ってくれない、効かない。
一つ打つだけで、効く動作なのになぜか効かなくて困りましたが、解決できたので、ここに書こうと思います。

#元のコード
* HTML

```
<header>
  <div class="abc">
    <img  src=""  alt="" />
  </div>
</header>
```

* CSS

```
header {
  background-color: #FFFF;
}

.abc{
  float: left;
  /* margin : 0 auto; */
  width:70%;
}

```

#解決方法
**結論から言うと、text-align: center;の入れる場所とdivタグを消すことで直りました。**
* HTML

```
<header>
  <img  src=""  alt="" />
</header>
```
abcというdivタグを削除

* CSS

```
header {
  text-align: center;
}
```

cssの部分もabcクラスhtmlから消したので、削除
CSSのヘッダーに**``text-align: center;``**
と直接書き込むことによって、解決することができました。
imgやdivタグに入れないように注意してください。

#コードを複雑にしないために注意したい点　　
* floatを使わない
**float**はProgateなどを使っていると、教えてもらいますが、ややこしくなる原因で有名ですし、みんなも使っていないので、使わない方がいいです。

  
* widthを定義しない 
widthを一度定義してしまうと、他のwidthと差ができてしまって、空白の部分が出てきてしまいます。
なので積極的に、使わない方がいいです。
.NET Framework 4.6.0 以降で、TLS1.2 が既定で On

## 引用

参考: [.NET Framework で TLS1.1 および 1.2 を有効化する方法 -まとめ-](https://social.msdn.microsoft.com/Forums/ja-JP/e3040f20-4eb9-432d-bc52-b4f7091ee95a/net-framework-tls11-12-?forum=edgeiesupportteamja)

> .NET Framework 4.6.x
> TLS 1.1 / TLS 1.2 に対応済み
> プロパティの既定値は TLS 1.0、1.1 および 1.2

「各 OS 上での .NET Framework の既定のバージョン」の図によると、Windows 10 (Windows Server 2016 含む) は .NET Framework 4.6 またはそれ以降のバージョンが既定でインストールされている模様です。

## コードでの対処

一方、アプリの `<TargetFramework />` を `net45` `net451` `net452` (.NET Framework 4.5.0, 4.5.1, 4.5.2) と指定している場合に、コードで対処する例:

参考: [C# 今更ですが、HttpClientを使う - Qiita](https://qiita.com/rawr/items/f78a3830d894042f891b)

```csharp
ServicePointManager.SecurityProtocol =
    SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
```

※ 個人的には `=` で代入するより `|=` で論理和する方が好みです。将来的にというか執筆時点で `SecurityProtocolType.Tls13` が存在するので、Tls13 が既定で有効になっている場合に、Tls13 の対応能力を無効化しないか、という懸念があります。

参考: [SecurityProtocolType 列挙型 (System.Net) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.net.securityprotocoltype?view=net-5.0)

## ネタ: .NET Framework 4.6.0, 4.6.1, 4.6.2 しか許さない OS がある

ちょっとびっくりしたのですが `Windows 10 v1507 (LTSC 2015)` では .NET Framework 4.6.x しかインストールできないようです。

参考: [.NET Framework で TLS1.1 および 1.2 を有効化する方法 -まとめ-](https://social.msdn.microsoft.com/Forums/ja-JP/e3040f20-4eb9-432d-bc52-b4f7091ee95a/net-framework-tls11-12-?forum=edgeiesupportteamja)

「各 OS 上でサポートされるバージョン」図を参照

### Windows Server 2016 は .NET Framework 4.6.x 制限に該当しない

Windows Server 2016 は `Windows 10, version 1607 (Anniversary Update)` をベースにしていて、`Windows 10 v1507 (LTSC 2015)` には該当しません。

つまり .NET Framework 4.6.0, 4.6.1, 4.6.2 制限はありません。

> Windows 10, version 1607 (Anniversary Update) に対応する10年間サポートの長期サービスチャネルの Windows Server である。

参考: [Microsoft Windows Server 2016 - Wikipedia](https://ja.wikipedia.org/wiki/Microsoft_Windows_Server_2016)

## 更新プログラムを必要とする OS

結論としては `Windows Server 2008 SP2` (Windows Vista ベース) のみ、OS の更新プログラムを必要とします。Windows Update で配布されるかどうかは不明です。

> Windows Server 2008 SP2
> 既定の状態では OS として TLS 1.1 および 1.2 を利用することができません。

参考: [.NET Framework で TLS1.1 および 1.2 を有効化する方法 -まとめ-](https://social.msdn.microsoft.com/Forums/ja-JP/e3040f20-4eb9-432d-bc52-b4f7091ee95a/net-framework-tls11-12-?forum=edgeiesupportteamja)

> ！ご注意ください！
> Windows OS 自体が TLS 1.1 および 1.2 を利用することができない状態でアプリケーション側で TLS 1.1 および 1.2 が指定されると、アプリケーション実行時に例外が発生します。