OmniAICreator/Qiita-1.07M huggingface dataset:
Java Web開発の概要

Java Webテクノロジー。 この記事では、Javaの標準Webテクノロジーの概要を説明します。 Webアプリケーション、サーブレット、JSP、およびWebコンテナという用語について説明しています。
1.1。 JavaによるWeb開発
JavaはWeb開発を強力にサポートしています。 デスクトップ上のJavaは、Eclipse RCPベースのアプリケーションを除いて大きな成功を収めることはありませんでしたが、Javaはサーバー側で頻繁に使用されています。

1.2。 ウェブ開発
（使用しているプログラミング言語に関係なく）Webアプリケーションを開発する場合は、通常、Webアプリケーションを（ローカルコンピューターではなく）専用サーバーに配置します。 Webアプリケーションはサーバー上で実行され、ユーザーはそこにアクセスできます。 サーバーは、実際のマシン（CPU、メモリ、ハードディスクなど）か、基本的にソフトウェアによって小さなマシンに分離されたマシンである仮想サーバーです。

ローカルコンピューターをサーバーとして使用することは可能ですが、通常は、1日24時間、週7日稼働する固定サーバーを用意して、Webクライアントが常に事前定義されたアドレスでサーバーにアクセスできるようにします。
1.4。 Java WebまたはJava EEコンテナー
通常、Java Webアプリケーションはサーバー上で直接実行されていません。 Java Webアプリケーションは、サーバー上のWebコンテナー内で実行されています。

コンテナーは、Java Webアプリケーションのランタイム環境を提供します。 コンテナーは、Java Webアプリケーション用であり、JVM（Java仮想マシン）はローカルで実行されているJavaアプリケーション用です。 コンテナ自体はJVMで実行されます。

一般に、Javaは2つのコンテナー、WebコンテナーとJava EEコンテナーを区別します。 Javaの世界で一般的なWebコンテナは、TomcatまたはJettyです。 Webコンテナは、JavaサーブレットとJavaServer Pagesの実行をサポートしています。 Java EEコンテナーは、サーバー負荷の分散などの追加機能をサポートします。

最近のJava Webフレームワークのほとんどは、サーブレットに基づいています。 人気のあるJava Webフレームワークは、GWT、JavaServer Faces、Struts、およびSpringフレームワークです。 これらのWebフレームワークは通常、最小のコンテナーとしてWebコンテナーを必要とします。
2. Java Webアプリケーション
Java Webアプリケーションは、動的リソース（サーブレット、JavaServer Pages、Javaクラス、jarなど）と静的リソース（HTMLページと画像）のコレクションです。 Java Webアプリケーションは、WAR（Web ARchive）ファイルとしてデプロイできます。

WARファイルは、対応するWebアプリケーションの完全なコンテンツを含むzipファイルです。
java Webアプリで参照できます。https://bap-software.net/knowledge/java-web-app/
3. Java Web標準
標準Javaテクノロジは、Java Community Process（JCP）と呼ばれる標準プロセスを介して定義されます。以下のテクノロジーは、JCPを介して定義されます。

3.1。サーブレット
サーブレットは、「HttpServlet」を拡張し、Webコンテナ内のHTTPリクエストに応答するJavaクラスです。最新の公式バージョンはサーブレット3.0であり、これもJava EE 6の一部です。詳細については、Javaサーブレット3.0仕様を参照してください。

3.2。 JavaServerページ
JavaServer Pages（JSP）は、HTMLおよびJavaコードを含むファイルです。 Webコンテナーは、JSPに初めてアクセスしたときに、JSPをサーブレットにコンパイルします。現在の最新バージョンは2.1です。

JavaServer Pages 2.1の仕様を参照してください

3.3。 JavaServer Pages標準タグライブラリ
JavaServer Pages標準タグライブラリ（JSTL）は、多くのWebアプリケーションに共通のコア機能を単純なタグとしてカプセル化します。現在のバージョンは1.2で、JavaServer Pages仕様バージョン2.1の一部です。

3.4。 Java Web開発の開始
Java Web開発の開始は比較的簡単です。次のサーブレットとJSPチュートリアルで試してみることができます。
IBM cloudとAWSをIPsecで接続する(前提編)

AWSとIBM CloudをIPsecを使いVPN接続する場面があるかと思います。
※この情報も既に劣化している可能性があります。それぞれ仕様が変わりますので、必ず検証を行ってください。こ

今回、IBMクラウド側ではvSRXを使います。AWS側はVPC。
IBM Cloudのサービスでは、仮想化されたベアメタルサーバーに、仮想版SRXを乗せ提供します。
物理サーバーはKVMで仮想化されvSRXが稼働した状態で引き渡されます。

提供されるIPアドレスは物理サーバーでは、PublicとPrivateそれぞれ１つと、HW管理用に１つが提供されます。
vSRXでは、PublicとPrivateとそれぞれ１つづつとなります。

Public・Privateは、それぞれは同一VLAN・同一セグメントでの提供となります。
物理とvSRXのPublicIPは同一VLAN・同一セグメント、物理とvSRXのPrivateIPが同一VLAN・同一セグメントとなります。

管理権限は、物理ではrootを、vSRXはadminとrootが提供され、どちらもポータルにてパスワードが確認できます。

物理やvSRXのPublic・PrivateセグメントおよびVLANは、それ専用となります。
ポータル上の「VLAN」一覧画面からADDにて追加はできません。
また、その両方のセグメントは、サーバーを追加することができません。
IBMcloudのPublicとPrivateのセグメントはそれぞれ１つのルータ（仮にPublicGW、PrivateGWとします）により結ばれていますが、vSRXの直下にサーバーを配置する場合、PrivateGWに接続されていたVLAN、vSRXへ付け替えることで制御下に配置できます。

VLANが移動することでセグメントも移動されることになりますので、各セグメントのDefaultGWIPは、vSRXに付与することでvSRXを利用できることとなります。1Gbps版は１VLANのみ、10Gbps版で複数VLAN利用が可能です。

VLANをvSRXへ接続するためにはIBMCloudのポータル上で、VLANの登録操作を行います。既に使用されているVLANから選択します。別のSecurityGWが既に設置されているVLANは選択できない可能性が高いです。

vSRXに付与したVLANと既存の他のVLANはどうやって通信させたらいのでしょうか？vSRXをルータとして使うしかないですね（そのうち検証）

AWSのポータルでは、IPsec接続対抗機器のサンプルConfigを生成させることができます。数多くの機器、例えばCiscoやJuniper、YAMAHA、IIJ、Microtekもあります。Configはあくまでサンプルですので、Interface名が目的の用途に合っていなかったり、SourceRouting方針かPolicyRouting方針かにより使える部分が変わったりと、一度全文を読むことをお勧めします。コマンドの２倍程度の量のコメントには重要な情報が記載されていますのでやはり目を通すことをお勧めします。

関連情報：
AWS:https://docs.aws.amazon.com/vpn/index.html
Azure(参考):https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-about-vpn-devices

ポータルでは、VLANを選択後「Route Throught」を選択することで当該VLANがvSRXへ道の開かれます。vSRX上にVLANを設定すると利用できるようになります。vSRX側の当該Interface設定サンプルは以下の通りです。既存のVLANやIPは、以後の管理や緊急時に備え残しておいてください。
（vSRX注文時、Privateとしてge-0/0/0、Publicはge-0/0/1にVLANとIPが割り当てられます。ここではPrivate側のVLANは2060、接続したいVLAN番号は2028です。これをge-0/0/0に付与します。ここではge-0/0/0.10として割り当てます。）

set interfaces ge-0/0/0 description PRIVATE_VLANs
set interfaces ge-0/0/0 flexible-vlan-tagging
set interfaces ge-0/0/0 native-vlan-id 2060
set interfaces ge-0/0/0 unit 10 vlan-id 2028
set interfaces ge-0/0/0 unit 10 family inet address 10.XXX.XXX.YY/26

IBMCloudでは、IpsecGWのサービスもあります。
IPsec内の接続アドレスの指定ができませんので、Site2Site接続には不向きです。
Office 365 の Azure AD Connector の連携を消す

検証用に Azure 上に置いておいたドメインコントローラを無くしてしまいました。それはそれで痛いのですが、新しくドメインコントローラを構築するにあたり、繋げておいた Azure AD Connector の設定を削除しなければなりません。
作業自体は以下のリンクを参考に進めまして非常に簡単に終わりましたが、消すという作業はめったに体験できなことなので画面ショットなど撮ってみました。
[Office 365 のディレクトリ同期を無効にする](https://docs.microsoft.com/ja-jp/office365/enterprise/turn-off-directory-synchronization)

# オンプレミスドメインコントローラ側
今回はオンプレミスドメインコントローラが消滅してしまったので、もし今も接続状態なのであれば Azure AD Connector をアンインストールするだけで大丈夫かと思います。
キチンと同期が切断されるか確認するため、Microsoft 365 管理センターより [正常性] > [ディレクトリ同期の状態] を事前にスクショしておくと良いと思います。
ちなみに、Azure AD Connector との接続が切れていると、こんな感じです。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593361/c8e25d69-e163-eefd-182c-87b48ea87a84.png)

# 連携の削除方法

まず、Azure AD へ PowerShell で接続します。接続方法は以下が役に立つと思います。
[備忘録 Azure AD に PowerShell で接続する](https://qiita.com/kentk/items/b358d49f4322d1ba7582)

PowerShell で以下を実行します。

```powershell
Set-MsolDirSyncEnabled -EnableDirSync $false
```
こちらが表示されたら Y を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593361/af43cadb-7007-a1b3-7fbe-000827883ed1.png)
実行はほぼ一瞬で終わりました。設定の反映も即時に出来たようです。念のため、コマンド入力前にスクショした画面と比較すると、以下の様に [ディレクトリ同期の状態] が無くなっているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593361/33ae83aa-9f68-67c5-a645-c8fa087960e0.png)

# 同期が無くなった後の状況

今までディレクトリ同期されていたユーザーは、同期状態がクラウドに変更されています。なので、ユーザーさんがサインイン出来ないとかメールやドキュメントなどのデータが消失すると言ったことはないです。場合によっては気づかないくらいかも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593361/98b573bd-1d84-6cba-f0de-4f920938fe28.png)
あと、Azure AD Connector 接続で使われていた「On-Premises Directory Synchronization Service Account」は削除しようとしても出来ませんでした。とりあえず、残しておくしかないですね。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593361/fc7adf92-b94a-63e0-c707-a917166900b1.png)
コーディングルールは技術か？

日本人と欧米人ではコーディングの判読性についての考えが違うようです。自分のキャリアパスや人生目標に向かって転職するハードルが低いのは米国ですが、米国でのソースコードは判読性を高めて、属人性を極力減らしています。一方、日本ではどうでしょうか？そもそも、難しく論理を組み立てがちであり、自分自身しか判読できなソースコードに優位性を抱いている方はまだまだ、少なくないはずです。私が何十年も前に学校を卒業して初めて開発の現場に就いた時は、判読難解なコードを書くことが優秀であるとされてきました。当時はハードウエアのリソースが限られてきたので、一定のパフォーマンスを上げる為にはハードウエアやプログラミング言語の特性を熟知して、コード量が少なくてパフォーマンスに優れたコードを書くことが鉄則でした。当然、この様なソースコードは特別な振舞を要求される機能は難解になります。経験が浅いエンジニアにとってはどれもが難解・判読不能になります。時代とともに運用・動作環境のリソースは広大になってきましたが、その当時の価値観（判読不能な、難しいコードを書くのが優秀）だけが進化しないまま残念なことになっていると感じています。
## 可読性が高ければ潜在的バグが無くなる
社会環境やビジネス環境の変化によって利用者の要望や価値観が変わってきます。これによて影響を受けるのがITサービスです。そのサービス一つ一つにはプログラム、即ちソースコードがあり、それを要求に従ってメンテナンスする作業が必ず発生します。
この作業は対するソースコードが判読しやすければ、開発者でなくとも保守作業ができます。ところが、属人性が高く癖のあるコードであったなら、開発者自身が保守することになります。我々が開発したソースコードで実現したサービスはEOL（End of Life)の定義・宣言が全くありませんので、未来永劫使い続けるという事だって起こりうるのです。そうすると、属人性が高いソースコードを書けば書くほど、過去の自分の実績の奴隷となってしまいます。ですから、可読性が高いソースコードを書くように努力しなければなりません。
しかしながら、可読性を高めようと思って行動しても各自の癖は否めません。それを是正するのがコーディングルール（コーディング作法）（以下：ルールと記載）が必要となります。
このルールの基本は現場で作成するのが一番ですが、全ての領域を均等にカバーできているかは、そのチームの経験値によって変わりますので、本やネット上に公開されているものを参考にしてルールを決めることをお勧めします。
このルールを決める一つの観点として、そのルールがどんな事に有効であるかを明確にしておくと更に各人のスキルが均一化されます。
ルールとして明確にしたいポイントは以下になります。
- 命名
- 可読性（保守性への貢献）
- 品質・安全性
- 性能・効率
この様に明確にルール化するということは、製造業に例えると製造技術の一つとなります。同じものを作っても、製造技術の出来不出来で生産性・品質に大きな差が出てきます。製造業ではQC活動の中にもこのような取り組みを入れて、日々改善しています。

同じ要求を開発する際に、このルールがあるチームと無いチームでは結果的に品質と生産性への差が出てきます。

アジャイルチームでは常にこのルールを意識し、レトロスペクティブ（振り返り）で改善するテーマの一つにすることをお勧めします。
slack bot の作り方

この記事では slack bot の作り方を紹介しています。
※作者の都合上、随時公開していきますのでご了承ください
#この記事で作成できるもの
この記事では定期実行で チャンネルに入っている人限定で google spread sheet から日々の数値を取得して数値ごとに別々のメッセージを送信できる、という bot 作成の手順を紹介しています。

#bot のアカウントの作成

このURLにアクセスします
https://api.slack.com/

![スクリーンショット 2020-06-22 15.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641754/1f3bc61a-63a6-0b40-9935-5646fef776ca.png)

右上の　「Your Apps」　を押します

この時点で　「Go to Slack」　と表示されている人は slack のワークスペースにログインできてないのでログインしましょう

ログインした状態でボタンを押すと

<img width="1439" alt="スクリーンショット 2020-06-22 15.27.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641754/2f34b476-e9d2-afcc-48e0-b013509ada0b.png">



この画面が出てくるので　「Create an App」　を押します。

<img width="1440" alt="スクリーンショット 2020-06-22 15.37.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641754/c1115adf-9602-1030-ffdb-d90416041239.png">

アプリ名を入力して追加するワークスペースを選択します。

これで bot のアカウントを作ることができました。

##bot の権限を編集

作成したアカウントがページ中央付近に表示されているのでそこをクリックします。 

その後に左のバーの部分に　「OAuth & Permissions」　をクリックします。

![スクリーンショット 2020-06-22 16.01.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641754/92ddcf4a-bf5d-b62c-8898-7ce8aa581742.png)

中央上部に　「Bot User OAuth Access Token」　はあとで必要になるのでメモをしておいても良いかもしれないですね（あとでみることも可能です）

![スクリーンショット 2020-06-22 16.10.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641754/14c5222b-e093-9347-8615-74ae5646eb97.png)

下にスクロールすると　「Bot Token Scopes」　という項目があるので　「Add an OAuth Scope」　というボタンを押すと bot に権限を与えることができるので今回の bot 作成に必要な　「channels:read」　と　「chats:write」　を追加します。

この時 「全ての権限を追加してもいいんじゃないのか？」 と思うかたもいるかもしれませんが、全ての権限を与えてしまうと誤作動が起きたときに被害を最小限に抑えるためです。

##ワークスペースに bot アカウントを追加

「OAuth & Permissions」　を選択して、一番上の　「OAuth Tokens & Redirect URLs」　の　「Install App to Workspace」　を選択すると

![スクリーンショット 2020-06-22 16.23.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641754/bc24246e-61e1-7b52-8a4e-c44122badfa1.png)

このような画面が出てくるので　「許可する」　を選択します。これでワークスペースに bot を追加できました。
Tkinterで押したボタンだけの色を変える方法

```example.py
def setnumber():
    column = -1
    row = 0
    root = tk.Tk()
    root.title('numbers')
    root.geometry('470x310')
    for i in range(101):
        if i > 0:
            if i%10 == 1:
                row += 1 
                column = -1
            column += 1
            text=f'{i}'
            btn = tk.Button(root, text=text)
            btn.grid(column=column, row=row)
            btn.config(command=collback(btn))
    root.mainloop()

def collback(btn):
    def nothing():
        btn.config(bg='#008000')
    return nothing
```
まず、setnumber()のところで1〜100までのボタンを作っています。すこしややこしく見えるのは10個作ったら改行するようにしたためです。そして、最後にコールバック関数としてcollback(btn)を指定し、変数btnを引数として渡します。その関数内でさらにnothingという関数を呼び出して色を変えるようにします。
これを実行すると以下のように押されたボタンだけが緑色になります。
![Adobe_20200622_150740.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616944/609f131c-afae-275f-ab2f-13e00d95b84c.jpeg)
人気ゲームPUPGのキル分析。seaborn-pairplotを使用。

世界中の方々が熱中している、PUPGの世界。
やはり、強い武器などって気になったり。

ということでcsvファイルを読み込んで30行ほどのコードを書きpairplotで
ビジュアル化してみました。

##成り行き
最近seabornのpairplotを触ってみて面白いと感じどうにかアイリスやタイタニックなどのベタなデータ以外で試せないかと思い、試した次第です。したがって、プロットに用いるデータや仕方がおかしい可能性があります。もしなんだこれという場合は是非アドバイスを頂けると幸いです。

csvの参照先→
>https://www.kaggle.com/skihikingkevin/pubg-match-deaths?
kaggleです。

```python

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

df = pd.read_csv("csvまでのパス")
#数値データでなくてはプロットできない。
show_df = df.drop(['victim_position_x','victim_position_y','victim_placement','killer_placement','killer_name'],axis=1)
#欠陥値の補足
show_df['kill_position_x'] = show_df['killer_position_x'].fillna(show_df['killer_position_x'].mean())
show_df['kill_position_y'] = show_df['killer_position_y'].fillna(show_df['killer_position_y'].mean())
#欠陥値の削除
show_df = show_df.drop(['killer_position_x','killer_position_y'],axis=1)
print(show_df.isna().all(axis=0))
#銃を数字にて識別できるように変換。
show_df['gan_type'] = show_df['killed_by'].replace({'Punch':0,'Deagle':1,'P1911':2,'R45':3,'R1895':4,'P18C':5,'P92':6,\
                                     'Skorpion':7,'S12K':8,'S1897':9,'S686':10,'DBS':11,'Tommy Gun':12,\
                                     'Vector':13,'Micro UZI':14,'MP5K':15,'PP-19 Bizon':16,'UMP45':17,\
                                     'AUG':18,'G36C':19,'M16A4':20,'M416':21,'M762':22,'Mk47 Mutant':23,\
                                     'QBZ':24,'SCAR-L':25,'AKM':26,'GROZA':27,'M249':28,'DP-28':29,\
                                     'AWM':30,'Win94':31,'Kar98k':32,'M24':33,'mini14':34,'QBU':35,'Mk14':36,'SKS':37,\
                                     'SLR':38,'VSS':39,'Bluezone':40,'Down and Out':41,'Falling':42,'Grenade':43,'Hit by Car':44,'death.WeapSawnoff_C':45,'Mini 14':46,\
                                     'UMP9':47,'Machete':48,'Sickle':49,'Groza':50,'Crossbow':51,'Drown':52,'Uaz':53,'Pan':54,'RedZone':55,'Motorbike':56,'Buggy':57,\
                                     'death.ProjMolotov_DamageField_C':58,'Dacia':59,'Motorbike (SideCar)':60,'death.Buff_FireDOT_C':61,'Crowbar':62,'Van':63,'Pickup Truck':64,\
                                     'Aquarail':65,'Boat':66,'death.ProjMolotov_C':67,'death.PG117_A_01_C':68,'death.RedZoneBomb_C':69,'death.PlayerMale_A_C':70}).astype(int)
two = print(show_df.head(10))
w = sns.pairplot(show_df[0:101],hue='killed_by')
w.savefig('PUPG.png')
plt.show()

```

![PUPG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654850/6749f2f3-972c-d03d-570e-179fb116247e.png)

time→キルされた時間？単位秒　最大
killed_by→こちらは下のgan_typeと似ているのですが、hueの引数として指定しています。
gan_type→直訳で銃のタイプですが、死因に起因するものをまとめました。
　　　　　
最初はpupgの武器に関する情報をスクレイピングし辞書に渡そうと考えていましたが、欲しい情報がいろいろなタグに格納（a,b,strong）されていて全てをとるように実装したところ３００行のコードになってしまったことや他の銃に付属するアイテムまでスクレイピングしてしまったため、今回は諦めて手打ちにしましたがなかなか時間がかかりました。。。

例：車で引かれた。自転車に轢かれた。パンチで殺された。など
kill_position→キルされた座標？　

###データを見てわかったこと？？？？
１、timeを見て０から開始されて２０００秒（ドン勝者が出るまでの時間）までの間でM416という銃が多くキルされるにあたり使用された

2、１と少し被りますが、そこからM４１６という銃を使って上位に食い込んでいる人が多いのでは？

３、x座標とy座標の関係からx座標約400000~500000、y座標約300000で多く死亡していることがわかる。
PHPでDBから配列を取り出し、jsに渡して、chart.jsでグラフ作成

caledar_tableにあるTUTORというカラムの数をカウントし、グラフにする。

```PHP
$sql = "SELECT TUTOR,COUNT(TUTOR) AS COUNT FROM CALENDAR_TABLE GROUP BY TUTOR ORDER BY COUNT DESC";
$stmt = $pdo->prepare($sql);
$status = $stmt->execute();

$res = $pdo->query($sql);
//取得したデータを全てフェッチする
$data = $res->fetchAll();
```

```javascript
var data_array = <?php echo json_encode($data); ?>;
name_array = [];
count_array = [];
for(key in data_array){
  name_array.push(data_array[key][0]);
  count_array.push(data_array[key][1]);
  // alert(data_array[key][0] + "さんの番号は、" + data_array[key][1] + "です。") ;
}
console.log("ログを出力");
console.log(name_array);
console.log(count_array);

var ctx = document.getElementById("myBarChart");
  var myBarChart = new Chart(ctx, {
    type: 'bar',
    data: {
      labels: name_array,
      datasets: [
        {
          label: 'チューターポイント',
          data: count_array,
          backgroundColor: "rgba(219,39,91,0.5)"
        }
      ]
    },
    options: {
      title: {
        display: true,
        text: 'チューターポイントランキング'
      },
      scales: {
        yAxes: [{
          ticks: {
            suggestedMax: 20,
            suggestedMin: 0,
            stepSize: 5,
            callback: function(value, index, values){
              return  value +  '人'
            }
          }
        }]
      },
    }
  });

```

詰まった点：
・どうやってphpからjsに値を渡すか（実際は配列だった。）
・渡した配列が、二重配列になっていたのに、気づかなかった
・配列なのに、

```javascript
 datasets: [
        {
          label: 'チューターポイント',
          data: count_array,
          backgroundColor: "rgba(219,39,91,0.5)"
        }
      ]
```
のところで、data = [count_array]
としていて、表示がおかしくなっていた。
・データを加えるのがpushかappendかわからなかった
bit と byteについて

## bit

binary digit の略。
二進の数字、つまり二進数。

2進法の1桁分の情報のことをbitと呼ぶ。

2進法は、1桁で0または1という2通りの情報を表現できる。
2ビットであれば4情報(2の2乗)
3ビットであれば8情報(2の3乗)を表現することができる。

コンピュータにおいて、最も基本的な単位。

## byte

bite(噛む)をもじった造語。
情報を "ひと噛み" して、その塊を情報の基本単位としよう的な意味。

8bitで1byte。
1byteで256通り(2の8乗)の数字を表すことができる。
256＝16×16なので、16進数と相性がいい。

byteを2進数で表現すると長くなるから、2進数8桁を16進数2桁に短くした表現が使われる。

## バイトを可視化するコード

```c
#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, size_t len)
{
	size_t i;
	for (i = 0; i < len; i++)
		printf(" %.2x", start[i]);
	printf("\n");
}

void show_int(int x)
{
	show_bytes((byte_pointer) &x, sizeof(int));
}

void show_float(float x)
{
	show_bytes((byte_pointer) &x, sizeof(float));
}

void show_pointer(void *x)
{
	show_bytes((byte_pointer) &x, sizeof(double));
}

void test_show_bytes(int val)
{
	int ival = val;
	float fval = (float)ival;
	void *pval = &ival;

	printf("%20d = ", ival);
	show_int(ival);
	printf("%20f = ", fval);
	show_float(fval);
	printf("%20p = ", pval);
	show_pointer(pval);
}

int main()
{
	// 0x00003039
	test_show_bytes(12345);
	return (0);
}
```

## 参考

[bit と byte の語源 - Qiita](https://qiita.com/RyuGotoo/items/a3f536fcb1cf1909afef)

[ビットとバイトの違いは？Webに携わるなら知っておきたい7つの単位を解説｜ferret](https://ferret-plus.com/6015)

**おすすめ**
[プログラムとバイナリ - Qiita](https://qiita.com/shiracamus/items/8a47d969243810d57428)
API Gateway→VPC Link→NLB→EC2のAPIを叩く

#API Gateway→VPC Link→NLB→EC2のAPIを叩く

1.EC2の立ち上げ
①立ち上げ、アプリの作成は他サイト参照
②セキュリティグループのインバウンドルールにVPCサブネットのCIDERのIPと接続元のIPを許可する。(ポートは接続を行うポートを許可。HTTPなら80)

画像：curlの結果
<img width="359" alt="スクリーンショット (5).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647519/20c15e46-47c5-056e-d0b0-497c0b1345d3.png">

2.NLBの設定
①ロードバランサーの種類はNLBを選択する。
②リスナーのプロトコルはTCPのまま。ポートはAPIを叩くポートを設定する。アベイラビリティゾーンは2つ選ぶ。
③ターゲットグループのターゲット種類はIPを選択し、プロトコルとポートは上記と同様にする。
④ターゲットの登録は作成したEC2が所属しているVPCを指定し、対象EC2のプライベートIPを入れる(ポートは上記と同様)
⑤作成する。

画像：②
<img width="960" alt="スクリーンショット (6).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647519/e45f15d9-dcc1-dafa-0d73-87f77efd982b.png">
画像：③
<img width="960" alt="スクリーンショット (7).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647519/1d770af1-49b1-2806-3f0b-8b4d59dbbea7.png">
画像：④
<img width="960" alt="スクリーンショット (8).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647519/45c01a12-aba4-7ea1-990c-2b7d6f9f1bb2.png">

正常に設定できたかを確認する方法
・NLBのDNS名をWebブラウザに打ち込み、EC2で返却している文字列(任意)が表示されればNLBにEC2がぶら下がったことを確認できる。
<img width="960" alt="スクリーンショット (9).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647519/707c3d79-b12e-0437-2663-aae7044e1b52.png">

3.VPC Linkの作成
①REST APIのVPCリンクを選択し、ターゲットNLBを上記で作成したNLBを指定する
②作成ボタンを押す。結構時間がかかる

画像：①②
<img width="960" alt="スクリーンショット (10).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647519/ec1a35fc-4415-7523-7541-352579117ca3.png">

4.API Gatewayの設定
①REST APIの構築を行う。
②アクションタブのメソッドの作成を行い、GETを設定する。
③GETのセットアップとして、VPCリンクを指定し、上記で作成したVPC Linkを指定する。
④エンドポイントは「http://NLBのDNS名」を指定する。

画像：①②③④
<img width="960" alt="スクリーンショット (11).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647519/53e4f9b4-8e9a-c0ad-fd6f-a97d839d9051.png">
foreachで配列を更新する場合の注意（unsetを付ける）

<h1>foreachで配列を更新する
<p>PHPの配列を更新するのに躓いたので、学習記録の意味でここにメモします。
<p>初歩の初歩のお話。
<h2>forで配列を更新し代入し直す方法
<p>まず、forを使って配列に代入し直す方法。
<p>例）$array = [1, 2, 3];の数字の配列の各数字に+1して代入し直す。

```
$array = [1, 2, 3];
for($i = 0; $i < count($array); $i++){
    $array[$i] = $array[$i] + 1;
}

var_dump($array);

/*実行結果
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  int(4)
}
*/

```

これはかんたん。
他にもっと良い方法がある気もする。

<h2>foreachで配列を更新し代入し直す方法
<p>上記をforeachでする方法。
<p>参照代入を使う。

```
$array = [1, 2, 3];

foreach($array as &$arr){
    $arr = $arr + 1;
}

var_dump($array);

/*実行結果
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  &int(4)
}
*/
```

参照代入で$arrの参照先と$arrayの参照先が同じにして値を更新している。
詳しくは、参照代入で検索。

できたーでーーー・・・・これではダメ。
最終数値がなにか変。&int(4)
foreachで出力するとよくわかります。

```
$array = [1, 2, 3];

foreach($array as &$arr){
    $arr = $arr + 1;
}


var_dump($array);

foreach($array as $arr){
    echo $arr;
}
/*
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  &int(4)
}
233
*/
```

234となるべきところが233と出力されている・・・
foreach を抜けても最終値（$arr）は保持しているので、こうなってしまう・・・
なぜ233と出るのかは詳しい人教えて下さい・・・。

これをなくすためにはunsetを加える。

```
$array = [1, 2, 3];

foreach($array as &$arr){
    $arr = $arr + 1;
}

var_dump($array);

unset($arr);

foreach($array as $arr){
    echo $arr;
}
/*
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  &int(4)
}
234
*/
```

以上。
mysql2がbundle installエラーになるときの解決方法

#前提条件
mac OS
Rails 6.0.3.2
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin19]
#問題点
某オンラインスクールの教材を見ながらローカル環境でプロジェクトを作成していたところ、bundle installで以下のエラーが発生した。

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/ebinashohei/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2
/Users/ebinashohei/.rbenv/versions/2.6.3/bin/ruby -I /Users/ebinashohei/.rbenv/versions/2.6.3/lib/ruby/2.6.0 -r ./siteconf20200622-74325-qvfli8.rb extconf.rb
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes
checking for rb_wait_for_single_fd()... yes
-----
Using mysql_config at /usr/local/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for SSL_MODE_DISABLED in mysql.h... yes
checking for SSL_MODE_PREFERRED in mysql.h... yes
checking for SSL_MODE_REQUIRED in mysql.h... yes
checking for SSL_MODE_VERIFY_CA in mysql.h... yes
checking for SSL_MODE_VERIFY_IDENTITY in mysql.h... yes
checking for MYSQL.net.vio in mysql.h... yes
checking for MYSQL.net.pvio in mysql.h... no
checking for MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes
checking for SERVER_QUERY_NO_GOOD_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_NO_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_WAS_SLOW in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_ON in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_OFF in mysql.h... yes
checking for my_bool in mysql.h... no
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/Cellar/mysql/8.0.19_1/lib
-----
creating Makefile

current directory: /Users/ebinashohei/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2
make "DESTDIR=" clean

current directory: /Users/ebinashohei/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/ebinashohei/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3 for inspection.
Results logged to /Users/ebinashohei/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/mysql2-0.5.3/gem_make.out

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

In Gemfile:
  mysql2
```

#解決方法
同じようなエラーを解決してくれていたため以下に示す。
```
$bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
$ bundle install
```
参考サイト
https://qiita.com/SAYJOY/items/dd7c8fc7a3647e7ff969
Chunking

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

プログラミングに限らず理系の文書には専門用語がたくさん出てきます．自分が大学生の頃は，そういう専門用語はJargon(役に立たない言葉)と思って，覚える努力をすることなく，似た単語を勝手に使って自分独自の表現をしていました．ところが他の研究者とか，学生さんとある程度の内容の議論をすると，意図が伝わらないことを何度も経験しました．概念を伝える努力をするよりも，専門用語を覚える方が楽だと気が付いたのは，デザインパターンを知ってから．ここでは，専門用語の意義を理解してもらいます．


# 既知感

ロバート A.バートンの著書「確信する脳「知っている」とはどういうことか」[^feelingofknowing]というのにある，\*\*知る瞬間\*\*を体験してもらいましょう．

> 「既知感」についての考察を始めるにあたって，次の段落を普通の速さでお読みいただきたい．飛ばし読みをしたり，途中で止めたりしないこと．この体験は，一度説明を知ってしまうと繰り返すことができないため，読み終えたら少し時間をとって，自分でどう感じたかを自問しよう．そして説明の言葉を聞いた後，もう一度段落を読み直す．その際，自分の心の状態と，この段落についての感じがどう変わったかに注意を向けてほしい．

> 新聞は雑誌よりよい．海岸は道路よりよい場所である．最初は歩くよりも走るほうがよい．何度か試みる必要があるかもしれない．ある程度の技術はいるが，学ぶのは簡単だ．小さな子どもでも楽しめる．一度うまくいったら，障害はほとんどない．鳥が近づきすぎることはめったにない．しかしすぐに雨に濡れる．同じことをする人が多すぎると問題が起こることがある．かなり余裕が必要である．障害がなければ，非常にのどかである．岩はいかりの代わりになる．しかし，いったん切り離されてしまうと，二度目のチャンスはない．

> ご理解いただけただろうか．それとも意味のない文章だと思われただろうか．可能性のある説明を心が探っているのを感じておこう．さて，次の言葉を聞いたとき，何が起こるかを見てみよう．

<details><summary>謎の単語</summary>凧</details>

> ここで前の段落を読み直して，最初に感じた何かが欠けているという不快感が，正しいという快感に変わるのを感じてほしい．すべてがぴたりとはまり，一文一文がきちんと意味を持つ．もう一度読み直してみよう．もう，理解できないという感覚を取り戻すことはできない．一瞬のうちに，しかるべき意識的な施策をすることもなく，文章は不可逆的に＜既知感＞に満たされる．


# チャンキング

次にチャンクについての記述を読んでみてください．

> 心理学者ミラーの提唱した概念で、人間が情報を知覚する際の「情報のまとまり」のこと。また、その単位。たとえば、「かがみもち」を、平仮名5文字として知覚すると5チャンク、「鏡」と「餅」として理解すると2チャンク、「鏡餅」のこととして理解すると1チャンクとなる。ミラーによれば、人間が一度に覚えられるチャンクの数には限界があり、7±2チャンクとされる（この値をマジカルナンバーという）。ただし、複数のチャンクをグループにし、より大きな1つのチャンクにまとめることで、知覚・記憶する情報量を増やすことができる（これをチャンキングと呼ぶ）。複雑な内容をわかりやすく伝達するためには、情報を減らしたりまとめたりして、チャンクの数を7〜5以下に抑えることが効果的である。
> 
> [コトバンク](<http://kotobank.jp/word>)で「チャンク」を検索[^chunk].

いかがでしょう．ところで「鏡餅」って知ってますよね？　なら，なんであれを鏡餅というかご存知でしょうか？　

****鏡餅の由来****

このように言葉は，単なる意味だけでなく，関連情報，由来なんかをまとめて概念として記憶することをあらかじめ意図されています．それらをバルク(塊)にして覚えると忘れにくいということが知られています．単に単語を丸暗記するだけでなく，身近な単語と関連づけるとより覚えやすくなります．


# Hash

コンピュータの専門用語の中にハッシュというのがあります．そのうち出てきます．これから連想される単語ってあります？

そう皆さんの好きなハッシュドポテトとかハヤシライスです．hashの日本語訳を想像できます？　できれば調べる必要ありません．それでいいんです．そうでない人は調べてください．そうすればhashという単語を聞くたびにハッシュドポテトを思い出すだけでなく，日本語訳を思い出して，ハッシュという機構の内部動作を理解することができるようになります．心に止めておいてください．

専門用語ってのはそういう連想から付けられたのが多いんですよ．特に，コンピュータは人間が1から作ったものだから，動作を記述するのに日常用語が散りばめられています．そうすればその概念を理解したり利用したりできるから．ところが，native English speakerでない僕たちは，その動作を連想することが難しいというハンディを負っています．でも，逆にコンピュータの振る舞いから日常用語を覚えられるという利点があると思って，英語表記も覚えていきましょう．


# 絶対参照と相対参照(absolute and relative references)

絶対参照と相対参照という言葉聞いたことあります？絶対座標と相対座標はどうでしょう？　高校の物理で出てきたかも．予測できますよね？　そう，絶対座標は経度緯度みたいなものです．

    神戸三田キャンパスは北緯34.9145度，東経135.1625度にある

と言えますし，一方，相対座標は

    兵庫県三田市学園上ヶ原１番

といってもいいです．もっといい加減な言い方で，三田を表現すると

    三田は大阪の北西，JRで40分の位置にある．

でも

    三田は関西の奥座敷と呼ばれる有馬温泉への入り口にある

でもOKです．

では，エクセルで絶対参照と相対参照を勉強してください．これがわかるとエクセルの名人になれます(:smile:).あと，プログラマに必須の絶対パスと相対パスも頭に残るようになってきます．コツはね，言葉の定義は，覚えるものではなくて，感じをつかむもの．文脈によってちょっとずつ違うんですが，何度も出会ううちに使われている意図がわかって自分でも使えるようになります．そうやって少しずつ使える専門用語を増やしていってください．


# 参照文献

[^feelingofknowing]: 確信する脳「知っている」とはどういうことか，ロバート A.バートン，(河出書房新社,2010).

[^chunk]: [コトバンク](<http://kotobank.jp/word>)で「チャンク」を検索, (2020/06/22 accessed).



------
 - **source** ~/Desktop/lecture_25s/comp_a_25s/lectures/d6_xlsx_chunk/chunking.org
docker使ってpython2.xのjupyter notebookを起動した話（土日潰れた）

#　ことのはじまり
解析で使いたいパッケージがpython2.xで書かれていた（やめてくれ）。ローカルのpython3環境をけがしたくない。かといってVMも使いたくない！

そうだDockerとやらを試してみよう。とりあえずぐぐってみよう。

ふむふむDocker pullでimageを簡単に構築できるのか。えっっ、、2018年にjupyter/scipy-notebook(DockerImageのLibrary)のpython2の取り扱いやめるてるの。くそ、、ならforumで誰か解決案出してんだろ、、え、（長いスクロールの果てに）結局無理なんかい！もうこうなったら自分で見つけてやる
# 　読者対象
 Dockerでpython2で書かれた.jpnbを扱いたい人（とてもニッチ）。Mac使い。Dockerビギナーなのであまり詳しい説明はできませんが、この記事が役に立てば嬉しい。

# 　All you have to do
以下をterminalで順に実行していただければ良い。


1　マウントしたいdirectoryにcdで移動。（必要なけれがスルー）
2　minicondaをpull　　　　(jupyter/scipy-notebookは上記の理由で却下）

```terminal
$ docker pull continuumio/miniconda
```
3　docker run: ここでは名前を'mini'、portをlocal:8001 cotainer:8000に設定、/home以下にマウント先を指定

```terminal
$ docker run -it --name mini -p 8001:8000 -v ${PWD}:/home continuumio/miniconda bash
```

4　以下を何も考えず実行。（backports.functools_lru_cacheを自分で入れなければいけないところがみそ。）

```tm
conda create -n py27 python=2.7
conda activate py27
conda install notebook ipykernel
pip install backports.functools_lru_cache
ipython kernel install --user
```
5　必要があれば、適宜conda install/pip installで必要なmoduleを入れていく。



6　ローカルのhttp://localhost:8001
にnotebookを展開

```tm
jupyter notebook --port 8000 --ip=0.0.0.0 --allow-root
```

7　Enjoy coding



# 　結論
めんどくさいがこれで最低限、表題のことはできる。他にいい方法があれば教えて欲しい。。
RDS(PostgreSQL)の接続方式について


### １．目的

RDS(PostgreSQL)をAmazon Linux2より接続する手順を説明します。RDSへは***psql コマンドライン***を使用して、PostgreSQL DB インスタンスに接続できます。PostgreSQL またはクライアントコンピュータにインストールされた psql クライアントのどちらかを利用します。psql を使用して PostgreSQL DB インスタンスに接続するには、***ホスト情報とアクセス認証情報***を指定する必要があります。 


### ２．手順
#### postgreSQLのダウンロード手順


```bash:インストール手順
sudo yum -y install postgresql.x86_64
```

```bash:postgresql12をインストールしたいかたはこちら
rpm -ivh --nodeps https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sed -i "s/\$releasever/7/g" "/etc/yum.repos.d/pgdg-redhat-all.repo"
yum install -y postgresql12
yum install -y postgresql12-server
yum install -y postgresql12-contrib
```





#### pgslでの接続手順

```bash:pgqlでの接続方法
psql \
   --host=<DB instance endpoint> \
   --port=<port> \
   --username=<master user name> \
   --password \
   --dbname=<database name> 
```

```bash:pgqlコマンドの接続結果
Password for user postgres: 
psql (9.2.24, server 11.6)
WARNING: psql version 9.2, server version 11.0.
         Some psql features might not work.
SSL connection (cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
postgres-> 
```
Laravel 7.16.1 での409エラー

Laravel 7.16.1 を触っている最中にフォームから送信ボタンを押すと409エラーが発生したので、その解決策をここに備忘録も踏まえて記載しておきます。

```php
<form method="post" action="/helo">
  <?php echo csrf_field(); ?>
  <input type="text" name="str">
  <input type="submit">
</form>
```

csrf_fieldを入れておくと、その部分がcsrf認証のトークンを生成するタグに変換されてエラーがでなくなります。
AzureBlobにjenkinsでファイルを上げてみるテスト

Azureもjenkinsも触ったことないらんぶた(自分)用メモ

基本的には公式のチュートリアル通り

まずMicrosoft Azure Storage pluginをさくっとjenkinsでダウンロード

jenkinsの管理→システム構成→Microsoft Azure Storage Account ConfigurationにてAdd Account
赤枠を入力して追加！
![jnkinsadd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539246/12806b0b-b05d-e4ca-630b-6d05b2225bc8.png)

これで8割がた終了

あとは新規ジョブを作成
ビルドの欄にてシェルの実行を追加（今回はmac上のjenkinsのためシェルの実行を選んだけど、windows上なら公式通りでオッケー）
![build.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539246/f1bd092e-0429-1f25-f50c-ae43a09263f5.png)

最後にビルド後の動作を設定して、終わり
load artifacts to uploadは上げるフォルダ/ファイルの指定っぽい？
ほかにもいろいろ設定はあるみたいだけど、らんらんぶただから公式以上のことはわからないの(´・ω・｀)
![afterbuild.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539246/baa9a9e5-1eed-0ec9-5534-adf28ebb99ea.png)

あとはビルド実行ﾎﾟﾁｰ

あがったで！！！

![NHK.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539246/acc53cdf-4a7c-2952-1659-ea8b37246ac7.jpeg)
ローコードプラットフォームのoutsystemsで3時間でスマホアプリが動くまで

##はじめに

とある勉強会で、outsystemsという最近流行りのローコードプラットフォームの概要を教えて頂いたので、個人で無期限で無料ということもあり、ちょっと使ってみることにしました。

* ちなみに、windowsです


## outsystemsとは
* アプリケーションをGUIベースで作成できるローコードプラットフォーム
* 個人の場合は無料版がある
* outsystemsはポルトガルの会社らしい

## TL;DR
* outsystemsでメモアプリを作る
* アカウント作成して、スマホアプリをデプロイし、ブラウザと自分のスマホ(アプリイインストール)にいれて、動作確認する


## アカウント作成&環境インストール
* bluememe社に詳しいアカウント作成方法がありますので、基本的にこれに従います
    * https://www.bluememe.jp/outsystems/product/personal-environment.html
    * 私がアカウントを作成した時点では情報が少し古かったようなので、完全に同じではありませんでしたので、少し注意が必要です。
* 開発環境のexeも途中でダウンロードされるので、普通にインストールします
    * 今後の作業はこの環境で行い、オンラインで環境に接続して行います


## アプリの作成
* インストールされた開発環境に従い、アプリの種類を選んでいきます

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/f45efffa-84d2-2149-cce4-a17d7bc60491.png)
(https://success.outsystems.com/Documentation/ja-jp/11/Getting_Started/Create_Your_First_Mobile_App)

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/7642729c-d03b-31eb-6d58-0984763ce729.png)

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/08ecf11a-eb1e-b34c-b794-164baad15c59.png)

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/3e8cb3b4-feec-6798-a06e-c20ff5314869.png)

![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/37bbc952-b0b2-a756-37d9-6bfd55e6d22f.png)

## 基本的な構成
* 今どきで、画面の構成やみやすさは何の問題もありません。
* Process,Interface,Logic,Dataの4つの構造があります。

![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/38e67325-583c-4993-49b2-b4cb87e840b0.png)

* 基本的には、チュートリアルに従って作りました
    * [最初のモバイルアプリを作成する](https://success.outsystems.com/Documentation/ja-jp/11/Getting_Started/Create_Your_First_Mobile_App)
        * ちょっとだけ変えています
            * 有効化フラグは実装せず
            * タイトルを追加
            * 削除ボタンを実装

## ログインユーザの登録
* デフォルトでは、まずログイン画面が表示され、ログインをしないと、↑で作ったアプリにたどり着けないので、ユーザを作成します。
* これは、outsystemsのWeb上から操作します

![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/bef6747e-e323-8808-9881-0c68ff69749e.png)

![図8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/daa716f4-0831-e402-04df-697f5b98d426.png)

![図9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/c926988f-44ce-331b-9562-57b6d5b12553.png)


## 作ったアプリをWebでの確認
* 作ったアプリをデプロイして、エミュレータで確認できます。
    * デプロイをして、ボタンをクリックするだけでブラウザ上で確認できます。
    * 
![図10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/dc4b2f9a-5846-e864-5f90-791a98a6edda.png)
![図11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/a99a4f39-40f5-c4fe-d16f-608799bd00e4.png)

## 作ったアプリを実機のスマホで確認
* なんとボタンひとつで、スマホアプリのapkファイルやiosのアプリを作成できます。
    * 作成が終わると、リンクが表示されるので、これに従ってインストールをします。
![図12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/54533ef0-bf10-50c8-e318-fe0ebed7d316.png)
![図13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/17c5b9f6-fd0c-32dc-7347-77eabe1fb3b8.png)

## outsystemsのスマホアプリで試験
* ↑は完全に配布用のスマホアプリですが、outsystemsのアプリを経由してアクセスすることもできます。
    * ios/androidの両方が準備されているので、こちらを利用するのもよいでしょう

## その他
* ここまでかかった時間が約3時間。すごいね！！
[Ubuntu 20.04 LTS]アセンブリ(NASM)スターターキット

# 環境
- Ubuntu 20.04 LTS

# はじめに
これからアセンブリを始める方へ。

# [Sublime Text](https://www.sublimetext.com/)
インストール方法は、公式に`apt`でのやり方が書いてあります。
パッケージは`NASM x86 Assembly`を入れましょう。
![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246294/2d33306b-1952-00f7-4377-03e2400b5d66.png)
図1 `NASM x86 Assembly`を入れた`Sublime Text 3`

# [NASM](https://www.nasm.us)
アセンブラです。
`sudo apt install nasm`
の1行です。

# GNU ld
リンカです。上の`NASM`と一緒に使います。
恐らく`Ubuntu 20.04 LTS`には最初から入っています。

# gdb
デバッガです。
恐らく最初から入っています。
`layout asm`すると逆アセンブルされたものが
`layout regs`するとレジスタが
それぞれ表示されます。
Intelシンタックスが好みならば、`set disassembly-flavor intel`をしましょう。
![fig2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246294/12bb744c-d20e-72fc-2fb9-9bd9a71b6e7c.png)

図2 `gdb`

# 書籍(個人的なお薦め)
- [低レベルプログラミング C11とアセンブリを使ったIntel x64アーキテクチャの理解と実行性能の高いプログラミングモデル](https://www.kinokuniya.co.jp/f/dsg-01-9784798155036)
- [Hacking: 美しき策謀 脆弱性攻撃の理論と実装 第2版](https://www.kinokuniya.co.jp/f/dsg-01-9784873115146)
flutterで特定のプラグインをインストールした後にiOSのbuildができない

[stripe_payment](https://pub.dev/packages/stripe_payment#-readme-tab-)を初期状態から試そうと思ったがbuild出来なくて、ハマった。

### エラーメッセージ

```
Automatically assigning platform `iOS` with version `8.0` on target `Runner` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`
```

podfileでiOSのバージョンが指定されていない。
その場合は8.0を勝手に指定するそうで、そのバージョンが対応していないからエラーになっているのかな？

#### Podfileを見る
ios/Podfileの先頭にあるコードにプロジェクトごとにOSのバージョンを定義してねって書いてた。

```
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'
platform :ios, '10.6'
```

エラーメッセージあった[リンク先](https://guides.cocoapods.org/syntax/podfile.html#platform)を参考にverを10.6に指定してbuildしたら動いた。


```
# Uncomment this line to define a global platform for your project
platform :ios, '10.6'
```
docker環境構築で引っかかった部分

###コレはメモです
[データサイエンス100本ノック（構造化データ加工編）の環境構築（Windows10）](https://qiita.com/rasyo/items/dd6f8dfc422511da25d6)
コレをやりたくてDockerのセッティングをしていたら引っかかった部分

#GUI(？)環境変数でGitを呼び出せない
GUIっぽい画面からGitを呼び出そうとしていたが、パスがつながっていないと怒られる。
環境変数の画面で設定してもダメだった。
結果的にコマンドプロンプトからDockerを開いて解決。

#アクセス権限

>※環境構築中にポップアップの警告が表示される場合、DockerのローカルPCに対するアクセス権限がない可能性があるため「Share it」を選択してアクセス権限を付与する。

のShare itが分からず引っかかる。~~そもそもDockerの権限なのかGitの権限なのかもわからない~~
調べてみたら[この記事](https://ryoichi0102.hatenablog.com/entry/2017/01/26/134138)が近そう
しかし、
>
サイドメニュー Shared DrivesよりC DriveをSharedにします。

サイドメニューにShared Drivesがない
なので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650016/f2df52ea-f3e0-7506-036f-1455c6ffe255.png)
①→②→③で開きたいフォルダを設定したらできた(アクセス権限のポップアップで許可が出て、許可したらできた)

##なんとなくでできたけど
詳しいことが知りたい人は他の記事等で調べてみてください。
自分はとりあえず環境だけ作りたかったので突貫しました。
エラー等吐いたらまた更新します。
Vue.jsだけでTODO機能を作ってみる

Javascriptだけで簡単なTodo機能は実装できるので備忘録

## 環境
node.js 13.10.1
vue/cli 4.4.4


## 完成品

タスクの追加、削除、チェックができる
[![Image from Gyazo](https://i.gyazo.com/7b7221056d9df61bbb18fa46c2f08fac.gif)](https://gyazo.com/7b7221056d9df61bbb18fa46c2f08fac)


## 必要なツールの導入

まずVue/Cliとnode.jsをPCにインストールする必要がある。
説明は割愛。


## プロジェクトの作成

以下のコマンドを打つ

```
$vue create プロジェクト名

$cd プロジェクト名
$npm run serve
```

こんな画面が出たらOK

[![Image from Gyazo](https://i.gyazo.com/0e9fdfe4576c97a6be64c18aac6fdf79.png)](https://gyazo.com/0e9fdfe4576c97a6be64c18aac6fdf79)


## コンポーネント作成

・src/componentsディレクトリに任意のファイル作成
・views/Home.vueディレクトリに上記のファイルを読み込ませる

```vue:Home.vue
import HelloNuxt from '@/components/HelloNuxt.vue'
```

下準備OK

## ファイル編集

大きくいじったのはこの二つ

```vue:components/HelloNuxt.vue
<template>
  <div>
    <form v-on:submit.prevent> 
      <h2>TODO LIST</h2>
      <input type="text" v-model="newItem">
      <button v-on:click="add">
        追加
      </button>
    </form>
    <ul>
      <li v-for="(todo, index) in todos">
        <input type="checkbox" v-model="todo.isDone">
        <span v-bind:class="{ done: todo.isDone }">{{ todo.item }}</span>
        <button v-on:click="deleteItem(index)">消去</button>
      </li>
    </ul>
    <p>{{ newItem }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      newItem: '',
      todos: []
    }
  },

  methods: {
    add: function(event) {
      if (this.newItem == '') return;
      const todo = {
        item: this.newItem,
        isDone: false
      };

      this.todos.push(todo);
      this.newItem = '';
    },

    deleteItem: function(index) {
      this.todos.splice(index, 1)
    }
  }
}
</script>

<style scoped>

</style>

```

```vue:views/Home.vue
<template>
  <div class="home">
    <HelloNuxt/>
    <!-- <HelloWorld/> -->
  </div>
</template>

<script>
// @ is an alias to /src
import HelloNuxt from '@/components/HelloNuxt.vue'
import HelloWorld from '@/components/HelloWorld.vue'

export default {
  name: 'Home',
  components: {
    HelloNuxt,
    HelloWorld
  }
}
</script>
```
Vue.jsでtruncateする

Vue初心者なのですが、トランケートできないかと思い、調べて見た所、いくつかの情報があったのですが、そのままでは動かず....。
再度調査して、少し修正したら動いたので、備忘録で...

## 環境
Vue.js:2.6.11 
VueCli:4.4.1

## コンポーネント内で使用する場合
script内に記載

```
filters: {
    truncate: function(value,length,omission) {
      if (value.length <= length) {
        return value;
      }
      return value.substring(0, length) + omission;
    }
  },
```
html内の記載

```
{{news.title | truncate(10,'・・・') }}
```

## グローバルで使用する場合
new Vueより前に↓を書く

```main.js
Vue.filter('truncate', function(value, length, omission) {

  if (value.length <= length) {
    return value;
  }

  return value.substring(0, length) + omission;
});
```

```components.vue
{{news.title | truncate(10,'・・・') }}
```

##参考にさせていただいたサイト
https://qiita.com/7kaji/items/a280c6b5353efa0a7c35
https://saitetu.net/entry/2019/12/23/004509
【初心者向けハンズオン】kaggleの「住宅価格を予測する」を1行ずつ読み解く（第5回：カテゴリカル変数のダミー化）

# お題
* [第1回の内容はこちら](https://qiita.com/WdknWdkn/items/a7f5e4a2cc492676e12a)
* [第2回の内容はこちら](https://qiita.com/WdknWdkn/items/95eccfae1aac99babe7a)
* [第3回の内容はこちら](https://qiita.com/WdknWdkn/items/54ee2cdc56d85d5e795c)
* [第4回の内容はこちら](https://qiita.com/WdknWdkn/items/b3ec4606d533770e5eb5)

　有名なお題であるkaggleの「House Price」問題にみんなでチャレンジしていくことになったハンズオンの内容をメモしていく企画の第5回。解説というよりはメモのまとめだったりもしますが、どこかの誰かのためになれば幸いです。そろそろ終りが見えてきたと思いたい。

* 元々のお題：https://www.kaggle.com/c/house-prices-advanced-regression-techniques
* 参考にした記事：https://yolo-kiyoshi.com/2018/12/17/post-1003/

# 本日の作業

## カテゴリカル変数のダミー化
文字列とかを数値に置き換えをして行く感じですかね。

* 参考：https://markezine.jp/article/detail/20790

```
# カテゴリカル変数の特徴量をリスト化
cat_cols = alldata.dtypes[alldata.dtypes=='object'].index.tolist()
# 数値変数の特徴量をリスト化
num_cols = alldata.dtypes[alldata.dtypes!='object'].index.tolist()
# データ分割および提出時に必要なカラムをリスト化
other_cols = ['Id','WhatIsData']
# 余計な要素をリストから削除
cat_cols.remove('WhatIsData') #学習データ・テストデータ区別フラグ除去
num_cols.remove('Id') #Id削除
# カテゴリカル変数をダミー化
alldata_cat = pd.get_dummies(alldata[cat_cols])
# データ統合
all_data = pd.concat([alldata[other_cols],alldata[num_cols],alldata_cat],axis=1)
```
### カテゴリカル変数の特徴量をリスト化
* .dtypes：これ第3回でやりました。データ型を検出するやつだ。
* .index：これは第4回でやりました。該当する配列のindexだけ抜き出してくれるやつ。
* .tolist()：これも第4回出やりました。indexで抽出されたやつを配列にしてくれるやつ。

おお、積み重なっているじゃないか、自分。という謎の手応え。では以下の結果だけまとめて出力してみたいと思います。object型のデータ型のやつだけ、indexを一覧でとってきていますね。

`cat_cols = alldata.dtypes[alldata.dtypes=='object'].index.tolist()`
<img width="983" alt="スクリーンショット 2020-06-22 12.05.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/8f6c2163-e6cf-eeb5-956c-b83125e9ab79.png">

### 数値変数の特徴量をリスト化

`num_cols = alldata.dtypes[alldata.dtypes!='object'].index.tolist()`

これはカテゴリカル変数の特徴量をリスト化するのと同じなので割愛。

### データ分割および提出時に必要なカラムをリスト化

`other_cols = ['Id','WhatIsData']`

これは見たまんま、第2回のときに追加したカラムを配列に格納していますね。どうやらこの次のステップで余計な要素をリストから削除するのに使う様子。

### 余計な要素をリストから削除

いらない要素をリストから削除するのだそうです。`cat_cols`の中にはWhatIsDataという項目があったことを先程の出力結果からも確認できます。

`cat_cols.remove('WhatIsData') #学習データ・テストデータ区別フラグ除去`
`num_cols.remove('Id') #Id削除`

* .remove()：使い方的には見たまんま。該当項目を削除する。
* .remove()参考：https://www.javadrive.jp/python/list/index8.html

### カテゴリカル変数をダミー化
`alldata_cat = pd.get_dummies(alldata[cat_cols])`

* .get_dummies：見たまんま、与えられた列の値をダミー化してくれる。
* .get_dummies参考：https://note.nkmk.me/python-pandas-get-dummies/

珍しく所感。関数に当て込むだけで勝手に全部やってくれるなんてなんて便利なやつだ…pythonのこういうところ好き。

`alldata_cat = pd.get_dummies(alldata[cat_cols])`の出力結果。すごい、ほんとに変わってる。
<img width="554" alt="スクリーンショット 2020-06-22 12.15.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215128/19ff20d8-24d5-1071-c5c2-0a9d438b31b5.png">

### データ統合
`all_data = pd.concat([alldata[other_cols],alldata[num_cols],alldata_cat],axis=1)`

これは見たまんまですね。[alldata[other_cols], alldata[num_cols], alldata_catをconcatとで合体。（見たまんまとか偉そうにいってしまうまでになりました）

# おしまい。

今回はテンポよく進めたかと。存外読み解きに時間がかからなくなっている様子。地道にやってなれてきている感じですかね。引き続き精進します。
データの整形が終わったので次からいよいよ分析ですね。楽しみですね。
PWAでFCMプッシュ通知のためのトークンが取得できないときはfirebase-messaging-sw.jsを確認する

# 現象
- PWAアプリでFCMプッシュ通知のためのtokenが取得できない
- エラーメッセージが出力されている

# エラーメッセージ

```
A bad HTTP response code (404) was received when fetching the script.

An error occurred while retrieving token.
FirebaseError: Messaging: We are unable to register the default service worker.
Failed to register a ServiceWorker: A bad HTTP response code (404) was received when fetching the script.
(messaging/failed-service-worker-registration).
```

# 原因
- firebaseでpush通知するために必要な[firebase-messaging-sw.js](https://firebase.google.com/docs/cloud-messaging/js/receive)が存在しなかった
- 環境移行中に404になってしまったっぽい
- 解決してしまえばQiitaに書くほどのことじゃないんだけどねぇ
GitHubのRawContentがやたらとキャッシュされてこまるのをPURGEする方法が分からなかった

# はじめに
ちょっとしたプログラムをGitHubやGistに置いて使う場合に、ちょっとした修正を入れてコードを走らせたいことがあります。

が、これがやたらとキャッシュされるので困るのです。

# 確認
curlで確認すると、ブラウザには5分ほどキャッシュするように言われています。


```console
$ curl -s --head https://raw.githubusercontent.com/yousan/github_template/master/.github/ISSUE_TEMPLATE/detailed.md | grep -e 'Expires' -e 'Date' -e 'X-Cache'

Date: Mon, 22 Jun 2020 03:12:10 GMT
X-Cache: HFM, HIT
X-Cache-Hits: 0, 1
Expires: Mon, 22 Jun 2020 03:17:10 GMT
```

# キャッシュのクリア方法
`PURGE`を送るとクリアされるようです。

```console
$ curl -X PURGE https://raw.githubusercontent.com/yousan/github_template/master/.github/ISSUE_TEMPLATE/detailed.md

{"msg":"Provided credentials are missing or invalid"}
```

が…、以前はクリアできていた気がしますができなくなっていました。エラーメッセージはFastlyのものかもしれません。


参考
[GitHubのREADME上の画像キャッシュはPURGEリクエストで破棄させられる - Qiita](https://qiita.com/mpyw/items/16b693cb62820b480ce2 "GitHubのREADME上の画像キャッシュはPURGEリクエストで破棄させられる - Qiita")
Pythonセルフレビューチェックリスト

# はじめに
チーム内の需要に応えてセルフレビューを行う際のチェック項目をざっと書き出してみたのですが
外部に公開した方が楽にブラッシュアップできるなと思い投稿しました。なお

- スタイルについてはフォーマッターで強制するので触れません
- 項目は全て`yes` or `no`で答えられる形になっています
- 厳しすぎるくらいに書いて「出来るかぎりで 構わないから」という運用です
- エラーハンドリングについての項目は諸事情により省略しています

という前提。

# 一般
- 文字列のフォーマットを`format`関数ではなくf-stringで行っている
- 関数のデフォルト引数にミュータブルオブジェクトを設定していない
- ミュータブルオブジェクトの破壊的メソッドを使用していない

    ```python
    hoge = [1, 0, 2]
    hoge.sort()  # ×
    fuga = sorted(hoge)  # ○
    ```
- 比較の式は基準値を右辺に置いている

    ```python
    if x > 10
    ```
- 三項演算子/セイウチ演算子/内包表記を濫用していない
    - 通常のif/for文で記載した方法と比較した
    - 三項演算子を `or` で置換できるか確認した
- `list`を濫用していない
    - 要素数が不変のものには`tuple`を用いている
    - イテレータが欲しい場合はリスト内包表記ではなくジェネレータ式を用いている
- `while True`を使用していない
- パスは`str`型ではなく`pathlib.Path`型で扱っている
- 正規表現におけるグルーピングには名前を使用している

    ```python
    p = re.compile(r'(?P<word>\b\w+\b)')
    m = p.search( '(((( Lots of punctuation )))' )
    m.group('word')
    ```


# 設計
## クラス
- SOLIDの原則に従っている
    - 単一責任の原則に従っている
    - 解放/閉鎖の原則に従っている
    - リスコフの置換原則に従っている
    - インタフェース分離の原則に従っている
    - 依存性逆転の原則に従っている

## 関数(メソッド)
- 単一の機能のみを持っている
- 副作用がない
- 30行以内に収まっている
- 3段以上のネストが存在しない
- 変数は使用する直前に宣言されている
- 変数が使いまわされていない
- 類似性の低い変数同士を1行で宣言していない
- マジックナンバーを使用していない

# 命名
## クラス
- Docstringと整合性が取れている
- 名詞で終わっている
- 名前からクラスの責任を読み取ることが出来る
- 抽象クラスは抽象的な名前、具象クラスは具体的な名前になっている

## 関数(メソッド)
- Docstringと整合性が取れている
- (`bool`型以外を返す場合) 動詞から始まっている
- (`bool`型を返す場合) be動詞/助動詞から始まっている
- 名前から関数の機能もしくは目的を読み取ることが出来る
- 第一引数を指す目的語は省略している
- 外部から呼ばれることのないメソッドには先頭に `_` が付いている
- 特殊メソッド以外で `__` は使用していない

## 変数(定数)
- (`bool`型以外の場合) 名詞で終わっている
- (`bool`型の場合) be動詞/助動詞から始まっている

    ```python
    is_empty = False
    can_read = True
    has_changed = True
    ```
- (イテラブルオブジェクトの場合) 名詞が複数形になっている
- 名前から変数に紐づくオブジェクトを具体的かつ正確に読み取ることが出来る
- 特定の場合に決まった名前を使用している
    - `_`: 使用しないオブジェクト
    - `r`, `w`: リーダー, ライター
    - `i`, `j`, `k`: ループ回数のカウンター
    - `c`: ループ以外のカウンター
    - `x`, `y`, `z`: 座標
    - `cls`: クラスメソッドの第一引数
    - `self`: インスタンスメソッドの第一引数
    - `other`: `self`と同じクラスの別インスタンス

## 共通
- 予約語/組み込み関数と被っていない

    ```python
    # クラス変数、インスタンス変数およびメソッドを除く
    ```
- 英文法に間違いがない
- `of`に掛かる言葉は2語以上である

    ```python
    game_of_thrones = hoge  # ×
    thrones_game = hoge  # ○
    start_of_something_new = hoge  # ○
    ```
- 略記を使用している場合はその略記が一般的であるか確認した


# Docstring
## 共通
- 名前と整合性が取れている
- そのクラスや関数が知りえない情報を含んでいない
- 文中に含まれる用語の定義を確認した

## クラス
- クラスの持つ責任の概要を説明している
- クラスを作成した目的について説明している
- 具体的な処理についてはメソッドのDocstringに委ねている

## 関数(メソッド)
- 関数の機能もしくは目的の概要を説明している
- 何を受け取って何を返すか説明している


# 型アノテーション
- 全てのクラス変数、インスタンス変数に型アノテーションが付与されている
- 全ての関数に戻り値の型アノテーションが付与されている

    ```python
    # 戻り値を指定していない場合は `None`
    # 戻り値を持たない場合は `NoReturn`
    # 一部の特殊メソッドを除く
    ```
- ジェネリックなクラスについては内部の型も記述している

    ```python
    hoge: list = ['a', 'b', 'c']  # ×
    hoge: List[str] = ['a', 'b', 'c']  # ○
    fuga: Tuple[int, ...] = (1, 2, 3)  # ×
    fuga: Tuple[int, int, int] = (1, 2, 3)  # ○
    ```
- 引数の型によって戻り値の型が変わる関数については`@overload`デコレータを使用している
- `Any`を使用していない


# おわりに
こんな感じです。量と質のバランスが難しいですね。
新卒から2年3ヶ月で会社を退職したけど、今まで何やったかをまとめる

はじめましての方は初めまして、お久しぶりの方はお久しぶりです白々さじきです。
この度2018年に新卒で入社した会社を退職することにしました。
2年3ヶ月という短い期間での退職となりました。
大学を出て最初にお世話になったのですが、色々あって自主都合での退社となりました。
ここでは、私が学んだ技術的なことを記載していきたいと思います。

#なぜ書くのか
今まで自分が学んだことを忘れないうちに記録するためと、今後技術的にどう成長させるかをまとめるためです。
##学んだ技術スタック
・Python
・AWSを使ったWebサービスの構築（と料金計算方法）
・Serverless Framework
Pyrhonに関しては、Pycharmで開発していました。
Pyrhonは、pep8というコードスタイルを使って開発を行ないました。
Serverless Frameworkは、AWS等のクラウドサービスを自動で構築するときに使用することができるFrameworkです。このServerless Frameworkを使用してWebAPIをAWSにアップロードしていました。
AWSに関しては、色々やったので別節に記載します。

##AWSでやったこと
WebAPIの作成
EC2でバッチ処理を行う
CodeCommitでのソース管理

###AWSで使ったサービス
・APIGateway
・Lambda
・DynamoDB
・RDS
・CloudWatch
・Cognito
・EC2
・VPC
・Firehose
・CodeCommit

###具体的にどう使っていたのか
私の業務は主にWebAPIを作成していました。
基本的には、APIGateWayにLambdaを繋げその後、DynamoDBかRDSを使うという流れでした。
Cognitoは、APIGateWayの認証で使用してました。主に、ユーザーの認証した後にIDトークンを使って他のWebAPIを使う時の制限をかけるようにしていました。
また、LambdaのログをCloudWatchで出すようにしていました。
CloudWatchアラームもかけるようにしていたので、何かLambda内で内部エラーが出た時やDynamoDBのアクセス数が高くなった時に連絡が来るようにしていました。
また、Pythonで書いたコードは、CodeCommitにあるリポジトリで管理していました。
EC2に関しては、VMとして定期的に実行させるバッチ処理に使用していました。
VPNは、RDSやEC2でネットワークを指定するときに、全てデフォルトとかでまとめるのでは無く、各機能毎にサブネットを分けるようなことをしていました。
それに伴いRDSにアクセスするLambda用にも別途サブネットを作成して、RDSに外部からのアクセスを防ぎつつLambdaはアクセスすることができるような環境を作成していました。

#今後したいこと
今まで、クラウドメインで業務を行なっていました。
クラウドと言っても結局ネットワークの設定やSQLのチューニング等は必要なので、それらの知識があった方が良いと感じることが多かったです。
現在の私だと、ネットワークやDBなどの知識がまだ不十分だと感じたので、データベーススペシャリストやネットワークスペシャリストの勉強をすることで補っていきたいと思います。

#最後に
短い間ではありましたが、様々なことを学ぶきっかけを頂いたことに感謝しています。
次の会社でも学んだことを生かしながらがんばっていこうと思います。
kusanagi の設定の一番最初にすること

#kusanagi の設定が終わって、WordPressの管理画面に入れた後に最初にすること

知っている人が多いと思うけど、意外と記事ではみないので、WordPressの管理画面にkusanagiから設定してね！って出てくる内容の対処法を記載します。

##公開ディレクトリにwp-config.phpが存在しています。
正式には「公開ディレクトリにwp-config.phpが存在しています。wp-config.phpをDocumentRootディレクトリの上に移動させて安全性を向上させてください。」と出ている内容の対処法です。


```
cd /home/kusanagi/provision/DocumentRoot/
mv wp-config.php ../wp-config.php
```

root権限で、SSHなどで上記のコードを実行します。[provision]の部分はそれぞれ設定したプロビジョンでお願いします。

ちなみに、 WordPress は wp-loader.php にて wp-config.php ファイルを読み込んでいるんですが、公開ディレクトリに wp-config.php ファイルがない場合は自動的にその上のディレクトリに探しに行く仕様になっているので、これだけで大丈夫です。

##wp-config.php ファイルの権限は 666 です。

正式には「wp-config.php ファイルの権限は 666 です、推奨ファイル権限は 440 です。」と出ている内容の対処法です。

```
cd /home/kusanagi/provision/DocumentRoot/
chmod 440 wp-config.php
```
chmod で権限を変えます。ちなみに、ディレクトリを移動していたら最初の一行目は必要ありません。

##wp-config.php ファイルのオーナーは httpd.www です。
正式には「wp-config.php ファイルのオーナーは httpd.www です、推奨ファイルオーナーは kusanagi.www です。」と出ている内容の対処法です。

```
cd /home/kusanagi/provision/DocumentRoot/
chown kusanagi.www wp-config.php
```
chown でファイルオーナーを変えます。ちなみに、ディレクトリを移動していたら最初の一行目は必要ありません。

##wp-content/ フォルダの権限は 777 です。
正式には「wp-content/ フォルダの権限は 777 です、推奨フォルダ権限は 755 です。」と出ている内容の対処法です。

```
cd /home/kusanagi/provision/DocumentRoot/
chmod 755 wp-content
```
chmod で権限を変えます。ちなみに、ディレクトリを移動していたら最初の一行目は必要ありません。

以上です。基本の基本ですが、一応。