OmniAICreator/Qiita-1.07M huggingface dataset:
Jenkinsの”Docker Oficial Images”イメージを最新版にアップデートする方法

# 最初にオチ
"Docker Official Images"は更新が止まっていますが、Jenkins公式ページには別リポジトリへのリンクがあります。

* [jenkins/jenkins - Docker Hub](https://hub.docker.com/r/jenkins/jenkins)
* [Jenkinsダウンロードページ(↑リンク元)](https://jenkins.io/download/)

# Jenkinsの”Docker Oficial Images”イメージを更新する方法
基本的に出オチの方法で問題ないと思いますが、何かしら問題があったときの次善策としてJenkinsの”Docker Oficial Images”イメージを更新する方法は以下の通り。

1. [Jenkinsダウンロードページ](https://jenkins.io/download/)からLTS版かWeekly版、好きな方の"Generic Java package (.war)"をダウンロード
1. ダウンロードしたファイルを`/usr/share/jenkins/jenkins.war`にマウントしてDocker起動。

以上です。Docerfile内でダウンロード＆設置でもいいかもしれません(未確認)。

docker-compose.ymlなら以下の通り

```docker-compose.yml
version: '3.2'
services:
  jenkins:
    image: jenkins
    container_name: jenkins
    restart: always
    ports:
    - '8080:8080'
    volumes:
    - [path to jenkins.war]:/usr/share/jenkins/jenkins.war
```

# 教訓
公式サイトのチェックは大事。
”Docker Oficial Images”だけでなく、公式サイトもチェックする。
ドキュメントなんかも含め、オフィシャル大事。
VBAからOutlookを使ってメールを送信するサンプル(添付に対応)

```vb:test.xlsm
Sub test()

    '宣言
    Dim outlook        As Object
    Dim mail_to        As String
    Dim mail_cc        As String
    Dim mail_subject   As String
    Dim mail_body      As String
    Dim mail_file_path As String
    
    '代入
    Set outlook    = CreateObject("Outlook.Application")
    mail_to        = "sozaiya@dummy.com"
    mail_cc        = "info@dummy.com"
    mail_subject   = "test"
    mail_body      = "テストです。"
    
    '空白だったら添付ファイルなしと判定
    mail_file_path = "C:\Users\xxxx\Desktop\test.txt"

    With outlook.CreateItem(0)
        .to      = mail_to
        .cc      = mail_cc
        .Subject = mail_subject
        .body    = mail_body
        If mail_file_path <> "" Then .Attachments.Add mail_file_path
        
        '送信確認画面を表示
        .display

        'いきなり送信
        .send
    End With
End Sub
```
スタイルシートの class と id の違いと優先順位



class属性を使ったスタイルの適用例
スタイルを適用する方法として「class」を使う場合は、次のようなソースになります。
スタイルシートの class と id の違いと使い分け
■HTML：
<p class="sakura">クラスを使った例</p>
■スタイルシート：
p.sakura { color: red; }
対象の要素名とclass名との間に半角の「.」(ドット)記号を記述します。要素名は省略することもできます。上記では「p」が要素名で「sakura」がclass名です。

id属性を使ったスタイルの適用例
スタイルを適用する方法として「id」を使う場合は、次のようなソースになります。
■HTML：
<p id="tomoyo">アイディーを使った例</p>
■スタイルシート：
p#tomoyo { color: red; }
対象の要素名とid名との間に半角の「#」(シャープ)記号を記述します。この場合も、要素名は省略できます。上記では「p」が要素名で「tomoyo」がid名です。


スタイルが適用される優先順位にも差が付けられています。

class属性とid属性の役割の違い
「class」と「id」の役割と、使用上の違いを簡単に言うと、次の通りです。

■class：
「種別名を割り当てる」
→ 同じclass名を、1ページ中に何度でも使える。

■id：
「固有の名前を割り当てる」
→ 同じid名は、1ページ中に1度しか使えない。

class属性とid属性の違い
■全部にclass属性を使っても構わない
■同じid属性値を2回以上使ってはダメ

CSSでは、装飾内容が重複(バッティング)した場合には、原則として「後に記述された方」が採用されます。
.sakura { color: blue; }
.sakura { color: red; }   // こちら側が適用される

「class側とid側とで装飾内容がバッティングした際にはid側が優先される」という規則があるため、(記述順に関係なくid側の方が優先されて)対象要素は青色で表示されます。
#tomoyo { color: blue; }  // こちら側が適用される
.sakura { color: red; }

https://allabout.co.jp/gm/gc/23897/
IntelliJがなんかうまく動かないときの最終手段

プログラムや設定を何度確認しても間違いがないはずなのに、IntelliJ上でコンパイルエラーが出続けたり、ファイルがうまく認識されなかったりということが稀によくあります。

これはどうも、IntelliJが持っているキャッシュや設定ファイルが悪さをしているようなので、これらを削除するとうまく動作するようになります。

# 環境
- IntelliJ IDEA Ulitimate Edition 2023.1.2
- macOS Ventura 13.4.1

# ①キャッシュの削除
[ファイル]-[キャッシュの破棄]です。

![スクリーンショット 2023-07-03 15.42.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/79946bb4-0757-f968-086b-45b2e0d21be5.png)

そして、全てチェックを入れて[破棄して再起動]してください。

![スクリーンショット 2023-07-03 15.44.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/5dd3945f-51f6-f8b2-15db-affd94a959a0.png)

再起動の後にキャッシュやインデックスの再作成が行われるので、数分間かかります。

運が良ければ、この作業だけでOKです。

# ②プロジェクトの設定ファイルの削除
キャッシュの削除をしてもエラーが消えない場合は、下記の手順で設定ファイルを削除→プロジェクトを再インポートしましょう。

1. プロジェクトを閉じる（[ファイル]-[プロジェクトを閉じる]）
2. エクスプローラーなどから、下記のファイル・フォルダを削除
    - プロジェクト直下の `.idea` フォルダ (隠しフォルダなので注意)
    - 各モジュール直下の `モジュール名.iml` ファイル
3. プロジェクトをIntelliJに再インポート

# ③IDEの設定ファイル・プラグイン・キャッシュの削除

> この作業を行うと、IDEの設定やプラグインが削除されるため、IDEが新規インストール時とほぼ同様の状態になります。

IDE終了後、以下のフォルダを削除してください。

> このあたりのフォルダ名はIDEのバージョンによって変わる可能性があるので、Application Support直下やCaches直下を念入りに探して、それっぽい名前のフォルダを見つけてください。

1. ~/Library/Application Support/JetBrains/IntelliJIDEAXXXX.X
2. ~/Library/Caches/JetBrains/IntelliJIDEAXXXX.X

> `XXXX.X` には `2021.1` などのバージョン番号が入ります。

この後、念のため[②プロジェクトの設定ファイルの削除](#プロジェクトの設定ファイルの削除)もやってから、IDEでプロジェクトを開いてください。
c++始めてみた：忘れない内に、今後やるべき事を書き出しておく個人ノートzzz（削除予定）

# c++を学ぶ前に（そして学んでいる最中に）

c++を効果的に学習する為に、その前に下準備を色々する予定です

- その予定を忘れない様に、ここに書き残しておきます
- それと、後で思いついたやるべき事をここに書き残しておきます
- なので、大体やるべき事をやったなと思ったら削除する予定です

あくまでも達成したいゴールは「**分からない事があったら、集合知を頼り、そこから理解する事が出来るようになるレベルまでc++言語を扱える様になる**」程度ですので

真剣にc++を学びたい、エンジニアとして働く為の知識を付けたいという方にはヌルい計画・目標ですので悪しからず

例えば
「　[C++完全理解ガイド Rev1.4.01](https://qiita.com/_EnumHack/items/b5672ac9be86584a6629)　」
で紹介していた

- コンパイラをどれにするか（先ずはWandboxを使う）
- エディタをどれにするか（多分vimかVScodeを使う） 「[リンク](https://qiita.com/whim0321/items/ce7c1d8d203a21778a83)」

他にも

- c++98〜c++17(20)の変化による操作・文法の違い 「[リンク](https://qiita.com/yumetodo/items/e49a673afd9a3ecb81a8)」
    - 始めはPython2->Python3の様に古いバージョンは忘れ去られていく存在と思っていましたが、未だにc++11の話題とかがあるので、肌感覚的に古いバージョンも普通に使われているのかな？と感じました
- 標準ライブラリ？関数？を調べる方法を調べる
- githubでサンプルコードを探す
- c++を使った暫定的な最終目標、現実的に達成・実装出来そうなゴールを立てる
- MATLABでいう所のdisp()やsprintf()の様な関数の理解
    - （Matlabで色々とお世話になったので）
- MATLABでいう所のhelp()の様な関数の理解
    - （Matlabで色々とお世話になったので）
- MATLABでいう所のwaitforbuttonpressの様な関数の理解
    - （Matlabで色々とお世話になったので）
- などなどMATLABでお世話になった機能、関数をc++でも探す
- デバッグの仕方
- などなど
- などなど

どんな機能???

- デバッグ
- Gitクライアントの統合
- シンタックスハイライト
- インテリセンス
- スニペット
- リファクタリング
- REPL – Read-Evaluate-Print-Loop
#PowerApps における数学 #2

#はじめに
前回→[#PowerApps における数学 #1](https://qiita.com/h-nagao/items/e5e7a3708ddb5a10ce0e)

前回はPowerAppsにおける座標の取り方(位置の表し方)を2種類解説しました。
今回はより実用的な位置の表し方、相対位置について解説します。

#相対位置とは
まずHiroさんとヒヨコさんをキャンバス上に配置します。それぞれは

```
Hiro: (x,y)=(100,200)
ヒヨコ: (x,y)=(250,500)
```

という座標で表されています。これが絶対的な位置です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/2798ee0c-2f5c-6605-f186-03de892c1348.png)

一方で見方を変えれば、
**「ヒヨコさんはHiroさんの位置からx方向に+150px, y方向に+300px」**
ヒヨコさんから見ると、
**「Hiroさんはx方向に-150px, y方向に-300px」**
の位置にいるとも表現できます。

これが相対位置です。PowerApps的な表現をすれば、以下のようにかけます。

```
Taiki.X : Hiro.X +150
Taiki.Y : Hiro.Y +300

Hiro.X : Taiki.X -150
Hiro.Y : Taiki.Y -300
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/48a22dca-768c-405a-666e-3288509e9338.png)

##キャンバスのプロパティを使った表現
もう少し例を見ていきます。
キャンバスの左上は原点ですが、左下はどう表されるかというと、```x=0, y= App.Height```で与えられます。

左下を起点にしてそこから右に200px、上に300pxの位置にHiroさんを配置するには、

```
Hiro.X : 画面左下.X +200 = 0 + 200
Hiro.Y : 画面左下.Y - 300 = App.Height-300
```

と表せるわけです。ここら辺がレスポンシブデザインのアプリを作成する際に重要です。（どこにアンカーするかという考え方）
注意すべきは、**「上方向に行くにはマイナスする」**ということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/aaed16a8-bbda-f23d-039f-991b24b398e0.png)


##オブジェクト内の座標
今度はオブジェクトの中の座標を表してみます。
**オブジェクトの位置(x,y)は必ず左上**であることに気をつけてください。
さて、Hiroさんの中心の座標はどう表すことができるでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/334aa173-6ab3-d6b6-92b2-d2987e4b06f6.png)


図にある通りこれは、

```
Hiro中心.X: Hiro.X + Hiro.Width/2
Hiro中心.Y : Hiro.Y + Hiro.Height/2
```

と表されます。


Hiro、Taikiの場合と同様にして、Hiro中心から見ればHiroさんの位置は

```
Hiro.X : Hiro中心.X - Hiro.Width/2
Hiro.Y : Hiro中心.Y - Hiro.Height/2
```

と書けます。

##応用
これを利用すると、画面の真ん中にボタンを置きたいというケースに対応できます。
画面の真ん中にボタンを置きたいということは、ボタンの中心が、

```
ボタン中心.X: App.Width/2
ボタン中心.Y : App.Height/2
```

ということですから、結局ボタン位置は

```
ボタン.X = ボタン中心.X -ボタン.Width/2= App.Width/2 - ボタン.Width/2
ボタン.Y = ボタン中心.X - ボタン.Height/2 = App.Width/2-ボタン.Width/2
```

とかけるわけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/71b6ea68-e725-d940-b2a7-52df31186d92.png)

##キャンバスの各点とオブジェクトの各点
最後にキャンバス、オブジェクトの中の座標それぞれを記述しておきます。

**キャンバス**

|場所|X座標|Y座標|
|:---|:---|:---|
|左下|0|App.Height|
|右上|App.Width|0|
|真ん中|App.Width/2|App.Height/2|
|右下|App.Width|App.Height|

**オブジェクト**

|場所|X座標|Y座標|
|:---|:---|:---|
|左上|Object.X|Object.Y|
|左下|Object.X|Object.Y+Object.Height|
|右上|Object.X+Object.Width|Object.Y|
|真ん中|Object.X+Object.Width/2|Object.Y+Object.Height/2|
|右下|Object.X+Object.Width|Object.Y+Object.Height|

#考えてみよう
とある点(X,Y)を中心にして、30°おきにきれいに丸を配置するにはどのようにそれぞれのx,yを記述すればよいでしょうか？

次回解説します
C++のポインタが原因で小4でプログラミングを断念したプログラマが中1に分かるようにポインタを解説する

この記事はあくあたん工房お盆休みアドベントカレンダー4日目の記事です．

C++と僕が出会ったのは小4の夏休みでした。しかし、それから2か月後、僕とC++の関係はポインタのせいで破局を迎えることになります。
父の部屋にあった分厚い専門書で小学四年生がポインタを理解するのは非常に困難でした。
最終的に、僕はC++を理解することあきらめて型とかポインタの存在しない（）webプログラミングに乗り換えました。

それからの僕はすっかりweb系の人間になってしまい、触る言語といえばJavaScript,PHP,Pythonがほとんどだったため、ポインタの概念を理解したことがありませんでした。しかし最近色々とC系の言語を触ることが多くなってきたので、この機会にポインタを学んでみようと思います。
## そもそもポインタって何なの？
ポインタは、値が格納されているメモリの位置を表すものなのだそうです。なんのこっちゃ？
まず、aという変数を作成したとします。
このとき、aという変数はパソコン内部のメモリに保存されます。
このaという変数を取得したり代入したりしようと思ったらどうすればよいのでしょうか？
次の方法はとても一般的なものです。

```cpp
//int型の変数aを宣言し、2を代入
 int a=2;
//変数の値の取得方法
//aの値を取得し、bという変数に代入している。
 int b=a;
 
//変数の代入方法
//aに１を代入している
 a=1;
```
この場合、プログラムは"a"という名前を付けられた変数を取得したり代入したりしています。
実は別の方法でも同じことができてしまいます。
上で書いたようにプログラムはコンピュータのメモリ上に保存されていますので、「〇番のメモリに保存されている変数に△△して」と命令することが可能なのです。
わかりやすく例えると、子供（コンピュータ）にお使い（処理）を頼む時に、前者は「山田さんちに行ってきて」と言っているのに対し、後者は「××県の##市〇ー△ー◇の家に行ってきて」と言っている感じです
個のメモリ所の住所のことを**アドレス**といい、変数aのアドレスは以下のようにして取得することができます。

```cpp:main.cpp
//int型の変数aを宣言し、2を代入
 int a=2;
//aのアドレスを保存するための変数を宣言する
int* adress;
//aのアドレスをadressという変数に保存
adress = &a;
```
## ポインタとアドレス
ここで、int*という謎の型が出てきました。
上記のプログラムで変数aのアドレスは変数adressに保存されています。
この、変数のアドレスを保存した変数（この場合ではadress）を**ポインタ**もしくは**ポインタ変数**と呼びます。
ところで変数adressの型は「int*」となっています。これはadressがint型であるということではなく、adressが「int型の変数のアドレスを保存できるポインタである」という意味です。

つまり

```cpp:
int* adress=&a;
```
のとき、変数aはint型である必要があるわけです。
同様にchar* 、long* 等も可能です。

次に、先ほどから時々出てくる

```cpp
&a
```
についてです。
&は**アドレス演算子**と呼ばれるもので、変数のアドレスを返します。
実際に

```cpp:
//変数aのアドレスを出力
cout << &a <<endl
```
というプログラムを実行してみると、

```
0x7e014
```
変数aが保存されているメモリのアドレスが返ってきます。

## ポインタを使う
次に、ポインタに保存したアドレスにある変数（上のプログラムでは変数a）の値を取得したり代入したりしてみましょう。
ポインタに保存したアドレスにある変数（ややこしい...）にアクセスするためには*を使用します。

```cpp:main.cpp
//int型の変数aを宣言し、2を代入
 int a=2;
//aのアドレスを保存するための変数を宣言する
int* adress;
//aのアドレスをadressという変数に保存
adress = &a;
//adressに保存されたアドレスの変数に3を代入
*address=3
//aを出力
cout << a <<endl
//adressに保存されたアドレスの変数を出力
cout << *adress <<endl
```
これを実行すると

```
3
3
```
という結果になり、aに3が代入されていることがわかります。
このようにポインタを介して値を参照することを**間接参照**といいます。
## ポインタを利用する
### 参照
ポインタの利用ケースとして、関数に変数を渡すというものがあります。プログラムにはスコープというものがあって、以下のプログラムだと、hoge関数の中でmain関数で作成した変数piyoにはアクセスすることができません。

```cpp
void main(void){
 int piyo=1;
 hoge();
}
void hoge(void){
 cout<<piyo<<endl;
//関数hoge内からはpiyoにアクセスできないのでエラーが出る
}
```
こういう場合、関数の引数としてポインタを渡し、関数内から間接参照をすると、piyoにアクセスできるようになります。

```cpp
void main(void){
 int piyo=1;
//関数hogeの引数としてpiyoのアドレスを渡す
 hoge(&piyo);
}
//関数hogeの第一引数をfugaという名前のポインタとして受け取る。
void hoge(int* fuga){
//ポインタfugaを間接参照する。
 cout<<*fuga<<endl;
}
```
このようにポインタを使用することでプログラム内の値の受け渡しが楽になります。
### 関数ポインタ
変数と同じように関数にもポインタを使用することができます。
関数のポインタの宣言は少し特殊です。

```cpp
//戻り値void、引数voidの関数を作成
void(*hogehoge)(void);
```
C++では関数を（）をつけずに代入すると、関数のアドレスが取得できます。そこで、ポインタに関数fugafugaを覚えさせて実行させたいときには、

```cpp
void fugafuga(void){
 cout<<"hello"<<endl;
}
void main(void){
//戻り値void、引数voidの関数ポインタhogehogeを作成
    void(*hogehoge)(void);
//ポインタhogehogeにfugafugaをセット
    hogehoge=fugafuga;
//fugafugaが実行される
    hogehoge();
}
```
とできます。
しかし、関数ポインタについてはもろもろの事情からstd::functionを代わりに使用するのが一般的になっているようなので、覚えておく程度でいいでしょう。
varディレクトリを別ディスクに引っ越したらサービスが起動しなくなった

# 事象
varディレクトリがディスクを圧迫していたので別ディスクに引っ越したらサービスが起動しなくなった

```
sysemctl start サービス名
Failedto execute operation: Connection timed out
```

# 原因
selinuxのコンテキストが外れてしまい
```/var/run/system/systemd```配下のユニットファイルが読めなくなっていた


# 対策
下記コマンドで```/var```ディレクトリのコンテキストを復元する

```
restorecon -RFv /var
```

# 参考
https://centos.org/forums/viewtopic.php?t=63305
Ubuntu 18.04上で手っ取り早くOpenVPN使いたいねって話

## さっくり結論から

- `network-manager-openvpn`と`network-manager-openvpn-gnome`を`apt install`しましょう
- [VPN Gate公式](https://www.vpngate.net/ja/)からOpenVPN用の設定ファイルをダウンロードしておきましょう
    - 中国など制限が厳しいところに行く場合はIPアドレスで指定している方を選びましょう(注意書きがしてあります)
- GUI上の設定>ネットワーク>VPN の + をクリックして，「ファイルをインポートする」からダウンロードしてきた設定ファイルを選択すれば終わりです

## 何があった

この記事，乗り継ぎのために降りたマニラの空港で上海行きの便を待ちながら書いています．
お察しの通りです．VPNサーバ立ててくるの忘れました．ちなみにVPNクライアントの設定もしてくるの忘れました．空港にGoogleの公共Wi-Fi飛んでて助かった...ありがとうGoogleさん...

というわけで3分VPNセットアップ，始まりです．

## はじめに試してみた

いざとなったらVPN Gateのお世話になろうとは考えていたので，問題はどうやってVPNに接続するか，でした．
5秒の熟慮の結果，OpenVPNが最も~~楽できる~~適当だろうと考え，何も考えずとりあえず[Ubuntu公式のドキュメント](https://help.ubuntu.com/lts/serverguide/openvpn.html)を参考にすることにしました．
結果，`easy-rsa`のver. 2.xを使えとかconfig書き直せとか言われてしまい，このまま中国に行くと何もできないのではないか...という危機感が迫ってきました．観光すればええやんけ．

## その後

~~楽をしたい~~差し迫った状況を打開するため，標準の設定でどうにかできないか死にものぐるいでググった結果，先のパッケージをインストールして窮地を凌いだ次第です．
やり方はもうそのまんま最初に書いた通りです．他に設定もクソも無いのでサルでも出来ます．
強いて言えば、設定ファイルを読み込んだ後にUser KeyPasswordを入れろと出ますが，何でも大丈夫です．

## 最後に

この記事が，中国とかそこらへんの規制が厳しい国に行かれる皆さんのお役に立てると幸いです．やらかした僕も報われます．


こんなクソ記事じゃなくてもっと深みのある記事を書きたい...
キーボード操作でスクリーンセーバーから復帰する方法【Mac】

# はじめに
macOS の謎仕様は数々ありますが、今回は、何故かキーボードを操作してもスクリーンセーバーから復帰できない事案のソリューションのご案内です。

# 謎の現象 by Mac

一体のような現象に直面したのか？

離席するなど暫く Mac を操作しないで放置するとスクリーンセーバーの状態になりますね。
暫くして席に戻り、さてスクリーンセーバーを解除するかと、おもむろにキーボードの何れかのボタンを押してスクリーンセーバーを解除しようとしても

「スクリーンセーバーが解除できない！！は？？」

という事態に陥る事象です。
マウスを動かせば解除できますけどね。しかしキーボード操作でも解除したいじゃないですか。

![スクリーンセーバー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88183/1e3a38a7-cbed-83d3-c984-3e2c125fd468.jpeg)
参考：macOSのスクリーンセーバー起動状態

# ソリューション

**スクリーンセーバーから復帰させたい。**
当たり前の欲求ですが、macOS （デスクトップ仕様）では簡単なことではありません。
通常、キーボードのキーを操作するか、マウスを動かすかで復帰できるであろうと予想しますが、**キーボードで復帰できない！**
そこでマウスを動かしてみます。すると、これは復帰できました。

スクリーンセーバーのオプションに何かあるのか？探しても見つかりません。
macではキーボード操作でスクリーンセーバー解除するのは絶対禁止なのだろうか？疑問は尽きません。が、とにかく情報収集しまくります。

そうこうしているうちに自己解決しました。

<img width="724" alt="キーボードでスクリーンセーバー復帰.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88183/b0a936d2-78b6-84ac-d20f-e9b748b08368.png">

システム環境設定 > Mission Control を開き「ディスプレイごとに個別の操作スペース」をチェックしてください。これで解決です。めでたしめでたし。

ということで、以上、情報シェアさせていただきますね。Enjoy!😉
SQL Server で最低限設定が必要な内容

## はじめに

SQL server で、何も考えずにインストールして、問題となる代表的な設定内容です。
さすがに本番環境ではありえませんが、インストールしただけの状態の開発環境があったので、まとめてみました。

## データファイルとログファイルの保存場所

- 間違ってもCドライブに保存しないようにしましょう。

### 設定方法

- 省略。

## スナップショット分離レベル

- 分離レベルのデフォルト値は READ COMMITTED が設定されています。
- SQL Server の READ COMMITTED は、、select for update の動きとなるため、大抵のシステムでは使い物になりません。
- Oracle の READ COMMITTED （他で未コミットのレコードは変更前の値を参照する）にするには、READ COMMITTED SNAPSHOT にする必要があります。

### READ COMMITTED SNAPSHOT への変更方法

- 省略。

## メモリ使用の最大値と最小値

- インスタンス（サービス）単位の設定となります。
- 最大値のデフォルト値は無制限に近い値が設定されています。
- SQL Server が処理中に確保したメモリは、使い終わってもほとんど開放しないため、適切なメモリ設定が必要になります。

### 設定方法

1. SQL Server Management のオブジェクトエクスプローラのインスタンス（ドラム缶のアイコン）を右クリックして、プロパティをクリックする。
2. メモリを選択して、該当箇所の値を変更する。

### 補足

- DBが稼働中であってもメモリの最大値と最小値の変更することができます。
- 未使用メモリは、サービスを再起動してたタイミングで開放されます。
- 一度、最大値を小さくして未使用メモリを解放した後に元に戻せば、サービスを再起動せずに開放できます。
- 未使用メモリを開放するコマンドは存在しません。<br />（最大値を変更するコマンドは存在するため、最大値を小さくして元に戻せは同等のことができますが、元に戻すのに失敗した場合を考慮すると、最大値の変更によるメモリ開放を自動実行するのはお勧めしない。）

### 最大値をどのくらいにすべきか？

- サーバーに対してメモリ空き容量を監視する場合は、自ずと最大値は決まると思います。
- 私の場合は、DB専用サーバーならば、他のサービス用に2Gを確保したうえで、確保可能な最大値を設定しています。

## おわりに

最低限の設定内容ぐらい会社でマニュアル作っておいて欲しいものですね。
手を抜いた箇所は、暇を見つけて補完していく予定です。
その他の設定関係での注意ポイントがあれば、ぜひコメントください。
MeCabをWindows10 64bitで使うメモ

####ダウンロード
https://github.com/ikegami-yukino/mecab/releases
⇒mecab-64-0.996.2.exe

####インストール
※exeを実行し次へ次へで完了します
※UTF-8

####MeCab-pythonのインストール
pip install mecab-python-windows

確認
python -c "import MeCab"

####テスト
python
>import MeCab
>mecab = MeCab.Tagger("-Ochasen")
>print(mecab.parse("今日はフレックスで早く帰ろう！"))

>今日    キョウ  今日    名詞-副詞可能
>は      ハ      は      助詞-係助詞
>フレックス      フレックス      フレックス      名詞-一般
>で      デ      で      助詞-格助詞-一般
>早く    ハヤク  早い    形容詞-自立     形容詞・アウオ段        連用テ接続
>帰ろ    カエロ  帰る    動詞-自立       五段・ラ行      未然ウ接続
>う      ウ      う      助動詞  不変化型        基本形
>！      ！      ！      記号-一般
>EOS
2023年までにRuby技術者認定試験Silverを取得する方法

Ruby技術者認定試験の取得にあたり、2022年現在はiPhoneアプリで勉強するのが効率的でしたのでご紹介します。

学校でのプログラミング教育が始まりますが、理解しやすいRubyからスタートすることをお勧めします！

#楽しく覚えられるRuby学習アプリ『RubyMate』をインストール
＜アプリ公式HP - GUSTAVE＞
https://www.gustave.tokyo/
価格は120円！

#全問正解するまで、ひたすら問題に挑む！


受講料が16,200円とお高いので一発で合格したいですね・・・！
(ネタ)コンテナ内のsshdにWebからsshするのをコンテナ1つで動かすサンプルを作ってみた

# 概要

このエントリは、コンテナ内のsshdにWebからsshするサンプルを作ってみたときの記録です。

## 対象読者

- dockerについてある程度知識がある方
- nodeのエコシステムについてある程度知識がある方

# TL;DR

こういうことができます。コンテナを立ち上げると、「http://localhost:3000」に、ログインできるターミナルが立ち上がります。

<img width="512" alt="login.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/6561dee5-e95e-1f0f-e77f-987da2175121.png">

コンテナの中は、こんな感じです。

```
[Browser with Terminal(xterm.js)] <---WebSocket(socket.io)---> [Server(Express.js with Socket.io)] ---ssh(ssh2.js)---> sshd
```

# 使ったもの

- [Xterm.js](https://xtermjs.org)
- [Express](https://expressjs.com)
- [Socket.io](https://socket.io)
- [Docker](https://www.docker.com)

# 動かし方

## 配布物

[https://github.com/hrkt/container-with-xterm/releases/tag/0.0.1](https://github.com/hrkt/container-with-xterm/releases/tag/0.0.1)
に一式を置いてあります。

## 準備

## ビルド

### 方法1.

```
$ docker build -t container-with-xterm .
```

### 方法2.(ビルドを手っ取り早く)

[DockerHubのhrkt/container-with-xterm](https://cloud.docker.com/repository/docker/hrkt/container-with-xterm)に、ビルドしたものを置いてあります。

```
$ docker pull hrkt/container-with-xterm
```


## 実行

```
$ docker run -it -p 3000:3000 --rm container-with-xterm 

> container-with-xterm@0.0.1 start /
> NODE_ENV=prod node app.js

Node.js is listening to PORT:3000
```

## ブラウザから開く

ブラウザから「http://localhost:3000」にアクセスしてください。

# 注意

一般的なDockerの知識ですが、Dockerのコンテナで、不用意にコンテナホスト側のディレクトリをマウントしないようにしてください。コンテナの中から、コンテナホスト側の領域を操作することができてしまいます。

# 参考にしたサイト

- [xtermjs](https://xtermjs.org)
- [javascript – リモートのSSHサーバに接続する（Node.js/html5コンソール経由）](https://codeday.me/jp/qa/20190301/347602.html)
- [Stackoverflow: How to include scripts located inside the node_modules folder?
](https://stackoverflow.com/questions/27464168/how-to-include-scripts-located-inside-the-node-modules-folder)
- [Express での静的ファイルの提供](https://expressjs.com/ja/starter/static-files.html)
- [Dockerize an SSH service](https://docs.docker.com/engine/examples/running_ssh_service/#run-a-test_sshd-container)
Sencha JetBrains Plugin のライセンス認証ができないのを解消する

JetBrains IDE をアップグレードしたら、ライセンス認証が効かなくなってしまうという状態を解消する方法です。

### 対象バージョン

* PHPStorm 2019.2, PyCharm 2019.2 など、JetBrains IDE 全般
* Sencha JetBrains Plugin 6.0.12
* 動作環境: macOS Mojave
  * macOS でしか起こってないかもしれない...

### 現象

* 2019.2 に上げたとたんに、
* 起動時にライセンス認証ダイアログが表示されるようになる
* ダイアログにどれだけ正しい情報を入れてもライセンス認証ができなくなる

### 対策

- Sencha Support に問い合わせたが、現在対策中という答えのまま、まだ対策は出ていない。
- Sencha Forum でのディスカッションの中に [JVM 8 を使ってみたら？ というコメント](https://www.sencha.com/forum/showthread.php?471839-IDEA-2019-2-EAP-support&p=1325809&viewfull=1#post1325809)を見つけたので、JDK8 に切り替えてみると見事に解消した。

#### JDK8 への切り替え方

以前に PyCharm でフォントがちらつくようになったときに、JDK を切り替える方法を調べたので、そちらを参照してください。

こちらです。[Pycharm 2019.1 でフォントがちらつくのをなんとかする](https://qiita.com/martini3oz/items/a37b9617d98709e0e186)

MacOS で JDK11 の場合、なんかいろいろと不具合満載のようなので、JDK8 で良くなることも多いみたいです。
Ubuntu18.04LTSにvim（+clipboard，+clientserver）をソースからインストールする手順

# モチベーション
- Ubuntu の vim からクリップボードへコピーを使いたかったため．
- vimtex でバックグラウンドでコンパイルをさせるためには vim の clientserver が有効になっている必要があるため（ vimtex の [wiki](https://github.com/lervag/vimtex/wiki/introduction#requirements) 参照）．

## 手順
```bash:bash
$ git clone git@github.com:vim/vim.git
$ cd vim
$ make distclean
$ rm src/auto/config.cache
$ sudo apt install \
  lua5.2 \
  liblua5.2-dev \
  luajit \
  libluajit-5.2 \
  ruby-dev \
  xorg-dev
$ ./configure \
  --with-features=huge \
  --with-x \
  --enable-multibyte \
  --enable-luainterp=dynamic \
  --enable-gpm \
  --enable-cscope \
  --enable-fontset \
  --enable-fail-if-missing \
  --prefix=/usr/local \
  --enable-pythoninterp=dynamic \
  --enable-python3interp=dynamic \
  --enable-rubyinterp=dynamic \
  --enable-gui=auto \
  --enable-gtk2-check
$ make
$ sudo make install
```

## 参考文献
- [vimtex on macOS でハマったときのメモ](https://qiita.com/tYohei/items/8b047b6566bc0c946abd)
- [Linuxでのビルド方法](https://vim-jp.org/docs/build_linux.html)
- [WSLにVim8を入れてみる](https://qiita.com/sat0ken/items/82fee34035ce1e6960ae)
- [vimでclipboardを+にしたいけどならない人向け](https://qiita.com/Nikkely/items/7bfa4e71a6eb1e3d7bed)
[WIP] macOS Mojave 10.14.6にvim（+clientserver，+clipboard）をソースからインストールする手順

# このページはまだ完成していません。自分用の備忘録です。

# モチベーション
- macOS で texvim（vim +clientserverが必要）を使いたかったが，`brew install vim`でインストールした vim には +clientserver が入っていなかったため．
- `brew install vim --with-client-server`では vim（+clientserver）がインストールされなかったため．

# インストール手順
- ビルドに必要なパッケージをダウンロードする.

```bash:bash
$ brew install lua luajit
```

- vimをソースコードからインストールする．

```bash:bash
$ git clone git@github.com:vim/vim.git
$ cd vim
$ make distclean
$ rm src/auto/config.cache
# configureスクリプトを実行して、Makefileを作成する。
$ ./configure \
  --with-features=huge \
  --with-x \
  --enable-multibyte \
  --enable-luainterp=dynamic \
  --with-luajit \
  --with-lua-prefix=/usr/local \
  --enable-gpm \
  --enable-cscope \
  --enable-fontset \
  --enable-fail-if-missing \
  --prefix=/usr/local \
  --enable-pythoninterp=dynamic \
  --enable-python3interp=dynamic \
  --enable-rubyinterp=dynamic \
  --enable-gui=auto \
  --enable-gtk2-check \
  --disable-darwin \

  # --disable-darwin は, macOSでmakeするときに必要.
  # macOSの場合, 最後の '--with-lua-prefix' を指定しないとconfigure時に 'configure: error: could not configure lua' が出てしまう.
$ make
$ sudo make install
```

# PATHを通す
```bash:.bash_profile
# .bash_profileに以下を追加する
export PATH=/usr/local/bin:$PATH
```

```bash:bash
$ source .bash_profile
```

# アンインストール手順
```bash:bash
$ cd vim
$ make uninstall
$ sudo make uninstall
```

# 参考文献
- [vimtex on macOS でハマったときのメモ](https://qiita.com/tYohei/items/8b047b6566bc0c946abd)
- [Linuxでのビルド方法](https://vim-jp.org/docs/build_linux.html)
- [WSLにVim8を入れてみる](https://qiita.com/sat0ken/items/82fee34035ce1e6960ae)
- [vimでclipboardを+にしたいけどならない人向け](https://qiita.com/Nikkely/items/7bfa4e71a6eb1e3d7bed)
- [Mac上のVimを最新にした際のメモ(LuaJIT対応)](https://liquidz.github.io/2013/12/vim.html)
- [Vim can't build the athena GUI on macOS High Sierra #2444](https://github.com/vim/vim/issues/2444)
- [macOSでvim8.1をlua付きでソースからビルドする](https://qiita.com/zurazurataicho/items/491a460a1842037db13c)
Ruby on Rails チュートリアル　第４版　第１０章　10.1.3 編集失敗時のテスト　リスト 10.10がredになるエラー

[Ruby on Rails チュートリアル　第４版　第１０章](https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#cha-updating_showing_and_deleting_users)

10.1.3 編集失敗時のテスト

リスト 10.9: 編集の失敗に対するテストgreen

リスト 10.10: green
$ rails test

上記を実行したところgreenにならず、以下のようなエラー（red）になった。


（ターミナル）

$ rails test
Running via Spring preloader in process 5810
Started with run options --seed 10877

FAIL["test_invalid_signup_information", UsersSignupTest, 0.48510723200024586]
test_invalid_signup_information#UsersSignupTest (0.49s)
Expected at least 1 element matching "form[action="/signup"]", found 0..
Expected 0 to be >= 1.
test/integration/users_signup_test.rb:16:in `block in class:UsersSignupTest'

29/29: [=========================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.67359s
29 tests, 74 assertions, 1 failures, 0 errors, 0 skips


#解決法


/sample_app/app/views/users/_form.html.erb

```
<%= form_for(@user) do |f| %>
```
を

```
<%= form_for(@user, url: yield(:form_path)) do |f| %>
```
に変更

/sample_app/app/views/users/new.html.erb

```
<% provide(:form_path, signup_path) %>
```
を追加

/sample_app/app/views/users/edit.html.erb

```
<% provide(:form_path, user_path) %>
```
を追加


再度$ rails testを行ったところ、結果がgreenになった。

（参考サイト）
https://stackoverflow.com/questions/41130656/running-into-error-in-the-micheal-hartl-ruby-on-rails-tutorial-section-10-1-1?rq=1
フォーム作成②

フォームで送信した値を確認するために作った物。今回はtableタグを使ったけどしっくり来ない感がある。とは言え他にどのように表記させるか考えても思い浮かばなかったので、現時点ではこれでいいだろう。

学んだこと
$_POST[name属性に指定した値];
これを使ってフォームに入れた値を表示させる

課題
method属性のgetとpostの違いを学ぶこと。



````

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content ="text/html"  charset="utf-8"/>
  <title>ゲーム作品感想フォーム</title>
</head>

<body>
  <h2>好きなゲーム作品感想投稿サイト</h2>
  <form action ="formTest2.php" method ="post">


<table border ='1'>
  <tr>
    <td>名前</td>
 <td><?php echo $_POST['name'] ?></td>
</tr>
<tr>
  <td>メールアドレス</td>
 <td><?php echo $_POST['mail']?></td>
</tr>
<tr>
  <td>性別</td>
 <td><?php echo $_POST['sex']?></td>
</tr>
<tr>
  <td>ハード</td>
  <td><?php echo $_POST['checkbox']?></td>
</tr>
<tr>
  <td>作品名</td>
 <td><?php echo $_POST['title']?></td>
</tr>
<tr>
  <td>ゲームの感想</td>
 <td><?php echo $_POST['review']?></td>
</tr>
</table>

<input type ="submit" value ="送信">
</form>
</body>
</html>
フォーム作成①（改）

昨日投稿したコードに変更を加えた。ハード部分のチェックボックスをセレクトボックスの方に変えた。一応フォームっぽくは出来た...気がする。



````

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content ="text/html"  charset="utf-8"/>
  <title>ゲーム作品感想フォーム</title>
</head>

<body>
  <h2>好きなゲーム作品感想投稿サイト</h2>
  <form action ="formTest1.php" method ="post">


  ハンドルネーム:<br />
  <input type ="text" name ="name" size ="30" value=""/><br />

  メールアドレス:<br />
  <input type ="text" name ="mail" size ="40" value=""/><br />

  性別:<br />
  <input type ="radio" name ="sex" size="20" value="男性"/>男性<br />
  <input type ="radio" name ="sex" size="20" value="女性"/>女性<br />


 ハード:<br />

 <select name ="checkbox" row ="40">

   <option value ="ps4">PS4</option>
   <option value ="ps3">PS3</option>
   <option value ="switch">switch</option>
   <option value ="vita">Vita</option>
   <option value ="3ds">3ds</option>
   <option value ="その他">その他</option>

 </select> <br />

作品名:<br />
<input type ="text" name ="title" value=""><br />

ゲームの感想:<br />
<textarea  type = "text" name ="review" value =""/></textarea><br />

<input type ="submit" value="送信"/>
Ruby の Integer#pred の pred って何？

# 発端

ある日，式の評価値に 1 を足した値を得るため，

```rb
ex1.next
```

のように書いた。
（`ex1` は何らかの式であり，その値は必ず整数）

なぜ

```rb
ex1 + 1
```

と書かなかったかというと，実は式はここで終わりではなく，

```rb
ex1.next.nantoka.kantoka
```

のようにメソッドチェーンの形で続いていたからだ。

その後，別の箇所で，式の評価値から 1 を引いた値を得る必要が出てきた。

「えっと，`next` の反対，なんだっけ？　ぷ，プレ・・・」
Integer クラスに，1 を減ずるメソッドが存在することは 75% ほどの自信があった。確か前に使ったことが。
「`next` の反対だから `prev` だろ。previous の略で」

ところが

```rb
ex2.prev
```

は NoMethodError となった。ううむ。

# 探索

こういうときは公式リファレンスマニュアルの [Integer#next](https://docs.ruby-lang.org/ja/2.6.0/method/Integer/i/next.html) を見よう。きっと「SEE ALSO」として 1 を引くメソッドが挙がっているに違いない[^see]。

見ると，期待どおり「SEE ALSO」として [Integer#pred](https://docs.ruby-lang.org/ja/2.6.0/method/Integer/i/pred.html) が挙がっている。これだ！

[^see]: いや，関連の深いメソッドへの参照が必ずあるとは限らないけれど。

# 疑問

しかし，この「pred」というメソッド名はどこから来たのか？
pred という英単語は無さそうなので，何かの略だろう。
英和辞典を引くと，「pred」で始まる単語はけっこうあるので，一つ一つ見ていくのはだるい。

リファレンスマニュアルにメソッド名の由来まで書いてあればいいのだが，書いてはいない。

# 氷解

こういうときは，英文の説明を見ると分かる場合がある。

さきほど見た [Integer#pred](https://docs.ruby-lang.org/ja/2.6.0/method/Integer/i/pred.html) のページを再び訪れよう。
すると，ページの右上に [permalink][rdoc] という二つのリンクがある。
このうち，[rdoc](https://docs.ruby-lang.org/en/2.6.0/Integer.html#method-i-pred) のほうは，英文のリファレンスへのリンクだ。さっそくジャンプ！
そこには

> Returns the predecessor of `int`, i.e. the `Integer` equal to `int-1`.

とある。
predecessor だったのか。そんな単語知らんわ。こんな綴り覚えらんないし。

英和辞典を引くと「前任者」とかいくつか語義が載ってるけど，要するに successor の対義語であるらしい。
`Integer#next` と `Integer#succ` は同じメソッドで，`succ` は successor の略だってのは知ってたので，まあ合点がいった。

predecessor の関連語で predecease（先立つ）なんて動詞もあるみたい。ふむふむ。
predecessor が「先行するもの」で，successor が「後続するもの」みたいに思えばいいのか。

# 未来

これでもう人に訊かれても説明できるようになったぞ。
「ああ，`pred` ね。英語が得意な人じゃないと分からないだろうなあ。successor っていう単語は知ってるかな？　『あとに来るもの』っていうような意味だよね。`pred` っていうのはこれの対義語でね，ぷ，プレ・・・，プレ・・・デ？？？　おおっといけない，午前中にアレをデプロイする予定だったんだ，忘れてた。それはそうと，例の案件は進捗どうなってる？　来週にはデモを見せられるようにしないとねえ。それに・・・」
Ruby on Rails チュートリアル　第４版　第９章　9.3.2 [Remember me] をテストする　リスト 9.34がredになるエラー

[Ruby on Rails チュートリアル　第４版　第９章](https://railstutorial.jp/chapters/advanced_login?version=5.1#sec-testing_the_remember_branch)

9.3.2 [Remember me] をテストする

リスト 9.33: 例外発生部分を削除する green

リスト 9.34: green
$ rails test

app/helpers/sessions_helper.rbからraiseを削除してテストしたところ、以下のようなエラー（red）になった。


（ターミナル）

$ rails test test/helpers/sessions_helper_test.rb
Running via Spring preloader in process 11077
Started with run options --seed 26989

FAIL["test_current_user_returns_right_user_when_session_is_nil", SessionsHelperTest, 0.038832178001030115]
test_current_user_returns_right_user_when_session_is_nil#SessionsHelperTest (0.04s)
--- expected
+++ actual
@@ -1 +1 @@
-#<User id: 762146111, name: "Michael Example", email: "michael@example.com", created_at: "2019-08-13 15:07:51", updated_at: "2019-08-13 15:07:51", password_digest: "$2a$04$L4RiiWTTq8ljCoPG/BSiUeZR5.TUd8q0IKGsn1HiwG1...", remember_digest: "$2a$04$/zeD50pBRxGpYJ0m14vIRe5mTOjksuCGVlJts9Qaeer...">
+nil
test/helpers/sessions_helper_test.rb:11:in `block in class:SessionsHelperTest'

2/2: [==========================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.06042s
2 tests, 2 assertions, 1 failures, 0 errors, 0 skips



#原因
/sample_app/app/helpers/sessions_helper.rb

```
  \# 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end
  
   \# 現在ログイン中のユーザーを返す (いる場合)
  def current_user
    if session[:user_id]
      @current_user ||= User.find_by(id: session[:user_id])
    end
  end
```

となっており、def current_userメソッドが２つ定義されていたので、

```
   \# 現在ログイン中のユーザーを返す (いる場合)
  def current_user
    if session[:user_id]
      @current_user ||= User.find_by(id: session[:user_id])
    end
  end
```

を消去したところ、テストがgreenになった。

（参考にしたサイト）
https://stackoverflow.com/questions/27671085/how-do-i-troubleshoot-this-error
UmbrellaJSめも

#

## 「IE11でも動く！」都道府県プルダウン

```html:target
<label for="prefId">都道府県</label><select id="prefId"></select>
```

```html:lodashあり
<!-- https://lodash.com/ -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
<!-- https://umbrellajs.com/ -->
<script src="https://cdn.jsdelivr.net/npm/umbrellajs@3.1.0/umbrella.min.js"></script>

<script>
  const PREFS = ['北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県','大分県','宮崎県','鹿児島県','沖縄県'];
  u(document).on('DOMContentLoaded', function(){
    _.each(PREFS, function(p,i){
      u('select#prefId').append('<option value="'+_.padStart((i+1), 2, '0')+'">'+p+'</option>')
    });
  });
</script>
```

```html:lodashなし
<!-- https://umbrellajs.com/ -->
<script src="https://cdn.jsdelivr.net/npm/umbrellajs@3.1.0/umbrella.min.js"></script>

<script>
  const PREFS = ['北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県','大分県','宮崎県','鹿児島県','沖縄県'];
  u(document).on('DOMContentLoaded', function(){
    PREFS.map(function(nm, i){ u('select#prefId').append('<option value="'+('0'+(i+1)).slice(-2)+'">'+nm+'</option>') });
  });
</script>
```

```javascript:VanillaJS
document.addEventListener('DOMContentLoaded', function(){
  ['北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県','大分県','宮崎県','鹿児島県','沖縄県']
    .map( function(nm, i){ document.querySelector('select#prefId').insertAdjacentHTML('beforeend', '<option value="'+('0'+(i+1)).slice(-2)+'">'+nm+'</option>') });
});
```

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="fujisystem" data-slug-hash="OJLMQxg" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="「IE11でも動く！」都道府県プルダウン">
  <span>See the Pen <a href="https://codepen.io/fujisystem/pen/OJLMQxg/">
  「IE11でも動く！」都道府県プルダウン</a> by fujisystem (<a href="https://codepen.io/fujisystem">@fujisystem</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
TypeScriptでNullableと向き合う

## 2019/11/11追記

**TypeScript3.7からOptional Chainingが導入されました！**
ここで記述されている`?.`演算子が使えるようになったため、以下の議論が比較的きれいにかけるようになりました。

## TypeScript3.6までのNullable

たとえば、こんなコードがある。

```JavaScript:JavaScript
document.getElementById('loader').style.display = 'none'
```

TypeScriptではJavaScriptで↑のように書けていたコードはそのまま書くと、

`error TS2531: Object is possibly 'null'.`

と怒られるため、↓のように書かなくてはならない。

```TypeScript:TypeScript(compiled-with-strict) 
const loader = document.getElementById('loader')
if (loader) {
  loader.style.display = 'none'
}
```

これは`document.getElementById()`の返す型が`HTMLElement | null`であるため、
`Nullチェック`を行えという**至極真っ当な主張**である。

言ってしまえば、JavaScriptの方のコードは潜在的なバグあるということに気付かされる場面でもある。

しかし、みなさんにはどうでもいいかもしれないがこういったことで**if文**を書き、ネストが一つ深まるのが**個人的には好きではない。**

**ではどうするか？**

## 他の言語ではどうなの？

他の言語の場合、**`Null条件演算子(Safe Navigation Operator)`**というものがある。
`Null条件演算子`を使用した場合、**nullが検出されて以降のメソッドやフィールドの評価を行わずにnullをその結果として返す。**
たとえば、C#やSwiftだったら以下のように書けるはずだ。

```csharp:Null条件演算子をサポートしている場合
document.getElementById("loader")?.style.display = "none"
```

確かに、↑のように書けることができれば、**いけ好かないif文**を書く必要がなくなる。
しかし、TypeScriptではこのような演算子はまだ存在しないようだ。

似たような文法は確かに存在していて、

```TypeScript:TypeScript
document.getElementById('loader')!.style.display = 'none'
```

と書けることにはたしかに書ける。

調べると`x!演算子`は`Non-null Assertion Operator`というものらしい。
`x`が`Non-null`、`Non-undefined`と断定できる場合に使用できる。

しかしこれではJavaScriptのコードと何ら変わりはない。
今回に関して言えば、いけ好かないif文を書いたほうが**数億倍マシ**まである。
というのも`Null条件演算子`を見たあとにこれでは悲しすぎる。

## ではどうする？

一時期、`Null許容型`や`Null安全型`に関しての議論がよくされていた。
タイトルの`Nullable`が`Null許容型`に当たる。
`document.getElementById()`でいえば`HTMLElement | null`をして`Null許容`とここではしておく。

TypeScriptを使用する際に、私がよく使う便利なライブラリに[**fp-ts**](https://github.com/gcanti/fp-ts)というライブラリがある。
これはTypeScriptに関数型プログラミングの考え方を導入するためのライブラリである。

幸いなことに、提供するものの中には`Null安全`でおなじみの`Option`がある。
毎度、TypeScriptを使用するときにこのライブラリも使うんだから、これ利用してどうにかきれいに書けないかと考えることにした。

## とりあえず書いてみた。

```TypeScript:TypeScript(Option導入後)
import { pipe } from 'fp-ts/lib/pipeable'
import { fromNullable, map } from 'fp-ts/lib/Option'

pipe(
  document.getElementById('loader'),
  fromNullable,
  map((loader) => { loader.style.display = 'none' })
)
```

律儀に改行しまくったため、長く見えるが、if文が消えたので良しとする。

やっていることとしては`Nullable型`から`Option型`へ変換し、`document.getElementById('loader')`が`null`ではなかったら`map`に渡した関数が適用されるといった感じになる。

この程度のことで`Option`をわざわざ引っ張り出すのは大げさかもしれないが規模が大きくなるに比例して、`Null安全`の概念を導入することは有利に働くと思うのでこういったことで慣れておくのもいいだろう。
次世代BIツール Looker について

次世代のデータプラットフォームと銘打たれている、**Looker** を使い始めましたが、現状日本語で書かれた記事や使い方などがかなり少ない為、利用してみてわかった事などをちょっとずつアウトプットしていこうと思います。

今回はその第1弾で、lookerはこんな特徴があるよ～。という点を5つほど書いておきます。

## lookerとは？
次世代BIツール、データプラットフォーム
細かな事は、ここら辺を参考に
https://dev.classmethod.jp/business/business-analytics/looker-overview/


## lookerの特徴（5つ）　※詳細を別ブログに書いたら、リンク追加します
1. [**lookML(ルックエムエル）**](https://qiita.com/ymto/items/318e1192380f09b40748)という **yaml形式のデータモデリング言語** を使い、 **gitでコード管理** される

2. **DB機能が存在しない** ので、bigqueryやmysqlなど他社のDBサービスと併用必要

3. lookerの利用者情報など、 [**アクセス状況の管理画面が充実**](https://qiita.com/ymto/items/cde85690c17eee041fcd) しており、アカウント管理や未利用ダッシュボードを洗い出しやすい 

4. ダッシュボード(1つずつの画面はlookという)は[**フィルタ、グラフ、データの3構成**](https://qiita.com/ymto/items/69b0ede9a16f2aa2ddef)になっており、 **不要な情報をワンクリックで隠す事が出来る** ので、見た目がごちゃごちゃしにくい。

5. ライブチャットが採用されており、 **[わからない事があれば気軽にリアルタイムで質問可能](https://qiita.com/ymto/items/6f411de181786634773c)** 、今のところ返答も早い 

## まとめ
日本でも相当普及している、BIツールのtableauと比較すると、lookerは、lookMLの利用が必須であり、そこの特徴を覚えるまでちょっと大変かもしれません。ここで無理と感じる人は使わない選択肢も出てしまいそう。

ただし、ここのハードルを乗り越えて、特徴を覚えてしまえば、git管理のおかげで、誰かがデータ定義壊してしまっても復旧が手軽、ライブチャットのおかげで気軽な質問も可能で、ツールの利用における課題を解決しやすい。などが非常に便利な点だと思います。
Goでオブジェクト生成の返り値にinterfaceを使うとnil Pointer Receiverができないという話

タイトルそのままです。


```go
package main

import (
	"fmt"
	"reflect"
)

type Fooer interface {
	Foo()
}

type Fooo struct{}

func (f *Fooo) Foo() {
	if f == nil {
		fmt.Println("nil!!")
	} else {
		fmt.Println("not nil!!")
	}
}

func newFooer() Fooer {
	return &Fooo{}
}

func bar(f Fooer) {
	f.Foo()
}

func main() {
	// 型を代入したあとnilを入れても型情報は消えない
	z := &Fooo{}
	fmt.Println(reflect.TypeOf(z)) // *main.Fooo
	z = nil
	fmt.Println(reflect.TypeOf(z)) // *main.Fooo
	z.Foo()                        // nil!!
	bar(z)                         // nil!!

	// 型情報を持ったnilを入れて、そのあとただのnilを入れても型情報は消えない
	y := (*Fooo)(nil)
	fmt.Println(reflect.TypeOf(y)) // *main.Fooo
	y = nil
	fmt.Println(reflect.TypeOf(y)) // *main.Fooo
	y.Foo()                        // nil!!
	bar(y)                         // nil!!

	// interfaceを返す関数から変数を代入したあとにnilを入れると型情報が消える
	x := newFooer()
	fmt.Println(reflect.TypeOf(x)) // *main.Fooo
	x = nil
	fmt.Println(reflect.TypeOf(x)) // <nil>
	// panicになる x.Foo()
	// panicになる bar(x)
}
```

発端はクリーンアーキテクチャをやろうと思いサンプルを探すと、[この例](https://eng-blog.iij.ad.jp/archives/2442)のように生成系でinterfaceを返しているものが多いです。
依存関係の逆転をしたいので、接合部分をinterfaceにするというのは素直だと思いますが、Goでは微妙なところもありそうです。

[Go言語のInterfaceの考え方、Accept interfaces,return structs](https://qiita.com/weloan/items/de3b1bcabd329ec61709)に従ったほうが、大体は良さそう。

クリーンアーキテクチャをするなら`Accept interfaces,return structs` に従って生成してからDIで渡すところでinterfaceを使うようにしたほうが良さそうです。
M5StickVのMaixPyにdemoデータを全部入れる

# 概要
MaixPyのAIのデモで遊ぶとき、Kmodelの学習データをSDカードに入れたり、Firmwareを書きなおしたりするのは大変ですね。
AIのデモファイルを全部M5StickVに書き込みましょう。

# 学習データ
学習データは、以下のURLから、MaixPy 0.3 demo firmware.zip をダウンロードします

http://dl.sipeed.com/MAIX/MaixPy/release/maixpy_v0.3.0/
→　MaixPy 0.3 demo firmware.zip


解凍すると、
・mnist.kmodel：mnistの学習データ(mnist)
・facedetect.kmodel：顔検出の学習データ(yolov2)
・20class.kmodel：20クラス分類の学習データ(yolov2)
・mbnet75.kmodel：1000クラス分類の学習データ(mobilenet)
デモで使うファイルが全部入っています。

MaixPy の0.3までは、demoデータを全部入ったFirmwareが提供されていたのですね。


# kflash-gui
kflash-guiでAdd file　を押して、Kmodelを追加していきます。

|Flash Partition|files|
|----|----|
|0x000000～0x200000|	M5StickV MaixPy firmware(1.4MB)|
|0x200000～0x280000|	mnist.kmodel(0.2MB)|
|0x280000～0x300000|	facedetect.kmodel(0.4MB)|
|0x300000～0x500000|	20class.kmodel(1.2MB)|
|0x500000～0x800000|	mbnet75.kmodel(2.7MB)|

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/bc1fb3c9-af47-b139-e148-472415f04f2e.png" width=50%　>


## MaixPy実行
MaixPyのkpu.loadでアドレスを指定すれば、学習データを切り替えられます。

```
task = kpu.load(0x200000) //MNIST

task = kpu.load(0x280000) //facedetect

task = kpu.load(0x300000) //20class_detect.

task = kpu.load(0x500000) //1000class_mbnet
```


# 最後に
よいM5StickVライフを！

#　参考
https://bbs.sipeed.com/t/topic/688
カスタムViewのNotificationを持つアプリにAndroidXを導入した際に出たエラーと対応

独自のViewを定義したNotificationを使用したAndroidアプリで、Support LibraryをAndroidXに置換えた時、次のようなエラーが出た。

```
08-14 01:02:03.603 28933-28933/[パッケージ名] E/AndroidRuntime: FATAL EXCEPTION: main
    android.app.RemoteServiceException: Bad notification posted from package [パッケージ名]: Couldn't expand RemoteViews for: StatusBarNotification(pkg=[パッケージ名] id=1 tag=null score=0 notn=Notification(pri=0 contentView=[パッケージ名]/0x7f0c006f vibrate=null sound=null defaults=0x0 flags=0x62 kind=[null]) user=UserHandle{0})
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1413)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:213)
        at android.app.ActivityThread.main(ActivityThread.java:5092)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:564)
        at dalvik.system.NativeStart.main(Native Method)
```

エラーの行も出ないので色々確認して調べたところ、NotificatioのレイアウトXMLにあった以下の定義が原因だった。

```xml
        <ImageView
            android:id="@+id/notificationAlbumArtImageView"
            android:layout_width="@android:dimen/notification_large_icon_width"
            android:layout_height="@android:dimen/notification_large_icon_height"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginEnd="4dp"
            android:layout_marginRight="4dp"
            android:adjustViewBounds="true"
            android:background="?attr/selectableItemBackground"
            android:clickable="false"
            android:contentDescription="@null"
            android:scaleType="fitCenter"
            app:srcCompat="@drawable/ic_media_default" />
```

`android:background`を削除したところ、エラーは出なくなった。値として指定した`?attr/selectableItemBackground`が問題を起こしていた模様。
この値は元々Notification上では効果が無かったので意味は無かった。これは、昔色々試したときに入れた物がそのまま残ってたものが、今頃になってエラーとして顕在化してしまった。

教訓：余計なコードは削除する。残さない。
terminalの履歴をrealtimeにslackに記録

### 完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/a76780c8-ecf3-14e5-117f-22e9eca68eb6.png)


### 記事を参考にincomming webhookを設定

https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008

### webhookを叩くコマンドを作成

```bash
curl -X POST -H 'Content-type: application/json' --data '{"text":"Done!:ghost:"}' https://YOURE_INCOMMING_WEB_HOOK_URL
```

### コマンド実行後に実行されるコマンドを設定

```bash:~/.bash_profile
function execute_after_executed () {
  h=$(history 1)
  #echo $h
  curl -X POST -H 'Content-type: application/json' --data "{'text':'$h:run_gopher:'}" https://YOURE_INCOMMING_WEB_HOOK_URL;
}
PROMPT_COMMAND=execute_after_executed
```

### 欠点
0.1秒くらいbashがラグる

### 予定
slackで集計して、頻度の高いコマンドをaliasとして提案するAI
Preztoのインストールとプロンプトテーマの選択方法(for macOS)

# 背景

macOS Catalina (10.15) から、デフォルトシェルがZshになる[^1]とのことなので、BashからZshに切り替えました。

[^1]: Use zsh as the default shell on your Mac - Apple Support - https://support.apple.com/en-us/HT208050

その際、Zshを1から設定するのが面倒だったので、ZshコンフィグレーションフレームワークのPreztoを導入してみました。

# Preztoのインストール方法

* sorin-ionescu/prezto: The configuration framework for Zsh - https://github.com/sorin-ionescu/prezto

ターミナルで以下のコマンドを実行します。

```zsh:zsh
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```

次のコマンドを実行して、各種コンフィグファイルへのシンボリックリンクを作成します。

```zsh:zsh
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

すると、ホームディレクトリに次のファイル(シンボリックリンク)が作成されます。

```zsh:$HOME/
.zlogin
.zlogout
.zpreztorc
.zprofile
.zshenv
.zshrc
```

これでPreztoのインストール完了です。
 
# プロンプトテーマ選択

Preztoには予めいくつかのプロンプトテーマが用意されており、Preztoの`prompt`コマンドでプロンプトテーマを切り替えて使うことができます。

`prompt -l` で用意されているプロンプトテーマの一覧が確認でき、`prompt -p プロンプトテーマ名` でテーマのプレビューが表示されます。

全部のテーマのプレビューを確認する場合は以下のコマンドを実行します。

```zsh:zsh
prompt -p
```

お気に入りのプロンプトテーマが見つかったら、

```zsh:zsh
prompt -s プロンプトテーマ名
```

でプロンプトテーマを保存できるとのことですが、私の環境だと設定が保存されずに以下のメッセージが表示されました(macOSだからかな？)。

どうやら`~/.zshrc`に設定を追加する必要があるみたいです。

```zsh:zsh
$ prompt -s cloud
Set and save not yet implemented.  Please ensure your ~/.zshrc
contains something similar to the following:

  autoload -Uz promptinit
  promptinit
  prompt cloud
```

ということで、メッセージで表示された、最後の3行を `~/.zshrc` に追記してテーマを保存します。
(以下は `cloud` テーマの場合、最後の行は各テーマ名に置き換えてください)

```zsh:~/.zshrc
# 以下を追加
autoload -Uz promptinit
promptinit
prompt cloud
```

シェルを再起動して選択したプロンプトテーマが最初から適用されていることを確認します。

```zsh:zsh
# シェルの再起動
exec $SHELL -l
```

これでプロンプトテーマが保存できました。

# 参考

* まだ oh-my-zsh で消耗してるの？ - Qiita  
  https://qiita.com/b4b4r07/items/875235f6122a6d779306
* Zsh + Prezto で快適コマンド環境を構築する ｜ DevelopersIO  
  https://dev.classmethod.jp/tool/zsh-prezto/
UnityでOculus向けの環境で壊れたOVRHeadsetEmulatorを直す

# はじめに

UnityのOculus Integrationはエディタ上でカメラの動きをエミュレートできる`OVRHeadsetEmulator`があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/c660d421-24fe-1543-d03a-73ed7a0fe643.png)


- https://developer.oculus.com/documentation/unity/latest/concepts/unity-hmd-emulation/
- https://qiita.com/numa08/items/8f67026b59f8b72174a3

このコンポーネントは`OVRCameraRig.prefab`と`OVRPlayerController.prefab`にアタッチされているのですぐに使えるのですがv1.38とv1.39でOpenVRがサポートされた時に動かなくなってしまいました。せっかくの便利なコンポーネントなので動くように直してみました。
※1.37以前と1.40はそのままで動作します。

## 修正方法

`InitOVRManager()`を実行するかどうかの判定をエディタの時は無視します。これはOpenVRサポート前と同じ挙動です。

```diff
diff --git a/Assets/Oculus/VR/Scripts/OVRManager.cs b/Assets/Oculus/VR/Scripts/OVRManager.cs
index bff7d992..4f6f3d45 100644
--- a/Assets/Oculus/VR/Scripts/OVRManager.cs
+++ b/Assets/Oculus/VR/Scripts/OVRManager.cs
@@ -1294,7 +1294,9 @@ public class OVRManager : MonoBehaviour
        private void Awake()
        {
                //If OVRPlugin is initialized on Awake(), or if the device is OpenVR, OVRManager should be initialized right away.
+#if !UNITY_EDITOR
                if (OVRPlugin.initialized || (Settings.enabled && Settings.loadedDeviceName == OPENVR_UNITY_NAME_STR))
+#endif
                {
                        InitOVRManager();
                }
```

# 別の方法

Oculusのフォーラムにも修正方法があり`OVRPlugin.initialized`を反転して`InitOVRManager()`を実行しています。ですがこのプロパティはドキュメントがなく挙動が分からないので上記のようにエディタの時だけ変更した方が安全です。

- https://forums.oculusvr.com/developer/discussion/comment/700778/#Comment_700778
- http://hondasoft.com/2019/06/25/oculus-integration-1-38%E7%99%BB%E5%A0%B4%EF%BC%81/

```diff
diff --git a/Assets/Oculus/VR/Scripts/OVRManager.cs b/Assets/Oculus/VR/Scripts/OVRManager.cs
index bff7d992..30ee8cde 100644
--- a/Assets/Oculus/VR/Scripts/OVRManager.cs
+++ b/Assets/Oculus/VR/Scripts/OVRManager.cs
@@ -1294,7 +1294,7 @@ public class OVRManager : MonoBehaviour
        private void Awake()
        {
                //If OVRPlugin is initialized on Awake(), or if the device is OpenVR, OVRManager should be initialized right away.
-               if (OVRPlugin.initialized || (Settings.enabled && Settings.loadedDeviceName == OPENVR_UNITY_NAME_STR))
+               if (!OVRPlugin.initialized || (Settings.enabled && Settings.loadedDeviceName == OPENVR_UNITY_NAME_STR))
                {
                        InitOVRManager();
                }
```
初心者が django でアプリケーション開発に挑戦

#環境
MacOS Mojave / Chrome / IntelliJ IDEA

djangoはvenv環境内にインストールしているため、ターミナルではvenv環境に入ってから。
IntelliJを使用しているためプロジェクトは「IdeaProjects」というディレクトリの中に作成。

練習用なので適当なディレクトリを作成しておく（django_learninなど）

venv環境へ（環境設定は[こちら](https://qiita.com/pee3/items/8fd5f10a1c62ad542944)を参考）

```
$ source env/bin/activate
```

Djangoのインストールは

```
(env)$ pip install django
```

# Django環境の準備

**プロジェクトを作成**
「プロジェクト」は毎回作っても良いけど、この下の階層に「アプリ」というディレクトリを作成する事になるので学習のためならプロジェクトは一個で良いかもしれない。
（と言いながらこの呪文を覚えてしまうほど、たくさんプロジェクトを作った・・・）

前述した適当なディレクトリに移動した上で

```
(env)$ django-admin startproject sample_pj
```

※sample_pj は好きな名前を入力

ここで

```
command not found: django-admin
```

などのエラーがでる場合は、

1.djangoのインストールができていない
2.venv環境に入っていない（上記）

の2点であることが多いかと。

新しく上記で名付けたプロジェクト名と同名のディレクトリができる

sample_pj
manage.py

このmanage.pyというファイルはこれから嫌でも覚えることに。

**Djangoアプリの作成**

manage.pyが入っているディレクリに移動して

```
(env)$ python manage.py startapp django_app
```
※django_app は好きな名前を入力

python　の部分は ./ でもOKなので

```
(env)$ ./manage.py startapp django_app
```

と書いてもOK。今後出てくる manage.py を利用する際の頭の python という部分も同様。

**作成したアプリは忘れずに登録**
上記のプロジェクトと同名のディレクトリ内にある setting.py を開き アプリを登録する場所へ追記する。

```
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_app', #今回で追加したアプリ
]
```

#モデルの作成
アプリケーションフォルダ内にある models.py はデータベース設計の際に必要だとしたものを定義しておく。

（環境構築のテストなどであればここは飛ばしてもOK）

※開発の手順についてざっくりまとめたものは[こちら](https://qiita.com/pee3/items/466e053e5b54973132de)

models.py を触ったらマイグレーションが必要。

**アプリケーション内にマイグレーションファイルを作成**

```
(env)$ ./manage.py makemigrations django_app
```

アプリディレクトリ内に migrations というファイルができている。

**マイグレーションを実行**

```
(env)$ ./managae.py migrate
```

**テーブルの登録**
admin.py に models.py で作成したモデルを登録

（環境構築のテストなどであればここは飛ばしてもOK）

```python:admin.py
from django.contrib import admin
from .models import AAAA, BBBB, CCCC

admin.site.register(AAA)
admin.site.register(BBB)
admin.site.register(CCC)
```

※AAA や BBB などはmodels.pyで名付けたモデルの名前


#管理者の登録
管理者画面から操作できるようにする

```
(env)$ ./manage.py createsuperuser
```

ここで聞かれる情報は

Username: 管理者名
Email address: メールアドレス
Password: パスワード
Password(Again): パスワード再入力

最初の管理者以外は管理者ページで作成が可能

**サーバーを起動して管理者画面へ**

```
(env)$ ./manage.py runserver
```

[http://localhost:8000/admin/](http://localhost:8000/admin/)

で上記で登録したID / PASSWORD を入力してユーザー登録画面へ入ることができる