OmniAICreator/Qiita-1.07M huggingface dataset:
Power Pivotを利用して複数シートのテーブルを一つのテーブルに統合する

複数のシートに分割されたテーブルが存在すると、ピボットテーブルを用いた集計を行うのが非常に大変でしたが、Power Pivotの機能を利用することで一つのテーブルにまとめ、ピボットテーブルを適用しやすくなる。


1.次のような構造をもったシートがたくさん存在している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/99f74c11-1adc-5fe1-f0cc-0cb06c0a1688.png)

2.まずはピボットテーブルに統合したい対象のブックを保存する。

3.「Ctrl + N」で新しいブックを作成する。

4.新しいブックで「Data」 > 「Get Data」 > 「Frin Wookbook」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/c55957b3-9c0f-7a87-7192-7738f8925f8f.png)

5.保存してあるデータソースを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/84a40360-255a-e699-0c1b-56d5843d50c2.png)

6.まとめてシートを選択するう場合は、下図のようにディレクトリのアイコンを選択し、「Transform Daat (データの変換)」をクリックする。
※このステップは重要。一つ一つ選択していくなんてことの無いように‼
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/b1113900-b826-0cd9-e7b9-b14a9ce94e1d.png)
※「3623」枚ものシートが存在するため、1ずつ選択するわけにはいかないのでまとめて扱う方法を覚えておく必要がある。

7.「Data」カラムの右側のボタンをクリックして、内包されているデータを展開する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/ee58341c-ac58-3d11-af55-b7578fe577af.png)

8.展開時に表示するカラムの一覧を選択する。
そのうえで「Use Original Column name as prefix」(元の列名をプレフィックスとして使用します)にチェックを入れ、「OK」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/66be142e-f988-cf63-1a06-554c8b8c2bf5.png)

9.最初の行をヘッダとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/fa594cd7-0f2c-00e8-d0f7-c94b460db483.png)

最初の行をヘッダーとして使用するにチェックを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/13d6e12e-dfc0-1067-6b13-f3644e923912.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/08ce3e94-cb30-9160-2557-80fd22c56b58.png)

元データのシート名が記載されているカラムについては、名前を変更した方が好ましい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/516f7fde-0987-1944-add0-3ac600209c89.png)



10.クエリの結果にヘッダ行が混在しないようにするため、ヘッダ行を抽出条件から除外する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/cdda3d38-a990-9d2f-6cb7-12289128d801.png)


11.その他、データクレンジングが終了したら、「閉じて読み込む」ボタンを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/c2c0b21f-6efa-dcff-bc92-df91c7c29d91.png)


12.完成形のテーブルをインポートすることができた。
これでピボットテーブルなど便利な機能を用いた分析もできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/b9a16230-475d-ab57-29bc-0f91c2e2ebf4.png)
docs

https://docs.microsoft.com/zh-cn/powerapps/maker/canvas-apps/functions/function-guid


将**按钮** 控件的 OnSelect 属性设置为以下公式：
ClearCollect( NewGUIDs, ForAll( Sequence(5), GUID() ) )

该数据表显示了 GUID 的列表：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280122/3f8f7af2-2e1b-b6f0-a89b-9a44c24ea5ce.png)

再次选择该按钮以显示不同的 GUID 列表：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280122/4a61e895-81d7-2500-e56c-573215b2be43.png)

若要生成单个 GUID 而不是表，请使用以下公式：
Set( NewGUID, GUID() )
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280122/48a0a79a-6c28-44a4-d169-20fdf1355651.png)
Numbaのjit内で配列を宣言したり辞書型を使いたい

Pythonを高速するためにNumbaを使ってみたが、何箇所かつまづきのポイントがあったので、その対応策を自分用のメモとして残します。

#配列を宣言したい
jit内では`np.array`での配列作成はエラーになる。多分、`dtype`で色々な型を作ることができるためだと思う。

```python:失敗例
import numpy as np
from numba import njit

@njit
def test(a,b):
    return np.array([a,b],dtype="int64")

print(test(np.int64(1),np.int64(2)))
```

配列を作るには`np.array`を使うサイトが多いが、実は`np.int64`でも作成可能である。

```python:成功例
import numpy as np
from numba import njit

@njit
def test(a,b):
    return np.int64([a,b])

print(test(np.int64(1),np.int64(2)))
```

#辞書型を使いたい

Numbaの辞書型を使えば可能である。`key_type`にキーの型を、`value_type`に値の型を指定する。

```python:辞書型の使用例
import numpy as np
from numba import njit
from numba.typed import Dict
from numba.types import types

@njit
def test(a,b):
    return a[b]

x = Dict.empty(key_type=types.int64,value_type=types.int64)
x[np.int64(1)]=np.int64(100)
x[np.int64(2)]=np.int64(200)
print(test(x,np.int64(1)))
```

#まとめ
今のところ高速化したい部分は数値計算だけなので、文字列とか調べていません。
時間があれば、更に高速化できるテクニックとか調べてみたいと思います。
Python 3 + Tkinter で Windows アプリを開発する (準備編)

# はじめに

Python の標準ライブラリ「[Tkinter](https://docs.python.org/ja/3/library/tkinter.html)」を使用して、Windows の GUI アプリケーションを作成してみる。

# 準備

## Eclipse のインストール

今回は IDE に Eclipse、Python の実行環境に PyDev を使用することにする。

まず以下の URL から、「Pleiades All in One Eclipse」の Python の Full Edition をダウンロードする。

https://mergedoc.osdn.jp/index.html#/pleiades_distros2020.html

ダウンロードした zip ファイルを解凍し、中の `pleiades` フォルダを C ドライブ直下に移動する。

## Eclipse の設定

Eclipse のデフォルトのインタプリタを Python 3 に変更する。

Eclipse (`C:\pleiades\eclipse\
eclipse.exe`) を起動し、メニューの [ウィンドウ] -> [設定] を開く。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/20a64d5c-bcaf-cf3c-acf8-fd82e099bb1f.png)

左側メニューの [PyDev] -> [インタープリター] -> [Python インタープリター] を開く。「Python3」を選択して [上へ] ボタンをクリックして「Python3」を一番上に移動させ、[適用して閉じる] ボタンをクリックする。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/a9dc4e81-656f-206a-52f8-3e3fd232346b.png)

## プロジェクトの作成

Eclipse のプロジェクトを作成する。

左側の「Pydev パッケージ・エクスプローラー」の空白部分を右クリックし、[新規] -> [プロジェクト] を開く。

![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/46eb462f-e833-355d-137a-2679b2392bd8.png)

[PyDev] の [Pydev プロジェクト] を選んで [次へ] ボタンをクリックする。

![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/210aff53-f7f7-f69f-a001-4aab5151ff26.png)

適当なプロジェクト名 (今回は `testproj1`) を入力し、[完了] ボタンをクリックする。

![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/63d984f0-26a2-c044-c8bd-3bc8e69f42bd.png)

## Python スクリプトの作成

作成したプロジェクトに Python のプログラムを追加する。

左側の「Pydev パッケージ・エクスプローラー」の中にある、先ほど作成したプロジェクトを右クリックし、[新規] -> [ファイル] をクリックする。

![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/1a51a605-ea8e-cdef-ca4e-55594490e944.png)

適当なファイル名 (今回は `test1.py`) を入力し、[完了] ボタンをクリックする。

![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/33b8a9c2-ba0a-33d2-dd54-bc61f2fa293e.png)

`test1.py` に下記のコードを入力して保存する。

```python
import tkinter as tk

if __name__ == '__main__':
    root = tk.Tk()

    root.title('test')
    root.geometry('300x200')

    label01 = tk.Label(text='Hello, World!')
    label01.pack()

    root.mainloop()
```

Eclipse 上部の再生ボタンの右にある ▼ マークをクリックし、[実行] -> [Python 実行] を選ぶ。

![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/a34512b7-79ac-f9f2-36f1-7c88ead7fcf2.png)

プログラムの実行結果が表示される。

![31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/3d24a7dd-2fee-07b2-085c-a3977cc7faaa.png)

以上で Windows アプリを開発する準備ができた。

次回は、Tkinter の各種 UI コンポーネントを使用してみる。
phthonで背景図、コンター図、ベクトル図を重ね合わせ

#やりたいこと
pythonで、背景図・コンター図・ベクトル図・カラープロット図の4種類の図を重ね合わせます。背景図はshpファイル、コンター図、ベクトル図、カラープロット図はいずれも2次元グリッドデータを用います。

#背景図
背景図の読み込み、描画はgeopandasで簡単にできます。なお、geopandasをpipでインストールする際は、先にGDAL、Fionaをインストールしておかないとうまくいきませんでした。

```python
import geopandas as gpd
import matplotlib.pyplot as plt
fig, ax = plt.subplots() 
#--1.背景図描画-------------------
shapefile='line.shp'
data = gpd.read_file(shapefile)
ax.set_xlim([-100000,0])
ax.set_ylim([-120000,-60000])
data.plot(ax=ax, color='black')
#-------------------------------
plt.show()
```

#カラーコンター図
メッシュデータを読み込み、pcolormeshでカラーコンターを描画します。カラーコンターの上から、上記の背景図に重ねます。

```python
import geopandas as gpd
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
import numpy as np
from matplotlib.cm import ScalarMappable
#
# (データ読み込み⇒X,Y,Z):省略
fig, ax = plt.subplots() 
#--2.カラーメッシュ描画-------------------------------
fig, ax = plt.subplots() 
norm = Normalize(vmin=-500,vmax=2000)
map  = ax.pcolormesh(X,Y,Z, cmap='rainbow', norm=norm)
#
sm   = ScalarMappable(cmap='rainbow', norm=norm)
sm.set_clim(-500,2000)
pp   = fig.colorbar(sm,orientation='horizontal')
#----------------------------------------------------
#1.背景図描画：同上・省略
plt.show()
```

#コンター図
上記のメッシュデータからコンター図を作成し、重ねて表示します。

```python
# (モジュールインポート)：同上・省略
# (データ読み込み⇒X,Y,Z):省略
fig, ax = plt.subplots() 
#2.カラーメッシュ描画：同上・省略
#--3.コンター図描画-----------------------------------
cont=ax.contour(X,Y,Z, 100, colors=['purple'])
#----------------------------------------------------
#1.背景図描画：同上・省略
plt.show()
```

#ベクトル図
最後にベクトル図を重ねます。ベクトルは、地形の勾配としました。

```python
# (モジュールインポート)：同上・省略
# (データ読み込み⇒X,Y,Z):省略
fig, ax = plt.subplots() 
#2.カラーメッシュ描画：同上・省略
#3.コンター図描画：同上・省略
cont=ax.contour(X,Y,Z, 100, colors=['purple'])
#--4.ベクトル図描画-----------------------------------
# (ベクトル定義⇒U,V):省略
vect=ax.quiver(X,Y,U,V,color='grey',angles='xy',scale_units='xy', scale=0.0001)
ax.quiverkey(vect,0.0,1.1,1.0,'slope')
#----------------------------------------------------
#1.背景図描画：同上・省略
plt.show()
```
ORACLEの名前一覧

#ORACLEの名前一覧

#データベースとインスタンス

+ データベース(グローバルデータベース名称)

+ インスタンス識別子(SID)≠インスタンス名
　　　インスタンス識別子はホスト内でのみ有効（ホスト内で単独で唯一となる）
　　　インスタンス名＝クラスタなどの設定時に共有となる。（単独で単一とならない）
　　※ただし、デフォルトではインスタンス識別子＝インスタンス名



#ORACLE_HOME
  oracleソフトウェアのインストール先のこと


#listener.ora
$ORACLE_HOME/network/admin/listener.ora
サーバ側に置くファイル

#tnsnames.ora
ローカルネーミングパラメータ
クライアント側に置くファイル
 $ORACLE_HOME\network\admin\tnsnames.ora.
　　→「接続識別子」＋「接続記述子」で構成されている
　　　「接続識別子」＝接続する際に使用する名称（ネットサービス名称）
　　　「接続記述子」＝接続する際にどのような方式でどこに接続するのかを記載している
　　　　　　　　　　　アドレス、ポート、通信形式、接続モードが記載されている。
　　　　　　　　　　　サービス名の指定もあり、これはインスタンスの集合体を指す。
　　　　　　　　　　　※インスタンスはDBに対して1対nの関係なので同じサービスを提供する
　　　　　　　　　　　　名称としてサービス名称がある。
 

下記載の内容だと、サービス名称=接続識別子

```
ORCLPDB1=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCLPDB1)
    )
  )
```

#sqlplusでの接続名称

接続方法は2つ

+ tnsnqmes.oraを使用する場合

```
sqlplus username/pass@net_service_name
```

+ 直接接続する場合

```
sqlplus username/pass@ip:port/servicename
```

#参考


http://itsoldier0901.hatenablog.com/entry/2016/12/13/012804
https://www.sql-dbtips.com/tns/tnsnames/
https://qiita.com/tpusuke/items/7af097580f239ba28b9d
なぜブランディング は必要なのか？

# デザインで視せる企業価値について
ブランディングはとても大事だけど、本質的な部分をちゃんと理解できていないような気がしたので参考に読んだ本を元にまとめてみた。古い本ですが前半の『ブランディングがなぜ重要か』の解説がとてもわかりやすかった。なんとなく無意識で理解していた事が言語化されてさらに理解が深まった気がする。

【参照本】
[デザインで視せる企業価値について](https://www.amazon.co.jp/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%A7%E8%A6%96%E3%81%9B%E3%82%8B%E4%BC%81%E6%A5%AD%E4%BE%A1%E5%80%A4-%E4%BC%9A%E7%94%B0-%E4%B8%80%E9%83%8E/dp/4344996739)

## デザインを通して企業の成長につなげる

**ユーザーにとっての価値を大きくする**
- 同業他社と差別化・付加価値で意味づけする
- エンドユーザー・ビジネスパートナー・世間とのコミュニケーションを戦略的に行う

**企業戦略とデザインを一体化させる**
企業にはそれぞれどう在りたいかという理想・サービス分野内での目標や対象となるユーザーが存在する。

>【対象となるユーザー】
>
>**社内の人**
>企業の想いを発信できる・ある程度理解できている

> **社外の人・業界の人・世間**
>数字や理念よりも見ためのイメージで『好き』か『嫌い』か感覚で判断されやすい情報の伝達の大半は視覚を介する。情報よりも視覚デザインが購買行動に直結した影響をもたらす。

企業のビジョン・想い・社会や業界内で目指す方向性などを
視覚的に落とし込み、より正確に企業のイメージを伝える手段。

## 企業イメージのブレをなくす
企業のイメージは大きく3つの情報媒体を通して定着していく。

- 商品・サービスの質
- 宣伝・広告・ロゴ
- 人々の評判

コーポレートデザイン、マニュアル書、ロゴやトレンドマークなど会社が発信するビジュアルが開発の意図通りに使用されるよう定めておかないと長い時間の中で当初の意図と大きくズレて行ってしまう。

発信側が企業ビジュアルの意味するもの・意図を共有している事が何より大事。
web・パンフレット・名刺などそれぞれ与える企業イメージがバラバラになると、
受け取り側も企業イメージのズレが発生してしまうからだ。

企業の発信する表現の全てが、企業『らしさ』を創り出し
経営戦略と一体化する事がビジネスにおいて何より重要。

## まとめ
**企業価値は可視化される事によって初めて認識され、
認識されることでコミュニケーション可能になる。
通常は不可視の企業価値に色を与え、形を与え、言葉を与える事が可能になる。
この継続が企業価値を高める事に繋がるからこそ、ブランディングはとても重要**
[Ansible]mysql_dbでデータベースが作成できない

失敗コード

```
    - name: データベース wordpress を作成
      mysql_db:
        name: wordpress
        state: present
```

エラーメッセージ

```
"msg": "unable to find /root/.my.cnf. Exception message: (1045, \"Access denied for user 'root'@'localhost' (using password: NO)\")"
```

パスワード使わないとログインできないですよ。と言ってると思われる。


成功コード

```
    - name: データベース wordpress を作成
      mysql_db:
        login_user: mysqluser
        login_password: mysqlpassword
        name: wordpress
        state: present
```

login_user、login_passwordを指定するようにした。
ネットの情報見てると失敗コードを紹介してる場合があるので紹介した。
本当は単純に何らかの前提条件があってそれを見逃してるだけかも。
もしくは自分が今インストールしてるのはMySQLではなくMariaDBなので、MySQLなら失敗コードでも動作するのかもしれない。
[PHP]三項演算子メモ

#三項演算子
##基本形
条件式 ? 式1 : 式2

条件式がtrueならば式1,falseならば式2を返す。

```
$param = isset(argv[1]) ? $argv[1] : 'default';
```
##省略形
条件式 ?: 式2

条件式がtrueならば条件式,falseならば式2を返す。

```
function some_func () {
  $val = ...
  return $val;
}
$result = some_func() ?: 'default';
```

##結合規則
PHPの三項演算子は左結合（左から順に評価されること）

```
<?php
$flag1 = true;
$flag2 = false;
echo $flag1 ? 1 : $flag2 ? 2 : 0;
//2
```
右から評価したい場合はカッコをつける
```
<?php
$flag1 = true;
$flag2 = false;
echo ($flag1 ? 1 : ($flag2 ? 2 : 0));
//1
```
Docker x Laravel ブラウザ自動リロード(Hot Module Replacement)

css や js ファイルが変更されたら自動的にブラウザリロードしてくれるととても開発が楽になります。
ということで、Laravel-mixでブラウザ自動リロード設定を行います。

## 対象者

Laravel Blade を書く人向け

## 前提

- [最強のLaravel開発環境をDockerを使って構築する【新編集版】](https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4)
- https://github.com/ucan-lab/docker-laravel

当記事は上記の記事の補足になる記事です。

## 環境

- PHP: 7.4.6
- Laravel: 8.5.0
- Node: 14.2.0
- yarn: 1.22.4
- browser-sync: 2.26.12
- browser-sync-webpack-plugin: 2.2.2
- vue-template-compiler: 2.6.12

## 前準備: yarn を使用する場合

```
{
    // ...
    "scripts": {
        "dev": "npm run development",
        "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "npm run development -- --watch",
        "watch-poll": "npm run watch -- --watch-poll",
        "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --disable-host-check --config=node_modules/laravel-mix/setup/webpack.config.js",
        "prod": "npm run production",
        "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
    // ...
}
```

`npm run` を `yarn` に書き換えてください。

```
{
    // ...
    "scripts": {
        "dev": "yarn development",
        "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "yarn development -- --watch",
        "watch-poll": "yarn watch -- --watch-poll",
        "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --disable-host-check --config=node_modules/laravel-mix/setup/webpack.config.js",
        "prod": "yarn production",
        "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
    // ...
}
```

## webpack.mix.js を修正する

```js:webpack.mix.js
const mix = require('laravel-mix');

mix.js('resources/js/app.js', 'public/js')
    .browserSync({
        proxy: {
            target: 'http://app:9000',
        },
        files: [
            './resources/**/*',
            './public/**/*',
        ],
        open: false,
        reloadOnRestart: true,
    });
    .postCss('resources/css/app.css', 'public/css', [
        //
    ]);
```

## ビルド

```
$ make web
$ yarn install

# npm コマンドでインストールしようとするので、手動で追加しておきます。
$ yarn add -D vue-template-compiler browser-sync browser-sync-webpack-plugin

$ yarn hot
```

http://127.0.0.1

`resources` や `public` 配下のファイルが変更されたら自動的にブラウザリロードが行われます。
これでもokなんですが、コンテナ内でビルドさせるとめちゃくちゃ遅いです...

ローカルでNodeを使う場合の設定を書きます。

## ローカルのNodeを使う場合

```js:webpack.min.js
        proxy: {
            target: 'http://127.0.0.1', // 書き換え(webコンテナを指定している)
        },
```

Webpackのサーバーを起動します。

```
$ cd backend
$ yarn hot
```

http://127.0.0.1:3000

## 参考

https://browsersync.io/docs/options
【Golang】Go言語のmapについて解説

今日はGoのmapについて学習したのでこちらにアウトプットします！！

#mapとは？
rubyでいうと、ハッシュ（連想配列）に該当するものです。
キーと値がセットになっているものです。

#とりあえず色々書いてみる

```golang

package main

import "fmt"

func main() {
	m := map[string]int{"udon": 500, "ra-men": 800, "soba": 700}
	fmt.Println(m) // => map[ra-men:800 soba:700 udon:500]

	//値へのアクセス
	fmt.Println(m["ra-men"]) // => 800

	//値の更新
	m["udon"] = 450
	fmt.Println(m) // => map[ra-men:800 soba:700 udon:450]
	//値の追加
	m["new"] = 1000
	fmt.Println(m) // => map[new:1000 ra-men:800 soba:700 udon:450]

	//値が入っているか確かめることができる
	v, ok := m["soba"]
	fmt.Println(v, ok) // => 700 true

	v2, ok2 := m["so-men"]
	fmt.Println(v2, ok2) // => 0 false

	//メモリ上に空のマップを作ってから代入することもできる
	m2 := make(map[string]int)
	m2["tya-han"] = 400
	fmt.Println(m2) // => map[tya-han:400]

	//こちらは宣言はしているがメモリ上に入れるマップがないのでエラーになる
	var m3 map[string]int
	m3["tya-han"] = 400
	fmt.Println(m3) // => ERROR

	//↑のようにvarで宣言した場合はmapのときはnilが入っている（スライスも同様）
	var m3 map[string]int
	if m3 == nil {
		fmt.Println("Nil!") // => Nil!
	}
        //スライスの場合もnil
	var s []int
	if s == nil {
		fmt.Println("Nil!") // => Nil!
	}
}
```
##参考文献
こちらも併せて読んでいただけるとより理解が深まると思います！
[Go言語: いろいろなマップの作り方まとめ](https://qiita.com/suin/items/7225ab9f2aeb6f55c606)
[逆引きGolang (マップ)](https://ashitani.jp/golangtips/tips_map.html#map_Map)
特定のメールが届いたらSlackにリマインドしてもらう

「いろんなメールが届いてるけど、肝心なメールだけは見逃したくないので、Slackに「届いてるよ」って教えて欲しい！　という人用の手順です。
下記はGmailを使っていることを前提とした説明になっていますが、特定のメールを転送する機能があるシステムなら、同じように実現できます。


## 手順1　Slackで自分用メールアドレスを取得する

この操作は、デスクトップアプリまたはウェブブラウザから行います。スマホアプリでは実施できません。

1. Slack画面左上のチーム名のところ（スマホアプリではチャンネルリストを右にフリックした画面）から、自分の「環境設定 (Preferences)」 を開く
2. 左メニューの「メッセージ＆メディア (Messages & media)」を選ぶ
3. 一番下までスクロールして「Slack へのメールの転送 (Bring emails into Slack)」欄の「転送先メールアドレスを取得する (Get a Forwarding Address)」ボタンでメールアドレスを取得する


## 手順2　Gmail に転送先アドレスを登録する

1. Gmail の歯車メニューから、一番上の「すべての設定を表示」を選ぶ
2. 「メール転送と POP/IMAP」タブを開く
3. 「転送」欄の「転送先アドレスを追加」をクリック
4. Slackで取得したメールアドレスを入力して「次へ」をクリック
5. 実施確認画面が開くので「続行」をクリック
6. 確認コードが転送先のSlackに届き、Slackbotからメール来たぞと言われる
7. Gmail 設定画面の「***@*** を確認」欄にSlackに届いた確認コードを入力して「確認」をクリック
8. 転送欄の設定は「転送を無効にする」のままにしておく


## 手順3　Gmail で転送フィルタを設定する

1. Gmailで転送したいメールがすべてヒットするように検索する
> 　検索の例：
　　特定のキーワードを含む　（普通に検索）
　　宛先で検索　to:dareka@example.jp
　　発信元で検索　from:aitsu@example.jp
　などなど

2. 正しくヒットしていたら、検索枠右端の三角で詳細を開き「フィルタを作成」をクリック
3. 「次のアドレスに転送」にチェックしてSlackのアドレスを選択
4. 「フィルタを作成」ボタンをクリック


## 手順4　メールが Slack に届く

1. 条件に該当するメールが届いたら、slackに転送されてSlackbotが教えてくれるようになったら完成！


## 手順5　転送フィルタの変更・削除

転送するメールの条件を変えたり、転送をヤメたい場合は、下記で対応できます。

1. Gmail の歯車メニューから、一番上の「すべての設定を表示」を選ぶ
2. 「フィルタとブロック中のアドレス」から対象フィルタ欄の「編集」や「削除」をクリックしてあれこれする
VSCodeでリモート接続してDockerコンテナ上で作業するときのワークスペース設定箇所

VSCodeからDockerコンテナにリモート接続して作業する際、毎回 `/`にマウントされてしまっていて困っていた。
`.devcontainer`ディレクトリの`devcontainer.json`を見たら`workspaceFolder`という箇所があった

``` .devcontainer/devcontainer.json
// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.134.1/containers/docker-existing-docker-compose
// If you want to run as a non-root user in the container, see .devcontainer/docker-compose.yml.
{
	"name": "Existing Docker Compose (Extend)",

	// Update the 'dockerComposeFile' list if you have more compose files or use different names.
	// The .devcontainer/docker-compose.yml file contains any overrides you need/want to make.
	"dockerComposeFile": [
		"../docker-compose.yml",
	],

	// The 'service' property is the name of the service for the container that VS Code should
	// use. Update this value and .devcontainer/docker-compose.yml to the real service name.
	"service": "go_app",

	// The optional 'workspaceFolder' property is the path VS Code should open by default when
	// connected. This is typically a file mount in .devcontainer/docker-compose.yml
    // ここ
	"workspaceFolder": "/go/src/work",

	// Set *default* container specific settings.json values on container create.
	"settings": {
		"terminal.integrated.shell.linux": null
	},

	// Add the IDs of extensions you want installed when the container is created.
	"extensions": []

	// Use 'forwardPorts' to make a list of ports inside the container available locally.
	// "forwardPorts": [],

	// Uncomment the next line if you want start specific services in your Docker Compose config.
	// "runServices": [],

	// Uncomment the next line if you want to keep your containers running after VS Code shuts down.
	// "shutdownAction": "none",

	// Uncomment the next line to run commands after the container is created - for example installing curl.
	// "postCreateCommand": "apt-get update && apt-get install -y curl",

	// Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root.
	// "remoteUser": "vscode"
}

```

設定ファイル見るのと英語読むの大事
UnityのプロジェクトがXcode上でMultiple commands produce...を起こす

#はじめに
Unityのコンパイルに成功したのに、
XcodeでMultiple commands produceを起こしました。
![スクリーンショット 2020-09-18 22.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727519/f26a3d34-59da-e539-f84b-d4a82f6a981b.png)
_うわあ〜_

stack overflowでも見つからず、バグの解決に何時間もかかったので記録しておきます。
環境は以下になります。
Xcode 11.7
Unity 2019.4.10f1

#原因
Product Nameに日本語が入ってると発生するようです。
そりゃstack overflowでは見つかりませんね。。。

![スクリーンショット 2020-09-18 22.34.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727519/ea463c84-5e83-ecd8-6844-990d5013d462.png)
![スクリーンショット 2020-09-18 22.30.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727519/9e320441-9194-5708-b8a6-d7966d927b6e.png)
Laravel7ペジネーションのカスタマイズ（linksメソッドでのテンプレートの指定の仕方）

DBのレコードをページに表示していって、好きなところで次のページ、前のページを生成できるペジネーション。
Laravelだと設置は簡単なものの、カスタマイズに少し戸惑ったのでメモ。（Laravel7です。）

Laravelの某教科書では、linksメソッドのパラメータにテンプレート名を指定すればできますと書いていますが、その指定の仕方が書いてなくて、試行錯誤しました。

Laravelのデフォルトのテンプレートはこのコマンドでインストールできます↓

```terminal
$ php artisan vendor:publish --tag=laravel-pagination
```
`resources/views/vendor/pagination/`のディレクトリにテンプレートがインストールできました。

これらを適用するには、viewsのファイル内に埋め込んだlinksメソッドにこのように書けばOKです↓

```php:index.blade.php
{{ $items->links('vendor.pagination.bootstrap-4')}}
```

ポイントは文字列を示す`''`を使用すること、vendor.paginationとディレクトリを指定すること、blade.phpなどは省くことかと思います。

こうしてまとめると、基礎的なことばかりなのですが、私みたいな初心者は意外にこういうところでも躓くと思うので、他の方の参考になれば幸いです。
[Python] Pipelineって何だよ...

※このページは，Pipelineをなんとなく理解したい人を対象としています．

こんにちは．

突然ですが，自分は機械学習や深層学習に興味があったので，最近kaggleのコンペに参加してみたんです．
kaggleにはNotebook機能があるのでそのコードを理解しよう!と意気込んでいたのですが...

「何これ，全く意味わからん」

全くプログラミングの知識がない状態なので，kaggleのNotebookのコードを見ても，暗号にしか見えませんでした(笑).
そこで，一つずつゆっくり理解していこうと思ったのでここに日記感覚で記載していきたいと思います．


今回は，「Pipeline」についてです．


※今回本記事に載せるデータはirisデータです

```
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

iris_data = datasets.load_iris()
input_data = iris_data.data
correct = iris_data.target
```

とりあえず下記のサイトにアクセスしました．
[sklearn.pipeline.Pipeline — scikit-learn 0.23.2 documentation](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html)


これによると，基本の形は

from sklearn.pipeline import Pipeline
pipe = Pipeline([(前処理方法), (学習方法)])
pipe.fit(説明変数, 目的変数)

のようで，どうやらコードを簡潔化出来るみたいなんです．

これを基にirisデータをランダムフォレストで学習させてみました．

```
from sklearn.ensemble import RandomForestClassifier as RFC 

X_train, X_test, y_train, y_test = train_test_split(input_data, correct)
pipe = Pipeline([('scaler', StandardScaler()), 
                 ('RandomForestClassifier', RFC())])
pipe.fit(X_train, y_train)
pipe.score(X_test, y_test)

# 0.9473684210526315
```

上記により，説明変数を標準化してランダムフォレストで学習を行っていることになりました．
このように，Pipelineにまとめることで，コードが「簡潔」になります．

以下，確認のために記載したコードです．

```
X_train, X_test, y_train, y_test = train_test_split(input_data, correct)
tr_x, te_x, tr_y, te_y = X_train.copy(), X_test.copy(), y_train.copy(), y_test.copy() # 検算用にコピー

pipe = Pipeline([('scaler', StandardScaler()), 
                 ('Classifier', RFC())])
pipe.fit(X_train, y_train)
print("pipe score = " + str(pipe.score(X_test, y_test)))


from sklearn.preprocessing import StandardScaler

stdsc = StandardScaler()
tr_x = stdsc.fit(tr_x).transform(tr_x)
te_x = stdsc.fit(te_x).transform(te_x)

clf = RFC()
clf.fit(tr_x, tr_y)
print("RFC score = ", clf.score(te_x, te_y))

# pipe score = 0.9473684210526315
# RFC score =  0.9473684210526315
```

検算でも一致できたので，Pipelineの前処理が正しく動いてくれたことが分かりました．

なるほど，なんとなくPipelineについて分かりました．
でも，前処理っていっても何個もあるのに，一つだけしか実行できないの？

どうやら複数の処理をまとめることが出来るようです．

```
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier as RFC 
from sklearn.preprocessing import OneHotEncoder
from sklearn.impute import SimpleImputer

preprocessing = Pipeline([
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),  # 欠損値除去の処理
    ('onehot', OneHotEncoder(handle_unknown='ignore'))])                    # ワンホットエンコーディング


rf = Pipeline([
    ('preprocess', preprocessing),
    ('classifier', RFC())])

rf.fit(X_train, y_train)
```

このように，
基本形である　pipe = Pipeline([(前処理方法), (学習方法)])
の(前処理方法)には，イメージとしてはBNF記法(あくまでもイメージの話です)のようにPipelineを重ね掛けして行うことが一つの方法として挙げられるようです．
Swiftで複数の戻り値をreturnする。

#戻り値を宣言する
メソッド宣言時の戻り値部で**メソッド名()->(Data型1,Data型2,Data型3...)**の様に記述をすると
複数のデータを1つのメソッドで返すことができる。

```swift

//日付取得メソッド
func getDate() -> (String, String, String, String){
    //操作日取得(yyyy-MM-dd)
    let date = Date()
    let formatter = DateFormatter()
    formatter.setLocalizedDateFormatFromTemplate("yMd")
    //日付計算
    let dayFromToday =  Calendar.current.date(byAdding: .day, value: -7, to: date)!
    let weekFromToday =  Calendar.current.date(byAdding: .weekday, value: -7, to: date)!
    let monthFromToday =  Calendar.current.date(byAdding: .month, value: -7, to: date)!

    let today = formatter.string(from: date);
    let DayFromToday = formatter.string(from: dayFromToday);
    let WeekFromToday = formatter.string(from: weekFromToday);
    let MonthFromToday = formatter.string(from: monthFromToday);
    
    return (today,DayFromToday,WeekFromToday,MonthFromToday)
}

//日付呼び出しメソッド
func viewDatePeriod(today:String,DayFromToday:String,WeekFromToday:String,MonthFromToday:String) {
    //処理〜〜〜
}
```

また、呼び出す際には以下のように取得したデータを割り振る必要がある。

```swift

var date = getDate()
viewDatePeriod(today: date.0,DayFromToday: date.1,WeekFromToday: date.2,MonthFromToday: date.3)
```

#データに名前をつける
上記では、data.0など分かりづらいので以下の様にして宣言をすると呼び出し時に迷うことなくコーディングすることができる。

```swift
//データ選択時の呼び出しメソッド
func viewDatePeriod(today:String,DayFromToday:String,WeekFromToday:String,MonthFromToday:String) {

//日付呼び出しメソッド
viewDatePeriod(today: date.today,DayFromToday: date.DayFromToday,WeekFromToday: date.WeekFromToday,MonthFromToday: date.MonthFromToday)
```
MegaRAIDでエンクロージャの電源だけ落ちたときの対応

重要なデータの場合は、バックアップしてから行ってください。

電源障害時に、MegaRAIDでホストアダプタは生き続けて、エンクロージャが落ちてしまった場合の対処方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542661/f5b3de49-f149-a838-fd9a-36a8af7199b7.png)

エンクロージャのHDDがOFFLINEになった状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542661/2ade735e-992d-a6cf-6aa0-14f17dbcb4e0.png)

VDごと消えます。
かなり焦る状況ですが、HDDに変な状態にならず単に落ちただけなので、あまり問題ではありません。
（当然、キャッシュ上のデータなどは維持できません（CacheVaultを使った場合にどの程度カバーできるかは知りません））

ひとまず、電源を入れます。

しばらくすると、Unconfigured Driveとして認識します。
全ドライブが認識されたのを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542661/69d2481c-36ce-529b-b2e9-4874f6c79f01.png)


それぞれのドライブで、
Unconfigured Bad を (FORIN) Unconfigured Goodにする。（この作業は必須かどうか分かりません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542661/c2af6213-daf9-8320-7679-bb790bfdf44f.png)

Scan Foreign Configurationを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542661/de9c06ea-68de-64c4-9abb-59a036214380.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542661/80177554-0702-0127-f944-750916de65ed.png)

Acceptで受け入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542661/f7bce1c6-9a86-0e9e-f829-167525eae905.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542661/6fe69b54-6764-3d6d-f06a-6973d9dc4999.png)

以上。
python anywhere で作ったWebアプリケーション（Django）に『Hello World!』を表示させてみた！

いよいよpython anywhere で作成した、Webアプリケーションに

**『Hello World!』** を表示させてみましょう！

前回作成した、**ディレクトリ構造**から確認します！

👇👇👇👇**ディレクトリ構造**

mysite/
　｜
　｜－manage.py
　｜－mysite/
　　　　｜
　　　　｜－init.py　（←変更なし）
　　　　｜－settings.py　（←変更なし）
　　　　｜－urls.py　（←変更を加えます）
　　　　｜－views.py　（←新しいファイルを作成、ファイル名views.pyにしてください）
　　　　｜－wsgi.py　（←変更なし）

👆👆👆👆

次のステップに進みます。

１、urls.py はクライアントからのリクエストを受け取る場所です!
    

```ruby:mysite/mysite/urls.py
     from django.contrib import admin
     form django.urls import path
     from .views import hellofunction     ←追加コード

     urlpatterns = [
        path('admin/', admin.site.urls),
        path('hello/', hellofunction),      ←追加コード 
```


2, views,py は見た目の部分を司るところです。（下記のコードを完成させましょう）

```ruby:mysite/mysite/views,py
    from django.http import HttpResponse

    def hellofunction(request):
        return HttpResponse('<h1>Hello World!<h1>')
 
```

すべて、書き終えたらDashbordからReloadをして、

Configuration forの下のURLをクリックし、

次のアドレスを直接ブラウザのアドレスバーに入力してください！　/hello/ を追記します。
　https://アカウント名.pythonanywhere.com/hello/

![2020-09-20 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/57696561-2d96-729c-83a4-26a9814231ab.png)

これで、成功です🎉🎉🎉🎉🎉

MVCモデルのうち、今日はV(view)とC(controller)の部分を扱いました。

次回は、M(model)を説明したいと思います！
テスト駆動開発の概要を知る


Kent Beck による著書「テスト駆動開発」より、TDD の概要をまとめた。
業務でTDDを行っている者として、基本に忠実にプロジェクトを進めることの難しさをよく感じるので、よい機会になった。

## TDD は何を可能にするか？

TDD のゴールは、「動作する綺麗なコード」を生み出すことである。

一般的なソフトウェア開発では、「きれいな」コードを目指す前に、「動作する」事の前に多くの制約が立ちふさがる。
この問題のアプローチとして、考え込む前に、自動化されたテストによって開発を推し進める。このような開発が**テスト駆動開発(Test-Driven Development: TDD)**と呼ばれる。

## TDD のルール

TDD は、以下のシンプルな二つルールのみである。

- 自動化されたテストが失敗したときのみ、新しいコードを書く

- 重複を除去する。

これらのルールに従って開発を行うと、開発者が自分たちでテストを書くようになる。
また、凝縮度が高く結合度が低い、たくさんの部品で構築された設計を行うようになる(テストが書きやすいコードになっている)。

## TDD のリズム

TDD は、**レッド・グリーン・リファクタリング**のリズムで行われる。

- 1.レッド
  **動作しない、コンパイルも通らないテストを書く。**
  頭の中で考えている挙動が、どのようなコードとなるかをテストが失敗するようにするためには、実行可能なテストとテストが動くための仮実装があるということであり、何もできていないというわけではない。

- 2.グリーン
  **そのテストを動作するコードを書く。**
  前のテストが通るようなコードを実装していく。ここでの目標は完璧できれいな解を出すことではなく、テストを通すことだ。要するに、汚いコードを気にする必要はなく、最短でグリーンなテスト結果を見ることを目指す。

- 3.リファクタリング
  **テストを通すために発生した重複を全て除去する。**
  テストに依存しないようにプロダクトコードを正しくする。変更を加えるたびにテストがグリーンとなることを確認する。もはや不要なテストは消してしまう。

## TDD における実装

TDD における実装では、仮実装と、明確な実装、三角測量という 3 つの手法がある。

### 明確な実装
**すぐに頭の中の実装をコードに落とす。**
すべてが上手く行っており、書くべきコードを把握している場合、明確な実装->明確な実装…と連続していく。

### 仮実装
**コードでまずベタ書きの値を使い、実装を進めつつ、徐々に変数に置き換える。**
明確な実装を続けている中で、予期しないレッドバーを目にした場合、仮実装に切り替える。

### 三角測量
**よりコードが一般化できるよう、新たにテストケースを追加する。**
実装方法が明らかでない場合や、テストが要件をしっかりテスト出来ているかわからない場合、よりコードが一般化できるようにテストケースを増やし、グリーンにする。

## テストコードが持つ意義

テスト駆動開発は、プログラミング中の「不安」をコントロールする。漠然とした不安ではなく、問題の困難さに由来する、「見通しのつかなさ」である。

一般的なプログラミングでは、プロダクトが大きくなればなるほど、この「不安」を抱え続けることになる。一方 TDD におけるテストは、コードが動作することを保証し、「不安」を軽減してくれる。一つのテストコードがグリーンになることは、全てが動作する状態に向けて一歩前進していることがわかる。

## TDD におけるリファクタリング

一般的なリファクタリングでは、プログラムの意味を変更することは推奨されない。

しかし、TDD におけるリファクタリングでは、気にすべきはすでに通っているテスト、という事になる。たった一行の変更でも、TDD においてはリファクタリングと言える。なぜなら、**通っているテストが変わらず通っている**からだ。
ただし、このような状態になるには、**十分なテストを書いて**、「観測上の等価性」を担保する必要がある。

## 途中で切り上げるには？

- 一人でプログラミングしている場合、**最後に書いていたテストを失敗する状態にして終える**。

こうしておくことで、次にコーディングに戻ってきた時に、どこから始めるべきかは明白だ。テストは中断前に考えていた事を思い出すための確かな手がかりとなる。失敗させたままにしているテストは、プログラムの現状を明らかにしているので、心を痛めるようなことではない。

- チームでプログラミングしている場合、**テストを全て通る状態にして終える**。

チームで開発している場合、最後に見た時からどのようにコードが変わっているか、わからないという状況が起きやすい。この場合、自信と確信がある場所から仕事を始める必要がある。そのためにも、コードをチェックインする前には、全てのテストが通ることを常に確認すべきである。

チームのルールとして、チェックイン前にテストが通らない場合、「手元の変更を捨ててしまい、初めからやり直し」するルールを設けておくと良い。このルールでは、チーム内では「早くチェックインしたい」という空気が生まれ、頻繁にコードがチェックインされ、テストが実行される事になる。
Androidアプリに広告を貼る方法　

https://akira-watson.com/android/admob-google-play-service.html

https://developers.google.com/admob/android/quick-start?hl=ja#kotlin

https://developers.google.com/admob/android/banner?hl=ja

#ソースコード設定

下記適切なバージョンを使用
https://developers.google.com/admob/android/quick-start?hl=ja

```build.gradle
dependencies {
    implementation 'com.google.android.gms:play-services-ads:19.3.0'
}
```

ネットワーク権限などを設定

```AndroidManifest.xml
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-3940256099942544~3347511713"/>
```
レイアウト記入

```activity_main.xml
    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        ads:adSize="BANNER"
        ads:adUnitId="ca-app-pub-3940256099942544/6300978111">
    </com.google.android.gms.ads.AdView>
```

Activityに記入

```kotlin:MainActivity
override fun onCreate(savedInstanceState: Bundle?) {
        // Test App ID
        MobileAds.initialize(activity, "ca-app-pub-3940256099942544~3347511713")

        val adRequest: AdRequest = AdRequest.Builder().build()
        adView.loadAd(adRequest)

        // ad's lifecycle: loading, opening, closing, and so on
        adView.adListener = object:AdListener(){
            override fun onAdLoaded() {
                Log.d("debug","Code to be executed when an ad finishes loading.");
            }

            override fun onAdFailedToLoad(errorCode : Int) {
                Log.d("debug","Code to be executed when an ad request fails.");
            }

            override fun onAdOpened() {
                Log.d("debug","Code to be executed when an ad opens an overlay that covers the screen.");
            }

            override fun onAdLeftApplication() {
                Log.d("debug","Code to be executed when the user has left the app.");
            }

            override fun onAdClosed() {
                Log.d("debug","Code to be executed when when the user is about to return to the app after tapping on an ad.");
            }
        }
}
```
[seasar2]データソース切替


#seasar2で、同じ種類のデータソースを動的に切り替える際に実施した内容（自分用メモ）

下記参考サイトに記載の内容（1～3）のみでは、自分の環境でうまく動作しなかったので4,5を実施した。

1. 各データソース用のdiconファイル作成
2. jdbc.diconへ各データソース用のdiconファイルをincludeする
3. データソース切替用インターセプタを作成する
4. app.diconに3のインターセプタの追加設定をする
5. customer.diconに3のインターセプタの設定追加する

##参考サイト：
http://s2container.seasar.org/2.4/ja/jdbc.html#DataSourceDynamicSwiching
【インフラ】OSとは？サーバーとは？

今更聞けないが、よく耳にするIT用語をまとめてみた。

#OS

| 対象OS | 種類| 製品 | 用途
|:-:|:-:|:-:|:-:
| クライアントOS  | Windows 10  | dynabook  |
|   |  macOS Catalina |  mac book |
|  サーバOS |  windows系 |  Windows Server Standard Edition | 社内ファイルサーバ(Windows利用)|
|   |  unix系 | linux / Solaris | Webサーバ
|   |  linux系 |  Red Hat Enterprise / Ubuntu / Cent OS| Webサーバ

<details><summary>OSとは</summary>ソフトウェアとハードウェアの仲立ちしてくれるシステム(Operating System)</details>

<details><summary>UnixとLinuxについて</summary>Unixの機能や見た目を模倣して作り上げたものが、Linuxである。ただ、根本の作り方や構造が別物であるため、2人の関係性は強いていうなら*親子*というより、血の繋がっていない*親戚*のようなイメージに近い</details>


#ミドルウェア

<details><summary>サーバとは</summary>あるサービスを提供することに特化した、OSをインストールしたコンピュータ</details>

今回は、Webサービス、データベースサービスを提供するサーバーを紹介する。





| Webサーバー | 用途 |
|:-:|:-:|
| Apache  | 負荷が低く、早期のセットアップが必要なとき / 同時アクセス数が小さく、リクエスト数が多いとき  |
| Nginx  | 負荷が高く、スケーラビリティが要求されるとき / 静的ページに同時アクセス数が大きいとき |


| DBサーバー | 派生DB | ストレージアーキテクチャ
|:-:|:-:|:-:|
| Oracle  |   |更新型
| MySQL  | MariaDB / Amazon Aurora  |更新型
| PostgreSQL |  EDB postgres / Amazon Redshift |追記型


###ストレージアーキテクチャについて

<details><summary>更新型</summary>対象レコードをそのまま更新</details>
<details><summary>追記型</summary>既存レコードを残したまま、新規レコードとして追加し、参照元を更新</details>

#参考記事

> https://qiita.com/kamihork/items/deeaf449254e3845311d
> https://qiita.com/kamihork/items/49e2a363da7d840a4149
エクセルで指定した1ヶ月間の日数を一覧で表示させたいとき

動的に一ヶ月間の日付を表示させたいとき、
スプレッドシートならいくらでも方法は思いついたのですが、
エクセルだと色々調べても出てこなかったので、
Qiitaに書こうかと

```
=DATE(yyyy,mm,SEQUENCE(TEXT(EOMONTH(mm,0),"d")))
```

内容としては
EOMONTH関数で最終日を取得して、
SEQUENCE関数を使って連続で表示

そんな感じ。

これ使えばカレンダーとかシフト作りがやりやすくなると思われ。
[Swift] protocol制約をかけた型で"Cannot use mutating member on immutable value"と言うエラーが出る場合の対処

swift5で次のコードを実行すると
> Cannot use mutating member on immutable value: 'hoge' is a 'let' constant

と言うエラーが出ます。これにしばらくハマってしまったので解決方法を書いておきます。

```swift
protocol Hoge{
    var items:[String]{get set}
}

class Fuga:Hoge{
    var items: [String]
    init(_ items: [String]){
        self.items = items
    }
}

class Piyo:Hoge{
    var items: [String]
    init(_ items: [String]){
        self.items = items
    }
}

var hoges:[Hoge] = [Fuga(["a"]), Piyo(["a"]), Fuga(["a"])]
hoges.forEach{ (hoge: Hoge) in
    hoge.items.append("b")          //エラー：Cannot use mutating member on immutable value: 'hoge' is a 'let' constant
}

print(hoges.map{$0.items})
```

`items`は`{get set}`で宣言しており、問題はないように見えますが、エラーでは`hoge`が定数だと言っています。`forEach`内で変更しているのが問題なわけでもなく、実際次のコードはすんなり動きます。

```swift
var hoges:[Fuga] = [Fuga(["a"]), Fuga(["a"]), Fuga(["a"])]
hoges.forEach{ (hoge: Fuga) in
    hoge.items.append("b")
}
```
このエラーの原因は`protocol`に準拠した型が`class`か`struct`か分からないことです。`struct`は基本的に不変なので、もしも`Hoge`に準拠した型が`struct`だった場合変更ができなくなってしまいます。

ということで、対応には`protocol`に`class`の制約をかけてあげることです。

```swift
protocol Hoge:class{           //ここが大事！！！！
    var items:[String]{get set}
}

class Fuga:Hoge{
    var items: [String]
    init(_ items: [String]){
        self.items = items
    }
}

class Piyo:Hoge{
    var items: [String]
    init(_ items: [String]){
        self.items = items
    }
}

var hoges:[Hoge] = [Fuga(["a"]), Piyo(["a"]), Fuga(["a"])]
hoges.forEach{ (hoge: Hoge) in
    hoge.items.append("b")
}

print(hoges.map{$0.items})
```
以上です。
MySQLの集合内包使ってたらすごく遅くなったので、リストに分割したらなんか動いた

# MySQLの集合内包使ってたらすごく遅くなったので、集合を分割して何回かにわけてSQL文飛ばしたらなんか動いた
なぜ動いたのかはよくわからない...
けど、メモリに乗る個数とかに上限があるのかな...知らんけど...
(ただし一回の集合内包をチェックする数減らしすぎるとそれそれで悪くなるっぽい...)
Auth0 概要

Auth0の概要記事。Auth0を構成する概念と連携例をまとめる。

## Auth0とは

* Web・ネイティブアプリやAPIなどに対し、認証・認可ソリューションをクラウドで提供するIDaaS (Identity as a Service)。

  

## Auth0の概念
### Tenant(テナント)

* Auth0のAssets(Application、Connection、User)を定義・管理、保管する論理分割単位。

* Auth0を利用開始時に、アカウントと併せて作成。

  

### Account(アカウント)

* テナントを管理する主体。

* テナントと同時に作成。

* 作成方法

  * Email/Password登録
  * GitHubアカウント
  * Googleアカウント
  * Microsoftアカウント

* アカウント:テナント = N:N

  * 1アカウントで複数のテナントを管理可能。

  * 1テナントに複数のアカウントを紐づけることも可能。

    

### Application(アプリケーション)

* テナントに対してログインを要求できるクライアント。

* 以下に対応。
  * Native/Mobile Application
  * Single Page Web Application
  * Regular Web Application
  * Machine to Machine Application

* テナント:アプリケーション = 1:N

  * 例：サービスをiOSアプリ、Androidアプリ、Webアプリで提供する ⇒ 3アプリケーション用意。

  

### Connection(コネクション)

* ログイン手段

  * メールアドレス/パスワード、Twitterアカウント、Googleアカウント、...

* テナント:コネクション = 1:N
* | コネクション             | 説明         |
  | ------------------------ | ------------------------------------------------------------ |
  | **Database Connection**  | Auth0もしくは自社DBで認証情報を管理<br />例：メールアドレス/パスワード |
  | **Social Login**         | ソーシャルアカウントを利用<br />例：Google、Twitter、...     |
  | **Enterprise Directory** | エンタープライズ向け製品を利用<br />例：LDAP、Office365、G Suite、SAMLなど |
  | **Passwordless System**  | ワンタイムキーを利用<br />例：電話番号またはメールアドレス   |



### User(ユーザー ）

* アプリケーションにログイン可能なユーザー。

* コネクション配下に作成される。
  * コネクション別に異なるユーザーとして扱う
    * 同一ユーザーがTwitterでログインしたあと、別途Googleログインした場合、TwitterログインユーザーとGoogleログインユーザーは別ユーザーとして扱う。

### 概念全体構成
![Auth0_concept.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/f35e2d9e-a5f3-78f3-623c-46bd04258e1b.png)


## Auth0連携例

1. Single Sign-On for Regular Web Apps
   ![Auth0_SSO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/afe5e2af-73fb-6243-52f1-e4b7d4993f61.png)
2. Server Application + API
   ![Auth0_Server+API.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/9eb52641-a7c1-c46e-661e-6150e479a821.png)
3. SPA+API(Implicit Flow)
   ![Auth0_ImplicitFlow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/684cd92b-9071-496e-9747-9e360b987957.png)

## 参考情報

* [Create a Tenant and Learn the Basics](https://auth0.com/docs/get-started/learn-the-basics)
* [Auth0の基本構成を図で理解する](https://dev.classmethod.jp/articles/auth0-architecture/)
* [Architecture Scenarios](https://auth0.com/docs/architecture-scenarios)
Postfixの設定変更(gmailのスパム判定のキュー削除、漏洩メールアドレスのDiscard）

Gmailに全転送しているのですが、妙に転送が遅い問題があります。
２日くらいかかるメールがあります。

postqueue -p で見てみると、大量のgmailのスパム判定メールが溜まっています。
これが原因かは分かりませんが、問題であることは間違いないので片付けます。

https://qiita.com/aske315/items/daddf2e71f1494bb6e0d
こちらを参考にしました。

もともと転送用でバウンスする必要もないので問答無用でDeleteします。

```/etc/cron.daily/cleangmail421
#!/bin/sh

postqueue -p \
 | sed -n  \
  -e '/^[0-9A-Z]*  */N' \
  -e 's/\n/ /g' \
  -e '/(host [^ ]* said: 421[- ]4\.7\.0 /N' \
  -e 's/\n  *\(.*gmail\.com\)/ \1/p' \
 |while read -r qid size wday month mday time sender recipient; do
  postsuper -d "$qid"
done
```

あと、漏洩しているメールアドレスをheader_checksでDISCARDします。
最終行に追加します。

```/etc/postfix/header_checks
/^To:.*xxxxxxx@xxxxx\.xxx/ DISCARD
```

使うメールアドレスは１サイト毎にdelimiter以下で使い分けているので、漏れるとすぐ分かります。
iPhoneでExpo Clientのインストールとセットアップ

# まえおき

React Nativeの開発支援サービスExpoの検証用クライアントアプリケーションのiPhoneでのインストールとセットアップ方法を記載しています。

# EXPOアカウントの登録手順

別の記事に手順を掲載しています。
[Expoアカウントの作成方法](https://qiita.com/hidenoritoki/items/0c5084b84dfc2126d9ec)

# 手順

1. AppStoreで「expo client」を検索し、ダウンロードします

    ![スクリーンショット 2020-09-20 20.54.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249974/4be01840-57a8-33df-9f0a-abd9450746c9.png)

2. ダウンロードが完了したら[開く]をタップします

    ![スクリーンショット 2020-09-20 21.00.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249974/1b4bdba7-f595-0d30-d959-7ea71671baaa.png)

3. アプリが起動したら[Sign in to your account]をタップします。

    ![スクリーンショット 2020-09-20 21.01.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249974/6654a2f3-f3cd-6cc9-8a02-68cd836c6e38.png)

4. ユーザ名（またはメールアドレス）とパスワードを入力して[Sign In]をタップします

    ![スクリーンショット 2020-09-20 21.02.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249974/3be15f69-c0ce-bf82-b68f-3fbce32ff19e.png)

5. プロフィール画面が表示されたらセットアップ完了です。

    ![スクリーンショット 2020-09-20 21.07.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249974/e1b9e3e7-442b-b61c-98d4-4c120f7726be.png)
Python 優先度付きキュー  殆どの人が興味無さそうなheapify関数の結果の謎

#はじめに
Pythonで優先度付きキューの挙動で謎な部分があり調べてみた。

#不可解な挙動
<a href="https://qiita.com/ell/items/fe52a9eb9499b7060ed6">こちら</a>を参考に、Pythonで優先度付きキューが調べていたところ、heapqライブラリで実現が可能とのこと。
上記リンク先にでは、heapqの使用例として以下の通り記載されていた。

```Python
#引用元：https://qiita.com/ell/items/fe52a9eb9499b7060ed6
import heapq  # heapqライブラリのimport

a = [1, 6, 8, 0, -1]
heapq.heapify(a)  # リストを優先度付きキューへ
print(a)
# 出力: [-1, 0, 8, 1, 6] (優先度付きキューとなった a)
```

なぜ出力がこの並び（[-1, 0, 8, 1, 6] ）なのか？
誰も興味無さそうな疑問が湧いてきた（昇順を期待してたので）。

#理由：リストの要素をヒープキューアルゴリズムでソートしているため

Pythonでは、優先度付きキューをリストで表現している様であるが、
<a href="https://docs.python.org/ja/3/library/heapq.html">python document</a>によると、ヒープキューアルゴリズムでリストの内容を並べ替えしているとのこと。

<a href="https://medium.com/@yasufumy/data-structure-heap-ecfd0989e5be">こちら</a>のヒープの説明サイトにて、ヒープのアルゴリズムの説明が詳しく記載されているが、
木構造をリストで表現できるとのこと（親ノードのリストインデックスをiとすると、子の左ノードが2*i、右ノードが2*i+1)。
親子関係が成立する様に、リスト内の要素を入れ替えすると、上記の出力が得られた。

#ヒープキューアルゴリズムによるソートの流れ
※詳しいアルゴリズムは<a href="https://medium.com/@yasufumy/data-structure-heap-ecfd0989e5be">こちら</a>を参照

ヒープの条件：各ノードがその子ノードより小さいか等しい
初期配列：[1, 6, 8, 0, -1]

![heapq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694198/6e0404d7-ca81-ee71-0ab9-ce8e31f5b254.png)
ソフトウェアの不具合を減らすためにできる3つのこと

# よくある会話
「障害が起きました。すぐに調査してください。」
「わかりました。調査します。」
〜調査後〜
「この不具合が原因で障害が発生していました。申し訳ありません。」
「この障害で損失は発生しました。損害賠償請求させていただきます。」
「申し訳ありません。。。。」

エンジニアの恐怖の権化、「**不具合**」
上記の会話は誇張してますが、似たような恐怖に震えているエンジニアも少なくないでしょう。（えっ？誇張じゃない？）
そんな恐怖を減らすためにソフトウェアの不具合を出来る限り減らさなければいけません。
今回はそんなソフトウェアの不具合を減らすためにできる3つのことを挙げてみます。

## ソフトウェアの不具合を減らすためにできる3つのこと
細かい手法はたくさんあると思いますが、大きく分けると三つになります。

- レビュー
- スクリプトテスト
- テストコード

### レビュー
レビューは基本中の基本ですね。様々な成果物をチェックし、問題点や妥当性の確認を行います。
よくあるレビューの対象は

- 仕様書、設計書
- ソースコード
- テストケース

などなど。プロジェクトによって形は変わると思いますが、概ねここに集約されると思います。
それぞれレビューをするには知識や経験が必要になってきます。仕様書や設計書は何が正しいものなのか自分で持ってないといけないですし、ソースコードは技術的な知識も必要になってきます。テストケースは仕様書や設計書の理解を元に、様々な場面の観点を考える想定力が必要です。最近だとソースコードのレビューも自動化することができます。

### スクリプトテストをする
スクリプトテストとは実際にプロダクトを動かして、動作を確認する原始的な方法です。設計書や仕様書を元に準備したテストケース（もちろんレビューしたもの）を実施し、期待通りの動作するかを確認していきます。細かな動作を確認する機能テストや運用やユースケースを想定したシナリオテストといったように様々視点でスクリプトテストする必要があります。

### テストコードをかく
スクリプトテストでは手を動かしてテストを行いますが、それだと時間もかかり、確実性が低く、何より面倒です。
そこでテストコードを書くことで一部のテストを自動化していくことでみんな幸せになります。継続的にソースコードを管理する場合、非常に効果的です。

- ユニットテスト
- E2Eテスト
- テスト駆動開発

##できるようになるために 
これら三つを全部やり切るのは大変ですが、様々の制約条件の中でうまく組み合わせながら実践していきましょう。それぞれに必要な要素はありますが、一番は**何が正しいか自分の中で持つこと**だと思ってます。たとえ仕様書があったとしても、それが全てであること絶対にありません。自ら考え、何が正しいのかを考える。もっといえばソフトウェアが誰に使われどんな価値があるのかを考える。これを考えられるようになるのが大変なんですけどね。私も勉強中です。
Tencent CloudのCFSをCVMにマウントしてみる

# CFSの概要
CFSは容量拡張可能な共有ファイルストレージサービスです。Tencent Cloud CFSの管理インターフェースは簡単で使いやすくて、既存アプリケーションのシームレスインテグレーションを実現できます。実際の使用量により課金しますのでコストを節約し、ITのメンテナンス作業を簡略化することができます。

# CVMの概要
Cloud Virtual Machine（CVM）は安全且つ信頼性の高いElasticコンピューティングサービスです。awsのEC2ようなサービスを理解して良いです。

# CFSの作成
[CFSコンソール](https://console.cloud.tencent.com/cfs/)に移動し、CFSの作成を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/33ce6c04-a08d-e953-19b0-d3fa2c288c6c.png)
名前、AZとVPCを設定します。
作成ができたら、File Systemの一覧に表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/6a0e0a4d-3128-3634-0c96-465d07e3d2e4.png)

# CVMインスタンスの作成
### CVMの作成
[CVMコンソール](https://console.cloud.tencent.com/cvm/)に移動し、「新規作成」をクリックして、CVMの作成を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/c501381a-5f9c-8b34-cfe8-791c730ce9c3.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/6e4d9139-8849-1862-dedc-ad3ff5a2b859.png)
AZ、CVMのタイプとセキュリティグループなど設定を選択し、CVMの作成を行います。
### セキュリティグループの設定
- ポート2049と22を開く
CVMの作成後、CVMの一覧にCVMのIDをクリックすると、該当するセキュリティグループを確認と編集できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/8b349c8f-eb31-49b1-7b95-5f0e469b5d2d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/f088f57d-462b-58d8-d162-b39e65844587.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/13cb91d8-926a-13a3-1232-6d64fea615ca.png)

# CFSをCVMにマウント
- CVMにログインする
詳細のログインの方法が[ここに](https://intl.cloud.tencent.com/jp/document/product/213/5436)参考する
- マウントのコマンドを確認
[CFSコンソール](https://console.cloud.tencent.com/cfs/)に移動し、マウントのコマンドを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/c3320568-6946-634c-bb6b-e476db0ff31f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633185/76022b25-c2d6-35d2-96e4-9cc73183614b.png)

```bash
#nfs-utils(マウントツール) install
sudo yum install nfs-utils
#マウント
sudo mount -t nfs -o vers=4.0,noresvport <CFS IP>:/ <マウントするフォルダ>   
#マウントしたか確認
mount -l
```
# まとめ
ゼロからCVMとCFSの作成とマウントを紹介しました。注意してもらいたいのはポート2049の開きとnfs-utilsのインストールが忘れないことです。

# 参考
- CVMのログイン方法：https://intl.cloud.tencent.com/jp/document/product/213/5436
- CFS紹介：https://intl.cloud.tencent.com/jp/document/product/582/9127
报备管理系统

报备管理系统
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280122/4f75c62f-7876-21e8-77ea-a9d2dc863d08.png)
01:35 第一部分 - 案例的介绍					
06:00 第二部分 - 使用Forms组件来收集报备数据					
09:11 第三部分 - 使用SharePoint来存储这些表单数据					
13:32 第四部分 - 使用Power Automate工作流功能进行组件串联					
27:38 第五部分 - 通过SharePoint数据源自动生成PowerApps应用（简）
Jupyter notebook の ipynb ファイルの中身を見たいときの方法

2020.09.20投稿

## 必要性
Jupyter notebook 上でコードを書いていて、「あのとき作った Jupyter のコードをコピーしたい！」ということがよくある。その ipynb ファイルが、たまたま今開いている Jupyter のディレクトリの下にあればいいのだが、そうでない場合は、一度 Jupyter notebook を終了・再起動し所要の ipynb ファイルを開いてエディタにコピー、もとの作業に戻るため Jupyter notebook を再起動するという手間をかけていた。
なんとかならないかと思いながら調べていたら、効率よく他の ipynb ファイルの中身を確認する以下の３つの方法があることがわかったので、紹介しておく。
もしここに記載の方法を使ったことにより不都合なことが起きても、筆者は知りません。
自分の責任においてトライしてください。


## VS code を使う
こちらのサイトに方法が記載されている。

+ [最強のipynb-viewerはどれだ！jupyter-notebookを起動せずに簡単にipynbファイルを開く方法](https://dev2prod.site/jupyter/ipynb-viewer/)

私は VS Cod を使う方法を選択し使ってみた。

Mac の Get info の Open with: で、VS code をデフォルトにしておけば、ipynb ファイルをダブルクリックすることで開くことができる。


## Jupyter lab を使う
Jupyter Lab なら複数のタブを開ける！
そこでさっそくインストールして調子を見ているところです。
私のマシンではなんとなく動きがもっさりしている感じ。



## 複数のブラウザで Jupyter を開く
Jupyter notebook でも　これ（```http://localhost:8888/?token=xxxxxx......```）を url に入れてやると違うブラウザで Jupyter notebook  を開ける。
例えば、私の場合、default は Safari であるが、terminal に出てくるこれ（```http://localhost:8888/?token=xxxxxx......```）を Firefox や Chrome の url にいれることにより、それぞれのブラウザで notebook を開ける。

以　上
我的第一个计算器

我的第一个计算器

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280122/316c80d8-8bd9-29c0-205e-eaad1e349ffc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280122/fcf66439-0e70-6be4-9a93-45feaf648f59.png)
a	TextInput_a	
計算	Dropdown_operator	+-*/
b	TextInput_b	

糙版
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280122/974fb2cb-889a-4e6a-fea2-62c34b747557.png)
結果		
	If(	
	    Dropdown_operator.Selected.Value = "+",	
	    TextInput_a + TextInput_b,	
	    Dropdown_operator.Selected.Value = "-",	
	    TextInput_a - TextInput_b,	
	    Dropdown_operator.Selected.Value = "*",	
	    TextInput_a * TextInput_b,	
	    TextInput_a / TextInput_b	
	)	

优雅版
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280122/7306abf6-4087-d8f6-5e47-d1f44f7a2a70.png)
結果	Switch(	
	    Dropdown_operator.Selected.Value,	
	    "+",	
	    TextInput_a.Text + TextInput_b.Text,	
	    "-",	
	    TextInput_a.Text - TextInput_b.Text,	
	    "*",	
	    TextInput_a.Text * TextInput_b.Text,	
	    TextInput_a.Text / TextInput_b.Text	
	)