PHPのstdClassの動きが環境によって違った件

スズキです。PHPのstdClassのプロパティにアクセスしようとしたときの挙動が、環境によって異なる現象に遭遇したので、共有です。

やりたかったこと

  • json文字列の中から「orderDate」というプロパティから日付データを取り出したい
  • 「orderDate」というプロパティが存在しない場合は、代わりに今日の日付を使いたい
json文字列のイメージはこんな感じ。
{
    "orderId": 1001,
    "orderDate": "2023-11-30",
    "itemName": "UVコーティングシール"
}

修正前コード(問題あり)

PHPのjson_decodeでjson文字列からstdClassを作って、jsonの中身を使うプログラムです。
// $jsonObjectは「stdClass」クラス
$jsonObject = json_decode($jsonString, false);
try {
    $prop = $jsonObject->orderDate;  // ①orderDateがないときはExceptionが発生する…はず?
    $orderDate = new DateTime($prop);  // ②$propがnullだとTypeErrorが発生
} catch (Exception $e) {
    $orderDate = new DateTime();  // ③今日の日付を使う
}
①の行にて「orderDate」というプロパティがないとき、Exceptionが発生してくれれば、catchブロックの③にジャンプして今日の日付を$orderDateにセットできる、ということを目論んだコードなのですけど、これがダメでした。 自分の開発環境では①にてErrorExceptionが発生したので、期待通りcatchブロックへジャンプしたのですが、別のサーバに乗せたら①にてErrorExceptionは発生せず、nullが取得されたのです。nullが取得されたことで、その後の②でTypeErrorが発生したのですが、TypeErrorはExceptionを継承していないのでcatchできず、結局処理としてはエラーになってしまったというわけです。 つまり、json_decodeで取得した「stdClass」の挙動が、環境によって異なったのですね。個人的には、 $jsonObject->orderDate; のところで、プロパティが無ければnullが取れるのが直感的で好きです。

修正後コード(問題解消)

「stdClass」クラスの挙動の違いはさておき、そもそもjsonのプロパティがないときの処理を例外処理を利用して実現しようとしているのが圧倒的によくないので、普通にif文で書き直しました。なんで例外処理でやろうと思ったのだろう、当時の私…
// $jsonObjectは「stdClass」クラス
$jsonObject = json_decode($jsonString, false);
if (property_exists($jsonObject, 'orderDate') && !empty($jsonObject->orderDate)) {
    $prop = $jsonObject->orderDate;
    $orderDate = new DateTime($prop);
} else {
    $orderDate = new DateTime();
}

まとめ

ということで、「stdClass」クラスに存在しないプロパティにアロー演算子(->)でアクセスしたときの挙動は環境によって異なり、ErrorExceptionが発生したり、nullが取得できたりする、というメモでした。PHPのバージョン違いかも?と思いきや、確認したら同じバージョン番号だったので謎は深まるばかり。 どういう環境だと挙動が異なるのか、についての調査は難航しそうだったので、今回はこのへんで…

Markdownについて

はじめに

Suzukiです。
今回はmarkdownについて書きます。

Markdown記法とは

Markdown記法とは軽量マークアップ言語の1つです。
記法については以下の公式ドキュメントを参考にしてください。
参考:mermaid公式ドキュメント -> https://mermaid-js.github.io/mermaid/#/

図表を描くならmermaid

簡単な図を表すのに便利です。
試しに書いてみると、   日本の地方別人口の円グラフ
```mermaid
pie title 日本の地域別人口(万人)(平成 22 年)
    "関東" : 4175
    "近畿" : 2250
    "中部" : 2157
    "九州" : 1467
    "東北" : 942
    "中国" : 758
    "北海道" : 552
    "四国" : 404
```
というような円グラフが描けます。
ライブエディタは以下にあります。
参考:Mermaid Live Editor -> https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZ3JhcGggVERcbiAgICBBW0NocmlzdG1hc10gLS0-fEdldCBtb25leXwgQihHbyBzaG9wcGluZylcbiAgICBCIC0tPiBDe0xldCBtZSB0aGlua31cbiAgICBDIC0tPnxPbmV8IERbTGFwdG9wXVxuICAgIEMgLS0-fFR3b3wgRVtpUGhvbmVdXG4gICAgQyAtLT58VGhyZWV8IEZbZmE6ZmEtY2FyIENhcl0iLCJtZXJtYWlkIjp7fSwidXBkYXRlRWRpdG9yIjpmYWxzZX0
 

メリット

HTMLで書くより簡単に記述できます。
またHTMLのタグも使用できるので便利です。
PDFに変換することで配布しやすくなります。

実際の使用法

markdownで文章を書いてmermaidで図を描きこみ、PDFに変換して配りやすくして使っています。
最近では、業務の作業手順書をmarkdownで書きPDFに変換して関係部署に配布しました。

余談

実は今書いているのもmarkdownエディタを使って書いています(笑)
右にプレビューを出しながら書くと、見栄えを確認しながら書けるので便利ですね。

Electronを触ってみた件について

●はじめに

こんにちは、イメージマジックのSuzukiです。
最近かなり寒くなってきました。
電気毛布を2枚フル活用しながら寒さを凌いでいます。
最近は「electron」を使っています。
その為、今回は「electron」について書いていこうと思います。

●electronとは

・特徴
HTML + CSS + Node.js でアプリが作れる。
これ1つで Windows, Mac, Linux 向けのアプリが作れる。
他のものに比べて敷居が低い。

●インストール

1.nodeのインストール
Windowsの場合、 https://nodejs.org/download/ からmsiをダウンロードしてインストール。
2.Electronのインストール
$ npm -g install electron-prebuilt
3.プロジェクトの作成
アプリケーション用のディレクトリを作成し、その下で npm init します。
アプリケーションのエントリポイントは「index.js」になっています。

●参考

https://qiita.com/nyanchu/items/15d514d9b9f87e5c0a29

●最後に

electronの特徴や簡単な使い方について紹介しました。
Webの技術(HTML5やJavaScript)を使っているので、習得しやすいメリットがあります。

WSLについて

こんにちは、イメージマジックのSuzukiです。 入社して早3カ月が過ぎました。
コロナの影響で運動不足になりがちな日々を過ごしております。
業務ではWSLでも検証等を行っています。
その為、今回はWSLについて書いていこうと思います。
WSLとは
WSLはWindowsOS上でLinuxの実行環境を実現するサブシステムです。
最近、WSL2というものがリリースされたようです。
以下の記事を参考にしてWSLをインストールしました。
参考:https://qiita.com/Brutus/items/f26af71d3cc6f50d1640
  • WSLはwindowsと親和性が高い
    起動が早い、Windowsとのファイルアクセスがしやすい、などが挙げられます。
  • WSL2はWSL1と共存ができる
    WSL2はWSL1を置き換えるものではありません。
    ディストリビューションごとにWSL1またはWSL 2のどちらで動作させるかを変更できます。任意のタイミングでWSL1とWSL2を切り替えることも可能です。
    具体的には、PowerShellを管理者権限で起動し、以下コマンドを実行して任意のディストリビューションをWSL2へ変換します。
wsl --set-version ディストリビューション名 2
 
  • 専用の仮想マシン内で起動
    WSL1は仮想マシンではなく、LinuxのシステムコールをWindowsのAPIに変換し、バイナリを実行する形式でした。
    しかしWSL2は仮想マシンでバイナリを実行するものに改められています。
    またWSL2ではDockerなどカーネル依存するソフトの動作が、最大のメリットです。
 
最後に
入社以来変わったことですが
以前よりコマンドラインツールに対して耐性ができたように思います。
しかし英語はまだまだ苦手意識があるため、修練の必要性を非常に感じました。
特にIntelliJは英語メインで辞書を片側に訳しながら作業を進めています。
やるべき事は多々ありますが、これからも頑張っていきます!
参考:https://qiita.com/poramal/items/3562472d52fe60f61c56