2017年2月1日水曜日

世界で通用するエンジニアになるための高度な技術記事(英語)

勉強の為に引用しました。
http://qiita.com/higty/items/f1f981719b1a59b9e020?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=1e1ebc7389-Qiita_newsletter_245_1_2_2017&utm_medium=email&utm_term=0_e44feaa081-1e1ebc7389-33131633

英語サイトには日本語のサイトでは絶対に手に入らないレベルの記事がわんさか読めます。今日はCodeProjectよりシステム構築をする上で知っておくべき深い知識を解説した記事を3行要約と共にご紹介します。

C#と.NETの記事
C#や.NETのかなりディープな記事たちです。日本語ではあまり見かけない深い部分まで知れます。

■高パフォーマンスなクラスのデザイン方法
https://www.codeproject.com/Articles/812678/Performance-Considerations-of-Class-Design-and-Gen
・クラスvs値型のメモリ使用の詳細
・値型のGetHashCodeとEqualメソッドをオーバーライドする
・シールドクラスによりVirtualメソッドを避ける
・インターフェースのDispatchについて
・ボクシングを避ける
・for vs foreachはforを使ったほうが全ての場合で圧倒的に早い(foreachでも.NETが最適化してくれる場合もあるよ)
・キャストで避けるべきこと
・P/Invokeについて
・Delegateのコスト(特に生成が遅い)
・例外のスローは避ける
・Dynamicについて
・コード生成について
・プリプロセッサの使用を推奨
・一番大事なのは測ること(各種の測定方法を紹介)

■.NETの型システムの内部構造について
https://www.codeproject.com/Articles/20481/NET-Type-Internals-From-a-Microsoft-CLR-Perspecti
・メモリ構造、メソッドテーブル、デリゲート、Enum、Array、Genericsの内部構造について解説

■C#のあまり知られていないTIPS
https://www.codeproject.com/Articles/693771/The-Csharp-trickbox
・StructLayout
・Sealedクラス
・readonlyとconst
・内部クラス
・DebuggerAttributes
・usingエイリアス
・Enumと拡張メソッド
・ドキュメントにないキーワード、__arglist、__reftype、__refvalue
・インデクサ
・ボクシング

WEB、WPF、ネットワーク、DB
次はWEBやWPF、ネットワーク関連の記事です。

■Webサイトを高速化する方法
https://www.codeproject.com/Articles/26376/Speed-Up-Your-Website-By-Example
・WEBの基本知識(DNS、HTTP、リクエスト、レスポンス、HTML)
・ロード時間の最適化(HTML、画像、TABLEタグ、CSS、JavaScript)
・リクエスト・レスポンスのサイズ
・ドメインルックアップ
・CDNの利用
・AJAX

■SocketAsyncEventArgsを使用した高パフォーマンスなソケットコードの作り方
https://www.codeproject.com/Articles/83102/C-SocketAsyncEventArgs-High-Performance-Socket-Cod
・IO完了ポートとマルチスレッド
・TCPのアンマネージドコードによるメモリの断片化からのOutOfMemoryExceptionを防ぐコーディング方法。これはまじで罠です。ソケットを使ったプログラムをしている人は必読。

■高速でスケール可能なドメインをまたぐデータ転送のAJAXプロキシ
https://www.codeproject.com/Articles/25218/Fast-Scalable-Streaming-AJAX-Proxy-continuously-de
・マルチスレッドパターンのProducer&Consumerパターンの実装
WEBサイトにファイルをポスト→ローカルのファイルシステムやAzureへ保存、みたいなシーンで活用可能。

■WPFのデータバインディング
https://www.codeproject.com/Articles/29054/WPF-Data-Binding-Part
・基礎から順番に解説。非常にわかりやすい。

■データベースデザインにおける従うべき11のルール
https://www.codeproject.com/Articles/359654/important-database-designing-rules-which-I-fo

ライブラリ
凄いライブラリ達です。もちろん全てソースコード付き。

■高速なCSVリーダー(まじで速い)
https://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

■DbSharp(データアクセスのコード生成ツール)
https://www.codeproject.com/Articles/776811/DbSharp-DAL-generator-tool
・コードジェネレータの設計方法の解説
・SQLサーバー、MySQL、テーブル、ストアドプロシージャ、ユーザー定義型に対応
・テーブル型の引数、Indentity,RowGuid,Timestamp、Enum、複数の結果セットに対応
・トランザクションも可能

■メールのライブラリ(SMTP、POP3、IMAP)
https://www.codeproject.com/Articles/399207/Understanding-the-Insides-of-the-SMTP-Mail-Protoco
https://www.codeproject.com/Articles/404066/Understanding-the-insides-of-the-POP-mail-protoco
https://www.codeproject.com/Articles/411018/Understanding-the-insides-of-the-IMAP-mail-protoco
・SMTP、POP3、IMAPのプロトコルの仕様の解説と実装

■TimePeriodライブラリ
https://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET
カレンダーアプリとかで時間帯の重なりなど考えるときがありますが、この記事を読むとすっきりします。
・時間帯の重なりの計算概念について全て網羅
・上記を踏まえたクラスの設計と実装

■C#によるVectorクラス(3D空間を表現するクラス)
https://www.codeproject.com/Articles/17425/A-Vector-Type-for-C
・高等数学のベクトル、演算子、値型について詳しくなれます。

■MotionJPEGをストリーミング配信するサーバーの作り方
https://www.codeproject.com/Articles/371955/Motion-JPEG-Streaming-Server
・JPEGを連続的に配信することで動画配信する。
・市販のIPカメラはだいたいこの手法で動画配信。
・PCはもちろんのこと、モバイルでも閲覧可能。

■バーコード画像を生成するライブラリ
https://www.codeproject.com/Articles/20823/Barcode-Image-Generation-Library

■Lucene.net(全文検索エンジン)の紹介
https://www.codeproject.com/Articles/29755/Introducing-Lucene-Net

■C#によるネイティブベイジアンフィルタ(迷惑メール判別の手法)
https://www.codeproject.com/Articles/23472/A-Naive-Bayesian-Spam-Filter-for-C
・迷惑メールフィルタが自分で簡単に実装できます。
・機械学習で学習させることにより、スポーツの記事とそれ以外を判別するなどの処理も実装可能。

■計算エンジンの作成(文字列の計算式を解析して計算する)
https://www.codeproject.com/Articles/246374/A-Calculation-Engine-for-NET

認識サービスの記事
IoTなどで使用可能な認識処理の深い知識が得られます。もちろんソースコード付きのライブラリもあるので自分のアプリに実装も可能。

■音声認識(音声→テキスト、テキスト→音声)と文脈解析
https://www.codeproject.com/Articles/483347/Speech-recognition-speech-to-text-text-to-speech-a

■画像解析の基本要素(全然基礎じゃないw大学修士レベル)
https://www.codeproject.com/Articles/781213/Fundamentals-of-Image-Processing-behind-the-scenes

■モーション認識のアルゴリズム
https://www.codeproject.com/Articles/10248/Motion-Detection-Algorithms
・AForge.netによるモーション解析

■C#による高速なオブジェクト認識処理
https://www.codeproject.com/Articles/826377/Rapid-Object-Detection-in-Csharp
・Afford.netを使ったテンプレートマッチングによるオブジェクトの認識

もしこの記事を翻訳してほしいなどあればコメントしてください。時間が取れればざっくり翻訳くらいならしてみたいと思います。

まとめ
CodeProjectは本当にいい記事が揃っています。みなさんも英語のサイトの記事を是非読んでみましょう。



higty
821Contribution
フォロー
人気の投稿

 世界で通用するエンジニアになるための高度な技術記事(英語)
 Taskの裏側のスレッドの仕組みについてDeepに理解する
 EnumオブジェクトのToStringメソッドはswitch文の100倍以上遅いのでILGeneratorで動的にswitch文を生成&コンパイルして高速化する方法
 C#7.0の新機能をライブコーディング風に理解する。その1
 ASP.NET MVCの複数のWEBサイトで使用する.cssファイルをデバッグが容易な形でDLLに埋め込んで共有するやり方


C#と.NETの記事
WEB、WPF、ネットワーク、DB
ライブラリ
認識サービスの記事
まとめ
いいね
706
fantm21
katsu1110
acevif
shu-maibentou
wasabeef_jp
ssashir06
kyrieleison
ha_hagawa
kash
MakotoTaniguchi

 ストック
 編集リクエスト



MasasiKatano
1contribution
2017-01-27 12:47
いいね
0
とても良い英語サイトの記事がたくさんあり勉強になります。
ありがとうございます。
少しだけ、下記記事の部分に関して気になりましたので報告致します。
■Webサイトを高速化する方法
https://www.codeproject.com/Articles/26376/Speed-Up-Your-Website-By-Example

こちらの記事、基本的な事は変わっていないため大変勉強になりました。
ただ詳細の部分に関しては2008年の記事のためやや違いを感じました。
2008年の記事であることを伝えるとより配意があるのではと思います。

具体的に例を挙げると、記事中に「Move inline scripts and CSS to external file」とありますが、Googleはガイドライン上にて「外部 CSS リソースが小さい場合は、HTML ドキュメントに直接挿入できます。これをインライン化といいます。小さい CSS をこのようにインライン化すると、ブラウザはページのレンダリングを続けることができます。」と記載しております。
https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery

higty
821contribution
2017-01-29 22:03
いいね
0
コメントありがとうございます。

https://www.codeproject.com/Articles/26376/Speed-Up-Your-Website-By-Example
この記事はちゃんと全部読んでいただけましたか?確かに「Move inline scripts and CSS to external file」とありますがそのすぐ下にご指摘いただいたことと全く同じ内容が書いてあります。ご丁寧にガイドラインを守る場合と敢えて破る場合についての判断基準についても記述があると思うので確認してみてくださいね。

重ねてその下のセクションでも再度記述があります。
Make CSS and JS external files.
・Follow this guideline: External files would help Browser to cache for next use and is good for multiple visits.
・Break this guideline: To avoid extra HTTP request and faster response, inline may be good for home page.
一応ざっくりと訳もしておきますが
訳)
CSSとJavaScriptファイルを外部ファイル化する
・ガイドラインのフォロー:外部ファイル化することでブラウザのキャッシュに記憶され次回以降のアクセス時にキャッシュからロードされるのでパフォーマンスが向上します。
・ガイドラインを敢えて破る場合:HTTPリクエストの回数を減らしより高速なレスポンスを返したい場合、インライン化するのも良いかもしれません。

原文を張り付けたのでブラウザのキーワード検索で検索すれば見つかると思います。どちらが正解ということはなく状況に応じて最適な選択をすることが大事です。

日付はこの記事に限らず常に確認したほうが良いですね。技術はすぐ変わっていきますし日付を意識するのはいいことだと思います。この記事に関しては普遍的なDNS、HTTP、ブラウザの仕様などで10年経っても変わらない内容がほとんどです。今でも通用すると思います。

ーーー
コメント:
C#.NETとWindows Serverは、運用コストとライセンスコストが高すぎるのと、
世界中からの一万同時アクセス問題への対応が難しいか耐えられないと思います。
ServerOSなら安くて一万同時アクセスや10万同時アクセスに耐えられる可能性のあるLINUX
Serverの方がオススメです。
Windowsのクライアントに対してサーバーが必要ならREDHAT LINUXにすると安くすむと言う方法も御座います。
イントラネットやWEBサイトなら一万同時アクセス問題をクリアしているNode.jsか、それよりも
高速なGo言語などを選ぶかサーバーの台数を増やしてメンテナンス性の良いPythonを選ぶのが、2017年ではベストな選択だと思われます。
スマホ用のSwiftがServerSide(WEBサイト)でも活躍する可能性がありますが、それは来年以降に様子見の予定です。

0 コメント:

コメントを投稿