Qiitaから記事を移行したいなーと思います

Qiitaはカスタマイズできないからね。ちまちまやっていこうと思います。前々からQiitaには要望送ってたんだけどね、Qiitaの目指す先はそこではないのだろう。俺がQiitaの中の人なら全然違った方向を提案するが。

UbuntuのApache2の起動・停止・再起動・自動起動設定・自動起動設定の無効化まとめ

再起動

sudo systemctl restart apache2

起動

sudo systemctl start apache2

停止

sudo systemctl stop apache2

自動起動

sudo systemctl enable apache2

自動起動の無効化

sudo systemctl disable apache2

Ubuntuが私のメインマシンなんですけど、最初から入っているのかPHPをインストールした時か知らないうちにApacheが立ち上がっている事が多く、apacheとかhttpdとかで停止とかしようとしちゃうんですが、apache2なんですよね。いつも迷う。

80番ポートってローカルで何らかのアプリケーションを立ち上げて/etc/hostsとかでホストを上書きしてテストする時とかに使います。最近80番ポートでこのような事を行う時、Dockerコンテナを立ち上げる事がほとんどなのでApacheが立ち上がっていると、80番ポートが使えなくなっちゃいます。PHPの開発でもdocker-composeで立ち上げたコンテナ上にファイルをマウントして開発する方が環境汚染がないし、環境も整理されて良いのです。

docker-composeでネットワークインターフェースを指定する

Dockerでは--netというネットワークインターフェースを指定する機能がある。docker-composeの場合ではnetwork_modeで指定することができる。

version: '3.4'
services:
app:
network_mode: host
build: ./
ports:
- 8080:80
volumes:
- ./web:/www/

ただしビルドを実行する場合には適用されない。ビルドする時に使用するネットワークを指定するにはbuildnetworkを使って指定する

version: '3.4'
services:
app:
build:
network: host
context: ./
ports:
- 8080:80
volumes:
- ./web:/www/

参考

Dockerの –net でホストのネットワークインターフェースを利用する

下記のようにしてホストのネットワークで接続できる。デフォルトのbridgeでの挙動がおかしい時にhostを使ったり、ホスト側の/etc/hostsに書いた値を利用してほしい時に活躍する。

docker run --net=host --rm -ti hash bash

ここで使えるインターフェースはhostだけではなく、下記コマンドですべて確認することができる。自分が立ち上げている他のコンテナのネットワークを利用することもできる。

$ docker network ls
NETWORK ID          NAME                 DRIVER              SCOPE
7687a566c3f3        bridge               bridge              local
933591f4adda        test_project         bridge              local
ad0959bbe15a        host                 host                local
69e0cbb25b1a        none                 null                local

参考

https://deeeet.com/writing/2014/05/11/docker-host-networking/

Kotlinで文字列の日時をタイムスタンプに変換する

下記のようにして通す事ができる。スレッドセーフではないので、フォーマッタインスタンスは毎度生成するか、どうしてもフォーマッタを一度しか定義したくない場合は、スレッドセーフになるように自分でロックする。

val dateFormatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val date = dateFormatter.parse("2019-03-06 13:28:00")
println(date.time)

参考

https://saiya-moebius.hatenablog.com/entry/2014/08/17/165322

Gitのログで削除されたファイルリストを出力する方法

猛烈にハラヘッタ。疲れた。ストレスが原因だな。

git logで削除したファイルだけを表示することができる。

git log --diff-filter=D --summary

結果はこんな感じ

`commit 0000000000000000000000000000000000000000
Author: admin <admin@example.com>
Date:   Mon Mar 4 10:00:00 2019 +0900
deleted unko files
delete mode 100644 hoge/Makefile
delete mode 100644 hoge/Dockerfile
commit 1111111111111111111111111111111111111111
Author: admin <admin@example.com>
Date:   Thu Jun 14 11:11:11 2018 +0900
deleted cargo files
delete mode 100644 hoge/Cargo.toml
delete mode 100644 hoge/Cargo.lock

主に私が使うケースは、システムの大改修をした時に、いらんやろと思いまとめて消したファイルがやっぱ必要だったみたいな時に重宝している。

https://stackoverflow.com/questions/6017987/how-can-i-list-all-the-deleted-files-in-a-git-repository

RustでPostgreSQLに接続する

前回はMySQLに接続したので今回はPostgreSQLに接続してみよう。Rustはコンパイルを通すのが結構キツいんで、こうしてコンパイルが通るコードを公開し続けることで特異点に到達できればと。

use r2d2;
use r2d2_postgres;
use postgres;
#[derive(Debug)]
struct Hoge {
hoge: String
}
fn main() {
let name = "name";
let pass = "pass";
let db_url = "postgres://user:pass@localhost:5432/name";
let manager = r2d2_postgres::PostgresConnectionManager::new(db_url, r2d2_postgres::TlsMode::None).unwrap();
let pool: Arc<r2d2::Pool<r2d2_postgres::PostgresConnectionManager>> = Arc::new(r2d2::Pool::new(manager).unwrap());
let conn =  pool.get().unwrap();
let sql = r"SELECT hoge FROM user WHERE name = $1 AND pass = $2";
let stmt = conn.prepare_cached(sql).unwrap();
let rows = stmt.query(&[&name, &pass]).unwrap();
let length = &rows.len().clone();
if *length == 0 {
dbg!("dame-");
} else {
dbg!(Hoge{hoge: rows.get(0).get("hoge")});
}
}

こんな感じで接続できました。結構仰々しいコードです。Poolはとりあえずr2d2ってのを使ってみました。まだ手探りなのでどんなプールを使うのがベストなのかは謎。個人的にusizeってのが目新しかった。JSとかだとintで返るじゃないですか。

参考