OmniAICreator/Qiita-1.07M huggingface dataset:
素数判定アルゴリズム

#はじめに
今回は素数かどうかを判定するアルゴリズムをpythonを用いて行おうと思います。
素数の定義ですが、簡単に言えば以下のようになります。
**「素数とは、1とその数自身以外に正の約数を持たない、1より大きい整数」**
この定義を元にして、いくつかの素数判定アルゴリズムを実装してみたいと思います。
[素数(Wikipedia)](https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0)

## P1：一番シンプルな実装方法
素数の定義から単純に考えると、1とその数自身以外で割り切れないことを確認すれば、素数かどうかを判定できます。つまり、1 から n まで順々に素数かどうか判定すればよいというわけです。

- n を判定したい数とする
- 2 から n - 1 までで n を割ってみる
    - もしどこかで割り切れたら n は合成数
- 最後まで割り切れなかったら n は素数

```python
# 一番シンプルな方法
def judge_prime_num_p1(int_num):
    for i in range(2, int_num):
        if int_num % i == 0:
            print("{0} is composite".format(int_num))
            return

    print("{0} is Prime".format(int_num))

if __name__ == "__main__":
    judge_prime_num_p1(31)
```

Terminalでの実行結果

```terminal
# 実行結果
31 is Prime
```


##P2：処理回数を減らす実装方法
P1では愚直に1からnまでの整数を処理して素数判定を行いますが、実際は、素数かどうかを判定したいある整数nの√n以下の素数たちまで割り算をすればよいです。

なぜならnが合成数なら必ず√nより小さい素因数を持つからです。

例えば 31 が素数かどうか判定するときに 5<√31<6 なので 5 以下の素数で割り切れないことを証明すればOKです。つまり「2 の倍数でない，3 の倍数でない，5 の倍数でない」ことを確認すればOKです。以下実装手順です。

```python
# 処理回数を減らす
def judge_prime_num_p2(int_num):
    for i in range(2, int(math.sqrt(int_num))+1):
        if int_num % i == 0:
            print("{0} is composite".format(int_num))
            return

    print("{0} is Prime".format(int_num))

if __name__ == "__main__":
    judge_prime_num_p2(31)
```

Terminalでの実行結果

```terminal
# 実行結果
31 is Prime
```

##P3：エラトステネスのふるい
最後にエラトステネスのふるいというアルゴリズムを使用して素数判定を行ってみたいと思います。P1のようなアルゴリズムに比べてエラトステネスのアルゴリズムは処理が早いことが知られています。
[エラトステネスのふるいとその計算量](https://mathtrain.jp/eratosthenes)

エラトステネスのふるいのアルゴリズムは以下の手順になります。
1：2 から n までの整数を並べる。
2：生き残っている数の中で一番小さい（かつまだ p として使われていない）ものを新たに p とおき，p 以外の p の倍数を全て消していく。
3：2の操作を繰り返していき，p が n−−√ を越えたら終了。最終的に生き残ったものが素数。

```python
# エラトステネスのふるい
def judge_prime_num_p3(int_num):

    # 2からint_numまでの整数群
    num_list = [i for i in range(2, int_num+1)]

    # ふるいにかける値
    p = min(num_list)

    # ふるいにかけた値を格納しておくリスト
    p_list = []

    while int(math.sqrt(int_num))+1 > p:
        # ふるいにかける値をリストに格納
        p_list.append(p)

        # pの倍数を整数リストから除外
        for i in num_list:
            if i % p == 0:
                num_list.remove(i)
        
        p = min(num_list)  # 次にふるいにかける値を更新

    # 素数リスト
    num_list.extend(p_list)
    num_list.sort()
    print("Prime(2 to {0}): {1})".format(int_num, num_list))

if __name__ == "__main__":
    judge_prime_num_p3(31)
```

Terminalでの実行結果

```terminal
# 実行結果
Prime(2 to 31): [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31])
```


今回は素数判定のいろいろなアルゴリズムの実装を行ってみました。
良いPythonの復習になったと思います。(笑)



## 参考
[素数判定いろいろ - シンプルな判定と、素数の分布](https://qiita.com/srtk86/items/874639e361917e5016d4)
haml導入方法メモ

#hamlの導入メモ

まずはGemfileに以下を追加する。

```
gem 'haml-rails'
gem 'erb2haml'
```

そして既存のerbファイルをhamlファイルに変換するために以下のコマンドを実行。

```
rails haml:erb2haml
```

これで既存のerbはhamlになる。
AOJのプログラミング入門～#8

#20200510
・AOJのチュートリアル
##Official House
配列使えるようになりましょうね、という目的

by Iceman

```C
int main()
{
	int N,B,F,R,V,A[5][4][11]={0},i,j,k;
	for(scanf("%d",&N);N--;)
	{
		scanf("%d%d%d%d",&B,&F,&R,&V);
		A[B][F][R]+=V;
	}
	for(i=1;i<=4;i++)
	{
		for(j=1;j<=3;j++)
			for(k=1;k<=10;k++)
				printf(" %d%s",A[i][j][k],k==10?"\n":"");
		if(i<4)
		puts("####################");
	}
	return 0;
}

```
##How many ways?
1 から n までの数の中から、重複無しで３つの数を選びそれらの合計が x となる組み合わせの数を求めるプログラム。ぱっと頭では思いつかなかった。

by Iceman

```C
#include<stdio.h>
int main()
{
	int N,X,i,j,k,r;
	for(;scanf("%d%d",&N,&X),X+N;printf("%d\n",r))
	{
		for(i=1,r=0;i<=N;i++)
			for(j=i+1;j<=N;j++)
			{
				k=X-i-j;
				if(j<k&&k<=N)
					r++;
			}
	}
	return 0;
}
```

by kyopro_friends

```C
#include<stdio.h>

int main(){
	int n,m;
	while(scanf("%d%d",&n,&m),n){
		int ans=0;
		for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++){
			int k=m-i-j;
			if(j<k&&k<=n)ans++;
		}
		printf("%d\n",ans);
	}
}
```
次のコードでは、まず`n`と`k`を読み込んで「重複無しで」という条件を加え入れるために`i == j || j == k || i ==k`を`if`の条件に入れる。組み合わせの数が分かればいいので`b`を出力する。

by S1230149

```C
#include <stdio.h> 

int main() {
  int n,x;
  int b,i,j,k,a;

  while(1) {
    scanf("%d %d",&n,&x);   
    b = 0;
    if( n == 0 && x == 0){
      break;
    }
    for(k = 1; k <= n ; k++) {


      for(j = 1; j <= n ; j++) {

	for(i = 1; i <= n; i++) {
	  
	  if(i == j || j == k || i ==k) {
	    
	  }else{
	    a = i + j + k;
	    if(a == x) {
	     
	      b += 1;
 
	    }
	  }
	  
	}//i
	
      }//j

    }//k
    printf("%d\n",b/6);
  }


  return 0;
}  
      

```

##Sum of Numbers
プログラムで文字を扱う方法、各桁の和。`scanf("%s", num);`で読み込んで各桁を``

by legosuke

```C
#include<stdio.h>

int main(void)
{
	char num[1001];
	int sum, i;
	
	while(1) {
		sum=0;
		scanf("%s", num);
		if(num[0]=='0') break;
		for(i=0; num[i]!='\0'; i++) {
			sum+=num[i]-'0';
		}
	printf("%d\n", sum);
	}
	
	return 0;
}

```
##Counting Characters
与えられた英文に含まれる、各アルファベットの数を数えるプログラム。`scanf("%c",&c[i])!=EOF`で判定。

by T1610

```C
#include <stdio.h>

int main(){
  char c[1201];
  int i;
  int ans[26];
  int b=1;
  for(i=0; i<26; i++)ans[i]=0;
  i=0;
  while(scanf("%c",&c[i])!=EOF){
      if(c[i]>='a'&&c[i]<='z')ans[c[i]-'a']++;
      if(c[i]>='A'&&c[i]<='Z')ans[c[i]-'A']++;
      i+=1;
  }
  for(i=0; i<26; i++)printf("%c : %d\n",'a'+i,ans[i]);
  return 0;
}

```
##Ring
リング状の文字列sの任意の位置から、時計回りに連続した文字をいくつか選んで、文字列pが作れるかを判定するプログラム。`if(s[(i+j)%sn] != p[j])`はわからん。

by TKT29

```C
#include <stdio.h>

int main(void){
  char s[101],p[101];
  int i,j,sn=0,pn=0,t;

  scanf("%s %s",s,p);

//文字数カウント
  while(s[sn] != '\0') sn++;
  while(p[pn] != '\0') pn++;

  for(i=0;i<sn;i++){
    t=1;
    for(j=0;j<pn;j++)
      if(s[(i+j)%sn] != p[j]) t=0;
    if(t) break;
  }

  if( t )
    printf("Yes\n");
  else
    printf("No\n");

  return 0;
}
```
Githubでコラボレーターを追加する方法

## この記事を以下を前提としています。
- Githubのアカウントを持っている
- Githubにすでにリポジトリが作成されている

## コラボレーターとは
[このQiitaの記事](https://qiita.com/toriumi01/items/0f6eae3679e3c57189c4)をご参考ください
>プロジェクトのコアな開発者たちです。
そのプロジェクトのリポジトリ、そのものに対して、pushしたり、mergeしたりといった権限を持っています。また、そのプロジェクト自体に対する変更権限を有します。

## コラボレーターの作成方法

### リポジトリの画面から赤枠の「Settings」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/f651d0f2-b7ad-8502-92ec-cc301fb15f1e.png)

### Settings下の「Manage Access」を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/76f5d7c8-7b7b-d8f3-d469-4de408fdb172.png)

### 「Invite a collaborator」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/be172c0f-cf09-b5aa-1348-bd26c91e65c3.png)

### ユーザー名を検索し該当のユーザーを選択し「Add 【ユーザー名】 to 【リポジトリ名】」ボタンを押下する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/ec945322-db8d-b197-6469-f53820534a45.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/c4828414-723b-4b92-67c3-49a563f47002.png)

### コラボレーターが追加されているところを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/e0c791fe-0546-7f69-b000-47b39fa60267.png)

### コラボレーター側のメールボックスの中に「【masterのユーザー名】 invited you to 【リポジトリ名】」というメールが来ていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/374fddcf-4caa-3bb2-0a5f-0f715e7d1849.png)

### 「View invitation」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/abebcccf-59c4-8b4c-5e3a-436166148977.png)

### 「Accept invitation」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/b47623ce-e6e0-2bc9-44e0-c60b64fc43e6.png)

## 改訂履歴
- 2020/5/12 新規作成
windows 10でFlutter開発環境構築【Scoop使用】

# 概要

なんか最近Flutterの記事をよく見かけるので、少し入門しようかなと思い、まずは環境構築についてまとめる。

自分は最近は「scoop」というパッケージ管理ソフトを利用しています。これについての記事は他を参照してください
（[https://qiita.com/StrayDog/items/69fb347cec6a003c0ff4](https://qiita.com/StrayDog/items/69fb347cec6a003c0ff4)）。

元々VS codeを入れていたので、それ以外の設定について示します。VS codeについては「Flutter」のプラグインをインストールしておいて下さい（これについてはとくに悩まなくて良いです）。Javaも必要ですが、これも同様です。

# scoopバケット追加

scoopより、以下のbacketを追加して下さい。（参考：[Scoopを使ったWindows環境構築のススメ - Super!!](https://qiita.com/Dooteeen/items/12dc8fb14042888113d0#extras-bucket%E3%81%AE%E8%BF%BD%E5%8A%A0)）

- extras
- java

# 必要パッケージのインストール

scoopにて以下のパッケージを入れてください。

- dart
- android-sdk
- android-studio
- adb
- adopt8-hotspot
- flutter


# Android studioの設定

Android studioを一度起動して下さい。問題がなければ正常に初期設定が終了します。もし、エラーが出た場合は、上記のパッケージが正常にインストールされているかを確認して下しさい。されていない場合は、「failed」と出ているので、一度アンインストールし、再度インストールして下さい。

その後、右上のfile->settings->pluginを選択し、「Flutter」のプラグインをインストールして下さい。

![SharedScreenshot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159492/3a58ab84-50b4-f9ad-6429-7414317bc0b9.jpeg)

ADVはAndroid Studioから入れてください（参考：[Flutterの導入からVSCodeでAVDを作成するまで - 導入チェック編](https://impsbl.hatenablog.jp/entry/FlutterInVSCode2)）


# 動作テスト

ここでは簡単な動作テストについて記載します。動かない場合は、
Flutter doctor」コマンドをやると、FLutter環境が出来ているかを確認できます。

# Dart

まずは簡単にdartのテストをして下さい。

```dart
main(){
  print("hello world");
}
```

# Flutter

Android Studioでanrdoidの仮想環境をインストールして下さい（Android Studioの右上にあるAVD Managerからインストールできます）。

![SharedScreenshot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159492/ea688cc0-d56b-685d-fa7e-796cda2ab656.jpeg)


その後、以下のコマンドを押下し、Flutterを使用してみます。

ここではVS codeでの利用例について示します。
まずはプロジェクトファイルを「ctrl+shift+P」でコマンドパネルを開き、「Flutter:new project」にてプロジェクトフォルダを作成して下さい。その後、右下のデバイス選択後に、実行するとサンプルアプリが実行されます。

![SharedScreenshot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159492/a15cc3ff-b1f2-3553-d3ed-89a2baa0c906.jpeg)


# おわりに

本記事は覚書きなので、いくつか漏れがあるかもしれません。そのうちメンテナンスしたい。
rails 他人の詳細ページを編集不可にする際の注意点

かなり基本的なところですが、今回アプリを完成させたと思ったら、
自分自身忘れていた箇所だったため、メモします。

また、今回はdeviceを使用して作成してます。

#他人のデータを編集不可へ

複数人のユーザーが存在するアプリケーションでは自分のマイページや投稿内容を他人に変更できないように編集アイコンをログインしているユーザ以外表示されないようにしました。

         <% if @user.id == current_user.id %>
            <%= link_to edit_user_path(current_user.id) do %>
                <div class= " edit btn btn-outline-secondary btn-default btn-block" ><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span></div>
            <% end %>
            <% end %>

<% if @user.id == current_user.id %>が肝。

これでOKと思いましたが、これでは自力で直接URLに打つと編集できてしまうということを見逃してました。。

ということでコントローラーないにも下記記載。

```
　　　　　def edit
        　@book = Book.find(params[:id])
        　if @book.user == current_user
            render "edit"
          else
            redirect_to books_path
          end
    　　　end　　
```



これで自分以外のユーザーが直接入力しても編集ページへいかず、一覧ページに飛ぶようにできました。
Railsのアセットパイプライン

#アセットパイプラインとは
JavaScript、CSS、画像などのリソース（アセット）を効率的に扱うための仕組み。

次に示すパイプライン処理を行うことで、実行速度を早めている。

1.高級言語のコンパイル
CoffeeScript SCSS,ERB,Slimなどで記述されたコードをコンパイルして、**ブラウザが認識できる(これが重要)**JavaScript,CSSファイルとして扱えるようにする

2.アセットの連結
複数のJavaScript,CSSファイルを一つのファイルに連結することで読み込みに必要なリクエストを減らして、読み込みを高速化させる。

3.アセットの最小化
スペース、改行、コメントを削除してファイルを最小化させ、通信量を節約する。

4.ダイジェストの付与
コードの内容からハッシュ値を算出しファイル名の末尾に付与する。これによりコードが変更されればファイル名が変更されるため、ブラウザのキャッシュの影響で修正が反映されないという問題を防げる。


参照：[アセットパイプラインについて](https://www.transnet.ne.jp/2016/02/28/rails%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%8C%E3%81%A4%E3%81%BE%E3%81%9A%E3%81%8Dcolnr%E3%80%8C%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3/)

#環境による挙動の違い
アセットパイプラインはdevelopment環境とproduction環境では、それぞれの目的に対して便利にするために挙動が異なる。

参照：[本番環境に合わせたアセットパイプライン](https://qiita.com/shicchi7913/items/a568192ab2adda466ff1)

#ブラウザにアセットを読み込ませる
CSSやJavaScriptなどのアセットは、Web画面にアクセスしたブラウザが、サーバーから返されたHTML内にあるscriptタグ、linkタグなどのリンク情報を読み取ることによって読み込まれ、利用できるようになる。

ビュー全体にアセットを適用させたいのであれば、共通のビューである``application.html(.slim)``でアセットを読み込ませる。

```app/views/layouts/application.html.slim
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
```
``stylesheet_link_tag``と``javascript_include_tag``はヘルパーメソッドで``'application'``は読み込ませたいアセットファイル（拡張子のhtml.slimは省略されている）。


#マニフェストファイル
ファイルをどのように連結させたいかを記述するファイルが「マニフェストファイル」
``application.css``、``application.js``がそれにあたる。

JavaScriptの例）

```app/assets/javascript/application.js
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require _tree .
```
``//=``で始まる行を、アセットパイプラインに指示を伝えるための特別な行として扱っている。
``require``は指定したJavaScriptファイルの内容を記述した位置に取り込んでいる。
``require_tree``は指定されたディレクトリ配下の全ファイルの内容を結合し、記述した位置に取り込んでいる。
例では``.``を指定しているので、``application.js``が配置されているディレクトリ配下が対象となる。

ここで、``rails-ujs``などのJavaScriptファイルはアセットの「探索パス」をもとにSprocketsが引き当てている。（探索パスは後述）


CSSの例)

```app/assets/stylesheet/application.scss
@import "bootstrap";
```
ここではSassの@importを利用して記述している。


#アセットの探索パス
探索パスにはデフォルトで``app/assets/*``,``lib/assets/*``,``vender/assets/*``が``sprockets-rails``によって設定されている。

参照：[Sprocketsの仕組み](https://qiita.com/ttaka66/items/991a52081a92cb6c2738)
VSCodeでHello World!

この記事は[Javaとは何か と 開発環境](https://qiita.com/u-devi/items/80f004689ffae67d187d) で構築したVSCodeで
プログラムを実際に動かすものです。

### VSCode実行確認
先ほど作成したpractice.javaに以下のように記載してください。

```practice.java
class Main {
  public static void main(String[] args) {
    String msg = "Hello World!";
    System.out.println(msg);
  }
}
```
<img width="983" alt="スクリーンショット_2020-05-12_15_01_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/800372ce-ccd7-732d-8ba6-855422a3f40d.png">

その状態で「実行とデバック」をクリックします。
<img width="987" alt="スクリーンショット_2020-05-12_15_01_21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/5ac44d7c-1821-d25a-e96f-45318f893483.png">

その結果、下にターミナルの枠が表示され、Hello World!と表示されていればOKです。
<img width="987" alt="スクリーンショット_2020-05-12_15_14_22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/b30aa080-4e8c-cf10-8907-fb767953182e.png">

### VSCode機能紹介
ここからはVSCodeで実際に使える機能を書いていきます。

##### 構文エラー
VSCodeの"Hello World!"; の ;（セミコロン） を削除すると、波線が出現します。これは構文（こう書けという決まり）に反しているのでエラーが出ることを表しています。エラーの内容は下のPROBLEMSに表示されます。
<img width="806" alt="スクリーンショット_2020-05-14_9_24_53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/d6daa8ed-fb0c-a414-9246-90a4f88ae1d7.png">

##### デバッグ時の機能
;を元に戻した状態から始めます。
プログラムの行数を表す数字の左にカーソルを合わせると、薄い赤丸が見えます。
<img width="415" alt="スクリーンショット_2020-05-14_9_55_44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/2a1c3196-a380-631f-d1f3-de2200c5b8d4.png">
この赤丸をクリックすると濃くなります。
今回は3,4行目の2箇所クリックしました。
<img width="475" alt="スクリーンショット_2020-05-14_10_03_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/d80acb7a-bf82-54d0-1188-df58096e02a7.png">


この状態でデバッグを行うと、表示が変化します。
その中で見て欲しいポイントが3箇所あります。
<img width="1040" alt="スクリーンショット_2020-05-14_10_02_49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/0c80babc-689a-47f8-4913-dd8f7d50e402.png">

###### ①デバッグボタン
デバッグ時に使用できるボタンです。以下は説明です。
<img width="171" alt="スクリーンショット_2020-05-14_10_39_44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/3f6a5a95-1538-1a32-085d-ed3114cc70ad.png">

1.移動： ドラッグでボタン群の位置を動かす。
2.続行： 中断したプログラムの実行を続ける
3.ステップオーバー： 現在の行を実行して、次の行で実行を停止する
4.ステップイン： 現在の行を実行して、次の行で実行を停止する。その行が関数／メソッド呼び出しであれば、関数／メソッドに突入して、実行を停止する
5.ステップアウト： 現在実行している関数／メソッドが終了するまでステップ実行を継続する
6.再起動： デバッグをやり直す
7.停止： デバッグを終了する
8.ホットコード実行：修正したコードをそのまま実行できるとあるが、うまく動かなかったため省略。

###### ②変数
ここに編集が出力されます。

###### ③ブレイクポイント状態
この黄色い枠が現在読み込もうとしている（＝現在はしていない）行です。
赤丸の数だけ止まります。

####変数確認
続行ボタンを押下すると、次のブレイクポイントで停止します。その際、変数msgにHello Worldが行われていることを確認することができます。
<img width="760" alt="スクリーンショット_2020-05-14_11_03_47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/6861e9ad-a7c0-6dee-6b39-9c0689fc78bd.png">
このように、ブレイクポイントを使用することで、状態を確認することができます。今回はブレイクポイントを2つ用意しましたが、一つ用意して、3.ステップオーバーボタンを利用して1行ずつ見ることも可能です。
scss で media query を遠くに書きたくないが、出力サイズも減らしたい

```style.scss
.title {
  color: red;
}

.text {
  color: blue;
}

@media #{pc} {
  .title {
    color: green;
  }

  .text {
    color: yellow;
  }
}
```

とか遠くに書くのは嫌だ。

なので

```style.scss
.title {
  color: red;

  @media #{pc} {
    color: green;
  }
}

.text {
  color: blue;

  @media #{pc} {
    color: yellow;
  }
}
```

scss 使ってるならこう書きたい。

でも、コンパイルすると

```style.css
.title {
  color: red;
}

@media screen and (min-width: 1000px) {
  .title {
    color: green;
  }
}

.text {
  color: blue;
}

@media screen and (min-width: 1000px) {
  .text {
    color: yellow;
  }
}
```

同じ media query が吐き出されてしまって、サイズが大きくなる

何かしらで postcss を使っているなら [postcss-combine-media-query](https://github.com/SassNinja/postcss-combine-media-query) を使う

Nuxt で作ってるなら nuxt.config.js の build に追記する

```bash
yarn add -D postcss-combine-media-query
```

```nuxt.config.js
export default {
  build: {
    postcss: {
      plugins: {
        'postcss-combine-media-query': {},
      },
    },
  },
};
```

そうすると

```style.css
.title {
  color: red;
}

.text {
  color: blue;
}

@media screen and (min-width: 1000px) {
  .title {
    color: green;
  }

  .text {
    color: yellow;
  }
}
```

このようにまとまって嬉しい。

なお Nuxt だと、コンポーネントごとにしかまとまらないけど、全部バラバラになるよりはマシ。
Firebase Firebase App Distributionの実装

# はじめに
 - apkの配信ができる
 - テスターの招待も簡単
 - 配信可能な形式はapkのみ（.aabはダメ）
 - Firebase Console以外にFirebase CLI（コマンド）、fastlane、Gradleでの配信も可能
 - 今回はFirebase Console
 - apkを焼く手順は省略します

# 画面
Console

<img width="1419" alt="スクリーンショット 2020-05-12 12.15.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199764/f5e20754-8aff-f9a7-7983-c11cc6ffbcd5.png">

配信したいapkを設定
![スクリーンショット 2020-05-12 14.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199764/5d634b90-a9b3-4872-8729-743d43b70ce1.png)

テスターを設定
![スクリーンショット 2020-05-12 14.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199764/c3c5018a-f76c-ae23-215f-ef23e8d004a3.png)

リリースノートを設定
![スクリーンショット 2020-05-12 14.57.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199764/0cf095b3-f860-6169-9b96-6b13135d45a1.png)

配信完了
![スクリーンショット 2020-05-12 14.57.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199764/b4e0c561-d134-7136-8e7f-225f7e509510.png)

テスターに追加されたメールアドレスに配信されるので手順に従うだけです。
Android apkならAndroidデバイスから開くように
iOS appならiOSデバイスから開くように
<img width="375" alt="File.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199764/2fc218a0-5d56-ad09-4739-e210d072005c.png">

# おわりに
 - シンプルで簡単
 - Bitrise等のCIからでも連携して配信することが可能

今回ソースは関係ありませんでしたが、アップしたapkのfirebase sampleの
ソースコードは[こちら](https://github.com/yoshihitoijichi/FireabseSample)
ORACLE：テーブルバックアップ

#ORACLEテーブルバックアップ
**1. バックアップ**
CREATE TABLE **バックアップ先** AS SELECT * FROM **バックアップ元** ;

**2. 差分確認*
SELECT * FROM **バックアップ先** MINUS SELECT * FROM **バックアップ元**;
⇒レコードが選択されなければOK

※参考URL
https://minory.org/sql-minus-union.html

#ORACLEテーブル復元
**1. テーブル削除**
DROP TABLE **削除対象**;

**2. テーブル復元**
CREATE TABLE **復旧後テーブル** AS SELECT * FROM **復旧元テーブル**;
railsの画像のアップ方法

表題の部分でどうしても画像がアップデートできず、つまづいてました。。

#原因

どうやらRefileとcarrierwave両方とり入れてしまったようで、
今回はRefileを使用するため、carrirwaveを削除。　　


無事、画像のアップロードを実装。

今回自分で画像のアップロードの方法を調べていく中で、
上記２つの区別ができておらず、今回で別物（違うGEM）と認識できました。

以上、何か間違い等あれば、コメント頂ければ幸いです。
Cascade分類機【備忘録】【Opencv】

# 概要

備忘録。それぞれの引数については説明なし。

# サンプルコード

```python:test.py
import cv2

cap = cv2.VideoCapture(0)
# モデルファイル？　はopencvのgithubリポジオリにある
cascade = cv2.CascadeClassifier("./data/haarcascades/haarcascade_frontalface_default.xml")


if (cap is not None):
    print('cap ok')
else:
    return -1

while(True):    
    _, frame = cap.read()# カメラからフレーム情報を取得
    
    # グレースケール変換
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    # 顔領域の探索。
    face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))        
    for (x, y, w, h) in face:# 検出した顔領域を元画面に四角で描画
        cv2.rectangle(frame, (x, y), (x + w, y+h), (0,0,200), 3)

    cv2.imshow("test", frame)# 画面表示
    key = cv2.waitKey(10)# キーボード入力受付け。知ってる人もいると思いますが、これがないとimshowされません。

    if key == ord('q'):# 終了処理用　qを押下時終了
        break
cap.release()# カメラリソースを返却
cv2.destroyAllWindows() # imshowで表示した画面を削除
print("finish")
```
UnityにてFileSystemWatcherを使用すると「NotImplementedException」で動かないときの対処法

# はじめに
Unityにてファイルの作成・更新を監視した処理を実装していました。
実装にあたり「FileSystemWatcher」クラスを使用していたのですが、Editorでは問題なく動作していたにもかかわらず、Build Runを行うと、動作しないという現象に遭遇して、対処したのでまとめました

# TL;DR
Api Compatibility Levelを「.NET 4.x」に変更すればOKです

# 環境
Unityのバージョン : 2018.4.21f1

# 現状の把握
- 実行時のログを確認します。ログは以下に出力されています
  - C:/Users/【user name】/AppData/LocalLow/【company name】/【product name】
    - user name, company name, product nameはプロジェクトの設定に依存するので、各自の環境で読み替えてみてください

- FileSystemWatcherが動作しないとき、以下のようにログに出力されていました

```output_log.txt
UnloadTime: 1.114600 ms
NotImplementedException: The method or operation is not implemented.
  at System.IO.FileSystemWatcher..ctor () [0x00006] in <0813754e7cfa415ebfedff172c2dd6e0>:0 
  at (wrapper remoting-invoke-with-check) System.IO.FileSystemWatcher..ctor()
  at FileManager.Start () [0x00011] in <e475f99b7ae14fec98b1a675e6f35500>:0 
```

# 対処法
1. File→Build Settingsの順でBuild Settingsを表示します
2. 左下のPlayer Settingsボタンをクリックします
3. Inspector上にPlayer Settingsが表示されますので、下にスクロールして、Other Player Settingsを展開します
4. Api Compatibility Levelを「.NET 4.x」に変更（以下参照）し保存します

<img width="202" alt="img1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/4f9f26e1-a620-e751-3c92-5e926b5bd8bd.png">

# まとめ
FileSystemWatcherが動かなくてお困りの方は参考にしてみてください
validatesの使い方

# validatesの使い方
railsにてアプリケーション作成中でつまずいた箇所になるのでメモ。

こちらの記事を参考にさせていただきました。
https://qiita.com/clbcl226/items/af336ff06bfba4dacfd9

今回は長さの指定のみでしたが、他にもvalideatesの種類は多数あるので、
随時調べて行きます。

## 今回使用したvalidates

validates :カラム名, presence: true 
→指定したカラムが空の場合にバリデーションをかける。

　#長さの下限を2文字に設定→minimum
　validates :カラム, length: { minimum: 2 }
　#長さの範囲を2-50文字→in .. 
　validates :カラム, length: { in: 2..50 }
　#長さを5文字に指定→is
　validates :カラム, length: { is: 5 }

##devise使用時の注意

今回、ログイン機能実装にdeviseを用いました。
その際Usersテーブル内のnameとpasswordを入力し、新規登録とログイン。
ログイン後に同じusersテーブル内にあるintroductionカラムにvalidatesをかけました。（以下）

validates :introduction, presence: true, length: {maximum: 50}

ここでpresence: trueとしてしまうとログイン時でもvalidatesがかかってしまい、
ログイン機能が動かなくなってしまいました。

なのでこちらを、presence: falseに変更
→空でも問題ないということなので、ログインも無事可能になりました。

###ログインに影響出ないようにvalidatesするには

introductionにもpresenceのvalidatesをかける場合は、

validates :introduction, presence: true, 
length, { maximum: 50 }, on: :update

もしくは、

   with_options on: :update do
 validates :introduction, presence: true, 
 length: {maximum: 50}
   end

on: :updateと指定することでupdateアクション時のみのvalidatesとすることが可能。
※deviseのログイン時はデフォルトでcreateアクションが働いているようです。

以上、もし間違い等あればコメントいただけると幸いです。
Docker for Visual Studio Codeでコンテナ操作

## 背景

docker環境を構築したり利用したりする場合、主にコマンド操作の細かい点が面倒だったりします。

- 例えば
  - コンテナを一から作ろうとすると起動に失敗して、作っては消しをコンソール上で繰り返す
  - こしゃくなことをするとデバッグも大変、、起動、停止、削除のコマンド何回打つんだよ...となる
  - ふとコンテナに入ろうとした場合にコマンドの引数を忘れている

操作面を簡素化する方法はいろいろあるとは思いますが、2020/03中旬頃に「Docker for Visual Studio Code」がV1.0になったとのことで使ってみました。
個人の備忘レベルの内容なのでご容赦ください。

## インストール

Extensionsからdockerを検索すると一番上に出てきます(2020/03/19時点)。
![docker_vsc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536396/6e701eb7-22d8-d53d-231c-a8cc33560545.png)

## 確認

インストールすると、左のメニューにdockerアイコンが追加されます。
![docker_inst.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536396/7a741ffa-0ff1-9925-7c20-13e59868aea0.png)

## 起動

workspaceにDockerfileやdocker-composeを配置すれば、GUI操作で楽々起動できます。
起動履歴はterminalに表示されるので視認性もよいですね。
![docker_compose_up.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536396/cfe9c314-fab4-7c82-24b3-7d184572237b.png)

## コンソールアタッチ

左のdockerアイコンからイメージをリスト表示し、対象コンテナに「Attach Shell」で簡単に入れます。
![attach_shell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536396/4eec8ec5-b73c-178c-eef6-aa7c53ed82e0.png)


## 削除

同じく左のdockerアイコンからイメージをリスト表示できるので、削除も簡単です。
![docker_remove.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536396/044da9c3-73dd-8e7f-6a26-33339c7900ab.png)

## 終わりに

Docker HUBとの連携もできますし、特にV1.0では「Docker Tools Love Python」らしくpythonコードへのデバッグも強化されているとのことです（ちょっとよく分かってないですが）。
コマンドを覚えてなくて良いというのがストレスフリーで良いですね！

## 参考

- https://devblogs.microsoft.com/visualstudio/visual-studio-code-docker-extension-1-0-better-than-ever/
Failed to start The Apache HTTP Server.

エラーに下記内容が出た際の対応

```
(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
```

まずはこのコマンドで対象を探す

```
$ netstat -ltnp | grep :80
```

そうすると、こういう結果が出るので
>tcp6 0 0 :::80 :::* LISTEN 895/apache2


下記コマンドで削除して

```
$ sudo kill -9 895
```

再度Apacheを再起動

```
$ systemctl restart httpd.service
```
EclipseでGithubのリモートリポジトリにプッシュする方法

## この記事では以下を前提としています
- Eclipse上でプロジェクトをGit管理対象にしている

## リモートリポジトリとは何か

Githubの中にあるリポジトリを**リモートリポジトリ**といいます。
Gitでは自分の作業スペース、つまり**ローカルリポジトリ**にあるものを最終的に
Githubなどリモートリポジトリの**master**ブランチに**push**することが一般的です。

以下図を参考にしてください
![ローカルリポジトリとリモートリポジトリの関係](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/projects/develop-app-with-salesforce-cli-and-source-control/add-salesforce-dx-project-to-source-control/images/bf546ec3acd964673bf5f6302125fd93_step-4-github-and-git-clones.png)

## Eclipseでリモートリポジトリにプッシュする方法

### リポジトリに変更を加える
今回の例では新しいHTMLファイルを追加してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/a8a45f02-4ad9-16c0-e968-ab2a1bdbdc90.png)

### プロジェクトを右クリックし、チーム→コミットを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/985e1168-5a81-4dec-00dc-ae0358f41566.png)

### 変更したいファイルを選択し赤枠のボタンを押しステージされた変更に対象のファイルを移動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/c5226e24-bb81-9e3a-9884-13a9988f882b.png)

### コミットメッセージを記述し「コミットおよびプッシュ」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/50d2ba1d-d992-3041-7878-8939c814f9b3.png)

### 宛先GitリポジトリでGithubのリポジトリを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/353c50dd-4df7-3130-4b78-135648660e1f.png)

***Gitリポジトリの情報（例）***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/5733aec5-71ae-d2f4-bd0a-6b0ece8e8619.png)

***画面の指示に従い完了させる***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/b4bd7155-db45-d649-0698-54aabc9696d0.png)

### ※もう一度ログイン情報をきかれることがあるため同じ情報を入力します、よく使用するものなのでセキュア・ストアに保管にチェックをつけることも検討してください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/1656895c-6cd5-b42e-65a0-5142c9325bb5.png)

### リポジトリ、originへプッシュから結果を確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/54909240-a8da-e976-d8bb-704efcff9b06.png)

### 「Git push non-fast-forward updates were rejected」という表示された場合は自分の変更の前に誰かが変更を加えた可能性がある、この場合は対象のブランチ(今回はmaster)からpullをする必要があります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/c52de628-82a4-343d-c263-4e11b7384f0d.png)

### プルはプロジェクトを右クリック、チーム→プルからプルをすることができます。これによりリモートリポジトリの最新を取得し現在の変更をプッシュする一連の動作をしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/b6ac4a4e-0c0c-0b32-79d5-dca3c52d5840.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/9714c958-eed5-7072-f583-ec8ffcf79a23.png)

### 競合が起きた場合は「テキストの比較」で「左から右へ現在の変更をコピーする」「右から左へ現在の変更をコピーする」を選択しファイルを更新します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/db0b5b30-13c6-7648-5080-037a4b5f1f33.png)


## 改訂履歴
- 2020/5/12 新規作成
cssメモ  画面を透明→表示する際の記載【モーダルウィンドウ】

モーダルウィンドウ
超個人的なメモです。
参考にならないかもです。

```html

  <div id="modal" class="modal">
    <div class="modal__inner">
      <div id="modal__close" class="modal__close"><i class="fas fa-times"></i></div>
      <img src="image001.jpg">
    </div>
    <div id="modal__background" class="modal__background"></div>
  </div>

  <button id="modal__show">画像を見る</button>
```

```scss

.通常状態のclass{
opacity:0;         //透明にする処理
visibility :hidden; //非表示にする
//これらを記載しておく
};
.hogehoge{
opacity :1;       //100%見えるように
visibility:visible;  //表示する。
};
```

上記を設定したあとJavaScriptで

```javascript
'use strict';   //変数忘れ防止用記載

const modal = document.getElementById('modal');
const show = document.getElementById('modal__show');
const close = document.getElementById('modal__close');
const backGround = document.getElementById('modal__background');


show.addEventListener('click', () => {   //addEventListenerでclickを何度でも使える状態
  modal.classList.add('hogehoge');       //hogehogeというクラスをmodalに追加する。追加されたclassのcssが走るので見える
  backGround.classList.add('hogehoge');  //backgroundにもhogehogeを追加。追加されたclassのcssが走るので見える
})

close.addEventListener('click', () => { //closeがクリックされたら    
  modal.classList.remove('hogehoge');   //modalのhogehogeのクラスを除去。クラスのcssが除去されたので消える
  backGround.classList.remove('hogehoge');　//同上
})

backGround.addEventListener('click', () => {　
  close.click();               //こう書くことでcloseをクリックしたこととなり上の処理が走り結果的にclassが除去され、cssも消える
})
AppSheetからREST API(GET)を使ってみた

## AppSheetでREST API（GET）使いたい

POSTはAppSheetの標準機能で利用可能です。
しかしGETはできなそうだったので、GASを使ってやってみました。

検証等などをまとめたスライドを作りました。
※ スライドが正しく見えていなかったのを修正しました。

[AppSheetからREST API(GET)を使ってみた](https://docs.google.com/presentation/d/e/2PACX-1vTkozse_xDfzBq_k5qyRrCWrgqoN8RwYLVpLUlDOaYbEFzyRUoAwXUGIVOpps6Eog/pub?start=false&loop=false&delayms=3000)
シンプルなImageEffect　その５。「２値化（Binarization）」

Twitterにアップした２値化ImageEffectのシェーダコードを貼っておきます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">シンプルなImageEffect「２値化(Binarization)」<br>MonochromeとPostarizationのImageEffectシェーダをちょっといじったら実装可能です。<br><br>The Unfinished Swanを思い出しますねー <a href="https://t.co/yaWrVknawV">pic.twitter.com/yaWrVknawV</a></p>&mdash; MIYAKE (@ScreenPocket) <a href="https://twitter.com/ScreenPocket/status/1259518331410804737?ref_src=twsrc%5Etfw">May 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Twitterに書いたとおり、
Monochromeで白黒にした画像をPosterizationで2色に粗階調化しました。
~~ただそうなると、黒と灰色に分解されてしまうのでceil()で灰色を白に引き上げたりもしています。~~
※修正
そういえばZero/Oneでわけるならstep()使えば良いじゃん、ということを思い出したので修正します。
過去の自分の記事を無理やり使おうとしてしまった。。反省。

Monochromeについては[シンプルなImageEffectその２。モノクロ。](https://qiita.com/ScreenPocket/items/4e33b8f4a2925f109e97)
Posterizationについては[シンプルなImageEffectその３。Posterization](https://qiita.com/ScreenPocket/items/1e8247e272d6e120bc21)
ceil()については[cg - ceil](https://developer.download.nvidia.com/cg/ceil.html)
をご参照下さい。

また、今回黒い部分と白い部分にそれぞれ色を載せられるように、
_ZeroColor、_OneColorの２つの色パラメータも追加しておきました。
白黒のみで良いなら必要ないですが、色々使い途が増やせそうなので残しておきます。

```glsl:Binarization.shader
Shader "ScreenPocket/ImageEffect/Binarization"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _ZeroColor ("Zero Color", Color) = (0,0,0,1)
        _OneColor ("One Color", Color) = (1,1,1,1)
    }
    
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;
            fixed4 _ZeroColor;
            fixed4 _OneColor;

            fixed4 frag (v2f i) : SV_Target
            {
                half4 col = tex2D( _MainTex, i.uv );
                fixed luminance = Luminance(col.rgb);
                col.rgb = step(0.5, luminance);
                return lerp(_ZeroColor, _OneColor, col.r);
            }
            ENDCG
        }
    }
}
```

~~輝度(luminance)にオフセット値を加えて、黒になる範囲を調節出来るようにするのも有りかもしれないですね。~~
~~fixed luminance = Luminance(col.rgb) + _Offset;~~
~~な感じで。~~
step(0.5,luminance);
の0.5を調整できるようにすれば、黒になる範囲が調整できるかと。
初投稿

#初投稿
今回この記事が初投稿なので自己紹介と投稿に至った経緯を記述したいと思います。

##自己紹介
2020年の3月に大学を卒業し4月からそのまま大学院に進学した1年生(22歳)です。
趣味はバドミントンで基本的に運動をすることが好きですがコロナウイルスの影響で外に出られません。
自分はエンジニア志望でスマートリモコンやLINEBOTなど、自分の生活を便利にしたりこういうのあったらいいよなってものを作ってみるのが好きです。
大学の研究室では機械学習を用いた画像処理を行なっていて、パソコンを触っている時間は多分長めなのではないかと思っています。
##なぜQiitaを書こうと思ったか
コロナウイルスの影響もあり、就活に不安があります。なのでオンラインでできる就活を探しました。
いろいろありましたが、自分が使ったのはサポーターズ https://talent.supporterz.jp/
で昨日5/11のオンラインイベントに初参加しました。
サポーターズ代表の楓さんに２時間ほどお話をいただいたのですが、その中でアウトプットは大切だというお話がありました。QiitaでもGitHubでもなんでもいいからアウトプットして公開してみるといいと。
僕自身、なぜブログを書くのか謎で自分の欲しいものは自分で作って満足しているのでそれでいいと思っていましたが、お話を聞いて自分がものを作るときに必要だった知識がそのもので止まってしまいがちでむしろ何を作ったかとか忘れてしまってるものもあるなと思いました。
加えて、自分は塾で講師のアルバイトをしているのですが自分がわかることと人に説明できることには理解度の差があることを知っています。なので、なんとなくわかっている知識を文章に書く、まとめるという行為によって自分のスキルアップやメモがわりに投稿をしてこうと思いました。
が、正直、就活のためでもあったりします。サポーターズをはじめとする就活サイトでは大抵GitHubやQiitaのアカウントを入力する欄があります。自分は就活はまだ始めたばかりというかほとんどしていないような身ですが、きっと自分のアピールをすることが大切なんだと考えています。
ESや面接中で話せないような自分の履歴をアカウントに残すことで企業様に見ていただけるのであればやって損がないのはいうまでもないなと。そのような経緯になっております。
あとESとかと違って文章自由に書いていいのが素敵だったのもあります。
Markdown記法もほとんど使ったことないけどこういうのいい練習だなと思うなど細かい理由は他にもいろいろありますが...


##これから
せっかく始めるからには継続してやっていって習慣にしたいなと思っているのでまずは週1活動ですね。ワンパンマン好きですし。
自分のためのアウトプットが目的なので難易度の高い知識や文章量を求めるのではなく、身につけた知識や作ったものの情報について定期的にまとめていければ効果が期待できるのではないかと思います。
ASP .NET Core Tips - faviconの作成

#概要
ASP .NET CoreでWebアプリを開発している中で、
favicon作成にサービスを利用したので、その備忘録。

#使用したサービス
そのまんまのサービス名ですが
[Favicon Generator for ASP.NET Core](https://realfavicongenerator.net/favicon/aspnet_core)
というサービスを利用しました。

#前提
・faviconにしたい元画像データがあること
・wwwroot直下にfaviconを配置する

#使い方
1. サイトを開いたら、「Select your Faicon Image」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/942ca90a-149a-1bf5-34f6-ce76390a91f3.png)

2. ファイル選択ダイアログが表示されるので、元画像データファイルを選ぶ
3. 元画像のサイズが小さいと、以下のようなダイアログが表示されますが、「Continue with this picture」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/b7943853-d4fa-ad1a-0101-d9143ac05722.png)

4. 以下のような画面が表示されます。画像にマージンを付けたり、そのマージンを角丸にしたり、色を付けたりできます。任意の設定をしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/82de4a3b-b841-3038-2388-c9e83a6390cc.png)


5. 画面を下までスクロールして、「Generate your Favicons and HTML code」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d657d210-4e62-6d1f-cbcc-ca7121e89b1a.png)

6. 以下のような画面が表示されます。「Favicon package」をクリックして、Zipファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/ac73f0fa-ea9a-e757-154c-12cbc1331855.png)

7. ダウンロードしたZipファイルを展開し、中身をASP .NET CoreのWebアプリプロジェクト内wwwrootフォルダ直下に置きます。
8. _Layout.cshtmlを開き、headタグ内に以下のコードを追加します。

``` _Layout.cshtml
    <link rel="shortcut icon" type="image/x-icon" href="~/favicon.ico">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
```

※ここでは、faviconとiPhone／iPadのホーム画面用アイコン（apple-touch-icon.png）のみ設定しています。

9.　デプロイして、faviconが表示されることを確認してください。
inputの文字数をカウント・表示する

#やりたいこと

- input欄に入力されている文字数をリアルタイムでカウント・表示したい。

#実装

まずは**HTML**

```
<input id="question"></input>
<p><span id="numberOfLetter"></span></p>
```

次に**jQuery**

```
$(function(){
  $('#question').keyup(function() {
    let count = $(this).val().length;
    $('#numberOfLetter').text(count);    
  });
});
```

これで、```input```欄の下に、入力文字数を表示することができました。
RDS(PostgreSQL)でクエリログ出力＆CloudWatch Logsで確認するための設定

# 概要
ある案件でRDSでサポート切れPostgreSQL 9.4を9.6へ引き上げるということを2020年4月にやった。

そもそもこのRDS、これまでクエリに関するログがまったく出力されない設定となっており、以前障害が発生したときにログを確認しようとしたら何もなく、衝撃を受けた。

なお、9.6だとCloudWatchでRDSのログが確認できるようになるということで、
この記事では、以下についてまとめる

- RDS(PostgreSQL 9.6)のログをCloudWatchで確認するための設定
- RDSでクエリログを出力するための設定

# 前提
**RDSのログってどこで確認できる？**　　
RDSコンソールページへアクセス > データベース > 任意のRDSインスタンスのDB識別子を選択 > ログとイベント > error/postgresql.log.yyyy-mm-dd-hh(※)

※yyyy-mm-dd-hhはUTC日時

# RDSでクエリログを出力するための設定
「パラメータグループ」の設定を変更してやる必要がある。
関係するのは以下。

パラメータ名|意味|postgresql9.6のデフォルト値
---|---|---
log_duration|クエリの実行時間をログに出力するか。0:クエリの実行時間を出力する<br>1:クエリの実行時間を出力しない|0(engine-defaultの値)
log_min_duration_statement|ログに出力するクエリの実行時間閾値(ミリ秒)を-1〜2147483647の間で設定。<br>-1にするとログ出力されない。<br>0にすると全クエリ出力。|-1(engine-defaultの値)
log_statement|どの種類のクエリをログに出力するか。<br>・ddl: CREATE,ALTER,DROPを記録<br>・mod:ddlに加えてINSERT,UPDATE,DELETEを記録<br>・all:ddl+modに加えてすべてのクエリを記録|none(engine-defaultの値)

※稼働しているRDSインスタンスでDBエンジンデフォルトのパラメータグループを使っている場合は、  
そのパラメータグループ自体の設定は変更できない。改めて新規作成した上でパラメータグループを付け替えてやること。  
なお、パラメータグループの付け替えや各設定の変更反映の際にはRDSインスタンスが再起動される(瞬断が発生する)ことにも注意。

設定したら、RDSのログを確認してクエリログが出力されていることを確認する。

# RDS(PostgreSQL 9.6)のログをCloudWatchで確認するための設定
## CloudWatch LogsへRDSのログを保存する設定
RDSコンソールページへアクセス > データベース > 任意のRDSインスタンスのDB識別子を選択 > 変更ボタンを押下 > ログのエクスポートでPostgresql logにチェックを入れて「次へ」を押下。

すると・・・CloudWatchで「``aws/rds/instance/<DB識別子>/postgresql``」というロググループにログ出力されるようになる。
(CloudWatchコンソールページへアクセス > ログ-ロググループ から確認可能)

## ログ保存期間の設定変更
CloudWatch LogsでRDSのログを保存するにあたって、デフォルトでは「いつまでも保存する」という設定になっている。
このままにしておくと時間経過で発生する料金が大変なことになってしまう。

また、CloudWatch LogsへRDSのログを保存するのであればRDS上のログは不要である。
RDSのストレージを食ってしまうため、保存期間は最小限でよい。

**1. CloudWatch Logs側のログ保存期間設定**  
CloudWatchコンソールページへアクセス > ログ-ロググループ > 任意のロググループの「次の期間経過後にイベントを失効」カラムの値を選択

<img width="1263" alt="スクリーンショット 2020-05-12 14.38.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/cc833ffa-57ec-f491-75a2-e31ca5f1ebfd.png">

→保持期間の編集ダイアログが表示される。

引き続いて保持期間を任意の値に変更してOKを押下する。

**2. RDS側のログ保存期間設定**  
以下の「パラメータグループ」の設定を変更してやる必要がある。

パラメータ名|意味|postgresql9.6のデフォルト値
---|---|---
rds.log_retention_period|ログ保存期間。単位は分。設定できる範囲は1440(1日)〜10080(7日)で|4320(3日)

※この設定変更はRDSインスタンスの再起動が必要であるため「RDSでクエリログを出力するための設定」と同時にやった方がよいだろう。

# 参考
https://dev.classmethod.jp/articles/rds-postgres-log-settings/
Reactアプリケーション内で枠外クリックで消えるダイアログを作る

Reactアプリケーション内で枠外クリックで消えるダイアログを作ることが何回かあったのでTipsとして残しておきます。

```react

import React, {useState, useRef} from 'react';
import './App.css';

const App: React.FC = () => {
  const [dialogOpen, setDialogOpen] = useState<boolean>(false);
  const dialogNode = useRef<HTMLDivElement>(null);

  const handleClickTrigger = () => {
    setDialogOpen(true);
    document.addEventListener('click', documentClickHandler);
  }

  const documentClickHandler = (e: any) => {
    if(dialogNode.current === null) return;
    if(dialogNode.current.contains(e.currentTarget)) return;
    setDialogOpen(false);
    document.removeEventListener('click', documentClickHandler)
  }

  return (
    <div className="app">
      <button
        onClick={() => !dialogOpen && handleClickTrigger()}
        className="trigger"
      >
        Dialog Trigger
      </button>
      {dialogOpen && (
        <div
          ref={dialogNode}
          className="content"
        >
          Dialog Content
        </div>
      )}
    </div>
  );
}

export default App;
```

## スタイル
```css
/* App.css */

.app {
  position: relative;
}

.trigger {
  border: 1px solid #000;
  border-radius: 6px;
  cursor: pointer;
  display: inline-block;
  margin: 10px;
  padding: 10px;
}

.content {
  border: 1px solid #000;
  display: inline-block;
  padding: 36px;
  position: absolute;
  top: 58px;
  left: 26px;
}
```

## おまけ: classコンポーネントで作る場合
```react

import React from 'react';
import './App.css';

class App extends React.Component {
    constructor() {
        super();
        this.state = {
            dialogOpen: false,
        }
        this.dialogNode = null;
    }

    handleClickTrigger() {
        this.setState({dialogOpen: true});
        document.addEventListener('click', this.documentClickHandler);
    }

    documentClickHandler = e => {
        if(this.dialogNode.contains(e.target)) return;
        this.setState({dialogOpen: false}, () => {
            document.removeEventListener('click', this.documentClickHandler);
        })
    }

    render() {
        const {dialogOpen} = this.state;
        return (
            <div className="app">
                <button
                    onClick={() => !dialogOpen && this.handleClickTrigger()}
                    className="trigger"
                >
                    Dialog Trigger
                </button>
                {dialogOpen && (
                    <div
                    ref={node => this.dialogNode = node}
                    className="content"
                    >
                    Dialog Content
                    </div>
                )}
            </div>
        )
    }
}

export default App;
```
ion-contentをスクロール後に次の処理を実行したい場合

scrollToPointなどでスクロール後に次の処理を実行したい場合のJavaScriptの書き方について、
ソースコード例も見当たらないので、こちらに残しておきます。

###Promisメソッドを利用する

以下のソースコード例は、ion-contentを500ミリ秒で縦に100px移動した後にfunc()が実行される例：

```typescript
document.querySelector('ion-content').scrollToPoint(0,100,500).then(func);

function func() {
// ここにスクロール後に実行したい処理
}
```
SwiftUIでString型のスペルチェックを行う方法をざっくり説明

SwiftUIで開発をしているときに、

「`String`型の変数に格納された文字列のスペルをチェックしたい。」
こんな時ってよくありますよね（いや、ない）。

そんな時はUIKitの`UITextChecker`を使ってスペルチェックしちゃいましょう。

（備忘録的に自己満足で書いてるのであしからず）

# UITextCheckerとは？
`UITextChecker` はUIKitで用意されている`NSObject`を継承したクラスです。
インスタンスを作成して使います。

#どんなコードを書いて使うの？
スペルチェックを行う関数を作りたい時は、

```swift
func spellCheck(word: String) -> Bool {
  let checker = UITextChecker()
  let range = NSRange(location: 0, length: word.utf16.count)
  let misspelledRange = checker.rangeOfMisspelledWord(
    in: word,
    range: range,
    startingAt: 0,
    wrap: false,
    language: "en") 

  return misspelledRange == NSNotFound
}
```

引数`word`にスペルチェックしたいワードを`String`型で渡して、スペルが合っていたら`true`を返します。

#いろいろ説明
##`NSRange`
`UITextChecker`を使うには`NSRange`という、まあ簡単に言うとスペルチェックをする範囲はどこですか？って質問に答えてあげる必要があります。その答えとして`NSRange`を引数として渡す必要があるわけです。

##`word.utf16.count`
`NSRange`を取得するには文字列の長さを渡してあげる必要がありますが、文字列がどの文字コード（utfとかjisとか）を使っているのかで長さが変わるので、`utf16`に変換して統一してから文字列`word`の長さを渡してあげる必要があるわけです。

##`rangeOfMisspelledWord`
実際にスペルチェックを行うのはこのメソッドです。
`UITextChecker`のインスタンスメソッドであるこのメソッドを呼び出すことで、文字列の中の間違っている箇所を表した`Range`を返します。もし文字列のスペルが合っていたら`NSNotFound`が返されます。

#最後に
SwiftUI学習の備忘録として書いています。
もし間違い等ありましたらご指摘お願いいたします。
Window.openによる遷移で詰まったこと

## 前置き
サーバーからのレスポンスを待ってから別タブでページ遷移をする必要があり、
なんの疑いもなくWindow.openを使ったところ
「iOS13 Safariでボタンを押しても何も動かないんですが…」
と言われた。

## 原因
Window.openを使っていても、遷移できるボタンとできないボタンがあることが判明。

状況を聞いてみると、
問題なく遷移できるのは、async / awaitが処理に入っていないもの。
遷移できないのは上記の処理が入っているもの。

また、自分の手持ちのiOS13では普通に動いていたのでなぜだろう…とググったところ
iOS Safariでは、ポップアップブロックがデフォルトで有効になっているらしい。（自分はなぜか無効にしてあった。）

どうやらこの2つが原因のようだ。

さらに調べてみると

ボタンをクリック => Window.open
であれば、ユーザーアクションによる遷移とみなされ

ボタンをクリック => async / awaitで諸々の処理 => Window.open
とすると、ユーザーアクションによる遷移とみなされない。
ここでポップアップブロックが有効になっていると開かなくなるようだ。
（このとき無効であれば、iOS13ではポップアップの許可云々のアテンションが出る）
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316493/706de602-295b-c641-8eb0-df97aeae50b2.jpeg)

## 回避方法
ポップアップブロックが有効のときは
Window.openがnullで返ってくるので、それで条件分岐をすることに。

```javascript
const LINK = 'hoge'; // 別タブ遷移したいURL

if(!window.open(LINK)) {
  location.href = LINK;
} else {
  window.open(LINK);
}
```

## 所感
仕事のドタバタが一段落したので久々の更新。
この期間で初めてやったこととかライブラリとかたくさんあるのでちまちま更新しようと思う。
GLSLスクールのレポートも全然まとめられていない…（絶望）
Azureの検証環境コストを削減したい#1(Load Balancer/Application Gateway)

## はじめに

主要なパブリッククラウドソリューションで検証を行う際、なかなか日常的にコストを気にかけることができず、
月末に **「あー！やばい今月制限以上のコストかかっちゃったよ…どうしよう…」** っていうのはありがちですよね。

VMを毎晩停止するなど、いたって普通のことをやっていても、いつの間にかコストオーバーしていたり。

**私もまたAzureの無料¥22,500 のクレジットを30日待たずに吹っ飛ばしてしまった一人です…。**

その時の経験をもとに、ここでは一例として、Azure Load Balancer と（私が溶かした主な原因の）Azure Application Gatewayについて記載します。

<details><summary>用語解説</summary>
- Azure Load Balancer
Azure上で動作するL4ロードバランサー。
- Azure Application Gateway
Azure上で動作するL7ロードバランサー。WAFの機能を利用することもできる。


## 一言でいうと

**ApplicationGateway v2は存在するだけで高額課金がなされます！！**

こまめに毎回削除するのが望ましいです。

## Azure Load Balancer

Standard Load Balancerのコストは、以下に記載されています。
<https://azure.microsoft.com/ja-jp/pricing/details/load-balancer/>

>以下が課金の対象となります。
>- 構成された負荷分散およびアウトバウンド規則の数。インバウンド NAT 規則は、規則の合計数にカウントされません。
>- 規則に関係なくインバウンドとアウトバウンドで処理されたデータの量。規則が構成されていない場合、Standard Load Balancer で時間単位の料金は発生しません。

データの量はともかく、「構成された負荷分散およびアウトバウンド規則の数」で固定費用が発生します。

東日本リージョン,2020/05現在の場合、
>はじめの 5 ルール: ¥2.800/時間

なので、一切通信がなくとも **67.2円/日,一月を31日としたら2,083.2円/月**です。
月換算すると一気に高い感じがしますね。お金が溶けます。

まぁでもこのぐらいならば、ある程度想定通り、という感じですね。

しかしながら本当の敵はApplication Gatewayなのです…

## Application Gateway

L7ロードバランサーであるApplication Gatewayには、v1とv2(+それぞれにWAFが付くプラン)があります。
v1は「自動スケール、ゾーン冗長、および静的 VIP 」をサポートしていません。*1
そのため、可用性の高い環境で試したい場合は、v2を選択します。
ここではv2を選択したとしましょう。

Application Gateway v2のコストは、以下に記載されています。
<https://azure.microsoft.com/ja-jp/pricing/details/application-gateway/>

Application Gateway Standard v2(東日本リージョン,2020/05現在)の場合、
> ¥32.48/ゲートウェイ時間

なので、**779.52円/日、24,165.12円/月という、圧倒的なコストが発生します。**

また、Application Gateway Standard v2ではこのほかに稼働しているスケールユニットによるコスト(上記に比べれば微細ですが)も発生します。

お金どろどろです。

愚かにもAWSのApplication Load Balancerに慣れてしまっていた私は、
**「AWSのApplication Load BalancerはL7でも固定費は同じだったから、Azureも同じぐらいでしょ！」**と、一週間程度放置してしまったのでした…。

Application Gatewayは利用終了後すみやかに削除しましょう。

## まとめ
- **Application Gateway v2は存在するだけで高額課金がなされます！！(二回目)**
- 自分を過信せず、未知のものを利用するときはちゃんと調べてから検証しよう！


## おわりに
- 今回は私の実経験をもとに、Application Gateway v2の失敗を記事にしてみました。
- 今後はコストを見える化するAzure Cost Managementの利用方法や、他のお金を溶かさない方法についても記事にしていきます。
- お金は大事なので！

次回
[Azureの検証環境コストを削減したい#2 Azure Cost Managementで予算を設定する](https://qiita.com/motomiya_hikaru/items/fc0c5526938456fc3734)


以上！

-------------------------------
*1:v1は料金形態も違い、最小構成ではかなり固定月額料金も変わります。未サポート機能が必要ない場合は、v1Sで検証を行うと、お安く済みます。
Excel VBA で シートを開くとき、必ずマクロを有効化してシートの更新をしてもらえるようにしてみた

#Excel VBA で シートを開くとき、必ずマクロを有効化してシートの更新をしてもらえるようにしてみた

Excelでワークブックを開くとき、セキュリティの警告が出ているとマクロが実行されない。
![マクロ警告.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634486/391c4216-5a31-d9b7-d5b0-5e59e94cdb35.png)
これは、セキュリティ的には、本来正しい動き。
でも、マクロを動かしてもらわないと、業務が成り立たないときがある。

Excelで更新されたとき、この変更されたデータを、外部データに更新させるというマクロが組み込んでした。
しかし、Excelブックを開くとき、PC環境によってはマクロを有効化されないまま、シートだけを更新して、マクロが実行されない（ボタンを押すが、無反応の）まま、上書き保存して終わりが多い。

今回追加するマクロは、Excelブックを開いたとき、必ずマクロを有効化しないと、データ更新シートが表示されないようにした。
そのとき、必ずマクロを有効「コンテンツの有効化ボタン」を押してもらえるように、警告シートだけを表示するようにして、マクロを有効化できたら、業務で使うシートに表示を切り替えるようにした。
![シート切り替え.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634486/6768ced7-af7b-28ef-7ca1-51bbbeb9ea8f.png)


###警告シートの準備
コンテンツ有効化になっていないときは、Sheet1を表示するように、同じブック内に新たにシートを準備する。ここでは、Sheet1とした。
Sheet1以外のシートは非表示にしている。

###追加するマクロ
マクロの有効化がされると、警告シートは非表示となり隠れ、そのほかのシートを表示する。
Excelブックを保存するときは、
　・ Sheet1のみを再び表示
　・ Sheet1以外のワークシートを非表示
にして、Excelブックを保存するようにマクロを作成してみた。

```vb:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Call ctrlVisible(False)
End Sub

Private Sub Workbook_Open()
    Call ctrlVisible(True)
End Sub

Private Sub ctrlVisible(sheetMode As Boolean)
    If sheetMode = False Then
        Sheet1.Visible = True
    End If
    
    For Each objSheet In ThisWorkbook.Worksheets
        If objSheet.Name <> "Sheet1" Then
            objSheet.Visible = sheetMode
        End If
    Next

    If sheetMode = True Then
        Sheet1.Visible = False
    End If
 
End Sub
```
Orcacla Java Bronze SE 7/8 資格勉強

<dl>
<d2>筆者の経歴<d2>
---------------------------------------
都内大学を文系で卒業後、総合職として新卒で就職、営業を経験後20代前半でIT業界未経験で転職。
入社前まではコーディングはおろか、ITの知識はほぼ皆無。
2ヵ月の研修後、現在は客先常駐という形で実務に励んでいる。
現在の現場は7ヵ月になるが内コーディングの期間は１ヶ月のみで設計、テストが業務内容のほとんどを占めている。
<dl>
<d2>資格勉強をするに至った経緯<d2>
---------------------------------------
周囲の優秀な同期や先輩方はJava Silverから受験することが多い傾向だが、私は~~自信ない~~一つ一つ着実にクリアしていきたい、完全なる未経験で勉強を始めた自分の実力を試したいため、まずは初歩のBronzeから受験をする決意をした。
<dl>
<d2>勉強期間<d2>
---------------------------------------
2ヵ月....だが、ネットでいろいろ調べて行くと未経験者でも1ヵ月きちんと勉強すれば十分なよう。
<dl>
<d2>教材<d2>
---------------------------------------
[スッキリわかるJava入門](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1%E6%B8%85%E5%96%AC/dp/4295007803 "スッキリわかるJava入門")

[スッキリわかる Java入門 実践編](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B-Java%E5%85%A5%E9%96%80-%E5%AE%9F%E8%B7%B5%E7%B7%A8-%E7%AC%AC2%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4844336770/ref=pd_lpo_14_t_0/357-8629324-6796904?_encoding=UTF8&pd_rd_i=4844336770&pd_rd_r=816db64a-25e3-445c-910a-12e019e9d8fd&pd_rd_w=631Y7&pd_rd_wg=XcILE&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=VEEG410E7BTF3J30SBM1&psc=1&refRID=VEEG410E7BTF3J30SBM1 "スッキリわかる Java入門 実践編")

[徹底攻略 Java SE 7/8 Bronze 問題集［1Z0-814］対応 徹底攻略シリーズ ](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-Java-Bronze-%E5%95%8F%E9%A1%8C%E9%9B%86%EF%BC%BB1Z0-814%EF%BC%BD%E5%AF%BE%E5%BF%9C-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B00ZBEXVJM/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=java+bronze&qid=1589255551&s=books&sr=1-1 "徹底攻略 Java SE 7/8 Bronze 問題集［1Z0-814］対応 徹底攻略シリーズ ")
<d2>
現場ではコーディングからしばらく離れていたため、研修中に自己学習で使用したテキスト二冊を一から読み直した後、問題集をこなしていった。
<dl>
<d2>学習法<d2>
---------------------------------------
学習本で知識を復習したのち、問題集を一周する。
その後間違えた部分を重点的に再勉強し、該当のの問題を解く。
その他確実に理解できていないと感じる部分や疑問点はウェブサイト等活用しながら消化していく。
<dl>
<d2>引掛けられる問題のポイント<d2>
---------------------------------------
・オーバーライド
・if条件式の結果がtrue or false以外はエラー
・拡張for文
・変数の有効範囲
・インスタンスメソッド
・staticメソッド
<dl>
<d2>おわりに<d2>
---------------------------------------
今回は初歩的な内容になるが、勉強した内容をアウトプットしたので復習の意味でも有意義であった。
今後はより実践的な知識やソースコードを投稿できるようにしていきたい。