「技術」カテゴリーアーカイブ

Pixel 7aを使ってみた感想

左がPixel 7a、右がPixel 6a(初期化済み)です。

使用感覚は全く同じ。

だって、サイズが全く一緒なんだもん。

もしかしたら6aのスマホケースが使えるんじゃ?って思ったけど、右側のボタンの位置が微妙に違うので結局新しいスマホケースを買いました。

ただ、いつも悩ませるのがスマホアプリのアカウントの引き継ぎ。

一部のアプリはアカウントがそのまま引き告げられるのですが、

大抵のアプリはアカウントを新たに入力し直してログインして使えるようにしなければなりません。

特に電子決済系と金融系。

地味にめんどくさいんですけど何とかなりませんか?

あと、端末初期化の際、本体をファクトリーリセットしてもおサイフケータイのデータが残っているのを知っていました?

おサイフケータイのデータはファクトリーリセットとは別に個別に消去しなければならないんです。

消し方がアプリによって異なるので、消し方を調べるのも一苦労。

サービス提供側は簡単にデータも消させてくれません。

ヘルプページをたどった先のリンク先じゃ無いと消せないというものもありました。

これ、サービス提供側の一番悪いところよ。

ということで、セットアップ完全完了に2晩かかりました。

一番の違いはPCゲームとスマホゲームの画面の滑らかさ。

オイラの自宅PCは格安4kディスプレイを使用して、リフレッシュレートは30Hzです。

それに対して7aのリフレッシュレート90Hz。

もう比べるまでも無く違いが分かります。

性能の良いお高い4Kディスプレイほしいっすねぇ。

経費で何とかなりませんか?

【数学】【PYTHON】逆行列を使って連立方程式の解を求める。

【数学】【PYTHON】行列の逆行列を求める。 | 自分、ぼっちですが何か? (taki-lab.site)

5x + 3y = 9
2x + y = 4

という連立方程式があった場合、

行列を使って以下の様に書き換えることができます。

これを左辺の逆行列を掛け合わせると、

となり、これを計算することによって、解を求めることができます。

>>> import numpy as np
>>> A = np.matrix([[5, 3], [2, 1]])
>>> inv_A = np.linalg.inv(A)
>>> B = np.matrix([[9], [4]])
>>> inv_A * B
matrix([[ 3.],
        [-2.]])
>>>

【数学】【PYTHON】行列の逆行列を求める。

【数学】【PYTHON】行列のかけ算を行う | 自分、ぼっちですが何か? (taki-lab.site)

逆行列とは、元の行列にかけ算を行うと、単位行列にる行列のことです。

Pythonでは、linalg.inv()の関数を使用すると、一瞬で計算できます。

>>> import numpy as np
>>> A = np.matrix([[5, 3], [2, 1]])
>>> B = np.linalg.inv(A)
>>> B
matrix([[-1.,  3.],
        [ 2., -5.]])

で、試しにA×Bを計算して単位行列になるかどうかを計算してみたんですが、

>>> (A * B).astype(np.int64)
matrix([[1, 0],
        [0, 0]])

ん?

単位行列なら右下が1になるはずなんだが?

astype(np.int64)とは、inv()を計算すると、出力が浮動小数になるため、整数に変換する関数なんですが、

ちなみに、astype(np.int64)を取り除くと、

>>> (A * B)
matrix([[ 1.00000000e+00, -8.88178420e-16],
        [ 2.22044605e-16,  1.00000000e+00]])

e-16は小さい値なので、整数化するとほぼ0ですが、

右下はどうみても1ですね。

???

DOCKERでPHP+DB+LARAVELを構成してみる(前回の続き)

DockerでPHP+DB+Laravelを構成してみる | 自分、ぼっちですが何か? (taki-lab.site)

前回までできていればDockerコンテナを立ち上げられるはず。

VSCodeを立ち上げて左下のボタンから「Reopen in Container」をクリック。

VSCodeのプロンプトを開くとDocker内のプロンプトになっていると思うので、これからLaravelのセットアップを行います。

> composer create-project laravel/laravel sample --prefer-dist

DBの設定を行います。

.envの編集

DB_CONNECTION=mysql
DB_HOST=laravel1_db
DB_PORT=3306
DB_DATABASE=my
DB_USERNAME=my
DB_PASSWORD=my

config/logging.phpの編集

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single', 'stderr'],
            'ignore_exceptions' => false,
        ],

モデルの作成

> php artisan make:model Book

コントローラーの作成

> php artisan make:controller BookController

app/Http/Controllers/BookController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Models\Book;

class BookController extends Controller
{
    //
    public function index()
    {
        $data = [
            'books' => Book::all()
        ];

        Log::debug('デバッグ用。$dataの内容です。');
        Log::debug($data);

        return view('book.index', $data);
    }
}

ビューの作成

resources/views/book/index.blade.php

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charaset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>
  <body>
    <table border="1">
      @foreach($books as $book)
      <tr>
        <td>{{ $book->id }}</td>
        <td>{{ $book->title }}</td>
        <td>{{ $book->insert_timestamp }}</td>
      </tr>
      @endforeach
    </table>
  </body>
</html>

ルーティングの設定

routes/web.php

Route::get('/books', 'App\Http\Controllers\BookController@index');

xdebugのエラー対策

app/Http/Middleware/EncryptCookies.php

<?php

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;

class EncryptCookies extends Middleware
{
    /**
     * The names of the cookies that should not be encrypted.
     *
     * @var array<int, string>
     */
    protected $except = [
        'XDEBUG_SESSION'
    ];
}

動作確認

> php artisan serve

ブラウザでhttp://172.0.0.1:8001/bookへアクセスする。

DockerでPHP+DB+Laravelを構成してみる

Docker Composeを使用する | 自分、ぼっちですが何か? (taki-lab.site)

さぁ、ここから大事になるぞ

.devcontainer/app/Dockerfile

PHPの設定をします。

ここからLaravelのセットアップを行うので、composerをセッティングします。

FROM php:8.0-fpm

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

RUN apt-get update && apt-get install -y \
    tzdata \
    zip \
    unzip \
    && pecl install xdebug \
    && docker-php-ext-install pdo_mysql \
    && rm -rf /var/lib/apt/lists/*

ENV TZ=Asia/Tokyo

.devcontainer/app/php.ini

[Logs]
log_errors = On
error_log = /dev/stderr

[Date]
date timezone = Asia/Tokyo

[mbstring]
mbstring language = Japanese

[xdebug]
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_port = 9003
xdebug.client_host=host.docker.internal
xdebug.idekey = VSCODE

.devcontainer/db/Dockerfile

こちらはMySQLの設定を行います。

FROM mysql:8.0

COPY ./my.cnf /etc/mysql/conf.d/my.cnf

RUN chmod 644 /etc/mysql/conf.d/my.cnf

.devcontainer/db/my.conf

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin

[client]
default-character-set=utf8mb4

.devcontainer/devcontainer.json

VSCodeからリモート接続する設定ファイルです。

{
    "name": "Laravel Basic",
    "dockerComposeFile": "docker-compose.yml",
    "service": "app",
    "workspaceFolder": "/var/www/html",
    "extensions": [
        "felixfbecker.php-debug",
        "felixfbecker.php-intellisense"
    ],
    "settings": {
        "editor.tabSize": 2
    }
}

.devcontainer/docker-compose.yml

version: '3.8'

services:
  app:
    image: laravel/app:1.0
    build: ./app
    container_name: 'laravel1_app'
    ports:
      - '8000:8000'
    stdin_open: true
    tty: true
    working_dir: '/var/www/html'
    volumes:
      - ./app/php.ini:/usr/local/etc/php/php.ini
      - ../app:/var/www/html
    depends_on:
      - db

  db:
    image: laravel1/mysql:1.0
    build: ./db
    container_name: 'laravel1_db'
    expose:
      - "3306"
    environment:
      - TX=Asia/Tokyo
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=my
      - MYSQL_USER=my
      - MYSQL_PASSWORD=my
    volumes:
      - ../db/database:/ver/lib/mysql
      - ../db/init:/docker-entrypoint-initdb.d
      

app/.vscode/lanch.json

PHPをVSCode上でデバッグ実行するための設定ファイルです。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9003
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9003
        }
    ]
}

app/sample/は後ほどLaravelセットアップ時に作成されるので、今は削除しておいて大丈夫です。

db/databaseもDB構築時に作成されるフォルダなので、削除しておいて大丈夫です。

db/init/01_create_table.sql

create table books
(
    id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(100),
    insert_timestamp DATETIME DEFAULT NULL
);

db/init/02_insert_data.sql

INSERT INTO books VALUES(1, 'プログラミング言語C', current_timestamp);
INSERT INTO books VALUES(2, 'やさしいコンピュータ-科学', current_timestamp);
INSERT INTO books VALUES(3, 'ゲーテル、エッシャー、バッハーあるいは不思議の環', current_timestamp);
INSERT INTO books VALUES(4, 'TeXブック コンピュータによる組版システム', current_timestamp);
INSERT INTO books VALUES(5, '人月の神話 狼人間を撃つ銀の弾はない', current_timestamp);

db/.gitignore

データベースの中身はgitにコミットから除外させます。

/db/database

長くなったので、続きは次回。

【数学】【PYTHON】行列のかけ算を行う

【数学】【PYTHON】行列の足し算・引き算を行う | 自分、ぼっちですが何か? (taki-lab.site)

行列のかけ算もnumpyのmatrix()を使えば簡単にできます。

実数倍のかけ算

>>> import numpy as np
>>> A = np.matrix([[80, 140], [30, 25]])
>>> 0.8 * A
matrix([[ 64., 112.],
        [ 24.,  20.]])

これは単純に各要素を実数倍する計算結果。

行列同士のかけ算

>>> A = np.matrix([[1, 3], [2, 1]])
>>> B = np.matrix([[150, 250], [130, 230]])
>>> A * B
matrix([[540, 940],
        [430, 730]])

行列同士のかけ算は、特殊な(めんどくさい)計算が必要になるのですが、

numpyを使えば簡単に計算してくれます。

Docker Composeを使用する

DOCKERでCMDコマンドを仕込んでみる。 | 自分、ぼっちですが何か? (taki-lab.site)

Dockerは1アプリケーション1コンテナというのが基本的な使い方らしいです。

今回はPHP+DBという構成を構築してみたいと思います。

こういった複数をアプリ(コンテナ)をセットで扱いたい場合は、docker-composeを使用します。

プロジェクト構成

PHPはDockerファイルで、DBはDockerHubで用意されている物を使用します。

Dockerfile

FROM php:7.4-apache

RUN apt-get update && apt-get install -y \
    tzdata \
    libpq-dev \
    && rm -rf /var/lib/apt/lists/* \
    && docker-php-ext-install pdo_pgsql

ENV TZ=Asia/Tokyo

php.ini

[Date]
date.timezone = Asia/Tokyo

[mbstring]
mbstring.language = Japanese

sample1.php

<?php
print('ただいまの日時は、'.date("Y-m-d H:i:s").'です。<br>');

$dbname='postgres';
$host='ex11_db';
$dbuser='postgres';
$dbpass='postgres';

try {
    $dbh = new PDO("pgsql:dbname=$dbname;host=$host", $dbuser, $dbpass);
    print('正常に接続されました。<br>');

    print('sysid, ユーザー名<br>');

    $sql = 'SELECT * FROM pg_user';
    foreach ($dbh->query($sql) as $row) {
        print($row['usesysid'].', ');
        print($row['usename'].'<br>');
    }
} catch (PDOException $e) {
    print('エラー:'.$e->gwtMessage());
    exit();
}

?>

docker-compose.yml

version: '3.8'

services:
  db:
    image: postgres:13.1-alpine
    container_name: 'ex11_db'
    expose:
      - "5432"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - HOGE=hoge

  web:
    image: ex11/web:1.0
    build: ./web
    container_name: 'ex11_web'
    ports:
      - 8080:80
    working_dir: '/var/www/html'
    volumes:
      - ./web/php.ini:/usr/local/etc/php/php.ini
      - type: bind
        source: ./web/src
        target: /var/www/html
    depends_on:
      - db
~/dockerenv/ex11$ docker-compose up
~/dockerenv/ex11$ docker-compose down --rmi all

【数学】【PYTHON】行列の足し算・引き算を行う

【数学】【PYTHON】法線ベクトル(ベクトルの外積)を求める | 自分、ぼっちですが何か? (taki-lab.site)

NumPyのmatrix()を使用すれば、行列も簡単に扱うことができるようになります。

たとえば、こんな行列の計算を行う場合、

>>> import numpy as np
>>> A = np.matrix([[50, 40],[10, 10]])
>>> B = np.matrix([[30, 100],[20, 15]])
>>> A+B
matrix([[ 80, 140],
        [ 30,  25]])

DOCKERでRUNコマンドを仕込んでみる。

Dockerでコンテナ作成の勉強をする。 | 自分、ぼっちですが何か? (taki-lab.site)

DockerでRUNコマンドを使用し、パッケージをインストールするパターンです。

ファイル構成はこんな感じ。

Dockerfileの内容。

FROM php:7.4-apache

RUN apt-get update && apt-get install -y \
    tzdata \
    && rm -rf /var/lib/apt/lists/*

ENV TZ=Asia/Tokyo

WORKDIR /usr/local/etc/php

COPY php.ini ${PWD}

ARG wdir

WORKDIR $wdir

RUNで&&で区切ることによって、Buildの速度を上げるための施策らしい。

そして、最後のrmコマンドはapt-getコマンドのキャッシュを削除することによって、イメージサイズを小さくしているらしい。

これはお決まりのパターンってことだね。

php.ini

[Date]
date.timezone = Asia/Tokyo

[mbstring]
mbstring.language = Japanese

phpinfo.php

<h1>ようこそ! PHP!</h1>
ただいまの日時は、<?php echo date("Y-m-d H:i:s") ?> です。

<?php
echo phpinfo()
?>

イメージのビルド

~/dockerenv/ex02$ docker image build --build-arg wdir=/var/www/html -t ex02/php:1.0 .

イメージの実行

~/dockerenv/ex02$ docker container run --name ex02_php -d --rm -p 8080:80 --mount type=bind,src=$(pwd)/src,dst=/var/www/html ex02/php:1.0

Dockerでコンテナ作成の勉強をする。

これまで一生懸命Dockerを避けてきたのですが、

どうもすでにDockerでサービスを運用することがトレンドになっているらしいので、

これはもうやらざるを得ないかと。

そもそも前のプロジェクトでは、AWSのECS、ECRを使ってコンテナイメージをデプロイして運用するのですが、

AWS以外では、Kubernetes+Dockerで運用するのが一般的らしい。

OSを仮想化するのはVMでもできるけど、

Dockerの方が最小限のリソースで複数稼働させることができます。

デプロイ時にコンテナイメージを作成してしまえば、

スケールイン、アウトも簡単にできてしまいます。

ということで、まずはPHPを動かすだけのDockerを使ってみる。

使用した環境はWSL環境。

Dockerデスクトップインストール済み。

WSLにログインして、ディレクトリ作成。

~/dockerenv/ex01$ 

Dockerfileを作成。

FROM php:7.4-apache

LABEL maintainer="username@hogehoge.com"
LABEL version="1.0"
LABEL description="シンプルなPHPイメージです。"

WORKDIR /tmp/mydir

イメージをビルド

~/dockerenv/ex01$ docker image build -t ex01/php:1.0 .

Dockerを起動し、Docker内のbashを起動

~/dockerenv/ex01$ docker container run -it --rm ex01/php:1.0 /bin/bash

Docker内のphpのバージョン表示、現在ディレクトリ表示、Dockerを抜ける

root@212df36f6268:/tmp/mydir# php -v
PHP 7.4.33 (cli) (built: Nov 15 2022 06:03:30) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
root@212df36f6268:/tmp/mydir# pwd
/tmp/mydir
root@212df36f6268:/tmp/mydir# exit
exit

イメージの情報表示

~/dockerenv/ex01$ docker image inspect ex01/php:1.0 

LabelsブロックにDockerfileの内容が表示されていればOK

"Labels": {
                "description": "シンプルなPHPイメージです。",
                "maintainer": "username@hogehoge.com",
                "version": "1.0"
            },