crossframe » LINQ http://crossframe.iiv.jp Windows Dev. Site Tue, 07 Nov 2023 06:31:52 +0000 ja hourly 1 https://wordpress.org/?v=3.8.41 IronPython 3.4 ../../../202311051269/ ../../../202311051269/#comments Sun, 05 Nov 2023 01:33:44 +0000 ../../../?p=1269 このブログは7年ぶりの投稿になります。その間他のブログで書いていましたが、Windowsに関連した内容をふたたびこのブログで書くことにしました。
そのきっかけとなったのは、IronPythonがまだメンテされていることからです。このブログで過去Python関連を多く扱っていることからここに書いた方が良いと思いました。

py00

早速インスツールしてLINQのプログラムを動かしてみました。

py01

ファイルに保存した .pyファイルからのipyコマンド実行でも確認しました。
Ironシリーズの他の言語は、メンテがされていないものもありますが、さすがPythonは用途があるのでしょうね。

参考)https://stackoverflow.com/questions/628482/can-you-use-linq-types-and-extension-methods-in-ironpython

]]>
../../../202311051269/feed/ 0
Azure Table Storage / LINQPad ../../../20130927438/ ../../../20130927438/#comments Fri, 27 Sep 2013 14:58:50 +0000 http://xfra.me/?p=438 LINQPadAzure

LINQPadを使う機会があったので、ついでに以前、WindowsAzure Storage Python ライブラリの投稿でテストした、Azure Table StorageをLINQPadからアクセスしてみました。

http://blog.madd0.com/2012/01/09/linqpad-driver-for-azure-table-storage/

このサイトにある、TableStorageのドライバーのcompiled and packaged を入手して、LINQPadにDriver(Madd0.AzureStorageDriver-v1.0.0-beta.lpx)をインポートします。
(Add connection -> View more drivers -> Browse..)

ドライバーのおかげで簡単にアクセスできるようになりました。

環境: LINQPad Free Edition 4.45.05 / Windows 7

このようなちょっとしたテストをBlogに残すって結構便利なんですよね。Pythonで以前やったテストも、Blogを参考にして再テストしたりしましたし、日付や前後の記事からいつごろどういった背景でやったテストかがわかったりと、自分自身に役立ちます。ツールのバージョンやインターフェイスが変わって現在では同様のテストができなくても(とくにサービスからみとか)、エビデンスとして残っていると、どこまでできたかがよくわかります。

と、つくづく思ったテストでした。

]]>
../../../20130927438/feed/ 0
WindowsストアアプリでF# ../../../20130608279/ ../../../20130608279/#comments Fri, 07 Jun 2013 15:56:27 +0000 http://xfra.me/?p=279 最近のLINQネタの勢いで、F#に手をだしてしまいました。これまでLisp, Haskell, Clojure, Scalaなどなど関数型言語の勉強はしつつも、なかなか使う機会がないので、まったく身につきませんでした。本ばかりがたまる一方です。そして今度はF#。また同じ運命をたどるかも。
しかし今回は、Windowsストアアプリでも使えるということで、具体的な形になる可能性が高いという期待があります。(最近の流れからして動機としては十分です。)F#だけですべてを作るのではなく、C#から呼び出す形でデータ操作を専門にする使い方なら、かなり実用性があるのではと感じました。
オブジェクト指向言語は、WindowsなどのGUIの出現とともに必要とされ生まれ、そして関数型言語はインターネット時代、CPUマルチコア時代に必要とされ生まれてきたのでは、と思っています。最近の他の言語の傾向を見ていても、その必要性が今まで以上に感じられるようになってきました。
xamlListbox1
サンプルは、C#+XAMLのWindowsストアアプリから、正規表現の部分を記述したF#の関数を読んでいます。
結果は、ListBoxに書き出します。
正規表現の部分は、「実践F#関数型プログラミング入門」(技術評論社)を参考にしました。

環境 : VisualStudio 2012 / Windows 8

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

namespace csfsStoreXaml02
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }
        private void Button_Click_3(object sender, RoutedEventArgs e)
        {
            var t = Module1.test3("ABC123-456,789");

            foreach (var v in t)
            {
                listBox1.Items.Add(v);
            }
        }
    }
}
module Module1
open System.Text.RegularExpressions

let re = Regex("[0-9]+")
let test3 x = 
    re.Matches(x) 
    |> Seq.cast<Match> 
    |> Seq.map(fun m -> m.Value) 
    |> Seq.toList

これが積極的に業務でも使えればいいのですが、まだ難しい状況が続くことと思います。それはあまり使われない言語を使うと保守性が悪くなるため、これを嫌う傾向は強いからです。これは十分理解できます。
最近Rubyですら使えないことがありました。データコンバートのツールを作るとき、開発時間でJavaの1/4くらい、コード量では約半分でしたが、Javaで作ることになりました。実際はプロトタイプはRubyでつくり、それをJavaに移植した後作りこみ、という形でやりましたが、基本仕様がすでに動いているということは、とても心強かったです。
F#もこのような使い方ができれば意義あることかもしれません。

ちなみに現在開発中のWindowsストアアプリとは、F#はまだまだということで、JavaScript+SVGのものと、C#+XAMLです。
しかし最近のMicrosoftの言語環境は、本当にマニアックすぎる!?

]]>
../../../20130608279/feed/ 0
LINQ / VSTO ../../../20130519266/ ../../../20130519266/#comments Sat, 18 May 2013 15:51:15 +0000 http://xfra.me/?p=266 VSTOとは、Visual Studio Tools for Office の略です。前回WebのTableでやったLINQによるソートをExcelのシートでやってみました。ExcelのシートのプロクラムといえばVBAですが、前からC#でやってみたいと思っていて、だったらLINQだよね、となり、今ちょうど調査しているし、という流れでテストしてみました。

環境 VSTO / Visual Studio 2010 & Excel 2010 / Windows 7
プロジェクトは、Visual C# -> Office -> 2010 -> Excel 2010 ブック です。

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using Microsoft.Office.Tools.Excel;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;

namespace ExcelWorkbook
{
    public partial class Sheet1
    {
        private void InternalStartup()
        {
            this.button1.Click += new System.EventHandler(this.button1_Click);
        }
       private void button1_Click(object sender, EventArgs e)
        {
            DataTable table = new DataTable();
            Excel.Worksheet activeSheet = ((Excel.Worksheet)Application.ActiveSheet);

            table.Columns.Add("c1");
            table.Columns.Add("c2");
            table.Columns.Add("c3");
            for (int r = 1; r <= 6; r++)
            {
                table.Rows.Add(activeSheet.Cells[r, 1].Value, activeSheet.Cells[r, 2].Value, activeSheet.Cells[r, 3].Value);
            }
            var data = from dt in table.AsEnumerable()
                       orderby dt.Field<string>("c2")
                               select new
                               {
                                   a = dt.Field<string>("c1"),
                                   b = dt.Field<string>("c2"),
                                   c = dt.Field<string>("c3")
                               };
            int i=1;
            foreach (var d in data)
            {
                activeSheet.Cells[i, 1].Value = d.a;
                activeSheet.Cells[i, 2].Value = d.b;
                activeSheet.Cells[i, 3].Value = d.c;
                i++;
            }
        }
    }
}

table2

ボタンを押すと、中央の列がソートされます。

table3

VSTOって興味がありつつもなかなか使う機会が少ないのですが、やっばりまだVBAなのでしょうか。という私もVBAの手軽さはとても便利なので、よく使うのですが・・

]]>
../../../20130519266/feed/ 0
LINQ and jQuery ../../../20130518256/ ../../../20130518256/#comments Sat, 18 May 2013 14:40:33 +0000 http://xfra.me/?p=256 最近LINQを使っていて、いろいろと調べていたところJavaScriptでの実装があることを知りました。

jQueryと「linq.js」を連携させてDOMをLINQにより処理するには?

http://www.atmarkit.co.jp/fdotnet/dotnettips/1059linqjquery/linqjquery.html

jQueryのオブジェクトに変換できるということなので、すごく興味がありテストしてみました。
jQueryは、メソッドチェーンで少ないコーディング量で複雑な処理が記述できることでとても好きなのですが、LINQもメソッドチェーンが使えることから、とても相性がいいと感じました。

環境:IE9 / Windows7

<html>
<head>
<script src="jquery-1.9.1.js" type="text/javascript"></script>
<script src="jquery.linq.js" type="text/javascript"></script>
<script type="text/javascript">

var dict;
var dt;

$(document).ready(function(){

	dict = $.Enumerable.Empty().ToDictionary();
	dict.Add("k1", [1001,"be","JKL"]);
	dict.Add("k2", [2, "abc","IIIII"]);
	dict.Add("k3", [300, "d1", "H"]);
	dict.Add("k4", [40, "col", "EFG"]);
	dict.Add("k5", [55, "f0000", "BCD"]);
	dict.Add("k6", [666, "eeee", "ABC"]);

	dataSet();
});
function dataSet(flg){
	var d = dict.ToEnumerable();
	
	if(flg > 0){
		flg --;
		d = d.OrderBy("$.Value["+flg+"]")
	}
	dt = d.Select(function (x) {
			return $("<tr/>").append($("<td/>").append(x.Value[0])).append($("<td/>").append(x.Value[1])).append($("<td/>").append(x.Value[2]))[0]
		})
		.TojQuery();
	
	dt.appendTo("#dt");

}
function btn(n){
	$('#dt tr').remove();
	dataSet(n);
}
</script>
</head>
<body>
<table border="1" id="dt"></table>
<input type="button" value="o1" onClick="btn(1)">
<input type="button" value="o2" onClick="btn(2)">
<input type="button" value="o3" onClick="btn(3)">
</body>
</html>

ボタンを押すとそれぞれのカラムのデータでソートして表示します。

table1

LINQの特徴の一つとして、DBのSQL文を文字列として分断して記述するのではなく、プログラム言語の一部として記述できる点があります。これもいいのですが、私はDBのSQL文がメモリのデータに対して使える点が便利に思っています。(LINQのクエリ式とSQL文はイコールではありませんが) SQL文と同じことをプログラム言語で書き換えようとすると、結構手間だったりするからです。

このlinq.jsライブラリは、jQueryとLINQとオブジェクトが相互変換可能なので、一つのメソッドチェーンで記述が可能です。これ、すごい!

サンプルは以前JavaScriptのフレームワークでこんな機能を使っていたと思いだし、作ってみました。JavaScriptでサーバからデータをJSONで取得してそれをブラウザで加工するということは、結構あります。そういった用途に使えそうです。ちなみに最新のJQuery 2.0.0では、IE9上で動作しませんでした。Firefox,ChromeはOKです。

ライブラリの中には詳しいリファレンスと実行テストができるファイルがあります。LINQの勉強するのにとてもいいかもしれませんね。

]]>
../../../20130518256/feed/ 0
C# LINQのクエリ式 ../../../20130503247/ ../../../20130503247/#comments Fri, 03 May 2013 14:02:13 +0000 http://xfra.me/?p=247 C#5.0の言語仕様で追加された、非同期処理を同期的に記述できるasync/awaitメソッドについても興味があるのですが、次々と新しい仕様を取り込むC#自体にとても興味があります。その中でもLINQはとても面白い深い存在なので、ちょっとまとめてみたいと思います。
環境: VisualStudio 2012 / Windows 8
プロジェクトは、C#コンソールアプリケーションです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var q0 = Enumerable.
                Select(Enumerable.Where(Enumerable.Range(0, 10), p => p > 5), q => q * q);

            foreach (var v in q0)
            {
                Console.Write("q0:{0}\n", v);
            }

            var q1 = Extensions.MyAdd(Enumerable.
                Select(Enumerable.Where(Enumerable.Range(0, 10), p => p > 5), q => q * q), 2);

            foreach (var v in q1)
            {
                Console.Write("q1:{0}\n", v);
            }

            var q2 = Enumerable.
                Range(0, 10).Where(p => p > 5).Select(q => q * q);

            foreach (var v in q2)
            {
                Console.Write("q2:{0}\n", v);
            }

            var q3 = Enumerable.
                Range(0, 10).Where(p => p > 5).Select(q => q * q).MyAdd(2);

            foreach (var v in q3)
            {
                Console.Write("q3:{0}\n", v);
            }

            var q4 = from p in Enumerable.Range(0, 10) where p > 5 select p * p;

            foreach (var v in q4)
            {
                Console.Write("q4:{0}\n", v);
            }
            Console.Read();
        }
    }
    public static class Extensions
    {
        public static IEnumerable<int> MyAdd(
          this IEnumerable<int> x, int a)
        {
            foreach (int v in x)
            {
                yield return v + a;
            }
        }
    }
}

q0,q2,q4とq1,q3は、それぞれ同じ値を出力します。
36,49,64,81
38,51,66,83

クエリ式の3つのバリエーションのテストをしました。
1つ目が、スタティックメソッドの入れ子、2つ目がメソッドチェーン、3つ目がクエリ式です。
そして、スタティックメソッド、メソッドチェーンについては、MyAddという拡張メソッドを定義してそれを利用しています。(クエリ式でもやる方法はあるのかな? Rxを使う?)
言語仕様がどんどん変化している様子をまとめてみました。

オブジェクト指向言語の次の言語として注目されている関数型言語というものがありますが、新しいもの好きの私ももれなくHaskellとか勉強したことがありました。しかしどのように使うと便利なのか等、なかなかその概念が理解できませんでした。このLINQを触っていると、関数型言語の特徴の一つの遅延評価というものが、とてもよく理解できます。上の例でMyAddメソッドがまさにそれにあたります。このメソッド中のyield return という構文が、それを実現しているのですが、これは必要になったときに実行されます。必要になったときというのは、定義されたときではないということです。もともと関数というのは、宣言・定義・記述しただけでは実行されず、呼び出されたとき・使われたときに実行するので、関数型という言い方も腑に落ちるというわけです。
あと、冒頭に非同期処理のことを少し触れましたが、この非同期を記述するのにもLINQを使うことができるようです。ReactiveExtensions(以下Rx)と呼ばれるものですが、これはこれでとても興味深いので、また別の機会に掘り下げたいと思います。このRxの非同期処理のプログラムを見ていると、JavaScriptのjQuery.Deferredに似ています。もともとAjaxという非同期処理を有名にしたJavaScriptなので、これも腑に落ちるところですが、jQueryの非同期処理を連続して実行してもコードが見やすいしくみになっています。(メソッドチェーンという言い方も、私はjQueryのことをイメージして使っています。)
WindowsストアアプリのAPIがほとんど非同期になるということからも、このようなトレンドはどの言語も取り入れているということなのでしょう。
関数型言語にいきなりジャンプアップするのは難しいかもしれませんが、このようにLINQとかRxで徐々に体を慣らしていくと、いいのかもしませんね。オブジェクト指向もRubyで学習すると理解がしやすいという意見もあったりしますし、いろんな側面から技術を見るということは大切なことかもしれません。

]]>
../../../20130503247/feed/ 0