20201118のMySQLに関する記事は8件です。

商品マスタの全ての商品を持つ店舗を取得する

以下のテーブルがある

select * from items;
+--------------+
| item         |
+--------------+
| ビール       |
| 紙オムツ     |
| 自転車       |
+--------------+
select * from shopitems;
+--------+--------------+
| shop   | item         |
+--------+--------------+
| 仙台   | カーテン     |
| 仙台   | ビール       |
| 仙台   | 紙オムツ     |
| 仙台   | 自転車       |
| 大阪   | テレビ       |
| 大阪   | 紙オムツ     |
| 大阪   | 自転車       |
| 東京   | ビール       |
| 東京   | 紙オムツ     |
| 東京   | 自転車       |
+--------+--------------+

shopitemsテーブルでshopテーブルの全てのitemを持つshopを取得する。(仙台、東京)

select
si.shop
from
shopitems si
,items i
where
si.item = i.item
group by
si.shop
having
count(si.item) = (
    select
    count(item)
    from
    items
);

+--------+
| shop   |
+--------+
| 仙台   |
| 東京   |
+--------+

仙台にはitemsテーブルにないカーテンもある状態。
仙台を除く場合は以下。

select
si.shop
from
shopitems si
left outer join
items i
on si.item = i.item
group by
si.shop
having
count(si.item) =
(
    select
    count(*)
    from
    items
)
and count(i.item) = 
(
    select
    count(*)
    from
    items
);

こちらを参考にさせていただきました。
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベースクライアントツールから多段SSHでデータベースに接続したい

やりたいこと

image.png

こんな感じの踏み台が複数ある多段のSSHでデータベースに接続しに行く構成で、
手元のWindows 10クライアントにインストールしたデータベースクライアントツール(Oracle SQL DeveloperとかMySQL Workbench)から直接DBを見に行きたい。

SSHポートフォワーディング

データベースクライアントツールからは一段までしか踏み台ができないため、SSHポートフォワーディングを実行して、ローカルクライアントのポートをデータベースに間接的に接続します。

便宜的に各サーバの接続情報を定義します。

ホスト IPアドレス/ドメイン ポート
EC2(Bastion) AAA.AAA.AAA.10 22
EC2(Web/AP) BBB.BBB.BBB.11 22
RDS(Oracle) oracle.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com 1521
RDS(MySQL) mysql.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com 3306

ユーザーディレクトリ直下に.sshフォルダを作成。
中にポートフォワードの設定ファイルを作成します。

.ssh\config
Host bastion
  hostname AAA.AAA.AAA.10
  port 22
  user ec2-user
  IdentityFile C:\Users\hoge\.ssh\bastion.pem

Host webap/oracle
  hostname BBB.BBB.BBB.11
  port 22
  user ec2-user
  IdentityFile C:\Users\hoge\.ssh\webap.pem
  ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe bastion -W %h:%p
  GatewayPorts   yes
  LocalForward   51521   oracle.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:1521

Host webap/mysql
  hostname BBB.BBB.BBB.11
  port 22
  user ec2-user
  IdentityFile C:\Users\hoge\.ssh\webap.pem
  ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe bastion -W %h:%p
  GatewayPorts   yes
  LocalForward   53306   mysql.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306

パスワード認証の時はIdentityFileの行は指定しなくて大丈夫です。

ssh webap/oraclessh webap/mysqlでポートフォワーディングした先のWeb/APサーバーにSSH接続が成功すればひとまずOK。

>ssh webap/oracle
The authenticity of host 'BBB.BBB.BBB.11 (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'BBB.BBB.BBB.11' (ECDSA) to the list of known hosts.
Last login: Wed Nov 18 20:13:03 2020 from ip-BBB-BBB-BBB-11.ap-northeast-1.compute.internal
       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[ec2-user@ ~]$

上記のコマンドでデータベースへの経路を確立していないとクライアントツールから接続できないので、使うときはターミナルから事前に接続して開きっぱなしにしておきましょう。

クライアントツールからデータベースに接続

ポートフォワーディングしたローカルポートから接続します。

Oracle SQL Developer

.png

MySQL Workbench

image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Raspberry Pi4(Ubuntu server20.04)でDockerを動かす勘所

初めに

 ここに書いたのは、あくまでも2020年11月28日現在の話。Raspberry Pi上のDocker環境は激しく変わる。

 Raspberry Pi OSの64bitはまだβ版。しかし64bitしかサポートしないアプリが増えているのでUbuntuを使う。

dockerは公式の最新を使う

 ディストリビューションからインストールされるバージョンは大抵古いので、Docker公式のレポジトリを登録して使う。

 https://docs.docker.com/engine/install/ubuntu/

$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
   "deb [arch=arm64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

docker-compseを入れる

 docker-compseは、公式からARM版バイナリが公開されていません。自力でコンパイル pip3でインストール。

$ sudo apt-get install libffi-dev libssl-dev
$ sudo apt-get install python3 python3-pip python3-dev
$ sudo pip3 install docker-compose
  • Python3はデフォルトでインストールされているかも

MySQL

  • NG(イメージがダウンロード出来ない)
$ docker pull mysql
  • OK
$ docker pull mysql/mysql-server

docker-compose.ymlで image:mysqlと書いてある部分は、mysql/mysql-serverに置き換える(挙動はあまりかわらない)

  • 両者の違いは前者はDocker公式(debian base)で、後者がOracle公式(Oracle Linux base)みたい。

phpmyadmin

  • 動かなっかった AMD64版を動かそうとしていたみたい。
$ docker run phpmyadmin/phpmyadmin

exec user process caused "exec format error" dockerエラーがでてコケた。

  • 動いた
$ docker run arm64v8/phpmyadmin

jwilder/nginx-proxy

 これも動かない。
 Dockerfileを見ると同梱するツールがamd64版をハードコードされていた。一緒に入れているツールのarm64版をコンパイルする必要がありそうなので取りあえずパス。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Djangoでフォロー機能を実装する

前段

SNS系アプリにほぼ必須のフォロー機能をDjangoで実装しました。
ライブラリ不使用の自前実装になります。
各自用途や要件に合わせてカスタマイズしてください。

開発環境

  • Django
  • Python 3.8.5
  • MySQL
  • Visual Studio Code

※SQLite3でもほぼコード変更なしで書けます。

フォロー機能の具体的な要件

  • フォローすることができる/解除もできる
  • 自分自身をフォローすることはできない
  • フォロー数、フォロワー数を確認できる

フォロワーの一覧表示などはここでは省きます。
必要最小限の機能要件を実装します。

テーブル設計

テーブルを1つだけ作成して済ましてしまう方法もありますが、個人的にSQL文が冗長になったり、テーブル管理がしにくい印象を持ったので今回は2つ用意します。

follow_relationテーブル

データ 格納する情報 データ型
user_id フォローする側のユーザーID UUID
followed_id フォローされる側のユーザーID UUID

follow_countテーブル

データ 格納する情報 データ型
user_id ユーザーID UUID
follow フォローしている数 INT
followed フォローされている数 INT

follow_relationテーブルは、ユーザー間のフォロー状態の管理、follow_countテーブルはユーザーのフォロー数、フォロワー数の管理をしています。

views.pyの編集

テーブルができたらさっそくフォロー機能を実装していきましょう。
フォロー機能のおおまかな流れは以下のようになります。

ページのリクエスト
↓
followd_status関数にてフォロー状態を確認&表示
↓
フォローボタンを押す
↓
follows関数がフォロー状態に応じて処理
↓
元のページにリダイレクト

では以下コードになります。

followed_status関数
@login_required
def followed_status(request, accesskey):
    # 省略
    # 各自必要なパラメータを取得してください

    # データベースへの接続
    connection = MySQLdb.connect(
    host='localhost',
    user='***',
    passwd='***',
    db='***',
    charset="utf8"
    )  

    # カーソルの取得
    cursor = connection.cursor() 

    # クエリのセット
    follow_relation = "SELECT COUNT(*) FROM follow_relation where user_id = UUID_TO_BIN(%s) and followed_id = UUID_TO_BIN(%s);"

    # クエリの実行
    # user_id、followed_idは各自で取得
    cursor.execute(follow_relation, (user_id, followed_id))
    row_follow = cursor.fetchone()
    follows = row_follow[0]

    # ログインユーザーとページユーザーが同一人物か判定
    # 同一人物ならフォローできないようにします
    if followed_id == user_id:
        followed_status_code = 1
    else:
        followed_status_code = 2

    # もしfollowsが0より大きかったらTrue
    # followsが0だったらFalseを返す
    followed = False
    if follows > 0 :
        followed = True

    return followed_status_code, followed

必要なパラメータは各自別テーブルから引き出してください。
今回必要なのはフォローする側とされる側のIDのみです。
user_idがフォローする側、followed_idがフォローされる側です。

  • ユーザー同士のIDを照合します

ステータスコードを付与して同一人物か判別します。

followed_status_code = 1なら自分自身(フォローできない)
followed_status_code = 2なら他人同士(フォローできる)

になります。

  • フォロー状態を確認します

TrueとFalseでフォロー状態を確認します。

Falseならまだフォローしていない
Trueなら既にフォローしている

になります。
では、次にfollows関数を見ていきます。

follows関数
@login_required
def followes(request, accesskey):
    # 省略
    # 各自必要なパラメータを取得してください

    # データベースへの接続
    connection = MySQLdb.connect(
    host='localhost',
    user='***',
    passwd='***',
    db='***',
    charset="utf8"
    )  

    # カーソルの取得
    cursor = connection.cursor()

    # 共通クエリをセットしてください
    # ここで必要な情報を取得しておきます

    # 自分自身はフォローできないようにする
    if user_id == followed_id:
        followed = False
        # セッションにフォロー状態を保存します
        request.session['page_followed_status'] = followed
    else:
        if followed == False:
            # フォローするときの処理になります
            # クエリのセット
            # 新規フォロー関係の挿入
            follow_reation = "INSERT INTO follow_relation (user_id, followed_id) values(UUID_TO_BIN(%s), UUID_TO_BIN(%s));"

            # フォローする側ユーザーのフォロー数を1つ増やす
            follow_update = "UPDATE follow_count SET follow = follow + 1 where user_id=UUID_TO_BIN(%s);"  

            # フォローされる側ユーザーのフォロワー数を1つ増やす
            followed_update = "UPDATE follow_count SET followed = followed + 1 where user_id=UUID_TO_BIN(%s);"

            # クエリの実行
            cursor.execute(follow_relation, (user_id, followed_id))

            cursor.execute(follow_update, (user_id, ))

            cursor.execute(followed_update, (followed_id, ))

            # 接続を終了する
            cursor.close()
            connection.commit()
            connection.close() 

            # フォローした状態にする
            followed = True
            request.session['page_followed_status'] = followed

        else:
            # フォローを外すときの処理になります
            # クエリのセット
            # フォロー関係の削除
            follow_relation = "DELETE FROM follow_relation where user_id=UUID_TO_BIN(%s) and followed_id = UUID_TO_BIN(%s);"

            # フォローを外す側ユーザーのフォロー数を1つ減らす
            follow_update = "UPDATE follow_count SET follow = follow - 1 where user_id=UUID_TO_BIN(%s);"

            # フォローを外される側ページユーザーのフォロワー数を1つ減らす
            followed_update = "UPDATE follow_count SET followed = followed - 1 where user_id=UUID_TO_BIN(%s);"

            # クエリの実行
            cursor.execute(sql_followrelation_delete, (user_id, followed_id))

            cursor.execute(sql_follow_update, (user_id, ))

            cursor.execute(sql_followed_update, (followed_id, ))

            # 接続を終了する
            cursor.close()
            connection.commit()
            connection.close() 

            # フォローしていない状態にする
            followed = False
            request.session['page_followed_status'] = followed

    return redirect('元のページ', accesskey)

こちらはif文で分岐させてフォローするorフォロー解除の実際の処理をおこなっています。そして最後にフォローの状態を切り替えています。元のページにリダイレクトして終了です。(今回はAjaxなどを使用しないためページ遷移が生じています)

最後に表示用のviewを編集します。

result関数
@login_required
def result(request, accesskey):

    # 省略

    # フォローの状態を把握する
    status = followed_status(request, accesskey)
    followed_status_code = status[0]
    followed = status[1]
    # フォローの状態をセッションに保存(一時的)
    request.session['page_followed_status'] = followed

    params = {
        # 省略

        'page_followed_status': followed,
        'page_followed_status_code': followed_status_code,
    }
    return render(request, 'result.html', params)

該当箇所のみ記載しています。
followed_status関数を呼び出してフォロー状態を確認しています。
(followed_status関数では、ステータスコードとフォロー状態が返されます。)
そしてセッションに一時的に保存してます。

urls.pyの編集

urls.py
urlpatterns = [
    # 省略
    path('元のページ', views.pages, name='各自で設定'),
    path('元のページ/follow/', views.follows, name="follows"),
    # 省略
]

テンプレートの編集

最後にテンプレートです。

result.html
            <!-- フォローボタンを追記 -->
            {% if page_followed_status_code is 2 %}
                {% if page_followed_status is False %}
                <p><a href="{% url 'follows' page_accesskey %}">フォローする</a></p>
                {% else %}
                <p><a href="{% url 'follows' page_accesskey %}">フォローをやめる</a></p>
                {% endif %}
            {% endif %}

ステータスコードが2の場合(自分自身でなく他人同士の場合)のみ表示されるようになっています。

そしてフォロー状態がFalseのとき「フォローする」、Trueのとき「フォローをやめる」と表示させるためif分岐させています。

リンクが押されるとページ移動先でfollows関数が呼び出されフォロー処理をして、また元のページにリダイレクトされるような流れになってます。

最後に

自分なりにコードを改変して使ってみてください。
「いいね機能」もほぼ同様に実装することができます!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[丁寧に解説] DDLファイルを使ってMySQLデータベースを共有する方法

チーム開発の問題

チームでアプリ開発を行っている学生です。
先日こんなことがありました。
バックエンドを担当しているメンバーが、ローカルで作成したデータベースを共有したいと。
皆さんの解決方法を是非ご教授いただきたいのですが、私達はDDLファイルを使っての共有を行いました。

DDLとは

データ定義言語(Data Definition Language, DDL)は、コンピュータ利用者あるいはアプリケーションソフトウェアが、コンピュータのデータを定義するコンピュータ言語もしくはコンピュータ言語要素である。

つまり、DDLファイルとはデータベースを定義するためのコンピュータ言語を記入したファイルのことになります。

データベースの共有

このファイルをアプリケーションのディレクトリに配置し、Gitなどで管理すればメンバーへの共有が簡単に行えます。
ただのファイルですから、通常のコードと扱いは同じです。

実行環境

OS: Windows

コンソール : Git Bash

DB : MySQL( Server version: 8.0.22 )

共有 : Git

参考記事 + やること

MySQLでファイルからSQLを実行する

今回は、上記のQiitaの記事を参考に行わせて頂きました。

この記事では、以下の手順を解説いたします。

1. DDLファイルの作成

2. DDLファイルの実行

3. コードの共有 (Gitの解説になるので、割愛)

やりかた

1. DDLファイルの作成

/* DBの作成*/
CREATE DATABASE testdb;

/* テーブルの作成 */
CREATE TABLE testdb.user(
    ID int,
    name varchar(10),
    mail varchar(20)
);

/* テーブルへのデータ追加 */
insert into testdb.user values(1, 'test1', 'test1@abc.co.jp');
insert into testdb.user values(2, 'test2', 'test2@abc.co.jp');
insert into testdb.user values(3, 'test3', 'test3@abc.co.jp');

※DDLファイルにコメントを追加する際は、//ではなく、/**/を使わないとコメントと認識しないのでご注意を!

このファイルは、setup_db.ddlというファイル名で保存します。

2.DDLファイルの実行

さぁ、作ったDDLファイルを実行してみよう!

準備

  • MySQLをPCにインストール
  • コンソールにパスを通す
  • コンソール上で、先程作ったDDLファイルがあるディレクトリに移動する。

実行

mysql -u root -p < setup_db.ddl

ログインする時に使ういつものコマンドに、「<」、ファイル名を連結する。
このあとにパスワードを入力し、何のメッセージも返ってこなかったら成功!

コードの共有

通常のファイルと同じ扱いができるので、Gitで管理しているディレクトリにファイルを追加して、PUSHすれば共有完了です。

まとめ

今回は、間接的な意味でDBの共有の仕方について解説させていただきました。
DBの共有をする際の正しいやり方、デファクトスタンダードは存じ上げないので、もし他の方法があるなら教えて下さい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【素人の備考録】Raspberry Pi 3,Wordpress vs Raspberry Pi 3,python,Django

初めに・・・

インフラエンジュニアとして20年以上働いています。
自分用のWebサーバをRaspberryPiで構築した時の備考録です。

HomeLan環境機器
ルーター:YAMAHA NVR500
サーバ1:Raspberry Pi model 3
サーバ2:Raspberry Pi model 3B
DNS: ネットボランチDNSサービス XXXXXX.netvolante.jp
スライド1.jpg

1.Raspberry Pi model 3、WordPress

サーバ構築について
色々なサイトを参考にして構築しました。

稼働状況について
2016年5月から稼働しています。WordPressで構築しました。
ほぼ毎日、iPhoneよりWordPressアプリを使い画像、動画を投稿しています。
2020年11月にシステム更新を行い、自己証明書も設定しました。
投稿しているファイル(iPhone 12 pro Maxのカメラを使用)
画像ファイル jpg 約5MB
動画ファイル mov 約20MB 撮影時間約20秒 

システム概要について
確認日時:2020/11/3
Linux raspberrypi 4.9.35-v7
Wordpress 4.8 から 5.5.3-ja に更新
PHP 5.6.40-0+deb8u12 から PHP 7.4.11 に更新
mysql Ver 15.1 Distrib 10.1.47-MariaDB
Apache/2.4.25 (Raspbian)
SSH tcp port 443

システム稼働中メモリ容量
pi@raspberrypi:/ $ free
total used free shared buff/cache available
Mem: 945512 204728 382040 26192 358744 654512
Swap: 0 0 0

SDカード使用容量:64GB(2016年5月より)
pi@raspberrypi:/ $ df
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/root 59460156 20191148 36825620 36% /
devtmpfs 468148 0 468148 0% /dev
tmpfs 472756 0 472756 0% /dev/shm
tmpfs 472756 6284 466472 2% /run
tmpfs 5120 4 5116 1% /run/lock
tmpfs 472756 0 472756 0% /sys/fs/cgroup
/dev/mmcblk0p1 61384 22256 39128 37% /boot
tmpfs 94548 0 94548 0% /run/user/1000

2.Raspberry Pi model 3B、python3.8.6など

サーバ構築について(下記サイトを参考にしました)

参考にしたサイト
MacでRaspberryPi入門
https://qiita.com/shippokun/items/9070fc58f69d8c063e44

OSはミラーサイトより
https://www.raspbian.org/RaspbianMirrors
OS:2020-08-20-raspios-buster-arm64.img → 64bitを使用

参考にしたサイト
さくらのVPSで、https対応かつDjango+uWSGI+nginxなアプリのログイン機能を実装してみた
https://qiita.com/ezmscrap/items/26b1897923db3665ac1c

参考にしたサイト
『超入門』Djangoで作る初めてのウェブアプリケーション Part1(Pythonインストール)
https://note.com/takuya814/n/n5c156740b4ef

参考にしたサイト
Django SQLite3からMySQLへの移行
https://qiita.com/ta2mi/items/0547de41d021d67ac3dc

備考
OSを2020-08-20-raspios-buster-arm64.img(64ビット)にしてシステム構築時のトラブル等は
一切ありませんでした。
構築したアプリケーションで画像ファイルをiPhone,Safariより投稿できることを確認しました。

システム概要について
確認日時:2020/11/18
Linux raspberrypi3b 5.4.72-v8+ #1356 SMP PREEMPT
Thu Oct 22 13:58:52 BST 2020 aarch64 GNU/Linux
PHP 7.3.19-1~deb10u1 (cli)
Python 3.8.6
mysql Ver 15.1 Distrib 10.3.25-MariaDB
nginx/1.14.2
Django version 3.1.3
SSH tcp port 8443

システム稼働中メモリ容量
pi@raspberrypi3b:~$ free
total used free shared buff/cache available
Mem: 934396 317252 319736 6620 297408 552316
Swap: 102396 9472 92924

SDカード128GB:使用容量
pi@raspberrypi3b:~$ df
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/root 123588468 4192636 114327400 4% /
devtmpfs 335612 0 335612 0% /dev
tmpfs 467196 0 467196 0% /dev/shm
tmpfs 467196 12104 455092 3% /run
tmpfs 5120 4 5116 1% /run/lock
tmpfs 467196 0 467196 0% /sys/fs/cgroup
/dev/mmcblk0p1 258095 56073 202023 22% /boot
tmpfs 93436 0 93436 0% /run/user/1000

後書き

各サイトを参考にして、サーバ構築をしました。pythonに興味があり、ブログサイトを構築となりましたが、今回は、検証用に構築し、自己証明書も設定しました。
pythonでの構築には機能の追加等多いに期待はできると思いますが
以前から稼働しているWordPressと比べて当然ながら手間がかかります。構築後の事を考えると仕事でブログサイトを構築となると運用管理面からWordPressになるでしょう。
インフラ関連の仕事をしてきて、オンプレミスでのサーバ構築が全てでしたが、AWSなどのウェブでのサーバ構築に興味があり、1年間の無料枠でEC2、EBS、mysqlでWordPress、VNCが短時間で構築出来ました。
時代の流れに流されないよう色々な情報取得には、このサイトが多いに役に立つと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

404エラーを返すWordPress投稿を修正する方法

WordPressは強力なCMSですが、わずかな調整によりWebサイトにアクセスできなくなる場合があります。ただし、WordPressの問題の解決策を見つけるのは非常に簡単です。WordPressユーザーが直面する最も一般的な問題のいくつかあります。例えば内部サーバーエラーまたはデータベース接続の確立エラーなどです。そして、ほとんどのWordPressユーザーがいつか直面するもう1つの一般的な問題は、WordPressの投稿が404エラーを返すことです。この記事では、404エラーを返すWordPressの投稿を修正する方法を紹介します。


通常、ユーザーはブログのメインページであるWordPress管理エリアにアクセスできますが、単一の投稿にアクセスすると、404 Notfoundエラーが発生する場合があります。そういった場合でもほとんどの場合、慌てる必要はありません。そういった時の原因は主に2つです。

①htaccessファイルが削除された
②書き換えルールに問題が発生した

そこで行うべきアクションはパーマリンク設定を修正することです

「設定」⇨「パーマリンク」に移動し、「設定を保存」をする。ただこれだけ。

これにより、パーマリンク設定が更新され、書き換えルールがフラッシュされます。ほとんどの場合、このソリューションはWordPressの投稿404エラーを修正します。ただし、それが機能しない場合は、.htaccessファイルを手動で更新する必要があります。

FTPを使用してサーバーにログインし、/ wp-content /や/ wp-includes /などのフォルダーと同じ場所にある.htaccessファイルを変更します。最も簡単な方法は、アクセス許可を666に変更して、ファイルを一時的に書き込み可能にすることです。次に、元の解決策を繰り返します。権限を660に戻すことを忘れないでください。次のコードを.htaccessファイルに手動で追加することもできます。

BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

ローカルサーバーの修正

多くの場合、デザイナーや開発者は、テスト目的でローカルサーバーを使用してコンピューターにWordPressをインストールします。綺麗なパーマリンクを使用したい場合は、MAMP、WAMP、またはXXAMPのApache構成でrewrite_moduleを有効にする必要があります。

以上が404エラーに対しての処理になります。もしよろしかったらコメント待っています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UbuntuでMySQLの外部公開とログイン

このタイトルのような記事は多く存在するのですが,Ubuntuでの例が少ないのか,
一筋縄では行かなかったので記事にすることにしました.

環境

Version
ホストOS Ubuntu Server 20.04.1 LTS
ホスト側MySQL Ver 8.0.22
クライアント側MySQL(MariaDB) 10.3.23-MariaDB

今回クライアント側はRaspberry Piを使用していたので,mariaDBを使用しています(raspbianにはmysqlが入らなかった?).
MySQLとmariaDBはほぼ互換なので,MySQL8系同士でやるなら問題ないと思います.

しかし,MariaDBの10.3はMySQLの5.7に相当するそうなんですが,
5系から8系にログインする際には問題が発生するのでそれについても以下で解説します.

ホスト側とクライアント側にそれぞれMySQLはインストール済みとします.

[ホスト側] 外部公開の設定

デフォルトではlocalhostしか接続できない設定になっているので,公開範囲を設定します.
/etc/mysql/mysql.conf.d/mysqld.cnfにアクセスして,bind-addressのところを以下のようにします.

$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf
bind-address                    = 0.0.0.0
default_authentication_plugin=mysql_native_password #クライアント側が5系の時にはこの行も追加.8系の時は不要.

設定が終わったらMySQLを再起動します.

$ /etc/init.d/mysql restart

[ホスト側] 接続用のユーザを作成

MySQLにログインし,以下のコマンドでユーザを作成します.
ここではadminがユーザ名,@以降の'%'は任意のIPアドレスを意味します.

CREATE USER 'admin'@'%' IDENTIFIED BY 'P@ssw0rd';
GRANT ALL ON *.* TO 'admin'@'%';

以下のコマンドで確認しましょう.

select user,host from mysql.user;

次のようになっていたらOKです.

mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| admin            | %         |
| debian-sys-maint | localhost |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

リモート側からログイン

リモート側からログインしてみましょう.

$ mysql -u admin -h [IPアドレス] -p

リモート側がMySQL8系ならこれでログインできると思います.

MySQL5系から8系にログインする

もしリモート側が5系の場合,以下のようなエラーがでると思います.

ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded: /usr/lib/arm-linux-gnueabihf/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

これは認証プラグインが8系で変更されてしまったためです.
今回はホスト側の認証プラグインを5系で使用されていたものに変更する形で解決したいと思います.

MySQLの設定に次を加えます.
(上の設定ではこちらを加えた状態で記載しました)

$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf
default_authentication_plugin=mysql_native_password

設定が終わったらMySQLを再起動します.

$ /etc/init.d/mysql restart

これで先程と同じようにユーザを作成することで,認証プラグインが変更されます.
確認してみましょう.

mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| admin            | %         | mysql_native_password |
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | auth_socket           |
+------------------+-----------+-----------------------+

参考URL

https://qiita.com/katzueno/items/e735950c7440f232ef27
https://sys-guard.com/post-8501/
https://symfoware.blog.fc2.com/blog-entry-2159.html
https://www.s-style.co.jp/blog/2018/05/1807/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む