コードの重複
長いクラス
長いメソッド
不適切なコメント
単一責務違反
複雑な判定条件
不適切なネーミング
1.ページロードの時間は、想定内か?
2.ネットワークが細い状態でのページのロード時間は?
3.アクセスが、少ない、普通、多い状態でのレスポンスの時間は?
4.データベースのストアードプロシージャやトリガーのパフォーマンスは?
5.データベースへのQueryの実行時間は
6.アプリケーションのロード時間は?
7.アプリケーションに負荷がかかった状態でのレスポンスは?
8.ビーク時のCPUやメモリの負荷は?
バージョン管理を行うファイルや構成情報を管理する場所。
リポジトリから編集のためにファイルなどを取り出す。
作業用コピーがつくられる。
変更をリポジトリに保存する。
リポジトリに(他の人が)加えた変更を作業用コピーに反映させる。
同じコードの同じ部分を、異なる人が、更新してしまう。
指定したファイルを、他の人が変更できないようにする。
サーバは、作成済みとします。今回は、Red Hat Enterprise Linux release 10.0
です。
1.Apacheをインストール
sudo yum install -y httpd
2.サービスを起動する
sudo systemctl start httpd
3.ファイアウォールで、HTTP / HTTPSを許可
許可してリロードします。
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
4,サーバのあるVPCのファイアウォールは、空いているとします。
5.ブラウザでアクセスしてみる。
http://<サーバのIP>
でアクセスすると、
Test Page
が表示されました。
公開されている
Model , View , View Model (MVVM pattern)は、次のような分割である。
公開されている
Cloud Native Software Engineering
のキモの部分を読んで勉強してみたいと思います。
概要
クラウドネイティブなアプリケーションに関しての
ソフトウェアエンジニアリングのプラクティスは、少ない。
クラウドネイティブなアプリケーションは、
クラウドプラットフォーム向けに設計、実装され、
ディプロイされるソフトウエアのこと。
この論文は、クラウドネイティブなソフトウェアエンジニアリングの
概要を目指す。
クラウドネイティブ・コンピューティングとは
次の特徴を持っている。
Well Architected System
ソフトウェアエンジニアリングのベストプラクティスを
提供するだけではなく、機能、非機能をクラウドが提供する。
たとえば、認証の実現、セキュリティ要件への対応、
信頼性や、スケーラビリティへの対応などである。
-- つづきます --
公開されている
Rapid application development(RAD) : an empirical review
のキモ部分を読んで、RADを勉強してみたいと思います。
イントロ
Rapid application development(RAD) は、James Martin が提唱したもの。
Martin は、RADのキーとなる目標に関して、
高品質のシステムを高速にローコストで開発する
としている。
RADの方法論の1つとして、
dynamic systems development method (DSDM)がある。
DSDMは、次の5つのエリアをカバーしている。
(1) Model of development process
DSDMは、イテレイディブで、インクリメンタルなモデルである。
(2) Set of techniques
DSDMは、joint requirements planning work shop や
joint application design workshop 、タイムボックスなどの
概念を提唱しているが、ER図など伝統的な方法も利用する。
(3) Documentation methods
(4) 哲学
RADのコンポーネントには、次がある。
Joint application design(JAD)
RADは、4~8人の小さなチームで行う。
利用者と開発者から成り立っており、意思決定の権限がある。
Joint application development workshop(JAD)
要求の引き出しなどで広く使われる。
このワークショップの中で、主要なユーザ、クライアント、開発者が
ファシリテーターの元、システムのスコープやビジネス要求を決めていく。
開発者は、3~5日でビジネス要求をドキュメント化することが
期待される。
Rapid of development
RADのプロジェクトは、比較的、小規模短期間である。
一般的には、2~6か月が普通であると言われる。
Clean rooms
JADのworkshopは、通常のビジネスや開発の現場から離れた
クリーンルームで行う。クリーンルームは、通常の仕事からは離れ、
ポストイットのような必要なものが揃った場所である。
ここで問題解決に集中する。
Incremental prototyping
プロトタイプは、システムをインクリメンタルに構築していく方法。
開発者は、最初の調査の直後、モデルを作ってユーザへデモを行う。
開発者とユーザーは、プロトタイプについて、議論し、
改善に合意する。
RADプロジェクトでは、この検査-議論-改善のプロセスが、
3回は、繰り返される。
プロトタイプは、要求の収集、アプリケーションのデザイン、
アプリケーションのBuild、テストなど、どの工程でも利用できる。
RADは、インタラクティブな要素が多く、複雑でないプロジェクト
で利用されている。
Dynamic System development method(DSDM)
DSDMは、RADの方法論の1つである。
DSDM Principle
1.ユーザの参加は必須
2.DSDMのチームは、意思決定を委譲されている
(つづきます)
同じ結果となる入力の範囲を同値クラスとして、
同値クラスの代表値のみをテストする。
同値クラスの境界の上限や下限などをテストする。
テスト対象をディシジョンテーブルをもとに作成し、
漏れを防ぐ。
(3,6,1)を昇順にソートする例です。
1. (3.6.1)の最大値を見つける。
この場合は、6
2.1の最大値分の配列を用意する。
例えば、a[6]とする。
3.a[6]の各要素を初期化する。
例えば、0とする。
4.(3.6.1)の最初の要素から次を繰り返す。
5.最初の要素(3)を、その添え字にもつa[6]の配列に、
その値を入れる。
a[3] = 3
6.次の要素(6)を、その添え字にもつa[6]の配列に、
その値を入れる。
a[6] = 6
7.a[6]の配列の中で、初期値でないものを順に取り出すと、
ソートされている。
公開されている
A Comparison of User Experience in Progressive Web Apps and Cross-platform
Framework Apps
のキモ部分を読んで、勉強してみたいと思います。
概要
モバイルアプリケーションでは、クラスプラットフォームでの開発が進んでいる。
クロスプラットフォームのフレームワークは、数多くある。
Progressive Web Appでのアプローチは、数好きない。
Progressive Web Appは、オフラインでも利用できるもので、
ブラウザで動作することで、クロスプラットフォームを実現する。
しかし、利用者には、普通のアプリに見える。
この年休は、クロスプラットフォームとProgressive Web Appでの
UXの違いを、パフォーマンス、機能評価、外観の違いから比較する。
また、起動時間、バッテリーの使用、アプリのサイズ、機能のロード時間
を測定した。そして、カメラ、シェア、通知、認証などの見た目や機能を
評価した。
評価のため、2つのアプリケーションを作成した。
Progressive Web Appは、Reactで、クロスプラットフォームは、
React Nativeで作成した。両方のアプリが同じ機能を実装する。
この2つのパフォーマンス、外観、機能を、AndroidとiOSで比較する。
結果、低スペックの端末では、React Nativeのアプリが、
Progressive Web Appsを上回り、見た目や機能性も、より、
ネイティブアプリに近いことが示された。
ただし、その差は小さい場合が多く、クロスプラットフォーム開発においては、
Progressive Web Appも有効な選択肢となる。
しかし、伝統的なWeb appには、いくつか制限がある。
ブラウザで動かすこととなるため、スクリーンには、
アドレスバーが現れる。
また、ハードウェアへのアクセス、ハードウェアが提供する機能、
ローカルストレージの利用、通知などに制約がある。
Progressive Web Apps(PWAs)は、これらの制限を克服するための機能を
Web appに導入するもの。
PWAは、オフラインでも利用できる。
Webからインストールでき、普通のアプリのように動作するが、
app storeは、必要ない。
PWAでクロスプラットフォームのappを開発する時は、OSが提供する
いくつかの機能とUIを使うことができるため、
ネイティブアプリのような外観が実現できる。
この研究は、ReactでつくったPWAと、React Nativeでつくった
アプリとのUXの比較である。
問題
マルチプラットフォームのアプリを開発する場合、PWAを利用するか、
クロスプラットフォームのフレームワークを利用するかの選択肢がある。
この選択肢は、1つのcodebaseで、複数のプラットフォームへ対応する
ニーズから出ている。
この研究のリサーチクエスチョンは、次である。
RQ1:Reactで作られたPWAsとReact Nativeで作られたアプリで、
起動時間、バッテリーの利用、アプリのサイズ、機能のロード時間が、
どのように異なるか?
起動時間、バッテリーの利用、アプリのサイズなどのパフォーマンスは、
UXにとって重要である。ユーザ入力後のレスポンスタイムも重要である。
RQ2:Reactで作られたPWAsとReact Nativeで作られたアプリは、
機能や見た目がどう異なってくるのか。
OSが提供するUIと似たものになれば、UXに大きなインパクトを与える。
目的
PWAとクロスプラットフォームのappの間のUXの差異には、どのような
要素があるかを評価する。
1.Reactを使ったPWAとReact Nativeを使った、同じシンプルな
アプリを作る。
2.2つのアプリから、パフォーマンス、外観、機能に関するデータを得る。
3.2つのアプリの類似点や差異を抽出する。
モバイル開発
Native
ネイティブアプリを開発する伝統的な方法は、OSに合わせた手法である。
OS特有のSDKや言語を利用する。OSが提供するAPIを利用して、
OSの機能を直接利用する。
これにより、Look&Feelは、一般性があるものとなる。
それぞれのOSは、独自のAPIを持つため、それぞれのOSをターゲットとした、
codebaseが必要となる。
Androidのアプリケーションは、Androidのフレームワークを利用して、
Javaあるいは、kotlinでプログラムされる。
一方iOSでは、Appleのフレームワークを利用し、
objective-cあるいは、swiftでプログラミングされる。
異なるSDKやフレームワークに対応した複数のcodebaseを開発、維持していくのは、
コスト高につながる。
そこに1つのcodebaseで複数のプラットフォームに対応できる
クロスプラットフォーム開発のメリットがある。
クロスプラットフォーム開発
クロスプラットフォーム開発は、1つのアプリケーションで、
複数のプラットフォームに対応するもの。
複数のプラットフォームに対して、同一のcode baseで対応することができる。
クロスプラットフォーム用のフレームワークを利用する。
フレームワークは、各ブラットフォームのAPIをラップする抽象化レイヤを作る。
この抽象化レイアが、プラットフォームの違いを吸収する。
Web App
単一のcode baseで、クロスプラットフォームを実現することは、
モバイルデバイス上のWebブラウザでwebアプリを実行することで、
達成できる。
このアプリは、HTML、CSS、JavaScriptで作られ、
モバイルデバイス用に最適化されている。
このアプローチには、欠点もある。ブラウザーの
アドレスバーなどに大きな面積をとられること、
デバイスやシステムが提供する機能へのアクセスに制限があること、
オフラインでは利用できないこと、である。
Progressive Web Apps
PWAsは、webアプリケーションで、Web APIを利用することで、
アプリのようなUIを実現するもの。
PWAは、ネイティブアプリの利点と、Webアプリの利点の両方を実現するもの。
インストールでき、オフラインでも利用でき、デバイスやシステムの機能に
アクセスできる。webを通じて得ることができ、アプリストアが必要ない。
単一のcode baseで、いくつかのプラットフォーム上で稼働する。
webサイト同様、PWAはURLを通じて、アクセスできる。
app manifestが、インストールに必要な情報を提供する。
インストールされると、PWAは他のアプリと同じように見える。
アイコンがスクリーン上に現れ、フルスクリーンで開き、
アプリケーションのスイッチャ上に現れる。
PWAは、ブラウザーで動いてはいるものの、ユーザには、
他のアプリと変わりない。
Service workerを使うことで、PWAは、オフラインでも利用できる。
また、push通知なども実現できる。
PWAのインストール
PWAは、ブラウザーからインストールすることができ、
アプリストアが必要ない。
ブラウザでURLへアクセすることで、PWAにアクセスできる。
そして、普通のアプリとして利用できる。
App Manifest
PWAのエッセンシャルな部分に、app manifestがある。
app manifestは、JSON形式でアプリの外観と振る舞いを記述するもの。
アプリの名前、アイコンなどを指定する。
React
Reactは、Webアプリを開発するオープンソースのJavaScriptのライブラリ。
UI、ロジック、外観についてのコンポーネントを扱う。
Reactのアプリケーションを作るためには、React projectのセットアップツール
を利用する。そこで使われるテンプレートは、PWAsをサポートする。
App Manifestファイルと、キャッシュのロジックを実装する
サービスワーカーfileを含む。
デフォルトのままでも、静的なアセットはキャッシュされ、PWAが
オフラインでも利用できるようになる。
React Native and Expo
React Nativeは、オープンソースのプラットフォーム
開発用のフレームワーク。
Reactに基礎を置き、クロスプラットフォームのために、
JavaScriptを利用する。
React Nativeは、アプリのUIや機能を作るためのコンポーネントと、
APIを含む。開発者は、コンポーネントやAPIをJavaScriptで利用し、
デバイスでは、JavaScriptがネイティブプラットフォームにアクセスする。
この方法で、プラットフォームSDKをコンポーネントやAPIに隠蔽する。
React Nativeプロジェクトでは、Expoという追加のプラットフォームが、
活用できる。
Expoの一部に、ExpoSDKがあり、React Nativeに含まれないコンポーネント
ライブラリを活用できる。
--つづきます---
公開されている
Understanding the Correlation between Code Smells And Software Bugs
のキモの部分を読んで勉強してみたいと思います。
バグ予測は、ソフトウェアの品質保証を助ける。
ソフトウェアのテストに必要なeffortが予測できるためである。
アンチパターンとcode smellは、コード品質に大きな影響を持つと言われる。
リファクタリングは、これらアンチパターンの負のインパクトを取り除く
ものである。
この論文では、code smellの影響とバグの重大度に関するもの。
BIRT、AspectJ、SWTのプロジェクトの複数のバージョンから分析する。
異なるcode smellとバグの重大度の間の相関関係を分析した。
コード中のエラーは、重大度に基づく優先度順に修正する必要がある。
ソフトウェア開発にかかわる費用の80%が、バグFixに使われている、
という報告もある。
このコストを削減するため、多くのバグ予測モデルが提案された。
これらのモデルは、ソフトウェアシステム中のどこにバグばあるかを、
予測するものである。
バグ予測モデルの多くは、コードの複雑度や
プロセス(code churn)などのメトリクスが利用される。
開発者はコードの中にcode smellを入れてしまうことがある。
こららのアンチパターンやcode smellは、システムの機能には
影響を与えないが、保守を困難にする。
code smellは、また、バグを生む可能性がある。
過去の研究では、code smellを含むclassは、そうでない
classに比較して、バグ proneであった。
バグを減らすためには、code smellを減らす必要がある。
これを行うのが、リファクタリングやコードの再構築である。
アンチパターンやcode smellを削減するリファクタリングや
再構築のツールは、数多くある。
code smellとdefectの間の関係がわかることには、意味がある。
そこで、code smellとバグの間の関係を、wekaが提供する
機械学習のアルゴリズムで測定することに挑戦した。
データは、BIRI、SWT、AspectJ の3つのオープンソースから
抽出した。
次のリサーチクエスチョンに応えるものである。
RQ1:code smellは、バグの重大度と関係があるのか?
code smellのいくつかは、他のcode smellより重大度に
インパクトを与えるものとした。
RQ2:機械学習のアルゴリズムで更なる情報がわかるか
code smellは、重大度に影響するだけではなく、
バグの数にも影響した。
方法
code smellの発見器では、次のようなアンチバターンが発見できる。
Cyclic Dependency
2つ以上のモジュールが、直接あるいは、非直接的にでも、
お互いに依存している。
Blob Class
すべての機能を持ち、すべての責務を持つClass。
God Class
多すぎる数のクラスをコントロールする。
大きすぎるロジックを持つクラス。
Data Class
データと、そのセッター/ゲッターのみを持つクラス。
Schizophrenic Class
関連しない/利用されないpublic methodを持つクラス。
Refused ParantBequest
サブクラスで、親クラスから継承したメソッドや、
プロパティの一部しか利用していないクラス。
-- つづきます。--
Pleiades All in Oneを利用します。
https://willbrains.jp/
から、
Mac用Javaをダウンロードしました。
1.58Gもあった。時間かかります。
ダウンロードした
pleiades-2025-06-java-mac-jre_20250615.dmp
をダブルクリックして、インストール。
アプリケーションから
Eclipse_2025-06
を実行。
「Appleは検証できませんでした」
エラーが出るので、こちらのページの通り対処して起動しました。
https://www.century.co.jp/support/faq/macos-error.html
Eclipseが起動してくるので、メニュから
[ファイル]-[新規]-[Javaプロジェクト]-[Javaプロジェクトを新規作成]
で、プロジェクトを作成しました。
プロジェクトを作成後、そのプロジェクトで、
[ファイル]-[新規]-[Javaクラスの作成]
を選択。
ダイアログで、スタブ
public static main()
を作るにチェックを入れて、完了。
次のようなソースが作られました。
public class Main {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
}
}
ここに、
// TODO 自動生成されたメソッド・スタブ
System.out.print("hello") ;
を追加して、リボンから、▶️で、実行。
コンソールウインドウに、
hello
が表示されました。
未ソートの部分から、最小値を見つけ、それを先頭にもっていく。
こんな感じのアルゴリズム。
1.未ソート部分の中から最小値を探す
2.最小値の要素と、未ソートの先頭の要素を交換する
3.未ソート部分の先頭を1つ後ろに、ずらす
4.未ソートが、1つになるまで、これを繰り返す
公開されている
An Empirical Study on the Evolution of Design Smells
のキモ部分を読んでみたと思います。
概要
システムの改善は、時として、アーキテクチャのデグレーションを引き起こす。
そもそも存在してた設計上の問題が原因である。
このような問題を、code smellという。
この研究では、8つのソフトウェアシステムのcommitに対して、
それぞれのcommitごとに、複数のデザイン上のcode smellを発見した。
そして、発見したcode smellとリファクタリングの関係を調査した。
結果、design smellに影響されるclassは、変更が多い。
特に複数のsmellが存在するclassに多いと分かった。
smellの削除は、必ずしもリファクタリングと関連しないことが、
分かった。
イントロ
短納期への対応は、設計上の問題や、手戻りのコストが発生する場合がある。
また、将来の開発時や、保守性に問題を及ぼすことがある。
設計の問題に関しては、多くのリサーチがあり、
設計上の問題が変更こすろを押し上げるとした。
design smellは、このような問題を引き起こす兆候である。
design smellの存在は、保守に悪影響を与える。
アーキテクチャ smellは、アーキテクチャレベルでの
貧弱な設計である。
アーキテクチャ smellは、理解容易性、テスト容易性、
拡張性、再利用性などに影響を与える。
--- つづきます ---
RAD MODELのプロセスの例
1.ビジネスモデリング
・ビジネスを駆動するデータは
・誰が、どこで、何の情報をつくるのか
2.データモデリング
・オブジェクトと、オブジェクト間の関連
3.プロセスモデリング
4.アプリケーション生
・ジェネレータなどで、プログラムを生成する
5.テストとふりかえり
・1つのモジュール内に存在する命令の凝縮度のこと。
・「弱いもの→強いもの」の順に、次の区分がある。強い方が良いとされる。
(1) 暗号的
複数の関係のない機能を実行する。
(2) 論理的
関連したいくつかの機能を含み、そのうち1つが外部から呼び出される。
(3) 時間的
関連の薄い機能を逐次実行する。初期処理など、実行時期が一致している。
(4) 手順的
複数の逐次的な機能を実行する。
(5) 連絡的
手順的に加えて、同じデータを処理するものをまとめる。
(6) 情報的
特定のデータを扱う機能をまとめる。
複数のエントリーポイントを持ち、1つのエントリーポイントは、
1つの機能を実行する。
(7) 機能的
すべての要素が1つの機能を実行する。
・モジュール間の関連性の尺度。
・「強いもの→弱いもの」の順に、次の区分がある。弱い方が良いとされる。
(1) 内容結合
他のモジュール内のデータを直接参照する。
(2) 共通結合
共通のデータ構造を直接参照する。
(3) 外部結合
宣言してあるデータの参照。個々のデータ項目の参照。
データ構造がない点が、(2)と異なる。
(4) 制御結合
制御要素(スイッチ等)が、パラメータとして渡される。
(5) スタンプ結合
2つのモジュールが同じデータ構造を共有する。
(6) データ結合
2つのモジュール間のインターフェースを、
パラメータの受け渡しだけで行う。
総当たりアルゴリズム すべての場合をためし、解を求める。 近似アルゴリズム ・正解に近い解を探す ・正解との誤差がある範囲におさまると保証されているものを 精度保証付アルゴリズムという。 ・精度の保証のないアルゴリズムを、発見的手法(ヒューリスティック) という。