20210815のMySQLに関する記事は6件です。

dockerでローカルの環境設定

はじめに docker-composeでPHP7.2 + Apache + MySQL + phpMyAdmin環境を Dockerに構築したので、自分が詰まった点などを含めて備忘録として書いています。 ディレクトリ構造 portfolio |-docker-compose.yml |-html └──index.php |-Dockerfile |-php.ini |-mysql |-phpmyadmin docker-compose.yml こちらの記事のdocker-compose.ymlを参考にコンテナの起動まで出来ました。 参考:docker-compose で PHP7.2 + Apache + MySQL + phpMyAdmin 環境を構築 発生したエラー① 上記の記事を参考にほぼ出来たのですがサイトを作り始めたところ could not find driver というエラーに遭遇しました。 ですのでDockerfileを別に作成しエラーを解決しました。 ①まずはdocker-compose.ymlの image: php:7.2-apache の部分を下記のようにに変更してください。 build: . docker-compose.yml version: '3' services: php: build: . volumes: - ./php.ini:/usr/local/etc/php/php.ini - ./html:/var/www/html ports: - 8080:80 ②Dockerfileを作成して下記を記述します Dockerfile FROM php:7.2-apache RUN docker-php-ext-install pdo_mysql ③コンテナを停止させ、再起動する。 参考:開発環境をDockerにしたら、PDOでcould not find driverが出た 発生したエラー② 画像のアップロードをする際にexif_imagetype関数を使いバリテーションをしたかったのですが、エラーが出ました。 こちらも解決するためにDockerfileに追加で記述していきます。 Dockerfile FROM php:7.2-apache RUN apt-get update \ && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd exif RUN docker-php-ext-install pdo_mysql 再度コンテナを停止させ、再起動します。 参考:ソフラボの技術ブログ まとめ 最初はDockerfileを使用するのは難しいと思いdocker-compose.ymlで環境構築しました。 ですがエラーが発生したことによりDockerfileを使用してみて よりdockerの理解を深めることができました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Window関数についての知識をまとめた(その2)

はじめに データ分析における重要な関数そうなので、何章かに分けて、Window関数についてまとめています。 前回の記事は? 今回もいくつかのサンプルを用意して説明します。 今回は、Window関数の機能一覧の紹介と、Window関数の典型的な利用ケースである移動平均を紹介していきます。 今回もSQLの実行は 「DB Fiddle」というWebサービスを使ってみます。 Window関数の機能一覧の紹介 Window関数の機能を1枚絵で俯瞰してみましょう。 以下の論文から引用してます。 Efficient processing of window functions in analytical SQL queries | Request PDF 3つの機能から成り立っていることが分かります PARTITION BY 句によるレコード集合のカット ORDER BY 句による順序づけ フレーム句による現在の行を中心とした範囲の定義 Window関数で移動平均を算出 当日と前日の単純移動平均を計算してみましょう 参考 Schema (MySQL v8.0) CREATE TABLE temperatures ( id INT NOT NULL PRIMARY KEY auto_increment, date DATE, city_name TEXT, avg_temp FLOAT ); INSERT INTO temperatures VALUES (1, '2020-12-01', '東京', 10.0), (2, '2020-12-02', '東京', 9.0), (3, '2020-12-03', '東京', 8.0), (4, '2020-12-04', '東京', 7.0), (5, '2020-12-01', '愛知', 11.0), (6, '2020-12-02', '愛知', 10.0), (7, '2020-12-03', '愛知', 9.0), (8, '2020-12-04', '愛知', 8.0); Query SELECT date AS 日付, city_name, AVG(avg_temp) OVER avg_temp_2days AS '移動平均2日間' FROM temperatures WINDOW avg_temp_2days AS ( PARTITION BY city_name ORDER BY id ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW ); ウィンドウ関数のフレーム句で使用できるオプション ROWS: 移動単位を行で指定 n PRECEDING: nだけ前(小さい方)へ移動する CURRENT ROW: 現在行 Results 日付 city_name 移動平均2日間 2020-12-01 愛知 11 2020-12-02 愛知 10.5 2020-12-03 愛知 9.5 2020-12-04 愛知 8.5 2020-12-01 東京 10 2020-12-02 東京 9.5 2020-12-03 東京 8.5 2020-12-04 東京 7.5 View on DB Fiddle 参照 29 - 35p アウトプット100本ノック実施中
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Window関数についての知識をまとめた(その1)

はじめに データ分析における重要な関数そうなので、何章かに分けて、Window関数についてまとめてみます。 ドキュメントばかり見てもわかりにくいので、いくつかのサンプルを用意して説明します。 今回は、トリアヘズ動かして、集計関数との違いをまとめています。 MySQL における Window 関数 自分はMySQLをよく使うのでMySQLにおけるWindow関数について述べます。 MySQL でも 8.0 から Window 関数が使えるようになったそうです。 自分のローカルの環境では、バージョンが古く使えないので、試せない。 $ mysql --version $ mysql Ver 14.14 Distrib 5.6.47, for osx10.13 (x86_64) using EditLine wrapper そこで、ブラウザ上からMySQL 8.0 の環境を試せる 「DB Fiddle」というWebサービスを使ってみます。 Window関数とは 現在の行に対して、指定したグループ全体から見た集計値を計算する関数 GROUP BYなどの集計関数との違い 集計関数: 同じカラム値をもつ全行を一つに集計する(1行に集約される) Window関数: 行ごとに単一の値を返す(対象の行はそのまま残る) BigQuery StandardSQLのドキュメントに Window関数 は 分析関数と呼ばれています。 そこでは、以下のように書かれています。 分析関数は、行のグループに対して値を計算し、各行に対して 1 つの結果を返します。これは、行のグループに対して 1 つの結果を返す集計関数とは異なります。 実行してみて違いを見てみよう Schema (MySQL v8.0) CREATE TABLE tests ( id INT NOT NULL PRIMARY KEY auto_increment, category_id INT NOT NULL, val INT NOT NULL ); INSERT INTO tests VALUES ( 1, 100, 1), ( 2, 200, 2), ( 3, 100, 10), ( 4, 200, 20), ( 5, 100, 100), ( 6, 200, 200), ( 7, 100, 1000), ( 8, 200, 2000), ( 9, 100, 10000), (10, 200, 20000); Query SELECT category_id, SUM(val) AS total FROM tests GROUP BY category_id; Results category_id total 100 11111 200 22222 予想通りの出力かなと思います。 Window関数を用いると... Query SELECT id, category_id, val, SUM(val) OVER (PARTITION BY category_id) AS total FROM tests; Results id category_id val total 1 100 1 11111 3 100 10 11111 5 100 100 11111 7 100 1000 11111 9 100 10000 11111 2 200 2 22222 4 200 20 22222 6 200 200 22222 8 200 2000 22222 10 200 20000 22222 View on DB Fiddle 行ごとに単一の値(計算結果)を返す(対象の行はそのまま残る) とはこのことです。実際に実行してみるとイメージは詳細になりましたね。 次回はもう少し詳しく見ていきます。 参照 26-29p アウトプット100本ノック実施中
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

M1macでdocker pullしたときのエラー

個人メモ。 mysql:8をdocker pullしたときに下記のエラーが出力された。latestでも同じ。 latest: Pulling from library/mysql no matching manifest for linux/arm64/v8 in the manifest list entries pullコマンドをオプション--platformをつけて実行する。 docker pull --platform=linux/x86_64 mysql:8 runするときにも同じオプションをつける。 docker run -d -it --platform=linux/x86_64 -e MYSQL_ROOT_PASSWORD=[任意のパスワード] mysql:8 何回もrunする場合はdocker-composeファイルを書く。 https://stackoverflow.com/questions/65456814/docker-apple-silicon-m1-preview-mysql-no-matching-manifest-for-linux-arm64-v8 とはいえ前述のdockerのドキュメントによると、動くけどエミュレータ上で動かしてるから性能は落ちるので、M1チップでも動くイメージできるだけ使ってね、とのこと。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

画像のアップロード【PHP】

はじめに PHPで画像のアップロードから表示までの一連の処理を 備忘録としてこちらまとめさせていただきます。 手順 ①FORMから画像を選択してPOSTで送信 ②送信した画像が存在するかチェック ③ファイル名をユニーク化 ④画像ファイルかのチェック ⑤DBではなくサーバーのimageディレクトリに画像を保存 ⑥DBにはファイル名保存 ⑦DBのファイル名を元に画像表示 ファイル構造 test |-images(画像ファイル保存ディレクトリ) |-image.php(画像表示ファイル) |-upload.php(画像アップロード処理するファイル) 画像アップロード処理するファイル(upload.php) ①FORMから画像を選択してPOSTで送信 upload.php <form action="upload.php" method="POST" enctype="multipart/form-data"> <input type="file" name="image">   <button><input type="submit" name="upload" value="送信"></button> </form> ②~⑥ upload.php <?php $dsn = "mysql:host=localhost; dbname=xxx; charset=utf8"; $username = "xxx"; $password = "xxx"; try { $dbh = new PDO($dsn, $username, $password); } catch (PDOException $e) { echo $e->getMessage(); } if (isset($_POST['upload'])) {         $temp_file = $_FILES['image']['tmp_name'];         $dir = './images/'; if (file_exists($temp_file)) {//②送信した画像が存在するかチェック $image = uniqid(mt_rand(), false);//③ファイル名をユニーク化 switch (@exif_imagetype($temp_file)) {//④画像ファイルかのチェック case IMAGETYPE_GIF: $image .= '.gif'; break; case IMAGETYPE_JPEG: $image .= '.jpg'; break; case IMAGETYPE_PNG: $image .= '.png'; break; default: echo '拡張子を変更してください'; } //⑤DBではなくサーバーのimageディレクトリに画像を保存 move_uploaded_file($temp_file, $dir . $image); }         //⑥DBにはファイル名保存 $sql = "INSERT INTO images(name) VALUES (:image)"; $stmt = $dbh->prepare($sql); $stmt->bindValue(':image', $image, PDO::PARAM_STR); $stmt->execute(); } ?> セキュリティ 画像アップロード ファイルアップロードを使った攻撃があり、悪意あるコードを注入した不正ファイルをアップロードし、そのファイルにアクセスすることで成立する。この攻撃は、XSSを使って第三者に接続させる方法や攻撃する側が自らサーバにコードを注入して実行させる方法がある。 脆弱性を防ぐために... 1.アップロードされたファイルを非公開ディレクトリに移す(悪意あるスクリプトを実行できなくする) 2.アップロードされたファイル名をrenameする(拡張子などを変えることによって悪意あるスクリプトを実行できなくする) 画像表示ファイル(image.php) ⑦DBのファイル名を元に画像表示 image.php <?php $dsn = "mysql:host=localhost; dbname=xxx; charset=utf8"; $username = "xxx"; $password = "xxx"; $id = 1; try { $dbh = new PDO($dsn, $username, $password); } catch (PDOException $e) { echo $e->getMessage(); } //⑦DBのファイル名を元に画像表示 $sql = "SELECT * FROM images WHERE id = :id"; $stmt = $dbh->prepare($sql); $stmt->bindValue(':id', $id); $stmt->execute(); $image = $stmt->fetch(); ?> <h1>画像表示</h1> <img src="images/<?php echo $image['name']; ?>" width="300" height="300"> まとめ 画像アップロード自体は簡単にできます。ですが、脆弱性を意識しながらコードを書こうとすると様々な書き方があり、それを読み解くことでセキュリティに対しての理解を深めることができました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

m1 macでmysqlのDockerを立てる

もともとのmysqlのイメージを使っていると動かず、linux/amd64のプラットフォームを利用する必要がある。 Dockerfile.m1とdocker-compose.m1.ymlをそれぞれ作った。 Dockerfile.m1 FROM --platform=linux/amd64 mysql:5.7 # FROM mysql@sha256:77b7e09c906615c1bb59b2e9d7703f728b1186a5a70e547ce2f1079ef4c1c5ca RUN echo "USE mysql;" > /docker-entrypoint-initdb.d/timezones.sql && mysql_tzinfo_to_sql /usr/share/zoneinfo >> /docker-entrypoint-initdb.d/timezones.sql COPY ./my.cnf /etc/mysql/conf.d/my.cnf docker-compose.m1.ymlではDockerfile.m1を指定するようにしている docker-compose.m1.yml mysql: build: context: . dockerfile: ./mysql/Dockerfile.m1 environment: TZ: Asia/Tokyo MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: backend ports: - 13306:3306 volumes: - mysql_volume:/var/lib/mysql my.cnfは以下のようにしている。 my.cnf # MySQLサーバーへの設定 [mysqld] # 文字コード/照合順序の設定 character_set_server=utf8mb4 collation_server=utf8mb4_bin # タイムゾーンの設定 default_time_zone=SYSTEM log_timestamps=SYSTEM # デフォルト認証プラグインの設定 default_authentication_plugin=mysql_native_password # mysqlオプションの設定 [mysql] # 文字コードの設定 default_character_set=utf8mb4 # mysqlクライアントツールの設定 [client] # 文字コードの設定 default_character_set=utf8mb4 参考 ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む