2014/05/02

また続くかどうか不明の新シリーズ。今日書いたワンライナーを記録していきます。

今回は、配列に含まれる要素のうち、もっとも出現頻度の多いものを調べる方法です。たとえば、0, 0, 0, 1, 0, 3, 0, 2, 0, 2という配列がある場合、「0」は6個含まれており最も要素数が多いので、この場合「0」を出力します。

ワンライナーは以下のようになります。(配列変数の宣言を合わせると2ラインですけど)

$array = 0, 0, 0, 1, 0, 3, 0, 2, 0, 2
$array | group | sort Count -Descending | select -First 1 | select -Expand Name 

今回のケースのように、「配列内に同一の要素が含まれており、要素ごとに纏める」という手順が必要なときはGroup-Objectコマンドレット(エイリアス:group)の出番です。

$array | group とすると、

Count Name                      Group
----- ----                      -----
    6 0                         {0, 0, 0, 0...}
    1 1                         {1}
    1 3                         {3}
    2 2                         {2, 2}

のような出力が得られます。Count=出現回数、Name=要素、Group=該当する要素のリスト です。なのでこの出力だけでお題の解答である「0」が確認できます。あとはこの出力から求める値を抽出するだけです。

Group-Objectコマンドレットの出力はGroupInfoというオブジェクトです。そう、これもオブジェクトなので、他のオブジェクト同様、プロパティ情報を保ったまま後続パイプラインに渡すことができます。

まずSort-Objectコマンドレット(エイリアス:sort)を用いてGroupInfoのCountプロパティの値で降順ソート(-Descendingパラメータ使用)をかけます。するとCountプロパティが一番大きいGroupInfoオブジェクトが一番最初の要素となります。(今回の場合はたまたまソート前後で最初の要素が同じでしたが)

次にSelect-Objectコマンドレット(エイリアス:select)に-First 1と指定することで一番最初のGroupInfoオブジェクトのみ取得します。最後に、GroupInfoオブジェクトのNameプロパティの値だけを取りだすのにSelect-Objectコマンドレットに -ExpandPropertyパラメータを指定します。

ところでGroupInfoオブジェクトのGroupプロパティ、どうせNameと同じものがCount分列挙されるだけじゃないか何の意味が?と思われるかも知れないので補足です。Group-Objectコマンドレットには-Propertyパラメータ(位置パラメータなのでパラメータ名は省略可能)が定義されており、指定すると任意のプロパティ値に基づいてグループ化してくれます。

たとえば

dir | group Extension

とすると、カレントディレクトリに含まれるファイルが拡張子別にグループ化され、以下のような出力が得られます。

Count Name                      Group
----- ----                      -----
    1 .gadget                   {twitterpost.gadget}
   59 .vbs                      {7zip_fix_archive.vbs, 7zip_store_each.vbs...}
   72 .ps1                      {cddrive.ps1, clipboard.ps1, cmdlets.ps1...}

このようにGroupプロパティの中身は、指定プロパティ値を持つ要素のグループとなっていることが分かると思います。

-Propertyパラメータには集計プロパティを指定することもできるので、

1..10 | group {if($_ % 2 -eq 0){"偶数"}else{"奇数"}}
Count Name                      Group
----- ----                      -----
    5 奇数                      {1, 3, 5, 7...}
    5 偶数                      {2, 4, 6, 8...}

みたいなこともできたりします。

ちなみにGroup情報が不要であるときは、Group-Objectコマンドレットに -NoElementパラメータを付与すると出力を抑制できます。(この場合、出力はGroupInfoオブジェクトではなく、GroupInfoNoElementオブジェクトとなる)

なんか後半はGroup-Objectコマンドレット特集みたくなってしまいました。ではまた次回。

2011/10/09

WindowsサイドバーガジェットはWindows Vistaの登場で追加されたプログラムで、デスクトップ上にガジェットと呼ばれるミニプログラムを貼り付けることができます。ガジェットはHTML/CSS/J(ava)Script (+VBScript)で記述することができます。Windows7の登場で名称が「Windowsデスクトップガジェット」と変更され、一部仕様に変更が加えられたものの現役でした。

ところが先月末(2011/09)頃に、サードパーティー製のものを含む多数の追加ガジェットのWindows Live Galleryでの公開が中止されました。現在は登録されたガジェットのリストは表示されるものの、ダウンロードができない状態です。まもなくサイト自体が閉鎖されるものと思われます。

現時点でWindows7で「ガジェット」を実行し、そこに表示される「オンラインで追加のガジェットを取得」リンクをクリックするとデスクトップ ガジェット - Microsoft Windowsというページに飛ばされますが、ここでは(おそらく人気上位であった)ガジェットが数点のみダウンロードできるという状態です。

この措置に対するMicrosoftの公式コメントがこちらになります。Looking for gadgets? - Downloads - Microsoft Windows

この記事を要約すると

  • MicrosoftはWindows Live Galleryを閉鎖し、今後、新しいガジェットの開発およびアップロードをサポートしない
  • ただし人気ガジェットはまだダウンロードできるようにしておくよ
  • ガジェット製作者はよりリッチなプラットフォームであるMetro Style Appにシフトしてね
  • でもまだガジェットに興味がある人もいるだろうから一応開発ドキュメントは残しておくよ
  • まだガジェットを公開したいのならCodePlexでどうぞ

という感じになるかと思います。まだPreview版しか出てない次期Windowsでしか動かないMetro Style Appを移行先に指定するのはかなり無理があるように思いますが、どうもMicrosoftはMetroと技術的にかぶるガジェットをさっさと亡きものにしたいようです。Windows 8のDeveloper Previewのクラシックデスクトップでは一応、今のところはデスクトップガジェットの機能は削除されていませんが、これからの開発の過程で削除されてしまう可能性も十分にありそうです。

ちなみにデスクトップガジェットはたとえIE9をインストールしてもHTML5コンテンツは動きませんし、JavaScriptもチャクラではなくJScript5.8で動きます。この時点でガジェットの未来はなさそうだと踏んでいましたが、思ったより早い終焉を迎えるようです。

Metro Style AppはたしかにWinRT上でJavaScript+HTML5+CSS3で開発することができ、ガジェットで培われたノウハウの一部は流用できる可能性はあるものの、ガジェットから単純に移行というのは難しそうです。利用者にとってもガジェットをデスクトップに常時複数表示させておき、作業中にもほかの情報を参照できるメリットが失われるのは厳しいものがあるように思います(Metro Style Appは一つだけクラシックデスクトップと同時に表示できる)。

告知も私の知るかぎりなかったですし、気づけばいきなり消滅していたという感じで、お困りの方も今後増えそうです(たしかにガジェットはいまいち流行ってなかったですがいきなりはヒドイ)。とりあえず現在追加インストールしているガジェットは、今後入手困難になる可能性が高いので、各自でバックアップを取っておくことをお勧めします。

.gadgetファイルそのものを保存していなくても、C:\Users\ユーザー名\AppData\Local\Microsoft\Windows Sidebar\Gadgetsの各サブフォルダがガジェット一つ一つに対応しているので、これをバックアップしておけば問題ありません。再インストールも単にこれらのファイルを同じ場所に書き戻すだけでOKです。

また、.gadgetファイルは単に関連ファイルをzipで固めたものなので、ご自分でこれらの各サブフォルダをzipにして.gadgetにリネームすればインストーラーを復元することもできます。

これらの措置は自己責任にてお願いします。各ガジェット作者のアナウンスがある場合はそちらに従ってください。

それにしても、WindowsデスクトップにHTML+スクリプトで記述されたミニプログラムを配置するといえば古くは「アクティブデスクトップ」まで遡ることになると思いますが、「ガジェット」で安定するかと思ったら二世代しか持ちませんでしたね。競合するGoogleデスクトップも終了しましたし、あまりウケがよろしくないんでしょうか。Metro Style Appはその点どうなんでしょうね?

元記事:http://blogs.wankuma.com/mutaguchi/archive/2011/10/09/204219.aspx

2009/08/15

イマイチ注目度の低いガジェットですが、Windows Vista→7でかなり変更があります。まだ開発までは追いきれてないのですが、とりあえず使用方法について気付いたことをメモ。

  Windows サイドバー ガジェット Windows デスクトップ ガジェット
OS Windows Vista Windows 7
デフォルト表示位置 デスクトップの左右どちらか(マルチディスプレイ環境ではいずれか一つのディスプレイ) デスクトップの任意の場所。ただし、デスクトップの左右には目に見えないグリッドがあり、マウスでD&Dすると位置補正がかかる。(シフトキーを押しながらだと補正はかからない)
整列 左右に格納(Docked)時は自動整列 自動整列なし
マルチページ 左右に格納時、はみ出したガジェットは2ページ目以降に表示される マルチページ機能なし
ショートカットキー

Windowsキー+スペースキーで手前に表示
Windowsキー+Gでガジェットの選択

Windowsキー+Gでガジェットの選択
のみ (8/19修正。JZ5さん komvoyさんありがとうございます)

ガジェットの大きさ Docked時は小さいサイズ、unDocked(デスクトップの任意の場所に配置)時は大きいサイズ ガジェットの右上に表示されるボタンで小さいサイズと大きいサイズのいずれかを選択できる
ガジェットの最小サイズ 130 x 55px なし?
起動方法 スタートメニュー→「すべてのプログラム」→「アクセサリ」→「Windows サイドバー」から起動 デスクトップを右クリックし、「表示」→「デスクトップ ガジェットの表示」にチェック
終了方法 通知領域(タスクトレイ)のアイコンの右クリックメニュー デスクトップを右クリックし、「表示」→「デスクトップ ガジェットの表示」のチェックをはずす
ガジェットの追加 サイドバーの上の+ボタンクリック デスクトップを右クリックして「ガジェット」をクリック
なんか、微妙に機能が削られてるというかなんというか…あと、デスクトップ右に並べた時に右にできるスペースが妙に広い。まぁアイコンが大きくなったせいなんでしょうが… 元記事:http://blogs.wankuma.com/mutaguchi/archive/2009/08/15/180164.aspx

2008/11/22

サイドバーにTwitterのタイムラインを表示するtwitgadetというガジェットのがあるんですが、返信タイムラインを取得する機能があるのに呼び出すのを忘れているというバグ?実装漏れ?をみつけたのでfixしてみます。

C:\Users\<UserName>\AppData\Local\Microsoft\Windows Sidebar\Gadgets\twigadge-1.1[1].gadget\js\twigadge.js

とりあえず現状では返信タイムラインが呼ばれないのは間違いないです。とりあえず返信タイムラインを呼ぶようにfix。367行目あたり

      Twigadge.getFriendsTimeline();

     Twigadge.getReply();

に変更。

533行目あたり。

          Twigadge.refreshTL(); //

          Twigadge.getFriendsTimeline(); //

に変更。

C:\Users\<UserName>\AppData\Local\Microsoft\Windows Sidebar\Gadgets\twigadge-1.1[1].gadget\js\gadget.js

90行目あたり

        Twigadge.getReply();

の下に次の行追加

        Twigadge.refreshTL();

これでとりあえず返信タイムラインは取得できます。

ダイレクトメッセージも設定に関係なく最初の一回しか呼ばれないっぽいです。
これを直すには

C:\Users\<UserName>\AppData\Local\Microsoft\Windows Sidebar\Gadgets\twigadge-1.1[1].gadget\js\twigadge.js

658行目あたり

      case MODES.system:
        Twigadge.refreshTL();
        break;
      case MODES.dm:
        Twigadge.refreshDM();
        break;
 

      case MODES.system:
        Twigadge.refreshTL();
        Twigadge.refreshDM();
        break;
      case MODES.dm:
        break;

とします。

これで作者さんの意図どおりかわかりませんが、とりあえず説明書通りには動きます、たぶん。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2008/11/22/161950.aspx

2008/03/20

あまりガジェットをVBScriptで書いてる人はいないと思いますが、System.*で始まるクラスのメンバを使うときは注意が必要です。

たとえVBScriptであろうとも、

System.*で始まるクラスおよびメンバ名はCasesensitive(大文字小文字を区別する)です

つまり、

System.Gadget.Settings.readString

はOKですが、

System.Gadget.Settings.ReadString

はNGです。エラーになります。

これはハマりますねぇー。というかハマりました。皆さんも注意してくださいね。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2008/03/20/128802.aspx

Vistaガジェットに「付箋」というのがありますが、その内容をテキストに書き出すスクリプトをWSHで書いてみました。(22:55 WshNetworkを使ってAddDataパスを取得していたのをShell.Application経由で取得に変更)

'sTextFolderにVistaガジェット付箋をページごとに0.txt, 1.txt...のように保存していく
sTextFolder = "D:\document\Advanced_es の文書\" 'テキストファイル保存フォルダ
Set Fs = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
Const CSIDL_LOCAL_APPDATA  = &H1C
Set tsIni = Fs.OpenTextFile(Fs.BuildPath(objShell.NameSpace(CSIDL_LOCAL_APPDATA).Self.Path, _
            "\Microsoft\Windows Sidebar\Settings.ini"),,,True)
Set regEx = New RegExp
regEx.Global = True
bCNotesSection = False
Do Until tsIni.AtEndOfStream
    sLine = tsIni.ReadLine()
    If InStr(sLine,"CNotes.Gadget") Then
        bCNotesSection = True
    End If
    If bCNotesSection And InStr(sLine,"[") Then
        bCNotesSection = False
    End If
    If bCNotesSection Then
        regEx.Pattern = "(\d+)\=""(.+)"""
        If regEx.Test(sLine) Then
            For Each oMatch In regEx.Execute(sLine)
                Set oSubs = oMatch.SubMatches
                Fs.CreateTextFile(sTextFolder & oSubs(0) & ".txt").Write unescape(oSubs(1))
            Next
        End If
    End If
Loop
tsIni.Close

私はこのスクリプトをタスクスケジューラで5分間隔で動かしています。Advanced esというスマートフォンを使ってますが、これにViewTextというTodayプラグインを使うとテキストファイルがTodayに表示できるので、同期センターを使うと付箋の内容を同期できるわけです。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2008/03/20/128772.aspx

2007/07/28

窓の杜 - 【NEWS】Windows Vista用ガジェットパック「nDigiGadgets」v0.11が公開、計16本を収録
http://www.forest.impress.co.jp/article/2006/09/21/ndigigadgets011.html

というガジェットシリーズの中に、nDigiTVProgramという、ライブドアのテレビ番組表RSSを取得して表示するガジェットがあり愛用しています。このガジェットの中でMicrosoft.XMLDOMを同期処理(xml.async = false;)で呼び出しているのですが、たまによくloadメソッド実行時に固まります。やっかいなのはガジェットは一つがフリーズすると全体を巻き込むところですね。非同期化するとこの問題は解消します。で、やり方は、

ローカルの XML ドキュメントをロードする (hPod)
http://hwat.sakura.ne.jp/hpod/200612/22-220000/

に載っています。

asyncプロパティをtrueにし、onreadystatechangeイベントに匿名関数を割り当てます。

...
	var xml = new ActiveXObject("Microsoft.XMLDOM");
	//xml.async = false;
	xml.async = true;
	xml.onreadystatechange = function (){
		if( xml.readyState == 4 ){
			// ロード完了時に、何かする
			var rdf;
....この中にもともとloadの後にあった処理を移動させる...
			statustext.title = "次のデータ取得は"+ mindate.getHours() + "時" + mindate.getMinutes() + "分\n今すぐ取得するにはクリック"
		}
	}
	xml.load(uri);


}

var lastLoadText = "";
...

てな感じで。

すべて他の方のネタでごめんなさいですー。私もガジェット作成続きしなきゃ・・・

ちなみにこのガジェットの作者さん、MSMVPを受賞されたそうです。おめでとうございますー。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/07/28/87488.aspx

2007/05/24

基本は赤坂さんのCodezineの記事を追っていくことにしましょう。

まずガジェットのひな形を作るには

1.ガジェット保存フォルダ(C:\Users\<ユーザー名>\AppData\Local\Microsoft\Windows Sidebar\Gadgets\)に

2.作るガジェットのサブフォルダ(<ガジェット名.gadget>)を作り、

3.その中にgadget.xmlファイルを作る

4.また、ガジェットの実体であるhtmlファイルを作る

これで、ガジェットの追加ダイアログに表示されるようになります。

例は赤坂さんの記事にあるので、ここでは実際のコードを。

■C:\Users\daisuke\AppData\Local\Microsoft\Windows Sidebar\Gadgets\Large_Feed.gadget\gadget.xml



 フィード ヘッドライン(大)
 1.0.0.0
 
  
   
   Full
   
  
 


■C:\Users\daisuke\AppData\Local\Microsoft\Windows Sidebar\Gadgets\Large_Feed.gadget\large_feed.html


 
  フィード ヘッドライン(大)
    
    
 
 
  

ここにフィードが表示されます。

さて、これを実際に表示させるとこのようになります。

ガジェットのひな形

まだ何も機能しませんが、立派にガジェットができました。
gadget.xmlの文法などは赤坂さんの説明をご参照ください。

ちなみにドラッグしてデスクトップに置く(アンドックする)とサイズが変わります。これは、System.Gadget.onDockイベントにサイズ変更のための関数(Function)の関数ポインタを代入していることで実現しています。VBScriptではGetRef関数が関数ポインタを扱う関数です。関数ポインタってなに?ってことはあまり気にしないで、とにかくイベントと実際の動作を関連付けるとだけ理解してればいいでしょう。

今回はここまでです。次回はいよいよRSS取得に挑戦してみます?予定は未定w

元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/05/24/78230.aspx

さて、Windows Vista機が手に入ったので、本格的にガジェットを作ってみたいと思います。

まずは簡単なものから作ってみましょう。

デフォルトでIE7のRSSフィードを表示するガジェットがありますが、あまりにも情報量が少なすぎて使い物にならないと思うのは私だけでしょうか。せめてタイトルが2行表示してほしい。ていうかそれだけできれば文句ありませんw

でもソースがどこにあるかよくわかりません(知ってる方います?)。なら一から作ってみましょう。勉強も兼ねて。

今回から暇を見て勉強しながら少しずつ作ってみます。記述言語はあえて!VBScriptで。

まずは参考文献。

CodeZine:Windows Vistaガジェット入門(Vista ガジェット, suzuki, Windows Vista ガジェット, Javascript, Windows Vista)
http://codezine.jp/a/article/aid/810.aspx

MVP赤坂さんの記事。言語はJavaScriptです。これを基本にVBScriptに移植します。

Sidebar Gadget Development Overview
http://microsoftgadgets.com/Sidebar/DevelopmentOverview.aspx

英語ですがガジェットの概要が示されています。

Windows Sidebar
http://msdn2.microsoft.com/en-us/library/aa965850.aspx

リファレンスです。System.から始まる内部オブジェクトのリファレンスなどがあります。

Windows Vistaソフトウェアコンテスト
http://www.vistacon.jp/

Microsoftが開催したコンテスト。ソースを参考にさせていただけるかも?(まだ未見です)

Introducing the Windows RSS Platform
http://msdn2.microsoft.com/en-us/library/ms686418.aspx

IE7のRSSフィードを扱うオブジェクトのリファレンスがあります。未見です。MVP Yamakenさんのブログにときどき取り上げられているので参考にしたいと思います。

こんなところでしょうか。とりあえず第1回は参考サイトを挙げるだけにとどめておきます。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/05/24/78229.aspx

Copyright © 2005-2016 Daisuke Mutaguchi All rights reserved

mailto: mutaguchi at roy.hi-ho.ne.jp

Awards

Books

Twitter