Avatar
🎍

Organizations

  • 概要

    プライベートと仕事で1台のパソコンで2つのGitHubアカウントを管理する機会がありました。 ここではリポジトリのクローンやpush等、SSH接続するために必要な設定について記載します。

    設定手順

    現在の設定を確認する

    まずはSSHがどのアカウントで認証されているかを確認します。

    ssh -T git@github.com
    

    SSHが設定できていれば、次のように返ってきます。

    Hi <ユーザー名>! You've successfully authenticated, but GitHub does not provide shell access.
    

    .ssh/configを設定する

    SSHをGitHubアカウントによって使い分ける場合には、configで設定を行う必要があります。

    例:

    # メインアカウント
    Host github-hoge
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_ed25519_hoge
        IdentitiesOnly yes
    
    # サブアカウント    
    Host github-fuga
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_ed25519_fuga
        IdentitiesOnly yes
    
    • Hostは設定上のニックネームです
    • HostNameは実際のホスト名です
    • UserはSSH接続先のサーバーにログインする時に使用するユーザー名です。(GitHubアカウント名とは別です。git@github.com:<user|organisation>/<repo>.gitでいう頭のgitがこれに相当します。)
    • IdentityFileはSSH接続時に参照するSSH鍵のパスです。
    • IdentitiesOnlySSHがどの鍵を認証に使うかを制限するための設定です。

    特にIdentitiesOnly yesは、今回のように複数のGitHubアカウントを1台のパソコンで扱う場合、他の鍵を参照させないために必須の設定となります。

    設定後確認

    設定が済んだら、サブアカウントを確認するため次のコマンドを打ってみましょう

    ssh -T git@<サブアカウントの Host>
    

    例えば上記の設定だと次のコマンドです。

    ssh -T git@github-fuga
    

    設定ができていれば、サブアカウントのGitHubアカウント名で返事が返ってくるでしょう。

    補足

    もう一点、複数のGitHub運用で大事なことは、git/configユーザー名とE-mailアドレスの設定です。 デフォルトではメインアカウントが設定されているため、この操作を行わないと、意図しないアカウントでcommit, pushしてしまう可能性があります。

    私はサブアカウントで管理するリポジトリ単位毎に設定を行います。 対象のリポジトリで以下を打ち込みます。

    git config user.name "example-account-name"
    git config user.email "example@mail.com"
    

    まとめ

    1台のパソコンで複数のGitHubアカウントを管理する際の.ssh/configgit/configについて学ぶことができました。

    tech Created Sun, 09 Aug 2026 19:57:11 +0000
  • 概要

    FTPサーバーにフォルダをアップロードする機能を実装した。 この実装にwebkitdirectory属性を使用しているが、公式では以下のような警告があり、この内容について深掘りした。

    警告文その1

    警告
    webkitdirectory 属性は標準ではありませんし、 標準化の過程にも入っていません。 
    この属性を Web 上の本番環境で使わないで下さい: なぜなら、この属性を全ユーザーが使えるとは限らないからです。 
    また、この属性はクライアントの実装に非互換がある可能性もありますし、 振る舞いが将来変更される可能性もあります。
    

    主な内容としてはwebkitdirectory属性はブラウザに依存するので、ユーザーによっては期待通りに機能しない可能性があるためとのこと。

    続いて、

    PHP は ブラウザ/ユーザーエージェントから送られてきた相対パスの情報をパースし、 その情報を $_FILES 配列に渡すことだけを行います。 
    full_path 配列中の値が、 実際のディレクトリ構造を含んでいるという保証はありません。 
    よって、PHP アプリケーションはこの情報を信用してはいけません。
    

    この箇所に触れる前に$_FIELSについて簡単に説明する。$_FILESはPHPで使用できるグローバルな変数で、フォームから送信されるファイルデータはこの変数に格納される。

    この$_FILESのデータ構造内で、full_pathは以下のように表示される。

    ["full_path"]=> array(2) { [0]=> string(15) "test1/.DS_Store" [1]=> string(16) "test1/hellow.pdf" } 
    

    var_dump

    PHPはユーザーが送信したデータをチェックしないため、場合によっては意図しないファイルが書き込まれてしまうリスクがある。

    警告文その2

    別の記事も読む。意図しない挙動について’Path Traversal’と命名されていた。

    The full_path array in each $_FILES field is not safe, because it is direct user input. 
    All values from this array must be validated to prevent potential vulnerabilities, 
    especially when storing the uploaded files in sub directories on the server.
    

    対応

    このリスクの対応として、以下が挙げられる。

    tech Created Fri, 10 Jul 2026 19:30:43 +0000
  • 概要

    FTPを使い、ファイルをアップロード/ダウンロード/削除できるウェブアプリを作りました。 アプリはDockerコンテナにホストします。

    本文ではファイルのダウンロードの実装の際に詰まった箇所について書きます。 この経験を通し、Dockerコンテナでホストするアプリを使いFTPサーバーからコンピューターのハードドライブへの直接ダウンロードはできないことを理解しました。

    達成したかったこと

    Dockerコンテナにホストするアプリを使い、FTPサーバーにあるファイルをコンピュータのハードドライブにダウンロードすることを目標としました。

    ディレクトリは以下の通りです。

    my-php-app/
    │
    ├── .devcontainer/                  
    │   ├── devcontainer.json   # 開発環境の設定      
    │   └── docker-compose.yml  # php, nginxと各コンテナを設定         
    │
    ├── nginx/                  
    │   ├── default.conf       
    │   └── Dockerfile 
    │
    ├── php_code/                  
    │   ├── src/                  
    │   │  ├── download.php # ファイルのダウンロードを実装     
    │   │  └── index.php            
    │   └── Dockerfile
    │
    └── README.md  
    

    ダウンロードを実行するコードです。(download.php)

    $remote_file = filter_input(INPUT_GET, 'download_file', FILTER_UNSAFE_RAW);
    $download_dir = '../../downloads/';
    $download_file = $download_dir . $remote_file;
    
    ftp_get($conn_id, $download_file, $remote_file, FTP_BINARY)
    

    ftp_get

    tech Created Thu, 02 Jul 2026 20:57:38 +0000
  • はじめに

    前回のブログ内容に続いています。 devcontainerでPHPフルスタックアプリケーション開発環境を作成、その際Dockerコンテナ起動に合わせてMySQLも初期化できるように設定しました。失敗についても書きます。

    結論

    /docker-entrypoint-initdb.dを使うとコンテナ起動時にデータベース初期化を行うことができる。

    達成したかったこと

    devcontainer起動時にデータベースの初期化を自動化したいと思いました。

    ディレクトリは以下の通りです。

    my-php-app/
    │
    ├── .devcontainer/                  
    │   ├── devcontainer.json   # 開発環境の設定      
    │   └── docker-compose.yml  # php, nginx, dbと各コンテナを設定         
    │
    ├── mysql/                  
    │   ├── initdb/
    │	│   ├── 01-create-user.sh   # ユーザー作成スクリプト      
    │	│   └── 02-schema.sql       # テーブル作成スクリプト               
    │   ├── entrypoint.sh
    │	└── Dockerfile 
    ├── nginx/                  
    │   ├── default.conf       
    │   └── Dockerfile 
    │
    ├── php_code/                  
    │   ├── index.php           
    │   └── Dockerfile
    │
    └── README.md                
    

    設定は以下のとおりです。

    docker-compose.yml

    version: "3.9"
    services:
    	nginx:
    	build: ../nginx/
    	ports:
    		- 80:80
    	volumes:
    		- ../:/var/www/html/
    
    php:
    	build: ../php/
    	volumes:
    		- ../:/var/www/html/
    
    db:
    	image: ../mysql/
    	volumes:
    		- mysql-data:/var/lib/mysql
    		- ../mysql/initdb:/docker-entrypoint-initdb.d
    	environment:
    		MYSQL_ROOT_PASSWORD: mariadb
    		MYSQL_DATABASE: memopad
    
    volumes:
    	mysql-data:
    

    Dockerfile

    tech Created Thu, 11 Jun 2026 18:57:26 +0000
  • はじめに

    devcontainerPHPのフルスタックアプリケーション開発環境を作成しました。 その過程でnginxの設定に詰まったので振り返りを兼ねて共有します。

    結論

    nginx, PHPとディレクトリを分けた状態でDockerインスタンスを連携させるにはDocumentRootの設定を追加し、nginx.confrootのパスを修正する必要がありました。

    達成したかったこと

    nginxを使いhttp://localhost/ にアクセスしたら index.phpのページが表示されるようにしたいと思いました。

    ソースコードのディレクトリは以下の通りです。

    my-php-app/
    │
    ├── .devcontainer/                  
    │   ├── devcontainer.json   # 開発環境の設定      
    │   └── docker-compose.yml  # php, nginx, dbと各コンテナを設定         
    │
    ├── nginx/                  
    │   ├── default.conf        # phpアプリのルーティングを設定  
    │   └── Dockerfile 
    │
    ├── php_code/                  
    │   ├── index.php           # / にアクセスした際に表示されるページ
    │   └── Dockerfile
    │
    └── README.md                # プロジェクトの説明
    

    修正前のdocker-compose.yml, nginx.confの設定は以下のとおりです。

    docker-compose.yml

    version: "3.9"
    services:
    	nginx:
    	build: ../nginx/
    	ports:
    		- 80:80
    	volumes:
    		- ../:/var/www/html/
    
    php:
    	build: ../php_code/
    	volumes:
    		- ../:/var/www/html/
    
    db:
    	image: mariadb
    	volumes:
    		- mysql-data:/var/lib/mysql
    	environment:
    		MYSQL_ROOT_PASSWORD: mariadb
    		MYSQL_DATABASE: ecomdb
    
    volumes:
    	mysql-data:
    

    nginx.conf

    tech Created Sat, 06 Jun 2026 19:11:38 +0000
  • 結論

    元々Windowsを使っていましたが、最近は仕事でMacを使うようになりました。 データベースのクエリを書くのに Macの「メモ」機能を使ったところ、Macの「スマート引用符」によりデータを挿入できない状況にハマりました。 もしクォーテーションに変更を加えたくないのであれば、この設定をOFFにする必要があります。

    実際

    データを挿入する際に次のようなエラーに遭遇しました。

    MariaDB [test]> insert into my_items (item_name ) values(‘apple’ ); 
    ERROR 1054 (42S22): Unknown column '‘apple’' in 'VALUES'
    

    データ挿入先のテーブルを作成したクエリは次のとおりです。

    MariaDB [test]> create table my_items ( 
        -> id MEDIUMINT NOT NULL auto_increment, 
        -> item_name_kana char(30) not null,
        -> primary key (id)
        -> ); 
    Query OK, 0 rows affected (0.020 sec)
    

    なぜ単純な文字列を挿入できないのかがわからず、だいぶ時間を取りました。

    理由

    その後分かったのは、Macには「スマート引用符」という機能があり、「まっすぐな引用符をカールした引用符に自動的に置き換え」てくれるそうです。

    お分かりになるでしょうか…

    変換前:'apple'
    
    変換後:‘apple’
    

    つまり、コマンドがシングルクォーテーションを認識できないために文字列を挿入できなかったというわけです。

    このスマート引用符はデフォルトでONになっているため、手動でOFFにすることが可能です。

    Macのクォート自動変換を無効にする

    Windowsの「メモ帳」ではそのような変換がないので、同じつもりでいたら落とし穴がありました😂

    皆さんもご注意くださいませ。

    tech Created Fri, 29 May 2026 16:40:04 +0000
  • こんにちは!😄

    先日、フランスの市民試験を受験し合格することができました 🎉🎉🎉

    私の経験をこれから受験される方にお役立てできれば幸いです。

    注:本内容は個人の経験をベースにしています。正確な情報については政府が提示するウェブサイトでご確認ください。

    french Created Sat, 11 Apr 2026 19:38:49 +0000
  • 記事:ChatGPTは試験的に、アメリカにて無料ユーザーに対し広告を搭載を開始します。

    french tech Created Sun, 18 Jan 2026 10:52:06 +0000
  • 記事:SNSで注目される、フランス外交部のXアカウント’French Response’とは?

    french Created Fri, 16 Jan 2026 09:56:56 +0000
  • 記事:Le français : plus de mille ans d’histoire(フランス語、その千年以上の歴史)をご紹介します。

    french Created Thu, 15 Jan 2026 09:11:42 +0000
Next