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

【プログラミング】プログラミングスキル習得にC言語をオススメする理由。

正直、これを言うと賛否両論あると思いますが、

そもそも自分がC言語が最初に触ったプログラミング言語だからです。

自分は高専で本格的にC言語を学ぶ前に、

中学生時代に友人から無料コンパイラを手に入れて、

少しだけコードを書いて動かしていたことがあります。

まぁ、そんな自分でしたけど、最終的にポインタを理解できたのは会社に入ってからでしたけどね。

確かに他の言語と比べると、C言語は難しいです。

というか、みんな使っている言語は全てC言語の後に開発されたもので、

C言語の欠点を補う形で開発されました。

なので、ポインタやメモリの概念は意識しなくて済みましたが、

そこに大きな落とし穴があります。

メモリを意識することの重要性

メモリを意識しなくても良くなりましたが、メモリ自体は存在するからです。

これまで経験したのは、

Javaでガベージコレクションが働かない状態でオブジェクトが残ってて、動かしているとメモリを消費していく設計になっていたり、

AWSのLambdaを実行するとき、Pythonで大きなファイルを開こうとしたらメモリが足りなかったとか。

関数コール時にオブジェクトは参照型という話もありますが、

これもポインタによる参照渡しを、ポインタを使わずに利用できるようにしたもの。

参照渡しの場合、データがあるメモリアドレスを渡すだけなので、通常のデータ渡しよりも処理が早くなります。

CPUの動きが理解できる

プログラミング言語には3種類ありまして

(自分が高専時代は2種類と学びました)

  • コンパイル系(C、C++、Rust等)
  • 中間言語系(Java、C#等)
  • インタプリタ系(Python、PHP、Javascript等)

の3つです。

インタプリタ系は実行する度にプログラムコード読み込み、処理を行います。

扱いやすい言語ですが、動作は比較的遅いと言われています。

中間言語系はプログラムコードをビルドし、実行できる形に加工するのですが、

それを実行するためには別途仮想マシンというプログラムが必要になります。

これはビルドしたファイルがあれば、仮想マシンがある環境どこでも動作できるという特徴を持ちます。

コンパイル系はソースコードを機械語に翻訳し、そのままCPUが理解できる形に変換されます。

直接CPUが理解できる形式であるため、実行速度は速いとされています。

そして、もう一つ特徴があって、

機械語は逆アセンブルできるのです。

アセンブラは機械語の内容を人間が理解できる文字列に置き換えたもので、

これを読んでいけばCPUやプログラムがどんな動きをするのか?というのを理解できます。

CPUには独自の記憶領域「レジスタ」がありまして、

  • メモリからレジスタに値を読み出す
  • レジスタの値に対して計算する
  • レジスタにある計算結果をメモリに戻す

と言う動きを繰り返しています。

こういったCPU周りでどんなふうにプログラムが動いているか、というのが見えちゃいます。

C言語が出来れば他の言語の習得も早い

これは、

他のメジャーな言語がC言語以降に生まれたもの

ということと、

プログラミングに関する基本的な知識がC言語に詰まっている

ということから、

C言語が出来れば他の言語の習得も早いと言われています。

C言語の需要はまだありまして、

組み込みプログラミングの世界では未だにC言語が主流です。

OS周りはRustに置き換えるという話もありますけどね。

他の言語はフレームワークが発達しているので

フレームワークの習得の方が大変かもしれない。

まぁ、これは他の言語を学んでいたとしても必ず出てくる壁なので。

しかも今は昔と違ってコンパイラが簡単に手に入るので、

学習のためのハードルがかなり下がりました。

みんなも余力があればC言語に挑戦してみましょう。

【DOCKER】【GITLAB】DOCKER環境のGITLABサーバからメール通知を送信できるようにする。

前回の続き。

【Docker】【GitLab】WindowsのDocker環境にGitLabサーバを立ち上げる。 | 自分、ぼっちですが何か? (taki-lab.site)

GitLabサーバからメール通知を送信できるようにします。

今回もこちらのサイトを参考にしています。

https://e-penguiner.com/gitlab-with-docker-onpremise/#index_id11

この中ではSTMPサーバとしてGmailを利用しているので、同じようにします。

つまりGmailのアカウントからGitlabの通知メールが届くイメージですね。

これを可能にするためには、Gmailのアカウント設定を変更し、

二段階認証を設定する

アプリパスワードを設定する

という手順が必要になります。

二段階認証を設定する

こちらのサイトに説明が書いてあります。

https://e-penguiner.com/app-passwd-two-step-verification-for-gmail/

アカウントの設定から二段階認証を有効にします。

このとき、電話番号を入力し、SMSで受信した番号を入力する必要があります。

この手順を完了すると、アプリパスワードの項目が表示されるようになります。

アプリパスワードを設定する

アプリパスワードの項目から進んでいくと、16桁の英数字が表示されます。

この値は今後表示されることは無いので、必ずメモしてください。

gitlab.rbの設定

/srv/gitlab/config/gitlab.rbを編集します。

...
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.gmail.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "your-email@gmail.com"
gitlab_rails['smtp_password'] = "your-password"
gitlab_rails['smtp_domain'] = "smtp.gmail.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'

smtp_user_nameとsmtp_passwordは自分の環境に合わせて書き換えてください。

smtp_user_nameはGmailアカウントのメールアドレス、

smtp_passwordはアプリパスワード16桁の英数字を記入します(スペースは不要)。

保存したら設定の読み込み。

docker-compose exec gitlab gitlab-ctl reconfigure

そしてサーバ再起動。

 docker-compose exec gitlab gitlab-ctl restart

ブラウザからGitlabにrootでログインし、ユーザーセッティングの画面へ。

Gmailのメールアドレスを入力すると、正しく設定できていれば、確認用のメールが届くので、リンクをクリックして認証を完了させる。

ドメインが合っていない場合はリンク先のドメインを良い感じに変更してください。

コンテナ作成時に設定を反映させる

以下のようにdocker-compose.ymlを修正すると、Dockerビルド時にここまでの設定変更を反映できます。

version: '3'
services:
  gitlab:
    image: 'gitlab/gitlab-ee:latest'
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.example.com:8080'
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        nginx['listen_port'] = 80
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = "smtp.gmail.com"
        gitlab_rails['smtp_port'] = 587
        gitlab_rails['smtp_user_name'] = "your-email@gmail.com"
        gitlab_rails['smtp_password'] = "your-password"
        gitlab_rails['smtp_domain'] = "smtp.gmail.com"
        gitlab_rails['smtp_authentication'] = "login"
        gitlab_rails['smtp_enable_starttls_auto'] = true
        gitlab_rails['smtp_tls'] = false
        gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
    ports:
      - '8080:80'
      - '2222:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab' 

【Docker】【GitLab】WindowsのDocker環境にGitLabサーバを立ち上げる。

こちらの記事を参考にしました。

https://e-penguiner.com/gitlab-with-docker-onpremise/#google_vignette

今回はローカルのみでの利用を想定しているので、暗号化はしません。

前提条件として、WSL2の有効化とDocker Desktopのインストールが必要です。

そして作業はWindowsストアアプリからLinuxをインストールして、Linux上に構築します。

GitLabサーバの立ち上げ

適当なフォルダを作成し、そのなかにdocker-cmpose.ymlファイルを作成。

version: '3'
services:
  gitlab:
    image: 'gitlab/gitlab-ee:latest'
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.example.com:8080'
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        nginx['listen_port'] = 80
    ports:
      - '8080:80'
      - '2222:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab'
      

これの内容を説明すると、

Docker作成時に、GitLabの最新バージョンを使用します。

※念のため言うと、実際業務で使用する場合は必ず特定のバージョンを指定するらしい。今回のように常に最新バージョンはアウト。

ポート番号はホスト側8080とコンテナ側80、ホスト側2222とコンテナ側22が接続されます。

80はhttp、22はsshのデフォルトポート番号ですね。

別の番号を使用する場合は設定変更が必要です。

volumesにコンテナのディレクトリにホストのディレクトリをマウントさせます。

この設定では、

コンテナ /etc/gitlab – ホスト /srv/gitlab/config
コンテナ /var/log/gitlab – ホスト /srv/gitlab/logs
コンテナ /var/opt/gitlab – ホスト /srv/gitlab/data

つまりコンテナ側で作成したファイルが、ホストの上のディレクトリに出力されるわけですね。

これでコンテナを立ち上げます。

docker-compose up -d

立ち上がり完了まで待ちます。(結構時間かかります)

docker-compose ps

これで、statusがhealthyと表示されれば立ち上がり完了です。

ブラウザでhttp://自分のIPアドレス:8080にアクセスしてGitLabの画面が表示されればOKです。

rootパスワードの設定

Linuxのコンソールで以下のコマンドを入力します。

docker-compose exec gitlab gitlab-rails console -e production

Rubyのコンソールに切り替わるので、以下のコマンドを入力します。

user = User.where(id: 1).first
user.password = '新しいパスワード'
user.password_confirmation = '新しいパスワード'
user.save!
exit

パスワードは複雑な文字列で入力しないとエラーになります。

正常に入力完了したらログイン画面からrootでログインできることを確認して、

ログイン出来たらOK。

X(旧Twitter)のお金配りアカウントに関わってはいけない理由。

昔、元ZOZOTOWNの社長の前澤さんがX(旧Twitter)で

「お金配りまーす」

と呟いてから、一気にお金配りアカウントが沢山TLに出てくるようになって、

最近ではそのポスト内容に注意を促すコミュニティノートも作られるようになりました。

こういうアカウントのポストに乗っかって油断すると、大変な目にあうと言われています。

これは実際にX(旧Twitter)で見てきた情報です。

個人情報を抜き取られる

お金配りアカウントから当選の連絡が来るかもしれません。

そして、振り込みに必要な情報などを求められるかもしれません。

でも、貴方の情報は教えてはいけません。

情報を教えてもお金が振り込まれることは一切無いでしょう。

そして、その情報は名簿屋に売られて、

名簿屋からスパム業者に売られ、大量のスパムメールが送られてくるでしょう。

犯罪に加担される

お金配りアカウントに当選の連絡が来て振込先の口座を教えた場合、

実際にお金が振り込まれます。

しかし、振り込まれた金額が想定よりも多いことに気がつきます。

このことについて問い合わせると、

間違って多く振り込んでしまったので、

一部は貴方にあげるので、

残りを口座から引き出して、指定した場所に来て欲しいと言われます。

そして、その通りに行動し、指定した場所に行くと、

そこには警察が待ち構えており、貴方は逮捕されるでしょう。

これは何が起きたかというと、

貴方が教えた銀行口座は特殊詐欺の振込先口座として利用され、

貴方は受け子として詐欺グループに利用されたのです。

なので、警察は貴方をマークして、最終的に逮捕となるわけです。

怖いですね。

なので、身元も分からない相手に個人情報を教えるのは良いことではありません。

簡単にお金を稼ぐ方法は無いと思ってください。

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

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

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へアクセスする。