IT技術に関する情報掲載サイト

プログラミングに関することを掲載します。

Dockerを使ってOracle Database 23c Freeをインストールしてみた。

Oracle Databaseも23cからフリーのものがでたみたいなので、Dockerの勉強を兼ねてOracle Database 23cをインストールしてみました。

 

まず、docker pull container-registry.oracle.com/database/free:latestを実行

$docker pull container-registry.oracle.com/database/free:latest
latest: Pulling from database/free
089fdfcd47b7: Pull complete
43c899d88edc: Pull complete
47aa6f1886a1: Pull complete
f8d07bb55995: Pull complete
c31c8c658c1e: Pull complete
b7d28faa08b4: Pull complete
1d0d5c628f6f: Pull complete
db82a695dad3: Pull complete
25a185515793: Pull complete
Digest: sha256:5ac0efa9896962f6e0e91c54e23c03ae8f140cf6ed43ca09ef4354268a942882
Status: Downloaded newer image for container-registry.oracle.com/database/free:latest
container-registry.oracle.com/database/free:latest
$

つぎに、docker imageでcontainer-registry.oracle.com/database/freeがインストールされているか確認し、あれば、docker runで立ち上げる

$ docker run container-registry.oracle.com/database/free
Starting Oracle Net Listener.
Oracle Net Listener started.
Starting Oracle Database instance FREE.
Oracle Database instance FREE started.

The Oracle base remains unchanged with value /opt/oracle
#########################
DATABASE IS READY TO USE!
#########################
The following output is now a tail of the alert.log:
===========================================================
No patches have been applied
===========================================================
2024-02-08T05:56:07.585348+00:00
PDB$SEED(2):Opening pdb with Resource Manager plan: DEFAULT_PLAN
FREEPDB1(3):Autotune of undo retention is turned on.
2024-02-08T05:56:08.887434+00:00
FREEPDB1(3):Opening pdb with Resource Manager plan: DEFAULT_PLAN
Completed: Pluggable database FREEPDB1 opened read write
Completed: ALTER DATABASE OPEN

あとは、docker exec -it {CONTAINER ID} /bin/bash

でコンテナにログインして、sqlplusなので、接続できます。

パスワードは、ホームディレクトリにsetPassword.shってシェルがあるから、

setPassword.sh 変更したいパスワード

と指定して実行するとできます。

 

以下のサイトも参考にしました。

www.oracle.com

Dockerを使ってMac環境でのLAMP環境の作り方

Linuxでのやり方は、たくさんあったのですが、Macでのものがなかったので、メモ程度に設定ファイルを作成しました。

どうもlinuxは、linux/x86_64を指定する必要があるようです

 

docker-compose.yml

 

version: '3.3'

services:
  mysql:
    # for M1 Mac
    platform: linux/x86_64
    image: mysql:5.7-oracle
    volumes:
      - ./docker/data:/var/lib/mysql
      - ./docker/mysql/sql:/docker-entrypoint-initdb.d
      - ./docker/mysql/conf.d:/etc/mysql/conf.d
    ports:
      - 33060:3306
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=craftsports-japan_com_db2
      - MYSQL_USER=user
      - MYSQL_PASSWORD=user
      - TZ=Asia/Tokyo
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --innodb-buffer-pool-size=64M --explicit_defaults_for_timestamp=1
    tty: true

  php:
    build: ./docker/
    volumes:
      - ./docker/php.ini:/usr/local/etc/php/php.ini
      - ./docker/logs:/var/log/httpd
      - ./html:/var/www/html
    ports:
      - 8080:80

  phpmyadmin:
    image: phpmyadmin:5.2
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
      - UPLOAD_LIMIT=256M
    ports:
      - 4040:80
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions

あと、apacheの設定ファイルも

apache.txt

 

#
# The following directives define some format nicknames for use with
# a CustomLog directive.
#
# These deviate from the Common Log Format definitions in that they use %O
# (the actual bytes sent including headers) instead of %b (the size of the
# requested file), because the latter makes it impossible to detect partial
# requests.
#
# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended.
# Use mod_remoteip instead.
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.

# Include generic snippets of statements
IncludeOptional conf-enabled/*.conf

# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

ちなみにここのサイトに記載されている内容を参考にさせていただきました。ありがとうございます。

zenn.dev

 

Laravel sailでmigrateを実行する方法

知っていれば、簡単ですが、知らないと結構ハマってしまうので、ここに記載しときます。

 

通常は、

php artisan migrate

で、実行されるのですが、

Laravel sailをつかってサイトを起動させている場合、

sailを起動させといて、

./vendor/bin/sail artisan migrate

としないといけない。

 

意外にはまってしまうので、要注意です。

Dockerで再度コンテナを再構築(リビルド)する方法

どこかのサイトのdocker-compose.ymlを参考にして構築してあとに例えば、PHPだけ、バージョンを変えて再構築したい場合に便利な手順です。--no-cacheをつければいいんですが、忘れそうなので、メモ程度に記事にしました。

 

# コンテナを削除
docker-compose rm <コンテナ名やコンテナID>

# ちゃんと指定したコンテナがなくなっているか確認
docker-compose ps -a 

# 個別のコンテナを作り直し
docker-compose build --no-cache <service_name>

# 動作確認
docker-compose up -d

となります。

dockerで立ち上げたコンテナにログインする方法

初歩的なことですが、よく忘れてしまうので、備忘録として、記事にします。

 

 

  1. まず、ログインしたいコンテナの名前を確認

    docker ps

    NAMESの列に記載されているのが、コンテナ名です。

  2. 以下のコマンドで実行

    docker exec -it [コンテナ名] /bin/bash

    root以外でログインする場合は、以下でユーザ名を指定してください

    docker exec -it [コンテナ名] --user [ユーザー名または UID] /bin/bash

     



PHPのnumber_format関数が自動で、小数点以下を四捨五入してしまう

長くPHPerをしているのですが、PHPのnumber_format関数が自動で、小数点以下を四捨五入してしまうという不具合?をいまさらですが、知ってしまいました。関数の引数で指定することができないので、対策は以下をしました。

 

$value = 1234.5678;
$decimals = 2; // 小数点以下の桁数

// 切り捨ててからフォーマット
$formatted_value = number_format(floor($value * pow(10, $decimals)) / pow(10, $decimals), $decimals);

echo $formatted_value; // "1234.56"

一回桁をずらして、切捨ててもとに戻すっていう手法となります。

 

 

WP_Queryで「タイトルもしくはカスタムフィールドに一致したら」という条件で検索する方法

色々なやり方があるようですが、ちょっと強引にやってみました。

 

function.php

add_filter( 'posts_where', function ( $where ) use ( $title ) {
global $wpdb;
$pattern = '/\( mt1\.meta_key = \'_title\' AND mt1\.meta_value = \'(.+?)\' \)/u';
$replacement = '(wp_posts.post_title LIKE \'%$1%\')';
$where = preg_replace($pattern, $replacement, $where);
 
return $where;
} );

 

archive.php

meta_queryの部分を抜粋

$keyword_meta_query=array(
'relation' => 'OR',
array(
'key' => 'access',
'value' => $_GET['keyword'],
'compare' => 'LIKE',
),
array(
'key' => 'address',
'value' => $_GET['keyword'],
'compare' => 'LIKE',
),
array(
'key' => 'zip',
'value' => $_GET['keyword'],
'compare' => 'LIKE',
),
array(
'key' => 'tel',
'value' => $_GET['keyword'],
'compare' => 'LIKE',
),
array(
'key' => 'fax',
'value' => $_GET['keyword'],
'compare' => 'LIKE',
),
array( // タイトルを検索対象にするため function.phpでつかっている
'key' => '_title',
'value' => $_GET['keyword'],
),
);

 

ダミーのメタキーワードの_titleをつくって、post_whereのフィルターで、その部分を置換してしまう方法です。

echo $the_query->request;

SQLをみれるので、内容をみながらやるのもいいかもしれません。

他にも方法あるのですが、参考まで。