ソフトウェア工学

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

1
「スキップデルタ」はSVNに固有ですか?
SVNバージョン管理システムを作成した善良な人々は、「スキップデルタ」と呼ばれる構造を使用して、ファイルの変更履歴を内部に保存します。リビジョンは、以前のリビジョンに対するデルタとして保存されます。ただし、次のように、リビジョンNは必ずしもリビジョンN-1に対するデルタとして格納されるわけではありません。 0 <- 1 <- 2 <- 3 <- 4 <- 5 <- 6 <- 7 <- 8 <- 9 代わりに、リビジョンNはNf(N)に対するデルタとして格納されます。ここで、f(N)はNを分割する2の最大の累乗です。 0 <- 1 2 <- 3 4 <- 5 6 <- 7 0 <------ 2 4 <------ 6 0 <---------------- 4 0 <------------------------------------ 8 <- 9 (表面的にはスキップリストのように見えますが、実際にはそれほど似ていません。たとえば、スキップデルタはリストの真ん中に挿入をサポートすることに関心がありません。)詳細については、こちらを参照してください。 私の質問は次のとおりです。他のシステムはスキップデルタを使用しますか?SVNの前に既知/使用/公開されたデルタをスキップしましたか、それともSVNの作成者がそれを自分で作成しましたか?

4
ネストされたマップと結合キー
私が現在取り組んでいるプロジェクトでは、ユーザーの年齢(大人、子供など)に応じて3つの異なるタイプの価格がありました。したがって、DBには次のようなテーブルがありました。 PRICES type Amount A 20 B 15 C .. D .. 最初は4種類の価格しかなかったので、コードには次のようなものがありました。 Map<String, BigDecimal> prices = new HashMap<String, BigDecimal>(); キーは価格タイプでした。 最近、彼らはすべての価格タイプに3つのサブタイプを追加する新しいビジネスルールを追加したので、次のようになります。 PRICES type subtype Amount A 1 20 A 2 15 A 3 .. B 1 .. B 2 .. ... .. .. 次の2つのオプションのどちらが良いと思いますか、そしてその理由は? ネストされたマップ Map<String, Map<String, BigDecimal>> prices; …

1
最短経路情報からグラフを再構築するためのアルゴリズム?
グラフの最短経路データがあります。このデータからグラフ自体を再構築できますか? より正確には、グラフ(V、E)の各頂点vに対してブール(0/1)行列があります。行列要素[s、d]は1に等しい。ただし、vがソース頂点sから宛先頂点dへの最短経路にある場合。グラフのすべてのエッジは同じ長さです。 たとえば、グラフの場合 (V1) -- (V2) -- (V3) 3つの行列は次のようになります。 V1: 1 1 1 1 0 0 1 0 0 V2: 0 1 1 1 1 1 1 1 0 V3: 0 0 1 0 0 1 1 1 1 私の質問: 1)これらの行列からエッジのセットEを再構築するアルゴリズムはありますか? 2)ソリューションは常に一意ですか?(これは実際の要件よりも個人的な好奇心です) 3)アルゴリズムを不均一なエッジ長に一般化できますか?

3
Javaでは、*プロジェクト全体*の実装からAPIを分離するいくつかの良い方法は何ですか?
あるプログラムへのプラグイン(Eclipseに類似)であるソフトウェアモジュールがあり、他のプラグインが呼び出すことができるAPIが欲しいと想像してください。あなたが別のAPIモジュール、持っていると思いますので、あなたのプラグインは、自由に利用できないではなく、実装モジュールAPIクライアントのみAPIモジュールをコンパイルすることができ、 -自由に利用でき、他のプラグインが直接へのリンクはする必要が唯一のものですがビルドパス上。APIが互換性のある方法で進化するように制限されている場合、クライアントプラグインはAPIモジュールを独自のjarに含めることもできます(Error存在しないクラスがアクセスされることによるsの可能性を防ぐため)。 ライセンスは、APIと実装を別々のモジュールに配置する唯一の理由ではありません。実装モジュールが複雑で、独自の無数の依存関係がある可能性があります。Eclipseプラグインには通常、内部パッケージと非内部パッケージがあり、非内部パッケージはAPIモジュールに似ています(どちらも同じモジュールに含まれていますが、分離することができます)。 私はこれのいくつかの異なる選択肢を見てきました: APIは、実装とは別のパッケージ(またはパッケージのグループ)にあります。APIクラスは、実装クラスを直接呼び出します。API は、実装なしでソースからコンパイルすることはできません(まれなケースでは望ましいことです)。実装がインストールされていない場合、APIメソッドの呼び出しの正確な影響を予測することは簡単ではありません。そのため、クライアントは通常、これを回避します。 package com.pluginx.api; import com.pluginx.internal.FooFactory; public class PluginXAPI { public static Foo getFoo() { return FooFactory.getFoo(); } } APIは別のパッケージにあり、リフレクションを使用して実装クラスにアクセスします。APIは実装なしでコンパイルできます。リフレクションを使用すると、パフォーマンスが低下する可能性があります(ただし、問題がある場合はリフレクションオブジェクトをキャッシュできます。実装が利用できない場合の動作を簡単に制御できます。 package com.pluginx.api; public class PluginXAPI { public static Foo getFoo() { try { return (Foo)Class.forName("com.pluginx.internal.FooFactory").getMethod("getFoo").invoke(null); } catch(ReflectiveOperationException e) { return null; // or throw a RuntimeException, …
8 java  api 

3
静的分析に依存して並行性バグを確実に「再現」することは安全ですか?
データをクエリするスレッドと同じデータを更新するIOイベントを同期するときに、いくつかの同時実行バグが潜んでいると思われるJavaコードを継承しました。ThreadSafeと呼ばれる静的分析ツールを試しています。これは、さまざまな同時実行性の問題(つまり、非同期に呼び出されたメソッドから同期されていないフィールドにアクセスしたフィールドと、コレクションへのアクセスの一貫性のない同期)を実際に検出します。 単体テストを作成してデータの競合を確実に再現することがどれほど難しいかを発見した後、バグを確実に「再現」するためにThreadSafeに依存することが賢明かどうか疑問に思いましたか?私が求めているのは、バグをいつ修正したかを静的分析ツールに頼って教えても安全ですか?(もちろん、バグを修正するには、状況に応じてそれぞれを理解する必要があります)。

1
既存のRパッケージからスタンドアロンCライブラリを抽出するための推奨される方法?
私のグループは、植物の成長をシミュレートするためのRパッケージを開発しています(GitHubレポジトリを参照)。Rパッケージは.CallCとのインターフェースに使用します。 スタンドアロンCライブラリを作成する価値があると判断しました。2つの主な理由は、1)使い慣れたCデバッグツールを使用すること、および2)開発者/ユーザーコミュニティの大部分がコンパイル済み言語に精通していることです(ほとんどのクラスのモデルはCまたはFortranで書かれています)。ただし、Rパッケージはこのコミュニティの外部の多くの人がアクセスできるため、その機能を維持したいと考えています。 Cライブラリの依存関係を持つRパッケージについて説明しているいくつかの関連する質問(https://stackoverflow.com/q/12328156/199217など)を確認しましたが、既存のRパッケージのデカップリングを特に扱う質問は見つかりませんでした。 提案されたアプローチ (私たちがこれまでに思いついたこと...ストローマン) 既存の機能のテストを作成する Cライブラリをsrc/フォルダー内に保持する R固有のCコード(SEXPRライブラリの読み込みなど)を、先頭に「Rラッパー」ファイルを配置して配置します。R_* Cで構成ファイルを読み取るための個別の関数を作成する Rの機能を置き換える「メイン」のC関数を作成する Rラッパーファイルを無視するCライブラリのmakefileを書き込む Cライブラリが独立してRパッケージと同等に機能したら、C関数を別のリポジトリに移動することを検討できます。これはRパッケージの依存関係になります。 質問: この取り組みは見当違いですか? 潜在的な落とし穴を見落としていますか? RライブラリとCライブラリの両方を並行して開発するより良い方法はありますか? Rパッケージから分離されたCライブラリの例はありますか? RとCで同等の関数を比較するためのテストをどのように書けばよいでしょうか?
8 design  testing  c  refactoring  r 

1
ホストされた共有PHPスクリプトからローカルMSSQLにデータを安全に送信する
Webhook(Webカートから)からローカルのMicrosoft SQL Serverにデータを追加しようとしています。私にとって最良のルートは、PHPスクリプトを使用して新しいデータ(jsonとしてのPOST)をリッスンし、それを解析してから、クエリを実行してMSSQLに追加することです。 PHPスクリプト(共有ホストのWebサイトにあります)とローカルMSSQLデータベースの間の接続に関するセキュリティについてはよく知りません。PHPスクリプトを同じローカルホストで実行したままにします(ApacheをWindowsで実行します)が、WebhookのURIはパブリックにアクセスできる必要があります。 または、ローカルホストからスクリプトをスケジュールして、WebカートAPIを介して定期的に更新を確認することもできますが、私のようなアマチュアプログラマーにとってはWebhookの方が簡単です。 リモートの共有ホストでPHPを使用してローカルマシンのMSSQLに接続する場合、セキュリティを確保するためにどのような手順を実行できますか?

4
DIフレームワークはどのような複雑さを追加しますか?
非常に最近の質問に対する現在最も支持されている回答は、 DIコンテナーは「エンタープライズソフトウェア」パターンであり、オブジェクトグラフが非常に大きく複雑な場合に使用されます。アプリケーションの95%はそれを必要としないと思います。 これは私が強く反対することです。多分私は間違った用語を持っているかもしれませんが、私にとってDIフレームワークは単に「オブジェクトを一緒に配線する何か」を意味します。何か不足していますか? 非常に小さなプロジェクト(10クラスなど)でも、それらを簡略化するためにGuiceを使用しています。確かに、400 kBのJARファイルですが、これは私が気にすることではありません。小規模なプロジェクトの場合、設定はほとんど必要なく、唯一の「オーバーヘッド」は注釈の追加です。@Inject それで、私は本当に不思議に思います、DIフレームワークはどんな追加された複雑さを引き起こしますか? 回答への対応を更新 82クラスのプロジェクトでは、 32 @Inject注釈 15 @Singletonと1の@ProvidedBy注釈 4プロバイダー(これらはすべて私の工場であるため、DIなしでも必要です) 1つの行を含むモジュール 0行XML !!! それで全部です。確かに、それは小さなプロジェクトですが、まさにこれが私のポイントでした。追加の作業は、行ではなく数語でした。 不変の「使いやすい」オブジェクトを取得するために、コンストラクター注入のみを使用しています。新しい依存関係が出現するたびに、最終フィールドを追加し、LombokのRequiredArgsConstructorが宣言を処理するようにし、Guiceがそれを適切に呼び出すようにします。

1
ソース管理ソフトウェアで2つのプロジェクトをマージする適切な方法は何ですか
私は自分のプロジェクトを維持するためにFossil-SCMを使用しています。私はチームで働いていないので、通常は非常に直線的な開発ブランチを持っています:1.0-> 1.1-> 1.2 関連するプロジェクトにタスクが与えられるプロジェクトが1つある場合、その手順はどうなるのだろうと思います。そして、それによって最初のプロジェクトを時代遅れにレンダリングします。ほとんどのコードを書き直しがちですが、既にコードを書いたことを覚えていない場合でも、コードをアーカイブしたままにしておきたいと思います。そして、私は死んでいるだけの化石レポを持っていません。マージできますか?これはこれを処理する適切な方法ですか? たとえば、コードはHTMLページをフォーマットするためにExcelファイルからデータを抽出していました。今、私は私の雇用者が彼らのExcelスプレッドシートをデータベースに移動して、冗長性を減らし、効率を上げ、やる気を増すことを確信しました。これで、データベースを使用してプリフォームするためにフープをジャンプする必要がない論理クエリを実行できるようになったので、元々Excelファイルを操作していた余分なVBSファイルは必要ありません。技術的には、既存のコードの一部を現在の新しいプロジェクトに移植します。 すでに独自のトランクを持っているので、別のプロジェクトのトランクをこれに結合することをお勧めします。どうすれば正確にそれを行うことができますか? 私のツリーは次のようになると思います。この逆ツリーに似たソフトウェア分岐の例を見たことがないので、このような状況の標準はどうなっているのでしょうか。
8 fossil 

2
Modern.IE VMライセンス
Microsoftはテスト目的でいくつかのVMを提供しており(Stack Overflowで宣伝されています)、ライセンス条項を理解しようとしています。よくわからないのは 1.b. ソフトウェアはテスト目的でのみ使用できます。ソフトウェアを商用目的で使用することはできません。 私の考え: いくつかの異なる仮想マシン上のいくつかのブラウザーでWebサイトをテストすることは、かなり専門的なアプローチのようです。多くの民間の開発者がそれをするだろうとは私はほとんど信じていない。もちろんそうすべきですが、そうする時間のあるプライベート開発者は誰ですか? それが本当にプライベート開発者だけが利用できる場合、同じことをしている企業へのオファーは何ですか?有料サービスの広告がありません。 企業によるテストは商業目的と見なされていますか?会社内のVMをテストに使用できますか?

1
ボイラープレートコードの著作権ステータスは何ですか?
商用コードのオープンソースコンプライアンスを確認します。 最近、商用ソースがかなりの数のOSSプロジェクトと照合される例をいくつか見つけました。一致は非常によく似ていますが、正確ではありません。たとえば、約30行のコードに約4つのメソッドがあり、いくつかの変数名が異なり、商用コードにいくつかの余分な行がありますが、実質的に同じです。これは自動生成コードでもコピーパスタでもないと思います。コメントなどが異なるためです。 むしろそれは定型のように見えます-開発者は、Grails(およびこれらの例は常にGrailsで登場するように見えますが、フレームワークである可能性があります)はCRUD操作に特定のスクリプト形式を必要とすると言います(これらの例も主にCRUD操作です)。標準のソースコードスタイルを追加すると、定型文に相当します。たとえそれがオリジナルであったとしても、多くのコードベースで非常によく似たものになってしまいます。 それは私に2つの質問を残します: これは著作権侵害の告発に対する合理的な防御ですか? codeXが定型文であるが、codeYは定型文ではない(言語+フレームワークの専門家ではない)とどのように判断しますか?

1
グラフィカルUIのみを構築する1500 LOCメソッドのリファクタリング[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 5年前休業。 現在、基本的にUIのみを構築するメソッドをリファクタリングする方法について頭を悩ませています。 この方法は、1500行を超えるコード(LOC)であり、カウントされます。それは成長しました、これにどのように取り組むかという計画はありませんでした。あなたは可能性がある、このおなじみのを見つけます。 とにかく、これは基本的に、次のような少し大きな1つの大きなメソッドです。 . . . # null checks null_checks_bx = Box(True) null_checks_ck = CheckBox() null_checks_ck.set_text('Null checks throwing exceptions of type:') if 'doNullChecks' in options: null_checks_ck.set_active(options['doNullChecks']) else: null_checks_ck.set_active(True) # dict to sorted list: extract values from dict by list comprehension exceptions = sorted([exception.get_full_name() for exception in JavaTypes.exception_types]) …

1
オブジェクト間の関係
数週間、オブジェクト間の関係について考えてきました。特にOOPのオブジェクトについては考えていません。たとえばC ++では、他のオブジェクトへのアクセスを必要とする構造内でポインターまたはポインターのコンテナーを階層化することでそれを表現することに慣れています。オブジェクトAがにアクセスする必要がある場合、in Bを見つけることは珍しいことではありません。B *pBA しかし、私はもはやC ++プログラマーではありません。関数型言語を使用してプログラムを作成します。特に、純粋な関数型言語であるHaskellを使用します。ポインター、参照、またはそのようなものを使用することは可能ですが、「Haskell以外の方法で行う」など、私はそれに不思議に思います。 それから私はそれらすべての関係のことについてもう少し深く考え、要点に達しました: 「なぜこのような関係をレイヤー化して表現するのですか? 私はすでにそれについて考えている人々を読んだ(ここ)。私の見解では、明示的なグラフを介して関係を表現する方が、タイプのコアに焦点を合わせ、後でコンビネータを介して関係を表現できるため、はるかに優れています(SQLと少し似ています)。 コア私たちは定義するときにことを意味しA、我々は何を定義するために期待Aされるで作られたそれはない、何に依存します。たとえば、ビデオゲームでは、タイプがある場合Character、それについて話すことTraitは合法です、Skillまたはそのようなことですが、私たちが話すWeaponかItemsどうかはそうですか?もうよくわかりません。次に: data Character = { chSkills :: [Skill] , chTraits :: [Traits] , chName :: String , chWeapon :: IORef Weapon -- or STRef, or whatever , chItems :: IORef [Item] -- ditto } 私にとってデザインの点で本当に間違っているように思えます。私はむしろ次のようなものを好みます: data Character = { chSkills :: …

6
再帰は並行して実行できますか?それは理にかなっていますか?
たとえば、次のように実行されるfibonacciの単純な再帰的アルゴリズムを使用しているとします。 fib(5) -> fib(4)+fib(3) | | fib(3)+fib(2)| fib(2)+fib(1) 等々 これで、実行は引き続きシーケンシャルになります。その代わりに、どのように私がいることを、このように、コードだろうfib(4)とはfib(3)、2つの別々のスレッドを生成することによって計算されるが、その後にfib(4)、2つのスレッドがために生み出されているfib(3)とfib(2)。がいつfib(3)に分割されるのかfib(2)と同じfib(1)ですか? (動的プログラミングはフィボナッチにとってはるかに優れたアプローチであることを知っています。ここで簡単な例として使用しただけです) (誰かがC \ C ++ \ C#でもコードサンプルを共有できる場合、それは理想的です)

4
ASP.NETの展開/保守のベストプラクティス
私はWeb開発業界に5年ほどいますが、常にオープンソース環境で働いています。バージョン管理にgitを使用して、ほとんどの場合、apache、mysql、およびphpに少しルビーを追加します。しかし最近、開発が完全にC#ASP.NET MVCである仕事を始めました。 言語などはかなり簡単に習得できましたが、私のチームの他のメンバー(MS開発の経験が私よりもはるかに多い)は、最終的なサイトの公開と展開に関して異なる考え方を持っています。特に将来の変化。 他の開発者の考え方は、サイトが公開されるとそれが最終的なものになるということです。このサイトにこれ以上変更を加えることはできません。私がこれの背後にある理由を尋ねたところ、その答えは危険すぎる、時間がかかる、または難しいというものでした。 私の過去の経験から、サイトの更新は、変更されたファイルをアップロードする場合にすぎません。通常、それが少しの変更である場合、または更新が行われている間、サイトをメンテナンスモードにする場合は非常に迅速です。 最近MVCサイトを公開しましたが、企業から連絡があり、テキストの一部を更新して新しいPDFドキュメントへのリンクを追加しました。私のチームの他のメンバーは、サイトは現在稼働中であり、変更してはならないため、これを行うべきではないとすぐに言った。マイクロソフトの開発者に「育てられない」ことで見逃したことはありますか? 本番環境のライブWebアプリケーションに変更を加えることに対する反対の主張は何ですか?この考え方は.NET開発者に固有のものですか? 私はこの考え方を理解し、それがマイクロソフトの開発環境で正当化されるのか、それとも古い考え方なのかを理解したいと思います。 注:バージョン管理にはTFSを使用し、発行プロファイルを使用して、サイトが展開される場所(UATまたは本番)を決定します

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