カテゴリー: linux

  • Understanding PHP Version Availability in Ubuntu Containers

    Understanding PHP Version Availability in Ubuntu Containers

    Introduction

    When working with Docker containers based on Ubuntu, one might encounter limitations regarding the availability of PHP versions. This blog post explores these limitations, specifically between Ubuntu 18.04 and Ubuntu 20.04 containers, and provides insights into how you can successfully manage PHP installations within these environments.

    Background

    PHP is a widely-used open-source general-purpose scripting language that is especially suited for web development. The availability of different PHP versions in Docker containers can significantly affect your development and deployment processes. Recently, I encountered a situation that necessitated a deeper dive into which PHP versions are installable on different Ubuntu containers.

    The Discovery Process

    Initially, I attempted to install PHP versions 7.3 and above in a Docker container based on ubuntu:18.04. Despite my efforts and even after adding the popular Ondřej Surý PPA, I was unable to install PHP versions higher than 7.2. This limitation posed a significant challenge, as many of my projects required at least PHP 7.3 due to various dependencies and features introduced in later PHP versions.

    Experimenting with Ubuntu 18.04

    Using the ubuntu:18.04 container, I attempted to install PHP 7.3 and 8.0 by leveraging the following commands:

    sudo add-apt-repository ppa:ondrej/php
    sudo apt-get update
    sudo apt-get install php7.3

    However, I encountered the following issue:

    E: Unable to locate package php7.3
    E: Couldn't find any package by glob 'php7.3'
    E: Couldn't find any package by regex 'php7.3'

    Switching to Ubuntu 20.04

    Prompted by the challenges faced with ubuntu:18.04, I decided to switch my Docker container to ubuntu:20.04. After applying the same steps, I was pleasantly surprised to find that I could successfully install PHP versions 7.3, 7.4, and even PHP 8.0 without any issues.

    Analysis

    This experience highlighted a crucial aspect of working with Docker and Ubuntu containers – the base image significantly impacts the availability of software packages. Ubuntu 18.04, being an older LTS release, does not natively support PHP versions higher than 7.2 without additional, sometimes complex, configurations. In contrast, Ubuntu 20.04, a more recent LTS version, has out-of-the-box support for newer PHP versions, reflecting the advancements in software compatibility and availability.

    Conclusion

    For developers and DevOps engineers working with PHP in Docker environments, understanding the relationship between the base container image and software package availability is crucial. If you’re planning to use PHP versions 7.3 or newer, opting for an ubuntu:20.04 container would be the more straightforward and efficient choice.

    This exploration not only solved my immediate problem but also served as a valuable reminder of the importance of keeping both software and knowledge up to date. I hope sharing this experience helps others navigate similar challenges in their development workflows.

    Recommendations

    • Always check the PHP version compatibility with your chosen Ubuntu container version before starting your project setup.
    • Consider upgrading your Docker container to a newer Ubuntu version if you require support for newer PHP versions.
    • Stay informed about the PHP versions supported by Ubuntu releases to ensure smooth development and deployment processes.
  • Postfix 3.5.9-r0 と Alpine Linux の「hash」辞書タイプサポートの変更に対応する方法

    Postfix 3.5.9-r0 と Alpine Linux の「hash」辞書タイプサポートの変更に対応する方法

    Postfix は、多くのシステム管理者にとって信頼性の高いメールサーバーとして知られています。しかし、アップデートや変更が行われる際には、互換性の問題や新しい機能の導入に注意が必要です。

    問題の概要

    Alpine Linux 3.13 で Postfix 3.5.9-r0 にアップデートすると、デフォルトの hash 辞書タイプがサポートされなくなる問題が発生しています。

    解決方法

    1. /etc/postfix/main.cf 内の全ての hash または btree を使用するテーブルをサポートされている代替手段に変更します。多くの場合、lmdb が推奨される代替手段となります。

    例:

    alias_database = hash:/etc/postfix/aliases

    alias_database = lmdb:/etc/postfix/aliases

    に変更します。

    1. そして、postmap コマンドを使用してルックアップテーブルを作成します。
    postmap lmdb:/etc/postfix/canonical

    結論

    技術の進化とともに、ソフトウェアのアップデートや変更は避けられません。しかし、その変更に迅速に対応し、正確な情報を共有することで、コミュニティ全体が利益を得ることができます。この記事が、Postfix と Alpine Linux の最新の変更に対応する際の手助けとなれば幸いです。

  • PostgreSQLのテーブル定義を確認する方法:コマンドラインとGUIクライアントの違い

    PostgreSQLのテーブル定義を確認する方法:コマンドラインとGUIクライアントの違い

    PostgreSQLデータベースを操作する際、テーブルの定義を確認する必要がしばしばあります。

    テーブルの列名やデータ型を把握することで、適切なSQLクエリを作成し、データ操作を正確に行うことができます。

    一般的に、PostgreSQLのコマンドラインツールであるpsqlを使用してテーブルの定義を確認することが多いです。コマンドは、指定したテーブルの列名、データ型、修飾子、そして列の説明を表示します。

    例えば、テーブル名がhoge_tableの場合、次のコマンドを使用します:

    \d hoge_table

    しかしながら、全てのデータベース操作がコマンドラインから行われるわけではありません。

    GUIベースのデータベースクライアントツールを使用することが一般的であり、その中でもTablePlusはその使いやすさと直感的なインターフェースで高く評価されています。

    しかし、TablePlusやその他のいくつかのGUIクライアントツールでは、psql特有の\dコマンドが使用できません。

    その場合、次のSQLクエリを使用してテーブルの構造を確認することができます

    SELECT column_name, data_type
    FROM information_schema.columns
    WHERE table_name = 'hoge_table';

    このクエリは、テーブルのすべてのカラム名とそのデータ型を表示します。この方法は標準的なSQLクエリであるため、多くのデータベース管理ツールで使用できます。

    データベースを操作する際には、使用しているツールの特性を理解し、それに応じた最適な操作方法を選択することが重要です。それによって効率的かつ正確なデータ操作を行うことが可能となります。この記事がその一助となれば幸いです。

  • SSH ProxyJumpを利用した便利な接続方法

    SSH ProxyJumpを利用した便利な接続方法

    SSHを使用してサーバーに接続する際、中継サーバー(bastionホスト)を経由しなければならない場面は珍しくありません。こ

    の手順は煩わしく、特に同じ設定を繰り返し行う必要がある場合、非効率的に感じるかもしれません。

    そんな時に便利なのがSSHのプロキシジャンプ(ProxyJump)機能です。一度のコマンドで中継サーバーを経由してターゲットサーバーに接続することが可能になります。

    設定は以下のように行います。

    まずは、~/.ssh/configに中継サーバーとターゲットサーバーの設定を記述します。

    Host stg-bastion
    Hostname xxxxxxxx
    IdentityFile ~/.ssh/your_identity_file

    Host target-server
    Hostname xxxxxxxx
    IdentityFile ~/.ssh/your_identity_file
    ProxyJump stg-bastion

    ここでは、stg-bastionという名前の中継サーバーに接続し、そこを経由してtarget-serverという名前のターゲットサーバーに接続します。どちらの接続でも同じIdentityFileが使用されます。

    設定を追加したら、以下のコマンドを実行することで、直接target-serverサーバに接続できます:

    ssh target-server

    この機能を使用することで、SSH接続の作業を大幅に効率化できます。あなたもぜひ試してみてください。

    以上、SSH ProxyJumpを利用した便利な接続方法についての記事でした。参考になれば幸いです。

  • jqコマンドでJSONから指定した項目を取得・変換する

    jqコマンドでJSONから指定した項目を取得・変換する

    JSONはウェブのデータ交換形式として広く使われていますが、大量のデータを扱うときはデータをフィルタリングしたり整形したりすることが必要になることがあります。今回は、jqコマンドを使ってJSONから特定の項目を取り出し、新しい形式に整形する方法、特定の条件にマッチするレコードのみを選択する方法、そしてmap関数の使い方を紹介します。

    JSONデータの例

    以下に、我々が今回扱うサンプルのJSONデータを示します:

    {
    "records": [
    {
    "id": 1234,
    "user": {
    "id": 5678,
    "account": "user1@example.com",
    "status": 0,
    "attributes": []
    },
    "attributes": [
    {
    "values": [
    {
    "value": "2023-01-01T00:00:00"
    }
    ],
    "id": 2,
    "name": "Date"
    },
    {
    "values": [
    {
    "value": "AB01"
    }
    ],
    "id": 1,
    "name": "Code"
    }
    ]
    }
    ],
    "meta": {
    "totalCount": 999,
    "page": 1,
    "countPerPage": 1,
    "maxPage": 999
    }
    }

    このデータには複数のレコードが含まれ、各レコードにはuser情報とattributes情報があります。

    jqコマンドで特定の項目を取得

    今回の目的は、各レコードから特定の項目を取得し、それを新しい形式に整形することです。これを達成するために、jqコマンドを使用します。

    以下に、新しい形式にデータを整形するためのjqコマンドを示します:

    jq '[.records[] | {EmployeeNumber: .user.id, Email: .user.account, GradeDate: .attributes[0].values[0].value, Grade: .attributes[1].values[0].value}]' input.json

    このコマンドは以下の操作を行います:

    1. レコード配列の各要素に対して操作を行います。
      (.records[] |)。
    2. 新しいオブジェクトを作成し、その中に指定のキーと値を設定します({EmployeeNumber: .user.id, Email: .user.account, GradeDate: .attributes[0].values[0].value, Grade: .attributes[1].values[0].value})。
    3. すべての新しいオブジェクトを包含する配列を作成します([…])。

    これにより、各レコードは新しい形式のオブジェクトに変換され、すべてのオブジェクトが配列に格納されます。それぞれのオブジェクトは EmployeeNumber、Email、GradeDate、Grade の 4つのフィールドを持ちます。

    特定の条件にマッチするレコードを選択

    また、jqは特定の条件にマッチするレコードだけを選択するためのフィルタリング機能も提供しています。たとえば、statusが0のレコードだけを選択するには、以下のようにします:

    jq '[.records[] | select(.user.status == 0) | {EmployeeNumber: .user.id, Email: .user.account, GradeDate: .attributes[0].values[0].value, Grade: .attributes[1].values[0].value}]' input.json

    このコマンドではselect(.user.status == 0)を使用して statusが0のレコードだけを選択しています。

    map関数の使い方

    関数は、配列の各要素に関数を適用して新しい配列を作成するためのものです。たとえば、各レコードのattributesの中のvaluesを取り出すには以下のようにします:

    jq '.records[] | .attributes | map(.values[].value)' input.json

    このコマンドでは、まず各レコードのattributesを取り出し(.records[] | .attributes)、それからmap関数を使って各attributesの中のvaluesのvalueを取り出しています(map(.values[].value))。

    結論

    このように、jqコマンドは非常に強力で柔軟なツールであり、JSONデータの検索やフィルタリング、変換に最適です。特にselect関数とmap関数は、データのフィルタリングや変換において非常に便利です。

    様々な場面でのデータ操作に活用してみてください。また、jqのドキュメンテーションは非常に充実していますので、さらに高度な操作を学びたい場合はそちらを参照してみてください。

  • SQL: Null値の扱い方 – COALESCE関数を使った実践的なガイド

    SQL: Null値の扱い方 – COALESCE関数を使った実践的なガイド

    データベースを操作するとき、null値をどのように扱うかは一般的な問題です。実際、Nullはデータが存在しないことを示し、これが意図的である場合もあれば、データが不足しているためである場合もあります。したがって、null値を適切に処理することはデータ管理の重要な部分です。 今日は、SQLのCOALESCE関数を用いたnull値の扱い方について解説します。COALESCE関数は、引数のリストから最初の非null値を返します。

    COALESCE関数とは?

    COALESCE関数は、引数リストから最初の非null値を返すSQLの関数です。COALESCE関数は、以下のように使用します:

    COALESCE(value1, value2, ..., valueN)

    value1からvalueNまでの値が順番に評価され、最初の非null値が返されます。すべての値がnullの場合、COALESCE関数はnullを返します。

    COALESCE関数の具体的な使用例

    例として、以下のテーブルを考えてみましょう。

    CREATE TABLE Employees (
    id INT PRIMARY KEY,
    firstName VARCHAR(100),
    lastName VARCHAR(100),
    email VARCHAR(100)
    );

    このテーブルで、firstNameとlastNameのどちらかがnullの場合に、その代わりに’email not provided’という文字列を表示したいとします。この場合、COALESCE関数を使用できます。

    SELECT id, COALESCE(firstName, 'email not provided') AS firstName, COALESCE(lastName, 'email not provided') AS lastName FROM Employees;

    これにより、firstNameまたはlastNameがnullの場合、その値の代わりに’email not provided’と表示されます。

    数値データに対するCOALESCE関数の使用

    COALESCE関数は数値データにも適用できます。たとえば、ある数値の列がnullの場合、その代わりに0を表示したいとします。この場合もCOALESCE関数を使用できます。

    SELECT id, COALESCE(salary, 0) AS salary FROM Employees;

    これにより、salaryがnullの場合、その値の代わりに0が表示されます。

    まとめ

    COALESCE関数はSQLの強力なツールであり、null値を簡単に扱うことができます。適切なデフォルト値を設定することで、データの一貫性を維持しつつ、欠損データを適切に扱うことができます。SQLのクエリにCOALESCE関数を組み込むことで、データ分析やレポート生成のプロセスをよりスムーズに、より効率的に進めることが可能になります。 また、特定のデータタイプに対して特定のデフォルト値を設定することも可能です。例えば、数値型がnullの場合には0を、文字列型がnullの場合には空文字列(”)をデフォルト値とするなど、データの種類により異なる扱い方をすることができます。

    SELECT
    COALESCE(NENDO, '') AS NENDO,
    COALESCE(HANKI, '') AS HANKI,
    COALESCE(OROSI_DAIHYO_CD, '') AS OROSI_DAIHYO_CD,
    COALESCE(MSDSH_HANTEI_JISSEKI_NEW, 0) AS MSDSH_HANTEI_JISSEKI_NEW,
    FROM YOUR_TABLE;

    以上のように、COALESCE関数を使用すると、一貫性を保ったままかつ効率的にデータベース内のnull値を扱うことができます。COALESCE関数のこのような特性は、データベース操作の質を向上させ、データ解析の正確性を保つ上で重要な役割を果たします。


    これで、SQLのCOALESCE関数についての基本的なガイドと具体的な使用例を提供しました。この記事が、日々のデータベース操作で遭遇する可能性のあるnull値の問題に対する理解と解決の助けになることを願っています。COALESCE関数をうまく使いこなして、より洗練されたデータ処理を実現していけたら幸いです。

  • Vimでよく使う便利なコマンド

    Vimでよく使う便利なコマンド

    検索文字をハイライトする

    :set hlsearch!

    オートインデント

    :set autoindent

    行番号を表示

    :set nu

  • GitLab Connection to gitlab.com timed out. (connect timeout=5)’))

    GitLab Connection to gitlab.com timed out. (connect timeout=5)’))

    はじめに

    GitLabに接続する際、

    GitLab Connection to gitlab.com timed out. (connect timeout=5)'))

    のように表示されることがある

    原因

    接続元が同しIPの接続元から、gitLabに複数回アクセスしたものの認証に失敗した。

    しかし、なんどもログイン失敗したため、接続元のIPを自動でプラックリストに入ってしまったことが原因

  • Alternative Directory LayoutでAnsible-playbookを作った際に考えたこと

    Alternative Directory LayoutでAnsible-playbookを作った際に考えたこと

    はじめに

    Ansibleで環境を作ろうと思えば、Ansibleのディレクトリ構成をどのような作り方もできてしまうが、Ansibleのbest practicesのAlternative Directory Layout (https://docs.ansible.com/ansible/2.5/user_guide/playbooks_best_practices.html#alternative-directory-layout )を元に構成を作ることにした

     

    なぜAlternative Directory Layout

    まず、Alternativeではない、正攻法(?)のDirectry Layoutは、以下のとおり

    Directry Layout

     

    これに対し、Alternative Directory Layout は Staging/Production が 明確に分かれているのが特徴だ

    Alternative Directory Layout

    双方のメリット・デメリット

    メリット

    productionとstagingがディレクトリが分かれているため 環境ごとに設定を変える事ができる。

    Directry Layoutの場合、productionとstagingがディレクトリが分かれていない。

    そのため、productionとstagingが全く同じ環境であればよいが、ランニングコストを下げるためにStagingのみ台数を減らしたり、パラメータを変更するようなことが柔軟にやりにくくなってしまう。現在のみならず、先々を考慮しこの構成を採用した

    デメリット

    ほとんどの設定ファイルがproductionとstagingで冗長してしまう

    結論

    上記デメリットがあるものの、Alternative Directory Layout を採用することによる享受できるメリットが判断し、このレイアウトを採用することにした。

  • n日前のファイルを削除する

    n日前のファイルを削除する

    ファイルのローテーションをするために処理を書くことがある、find コマンドの -mtime オプションを使うが、このようなニーズでないと使わないのでメモ。

     find /home/hoge/backup/* -mtime +7 

    7日前のファイルが表示される。

    xargs コマンドと合わせて削除をする。

    find /home/hoge/backup/* -mtime +7 | xargs rm -f