2012年5月21日月曜日

ASPからのCScriptの実行について

http://learn.iis.net/page.aspx/624/application-pool-identities/

ExcelからPDFを作成

ExcelからPDFを作成するWebアプリを作成することになった。
Excel2010をサーバ側で、Excelオートメーションを利用して
PDF出力すれば良いのだが、何故かサンプルがうまく動作しない。
IISで作成したxlsxファイルを、直ぐに読み込む為にファイルロックがかかっているようだ。
※単体テストの場合、すんなり動作してくれる。

VBScriptから、Excelを起動してPDF作成するように修正。

VBScriptのソース
Set xl=CreateObject("Excel.Application")
xl.AutomationSecurity=2
Set bk=xl.WorkBooks.Open(WScript.Arguments.Item(0))
bk.ExportAsFixedFormat xlTypePDF, WScript.Arguments.Item(0) & ".pdf", xlQualityStandard, _
True, False, 1, 1, False
bk.Close
Set bk=Nothing
xl.Quit
Set xl=Nothing

bk.ExportAsFixedFormatがミソ

2012年5月17日木曜日

SMSを送信する

今回は、Short Message Service (SMS)のメッセージを送信する方法をご紹介します。
Microsoft.WindowsMobile.PocketOutlook 名前空間の SmsMessage クラスを利用する事で、簡単にSMSメッセージを送信する事が出来ます。
以下に、実際にSMSのメッセージを送信するメソッドを示します。

VB.NET

   ' 以下の名前空間を指定しておいてください
   ' Imports Microsoft.WindowsMobile.PocketOutlook
 
   Public Sub SendSMSMessage(ByVal telNumber As String, ByVal message As String)
 
       Try
           Dim smsMsg As New SmsMessage(telNumber, message)
 
           ' メッセージの送信
           smsMsg.Send()
       Catch ex As Exception
           ' 例外処理
       End Try
 
   End Sub
この SendSMSMessage メソッドを呼ぶと、SMSのメッセージを送信します。
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
 
       SendSMSMessage("09012345678", "SMSテスト")
 
   End Sub

C#

   // 以下の名前空間を指定しておいてください
   // using Microsoft.WindowsMobile.PocketOutlook
 
   public void SendSMSMessage(string telNumber, string message)
   {
       try {
           SmsMessage smsMsg = new SmsMessage(telNumber, message);
 
           // メッセージの送信
           smsMsg.Send();
       }
       catch (Exception ex) {
               // 例外処理
       }
   }
この SendSMSMessage メソッドを呼ぶと、SMSのメッセージを送信します。
   private void Button1_Click(System.Object sender, System.EventArgs e)
   {  
       SendSMSMessage("09012345678", "SMSテスト");
   }

実行結果

上記のサンプルコードを実行すると、SMSメッセージを送信する事が出来ます。

元ネタ http://ch3cooh.jp/index.php/tips/windows-mobile/communication/send_sms/

2012年5月16日水曜日

redmine 2.0.0

5月15日に、Redmineが、2.0.0にUpしていた。
大きな変更点 Ruby 1.8.7 -> 1.9系へ移行
Ruby on Rails  2.3.14 -> 3.2.3
最新の環境に追いついたので、今日の夜にでも、現在のRedmineをUpgradeしようっと。

PDF to XML

最初PDFをExcelに変換すれば、セル指定でデータを取得出来ると考えたのですが
PDf to XMLの方が、.NetのLINQでXML操作出来るので、 楽になると気が付いた。

2012年5月9日水曜日

PDFテキスト抽出の変換(cmaps)

PDFファイルからテキスト抽出する場合、adobeの変換テーブルを使用しないと
いけないらしい。

iTextには、 itext-asian.jar内に、cmapsがあるが、iTextharpの場合
iTextAsian-all-2.1.zipのdllに含まれているみたい。

sourceforgeから、downloadする必要がある。
ファイル名:iTextAsian-all-2.1.zip  2012年5月9日時点

C# iTextSharp でテキストを抽出

文字コードらしきものはどうやらCIDというAdobe固有の文字コードテーブルのようで、計算して復元できるような代物ではないらしい。その変換テーブル情報を CMap と言うらしい。
そこで xpdf というサイトにある xpdf-japanese.tar.gz というのを入手して、そのなかにある Adobe-Japan1-UCS2 というテキストファイル(拡張子なし)がどうも、今回のCMAPとして使えそうだ。
イメージとしては 読み込んだPDFの中にもそういったCMAP情報があって、それを元にコード変換していくのがスマートにも思えるが、PDFファイルの中にCMAP情報があるのか?またどのクラスモジュールで抜き出すのかがいまいち分からない。
PDFによっては他のCMAPファイルで文字コードを復元しなくちゃいけないんだろうが、どの情報を見てどのCMAPを使うかは今後の課題としよう・・・。
とりあえず、コーディングしてみた。
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace PDFtoHTML
{
    public partial class Form1 : Form
    {
        private string InPDF = @"C:hoge.pdf";
        private string InCMAP = @"C:\Adobe-Japan1-UCS2";

        private void button1_Click(object sender, EventArgs e) {
            // CMapの読込み
            iTextSharp.text.pdf.fonts.cmaps.CMap uCmap = new iTextSharp.text.pdf.fonts.cmaps.CMap();
            iTextSharp.text.pdf.fonts.cmaps.CMapParser uCMapParser = new iTextSharp.text.pdf.fonts.cmaps.CMapParser();
            StreamReader sr = new StreamReader(InCMAP, Encoding.GetEncoding("Shift-JIS"));
            uCmap = uCMapParser.Parse(sr.BaseStream);
            sr.Close();

            // iTextSharp::PdfReader PDFの読込み
            iTextSharp.text.pdf.PdfReader uReader = new iTextSharp.text.pdf.PdfReader(InPDF);

            Console.Write("□GetPageContent\n");
            for (int i = 0; i < uReader.NumberOfPages; i++) {
                Console.Write(string.Format(" Page No = {0}\n", (i + 1)));
                byte[] b = uReader.GetPageContent(i + 1);
                string s = iTextSharp.text.pdf.PdfEncodings.ConvertToString(b, PdfObject.TEXT_PDFDOCENCODING).Replace("\r\n", " ");
                Console.Write(string.Format("{0}\n", s));

                // テキスト部分を抽出
                System.Text.RegularExpressions.MatchCollection mc =
                    System.Text.RegularExpressions.Regex.Matches(s, @"<[0-9A-F]*?>|\(.*?\)");
                foreach (System.Text.RegularExpressions.Match m in mc)
                {
                    byte[] bv = new byte[2];
                    string ss = "";
                    if (m.Value[0] == '<')
                    {
                        for (int j = 1; j < (m.Value.Length - 1); j = j + 4)
                        {
                            bv[0] = Convert.ToByte(Convert.ToInt32(m.Value.Substring(j, 2), 16));
                            bv[1] = Convert.ToByte(Convert.ToInt32(m.Value.Substring(j + 2, 2), 16));
                            ss += uCmap.Lookup(bv, 0, 2);
                        }
                    }
                    else
                    {
                        ss += m.Value.Substring(1, m.Value.Length - 2);
                    }
                    Console.Write(string.Format("{0}\n", ss));
                }
            }

            // フォント一覧情報
            //List<object[]> uLisBaseFont = iTextSharp.text.pdf.BaseFont.GetDocumentFonts(uReader, (i));

            // Ending
            uReader.Close();
            Console.Write("■End\n");
        }
    }
}
これでUnicodeだが文字としてちゃんと取得できるようになった。
ついでにページ単位にフォント情報を一覧取得できる方法も分かったので、コメントアウトしてあるが掲載してみた。利用方法は不明だけど。。。
とりあえずはテキスト文字を抽出できるようになったみたいだが、どこからどこまでが1行分なのかがよくわからない。

元ネタ:http://yonaizumi.dip.jp/weblog/cappe/2011/01/citextsharp-2.html

2012年5月8日火曜日

Redmine On JRuby②(Redmine構築)

インストーラを用いて構築する方法もあるが、今回構築したRedmineを他の環境に展開しても稼働する状態にしたいので、可能な限り手動で展開・設定する方法で構築する。

今回はRedmineをインストールする前の準備段階を記載。

■環境

    • Windows 7
    • JRE 1.6.0_31
    • JRuby 1.6.7
    • MySQL 5.5.23
    • Redmine 1.4.1

■フォルダ構成

C:Redmine
├--- Env
|   ├--- jre6
|   └--- jruby-1.6.7
└--- redmine-1.4.1

■インストール

<Redmineインストール>

・ダウンロード

バイナリの圧縮ファイルをダウンロードする→[Redmineダウンロード]

・インストール

ダウンロードした圧縮ファイルを C:Redmine に展開する。
→ C:Redmineredmine-1.4.1

・database.yml作成

C:helpdeskredmine-1.4.0config にある database.yml.example を
database.yml にコピーし、"production:"を下記のように編集し保存する。
production:
adapter: mysql
database: redmine
host: localhost
username: redmine
password: redmine
encoding: utf8

 ・セッションストア秘密鍵を生成

>cd C:Redmineredmine-1.4.1
>jruby -S rake generate_session_store
>jruby -S bundle install --without development test

・セッション情報を追加

C:Redmineredmine-1.4.0configenvironment.rb の
"Rails::Initializer.run do |config|" から "if"の間に下記の内容を追記し保存する。
config.action_controller.session = { :key => "_myapp_session", :secret => "abcdefghijklmnopqrstuvwxyz1234567890" }
※”:secret”値は任意の30桁以上の文字列。

・データベースにテーブルを作成

>jruby -S rake db:migrate RAILS_ENV="production"

・デフォルトデータをデータベースに登録

>jruby -S rake redmine:load_default_data RAILS_ENV="production"

Select language: ja[Enter]

・添付ファイル保存先設定

redmine-1.4.1\config\configuration.yml に下記の内容を追記する。
attachments_storage_path: "保存先フォルダのパス"
※(例)attachments_storage_path: C:\Redmine\tmp

・WEBrickでWebサーバを起動

>jruby -S script/server webrick -e production

・Redmineにログイン

WEBブラウザから http://localhost:3000 にアクセスし、
ログイン:パスワード を admin:adminでログイン。

環境変数設定バッチファイル作成

コマンドプロンプトを開く度にコマンドで環境変数を設定するのは手間なので
C:Redmine に下記の内容でバッチファイルを作成しておく。
@echo off
SET JAVA_HOME=%~dp0Envjre6
SET PATH=%~dp0Envjruby-1.6.7bin;%~dp0Envglassfishbin;%PATH%
@echo on

元ネタ:http://upstart.jp/blog/?p=211

Redmine On JRuby①(準備)

インストーラを用いて構築する方法もあるが、今回構築したRedmineを他の環境に展開しても稼働する状態にしたいので、可能な限り手動で展開・設定する方法で構築する。

今回はRedmineをインストールする前の準備段階を記載。

■環境

    • Windows 7
    • JRE 1.6.0_31
    • JRuby 1.6.7
    • MySQL 5.5.23
    • Redmine 1.4.1

■フォルダ構成

C:\Redmine\
├--- Env\
|   ├--- jre6\
|   └--- jruby-1.6.7\
└--- redmine-1.4.1\

■インストール

<展開先フォルダ作成>

C:\Redmine と C:\Redmin\Envフォルダを作成する。

<JREインストール>

・ダウンロード

インストーラをダウンロードする→ [JREダウンロード]

・インストール

ダウンロードしたインストーラを実行し、ウィザードにそってインストールする。

・JREのコピー

インストールされたJREを C:\Redmine\Env にコピーする。
※デフォルトのインストール先は C:\Program File\Java\jre6

・JREアンインストール

[コントロールパネル]→[プログラムと機能]でJREをアンインストールする。

・環境変数設定

コマンドプロンプトで一時的に環境変数を設定する。
※コマンドプロンプトを閉じてしまった場合、再度設定する必要
>set JAVA_HOME=C:\Redmine\Env\jre6

<JRubyインストール>

・ダウンロード

バイナリの圧縮ファイルをダウンロードする→[JRubyダウンロード]

・圧縮ファイルの展開

ダウンロードした圧縮ファイルを C:\Redmine\Env に展開する。
→ C:\Redmine\Env\jruby-1.6.7

・環境変数設定

コマンドプロンプトで一時的に環境変数を設定する。
※コマンドプロンプトを閉じてしまった場合、再度設定する必要
>set PATH=C:\Redmine\Env\jruby-1.6.7\bin;%PATH%

・インストール確認

コマンドプロンプトでJRubyのバージョンを確認する。
>jruby -v
jruby 1.6.7 (ruby-1.8.7-p357) (2012-02-22 3e82bc8)
(Java HotSpot(TM) 64-Bit Server VM 1.6.0_31) [Windows 7-amd64-java]

<MySQLインストール>

・ダウンロード

インストーラをダウンロードする→ [MySQLダウンロード]

・インストール

ダウンロードしたインストーラを実行し、ウィザードにそってインストールする。

・環境変数設定

コマンドプロンプトで一時的に環境変数を設定する。
※コマンドプロンプトを閉じてしまった場合、再度設定する必要
>set PATH=C:\Program Files\MySQL\MySQL Server 5.5\bin;%PATH%

・インストール確認

コマンドプロンプトでJRubyのバージョンを確認する。
>mysql –version
mysql  Ver 14.14 Distrib 5.5.23, for Win64 (x86)

・Redmineのデータベースと接続ユーザを作成

コマンドプロンプトから下記のコマンドを入力する。
※ここでは接続ユーザ:パスを[redmine:redmine]で表記するが任意
>mysql -uroot -p
Enter password:  ”インストール時に設定したrootパスワード”[Enter]

mysql>create database redmine character set utf8 [Enter]
Query OK, 1 row affected (0.00 sec)
mysql>create user ‘redmine’@'localhost’ identified by ‘redmine’ [Enter]
Query OK, 1 row affected (0.00 sec)
mysql>grant all privileges on redmine.* to ‘redmine’@'localhost’ [Enter]
Query OK, 1 row affected (0.00 sec)
mysql>exit[Enter]

<Gemインストール>

・Bundlerインストール

>jruby -S gem install bundler

・Gemfile作成

>cd C:\Redmine\Env\jruby-1.6.7
>jruby -S bundle init
Writing new Gemfile to C:/Redmine/Env/jruby-1.6.7/Gemfile
※Gemfileの作成場所は任意

・Gemfile編集

Gemfileを編集し下記の内容で保存する。
source :rubygems
source "http://rubygems.org"
source :rubyforge
source "http://gems.rubyforge.org"
source :gemcutter
source "http://gemcutter.org"
gem 'rails','2.3.14'

・必要なGemをインストール

>jruby -S gem install jruby-openssl
>jruby -S bundle install --without development test

元ネタ:http://upstart.jp/blog/?p=13

Jruby + Redmineの最新版

誰かJruby + Redmineの最新版を作成してくれないかな?
結構、Railsの環境作成が面倒なんです。

2012年5月1日火曜日

SQLServer 2005 split 関数 独自版

********* 以下をそのまま実行 ********** create function [dbo].[split](@str as varchar(1000), @kugiri as char(1), @idx as int) returns varchar(1000) as begin declare @result varchar(1000) declare @loop int set @loop = 0 while (@loop < @idx) begin select @result = case when charindex(@kugiri, rtrim(@str)) > 0 then substring(rtrim(@str), 1, charindex(@kugiri, rtrim(@str)) -1) else rtrim(@str) end select @str = case when charindex(@kugiri, @str) > 0 then substring(@str, charindex(@kugiri, @str)+1, 1000) else null end set @loop = @loop + 1; end return @result end --使用例 -- select dbo.split('aaazbbbzccc', 'z', 2) --結果 -- bbb ********* 以上、ここまで ********** 元ネタ http://blog.livedoor.jp/hashikure3/archives/20478.html