OmniAICreator/Qiita-1.07M huggingface dataset:
Matplotlibグラフのx,y,zの注意点

皆さん、Matplotlib使っていますかーー？

私は、グラフとかあまり好きではなく、
データサイエンティフィックに【この辺りに顕著に結果が出ているようだ…】という
シリアスドラマのような展開が苦手です。

どちらかというと、直感的に体感してもらう動的飛び道具にして使うことが多いでしょうか。
今回はMatplotlibにおちょくられたので、もう二度とこんな気持ちにならないように備忘録を兼ねて記事にします。

##みんなのx,y,z軸の基準ってどっち方向でしょう
私の認識はこうです
![xyz基本型.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203445/23b7c55e-fda4-0c2b-4f1d-00cab11f5808.png)
右から左/左から右：x軸
上から下/下から上：y軸
手前から奥/奥から手前：z軸
Matplotlibもそうだろうと思ってレッツ

```python:nogood.py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#1点だけ表示されるサンプル(x,y,zにたくさんのデータが入る)
x = np.array([1])
y = np.array([2])
z = np.array([3])

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax = Axes3D(fig)
#ここでプロット
ax.plot(x,y,z,marker="o",linestyle='None')
plt.show()
```

これを、1点ではなく人間の骨格点にして置き換えて、その他いろいろエッセンスを足した。
(カメラに向かって右手を振っている想定(つまり、左側の右手)を俯瞰で見ている)
![ng-min.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203445/ec2ab2c8-5ad1-8357-4f7f-eac73de94018.gif)
**ズコー**
**寝てるー！！**

y軸とz軸が違う。
3Dが得意ではない私は、ここでx,y,zの軸はどれがどちらに向くのが正しいのかわからなくなり
旅に出ました。

##もう一つのルールー
Matplotlibに限らず、こういった基準もあるようです。
![xyz変則型.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203445/23922d38-1113-9755-cf14-fd8bba8e5639.png)
ここでは、もう高さとか奥行とかそういうのではなくなってきているというか、
じゃあこの立方体をぐるっとしたら結局同じとか、
言いたいことは分かる、だから何が言いたいの？とか、
バカにはその辺の草でも食わしておけとか、
色々お察しくださいますと幸いです。

先ほどのコードを再度持ち出します。

```python:lets.py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#1点だけ表示されるサンプル(x,y,zにたくさんのデータが入る)
x = np.array([1])
y = np.array([2])
z = np.array([3])

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax = Axes3D(fig)
#y,zを入れ替えてplot
#ax.plot(x,y,z,marker="o",linestyle='None')
ax.plot(x,z,y,marker="o",linestyle='None')

plt.show()
```
お仕事内容に応じて適切にプロットください。

![normal-min.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203445/7a89f2a0-a345-b9a7-ab51-806eedb55b72.gif)

何が起きているか分かるようになりましたし、反転も改善されています。

#付録

```python:appendix.py
#Forを使ってくるっと回転させる
ax.view_init(elev=None, azim=i)
```
![normalround-min.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203445/c7fb1539-9b3e-b4b2-96f2-660f9190f6ef.gif)

アーティストのライブみたいになりました。
[初学者]よく起きるエラー 〜syntax error, unexpected end-of-input, expecting keyword_end〜

#目的
学習の備忘録と初学者の参考資料として投稿

#syntax error, unexpected end-of-input, expecting keyword_endというエラー
コードのエラーってよく赤字で英語表記だから、読む気にならねぇ〜っ:dizzy_face:
しかも焦っちゃう、、、、、:sweat_smile:
実際に単語を訳して見ると

```
単語訳

syntax・・・構文  
unexpected・・・予想外・予期しない 
expecting・・・期待して　　
                       ...etc
```

つまり

endがねぇよ！！ってこと

ハイハイ、書きます書きます:writing_hand:

#まとめ
エラーはパソコンが親切に教えてくれてることなので、恐れず・焦らずに対処したほうがいい。
まずはエラー文を読んでみて、何が書いてるのか理解すれば、簡単に解決することも多い。
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
今後も学習で気づきや参考になるものがあれば、アップしていきます。
もし参考になったらいいね！！よろしくお願いします:bow_tone1:
文字コードの基礎

![topimage.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232631/fd660af9-133b-22d3-82ce-da243dce0d76.jpeg)

####はじめに

文字コード周りは用語の意味が複雑で曖昧な使われ方をしていたりします。

ですので用語の意味を整理してみたいと思います。

####文字コード

そもそも文字コードとはなんでしょうか。
Wikipediaで調べてみると、
「文字コードとはコンピュータ上で文字（キャラクタ）を利用する目的で各文字に割り当てられるバイト表現。
もしくは、バイト表現と文字の対応関係（文字コード体系）のことを指して「文字コード」と呼ぶことも多い。」とあります。
ちょっと分かりにくいですが、大まかに言えば文字コードとは「文字とコードとの対応規則をまとめたもの」といえます。
実際にコンピュータによって文字を処理するためには、0と1の組み合わせによって文字を符号化(エンコード)する必要があるからです。
基本的な理解としては、文字と数値をどのように対応させるかを定義した「ルールブック」と解釈すると分かりやすいかもしれません。

####文字集合

文字コードを決める際には、文字集合（対象となる文字）を定めることが必須となります。
まず文字集合というのは「どのような文字を扱うか」ということを定義するものです。
これによって、そのシステムで扱える文字の種類が決定されます。
文字といってもアルファベット、ひらがな、カタカナ、数字、記号はもとより日本語には非常に多くの漢字が存在しています。
ここで「集合」という言葉は、数学の用語になぞらえて使用されています。
数学において、集合とは互いに区別できる要素の集まりを指します。
同様の意味合いで、文字の集まりを「文字集合」と呼ぶわけです。

####符号化文字集合（文字コードセット）

文字コードは、先述した文字集合という概念の上に成り立っています。
符号化文字集合とは文字集合を定義し 、その集合の各文字に対応するビット組み合わせを一意に定めたものを文字コードといいます。
符号化文字集合（codedcharacterset）ともいいます。
「文字コード」と「符号化文字集合」は、ほぼ同じ意味だと思って差し支えありません。

さて、この文字コードセットにも様々な規格や種類があります。
文字コードセットは、日本語入力システムのMS-IMEで確認することができます。

![IMEpad.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232631/a90aca6f-29f4-bf67-05af-9093a5b2b39e.jpeg)


UnicodeやシフトJIS、JIS X 0208といった文字コードによって独自の文字コードセットが作られていたり、または使い分けられています。
そして、文字コードセットによって、文字と対応する数値の組み合わせが決まるのですが、
日本語のコードの場合には、その数値がそのままの形でコンピュータに使用されることはほとんどなく、
目的や処理の方式によって、この数値が様々な方式で変換されて処理されます。
このように、データを目的に応じた形式（通常はビット列）に変換することを符号化（エンコード）と言います。

####文字符号化方式

コンピューター上では最終的には全てが0と1のデジタルで表現されます。もちろん文字もそうです。
ですので符号化文字集合だけがあっても実際にそれをコンピュータ上ではどのような0,1の並びで表現するのか、
ということが決まっていないとコンピューターでは扱えません。その0,1の並びを定義しているのが文字符号化方式です。
符号化文字集合は複数ありますが、そのそれぞれの集合ごとに1つの文字符号化方式があるというわけではありません。
実際にはひとつの文字符号化方式で複数の符号化文字集合を対象にしていますし、
ひとつの符号化文字集合に対して複数の文字符号化方式が存在しています。
これが文字が読み取れなかったり、文字化けなどの原因となります。
日本語の文字符号化方式は一般に「ISO-2022-JP」、「Shift_JIS」、「EUC-JP」などがあります。
繰り返しになりますが、文字符号化方式は、符号化文字集合で定義された数値をどのように符号化するかのルールを決めたものです。
したがって、同じ符号化文字集合でも文字符号化方式によって異なる形式に符号化されることもあります。
一方、ASCII（アスキー）のような単純な文字コードでは、符号化文字集合で定義された数値（文字と数値を対応させた単純な整数値）を、
さらにエンコードする必要はなく、そのまま使うことができるので、ASCIIは「符号化文字集合」の意味でも用いられます。

![20150913141538.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232631/0ad496ea-ceca-6669-f39b-6454b4e03609.jpeg)


####まとめ

・文字コードと符号化文字集合はほぼ同義で、文字集合の各文字に対応するビット組み合わせを一意に定めたものです。

　JIS X 0208、Unicode 等があります。

・文字符号化方式は、符号化文字集合で定義された数値をコンピュータが解釈できるように

　0,1の並びにどのように符号化するかのルールを決めたものです。

　ひとつの符号化文字集合に対して複数の文字符号化方式が存在しています。

　EUC-JP、Shift_JIS、UTF-8、MS932 等があります。

　ここでは説明は省きますがShift_JIS≒CP932=MS932=Windows-31Jです。

・「Unicode」という「符号化文字集合」に対して「UTF-8」「UTF-16」などの「文字符号化」方式がある、

　同様に、「JIS X 0208」という「符号化文字集合」に対して「ISO-2022-JP」「EUC-JP」「Shift_JIS」などの「文字符号化」方式がある、
　という対応付けになるようです。

![Screenshot_2019-09-26 00:57:59 JST.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232631/f9fbe566-5aef-6355-be03-6fc4bfbde30c.jpeg)
GitlabでGmailアカウントによるSMTPメール送信の設定方法(2019.9時点)

# 概要

[公式サイト](https://docs.gitlab.com/omnibus/settings/smtp.html#gmail)で丁寧にGilabのSMTP設定手順が記載されていたが、残念ながらその設定値では送信できませんでしたので、改めて残したいと思います

以下の設定値でダメなら、以下を試してください

- [安全性の低いアプリと Google アカウント](https://support.google.com/accounts/answer/6010255)を無効にする
- [2段階認証](https://support.google.com/accounts/answer/185839)を無効にするか、[アプリ パスワード](https://support.google.com/accounts/answer/185833?hl=ja)を発行する

# 設定値

`smtp_tls=true` と `smtp_authentication=plain`が公式の設定値と異なります

```ruby:/etc/gitlab/gitlab.rb

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.gmail.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "<gmail user name>"
gitlab_rails['smtp_password'] = "<gmail password>"
gitlab_rails['smtp_domain'] = "smtp.gmail.com"
gitlab_rails['smtp_authentication'] = "plain"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true

###! **Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert'**
###! Docs: http://api.rubyonrails.org/classes/ActionMailer/Base.html
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
```

設定後 `gitlab-ctl reconfigure` を実行します

# 確認方法

`gitlab-rails console`でgitlabコンソールを開き、以下のコマンドでテストメールを送信します
**※上記の設定値を反映したならば、必ず一度gitlabコンソールを終了し、再度始めること!!（そのままだと設定値が反映されない）**
https://docs.gitlab.com/omnibus/settings/smtp.html#testing-the-smtp-configuration

```
> Notify.test_email('destination_email@address.com', 'Message Subject', 'Message Body').deliver_now
```
RHEL8/CentOS8 で yum(dnf) を使って DVD からパッケージをインストールする

# 要約

*   インターネットアクセスが制限されている RHEL8/CentOS8 で `yum(dnf)` を使ってパッケージをインストールする方法。
*   7系までとは違い、 DVD のリポジトリが `AppStream` と `BaseOS` に分かれるので注意が必要。
*   `dnf` が標準になったので `dnf` を使ってドヤれる。[^1]

[^1]: 個人の感想です。

# 背景

セキュリティは厳しいんだけど、そんなにリッチじゃない環境だとインターネットにアクセスできず、プライベートリポジトリサーバも立っていない所は多々あります。
そんな環境で先日リリースされたばかりの CentOS8 をセットアップする機会があったので、早速 DVD から `yum(dnf)` でパッケージをインストールする方法を調べてみました。

# 前提条件

確認したのは CentOS8.0(1905) です。
DVD は `/dev/sr0` にマッピングされているものとします。 ISO ファイルをこの RHEL8/CentOS8 のサーバ内に保存している場合は、 `/dev/sr0` をその ISO ファイルに読み替えてください。

# 手順

## リポジトリを設定する

1.  マウントディレクトリを作成。

    ```shell-session
    # mkdir /media/rhel8dvd
    ```
2.  DVD をマウント。

    ```shell-session
    # mount -o loop /dev/sr0 /media/rhel8dvd
    ```
3.  リポジトリを追加。

    ```shell-session
    # vi /etc/yum.repos.d/InstallMedia.repo
    ```
    `/etc/yum.repos.d/InstallMedia.repo` の中身は RHEL8 か CentOS8 かで微妙に異なります。
    *   RHEL8 の場合

        ```
        [InstallMedia-BaseOS]
        name=Red Hat Enterprise Linux 8 - BaseOS
        metadata_expire=-1
        gpgcheck=1
        enabled=1
        baseurl=file:///media/rhel8dvd/BaseOS/
        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

        [InstallMedia-AppStream]
        name=Red Hat Enterprise Linux 8 - AppStream
        metadata_expire=-1
        gpgcheck=1
        enabled=1
        baseurl=file:///media/rhel8dvd/AppStream/
        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
        ```
    *   CentOS8 の場合

        ```
        [InstallMedia-BaseOS]
        name=Red Hat Enterprise Linux 8 - BaseOS
        metadata_expire=-1
        gpgcheck=1
        enabled=1
        baseurl=file:///media/rhel8dvd/BaseOS/
        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

        [InstallMedia-AppStream]
        name=Red Hat Enterprise Linux 8 - AppStream
        metadata_expire=-1
        gpgcheck=1
        enabled=1
        baseurl=file:///media/rhel8dvd/AppStream/
        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
        ```
    RHEL8 と CentOS8 では `gpgkey` のファイル名が異なります。
    編集出来たら `vim` を保存して終了。
4.  キャッシュクリア

    ```shell-session
    # dnf clean all
    ```
    ~~`dnf` コマンドを使った最初のドヤりポイント。~~

## DVD からパッケージをインストール

リポジトリを設定したら DVD からパッケージをインストールすることができます。

```shell-session
# dnf install httpd
```

標準で設定されているリポジトリを一時的に無効化して DVD のリポジトリだけを利用する場合は次のように実行します。

```shell-session
# dnf install --disablerepo=\* --enablerepo=InstallMedia-* httpd
```

・・・そういえば、 CentOS7 までの `yum` は有効になっているリポジトリの内、一つでもアクセスできないリポジトリがあると何もインストールできなかったのが、 RHEL8/CentOS8 ではアクセスできるリポジトリだけで依存関係を解決できるならインストールできるようになった気がする。

# 余談

`dnf` コマンドは `yum` コマンドに置き換えてもそのまま動作します。
ただ、実体としては `dnf-3` に置き換わっているみたいですね。

```shell-session
# ls -l /usr/bin/{yum,dnf*}
lrwxrwxrwx. 1 root root    5 May 13 19:34 /usr/bin/dnf -> dnf-3
-rwxr-xr-x. 1 root root 1954 May 13 19:34 /usr/bin/dnf-3
lrwxrwxrwx. 1 root root    5 May 13 19:34 /usr/bin/yum -> dnf-3
```

# FYI

*   [Need to set up yum repository for locally-mounted DVD on Red Hat Enterprise Linux 8 - Red Hat Customer Portal](https://access.redhat.com/solutions/3776721)

おしまい。
text_fieldのplaceholderを改行する方法

## はじめに
railsのtext_fieldで作成したテキストボックスに改行ありのplaceholderを書きたかった。

ただ調べると文字列に改行コードをいれたり、cssでいじったりと、
個人的にはあまりやりたくない方法しかでてこなかったので、なにか完結にできる方法がないかを模索していた。

## 実装
helperでヒアドキュメントを使って文字列を定義する。
それをテンプレート側(haml)で呼び出すだけ。

## ソース
```haml
= f.text_area :text, class: 'form-control', placeholder: text_placeholder
```

```rb
def text_placeholder
  <<-"EOS".strip_heredoc
    行1
    行2
    行3
  EOS
end
```

## キャプチャ
こんな感じにうまく表示されました。
<img width="1124" alt=" 2019-09-27 13.01.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367855/87367e1f-f1c0-87cd-d515-dab9385532ac.png">
numpyのarrayをpandasのDataFrameにした時に、リストのまま入れる方法

#どういう事？
```python
array = np.array([[1, 2, 3], [4, 5, 6]])
```
このnumpyの配列をpandasのDataFrameにすると・・・

**理想**

| index | 0 |
|:-:|:-:|
| 0  | [1, 2, 3]  |
| 1  | [4, 5, 6]  |

**現実**

| index | 0 | 1 | 2 |
|:-:|:-:|:-:|:-:|
|  0 |  1 | 2  |3   |
|  1 |  4 | 5  | 6  |


PandasのDataFrameを挟んだ後、SparkのDataFrameにして、udfで処理したい時にこう言った理想が生まれます。
この理想を叶えたい時には・・・

#サンプルコード
```python
import numpy as np
import pandas as pd

array = np.array([[1, 2, 3], [4, 5, 6]])

df = pd.DataFrame(array)
df['list'] = df.apply(lambda x:x.tolist(), axis=1)
df = df.loc[:, ['list']]

print(df)
```
**出力**

| index | list |
|:-:|:-:|
|  0 | [1, 2, 3]  |
|  1 | [4, 5, 6]  |

---
10/4 追記

```python
pd.Series([*array]).to_frame()
```
でも出来るとのコメントをいただきました。
こっちのほうが簡潔でいいですね・・・（僕はto_frame()という関数を初めて知りました）
【備忘録】よちよち学ぶreactのいろいろ①（プログラミング赤ちゃん用）

# Reactってなに？　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402509/b4e448b2-c3de-7f4d-3d2e-aac4e053cf42.png)

最近いろんな言語に触れて、どれで何ができるか、何が流行っているのか等
色々勉強しようかなと思っているのですが、同期から**『Reactいいよ！』**って聞いたのでやってみることにしました。
何がいいのか。。とりあえずGoogle先生にReactとは何かを聞いてみました。

私は自分用に書いていますが、
この記事めっちゃわかりやすいので紹介します。

[できる限り短く説明するReact.js入門](https://qiita.com/rgbkids/items/8ec309d1bf5e203d2b19)

下記わたしの印象です

- JavaScriptのフレームワーク
- HTMLとかのコードを中に記述できてすごい！
- Facebookが開発してるから注目されてる激アツフレームワーク
- ボタン押したらその画面でなにか起こる！みたいなことできる
- つまりサイトの見た目をつくることができる！

色々記事見ましたが、私の脳みそが赤ちゃん過ぎてまだよくわかりませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402509/201d281e-b85d-d9ef-cc8b-1ce707d0e657.png)

とりあえず勉強してみようかと。

##Reactを私がどうやって勉強しているか

まず上記で一番知っておくべきことは
`ReactはJavaScriptのフレームワークだ`ということです。
つまりJavaScriptのことは少しだけでも知っておかないと！ってことだ！ってなりました。
そこで便利なのが、私が月額約1000円払って利用している[Progate](https://prog-8.com/)です。（課金したくない方はごめんなさい）

無課金派だと、[ドットインストール](https://dotinstall.com/)おすすめされてます！！
~~私は動画見てると眠くなっちゃうので、みませんが、~~[Schoo](https://schoo.jp/)とかも有名ですよね。
どちらも課金版あるかと思いますが、無課金でもコンテンツ多めだと思います。
Reactの勉強を最初にするのはやはり[Progate](https://prog-8.com/)がおすすめです。
**これだけわかりやすかったら約1000円払ってもいいんじゃないかなと思います。**

なので、勉強順でいうと、
1.　動画コンテンツ等でJavaScriptについて触れる
2.　Reactやってみる
だと思います。

ある程度勉強やってみたら、実際にReactをインストールしてみましょう！！

#環境構築

**Windows**
⇒[Reactの開発環境をWindows上に構築する。](https://www.paveway.info/entry/2019/03/18/react_install)
**Mac**
⇒[macで1からReactの環境構築をするのだ](https://qiita.com/spice/items/b75afb607f1d2e1172a2)

私はWindows版の上記サイトで環境構築していたのですが、

```sh
npm install -g create-react-app
```
これをコマンドで実行したところ、プロキシがうんたら言ってるエラーが出てしまいました。
会社のPCで環境構築していたのでなんとなくこうなるだろうとは思っていたのですが、プロキシが関わる時の
私の無力さ半端ないです。**いきなりラスボスでてきたような気持ちに。**

とっさに同期に「たすけてたすけてもういのちがない私はプロキシに破壊される」といったところ、
教えてくれました。ありがとう人生が始まった...

①まず現在のプロキシの設定を確認する

```sh
npm config ls -l
```
proxyの欄を見るとnullになっていたので、設定されていないことがわかります。

②プロキシを設定する
（[プロキシサーバーを使う際に役立つ！npm proxyの使い方【初心者向け】](https://techacademy.jp/magazine/16379)より）

```sh
npm -g config set proxy http://<プロキシのホスト>:<ポート番号>
```
※上記<>は外してください。
※ポート番号などの情報の見方がわからない方は[Windows10のプロキシ設定を確認する方法](https://pasokatu.hateblo.jp/entry/2017/07/04/111147)などを確認してください。

③プロキシが設定されているか確認する

```sh
npm config list
```
こちらのproxyの欄にちゃんとホストとポート番号が書いてありました！これでプロキシをたおせた！
なので環境構築再開して。。。
。。。。。。。。。できた！！！！！！！（祝杯）


ということで今日はここまで。
おつかれさまでした。
次回もReactについて書いていきたいと思います。
関数なしでPL/pgSQLを実行する方法

時々、テスト用のデータを作成するために、LOOPなどを簡単に実行できる方法を探したかったです。
関数でもできますが、一回しか使わないものに対しては面倒です。
ネットで色々調査した結果、DO文で簡単に実現できました。

```sql:例文
do
$$
declare i int;
begin
for i in 1..10 loop
insert into t1 values(i);
end loop;
end
$$;
```
vim(gitbush)基本編

html&cssを書くのにAtomを最初に使用していたのですが。。
JAVAを使いだしてからはすぐにGitbBushを導入してvimで記述しております。
（macならターミナルでいいらしい）

<details><summary>GitbBushとは</summary>
簡単に言えば、命令を画面に打ち込みコンピュータが命令に従いファイルの操作やファイルの編集、削除といった操作ができるソフトウェアです。
よくUnixやLinuxといったOSに搭載されており、Unixコマンドと言われているコマンドを打ち込むことで様々な命令を出すことができます。
つまり、Git BashとはGitの機能が搭載されたBashというものになります。</details>

最初のうちは扱いずらいなーと思ってましたが慣れたら作業的にもかなり時短になるなと個人の感想。

よくわかってませんしたがvimはかなり渋いらしいです。

[title](https://www.sejuku.net/blog/72673)
インストール手順は上を参照

次にvimtutorを触ってみました。

```
$ vimtutor
```
#モード切替

| 内容 | キー |
|:-----------|------------:|
| インサート       | i        | 
| ノーマル     | ctrl + c      | 



#移動コマンド

| 内容 | キー |
|:-----------|------------:|
| 上       | w        | 
| 下     | s      | 
| 右       | d        | 
|   左       | a          | 

#保存関係

| 内容 | キー |
|:-----------|------------:|
| save       | /wq        | 
| 何もせずぬける     | /q!      | 
| 複製       | /w ファイル名.java        | 

#行番号

| 内容 | キー |
|:-----------|------------:|
| 有       | :set number        | 
| 無     | :set nonumber      | 

#コピペ、消す

| 内容 | キー |
|:-----------|------------:|
| ヤンク(コピー）       | yy        | 
| 消す（デリート)     | dd      | 

上に行数＋(3yy)で便利に

以上基本的に覚えて損がなかったコマンドでした。
TerraformでJSONを扱う方法

Terraformでjsonを利用する際の方法をまとめました。
AWSはIPアドレスのレンジをjsonで公開していたりするので、Terraformでアクセス許可設定するときなど便利そうです。（例として利用します）

v0.12 から使えるようになった For Expression (jsondecodeもだけど) がとても便利で、下の例のようにregionやserviceで絞り込むことも出来るのでかなり使いやすいと思います。

AWS IP range: https://ip-ranges.amazonaws.com/ip-ranges.json

## ローカルのjsonを利用

```
output "local_aws_ip_range" {
  value = [ for prefix in jsondecode(file("./ip-range.json"))["prefixes"] : prefix.ip_prefix if prefix.region == "ap-northeast-1" && prefix.service == "EC2" ]
}

# 出力結果
local_aws_ip_range = [
  "52.194.0.0/15",
  "54.168.0.0/16",
  "54.238.0.0/16",
  "54.250.0.0/16",
  "54.92.0.0/17",
  "18.183.0.0/16",
  "176.32.64.0/19",
  "52.196.0.0/14",
  "175.41.192.0/18",
  "54.150.0.0/16",
  "99.77.139.0/24",
  "54.199.0.0/16",
  "176.34.32.0/19",
  "54.248.0.0/15",
  "18.182.0.0/16",
  "13.112.0.0/14",
  "52.68.0.0/15",
  "52.94.248.80/28",
  "54.95.0.0/16",
  "52.95.243.0/24",
  "3.112.0.0/14",
  "18.178.0.0/16",
  "52.192.0.0/15",
  "13.230.0.0/15",
  "54.178.0.0/16",
  "18.180.0.0/15",
  "52.95.255.48/28",
  "103.4.8.0/21",
  "18.179.0.0/16",
  "46.51.224.0/19",
  "54.64.0.0/15",
  "176.34.0.0/19",
  "18.176.0.0/15",
  "15.193.1.0/24",
]
```

## HTTPで取得したjsonを利用

```
data "http" "aws_ip_range" {
  url = "https://ip-ranges.amazonaws.com/ip-ranges.json"
}

output "aws_ip_range" {
  value = [ for prefix in jsondecode(data.http.aws_ip_range.body)["prefixes"] : prefix.ip_prefix if prefix.region == "ap-northeast-1" && prefix.service == "EC2" ]
}

# 出力結果
aws_ip_range = [
  "52.194.0.0/15",
  "54.168.0.0/16",
  "54.238.0.0/16",
  "54.250.0.0/16",
  "54.92.0.0/17",
  "18.183.0.0/16",
  "176.32.64.0/19",
  "52.196.0.0/14",
  "175.41.192.0/18",
  "54.150.0.0/16",
  "99.77.139.0/24",
  "54.199.0.0/16",
  "176.34.32.0/19",
  "54.248.0.0/15",
  "18.182.0.0/16",
  "13.112.0.0/14",
  "52.68.0.0/15",
  "52.94.248.80/28",
  "54.95.0.0/16",
  "52.95.243.0/24",
  "3.112.0.0/14",
  "18.178.0.0/16",
  "52.192.0.0/15",
  "13.230.0.0/15",
  "54.178.0.0/16",
  "18.180.0.0/15",
  "52.95.255.48/28",
  "103.4.8.0/21",
  "18.179.0.0/16",
  "46.51.224.0/19",
  "54.64.0.0/15",
  "176.34.0.0/19",
  "18.176.0.0/15",
  "15.193.1.0/24",
]
```
Mac に TeX 環境をインストールしてパッケージを追加する

# やりたいこと
Mac に TeX 環境を簡単にインストールしたかった。
コマンドは `pdflatex` とか `pdftex` あたりを使いたい

# やったこと
主に、参考文献[1] の *TeX Live 公式のインストーラの使用* のところを参考に、`install-tl` を使ってインストールした。

ただし、mirror.ctan.org は調子が悪かったので、 jaist のミラーサーバーを使用した。

```shell

wget http://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet/install-tl-unx.tar.gz
tar xvf install-tl-unx.tar.gz
sudo ./install-tl -no-gui -repository http://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet/
```
これで、以下のような場所に `pdflatex` 等が一通り入る。
`/usr/local/texlive/2019/bin/x86_64-darwin/pdflatex`


パッケージのインストールは、 `tlmgr` を使用。

```shell
sudo tlmgr update --self --all  # アップデート
tlmgr info [pkg] # パッケージを探す
sudo tlmgr install [pkg] # パッケージをインストール
```

# 参考文献

[1] https://texwiki.texjp.org/?TeX%20Live%2FMac#texlive-install-official
Spring Boot マイグレーションに伴う関連リンク集

いつも探す羽目になってしまうので、リンク集としてまとめておく。基本的には公式のみ。

# Spring Boot Link
## Spring Boot Top
https://spring.io/projects/spring-boot

## Spring Boot properties一覧
https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

## Spring Boot milestones
https://github.com/spring-projects/spring-boot/milestones

## Spring Boot リリースノート
https://github.com/spring-projects/spring-boot/wiki

## SpringのGA、RC、M2のリリースの違いは何ですか？
https://stackoverflow.com/questions/2107484/what-is-the-difference-between-springs-ga-rc-and-m2-releases
https://codeday.me/jp/qa/20190228/339168.html

# Spring Boot マイグレ系
## Spring Boot migration guide
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide

## Spring FWのVersionについて
https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions

## Spring Securityの変更点について
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Security-2.0
[初学者]シングルクォーテーションとダブルクォーテーションの違い（ruby）

#目的
学習の備忘録と初学者の参考資料として投稿

#シングルクォーテーションとダブルクォーテーション
ネットや参考書などでよく見られる’’や””の違いについての話。特にプログラミングを初めて勉強する方にとって、どちらにするかで非常に悩ましい場面に遭遇することがあります。

```sample.rb
'Hello world' 
=>Hello world

"Hello world"
=>Hello world
```

こんな感じの:grin:


#ダブルクォーテーションの役割
式展開や改行文字列を入れたい場合はダブルクォーテーションで囲む必要がある。

```sample.rb
puts "Hello \n world" **改行文字列**
=>Hello
  world

name = Taro
puts "Hello #{name}" **式展開**
=>Hello Taro
```

#まとめ
基本はダブルクォーテーションでいいのでは:point_up:
いろんな記事を見てるとダブルクォーテーションだと読み込み速度が遅くなるやシングルクォーテーションを書いて、視認性をよくするなどなど書いてあるが、特に気にしなくてもいい:ok_hand:

今後も学習で気づきや参考になるものがあれば、アップしていきます。
もし参考になったらいいね！！よろしくお願いします:bow_tone3:
Rails Webアプリケーション管理者権限でユーザー削除出来なかったエラー（初心者）


#動作確認で管理者としてユーザーを削除しようとしたらエラー発生。
忘れないために自分用忘備録

以下エラー文
ActiveRecord::StatementInvalid in UsersController#destroy

Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails・・・・・
##原因
dependent: :destroy書き忘れていた為に発生したエラー
要するに、削除しようとしているユーザーの投稿、follower、お気に入り等どうするのって話。


##対策
UserテーブルとPostテーブルを関連付けするために以下のコードを追加し、
Userのデータが削除されたときに、関連するPostのデータを削除するように設定。

dependent: :destroy

```ruby:app/models/user.rb
class User < ApplicationRecord
  has_many :posts, dependent: :destroy
  has_many :follows, dependent: :destroy
  has_many :favorites, dependent: :destroy
end
```
これでユーザーに関連付けられたデータは削除完了。
Rのggplot2で散布図のポイントの大きさの区切りを変更したい場合

探すと意外とこの操作を書いているブログ記事がなかったので、備忘録を含めて投稿しておきます。
よくこのサイトに助けられている、仕事でRを使うユーザーです。

ggplot2　パッケージのgeom_pointで散布図を描きたい場合、点の大きさを何らかの連続的な変数（例えば人口やGDP）で表す場合があると思います。これ自体は、

```plot.r
g01 <- ggplot(何かのdf,aes(x = 横軸変数,y = 縦軸変数)) +
       geom_point(aes(size = 人口))
plot(g01)
```
で表示されますが、たまに、人口による点の大きさがソフトのほうで任意で設定されるので、こっちの思い通りの図にならない場合があると思います。
そういう場合は、

```plot2.r
g01 <- ggplot(何かのdf,aes(x = 横軸変数,y = 縦軸変数)) +
       geom_point(aes(size = 人口))+
       scale_size(name="凡例名",
       breaks = c(100,1000,10000,10000000))
plot(g01)
```

とこのscale_size関数のbreaksのところで連続数の区切りを任意に変更できますので、同じ悩みを持つ人はご参考までに。
Xcode11で作成したプロジェクトからSceneに関する機能をオミットする

Xcode11とUISceneとUIWindowにまつわるトラブルシュートに追われている。
個別のケースに分解してお届け。

## 背景

Xcode10で作成したプロジェクトをXcode11で開いた場合と、Xcode11で作成したプロジェクトで `UIWindow`の振る舞いが異なった。この違いはプロジェクトがScene Based Lifecycleに対応しているかどうかに左右されることが分かった。

## 対応

簡単に言うと以下を実施すればよい。

- `AppDelegate`に`window`を生やす
- Info.plistから`Scene`に関する項目を取り除く
- `AppDelegate`から`Scene`に関する項目を取り除く

これにより、iOS13で動かしてもAppDelegateを基本としたアプリのように動作する。（View Hierarchyを見るとUISceneは健在なので、互換性を保っているだけっぽい）

### `AppDelegate`に`window`を生やす

Sceneに関連する物事をオミットしたあと、AppDelegateにwindowプロパティが無いとブラックアウトしてしまうので、生やす。

```swift
// AppDelegate.swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
}
```

```objc
// AppDelegate.h
@interface AppDelegate: UIResponder <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow *window;

@end
```

### Info.plistから`Scene`に関する項目を取り除く

Info.plist から [Application Scene Manifest] の項目を取り除く。

ここまでの対応だけだと、iOS13でアプリを実行した場合に表示すべきStoryboardの情報が見つけられずブラックアウトする。

### `AppDelegate`から`Scene`に関する項目を取り除く

AppDelegateから、Scene Based Lifecycleに関するメソッドを取り除くことで、オミットが達成される。

具体的には、以下を取り除けば良い。

- `AppDelegate application:configurationForConnectionSceneSession:`
- `AppDelegate application:didDiscardSceneSessions:`
webpack-dev-serverのオートリロードをChromeのタブごとに一時的に無効化したい

## はじめに

[webpack-dev-server](https://github.com/webpack/webpack-dev-server)のオートリロード(Hot Module Replacement)はすごく便利ですが、

ブラウザでアプリを開いている際に、一時的にオートリロードを停止したい場合があります。

例えば、JSのバグ修正や、CSSの調整をする際に

* タブAでは修正前の状態でアプリ動かつつ

* タブBでは修正後の状態でアプリを動かして見比べながら修正したい

といった状況はよくあると思いますが、オートリロードが効いていると、タブAも最新の状態になってしまいます。

この投稿では、webpack-dev-serverのアプリにアクセスしている状態で、オートリロードを一時的に無効化する方法を紹介します。

[create-react-app](https://facebook.github.io/create-react-app/)もwebpack-dev-serverを使っているため、同じ方法でオートリロードを無効化できます。







## hrome DevToolsのリクエストブロック機能を使う

Chrome DevToolsには、指定したURLに対するリクエストをブロックする機能があるので、この機能を使用します。

### Chrome DevToolsでのリクエストブロック機能の使い方

開発ツールを開いた状態で、右上のメニューボタン -> 「More tools」 -> 「Request Blocking」から設定します

<img width="500" alt="1 2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16039/7ed5f47a-5e58-081b-53b3-5d5a224469f1.png">

URLには、ホットリロードで使用しているWebSocketのURL`$URL:$PORT/sockjs-node`を指定します。

例えばローカルのwebpack-dev-serverをポート3000で起動している場合は

`localhost:3000/sockjs-node`

を指定します。

<img width="500" alt="2 2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16039/5189eb39-74c5-7202-230b-b516b06ab685.png">

URLを指定した後は、「Enable request blocking」のチェックボックスにチェックをつければホットリロードを無効化できます。

<img width="500" alt="3 2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16039/9e95c27d-987a-b095-8e8d-5cfbd3e64d66.png">






## デモ

実際にwebpack-dev-serverのホットリロードを無効化したタブと、有効なタブを同時に開いているデモです。

* 左のタブはリクエストブロック機能でホットリロードが無効

* 右のタブはホットリロードが有効

の状態です。

![800.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16039/13863918-9076-6654-d503-ef81d74122c1.gif)





### 参考

https://github.com/facebook/create-react-app/issues/2519#issuecomment-318867289
laravel ログファイル log 複数分ける

# laravelのログ・ファイルを日時別に分けず、一つのファイルにする

laravel-2019-11-08 ではなく、
laravel.log という一つのログファイルにする。



```logging.php

'default' => env('LOG_CHANNEL', 'single'),

```



.env

```

LOG_CHANNEL=single

```


```

php artisan config:clear

```

`OK!`


# credit用 ログファイルを作成


```logging.php

'credit' => [
            'driver' => 'single',
            'path' => storage_path('logs/credit.log'),
            'level' => 'debug',
        ],


```

ログのとり方

```

Log::channel("credit")->debug("これが記載");

```

`OK`





# laravel ログの パーミッション変更


laravelのログファイルを見るphpを組んでいるんだが、
毎回削除するようにするとふとした瞬間に権限エラーになる。

ということで、

・logファイルの権限を変更
・ログを表示したらファイルを空にする。

ということをやってみよう。

# エラー内容

```

UnexpectedValueException
The stream or file "/path/to/storage/logs/laravel.log" could not be opened: 
failed to open stream: Permission denied


```



# 権限を置き換え

```

sudo chown -R nginx:nginx storage
sudo chmod -R 775 storage


```

これで動くようになる。


# ログファイル表示して削除はこれで。

```

//    ログ・ファイル取得し表示
    public function log()
    {
        $log = storage_path()."/logs/laravel.log";
        
        if(is_file($log)){
            $res = file_get_contents($log);

            $fp = fopen($log, 'r+');
            flock($fp, LOCK_EX);
            ftruncate($fp,0);
            flock($fp, LOCK_UN);
            fclose($fp);

        } else {
            $res = 'ログはありません';
        }


        $res = str_replace(",",",<br>",$res);



        print_r($res);


        die;
    }


```


# 行数の取得


Loggingフォルダごと、新規作成。

```app\Logging\CustomizeFormatter.php

<?php

namespace App\Logging;

use Monolog\Formatter\LineFormatter;
use Monolog\Logger;
use Monolog\Processor\IntrospectionProcessor;
use Monolog\Processor\WebProcessor;
use Monolog\Processor\ProcessIdProcessor;

class CustomizeFormatter
{
    /**
     * ログのフォーマット
     * @var string
     */
    private $logFormat = '[%datetime% %channel%.%level_name% %extra.class%::%extra.function%(%extra.line%)] %message% %context%' . PHP_EOL;

    /**
     * 日付のフォーマット
     * @var string
     */
    private $dateFormat = 'Y/m/d H:i:s.v';

    /**
     * 渡されたロガーインスタンスのカスタマイズ
     *
     * @param \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($monolog)
    {
        // フォーマットを指定
        $formatter = new LineFormatter($this->logFormat, $this->dateFormat, true, true);

        // extraフィールドの追加
        $ip = new IntrospectionProcessor(Logger::DEBUG, ['Illuminate\\']);

        foreach ($monolog->getHandlers() as $handler) {
            $handler->setFormatter($formatter);
            $handler->pushProcessor($ip);
        }
    }
}

```

```app\Logging\CustomizeFormatter.php

'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'),
            'tap' => [App\Logging\CustomizeFormatter::class],//大事
            'level' => 'debug',
        ],

```


表示される ログ

```

[2020/03/17 13:44:40.683 local.DEBUG App\Http\Controllers\SuicreditController::webhook(51)] array (
  'id' => 100,

  'name' => 600,

) 

```
気象庁防災XMLのPull型提供（Atom Feed）の品質

気象庁防災情報XML形式によるデータ公開は、2012年12月17日から始まった WebSub プロトコル（旧称PubSubHubub）による [PUSH 型提供](http://xml.kishou.go.jp/open_trial/index.html)に加えて、Atom Feed により HTTPS GET だけで構築できる [PULL 型提供](http://xml.kishou.go.jp/xmlpull.html)が行われています。

ご紹介は前回書きました https://qiita.com/e_toyoda/items/185c1dea055e230918b9

PULL 型提供は利用者のみなさまのご要望で追加されたものですし、中の人としても CDN の活用により利用者数に対してスケールする効率的なものですから、これをデジタル・トランスフォーメーションの基幹として推進するくらいのつもりでいるのですが、どうも新しいものは品質が心配という話がよく聞こえてきます。

以下のように考えているので、ダメだったら @etoyoda （twitter:e_toyoda） に教えてください。

2021-12-16 補足：HSTS化にご注意ください
https://qiita.com/e_toyoda/items/19b53286264cfe47ba9f

# フィードの更新が遅い

すみませんキャッシュ設定が悪かったです。かなり早くなりました。

HTTP ヘッダを読める人ならだれにでもわかることですが、2019年9月12日までは max-age: 600 としていました。これにより CDN キャッシュサーバが古い応答を返していました。今は max-age: 60 です。

（2021-01-06 追記：昨日まで max-age: 600 になっていました。2020年11月頃からだと思います。
今は60に戻しています。[監視する](https://github.com/etoyoda/feedfollow/commit/3b4f3dfe54b80883c085d1ce505e6335d6748683)ことにしました。）

# フィード内容に漏れがある

すみませんキャッシュ設定が悪かったです。もう漏れないと思います。

過去10分間（＝600秒）の新着電文を記載するフィードが、オリジンサーバで毎分更新されており、これを max-age: 600 のキャッシュサーバ越しにアクセスすると、一部新着電文が見られないことがあります。説明が長くなるので、どっかで解説があったら引用したいのですが。

# フィードを逐次取得すると巻き戻ることがある

受信者さまで地理冗長した複数クライアントシステムをお持ちではないでしょうか。正確には所在府県市町村ではなく、経路と CDN キャッシュサーバが別になると、CDN による遅延が異なり、フィード巻き戻りが報告されたことがあります。私が個人的にやっている受信試験（さくらのVPSの単独クライアント機）では、巻き戻りは観測されていません。

CDN はやめられないですのでご容赦ください。CDN 遅延量は上記設定変更により大幅に縮小したので、巻き戻りはなくすことはできなくても幅は小さくなるでしょう。

関連して、重複 uuid のチェックは、複数クライアントの consolidate をするならどのみちやめるわけにはいかないでしょう。また、PUSH 型でも重複配信が起こらない保証は Google Public Alert 側でしていなかったし、現に 2012 年にログをよく見ていたときにはけっこう重複配信が起こっていたと記憶しています。

# フィードに書かれた電文本体の URL にアクセスしたら 404 だったことがある

すみませんが絶対ないとは言えません。リトライしてください。

個人的には観測していないので分析が進んでいません。

# 遅延量どんくらいなの
図中、オレンジの線がPULL型の遅延量ヒストグラムです。棒グラフにしないと怒られるのでしょうが、多数要素を比較したいののでご容赦ください。フィード作成から８０秒（秒の位を切り捨てているので８９秒と言ったほうが良いでしょう）以内に９０％の電文の本体ダウンロードまでできています。２０秒と８０秒に山があって、この比率は毎分２０秒起動というチューニングでよくなりました。

図中緑の線は比較のためPUSH型の遅延量ヒストグラムです。手が回らずPOSTメソッド処理までしか書いておらず、電文本体の取得保存にかかる時間が入っていませんが、まあ数秒でしょう。一見すると最頻値がギリギリ１０秒だったり、５９秒以内に９０％の電文の更新が通知されたり、多少優秀ようにも見えますが、たまに２時間近い巨大遅延配信があったりして、Alert Hub内部のことですからよくわかりませんが、品質が高いと手放しで褒められるものではありません。

まあ、**ざっくりいうと、PULL型提供でも概ねPUSH型と同程度の品質は達成できた**、と受け止めています。

図中灰色の線は、気象庁内での取り扱いにかかる時間です。データの種類ごとに庁内での配信も異なるので、平べったいグラフになっていますが、全体としてみれば１分程度の遅延はあります。

![pull-20190926.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229017/4485ecb8-7998-e5a5-4991-fb7df8bf78c8.png)
【C++Builder】64bitの.aをDLLから作成する方法

他社が作ったdllを使わないといけなくて、「静的リンクしてください」と注意書きがあるのに、64bitでlibしか用意されていなかった・・・ので詰んだかと思いきや、「コマンドを使えばdllから.aを作成できるよ」と教えてもらいました。
このやり方を忘れる自信があるのでメモ。

## A.dllからEmbarcadero用のlibを作成
dllからリンク用のファイルを作成するには以下のコマンドをコンソールで実行します。読み込むdllが32bitか64bitかで実行するコマンドが異なります。

1. 32bitの場合（.lib）

```
> implib  ./A.lib  ./A.dll　　　　
```

2. 64bitの場合（.a）

```
> mkexp　./A.a ./A.dll
```

## 

[参考]
http://docwiki.embarcadero.com/RADStudio/Rio/ja/RAD_Studio_%E3%81%A7%E3%81%AE_DLL_%E3%81%AE%E4%BD%BF%E7%94%A8%EF%BC%88C%2B%2B%EF%BC%89

以上！
Pythonで2つのリストの差集合を順序を保持したまま求める

#どういう時に使うの？
通常リストの差集合を求める際にはset型というものを用いて求めます。
しかし、リストをset型に変換した時点で数字の昇順等でソートされてしまい、重複も削除されてしまいます。
リストの順序が何らかのスコアの高い順のID、のようなデータだと、重要な要素が失われてしまうことになります。
そのようなデータに対して使う感じです。

#イメージ
```python:イメージ
list1 = [5, 4, 3, 2, 1]
list2 = [2, 4]

result = [5, 3, 1]
```
list1 - list2というイメージです。

#list2の数字をlist1内から一括削除したいとき
##Python版
```python:sample.py
list1 = [5, 4, 3, 4, 2, 1]
list2 = [2, 4]

result = [i for i in list1 if i not in list2]
print(result)
[5, 3, 1]
```
##Pyspark版
```python:sample.py
import pyspark.sql.functions as F

@F.udf(returnType=ArrayType(IntegerType()))
def udf_list_diff(l1, l2):
    for i in l2:
        l1.remove(i)
    return l1
```

#list2の数字をlist1内の最初の数字だけ削除したいとき
##Python版
```python:sample.py
def list_diff(l1, l2):
    for i in l2:
        l1.remove(i)
    return l1

list1 = [5, 4, 3, 4, 2, 1]
list2 = [2, 4]

result = list_diff(list1, list2)
print(result)
[5, 3, 4, 1]
```
##Pyspark版
```python:sample.py
import pyspark.sql.functions as F

@F.udf(returnType=ArrayType(IntegerType()))
def udf_list_diff(l2, l2):
    return [i for i in l1 if i not in l2]
```
#appendix
##順序を保持しなくてもよい場合
```python:sample.py
list1 = [5, 4, 3, 4, 2, 1]
list2 = [2, 4]

result = (list(set(list1) - set(list2)))
print(result)
[1, 3, 5]
```
モーダルウィンドウを開いたときだけ画像をロードする

画像を遅延ロードしてるのにPSIのスコアがなぜか低い、と思ったらモーダルウィンドウ内の画像が遅延ロードされていなかったのでメモ
ただしこの方法だとモーダルウィンドウを開いたときにモーダル内の画像が全て読み込まれるので注意

### モーダルウィンドウを開いたときだけモーダル内の画像をロードする

ざっくり書くとimgタグのsrcに読み込み前の画像、data-srcに読み込み後の画像を配置して、
モーダルウィンドウが開いたときにjQueryでdata-srcをsrcに代入しています。

モーダルウィンドウはBootstrap4で実装しています。


```html:modalwindow
<!-- モーダルの設定 -->
<div class="modal fade myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog modal-xl" role="document">
    <div class="modal-content">
      <div class="modal-body text-center">
        <!-- srcに読み込み前の画像、data-srcに読み込み後の画像 -->
        <img class="lazy_load" src="noimage.jpg" data-src="something.jpg">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
      </div>
    </div><!-- /.modal-content -->
  </div><!-- /.modal-dialog -->
</div><!-- /.modal -->
```

jQueryは以下のようになります

```js:modalwindowlazyload
$('.myModal').on("show.bs.modal", function () {
  $('.lazy_load').each(function(){
      var img = $(this);
      img.attr('src', img.data('src'));
  });
});
```

おわり
よく使う psql コマンド

何回やっても覚えられないコマンドのめも。

```
データベースの一覧表示
# \l

データベースへの接続
# \c database_name

テーブル一覧表示
# \z
```

もっと詳しい知りたいときは、[PostgreSQLコマンドチートシート](https://qiita.com/Shitimi_613/items/bcd6a7f4134e6a8f0621) を要参照
【OCI】oracle cloud -仮想クラウド・ネットワーク構築編(NATゲートウェイ)-【初心者向け】

# ネットワーク・セキュリティグループ
パブリックIPを持たないサーバーがインターネットに接続するのを中継する役割
VCNにNATゲートウェイを追加して、インターネットに非公開サブネットのアクセス権を付与できます。

## 前回の記事でセキュリティ・リストを作成しました。

セキュリティ・リストの作成を見たい方はこちらから
[セキュリティリスト編](https://qiita.com/manaki079/items/d18c26cc9504d77a577b)

## NATゲートウェイの作成
サブネットを作成したいVCNの詳細ページ
左側のリソース→NATゲートウェイをクリック
![instance_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/323eb941-e53e-bc49-8ad8-6753dfe9100d.png)

NATゲートウェイの作成をクリック
![instance_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/0c33ce30-ff05-b492-c93a-c73dd9772232.png)

| 項目       | 概要|
|:-----------------|:-----------------|
| 名前             | 任意のNATゲートウェイ名を入力します。 |
| コンパートメントに作成           | 作成するコンパートメントが間違っていないか確認|

入力し終えたらNATゲートウェイの作成をクリックで完了
![instance_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/558283ef-f200-4404-d583-1a58ca2d1004.png)


## 次回
ルート表の作成を行っていきます。

[ルート表編はこちら](https://qiita.com/manaki079/items/c2177c8198d2d4f8d654)
[Xcode11]カスタムトランジションが遷移しなくなった時の対処法

久々の投稿です。パッと見ではヒットしなかった話題なのですが、ハマる人もいる気がするので軽めに書きます。

## 何が起こったか

`UIViewControllerTransitioningDelegate`を利用してトランジションアニメーションを導入していたアプリをXcode11でビルドしたところアプリが落ちないのに遷移が正常に動作せず、アプリが操作不可になる現象が発生した

## 前提知識

iOS13からモーダルのデフォルトの挙動がハーフモーダルのような形に変化したのはよく知られていることだと思います。
これにあわせてsegueの遷移には
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10943/68b8361e-6aa9-575f-19c3-2542daeb84f1.png)
このように今までのTransitionの設定に加えPresentationという項目が増えているのがわかります。ここを設定することで今までのようなフルスクリーンのモーダルに変更したりすることができます。

## 解決法

この増えた設定項目が肝でした。カスタムトランジションの場合、このPresentationとともに増えたコンテキストの概念が迷子になるらしくそれが影響して遷移がうまく完了しないということのようでした。

ですのでシンプルにこのようなコードを入れてあげると解決します。

```swift
let viewController = NextViewController.instatiate()
viewController.modalPresentationStyle = .currentContext
present(viewController, animated: true, completion: nil)
```

このように明示的に `modalPresentationStyle` を設定すれば解決しました。
ちなみに僕の場合は`currentContext`もしくは`fullScreen`で動くようになりましたが、これはトランジションの種類にもよるかと思います。

ぜひ同じ症状にあった人は様々な項目を試してみてください。（本当は意味的にどれを選ぶべきとかありそうですが一旦...笑）
centos7のsyslogを削減する

Centos７で、こんなMSGが出力されているので抑止する。
[参考](https://access.redhat.com/ja/solutions/2601461)

| program | MSG |
| :--- | :--- |
| systemd | Starting User Slice |
| sshd | pam_unix(sshd:session): session opened for user |
| systemd | Created slice User Slice |
| systemd-logind | New session *** of user |
| sshd | authentfication MSG<br>ex. Accepted publickey for admin from |
| systemd | Starting Session *** of user |
| systemd | Stopping User Slice of admin |
| systemd | Removed slice User Slice |
| systemd-logind | Removed session *** |
| sshd | pam_unix(sshd:session): session closed for user |

# セッション確立時のMSGを抑止

## systemdの出力MSGを抑止
```conf:/etc/rsyslog.d/ignore-systemd-session-slice.conf
# cat /etc/rsyslog.d/ignore-systemd-session-slice.conf 
if $programname == "systemd" and
  ($msg contains "Starting Session" or 
   $msg contains "Started Session"  or
   $msg contains "Created slice"    or
   $msg contains "Starting user-"   or
   $msg contains "Starting User Slice of" or 
   $msg contains "Removed session" or
   $msg contains "Removed slice User Slice of" or 
   $msg contains "Stopping User Slice of") then stop
# systemctl restart rsyslog
```

## systemd-logindの出力MSGを抑止
```conf:/etc/rsyslog.d/ignore-systemd-logind-session.conf 
# cat  ignore-systemd-logind-session.conf 
if $programname == "systemd-logind" and
  ($msg contains "New session" or 
   $msg contains "Removed session") then stop
# systemctl restart rsyslog
```

## sshdの出力MSGを抑止
```conf:/etc/rsyslog.d/ignore-sshd-session.conf
# cat /etc/rsyslog.d/ignore-sshd-session.conf 
if $programname == "sshd" and
  ($msg contains "pam_unix(sshd:session)" or
   $msg contains "session opened" or
   $msg contains "Received disconnect" or
   $msg contains "Connection closed by 127.0.0.1" or
   $msg contains "Connection closed by 192.168.*.***" ) then stop
# systemctl restart rsyslog
```
192.168.*.***は環境のあわせて修正してください。


# daemon由来でのMSGを抑止
sudoを使った時に、こんなMSGが沢山出ている。
[参考](https://unix.stackexchange.com/questions/224370/how-to-stop-sudo-pam-messages-in-auth-log-for-a-specific-user)

| program | MSG |
| :--- | :--- |
| sudo | pam_unix(sudo:session): session opened for user root by (uid=0) |
| sudo | pam_unix(sudo:session): session closed for user root |

## pamの設定を変更する
```# grep -E "session.*pam_unix" /etc/pam.d/* ```で```session         required        pam_unix.so```が設定されている箇所を検索し、その直上に挿入する。

### 全ユーザのsudoからのMSGを抑止
```session [success=1 default=ignore] pam_succeed_if.so service in sudo quiet uid = 0```

### 特定ユーザのsudoからのMSGを抑止

```session [success=1 default=ignore] pam_succeed_if.so quiet uid = 0 ruser = nagios```

### サンプル
```conf:/etc/pam.d/system-auth
....
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
# -- add hiroshi
session [success=1 default=ignore] pam_succeed_if.so service in sudo quiet uid = 0
#session [success=1 default=ignore] pam_succeed_if.so quiet uid = 0 ruser = nagios
#session [success=1 default=ignore] pam_succeed_if.so quiet uid = 0 ruser = apache
session     required      pam_unix.so
```
iPadOSでCrashlyticsが使えなくなった話（モバイル用サイトが見れなくなった話

# 環境
* iPad Pro 9.7inch
* iPadOS 13.1

# はじめに
* iPadをiPadOSに更新した途端、Crashlyticsから開発版のアプリを落とせなくなりました。

# 原因
* iPadOSにバージョンアップしたところ、SafariのUserAgentがMAC OSになりました。

# 直し方
* `デスクトップ用Webサイトを表示`の項目が設定アプリ -> Safariにあります。
* これをOFFにすれば今までと同じです。
iOS実機でborder-radiusが効かない場合の対応

組み方によってはiOS実機でborder-radiusが効かない場合があるようなので対応メモ。

## border-radiusが効かないケース
```css
.hoge {
  border-radius: 5%;
}

.hoge {
  border-radius: 5px;
}
```

## 対応策
* 指定単位に%は使わない。
* z-indexを付与する。

```css
.hoge {
  z-index: 1;
  border-radius: 5px;
}
```

より適切な方法があれば知りたい。
WordPressでサイトを停止せずにメンテナンスモードにする

WordPressでサイトをメンテナンスしたい場合、

- アクセスして来たユーザーに対しては、メンテナンスのメッセージを表示する。
- 自分は、いつも通りWordPressの管理画面/フロント画面を操作・表示できる。

という感じにする方法を紹介します。

メンテナンスモードにするプラグインが存在しており、それを使用するのも良いですが、使う機会が限られているプラグインをインストールしたままというのは、無駄な気もします。

functions.phpに以下のコードを追記するだけで、メンテナンスモードに出来ます。

```
/* メンテナンス表示 */
function maintenance_mode() {
    if (!current_user_can('edit_themes') || !is_user_logged_in()) {
        wp_die('ただいまメンテナンス中です。');
    }
}
add_action('get_header', 'maintenance_mode');
```

get_headerにフックをかけ、テンプレートを読み込む直前に関数「maintenance_mode」が実行され、
WordPressにログインしていない場合、メンテナンスモードの表示を行います。
WordPressにログインしていれば、通常通り、操作と表示が行えます。

メンテナンスが終了したら、以下のコードをコメントアウトします。

```
// add_action('get_header', 'maintenance_mode');
```

以上となります。

WordPressの管理者は大抵ログアウトすることはせず、常にログイン状態であることが多いので、上記のコメントアウトをするということを忘れていると、自分はいつも通り表示出来ているが、他人からはいつまでもメンテナンス中と思われますので、その点ご注意ください(笑)
オブジェクト関係マッピング（gormを使ってみた）

入社1年目の渡邉です。

最近学んだオブジェクト関係マッピング（ORM：Object-relational mapping）が、
すげぇ分かりやすいって時代遅れながら書かせて頂きます。

いつの時代も新しいことを考える人は凄いなと思います（笑）

最近はGo言語をよく書いてるので、Go言語でORを触れるgormを使います。

# SQL文を意識した場合

```DDL.sql
CREATE TABLE users (
    age         INTEGER,
    name        TEXT
);
```

```db.go
import (
	"database/sql"
	"go/build"
	"io/ioutil"
	"strings"
)

func CreateTable(db *sql.DB) {
	execFile(db, "./DDL.sql")
}

func execFile(db *sql.DB, path string) {
	statements, _ := ioutil.ReadFile(build.Default.GOPATH + path)
	for _, statement := range strings.Split(string(statements), ";\n") {
		_, err := db.Exec(statement)
		if err != nil {
			panic(err.Error())
		}
	}
}
```

Tableを新規に作成したいところで CreateTable() を実行するようにします。

※DDL： https://wa3.i-3-i.info/word15639.html

# ORMの場合

gorm を入れておきましょう

```
$ go get github.com/jinzhu/gorm
```

dbファイルの中身

```db.go

import (
	"time"

	"github.com/jinzhu/gorm"
)

type Users struct {
	age  int
	name string
}

func CreateTable(db *gorm.DB) {
	db.CreateTable(&Users{})
}

```

Tableを新規に作成したいところで CreateTable() を実行するようにします。
個人的には直感かつ短いコードで書けて分かりやすい。

#感想
gorm、めっちゃ分かりやすいなと使い方を知ってから思います。

・ORMを使うのか？
・SQL文を扱うのか？

メリット・デメリットに関してはまだまだ詰めきれてませんが、使っていって学びを深めようと思います。

#関連記事
【GORM】Go言語でORM触ってみた（2019/09/05更新）
https://qiita.com/chan-p/items/cf3e007b82cc7fce2d81

GORMというORMが超絶便利だった件
https://medium.com/@taka.abc.hiko/gorm%E3%81%A8%E3%81%84%E3%81%86orm%E3%81%8C%E8%B6%85%E7%B5%B6%E4%BE%BF%E5%88%A9%E3%81%A0%E3%81%A3%E3%81%9F%E4%BB%B6-8d279489c38f

#諸説あり
O/Rマッピングは百害あって一利なし！（2018年11月17日に更新）
https://qiita.com/gomiryo/items/6d448c500749f91242d2
AnsibleからSlackへの通知方法



## この記事の対象者
* Ansibleでの環境構築の終了まだかな～とチラチラしすぎてイライラしてる人
* Slackで通知を受けないと不安になる病を患っている人

## 前提条件

* Slackが導入されている事
* Ansibleが導入されている事
* 効率化すると「ずるい」と言われない職場で働いてる
 
※記事内では**Ansible2.8.4**を利用

## 通知を受け取る為の3つの方法(意識高い)

超簡単なのでざっくり。

1. SlackでIncoming Webhookを作成
2. 生成されたWebhook URLをメモっておく
https://hooks.slack.com/services/なんやかんや/値が/設定されている
Tokenで実際に使うのはServices/以下の**なんやかんや～**部分以下全部です。

3. playbookに必要事項を書き込む

公式より抜粋

```
- name: insert a color bar in front of the message for visibility purposes and use the default webhook icon and name configured in Slack
  slack:
    token: thetoken/generatedby/slack
    msg: '{{ inventory_hostname }} is alive!'
    color: good
    username: ''
    icon_url: ''
```

後は実行するだけ。
これでSlackに通知が飛びます。
超簡単ですね。

token部分には自分で生成した**なんやかんや/値が/設定されている**の部分を設定して下さい。

version 2.8以降はhexでcolorを設定出来るようにもなった様です。
後は優雅なひとときをお過ごしください。

## 参考

https://docs.ansible.com/ansible/latest/modules/slack_module.html#parameters
[Kotlinメモ] 複数のListをひとつのListに統合する


# 概要

```kotlin
val list1 = listOf("犬", "狼", "狐")
val list2 = listOf("猫", "虎", "豹")
val list3 = listOf("鷹", "隼", "梟")
```

上のような複数の`List<T>` を, ひとつの`List<T>`にまとめる方法についてメモ.

※ 性能については考慮されていません.
※ まとめるのに必須ではありませんが, 要素の重複を弾くケースを考え以下のコードでは`distinct()`してます.

### 1. Listの入れ子にしてflattenする

`List<List<T>>` にして`flatten()`する.
個人的にこれが見やすいかなと.

```kotlin
val result = listOf(list1, list2, list3).flatten().distinct()
```

### 2. 個々のリストを可変長引数に展開してlistOfでまとめる

Javaでいうところの `...args`.
Kotlinは `...` でなく `*` で展開する.
可変長引数化するのに一旦 `Array` に変換する必要があるようなので, ちょっとイマイチかも?

```kotlin
val result = listOf(
    *list1.toTypedArray(),
    *list2.toTypedArray(),
    *list3.toTypedArray()
).distinct()
```

### 3. plusでaddしていく

うーん...

```kotlin
val result = list1
    .plus(list2)
    .plus(list3)
    .distinct()
```

ちなみにこのようなコードにした場合, IntelliJでは`plus`に対して `Call chain on collection could be converted into 'Sequence' to improve performance` と警告が出る場合がある.
`plus`は毎回Listをnewしているよう. そのためか.
なお, 私の環境では`plus`が4つほど続くと上記警告が出る.

**追記**
@sikani さんのコメントより.

>`+` 演算子がオーバーロードされているので以下のように書けます。
>
>```kotlin
>val result = (list1 + list2 + list3).distinct()
>```

`plus`が演算子オーバーロードしていることを利用し書き換えたもの.
圧倒的に見やすい! 素敵!

### 4. SequenceにaddしていきtoListする

3の警告 `Call chain on collection could be converted into 'Sequence' to improve performance` に従い, Sequenceにaddしていき最後にListに変換する.

```kotlin
val result = list1
    .asSequence()
    .plus(list2)
    .plus(list3)
    .distinct()
    .toList()
```

@sdkei さんのコメントより.

> ```kotlin
> val result = (list1 + list2 + list3).distinct()
> ```
> 
> これも、パフォーマンスを考えると Sequence にした方がよいですね。
> 
> ```kotlin
> val result = (list1.asSequence() + list2 + list3).distinct().toList()
> ```
> 
> でもこれだと対称性が美しくないので
> 
> ```kotlin
> val result = (emptySequence<String>() + list1 + list2 + list3).distinct().toList()
> ```
> 
> …うーん、長い。

### 5. Sequenceの入れ子にしてflattenする

こちらも @sdkei さんのコメントより.

> こっちの方がよさそう。
> 
> ```kotlin
> val result = sequenceOf(list1, list2, list3).flatten().distinct().toList()
> ```

1のSequence版.
`List<List<String>>`を`flatten()`する場合と, `Sequence<List<String>>`を`flatten()`し`toList()`する場合とで, どの程度性能に違いがあるか気になるところ.


### 最後に

なにか改善点などがあれば, コメントいただけますと幸いです₍₍(ง˘ω˘)ว⁾⁾
Styled-componentsのお勉強　（React）

# Styled-componentsを使って、Reactでカスタムボタンを作成してみた。



[CODESANDBOX](https://codesandbox.io/s/nice-booth-we3m3?fontsize=14)を使った簡単なサンプルはこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378452/90ab336a-3b71-f801-960b-7e14cd0e4715.png)


### Custom Buttonを作成

```react:App.js

import CustomButton from "./components/CustomButton.component";

function App() {
  return (
    <div className="App">
      <h1>Let's Build Custom Buttons!</h1>

      <p>Basic Button Theme</p>
      <CustomButton onClick={() => {console.log('You have become a member!!')}}> Become a member </CustomButton>

      <p>Inverted Theme</p>
      <CustomButton inverted> Subscribe </CustomButton>

      <p>Large Size</p>
      <CustomButton large> Styled-components </CustomButton>
    </div>
  );
}

```
### 手順

まずは`Custom Button`というコンポーネントを作成します。
内容は下記の通り・・・。

```react:CustomButton.component
import React from "react";

import { ButtonContainer } from "./CustomButton.styles";

const CustomButton = ({ children, ...otherProps }) => {
  return <ButtonContainer {...otherProps}> {children} </ButtonContainer>;
};

export default CustomButton;
```

``ButtonContainer``はstyled-componentsのスタイリング名です。

- まずはボタンの名称を`{children}`で受け取ります。
- その他を`...otherProps`とし、複数のPropsを受け取れるようにします（ES6文法）

このotherPropsとして受け取ったプロパティーはどのように使用されるか・・・
これは下記の通り。

```react:CustomButton.styles
import styled, { css } from "styled-components";

const invertedStyles = css`
  background-color: #065fd4;
  color: #fff;
`;

const largeStyles = css`
  width: 200px;
  height: 80px;
  font-size: 18px;
`;

const getStyles = props => {
  if (props.inverted) {
    return invertedStyles;
  }

  if (props.large) {
    return largeStyles;
  }
};

export const ButtonContainer = styled.button`
  width: 150px;
  height: 50px;

  background-color: #ffffff;
  color: #065fd4;

  border: 1px solid #065fd4;
  font-size: 14px;

  outline: none;
  cursor: pointer;

  ${getStyles}
`;
```

ベースとなる`ButtonContainer`でボタンのスタイリングを行い、`${getStyles}`でPropsの内容によってスタイリングを切り替えるようにしています。

もし、propsがinvertedなら、invertedStylesを適用させる、といった感じですね。
Atomインストールパッケージリスト

	
|名称|メモ|
|:--|:--|
|atom-beauty|ソースコードをきれいに整形してくれる|
|autocomplete-paths|相対パスを入力補完|
|autocomplete-python|Python の補完|
|busy-signal|linter に必要なライブラリ|
|file-icons|ファイルアイコンがいい感じになる|
|highlight-selected|選択した単語をハイライトする|
|Hydrogen|atom 上で jupyter kernel を動かせる|
|japanese-menu|メニューの日本語化|
|intentions|linter に必要なライブラリ|
|linter-ui-default|linter に必要なライブラリ|
|linter|静的コード解析|
|linter-flake8|linter 用プラグイン。pep8 + flask|
|minimap|minimap を表示する|
|minimap-cursorline|minimap 上で今いる line を表示する|
|minimap-find-and-replace|minimap 上で検索・置換単語を表示する|
|minimap-highlight-selected|minimap 上で単語をハイライトする|
|project-manager|プロジェクトを管理してくれる|
|script|ファイルを実行してくれる|
|platformio-atom-ide-terminal|ターミナルを使用できるようになる|
gitのforkはなぜoriginに対してupstreamと名付けるのか？

通常、forkの例としてfork元のリポジトリの名前をupstreamとつける説明をしている記事が多い。
ただ、なぜupstreamなんだ？という疑問が浮かびましたがその理由が書いていない（そういうものとして扱われている）
なので、なんでupstreamなのかを勝手に考えてみました。

upstreamは**上流、上流の〜**という意味をもつ

なので通常はオリジナルのリポジトリをoriginとしているが
forkするとフォーク先の自分のリポジトリをoriginとし、本家からみて上流という意味でfork元をupstreamとする
のではないだろうか？

と思っていたら、

https://help.github.com/ja/articles/configuring-a-remote-for-a-fork

githubの公式ドキュメントにフォークしたリポジトリに対して「上流リポジトリを指定します。」なる記載のある記事を見つけました。
このあたりから来ているのかなと、勝手に解釈しました。

大きくは間違っていない。はず。。

参考
http://kik.xii.jp/archives/179
https://blog.labot.jp/entry/2019/07/01/183204#i-want-to-set-a-remote-branch-as-the-upstream-for-a-local-branch