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

アプリを開発していたのだけれども、仕様がなかなか降りてこなかった話。

これもちょっと前に実際にあった話。

Windowsアプリを作成する(ベースソースはある)タスクに取りかかったのですが、

上から仕様がなかなか降りてこなかったのです。

この時点で資料としてあるのは、「こんな感じのアプリ」というイメージを書き残したスライド資料。

そして、残念なことに、先輩フリーランスのメンバーは家庭の事情で長期にわたって不在。

残されたメンバーで完成するのか?

UIに関しては、すでにイメージがあり、ベースソースもあるので、それを改修して、で、あとでその画面を実際に見てもらって、これに関しては解決。

が、実際にデータを受け取って、あれこれ処理して応答を返す処理。

このアプリの核をなす重要な部分。

この情報が情報が出てきたのも開発の終盤。

そして、クラウドサーバ(試験用)に接続するための認証処理にかんしては本当の最後の最後にようやく完成。

それまでどのように開発していたかというと、

ローカル環境に疑似サーバを作成し、その中のやりとりもある程度想像で作ってました。

てな感じで最初の開発は何とか終わりましたが、

この状況を見た、現場復帰した先輩フリーランスからの厳しいお言葉。

今後、二次開発があるのが確実なので、そのときはやり方を変えよう、という話になりました。

具体的にどうしたのか。

仕様に関しては、まだ不明点ではあるところもQA形式でこちら側で仕様を考え、「これで問題無いか」というやり方にしました。

仕様が降ってくるのを待つのでは無く、提案する形で仕様を固めていきました。

そして、毎日ミーティングを実施しました。

これによって認識のすりあわせ、進捗状況の共有、まだ決定されていない仕様の情報を少しずつ引き出す、そして、開発スケジュールの再確認。

これを実施することで、一次開発よりも二次開発の方が、こころにゆとりを持って開発できました。

やっぱりマネージャークラスのスキルを持っている人は、考えることが違うなぁ。

というか、ミーティングのセッティングや仕様のQAの整理とかは社員メンバーに全部任せて、

自分はほぼほぼコーディングのみを行っていましたけどね。

まぁ、うちの現場ではこんなことあったよ、と言うことで、参考になれば。

やっぱりDocker+Kubernetesの知識は持っておいた方が良い。

昔のクラウドサーバと言えば、

やはりVPSでは無いだろうか?

これまでのレンタルサーバでは、何をするにも不自由な部分があるのに対し、

VPSでは、ほぼほぼPC一台をレンタルするイメージ。

そのPCの中でどのようなサービスを構築するのも自由である。

ただし、その分、ちゃんと運用仕様とするならば、ドメインを取得・維持しなければならなかったり、

セキュリティの設定も自己責任なので、そのあたりの知識も必要になったりします。

ただ、このブログのような小規模のサービスであればVPS一台で十分なのだが、

大規模なサービスとなると、基本的にサービスを構成する1機能にサーバ1台という構成が当たり前になってきます。

でもそれらのPCを準備するのもセッティングするのも大変なので、

Dockerなどのマイクロサービスを使用するのが当たり前になってきました。

Dockerの中には動作に最低限必要なOSやソフトウェアのみが入っているので、非常に軽量ですし、

一つイメージファイル(Dockerで動作するソフトウェアの塊のようなもの)を作成してしまえば、それを元にしてスケールアウトも簡単になります。

開発側の負担も軽く、gitの特定のブランチにマージすれば、

gitRunnerが走り、ビルド実行、クラウド環境へイメージを格納し、デプロイまで完了してしまうのです。

ここまで自動化されているので、アップデート作業に作業ミスのリスクが少ない。

このメリットは実際にクラウドの現場を経験しないと分からないと思う。

そして、kubernetesとは複数のDockerを管理するソフトウェア。

ちなみにDocker Desktopはkubernetesとしての役目も持っています。

自分もまだ勉強中ではあるものの、複数のDockerを組み合わせて一つのサービスを運用するのが当たり前なので、

それらを管理するシステムも当然存在するわけで、これについての知識も当然必要と言うこと。

さぁ、みんなでDocker+Kubernetesを勉強しよう!

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]])