SQLの窓

2015年01月21日


VB.net(C#) : Picasa より指定したアルバム内の画像の URL 一覧を取得する

▼ バッチビルドキット


▼ クライアントライブラリのダウンロード
google-gdata - .NET library for the Google Data API

google-gdata : Google の C# サンプル : PhotoBrowser

Google_Data_API_Setup_1.9.0.0.msi をダウンロードしてインストールすると、
Google_Data_API_Setup_2.2.0.0.msi で再検証しました

C:\Program Files\Google\Google Data API SDK\Redist\Google.GData.Client.dll
C:\Program Files\Google\Google Data API SDK\Redist\Google.GData.Photos.dll
C:\Program Files\Google\Google Data API SDK\Redist\Google.GData.Extensions.dll

となるはずなので、カレントディレクトリにコピーして、

vbc.exe /r:Google.GData.Client.dll,Google.GData.Photos.dll,Google.GData.Extensions.dll ソースコード.vb

でビルドして実行します
Imports Google.GData.Client
Imports Google.GData.Photos

Module Module1

	Sub Main()

		' --------------------------------------------------
		' 引数の処理( ユーザ パスワード アルバム名 )
		' --------------------------------------------------
		' SQL作成に必要なテーブル名を引数から取得する
		' 空白を指定したい場合は、"文字列 文字列" のように指定する
		Dim arguments As String() = Environment.GetCommandLineArgs()
		' 引数は3つのみ許可
		if arguments.Length <> 4 then
			Console.WriteLine("引数を指定して下さい")
			Return
		end if

		' --------------------------------------------------
		' 認証処理
		' --------------------------------------------------
		' Picasa サービスにアプリケーション名を設定
		' companyName-applicationName-versionID で適当に設定
		Dim picasaService As PicasaService = New PicasaService("mymymy-photos-v1")

		' 認証情報を設定
		picasaService.setUserCredentials(arguments(1), arguments(2))

		' トークン文字列
		Dim authToken As String = Nothing

		' トークンの取得
		Try
			authToken = picasaService.QueryClientLoginToken()
		Catch ex As Exception
			Console.WriteLine( ex.Message )
			Exit Sub
		End Try

		' トークンの表示( ここでは使用しません )
		Console.WriteLine( "▼ トークン" )
		Console.WriteLine( authToken )

		' --------------------------------------------------
		' アルバムの処理
		' --------------------------------------------------
		' アルパム一覧を取得する為の要求オブジェクトを作成
		Dim query As AlbumQuery  = New AlbumQuery()

		' ユーザ名より、呼び出し先を設定
		query.Uri = New Uri(PicasaQuery.CreatePicasaUri(arguments(1)))

		' 一覧の取得
		Dim picasaFeed As PicasaFeed = picasaService.Query(query)
		Dim targetEntry As PicasaEntry = Nothing

		Console.WriteLine( "▼ 一覧の表示" )
		' 一覧の表示
		if (Not picasaFeed is Nothing) and (picasaFeed.Entries.Count > 0) then
			For Each entry As PicasaEntry In picasaFeed.Entries
				Console.Write(entry.Title.Text + " : ")
				Console.WriteLine(entry.GetPhotoExtensionValue(GPhotoNameTable.NumPhotos))

				' 目的のアルバムオブジェクトを保存
				if arguments(3) = entry.Title.Text then
					targetEntry = entry
				end if
			Next
		end if 

		Console.WriteLine( "▼ アルバムの内容" )
		' 保存されたアルバムの内容を再確認
		if Not targetEntry is Nothing then
			Console.WriteLine("アルバムタイトル : " + targetEntry.Title.Text)

			' --------------------------------------------------
			' 写真の処理
			' --------------------------------------------------
			Dim photoQuery As PhotoQuery = New PhotoQuery(targetEntry.FeedUri)
	
			' 写真一覧の取得
			Dim photoFeed As PicasaFeed = picasaService.Query(photoQuery)
	
			' 写真一覧の表示
			If (Not photoFeed Is Nothing) And (photoFeed.Entries.Count > 0) Then
				For Each entryPhoto As PicasaEntry In photoFeed.Entries
					' 通常はアップロードしたファイル名
					Console.WriteLine(entryPhoto.Title.Text)
					' Picasa の HTML ページ
					Console.WriteLine(entryPhoto.AlternateUri.Content )
					' 画像の URL
					Console.WriteLine(entryPhoto.Media.Content.Url)
					Console.WriteLine()
				Next
			End If

		end if

	End Sub

End Module

Protocol Reference

実行サンプル
vb.net>image_urllist.exe user password 画像
▼ トークン
DQAAABABAACUVSy0cLeHFszdiXR52VqipNzkwhG--jNYFdZsJiE-2tNWslwWDZ01PDFdGVSGEmo-54Es
rnC4plJ5dqWnb8ttvGwHR6_Hv7FfNcTV2Yvl0hK0DjVcCDKv4AGtcL5SXKz58NUAYFQpUU_xYuKSiH3Y
nipVGeJsnpKgLbJGJvBc0I7qYJFlqIy4ydAnpxjtd5jJEe6lVJPb08Dgszkzi4C_DAT-5Y1tLRWkX4iG
9LrwV72TAO7bYtGkE59E0GL6V96DmkQyhGD8e6QW6PYbtGq2zV3T49PqWXYCMyHuyu4oQ7zEVrCka51M
eVc--4wdsNEzn5-ORFfAQ5dDOkv1H2TWJZoUNtdjfx7QhqDIsSPeSg
▼ 一覧の表示
自動バックアップ : 2
Google DATA : 1
画像 : 5
2013/08/31 : 2
2013-08-15 : 1
2013-08-09 : 1
2013/08/09 : 1
書籍 : 1
2013-08-05 : 2
スクラップブック写真 : 1
プロフィール写真 : 1
2013-08-15 : 1
▼ アルバムの内容
アルバムタイトル : 画像
Koala.jpg
https://picasaweb.google.com/1062795259696282242/aBylLD02#6106631643771454306
https://lh.googleusercontent.com/-NAgA591vjCo/VL8dIC0oQ2I/AAAAAAAAAj8/auHvt-kPf
9M/Koala.jpg

Chrysanthemum.jpg
https://picasaweb.google.com/1062795259696282242/aBylLD02#6106632684030319666
https://lh.googleusercontent.com/-B_9ML605-us/VL8eEmFq3DI/AAAAAAAAAkk/XEdyJhv_R
is/Chrysanthemum.jpg

Desert.jpg
https://picasaweb.google.com/1062795259696282242/aBylLD02#6106632684185326466
https://lh.googleusercontent.com/-35nqu23mW98/VL8eEmqoE4I/AAAAAAAAAkY/g90EGpZOT
DM/Desert.jpg

Hydrangeas.jpg
https://picasaweb.google.com/1062795249696282242/aBylLD02#6106632687178019842
https://lh.googleusercontent.com/-S6Ip9iBwt00/VL8eEx0I9AI/AAAAAAAAAkc/VYd-YUeEC
w4/Hydrangeas.jpg

Jellyfish.jpg
https://picasaweb.google.com/1062795259696282242/aBylLD02#6106632704441986402
https://lh.googleusercontent.com/-og4Rsof929w/VL8eFyIMLWI/AAAAAAAAAkg/1kZH2SSCR
9U/Jellyfish.jpg
▼ C# ( Code Translation for .NET (C#<->VB.NET) でVBを変換 )
using System;
using Google.GData.Client;
using Google.GData.Photos;
class Module1 {
    
    static void Main() {
        string[] arguments = Environment.GetCommandLineArgs();
        if ((arguments.Length != 4)) {
            return;
        }
        PicasaService picasaService = new PicasaService("mymymy-photos-v1");
        picasaService.setUserCredentials(arguments[1], arguments[2]);
        string authToken = null;
        try {
            authToken = picasaService.QueryClientLoginToken();
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
            return;
        }
        Console.WriteLine("▼ token");
        Console.WriteLine(authToken);
        AlbumQuery query = new AlbumQuery();
        query.Uri = new Uri(PicasaQuery.CreatePicasaUri(arguments[1]));
        PicasaFeed picasaFeed = picasaService.Query(query);
        PicasaEntry targetEntry = null;
        Console.WriteLine("▼ list");
        if ((!(picasaFeed == null) 
                    && (picasaFeed.Entries.Count > 0))) {
            foreach (PicasaEntry entry in picasaFeed.Entries) {
                Console.Write((entry.Title.Text + " : "));
                Console.WriteLine(entry.GetPhotoExtensionValue(GPhotoNameTable.NumPhotos));
                if ((arguments[3] == entry.Title.Text)) {
                    targetEntry = entry;
                }
            }
        }
        Console.WriteLine("▼ albam");
        if (!(targetEntry == null)) {
            Console.WriteLine(("title : " + targetEntry.Title.Text));
            PhotoQuery photoQuery = new PhotoQuery(targetEntry.FeedUri);
            PicasaFeed photoFeed = picasaService.Query(photoQuery);
            if ((!(photoFeed == null) 
                        && (photoFeed.Entries.Count > 0))) {
                foreach (PicasaEntry entryPhoto in photoFeed.Entries) {
                    Console.WriteLine(entryPhoto.Title.Text);
                    Console.WriteLine(entryPhoto.AlternateUri.Content);
                    Console.WriteLine(entryPhoto.Media.Content.Url);
                    Console.WriteLine();
                }
            }
        }
    }
}



タグ:google API
posted by lightbox at 2015-01-21 14:04 | VB.NET : テクニカル | このブログの読者になる | 更新情報をチェックする

2013年08月09日


VB.net(VS2010) で COM へ公開して、WSH(VBScript) で利用する( C# でも同様 )

※ C# の場合、ルート名前空間では無く、ソースコード内の namespace で指定します

新規プロジェクト



コード自体は特別な事はしません。以下のようなコードを作成します
Imports System.Windows.Forms

Public Class Class1

	Public Sub Hello()

		MessageBox.Show("こんにちは")

	End Sub

	Public Function PcName() As String

		PcName = My.Computer.Name

	End Function

End Class

ここでは、MessageBox.Show を使う為に、System.Windows.Forms を Imports していますが、COM へ公開するのに必須ではありません。また、System.Windows.Forms を Imports するには、参照設定を行う必要があります。



COM へ公開する為の特別な設定(1)

まず、Release に設定して下さい。



COM へ公開する為の特別な設定(2)

COM としてビルドする為の設定は、プロジェクトのプロパティから、アセンブリ情報ボタンをクリックして開いたダイアログで、チェックボックスを ON にするだけです。



COM へ公開する為の特別な設定(3)

署名タブから、アセンブリの署名を行うようにチェックボックスを ON にして、『厳密な名前のキーファイル』を作成します。



▼ ファイル名は任意


COM へ公開する為の特別な設定(4)

ルート名前空間を決定します( CreateObject で使用するピリオドの前にある名前 )




ビルドしてから COM として登録する

以下のように登録用と削除用のファイルを配置します。



ショートカットは、『管理者権限で実行』できるように設定します





▼ build.bat の中身です
cd %~p0

C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm MyComClass.dll /tlb:MyComClass.tlb /codebase

pause

▼ remove.bat の中身です
cd %~p0

C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm MyComClass.dll /unregister

pause

▼ 管理者権限での実行可能なショートカットより実行


▼ レジストリエディタで登録された事を確認


実行用テストコード
Set obj = Wscript.CreateObject("winofsql.Class1")

Call obj.Hello()

Wscript.Echo obj.PcName()




posted by lightbox at 2013-08-09 00:45 | VB.NET : テクニカル | このブログの読者になる | 更新情報をチェックする

2011年09月27日


VB.net : Picasa にアクセスする為に、Google Data API にログインしてトークンを取得する

google-gdata - .NET library for the Google Data API

Google_Data_API_Setup_1.9.0.0.msi をダウンロードしてインストールすると、

C:\Program Files\Google\Google Data API SDK\Redist\Google.GData.Client.dll
C:\Program Files\Google\Google Data API SDK\Redist\Google.GData.Photos.dll

となるはずなので、カレントディレクトリにコピーして、

vbc.exe /r:Google.GData.Client.dll,Google.GData.Photos.dll ソースコード.vb

でビルドして実行します
Imports Google.GData.Client
Imports Google.GData.Photos

Module Module1

	Sub Main()

		Dim picasaService As PicasaService = New PicasaService("PhotoBrowser")

		picasaService.setUserCredentials("メールアドレス", "パスワード")

		Dim authToken As String = Nothing

		Try
			authToken = picasaService.QueryClientLoginToken()
		Catch ex As Exception
			Console.WriteLine( ex.Message )
			Exit Sub
		End Try

		Console.WriteLine( authToken )

	End Sub

End Module

"PhotoBrowser" は付属の C# のサンプルで使われていた文字列です 

以下は、英文でのガイドです

※ 3.Create a new PicasaService instance, setting your application's name
※ (in the form companyName-applicationName-versionID).



posted by lightbox at 2011-09-27 17:17 | VB.NET : テクニカル | このブログの読者になる | 更新情報をチェックする

2010年06月17日


VB.net : Win32API 呼び出し : GetWindowsDirectory

StringBuilder 側からメモリの拡張は容易ですが、GetWindowsDirectory に
引き渡す長さ以上の文字列が戻って来る場合は異常終了します
Imports System.Runtime.InteropServices	' DllImport

Module MyModule

' UINT GetWindowsDirectory(
'   LPTSTR lpBuffer,  // Windows ディレクトリが格納されるバッファ
'   UINT uSize        // ディレクトリバッファのサイズ
' );

<DllImport("Kernel32.dll", CharSet:=CharSet.Unicode)> _
Private Function GetWindowsDirectory( _
  ByVal lpBuffer As System.Text.StringBuilder, _
  ByVal uSize As System.UInt32 _
) As System.UInt32
End Function

Sub Main()

	' C:\WINDOWS を取得します

	Dim lpBuffer As System.Text.StringBuilder = New System.Text.StringBuilder(128)
	Dim uRet As System.UInt32

	uRet = GetWindowsDirectory( lpBuffer, 128 )

	' uRet は 10 です
	Console.WriteLine( uRet )
	Console.WriteLine( lpBuffer )

	' Length プロパティで切り捨てられて C:\WIN になります
	lpBuffer.Length = 6
	Console.WriteLine( lpBuffer )

End Sub

End Module

関連する Microsoft ドキュメント

文字列に対する既定のマーシャリング
値型に対する既定のマーシャリング


タグ:Win32API
posted by lightbox at 2010-06-17 20:22 | VB.NET : テクニカル | このブログの読者になる | 更新情報をチェックする

2010年06月05日


VB.net : 画像の上にテキストを半透明で出力する

単純出力( 半透明なし )

Winofsql_text1


半透明出力用の背景透明の画像

Text_on_img

半透明出力

Winofsql_text3
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Drawing.Text

Module MyModule

' ********************************************************
' 画像の上にテキスト
' ********************************************************
Sub Main()

	' 文字列の配列
	Dim argv As String()

	' コマンドラインの取得
	argv = System.Environment.GetCommandLineArgs()

	' 引数がある場合
	if System.Environment.GetCommandLineArgs.Length > 1 then
		Console.WriteLine(argv(1))
	else
		Console.WriteLine("変換するビットマップファイルを指定して下さい")
		Return
	end if

	' ********************************************************
	' 単純書き出し
	' ********************************************************
	' Bitmap をファイルのパスから作成
	Dim bmp As New Bitmap(argv(1))
	' キャンバス
	Dim gra As Graphics = Graphics.FromImage(bmp)

	' 書き出すテキストのフォントを作成
	Dim myFont As Font = New Font(FontFamily.GenericSansSerif, _
		20, FontStyle.Bold)

	' 白色で書きだす
	Dim myBrush As New SolidBrush(Color.FromArgb(255,255,255))

	' アンチエイリアス設定
	gra.TextRenderingHint = TextRenderingHint.AntiAliasGridFit

	' 書き出し
	gra.DrawString( "lightbox", myFont, myBrush, 70, 28 )

	bmp.Save((argv(1).Split("."))(0) + "_text1.png", Imaging.ImageFormat.Png)

	bmp.Dispose()

	' ********************************************************
	' 半透明書き出し
	' ********************************************************
	' Bitmap をファイルのパスから作成
	bmp = New Bitmap(argv(1))
	' キャンバス
	gra = Graphics.FromImage(bmp)

	' 同一サイズの Bitmap
	Dim bmp4Text As New Bitmap(bmp.Width, bmp.Height)
	' キャンバス
	Dim gra4Text As Graphics = Graphics.FromImage(bmp4Text)

	' 透明ブラシ
	Dim myBaseBrush As New SolidBrush(Color.FromArgb(0,0,0,0))
	' 塗りつぶし位置
	Dim rects As Rectangle() = {New Rectangle(0, 0, bmp4Text.Width, bmp4Text.Height)}
	' 塗りつぶして、透明のキャンバスにする
	gra4Text.FillRectangles(myBaseBrush, rects)

	' アンチエイリアス設定
	gra4Text.TextRenderingHint = TextRenderingHint.AntiAliasGridFit

	' 書き出し
	gra4Text.DrawString( "lightbox", myFont, myBrush, 70, 28 )

	' 途中経過
	bmp4Text.Save((argv(1).Split("."))(0) + "_text2.png", Imaging.ImageFormat.Png)

	' 半透明出力用属性
	Dim att As New ImageAttributes
	Dim cm As New ColorMatrix
	' 半透明
	cm.Matrix00 = 1		' R
	cm.Matrix11 = 1		' G
	cm.Matrix22 = 1		' B
	cm.Matrix33 = 0.5F	' A
	cm.Matrix44 = 1
	att.SetColorMatrix(cm)

	' 半透明書き出し
	gra.DrawImage( _
		bmp4Text, _
		New Rectangle(0, 0, bmp.Width, bmp.Height), _
		0, _
		0, _
		bmp.Width, _
		bmp.Height, _
		GraphicsUnit.Pixel, _
		att _
	)

	' 半透明書き出し結果
	bmp.Save((argv(1).Split("."))(0) + "_text3.png", Imaging.ImageFormat.Png)

	' Bitmap の解放
	bmp.Dispose()

End Sub

End Module



posted by lightbox at 2010-06-05 01:36 | VB.NET : テクニカル | このブログの読者になる | 更新情報をチェックする

2010年05月28日


VB.net と C# における KeyPress イベントの受け取り方

いろいろやってみましたが、直感的でかつ短くなる書き方が違います。
ControlChars.Cr は、Microsoft.VisualBasic 名前空間で、Char 型(構造体)です。

Keys.Return は、System.Windows.Forms 名前空間で、列挙体で整数です
VB.net で、整数を Char 型にキャストできないので、比較するにはいろいろ
変換が必要です

C# でも、Microsoft.VisualBasic 名前空間を使用するのであれば、ControlChars.Cr
を使用できますが、Java や C++ から入った人の発想に無い内容になりがちです

VB.net
Public Class Form1

	Private Sub TextBox1_KeyPress( _
	  ByVal sender As System.Object, _
	  ByVal e As System.Windows.Forms.KeyPressEventArgs) _
	  Handles TextBox1.KeyPress

		' VB.net で推奨
		If e.KeyChar = ControlChars.Cr Then
			Console.WriteLine("VB.net用")
		End If

	End Sub
End Class

C#
public partial class Form1 : Form
{
	public Form1()
	{
		InitializeComponent();
	}

	private void textBox1_KeyPress(
		object sender, 
		KeyPressEventArgs e)
	{

		// C# で推奨
		if (e.KeyChar == (char)Keys.Return) {
			Console.WriteLine("C#用");
		}

	}
}



タグ:VB.NET C#
posted by lightbox at 2010-05-28 14:20 | VB.NET : テクニカル | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり