ソフトウェア工学

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

1
ファイルを狂わせずに、左から右へのスクリプトと右から左へのスクリプトをどのように混合しますか?
あなたの母国語がヘブライ語であり、ヘブライ語をソースコードに入れることができるPython 3のようなプログラミング言語で作業しているとします。よかったね!あなたは持っていdictます: d = {'a': 1} そして、あなたはそれをaヘブライ語で置き換えたいです。したがって、その単一の文字を置き換えます。 d = {'א': 1} ええとああ。他の変更を行わずに1つの文字を置き換えるだけで、表示がおかしくなりました。ヘブライ語からまでのすべて1が逆向きであり、これが何を意味するかは言うまでもなく、これが有効な構文(それがそうである)であることは極めて明白ではありません。 ヘブライ語は本質的に右から左であり、目に見えない制御文字がなくても、ヘブライ語のテキストは右から左に表示されます。これは、ヘブライ語の近くにある特定の「通常の」文字、および他のいくつかのスクリプトの文字にも適用されます。詳細は複雑です。 これにどう対処しますか?制御文字をソースコードに貼り付けて、コードを壊さずに表示を修正することはできません。16進数のエスケープですべてを書き込むと、ある種の読みづらさは別の種類と交換されます。Basic Latinブロックの文字を使用してすべてに名前を付け、ローカリゼーションファイルにすべてのヘブライ語の文字列を貼り付けることを辞任したとしても、右から左へのテキストと左から右への混合を避けるのは困難です。 ヘブライ語を含むJSONまたはCSVは文字化けします。文字列を押し込んだローカリゼーションファイルが人間が読めると想定されていたとしても、おそらくそうではありません。職業はなんですか?

3
Webアプリケーションのサーバー要件を計算する方法
私はモバイルアプリケーションのAPIを公開するバックエンドを開発しています。ユーザーは登録、製品の追加、製品のリンクを電子メール/ SMS /どこでも共有でき、他の人はそれをクリックして製品を購入できます。これは、モバイルアプリケーションの単純なワークフローです。アプリは、画像のアップロードと取得がサードパーティのクラウドサービスによって行われる、画像集約型のアプリです。SO画像部分は私のバックエンドで処理されません。 現在、私は開発チームの出身で、ハードウェアサーバー側の経験はほとんどありません。インフラストラクチャの要件を説明したところ、次の質問がありました。 アプリケーション/ストレージスループット アプリケーションのスループット(3か月、6か月、1年の同時接続数) ストレージスループット(3か月、6か月、1年でのデータの増加) HA要件 DR要件 上記の3点をどのように予測すればよいかわかりません。スループットはどのように計算されますか?最初の1か月でアプリケーションに10000人のユーザーが登録すると推定されます。そのうち5000人がアクティブユーザーになります。アプリケーションへの平均ログインでは、ユーザーあたり10 APIヒットがあり、これは5000 * 10 = 50,000ヒット/月になります。これは、1分あたり1 APIヒット、つまり最初の月に最大2つの同時接続になります。 計算はこのようになりますか?データの増加をどのように計算しますか?それは、ユーザーが製品を登録、作成し、そのために消費されたデータベースサイズを合計すると、データの増加と呼ばれることになるということですか。 この質問は悲惨に思えるかもしれませんが、サーバーの要件に対してスループットがどのように計算されるかを理解するには、本当に助けが必要です。


4
ダーティデータベースを回避するための統合テスト中のクリーンアップと配置のプラクティス
私はC#でテストをコーディングしていますが、次の構造で解決しました。 try { // ========== // ARRANGE // ========== // Insert into the database all test data I'll need during the test // ========== // ACT // ========== // Do what needs to be tested // ========== // ASSERT // ========== // Check for correct behavior } finally { // …

3
デスクトップアプリケーションでのREST APIと直接DB呼び出し
現在、会社で使用するアプリケーションを計画しています。デスクトップアプリケーションをビルドするために必要です。現在のところ、近い将来、アプリケーションがモバイルまたはブラウザーで利用可能になるかどうかは不明です。 私には2つの可能性があります。 デスクトップアプリケーションから直接データベースにアクセスする REST APIを作成してこれに接続する アプリケーションが社内のデスクトップアプリケーションのみである場合、REST APIを使用できますか?それが可能であることは知っていますが、「正しい」方法ですか?(ベストプラクティス) REST APIを直接作成することには、いくつかの(可能な)利点と欠点があります。 短所: 開発に時間がかかる より複雑 サーバーはより多くの作業を行います セキュリティ上の問題 もっとゆっくり?(サーバーとデスクトップアプリケーションは同じネットワーク上にあります) 利点: 他のプラットフォームへの移行は簡単です ビジネスロジックは、データベースを直接呼び出す場合にも必要です。開発にそれほど時間はかかりません 複雑さについても同じ セキュリティ(コメントでtkauslが言及) 保守性(WindRavenによるコメントでの言及)

1
古いブランチのトランクからのバグ修正をマージ
私は現在、私の会社でsvnからgitへの切り替えの過程にあります(1年後に、人々を説得するために費やしました!)。 これまでのところ、これですべてが良くなりますが、私たちが現在ワークフローに持っている小さなものの1つで、私には適切な同等のものを見つけることができません。 現在、すべての開発者はマスターで作業しています。四半期ごとに、マスターをXxブランチにブランチします。Xxブランチは後で最新のリリースになります。これは、svnリポジトリが次のようになることを意味します。 トランク 枝 3.8 4.1 4.2 ... 実際にはタグを使用しません。 時々、発見された緊急のバグ修正があります。 私たちがそれを行う現在の方法は次のとおりです。 マスターで修正する SVNは、関連するコミットの範囲を関連するブランチにマージします(おそらく、最新のリリースなど)。 私たちは宇宙産業にいるので、支社は長命であり、顧客のアップグレードプロセスはかなり長いので、これまでのところ、そのように取り組んできました。 さて、gitでどのようにして良い同等物でしょうか? これまでのところ、マスターから生成されたブランチのバグを修正してから、このブランチをマスターと4.3にマージしました(たとえば)。ことは、ホットフィックスブランチにはマスター履歴が含まれており、マスターと4.3の間のすべてのコミットもマージされるためですが、これは不要です。 これまでに考えたこと: 私は非常に成功したGitワークフローメソッドを見てきましたが、それらの解決策は、リリースブランチのバグを修正して、逆にマージするのではなく、マージすることです。これは私たちのケースではうまくいくかもしれませんが、実際にバグを修正する前に、バグを修正したい最も古いブランチをすでに知っている必要があるため、かなり面倒です。 もう1つの解決策は、マスターで修正してからコミットを選択することです(今日のsvnマージの場合と同様)。ここでの厄介なことは、この場合、チェリーピックが新しいコミットのように見え、関係が失われるため、マージされたものの履歴がどこで失われるかということです。 それを行うための「良い」方法は何ですか?履歴のコミットを修正するか、チェリーピックを使用して、マージされたものや他の何かを手動で追跡する必要がありますか? gitでの制作経験がほとんどない場合、私は何かを見逃している可能性があります。
9 git  svn  branching 

2
依存性注入は、テストの負担をさらに連鎖させませんか?
私は依存性注入について学んでいます。関数型ライブラリを作成するときにその魅力を見ることができますが、ライブラリを使用する人にもなると、それがどのように解決するのかわかりません。 テストするものがあまりないので、ライブラリのテストがはるかに簡単になります。 しかし、最終的には、ライブラリを使用するときに注入された関数をテストし、標準ライブラリの関数のモックとスタブを処理する必要があります。 これは、Node.jsで扱っている具体的なケースです。 function compile(options) { var files = options.files; var texCompiler = options.texCompiler; var pdfMerger = options.pdfMerger; return Promise.all(files.map(texCompiler(files))) .then(pdfMerger); } 注入:それはテストに簡単ですモックオブジェクトとして、あるいはスパイをtexCompilerし、pdfMerger機能が本当にすべてではあまり行っていないので、ケーキの一部です。私がテストできるのは、両方の関数が正しい順序で呼び出されることだけです。 とはいえ、最終的には私の関数texCompilerやpdfMerger関数をテストする必要はありません。彼らはそのようなものに見えます: var tex2Pdf = Promise.method(function tex2Pdf(tex_doc) { var latex_command = 'pdflatex'; var pdf_output_filename = path.parse(tex_doc).name + '.pdf'; var cmd = latex_command + ' ' + tex_doc; …

1
コンテンツにHTML5ローカルストレージを使用しない理由はありますか
多くの静的なWebサイトでは、最も人気のある20ページの実際のテキストコンテンツの合計サイズは100kb未満になります。 HTML5ローカルストレージを利用して、サーバーからAJAX経由でコンテンツを単一のファイルにダウンロードし、ローカルストレージに保存して、angularJSなどのデータドリブンJSフレームワークで使用することができると思います。実際、バックグラウンドでさらに多くのコンテンツをサイレントでダウンロードしている可能性があります。これにより、非常に高速で応答性の高いユーザーエクスペリエンスが実現する可能性があります。 これにもかかわらず、私はこのように動作しているウェブサイトを見たことがありません。これが悪い考えになる理由が欠けている理由はありますか?

2
三項演算子は、割り当てステートメントの外で使用する必要がありますか?
編集これは、3項演算子が有害かどうかの問題ではありません。それは、割り当てステートメントの外で使用する必要があるかどうかについてコンセンサスがあるかどうかについてです。/編集 ブール値に基づいて、2つの異なる関数(戻り値なし)の1つを呼び出します。私はこのJavaScriptのビットを書きました: (condition) ? doThis(arg) : doThat(arg) if-elseステートメントを書くよりも見た目がきれいだと思います。 if(condition) { doThis(arg); } else { doThat(arg); } 私の同僚は、三項ステートメントは割り当てステートメントでのみ使用するべきだと強く信じています。これについて説明しているスタイルガイドが見つかりません。おそらく、JavaやC#などの言語ではこれがまったく許可されていないためです(コンパイラは値を返すために3項演算子を必要とします)。これは三項ステートメントの悪用と見なされるべきですか?どうして?

4
複数の機能を試し、成功するとすぐに停止するHaskellイディオムはありますか?
Haskellでは、タイプa -> Maybe bを使用して、タイプの値を返すかb、何も返さない(失敗する)関数をモデル化できます。 私がタイプしている場合a1, ..., a(n+1)や機能f1, ..., fnを持つ、fi :: ai -> Maybe a(i+1)すべてのためにi、1 <= i <= n私は使用して機能をチェーンできる>>=のオペレータMaybeモナドと書き込みを: f1 x >>= f2 >>= f3 >>=... >>= fn >>=各関数があれば、その前身は、意味のある値を返したように適用されていることをオペレータを確実にします。チェーン内の関数が失敗するとすぐに、チェーン全体が失敗し(戻り値Nothing)、チェーン内の以降の関数は評価されません。 同じ入力で複数の関数を試し、1つの関数が成功したらすぐに戻りたいという似たようなパターンがあります。すべての関数が失敗すると(return Nothing)、計算全体が失敗します。より正確には、私には関数がf1, ..., fn :: a -> Maybe bあり、関数を定義します tryFunctions :: [a -> Maybe b] -> a -> Maybe b tryFunctions [] …

5
パフォーマンスを低下させることなく、Pimplバリエーションを実装できますか?
pimplの問題の1つは、それを使用するとパフォーマンスが低下することです(追加のメモリ割り当て、不連続なデータメンバー、追加の間接参照など)。pimplのすべての利点が得られないという犠牲を払ってこれらのパフォーマンスのペナルティを回避する、pimplイディオムのバリエーションを提案したいと思います。アイデアは、クラス自体にすべてのプライベートデータメンバーを残し、プライベートメソッドのみをpimplクラスに移動することです。基本的なpimplと比較した場合の利点は、メモリが連続している(追加の間接参照がない)ことです。pimplをまったく使用しない場合と比較した場合の利点は次のとおりです。 プライベート関数を非表示にします。 これらのすべての関数が内部リンケージを持ち、コンパイラーがより積極的に最適化できるように構造化できます。 したがって、私の考えは、pimplをクラス自体から継承させることです(私は少し奇妙に聞こえますが、我慢してください)。次のようになります。 Ahファイル: class A { A(); void DoSomething(); protected: //All private stuff have to be protected now int mData1; int mData2; //Not even a mention of a PImpl in the header file :) }; A.cppファイル: #define PCALL (static_cast<PImpl*>(this)) namespace //anonymous - guarantees internal linkage { struct PImpl …

2
分散システムの認証オプション
私は、互いにシンフォニーで機能する3つのコンポーネントを設計しているところです。 BasicAuthすべての呼び出しでHTTPS を必要とするRESTful Webサービスであり、これが実際に私のシステムのすべての重労働を実行します(作業を行います) エンドユーザーのアクションを上記のWebサービスへのAPI呼び出しに変換するWeb UI。したがって、UIはWSによって「サポートされます」 開発者がローカルでインストールして実行できるコマンドラインインターフェイス(CLI)ツール。コマンドをWSへのAPI呼び出しに変換します(したがって、これもWSによって「サポートされています」)。 私が乗り越えようとしている最初のハードルの1つは、認証と承認に関するものです。 WSがLDAP /ディレクトリサービス(ADまたはおそらくApache DSなど)を認証レルムとして使用しているとしましょう。つまり、API呼び出しがネットワーク経由で(たとえば、あるHTTPS GETリソースの)BasicAuth受信されると、資格情報が要求から抽出され、LDAPサービスに転送されて、これが有効なユーザーであるかどうかが判断されます。認証されている場合、特定のユーザーが HTTPSリクエストで試行していることを実行できるかどうかを判断するために、別の認証レルム(おそらくデータベース)が使用されているとしましょう。ここまでは順調ですね。 CLIツールの場合、ユーザーはコマンドを実行する前に認証を受ける必要があります。したがって、単一のユーザーは常に同じCLIインスタンスを操作するだけなので、このモデルは問題なく機能します。 Webアプリケーション(UI)をWSと統合しようとすると、問題が発生します。なぜなら、多くの人が同時にアプリにログオンする可能性があり、すべて異なるアクセス許可で、許可されている基本的なAPI呼び出しを指示するためです。 私の知る限り、それを見て、それが見えます私はここが、4つのオプションを持っているように: キャッシュされた資格情報:アプリにログインした後、資格情報が何らかの形であり、どこかで(アプリはそれらへのアクセスを持っているように)キャッシュされた、とアプリが認可ポリシー自体の任意の種類を強制しません。ユーザーが内部でAPI呼び出しを生成することをしようとすると、資格情報がキャッシュから検索され、API呼び出しで転送されます。WSが承認されていないと判断した場合、WSはエラーを返します。 サービスレベルアカウント:アプリとWSはどちらも同じ認証/承認レルムを使用しますが、Web UIは、ユーザーがアプリ内で実際に表示および実行できるものに承認を適用するようになりました。基盤となるAPI呼び出しを生成する何かを実行することが許可されている場合、アプリmyapp-admin-userはユーザーに代わって各API呼び出しでサービスアカウントの認証情報(など)を送信します。 OAuthv2:OAuthが何であるか、またはこのシナリオに適用できるかどうかはわかりませんが、どういうわけかここでの解決策になると思います。 トークンサーバー:サービスレベルのアカウントオプションと同様の方法で、CASやKerberos などのトークンサーバーを使用してユーザーを保証します。ここで、ユーザーがアプリに正常にログインすると、トークンサーバーはアプリにセッションUUIDを送り返し、そのUUIDをWSに登録します。アプリがAPI呼び出しを生成するたびに、UUIDをリクエストに付加し、それがWS側で検証されます。 「Cached Credentials」オプションは、セキュリティ分野で優れていて健全なすべてのものの逸脱のように感じられます。資格情報をどこにでもキャッシュするのは間違っていると感じるだけです。 「Token Server」オプションは、SSOタイプのセットアップでは有効のようですが、この特定のケースでは有効ではないため、私には不便に感じられます。また、セッションUUIDの概念と BasicAuth / HTTPSを同時に使用する良い方法はないと思います。 したがって、これは私が何も知らないOAuthv2と、残りの唯一のオプションとして「サービスレベルアカウント(SLA)*」を残します。SLAオプションは問題ないようですが、次のようないくつかの欠点があります。 サービスアカウントには、基本的にWSに対する「神の特権」が必要です。つまり、ユーザーがボタンをクリックしたり、UIで何かを実行したりできるとアプリが判断すると、UIで使用されているサービスアカウントによる無条件のAPI呼び出しに変換されます。これは気分が悪いですよね? 2つの権限セット(アプリの各ユーザーに設定された権限セット、次にアプリがWSに対して使用するサービスアカウントに設定された権限セット)を維持すると、権限が互いに同期しなくなる可能性があります何とかして だから私は本当にここには良い選択肢がないようです。確かに私はこれに遭遇する最初の開発者になることはできませんが、Googleの神々に尋ねることはここではあまり助けになりませんでした。何か案は?

3
Linuxで書き込み中にファイルを読み取る
私が理解しているように、ファイルが書き込まれているとき、ファイルへの書き込みプロセスは排他ロックを取得します。したがって、他のプロセスはこのファイルにアクセスして読み取ることができません。 上記の知識があるため、ブラウザがまだビデオをダウンロードしているときに、メディアプレーヤーでビデオを再生する方法を理解できません。
9 linux  io  locks 

1
Builderパターンとの互換性のない構成をどのように処理する必要がありますか?
これは、別の質問に対するこの回答が動機です。 ビルダーパターン)、特に、オプションの初期化パラメータとの複合体の初期化を簡略化するために使用されます。しかし、相互に排他的な構成を適切に管理する方法がわかりません。 ここにImageクラスがあります。 Imageファイルまたはサイズから初期化できますが、両方から初期化することはできません。コンストラクタを使用してこの相互排除を強制することは、クラスが十分に単純な場合に明らかです。 public class Image { public Image(Size size, Thing stuff, int range) { // ... initialize empty with size } public Image(string filename, Thing stuff, int range) { // ... initialize from file } } Imageビルダーパターンが役立つように実際に十分に構成可能であると想定すると、突然これが可能になる可能性があります。 Image image = new ImageBuilder() .setStuff(stuff) .setRange(range) .setSize(size) // <---------- NOT …

2
…Helperまたは…Managerクラスを回避する方法
プロジェクトにはかなりの数のヘルパークラスがあります。これは悪いことだと読んだことがありますが、「ヘルパー」がサフィックスとして間違っていると思います。例を挙げましょう。 まず、Userクラスがあります。GetSuggestedFriends()ユーザーのための方法が必要です。提案された友達のリストをUserクラスから除外するためのロジックを保持したいので、肥大化しません。現在、コンストラクターでFriendshipHelperを受け取るがありUserます。友達候補を取得するためのロジックが含まれているので、を呼び出すことができますmyUser.FriendshipHelper.GetSuggestedFriends()。 元々FriendshipHelperは静的メソッドのみがあり、Userオブジェクトはそれぞれに渡されていました。今、クラスを最初から作成している場合は、それを呼び出すかもしれませんFriendshipManager-友達の追加や削除なども行います。 ...Managerただし、クラスが悪いことも読みました。私はこのクラスを何と呼ぶべきですか?または、これは「不良コード」ですか?友達候補、現在の友達、友達の追加と削除のロジックはどこにあるべきですか?きっとすべてが巨大なUserクラスにいるわけではありませんか?

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