OmniAICreator/Qiita-1.07M huggingface dataset:
TCP/UDPってなんだ？？？(初心者向けざっくり)

#はじめに
就活してて面接で「TCPとUDPの違いを詳しく説明してください」って言われて正確に説明できなかったのが、悔しかったので復習してみます（#^ω^）

正確に解説しているサイトは他にもいっぱいあるので、ざっくりとした解説を心がけています。
より詳しく知りたい方はこの記事を読んだ後に、他の記事や教科書を読んで理解を深めてください～

#ちょーざっくり

||TCP|UDP|
|---|---|---|
|ヘッダ長|長い|短い|
|機能|多い|少ない|
|伝送速度|遅い|速い|
|PRポイント|**うちは高品質なデータ伝送が売りです**(ﾒｶﾞﾈｸｲｯ|**業界最速でぇ！！！**|
#そもそも
TCP/UDPってなんぞやって言うと、トランスポート層のプロトコルです。
![ositcpip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/35a812e3-e630-c21c-09a4-43be786b8f78.png)
(参考[[1]](#参考文献))
パケットの宛先(IPアドレス)の指定はネットワーク層のプロトコル
がやってくれるのですが、データの配送に関して**品質を保証する方法を指定**するのが、トランスポート層のプロトコルの役割です。
あとは宛先ポートの指定によって、**パケットを届ける先のサービスを指定**します。

#もっとくわしく
TCPとUDPの違いを正確に理解したい方は、以下の点に着目するといいと思います。(これが説明できればトランスポートマスター！)

**・ヘッダの中身
・コネクション方式
・TCPの機能
・TCP/UDP上でそれぞれ動くプロトコル**

だけども、今回はTCPとUDPのコアな違いに着目してコネクション方式のみ解説します。

##コネクション方式
UDPはデータを送って終わり(コネクションレス)ですが、TCPは確実に伝送するために、コネクションを確立してデータを送ります。
具体的に言うと、
**①通信の開始の合意をとる
②データが受信できたか確認する
③通信の終了の合意をとる**
といった動作を行います。

###①通信開始の合意
いわゆるスリーウェイハンドシェイクという動作を行います。
TCPではデータのやり取りを開始する前に必ず行います。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/672e6090-102b-4374-df43-fccf212c9c03.png)

###②データ受信の確認
データが届くごとに相手に受け取ったことを示すパケットを送ります。
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/5a4616de-4da6-3534-f5f8-7c0a5f08e66e.png)

###③通信終了の合意
切断時は4回のやりとりをします。(スリーウェイハンドシェイクと同様に3回で済ませる場合もあるらしい)
(なんで4回なのかわからなかったので、知っている方教えてください……)

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/601781f5-b9ab-fba8-8776-4bca536878fa.png)




#さいごに
以上！！！
通信プロトコルとかを正確に理解したいなら[マスタリングTCP/IPの入門編](https://www.amazon.co.jp/dp/B0827QNDNT)買うことおすすめです！！！！

ちなみに、最近だとQUICとかいうTCPとUDPの良いとこどりみたいなプロトコルも出てきてるので要注目です！

読んでいただきありがとうございましたm(_ _)m


#参考文献
[1]けんのへや、『[OSI参照モデルとTCP／IPについて](https://ansl-blog.hatenablog.com/entry/2019/05/22/OSI%E5%8F%82%E7%85%A7%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8TCP%EF%BC%8FIP%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)』
移動平均・分散を逐次的に算出するアルゴリズム

こんにちは！データサイエンティストのじゃむです。
本日は、時系列データで使用する移動平均と移動分散を逐次的に求めるアルゴリズムの紹介です。

## 問題設定
長さTの時系列データX=(X_t)_{t=1,・・・,T}に対して、k項移動平均と移動分散を逐次的に求めることを考えます。

たとえば、X=[1,2,3,4,5]、k=2として、
移動平均 = [1.5, 2.5, 3.5, 4.5]
移動分散 = [0.25, 0.25, 0.25, 0.25]
をどうやったら効率よく算出できるかを考えます。

## 単純な方法
たとえば先ほどの例でX=[1,2,3,4,5]の2項移動平均を愚直に求めるとすると
(1+2)/2 = 1.5, (2+3)/2 =2.5 ・・・

同じように、2項移動分散を求めると、
((1-1.5)^2 + (2-1.5)^2)/2 = 0.25, ((2-2.5)^2 + (3-2.5)^2)/2 = 0.25, ・・・
となります。

一般的には、j番目のk項移動平均 $m_j$ と移動分散 $v_j$ は次のようにかけます。(j=0,1,2,・・・, T-1)
$$ m_j = \frac{1}{k}\sum_{i=j}^{j+k-1} X_i $$
$$ v_j = \frac{1}{k}\sum_{i=j}^{j+k-1} (X_i-m_i)^2 $$

このままでは、計算量が高々O(T*k)になるので、今回のアルゴリズムでは、毎回Σ計算をせずに計算量がO(T)となるように工夫します。

## なにをするか
０番目のk項移動平均の計算は、
$$ m_0 = \frac{1}{k}\sum_{i=0}^{k-1} X_i $$
ですが、1番目の移動平均を計算するときに、0番目の移動平均を使うことを考えます。1番目の移動平均を計算するためには、$X_1$から$X_k$までの合計値が必要です。これは$X_0$から$X_{k-1}$までの合計値から、$X_k$を足して、$X_0$を引いたものと考えれば、 $X_1$ から $X_k$ までの合計値は $m_0k - X_0 + X_{k}$ と算出することができます。よってΣの計算をせずに各移動平均は、O(1)で求められ、$i$番目のk項移動平均は次のように逐次的に求められます。
$$m_i = m_{i-1} - \frac{X_{i-1} - X_{i+k-1}}{k}$$

次に、移動分散ですがこれは少々厄介で、次の分散公式が必要です。
$$\frac{1}{n}\sum_{i=1}^{n} (X[i]- m)^2 = \frac{1}{n}\sum_{i=1}^{n} X^2[i] - m^2 $$

ここで、$m$ は$X$ の平均です。これを使って、$v_j$ を書き換えると、
$$ v_j = \frac{1}{k}\sum_{i=j}^{j+k-1} (X[i]-m_i)^2 = \frac{1}{k}\sum_{i=j}^{j+k-1} X^2[i] -m^2_i$$

になります。移動平均と同じように$v_0$を求めると、上記の式から
$$ v_0 = \frac{1}{k}\sum_{i=0}^{k-1} X^2[i] -m^2_0$$

$v_1$を求めるには、$X_1$から$X_k$までの二乗和が必要ですが、移動平均と同じようにすれば、$X_0$から$X_{k-1}$までの二乗和から、$X_k$の二乗を足して、$X_0$の二乗を引けばよいです。よって、$X_1$から$X_k$までの二乗和は$k(v_0+m^2_0) + X^2_k - X^2_0$ になります。よって、分散公式から、$v_1$は、
$$ v_1 = (v_0+m^2_0) + \frac{X^2_k - X^2_0}{k} - m^2_{1} $$

と算出できます。よってΣの計算をせずに各移動分散は、O(1)で求められ、$i$番目のk項移動分散は次のように逐次的に求められます。

$$ v_i = (v_{i-1}+m^2_{i-1}) + \frac{X^2_{i+k-1} - X^2_{i-1}}{k} - m^2_{i} $$

## ソースコード
pythonで実装すると、次のようになります。

```python
import numpy as np
def calc_moving_kth_average_and_variance(x_array, k):
    m_init = np.mean(x_array[:k]); mean_list = [m_init] #平均の初期値
    v_init = np.var(x_array[:k]); var_list = [v_init] #分散の初期値
    for i in range(len(x_array)-k): # 更新式
        mean_list.append(mean_list[-1] + (-x_array[i] +x_array[i+k])/k)
        var_list.append(var_list[-1]+mean_list[-2]**2 +(x_array[i+k]**2 - x_array[i]**2)/k  -mean_list[-1]**2)
    return mean_list, var_list
```
【Unity】Sprite Resolverで2Dアニメーション

使用したUnityのバージョン：2021.1.16f1
2D Animationパッケージ：6.0.4
#Affinity Designerでキャラクターを作る
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1772485/4f4640cb-c589-c691-93e7-ecfd40a09f1c.png)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1772485/e45cc088-83ab-8a59-cc37-447de0fcff78.png)
部品ごとにグループ分けし、名前を付けます。
ボーンを使う場合はボーンの名前と被りがちなので、グループ名の先頭にアンダーバーをつけるなどして区別します。
今回は目の部分を差し替えるアニメーションを作成したいと思います。
これをPSD形式で書き出し、拡張子を.psbに変更します。
#Unityにインポート
作ったpsbファイルをUnityにインポートし、インポートしたアセットをシーンにドロップします。
差し替えるスプライトの表示したくないバリエーションは、Hierarchyで非アクティブ化しておきます。
ボーンを使う場合は、ボーンを動かしたときに差し替えるスプライトがズレないように、スプライトをボーンに追従するようにしておきましょう。
#Sprite Library Assetsを作成
Assetsフォルダに2D->Sprite Library Assetsを作成します。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1772485/bc7738bb-25f9-b455-a11f-f3277029a724.png)
Category名を設定し、Entryを追加してSelectボタンを押し、差し替えるスプライトを設定していきます。
キャラクターに2D Animation->Sprite Libraryコンポーネントを追加し、このSprite Library Assetを設定します。
#Animatorを追加
キャラクターにMiscellaneous->Animatorでコンポーネントを追加します。
次にAssetsフォルダにAnimator Controllerを作成し、AnimatorコンポーネントのControllerに設定します。
#Sprite Resolverを追加
Hierarchyで差し替えたい目のスプライトを選択し、2D Animation->Sprite Resolverコンポーネントを追加し、Categoryに先ほど作成したSprite LibraryのCategoryを設定します。
これでLabelを変更すればスプライトが差し変わるようになったと思います。
#アニメーションさせる
Animationウインドウで新規Animationを作成します。
Animationウインドウでレコードモードにして、Sprite ResolverのLabelを変更しながらキーフレームを作ります。
しかしこのままでは動かないので、キーフレームを選択し、右クリックでBoth Tangents->Constantに設定しましょう。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1772485/c399bbaf-5f73-a30b-3291-e4c98ee387bc.png)

![05.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1772485/2cd0c0a3-1bf8-519e-d6f5-78510478db34.gif)
PHP 基本文法学んでみた

<h1>PHP基本文法

僕はRubyをやっていたのでPHPの基本文法はだいぶハードルが低かったです。
早速やっていきましょう！！

PHPとはスクリプト言語でありシンプルな記述だけど大規模アプリケーションの開発ができる。
フレームワークの例として、Laravel（ララベル）、CakePHP（ケイクピーエイチピー）、Zend（ゼンド）などがある。

<strong>プログラムの基本構造は3つ！！
1.順次進行　　上から順に処理
2.条件分岐　　if文などでほにゃららの場合これこれの処理を行う..など
3.繰り返し       for文などで◯回繰り返しす処理だど

・・・Rubyとかと考え方はおんなじだね~~やったぜ👍

<?php」で始まり「?>」で終わる
終わりの「?>」は省略可能!
「\n」は改行という意味。
Echoで文字列や変数の中身を参照！！
処理の終わりのセミコロンのは注意ですな＾＾　Rubyはいらないからね
こういう記述の仕方は何回かやってけば覚えるもんだから大丈夫かな
php Greeting.php　←このコマンドで実行！！
![Good morning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/09641895-dd2e-f977-2a57-eab2b98509ab.png)


<h2>変数</h2>
変数は、例えるなら、「箱」。
変数があることで、文字や数字などのデータを変数に入れておける。
また、変数は、必要な時に取り出すことができます。
変数にデータを入れることを「代入」といい、取り出すことを「参照」。
変数には名前をつけることができ、変数名という。
変数を作ることを「変数を宣言する」という。

これもRubyでやったからOK👍
ただドルマークで始まるってことは注意!
![echo $num;.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/9d328e9f-61dc-d4f7-daa1-f13df1be7a1c.png)
￼
<h2>データ型</h2>
gettype()でデータ型を確認できる。
PHPのプール型がちょいと特殊
RubyであればTrueかFalseどちらか1つを持つ型だけど、
Trueのときは「1」が代入され、Falseのときは何も代入されない。
![$num02 = 1.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/208f2420-1c70-3f8d-1490-7fb1d2ec1c6d.png)
￼

<h2>配列</h2>
箱に複数のデータを格納できるデータ型。
インデックスという番号が振り分けれている。
これもRubyでやったからOK👍
書き方１　変数 =array(要素数); ←(　)に直でデータを書くこともできる。
![$name = array(3);.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/788d8334-f1c9-e47a-d7d5-03792de27db1.png)
書き方２　変数=[ データ ];
![suzuki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/8d63d89f-b8a6-d3a9-2645-6a5c49781806.png)
￼
<h2>条件分岐</h2>
if (条件A) {
  条件Aを満たした場合の処理
} else if(条件B) {
  条件Bを満たした場合の処理
} else{
  条件を満たさなかった場合の処理 }
![!-- 1YWD-RS-OBEA --.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/622271ec-bc87-35c6-f6f2-9c1549fa220b.png)
￼
￼
<h2>繰り返し処理 For文</h2>
continueでスキップ
Breakで処理の終了
for(スタート値; 繰り返しの回数；インクリメント；){処理内容}
![for($i = 1; $1 = 10; $1 ++) 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/7c54023d-9039-4629-5ceb-f6be6cbf137a.png)
￼
<h2>関数</h2>
処理のこと。関数を宣言するメリットは3つ。
1.同じものを2回書く必要がなくなること。
2.同じものを他の場面でも使えること。
3.他の人も使うことができること。
function 関数名( ) {
実行する処理
}　←JSと一緒の書き方だからOK👍
クラス
 クラス＝データと処理をまとめたもの。
インスタンス＝実体

クラスが車の設計図だとしたら、インスタンスはベンツやプリウスなど車本体。
プロパティ=クラス内のデータのこと
メソッド＝クラス内の処理のこと

プロパティにはアクセス修飾子をつける必要があります。
public=どこからでもアクセス可能です。
protected=クラス自身、継承したクラス、親クラスからのみアクセスできます。
private=同じクラスの中でのみアクセス可能です。
￼![K!-- 4HEOTDOEU LFOTH --.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/8ef0859c-c3b0-6a64-3a4f-c2ee64febae9.png)
￼
GitLabで日付表示が相対時間だったのが、年月日表示もできるようになった話

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

とあるGitLabプロジェクトのリポジトリです。
最終更新のところが現在からの相対時間になっています。
この表示は悪くないのですが、「ちょっとな～」と思っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/ce2a1687-856e-b62d-361e-82c611da90a4.png)

しかし、14.1で「年月日」表示ができるようになりました。

User setting to display absolute times | GitLab
https://about.gitlab.com/releases/2021/07/22/gitlab-14-1-released/#user-setting-to-display-absolute-times


# 1. 設定

以下のURLまたは、GitLabログイン後の右の「アバター」＞「Preferences」を選択

https://＜GitLabサーバー＞/-/profile/preferences

以下の画面の「相対時間を使用」のチェックボックスを外す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/c970f68f-bc54-95fa-b79a-e437cdc7ff83.png)


# 2. 確認

「年月日」表示になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/dce5482e-d92d-a4be-418f-63dc809a7fa7.png)
ソフトウェアエンジニアのための中国語

**!!! 書き途中 !!!**

とりあえずApacheCon Asiaに参加していて思いついたので自分の勉強用に集めはじめてみた。随時更新予定。
https://apachecon.com/acasia2021/

## IT用語

- 电脑 = コンピューター
- 程序 = プログラム
- 程序设计 = プログラミング
- 软件 = ソフトウェア
- 硬件 = ハードウェア
- 用户 = ユーザー
- 界面 = インタフェース
- 联网 = ネットワーク / インターネット
- 物联网 = IoT
- 数据 = データ
- 大数据 = ビッグデータ
- 开源 = オープンソース
- 测试 = テスト
- 服务 = サービス
- 微服务 = マイクロサービス
- 端到端 = エンドツーエンド
- 模式 = モデル

### ネットワーク

- 服务商 = サービスプロバイダー
- 带宽 = 帯域幅

## 一般用語

- 信息 = 情報
- 技术 = テクノロジー
- 创新 = 革新 / イノベーション
- 工业 = 工業 / インダストリー
- 行业 = 業界
- 术语 = 用語
- 录播 = レコーディング
- 工具 = ツール
- 海量 = 大規模
- 优化 = 最適化
- 流程 = プロセス
kintoneの標準機能で対数を求める #2

[前回](https://qiita.com/juri_don/private/0531ff025b57cca95cb8)はkintoneの標準機能で自然対数を求めてみました。

ただ、前回の内容だと底は$ e $限定、真数$ X $は$ 0<X\leqq2 $の範囲にしか対応していないので、
もっと自由度を高めたいところです。

というわけで、まずは真数$ X $の範囲をできるだけ大きくできるように工夫したいと思います。

# 真数Xを大きくする方針

$ log_eX $において$ X = x^n $ とおくと、
$ log_eX = log_ex^n = nlog_ex $ となります。

$ x = X^\frac{1}{n} $ なので、真数$ X $を$ \frac{1}{n} $ 乗した数 $ x (x > 0) $ を真数とする $ log_ex$ を求めて $ n $ 倍すれば、
進数 $ X>2 $ の自然対数を求めることができるはず。

というわけで、

1.　Xのn乗根（$ X $ の $ \frac{1}{n} $ 乗)を求めるアプリ（今回）
2.　真数 $ X>2 $ の自然対数 $ lnX $  を求めるアプリ
3.　$ log_aX $ を求めるアプリ

の順に作っていきます。
今回は**Xのn乗根を求めるアプリ**を作成します。

# Xのn乗根を求めるアプリ

kintoneの数式には整数でべき乗する演算子はありますが、$ \frac{1}{n} $ 乗（ $ n $ は整数）できる演算子がありません。
なので、計算フィールドを使ってちょっと工夫して計算する必要があります。
理屈はいいやって方は「[アプリを作る](#アプリを作る)」まで飛ばしてね。

## ニュートン法でn乗根を求める
ニュートン法については
[kintoneのアプリでニュートン法で平方根を求める方法](https://qiita.com/juri_don/items/dd7b2d6ab4fb045990b6#%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E6%B3%95%E3%81%A8%E3%81%AF)についての過去記事でちょっと説明しました。

今回は平方根ではなくて、n乗根です。とはいえ、そんなに方法は変わらないので、
上記記事の式③を利用して計算したいと思います。
※元の式のnは「n番目」のnですが、n乗根のnとの混同を防ぐためkに変えてみました。

```math
 f'(x_k) = \frac{f(x_k)}{x_k-x_{k+1}} ・・・・③
```

$ X $ のn乗根を求めたいので、$ f(x) = x^n - X = 0 $ の解を求めるとします。

```math
\ f(x) = x^n - X\\
\ f'(x) = nx^{n-1} \\
```

より、③の式に代入すると $ x_{k+1} $ と $ x_k $ の関係は

```math
\begin{align}
 nx_k^{n-1} &= \frac{x_k^n - X}{x_k-x_{k+1}}\\
 x_k-x_{k+1} &=\frac{x_k^n - X}{nx_k^{n-1}}\\

 x_{k+1} &=\frac{-x_k^n + X}{nx_k^{n-1}} + x_k\\
よって、\\
x_{k+1}&=\frac{n-1}{n}x_k + \frac{X}{nx_k^{n-1}}
\end{align}

```
となります。

これをアプリの数式に入れていきます。


# アプリを作る

## アプリを作る準備

アプリの設定で、その他の設定→高度な設定の
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/446c184b-81de-17ef-6627-adc3112da296.png)

数値と計算の精度の桁数は
全体の桁数：30
小数部の桁数：10
にしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/00d88d15-df43-2590-5aa5-b0dee79c1386.png)

## フィールドの設定

フィールド数も多くて、ちょっと大変です。
x1～x41は 20個くらいでも良いかもしれないです。

アプリ名は**Xのn乗根(ニュートン法)**としておきましょう。
※後でルックアップしてくるときに使います。

| フィールド種類| フィールド名 | フィールドコード|数式 | 備考 |
|:-:|:-:|:-:|:-:|:-:|
| 数値  | X  |  X ||  n乗根を求めたい値 |
| 数値  | n  |  n || 何乗根にしたいか。デフォルト10  |
| 計算  | n乗根（≧0） | x41  |((n-1)/n)*x40+X/(n*x40^(n-1))| 数値は$ x_k $ の$ k $の値。41回目で収束とする。 |
|数値| 初期値   |x0 |  | 初期値2にしてみました。  |
|  計算 |   x1|  x1 | ((n-1)/n)*x0+X/(n*x0^(n-1))  ||
|  計算|  x2 |  x2|  ((n-1)/n)*x1+X/(n*x1^(n-1)) ||
|  計算|  xk|  xk|((n-1)/n)*xk+X/(n*xk^(n-1)) |x3～x39はkに番号入れてね|
|  計算|  x40|x40|  ((n-1)/n)*x40+X/(n*x40^(n-1)) ||

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/8673b348-9308-4b51-a8d5-29eea8fd12c5.png)

# できあがり

こんな感じで計算します。

<iframe width="480" height="360" src="https://www.youtube.com/embed/BxcXkGvgsIY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
ログで関数に会話させたら jQuery の Deferred が分かった

# はじめに
非同期通信をやろうと思ている人。
私と同じように非同期通信を関数化しようとしてこけた人。
もしかしたら少しわかるようになるかもしれません。

[>動機を飛ばして本題へ<](#会話させてみた)

# 動機
普段開発では Django を使っており、テンプレートエンジンが優秀？便利？なのでそれに頼ってフロントエンドを作成していた。
そんなある日、ボタン操作で毎回画面をロードするのは恥ずかしく、逐一データ取得をしたいので Ajax に手を出さなければならなくなった。
せっかく作るなら、関数化させて処理を分かりやすくさせてみよう！と思ったのもつかの間、Ajax からの返り値が取れない。。。
どうやら Deferred さんを使わなければならないようだ。
私の足りない脳みそを補うためにコンソールログで会話してもらった。

# 会話させてみた

## スクリプト
``` kaiwa.js
function getDataWithAjax() {
    console.log("A:お約束作成するね");
    var d = $.Deferred();
    $.ajax({
        'url': "/hoge",
        'type': 'GET',
        'dataType': 'json',
    }).done(function (data) {
        d.resolve(true));  // 説明のために返り値を bool にしています
        console.log("A:待っててくれてありがとう");
    }).fail(function () {
        d.reject(false);  // 説明のために返り値を bool にしています
        console.log("A:待っててくれてありがとう");
    })
    console.log("A:お先に返しておきます");
    return d.promise();
}

$(document).ready(function () {
    console.log("B:Ajaxよぶよ");
    $.when(getDataWithAjax()).done(function (data) {
        console.log("B:結果ありがとう");
        console.log("data:", data);
    }).fail(function (data) {
        console.log("B:結果ありがとう");
        console.log("B:でも失敗しちゃったね");
        console.log("data:", data);
    })

});
```

## 実行結果
### 成功時
```
B:Ajaxよぶよ
A:お約束作成するね
A:お先に返しておきます
A:待っててくれてありがとう
B:結果ありがとう
data: true
```

### 失敗時
※ URL を正しくないものに書き換えて実施

```
B:Ajaxよぶよ
A:お約束作成するね
A:お先に返しておきます
GET http://hoge.com/hogege 404 (Not Found)
A:待っててくれてありがとう
B:結果ありがとう
B:でも失敗しちゃったね
data: false
```

# おわりに
不慣れな分野なので間違っていたり、修正箇所、追加情報あればコメントいただけますと幸いです。

# 参考
https://qiita.com/yuku_t/items/3d1cf51d7ae91305eaaa
.DS_Storeファイルとは？

####.DS_Storeファイルってなに??
全てのフォルダにMacで自動生成されるようになっており、フォルダやファイルに関するmeta情報が格納されている。（フォルダ内のアイコンの位置や表示設定など)

.DS_Storeは隠しファイルであるため、通常の使い方であれば表示されることがありませんが、隠しファイルを表示している設定している場合がある。

####どう隠すか。
.gitignoreに記述してgitの管理から外す。

######.gitignoreとは。
Git の管理に含めないファイルを指定するためのファイル。


####-1  .gitignoreの作成

```
$ touch .gitignore
```

####-2   .gitignoreの記述

```
.gitignoreの記述
```

####-3 キャッシュの削除

```
$ git rm -r --cached .
```

####-4 push

```
$ git add .
$ git commit -m "create　.gitignore"
$ git push origin master
```

###参考記事
https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff

https://qiita.com/takashimelon/items/def769aaaa1d41cc44d4
jq入門

## jqとは？

コマンドラインでJSONを処理するツールです。curlと組み合わせると色々できます。

## インストール

### macOS

```shell
brew install jq
```

### Ubuntu

```shell
apt update
apt install jq
```

### Dockerfile

Visual Studio CodeのDev Containerとかで使う用です。

```dockerfile
RUN apt-get update && apt-get install -y \
  jq \
  && rm -rf /var/lib/apt/lists/*
```

### Windows

[Chocolatey NuGet](https://chocolatey.org/install#individual)入れてから、

```powershell
chocolatey install jq
```

あるいはバイナリをダウンロードしてPATH以下に設置します。

https://stedolan.github.io/jq/download/

多分Dev Container使った方がいいです。

## 使い方

### 手作業用

```shell
curl -fsSL 'https://httpbin.org/get?a=1&a=2&a=3' | jq
```

![jq-manual.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35580/b9117271-f698-ced5-3431-1d82a04652f2.png)

整形されて色がつきます。手作業ならこれで十分です。

### バッチ用

オプションに`-r`を加えます。とりあえずおまじないということにしておいて良いです。
これをつけると普通のシェルコマンドとの互換性がでます。forでループ回したりできます。

```shell
curl -fsSL 'https://httpbin.org/get?a=1&a=2&a=3' | jq -r '.args.a[]'
```

```
1
2
3
```

もちろん普通に配列の要素を取り出すこともできます。

```shell
curl -fsSL 'https://httpbin.org/get?a=1&a=2&a=3' | jq -r '.args.a[1]'
```

```
2
```

パターンの先頭にルートを示すドットが必要なことに注意が必要です。

## 結論

これ以上のことが必要な人は別の記事を参照してください。jq初心者卒業おめでとうございます。
- type must be a UCLASS, USTRUCT or UENUMで検索した人へ

#概要
TArray<FMyStruct>で上記のエラーが出てコンパイルが通らなかった場合の
正しい書き方が記事が日本語で出てこなかった上に英語ですら上位に出てこなかったので書く。

結論から言うと同じヘッダーファイルでFMyStructを宣言している場合、
TArray<FMyStruct>と書きたい箇所より前にFMyStructを宣言しておく必要がある。

C++がきちんと分かっている人からすると当たり前すぎることっぽいので文書になってなさそう。

#要はこういうこと
###こう書くとエラーになる

```c++:MystructA.h
STRUCT()
struct FMyStructA
{
	GENERATED_USTRUCT_BODY()
	TArray<FMyStructB> Structs;

};

USTRUCT()
struct FMyStructB 
{
	GENERATED_BODY()
};
```

###こう書けば良い

```c++:MyStructA.h
USTRUCT()
struct FMyStructB 
{
	GENERATED_BODY()
};

STRUCT()
struct FMyStructA
{
	GENERATED_USTRUCT_BODY()
	TArray<FMyStructB> Structs;

};
```
同期処理と非同期処理について

#はじめに
今回は[たった2日でマスターできるiPhoneアプリ開発集中講座](https://www.amazon.co.jp/SwiftUI%E5%AF%BE%E5%BF%9C-%E3%81%9F%E3%81%A3%E3%81%9F2%E6%97%A5%E3%81%A7%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%A7%E3%81%8D%E3%82%8BiPhone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E9%9B%86%E4%B8%AD%E8%AC%9B%E5%BA%A7-Xcode-iOS-14%E5%AF%BE%E5%BF%9C/dp/4802612788/ref=monarch_sidesheet)という書籍の中に、[お菓子の虜Web API](https://sysbird.jp/toriko/webapi/)を利用したお菓子検索アプリを作るセクションがあったので、練習として作成してみました。
その際に、同期処理と非同期処理というワードが出てきて少し混乱したので、初学者の自分がこれから勉強する方と自分に向けてまとめておきます。
![スクリーンショット 2021-08-06 10.54.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065057/cef98b3b-1cb7-1a3f-bc3f-9f8f661390f8.png)




#同期処理
同期処理とはプログラムに書いた処理を順番に実行していく方法です。
A,B,Cという処理がプログラムに記述されているとすると、Aが処理を完了するまではB,Cは処理の開始をせずに待機していなければいけません。
同期処理のメリットとしては、どの処理が実行されるのかが明確であることかなと思います。
デメリットとしては、実行中の処理が完了しないと、次の処理に移ることが出来ないため、利便性が低くなってしまいます。

#非同期処理
非同期処理は同期処理と対する概念で、ある処理が実行されている間に他の処理を止めないことを言います。
A,B,Cの処理がプログラムに記述されているとすると、Aが処理を完了するのを待たずに、B，Cは処理を開始できるので、利便性が高くなります。
非同期処理のメリットとしては、実行中の処理が完了していなくても次の処理に移ることが出来るので、ユーザーの操作を受付できることです。
別の処理は動いていますがユーザーは操作を継続できるので、アプリを快適に使用できることに繋がります。
デメリットとしては、処理が順番に実行されるわけではないため、全体で見るとどの処理が実行されているのかが把握しづらくなる可能性があります。

#同期処理と非同期処理の違い
専門用語を理解しやすくするためには、身近にあるもので説明することが良いと思っています。
今回は２つの概念を飲食店のオペレーションの流れで説明していきます。
この記事の下に参考にした記事を載せておきますので、詳しくはそちらをご覧ください。
図で説明してくれているので、かなり分かりやすいと思います。

##同期処理＝Subway
Subwayのオペレーションの流れとしては、お客さんは食べたいトッピングを店員さんに注文していきます。
注文を受けた店員さんはトッピングを１つずつにパンに載せていき、注文から会計まで店員さんがつきっきりで担当します。
注文をしたお客さんの対応が終わるまでは、次に並んでいるお客さんは待っていなければならないので、トッピングが多くなったり注文数が増えると待ち時間が長くなります。
ただ店員さんとしては並んでいる順番通りに対応していくので、お客さんの注文で混乱することがなく、商品の間違いが発生することもほとんどありません。
##非同期処理=マクドナルド
マクドナルドのオペレーションの流れとしては、お客さんが注文をすると店員さんは会計を先に済ませてから調理を始めます。
店員さんは調理をする人とレジで注文をするに担当が分かれていて、１人の店員さんが１人お客さんに最後までつきっきりで担当するとは限りません。
お客さんは注文した商品ができあがるまで、レジ横で受け取りを待ちます。
ただ、商品が出来上がった順に呼ばれるので、一番最初に注文したからといって一番最初に商品を受け取れるとは限りません。
なので、お客さんが待たされる時間がSubwayよりも短くなるというメリットがあります。
ただ店員さんとしては注文が一気にくるので新人さんであればどれから手を付けていけば良いのか混乱してしまい、商品の間違いが発生してしまうリスクがあります。

#まとめ
一応分かりやすくするために、同期処理のメリットも書きましたが、アプリではユーザーが快適に使用できるようにするために非同期での処理を行っていくことが多いようです。
なので、開発者はデータの流れをしっかりと理解してコードを書いていかないと可読性が下がり、アプリの運用が大変になるということです。

・同期処理はある処理の完了を待ってから次の処理を開始する
・非同期処理はある処理の完了を待たずに次の処理を開始する。
同期・非同期処理を理解する時にこの上の２つの処理の違いが大切なところなので、僕自身もこの違いを意識しながらアプリを作っていきたいと思います。

#参考リンク、書籍
- [非同期処理の概念について解説](https://h5y1m141.github.io/step-up-javascript/doc/understanding_javascript/async_01.html)
- [SwiftUI対応 たった2日でマスターできるiPhoneアプリ開発集中講座 Xcode 12/iOS 14対応](https://www.amazon.co.jp/SwiftUI%E5%AF%BE%E5%BF%9C-%E3%81%9F%E3%81%A3%E3%81%9F2%E6%97%A5%E3%81%A7%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%A7%E3%81%8D%E3%82%8BiPhone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E9%9B%86%E4%B8%AD%E8%AC%9B%E5%BA%A7-Xcode-iOS-14%E5%AF%BE%E5%BF%9C/dp/4802612788/ref=monarch_sidesheet)
GASでspreadsheetを操作するときのsetValueで注意する点

自分が昨日ハマってひどい目にあったので、メモ代わりに。
昨日、自分の作ったTOCを作るGASを都合で拡張していた。それぞれのシートからコメントや修正した日を取得できると便利だなと思って、下のように修正した。

```javascript:sample
    sheet.getRange(sRow,sCol,1,warray[0].length).setValue(warray);
```

ところが、これが動かない。出来上がる結果は

- コンテンツ１　コンテンツ１　コンテンツ１

みたいな感じで、最初の配列がコピーされてsetValueされている。
全く理由がわからず、しばらく画面を眺めていて、はっと気がついた。
配列の中身を複数書きだすのはsetValueではなく、**setValues** だ！！！

```javascript:sample
    sheet.getRange(sRow,sCol,1,warray[0].length).setValues(warray); // valuesでないとバグる
```

全くの下らないバグだったのだけど、書き込むlengthに１以上を与えてsetValueを実行したとき、コピーされるなど、マニュアルのどこにも書いておらず、キッカイな挙動をされたためにハマったわけだ。

同じことにハマる人がいないように、ここに残しておくのであったｗ
KotlinとClean ArchitectureとViewModelと

KotlinでViewModelとPresenterとControllerをどうすれば楽にView層で使えるのか考察してみました。
ここでは架空のフレームワークを使っています。適宜利用するフレームワークに脳内変換してください。

## Presenter->View

Clean Architectureでよくみる図のように、ViewはPresenterから発行される値をViewModelで監視します。

``` kotlin
class ViewModel {
    internal val mutableHogeFlow = MutableStateFlow("")
    val hogeFlow: StateFlow<String>
        get() = mutableHogeFlow
}

class Presenter(private val viewModel: ViewModel): UsecaseOutputPort {
    override fun handle(hoge: String) {
        viewModel.mutableHogeFlow.value = hoge
    }
}
```

``` kotlin
class View(private val viewModel): CoroutineScope {
    val hoge = viewModel.hogeFlow.value
    
    init() {
        launch {
            viewModel.hogeFlow.collect { hoge = it }
        }
    }
}
```

ViewModelでは`Flow`を使ってView側に変更を通知できるようにします。

## View->Controller
本題です。

入力用のViewModelを用意します。
ViewModelに`on〇〇()`のようなControllerの操作をするメソッドを持たせるのは責務違反なので、MVVMのようにViewModelに全てまとめるのではなく、Presenterで使うViewModelとControllerで使うViewModelは分けておくべきです。また、Controllerを操作する際は直接View側でViewModelの値をControllerで渡すべきです。

``` kotlin
class ViewModel {
    var hoge = ""
}

class Controller {
    fun doSomething(hoge: String)
}

class View(val controller: Controller) {
    val viewModel = ViewModel()

    val button = Button(
        onClick = { controller.doSomething(viewModel.hoge) }
    )
    val text = Text(
        onChange = { viewModel.hoge = it }
    )
}
```

## まとめ

PresenterとController用のViewModelは分けましょう。
Grove IoT スターターキット for SORACOM で超音波距離計を使う

距離が 30cm 以下ならば　LED が赤
距離が 30cm から 100cm ならば　LED が黃
距離が 100cm 以上ならば　LED が青になります。

次のサイトからライブラリーをダウンロードして下さい。
[ Seeed-Studio / Seeed_Arduino_UltrasonicRanger ](https://github.com/Seeed-Studio/Seeed_Arduino_UltrasonicRanger)
Zip ファイル
Seeed_Arduino_UltrasonicRanger-master.zip


```text:ultrasonic_ranger/ultrasonic_ranger.ino
// ---------------------------------------------------------------
/*
	ultrasonic_ranger.ino

					Aug/06/2021
*/
// ---------------------------------------------------------------
#include <WioLTEforArduino.h>
#include <Ultrasonic.h>

#define ULTRASONIC_PIN	(WIOLTE_D38)
#define INTERVAL	(500)

Ultrasonic UltrasonicRanger(ULTRASONIC_PIN);

WioLTE Wio;

// ---------------------------------------------------------------
void setup()
{
	Wio.Init();
}

// ---------------------------------------------------------------
void loop()
{
	long distance;
	distance = UltrasonicRanger.MeasureInCentimeters();
	SerialUSB.print(distance);
	SerialUSB.println("[cm]");

	if (100 <= distance)
		{
		Wio.LedSetRGB(0, 0, 1);
		}
	else if (30 <= distance)
		{
		Wio.LedSetRGB(1, 1, 0);
		}	
	else
		{
		Wio.LedSetRGB(1, 0, 0);
		}
	
	delay(INTERVAL);
}

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

超音波センサーを D38 に接続して下さい。
![IMG_20210806_111132.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/f41b0cf7-8d57-4fa1-9875-f6ccf2ea12c5.jpeg)
EC2でプロキシサーバーを利用する場合のプロキシ設定

# 目的
AWS EC2から特定のプロキシサーバーをを経由してインターネット接続する場合のproxy設定を行う

# 背景
可用性が求められる環境においては、NATゲートウェイやVPCエンドポイントにインターネット接続を行うのが一般的であるが、開発環境等の可用性が求められない環境においては、コスト最適化のために低スペックのEC2によるプロキシサーバを立てて、インターネット接続させる場合がある。

その際に、設定が必要となった箇所と設定方法についてメモする。

# EC2のproxy設定対象箇所
・OS(Linux)のシステム設定
・アプリのサービス
・CloudWatchAgent
・SSMAgent
・CodeDeployAgent

## OSのシステム設定
```
sudo vi /etc/environment
http_proxy="http://{ProxyServerHost}:{Port}/"
HTTP_PROXY="http://{ProxyServerHost}:{Port}/"
https_proxy="http://{ProxyServerHost}:{Port}/"
HTTPS_PROXY="http://{ProxyServerHost}:{Port}/"
no_proxy="169.254.169.254"
```
## アプリのサービス設定
今回SpringBootアプリをサービス登録しており、その設定ファイルに追加

```
sudo vi /opt/app/app.conf
export http_proxy="http://{ProxyServerHost}:{Port}/"
export HTTP_PROXY="http://{ProxyServerHost}:{Port}/"
export https_proxy="http://{ProxyServerHost}:{Port}/"
export HTTPS_PROXY="http://{ProxyServerHost}:{Port}/"
export no_proxy="169.254.169.254"
```

## SSMAgentのproxy設定

```
sudo systemctl edit amazon-ssm-agent
[Service]
Environment="http_proxy=http://{ProxyServerHost}:{Port}"
Environment="https_proxy=http://{ProxyServerHost}:{Port}"
Environment="no_proxy=169.254.169.254"
```
以下のファイル名で保存
/etc/systemd/system/amazon-ssm-agent.service.d/amazon-ssm-agent.override.conf

```
sudo systemctl stop amazon-ssm-agent
sudo systemctl daemon-reload
sudo systemctl start amazon-ssm-agent
```

## CodeDeployAgentのproxy設定
```
sudo vi /etc/codedeploy-agent/conf/codedeployagent.yml
:proxy_uri: 'http://{ProxyServerHost}:{Port}'

sudo service codedeploy-agent restart
```

## CloudWatchAgentのproxy設定
```
sudo vi /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml

 [proxy]
    http_proxy = "http://{ProxyServerHost}:{Port}"
    https_proxy = "http://{ProxyServerHost}:{Port}"
    no_proxy = "169.254.169.254"
    
sudo systemctl stop amazon-cloudwatch-agent
sudo systemctl daemon-reload
sudo systemctl start amazon-cloudwatch-agent
```
Azure Databricks WorkspaceにおけるUser SettingのAccess Tokensにて削除ボタンが消えてしまう場合の対応方法

## 概要
Databricks WorkspaceにおけるUser SettingのAccess Tokensにて削除ボタンが消えてしまう場合の対応方法を共有します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4835bca6-70a2-84f0-87e9-9762cddc83ed.png)

原因はMenuにより表が押し出されることが原因であり、そのうち修正されるそうです。

## 対応方法
### 対応方法1. Menuを閉じる方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6392b008-1873-d80d-4c3c-9a5a5929050c.png)

### 対応方法2. ブラウザのサイズを変更する方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/996393c3-6086-d8be-6b16-dc3e3e2e52a3.png)
バッチ処理でAccessのデータを更新する

Accessでは、起動時にスイッチを指定して特殊な動作をさせることが可能です。
[Microsoft Office 製品のコマンド ライン スイッチ](https://support.microsoft.com/ja-jp/office/microsoft-office-%E8%A3%BD%E5%93%81%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89-%E3%83%A9%E3%82%A4%E3%83%B3-%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81-079164cd-4ef5-4178-b235-441737deb3a6#ID0EAABAAA=Access "Microsoft Office 製品のコマンド ライン スイッチ")

このうち/cmdスイッチを利用して、１つのデータベースファイルをオンライン？とバッチで共用する例です。
***
●起動用バッチファイル：Windowsのタスクスケジューラより起動

``` day01.bat
"C:\Program Files\Microsoft Office\OFFICExx\msaccess.exe" C:\Users\hoge\master.accdb /cmd "DAY01"
```

●データベースファイルの起動時プロシジャー：マクロ”AutoExec"より起動

``` VB
    Select Case Command                     ' スイッチの内容を判定
    Case ""                                 ' 画面からの起動時
        DoCmd.Echo False, "お待ちください...."
        DoCmd.OpenForm "初期メニュー" & cPb_display, acNormal
        DoCmd.maximize
        DoCmd.Echo True
    
    Case "DAY01"                            ' 毎月1日実行月次バッチ時
        Call sPb_年月情報更新
        Application.Quit　　　　　　　　　　　 ' ⇒忘れずに終了します

    Case "DAY010"                            ' 毎月10日実行月次バッチ時
　　　　・・・・
        
    Case Else
    End Select
```
データベースのブロックサイズの初期値

# MySQL

innoDBでは，**16KB**である．

> The default InnoDB page size is 16KB.
> https://dev.mysql.com/doc/refman/5.7/en/optimizing-innodb-diskio.html

# PostgreSQL

**8KB**である．

> The default value is 8192 bytes.
> https://www.postgresql.org/docs/8.4/runtime-config-preset.html

# Oracle

**8KB**である．

> DB_BLOCK_SIZE
> Default value 8192
> https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams041.htm#REFRN10031

# Microsoft SQL Server

**64KB**である．

> The default value for SET BLOCKSIZE is 64. 
> https://docs.microsoft.com/en-us/sql/odbc/microsoft/set-blocksize-command?view=sql-server-ver15

# IBM DB2

**32KB**である．

> Use the default DRDA block size (32767) if it does not cause too much paging on executing your application. 
> https://www.ibm.com/docs/en/db2/11.5?topic=tuning-db2-connect-server
> https://www.ibm.com/docs/en/db2/11.5?topic=tuning-db2-connect-server
【Java】4乗的ガウスを解く

　僕はこれまで「Ruby on Rails」をメインに勉強してきましたが、現在は「Java」も勉強しています。
　ということで僕が過去に「Ruby」で解いた問題を「Java」で解くとどうなるかを試してみました。

https://qiita.com/kim-shun/items/a46cc43c31959ff765ea

　1⁴ + 2⁴ + 3⁴ + ........ + 40⁴

　上記の計算の結果をプログラムで出していきます。

```java
package example;

public class JavaGouse {

	public static void main(String[] args) {
		int count = 1;
		int sum = 0;
		
		while (count <= 40) {
			sum += Math.pow(count, 4);
			count += 1;
		}
		System.out.println(sum);
	}

}
```

　これで求めたい値である「21781332」を出すことができました。ただしまだ「Ruby」も「Java」も理解が不十分であるため、問題もあると考えられます。ご意見いただけるとありがたいです。
[備忘録]SQLクエリまとめ③

今回もSQLの復習やっていきます！

#サブクエリ

- ２つ以上のクエリを１つにまとめられる
- `（）`で囲むことでサブクエリを使用できる
- サブクエリが実行されたあとに、外側のクエリが実行される

```sql:メッシよりも得点数の多い選手名
SELECT name
FROM players
WHERE goals > (
  SELECT goals
  FROM players
  WHERE name = "メッシ"
);
```

#AS

- カラム名などに別名を定義できる
- `カラム名 AS "名前"`

```sql:goalsを「ロナウドの得点数」と定義
SELECT goals AS "ロナウドの得点数"
FROM players
WHERE name = "ロナウド";
```

#JOIN

- ONで条件を指定して、テーブルAにテーブルBを結合できる
- `SELECT * FROM テーブルA JOIN テーブルB ON 結合条件`

```sql:取得したいそれぞれのテーブルのカラム名を指定
SELECT players.name, countries.name
FROM players
JOIN countries
ON players.country_id = countries.id;
```

#LEFT JOIN

- 外部キーがNULLのレコードも取得できる
- `SELECT * FROM テーブルA LEFT JOIN テーブルB ON 結合条件`

```sql:チームが決まっていない選手もいるため、LEFTJOIN使用
SELECT *
FROM players
LEFT JOIN teams
ON players.previous_team_id = teams.id;
```

#3つ以上のテーブル結合

- JOINは１つのクエリで、複数回使用できるので、３つ以上のテーブルの結合も可能

```sql:players,countries,teamsテーブルを結合
SELECT *
FROM players
JOIN countries
ON players.country_id = countries.id
LEFT JOIN teams
ON players.previous_team_id = teams.id;
```

#まとめ

今回は、サブクエリとJOINのみ、サブクエリは取得する順番が`サブクエリ→外側のクエリ`、JOINは結合条件は`テーブルA.カラム名 = テーブルB.カラム名`となるところに注意が必要。

３つ以上のテーブルを結合できると、はじめて知ったのでもっと複雑なデータの取得ができそうです！
IBMCloud VRA KVM(IPMI)コンソールアクセス

##目的
VRAに対してのKVM(IPMI)コンソールアクセス方法を記載する。

##KVMコンソールアクセス

**クラシックインフラストラクチャ** -> **ゲートウェイ・アプライアンス**を選択
![IBM_Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/cb88d45a-0da3-0256-15db-28eeefec5d2f.png)

**KVMアクセスしたいクラスタ名**を選択
![貼り付けた画像_2021_08_06_10_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/cfb12d1f-819f-0261-fc25-ef4603f24b91.png)


**KVMアクセスしたいホスト名**を選択
![貼り付けた画像_2021_08_06_10_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/eb230198-4191-a7be-207b-76e8fa02b94d.png)


**リモート管理**を選択し、**管理(IPアドレス)**、**ユーザ-**および**パスワード**を確認する。
![貼り付けた画像_2021_08_06_10_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/2b6e7978-8347-57e1-3f00-7d43c39a2f49.png)


右上の**Action**から、**KVMコンソール**を選択
![貼り付けた画像_2021_08_06_10_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/cb84bbeb-437f-c06b-72d8-b91b9435cfde.png)

**続行**を選択
<font color=red>続行を選択する前にSSL-VPNを接続しておくこと</font>
![貼り付けた画像_2021_08_06_10_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/6c1688b0-7227-aa45-989e-e9ab26ea55cd.png)

先程確認した、**ユーザ**と**パスワード**を入力して、**ログイン**を選択
![貼り付けた画像_2021_08_06_10_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/11eb9cf3-7029-7566-fa94-8ec25f591529.png)

**リモートコントロール**、**iKVM/HTML5**、**iKVM/HTML5**を選択
<font color=red>ここで選択できない場合、rootユーザの権限が不足しているため、ケースをオープンしてサポートに権限付与を依頼する必要がある</font>
![貼り付けた画像_2021_08_06_10_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/dfb30824-8696-d95f-619c-cc5ef30b942a.png)

KVMアクセスが可能となる
![貼り付けた画像_2021_08_06_10_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/2dd3420d-c653-3a05-7daa-2d86c29e3f6b.png)
OCI Monitoringにプロセス監視のカスタム・メトリックを公開する

Oracle Cloud Infrastructure Monitoringにユーザーの好みのメトリックデータをアップロードするにはカスタム・メトリックの機能を使います。カスタムメトリックは1秒単位でPostすることができ、最小集計間隔は1分です。
カスタムメトリックのアップロードは、OCI CLIやAPIで実行することができますが、ここではPython SDKでアップロードする方法を紹介します。


今回のPythonスクリプトは、[ドキュメント](https://docs.oracle.com/en-us/iaas/api/#/en/monitoring/20180401/MetricData/PostMetricData)にあるサンプルコードをベースに使っていますが、１点注意があります。サンプルコード内のmonitoring_clientの箇所には、service_endpointの記述が不足しているので、正しくは以下のようにendpointを指定します。

```
monitoring_client = oci.monitoring.MonitoringClient(config,service_endpoint="https://telemetry-ingestion.us-ashburn-1.oraclecloud.com")
```

このサンプルコードをベースにして、OSで稼働する特定のプロセスの有無をチェックし、カスタムメトリックを公開するPythonスクリプトを作成。ここでは単純にvmstatのプロセスの存在有無を監視しています。

```
import oci,datetime,psutil,datetime
from pytz import timezone

#OCIの接続情報
config = {
    "user": "ocid1.user.oc1..xxxxxxxxxxxxxxxxx",
    "key_file": "/home/opc/.oci/oci_api_key.pem",
    "fingerprint": "XX:XX:XX:XX:XX:XX:XX:XX:c7:a2:4f:71:c0:a1:26:6e",
    "tenancy": "ocid1.tenancy.oc1..aaaaaaaawtaaxxxxxxxxxxxxxxxxxxxxx",
    "region": "us-ashburn-1"
}

# Initialize service client with default config file
monitoring_client = oci.monitoring.MonitoringClient(config,service_endpoint="https://telemetry-ingestion.us-ashburn-1.oraclecloud.com")

existvalue = 0

#検出するプロセス名を指定。サンプルとしてvmstatを検出
for proc in psutil.process_iter():
    try:
        if "vmstat" in proc.exe():
            existvalue = 1
    except psutil.AccessDenied:
        pass

dt_now = datetime.datetime.now(timezone('UTC'))

#compartment_idを指定、namespace, metric name, dimentionはお好みの値に
#プロセスが見つかれば1、なければ0をPost
post_metric_data_response = monitoring_client.post_metric_data(
    post_metric_data_details=oci.monitoring.models.PostMetricDataDetails(
        metric_data=[
            oci.monitoring.models.MetricDataDetails(
                namespace="osprocess",
                compartment_id="ocid1.compartment.oc1..aaaaaaaa6itxxxxxxxxxxx",
                name="process001",
                dimensions={
                    'serverid': 'testsrv001'},
                datapoints=[
                    oci.monitoring.models.Datapoint(
                        timestamp=datetime.datetime.strftime(
                            dt_now,"%Y-%m-%dT%H:%M:%S.%fZ"),
                        value=existvalue)]
                )]
    )
)
```

作成したpythonスプリプトを定期的に実行する

```
watch -n 30 python custometric.py
```
モニタリング -> メトリック・エクスプローラーを開き以下の問い合わせを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/f76bd989-fd79-aa12-79cf-cab8a258155a.png)

凹んでいる箇所がプロセスを検出できなかった期間。値が0の場合というトリガールールを設定してNotificationsでアラート通知ができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/db4c3fa5-508f-2234-1a3b-0bb3bbba4172.png)

[その他のOracle Cloud Infrastructureに関連するトピック](https://qiita.com/western24/items/4824e4b3799b824197c6)
【Google Cloud Day'21】「アプリケーションはどこで動かすべきか、それが問題だ - Google Compute Engine から Kubernetes Engine, Cloud Run まで 」を視聴して

アプリケーションはどこで動かすべきか、それが問題だ - Google Compute Engine から Kubernetes Engine, Cloud Run まで -
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d2-appdev-04
"サービスを開発するときに必ずぶつかる壁、それがアプリケーションをどこで動かすか、です。様々な選択肢があり、迷われている方も多いのでは無いでしょうか。本セッションでは、どのような観点、要件を元にどの選択肢を選ぶかを、仮想マシンの Compute Engine から、マネージドな Kubernetes の GKE、そしてコンテナ＋ Serverless の Cloud Run まで最新の情報を交えながらご紹介します。
"

<table>
	<tr>
		<th>質問</th>
		<th>回答</th>
	</tr>
	<tr>
		<th>Cloud Runが対応するユースケースも幅広く有用に感じましたが、向いていないユースケースがあれば教えて頂けますでしょうか。</th>
		<td>Cloud Run （GAE</td>
		<td> Cloud Functions）もそうですが、ディスクがメモリと共用のため、ステートフルなアプリケーションには適しておりません。ですので、別のマネージドサービスを使う、外部ストレージを使うなどでデータを外だしできるアプリケーションでしたら是非試してみて頂ければと思います。</td>
	</tr>
	<tr>
		<th>Cloud Run for Anthosは、AWS上のAnthosでも動作するのでしょうか？</th>
		<td>こちらは現在 Preview となっております。是非 GA をお待ち頂ければと思います。https://cloud.google.com/anthos/docs/version-and-upgrade-support?hl=en#anthos</td>
	</tr>
	<tr>
		<th>Cloud Runハイブリッドな使い方ができるとなっていたが、App Engine Standardとのユースケースで、俊敏なオートスケール、アプリケーションタイムアウトとかのほかにそれぞれ選択するケースありますでしょうか</th>
		<td>最小課金単位が Cloud Run の方が短いため、時間がかからないかつ、処理時間が短いバッチのようなものは Cloud Run が向いていると考えられます。また、デプロイ形式がコンテナ、独自形式と異なるため、ポータビリティも検討材料になるかと思います。</td>
	</tr>
	<tr>
		<th>CloudRunは起動が高速とのことですが、具体的にはどれくらいの時間でインスタンスが起動するのでしょうか？</th>
		<td>アプリケーションの作り方、言語に依る部分も大きいですが、短い場合は秒単位で起動します。</td>
	</tr>
</table>


<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>抽象度と柔軟性</th>
		<td>抽象度があがると、運用の手間がなくなる、開発に集中できるが、柔軟性がなくなる。</td>
	</tr>
	<tr>
		<th>CNCFのホワイトペーパー</th>
		<td>サービスに関する懸念点が書いてある</td>
	</tr>
	<tr>
		<th>あげられている懸念点</th>
		<td></td>
	</tr>
	<tr>
		<th>懸念点の対応</th>
		<td></td>
	</tr>
	<tr>
		<th>どの機能を使うかの判断方法</th>
		<td></td>
	</tr>
</table>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/99fb2dcf-bde5-0cba-8d8c-d31a8df47c08.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/b6ef0015-33d3-e18a-5e8c-9071f968042c.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/1f1af9a3-aaf9-d26f-1ac7-5cc4d5928be7.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/57132ea8-70f0-28c4-1790-07f2e355ad00.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/b0397002-67c3-83a0-07cc-4e50fbe6dc38.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/80f4429c-0966-f749-cf3d-9fc1d5331c41.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/4aac2226-c543-9ea9-e402-5054670ffff5.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/6dbc35b1-3e5f-8754-3f53-b9b1a194a42f.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/0ca6ada7-d0ae-c752-d025-4cee84e324bc.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/66a2d7a9-6b73-e32e-e792-83bfb98771ad.png)
node-dssを1つのAWSのインスタンスで複数起動する

# 環境

- AWS
- Ubuntu Server 20.04 LTS
- node.js v10.19.0
- npm 6.14.4
- forever v4.0.1

# やりたいこと

- AWSで、node-dssを永続的に起動する
- １つのインスタンスで複数のnode-dss（複数のポート）を実行する

# node-dssについて

- dead simple signalling for webrtc.
- WebRTC用のとてもシンプルなシグナリング
- node.jsで動作

https://github.com/bengreenier/node-dss

# foreverについてい

- node.js のスクリプトをforeverで永続起動する
- node.jsを実行し続けるために `forever` を採用したが、
- コミュニティに依存しているので、新規にインストールする場合は、pm2、nodemonがお勧めとのこと
- 今回は、実験的なので、foreverを使うことにする

> A simple CLI tool for ensuring that a given script runs continuously (i.e. forever). Note that this project currently fully depends on the community for implementing fixes and new features. For new installations we encourage you to use pm2 or nodemon

https://www.npmjs.com/package/forever

# 各種インストール

```bash
cd /home/ubuntu

sudo apt install nodejs
sudo apt install npm
sudo npm install -g forever

git clone https://github.com/bengreenier/node-dss.git
npm install
```


# foreverのプロセス確認をしやすくするために

- foreverでプロセスを確認するとき、同じファイルを複数起動すると判別しづらい
- シンボリックリンクを作り、別のファイル名として起動する構成を考える
- 起動するポート番号をファイル名に追加

```
ln -s /home/ubuntu/node-dss/bin/dss.js /home/ubuntu/node-dss/bin/dss3000.js
ln -s /home/ubuntu/node-dss/bin/dss.js /home/ubuntu/node-dss/bin/dss8000.js
```


# node-dssの実行

## 起動

- 以下、環境変数PORTでポート番号を指定して起動する例

```bash
PORT=8000 forever start node-dss/bin/dss8000.js
PORT=3000 forever start node-dss/bin/dss3000.js
```

- 以下、ログをファイル出力する例
  - 環境変数でデバッグモードにする
  - 数100ms間隔でログが溜まるので、容量を考慮する必要がありそう

```bash
DEBUG=dss* forever start -l log3000.txt node-dss/bin/dss.js
```

## プロセス確認

```bash
forever list
```

- 以下が実行した例
  - スクリプトのファイル名が表示される
  - (もっとスマートな方法があずはず...)

```
forever list
info:    Forever processes running
data:        uid  command       script                  forever pid   id logfile                        uptime
data:    [0] P-4G /usr/bin/node node-dss/bin/dss8000.js 42112   42119    /home/ubuntu/.forever/P-4G.log 2:18:4:7.353999999992084
data:    [1] 2pYM /usr/bin/node node-dss/bin/dss3000.js 42138   42145    /home/ubuntu/.forever/2pYM.log 2:18:2:52.17300000000978
```

# プロセスの終了

```bash
forever stop 2pYM
```
WordPress

##目的
WordPressを使用する予定が立ちそうなので基礎的な知識だけまとめました。
使用方法については、まとめておりません。

#1.オープンソース
・商用、非商用を問わず使える

#2.ローコード
・コードの編集が少なくて済む

#3.実はWordPressには二種類存在する
##WordPress.org(オープンソースのソフトウェア)
・これが皆さんが想像するWordPress
・これは誰もが自由にダウンロードして、自由にダウンロードして、自由にカスタマイズすることができうるオープンソースのソフトウェアです。
・これを利用する場合は、別途自分でホスティングサーバーとドメインを購入する必要があります。

##WordPress.com(WordPressを開発しているAutomatic社が運営するサービス)
・.orgと紛らわしいのですが、WordPress.comはホスティングサービスが含まれているWordPressのホスティングサービスになります。
・使えるテーマやプラグインなどに多くの制限が出てきます。

#4.WordPressを使うメリット
##無料でオープンソース
・実際にはWordPressを使ってサイトを公開するにはホスティングサーバーなどはひつようになってきますが、WordPress自体をダウンロードして利用するのは完全に無料です。
・またオープンソースなのですべてのコードにアクセスでき、カスタマイズが簡単

##拡張性が高い
・HTMLなどの言語に詳しくなくてもWordPressには「テーマ」や「プラグイン」という拡張機能が豊富になるので簡単にWEBサイトのデザインを更新したり、欲しい機能を追加したりできます。
・このテーマやプラグインは無料で提供されていることが多いので、追加のコストをかけずに追加で機能を増やしたりすることができます。

テーマ数5000以上
プラグイン50000以上

##インストールが簡単
・最近のほとんどのホスティングサーバーにはWordPressをワンクリックでインストールできるオプションがあります。
・以下はホスティングサーバーの管理画面例です。

##どんなサイトでも作成できる柔軟性
・WordPressは複数のプラグインを組み合わせて自分の希望するサイトを柔軟に構築することができます。
・例えば、現在はWordPressで個人ブログを運営していて、将来的には物販の機能を追加したい場合は「WooCommerce」という無料のEC機能を追加することができます。

##ヘルプを見つけるのが簡単
・WordPressはオープンソースなので、公式のサポートはありません。
その代わり、多くのユーザーがいるので掲示板やグーグルで解決策を見つけることができます。

#5.構築可能なサイトの種類の例
・ビジネスウェブサイト
・ECサイト
・ブログ
・オンラインスクール
・クラウドファンディングサイト
・ポートフォリオサイト
・オンラインサロン（会員ページ）
・履歴書、プロフィールページ
・マーケットプレイス
Heroku デプロイしてるサービスを一時停止する方法

#maintenance modeにする
デプロイしてるサービスを一時停止にするには、**「maintenance mode」を使うと良さそうです！**

Herokuにログインして、該当のアプリケーションを選択。
![スクリーンショット 2021-08-04 23.58.42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/794a9105-f688-80d2-6b53-4fd09d2c400b.jpeg)

`Settings＞Maintenance mode`にチェックをつけます。
![スクリーンショット 2021-08-04 23.58.52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/6e3986e3-ec09-3674-dc94-72b9e2e07fa9.jpeg)

これでmaintenance modeになります（結構反映が早いです！）

![スクリーンショット 2021-08-04 23.57.55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/55dd1ee9-b2fc-b6f2-32d9-c185246e7759.jpeg)
OctaveをLinuxでインストールしてplotできなかった時の対処法(error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory)

# Octave
OctaveとはMatlabと同様、行列やベクトル計算、グラフ化するときに使うソフトウェアである。
Windows, Mac, Linuxいずれもインストールできるが、plotできない場合がある

# エラー

例えば
t = [0:0.01:0.98];
y1= sin(2*pi*4*t);
plot(t,y1);

としたときplotできず
error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory

と表示されたとき

どうもGNUplotに問題があるらしい

#　対処法

sudo strip --remove-section=.note.ABI-tag /usr/lib64/libQt5Core.so.5
複数銘柄の日足株価データを週足の株価データに変換する方法

#1. この記事は

複数銘柄の日足データを銘柄ごとに週足データに算出するコードを掲載する。

#2. コードの説明
pd.Grouperを使うのがポイントです。Multiindexの場合、groupbyを使用するとresampleのコードでエラーが発生します。よって、pd.Grouperを使用します。

```python:sample.py
import pandas as pd
import numpy as np

dat=[
    [1570,"2021/7/5",15650,15670,15490,15520,3315590],
    [1570,"2021/7/6",15620,15690,15500,15560,3165551],
    [1570,"2021/7/7",15050,15340,15030,15260,6047534],
    [1570,"2021/7/8",15200,15280,14990,15020,4927900],
    [1570,"2021/7/9",14620,14880,14240,14850,15201967],
    [1570,"2021/7/12",15440,15500,15360,15460,8908945],
    [1570,"2021/7/13",15630,15780,15610,15640,6024571],
    [1570,"2021/7/14",15410,15610,15370,15510,4788303],
    [1570,"2021/7/15",15430,15480,15120,15160,6687459],
    [1570,"2021/7/16",14840,15090,14700,14890,8021962],
    [1570,"2021/7/19",14500,14650,14320,14470,8402245],
    [1570,"2021/7/20",14200,14400,14140,14220,8901150],
    [1570,"2021/7/21",14610,14730,14260,14380,7473282],
    [1305,"2021/7/5",2073,2076,2066,2074,155700],
    [1305,"2021/7/6",2080,2085,2072,2078,188890],
    [1305,"2021/7/7",2054,2070,2047,2058,740510],
    [1305,"2021/7/8",2020,2024,2007,2007,216620],
    [1305,"2021/7/9",1976,2004,1964,1999,403640],
    [1305,"2021/7/12",2035,2042,2028,2036,208860],
    [1305,"2021/7/13",2049,2060,2048,2051,655740],
    [1305,"2021/7/14",2041,2056,2038,2047,83270],
    [1305,"2021/7/15",2045,2045,2021,2022,132610],
    [1305,"2021/7/16",2014,2027,2008,2016,77810],
    [1305,"2021/7/19",1995,2001,1981,1991,162720],
    [1305,"2021/7/20",1969,1981,1964,1970,476450],
    [1305,"2021/7/21",2000,2009,1983,1985,91520]
    ]

#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["Code","Date","Open","High","Low","Close","Volume"])
df['Date'] = pd.to_datetime(df['Date'], format='%Y/%m/%d') #文字列型を日付型に変更する

print("### 銘柄番号1305,1570の日足株価データ")
display(df)


d_ohlcv = {'Open': 'first','High': 'max','Low': 'min','Close': 'last','Volume': 'sum'}
df_stock = df.groupby(['Code', pd.Grouper(freq='W', key='Date')]).agg(d_ohlcv)  #株価データ(週足)を取得する。


print("#### 銘柄番号1305,1570の週足株価データ")

display(df_stock)

```
実行結果

![179.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/c75dda62-ee14-02a0-86e1-20a16a1eb5aa.jpeg)
![180.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/ab711af8-9731-2143-e9d4-00288f428122.jpeg)
docker-compose upした際のログが出ない問題

#今回の問題
今回はただ今Docker初心者の私がとても悩んだ問題です。
正直、メンターさんと一緒に考えてもなかなか答えが見えなかった問題でした。
調べても調べてもなかなか出てこなくてものすごく大変でした。

やっと解決したので、今後のためにも残しておこうと思います。

#使用環境

・Ruby(2.5.7)
・Ruby on Rails (6.1.3.2)
・Docker (20.10.7)
・MySQL (5.7)

#問題点

![スクリーンショット 2021-08-05 21.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1733740/ac4d13a6-5297-4227-7681-9b71d8120aac.png)

上のスクリーンショットを見ていただくと、本来スクリーンショット最下部「Use Ctrl-C to stop」以下にRailsのログ情報が本来出力されるはずなのですが、Railsを起動して画面読み込みをしても何もログが出力されていません。（動作自体は正常にしています。）

```ターミナル:ターミナル
$ docker-compose up -d
$ docker attach onsen_app_1
```
で起動したコンテナに接続してもRailsのログは出力されませんでした。
Docker化する以前は問題なくRailsログがターミナルに出力されていたので、Docker化した際の設定に原因があるかと思いましたが、調査してもどこが引っかかっているのかわかりませんでした。

#解決方法

結論を先に言うと、今回の原因は「config/environments/development.rb」にある記述を追加すれば正常に動くことができました。

```Rails:development.rb
Rails.application.configure do
  # ...
  config.logger = Logger.new(STDOUT)
  # ...
end
```

上記に書いた「config.logger = Logger.new(STDOUT)」と言うのを「config/environments/development.rb」に追加すれば、正常に動くようになりました。
ちなみに「rails STDOUT not working docker」で検索したらようやくヒットしました。

#最後に
Dockerはまだまだ初心者ゆえに大変な作業でした。
これからもDockerにはお世話になると思うので、勉強は怠らずに励んでいきたいですね。
変なまとまりになりましたが、以上で終了です。
見て頂きありがとうございました。

参考サイトです。
https://blog.eq8.eu/til/ruby-logs-and-puts-not-shown-in-docker-container-logs.html
【Gitエラー解決】warning: LF will be replaced by CRLF


##事象
Git/githubで個人開発を進めていたところ『warning: LF will be replaced by CRLF』というエラーが発生してgit add　コマンドが動かなくなってしまった。

```
warning: LF will be replaced by CRLF in log/error_2018-11-04.log.
The file will have its original line endings in your working directory
```

##原因
改行コードがLFからCRLFに置き換えられようとしている模様。

##対応方法
以下のコマンドを実行で無効にできました。

```
git config --global core.autoCRLF false
```

##そもそも改行ってなんだ
改行ってbrタグとかじゃないんですか????LF/CRLF????というような、
という状態だったので調べてみました。

HTMLファイル（css/JavaScript/image）はパソコンやモバイルのブラウザのレンダリングエンジンによって解釈され表示されるようです。

単純に『HTMLファイル内で改行があったから』改行するのではありません。

つまりブラウザ側でレンダリングされる時に『ここで改行した状態で画面上に表示してね』と表すのがbrタグの役割のようです。

##じゃぁLFやCRLFって何なんなのか・・？？？

上記で説明した『HTMLファイル内で改行があったから』という部分を示すものが改行コードになります
。
分かりやすい例で言うと、エディタ等で改行をボタンを押すと以下のような記号『↩︎』表示がされる場合を思い浮かべると良いかもしれません。

```
これが改行↩︎
コンピュータに改行があると伝えます↩︎
```

##コンピューターに改行を知らせる

このように文字列の改行するところには、改行コードという見えない特殊文字が入っています。

その一方で残念なお知らせがありました。

コンピュータの世界で改行コードが統一されていればよいのですが、あいにく、統一されていないのです。

以下はwikipedia先生より。
>ASCII文字コードに基づくシステムでは、CR（復帰、0x0D）、LF（改行、0x0A）、またはCR+LFで表している。
>LF:    UNIXやUnix系のシステム。Linux、AIX、Xenix、macOS、BeOS、Amiga、RISC OSなど。
>CR+LF: CP/M、MP/M、MS-DOS、OS/2、Microsoft Windows。
>CR:    コモドールによるシステム、Apple IIファミリ、Mac OS（バージョン9まで）、OS-9。

改行コードには種類があります。

そのため、対応している改行コードでないと正しくコンピュータに読み込ませることができないのです。

今回のケースでいうとLFという改行コードが自動的にCRLFに置き換えられてしまったことが原因のようです。

##まとめ
今回のように調べれば簡単に出てくるエラーでも一歩踏み込んで『このエラーはどういう意味なのか』『解決コマンドによってどう変わるのか』『そもそもどういう仕組みなのか』というところまで勉強していくことで少しづつ理解できる範囲が広がっていくのだなと実感しました。

引き続き頑張ります。
基礎②〜if文、else、else if文〜　php

# はじめに
If文、for文は基礎的なものだが理解するまでに時間がかかったので今回もまとめてみることにした。具体的な構文は言語によって異なるが、今回はPHPでまとめていきたいと思う。

# 内容

## if文について
Ifとは日本語で「もし〜であれば/ならば」という意味で使われる。
それと同様にプログラミングの世界でも「もし〜ならば」実行するといった、
特定の処理の場合に使われる。

例1：

```php
$a = 100;
if($a > 50){ 
  //ここで条件を指定する。          
  echo "$aは50より大きい";
  //処理の実行
}
```
結果：　`$aは50より大きい`

100という数字は50より大きいので「＄aは50より大きい」という結果になった。

それでは条件が成り立たなかった場合を見てみる

例2：

```php
$a = 100;
if($a > 150){      
  echo "$aは150より大きい";
}
```

結果：　（条件が成り立たないため処理が実行されず何も表示れない）

## else、else if文

 else・・・if文以外の条件以外だった場合

例：　

```php
$a = 10;
if( $a  == 20) {
  echo "＄aは20です。 ";
}else{
  echo "$aは20ではないです。";
}
```

結果：　`$aは20ではないです。`

上記の例の説明をすると、

* まず＄aの値を決めます。
* if内で＄aの値に条件をつけ、ここでは＄aの変数の「中身は20だよ」結果を定義してます。
* その次にelseが登場し、「＄aの変数の中身は20ではない（それ以外という認識が正しいかも？）」と結果を定義してあげます。
* そして結果は最初に＄aの値は「１０」と設定していたので、＄aの中身は20ではないという結果が正しいことになります。

 eseif・・・ifの条件とは別の条件で一致させる場合

例：

```php
$a = 10;
if( $a  > 20) {
  echo "$aは20よりも大きいです ";
}else if( ＄a  >= 10){
  echo "$aは20以下で10以上です";
}else{
  echo "$aは10より小さいです。";
}
```

結果：　`$aは20以下で10以上です`

上記の例を説明すると、

* if内で＄aの値は「＄aは20よりも大きいです 」という条件をつけ、そうだった場合「中身は20だよ」という結果を定義してます。
* その次にelse ifが登場し、「＄aは20以下で10以上です」という条件をつけ、正しかった場合は「＄aは20以下で10以上です」という結果を定義してます。
* 最後にelseです。これは上記のifにもelse ifにもどの条件にも当てはまらなかった場合を指します。
* そして結果は＄aの値は最初に「10」と定義しているため、「＄aは20以下で10以上です」という結果になります。

#まとめ

If文はシンプルにその条件に当てはまるか当てはまらないかという白黒つけたいシンプルのもので
elseというのはそれ以外の場合という条件の付け足し。
else if はさらに条件を付け足したい場合のもに使用される。このif文は多くの場面で使用されるためしっかり覚えていきたいと思いました。
LaTeX for Mac 論理演算・集合記号

## 論理演算・集合記号
- 論理演算
    - 否定（¬）　\not
    - 論理和（∨）　\lor
    - 論理積（∧）　\land
- 集合
    - 和集合（∪）　\cup,\bigcup
    - 積集合（∩）　\cap,\bigcap
    - 補集合（　）　\overline{a},\={a}
    - 部分集合（⊆）　\subseteq
    - 真部分集合（⊂）　\subset
    - 含む・属する（∈）　\in