AWS Tips

AWS 終了保護機能が無効になっているEC2インスタンス一覧を表示

以下のコマンドで、終了保護されていないEC2インスタンス一覧が表示されます。 xargsコマンドを利用して、引数を次のコマンドに引き渡します。

# aws ec2 describe-instances | jq -r  '.Reservations[].Instances[].InstanceId' | xargs -L 1 aws ec2 describe-instance-attribute --attribute disableApiTermination  --instance-id  | jq -r 'select(.DisableApiTermination.Value == false)' |jq -r '.InstanceId'

SQL基礎

table基本

tableの作成

idをPrimaryとして設定しています。また、auto_incrementで自動でカウントアップしていきます。

create table member_table2 (id int primary key auto_increment, name varchar(500),  age int);

tableの定義一覧

テーブルの定義一覧を表示。mysqlの構文かも。

# show columns from member_table2;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(500) | YES  |     | NULL    |                |
| age   | int          | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

tableのデータ追加

insert into items values (1, 'apple', 'APPLE', 100, 10);

tableの更新(Update)

書式 update テーブル名 set age=200 where id=変更したいID;

 update member_table2 set age=200 where id=2;

部分一致検索 Like

文字列の部分検索ができます。 LIKEを利用すると%を利用することができます。 %はワイルドカードと同じ意味になります。 以下の場合、キーにbの文字列が含まれているものを探します。

SELECT * FROM table名 WHERE キー like '%b%'

データの削除

delete from member_table where id = 2;

データの並び替え ORDER BY

データの並び替えには、ORDER BYを利用します。 以下の場合、idというキーを降順で並び替えます。

 SELECT * FROM テーブル名 ORDER BY name ASC;

ASC(Ascending) :  大きい方から小さい方
DESC (DAcending):小さい方から大きい方。

データの集計(SUM, MAX, MIN, COUNT)

以下のようなデータを用意します。

+----+------------+---------------+-------+-------+----------+
| id | item_name  | itemname_kana | price | count | genre_id |
+----+------------+---------------+-------+-------+----------+
|  1 | apple      | APPLE         |   150 |    50 |        1 |
|  2 | carrot     | CARROT        |   150 |    30 |        0 |
|  3 | orange     | ORANGE        |   100 |    10 |        0 |
|  4 | strawberry | STRAWBERRY    |   100 |    10 |        0 |
|  5 | lettuce    | LETTUCE       |   200 |     3 |        1 |
| 50 | cucumber   | CUCUMBER      |    20 |     4 |        1 |
+----+------------+---------------+-------+-------+----------+
データの集計 sum

SELECT sum(集計したいフィールド名) from テーブル名称; 以下の場合、genre_idが1のフィールドの合計を集計します。

select sum(count) from items where genre_id=1;
+------------+
| sum(count) |
+------------+
|        57 |
+------------+
データの最大値、最小値の選定max, min

max. min関数を利用して、フィールドの最大値、最小値を選出できます。

 select max(price) from items ;
 select min(price) from items ;
データの個数のカウント

count関数を利用して対象のフィールドの個数をカウントすることができます。

select * from items;

table定義変更

tableカラム追加

以下は、itemsというテーブルに、カラムgenre_idをint型で追加しています。

 alter table items add genre_id int

tableカラム追加

以下は、itemsというテーブルから、カラムgenre_idを削除しています。

ALTER TABLE items DROP genre_id;

リレーション(テーブルの結合)

以下のように、genre_idを外部キーとした2種類のテーブルを想定します。

itemsテーブル
+----+------------+---------------+-------+-------+----------+
| id | item_name  | itemname_kana | price | count | genre_id |
+----+------------+---------------+-------+-------+----------+
|  1 | apple      | APPLE         |   150 |    50 |        1 |
|  2 | carrot     | CARROT        |   150 |    30 |        0 |
|  3 | orange     | ORANGE        |   100 |    10 |        0 |
|  4 | strawberry | STRAWBERRY    |   100 |    10 |        0 |
|  5 | lettuce    | LETTUCE       |   200 |     3 |        1 |
| 50 | cucumber   | CUCUMBER      |    20 |     4 |        1 |
+----+------------+---------------+-------+-------+----------+

genreテーブル
+----------+------------+
| genre_id | genre_name |
+----------+------------+
|        0 | fruit      |
|        1 | food       |
+----------+------------+

上記の2つのテーブルをgenre_idを外部キーとして、結合します。 書式 SELECT [表示するフィールド] FROM [テーブル名] WHERE [結合するキー]

select items.*, genre_master.* from items, genre_master where items.genre_id=genre_master.genre_id;
+----+------------+---------------+-------+-------+----------+----------+------------+
| id | item_name  | itemname_kana | price | count | genre_id | genre_id | genre_name |
+----+------------+---------------+-------+-------+----------+----------+------------+
|  1 | apple      | APPLE         |   150 |    50 |        1 |        1 | food       |
|  2 | carrot     | CARROT        |   150 |    30 |        0 |        0 | fruit      |
|  3 | orange     | ORANGE        |   100 |    10 |        0 |        0 | fruit      |
|  4 | strawberry | STRAWBERRY    |   100 |    10 |        0 |        0 | fruit      |
|  5 | lettuce    | LETTUCE       |   200 |     3 |        1 |        1 | food       |
| 50 | cucumber   | CUCUMBER      |    20 |     4 |        1 |        1 | food       |
+----+------------+---------------+-------+-------+----------+----------+------------+

外部キー操作

外部キー FOREIGN KEY/REFERENCE

  • 以下のような部署テーブルを準備します。
 department_id |    department_name
---------------+------------------------
             1 | development_department
             2 | sales_department
             3 | accounting_department

*以下のコマンドで、従業員テーブルを準備します。この時、 department_idを外部キーとして、部署テーブルと結びつけます。
FOREIGN KEY(department_id) で外部キーを指定します。この場合department_idです。
また、REFERENCES departments(department_id))で、参照するテーブルとフィールドを指定します。この場合、”department”テーブルの"department_id"を参照することを意味します。

CREATE TABLE employees(id int PRIMARY KEY NOT NULL, department_id int , name varchar(256), FOREIGN KEY(department_id) REFERENCES departments(department_id));

データを入力して、最終的には、以下のようになります。 department_idで二つのテーブルが紐づけられます。

 select * from employees ;
 id | department_id |  name
----+---------------+--------
  1 |             1 | Yamada
  2 |             1 | Jack
  3 |             3 | Lee
  4 |             2 | Rick  

 select * from departments;
 department_id |    department_name
---------------+------------------------
             1 | development_department
             2 | sales_department
             3 | accounting_department

INNER JOIN

以下のような従業員・部署テーブルを考えます。 外部キーのdepartment_idで紐づけられています。

 select * from employees ;
 id | department_id |  name
----+---------------+--------
  1 |             1 | Yamada
  2 |             1 | Jack
  3 |             3 | Lee
  4 |             2 | Rick  

 select * from departments;
 department_id |    department_name
---------------+------------------------
             1 | development_department
             2 | sales_department
             3 | accounting_department

外部キーを利用して、2つのテーブルを紐づけたうえで、id, name, department_nameの順で表示します。 「SELECT ~ FROM employees」で表示したいフィールドを記載します。 e.はemployeesテーブル、d. はdepartmentテーブルの略称を意味します。 「INNER JOIN departmens ON e.department_id = d.department_id 」で紐づけたいテーブル(department)を指定し、ONの後で、紐づけのためのフィールドを記載します。

SELECT e.id, e.name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id;
 id |  name  |    department_name
----+--------+------------------------
  1 | Yamada | development_department
  2 | Jack   | development_department
  3 | Lee    | accounting_department
  4 | Rick   | sales_department

mysqlのdockerでの構築方法

以下のコマンドでmysqlのコンテナをデプロイすることが可能です。

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql

docker execコマンドで、コンテナにアクセスし、mysqlコマンドで、DBにアクセスできます。

$ sudo docker exec -it  66817df58407  /bin/sh
$mysql -u root -p

Jupyter notebook

Install方法

 通常のjupyter notebook

以下はdocker コンテナを用いたInstall方法となります。 以下は、コンテナ内の8888ポートを、外部に10000ポートで公開しています。 ブラウザから、127.0.0.1:10000でJupyter notebookにアクセスできます。

sudo docker run -p 10000:8888 --name jupyter jupyter/scipy-notebook

 tensorflowが入ったjupyter notebook

docker pull tensorflow/tensorflow:latest  # Download latest stable image
docker run -it -p 8888:8888 tensorflow/tensorflow:latest-jupyter  # Start Jupyter server 

利用方法

モジュールをIntallするとき

外部からモジュールをInstallする際は、以下のようにコマンドの前に!を記述する。

!pip install  tensorflow 

pipでモジュールをInstallする場合のproxyの回避方法

以下のように--proxyで回避できます。

!pip install --proxy="http://proxy.com:8080" tensorflow 

スクリプト内でのproxyの回避方法

以下のようにスクリプト内で、Proxy設定をすることで、回避できます。。

import os
os.environ["http_proxy"] = "http://proxygate2.nic.nec.co.jp:8080"
os.environ["https_proxy"] = "http://proxygate2.nic.nec.co.jp:8080"

スクリプト内でSSL のエラーが出る場合

SSLのCertificateの認証をOffにします。

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

Typescript 文法基礎

連想配列

通常の配列を拡張したもの。配列のIndexを数字の代わりに、任意の型として定義できます。 ただし、通常の配列とことなり、順序保証はされないので、注意が必要です。

連想配列基本系

以下の場合、Indexも要素もstringで定義しています。

let Fluits = {"A": "apple", "B": "orange"}; //初期化
console.log(Fluits["A"]); //indexを指定して、アクセスを行う。

#apple

要素のKey一覧を参照する場合

Object.keys()を利用することで、要素のKey一覧を参照できます。

let Fruits = {"A": "apple", "B": "orange"};
console.log(Object.keys(Fruits));
#[ 'A', 'B' ]

連想配列のサイズを確認する

let Fruits = {"A": "apple", "B": "orange"};
console.log(Object.keys(Fruits).length);
# 2

ループでアクセスする場合

for(let i in Fruits){  //要素へのアクセス
   console.log(i , Fruits[i]);
}

#A apple
#B orange

Indexや要素を明示的に指定したい場合。

{[index: Indexの型]: 要素の型} 以下の場合は、indexがstring, 要素がnumberで連想配列を生成しています。

let Foods: {[index: string]: number} = {"A": 1, "B": 2};

for(let i in Foods){  //要素へのアクセス
   console.log(i , Foods[i]);
}

#A 1
#B 2

要素を追加/削除する場合

任意のIndexを指定して、要素を追加することができます。

console.log(Foods);    //{ A: 1, B: 2 }
Foods['C'] = 5;       //Index Cで、要素5の連想配列を追加。

console.log(Foods);    //{ A: 1, B: 2, C: 5 }
console.log(Foods);    //{ A: 1, B: 2 }
delete Foods['A'];       //Index Aの連想配列を削除

console.log(Foods);    //{ B: 2, C: 5 }

Keycloak

Realm

オブジェクトを管理する領域です。Master Realmとその他のRealmがあります。 通常は、その他のRealmに必要なRealmを作成して利用します。

Realmを分けることで、そのRealmに紐づくUser等も分けて管理することができます。 例えば、部署ごとにRealmを分割して、管理するような利用方法があります。

UserとRealm

Realm内に必要なUserを作成します。

FormControl リアクティブフォーム (Angular)

リアクティブフォームは、時間とともに値が変化するフォーム入力を処理するためのモデル駆動型アプローチを提供します。 以下にサンプルコードを記載します。

  • app.components.ts
import {Component, PipeTransform} from '@angular/core';
import { FormControl} from "@angular/forms";

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  text1 = new FormControl(); //Formを取り扱うFormControlをnewする。
  s: string ='';

  ngOnInit(){
    this.text1.valueChanges     //valueChangeは、Formが変更するたびに検知するObservableのmethod
      .subscribe(a => {console.log(a);  //Observableであるために、subscribeで、入力値を取得する。
      this.s = a;
      })
  }
}
  • app.component.html
<input [formControl]="text1" type="text">
<div>{{s}}</div>

以下のようなリアクティブなフォームが表示されます。

HTML・CSS

HTML

HTML属性/プロパティ

HTML属性は、タグに付属される文字列です。付加的な情報を追加します。 以下の場合、classがHTMLのClass属性です。

<div class="testclass">ABCD</div>

ただ、Angularの場合、以下のような構文のhref属性を、hrefプロパティと呼ぶ場合があるので、注意が必要です。

<a [href]="url">Sample </a>
属性とプロパティの違い

属性は、要素の初期値を表すのに対して、プロパティは現在値を示します。

以下のような例の場合、valueプロパティは、現在値を返しますが、Value属性は、初期値を返します。

<input id="txt" type="text" value="sample">

txt.value='test';
console.log(txt.value)    // foo
console.log(txt.getAttribute('value))  //sample
HTMLの要素

HTMLの要素は、タグと同じ意味 以下の場合、がHTMLの要素となる。

<a href="http://sample.com">Sample </a>