C#やるんならLINQ!!
この記事は TUT Advent Calendar 12日目の記事です!
みなさん、お久しぶりです。
技術ブログとして立ちあげましたが、全然記事書かないまま1年が過ぎました(べ、べつに書くネタがないわけじゃないんだからね
TUTに来て、新しい友達も増えて楽しい日々を送ってますよ。講義も後期から大幅に減ってUnityのアルバイト始めたり、趣味も新しく増えたり。もちろん今年のクリスマスも予定空いてますよ?
C#!!
さてさて、本題に入ります。C#便利ですよね。
プロパティ、ファイル操作、非同期処理、WPF、Azure・・・などなどWindows環境で動くソフトウェアに特化してます。最近ではUnityでも定着してますし、Visual Studioとの連携がよくとれているので自分のお気に入り言語ナンバーワンです。
そんな便利なC#でLINQっていうの知ってますでしょうか??(九州の某アイドルではありませんよ
周りにちょこっと聞いてみましたが、初めて聞いたって人や、知らずに使ってた人などあんまり知られていないのかなと思いましたね。ですので、今回ぜひC#erにこの便利な機能を紹介したいと思い記事を書きました。
では逝きますか!(1919
LINQってそもそもなんぞや??
まずは、そもそもLINQって何者かを紹介します。
LINQはLanguage-Integrated Queryの略で日本語では、統合言語クエリと言われてます。
クエリって何?って思った方。クエリとは「問い合わせる」という意味で、一般的にデータの問い合わせ要求に使われます。一番わかりやすいのがデータベースとかですかね。あるデータベースにあるテーブルから、条件に合うカラムを持ってくる命令を1つの文字列として表現します。例えばこんなの
mealというテーブルから値段が1000円未満の商品名を出す、クエリーの例です。
こういう感じでデータの問い合わせに関する構文を並べるだけです。実はLINQもこれと同じで
っというものです。じゃそのデータって何に対して言っているのかというと、配列・リスト・オブジェクトを指してます。
LINQにもいろいろ種類があります。
- LINQ to Objects(配列、コレクション、任意のオブジェクト)
- LINQ to Entities(Entity Framework経由でのデータベース)
- LINQ to XML(ざむる)
- LINQ to SQL(SQL サーバー)
今回はLINQ to Objectをメインにやっていきます。
何ができるの??
LINQの正体をざっと伝えたところで、何ができるかを紹介します。
LINQは配列やリストに対してデータの問い合わせ・更新などを楽にできるようにしようっというものでした。これらのデータ構造を使うっということは、あるデータを一時的に格納しておき、その要素に対して何か操作を行うってことです。
例えば、整数の入っているリストから5以上の整数リストを新しく欲しい時、こういう感じで書きませんか?
リストを反復構文で回してif文で条件に合う数値を新しいリストに追加しています。
なんか、単純なことをしているだけなのにこんなので10行近くも使っているのが、なんか嫌ではありませんかね?
しかし、LINQを使ってあげると以下のようになります。
結果の表示をもうちょっと変えてみましょう。
なんと、LINQを使ってあげることでここまで省略されました。10行使っていた処理が3行になりましたね。これが
です。
コードをよく見ると反復構造であるforやforeachがありません。LINQを使うことによって書く必要性が無くなったんですね。
初めて見る方にとっては気持ちの悪い書き方であると思います。私もそうでした。しかし簡単な例から学んでいくと自然にこっちの書き方が欲しくなりますよ?(麻薬と一緒だね)
LINQとしてできることは、
です。そのためにLINQでは多くのメソッドが提供されています。
できることは、Sample1-3のような条件検索以外のもたくさんありますが。ここでは主に使うだろうものだけ書いておきます。
LINQを使ってみよう
じゃ、この便利なLINQをどうやって使えばいいのか。簡単です。ソースのusing欄に
これを追加するだけで、使えるようになります。Visual Studioの場合プロジェクトを作成すると自動的に追加されてるはずです。
ちなみに、LINQの処理をして結果を格納するとき返り値はList<T>にはなりません。IEnumerable<T>型になるので注意してください。
Select()
格納している要素1つずつに対して関数を適用して返します。情報数学で言う写像に似ています。
サンプルでは、リストの要素に対して「x * x」という関数を適用して返しています。つまり2乗した数が返ってきます。
格納しているデータに対して加工を行うのは頻繁にあることなんで、覚えておきましょうね。
Where()
Sample1-3で出てきたWhere()です。これは、条件に合う要素をフィルタリングして返すっということをしています。
サンプルでは、リストの要素のうち偶数である数値をフィルタリングして返しています。じゃ、AND演算のように複数条件はできるのか?できます
先ほどの条件に5未満であるを追加しました。これで反復構造中のif文の代わりになります。
Count()
特に説明することはなく、ただ要素数のサイズを取得します。
Sort()
指定した要素でソートします。OrderBy()を使うことによって他クラスにある要素でのソートが可能になります。
サンプルは、Playerクラスを作って要素としてHPと名前を持っています。リストの初期値にPlayerクラスを4つ挿入しておき、HP順とアルファベット順でそれぞれソートを行うものです。
実行結果は以下の通りで、きちんとHP順とアルファベット順でソートできていると分かります。
降順にしたい場合はOrderByDescending()を使います。
その他
結構種類あるので紹介しきれないです。リンクを張っておきますので、各自で調べてみてください。
.Net(VB C#) LINQのメソッド一覧:http://yan-note.blogspot.jp/2015/11/netvb-clinq.html
ちょっと応用
LINQの各メソッドはそれぞれ繋げることができます。例えば、リストにある要素を全て2倍にして14以下である数値が何個あるか調べる場合、
このように
の流れが自然に組めるのもLINQの特徴の1つです。
遅延評価
本当ここがLINQの一番大事なところなんですが、正直もう書く気力がありませんのでまた別の記事に書きたいと思います。
まとめ
LINQはコレクションに対してデータの操作を簡単に記述できるようにするためのものです。そのおかげで、生産性やコードの可読性がぐぅんと上がります。
使うことができるメソッドが大量にあるので暇なときに調べてみると使えそうなものがヒットするかも。
明日はドイツの鳥で有名なあしゅりーさんの「座標で見る"TUT大学構内のレッドブル自販機100選"」です!。
Unity5でボールの跳ね返り!
先日、Unity 5がリリースされましたね!
私も2年前にプロコンの時にお世話になりました。そのせいで、しばらくUnity拒絶症にかかって、触っていなかったのですがせっかくのリリース。
流行に乗ろうではないか!!
Unityの機能を久しぶりに見ると、効果音・BGM編集用のミキサーがついてたり
Unity - Upgrading Unity 4 Audio Part 1: Mixers and Effects
64bitに対応したりといろいろ新機能が増えていました。まだUnityをフルで活用できないけど、いつかはストアにリリースしたいですね。
ってことで早速インストールしましょ。
無料のPersonal版を選択。なんか製品発表の時にスプラッシュ画面をつけてて、前年度の収入が何$以下なら無料版の機能制限が撤廃して使えるみたいな話し聞きましたけど、よく分かってないです。
さくさくっとインストールしたら起動しましょ。
おーなんか、前よりかっこよくなってる。右上のNew Projectを選択
適当にプロジェクト名を「BouncingBall」にしてCreate project。
起動画面。画面の構成自体は前と変わっていないようです。
Unity入門(2)- Unityの画面構成 | Developers.IO
今回の目標は、ボールを上から床に向けて自然落下させて遊んでみることなので、まずはゲームオブジェクトのボールと床を作ります。
・床の作成
左上のメニューからGameObject->3D Object->Cubeを選択。
するとこんな感じに立方体が作成されます。
今回は床にしたいってことで、赤枠にあるTransformでScaleをいじります。
x = 20,y = 0.2,z = 1にするといい具合の床が完成。Positionも分かりやすいようにx = y = z = 0にしました。
・ボールの作成
GameObject->3D Object->Sphereを選択。すると床同様にシーン画面に球体が表示されます。Potisionをx = 0,y = 10,z = 0にします。
ボールを落とした時にz軸が床と合っていないと、そのままスルーしちゃいますので気をつけて。
・カメラの調整
ではでは、早速実行してみましょう。シーン画面の上にあるプレーボタンをクリック。
あれ?ボールはどこ????
実際ボールは存在していますが、たまたまカメラに見えていないだけです。なので、実際のプレイ画面のシーンを見るにはカメラの位置をいじってあげないといけません。
プレーボタンを再度押して編集に戻して、シーン画面にあるカメラっぽいオブジェクトをクリックしてください。
すると左下にCamera Previewが表示されます。これが実際にカメラが見ている風景なので全体像が見えるようにPositionを調整します。
今回だとx = 0,y = 5,z = -10ぐらいですかね。再度プレーボタンを押すと。
うん!いい感じになりました。
・ボールを落下させる
さて、このままではボールは落ちてきません。オブジェクトを配置しただけではただの置物なので、落下させるにはボールに物理シミュレーションを適用させなければいけません。そこでUnityには、Rigidbodyっというのがあります。
これを追加するだけで、なんと自動的に物理運動の制御をやってくれます!!
しかも空気抵抗やトルクによる空気抵抗、質量により変化もパラメータをいじるだけでおまかせ。
シーン画面でボールを選択して、左側のInspector画面下にあるAdd ComponentからPhysics->Rigidbodyを選択。
各パラメータの説明をすると
Mass:オブジェクトの質量
Drag:オブジェクトが受ける空気抵抗
Angular Drag:回転により受ける空気抵抗
Use Gravity:重力を適用させるか
Is kinematic:物理シミュレーションは適用されないが、スクリプト制御のみで動くことができる
Interpolate:フレームの補完などの設定
Collosion Detection:高速に動くオブジェクトですり抜け防止を行う
今回は重力さえあればいいので、Use Gravityにチェックをいれるだけでいいです。プレーにしてちゃんと落ちるか確かめましょう。
落ちたな(確信)
・ボールに跳ね返りをつける
ボールも無事落下したので、今度は跳ね返りをつけます。
Unityには、先ほどあったRigidbody以外にも様々な物理シミュレーション用の項目があります。
メニューからAssets->Create->Physic Matrialを選択。
これは物理特性マテリアルと言われており、摩擦や跳ね返り係数の調整ができます
各パラメーターの説明めんどいんで、上記の公式マニュアルを読んでくださいw
跳ね返り係数をいじるのでInspector画面にあるBouncinessをいじります。
デフォルトだと跳ね返り係数が0なので全く跳ね返りませんよね。
ころんさん!跳ね返り係数分かりません!って方はこちらへ↓
だいたい0.99ぐらいにするといい具合に反発してくれます。いろいろいじってみると面白いですよ。
数値の設定をしたらAssetsフォルダにある物理特性マテリアルをドラッグ&ドロップでCubeに適用させます。CubeのInspectorのBox Colider->Materialからも設定できます。
適用し、プレーを押すとボールが跳ね返ってくれるのが確認できると思います!
・まとめ
今回は、ボールに物理シミュレーションを適用させて簡単な跳ね返りシミュレーターを作りました。まだまだUnityには面白い機能が盛りだくさんなので、今後も自分のプロジェクトを進めながらまとめて行こうと思います。
これからも進化し続けるUnityに期待しましょう!!
Intel Edison Breakout Board~開発準備 その1~
Intel社から今年日本で10月に発売されたばかりのAtom搭載の超小型コンピュータ「Edison」を入手しました!!
12月13日にOPTiM社主催の勉強会に参加した次の日に、ぶらぶらと秋葉原にある秋月電子に寄ったのですが
学校のメカトロ部のほうからこういうデバイスがあると聞いていましたが、ここで会えるとは。早速、部のLineで欲しいか?と聞いたところ「欲しい!!欲しい!!」との返事。本来買う予定では無かったですが、買ってきましたよ(同人誌もっと買う予定だったのに...)
買ってきたのは、Edison Breakout Boardのほう。もう一つEdison Kit for Arduinoがありましたが、ちょっとお値段張るのでBoardを選びました。
ちなみに秋月やAmazonでも買えますので是非
Amazon.co.jp: Intel Edison Breakout Board Kit Edison本体+Breakout基板: パソコン・周辺機器
Amazon.co.jp: Intel Edison Kit for Arduino Edison本体+Arduino基板: パソコン・周辺機器
あと、モジュールとPCをつなぐUSBケーブルですが、2本必要です!
「Aオス----マイクロBオス」× 2がないと開発ができないようなので、忘れずに買いましょう。秋月だと1本120円でした。
Edisonの箱とUSBケーブル2本
中身はこんな感じ。
Edison本体×1
Breakout Board基板×1
Edison固定用ナット×2
SDカードを上に乗っけてみましたがEdison自体は本当に小さいです。こんなに小さいのにこれだけのスペック。取り扱いが怖い
Breakout Boardと接続した後の様子。EdisonをBoardに乗せてそれぞれのコネクタを接続した後に、ナットで締めます。
さてさて、いよいよ本題の開発環境の構築に行きます。
まずは、Intel社のサイトからEdisonのドライバーをインストールします。リンク先にあるページの一番下の「Windows Driver setup 1.0.0」ってやつです。
Edison - Software Downloads | Intel Communities
インストール画面。そのままぽちぽとNext押していくとインストールが始まります。
無事インストールが終わったら、次はPCとのシリアル通信を行うためのドライバー
をインストールします。
winユーザーは「setup executable」からインストラーをダウンロードしてください。管理者権限がないと実行できないので一旦どこかに落としておいたほうが楽です。
これもインストールが終わったら、いよいよUSBと接続です。
まず先に、写真の赤い方にケーブルを刺します。FTDIチップが乗ってるそうなんで先に挿しちゃいましょう。
そしたら、自動的にデバイスインストールが始まるので、終わったらデバイスマネージャーに行ってポート番号を確認してください(今回の場合COM5)
次に、TeraTermのような仮想ターミナルでEdisonに接続します。
Tera Term (テラターム) プロジェクト日本語トップページ - SourceForge.JP
シリアルでポートを先ほどデバイスマネージャーで確認したポートを選択。
設定->シリアルポートでポートレートを115200bpsに設定
設定が完了したら、もう一つのほうのUSBを接続してください。すると、Breakout Board上のLEDが光ります。
TeraTermではこんな感じで、私の好きなBoot画面がずらずらと流れてくるはず
edison rogin : って出てきたら「root」と打ち込んでenter押すとこんな感じ
rootに入れました。ここまでで第一段階です。
次はEdisonを自分用に調教しましょう。
・バージョンの確認
Edisonのファームウェアのバージョンを調べます。
Teratermに「cat /etc/version」と打ち込んでください。
なんかバグでキーボードに一番最初に打った文字が出ないようですが、1回Deleteキーで消して再度入力するとちゃんと出てきました。
最新のバージョンはきっとどこかに載ってます(知らない)
・名前を変更する
せっかく買ったEdison。自分の好きな名前にしちゃいましょう。
コマンドで「configure_edison」入れて実行
こんな感じの画面になります。最低でも5文字以上入れないとダメだそうです。
名前を決めたら再度Enterキーで確認が取られるので良ければ「Y」、再度入力する場合は「N」
・パスワードを変更する
名前が決まったら自動的にパスワード変更に移ります。初期パスワードは「root」でしたので、セキュリティのために変更しましょう。
スクショ撮り忘れました(*ノω・*)テヘ
上記の同様、良ければ「Y」を入力で次にいきます。
・Wi-Fiに接続する
さぁいよいよEdisonをWi-Fiに接続します。自動的にスキャンが始まりますが、やはり受信環境が良くないと上手くできないそうです。
こんな感じに、使っているSSIDがずらっと出ればOKです。何回やっても出ない場合は無線親機に近づけるなどしたら出やすいかも。
接続したいネットワークを選んでパスワードを入力してあげると、Doneと表示されます。なんかPlease go to 192.168.1.13って書いてあるんで試しに接続してみましたが、何も表示されませんでした(pingとかarpで接続は確認できたんでいいのかな?)
試しに「ifconfig」と打つと、wlan0にデバイスのMACアドレスとかIPアドレスとか出てればOKです。
・ファームウェアのアップデート
まだまだ出たばかりのEdisonですが、これからアップデートが頻繁に起こると予想されるのでできるようにしちゃいましょう。
今まで開いてたTeraTermは一旦Edisonと接続を切ってください。
最初の方にEdisonドライバーを落としてきたページに飛びます。
Edison - Software Downloads | Intel Communities
そのページの真ん中にある「Edison Yocto complete image」をダウンロードしてください。
ダウンロードしてきたzipを開くとこんな感じ。
これらのファイルすべてをマイコンピュータからEdison(:F)を選びコピーします。たまにEdisonの中にファイルがあるそうですが、それは先に消してから zipの中身を入れます。
ファイルを移したら、再度TeraTermを開き、「USB Serial Port」を選んで、もう一度115200bpsに設定します。
設定が終わったらEnterキーを2回ぐらい押しちゃってください。1回だけだと反応しない場合があります。
決めたEdisonの名前 login:が出たら「root」と打って、パワワードも先ほど自分で決めたのを入れます。
ここでも、一番最初に打った文字が出てこない症状がでるので、Deleteキーとかで戻って、再度入力するとrootに入れます。
「reboot ota」と打ったらアップデートと再起動が始まります。
デバイスによっては5分とかかかるそうなんで、終わるまでUSBケーブルを抜かないように注意。
再起動が終わったら、再度rootとパスワードを入力して「cat /etc/version」でアップデートされているか確かめます。
アップデート操作する前と変わっていなかったので買った時から最新ファームウェアだったようです。
とりあえず、ここまでお疲れ様です!!
やっと開発準備その1が終わりました。基本的なデバイスとの接続方法とアップデート方法は覚えておいたほうがいいと思います。
次回は実際にLEDチカチカ、通称「Lチカ」でもやってみようと思います。
謎の多いデバイスですが、これだけ高性能なモジュール・・・どんどん普及していって欲しいです。
それでは(*・∀・)ノ゛
ころんとTUT
みなさん初めまして!ころんPです!!
あいぇぇえええ
— ころんP@ImagineCup頑張るのん (@Collonville) December 6, 2014
現在は富山高専射水キャンパス電子情報工学科5年に在籍しております。なぜこのような記事を書いているかというと、来年の春からTUTに編入で入ってくるからなんです。
もうすでに数人の先輩方とお会いしましたが、ころんがどのような人物なのか分かってもらうのに良いチャンスかなと。そのうちプログラミングの話もしていきたいと思っています。
さてさて、ころんは一体何ものか。正直自己分析は苦手なので一言で表せないのでTUTの編入までの流れを書きていきます。
元々、高専入学する前から電子回路や情報工学に興味があって、自分で秋月でパーツを買って電子工作をしていろいろと遊んでいました。中3の時に高校の学校紹介がありましたけど、高専の紹介を聞いた時には「もうここしかない!」と決断して入学しました。
この判断が、正しかったか間違っていたかは未だに分からないです。
私が入学した当時は、旧商船高専と旧工業高等専門学校が1つに合併してスーパー高専という名で新入生に宣伝していましたね。今見れば他の高専と比べて大したことしていないような気がします(もっとヤれよ!!!
そんな中、高い倍率をくぐり抜けて電子情報工学科として入りました。 そして部活動を決めるときにソフトウェ系の旧コンピューター部(今はデジタルメディア創作部)かハード系のメカトロ部に入ろうか悩んでましたね。どちらもプロコンや、ロボコンに出場していて両方入たかったですが、なんやかんやで旧コンピューター部に入部しました。
部では、プロコンや自作ゲームを作っている先輩方を見ていろいろと刺激を受けました。そうしてプログラミングを勉強していくうちに3年後には部長として部を率いていきました。徹夜で作った宣伝動画のおかげで新入生確保も順調に進んでいき、私が入部した頃は数人しかいなかった部が、今では40人います。そして5年になった今も部長をしています・・・。
プロコンへの参加も活発になり、以前は予選落ち続きでしたがなんとか今年で2年連続本戦出場へ導くことも出来ました。
ちなみに高専時代作ったものはだいたいこんな感じです↓
赤外線LED100個点灯させるための回路作ったり
FTIRディスプレイとUnityを使ってサンドアートシミュレーター作ったり
DTNとMANETを使って災害用のコミュニケーションツールを作ってみたり
こんな感じで、ハードからソフトまでいろいろ開発しました♪
その分、徹夜続きで在学中に不整脈になっちゃいましたけど!!その他にもKinectで体感型音楽ゲームとかTwitterのツイート内容を解読してハードウェアを制御したり、Androidタブレットを使ってタイピング育成アプリを作ったりしました。
基本的に「作りたいと思ったものは、作ってしまおう!」精神でやっています。
こんな感じで高専時代にいろいろ作ったんだなぁとお分かりいただければ幸いです。
扱える言語は、C・C++・C#・Javaです。最近はJavaScriptとGoが面白そうなのでやってみたいと思います。
5年になって進路を決めないといけない時期が迫ってきたのですが、TUTに関しては事前に下調べをしてもうここにしようかなと4年の時から決めていました。インターンシップでTUTの画像情報メディア研究室に2週間お世話になり、そこでAR技術や画像処理について学んだのがきっかけですね。
エピ曲線!?なにそれおいしいの??とか思いながら、携帯電話も圏外になる環境でしたけど、やっぱり高専生特有のノリが好きでこの大学でもやっいけそうだなと思いました。
学力入試の後にゆdieさん、アレンくん、おわわさん、いさおさん、他のTUT生(ごめんなさい、あの後人数増えすぎて覚えてないです。許してください、なんでもしますから)にお世話になり、なんとか試験に合格しましたよ。正直他の進路決めていなかったので危なかったですが。
ってことで来年からそっちに行きますね!!
ちなみに今は、ImagineCupに挑戦中です。最近話題のウェアラブルデバイスとビッグデータを使った健康管理システムを開発中で、TUT入学してからも忙しい状況が続きます。
話は変わりまして、趣味についても書いていこうと思います。
Twitterのほうにも書いてあるのですが、ボカロ(IAちゃん)を使って作曲してます。
マイリス↓
基本的にVOCALEAMOやVOCAMETALなどのジャンルを目指していますけど、なかなか思うように作れないです。。。ここ2年間はプロコンや進路で時間が取れなくて全く作曲に手を付けていません。
好きな曲のジャンルは主に、エモーション、スクリーモです。激しくてドゥンドゥンやっているのが好きです。他にもアニソン、ジャズはよく聞きますよ。
高専バンドでギターやってます。TUTでも軽音楽に入ろうと思ってます。豊橋のライブハウスは盛り上がりがないって聞いたんですけどどうなんですかね?気になります。
Myギターたち。7弦楽しいです
メインエフェクターのPOD HD PROとFURMAN。中音とジャリジャリ感の扱いが難しいのが難点・・・
プログラミングも一種の趣味に入ると思いますけど、ここではあえて書かないでおきます。これからそういう記事が増えると思うので。
とまぁ、長文になりましたがころんについて少しでもお分かり頂けたでしょうか。TUTに行ってからは、コンピュータクラブと軽音楽に入ります。プロコンやバンド組んでライブとか出たいです。
それでは4ヶ月後を楽しみにしています(っ´ω`)っ