ページ

ラベル c# の投稿を表示しています。 すべての投稿を表示
ラベル c# の投稿を表示しています。 すべての投稿を表示

2017年3月5日日曜日

Visual Studio C# エクセルに画像を貼り付ける

生産管理システム構築の際に、製品に貼る銘版シールを自前のシステムから、エクセルシートを作成して、特別な装置が無くても工場で銘版シールが作成できるようにしたい。

前提として
Visual Studio 2010
Excel 2003
を使用する。

幾つかの方法があったので試してみた。

1.Worksheet.Shapes を使う方法
 ちょっと難しかったのか、ぜんぜんです。
 オプションパラメータもうまく参照できませんでした。
 エクセル2003じゃー、だめってことかと思います。
 mso なんちゃらって、いう、パナメータ。Enumっぽいのですが、参照できませんでした。とっとあきらめました。

2.クリップボードに一旦画像をコピーしてから貼り付ける
結果、この方法で成功したのですが、ちょっと難儀したので、書き残します。

2.1 Range.PasteSpecial を使う方法
クリップボードにイメージデータをコピーするサンプルコードとしては
    System.Windows.Forms.Clipboard.Clear();
    System.Windows.Forms.Clipboard.SetImage(バーコード[ImagIdx]);

こんな感じでOKでした。
次に、Range.PasteSpecia() を実行してみたのですが、エラー。
パラメータも幾つか試したのですが、エラーを重ねるばかりで、正解がわかりませんでした。
あまりにも、答えが見つからないので、軽く日本酒をグビーっとあおってみたのですが、状況は打開できませんでした。
こういうときは、一晩寝て、翌朝に神社に行って祝詞をあげて、禊をすると解決するのです。(冗談です)

2.2 Picturesを使う
プログラムでクリップボードにコピーされた後、あらかじめ立ち上げておいたエクセルシートで「貼り付け」をすると、ちゃんと貼り付けることでできていたので、答えは必ずあると考えておりました。

成功したバターンは、
コピー先のRangeを選択してから、Pictures.Pasteを実行する。
サンプルコードとしては
 Range.Select();
   Pictures pictures = (Pictures)Worksheet.Pictures(Type.Missing);
   Picture picture = pictures.Paste(Type.Missing);

こんな感じです。これでOK牧場でした。

2013年7月31日水曜日

Google API を使って自動的に記事を投稿する サンプルサイト

Google API を使って自動的に記事を投稿する サンプルサイト

今月は、Google API を使ってBloggerに投稿するプログラムについて勉強しました。
集大成として、サンプルサイトを作成しました。

http://p-mans.blogspot.jp/


サイト構築の要領

  • 専用のBloggerアカウントを用意
  • Azure仮想デスクトップを用意
  • 特定のサイトから過去記事を検索するロボットを作成
  • このロボットを複数用意して、タイムスケジューラーで定期的に起動
  • タイムスケジューラーはAzureの環境に用意
  • ロボットは記事の日付、タイトルを認識、不要なタグの削除などを行い、特定のbloggerへ自動投稿する

問題点

bloggerへの自動投稿には以下の問題点があります。
  • 1日に投稿出来る件数の制限
  • 利用できるタグの制限

総評

問題点が見えれば、回避方法が見つかりますので、なんとか構築に成功しました。
この構築に掛かった工数は試行錯誤もあるので、約10人日でした。
今回は仕事に関係するパチンコ業界の記事を中心にしたサイトを作ってみました。



2013年7月29日月曜日

Google API で Bloggerに投稿する際に、ラベル、スケジュール日付を付加する。

Google API で Bloggerに投稿する際に、ラベル、スケジュール日付を付加する。
Google.GData.Clientを参照する。
using Google.GData.Client;
以下がサンプルコード。

schemeに"http://www.blogger.com/atom/ns#" を指定するのが重要なポイントになります。

static AtomEntry PostNewEntry(Service service, Uri blogPostUri
 , string Title, string HtmlContent, DateTime Update
 , string Name, string Email)
{
    Console.WriteLine("\nPublishing a blog post");
    AtomEntry createdEntry = null;
    if (blogPostUri != null)
    {
        // construct the new entry
        AtomEntry newPost = new AtomEntry();
        newPost.Title.Text = Title; //タイトルはダブってもエラーにならない
        newPost.Published = Update;   //日付
        newPost.Content = new AtomContent();
        newPost.Content.Content = HtmlContent;
        newPost.Content.Type = "xhtml";
        newPost.Authors.Add(new AtomPerson());
        newPost.Authors[0].Name = Name;
        newPost.Authors[0].Email = Email;
        newPost.Categories.Add(new AtomCategory(
            "Label1"   //term
            , "http://www.blogger.com/atom/ns#" //scheme
            ));
        try
        {
            createdEntry = service.Insert(blogPostUri, newPost);
            if (createdEntry != null)
            {
                Console.WriteLine("New blog post created);
            }
        }
        catch
        {
        }
    }
    return createdEntry;
}


Service.Insert()でエラーが発生する場合は、HTMLのタグに不整合がないか確認してみよう。

Service.Insertのエラーについて

Service.Insertで発生するエラーについてはいくつか考えられる。

  1. HTMLのタグに不整合
  2. 投稿件数オーバー・セキュリティーロック

HTMLのタグに不整合

いつか使えないタグ、というか古い仕様は受け付けない。
例えば<br>は×、</ br>出ないとだめ。
その他にも対応しないタグが有るようです。

投稿件数オーバー・セキュリティーロック

1日の投稿件数が、ある一定数(?)を超えると、セキュリティーロックが掛かる。
ハッカーが他人のブログをのっとって、ロボットが書き込んでいると判断されるようだ。
手動での各込は出来るが、投稿時にセキュリティ画像に表示される文字の入力が必要になる。
APIではそれが困難である為、エラーが発生する。
セキュリティーロックは翌日になると、解除されるようだが、セキュリティーロックが掛かった日はAPI投稿は中断し、一日に投稿する数を調整する必要がある。
ある一定数(?)というのが分からないが、100投稿もすればセキュリティーロックが掛かるのも当然だと言える。

2013年7月23日火曜日

Visual Studio 2010 多言語対応時、デザイナーでエラーが発生する!

Visual Studio 2010 で作成したWindow Form アプリケーションを、中国語対応することになったので、いろいろとやり方を調べた。

既存ソースで試すのは不安だったので、新規アプリケーションを作成し、FormのLocalizableプロパティを「True」に設定し、Languageプロパティを「中国語」に設定してみた。

あれ?
Form.zh.resxができると思いきや、できないではないか。

で、わかったことは、この時点では自動作成されない。
Form上のコントロールのTextを変更するなど、デフォルトの設定との違いが発生した時点で、自動作成される。
また、違いのある箇所だけ、Form.zh.resxにリソースが追加される。

フー。
無事作成された。

参考サイト:Windowsフォームを多言語対応にするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/314winmultilang/winmultilang.html


Form上のコントロールはこれでよいか、MessageBoxのメッセージ文字列は直接コード上にあるので、どうすぺきかを調べた。

どう考えてもメッセージ文字列をResourceファイルにしておく必要がありそう。

参考サイト:
C#でのアプリケーション設定の取得・保存方法
http://d.hatena.ne.jp/seraphy/20120708

多言語対応アプリ作成
http://hshimaji.web.fc2.com/mui/project.html


で、上記2点の作業を本番のアプリケーションソースに修正を加える。


順調に作業を進めていたが、ところがどっこい。
デザイナでエラーが発生した。


少々パニック。
ソースを元に戻しても、発生する。


よくよく調べると、Form.Designer.csの中で、Form上のコントロールのプロパティ[ImageKey]に、メッセージ文字列をリソース化した際の文字列の名称を代入しようとして、エラーになっている。

ご丁寧に、すべてのLabelとButtonの[ImageKey]プロパティーに代入しようとしてくれる。

この仕様は不具合なのか良くわからない。

とにかく、このままではコンパイルもできないので、Form.Designer.csの中の[ImageKey]プロパティーに、不要な代入をしようとする記述を削除する。

何とかデザイナー編集が表示されるようになった。


しかし、またデザイナー編集で、コントロール上のテキストを変更すると発生する。
なんだこれは!



2013年7月11日木曜日

Google API をC# で使うための .NET library for the Google Data APIをインストールしてみる

Google API は .NET 用Client Libraryが用意されている。

.NET Client Library Developer's Guide
https://developers.google.com/gdata/client-cs?hl=ja#Tutorial

ダウンロードサイトにアクセスします。



現在、2.2.0が最新のようです。
Google_Data_API_Setup_2.2.0.0.msiをダウンロードしてみます。

インストールしてみます。

Next>で進んでインストールします。

無事インストールが完了しました。










2013年7月9日火曜日

Amazon APIを C# プログラムで呼び出してみる

C#を使って、サクサクとアマゾンの商品情報を取得してみようと思い調査を開始。


まず、Amazon アソシエイト(アフェリエイト)のアカウントを作成します。
https://affiliate.amazon.co.jp/
もちろん料金は掛かりません。


Amazonアソシエイトの登録が完了すると、アソシエイトIDが発行されます。


次に、クラウド業界を独走する、あのAmazon Web Service、通称ASWのアカウントを取得します。
http://aws.amazon.com/jp/
無料のアカウント(Free)に参加します。
一応、クレジットカードの情報入力がありますが、有料サービスを使わない、限り請求はありません。
アクセスキー、シークレットキーを取得します。
アカウントサービスにアクセスします。
https://affiliate.amazon.co.jp/gp/advertising/api/detail/your-account.html
「アクセスキー情報」の「こちらのリンク」をクリックします。
アカウント画面が表示されたら、アクセス証明書を表示させます。
アクセス証明書のユーザーアクセスキー一覧の「新しいアクセスキーを作成する」をクリックして、アクセスキーを作成します。

アクセスキーが作成されると、ユーザーアクセスキー一覧に追加されています。
セキュリティーキーは「表示」をクリックすると、別ウィンドウで表示されます。
以上でAmazon APIのアクセス必要な
Access Key, Secret Key, アソシエイトIDをそろえることができました。


2013年7月5日金曜日

System.Net.WebClient で https(SSL) サイトへのアクセスを簡単に成功させる方法

System.Net.WebClient で httpsのURLを指定してアクセスると


「基礎になる接続が閉じられました: SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした」

というメッセージのエラーが発生します。

これを成功させるためには以下のコードを実行しておきます。

try
{
    ServicePointManager.ServerCertificateValidationCallback =
        new RemoteCertificateValidationCallback(
            delegate
            { return true; }
       );
}
catch ()
{
}