OmniAICreator/Qiita-1.07M huggingface dataset:
【Java】AtCoderのABC-194に参加しました（レート：197→230）。

こんばんは。

2021/3/6に、AtCoderのABC-194に参加しました。
レートは以下の通りとなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/5c6f653b-ec3e-e920-ab58-d3e458791f24.png)


https://atcoder.jp/users/ishikawaryou

時間ぎりぎりでC問題まで何とか解けました。
ただ、時間がかかったのと、C問題はトライ＆エラーを繰り返したため低くなっています。
開き直ってもしょうがないですが、トライ＆エラーは今の自分には必要なので、まあ良いかなと。順位は4443位でした。

レートは197→230に更新！よし200達成だ、おめ（^▽^）/！

###A問題

問題文がややこしくて時間を取ってしまいました。
無脂乳固形分（A）と乳脂肪分（B）を入力。
乳固形分（A+B）、乳脂肪分（B）の割合に応じて、1~4の値を出力。

```java
import java.util.Scanner;

public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  int a = sc.nextInt();
  int b = sc.nextInt();
  int nk = a+b;
  int ns = b;
  int flg = 0;
  //System.out.println(nk);
  if(nk>=15&&ns>=8){
    flg = 1;
  }else{
    if(nk>=10&&ns>=3){
    flg = 2;
    }else{
      if(nk>=3){
        flg=3;
      }else{
        flg=4;
      }
    }
  }
  System.out.println(flg);
}
}
```

###B問題
N人の従業員、それぞれAの仕事時間とBの仕事時間がある。
両方片付けるのに最短の時間はいくらか。
（同じ従業員の場合はAi＋Bi、違う従業員の場合は時間のかかる方）

```java
import java.util.Scanner;

public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  int n = sc.nextInt();
  int a[] = new int[n];
  int b[] = new int[n];
  for(int i=0;i<n;i++){
    a[i] = sc.nextInt();
    b[i] = sc.nextInt();
  }
  int min = 100001;
  int lg = 0;
  for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
        lg = 0;
        if(a[i]>b[j]){
          lg = a[i];
        }else{
          lg = b[j];
        }
        if(i==j){
          if((a[i]+b[j])<min){
            min = a[i]+b[j];
          }else{
          }
        }else{
          if(lg<min){
            min = lg;
          }else{
          }
        }
      }
  }
  
  
  System.out.println(min);
}
}
```

###C問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/ced62850-ca52-dc4d-f75f-0f205b279007.png)

とのことです。
処理時間がかかるので、入力時に計算可能な値を計算しながら、ループをせずに合計値を求めるロジックに変えていきました。試行錯誤して時間ギリギリで何とかなりました。

```Java
import java.util.Scanner;

public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  int n = sc.nextInt();
  long a[] = new long[n];
  long ttl =0;
  long ttl2 =0;
  long r2 = 0;
  long r2j = 0;
  for(int i=0;i<n;i++){
     a[i] = sc.nextLong();
     if(i>0){
     r2 = r2 + (-1)*a[i-1];
     r2j = r2j + a[i-1]*a[i-1];
     ttl2 = ttl2 + i*(a[i])*(a[i]) + (2)*a[i]*(r2) + r2j;
     }else{
     }
     //System.out.println(" i*(a[i])*(a[i]) " + i*(a[i])*(a[i]) + " r2 " + r2 + " r2j " + r2j + " ttl2 " + ttl2);
     // for(int j=0;j<i;j++){
     //   ttl = ttl + (a[i]-a[j])*(a[i]-a[j]);
     // }
    
  }
  //int total = 0;
  //for(int i=0;i<n;i++){
  //  for(int j=i+1;j<n;j++){
  //    total = total + (a[j]-a[i])*(a[j]-a[i]);
  //  }
  //}
  
  System.out.println(ttl2);
  //System.out.println(ttl);
  //System.out.println(total);
}
}

```


###感想

今年以内に茶色を取得する目標ですが、意外と近づいてきた気がします。

プログラミングって書いているときは苦しく、終わると楽しいんですよね。
開発現場の気持ちを保っていく意味でも、競技プログラミングは良いかなと思いました。

これからもコツコツ取り組んで、茶色を目指したいと思います！
同じく灰色レベルで頑張っている方、お互い頑張りましょう！
バーチャルオフィスでバーチャル背景を使う

#TL;DR
[SnapCamera](https://snapcamera.snapchat.com/) をインストールして、
設定画面中央の「Search Lenses」で、有志によるレンズからバーチャル背景が使えるものを探す。
現時点で下記が目的にマッチしていた。

* Change Background by Mikael
* Custom Background by Thijs Kroon

あとは、「Select Image」で壁紙を選び、
ブラウザのカメラ設定などで「Snap Camera」を選べばOK。
既にPCのガメラがブラウザなどで使われていると写らないので注意。

壁紙素材は [V壁紙](https://vbackground.com/) が登録なしでDLできてオススメ。
他に[バーチャル名刺背景ジェネレータ](https://online-meishi.biz/#/generator)とかもある。

SnapCameraは、バーチャル背景やフィルター効果が使える仮想的なカメラをPCに追加するソフトウェアなので、
TeamsやZoomを使う場合は、PCのカメラを入力にするよう切り替える必要がある。

いつもWeb会議ではTeamsやZoomなので、バーチャル背景機能を使っていますが、バーチャルオフィス系のサービスにはそのような機能はなく、自分の部屋が写ってしまうのが気になるので設定してみました。
[プログラミング学習者向けバーチャル施設CLOTO](https://qiita.com/cloto/items/68a80ca93f4ef7822e6c) おもしろいです。
AWS Lambda 実行環境は稀に起動失敗するので、リトライ処理を意識する

# 一行説明
* タイトルの通りですが、AWS Lambda は偶発的に実行環境の起動失敗＝実行失敗が起き得るので、リトライ処理を適宜組み込みましょう、というお話です

# 環境
* API Gateway 経由で API と Lambda 関数を紐付けて実行

```
[クライアント] --- [API Gateway] --- [Lambda]
```

# 事象
AWS Lambda 実行環境の起動に失敗し、Lambda / API Gateway 実行ログに以下が出力される（複数パターンあり）

## Lambda 実行ログ
* 何も出力されない
* START ログしか出力されない
  * 以下、ログ出力例

```
12:34:56 START RequestId: 12345678-abcd-efgh-ijklmbopqrst Version: $LATEST 
// 本来は以下のような実行ログがつづけて出力されるが、START しか無い
// 12:34:56 {"Level":"INFO","Time":"2021-01-01T12:34:56.789+0900",<自前で実装したログ出力>} 
// 12:34:56 END RequestId: 12345678-abcd-efgh-ijklmbopqrst
// 12:34:56 REPORT RequestId: 12345678-abcd-efgh-ijklmbopqrst Duration: 212.22 ms Billed Duration: 300 ms Memory Size: 256 MB Max Memory Used: 50 MB
```

## API Gateway 実行ログ
* HTTP ステータスコードが 504、Lambda リクエスト ID が発行されない
  * `Lambda invocation failed with status: 504. Lambda request id: N/A`
  * `N/A` なため、この場合 Lambda の実行ログは確認できず
* HTTP ステータスコードが 500、Lambda リクエスト ID が発行される
  * `Lambda invocation failed with status: 500. Lambda request id: (略)`
  * Lambda の `ServiceException` が発生
  * 以下、ログ出力例

```
(12345678-abcd-efgh-ijklmbopqrst) Endpoint request URI: https://lambda.ap-northeast-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:ap-northeast-1:<accoundId>:function:<Lambda関数名>/invocations
(12345678-abcd-efgh-ijklmbopqrst) Endpoint request headers: {x-amzn-lambda-integration-tag=12345678-abcd-efgh-ijklmbopqrst, Authorization=*(中略) [TRUNCATED]
(12345678-abcd-efgh-ijklmbopqrst) Endpoint request body after transformations: {<リクエストボディ情報> [TRUNCATED]
(12345678-abcd-efgh-ijklmbopqrst) Endpoint response headers: {Date=Mon, 01 Jan 2021 03:34:56 GMT, Content-Type=application/json, Content-Length=86, Connection=keep-alive, x-amzn-RequestId=<リクエストID>, x-amzn-ErrorType=ServiceException}
(12345678-abcd-efgh-ijklmbopqrst) Endpoint response body before transformations: 
{
    "Message": "An error occurred and the request cannot be processed.",
    "Type": "Service"
}
(12345678-abcd-efgh-ijklmbopqrst) Lambda invocation failed with status: 500. Lambda request id: *****
```


# 発生頻度
* 連続運転試験や負荷試験などを実行した際、数万回に一回程度の割合で発生
  * もし継続的に発生する場合は、サービス側の大規模な問題が発生している可能性があるため、[AWS Service Health Dashboard](https://status.aws.amazon.com/) や [AWS Personal Health Dashboard](https://aws.amazon.com/jp/premiumsupport/technology/personal-health-dashboard/) で状況を確認する 

# 原因
* Lambda 関数の一時的な問題により、当該実行環境（実行コンテキスト）において Lambda 関数の起動自体ができなかったため
  * Lambda の `ServiceException` サービスエラーの原因や詳細は非公開

# 回避策
* 数万回に一回の頻度だと「AWS Lambda では稀に発生しうるもの」であるため、完全な回避は不可能
* クライアント側でレスポンスコードを確認の上、500 番台（サービス側）のエラーが返ってきた場合はリトライをするほかない
  * リトライ処理を組み込む場合は、インターバルを徐々に長くする「エクスポネンシャルバックオフ」アルゴリズムを推奨
      * [AWS でのエラー再試行とエクスポネンシャルバックオフ \- AWS 全般のリファレンス](https://docs.aws.amazon.com/ja_jp/general/latest/gr/api-retries.html)
  * クライアントが外部のため制御できない場合、仕様書やエラーメッセージで「リトライしてね」を示す
      * 参考：[API Gateway で Lambda エラーを処理する \- Amazon API Gateway](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/handle-errors-in-lambda-integration.html)
フロントエンド開発

### フロントエンド開発
会社に入社して3年経とうとしている。
今までは、WEBサービス開発でJavaやPythonを使って実装していたが、
最近アサインされたプロジェクトでは、画面も含めて実装しなければならない。

現在の使用技術はざっこりこんな感じ
###### バックエンド
・Python(Flask)
・MySQL
##### フロントエンド
・HTML
・CSS
・JavaScript

ブラウザを使用するフロントエンド側の実装ではもはや、これ以外の選択肢
があるのかわからない。

画面の実装に関して誰かが作った成果物を修正したりする作業の経験はあるのだが、
今回は新規作成になるため、参考情報はあるものの１から作らなければならない。
今まではバックエンド側でjavaやらpythonやらで上から下まで流れるような処理を
記述すればそれでOKだったが、HTML・CSSはそうはいかない。

私の現在の状態はこんな感じ
マークアップ？　スタイルシート？　何それ？　おいしいの？

特にCSS！！

「横並びで表示させるためにはfloatを使う」
と調べて、実際に使ってみたら、floatを適用したタグより下の項目
すべてが横並びに！！！

、、勉強せねば。。。


とある書籍でこんなことが書いてあった。

<strong>とある書籍：エンジニアたるもの設計を理解したら、実装イメージが湧いてくるべきである！！</strong>

私：「いいえ、湧いてきません」

エンジニアじゃないのかな??

入力項目が２つのフォームがいい感じで表示されるまで1.5時間！！
かかりすぎよね。

Progateしよ
【Python】 2つのListを並行処理する方法

# 概要
* 2つのListを並行処理する方法
　

1： for文を使用する方法
2： zip関数を使用する方法  
※ 2 の方が<strong>可読性</strong>が上がるので、2 を使用することを推奨。

# 検証環境
OS：18.04.5 LTS
Python：3.6.9

# 方法
## 2つのlistをで並行処理

### 1： for文を使用する方法

#### 基本形

```python 
for 変数1, 変数2 in enumerate( list_1 ):
    print('{0}, {1}').format(変数2, list_2[変数1]) 
```
#### 実行結果
```python
list_1 = [1,2,3,4,5,6,7,8,9,10];
list_2 = ['1','2','3','4','5','6','7','8','9','10'];

# 並行処理
for i, j in enumerate( list_1 ):
    print('{0}, {1}'.format( j, list_2[i] ));

# 結果
1, 1
2, 2
3, 3
4, 4
5, 5
6, 6
7, 7
8, 8
9, 9
10, 10

```

### 2： zip関数を使用する方法

#### 基本形

```python 
for 変数1, 変数2 in zip(list_1, list_2):
    print('{0}, {1}'.format( 変数1, 変数2 ))
```
#### 実行結果
```python

list_1 = [1,2,3,4,5,6,7,8,9,10]
list_2 = ['1','2','3','4','5','6','7','8','9','10']

# 並行処理
for i, j in zip(list_1, list_2):
    print('{0}, {1}'.format( i, j ))

# 結果
1, 1
2, 2
3, 3
4, 4
5, 5
6, 6
7, 7
8, 8
9, 9
10, 10

```
Dockerfileの基本

#【Dockerfileの基本】

かめさん いつもありがとうございます。
[米国AI開発者がゼロから教えるDocker講座](https://www.udemy.com/course/aidocker/)

実際の業務では、DockerfileからDocker imageを作る。
Dockerfileの理解を深めることで、Dockerを使いこなす！

##Dockerfileとは。

Dockerfileというテキストファイル。
Dockerの環境を作るもの。
Docker imageの設計図。
INSTRUCTIONに引数を付けた形で書く。

###Dockerfileを作成

$ cd ~/Documents
$ mkdir docker 
$ cd docker
$ Code Dockerfile

###DockerfileからDocker imageを作る。

$ cd ~/Documents/docker 
$ docker build .
$ docker build -t new-ubuntu .

###Docker imageからコンテナを立ち上げる。

$ docker run -it new-ubuntu
$ docker

##Dockerfileの基本 ： 3つのINSTRUCTION

###FROM

Dockerfileのベースとなるimageを決める。
基本的にOSを指定する。

例） FROM ubuntu:latest

###RUN

Dockerfileを好きなようにカスタマイズ出来る。
RUNごとにレイヤーが作られる。

例） RUN apt-get update && apt-get install -y \
　　　curl \
　　　cvs \
　　　nginx

\ を使うと全てを同じ行にみなしてくれるので見やすくなる。
cacheを使うと、dockerビルドをする時に既にdockerレイヤーがあった場合に、改めてビルドをすることがないので、時短になる。

　<strong>※ Docker imageのレイヤー数は最小限にする。</strong>

###CMD

コンテナのデフォルトのコマンドを指定する。
原則はDockerfileの最後に記述する。

例） CMD ["/bin/bash"]

　※CMDはレイヤーを作らない。
アルゴリズム (後判定ループ・前判定ループ)

福嶋先生の「基本情報技術者試験 午後・アルゴリズム編」を勉強していて、少し理解に時間がかかったところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975449/05d9375a-7565-e74a-6a64-39490ec6f4fe.png)
＜__「(p.49)ループ端記号」__について個人的なまとめ＞
前判定ループ：終端に終了条件があるため、1回も処理を実行しないことがある
後判定ループ：始端に終了条件があるため、必ず1回は処理を実行する
したがって
前判定では、__いつまで繰り返せばよいのかわかっている場合に用いる。__
後判定では、__いつまで繰り返せばよいのか処理実行後の値で判断する場合に用いる__。
上記二文がこの本には強調して記載されていなかったので、なんのために後判定が存在しているのか？など少し考えてしまいました。

また、本文には
_例えば、10万回入力する場合、前判定が10万回の比較に対し、後判定は20万回の比較が行われるので、その違いは明らかである_
という記述があり、最初？？？となりました。

以下図を見て考えます。
ループ前に1件目を入力するのか、ループ後に1件目を入力するのかが主な違い。
ループの前で1件目を入力するようにすると、(2)の前判定型ループとなり、効率的になる。

&emsp;(1)後判定ループ&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;(2)前判定ループ
![qiita01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975449/3d599950-7dcc-832a-08c7-e5fd2866fc4f.png)
フローチャートはこちらのサイトで作成→ https://app.diagrams.net/

繰り返し回数が決まっている場合は、後判定では各ループ2回ずつ(ひし形部分と合計金額の一つ前の部分)比較してしまうので、処理が2倍になり、非効率ということになります。

いまいちイメージしずらかったので、こんな具体例を考えました。
徒競走でA～Zまでランダムに1人ずつ走り、Gが到着した時点で試合終了とし、そこまでに走った合計走者数をカウントします。
(1)後判定ループでは、__合計走者数を算出する(処理実行)か判断する__ためにスタート地点で走者がGであることをチェック(ひし形部分)し、__試合終了する(ループから抜ける)__ためにゴール地点で再びランナーがGであるかチェックしています。毎レースごとにスタート地点(1回目)とゴール地点(2回目)でGであるかどうかのチェックが行われ、非効率です。自分が審判だった場合、合計走者数算出を行うかどうかと試合を終了するかどうかをいっぺんにしたい！と思います。
(2)前判定ループでは、スタート地点でランナーがGであるかチェックすると、そいつにたすきをかけてゴール地点に知らせることで、試合終了の判断をしなくていいよう工夫しています。これにより、スタート地点(1回目)でのチェックだけでよくなるので比較回数が減らせるということになります。
この例では、前判定が推奨されますが、ここからさらに__各ランナーは1～9までの数字カードを持っていてその合計が30を超えた場合でもループを抜けることができる__といったような条件を付けた場合、これは__何回繰り返したらその条件を満たすか不明__ですので前判定できないですよね。この場合、後判定を用います。
Javascriptで端末判定

## 結論

```
<script type="text/javascript"><!--
function getPlatform() {
    // IE か
    var isIe = (String.prototype.hasOwnProperty('startsWith') === false);
    // Winか否か
    var isWinPc = navigator.platform.startsWith('Win') || isIe;
    // Androidか否か
    var isAndroid = navigator.userAgent.indexOf('Android') > 0;
    // Macか否か
    var isApple = navigator.platform.startsWith('Mac') || navigator.platform.startsWith('iPhone') || navigator.platform.startsWith('iPad');
    // AppleMobileか否か
    var isAppleMoblile = isApple && (typeof navigator.standalone !== 'undefind' && navigator.standalone === false);
    // AppleDesctopか否か
    var isAppleDesctop = isApple && !isAppleMoblile;
    if (isWinPc) {
        return 'win';
    }
    if (isAndroid) {
        return 'android';
    }
    if (isAppleMoblile) {
        return 'apple_mobile';
    }
    if (isAppleDesctop) {
        return 'mac';
    }
    return false;
}
--></script>
```

参考:  navigator
https://developer.mozilla.org/ja/docs/Web/API/Window/navigator

参考:  navigator.standalone
https://developer.mozilla.org/ja/docs/Web/API/Navigator

### 論理コード

```
VAR IEである = 'String' に'startWith'がない。

VAR Windowsである = 'navigator.platform' が 'Win' で始まる

VAR Androidである ＝ 'navigator.userAgent' に 'Android' がある。

VAR Appleの端末である = 
    ('navigator.platform' が 'Mac' で始まる) または 
    ('navigator.platform' が 'iPhone' で始まる) または
    ('navigator.platform' が 'iPad' で始まる)

VAR Appleのモバイル端末である = 
    ('navigator.standalone' が 'undefind' ではない) かつ
    ('navigator.standalone' が 'false' である)
　
VAR Appleのデスクトップ端末である = 
    (Appleの端末である）かつ
    (Appleのモバイル端末である の否定）
```

#### 解説１VAR IEである = 'String' に'startWith'がない。

IEのみ startWith をサポートしていないので利用する。
参考: 
 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith


#### 解説２ VAR Windowsである = 'navigator.platform' が 'Win' で始まる

Windowの場合は簡単で、navigator.platform  の返り値に  Win が含まれている。
これを利用しない手はない。

#### 解説３VAR Androidである ＝ 'navigator.userAgent' に 'Android' がある。

今回、Androidのみ、UserAgentを利用している。理由は２つ。

１: navigator.platform の返り値が カーネルになっているため。
２: 他にスマートな方法が思いつかなかった。

の２点。
...UserAgentが廃止になったらどうすべきか。

#### 解説４ アップル端末について判定
Appleの端末だけ段階的に判定を行います。理由は２つ。

１: navigator.platform の返り値が端末の種類やブラウザ設定によって切り替わるため
２: navigator.userAgentが端末のバージョンごとに違うため（またはデスクトップとモバイルで同じになるため）

- ステップ１
 - navigator.platform で Mac iPhone iPad を網羅してApppleの端末であることを切り分ける
 - ※ iPhone、iPadでも 返り値が Macになることがあるためこれだけでは判定できない。

- ステップ２
 - navigator.standaloneでiOSサファリであることを確認する。
 - このプロパティはMDSによるとiOSサファリにしか実装されておらず、
 - 端末がスタンドアロンで起動している場合は TRUE を返すそう。
 - 画面分割は試してない。けどしらん！

- ステップ３
 - ステップ１とステップ２を基に Mac か iOS かを判定する。
	
以上。
rails webpacker:install node-sass: Command failed.

## この記事について
`rails webpacker:install`を実行しようとすると以下のエラーが発生（node-sass部分）。
解決できたので備忘録投稿


```ruby
$ rails webpacker:install                                                                                                                                                  e

なんやかんや。。。

warning "webpack-dev-server > webpack-dev-middleware@3.7.3" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
[4/4] 🔨  Building fresh packages...
[-/2] ⠐ waiting...
error /Users/ketchamash/hello_rails/node_modules/@rails/webpacker/node_modules/node-sass: Command failed.
Exit code: 1

```

## 環境
Mac Catalina
ruby 2.6.3
rails 6.0.3


## 解決方法 & 参考記事
https://nabelog.org/712/

色々調べていると、nodejsのバージョンもしくはnode-sassバージョンに原因があることは分かった。どのバージョン同士でやったらええねん状態でしたが、こちらの記事でうまいこといきました。

### nodejsとnode-sassのバージョンの対応表


| nodejs -v |node-sassのサポート -v |
|:-----------:|:------------:|
|  14      | 4.14+       |
|  13    | 4.13+, <5.0     |
|  12      | 4.12+       |
|  11        | 4.10+, <5.0        |
|  10      | 4.9+      |


### 実行コマンド

これでちゃんとインストールできやした〜。

※`nodebrew`はNode.jsのバージョンを管理するためのツール

```
$ nodebrew install v14.15.0

$ nodebrew use v14.15.0

$ yarn add node-sass@4.14.0

$ rails webpacker:install

Webpacker successfully installed 🎉 🍰
```
yum updateでWebサーバを止めちゃった人向けのトラブルシューティング

開発環境で'yum update'がうまくいったからってそのまま本番環境で`yum update`をやったもんだから別のApacheがインストールされて死ぬかと思いました。
同じような目に遭ってる人もいるようですね。
[本番環境でsudo yum updateしてサービスが動かなくなった](https://qiita.com/maip0902/items/b2fe3d96dc048ff44207)

今後同じ轍を踏んでしまった人のために解決法を残しておきます。
#何が起きたのか
まず、原因はタイトルの通リ以下のコマンドです。

```
[root]# yum update
```

このコマンドを打つとyumリポジトリから最新のパッケージを全部インストールしてくれるようです。
その中には当然の様にApacheが混じっている訳で、これが標準としてインストールされてしまいます。

したがって、元々ApacheがインストールされているとApacheが以下の場所に2つインストールされてしまうわけですね。

```
/user/local/apache2/ …元からインストールされていたApache2.2
/etc/httpd/ …yumによってインストールされたApache2.4
```

このとき、`systemctl`的には`yum`によってインストールされたApacheを起動します。`httpd.conf`もApache2.4のものがロードされます。
`yum`でインストールされたApache2.4の`httpd.conf`はphpのモジュールをロードしませんから、このままだとphpのコードが世界に晒されてしまいます。
#トラブルシューティング
ではお待ちかねのトラブルシュートのお時間です。
##Apache2.4のアンインストール
まずはApache2.4が邪魔なのでこれをアンインストールします。

```
[root]# yum remove httpd
```
##SSL設定のリカバリ
`ssl.conf`が参照する証明書ファイルのパスがデフォルトの`localhost`になっている可能性があるので、これを直しに行きます。

```
[root]# vi /usr/local/apache2/conf/ssl.conf
```

私はLet's Encryptの証明書を使っていたのでこちらのサイトが参考になりました。
[CentOS 7 + Apache 2.4 に Let’s Encrypt の証明書を導入する手順](https://weblabo.oscasierra.net/letsencrypt-2/)
##起動スクリプトの復元
`yum remove httpd`によって起動スクリプトが消滅します。これをリカバリします。
手順はこちらのサイトを参考にしました。
[Apache起動スクリプト作成](http://www.unix-vm.com/centos_2_3.html)

まずは起動スクリプトが無いことを確認します。

```
[root]# ls /etc/init.d
```
次に、`apachectl`を`/etc/init.d`配下にコピーします。

```
[root]# cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd
```

ここで、`httpd`を編集してサーバ起動時に`httpd`も起動するように`chkconfig`の設定を足しておきます。

```
[root]# vi /etc/init.d/httpd
```

```sh:httpd
#!/bin/sh
#
# chkconfig: 345 85 15
…
```
ファイルができたら自動起動登録します。

```
# httpdが登録されていないことを確認
[root]# chkconfig --list httpd
# httpdを登録
[root]# chkconfig --add httpd
# httpdが登録されたことを確認
[root]# chkconfig --list httpd
httpd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
```

最後に`service`コマンドから起動してみましょう。

```
[root]# service httpd start
```
起動すれば成功です。
## sysytemctlに登録
このままでは`systemctl`視点で起動できていませんので、登録します。
こちらのサイトを参考にしました。
[【CentOS7】init.d起動スクリプトでApache2.2が起動しない場合の対処方法（systemd起動スクリプト作成で解決）](http://toriaezu-engineer.hatenablog.com/entry/2017/01/09/080227)

まずは`systemd`に対応した起動スクリプトを作成します。

```
[root]# vi /etc/systemd/system/httpd.service
```

```httpd.service
[Unit]
Description=Apache Web Server Name
After=network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
ExecStart=/usr/local/apache2/bin/apachectl -k start
ExecReload=/usr/local/apache2/bin/apachectl graceful
ExecStop=/usr/local/apache2/bin/apachectl -k stop
PrivateTmp=true
LimitNOFILE=infinity
 
[Install]
WantedBy=multi-user.target
```

作成したファイルに実行権限をつけます。

```
[root]# chmod 755 /etc/systemd/system/httpd.service
```

次に、サービスを有効に設定します。

```
[root]# systemctl enable httpd.service
```

では実行してみます。

```
[root]# systemctl start httpd.service
```

最後に動作を確認してトラブルシューティング完了です。

#さいごに
終わってみれば「こんなもんだったかなぁ」というぐらいの手順ですが、嵌るとなかなか解決しないものですね。
（Gitの最新版をインストールしたかっただけなのになぁ）
Wordpressの画像だけのページを検索されないようにする

# どうも7noteです。たまたま自分のwordpressのサイトを検索してたら変なページを見つけてしまった時の対処法！

何気なく自分のサイトをgoogleで検索していると

***「なんじゃこりゃぁ～～～！」***

wordpressに登録されている画像(メディア)だけが掲載されたページがgoogleに見つかっている。

これは削除せねば。。。

## 対策方法

```header.php
<head>
<!--～～他の記述～～～～-->

<?php if ( is_attachment() ): ?>
<meta name="robots" content="noindex">
<?php endif; ?>

<!--～～他の記述～～～～-->
</head>
```

このようにheadタグの中に**画像ページだった場合検索拒否にする**指定を書きます。

これでOK。


## まとめ

他のプラグインやテーマなどの影響でrobotsが勝手に記述されている場合、既存のrobotsよりも上にnoindexをいれれば基本的にgoogleからはindexされません。

**設定を誤って全ページに対してnoindexがはいってしまってないか必ずチェックしよう！**


#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
Webを支える技術　REST編

# REST
RESTはWebのアーキテクチャスタイルです
アーキテクチャスタイルは、**システムのアーキテクチャ（設計）を決定する際の羅針盤**となるものだ。

# アーキテクチャスタイルとしてのREST
RESTはクライアント/サーバから派生したアーキテクチャスタイル。

やや難しい言葉が並んでいるが、

一般的には、RESTといえば、Webのアーキテクチャスタイルを指す場合が多く、RESTという設計スタイルで実装されたうちの一つがWebであるという認識だけでOK。

Web全体だけでなく、個別のWebサービスやWebAPIでも、すべての設計スタイル（アーキテクチャスタイル）になっているために、RESTの約束を守る必要がある。

# リソース
RESTを理解する上で重要なポイントの一つ。
リソースとは、**「Web上に存在する、名前を持ったありとあらゆる情報」**だ。

例えば、

- 東京の天気予報
- 技術評論社の「Webを支える技術」のページ
- 新花巻駅の写真

など。

ここでいう、**「リソースの名前」とは、「URI」のこと**です。

つまり、**リソースはweb上の情報で、世界中のリソースはそれぞれURIで一意の名前を持ち、
URIを用いることでプログラムはリソースで表現する情報にアクセスすることができる。**

URIの、リソースをカンタンに指し示せる性質のことを「アドレス可能性」と呼ぶ。

また、一つのリソースは複数のURIを持つことができる。
一つのリソースに別名のリソースをくっつけておくことで、アクセスが簡単にアクセスすることができる。
Vuex moduleのAction内でエラーを投げたら怒られた

# 背景
`vuex-module-decorators` を使用し、Actionを宣言しました。

```typescript:AuthStore.ts
@Action
public async addUser(params: loginParams) {
  // API呼び出し
  await ApiService.addUser(params.email, params.password);

  // 以下省略
}
```

それを、APIからエラーが返るような呼び出し方をすると、
このようなエラーが出ました。

```
Error: ERR_ACTION_ACCESS_UNDEFINED: Are you trying to access this.someMutation() or this.someGetter inside an @Action? 
That works only in dynamic modules. 
If not dynamic use this.context.commit("mutationName", payload) and this.context.getters["getterName"]
```

# 原因
vuex-module-decoratorでは、Action内で発生したオリジナルのエラーを投げることができる
`rawError` という設定が、デフォルトでfalseとなっています。

その為、Actions内でエラーを投げようとしても、
それが呼び出し元に届いていないということでした。

# 対処
ActionにrawErrorを設定します

```typescript
@Action{( rawError: true })
public async addUser(params: loginParams) {
  // API呼び出し
  await ApiService.addUser(params.email, params.password);

  // 以下省略
}
```

もしくは、ファイルの頭で設定を行い、全体にrawErrorを設定してしまいます。

```typescript
import { config } from 'vuex-module-decorators';

config.rawError = true;
```

# 参考
https://github.com/championswimmer/vuex-module-decorators/issues/86

https://rarejob-tech-dept.hatenablog.com/entry/2019/07/12/190000
【使い分け】mb_substr()とpreg_match()

# 初めに
生のPHPを使ってAPIから値を取得する課題を進めている中で、特に学びとなったことを覚えとして投稿
※PHPでAPIの取得方法は
こちらの[記事]()
当時の[ツイート](https://twitter.com/TkTkTkTkTako/status/1365477311546462210?s=20)

※私の状況
・プログラミング学習歴：8か月（ほぼ独学）
・PHP学習歴：2か月

# 経緯

### 問題内容
たくさんの猫の情報が詰まっている、とあるAPIから以下のような条件で値を取り出す問題があった
>・問題
**猫の品種(name)の末尾が"hair"で終わる品種(name)**の内、寿命(life_span)の最大値が一番大きい猫の品種(name)を表示

### 当初予定(mb_substr)
当初は、
>**猫の品種(name)の末尾が"hair"で終わる品種**

と聞いた時
「`mb_substr`を使って末尾だけが"hair"である猫の品種(name)に絞ればＯＫ！」
と思い

```
mb_substr($json_arry["name"], -4)="hair"
```
の条件を見たす品種(name)を取得する予定でしたが、うまく狙った値が取り出せず、一度他の方法を考えることに。

### 修正案(preg_match)
他の方法を調べたところ、`preg_match()`を使った正規表現を見つけたので、こちらで実装することにした。
実は正規表現は書き方が複雑で少し避けがちであった関数でしたが、調べてみると

| 記述方法 | 用途 | 使用例 |
|:-----------:|:------------:|:------------:|
| "/^~/" | 冒頭にマッチ| 文字列の冒頭が"~"で始まる文字列がマッチ |
| "/~$/" | 文末にマッチ | 文字列の文末が"~"で終わる文字列がマッチ |
| "/*.~/" | 改行以外の任意の1文字にマッチ | "* ~"や"*-~"などの文字列がマッチ |
| "/--[abc]--/" | []内の任意の1文字にマッチする | a,b,cいずれかを含む文字列がマッチ。[]内は英数字でも可。 |
...etc

ここで書いたのは一例です。
こんな形で用途が様々で便利だと実感しました。

今回は「末尾が"hair"」なので`$`を使用し

```
preg_match('/hair$/', $data_first['name']);
```
と記述。
無事狙い値を取得し、問題を解くことができました。

# 使い分け方
更に深堀りして学習。

一見、似た処理をする`mb_substr`と`preg_match`ですが、何が違うのかというと
`mb_substr`：「切り出し」た文字列の自体を取得
　⇒返り値は"hair"など**文字列の一部**
`preg_match`：指定した文字列を「含む」か否か
　⇒返り値は**true**か**false**

という使い分けになります。

# 最後に

学習始めたての方々にとってはもしかしたら
``正規表現って書き方難しそうだし、できれば使いたくない…``
と思うかもしれません。(かくいう、私もそんな風に思っていました…)

ですが、上記のように値を取得する際に便利なオプションがあります。
今後、上のオプションを用いた正規表現を使えそうであれば是非使ってみてください！
便利さを実感すると同時にコーディングの幅が広がると思います。

最後までご覧頂きありがとうございました！m(__)m
dockerコンテナ起動時にOnly one usage of each socket addressというエラー

#前提と環境
私は素人です。
今回見舞われたエラーについて調べましたが、自分と同じ状況の人が見つからなかったので記事に残します。


Windows10homeでDocker for Windowsを使っています。
dockerで開発環境を作り、コンテナの最初の起動時にエラーが出ました。

#つまづいたこと


```$docker-compose up -d```でコンテナを起動しようとしました。

```
$ docker-compose up -d
Creating network "learning-laravel-tdd_default" with the default driver
Creating learning-laravel-tdd_db-testing_1 ...
Creating learning-laravel-tdd_app_1        ...
Creating learning-laravel-tdd_db_1         ... error
Creating learning-laravel-tdd_db-testing_1 ... done
Creating learning-laravel-tdd_app_1        ... done
ocol/network address/port) is normally permitted.
Creating learning-laravel-tdd_web_1        ... done

ERROR: for db  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
ERROR: Encountered errors while bringing up the project.
```
するとエラーに。
どうやらポート番号3306に何か問題があってdbコンテナを起動できないみたいです。

とりあえず```Cannot start service db: Ports are not available```というエラー文を調べてみました。
似たようなエラーは多かったですが私の場合は```Only one usage of each socket address```となっている箇所が```address already in use```の人が多く微妙に違うみたいです。

でもおそらくポート番号3306が他のプログラムと被っているのだろうと思いその線で試行錯誤することにしました。

#やってみたこと

```$docker-compose down```で1度コンテナを停止。

```$netstat -ano | findstr ":3306"```を実行しポート番号3306でリッスンしているプロセスを調べました。

```
$ netstat -ano | findstr ":3306"
  TCP         0.0.0.0:3306           0.0.0.0:0              LISTENING       5464
  TCP         0.0.0.0:33060          0.0.0.0:0              LISTENING       5464
  TCP         [::]:3306              [::]:0                 LISTENING       5464
  TCP         [::]:33060             [::]:0                 LISTENING       5464
```
結果PIDが5464のプロセスが怪しいとわかりました。

そこで```tasklist```コマンドでPIDが5464のプロセスが何か調べました。

```
tasklist /FI "PID eq 5464"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
mysqld.exe                    5464 Services                   0     44,404 K
```
どうやらこの```mysqld.exe```が干渉しているみたいです。
#mysqld.exeって何ですか？
調べました。
調べたんですが、
```拡張子.exeはexecutable（実行可能）という意味らしい。```
ってことしかよくわかりませんでした。
#とりあえず止めてみた
タスクマネージャーから「タスクの終了」を選択。

もう1度```$docker-compose up -d```コマンドを実行。

```
$ docker-compose up -d
Creating network "learning-laravel-tdd_default" with the default driver
Creating learning-laravel-tdd_app_1        ... done
Creating learning-laravel-tdd_db-testing_1 ... 
Creating learning-laravel-tdd_db_1         ... done
Creating learning-laravel-tdd_web_1        ... done
```
、、、いけたな。

#なんとも腑に落ちない
表面は問題がなくなったけど、mysqld.exeって何のアプリのために動いてたのか、止めちゃって良かったのか、、、

全然すっきりしない。

かと言ってこれ以上深追いする気力と体力がないので時間に解決してもらうことにします。
アセンブラ言語のアセンブルと機械語の動作説明ＧＩＦアニメ

![BehaviorOfMachineLanguage01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147091/dd2bba32-b568-9d89-77c9-ea78a8a85faf.gif)
アセンブラ言語をアセンブルし、機械語に変換するのはこのＧＩＦアニメのようなイメージ。
高級言語は構造化したコードが常識だが、アセンブラ言語では、メモリカウンタを制御しつつ、直線的にコードを埋め込んでいく。変数もプログラムもサブプログラムもごちゃごちゃでも動く。その代わり、記憶する位置が１桁でもずれると、まったく意味不明になってしまう。
[「機械語プログラムの動作を通してＣＰＵの仕組みを説明するためのＧＩＦアニメ」](https://qiita.com/seastar3/items/d03780aa88a11eb5691f)に続く。
composer require で Allowed memory size が発生したときの対処方法

# はじめに
composer require を行ったときに Allowed memory size が発生したので対処方法をまとめました

# 環境
```
$ sw_vers
ProductName:    macOS
ProductVersion: 11.2.2
BuildVersion:   20D80

$ php -v
PHP 7.4.9 (cli) (built: Aug  8 2020 11:29:07) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies
    with Xdebug v2.9.6, Copyright (c) 2002-2020, by Derick Rethans

$ php artisan -V
Laravel Framework 8.31.0
```

# 解決した方法

`COMPOSER_MEMORY_LIMIT=-1` でメモリ制限を解除して `composer require` を実行することで解決しました

以下のように実行すると、メモリ不足となりました

```
$ composer require laravel/ui
Using version ^3.2 for laravel/ui
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
PHP Fatal error:  Allowed memory size of 1610612736 bytes exhausted
```

そこで、 `COMPOSER_MEMORY_LIMIT=-1` の環境変数を渡して、 `composer require` を実行することでメモリ不足を回避しました

```
$ COMPOSER_MEMORY_LIMIT=-1 composer require laravel/ui
Using version ^3.2 for laravel/ui
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing laravel/ui (v3.2.0): Downloading (100%)         
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
74 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
```

# 参考
[Memory limit errors](https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors)
Webを支える技術　Web概論４

# Webの標準化
Webの爆発的な普及とともに、Webを構成する技術、特にHTTPとURIとHTMLの標準化が求められた。

Web以前のインターネット標準は**すべてIETFのRFC**として定められていました。
しかし、IETFでの使用策定が追い付かず、**各社の実装がバラバラで相互運用性に欠ける状態**が発生しました。
特にHTMLとCSSの標準化は重要だった。
なぜなら、当時起きていたブラウザ戦争で、Netscape Navigater と Internet Explorerが独自拡張をした結果、両者でのレンダリング結果が大きく異なり、開発者がブラウザごとに対応を迫られてしまっていた。

これが現在の**「ブラウザ対応」**につながっている。

# RESTの誕生
RESTとは、Representational State Transferの略。
これはカリフォルニア大学アーバイン校の院生だったRoy Fieldingの博士論文で書かれた、ソフトウェアアーキテクチャスタイルのこと。

HTTPはハイパーテキストを「転送」するためのプロトコルでしたが、実際にはハイパーテキスト以外にも様々なものを運んでいて、それが「リソースの状態」(resource state)の「表現」(representation)だとした。

# 様々なハイパーフォーマットの誕生
初期のWebのハイパーメディアフォーマットはHTMLだけでした。
普及に伴って、HTMLだけでは対応できない要望が生まれたために、様々なものが生まれた。

- microformats
- RSS → Atomが標準化された

HTMLやAtomはデータを記述するのに少し長ったらしくて見づらいために、考案されたより単純なデータフォーマットの中でデフォルトスタンダードとなったのが、**JSON**

# Web API をめぐる議論
Webの用途が多用化するとプログラムから自動処理を行いたいと要求が出る。
1990年後半から2000年代前半にかけてプログラムから操作可能なWebAPIの議論が巻き起こる。

1990年代後半、とにかくなんでもWebの技術を使うことがトレンドになった。

## SOAP vs RESTの論争
最終的にはREST側に軍配が上がる。
2004年から始まったWeb2.0の流れでGoogleやAmazonといった企業はREST方式のWeb APIを提供し始めた。

Web2.0で特に重要であったのは、**マッシュアップ**。
マッシュアップは、いろいろなWebAPIが提供する情報を組み合わせて一つのアプリケーションを実現する手法の一つです。
マッシュアップでは手軽さが求められたため、WebAPIが提供するリソースをHTTPやURIで簡単に操作できるRESTが受け入れられた。

# すべてがWebへ
インターネット全体を飲み込み始める。
メールやネットニュースはバックエンドで動作しているプロトコルこそ変化していないが、UIはすべてWebで統一されエンドユーザはWebだけを意識するようになりました。

この背景にはAjax(Asynchronous Javascript and XML)やCometなどの技術的ブレイクスルーがある。
【Unity】通常のプロジェクトから、シェーダーグラフを編集できるようにする【Shader Graph】

#この記事でできること
- 通常のプロジェクトから、シェーダーグラフを編集できるようになります。

#方法
- packageマネージャから、下記ふたつをインストールする。
![a01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/43062828-252d-c91c-c1d9-b1ef8126ef21.png)
![a02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/4203c7b0-1cfa-220a-e31f-fa2983568d4d.png)

- [Asset]-[Create]-[Rendering]-[Universal Render Pipline]-[Pipline Assest (Forward Renderer)]を選択する。
![a03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/5fa392ce-690a-f9b1-b4c7-fa7a3ce1b08c.png)

- アセットフォルダ内に、ふたつのファイルができていることを確認する。
![a04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/af3ce1e3-450a-c2b0-37f2-52f085ba4fe9.png)

- 下図のように、プロジェクトセッティングを編集する。
![a05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/890176ea-6e88-2b66-775c-2ac540dc4d47.png)

- 以上の設定で、プレビュー時のピンクが消えます。
![a06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/5334ef0b-fe75-aae3-cdb7-72b39573ac73.png)
![a07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/83e30f1e-6f72-443e-7782-b5b94734a516.png)
[Rails] strftime vs I18n.localize vs to_s(:Time::DATE_FORMATS) どれを使うべきか？

# 結論
`I18n.localize`がオススメ


# 理由
- 日時表示専用のメソッドだから**(= スコープが小さく、オーバーライドしやすいから )**



# strftimeがダメな理由
- **`undefined method strftime for nil:NilClass`エラーを回避するために無闇に`&`をつけるから**
- 日時を表示するのに長ったらしいメソッド名・時刻フォーマットを書くのはめんどくさいから


# to_s(:Time::DATE_FORMATS)がダメな理由
- **スコープが広く、オーバーライドできない（すべきでない）から**

`to_s`に`nil`を渡すと空文字を返す。

```ruby
$ nil.to_s
=> ""
```

しかし、`to_s(:Time::DATE_FORMATS)`にすると`ArgumentError`が発生する。

```ruby
$ Time::DATE_FORMATS[:sample_format] = "%Y年%m月%d日"
=> "%Y年%m月%d日"

$ Time.now.to_s(:sample_format)
=> "2021年01月01日"

$ nil.to_s(:sample_format)
=> ArgumentError: wrong number of arguments (given 1, expected 0)
```
**`to_s`で時刻フォーマットを指定できるが、`nil`を渡してもエラーを吐かない`to_s`の使いやすさがなくなった。**
`to_s`に`&`を毎回書くのは美しくないし、`strftime`とやってる事が変わらなくなる。

`I18n.localize`も`nil`が渡るとエラーが起きる。

```config/locales/ja.yml
ja:
  time:
    formats:
      default: "%Y年%m月％d日"
```
```ruby
$ I18n.l(Time.now)
=> "2021年01月01日"

$ I18n.l(nil)
=> I18n::ArgumentError: Object must be a Date, DateTime or Time object. nil given.
```


なので

1. 諦めて永遠と`&`を使い続ける（論外）
2. `begin rescue`でエラーをキャッチする(論外)
3. オーバーライドして`nil`をパスさせるか

どれかの対応が必要になる。
1は論外。美しくない。
2も論外。毎回`begin resucue`するのはダルい。美しくない。
必然的に3で対応することになるが、`to_s`は影響範囲が広く懸念が大きい。
**なので、日時表示専用メソッドでスコープが小さく影響範囲が狭い`I18n.localize`をオーバーライドするのがオススメ**
オーバーライドの方法は、以下を参考にしてほしい。
http://hamasyou.com/blog/2014/02/19/rails-i18n-localize/





# この記事を書こうと思った経緯と所感
> `I18n.localize`が日時表示用のメソッドならば、これ使えばいいんじゃね？」

って思ってました。
しかし、デフォルトでは`nil`をパスできないと知って、他のメソッドを調べました。
その際に、`to_s`メソッドの引数に時刻フォーマットを設定すれば日時を表示できると知りました（**to_sメソッド万能スギィィ！！！**）
しかし、
> **`to_s`でフォーマットを指定できるが、`nil`を渡してもエラーを吐かない`to_s`の使いやすさがなくなりました。。。**

`&`でエラー回避できますが、strftimeとやってることは変わらないし、コードが美しくないと思いました。
このように、**コードの保守性とメソッドスコープの観点から`I18n.localize`をオーバーライドするのがベストだと考えました。**




# 参考文献
http://hamasyou.com/blog/2014/02/19/rails-i18n-localize/

http://railscasts.com/episodes/31-formatting-time
ITパスポート受験備忘録

#はじめに
本日ITパスポートを受験しました。正式な合否発表は来月ですが、試験レポートでは受かっているはずです。
大学2年のときに購入したITパスポートの教本を放置しているのが心残りだったので、卒業間近に思い切って挑戦してきました。もしこれから受けようとしてる方の参考になれば幸いです。

#勉強期間
一週間

来月にしようかとも思いましたがまた後回しにしたら良くないので「受からないと受験料は罰金」と追い込みをかけて取り組みました

#かかった費用
テキスト代：1500円ぐらい
受験料　　：5700円

#勉強方法
使用したものは4点

・テキスト「いちばんやさしいITパスポート 絶対合格の教科書+出る純問題集」著 高橋京介 2018年
出題項目をイラストとわかりやい解説で紹介しています。理系じゃない方でも掴みやすいと思います。
しかし2018年版なので最新出題範囲には当然対応していません。これから参考書を買われる方は最新版を購入しましょう。

・シラバス
https://www3.jitec.ipa.go.jp/JitesCbt/html/about/range.html
出題範囲情報が掲載されています。受ける時期のよって対応シラバスがちがうのでテキストを購入の際の参考にもなるので1度は目を通しておくといいかもしれません。用語例なんかも載っているので分からない単語は調べて覚えるようにしました。
上記のテキストで足りない部分をこちらで補完しました。

・ITパスポート試験ドットコム 過去問道場
https://www.itpassportsiken.com/ipkakomon.php
過去問をスマホやパソコンで勉強できます。一問一答形式で解説もでてくるので空いた時間にちまちま取り組みました。
会員登録したら正答率を集計してくれるので、どの分野が苦手かログで教えてくれます。

・CBT疑似体験ソフトウェア
https://www3.jitec.ipa.go.jp/JitesCbt/html/guidance/trial_examapp.html
公式より実際の試験で使用される疑似体験ソフトを配布しています。当日慌てないように一度は使っておくと気が楽です。使えるものは使いましょう。

テキスト＋シラバスで勉強、勉強したら過去問、間違えたところをテキストに戻るを繰り返しました。

#結果
総合評価点　　　640点/1000点
ストラテジ系　　500点/1000点
マネジメント系　630点/1000点
テクノロジ系　　660点/1000点

ス、ストラテジがが…
試験終了ボタンを押したあと心臓がｷｭっとなりました…
用語系はサクサク解けましたが、事象が当てはまるか判別する問題や全然みたことない問題は自信ありませんでしたね。
かなりぎりぎりでしたが一週間ならいいほうではないでしょうか

#おわりに
勉強になりましたし、学生の間に消化できたので取り組んでよかったのではないでしょうか。今後教本が目に入っても「結局試験受けなかったな～」という気持ちになることもないでしょう。

それでは。
C言語でバブルソート

#概要
普段は主にSwiftの勉強をしていますが、一番最初に触ったC言語を忘れたくないと思い息抜き程度にアルゴリズム初級のバブルソートについて記事を書きます。

#バブルソートとは
配列の先頭から最後まで順番にみていって昇順・降順に並び替えるというものです。
今回は昇順ソートです。


#実装
コードをみていきましょう。

```c:main.c
#include <stdio.h>
#define LENGTH 7

int main(void){
    
    int array[LENGTH] = { 3, 5, 1, 9, 4, 6, 23};
    int tmp = 0;
    
    printf("before: ");
    for(int i = 0; i < LENGTH; i++) {
        printf("%d ", array[i]);
    }
    
    puts("");
    
    #1
    for(int i = 0; i < LENGTH; i++) {
        for(int j = 0; j < LENGTH; j++) {
            if (array[j] > array[i]) {
                tmp = array[j];
                array[j] = array[i];
                array[i] = tmp;
            }
        }
    }
    
    printf("after: ");
    for(int i = 0; i < LENGTH; i++) {
        printf("%d ", array[i]);
    }
    
    
}
```

上から順番に`array`は適当な順番のint型配列です。
`tmp`は値を入れ替えるときの一時的に格納する変数です。

`#1`をみてください。ここが今回のソートの肝になります。
i番目の値とj番目の値を比較するために二重ループを用います。

```
1回目
i
3 5 1 9 4 6 23

j
3 5 1 9 4 6 23

同じなので入れ替えなし

2回目
i
3 5 1 9 4 6 23

  j
3 5 1 9 4 6 23

j(5)の方が大きいので入れ替えなし。

2回目
i
3 5 1 9 4 6 23

    j
3 5 1 9 4 6 23

j(1)の方がちいさいので入れ替える。

      ・
      ・
      ・

これをn回目まで繰り返すようにする。
```

こんな感じでソートします。イメージはつかめましたか？
実際の値の入れ替えの処理はこちらです。

```c
if (array[j] > array[i]) {
    tmp = array[j];
    array[j] = array[i];
    array[i] = tmp;
}
```
j番目の値がi番目の値より大きければ入れ替える。
簡単ですね！

#Swiftでのソート
C言語では標準でsortする関数がないので自分で実装しないといけないですがSwiftなどのモダンな言語は標準でsort関数があるので楽ですね。
Swiftでのコードは

```swift:main.swift
var array = [3, 5, 1, 9, 4, 6, 23]
array.sort( { $0 > $1 } )
```
で実現できます。
めっちゃ簡単ですね笑

#まとめ
今回紹介したバブルソートですが、実装が簡単なぶん`配列の長さ^2の回数`値を比較しないといけないのであまり長い配列に使うと計算回数が多くなってしまいます。
オーダーにすると`O(N^2)`になります。
ソートのアルゴリズムでは最低のものになっています。
なので大きな配列を扱う際は、`クイックソート`or`マージソート`などの`O(N log N)`のものを使いましょう。

また、`main関数`内に処理を書いてしまうとmain関数が長くなってしまって可読性が低下したり他の配列をソートしたいと思った時の再利用性にかけるので`sort関数`を作りましょう。その際はポインタで配列を引数に渡さないと元の配列の値が変更されないので気をつけましょう。

今回は以上です。
Macで秘密鍵・公開鍵を作成する方法

備忘録に、SSH接続に使う秘密鍵・公開鍵を作成するコマンドをメモしておきます。

<h2>概要</h2>

Macで初めて公開鍵と秘密鍵を作成したので、備忘録に残しておきます。
Macユーザーで、初めての方は手順通りにすればできる思いますので、よければ参考にしてみてください。

<h2>開発環境</h2>

MacOS：11.1 ( Big Sur )

<h2>SSHとは</h2>

Secure Shellの略であり、
ユーザーが安全にサーバーを遠隔操作するために通信を暗号化する手段のことを指します。

<ul>
<li>パスワード認証方式</li>
→ユーザーアカウントにパスワードを設定する方式
</ul>

<ul>
<li>公開鍵認証方式</li>
→ユーザーが秘密鍵をもち、サーバー側にそれに紐づく公開鍵を登録しておくことで通信を暗号化する方式。
</ul>

<h2>1. ターミナルを開いて.sshディレクトリへ移動</h2>

```:ターミナル
$cd ~/.ssh
```

もし、```/.ssh: No such file or directory```と表示されたら.sshディレクトリが存在しないということなので、作成する必要があります。

下記コマンドにて作成できます。

```:ターミナル
$install -m 0700 -d ~/.ssh
```

<h2>2. ディレクトリ内に何もないことを確認する</h2>
下記コマンドで確認できます。

```:ターミナル
$ls
```

<h2>3. 公開鍵・秘密鍵を作成する</h2>
下記コマンドで鍵を作成します。

```:ターミナル
＄ssh-keygen -t rsa -b 4096 -C "メールアドレス"
```

"メールアドレス"の部分はGithubなどで登録しているメールアドレスを設定します。
鍵の種類は```rsa, rsa1, dsa, ecdsa, ed25519```とあり、 デフォルトではrsaになります。

上記コマンドでEnterすると、下記のような表示がされます。

```:ターミナル

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(ここはユーザーの名前が入ります)/.ssh/id_rsa): <----- ここで鍵ファイルを保存するフォルダの名前を設定できます
Enter passphrase (empty for no passphrase): <----- パスフレーズ
Enter same passphrase again: <----- パスフレーズ（確認用）
Your identification has been saved in /Users/(ここはユーザーの名前が入ります)/.ssh/id_rsa.
Your public key has been saved in /Users/(ここはユーザーの名前が入ります)/.ssh/id_rsa.pub.
The key fingerprint is:
99:24:u0:8i:2d:34:e6:82:r5:89:41:p8:a7:58:1p:n2（ここにメールアドレスが入ります）.local
The key's randomart image is:
+---[RSA 2048]----+
|      . =+.+.    |
|     . + .+      |
|  . .   .. .     |
| o + o  o + .    |
|o . o o.SB ..+   |
|..     .+ +oo+o  |
|o .    . ..*=.o. |
|.o      . ..E+.o+|
|.           .+=o+|
+-----------------+
```

上記の2、3、4行目で、以下のことが聞かれています。
2行目：鍵ファイルを保存するフォルダの名前
3行目：パスフレーズ
4行目：パスフレーズ (確認)

パスフレーズは任意なので、これらは全てEnterでOKです。

<h2>4. ~/.sshの中身を確認する</h2>

下記コマンドで鍵が作成されているか確認できます。

```:ターミナル
$ls ~/.ssh
```

すると次のような2つのファイルが作成されているのが確認できます。（先程、名前を設定していればそれが表示されます）

```:ターミナル
 id_rsa    id_rsa.pub
```
　
```id_rsa```：秘密鍵ファイル
```id_rsa.pub```：公開鍵ファイル

下記コマンドで作成した公開鍵の内容を確認できます。

```:ターミナル
$cat ~/.ssh/id_rsa.pub
```
【超初心者向け】「変数は何のために使う？？」2分で理解

今回は、<b>変数は何で使うのか</b>という理由を書かせていただきます！

<b>前回の記事：</b>
<b>[変数とは何か？？](https://qiita.com/laravel_daichi/items/19b4c4a8bdea1eee346c)</b>

今回の記事を読む前に<b>[変数とは何か？？](https://qiita.com/laravel_daichi/items/19b4c4a8bdea1eee346c)</b>を読んだ後の方が理解がしやすいと思います。
***
###では、初めていきます！
↓
##変数は何ために使うのか？
答えは、
###また使いたい時に再利用ができるからです！！

例えば、

毎月の水を30本ECサイトで買っているとすると、毎月水を検索して買うのはとても面倒だと思います！

その際にその<b>水30本</b>をすぐに見つけられる様に<b>欲しいものリスト</b>に入れておくといつでもすぐに見つけることが可能になります！

<font color='red'>変数は欲しいものリストに商品を入れて置くのと一緒ということになります！</font>

<b>・変数という箱にデータを入れる</b>
<b>・欲しいものリストという箱に欲しい商品のデータを入れて置く</b>

こうすることにより、いつでもデータを使うのが簡単になります！


##終わりに
今回は、変数は何のために使うかについて書かせていただきました！
読んでもらえると、とても嬉しいです！
PythonのPytestでTDDするときimportがエラーになる

# あらすじ

Pytestを使っていて気が付いたことです。
これは入門者泣かせですね。

どこのPythonを使うのかっていう指定があっちこっち散乱しているという悪夢。

# 別なのかよ

`F5`デバッグや、`Debug test`では正常にインポートされますが、`Run test`すると下記のエラーが出ました。

```
E ModuleNotFoundError: No module named `??????????`
```

Pythonでは、`import`するときの Base Directory として、`sys.path`内にリストされたアドレスを使います。

Pylintや`F5`デバッグ、`Debug test`では、`settings.json`の`python.envFile`内に記述した、`PYTHONPATH=./`が Base Directory です。

ところが`Run test`では、Base Directory を決める際に、実行するテストのあるディレクトリから上に向かって検索し、`__init__.py`が無い最初のディレクトリを Base Directory として登録するようです。

Note: [Good Integration Practices](https://docs.pytest.org/en/latest/goodpractices.html#test-package-name)

上記リンク切れです。2021/04/12→[**ここ**](https://docs.pytest.org/en/latest/explanation/goodpractices.html#test-package-name)

> The src directory layout is still strongly recommended however.

「src - tests」スタイルのディレクトリ構成がものすごくオススメされています。

# 環境

```json-doc:.vscode/extensions.json
{
	"recommendations": [
		"ms-python.python",
		"visualstudioexptteam.vscodeintellicode",
		"oderwat.indent-rainbow",
		"kameshkotwani.google-search"
	]
}
```

```json-doc:.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "env": {"PYTHONPATH":"./"},
            "justMyCode": true
        }
    ]
}
```

```json-doc:.vscode/settings.json
{
    "python.testing.pytestEnabled": true,
    "python.formatting.provider": "black",
    "python.envFile": "${workspaceFolder}/.env",
}
```

**Excelsior!**
STM32F103C8とOLED、OLED096UNO-Aで12345678を表示(16x24)


x mbedが使える人が対象
x SSD1306_128x64_I2Cライブラリインストール済
x 注意　説明を大幅に省略

1.mbedでstm32f103c8をコンパイル出来るようにする。
2.新規プログラムを開く
3.下記のソースを書く。
4.oledのライブラリをインストールする。
Dai YokotaさんのSSD1306_128x64_I2Cライブラリを使用した。
https://os.mbed.com/users/jk1lot/code/SSD1306_128x64_I2C/file/46dcbaa430f4/SSD1306.h/

忙しい人よう
https://os.mbed.com/users/caa45040/code/oled_helloworld_16x24_103_1/

工夫点
8x8を16*24にした　数字のみ


```c++


#include "mbed.h"
#include "SSD1306.h"

#define ADDR     (0x3c<<1) //  address
//#define ADDR     (0x3d<<1) //  address

//I2C i2c(I2C_SDA, I2C_SCL);
I2C i2c(PB_7, PB_6); // STM32F103C8

// Host PC Communication channels
//Serial pc(USBTX, USBRX); // tx, rx
Serial pc(PA_9, PA_10); // tx, rx 103

// Instantiate OLED
SSD1306 oled(i2c, ADDR);

int ii; //ループカウンター
int nn; //文字カウンター

int main() {       
    pc.baud(9600);    
    //oled.writeString(0, 0, "Hello World !");  
    
    
    char n1_8[] = "12345678";
    
    ii=0;
    for(nn=0;nn<8;nn++){
        //                y   x
        oled.writeBigChar(0, ii*16,n1_8[nn]);
        ii = ii + 1;
    } //for
    pc.printf("Printed something\r");    
    while(1){}
}



```

![103_mbed_oled_hloo24_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/becb74c7-ea6e-04dc-0157-eb38ffd5e3db.jpeg)
Python3 for Programming contest (Algorithm)

#Contents
1. [Enviroment](#Environment)
2. [Input(Int)](#anchor2)
3. [Input(String)](#anchor3)

# Enviroment
<a id="anchor1"></a>
```terminal:terminal
$ python3 --version
Python 3.7.6
```

# Input(Int)
<a id="anchor2"></a>
> input:
> > $n,m,l$
> > $x_1$
> > $x_2$
> > ...
> > $x_n$
> > $a_{1_1}\;a_{1_2}\;...\;a_{1_{x_1}}$
> > $a_{2_1}\;a_{2_2}\;.........\;a_{2_{x_2}}$
> > ...
> > $a_{n_1}\;a_{n_2}\;...\;a_{n_{x_n}}$

```python:sample0.py
n,m,l=map(int, input().split())
x=[int(input()) for _ in range(n)]
a=[list(map(int,input().split())) for _ in range(n)]

print('---------------------------')
print(n,m,l)
print(x)
print(a)
print('a_{1_1} is '+str(a[0][0]))
print('a_{1_{x_1}} is '+ str(a[0][x[0]-1]))

# a[i-1][j-1] = a_{i_j}
```
```terminal:terminal
$ python3 sample0.py
3 7 100
4
9
3
10 30 50 70
2 4 6 8 10 12 14 16 18
-19 -37 0
---------------------------
3 7 100
[4, 9, 3]
[[10, 30, 50, 70], [2, 4, 6, 8, 10, 12, 14, 16, 18], [-19, -37, 0]]
a_{1_1} is 10
a_{1_{x_1}} is 70
```
#Input(String)
> input:
> > $n$
> > $x_1$
> > $x_2$
> > ...
> > $x_n$
> > $s_1$ ( $x_1$ characters )
> > $s_2$ ( $x_2$ characters )
> > ...
> > $s_n$ ( $x_n$ characters )

> output:
> > $s_1$
($x_1$'thcharacter is converted to a big size,if it is small. it is converted to small, if not )
> > $s_2$( $x_2$'th character is converted to number of m)
> > ...
> > $s_n$( $x_n$th character is converted to ...)

```python:sample1.py
n=int(input())
x=[list(input()) for _ in range(n)]
'''
Python3:
 str object does not support item assignment.
 Therfore, we should use list, not just input().
'''
s=[int(input()) for _ in range(n)]
for i in range(n):
    m=s[i]-1
    if i%2==0:
        if x[i][m].isupper():
            x[i][m]=x[i][m].upper()
        elif x[i][m].islower():
            x[i][m]=x[i][m].upper()
    else:
        x[i][m]=str(m+1)
    
    for j in range(len(x[i])):
        if j!=len(x[i])-1:
            print(x[i][j],end='')
        else:
            print(x[i][j])

```
[Laravel] CircleCIにphp-gdをインストールする

#概要
CircleCIでテストを自動化している際に画像関連のテストで以下のエラーで引っかかってしまいました。

```
Error: Call to undefined function imagecreatetruecolor()

/home/circleci/ci-demo/backend/vendor/laravel/framework/src/Illuminate/Http/Testing/FileFactory.php:75
/home/circleci/ci-demo/backend/vendor/laravel/framework/src/Illuminate/Support/helpers.php:263
/home/circleci/ci-demo/backend/vendor/laravel/framework/src/Illuminate/Http/Testing/FileFactory.php:87
/home/circleci/ci-demo/backend/vendor/laravel/framework/src/Illuminate/Http/Testing/FileFactory.php:58
```

画像処理系のライブラリであるphp-gdがCircleCIイメージにインストールされていないために起こったエラーみたいです。

忘れないようにメモします。

#環境
CircleCI 2.1
Laravel 8.12
PHP 7.3

#実装

```.circleci/config.yml
version: 2.1
jobs:
  build:
    docker:
      - image: circleci/php:7.3.0-node-browsers
      - image: circleci/mysql:8.0.0
        command: mysqld --default-authentication-plugin=mysql_native_password
    environment:
      - DB_CONNECTION: circle_testing
      - APP_ENV: testing
      - MYSQL_ALLOW_EMPTY_PASSWORD: true
      - MYSQL_ROOT_HOST: '%'
      - MYSQL_DATABASE: circle_test
    working_directory: ~/ci-demo
    steps:
      - checkout
      - run: 
          name: Update apt-get
          command: sudo apt-get update
　　　//ここで追加
      - run:   
          name: Install php-gd
          command: |
            sudo apt-get -y install libpng-dev  
            sudo docker-php-ext-install  gd 
      - run:
          name: Docker php extensions install
          command: sudo docker-php-ext-install pdo_mysql
      - run:
          name: Wait for DB
          command: dockerize -wait tcp://127.0.0.1:3306 -timeout 3m 
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "backend/composer.json" }}
            - v1-dependencies-
      - run:
          working_directory: backend
          name: Install PHP libraries
          command: composer install -n --prefer-dist
      - save_cache:
          paths:
            - ./vendor
          key: v1-dependencies-{{ checksum "backend/composer.json" }}
      - run:
          working_directory: backend
          command: composer install
      - run:
          working_directory: backend
          command: php artisan migrate
      - run:
          working_directory: backend
          name: Run PHPUnit
          command: ./vendor/bin/phpunit

```

```.circleci/config.yml
      - run:
          name: Install php-gd
          command: |
            sudo apt-get -y install libpng-dev
            sudo docker-php-ext-install  gd
```
Visual Studio for Mac を 8.9 にアップデートして Apple SDK が見つからなくなった時

Visual Studio for Mac を 8.9 にアップデートすると、/Library/Developer/CommandLineTools に Apple SDK が見つからないというメッセージがでて、コンパイルができなくなることがあります。

その際は、Xcode のパスである /Application/Xcode.app/ を指定すると正常にコンパイルできるようになりました。

![スクリーンショット 2021-03-06 20.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177616/46f6330e-b7ae-f795-5ff6-bdf0b82df651.png)

これが正規の設定かどうか分かりませんが、ひとまず問題を回避できます。

参考にしたサイト：
[Visual Studio for Mac: No SDK found at specified location.](https://docs.microsoft.com/en-us/answers/questions/296951/visual-studio-for-mac-no-sdk-found-at-specified-lo.html)
gem ffi 1.14.2　エラーの解決方法　そのn番目


## この記事について
`bundle install`実行時に`ffi 1.14.2`のところでこけてしまう。

## 環境
- Mac Catalina
- ruby 2.6.3
- rails 6.0.3


## エラー内容

```ruby
Fetching ffi 1.14.2
Installing ffi 1.14.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/Users/ketchamash/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/ffi-1.14.2/ext/ffi_c
/Users/ketchamash/.rbenv/versions/2.6.3/bin/ruby -I
/Users/ketchamash/.rbenv/versions/2.6.3/lib/ruby/2.6.0 -r ./siteconf20210306-53720-1m14ww7.rb
extconf.rb
checking for ffi_prep_closure_loc() in -lffi... yes
checking for ffi_prep_cif_var()... yes
checking for ffi_raw_call()... yes
checking for ffi_prep_raw_closure()... yes
creating extconf.h
creating Makefile

current directory:
/Users/ketchamash/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/ffi-1.14.2/ext/ffi_c
make "DESTDIR=" clean

current directory:
/Users/ketchamash/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/ffi-1.14.2/ext/ffi_c
make "DESTDIR="
compiling AbstractMemory.c
compiling ArrayType.c
compiling Buffer.c
compiling Call.c
compiling ClosurePool.c
compiling DynamicLibrary.c
compiling Function.c
Function.c:847:17: error: implicit declaration of function 'ffi_prep_closure_loc' is invalid in
C99 [-Werror,-Wimplicit-function-declaration]
ffiStatus = ffi_prep_closure_loc(closure->pcl, &fnInfo->ffi_cif, callback_invoke, closure,
code);
                ^
Function.c:847:17: note: did you mean 'ffi_prep_closure'?
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/ffi/ffi.h:269:1: note:
'ffi_prep_closure' declared here
ffi_prep_closure(
^
1 error generated.
make: *** [Function.o] Error 1

make failed, exit code 2

なんやかんや

An error occurred while installing ffi (1.14.2), and Bundler cannot continue.
Make sure that `gem install ffi -v '1.14.2' --source 'https://rubygems.org/'` succeeds before
bundling.

In Gemfile:
  spring-watcher-listen was resolved to 2.0.1, which depends on
    listen was resolved to 3.4.1, which depends on
      rb-inotify was resolved to 0.10.1, which depends on
        ffi
```


## 解決のために試したこと

1.`gem install ffi -v '1.14.2`を実行

2.Qiitaで参考にさせて頂いた記事
  自分の場合、こちらでは解決できませんでした。 

https://qiita.com/NaokiIshimura/items/f24091d31d4788295b12



## 解決できた参考ページ

https://blog.toshima.ru/2020/12/29/new-ffi-build-error-macos.html


gemのインストール時に`--disable-system-libffi`オプションをつけて実行するとインストールできた。

```ruby
 gem install ffi -- --disable-system-libffi
```


## 解決できた理由？
https://github.com/ffi/ffi#requirements

libffiライブラリが上手く使うためのオプションなのかな？