ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

6
コードのデバッグ方法(悪夢のような状況)
私は仕事でアプリケーションのデバッグを頻繁に行います。これは、テスト環境と実稼働環境を含む、ビジネスに展開するBIアプリケーションです。これらの制約に基づいて、人々が提案できるアプリ/ツール/メソッドがあるかどうか疑問に思っています: ソフトウェアはテスト環境がないカスタムサードパーティアプリケーションに依存しているため、クライアントサイトまたはローカルでデバッガーを使用することはできません。(編集:公平にするために、場合によってはローカルでデバッグすることができます。コアコード以外を使用しない場合、問題のあるコードの多くは、サードパーティ固有の通信をカプセル化するdllにあります:ソケット、プロセスパイプ、soap呼び出し、コアコードの動作を変更するカスタムロジック。通常、クライアントの実装または拡張中に、この領域に新しいコードを記述します。 アプリでは実質的にロギングは行われません。単体テストはありません。 バージョン管理には、フルソリューションの1つのバージョンしかありません(ソースセーフ2005を使用)。そのため、ソリューション全体の以前のバージョンを取得することはできず、個々のファイルのみを取得することができます。(誰かがこれを回避する方法を知っていない限り)。 ローカルでは再現できません。テスト環境では再現できないことがよくあります(テストと本番が同じバージョンではない可能性が高い)。 クライアントが使用しているバージョンがソースセーフのバージョンと異なる可能性が高くなります。これは、個々のファイルが更新され、その特定のクライアント用のカスタムロジックが埋め込まれているためです。多くの場合、バイナリが更新され、他のいくつかのバイナリを変更する必要がありますが、コミットが完了すると、これについての記録や知識はありません。よくあるエラーは、クライアント環境で「関数/メソッドが見つかりません」または「メソッド呼び出しに指定されたパラメーターが多すぎる/少なすぎる」ことです。 これは.net VBソリューションです クライアントサイトにはソフトウェアをインストールできませんが、ローカルにインストールできます 私たちのアプリケーションは非常にカスタマイズ可能ですが、残念ながら、カスタマイズロジックは、クライアントごとにデータベースに加えられたカスタム変更を含め、フロントエンドからデータレイヤーに至るすべてのクラスとファイルに分散されています。 コードには実質的にコメントはありません。アーキテクチャに関するドキュメントはありません。APIに関するドキュメントはありません。私たちが持っている唯一のものは、何が起こっているかをいくらか説明する何百もの電子メールチェーンです。コードを知っているのは元々コードを書いた人だけですが、彼らはもはや開発者ではないので、それほど関与しません。 そして、あなたがそれを言う前に...はい、私は知っています。自分も撃ちたいです。スパゲッティコード、何百ものコンパイラ警告、そして本当に修正すべきポリモーフィズムが存在することは助けにはなりませんが、私はそれに言及していません。 私が遭遇する最も一般的な種類のエラーは、null参照エラー、無効なキャスト、および欠落した関数/関数シグネチャの不一致です。幸運なことに、イベントビューアーはクラス、メソッド、例外メッセージをログに記録します。それは最も有用ではありませんが、それでも何かです。最悪なのは、スクリーンショット以外にトレースや再現手順がないエラーであり、上記のような一般的なエラーメッセージです。環境が適切に構成されておらず、それが後でなくなることを祈るだけで、それらが発生した理由を見つけることができない場合があります。 私はこれが少し暴言として出てくることを知っています、そしてある程度はそうです。しかし、私はオプションに必死です。私が使用できる他の方法/ツールはありますか?
16 .net  vb.net  n-tier 

1
プログレッシブHTTPダウンロードは、ライブビデオを提供するためのHLS / DASH / RTMPの実行可能な代替手段ですか?
ライブビデオをユーザーにストリーミングする必要があるWebサイトで作業しているため、現在のブラウザーベースのビデオストリーミングテクノロジーの残念な状態を回避する必要がありました。現在、ライブストリーミングの最も一般的なソリューションには互換性の問題があります。RTMPはFlashを必要とし、HLSはAndroidのSafariとChromeでのみネイティブにサポートされ、DASHはどこでもネイティブにサポートされず、dash.jsを使用するにはMedia Source Extensionsが必要ですが、これはまだ広くサポートされていません。 これは私には明らかな質問につながります:ブラウザーサポートまたはプラグインを必要とするHLS、RTMP、DASHのようなプロトコルの代替として単純なプログレッシブダウンロードを使用することは可能ですか? プログレッシブダウンロードを使用してライブメディアをストリーミングするというアイデアは、これまでにないものではありません。人々はすでにオーディオのためにそれをしています。liveCasterなどのツールを使用すると、事前に記録されたMP3ファイルを必要とせずに、単一のプログレッシブHTTP応答を介してライブMP3オーディオをストリーミングできます。 しかし、ビデオでこの手法が実際に使用されている例は見たことがありませんが、その理由はわかりません。面倒で難しいブラウザ側の互換性の問題の層を比較的少ないトレードオフで削除するようです。(そして、ライブストリーミングの場合、プロが行っても互換性は依然として大きな問題です。FirefoxでBBCのiPlayerでライブビデオを視聴しようとすると、Flashをインストールするように指示するエラーメッセージが表示されます。)このテクニックは、私以外の誰もこのアイデアに言及するのを見たことがない。 どうして?生成されているプログレッシブダウンロードを介してMP4のようなビデオファイルをストリーミングし、ダウンロードしながら<video>要素で再生することを不可能にする根本的な制限はありませんか?

2
シリアル化と逆シリアル化は、シリアル化されるクラスの責任ですか?
現在、C#.NETアプリケーションのいくつかのモデルクラスの(再)設計段階にいます。(MVCのMのようなモデル)。モデルクラスには、適切に設計されたデータ、動作、および相互関係が十分にあります。モデルをPythonからC#に書き換えています。 古いPythonモデルでは、いぼが見えると思います。各モデルはそれ自体をシリアル化する方法を知っており、シリアル化ロジックはクラスの残りの動作とは関係ありません。たとえば、想像してみてください: Image.toJPG(String filePath) .fromJPG(String filePath)メソッドを持つクラス ImageMetaData.toString()and .fromString(String serialized)メソッドを持つクラス。 これらのシリアル化メソッドがクラスの他の部分と密接に結びついていないことを想像できますが、クラスだけがそれ自体をシリアル化するのに十分なデータを知っていることが保証されます。 クラスが自分自身をシリアル化および逆シリアル化する方法を知ることは一般的な習慣ですか?または、一般的なパターンが欠落していますか?

3
Modelとまったく同じViewModelを追加することをお勧めします
ソリューションに次のレイヤーがあります。 App.Domain App.Service App.Core(これをApp.DataLayerと呼ぶかもしれません) App.Web ソフトウェア設計パターンは私の質問ではなく、次のモデルがあります Domain public class Foo { public int Id {get;set;} public int Name {get;set;} public int Value {get;set;} } ビュー(たとえば、ホームページ)でこのモデルを使用しId, Name & Value、さらにを使用したいので、ViewModelを作成する場合は、次を追加します。 public class FooViewModel { public int Id {get;set;} public int Name {get;set;} public int Value {get;set;} } だから、それは良いアイデアですか?または単に?のFoo代わりに使用しFooViewModelます

2
GPLで許可されている独自のアプリケーションにOpenJDKをバンドルしていますか?
現在、Steamを介して配布される可能性が最も高いJavaでビデオゲームを作成しています。もちろん、この場合、多くのSteamユーザーにはJavaがまだインストールされていません。これが発生した場合、Javaをインストールする必要があることをユーザーに伝える有益なダイアログを表示する小さなネイティブランチャーを使用するか、単に自分のJavaランタイム環境(具体的にはOpenJDK 8)をゲームにバンドルします。私のゲームはクローズドソースになりますが、オープンソース(BSDライセンス)ゲームエンジンに基づいています。 OpenJDKのライセンスを調べました。GPLプロジェクトであるため、それにリンクするものはすべてGPLである必要があります。ただし、クラスパス例外もあります。リンク部分が適用されるかどうかは、コードがバンドルされているかどうかに関係なくリンクされていないためわかりません。私の知る限り、クラスパス例外はこのユースケースをカバーしていません。 Stack Overflowにも同様の質問がありますが、これはアプリケーションがOpenJDKで開発されている状況を指し、OpenJDKで配布することを指します。
16 licensing  gpl 

5
C ++:クラスはその依存関係を所有または観察する必要がありますか?
class Foobarを使用する(依存する)クラスがあるとしWidgetます。Widget古き良き時代では、woludはのフィールドとして宣言されるFoobarか、多態的な動作が必要な場合はスマートポインターとして宣言され、コンストラクタで初期化されます。 class Foobar { Widget widget; public: Foobar() : widget(blah blah blah) {} // or std::unique_ptr<Widget> widget; public: Foobar() : widget(std::make_unique<Widget>(blah blah blah)) {} (…) }; そして、私たちはすべて準備ができて完了です。残念ながら、今日は、Javaの子供たちはカップルとして、当然、彼らはそれを見たら、私たちを笑う、となりますFoobarとWidget一緒に。解決策は一見シンプルです。依存関係の注入を適用して、Foobarクラスから依存関係を構築します。しかし、その後、C ++は依存関係の所有権について考えるように強制します。3つのソリューションが思い浮かびます。 ユニークなポインター class Foobar { std::unique_ptr<Widget> widget; public: Foobar(std::unique_ptr<Widget> &&w) : widget(w) {} (…) } Foobarそれの唯一の所有権がWidgetそれに渡されると主張する これには次の利点があります。 パフォーマンスへの影響はごくわずかです。 FoobarコントロールのライフタイムがWidgetであるため、安全です。そのため、Widget突然消えることはありません。 Widget漏れることはなく、不要になったときに適切に破壊されます。 ただし、これにはコストがかかります。 Widgetインスタンスの使用方法に制限があります。たとえば、スタックに割り当てられたものWidgetsは使用Widgetできず、共有できません。 …

5
自身または他の2つのことを表すデータ型を作成する方法
バックグラウンド 私が取り組んでいる実際の問題は次のとおりです。カードゲームMagic:The Gatheringでカードを表現する方法が必要です。ゲーム内のほとんどのカードは見た目が普通のカードですが、一部は2つの部分に分かれており、それぞれに名前が付いています。これらの2部構成のカードの各半分は、カード自体として扱われます。そのため、明確にするためにCard、通常のカード、または2部構成のカードの半分(つまり、名前が1つだけのカード)を参照するためにのみ使用します。 したがって、基本タイプのCardがあります。これらのオブジェクトの目的は、実際には単にカードのプロパティを保持することです。彼らは本当に自分で何もしません。 interface Card { String name(); String text(); // etc } には2つのサブクラスがありCard、私はこれを呼び出していますPartialCard(2部構成のカードの半分)とWholeCard(通常のカード)。 PartialCardには2つの追加メソッドがあります:PartialCard otherPart()とboolean isFirstPart()。 代表者 私がデッキを持っている場合、それはWholeCardsではなくCardsで構成されている必要Cardがあり、a はである可能性がありPartialCard、それは意味がありません。そのため、「物理カード」を表すオブジェクト、つまり1つWholeCardまたは2つPartialCardのsを表すことができるオブジェクトが必要です。私は暫定的にこのタイプを呼んでいるRepresentative、とCard方法を持っているでしょうgetRepresentative()。Aは、Representativeカード(複数可)にほとんど直接的な情報を提供するだろう、それはそれ/それらへの唯一のポイントだろう、を表します。今、私の素晴らしい/クレイジー/愚かなアイデア(あなたが決める)は、WholeCardがとの両方 Cardを継承するということですRepresentative。結局のところ、彼らは自分自身を表すカードです!WholeCardsはgetRepresentativeとして実装できますreturn this;。 に関してはPartialCards、それらは自分自身を表しRepresentativeてはいませんが、a Cardではなく、2つPartialCardのにアクセスするためのメソッドを提供する外部を持っています。 このタイプの階層は理にかなっていると思いますが、複雑です。Cardsを「概念的なカード」と考え、Representativesを「物理的なカード」と考えると、ほとんどのカードは両方です。物理的なカードには実際には概念的なカードが含まれており、それらは同じものではないと主張することができると思いますが、私はそれらが同じだと主張します。 型キャストの必要性 のでPartialCard、SとWholeCardsともにCard、S、及びそれらを分離するためには良い理由は、通常はありません、私は通常、ちょうどと仕事ができると思いますCollection<Card>。そのPartialCardため、追加のメソッドにアクセスするためにs をキャストする必要がある場合があります。今は、明示的なキャストが本当に好きではないので、ここで説明するシステムを使用しています。そしてのようにCard、それらが表す実際のにアクセスするにはRepresentative、WholeCardまたはのいずれかにキャストする必要があります。CompositeCard 要約のために: ベースタイプ Representative ベースタイプ Card タイプWholeCard extends Card, Representative(アクセスは不要、それ自体を表す) タイプPartialCard extends Card(他の部分へのアクセスを許可) タイプComposite extends Representative(両方の部分にアクセスできます) これは非常識ですか?実際にはかなり理にかなっていると思うが、正直なところわからない。

4
一定時間と償却一定時間は実質的に同等と見なされますか?
一定時間(O(1))で追加とランダム削除を可能にするRandomQueueを書く必要があります。 私の最初の考えは、ある種の配列(ArrayListを選択しました)でそれをバックアップすることでした。配列はインデックスを介して常にアクセスできるためです。 しかし、ドキュメントを見ると、ArrayListsの追加はAmortized Constant Timeと見なされていることに気付きました。これは、追加には基になる配列(O(n))の再割り当てが必要になる可能性があるためです。 Amortized Constant TimeとConstant Timeは事実上同じですか、または追加ごとに完全な再割り当てを必要としない構造を調べる必要がありますか? 配列ベースの構造は別として(私が知っている限り、常に一定の時間での償却が追加されます)、要件を満たすものは考えられないため、これを求めています: ツリーベースのものはすべて、せいぜいO(log n)アクセスを持ちます。 リンクされたリストには、潜在的にO(1)が追加される可能性があります(テールへの参照が保持される場合)が、ランダムな削除はせいぜいO(n)でなければなりません。 完全な質問は次のとおりです。私がいくつかの重要な詳細にlazした場合に備えて: RandomQueueを設計および実装します。これはQueueインターフェースの実装であり、remove()操作は、現在キューにあるすべての要素の中からランダムに均一に選択された要素を削除します。(RandomQueueは、要素を追加したり、ランダムな要素に到達してやみくもに削除できるバッグと考えてください。)RandomQueueのadd(x)およびremove()操作は、操作ごとに一定の時間で実行する必要があります。

7
速いのは何ですか?REST APIを使用するか、データベースを直接照会しますか?
より速いパフォーマンスとは何ですか?REST APIを作成し、WebアプリでREST APIを使用してデータベースとのすべてのやり取りを行うか、データベースに直接クエリを実行します(つまり、JDBC for Javaなどのデータベースのクエリに使用する一般的なオブジェクトを使用します)? RESTでの見方: コード内にオブジェクトを作成して、RESTメソッドを呼び出します HTTPメソッドを呼び出す REST API内のコードがデータベースを照会します データベースがデータを返します REST APIコードはデータをJsonにまとめてクライアントに送信します クライアントはJson / XML応答を受け取ります コード内のオブジェクトへの応答をマップする 一方、データベースを直接クエリする場合: データベースをクエリするクエリ文字列でオブジェクトを作成します データベースがデータを返します コード内のオブジェクトへの応答をマップする これは、REST APIの使用が遅くなることを意味しないのでしょうか?たぶんそれはデータベースのタイプ(SQL vs NoSQL)に依存しますか?
16 database  rest  sql 

4
生産ブランチを持っているか、マスターを使用していますか?
私は、Railsアプリケーションに関して他のリモート開発者と小さなチームで仕事をしています。gitワークフローの変更を開始しています。以下のような分岐構造について考えました。 (dev) -> (qa) -> (stag) -> (master) しかし、一部の開発者は、masterで自動的に本番環境にプッシュする可能性のある新しい開発者にとって混乱が少ないと考えています。代わりに、全員がマスターで作業し、本番用に別のブランチを作成すると考えました。 (master) -> (qa) -> (stag) -> (prod) マスターを展開可能な状態に保ち、開発として使用したくないことを教えられました。また、私がマスターをしていた以前の場所からは、常に本番環境に展開できるようになっています。 マスターが開発に積極的に使用され、別のprodブランチがデプロイメントに使用されるブランチ構造を使用する場合の欠点は何ですか?
16 git 

5
データベースのコンテンツを制御するバージョン
ユーザーが編集可能なコンテンツを含むWebプロジェクトに取り組んでおり、データベースにある実際のコンテンツのバージョントラッキングを実行できるようにしたいと考えています。基本的に、wikiスタイルの変更履歴を実装したいと思います。 いくつかのバックグラウンド調査を行うと、データベーススキーマをバージョン管理する方法に関するドキュメントがたくさんあります(私のものは実際には既に制御されています)が、データベースコンテンツの変更を追跡する方法に関する既存の戦略は、少なくともスキーマバージョン管理の雪崩では失われます私の検索で。 私は自分の変更追跡を実装するいくつかの方法を考えることができますが、それらはすべてかなり粗雑に見えます: 変更ごとに行全体を保存し、主キーを使用して行をソースIDに関連付けます(現在私が傾倒しているのは、最も単純な方法です)。ただし、多くの小さな変更により、大量のテーブルが膨張する可能性があります。 各変更の前/後/ユーザー/タイムスタンプを保存し、変更を関連する列に関連付ける列名を付けます。 before / after / user / timestampを各列のテーブルに保存します(結果としてテーブルが多すぎます)。 列ごとに変更ごとにdiff / user / timestampを保存します(つまり、特定の日付に戻るには、変更履歴全体をたどる必要があります)。 ここで最善のアプローチは何ですか?自分自身を転がすことは、おそらく他の誰かの(より良い)コードベースを再発明しているように思えます。 PostgreSQLのボーナスポイント。

2
Apache 2.0でライセンスされたライブラリを使用する場合、プロジェクトのソースコードを提供する必要がありますか?
私はプライベート(つまり、ソースを共有する機会はありません)および商用アプリケーションを所有していますが、Apache 2.0ライセンスの下にあるライブラリを使用したいと考えています。 ApacheライセンスとFAQセクションを読みましたが、これについては明確ではありません。 アプリケーションにソースコードの提供を強制するGPL3と同じですか?

2
上位のパラメトリック多型は有用ですか?
私は誰もがフォームの一般的なメソッドに精通していると確信しています: T DoSomething<T>(T item) この関数は、パラメータポリモーフィック(PP)、特にランク1 PP とも呼ばれます。 このメソッドは、次の形式の関数オブジェクトを使用して表現できるとしましょう。 <T> : T -> T つまり、<T>1つの型パラメーターを受け取り、1つの型のパラメーターをT -> T受け取りT、同じ型の値を返すことを意味します。 その場合、次はランク2 PP関数になります。 (<T> : T -> T) -> int この関数は、型パラメーター自体を受け取りませんが、型パラメーターを受け取る関数を受け取ります。これを繰り返し続けて、ネストをより深くし、より高いランクのPPを取得できます。 この機能は、プログラミング言語では非常にまれです。Haskellでさえ、デフォルトでは許可していません。 便利ですか?他の方法では説明が難しい動作を説明できますか? また、何かが命令的であるとはどういう意味ですか?(このコンテキストで)

5
インターフェイス(OOP)のセマンティックコントラクトは、関数シグネチャ(FP)よりも有益ですか?
いくつかのことで言われて、あなたはそれらの極端にSOLID原則を取る場合、あなたは関数型プログラミングで終わります。この記事に同意しますが、インターフェイス/オブジェクトから関数/クロージャへの移行でいくつかのセマンティクスが失われると思うので、関数型プログラミングがどのように損失を軽減できるかを知りたいと思います。 記事から: さらに、インターフェイス分離の原則(ISP)を厳密に適用すると、ヘッダーインターフェイスよりもロールインターフェイスを優先する必要があることを理解できます。 デザインをどんどん小さなインターフェースに向けていくと、最終的には究極のロールインターフェース、つまり単一のメソッドを持つインターフェースに到達します。これは私によく起こります。以下に例を示します。 public interface IMessageQuery { string Read(int id); } に依存する場合IMessageQuery、暗黙の契約の一部は、呼び出しRead(id)が特定のIDのメッセージを検索して返すことです。 これを、同等の機能シグネチャである依存関係と比較してください int -> string。追加の手がかりがなければ、この関数は単純なものになりToString()ます。を実装IMessageQuery.Read(int id)したToString()場合、意図的に破壊されたと非難する可能性があります! それでは、機能的なプログラマは、名前の良いインターフェイスのセマンティクスを保持するために何ができるでしょうか?たとえば、単一のメンバーでレコードタイプを作成することは一般的ですか? type MessageQuery = { Read: int -> string }

4
UTF-8がエンコードでいくつかのビットを浪費する理由
ウィキペディアの記事によると、UTF-8の形式は次のとおりです。 最初のコード最後のコードバイトバイト1バイト2バイト3バイト4 ポイントポイント使用済み U + 0000 U + 007F 1 0xxxxxxx U + 0080 U + 07FF 2 110xxxxx 10xxxxxx U + 0800 U + FFFF 3 1110xxxx 10xxxxxx 10xxxxxx U + 10000 U + 1FFFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx xは、このビットを使用してコードポイントを選択することを意味します。 これにより、各継続バイトで2ビット、最初のバイトで1ビットが無駄になります。UTF-8が次のようにエンコードされないのはなぜですか? 最初のコード最後のコードバイトバイト1バイト2バイト3 ポイントポイント使用済み U + 0000 U + …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.