記事一覧

WSLの有効化とUbuntuのインストール

公開日時:2021/05/23 14:22

はじめに

Windowsでは歴史的な理由により、システム表層の文字コードはSJISの独自拡張であるWindows-31J(cp932)、内部的にはUTF-16LEとなっています。

これは、現在広く利用されているUTF-8とは異なっており、この文字コードの違いが原因で少なくないトラブルが発生します。

現在のWindows 10では、Windows OS上の仮想環境でLinux OSを稼働させる仕組みである『WSL(Windows Subsystem for Linux)』が標準で利用できるため、文字コードの問題を簡単に回避出来るようになりました。

この記事ではWSLを有効化し、Ubuntuという人気の高いLinuxのディストリビューションをインストールしてそこでPHPの実行環境を作成します。

WSLの有効化

WSLの有効化には最後にWindowsの再起動が必要になります。作業中のファイル等がある場合は保存して閉じておいてください。

準備が整ったら、Windowsタスクバーの検索ウィンドウに『Windowsの機能』と入力してください。『Windows の機能の有効化または無効化』というメニューが表示されます。

Windowsの機能の有効化または無効化

これを選択すると、Windowsの機能ダイアログが表示されます。このメニューの中にある『Linux用Windowsサブシステム』にチェックを入れてWSLを有効化してください。

WSLの有効化

OKボタンをクリクすると有効化処理が始まり、処理が完了すると再起動を求められます。

作業中のファイル等がない場合はWindowsを再起動してください。

WSLの有効化処理中

WSLの有効化完了

Ubuntuのインストール

Linuxの人気ディストリビューションであるUbuntuのインストールは、Microsoft Storeを利用するのが簡単です。勿論、無料でインストール出来ます。

スタートメニューから、Microsoft Storeをクリックして開きます。

Microsoft Storeを開く

ウィンドウ右上の検索から『Ubuntu』を検索してください。

Microsoft Store

検索結果

現在、Ubuntu 20.04 LTSがリリースされているので、これをインストールします。LTSとはLong Time Supportの略で、コンピュータソフトウェアの安定リリースが標準版よりも長期間保守される製品ライフサイクルポリシーの事です。

ウィンドウ右上の『インストール』ボタンをクリックしてください。

Ubuntu 20.04 LTS

Microsoftアカウントへのサインインが求められます。アカウントを所持していない場合はアカウントを作成してください。

Microsoft アカウントへのサインイン

サインインすると、ダウンロードが始まります。

ダウンロード処理

ダウンロードが終わったら起動してください。シェルでUbuntuの初期設定が始まります。しばらくお待ちください…。

ダウンロード完了

Ubuntuの起動

Ubuntuが立ち上がったら、デフォルトユーザーの登録を行います。ユーザー名とパスワードを入力してください。

ユーザー登録

ユーザー登録完了

推奨されている通り、以下のコマンドでUbuntuを最新の状態にします。

sudo apt update

Ubuntuのアップデート中

アップデート完了

PHPのインストール

CentOSの標準パッケージマネージャはyumでしたが、Ubuntuでの標準パッケージマネージャはaptです。

このため、aptを使ってPHPの実行環境をインストールします。CentOSはRedHat Enterprise Linuxのクローンの為に安定版といえる古いPHPが標準となっており別途最新版をインストールする為のリポジトリを追加する必要がありましたが、Ubuntuでは標準で新し目のPHP(7.4)がインストールされます。

sudo apt install php php-cli php7.4-common php-mbstring php-gd php7.4-mysql php-pgsql php-zip php-curl php-json php-xml composer

aptを使ったPHPのインストール

PHPのインストール

インストールが終わったらPHPのバージョンを確認してみましょう。

インストールされたPHPのバージョン

とりあえず、これで良いでしょう。

VSCodeのデフォルト・ターミナルをWSLにする

WSLのインストールが終わったので、あとはVSCodeのデフォルト・ターミナルをWSLにする事で文字コードの問題を解消しようと思います。

VSCodeを開いて、Ctrl+Shift+Pを押して開いた検索ウィンドウで『terminal select』と入力し、候補の中から『Terminal: Select Default Profile』を選択してください。

選択候補の中から『**Ubuntu-20.04 (WSL)』を選びます。

デフォルト・ターミナルの選択

WSLの選択

これで、WSL上のUbuntu(のBash)がデフォルトターミナルになりました。

ターミナル > 新しいターミナルを開いてみましょう。ターミナルの種類が『wsl』になっている筈です。

新しいターミナル

インストールされたPHPのバージョンを確認します。

php -v

PHPのバージョン

php.iniの編集

PHPの設定ファイルであるphp.iniを編集します。

php.iniの場所は以下のコマンドで調べられます。

php -i | grep php.ini

php.iniの場所

php.iniの場所が分かったら、必要な設定を行います。以下は、最低限の設定です。

sudo vi /etc/php/7.4/cli/php.ini
date.timezone = Asia/Tokyo
mbstring.language = Japanese
mbstring.detect_order = UTF-8,SJIS-WIN,SJIS,EUC-JP,JIS,ASCII
mbstring.encoding_translation = 0
mbstring.substitute_character = none

ionCube Loaderのインストール

PHPの実行には必須ではありませんが、当サイトが管理している『Pine Framework』や、その他の暗号化されたPHPコードを実行するにはionCube社(英国)が提供するionCube Loaderが必要です。

上記ionCube Loaderページの『Linux (64 bits)』のtar.gzリンクを右クリックして『リンクアドレスをコピー』を選択します。

Linux 64bit版用のionCube Loader

以下のコマンドで、ionCube Loaderの圧縮ファイルioncube_loaders_lin_x86-64.tar.gzがダウンロードされます。

cd ~
sudo wget https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz

ダウンロードされたtarボール

以下のコマンドで、ダウンロードされた圧縮ファイルioncube_loaders_lin_x86-64.tar.gzを、システム管理者がソフトウェアをローカルにインストールするディレクトリである/usr/localに解凍します。

sudo tar -zxvf ioncube_loaders_lin_x86-64.tar.gz -C /usr/local

解凍されたionCube Loader

先程php -vで確認したとおり、UbuntuにインストールされているPHPはNTS版の7.4.3だったので、ioncube_loader_lin_7.4.soをインストールします(※ggをタイプすると、ファイルの先頭行にカーソルをジャンプさせる事が出来ます)。

sudo vi /etc/php/7.4/cli/php.ini

ioncube_loader.soの登録

Shift+ZZで保存してファイルを閉じます。

ionCube Loaderのインストール状況確認

php -vを実行すると、ionCube Loaderのインストール状況も確認出来ます。

php -v

ionCube Loaderがインストールされた

以上で、WSL+Ubuntu+PHP+ionCube Loaderのインストールと設定は終わりです。

暗黒大陸長野 Vol.2 - SIer世界の闇と光(2013-2014頃)

公開日時:2021/05/15 15:01

初めてのSIerの世界へ

起業後に割と大きな収入源となっていた企業からの仕事がどう考えても割に合わないと判断されるほど崩壊して束縛されるようになって来た為、別の取引先を探す必要性が出てきました。

何しろわたしの会社は所謂一人株式でしたから、わたしがシステム開発に専念している間は誰も営業活動をしてくれません。『働いたら働いた分だけ請求してもらって構わない』という契約ではありましたが、劣悪なコードの山の修正の為に毎日12時間以上も働いていたらそれ以外に割ける時間が全く無くなってしまいます。それでは企業経営は成り立ちません。

本来はそういう事にならないようなプログラムコードを書くのですが、既に劣悪なコードが山のように書かれてしまった後ではもうどうしようもありません。

ですから、大きなバグが一通り取り終わってなんとか動くという段階になったところで『当初の契約の予定期間を2ヶ月過ぎており、稼働時間も多くなり過ぎた事』を理由に、そのプロジェクトからは離脱させてもらいました。

勿論、それに先立って次の仕事を見つけてあり、そちらに参加したい事も理由として相談しましたから無理には引き止められませんでした。

次の仕事ですが、起業当初から参加させてもらっていた長野市ソフト産業協議会で面識が出来たSI企業さんに以前に営業活動に行っていた事がきっかけとなり、年末から翌年半ばまでの半年間で予定されている既存システムのスマフォ対応WEBアプリ化プロジェクトに技術者を派遣してもらえないか?という依頼が届いた事で話が進みました。私の専門分野であったからです。

SIとはSystem Integrationの略で、顧客からの依頼に沿って主にコンピュータシステムを構築して提供する事を指し、それを主業態としている企業の事を蔑視を込めてSIerと呼びます。

派遣事業 - 特定派遣とは?

当時の日本のシステム開発業界では技術者派遣が一般的でした。パソナやパーソルテンプスタッフのような一般的な登録型派遣ではなく、自社の常用型従業員を専門職として派遣する特定派遣という派遣形態です。

この特定派遣事業、事業者として国に届出さえすれば派遣事業を行う事が可能でした。

ですからわたしの会社でもその企業さんからの仕事を受注するため、急遽社会保険労務士さんの事務所の門を叩いて特定派遣事業者としての届出を手伝ってもらいました。届出にあたっては就業規則や職場環境の整備が必須だったからで、一人株式であったわたしの会社には当時、それらが存在しなかったからです。

従業員のためのデスクも必要だったので、長野市にある中古オフィス家具専門店『天下一』さんでそこそこモダンなデスクを確か1万円で購入しました。

中古オフィス家具の天下一

椅子は実家に在った物を持ってきて代用です。

ちなみに、自分が普段使っている椅子はHumanscale製の13万円程の椅子(フリーダムチェア)です。東京に出張に行った時にまだ元気だった頃の大塚家具さんで購入しました。365日、一日12時間以上も座り続ける椅子ですから、そこをケチるわけには行きませんでした。

Humanscale フリーダムチェア

長野市に限らず地方というのは仕事が殆ど無いですから、大抵の中小規模のシステム開発会社は大都市圏の企業に技術者を派遣し、その派遣料で生計を立てるのが一般的になってしまっていました。

ですから、届出制という容易さも相まって、悪徳な経営者は適当に雇い入れた未経験者をロクに教育もせず『3年の実務経験があります』という建前で派遣先へ大量に送り込んで荒稼ぎをするといった悪行が横行するようになります。実はシステム開発会社ではなく、実態は人材紹介会社ですね。

雇用にあたっての待遇もかなり悪く、ずっと派遣先で働いていて基本的に所属会社には出社しない為、自分のデスクすら無い事も少なく無かったようです(※これは違法です)。

こうした背景に加えて偽装請負問題の温床ともなっていた為、法改正によって特定派遣事業の廃止が決まり2015年に施行、それまでの届出済企業についての経過措置も2018年に終了し、現在は非常に厳しい登録基準のある許可制の一般派遣のみに一本化されました。

ですが、特定派遣に味を占めたのは派遣元だけではなく派遣先も一緒でその業界体質は変わる事は無く、現在はSES契約という全く新しい形態へと進化(悪化)を遂げています。

日本の法律にはそんな契約形態は存在しませんから実態としてどの契約形態であるのかを明確にする必要があるのですが、大抵の人は法律を全く知らないので特定派遣よりも更に劣悪な環境で業務をさせられていたりするようです。

SIerが嫌われている理由を痛感する

仕事の基本がなっていない

派遣先で働き始めてからすぐに、特定派遣の酷さについて理解し始めます。

初日はまず、貸与されたノートPCのセットアップでした。A4用紙10枚ほどの手順書が渡され、OSの初期設定や職場内での環境の統一、セキュリティ面の安全性の確保といった基本的な作業について、派遣労働者が自分でセットアップを行います。大々的にシステム開発を謳っている会社ですが、環境構築自動化ツールみたいな物はありません。だから派遣労働者にやらせるのでしょうけどね。

手順自体は非常に簡単でしたが、ノートPCのスペックが低くHDDのため異常に時間が掛かります。規定のインストール作業だけでほぼ丸一日費やしました。就労期間中に新しく入って来た別の会社の派遣労働者さん達の様子もみていましたが、皆、必ず丸一日掛かっていましたからわたしだけ手が遅いといった話ではないです。

そして、2日目から既に業務開始です。自分が普段使っているIDEを入れてセットアップしたり、ローカル検証環境を整えたりといった時間は一切ありませんでした。ネットの情報を色々見てきましたが、大体どこもこんな感じのようですね。システム開発に限った話ではなく仕事を行う上で一番重要な環境を整えるという工程が完全に無視されています。何故ならSIの人達は『仕事とはどのようにやるべきか?』という基本的な事を何一つ知りませんから。『そりゃ、どこのプロジェクトも炎上しまくるだろ』と納得します。

楽観排他を知らない人

その業務、わたしの会社とそのSI企業が契約する際に前提となっていたプロジェクトではありません

当初予定されていたプロジェクトの前工程が遅延している為、準備が整うまでの間別のプロジェクトを手伝って欲しいというわけです。

それ自体は特に異存は無いのですが、やっている事がめちゃくちゃでした。

業務指示をしてくる人も契約書にある派遣先指揮者では無く、とにかく態度が横柄です。技術者派遣の現場でのプロパー(生え抜き社員、派遣の場では主に派遣先企業正社員の意味で使われる)の人格の酷さについては噂で聞いていましたが『あ、本当だったんですね』といった感じでした。

業務内容はある程度進行しているシステム仕様追加の検証と改修対応でしたが、わたしの手元に来た時点で既に燦々たる状況です。ソースコードは巨大ネストしている上、インデントがバラバラですが整形はしてはいけません。修正対象外の行が差分として検出されてしまうからだそうです。そして、開発用サーバですらエラー表示が切ってあり、異常終了しても何が起きたのかすら分かりません。もう、言っている事とやっている事がメチャクチャです。

ベタ書きしてあるデータベースのSELECTクエリは仕様追加・変更の度に無計画にUNIONが繰り返されたらしく400~500行もありますが、その仕様が仕様書には書いてありません。長大なSQLクエリだけが記述してあります。ですから本当は一体何をしたいのか?すらよく分かりません。つまり、まともに検証する事も書き直す事も出来ません。

渡された仕様書では楽観排他が必須とされていますが、肝心の実装では楽観排他の基準となるレコードをロックしていませんからアクセスが重なると当然コンフリクトします。

それをプロパーに報告すると『なんで楽観排他なのにロックしなきゃいけないの?』と、まるで馬鹿を見るような顔をして言われます。ですから仕方なくメカニズムを図示して提出したのですが、今度は『難しくてわかんない』だそうです。あなた、仕事を一体何だと思ってるんですか?

その仕様書、この人が書いたんですけどね…。自分で『楽観排他』と書いたのに、楽観排他とはどのような物なのか全く知らないのです。SIerってこんな感じなんですよね。楽観排他を理解していなかったら、複数人が同時に使用するシステムなんて作れるわけがありません。

ダメな楽観排他

※こういった事を公開するのはNDA(機密保持契約)に違反する可能性があるという事も理解しますが、NDAというのは本来企業利益に対する侵害を禁止する契約であって、企業の杜撰さを隠蔽する為の物ではありません。守秘義務とは全く異なります。ですから、可能と思われる範囲で杜撰さについては言及していきます。一個人・一企業の利害だけ語っているわけではありませんので、それがシステム開発業界全体の為であろうと考えます。

urlを開いてボタンを押すことすら出来ない人

そのプロジェクトが終わると、次はちょっとした作業の指示が来ます。

外注して納品されたWEBページにFacebookの『いいね!』ソーシャルボタンを追加するだけという依頼でしたが、本当にだけなら、自分でやるんですよね。

いいね!ボタン

見てみると、外注した業者が納品したHTML、CSSのソースコードが既にカオスです。

とにかくやっている事がメチャクチャ。WEB制作会社とかWEBデザイナーとか言っている人達は難しい事を考えられない人が多いので構造化が本当に下手くそです。

一時、セマンティック・ウェブとかいう言葉が流行りましたが意味を理解していないので片っ端からidやclassをつけまくってHTMLだけ見てもゴミクズの山みたいになっている事が頻繁にありますし、CSSに至っては『これ、巻物ですか?』みたいに長大なファイルになっていたりして目も当てられません(Sassコンパイルやwebpacしたわけではなく)。

そのゴミ溜めのようなHTML上にソーシャルボタン用HTMLを追加し、ゴミ溜めのようなCSSにスタイルを追記して検証環境でレイアウトの確認、本番環境のサーバへのアクセス権は貰っていないためソースコードだけ渡して作業を終了しました。

それが、翌日になって『いいね!』ボタンを押してもカウントが変わらないと言われます。

どういう事だろうと思ってGoogle検索してみると、Facebookソーシャルボタンの実質バグだそうで、対応方法まで含めて30秒で理由が分かりましたが、プロパーはGoogle検索すら出来ません。わたしには本番環境へのアクセス権が与えられていませんからわたしが自分で動作検証する事は出来ないんですけどね…。

その後プロパーはソーシャルプラグイン上に表示される画像等も含めて自分で何度か微調整を繰り返していましたが、その変更内容を即時反映させるにはFacebook上で強制的にキャッシュをリフレッシュさせる必要がありました。やる事はFacebookのデベロッパーツールでボタンをクリックするだけなのですが、そのプロパーはそれすら嫌がってわたしに指示を出してきます。

WEBページを開いてボタンをクリックするだけよりも、わたしの席までわざわざやって来て口頭で指示を繰り返す方が簡単な思考回路の方なんですね…。ちょっと想像の枠を超えてきました。

A社、再び

次の業務もやはり、炎上中のプロジェクトのサポートです。契約の前提であったプロジェクトにはいつまで経っても参加出来ません。

炎上理由は端的に言えば、A社から来ている技術者の能力の低さです。

参加した初日に私に依頼された業務は、現在開発中、あるいは改修中であったWEBシステムのテストを行う、というものでした。

これについてテスト項目書は存在せず、仕様書も存在せず、ただひたすら抽象化された極めて内容の把握しにくい設計書があるだけでした。

私が関わった仕事の全てについて「まともな仕様書」というものは存在せず、「画面設計書」という名のサーバーサイドの処理とクライアントサイドの処理を併記した、奇妙な書類が必ず存在していました。システム開発がどういう物なのか分かっていない人程、仕様書と設計書の違いという物を全く理解していませんね。

これにおける最大の問題点は、設計書の通りに確かに動作はするが、論理的に考えてこの動作はおかしかろうというものについて、それが期待される仕様であるのか、設計書そのものが間違っているのかの判断が不可能なことで、試験を行った結果の適合・不適合は全く意味を持たない事です。

ある時わたしが、設計書には書かれていないが極めて非論理的な動作を行う処理に気づき、実装を行っているA社の女性を呼んで「これは正しい動作ですか?」と聞いたところ、彼女は「え!?なんでこうなるんだろう!?」と頭をかかえながらノートパソコンを開き、プログラムコードを確認し始めました。

そのモニタに映ったコードを見て『なるほど、これではバグだらけになるのも無理はなかろう』と納得しました。

私が見たのは、彼女のノートパソコンの画面一面を埋め尽くすPHPのソースコードでした。1関数内のソースコードだけでノートPCの画面一面を埋め尽くしています。

正しく『縦にも横にも長い巻物』という奴です。そんなコード書いていたら、そりゃあ、バグだらけになりますよ…。

※イメージとしてはこんな感じです。

画面一面のソースコードイメージ

みんな、病んでいる

その後やっと本来のプロジェクトに参加出来るようになったのですが、この時点で既にマイナススタートです。

使用が予定されている技術について、前任者であるB社の技術者Mさんとプロパーが一緒に事前調査・動作検証を行って完了していた筈なのですが、実質的に何もやってありませんでした。個別の技術が動作する事は確認してあったようですが、それらを組み合わせて干渉し合わないかといった検証は何一つやってありませんでした。このせいで正規の実装中に無視できない問題がいくつか発生する事になります。本当に2ヶ月近くの間一体何をしていたんだろう?という感じです。

Mさんから引継ぎがあったのですがMさんは完全なコミュニケーション障害の方で、ドキュメントは全く作れていないし、マトモな会話すら満足に出来ません。というか、恐らく鬱病を発症していました。

以前にB社さんに営業に行った事があるのですが、あそこの社長さん、爬虫類みたいな顔をしているんですよね。つまり感情が無いんです。色々な会社を回りましたが、システム開発会社の経営者の多くはそんな感じです。そういう会社で言われるがままにわけも分からず派遣先に打ち込まれていたら、それは精神を病むでしょう。

ですから公にはされませんでしたが『能力不足』という理由でMさんは契約解除されて去って行きました。それについてはある意味、可哀想であったと今でも思っています。

最悪のプロパー

そして、このプロジェクトにもやはりまともな仕様書というものは存在しませんでした。

あるのは、わたしが他のプロジェクトに携わっている間に連絡された様々な場所にちりぢりになって置いてあるサーバー構成想定図であるとか、旧システムプログラムだとか、旧システムのインターフェイス仕様書だとか、旧システムのDB設計書だとか、お客様とのやりとりの記録だとか、先ほどあげた検証の結果だとか、そんな断片の山でした。

仕方なくそれらを手繰りしながら設計書を書き始めたのですが、ある日の朝のミーティングでプロパーがいきなり「このシステムはスマフォ端末からWEBサーバーを経由してWEBサービスにアクセスするの? それとも直接WEBサービスを呼ぶの?」と聞いてきました。

えーと、わたしは派遣労働者なのでそれを決める裁量権限はありませんから、方針を決めて指示を出すのが貴方の役目です。もう、根本からして認識が狂っています。

ですが、旧Androidアプリケーションが直接WEBサービスにアクセスを行っていたので、想定として本プロジェクトにおいても直接WEBサービスを呼ぶつもりだと答えました。

そうしたら「それではダメだ、このプロジェクトはWEBサービスのみをばら売りで提供することも想定しているし、 Androidアプリはそこで取り扱う情報においてアプリが機密を担保してくれるからいいが、今回はWEBブラウザで動作するWEBアプリだから必ずWEBサーバーを通し、取り扱う情報の機密においてはWEBサーバーが担保するようにしなきゃだめだ」と言われました。

また、私は機密情報については PHPの標準機能であるセッションを用いてWEBサーバ上に保存し、 cookieを経由してセッションID のみをクライアントに渡すというごく普通の実装を想定していたのですが、そのプロパーは「cookie なんて悪いことしようとする人が誰でもみれちゃうんだよ!」と謎の言葉を放ちます。

それで、私の知らない何かがあるのかと思い「そうなんですか?」と尋ねた所、そのプロパーは自信満々といった顔つきで「たぶん」とだけ答えました。憶測で断定します? 普通。

そして敢えて言及すると、そのプロジェクトで使用が決まっていたフレームワークはCodeIgniterですが、すいません、CodeIgniterが提供するセッションは、保存されている機密情報を暗号化して全部クライアント側に送信してしまう仕様なんです。ですから、暗号化キーが漏洩した時点で全部筒抜けになります。あなた、自分でこのフレームワークの採用を決定したのにそういう事を何も理解していないんですか?

発狂するプロパー

それで、設計書を書き換え始めたのですが、ある朝の会議で突然プロパーが怒りをむき出しにして、わたしが書き直している途中の設計書を画面に映し「これはどういうことなの!?」と詰問しました。

それはクライアントからWEBサーバへのアクセスについて「api_keyの送信は行わない」と書いた部分でした。旧Androidアプリがapi_keyを送信する仕様だったからです。

わたしは「先日の会議でapi_keyについてはクライアントには送信しないというお話になったと思いますが」と答えた所、「誰でもアクセスできるってことじゃないか!! これは情報漏えいだよ!?」と怒鳴り散らされました。

わたしは一体何を怒られているのか全く分かりませんでしたが、プロパーが「api_key渡さなかったらどうやって正しいクライアントを判断するの!?」と怒鳴ってくるので、「それはサーバのドメインじゃないですか?」と答えたら、「三木さんは全然理解していない、この仕様書見て!」と、先日の会議の後に送られてきたシステム全体の情報伝達経路の図を示しました。

それを見ても一体何が悪いのか分かりませんが、取り敢えず「申し訳ありませんでした」と謝ってその会議は終わりました。

その後、席に戻って設計書の修正を行っていたら、しばらくしてプロパーが私のところにきて「ごめん、 書いてあったね」と言って、先ほど見せられたわたしの設計書の下の方を指差しました。

それは「WEBサーバからWEB サービスへ行う問い合わせにおいて、ユーザー認証を行う」といった記述でした。

シーケンス図

だって、そういう話だったじゃないですか。正しい利用者としてWEBサービスを利用する為のapi_keyはクライアントには渡してはいけないって、あなたが言ったんじゃないですか。

本当に、言っていることが狂い過ぎているんです。

この仕事に限った事ではないのですが、あらゆる企業のあらゆる仕事に於いて、1ヶ月も経った頃には後からやって来たわたしのほうが以前から居るどの従業員よりもその会社の業務についてよっぽど詳しくなってしまうのです。嫌な言い方をするとわたしは個の能力が高過ぎるんです。あらゆる仕事をこなしてきましたからこの時点で既に一介の従業員の能力の範疇では無くなってしまっていました。

メンバーが増えても状況は変わらず、更に悪化

やがて、プロジェクトにもう一人のメンバーSさんが異動して来ます。

彼はわたしが新規開発しているスマフォ用クライアントアプリの開発ではなく、既存管理画面の改修担当となりました。元々のソースコードが劣悪で改修が遅延していた事による補充要員です。

管理画面改修を担当していたもう一人の技術者さんと同じ会社の人だったので比較的スムーズに進むであろうと思われていたようですが、これがかなり難航しました。

実は彼はNSEG仲間、つまり知り合いだったのですが、わたし達はそれについてはお互いに秘密にしていました。仕事に私情は挟まないようにしていたのです。

その彼から会社の同僚伝いに「今のソースコードがかなり酷い」という話を事前に聞かされていて、どうやらそれが尋常でないほどの酷さであるということが十分に予測されていました。

ある朝のミーティングにおいて、彼の改修が一向に進まないのをいぶかしんだプロパーが、WBS(作業分解構成図)を見ながら「なんでこんなに遅れてるの? 先週まででここまで終わってるはずだよね?」と言いました。それで彼は「コードが少しばかり汚いのと、私自身が仕様を完全に把握していないので…」と言ったところプロパーは激昂し、「なんで仕様を理解しないのに実装やってるの!!」と怒鳴りつけました。

何でと言われますと、前のプロジェクトから間髪いれずにこのプロジェクトの実装に参加させられ、これまでの経緯等について学習時間が全くないままWBSだけが規定されているからなのですが、一体何を言っているのでしょう?

こうなると最早、瞬間湯沸かし器なんじゃないかと心配になってきます。別に一々怒鳴らなくても仕事の指示くらい出せるでしょう? 本当に理解、出来ない思考回路の人です。

そして「前の会議で、ここまで終わってるって言ったよね!?それは嘘だったんじゃないか!!」と怒鳴りつけるのですが、仮に嘘だったとして、それは本当に終わっているか確認しなかったあなたの過失ではないですか?

基本的に、仕事の出来ない人は責任感が無いので全て他人のせいにします。階級社会というのは兎角そんな物ですね。

前述した通り、彼とわたしは友人であって、仕事の場において私情を挟むのは適切ではないことは良く分かっていましたがどう見ても理不尽なのはプロパーであろうと思ったので「Sさんは最近まで別プロジェクトにいて、こっちにきたばっかりですからねぇ」と助け舟を出しました。

それでプロパーもどうにか納得し、その場はなんとか収まりました。

しかし、根本的な問題がどうやら元のソースコードの汚さのようなのでSさんの改修はなかなか進まず、プロパーは常にイライラしていたようです。

もはや仕事とは呼べないまでに丸投げ

そのプロパーの態度の悪さや仕事に対する姿勢については忍耐を超える感じでした。その酷さについて詳細に記録したドキュメントが手元にありますが、あまりに酷過ぎるので訴訟にでもならない限り、流石に公開出来ません。

プロパー自身も管理画面側の改修を少し行っていたのですが、そのコード内で利用されている &(PHPでの参照渡し、C言語と同等)についてSさんに質問した際、Sさんが回答に加えて詳細に解説してあるWEBページのurlを見つけて返信した所、それに対する返答が『で、どっちなの? とっていいの~』という一行。文章を読んで自分の頭で考えるという事が全く出来ない知能の人です。

プロジェクトの進行については全てわたしに丸投げ。管理画面側を担当しているSさんの業務内容についてもわたしが指揮する事態になっていきます。こうなるともはや派遣契約では無く、逆の意味での偽装請負です。

試験についても私に丸投げ

サーバの環境構築についても私に丸投げ

ごめんなさい、それすらしなかったら、あなた一体何をしているんですか?

契約終了すら、簡単にはさせてもらえない

そんな感じであまりに酷い環境でしたから、契約更新はあり得ない状況でした。

それでも、これから長野市で長く営業活動を続けて行く事を考えると喧嘩別れのような事は出来ません。何があるか分かりませんし、長野のような村社会では噂はあっという間に広まります。

ですから、契約満期の1ヶ月前にあたって部署長のTさんから呼ばれ「契約更新の時期になりました」と言われた際、ニコニコ笑って「申し訳有りません、自社でやりたい事があるので契約を終了させてください」と答えました。それで全て丸く収まる筈だったのです。

ですが、そうは行きませんでした。

何しろわたしはプロパーに代わってプロジェクトの進行から派遣従業員さん達の業務の調整、問題解決まで平気な顔をして全て行ってしまっていたので『とても良く働いてくれる派遣さん』という認識が広まってしまっていたのです。

わたしは元々印刷・出版業界で部署長を務めており、仕事人としての能力が並ではありませんでした。人材教育まで行っていましたから人の扱いはお手の物です。そこに加えて一人とはいえ企業経営をし、自分で営業活動までしている。チームマネジメント等わたしにとっては造作も無い事で『プログラムコードなら書けます』という一般的な派遣技術者さん達とはそもそもの次元が違うのです。とにかく、わたしの能力が高過ぎました。

ですから、わたしが契約更新を断ったのを聞いたTさんは正に晴天の霹靂という感じで驚き、「何故ですか? 別の仕事を受注している訳でもないのに何故契約を終了するのか理解出来ません。もし当社に何か落ち度があったのであれば必ず改めるので理由を教えて下さい。でなければ納得出来ません!」とおっしゃるのです。

そこまで言われてしまうと、おためごかしでごまかしたら逆にわたしにとって不利になります。

仕方がないので本当の事を説明するしかなくなり、一週間の猶予を貰って、それまでこの会社で働いた5ヶ月間に起きた事を詳細に記録した報告書をTさんに提出するに至りました。

その報告書を見たTさんは、それ以上わたしを引き止めたりはしませんでした。内容が辛辣過ぎましたから。

Tさんはその後すぐに部長に昇進しますが、SIerにしておくのはもったいない位に本当に素晴らしい人だったのです。

契約終了が決まってから起きた事

みんな、苦しい

わたしが提出した報告資料はA4で100ページを超える物でしたが、Tさんはたった一晩で全てに目を通してくれました。

そして、これまでのわたしの不遇な扱いについて心の底から謝罪してくれました。

そのTさんは主に外回りの仕事をしていたので内情について全く知らなかったのだそうです。それが、部長さんが精神を病んでしまって休職が突然決まり、急遽、代理を務めていた矢先の事でした。大体世の中というのは常に理不尽なんです。仕事が出来る人程沢山の仕事と責任が降ってきます。

前任の部長さんが精神を病んでしまった理由もわたしには分かります。

何しろ、部長さんが担当していたプロジェクトに派遣されていた技術者は実は暗黒大陸長野 Vol.1 - ここが出発点(2011-2013頃)で言及した劣悪なプログラムコードを書いたA社の技術者さん達でしたから。長野ってそういう狭い世界なんです。

問題だらけですからそれは心労が並大抵の物では無かったでしょうね。

Tさんがこっそり教えてくれました。

そのSI企業さんも結局世界的大手企業の子会社なので、親会社は下請けのように仕事を丸投げしてくるのだそうです。それでいてノルマや要求される品質だけは高いので、プロパーさん達もかなり精神的に追い詰められているのだそうです。

ですからプロパーさん達も親会社と派遣従業員との板挟みで結構苦しいみたいです。ブルーハーツが楽曲『TRAIN-TRAIN』の中で唄っていた「弱い者達が夕暮れ、さらに弱い者を叩く」の言葉通りの世界が広がっています。

契約が終了してからしばらく経った頃、その企業の社屋の近くにある家電量販店に買い物に行ったら、休職中の部長さんとばったり出くわしました。

本当にやつれていて明らかに精神を病んでいましたが、それでも会社の側には居たかったんでしょうね…。本当に心が痛みました。

もし仮にA社の技術者達では無くわたしが部長さんのプロジェクトに配属されていたら、絶対に部長さんを休職に追い込むような事態にはさせなかったのに…。人生とは、本当に上手くいきません。

派遣の品格

A社の技術者の低次元さについては目に余る物があります。

就労期間中に参加したとあるプロジェクトに於いて、検索結果の表示が遅過ぎるのでSQLクエリチューニングをして欲しいという依頼が来た事があります。

DBに問い合わせを行っているSQLクエリを見てみるとRDBMS(リレーショナル・データベース・マネジメント・システム)のオプティマイザが何をしているのか全く分かっていない感じのSQL文が書いてありました。

それで、実際に検証を行うために検証用データが無いか聞いた所、依頼をしてきたA社の技術者2名は目配せをした後、あろう事か膨大な個人情報の塊である本番環境の生データを書き出して禁止されているUSBメモリにコピーし、わたしに渡してきたのです。

それが、どれほど重大な契約違反であるのか全く理解していないんですね、この2名は。普通、開発するにあたってダミーデータとか用意しませんか? ちょっとコードを書いてランダムデータを生成すればいいじゃないですか。

これが一般的な派遣労働者の仕事人としてのレベルなのです。

同胞に裏切られる

そして、わたしの友人であったSさんもやらかしてくれます。

派遣契約を終えて自社で仕事をしている合間にSさんのTwitterを何気なく見たら、平日の真っ昼間に一日中呑気に延々とTweetしていました。勿論、派遣就労期間中です。

これを見た時は、流石に怒りが湧いてきました。あなたの状況でそういう事します? 普通。

わたしが必死であなたのサポートをしてあげていたの、一体何の為だと思っているのですか? あなたが何を言っているのか分からなし、改修が全く進まないからプロパーが常に不機嫌なので場の空気が悪くなるからです。

それなのにあなたがそんな事しているのを相手企業が知ったら、あなただけではなくて弁護してあげていたわたしの評価まで下がるんですけど、全く理解出来ないんですか?

非常に厳しい事を言いますが、あなた、社会性皆無じゃないですか。まともな対人会話が殆ど出来ない。だからわたしがサポートしていたのに、全く理解出来ていなかったんですね。

ずっと見ていましたけど、あなたはいつまで経っても本当に自分の事しか見えていないから、わたしがでしゃばり過ぎない範囲で人知れずチーム全体の調整まで行っていた事に全く気付いていませんでしたよね。少なくともプロパーの人の多くはそれにちゃんと気付いていました。

特定派遣企業の従業員の辛さは理解しますし、そこから先は個人の価値観の問題なのでわたしがとやかく言う事ではないですからその時は何も言いませんでしたが、それ以降SさんのTwitterのフォローは行わないようにしました。見ているとイライラしてつい余計な事をリプライしてしまいますから。考え方が違うので下手にリプライするとSさんには迷惑な話でしょう。

基本的に、自分では改善の方策を何もしていないのに愚痴しか言わない人は見るに耐えません。

もう一つ厳しい事を言うと、あなたの所属していた会社さん、派遣されてくる技術者達があまりにも仕事が出来ないので賃下げ交渉されています。

わたしは起業して3年目のたった一人の会社なのに実は派遣単価が一番高くて、契約更新を断った際には引き止めまでされています。単価の話になった時にあなたのプライドを考えて嘘を言っておきましたが、実はあなたの会社の派遣単価よりも6%近く高かった。

それが何故なのか、もうちょっと良く考えた方が良いのではないでしょうか? 仕事って、一体何でしょうか? それ以前として、時間給の契約なのに仕事中にTwitterするのとか、本当に辞めた方が良いですよ? 明らかに契約違反ですから。

わたしが大先輩である技術者さん達に対してあまり敬意を払わなくなったのはこの頃からです。経験が長いだけで『組織における仕事の何たるか』を全く理解しておらず、自分しか見えていないので言われた事しかやれない癖に『自分は凄い』と思っている人は、相手の気分を害さないように気を遣って会話をするだけで疲れるからです。社会性が全く無い人、つまり周りが全く見えていない人、問題解決の為の議論が全く出来ない人が多過ぎますから。

だから一般的に技術者という人種はあんまり信頼されていないし社会的地位が低いのだという事が分かっていません。これはITの技術者で特に顕著ですね。

部署長Tさんの凄さ

最後に、わたしの陳情を聞いてくれたTさんの凄さについて言及します。

わたしが報告書を提出したTさんは報告書の全てにきちんと目を通してくれて、心の底から謝罪してくれたのは前述の通りです。

それにとどまらず、Tさんは部署内の改革にまで着手してくれます。

元々SIは技術の事は全く分からない人の集まりなので技術的な事はすぐには改善出来ないが、出来る事から一つずつ改善していくと言ってくれて、わたしが報告書に書いた本当に隅の方にある非技術的な事柄、つまり組織運営での改善すべき点について、たった一週間後に対策を行ってくれました。

それだけではありません。

どうしようもないプロパーのせいで疲弊していたわたしの心身にまで配慮してくれて、契約期間の最後の1ヶ月間は殆ど何もしなくても良いと言ってくれました。何しろわたし一人の尽力でそれまでにプロジェクトをほぼ完了に導いていたので、契約は既に果たされていたからです。

それでも、ちゃんと1ヶ月分の契約料金がわたしの会社宛に支払われました。人格者って、本当に居るんです。当たり前の事のように聞こえますが、経営者でも無いのにその判断と決断が出来る人というのは、実は私の50年の人生において片手で足りる程しか見たことがありません。

Tさんは私と同い年ですが、わたしと違って一つの企業にずっと勤めています。にも関わらず、わたしと同等の社会観・倫理観を持っているのです。心の底から『この人、凄いなぁ…』と思いました。

だから尚更その会社に残るわけには行かなくなりました。

だって、前述のような劣悪な派遣労働者ばかりなのです。わたしが残れば必ず『ここがおかしい、あそこがおかしい』と言わざるを得なくなりますが、それはわたしのようなマトモな技術者にとっては改善であっても、劣悪な技術者達にとってはぬるま湯を作るだけなのです。

そうしたら、きっとあちこちでプロジェクトは停滞し、最終的にTさんの責任問題に発展します。人間というのは、善人よりも愚者の方が遥かに多いですから。

Tさんの事、人間的に大好きでした。

だからこそ当時のわたしは力が無さ過ぎて一緒に働く事すら出来なかったのです。

まとめ

この記事では、わたしが働いたSI企業で見た闇と光について言及しました。

こうした事はわたしに限った事ではなく、日本中の膨大な現場で繰り返されているようです。こんな状態ではマトモなシステム開発等行える筈もなく、だからこそ欠陥システムが日常的に生産され続けているのです。

それについて『問題だ』と思う人は沢山いても『なんとかしよう』と行動を起こす人はほぼ居ません。そこにこそ、闇を感じます。

非常に多くのシステム開発が大炎上して実質的な失敗を繰り返していますが、どちらが悪いとか無いです。上流工程もマトモに仕事が出来ていないし、下流工程も同様にマトモに仕事が出来ていません。だから遅延して失敗します。

誰か一人でも全体を見て調整が出来れば全く違った結果になるんです。船頭って、普通一人ですから。

次回は、SI企業での派遣契約を終了した後の事を記そうと思います。

※このシリーズに記載されている内容は些末な事を取り上げて大げさに語っているのでは無く、膨大に起きていた杜撰極まりない一般企業体制のほんの一部でありサンプルです。ほぼ全ての事象は詳細に記録されていますので異議申し立て等で必要性が出た場合にはそれら全てを公開します。

暗黒大陸長野 Vol.1 - ここが出発点(2011-2013頃)

公開日時:2021/05/14 14:37

『暗黒大陸』とは?

1970年頃まで、アフリカ大陸は未開の部族の土地として、ヨーロッパ諸国からは『暗黒大陸』と呼ばれていた。

魂の目覚め

みなさん、長野県って知っていますか? こんなところです。

長野市の風景

もう、誰がどう見てもど田舎ですね。

わたしは長野県の北の方にある市に住んでいて、WEBエンジニアをしたりしています。

『したりしている』という微妙な表現を使う理由は結構ややこしくて今はその事情を話せる状況ではないのですが、これまでにはグラフィックデザイナーをしたり、学習塾の講師をしたり、看護助手の仕事をしたりと、結構色々な事をやってきました。

最終学歴は千代田工科芸術専門学校。成績は悪くなかったのですが『漫画家になりたい』『大学は勉強したい人が行く場所』という理由で大学進学しませんでした。結構な中二病だったんです。

当時描いたデッサン

懐かしの『写ルンです』撮影なので、露出とか全く補正されていませんからかなり薄く見えますが、木炭デッサンです。専門学校で初めてまともなデッサンを始めた割には上手いでしょう? デッサンが下手な人は『この奇妙な生物、一体何ですか?』みたいになってしまう事も多いです。※今思うと、右上のマルスの胸像は顔の立体感が足りず平面的に見えますね…。

デッサン

そういった経緯で出版社でDTP及びデザインの仕事をしていたのですが、ちょうどインターネットが爆発的に普及する時期が重なり、それに伴って印刷・出版業界が急速に衰退していきました。

ですから、家に帰ってからは勝手に一人でWEBの勉強を重ね、当時働いていた出版社のWEBサイトを完全オリジナルのCMSサイトとして大リニューアルする事を提案、了承を受け成功させるに至ってWEBプログラミマとしての第一歩を踏み出しました。

その時のサイトは少しずつ手を加えられてきましたが、今でも大体そのままの形で動いています。今から思うと相当稚拙なソースコードではありますが、各種脆弱性対応は十分行ってあったので特に問題無く動作しているようです。

ほおずき書籍

長野県長野市の出版社『ほおずき書籍』※レイアウトが崩れているのはわたしの退職後に追加された機能です。

その後は今度はApple社からiPhone、iPod touch、iPadが続けざまにリリースされて、出版業界に何度目かの『電子書籍ブーム』が沸き起こります。

これについて会社の専務が『これからはこういうのの時代だよな』と雑談で言ったのを聞き、売り言葉に買い言葉というか、若気の至りというか、血気の勇というか、『じゃぁ、やってやろうじゃないか』と一念発起、MacBook Proを購入して今度は独学でObjective-Cを勉強し、iPhoneとiPadのユニバーサルアプリを作って会社に提案しました。若いから元気だったなぁ…と、今では思っています。

これについても了承され、App Storeからリリースされました。

iOSアプリ

とにかく、出版業界は衰退していく一方でしたから、10年先を見据えてなんとか生きていく為の能力を身につけるのに必死でした。

ですが、わたしと同じ事をやれる人間は、他には居ないんです。そして、世界の技術進歩の速度が速過ぎてわたし一人が孤軍奮闘してもどうやっても時代の流れには逆らえず、下流へとどんどん押し流されていくのをひしひしと感じて悶々とした日々を送り続けていました。

このままではいけない…。

それが、7年間勤めた会社を辞めて独立するに至った理由です。

とにかく前に進むためには身体を軽くしなければならなかった。ほおずき書籍という会社を背負って時の流れと対等に渡り合うには、わたしの能力はまだまだ低過ぎたのです。

2011年の初夏の事でした。

独立直後の修行期

BtoB

受注の足がかりとしては、当時サービスが開始されて大分賑わってきていたLancersを利用します。システム開発とデザインの小さな案件を受注して顧客を獲得して、まず実績を作るという作戦でした。

Lancersは安価な発注単価のサイトなので些末なトラブルはあった物の、比較的この作戦は上手くいきました。

発注者も軽い気持ちで発注しているので、受注側としてもいつまでもその案件に縛られるような事さえなければ、手っ取り早く実績を作るにはよいサービスでした(※現在はランサー〈受注者の事〉としては利用していない為、どうなっているかはよく把握していません)。

こうして受注したいくつかのシステムをポートフォリオとして簡単なアナログ資料を作り、長野市のシステム開発会社を回って仕事を貰えないか打診する、というのが次に予定していたステップでした。

ポートフォリオ

その際に、少し変わった手法を用いました。

何をしたのかというと、いきなり飛び込み営業をするのではなく、まずハローワークに行って求人検索端末でシステム開発会社の求人を検索したのです。

なぜかというと、

  1. 求人を出しているシステム開発会社というのは
  2. 人手が足りていないはずなので
  3. 営業をかければ仕事が貰える可能性が高いのではないか?

という仮説を立てたからです。

この作戦は(当時は)見事に的中しました。

最初に飛び込み営業をかけた企業さんから、ちょうど中規模のWEB業務システムのリプレース案件を受注したが社内では人手が足りないので困っている、開発を手伝ってくれないか? と相談を受けます。

この案件をきっかけに別の開発プロジェクトも受注し、約1年半程に渡って取引をさせていただきました。ですからその間、この一社だけで割と無視できない収入を得る事が出来ました。

ただ、内容はかなり酷くて、当初の話と全く違う内容の仕事依頼になっていったり、先方が依頼した設計の内容がめちゃくちゃだったり、共同参画していた別会社A社のプログラマの書いたコードの品質が劣悪でバグだらけな上、その対応がなぜかこちらに回って来たりしてかなり難航しました。

そんな感じでそのプロジェクトが崩壊するのに合わせてわたしはその会社と距離を置き、そのうちにその会社も立ち行かなくなり、今はもうその会社は存在しません。

このプロジェクトの大失敗の際、A社が書いた劣悪なソースコードを教訓として『柔軟性が高く、堅牢で利便性の高いフレームワークの整備』の重要性を痛感します。

A社のソースコードは記述者に依って手続きその物が違っていましたから、もう、ルールという物が全くない無法地帯でした。どこで何をしているのかコードを読み込まないと全く分からないし、関数を呼んだ後、何が返っきているのかも全く分からないし、1つの関数の中に平気で100行とかコードがベタ書きしてあるし、とにかくメチャクチャという表現が適切でした。

サンプル1:A社のソースコード

わたしが改修を担当した際に証拠として保存しておいたA社のソースコードの一つがこんな感じでした。1関数に100行、深いネスト、意味のないバリデート、根本的におかしい日本語…。こんなソースコードがわたしの手元に渡された時点で既に数百万行に膨れ上がっていたので、当時改修にあたったわたしが相当イライラしていたのがコメントにありありと表れています。不具合対応で、ある程度直した上でこれですからね…。

劣悪なコード

※これで1関数…。あれもこれも1つの関数に詰め込み過ぎです。ガードを知らないので深いネストになっています。

基本的に if ~ elseifelse ~ を多用する人は技術力が低いと言って良いでしょう。else分岐は通常、実はほとんど必要ありません。

そして、技術力が低い人のコードは『これ、巻物ですか?』というくらいに、縦にも横にも長いです。必ず、1つのクラスの中にも1つの関数の中にもいくつもの処理を埋め込んでしまうので『このクラス、一体何をする為のクラスですか?』という状態になっています。(※クラス:複数の関数からなる、1つの目的を持ったプログラムの集合)

『これは○○をするクラスです、○○をする関数です』と一言で言い表せなかったら、それはプログラム設計が間違っていますね。

サンプル2:わたしが普段書いているソースコード

可読性を上げるためにオールマンスタイルを使用し、空改行を適度に入れているにも関わらず1クラスで100行未満。根本的に技術力が違い過ぎます。

わたしが普段書いているコード

※これで1クラス(4関数)。

サンプル3:別会社が書いたSQL

月締めの集計帳票出力処理が『5時間掛かっても終わらない』という顧客クレームが入り、これの調査と改善を求められた際の、A社とは別の会社の技術者が書いたSELECT文が以下です。

問題のクエリ

えーと、全て相関サブクエリで書いてありました。ちょっとこのSQL酷すぎません? 流石にこんなSQLはあんまり見たこと無いです。

本番環境の10万件の取扱商品と220万の店舗別在庫、そこに5,000件ほどのコードマスタ情報を相関サブクエリでSELECTしているため、MySQL(5.5未満)では概算で1,100兆回の照合が行われる事になります。

ためしにLIMIT 1(1件の商品のみについて抽出)してみても15分経っても終わりません。

ちなみにこれは月末締めの売り上げ報告書を作るための処理ですが、1件15分としても、1,041日かかる計算になります。つまり、1か月の売り上げ結果を出すのに3年掛かるわけですね…。

さらにこのプログラムでは、このSQLとほぼ同等のものがもう1つ実行されています。苦笑いしか出てきません。

とりあえず、SQLを完全に書き直して1店舗全商品で3分、全店舗7分程度で取得できるように修正しました。夜間バッチ等で実行すれば十分実用的でしょう。

SQLクエリって、RDBMSのオプティマイザがどうやってクエリの実行計画を立てているのか理解していないと全く使い物にならないシステムになってしまうんですよね。

銀の弾丸の構想

こんな感じで、その仕事を5年とか10年とかやっている人達よりも、職業プログラマとしては1、2年の経験しかないわたしの方が既に能力が高かったのです。これは恐ろしい事でした。

これが、当時Feijoa Prototype Framework、そして現在Pine Frameworkと名前を変えた独自フレームワークを開発するに至った理由です。

Pine Frameworkの世界

Pine Framework の世界へようこそ | striking-forces.jp

技術者の間では『独自フレームワーク』は嫌われる傾向にありますが、先に上げた業務基幹システムのような大規模開発になるとオープンソースで無料で利用出来る一般的なフレームワークでは力不足で、大抵の場合、開発が進むにつれて結局崩壊します。

PHPでいえばLaravelやCakePHPあたりが現在に於いての主要な選択肢でしょうが、あれはRuby on Railsを雛形として作られていてRoR自体が『プロトタイピングフレームワーク』という位置づけであるため、同様に、コンセプトをすぐに形にするためのフレームワークと言って良いでしょう。

ですから、簡単なWEBサイトやWEBアプリを作成するのには向いていますが、基幹システムのように大メニューが10以上あって、そのサブメニューがそれぞれ10くらいでトータルで100以上あって、更にそのサブメニューがある機能もあって…、といった感じになると、そもそもそういう事を想定して作られていないのでソースコード管理自体が破綻してきます。

売却されたEC-CUBEがSymfonyベースで作り変えられてリリースされていますが、結局崩壊していますね。この手の一般的なフレームワークは利用する側にもある程度知識がある事が前提となっていますし、システムの方をフレームワークのルールに合わせて行く必要があって、特に、WEBシステムに於いては一番重要とも言えるRDBの取り扱いに対するサポートが不十分ですから分かっていない人が使うとやはり崩壊します。

Feijoa Prototype Frameworkは、そういう巨大なシステムを破綻させず効率的に作るためのフレームワークの整備が目的でした。出発点からして目指している場所が一般的に知られているフレームワークとは違っていたのです。これが、今となっては定番とも言えるフレームワーク『Laravel』が普及した現在に於いても尚開発を続けている理由です。目的が違うのです。

その現在形であるPine Frameworkについては後日、動画などでその利便性について紹介していこうと思っています。

なぜそんな能力差が生まれたのか?

一つの理由としては、書いたコードの性質の差です。

わたしは独立直後から膨大なコードを寝る間も惜しんで書いていました。

それはシステム開発業界にありがちな『設計書の通りにコードを書く』作業ではなく、自分の頭で『どうしたらより良くなるか?』を考えながらコーディングをする仕事でした。

これはLancersでわたしが自分で直接受注したからこそ出来た事です。

設計書通りのコードを書いていると、基本的には他に良い方法があってもその通りに書くしかなくなりますし、やるべき事が決まってしまっているのでその通りに書くだけになって全く頭を使わないコーディングになりがちです。それでは良いプログラムにはなりませんし、良いシステムにはなりません。つまり、プログラマとして全く成長しません。

それが、たった2年足らずで10年ものキャリアの差を覆すまでになりました。

NSEGでの武者修行

もう一つの大きな理由、実はこちらの方が遥かに大きな理由ですが、NSEG(Nagano Software Engineer Group)に参加した事が、WEBエンジニアとしてのわたしの爆発的な成長を促しました。

NSEG

NSEG 長野のIT勉強会

NSEGについては、ほおずき書籍在籍中にmixiのコミュニティでその存在を見つけ、そこの管理者であったすのさんという方を頼って、思い切って飛び込んでみました。

初めての参加は2011年5月の第15回勉強会、これよりも前から同じ長野で活動するWEB製作者のグループid=Naganoにも参加していたのですが、id=Naganoが所謂『意識高い系』のグループであるに対して、NSEGは『本当の意味で意識高い系のガチのエンジニア達』の濃密なコミュニティで、初心者には何を話しているのか全く分からない世界でした。

こちらに過去の勉強会の概要がアーカイブしてもらってありますが、当時主流になりつつあったGitの話や最先端のWEBの仕組みの話、システム開発業界の闇の話等など、つい昨日今日業界に飛び込んだばかりのわたしには、話題に上がってくる単語の一つ一つが既に何の事を言っているのか全く分からない状態でした。

それで『これは、我ながら凄い業界に足を踏み込んでしまった物だ…』と思ったのですが、もう始めてしまった以上後戻りはできません。

分からない単語があったからといって一々質問していたら勉強会に参加している他の技術者さん達の迷惑になるので会の進行の妨げにならないよう人知れずひたすらGoogle検索して意味を調べます。それでも分からなかった事は、勉強会の後にほぼ必ずあった懇親会で聞きます。それでも分からない時は家に持ち帰りです。一人スパルタという表現が適切でした。

そんな事をひたすらくりかえしていたら、1年半も経った頃には、長野市のその辺にいる技術者よりはよっぽどわたしの方が能力が高くなっていました、というのが事実です。

NSEGに飛び込んだ時、『これがプロのプログラマの世界なんだ』と思って必死で勉強しましたが、実は、長野市辺りだと次元が違うくらいにNSEGのレベルが高過ぎただけでした。

とみたさんとの出会い

そのNSEGの中で、NSEGの代名詞的な人と出逢います。

何しろわたしは突然ITエンジニアの世界に飛び込んだので前知識が全くありませんでしたから、最初の頃は特になんとも思っていまでしたし、他の参加者さん達が「とみたさんは凄い」と度々言うのを聞いても特に何とも思っていませんでした。当時のわたしは他人に全く興味がなく、逆に言うと先のような理由で『みんな凄い』と思っていたので取り立ててとみたさんだけが凄いとも思っていませんでした。

それが、どんどん技術の事を勉強していくうちに、WEB検索するととみたさんのブログに行き着いて問題が解決する事が頻発するようになります。

『あれ? この前もとみたさん見た』『今度もとみたさんだ』、ここに来てやっととみたさんがどんな人なのか気になり始めたところにとみたさんがTwitterで妙な事をつぶやきます。

現在 MySQL を日本語で使えてるのは私のおかげなので、みなさん私に感謝してもいいのですよ。

これを初めて見た時は申し訳有りません、『あ、この人は頭がおかしい人なんだ…』と思っていました。

でも違ったんですね。とみたさんは実は、本当に初期の頃のMySQLに日本語のようなマルチバイト文字に対応可能なパッチを作成して公開し、それがMySQL本体に取り込まれたんだそうです。ガチの意識高い系エンジニアの代表格でした。

とみたさんのTwitter

とみたまさひろさんはMySQLコミュニティの成長に尽力したとして第8回日本OSS貢献者賞を受賞されています。ですから、それでなくとも非常に広範な知識のある方ですが、特にMySQLに関しては普通の技術者さん達に比べてちょっと詳しいです(笑。

参考:OSS貢献者賞を頂いたので昔話をします - tmtms のメモ

そして、とても優しいです。わたしは言ってみれば野良ですし、物怖じしていてはやっていけなかったのでかなり無礼な事もあり多くの技術者さん達には少なからず嫌われていますが、とみたさんはいつでもわたしに対してとても紳士的で優しく、何を聞いても誠実に対応してくれました。

とみたさんに限った事ではないですが、基本的にNSEGに参加していた皆さんは優しいです。分からない事があっても、きちんと自分で調べた上で不明点を聞けば親切に教えてくれますし、門外漢のわたしに対しても邪険に扱ったりはしませんでした。

みなさん、とにかく技術の事が大好きで、技術に対して誠実に向き合っている方達ばかりでした。そうでない方はNSEGに参加してもすぐに去っていく感じでしたね。最近までずっとそれが普通の事だと思っていたのですが、実は、そうではない人の方が遥かに多いのが今の日本のIT業界であるという事を痛感しています。

ですから、そういう人達の中で揉まれて、わたしは知らないうちにかなりの実力をつけていくことになりました。ですがそれが、長野のような未開の部族の村社会では命取りになって行きます。

まとめ

この記事では、わたしが何故WEBエンジニアになったのか、そしてWEBエンジニアになった当初はどうであったのかを記しました。

当初は些末な問題こそあれ、順風満帆であったようにも見えます。

ですが、暗黒大陸長野は、想像の枠を超えて来ます。その詳細については、今後の記事に記そうと思います。

※このシリーズに記載されている内容は些末な事を取り上げて大げさに語っているのでは無く、膨大に起きていた杜撰極まりない一般企業体制のほんの一部でありサンプルです。ほぼ全ての事象は詳細に記録されていますので異議申し立て等で必要性が出た場合にはそれら全てを公開します。

WindowsホストOSにPHPをインストールする

公開日時:2021/05/07 08:32

はじめに

で、VirtualBox上にCentOS 7がインストールされている事を前提としています。

また、本記事はVSCodeの導入のようにMicrosoft Visual Studio Code(VSCode)を導入してPHPでのソフトウェア開発をするにあたってホストOS側にもPHPの実行環境を求められる為、そのインストールを行うのが目的です。

Windows版PHPバイナリの入手

Windows版PHPは実行可能なバイナリファイルとしてPHPの公式サイトから入手できます。

公式サイト:PHP: Hypertext Preprocessor

php.net

CentOS上にPHPの開発環境を作成するの記事でインストールしたPHPのヴァージョンが7.4.18でしたが、先日5月6日に7.4.19がリリースされたようですのでこちらをインストールし、後でCentOSのPHPもアップデートします。

PHPのヴァージョン確認

公式サイト:PHP For Windows: Binaries and sources Releases

PHPにはThread Safe版(TS)とNon Thread Safe版(NTS:マルチスレッド環境を想定していない実装)がありますが、用途によって使い分ける必要があり説明が長くなります。

この記事の目的はVSCodeで指定するPHP実行環境を作る事ですのでTS版、NTS版どちらでも構いませんが、ここではTS版をインストールします。

Windows版PHPインストーラー

ダウンロードされた.zipファイルを解凍すると、実行可能なPHPのバイナリであるphp.exeを含む諸物のファイルが格納されたフォルダが出てきます。

PHP実行環境一式

このディレクトリをC:\など、任意の場所に移動してください。

環境変数PATHの設定

今はストレージに保存しただけですので、PHPは実行可能なプログラムとしてホストOSに認識されていません。

php -v

上記コマンドを実行すると、以下のようなエラーが表示される筈です。

※このエラーが表示されずPHPのヴァージョンが表示された方は既にPHPの実行環境がインストールされて環境変数PATHが設定されているので適切に項を読み飛ばしてください。

コマンドが見つからない

PHPを実行する為には保存ディレクトリにあるphp.exeを絶対パスで指定するか、保存ディレクトリにカレントディレクトリを移してからphp.exeを指定して実行する必要があります。

それでは不便ですので、シェルでphpと指定するだけでphp.exeが実行されるように環境変数PATHにphp.exeまでの絶対パスを記述しておきましょう。

Windows 10の場合、環境変数の設定画面は様々なところからアクセスできますが、一番わかりやすい方法はまず、デスクトップの『PC(以前のWindowsではマイコンピュータと呼んでいた物)』を右クリックしてコンテキストメニューを開き『プロパティ』から『設定』ウィンドウを開きます。

PCのコンテキストメニュー

システムの詳細情報

『設定』ウィンドウが開いたら『詳細情報』の中にある『関連設定』から、『システムの詳細設定』をクリックしてください。『システムのプロパティ』ウィンドウが開きます。

このウィンドウの下の方に『環境変数』というボタンがありますので、それをクリックして環境変数ダイアログを開いてください。

環境変数設定

環境変数ダイアログ

環境変数ダイアログは、上がユーザ用の環境変数、下がシステム全体の環境変数なのでどのユーザでログインしていても利用できます。

どちらに設定しても良いですが、今回は下のシステム全体の環境変数PATHとして設定します。

下の『Path』を選択してから『編集』ボタンをクリックしてください。

環境変数名の編集

開いた『環境変数名の編集』ダイアログ(ダイアログ名がおかしいですね…)で、『新規』ボタンをクリックして、先ほどダウンロードして配置したphp.exeのあるディレクトリ(フォルダ)への絶対パスを指定してください。

php.exeへの絶対パスを指定

入力が終わったら『OK』をクリックして変更を確定させ、全てのダイアログを閉じてください。また、シェルも起動します。

シェルが再起動したら、以下のコマンドでphpのバージョンチェックをしてみます。

php -v

Visual C++ 再配布可能パッケージを求められる

※このWarningが表示されずPHPのバージョンが表示された方は既にVisual Studioランタイムが導入されているのでこの項は読み飛ばしてください。

Windows版PHPではMicrosoft Visual Studioのランタイム(コンピュータプログラムの実行時〈ランタイム〉にメインプログラムと常に同時に存在して利用される前提のライブラリ)が必要ですが、わたしのPCにはインストールされていなかったようです。

そこで、『Visual Studio 2019 の Microsoft Visual C++ 再頒布可能パッケージ』を、以下のMicrosoft公式サイトからダウンロードし、インストールします。

公式サイト:『Visual Studio 2019 for Windows および Mac のダウンロード

その他のツールとフレームワーク』>『Visual Studio 2019 の Microsoft Visual C++ 再頒布可能パッケージ』

ランタイムのダウンロードメニュー

vc14ランタイムインストーラー

インストーラーがダウンロードされたら、実行してランタイムをインストールしてください。

再度シェルを起動しなおし、上記コマンドを実行すると、今度は正しくバージョンが表示される筈です。

PHPが正しく動作した

php.iniを作成

ここで、PHPの設定ファイルであるphp.iniを作成します。

雛形としてphp.exeのあるディレクトリ内にphp.ini-developmentphp.ini-productionがありますが、今作成しているのは開発環境なのでphp.ini-developmentをコピーしてphp.iniというファイルを作ります。

ionCube Loaderの導入

PHPの実行に直接必要なわけではありませんが、当サイトが管理している『Pine Framework』や、その他の暗号化されたPHPコードを実行するにはionCube社(英国)が提供するionCube Loaderが必要です。

ionCubeは、PHPのソースコード暗号化・復号に於いて、一番シェアがある製品です。

ionCube Loaderのダウンロード

ダウンロードページLoader Download - PHP Encoder, protection, installer and performance tools from ionCubeにアクセスし、対象のLoaderをダウンロードします。

上記ではPHPの『VC15 TS版』をダウンロードしてインストールしたので、ここでは『Windows VC15 (64bits)』のzipファイルをクリックしてダウンロードする事にします。

ionCube Loaderのインストーラー

更新のお知らせが必要か?

zipリンクをクリックすると、Loaderの更新のお知らせが必要か聞かれます。特に必要なければ No thanks をチェックしてNextをクリックしてください。zipファイルがダウンロードされます。

ダウンロードされたzipファイル

ionCube Loaderのインストール

ダウンロードされたzipファイルを解凍すると、中にioncubeフォルダがあり、その中に以下のようなファイルがあります。

ioncubeディレクトリ

このフォルダ内で、PowerShellを立ち上げて以下のコマンドを入力し、PHPのビルトイン・サーバー(組み込みサーバー)を起動します。

php -S localhost:8080

built-inサーバーの起動

これで、localhost(お使いのパソコン)上でWEBサーバーが立ち上がり、ポート番号:8080で待受を開始しました。

※もし上記コマンドでエラーが出た場合は、既にポート番号:8080が別のアプリケーションで使用されていると考えられるので、任意の別の番号でサーバーを立ち上げてください。

ブラウザを立ち上げて、ioncubeフォルダ内のloader-wizard.phpにアクセスしてみましょう。

http://localhost:8080/loader-wizard.php

ionCube Loader Wizard

Installation InstructionsセクションにionCube Loaderのインストール手順が記載されていますが、このうちの『1. Download the following archive of Windows VC15 x86-64 Loaders: zip』は既に済んでいます。

次は 2. に示されているパスに、ioncubeフォルダをコピーして配置してください。※ioncubeフォルダ内でビルトインサーバーを起動してこのページを開いているため移動はしないでください

ioncubeフォルダをコピーしてPHPのフォルダ内に配置したら、3. に従ってphp.iniを編集します。

Edit the file C:\php-7.4.19-Win32-vc15-x64\php.ini and before any other zend_extension lines ensure that the following is included:

C:\php-7.4.19-Win32-vc15-x64\php.iniを編集し、他のzend_extensionの行よりも前に以下の行を追記してください。

zend_extension = "C:\php-7.4.19-Win32-vc15-x64\ioncube\ioncube_loader_win_7.4.dll"

zend_extensionというのは、PHPの発展に大きく貢献したZend Technologies Ltd.(英)のPHP拡張であるZend拡張モジュールの事です。

参考:ゼンド・テクノロジーズ - Wikipedia

参考:コア php.ini ディレクティブに関する説明

Alternatively, replace your current C:\php-7.4.19-Win32-vc15-x64\php.ini file with this new php.ini file.

或いは、現在のC:\php-7.4.19-Win32-vc15-x64\php.iniをリンクされているphp.iniファイルに置き換えてください。(※ローカルでのダウンロードになるため、ブラウザのセキュリティ警告が表示されます)

ここでは、zend_extension行をphp.iniの先頭に追記する方法を採用します。

php.iniにzend_extensionを追記

zend_extension行を追記したら、4. に従ってビルトイン・サーバーを再起動してください。ビルトイン・サーバーの再起動はPowerShell上でCtrl+Cを2回押すか、PowerShellウィンドウを一旦閉じます。

再度ionCubeローダーフォルダ内で立ち上げたPowerShellウィンドウで以下のコマンドを入力し、ビルトイン・サーバーを立ち上げてください。

php -S localhost:8080

ionCube Loader Wizardページの 5. に従ってページをリロードしましょう。以下のようなページが表示されればionCube Loaderのインストールは完了です。

ionCube Loade インストール完了

php.iniの追加設定

あとは、php.iniの最低限の設定です。

設定の仕方はCentOS上にPHPの開発環境を作成するに示しましたが、インストールされた初期状態のphp.iniの内容が違いますので以下に設定項目を記します。

最低限として以下を設定してください。

date.timezone = Asia/Tokyo
mbstring.language = Japanese
mbstring.detect_order = UTF-8,SJIS-WIN,SJIS,EUC-JP,JIS,ASCII
mbstring.encoding_translation = 0
mbstring.substitute_character = none

仮想マシン上のPHPをアップデートする

VirtualBox上のPHPのバージョンが7.4.18でしたので7.4.19にアップデートしようと思います。

SSHでログインした状態で、以下のコマンドでアップデートが出来ます。

sudo yum update --enablerepo=remi,remi-php74 php

PHPのアップデート

アップデート完了

CentOSにインストールされているPHPはNTS版で、TS版を利用するにはソースコードをコンパイルしてインストールする必要があるようですが、PHP自体が標準でThreadをサポートしていない為、敢えてTS版を導入するメリットはあまりないようです。ですからこちらはNTS版のままにしておきます。

まとめ

以上で、Windows ホストOSへのPHPのインストールは終了です。これで、VSCodeでPHPのプログラムコードを不自由なく編集できるようになりました。

VSCodeの導入

公開日時:2021/05/06 10:54

はじめに

この記事は以下の3つの記事、

で、VirtualBox上にCentOS 7がインストールされている事を前提としています。

VSCodeとは

VSCodeとは、Microsoft社が開発して提供しているテキストエディタで『Visual Studio Code』の略称です。

拡張機能を導入することで、統合開発環境(IDE)と言っても良いほどの利便性が得られます。

Windows、Linux、MacOSそれぞれに提供されていて様々な言語に対応しており、それが基本的に無料で利用できます。

VSCodeがリリースされるまでは、Visual Studioというととにかく規模が大きく主にWindowsアプリケーションの開発に必要な機能が手あたり次第インストールされて結構なストレージサイズを必要としていました。

それがVSCodeではミニマルになり、必要な開発支援拡張機能をユーザーが選んでインストールするようになって、軽量でとても使いやすい開発環境となりました。ですから最近のソフトウェア開発の現場で最も使われているIDEは、おそらくVSCodeでしょう。

わたしはもう10年くらいNetBeans IDEを利用していてそちらに馴染んでいるので普段はNetBeansを使っていますが、サポートが不十分な言語、例えばPythonやRuby等を書く時には選択肢の一つになります。

この記事では、VSCodeのインストールと、実際に開発をするにあたってそれを楽にするための設定などを紹介します。

WSLの検討

Windowsはシステム文字コードやファイルシステムの関係でWEBアプリケーションの開発に支障が出る事が少なからずあります。

この点については、Windows 10から導入されたWindows OS上の仮想環境でLinux OSを利用する仕組みである『Windows Subsystem for Linux (WSL)』を導入するとこの問題が大幅に改善できます。

VSCodeではWSLの為の拡張機能も提供されているので、可能であればWSLを導入する事をおすすめします。

WSL機能の有効化については『WSLの有効化とUbuntuのインストール』を参照してください。

VSCodeの導入方法

インストーラーの入手

まず、インストーラーをMicrosoft社の公式サイトから入手します。

公式サイト:Visual Studio Code – コード エディター | Microsoft Azure

VSCodeホーム

ダウンロードページ

ダウンロードしたインストーラー

インストーラーの実行

ダウンロードされたインストーラーを実行してください。最初に、ライセンス条項への同意を求められます。

ライセンス規約への同意

MITライセンスのようですね。最近のオープンソースソフトウェアは大抵MITライセンスになっているので非常に安心して使える(ライセンス的に、という意味)ようになりました。

参考:MIT License - Wikipedia

ソフトウェアのインストーラーを実行している時点で『同意しない』という選択肢は実質的に選べませんので、ユーザーは利用したければ同意するしかありません。

以降は、特別な理由がなければデフォルトの状態で『次へ >』で最後まで処理を進めて構わないと思います。

インストールする場所の確認

スタートメニューへの登録方法

その他のインストール関連設定

インストール前の最終確認

インストール処理

インストール完了

完了』をクリックすると、インストーラーウィザードが閉じてVSCodeのWelcome画面が開かれます。

VSCodeのWelcome画面

VSCodeの初期設定

WSLのサポート

Windows 10にWSLがインストールされている場合は、ウィンドウ右下に表示されているボタンからWSL用の拡張機能がインストールできます。

WSL拡張機能のインストールボタン

インストールされた拡張機能

VSCodeの日本語化

初期状態のVSCodeのインターフェイスは当然、英語です。

これの日本語化については賛否両論あって、日本語化しないと初心者がとっつき辛いですが、日本語化してしまうと、そもそものメニューやダイアログの表記が違うために、マイナーなトラブルに遭遇してGoogle検索してたどり着いた海外サイトのQ&Aの意味が分からない、というジレンマが生じます。

とはいえ、しょっぱなから何が書いてあるのかわからない状態で使い始めるよりはマシな事は事実なので、今回は日本語化する事にします。

メニューから View > Command Paletteを選んでください。あるいは、Ctrl+Shift+Pでも構いません。

Command Palette

プルダウンメニューで『Configure Display Language』を選択するか、検索窓に左記の文字の冒頭を入力すると、対応言語リストに変わります。

言語選択

現在は初期状態でen(英語)しかインストールされていないので、install additional languages...を選んでインストールする言語リストを表示、日本語の『Install』ボタンをクリックしてインストールしてください。

インストールする言語の選択

日本語のインストール完了

画面右下にポップアップメニューが表示されていますが、日本語インターフェイスのインストールを反映する為に、VSCode自体を再起動してください。インターフェイスが日本語されているのが確認できる筈です。

日本語化完了

必要なプログラミング言語の拡張機能をインストール

あとは、開発したいプログラミング言語の拡張機能をインストールします。

画面左に表示されているボタンから拡張機能のマーケットプレイスで、使用する言語を検索して必要な物をインストールしてください。

拡張機能マーケットプレイス

インストールされた拡張機能

SFTP拡張機能

VSCodeで編集したファイルを自動で即時的にサーバーにSSH接続でアップロードする為のSFTP拡張機能をインストールします。

SFTP拡張機能については前述と同様にマーケットプレイスにあるので『SFTP』で検索してインストールしてください。

SFTP拡張機能

SFTPでのファイル同期テスト

さて、ではVirtualBox上のCentOSとファイルの同期テストを行ってみましょう。

※SFTPについては、必要であれば『CentOSにSFTP接続でファイルを転送する』を参照してください。

ワークスペースの作成

まず、テストを行うフォルダを任意の場所に作成します。このフォルダがワークスペース用のフォルダになります。

テストフォルダ

このフォルダをVSCodeで開きます。

フォルダを開く

開いたフォルダ

SFTP接続情報の設定

VSCodeでフォルダがワークスペースとして認識されたら、Command Paletteを開きます。メニューから選択しても良いですが、頻繁に使うのでCtrl+Shift+Pで開きましょう。

検索窓で『SFTP: Config』を入力し、クリックしてください。開いたフォルダの中に.vscodeというこのワークスペース専用のフォルダが作られ、中にsftp.jsonというJSON形式の設定ファイルの雛形が作成されます。

SFTPの設定ファイルメニュー検索

sftp.json

SFTPはSSHプロトコルを使って通信を暗号化するので、Vagrant+VirtualBoxで利用しているアカウントと秘密鍵をそのまま利用しようと思います。

Vagrantで管理しているSSH用の秘密鍵の場所はVirtualBox上のゲストOSを起動した状態で

vagrant ssh-config

で確認できます。

VagrantのSSH接続設定

{
    "name":             "VirtualBox-CentOS7",
    "host":             "192.168.33.10",
    "protocol":         "sftp",
    "port":             22,
    "username":         "vagrant",
    "remotePath":       "/var/www/html/",
    "privateKeyPath":   "C:/Vagrant/centos7/.vagrant/machines/default/virtualbox/private_key",
    "uploadOnSave":     true,
    "ignore":           [".vscode", ".git", ".DS_Store", "node_modules", "map"]
}

新規ファイル作成

開いているワークスペース(フォルダ)内でマウスを右クリックし『新しいファイル』メニューからindex.phpというファイルを作成してください。

※画面右下に英語で『実行可能なPHPが見つかりません。PHP 7をインストールして環境変数PATHに追加するか、php.executablePath settigを設定してください』と表示される場合は、『WindowsホストOSにPHPをインストールする』を参照してWindows用のPHPをインストールして環境変数PATHを設定してください。

※今回はこのポップアップは無視して×ボタンでクローズし、そのまま進めても構いません。

index.php

一時的なバグ対応

2021年5月6日

実は、上記SFTP拡張機能ですが、直近で行われたアップデートによるバグが混入しているようです。

詳細はGitHubの開発者リポジトリにissue: 『error 'no such file' during upload on save #915』として上がっていますが、どうも開発元が、十分なバグチェックを行わないままリリースしてしまったらしく、SFTP接続でのファイルの同期は正しく行われており、エラーメッセージだけの問題のようです。

SFTP拡張機能のバグ

VSCodeのバージョンを1.55に下げて機能拡張を再インストールすれば問題は解消するようですが、恐らくは一時的なバグで近いうちに修正されると思いますので、わたしは暫定的に拡張機能のコードに一時凌ぎのコードを追加して対応しました。

参考:『#915のコメント

388行目

if (code === STATUS_CODE.OK) {
        ↓
if (code === STATUS_CODE.OK || code === STATUS_CODE.NO_SUCH_FILE) {

パッチコードを追加したらVSCodeを再起動してください。

これで、とりあえずエラーメッセージは表示されなくなります。

※2021/05/24現在でもまだこのバグは修正されていません。

ファイルの同期確認

では、ファイルが同期されているか確認してみます。

ブラウザを開き、アドレスバーにVirtualBox上のCentOSのIPアドレスを入力します。あるいは、hostsファイルを編集してホストOS内だけの独自ドメインを設定してある場合は、そのドメインでアクセスしても構いません。

ブラウザでアクセス

VSCode上のindex.php内の文言を更に編集してからブラウザをリロードする事で、編集が即時的に反映されるのが確認できると思います。

記事リンク