ぺんぎんらぼ

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です。たまに絵を描きます。

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です

JavaScriptのArray.fill()の注意点

JavaScriptで少し「あれ?」となったことを共有です。 多次元配列の操作中に、思っていたのと違う挙動になってしまいました。

間違った例

コード

const loopArray = new Array(3).fill(new Array(2)); // 初期化

for (let y = 0; y < 3; y++) {
  for (let x = 0; x < 2; x++) {
    loopArray[y][x] = "[y]=" + y + ",[x}=" + x; // 値の設定
  }
}

for (let y = 0; y < 3; y++) {
  for (let x = 0; x < 2; x++) {
    console.log(loopArray[y][x]); // 値の出力
  }
}

出力結果

"[y]=2,[x}=0"
"[y]=2,[x}=1"
"[y]=2,[x}=0"
"[y]=2,[x}=1"
"[y]=2,[x}=0"
"[y]=2,[x}=1"

期待していた出力結果

"[y]=0,[x}=0"
"[y]=0,[x}=1"
"[y]=1,[x}=0"
"[y]=1,[x}=1"
"[y]=2,[x}=0"
"[y]=2,[x}=1"

修正後

期待値のように出力するには、コードを次の★のように直します。

const loopArray = new Array(3); // 初期化★
//const loopArray = new Array(3).fill(new Array(2)); 

for (let y = 0; y < 3; y++) {
  loopArray[y] = new Array(2); // 追加★
  for (let x = 0; x < 2; x++) {
    loopArray[y][x] = "[y]=" + y + ",[x}=" + x; // 値の設定
  }
}

for (let y = 0; y < 3; y++) {
  for (let x = 0; x < 2; x++) {
    console.log(loopArray[y][x]); // 値の出力
  }
}

解説

Array.fill()のコードコメントには、次のように書かれています。

/**
 * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array
 * @param value value to fill array section with
 * @param start index to start filling the array at. If start is negative, it is treated as
 * length+start where length is the length of the array.
 * @param end index to stop filling the array at. If end is negative, it is treated as
 * length+end.
 */
fill(value: T, start?: number, end?: number): this;

一行目の「static value」というのがミソです。 fill()の引数として渡したnew Array(2)は、親の配列要素ごとにインスタンスが生成される訳ではなく、一つのstatic変数として扱われているようです。 配列のようにプリミティブではない値を渡した場合、各配列要素は同じ参照を見るようになってしまうということですね。

Spring Boot + Vue.js で作るWebアプリケーション④ - Eclipseのビルド設定

EclipseでVue.jsのビルド

Vue.jsのビルドは、コマンドプロンプトでVue.jsのソースフォルダに移動して、「npm run build」コマンドを実行する必要があります。
また、ビルド実行後に、Eclipse上でプロジェクトをリフレッシュして、ビルド結果を反映する必要があります。

コードを修正後、ビルドの一連の手続きを実行するのは手間なので、ビルド作業をEclipse上で実行できるようにします。

Eclipseのビルド設定

EclipseにVue.jsのビルド設定を追加することで、コマンドプロンプトからnpmコマンドを実行することなく、Vue.jsのビルドが可能となります。

プロジェクトのプロパティから「ビルダー」を表示し、[新規...]ボタンをクリックします。

「構成タイプの選択」ダイアログが表示されます。「プログラム」を選択して[OK]ボタンをクリックします。

「構成の編集」ダイアログが表示されます。

「名前」に適当な名前を入力します。ここでは「Vue.js Builder」としています。
「メイン」タブに実行するビルドコマンドの情報を入力します。以下の内容を設定します。

  • ロケーションは「${system_path:npm.cmd}」
  • 作業ディレクトリーは「${project_loc}/vue」
  • 引数は「run build」

「リフレッシュ」タブは「完了時にリソースをリフレッシュ」をチェックし、「特定のリソース」を選択、「再帰的にサブフォルダーを組み込む」をチェックします。
そして、[リソースの指定]ボタンをクリックします。

「ワーキング・セットの編集」ダイアログが表示されるので、プロジェクトのsrc - main - resources - staticを選択し、[完了]ボタンをクリックします。

「ビルド・オプション」タブは「自動ビルド中」をチェック、「関連するリソースのワーキング・セットを指定」をチェックし、[リソースの指定]ボタンをクリックします。

「ワーキング・セットの編集」ダイアログが表示されるので、vue - publicvue - srcを選択し、[完了]ボタンをクリックします。

以上の設定をして、「構成の編集」ダイアログの[OK]ボタンをクリックします。
プロパティダイアログの「ビルダー」に作成したビルダーが追加されていることを確認して、[適用して閉じる]ボタンをクリックします。

ビルドの確認

この設定で、Vue.jsのソースファイルを更新して保存するたびに、自動でビルドプロセスが始まり、ビルド結果がSpring Bootプロジェクトに反映されます。

試しに、Spring Bootプロジェクトを実行し、ブラウザでアプリケーションの画面を表示後、Vue.jsのソースを変更して、ブラウザをリフレッシュしてみましょう。
Vue.jsの変更内容が反映されていることがわかると思います。

ビルドタイミングの調整

自動ビルドではVue.jsのソースファイルを書き換えるたびに自動でビルドが実行されるので、開発者はビルド作業自体を意識する必要がなくなります。
半面、Vue.jsのファイルを変更して保存するたびにビルドが実行されるので、PCの負荷が高まります。
任意のタイミングでビルドしたい場合は、[プロジェクト] - [自動的にビルド]のチェックを外して、ビルドをしたいタイミングでCtrl - Bでビルドを実行させることができます。

ビルド設定のまとめ

ビルダーの「構成の編集」ダイアログの各タブで設定する内容は以下の通りです。

  • 「メイン」タブ
    実行するコマンドの設定です。実行するコマンドとコマンド引数、コマンドを実行するときのカレントフォルダを設定します。
  • 「リフレッシュ」タブ
    ビルド実行後にプロジェクトをリフレッシュする設定です。ビルドを実行した結果、プロジェクト内のファイルが更新される場合は、リフレッシュの設定をします。ビルドした結果、ファイルが更新されるフォルダが限定的な場合、「特定のリソース」でリフレッシュするフォルダを限定することで、リフレッシュの動作が早くなります。
  • 「ビルド・オプション」タブ
    ビルドの実行に係る設定です。「自動ビルド中」にチェックを入れることで、自動ビルドで本ビルダーが自動的に実行されるようになります。また、「関連するリソースのワーキング・セットを指定」をチェックすることで、特定のフォルダ配下のファイルを書き換えた時のみ、本ビルダーが実行されるようにします。Vue.jsのソースフォルダを指定することで、Vue.jsのソースファイルを変更した場合のみ、Vue.jsのビルダーが実行されるようにしています。

Spring Boot + Vue.js で作るWebアプリケーション③ - プロジェクトの作成

Spring Boot + Vue.jsのプロジェクトの作成

今回はSpring Boot + Vue.jsのプロジェクトを作成します。
この記事の手順通りに進めるだけで、Vue.jsのアプリケーションを立ち上げることができます。まずはVue.jsを体験してみましょう!

Spring Bootプロジェクトの作成

まずはSpring Bootを使ったWebプロジェクトを作成します。
Spring Initializrを使って、プロジェクトの作成を開始します。

プロジェクトの情報入力のダイアログが表示されます。
ここでは、タイプを「Gradle Project」に、パッケージングを「War」にしています。

プロジェクトの依存関係を指定します。
「Web」の「Spring Web」だけチェックして、「次へ」ボタンをクリックします。

作成するプロジェクトの確認画面が表示されます。「完了」ボタンをクリックします。

作成されたプロジェクトが表示されます。Webアプリケーションのリソースが格納される「/src/main/resources/static」フォルダにファイルがないことに注目してください。
このフォルダにVue.jsのビルド結果が格納されます。

プロジェクトのプロパティーから、ファイル・エンコードを「UTF-8」に、テキスト・ファイルの行区切り文字を「Unix」に変更します。

Vue.jsのソースをプロジェクトに追加

次に、作成したSpring BootプロジェクトにVue.jsのソースを追加します。

コマンドプロンプトの「cd」コマンドで、作成したSpring Bootプロジェクトのフォルダに移動して、「vue create」コマンドでVue.jsのソースを作成します。
「vue create」コマンドの引数に、Vue.jsのソースを作成するフォルダを指定します。ここでは「vue」フォルダを指定しています。
すると、作成するVue.jsソースのバージョン選択が表示されます。カーソルキーで選択し、Enterキーで決定です。ここでは「Vue 3」を指定しています。

Vue.jsのソースファイルの作成が始まります。作成が完了するまで待ちます。

作成が完了したら、Eclipseのプロジェクトをリフレッシュ(F5)します。すると、vueフォルダにVue.jsのソースファイル一式が作成されていることがわかります。

Vue.jsのビルド設定

Vue.jsのソースファイルをビルドすると、ビルドした結果がSpring BootのWebリソースのフォルダに格納されるようにします。

Vue.jsのソースフォルダにあるpackage.jsonを編集します。
「scripts」-「build」の値に「 -dest ../src/main/resources/static」を追加します。

コマンドプロンプトの「cd」コマンドで、作成したVue.jsのソースフォルダに移動して、「npm run build」コマンドでVue.jsのソースをビルドします。

Vue.jsのソースビルドが終わったら、Eclipseのプロジェクトをリフレッシュ(F5)します。すると、src/main/resources/staticフォルダにVue.jsのビルド結果が格納されていることがわかります。

アプリケーションの実行・確認

これまでの手順でプロジェクトの作成は完了です。いよいよ、アプリケーションを実行して動作させてみます。

といっても、Spring Bootのプロジェクトなので、実行は簡単です。Eclipseからプロジェクトを実行します。
起動ログがコンソール・ビューに表示されるので、起動が終わるまで待ちます。

起動が終わったら、Webブラウザで「http://localhost:8080/index.html」を開きます。
Vue.jsのサンプルアプリケーションの画面が表示されます。

Spring Boot + Vue.js で作るWebアプリケーション② - 開発環境構築

Vue.jsの開発環境構築

Vue.jsのプログラム構成

Vue.jsは、HTML、JavaScriptCSSを一つのvueファイルというものに記述します。
これだけ聞くと、画面の構成(HTML)、処理の実装(JavaScript)、画面の見た目(CSS)が一つのファイルでごちゃっとしそう・・・と思うかもしれません。
が、実際に書いてみると関連しているものが同じ場所に書かれているので、意外と見通しがいいんです。

当然、このvueファイルはブラウザで表示することができません。vueファイルをコンパイルして、HTML、JavaScriptCSSファイルを生成、ブラウザに表示することになります。
そして、vueファイルをコンパイルするためにNode.jsが必要になります。

Node.jsのインストール

Node.jsの公式ホームページ から、Node.jsのインストーラーをダウンロードします。
LTSでも最新版でも構いませんが、ここではLTSをダウンロードしました。

ダウンロードしたインストーラーを実行します。
Setup画面が表示されるので、[Next]ボタンをクリックします。

ライセンスの画面が表示されるので、[I accept the ~]のチェックボックスをチェックして、[Next]ボタンをクリックします。

インストール先フォルダの指定画面が表示されるので、変更せずに[Next]ボタンをクリックします。

インストールするコンポーネントの指定画面が表示されるので、変更せずに[Next]ボタンをクリックします。

追加のツールインストールの指定画面が表示されます。追加のツールは不要なので、チェックボックスにチェックを入れずに[Next]ボタンをクリックします。

インストールの準備が完了した画面が表示されるので、[Install]ボタンをクリックします。

インストールが開始されます。完了するまで待ちます。

インストールが完了すると完了画面が表示されるので、[Finish]ボタンをクリックしてインストーラーを終了します。

Node.jsのインストール確認

コマンドプロンプトを立ち上げて、nodeコマンドに「--version」オプションを指定して実行します。
正常にインストールされていると以下のような画面が表示されます。

vue/cliのインストール

node.jsがインストールできたら、次にvueのコマンドラインツールであるvue/cliをインストールします。
node.jsでインストールされるnpmコマンドを使用します。「-g」オプションを忘れずに指定します。

npm install -g @vue/cli

vue/cliのインストール確認

コマンドプロンプトからvueコマンドに「--version」オプションを指定して実行します。
正常にインストールされていると以下のような画面が表示されます。

Spring Boot + Vue.js で作るWebアプリケーション① - フロントエンドフレームワークのトレンド

現時点のフロントエンドフレームワークのトレンドは?

SPAを作るときにお世話になるフロントエンドフレームワークは「React」、「AngularJS」、「Vue.js」あたりが有名です。
2022年5月時点で、どのフレームワークが流行っているのか、Google Trendsで調べてみました。

御覧の通り、Reactが圧倒的です。AngularJSは終息傾向、Vue.jsはほぼ横ばいです。
このデータは全世界のトレンドワードなので、次に日本に絞ってみます。

ReactとVue.jsで二分しています。いろいろと調べたところ、Vue.jsはアジア圏で頑張っているようです。
Vue.jsは中国の大企業「アリババ」が開発したことから、アジア圏で人気が高いのでしょう。

Vue.jsはどうなのか

マツキの感覚的には、「AngularJS以上React未満」という感じです。
かなり頑張っていて、コードの見やすさは一番だと思いますが、実行時のランタイムエラーがわかりにくくて、デバッグしにくいです。

それでもVue.jsで行ってみよう!

マツキは職業SEです。お仕事でフレームワーク選定の権利が与えられないことも多々あるので、否応なしにVue.jsで開発することもあると思います。
何より、SEとして日本でトレンドシェアを二分するVue.jsをキャッチアップしておくべき、と思い基本的な使い方までを記事にしていきます。

カメラ、極まる。Xperia PRO-I 写真レビュー

前回の開封レビューに引き続き、今回はカメラが極まったという「Xperia PRO-I」で写真を撮影したので、写真にフォーカスしたレビューをします。
あえて、BASICモードで撮影しました。スマホらしく、パシャ撮りでどこまでの写真が撮れるかの確認です。

以前に使っていたGalaxy S10との比較となります。

ちなみに、マツキは過去、コンパクトデジカメ5台、一眼レスデジカメ1台を所持していたぐらいのカメラ好きです。

風景写真

あえて逆光になるポジションで撮影しました。

f:id:penguinlabo:20211221141322j:plain f:id:penguinlabo:20211221141338j:plain
Xperia PRO-I Galaxy S10

Xperia PRO-Iはフレアが抑えられていて、像がぼやけることなく撮影できています。
レンズ面の反射を防ぐTessarのT*コーティングが生きているんだと思います。
また、左の細かな枝の部分を拡大するとわかるんですが、Xperia PRO-Iの方がフリンジが抑えられている感じがします。

近接撮影

F2.0

まずは、F2.0による撮影です。Galaxy S10はポートレートモードで背景をぼかしています。

f:id:penguinlabo:20211221142403j:plain f:id:penguinlabo:20211221142701j:plain
Xperia PRO-I (F2.0 iso100) Galaxy S10 (ポートレート)

Xperia PRO-Iのほうが、ボケが強いです。
色合いは、やはりよく言われるよう、Galaxyは盛った色調で、Xperiaは見たままの色を再現している感じです。葉っぱの緑部分を見るとわかりやすいです。Galaxyは鮮やかな緑だけど、若干、作り物っぽい。Xperiaは本物っぽいけど、くすんだ色味になります。

また、背景をよく見ると、Galaxyは光が反射しているとことに光の玉のオーブが表れてます。左上の手すり部分がわかりやすいです。

F4.0

次にF4.0による撮影です。Galaxy S10は通常の写真モードでの撮影です。

f:id:penguinlabo:20211221143719j:plain f:id:penguinlabo:20211221143745j:plain
Xperia PRO-I (F4.0 iso100) Galaxy S10 (写真)

色味の傾向はF2.0と変わらないです。ボケ感はあまり変わりはなく、差は少ないですね。

引き撮影

次は引きで撮影したスカイツリーです。ディテールがどこまで保たれているのかを確認するために、一部分を切り出して400%に拡大しています。

f:id:penguinlabo:20211221145741j:plain f:id:penguinlabo:20211221145753j:plain
Xperia PRO-I Galaxy S10

どちらも大差はないですが、細かいところを見ると、Xperiaの方が高精細でシャープさを保っています。

次の画像は建物の壁部分の拡大です。

f:id:penguinlabo:20211221150550j:plain f:id:penguinlabo:20211221150600j:plain
Xperia PRO-I Galaxy S10

Galaxyの方はノイズリダクションが強いのか、のっぺりとした壁になって、質感が失われてる感じです。
ノイズリダクションが強いと質感が失われる欠点はありますが、ISO感度を上げた時のノイズを低減する利点もあるので、どちらがいいかは撮影シーンによるのかなと思います。

総評

Xperia PRO-IとGalaxy S10の日中の写真を比較しました。パシャ撮りでありながら、どちらも結構キレイと感じました。このレベルであれば、一般の人はどちらの機種でも満足するんではないでしょうか。
逆光など、光が強いシーンではXperia PRO-Iが有利です。TessarのT*コーティングがうまく機能しているんでしょう。

普通のスマホと同じ撮影スタイルのBASICモードでもきれいな写真が取れますし、マニュアルでいろいろと調整して、よりきれいな写真を撮ることもできます。
カメラ好きのためのスマホ、という感じですね。

今回の撮影で気になった点としては、「Xperia 1 III」から言われていることですが、日中の晴天の下では最大輝度にしても画面が暗くて見づらいです。
画面の輝度、色合いは、もう少し頑張ってほしいです。4K OLEDがもったいない。ガンバレ、ソニーさん!

カメラ以外の部分で、作りこみの甘さや不満点があるので、PRO-Iに限らずXperiaは万人が満足するものではないと感じました。国内メーカースマホの最高峰だとは思うので頑張ってほしい!
現時点では、一般の人はGalaxy S21、カメラ全振りのスマホが欲しい人はXperia PRO-Iという感じです。カメラ好きのマツキはPRO-I好きです。

カメラ、極まる。Xperia PRO-I 開封レビュー

カメラが極まったと話題の「Xperia PRO-I」買っちゃいました!

ソニーストアで198,000円(税込)と、そこそこハイスペックなパソコンが買えそうな価格です。

人を選ぶスマホで、一般人のマツキは「Xperia 1 III」を買った方がいいのは明らかでしたが、1.0型センサーの迫力に負けて、ポチっちゃいました。

ということで、発売日である2021/12/15に届いたので、さっそく開封していきます。
使ってみないとわからない不満点もぶちまけるので、購入を検討している方は参考にしていただければと思います。

開封の儀

f:id:penguinlabo:20211218233115j:plain

ソニーの白くてシンプルな箱です。

f:id:penguinlabo:20211218233211j:plain

開けると保護シールが張られた本体が出てきます。

f:id:penguinlabo:20211218233552j:plain

同梱物は、取扱説明書、スタートアップガイド、保証書のみで、USB充電アダプターなどは入ってません。

f:id:penguinlabo:20211218233723j:plain

そして本体。重量200gを超えるので、ずっしりと重量を感じます。

f:id:penguinlabo:20211218233943j:plain

まさに目玉の1.0型センサー。存在感もそうですが、本体からそこそこの高さ分、飛び出てます。確実に1円玉1枚以上の厚さの段差があります。

ここだダメだよXperia PRO-I

ちょっと触ってみて、気になった点、不満点をぶちまけていきます。

液晶の発色はそんなに良くない

今まで使用していたGalaxy S10との比較です。

f:id:penguinlabo:20211218235420j:plain

上がGalaxy S10、下がXperia PRO-Iです。
Xperia PRO-Iは白っぽいというか、色が浅いです。画質設定でクリエイターモードにしても、ほとんど変わらず。
解像度は高いんですが、発色は大人し目というよりは、色あせた感じになります。

Xperia 1 IIIも同じだと思うので、購入を検討している人は店頭でGalaxyと比較することをお勧めします。

画面の大きさはそんなに大きくない

画面の大きさは6.5インチですが、そこまで大きく感じません。
というのも、比率が21:9の縦長ディスプレイだからです。
先程のGalaxy S10との比較画像を見てください。Galaxy S10は6.1インチですが、写真のサイズがほぼ、一緒であることがわかります。

幅が小さいことで持ちやすい、ワイドであることでカメラアプリの操作部分が大きくなり、操作しやすいなどの利点もあるので、21:9の比率が一概にデメリットとは言えませんが、大きな画面でYoutubeとかNetflixの動画を見たい、という人には向かない画面比率です。

ボリュームボタンの位置が不満

Xperiaのボリュームボタンは右側の上寄りについています。縦持ちで右手で持つと親指の位置にあり、持ち替えなくてもボリュームの調整ができます。
では、何が不満かというと、横持でカメラを構えた時です。この画像を見てください。

f:id:penguinlabo:20211219002537j:plain

シャッターボタンは本体の端寄りに配置されていますが、ボリュームボタンは端から離れた位置に配置されています。
ボリュームボタンはカメラ時にズーム倍率の変更として使用します。画面から倍率の変更は可能ですが、BASICモード以外のすべてのモードで画面から倍率変更しようとすると、

  • レンズの変更をタッチ
  • 表示された「>」をタッチ
  • 倍率変更
  • 変更が終わったら、画面の別の部分をタッチ

と4アクションも必要になるので、自然とボリュームボタンを使うことになります。
ただ、ボリュームボタンが本体の端から離れているので、横持ちでは非常に押しづらい。シャッターボタンは押しやすい位置なので、ボリュームボタンももっと端に寄せてほしいところです。

ボリュームボタンは縦持ちの時に押しやすい位置に配置されてます。が、横持でカメラを構えた時に押しやすい位置に配置してほしいです。 キャッチフレーズの「カメラ、極まる。」が泣きます。UIのテストとかしてないのか?と疑います。

充電器との相性がシビア

地味に、一番不満に思うことです。
急速充電の充電器でも、ちょっとでも出力の弱い充電器だと「低速充電」になります。
USB PDでない、一昔前の充電器だと「通常の充電」になります。
問題は、一度でも「低速充電」になると、どんな充電器で充電しても「低速充電」のままなんです。本体を再起動すれば治るんですが、この「低速充電」病は面倒です。
Xperia 1 IIIでも、充電の不具合報告をよく見かけるので、注意が必要です。

Galaxyでは「急速充電」になる充電器でもXperiaでは「低速充電」になりました。せめて「通常の充電」で充電してほしい。そして、強制「低速充電」固定にならないでほしい。
低速充電になる原因の一つとして、Googleの純正アプリ「Digital Wellbeing」が原因との話も上がってますが、「Digital Wellbeing」を無効化しても同じだったので、やはり充電器との相性はシビアなようです。

まとめと次回予告

いろいろと不満はありますが、キャリアスマホの無駄なアプリによる無駄な通知から解放されたので、そこはよかったなと思います。おサイフケータイも使えるし。
例えば、ソフトバンクで下位機種のXperia 1 IIIを買うと、18万8640円です。1万円程度しか差がないのにストレージ容量半分、カメラのセンサーが小さくなる下位機種を買うことになります。なんですかねー、キャリアモデルって。

次回はGalaxy S10とXperia PRO-Iで写真を撮り比べてみようかと思います。「カメラ、極まる。」だそうなので。