ソフトウェア工学

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

1
ClojureとScalaのパターンマッチング
これら2つの言語のパターンマッチングの主な違いは何ですか?構文ではなく、機能、実装の詳細、ユースケースの範囲、必要性について言及しています。 Scalaアプリケーション(Lift and Playなど)は、言語のパターンマッチングの能力について誇らしげに語っています。一方、Clojureにはライブラリcore.matchがあり、破壊機能が組み込まれていますが、これも強力なようです。 *注:私がこの質問をすることに触発された理由は、実験としてプログラマがScalaとClojureの両方を使用してlispインタープリターを作成したブログ投稿でした。彼は、Clojureの試合が一定の長さの後に壊れたと言ったが、その理由を説明できなかったが、私は本当に知りたいと思っている。この投稿はここで見つけることができます:http : //www.janvsmachine.net/2013/09/writing-simple-lisp-interpreter-in-clojure.html

3
負の符号付き値はどのように保存されますか?
符号付き整数の最大値と最小値についてこのビデオを見ていました。 正の符号付きの値の例を挙げます-0000 0001最初のビットは数値が正であることを示し、最後の7ビットは数値そのものです。したがって、+ 1と簡単に解釈されます。 次に、負の符号付き値の例を取り上げます。10000000は-8になります。さて、コンピューターは最初のビットのために負の値であることを理解できますが、000 0000が-8を意味することを地獄はどのように理解していますか? 一般的に、負の符号付きの値はコンピューターでどのように保存/解釈されますか

9
理論的にバグのないプログラム
私は、コードにバグがないことはできないと述べている多くの記事を読んでおり、彼らはこれらの定理について話している: 停止問題 ゲーデルの不完全性定理 ライスの定理 実際、ライスの定理は停止問題の含意のように見え、停止問題はゲーデルの不完全性定理と密接な関係にあります。 これは、すべてのプログラムが少なくとも1つの意図しない動作をすることを意味しますか?それとも、それを検証するコードを書くことができないということですか?再帰チェックはどうですか?2つのプログラムがあると仮定しましょう。どちらにもバグがありますが、同じバグを共有していません。それらを同時に実行するとどうなりますか? そしてもちろん、ほとんどの議論はチューリング機械について話しました。線形境界の自動化(実際のコンピューター)はどうですか?
12 bug  theory 

2
特定のデバイスでのみ発生するエラーをトラブルシューティングする戦略
Android開発者として、私がアプリを作成する対象市場は非常に細分化されています。特定の要件を指定できます。たとえば、アプリはAndroidバージョンxx以降のみをサポートしますが、特定の1つの電話モデルでのみ明らかなエラーが発生する場合があります。 問題の電話を購入せずに、デバイス固有のエラーを処理する戦略はありますか?テスト用に一連の電話を維持していますが、2〜3人のユーザーが電話のモデルでのみ発生するバグがあると報告した場合、外出して新しい電話を購入する余裕はありません。 他のAndroid開発者が過去に同様の問題に遭遇したことは間違いないと思います。また、デバイス固有のバグを解消するのに役立つ費用対効果の高い戦略を知りたいと思います。 更新して、いくつかの詳細を追加します。 Bugsenseを使用してバグレポートをキャプチャするため、例外がスローされるたびに、電話機のモデル、スタックトレース、ユーザーに発生した回数、およびその他の詳細を知ることができます。 ユーザーは異なる国にいる可能性があるため、携帯電話を借りることができるとは思いません。 このようなシナリオを想像してください。100人のユーザーがアプリをインストールしましたが、ボタンを押すとボタンが適切に機能しないと3人が不満を言いました。私がテスト用に持っている電話のモデルはどれも問題を経験していません。問題のある携帯電話モデル用のエミュレーターはないようです。

1
柔軟なDIFF実装のための発見的アプローチ
作業中のドキュメントリビジョンを比較するために、DIFF実装を作成しました。O(ND)差分アルゴリズムとそのバリエーションに基づいています。 重要になった1つのことは、変更のリストを取得し、それらを人間が読めるテキストに変換することです。現在のアルゴリズムは非常に効率的ですが、拡張するのが難しいほど非常に効率的です。 短い質問 私はA *と「ターン」にペナルティを追加するヒューリスティックを使用しようと考えていました。アイデアはしている滑らか人間が読むことができる何かに解析することが容易であるように「削除、追加、追加、削除、追加、削除」不要に。基本的に、私の最短経路問題を最も単純な経路問題に変えてください。 そしてもちろん、常に出力作成「削除しないすべてのものを、追加のすべてを」 これは理にかなっていますか? DIFF実装でヒューリスティックを使用するための優先順位はありますか?ヒューリスティックとは何ですか? 問題: 長い文が削除され、別の長い文が削除されたが、少なくとも1つの単語を共有している場合、「with」と言います。一般的な単語を単独で(追加と削除の両方ではなく)残すと、最短パスが作成されます。ただし、これは実際に、変更から印刷物を読み取ろうとする人間に対する変更のコンテキストを難読化するだけです。 現在のDIFFの例: 古いテキスト: クリーン:ショップエアでパワーウォッシュとブロードライ。 新しいテキスト: クリーニング:アセトンと糸くずの出ない布で拭きます。 メモリストの変更: 「Powerwash and blow dry」を「アセトンで拭く」に変更します 「ショップエア」を「アセトンと糸くずの出ない布」に変更します 注:「「ショップエア」の削除、「アセトン」の追加」の代わりに「変更」が使用されます。 ご覧のとおり、2番目のノートはすべてのコンテキストを失い、テキストの完全な古いテキストセットと新しいテキストセットを見ることなく、その意味を理解できません。 句読点に関する注意: 句読点を別の「単語」として区切り、次のようにします 追加 "(" の代わりに 「修復」を「(修復)」に変更します これは不快だったからです。ただし、これは、両方のテキストにコンマさえある場合(前の例の "with"という単語とは対照的に)、同じことが起こることを意味します。 可能な解決策: 代わりに、異なるパス検索アルゴリズムを使用して、人にとってより意味のある異なる変更「パス」に重みを追加する柔軟性を与えることができると思います。たぶん、句読点を含むノードへの移動にほとんど重みを付けないようにすることもできます(これが他のものにどのように影響するかはわかりません)。 次に、前の例を取得して以下をリストできます。 メモリストの変更: 「パワーウォッシュとショップエアでブロードライ」を「アセトンと糸くずの出ない布で拭いてください」に変更します。 見る!より明確に! パフォーマンスに打撃を与えることはわかっているので、プログラムの大幅なオーバーホールを行う必要があるかもしれませんが、最終結果を得ることがより重要です。 ボトムライン: 繰り返しますが、DIFF実装でヒューリスティックを使用するための優先順位はありますか? 他の考え?合理的な時間投資ですか?他のアイデア?他のアルゴリズム? 前もって感謝します! 編集: A *を使用するのではなく、質問を明確化/固化し、質問をアルゴリズムにヒューリスティックを追加するように一般化しようとしました。この例では基本的に同じことですが、今でもより正確だと思います。 この投稿は洞察に富んでいました。

1
レッドゾーンの目的は何ですか?
レッドゾーンは、「割り当てられていない」スタックポインターを超えるメモリ内の固定サイズの領域です。コンパイラは、単純なリーフ関数でその領域にアクセスするためのアセンブリを生成します。 しかし、私はレッドゾーンの本当の利点を見ることはできません。スタックポインタを超えてメモリにアクセスするのは非常に危険であり、データの破損を簡単に引き起こす可能性があります。なぜこれを行うのですか?2つのプロセッサ命令(push ebp、mov ebp esp)を保存しても、実際の速度は上がりません。
12 assembly  stack 

4
数学演算子のメンバー関数と非メンバー関数
私は、行列、ベクトルなどを含む線形代数ライブラリ(長い話、学校の課題です)を書いています。このライブラリを作成する過程で、オブジェクトに対して数学演算を実行する関数を作成します。たとえば、行列の転置、行列の反転、ベクトルの正規化など。 この種の関数の「ベストプラクティス」とは何かに興味がありました。つまり、関数をメンバー関数にするか、非メンバーにするべきでしょうか。(わかりやすくするため/ライブラリの使用目的) 例: //Member function way: B = A.transpose(); C = A.inverse(); //Non-member function way: B = linalg::transpose(A); //Non-member transpose function in linear algebra namespace C = linalg::inverse(A); この種の操作に関する標準はありますか?または、少なくとも、これを行う一般的な方法はありますか?私は最初の選択肢に傾いていますが、これが推奨されるかどうか知りたいです。
12 c++  libraries  methods 

5
コードレビューは誰が行うべきですか?
私の会社では、主にアーキテクトがコードレビューを行っています。彼は非常に経験豊富で賢いソフトウェアの男なので、非常に得意です。開発者がコードレビューを行うとき、彼らは半分も行いません。開発者にさらにコードレビューを行わせるようにしましたが、コードレビューの品質は良くありませんでした。開発方法としてScrumを使用します。 ただし、現在のシステムには2つの問題があります。 建築家がボトルネックになる 開発者は、コードの品質とアーキテクチャ(すべての種類の問題につながる)に対して責任を負いません。 これらの問題にどのように対処できますか?コードレビューの担当者を変更する必要がありますか?

3
Python-assert vs if&return
テキストファイルに対して何かを行うスクリプトを書いています(ただし、それは私の質問とは無関係です)。そのため、ファイルに何かを行う前に、ファイルが存在するかどうかを確認します。私はこれを行うことができますが、問題はありませんが、問題は美学の問題です。 これは、同じことを2つの異なる方法で実装する私のコードです。 def modify_file(filename): assert os.path.isfile(filename), 'file does NOT exist.' Traceback (most recent call last): File "clean_files.py", line 15, in <module> print(clean_file('tes3t.txt')) File "clean_files.py", line 8, in clean_file assert os.path.isfile(filename), 'file does NOT exist.' AssertionError: file does NOT exist. または: def modify_file(filename): if not os.path.isfile(filename): return 'file does NOT exist.' …

2
ソースコードでAPIキーを非表示にする最良の方法
アプリケーション、特にac#.NETアプリケーションでプライベートAPIキーを保護する方法についてのアイデアが必要です。 まず、ソースコードに何かを隠すことは理論的に不可能であることを理解しているので、別のアイデアを思いつきましたが、それがどれほど妥当かはわかりません。とにかく、なんらかの方法でWebサーバーと通信して秘密鍵を検証し、アプリケーションに戻って正当なハンドシェイクであることを確認することは可能でしょうか? 作業する2つのキーがあります。公開キー(名前が示すように、プライベートと同じように扱う必要はありません)と、他から保護されている必要があるプライベートキーです。 私がこれをどのように行うことができるかについてのアイデアは大歓迎です。
12 c#  api  authentication 

1
並行性について推論するためにどの中間表現を使用できますか?
私は、コンパイラーがプログラマーに代わって並行性に関してインテリジェントな選択を行えるようにするために必要なものをよりよく理解しようとしています。たとえば、この問題には多くの困難な側面があることを理解しています。 競合状態がないことを確認する 同時に実行されるコードに、コードのセマンティックな意味に影響を与える副作用がないことを保証する コードで利用可能な並列度を考慮して、スレッドのスピンアップによるオーバーヘッドが価値があるかどうかを判断する 私の理解では、最新のコンパイラで使用される2つの主要な中間表現は、手続き型言語とオブジェクト指向言語の静的な単一割り当てと、関数型言語のスタイルを渡す継続です。これらの中間形式を使用して、上記の問題のいずれかを推論することは難しいようです。理論的には自動並列化の可能性が最も高い言語(副作用のない保証付きのHaskellのような純粋な関数型言語)でさえ、この分野での進歩は限られています。 私の質問は、この問題に取り組むためにどのような中間表現が実際に使用されているのかということです。学術研究で使用されているが、このタスクに適しているとは知らない他の表現はありますか?この問題は、コンパイルが中間表現に到達する前に抽象構文ツリーを操作することにより、コンパイラーのフロントエンドで根本的に解決する必要があるものですか?

4
一連の「AssertEquals」よりも優れた単体テストの作成方法はありますか?
qunitを使用して、ユニットテストに必要な基本的な例を次に示します。 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> <link rel="stylesheet" href="qunit/qunit-1.13.0.css"> <script src = "qunit/qunit-1.13.0.js"></script> <script src = "../js/fuzzQuery.js"></script> <script> test("Fuzz Query Basics", function() { equal(fuzzQuery("name:(John Smith)"), "name:(John~ Smith~)"); equal(fuzzQuery("name:Jon~0.1"), "name:Jon~0.1"); equal(fuzzQuery("Jon"), "Jon~"); //etc } ); </script> </head> <body> <div …

3
CおよびC ++プログラムで型をマークするにはどうすればよいですか?
では私のこの答え、私が使用し_t最高の状態で、物議を終了タイプ、の終わりに。これが現在のプロジェクトで使用しているプラ​​クティスです。 typedef struct { int x; int y; } point_t; これはstddef.h、size_tまたはのようなCタイプと一致するように意図されていましたptrdiff_t。しかし、私の質問の特定のコメントによると、_tpostfixはPOSIXのために予約されているようです。代わりに何を使うべき_tですか?または、_tとにかく使用し続ける必要がありますか? この質問は、CとC ++の両方を対象としています。これらの言語の表記規則が異なる場合は、お気軽にお答えください。
12 c++  c  naming 

1
RESTful APIはどの程度分離すべきですか?
以前にRESTful APIを作成したことはありませんが、RESTful APIをどの程度分離すべきか疑問に思っていますか? たとえば、名前、住所、電話番号、メールアドレス、言語などを持っている顧客がいるとしましょう。 個々のフィールドを更新する方法(アドレスの更新、電子メールアドレスの更新など)があるのは理にかなっていますか、それとも顧客全体に対して単一の更新があり、各フィールドはオプションですか?
12 api  rest 

1
Open Close Principle(OCP)vs依存関係反転原理(DIP)
Open Closed Principle(OCP)とDependency Inversion Princible(DIP)の違いを理解しようとしていました。 これまでにインターネットで行った調査に基づいて、「DIPはOCPを達成するための1つのオプション」という結論に達しました。 これでいいの? DIPではなくOCPに従っている例を教えてください。

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