タグ

ブックマーク / ufcpp.net (48)

  • グラフィック

    概要 System.Drawing 名前空間以下に、 画像ファイルの読み書きや、 直線や円などを画像に描くためのクラスが用意されています。 Image System.Drawing.Image はベクタ画像・ビットマップ画像問わず、画像を扱うためのクラスです。 png, jpg, gif 等、さまざまな画像形式ファイルを読み書きできます。 ただし、ベクタ画像も含む、抽象的なクラスとして設計されているので、 「座標 (x, y) のピクセルの色データを取り出す」等といった操作は出来ません。 ここでは、例として、画像を読み出して、jpeg 形式で保存しなおしてみましょう。 といっても、非常に簡単で、以下のような数行ほどのプログラムでできます。 class Program { static void Main(string[] args) { //↓ 画像ファイルのパスは適当に書き換えて。 st

    グラフィック
  • 反復処理

    概要 プログラム中で、条件が満たされるまで何度も同じ処理を繰り返したい場面がよくあります。 C#ではそういう反復処理のためにwhile、do、for、foreach などのキーワードを用意しています。 (このうち、foreach は「foreach」のところでより詳しく説明します。) ポイント while (条件) 条件が真の間繰り返し do 条件にかかわらず、最低1度は実行される while (条件); for (初期化; 条件; 更新) 反復したい処理 foreach (変数 in コレクション) コレクション内の要素の列挙 while 文 while 文は以下のような書き方をします。 while(条件式) 繰り返したい文 // 条件式が真の間繰り返される if と同じく、英文法に近い書き方になっています。 while A, B (A の間、B)。 while の後ろの括弧内の条件式が

    反復処理
  • 非同期処理(C# によるプログラミング入門)

    概要 注意: 2010年10月時点での CTP (community technology preview)版を元にした記事になっています。 製品版までに変更の可能性があります。 (async や await というキーワードも変更される可能性あり。) Ver. 5.0 スレッドを使った非同期処理を行いたい動機としては、以下の2つが挙げられます。 非ブロッキング処理: I/O 待ちとかで UI スレッドをフリーズさせないようにする 並列処理: マルチコアを活かした並列処理でパフォーマンス向上 このうち、並列処理に関しては、Parallel クラスや Parallel LINQ で簡単に対応可能 (ラムダ式や LINQ を使えば、並列じゃない場合とほとんど変わらず書けます。 参考: 「[雑記] スレッド プールとタスク」)。 一方の、非ブロッキング処理は、今までは結構面倒だったものの、 as

    非同期処理(C# によるプログラミング入門)
  • 組込み型変換

    概要 C# には int 型から double 型というように、 ある型から別の型に変換する機能があります。 型変換は、代入などの操作を行うだけで暗黙的に行われる変換と、 変換先の型を明示的に指定して行う変換があります。 また、いずれの変換も、変換できる型・できない型が予め決まっています。 ポイント C# では、ほとんどの場合、型変換は自動的には行われません short x = (short)5; というように、明示的に型変換します short → int のように、変換しても値の精度が失われない物についてのみ、暗黙的な型変換が用意されています 暗黙的な型変換 暗黙的(implicit)な型変換とは、ある型の変数を別の型の変数に代入するだけで自動的に型を変換してくれる機能です。 以下に暗黙的な型変換の例を挙げます。 short m = 365; long n = m; // short か

    組込み型変換
  • インデクサー(C# によるプログラミング入門)

    概要 C# で利用できる基型の1つに配列があります。 配列では i 番目の要素を読み書きする際、 a[i] というように [] を用います。 「演算子のオーバーロード」でも述べましたが、 ユーザー定義型の理想は、組込み型とまったく同じように扱えることです。 そこで、C# では、 ユーザー定義型が配列型と同様に [] を用いた要素の読み書きが行えるようにインデクサーという仕組みが用意されています。 インデクサーを定義することで、ユーザー定義型のオブジェクトでも、 配列と同じような a[i] という形での要素の読み書きができるようになります。 ポイント 組み込み型(int や string など)とユーザー定義型(クラスや構造体)の区別をなくそう。 ユーザー定義型にも、配列っぽく[]を使ったインデックスアクセスを定義できます(インデクサー)。 書き方は、T this [int index]

    インデクサー(C# によるプログラミング入門)
  • 継承

    概要 継承(inheritance)とはオブジェクト指向の中核を担う概念で、 あるクラスから性質を受け継いだ新しいクラスを作ることです。 継承は派生(derivation)とも呼ばれます。 ポイント オブジェクト指向の中核概念その2: 継承。 「人間」⊃「学生」のように、包含関係のあるものを表現する方法。 「学生は人間を継承する」、「学生は人間から派生する」などと言う。 class Person { ... } に対して、class Student : Person { ... } と書く。 継承関係とは 継承関係の例として、「人間」と「学生」という2つのクラスについて考えて見ましょう。 「学生」は「人間」の一部です。 すなわち、「学生」ならば必ず「人間」としての特徴を備えています。 それとは逆に「人間」だからといって必ずしも「学生」であるとはいえません。 つまり、「学生」は「人間」の特別

    継承
  • 配列

    概要 「複数の数値を入力してその和を求める」とかいうように、複数のデータを一まとめにして扱いたい場合があります。 C# などのプログラミング言語には、 複数のデータを一まとめにするための「配列」というものがあります。 配列 ポイント 配列: 複数のデータをひとまとめに x[n] で、x の n 番目の要素にアクセス 配列がなかったら まずは、もし複数のデータを一まとめにせずにばらばらに扱おうとするとどうなるか考えてみましょう。 例として、5個の整数を入力して、それらの二乗和を求めることを考えます。 プログラムは以下のようになるでしょう。 int a, b, c, d, e; // 変数を入力したいデータの数だけ用意。 // 値の入力 a = int.Parse(Console.ReadLine()); b = int.Parse(Console.ReadLine()); c = int.P

    配列
  • C# とは

    概要 市販アプリケーションやビジネスソフトウェアの開発現場で 最も広く使われてきている言語は C と C++ でした(90年代の話)。 この二つの言語は非常に細かなコントロールを行える柔軟な言語ですが、 柔軟性と引き換えにソフトウェア開発が難しいという欠点があります。 C や C++ を使用してアプリケーションを開発するには Visual Basic などの言語を使用して 同等のものを作る作業に比べ、開発期間が長くなります。 登場とともに一躍脚光を浴びた言語に Java があります。 JavaC++ を元に改良を加えた言語で、マルチプラットフォーム上で動作し、 GUI プログラムを作成するライブラリが標準で用意されています。 しかし、C++ と比べて、制限されたことが多く、今ひとつ物足りない仕様になっていますし、 低レベルのコードをコントロールする機能に乏しいため、 既存のシステムと

    C# とは
  • 値の入出力

    概要 これから格的に C# によるプログラミングを解説して行くことになりますが、 ただ文章で説明するよりも実際にサンプルプログラムを挙げて説明するほうが分かりやすいと思うので、 そうして行きたいと思います。 また、ただ単に計算を行うだけのプログラムよりも、 ユーザーからの入力を受け取って、計算結果を出力するようなもののほうが面白いでしょうから、 そのようなサンプルプログラムを挙げていきたいと思っています。 そのためにまず、C# の文字ベースプログラムにおける入出力の行い方について簡単に説明しておきます。 ただ、現時点ではまだ詳しい説明は出来ませんので、 「とりあえずこうすれば入出力が行える」ということだけ覚えておいてもらうことになります。 値の入出力 ポイント 「まずは慣れろ」ということで、とりあえず今は詳しい説明省略。 入力 C#でユーザーからの入力を受け取りたい場合、 Console

    値の入出力
  • JSON とかの中身確認ツール

    今日は、「主に自分が使う用ツールを Blazor WebAssembly で作って Static Web Apps に置いたよ」系の話を一応ブログ化。 ソースコード Static Web App よくある「JSON とかのデータの中身を確認するツール」です。 しばらく、JSON と MessagePack の読み書きをするコードを書いてて、 デバッグがしんどくなって作ったのがこのツール。 いろんな形式を同時に扱うことがニッチ需要なのであんまり自分の需要にあったツールがなかったんですよね。なら、まあ、自作。 こないだの C# 配信 で、UTF-8 とか MessagePack バイナリとかを手打ちで入力してたら @xin9le, @okazuki 両氏にドン引きされたやつ。 バイナリ読み込み (Parser) UTF-8 を ReadOnlySpan<byte> のまま扱ってて、 ブレイクポ

    JSON とかの中身確認ツール
  • STL とは

    概要 STL (Standard Template Library) とは、C++ の(1998年に標準化された)標準ライブラリの1つです。 STL は、template という機能を用いた直交性の高いライブラリです。 template templateは型をパラメータとして与えることで、任意の型に対応したコンテナやアルゴリズムを記述できる機能です。 例えば、2つの値のうち大きいほうを取り出す関数max()を作りたいとします。int型に限定したものなら簡単に作れて以下のようになります。 inline int max(int x, int y) { return x > y ? x : y; } しかし、double型や文字列に対して同じことをしたい場合、 改めてdouble型用のものと文字列用のものを作る必要があります。 templateを用いるとこの問題を解決できます。 template

    STL とは
  • 小ネタ C# と他の言語との差というと

    C#で、「他の言語との差というと」とか「他の言語から来たばかりの人が書きがちなコード」みたいなことを聞かれた場合、まず何が思い浮かぶでしょう。 C#に馴れちゃってる人だと、LINQとかasync/awaitとかの機能が最初に浮かんだりします。でも、この辺りは「大きな機能」過ぎて、知ってるか知らないかの二択、1度知れば検索してすぐに解説が出てくる類で、かえって問題にならないという印象。 案外、困るのはもうちょっと細かい部分じゃないかと思います。 みたいなのが今日の話題。 辞書(ハッシュテーブル)の列挙 Dictionary<TKey, TValue>の列挙を、キーも値も両方使うのに、Keysを使ってやろうとする人が結構いるらしいという話を聞きます。要するに以下のような書き方。 using System; using System.Collections.Generic; class Prog

    小ネタ C# と他の言語との差というと
  • プログラミング言語における文字コードの話

    世の中がほぼUnicode前提になってめでたしめでたし。とはいかなかった現実の話。 String型でできる文字列処理とか、ソースコード自体、特に識別子で使える文字とか。 軽くおさらい: Unicode まあいろんなところでいろんな人が書いてると思うのでさらっと概要だけ。 Unicodeは、元々、「65,536文字あれば十分だろ」とかいう幻想の元、2バイト固定長の文字コードとして作られていました。 もちろん足りなくて、ビット数を拡張。基が2バイトのままでこの拡張した分を取り扱えるようにしたのが今のUTF-16で、拡張分は2文字分(4バイト)を使って表現。 この、2文字分使って1文字を表すやつのことをサロゲートペア(surrogate pair: 代理対)と呼びます。 あと、ASCII文字も2バイトになるのを欧米人が嫌って、ASCII文字はASCIIコードのまま、逆に漢字・ひらがな・カタカナ

    プログラミング言語における文字コードの話
  • Unity 5.5でasync/await使えた話

    Unity 5.5 ベータを入れてみたという話。 ブログ曰く、「Mono C# コンパイラー がMono4.4にアップグレードしました。」とのことなので、これ、C# 6使えるはずよね?と。 公式サポートはC# 4 リリースノートを見ると、「C# 4です」って書かれてるわけですが。 Mono 4.4のコンパイラーを使っててC# 6使えないとかお前は何を言っているんだ… まあ、標準ライブラリの方が .NET Framework 3.5相当のままなので、Taskクラスが使えない。 なので当然、普通にやるとasync/awaitが使えない。 その状況下で「C# 6対応」とか言っちゃったら、問い合わせ押し寄せてやばいでしょうから、公式には「C# 4」と言わざるを得ないのはわかります。 要するに、コンパイラー的にC# 6に対応している状況で、langversionオプションを指定してわざと4に絞ってる

    Unity 5.5でasync/await使えた話
  • C#スクリプト実行

    C#をスクリプト言語的に実行したり、インタラクティブ実行したりできるようになりました。 その実行方法や、通常の(コンパイルして使う)C#にはないスクリプト専用機能などについて説明します。 概要 いくつかの実行形態 アプリへの組み込み スクリプトとアプリとのやり取り C# インタラクティブ ウィンドウ dotnetコマンド スクリプト実行用の構文 結果の出力 トップ レベル スクリプト用ディレクティブ 概要 2015年末頃、ついにC#をスクリプト言語的に実行したり、インタラクティブに実行したりできるようになりました。すなわち、以下のようなことができるようになりました。 アプリへの組み込み アプリに組み込んで、そのアプリ用のマクロ言語としてC#を使う アプリを実行したままC#スクリプトを読み直して、動的にアプリの挙動を変える REPL(Read Eval Print Loop)実行 1行1行、

    C#スクリプト実行
  • Visual Basicの全角キーワード

    Visual Basicでは、BASIC時代からずっとですが、アルファベットの大文字と小文字を区別しないことは皆さまもご存知かと思われます。 で、実は、大文字小文字だけじゃなくて、半角全角も区別しないという。以下のコード、コンパイルして実行することもできるし、Visual Studio上ではちゃんと、Moduleとかの部分が青色(キーワードの色)で表示されます。 Module Module1 Sub Main() Dim x = 10 Console.WriteLine(x) End Sub End Module まあ、今のVisual Studio上では、全角文字でキーワードを打つと、自動補完で打ったそばから半角CamelCaseに変換されていくんで、自動補完に直されるたびにCtrl+Zで元に戻したりしないとこのソースコードを作れなかったりはするんですが。 もちろんRoslynでもいまだ

    Visual Basicの全角キーワード
  • Visual Studio 2015 Update 2がRTM & Visual Studio "15" Preview

    昨日は夜更かししていたわけですが。 Build 2016 生中継 なんか今回は「来はWindowsのイベント」らしさがあり、ほんとにWindowsの話題ばっかり。 開発ツール系の話が初日キーノートに出てこないという。 内心「やべぇ、しゃべることねぇ」とかおびえながらのひな壇芸人やってました。 危うく、ただ池澤あやかさんに会いに行くだけのミーハーになるところでした。 開発ツール系は2日目の今晩のキーノートで話すんですかね。確かに最近そういう構成になってること多い。前の方にコンシューマー受けするもの、後ろの方に開発系。 そして、キーノートでまったく触れられないまま、さらっとMSDNブログで公開されるVisual Studio。 Visual Studio 2015 Update 2 RTM Visual Studio ダウンロード ページ Visual Studio 2015 Update

    Visual Studio 2015 Update 2がRTM & Visual Studio "15" Preview
  • 参照戻り値と参照ローカル変数

    追加される構文自体は割とシンプルなんですが、活用できそうな場面まで含めて説明しようとするとなかなか骨が折れる感じの機能。 機能自体の説明: 参照戻り値と参照ローカル変数 前提知識として、値型を使わないとパフォーマンス出しにくい場面があるという話: 値型の性能 で、値型を使ってパフォーマンスを出そうと思うと参照渡しが避けられなかったりするという話: 値型の参照渡し まず、メモリ管理の方法について(スタックとかヒープとか)知ってないとピンとこないですしね。 「別の何かを参照する」って考え方も、そこそこ素養を求める概念ですし。 C言語とかC++で「ポインターは難しい」とか言われるのも、同種の問題だと思います。 ということで、GitHub上のディスカッションでも、大体は、 活用場面がよくわからない (自分は)使わなさそうなのに、複雑性を増すのには反対 構造体は immutable に作れってのが常

    参照戻り値と参照ローカル変数
  • 実行時型情報(C# によるプログラミング入門)

    で、実行時には、Width とか Height とかのメンバー名を知る必要はなく、 このレイアウトさえ分かっていればメンバーにアクセスできます。 x.Width にアクセスしたければ変数 x の格納されている場所の先頭を、 x.Height ならば x から4バイト目を見ればいいことになります。 要するに、Rect 構造体のメンバーへのアクセスは、 実行時には、以下のような(C 言語風の)コードと同じような扱いになっています。 // Rect x; char x[8]; // x.Width = 3; *((int *)(x + 0)) = 3; // y.Height = 4; *((int *)(x + 4)) = 4; 実行時型情報をサポートしない言語では、 実行時に不要な 「Rect 構造体は Width とか Height という名前のメンバーを持っている」 というような情報は削

    実行時型情報(C# によるプログラミング入門)
  • C# の式と文の一覧

    ※1 論理演算と条件演算に関しては、同列の優先順位ではなく、上から順に優先度が付いています。 ※2 クエリ式、ラムダ式、代入は同列で、例えば、以下のような C# コードを書けます。 int sum = 0; Func<IEnumerable<int>> q = () => from x in new[] { 1, 2, 3, 4, 5 } select sum += x; 結合規則 優先順位が同じ場合、クエリ式、ラムダ式、代入の3つは右から、その他の式は左から結合します。 左結合は、例えば、a + b + c + d なら ((a + b) + c) + d と同じ意味です。 右結合の例は Func<int> f = x => s += x; なら Func<int> f = (x => (s += x)); になります。 評価順 演算子のオペランドは、演算子の優先順位や結合規則によらず、

    C# の式と文の一覧