TIL

Today I Learned. 知ったこと、学んだことを書いていく

【Java】lombokで自動生成されるsetter(getter)を上書きする

例えば、特定のプロパティのみ、自分で書いたsetterを使いたいときとか

やることは

  • ただ単にsetXxx()を作ればいいだけ

だった

以下、サンプルコード

サンプル

People.java

以下のようなPeopleクラスを作成する

package sample;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class People {
    private String name;
    private int age;

    // @Dataで自動生成されるsetAge()を上書きする
    public void setAge(int age) {
        this.age = age + 100;
    }
}

また、lombokアノテーションは以下の通り

  • @Data: すべてのプロパティに対してsetXxx()getXxx()を生成
  • @NoArgsConstructor: 引数なしのコンストラクタを生成
  • @AllArgsConstructor: 全プロパティを引数に取るコンストラクタを生成

App.java

package sample;

/**
 * Hello world!
 *
 */
public class App
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
       People people = new People("Taro", 11);
       // 自分で定義したsetAge()が呼ばれる
       people.setAge(20);

       System.out.println(people);  // People(name=Taro, age=120)
    }
}

おぉ、しっかりと100足されている!

【GitHub】PullやPushでパスワードを聞かれないように設定する

~/.ssh/id_rsa(秘密鍵)と~/.ssh/id_rsa.pub(公開鍵)を作る

> ssh-keygen -t rsa

~/.ssh/id_rsa~/.ssh/id_rsa.pubが生成される

GitHubに登録する

Settings > SSH and GPG kers > SSH keys > New SSH key~/.ssh/id_rsa.pubの内容を貼り付ける

  • 接続の確認
> ssh -T git@github.com
Hi tamago324! You've successfully authenticated, but GitHub does not provide shell access.

ローカルリポジトリの設定を変更する

GitHubリポジトリClone or downloadUse SSHのテキストをコピーし、以下のコマンドを実行する

> git remote set-url origin xxxxxx

秘密鍵のパスを指定する( ~/.ssh/configの作成)

秘密鍵を以下のように生成した場合

> ssh-keygen -t rsa -f ~/.ssh/id_rsa_github

以下のような~/.ssh/configを作成する(全く同じ記述で作成する)

Host github github.com
    HostName github.com
    IdentityFile ~/.ssh/id_rsa_github
    User git

接続の確認

> ssh -T git@github.com
Hi tamago324! You've successfully authenticated, but GitHub does not provide shell access.

参考文献

【Python】typing.NamedTuple を使う

typing.NamedTuple: 型がついているcollection.namedtupleを定義できる

書き方

from typing import NamedTuple, Optional


class Table(NamedTuple):
    name: str
    alias: str

default値の設定

デフォルト値の設定されていないフィールドの後ろのみ書ける

from typing import NamedTuple


class Table(NamedTuple):
    name: str
    alias: str = 'TBL1'
  • Noneをデフォルト値で設定する場合、Optional[str] = Noneのようにする
from typing import NamedTuple, Optional


class Table(NamedTuple):
    name: str
    alias: Optional[str] = None

参考文献

【Tomcat】localhost:8080/ で 404 になる

問題

EclipseTomcat x Springのプロジェクトを使っているときに、localhost:8080/ が 404 になってしまった

原因

EclipseTomcatを使うときには、Serversというプロジェクトが作成され、その中に設定がある
Servers/server.xmlを見てみると、以下のようになっていた

<Context docBase="yourwebapp" path="/controller" reloadable="false" source="org.eclipse.jst.jee.server:yourwebapp"/></Host>

解決方法

pathcontrollerの部分を削除し、/のみにする

<Context docBase="yourwebapp" path="/" reloadable="false" source="org.eclipse.jst.jee.server:yourwebapp"/></Host>

すると、localhost:8080/でページが表示された!

めでたしめでたし

参考文献

【Vim】gruvbox8でitalicを使わないようにする

問題

カラースキーマlifepillar/vim-gruvbox8 を使っていて、ところどころ、italic(斜体)を使っているところがある。

なんかよくわからないけど、italicの部分が見切れてしまうため、OFFにしたかった

原因

g:gruvbox_italicsg:gruvbox_italicize_strings が設定されていなかった

解決方法

let g:gruvbox_italics = 0
let g:gruvbox_italicize_strings = 0
colorscheme gruvbox8_soft

のように設定する
また、colorschemeより前に設定する必要がある

【MySQL】 TBL2のレコードの値によって、TBL1のレコードをUPDATEする

  • 以下のようなデータを用意
CREATE TABLE table1(id int not null, name varchar (15)); 
CREATE TABLE table2(id int not null, gender char (1));

INSERT INTO table1 VALUES (1, 'takuya');
INSERT INTO table1 VALUES (2, 'taro');
INSERT INTO table1 VALUES (3, 'jiro');
INSERT INTO table1 VALUES (4, 'saburo');
INSERT INTO table1 VALUES (5, 'siro');

insert into table2 values (1, 1);
insert into table2 values (2, 2);
insert into table2 values (3, 1);
insert into table2 values (4, 2);
insert into table2 values (5, 2);
mysql> select * from table1;
+----+--------+
| id | name   |
+----+--------+
|  1 | takuya |
|  2 | taro   |
|  3 | jiro   |
|  4 | saburo |
|  5 | siro   |
+----+--------+
5 rows in set (0.00 sec)

mysql> select * from table2;
+----+--------+
| id | gender |
+----+--------+
|  1 | 1      |
|  2 | 2      |
|  3 | 1      |
|  4 | 2      |
|  5 | 2      |
+----+--------+
5 rows in set (0.00 sec)

複数テーブルを使ったUPDATE文の実行をしてみる

カンマを使う場合

table2.gender = 2のレコードと紐づくtable1のデータの値を更新してみる

update table1
, (select * from table2 where gender = 2) tbl2 
set
  table1.name = 'gender2' 
where
  table1.id = tbl2.id;
  • 結果は以下のようになる
mysql> select table1.id, table1.name, table2.gender from table1 left join table2 on table1.id = table2.id;
+----+---------+--------+
| id | name    | gender |
+----+---------+--------+
|  1 | takuya  | 1      |
|  2 | gender2 | 2      |
|  3 | jiro    | 1      |
|  4 | gender2 | 2      |
|  5 | gender2 | 2      |
+----+---------+--------+
5 rows in set (0.00 sec)

カンマを使わない場合

update table1 
  inner join (select * from table2 where gender = 2) tbl2 
    on table1.id = tbl2.id 
set
  table1.name = 'gender2'

inner joinを使っているところに注意する
もし、left joinにしてしまうと、table1の全レコードがupdateされてしまう

参考文献

【MySQL】MySQLでのBooleanの扱い

Mysqlのboolean型について調べてみた - Qiita の内容を自分の手で確かめてみた

環境

> docker-compose exec mysql mysql --version
mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)

まとめ

  • booleantinyint(1)のどちらともtinyint(1)で CREATE TABLE される
  • true1false0で INSERT される
  • 値の比較は=isで変わる
    • where col = true1のデータ、where col = false0のデータ(想定通り)
    • where col is true0以外のデータ、where col is false0のデータ(想定と違う)

CREATE

booleanとtinyint(1)のテーブルを作成し、全く同じデータを入れてみた

> create table test_boolean (bool_col boolean);
> create table test_tinyint (bool_col tinyint(1));

booleantinyint(1)のどちらともtinyint(1)でカラムが作成される

> show create table test_boolean;
+--------------+--------------------------------------+
| Table        | Create Table                         |
+--------------+--------------------------------------+
| test_boolean | CREATE TABLE `test_boolean` (        |
|              |   `bool_col` tinyint(1) DEFAULT NULL |
|              | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------------+--------------------------------------+

> show create table test_tinyint;
+--------------+--------------------------------------+
| Table        | Create Table                         |
+--------------+--------------------------------------+
| test_tinyint | CREATE TABLE `test_tinyint` (        |
|              |   `bool_col` tinyint(1) DEFAULT NULL |
|              | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------------+--------------------------------------+

INSERT

falseをINSERTすると0

> insert into test_boolean values (false);
> select * from test_boolean;
+----------+
| bool_col |
+----------+
| 0        |
+----------+

trueをINSERTすると1

> truncate test_boolean;
> insert into test_boolean values (true);
> select * from test_boolean;
+----------+
| bool_col |
+----------+
| 1        |
+----------+

WHERE

  • where col = true1のデータ、where col = false0のデータが抽出できる
  • where col is true0以外のデータ、where col is false0のデータが抽出できる
    • これ知ってないとハマりそう。でも、基本、isじゃなくて、=で比較すればいいのかも?

以下のようなデータを用意

> insert into test_tinyint values (false), (true), (1), (0), (100), (-100);
> select * from test_tinyint;
+----------+
| bool_col |
+----------+
| 0        |
| 1        |
| 1        |
| 0        |
| 100      |
| -100     |
+----------+

=を使った抽出

> select * from test_tinyint where bool_col = true;
+----------+
| bool_col |
+----------+
| 1        |
| 1        |
+----------+

> select * from test_tinyint where bool_col = false;
+----------+
| bool_col |
+----------+
| 0        |
| 0        |
+----------+

isを使った抽出

> select * from test_tinyint where bool_col is true;
+----------+
| bool_col |
+----------+
| 1        |
| 1        |
| 100      |
| -100     |
+----------+

> select * from test_tinyint where bool_col is false;
+----------+
| bool_col |
+----------+
| 0        |
| 0        |
+----------+

参考文献