ソフトウェア工学

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

5
ローカライズ文字列リソースを整理する方法は?
多くの小さなパッケージで構成される大規模なアプリケーションを開発しています。各パッケージには、ローカライズ用の独自のリソースファイルセットがあります。 ローカライズ文字列を整理して命名するための最良のアプローチは何ですか? これまでの私の考えは次のとおりです。 重複の処理 同じテキスト(たとえば、「Zip code」)が特定のパッケージ内で複数回出現する場合があります。プログラミング本能(DRY)は、すべてのオカレンスで共有される単一の文字列リソースを作成するように指示します。 繰り返しになりますが、翻訳者は場所によっては長い翻訳( "Postleitzahl")を選択し、スペースの少ない場所では短い翻訳( "PLZ")を選択することもできます。または、一部のオカレンス(「Zip code:」)にコロンを追加し、他のオカレンスには追加しないこともできます。または、場所によっては異なる大文字(「郵便番号」)が必要になる場合があります。これらの引数はすべて、内容が同一であっても、使用ごとに1つのリソースを作成することを指します。 ネーミング 重複を排除することを目的とする場合、contentでリソースに名前を付けることは理にかなっています。おそらくプレフィックスを介した使用の種類を示唆しています。我々が持っているかもしれだからlabelOK= 「OK」を、messageFileTooLarge= 「ファイルは、最大ファイルサイズを超えています。」、およびlabelZipCode= "Zip code"。 コンテンツによる命名には、フォーマット引数を自然に処理できるという利点があります。リソースはmessageFileHas_0_MBWhileMaximumIs_1_MB明らかに、実際のファイルサイズと最大ファイルサイズの2つのフォーマット引数を取ります。 ただし、重複を許可する場合、コンテンツだけで名前を付けることは意味がありません。一意のリソース名を取得するには、リソース名に使用場所を何らかの形で含める必要があります。識別子は少し長くなる傾向がありますが、グラフィカルコントロールでは機能します:fileSelectionConfirmationButtonText= "OK"、customerDetailsTableColumnZipCode= "Zip Code"。ただし、非ビジュアルコードファイルの場合は難しくなります。最終的に表示される場所がわからない場合、文字列の特定の使用法にどのように名前を付けますか?コードファイルと関数名で?私にはかなり不器用で脆いようです。 全体として、重複を許可しようとしていますが、これをサポートする一貫した命名スキームを見つけるのに苦労しています。 編集:この質問には2つの側面があります。リソースを整理する方法(DRYと複製)、および名前の付け方です。これまでのところ、答えは最初の側面に集中しています。命名規則に関するフィードバックをお願いします!

2
ビデオストリームの高速でロスレスな圧縮
静止カメラからのビデオがあります。解像度とFPSはどちらも非常に高いです。私が取得するデータはバイエル形式で、ピクセルあたり10ビットを使用します。プラットフォームには10ビットデータ型がないため、元のデータは16ビットワードを使用してメモリに保存されます。ネットワークを介してデータを送信する前に、何らかの種類のデータのロスレス圧縮を実装したいと思います。 カメラは動かないので、連続するフレームの大部分はほぼ同一ですが、避けられないノイズのために完全ではありません(ノイズがなくてもノイズを「失う」べきではないため、ノイズ除去はオプションではありません)。 FPSが高いため、変化する部分でさえ、2つの連続するフレーム間であまり変化しません。 ただし、カメラも少し揺れているようです。非常にわずかですが、それでも、静止したオブジェクトでさえ、画像空間では完全にはそうではありません。 圧縮はオンザフライで実行する必要があるため、多くのフレームを収集してそれらをまとめて圧縮することはできませんが、1フレーム後ろを見て参照として使用できます。 上記に基づいて、私が最初に考えたのは、データをビットパックすることで、これらの6つの冗長ビットがすべての単語で無駄にならないようにしました。ただし、エントロピーコーディング(ハフマンなど)を使用すると、その冗長性が自動的に考慮されるため、追加のパッキングは必要ないと考えました。だから私は次のことをしました: 2つの連続するフレーム間でバイナリの差分を取りました。元のデータ範囲は0〜1023(たとえば、符号なし10ビット)でした。差分データは符号付きになり、範囲は-1023〜1023に増加しますが、データの変動(または正しい数学用語)は元のデータよりもはるかに小さくなります。実際、ほとんどの値は驚くことではありませんが、ゼロに近いです。 。 違いにライスコーディングを適用しました。私が理解していることから、ほとんど数値が小さいデータセットには良い選択のように見えます。 これにより、1280x720フレームのサイズが約60%削減され、テストシステム(シングルコアのVirtualBoxのLinux)は、1秒あたり約40の圧縮を(最適化なしで)実行できます。それほど素晴らしいわけではありませんが、合理的だと思います(またはそうでしょうか?)。 より良い方法はありますか?よくある間違いはありますか?逃した一般的な手順はありますか?高解像度のフレームは後で使用される可能性があります-フレームサイズが大きいほど、圧縮率が向上すると思いますか? UPD .: このライブラリをライスエンコーディングに使用しました。ライブラリは非常に低速です(著者自身が実際の使用ではなく学習用と記述しています)。たとえば、ループでビットを1つずつ読み書きするため、パフォーマンスが低下します。最初は〜20 FPSしか与えられませんでしたが、いくつかの非常に基本的な最適化の後、40 FPS(上記のように)になり、後でさらに最適化して80になりました。 しかし、ベクトル化に関しては、残念ながら、Riceコードをベクトル化する方法を考えることができませんでした(それが可能かどうかさえわからない-Riceコードに関するデータを見つけることができませんでした、ハフマンコードについて見つけることができることはこれはシーケンシャルであり、効率的にベクトル化することはできません。これは、ライスコードや他の可変長コードに適用される可能性があります。 また、まったく異なるアプローチを試みました。データを小さな断片に分割し(例:64ピクセルごとに)、単純なゼロ抑制を使用します。ブロック内で最大の数を見つけ、それを表すために必要なビット数をブロックの先頭に書き込みます(私の場合、追加の4ビットが必要でした)。次に、ブロック内のすべての数を同じ数に減らします。ビット。私は圧縮率が悪いと思っていましたが、断片が小さい場合、それらの多くはノイズスパイクを持たないため、バイナリ差は値ごとに4〜6ビットのようなものに減らすことができ、実際にはそれだけでしたRiceコードよりも約5%悪いですが、約2倍高速です(たとえば、私の場合は160 FPS)。私はそれをベクトル化しようとしましたが、ベクトル化をちょっと嫌っています。 負数には先行ゼロがないため、バイナリ差分の後、ライス/ゼロ抑制の前にジグザグエンコーディングを適用しました。

7
クライアントアプリケーションからユーザー認証を設計する方法は?
私は多くのユーザーをサポートするアプリケーションを開発しています。問題は、クライアント/ユーザーを認証する方法がわからないことです。 私はhttp://quickblox.com/のようなアプリを構築しています。そこでユーザーに資格情報を提供し、ユーザーはそれらを使用してユーザー名とパスワードを入れて認証を取得できないNアプリケーションを構築します。 それが次のようになると仮定しましょう。(QuickBloxと同じように) 1.ユーザーが私のWebサイトでアカウントを作成します。 2.ユーザーはN個のAPIキーを作成し、資格情報を秘密にすることができます。(複数のアプリの場合) 3.ユーザーは、アプリケーション(Android、iOS、Javascriptなど)でこれらの資格情報を使用して、REST APIと通信します。(REST APIには読み取りおよび書き込みアクセスがあります。) 私の懸念? ユーザーは自分が作成したアプリケーションに資格情報(APIキーと秘密キー)を入れます。誰かがこれらのキーを取得して、ユーザーをまねようとするとどうなりますか?(APKを逆コンパイルするか、JavaScriptコードを直接調べます。 どこか間違ってる?この3つのレベルのユーザーメカニズムを設計するのは混乱しています。

1
Freeモナドとリアクティブエクステンションはどのように相関しますか?
私はLINQがRx.NETに進化したC#のバックグラウンドから来ましたが、FPには常に興味がありました。F#でモナドといくつかのサイドプロジェクトを紹介した後、次のレベルに進む準備ができました。 さて、Scalaの人々からの無料のモナドに関するいくつかの講演と、HaskellまたはF#での複数の記事の後、理解がIObservableチェーンに非常に類似していることを理解するための通訳付き文法が見つかりました。 FRPでは、チェーン内に留まる副作用や障害を含む、より小さなドメイン固有のチャンクから操作定義を作成し、一連の操作と副作用としてアプリケーションをモデル化します。無料のモナドでは、私が正しく理解していれば、ファンクターとして操作を行い、coyonedaを使用してそれらを持ち上げることで同じことを行います。 針をアプローチのいずれかに向けて傾ける両方の違いは何ですか?サービスまたはプログラムを定義するときの基本的な違いは何ですか?

4
必要なときにソリューションに到達する方法の説明を出力するアルゴリズムのパターン
次のシナリオが何度か起こりました。 特定の問題を解決するアルゴリズムをプログラムしました。正常に機能し、正しい解決策を見つけます。今、私はアルゴリズムに「あなたが解決策に到達した方法の完全な説明を書く」ことを伝えるオプションが欲しいです。私の目標は、オンラインデモ、チュートリアルクラスなどでアルゴリズムを使用できるようにすることです。説明なしでリアルタイムにアルゴリズムを実行するオプションが引き続き必要です。使用する良いデザインパターンは何ですか? 例:最大公約数を見つけるためにこのメソッドを実装するとします。現在実装されているメソッドは正しい答えを返しますが、説明はありません。次のようなメソッドのアクションを説明するオプションが必要です。 Initially, a=6 and b=4. The number of 2-factors, d, is initialized to 0. a and b are both even, so we divide them by 2 and increment d by 1. Now, a=3 and b=2. a is odd but b is even, so we divide b by 2. …

3
古いOSの開発をサポート
私は、Cで書かれたレガシーコードの大部分を維持しています。このコードは当初、Windows 3 for Workgroupsに対してコンパイルするために書かれ、後にNT用のバージョンが作成されました。このレガシーアプリケーションは現在も使用されており、90年代前半から3.11およびNTワークステーションで快適に実行されています。正常に機能し、本来の動作を行います。また、彼らがまだ生きている理由は、ソリューションに属するカスタムハードウェアの一部のドライバーが後のWindowsと互換性がないためです。 同じ理由でWin2kでのみ動作する別のアプリケーションもあります。 ただし、状況が進むにつれて、これらのレガシー環境を実行することがますます難しくなっています。現在、開発用ソフトウェアがインストールされた物理マシンを保持しているため、ネイティブハードウェアで作業できます。しかし、これらはいつでも死ぬかもしれません(結局25歳です)。 それで、私の質問は、2016年を見て、この古風な環境をより安定した方法で維持するための私のオプションは何ですか?3.11をクラウドホスティングに移行できますか? 仮想化を試しましたが、セットアップの特殊な性質のため、デバイスドライバーで動作させることができなかったため、OSの完全なイメージをそのまま作成してから、 VMはソフトウェアを開発しますか?Win3やNTと同じくらい古いバージョンのゲストOSでは、このようなことは可能ですか? これらのような古いプラットフォームを開発のために生かしながら、より現代的で安全な方法で、私が引き出すことができる経験はありますか? 私の目標は、古い物理マシンを取り除き、仮想化に移行することです。
14 c  windows  legacy 

4
GitHubで「やり直す」方法
別のフレームワークなどを使用して、プロジェクトを完全に書き直す予定です。参照用の履歴を含む古いコードを保持しておくと便利です。リスク、混乱、驚きを避けるために、これを行う最善の方法は何ですか? 私のアイデアは、新しいブランチを作成し、そこですべてを置き換え、そこで実行される基本的な「新しい」バージョンを取得し、最後の「古い」マスターにタグを付けてから、ブランチをマスターにマージすることです。これは理にかなっていますか?
14 git  github 

4
Monadsはどのようなプログラミング上の問題を解決しますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 3年前に閉店しました。 私はモナドがどのように、何であるかを説明記事をたくさん読んだunitし、bindそれは目がいくつかのつまり完全に無視して、出血との奇妙なアナロジーに触れます(少なくとも私にとっては)それらのいくつかは、抽象ので圏論にまっすぐ急落仕事を、ブリトー、ボックスなど。 数週間の研究と多くの揚げたニューロンの後、(私は思う)モナドがどのように機能するかを理解しています。しかし、私の理解を逸するものがまだ1つあります。実際に触れている投稿はほとんどありません(IOと状態を除く)。 どうして? モナドが重要なのはなぜですか?なぜそんなに重要なのですか?彼らが解決している問題は何ですか?これらの問題はMonadsでのみ解決できますか、それとも他の方法がありますか?

4
単一責任パターンはクラスに対してどの程度具体的である必要がありますか?
たとえば、コンソールとの間のあらゆる種類の入出力メソッドを備えたコンソールゲームプログラムがあるとします。でしょうが、すべてのシングルでそれらを保つためにスマートにinputOutputクラスなど、より具体的なクラスにそれらを打破startMenuIO、inGameIO、playerIO、gameBoardIO各クラスが1-5程度のメソッドを持っていることなど、? また、同じメモで、それらを分解する方が良い場合は、IO名前空間に配置して、呼び出しをもう少し冗長にするのが賢明でしょうIO.inGameか?

3
ライブラリにリンクする代わりに、ライブラリのソースを追加する必要がありますか?
私は比較的C ++に慣れていないため、小さな依存関係(スクリプト言語、JSON / YAML / XMLパーサーなど)をどのように処理するのが最適かはわかりません。 個別のプロジェクトを作成して静的ライブラリとしてリンクする必要がありますか、それとも.h / .cppファイルをメインプロジェクトに配置するだけの欠点がありますか? 後者は、互換性のないライブラリ(ライブラリをビルドするときに異なるコンパイラ設定)を扱うのに数時間費やしたため、はるかに簡単に思えますが、C ++を間違った方法で学習し始めたくありません。 それらを個別のライブラリとして保持することが望ましい場合、.lib / .aファイルがアプリケーションに正常にリンクされるように、コンパイルフラグを同期させるにはどうすればよいでしょうか? (私は現在MSVC 2015で作業していますが、目標はXCode / clangを使用してMac OS XおよびiOSでコンパイルすることです。そのため、少なくとも3つの異なるタイプのライブラリ(Win x86、Mac x64、ARM)に対処する必要があります)
14 c++  linking 

2
プライベートGithubリポジトリの共同編集者は、それぞれリポジトリをフォークすべきですか?
私は現在プロジェクトに取り組んでおり、Githubのプライベートリポジトリにソースコードがあり、私たちはそれぞれ共同作業者です。 不明な点は、各作業を分離する方法です。 私たちがする必要があると思うことは: リポジトリをフォークする必要があります コードをプッシュする準備ができたら、プルリクエストをプロジェクトリーダーのレポジトリに送信します。レポジトリは、これを同時にコードレビューを行う機会として使用できます プライベートリポジトリに関しては、これはフォークを使用することになっているのでしょうか、それとも状況を複雑にしすぎていますか?

1
APIクライアントとラッパーのユニットテスト
私は、開発中のAPIクライアントライブラリを単体テストするための最良の方法を見つけようとして、一周して回りました。このライブラリには、Client基本的にAPIとの1:1マッピングを持つWrapperクラスと、の上部でよりユーザーフレンドリーなインターフェイスを提供する追加のクラスがありますClient。 Wrapper --> Client --> External API 私は最初の両方に対してテストの束を書いたClientし、Wrapper効果的にちょうど彼らが前方(上で動作するものは何でもの適切な機能にそのことをテストし、Wrapper上の動作Client、およびClientHTTP接続で動作します)。しかし、インターフェイスではなくこれらのクラスの実装をテストしているように感じるので、これに不快感を覚え始めました。理論的には、クラスを別の完全に有効な実装に変更することはできましたが、呼び出されると予想されていた関数が呼び出されていないため、テストは失敗します。それは私にとって脆弱なテストのように聞こえます。 この後、クラスのインターフェースについて考えました。テストでは、クラスが実際に行う方法ではなく、クラスが実際に意図したジョブを実行することを確認する必要があります。どうすればこれを行うことができますか?最初に頭に浮かぶのは、外部APIリクエストをスタブ化することです。しかし、私は外部サービスを単純​​化しすぎることに神経質です。私が見たスタブAPIの例の多くは、定型応答を提供しているだけです。これは、コードが偽のAPIに対して正しく実行されることをテストするだけの非常に簡単な方法のようです。別の方法はサービスをモックすることです。これは実行不可能であり、実際のサービスが変更されるたびに最新の状態に維持する必要があります。 最後に、私はこれを に、プログラマーSEに関する別の回答ました。 リモートAPIクライアントの仕事は、特定の呼び出しを発行することです-これ以上でもそれ以下でもありません。したがって、そのテストでは、これらの呼び出しを発行することを確認する必要があります-これ以上でもそれ以下でもありません。 そして今、私は多かれ少なかれ確信しています-テストするとき、テストClientする必要があるのは、APIへの正しいリクエストを行うことだけです(もちろん、APIが変更される可能性は常にありますが、私のテストは合格し続けます-しかしそれは統合テストが役立つ場合)。以来Clientちょうど1:APIと1のマッピング、私の懸念は実際には適用されません別の有効な実装から変更について前に-の各メソッドの唯一の有効な実装がありますClient。 しかし、私はまだにこだわっています Wrapperクラスにます。次のオプションが表示されます。 Clientクラスをスタブ化し、適切なメソッドが呼び出されることをテストします。このように、私は上記と同じClientことをしていますが、APIの代用として扱います。これは私が始めたところに私をすぐに戻します。繰り返しになりますが、これはインターフェースではなく実装のテストの不快感を与えてくれます。のWrapper非常によく、完全に別のクライアントを使用して実施することができます。 モックを作成しますClient。ここで、モックを作成する方法を決定する必要があります。サービスの完全なモックを作成するには、多くの労力が必要になります(ライブラリ自体に行った以上の作業)。API自体はシンプルですが、サービスは非常に複雑です(基本的に、そのデータに対する操作を備えたデータストアです)。そして再び、私は私のモックを本物と同期させておく必要がありますClientます。 適切なHTTPリクエストが行われていることをテストするだけです。これはWrapper、実際のClientそれらのHTTP要求を行うためにオブジェクトをため、実際に個別にテストするわけではありません。これは少しひどい単体テストになります。 したがって、これらのソリューションのいずれにも特に満足していません。あなたならどうしますか?これについて正しい方法はありますか?

2
ゼロダウンタイム展開-移行Dbスキーマ
ゼロダウンタイムの展開の実現には同じ問題が関係していましたが、検討している戦略に関するアドバイスが必要です。 環境 サーバー側の処理にApache / PHPを使用し、永続性にMySQL DB / filesystemを使用するWebベースのアプリケーション。 現在、インフラストラクチャを構築しています。すべてのネットワークハードウェアには冗長性があり、すべてのメインネットワークケーブルは、フォールトトレランスのためにボンディングペアで使用されます。サーバーは、ハードウェアフォールトトレランス用の高可用性ペアとして構成されており、仮想マシンのフォールトトレランスと一般的なパフォーマンスの両方で負荷分散されます。 私は、ダウンタイムなしでアプリケーションに更新を適用できることを意図しています。100%の稼働時間を提供できるように、インフラストラクチャを設計する際に多大な苦労をしました。更新が適用されるたびに10〜15分のダウンタイムが発生するのは非常に残念です。これは、リリースサイクルを非常に高速にすることを意図しているため、特に重要です(1日あたり1つ以上のリリースに達することがあります)。 ネットワークトポロジー これはネットワークの要約です: Load Balancer |----------------------------| / / \ \ / / \ \ | Web Server | DB Server | Web Server | DB Server | |-------------------------|-------------------------| | Host-1 | Host-2 | Host-1 | Host-2 | |-------------------------|-------------------------| Node A \ …

5
オブジェクト指向Cを書くのは悪いですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 3年前に閉店しました。 私は常にオブジェクト指向であるCでコードを書くように見えるので、ソースファイルまたは構造体を作成し、この構造体が所有する関数(メソッド)にこの構造体へのポインターを渡すものがあるとしましょう: struct foo { int x; }; struct foo* createFoo(); // mallocs foo void destroyFoo(struct foo* foo); // frees foo and its things これは悪い習慣ですか?「適切な方法」でCを書く方法を学ぶにはどうすればよいですか。
14 c 

4
クライアントに社内QAテストを行うよう促すにはどうすればよいですか?
更新/明確化私のクライアントは社内テストの必要性を理解しており、彼らは常に「より良い」(つまり何かをする)ことを誓いますが、それは起こりません。彼らは外部テストのための予算を持っていません。「テストを早く、頻繁にテストし、ターゲットマシンのエトスでテストできるのは何なのか」と質問しているのでしょうか(漠然と認めていますが)。 質問:実稼働プロジェクトで「そのままテスト」するのではなく、新しいリリースの問題を明示的にテストして報告する時間をユーザーに促す方法。 背景:私には、マルチメディアプレゼンテーションツールのスイートを作成した小規模のクライアントがいます。彼らは素晴らしいクライアントであり、私たちは良い関係を持っています。このプロジェクトは進行中であり、機能を追加しています。 私には2つの問題があります。 機能の定義はオンザフライで行われ、多くの場合電話で行われ、変更、修正、逆転の対象となります。(ケネディの「月に行って他のことをする」みたいなものです。私はいつもその「他のこと」の部分に面白がっています) 実質的にQAテストは行われません。 私は#1に多かれ少なかれ対処できます。これは、会議の前に仕様書を読むだけでなく、仕様書を書き上げるクライアントでさえありません。慣れてます。私が問題を抱えているのはアイテム#2です。彼らは新しいリリースをテストしないか、テストしません。彼らがしているのは、それらを本番用に使用して、バグが発生したときに回避策を見つけて報告しないようにするか、プロジェクトに取り掛かるのが急いで、バグ報告が曖昧になるようにすることです。 私たちはこれについて多くの議論をしましたが、私はそれらを少しだけ調整することができました(たとえば、問題追跡にgithubを使用していますが、ほとんど使用しています)。根本的な理由は2つあります。彼らは小さなコンサルティング会社であり、テストのためのリソースを持っていません(または、外部委託する予算もありません)。そして文化的:彼らは自分たちを「開発者」と考えていますが、彼らは本当にマルチメディアソフトウェアパッケージのユーザーにすぎません。(例えば、彼らは「本物の」開発者の詳細に対する強迫神経症の注意をまったく持たない)。 これはあなたが期待するように私に影響を与えます:フィードバックなしでは、機能が完全かどうか(#1を参照)または他の結果があるかどうかわかりません。また、私は少し怠け者になっています。

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