2015年12月25日金曜日

RangeValidator で日付チェック

ASP.NET の Validator で日付チェックを簡単に行うには、 RangeValidator が便利です。以下のように、「Type="Date" MinimumValue="2000/01/01" MaximumValue="2099/12/31"」と設定してください。 (MinimumValue と MaximumValue は、業務要件によって変更してください。)
<asp:RangeValidator ID="RangeValidatorMain" runat="server"
ControlToValidate="TextBoxMain" Display="Dynamic" Type="Date"
MinimumValue="2000/01/01" MaximumValue="2099/12/31">*</asp:RangeValidator>

年を二桁にしたら、JavaScriptでエラーになった。
年チェックは、4桁でないとNGだった。

旧バージョン (.NET 2で動作する)は、年2桁はOK
.NET バージョン4だと年4桁でないとNGらしい

2015年12月21日月曜日

xamarin.form v2

xamarin.formもversion2になったそうです。

https://xamarin.com/forms

C# + XAML => HTML5 + CSS

HTML5では無く、XAMLを使えたらいいなぁ~と思っていたが
その場合、Xamarin の xamarin.formで構築するとOK。

でも、XAMLを HTML5に変換出来たら、マルチプラットフォーム行けるかなぁ~と
考えたら、同じこと考える人がいた。

http://cshtml5.com/

まだ、ベータ版だが、使ってみる価値はありそう。

PCとモバイル用、2画面ビューを作るなら、html5よりXAMLの用が作りやすい。

最近、ブラウザ依存に嫌気が差してきたから

2015年12月19日土曜日

Fayde Silverlight Everywhere, No Plugins

HTML%で画面設定をするのは悪くないが、どうしても、ブラウザ依存になる。
SilverLight、Flashを期待していたのだが、JavaScriptで XAMLを実装したOSSがあった。

iOS, Androidも、OSと画面のサイズが劇的に増えたので、1つのプロジェクト
マルチプラットフォームはどうしたら、実装出来るか、悩みが増える。

PC、モバイルに2個だけのVIewなら、Faydeを使って試しても良いかも

http://fayde.io/

ASP.NET MVC クッキーを取得・設定する

ASP.NET MVC クッキーを取得・設定する


元ネタ http://miso-soup3.hateblo.jp/entry/2013/12/08/051521

GETでクッキーを取得
POSTでクッキーを設定

上記のサブルーチンさえ作ってしまえば、セッション変数を同じ感じで使える

/// <summary>
  /// キーから、リクエストのクッキーを取得します
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  private string GetCookieValueByKey(string key)
  {
   HttpCookie cookie = Request.Cookies[key];
   if (cookie == null)
    return null;
   return cookie.Value;
  }

  /// <summary>
  /// レスポンスにクッキーを設定します
  /// </summary>
  /// <param name="key">キー</param>
  /// <param name="value"></param>
  /// <returns></returns>
  private void SetCookie(string key, string value)
  {
   var cookie = new HttpCookie(key);
   cookie.Value = value;
   Response.Cookies.Add(cookie);
  }

2015年12月10日木曜日

specified cast is not valid. c#

実行時に specified cast is not valid. が表示された

原因
よく分からないが多分、linqの数字castがうまくいかなったらしい

金額だったので、ビューの金額を集計する箇所で、項目定義がdecimal(11,2)になっていたのを
CASTで intの属性へ変更した


2015年12月1日火曜日

shift-JIS to utf-8 のファイル変換



元ネタ

http://www.atmarkit.co.jp/fwin2k/win2ktips/1012pschcode/pschcode.html




powershell source
※ファイル:FileConvert.ps1
# スクリプト・ファイルのパラメータを宣言(先頭から「変換対象のフォルダ」
# 「変換後のファイルの保存先」「変換前の文字コード」「変換後の文字コード」)
param(
[String]$in = "c:\tmp\convert",
[String]$out = "c:\tmp\converted",
[String]$from = "Shift-JIS",
[String]$to = "EUC-JP"
)
# 引数$from、$toから、文字コードを表すEncodingオブジェクトを生成
$enc_f = [Text.Encoding]::GetEncoding($from)
$enc_t = [Text.Encoding]::GetEncoding($to)
# 与えられたパス(c:\tmp\convert)から合致するファイルリストを再帰的に取得
Get-ChildItem $in -recurse |
# 取得したファイルを順番に処理
ForEach-Object {
# 取得したオブジェクトがファイルの場合のみ処理(フォルダの場合はスキップ)
if($_.GetType().Name -eq "FileInfo"){
# 変換元ファイルをStreamReaderオブジェクトで読み込み
$reader = New-Object IO.StreamReader($_.FullName, $enc_f)
# 保存先のパス、保存先の親フォルダのパスを生成
$o_path = $_.FullName.ToLower().Replace($in.ToLower(), $out)
$o_folder = Split-Path $o_path -parent
# 保存先のフォルダが存在しない場合にフォルダを自動生成
if(!(Test-Path $o_folder)){
[Void][IO.Directory]::CreateDirectory($o_folder)
}
# 保存先ファイルをStreamWriterオブジェクトでオープン
$writer = New-Object IO.StreamWriter($o_path, $false, $enc_t)
# 変換元ファイルを順に読み込み、保存先ファイルに書き込み
while(!$reader.EndOfStream){$writer.WriteLine($reader.ReadLine())}
# ファイルをすべてクローズ
$reader.Close()
$writer.Close()
}
}


2015年11月27日金曜日

Entity Framework database firstでクラスを作成する方法

database firstでクラスを作成する方法

 

■プロジェクトの作成とサンプルDBの追加

C#のプロジェクトの新規作成します。 EntityFrameworkの機能にフォーカスするために、 ここではコンソールアプリケーションを選択します。
便宜上、プロジェクト名は、EFSample という名前で話を進めます。

プロジェクトができたら、次に、App_Data フォルダをプロジェクトに新規追加します。
作成されたVisual StudioのプロジェクトのApp_Dataフォルダに、エクスプローラから Northwnd.mdf と Northwnd_log.ldf をドロップします。
ファイルが App_Dataフォルダにコピーされると同時に、プロジェクトに追加されます。

c01

■Entity Data Model 作成

  1. プロジェクトEFSample に Models フォルダを作成します。

  2. Model フォルダを右クリックし、[新しい項目の追加]を選びます。

  3. 新しい項目の追加ダイアログが表示されますので、[ADO.NET Entity Data Model ]を選択し、名前に "NorthwindContext"と入力し、[追加]ボタンを押します。

    c02
  4. [データベースからCode First] を選択し、次へ ボタンをクリックします。

    c03

    ※ 変な名前ですね。もっと良い訳はなかったんでしょうか?

  5. 新しい接続ボタンをおして、設定のプロパティダイアログで、データソースの 変更で、Microsoft SQL Server データベースファイル を選びます。

    C051

    c04


  6. データベースのファイル名では、先ほどのNorthwnd.mdf を指定し、OK ボタンを押します。

  7. ダイアログの下の入力欄に、"NorthwindConnection" と入力し、次へを押します。

    C52
  8. 「ファイルをプロジェクトにコピーし、接続を変更しますか?」 と聞いてきますが、いいえを選択します。
    ※ はっきり言ってこのメッセージは不要ですね。はいを押すとプロジェクトの直下に mdfファイルがコピーされてしまいます。
  9. 次のウィザード画面では、すべてのテーブルをモデルに含めるので、 テーブルにチェックを入れます。 さらに、「生成されたオブジェクトの名前を複数化または単数化する」にチェックし、 完了ボタンを押します。

    c08

  10. Models フォルダに、NorthwindContext.cs と、各テーブルに対応した C#のソースフィルが追加されていることを確認します。

    c09

実際に、これらのソースファイルに中身を確認してください。 いくつかの属性が追加されてはいますが、普通のC#のクラスである ことを確認できると思います。

NorthwindContext.cs には、Categories や Customersといった テーブル名を複数形にしたプロパティが定義されています。 EntityFramework では、これらのプロパティを使い、テーブルにアクセス することになります。


次のバージョンのEntityFrameworkでは、EDMXファイル([データベースからEF Degigner]で作成される)がサポートされないことがアナウンスされています。
そのため、このシリーズでは、EDMXを使わずに、[データベースからCode First]で、エンティティモデル を作成しています。Database Firstでも問題なくプログラムを書くことができます。

■Productsテーブルの参照

Productsテーブルからデータを取得してみましょう。
プログラムでは、先ほど作成した Product「EntityFrameworkエンティティクラス」を 経由して、Productsテーブルの各カラムにアクセスすることになります。 さっそく、このProductsテーブルにアクセスするコードを書いてみます。

  1. using LinqToEntitySample.Models;
  2. ...
  3.  
  4. static void Main(string[] args) {
  5. using (var db = new NorthwindContext()) {
  6. var query = from product in db.Products
  7. select product;
  8. foreach (Product p in query)
  9. Console.WriteLine("{0} | {1} | {2} | {3}",
  10. p.ProductID, p.ProductName, p.UnitPrice, p.QuantityPerUnit);
  11. Console.ReadLine();
  12. }
  13. }

実行すると、


  1. 1 | Chai | 18.0000 | 10 boxes x 20 bags
  2. 2 | Chang | 19.0000 | 24 - 12 oz bottles
  3. 3 | Aniseed Syrup | 10.0000 | 12 - 550 ml bottles
  4. 4 | Chef Anton's Cajun Seasoning | 22.0000 | 48 - 6 oz jars
  5. 5 | Chef Anton's Gumbo Mix | 21.3500 | 36 boxes
  6. 6 | Grandma's Boysenberry Spread | 25.0000 | 12 - 8 oz jars
  7. 7 | Uncle Bob's Organic Dried Pears | 30.0000 | 12 - 1 lb pkgs.
  8. .
  9. .
  10. .

と表示され、Productsテーブルからデータを取得できたことを確認できます。
NorthwindContext クラスは、[データベースからCode First]の追加で自動生成されたクラ スで、NorthwindContext.csで以下のように定義されています。
  1. public partial class NorthwindContext : DbContext {
  2. public NorthwindContext()
  3. : base("name=NorthwindContext") {
  4. }
  5.  
  6. public virtual DbSet Categories { get; set; }
  7. public virtual DbSet CustomerDemographics { get; set; }
  8. public virtual DbSet Customers { get; set; }
  9. public virtual DbSet Employees { get; set; }
  10. public virtual DbSet Order_Details { get; set; }
  11. public virtual DbSet Orders { get; set; }
  12. public virtual DbSet Products { get; set; }
  13. public virtual DbSet Regions { get; set; }
  14. 以下省略

先ほど利用した Productsプロパティも定義されていますね。 EntityFrameworkでは、このDbContextクラスの派生クラスのインスタンスを生成 することで、データベースにアクセスすることが可能になります。

先ほどのクエリ式では、Productsテーブルから全てのデータを取得しています。各カラムの値は、プロパティとしてアクセスできます。
なお、Productsテーブルを示すNorthwindContextクラスのプロパティ名はProductsと複数形になっている点に注目してください。単数形のProductは、1行分を表すクラスです。

2015年11月21日土曜日

ASP.NET MVC テーブル名の設定

ASP.NET MVCでテーブル名は、設定しないと自動的にクラス名+s になる

例 クラス名 User テーブル名 Users

例えばコードFirstでは無く、Database Firstなら、テーブル名を設定したい
その場合は、クラス名の下に

    public class DEBAN_HENKODbContext : DbContext
    {
        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)  {
            base.OnModelCreating(modelBuilder);

            //こんな感じで好きな名前を定義します
            modelBuilder.Entity<DEBAN_HENKO>().ToTable("DEBAN_HENKO");
        }
    }

modelBuilderを使ってテーブル名を設定する

2015年11月7日土曜日

ASP.NET MVC Identityによるカスタムログイン

usernamagerを使えば楽なのだが
ユーザー管理は基幹システムで管理するので
Webサービス経由でログイン情報を取得する。

他のサンプルを見ても、usermanager経由だったので、ClaimsIdentityを生成する方法が
分からんので、単純にセッション変数を使ってログインを使用かな~と思ったが
何とかサンプルが有ったので、記述しておく。

AccountControllerを以下のように修正

using Microsoft.AspNet.Identity;  
using Microsoft.Owin.Security;  
using System.Security.Claims;  
using System.Web;  
using System.Web.Mvc;

namespace Mvc5AuthSample.Controllers  
{
    public class AccountController : Controller
    {
      public ActionResult Login()
      {
        return View();
      }

      [HttpPost]
      public ActionResult Login(string username, string password)
      {
        if (username == "alice" && password == "supersecret")
        {
           HttpContext.GetOwinContext().Authentication
             .SignOut(DefaultAuthenticationTypes.ExternalCookie);

           Claim claim1 = new Claim(ClaimTypes.Name, username);
           Claim[] claims = new Claim[] { claim1 };
           ClaimsIdentity claimsIdentity = 
             new ClaimsIdentity(claims,
               DefaultAuthenticationTypes.ApplicationCookie);

           HttpContext.GetOwinContext().Authentication
            .SignIn(new AuthenticationProperties() 
              { IsPersistent = false }, claimsIdentity);

           return Redirect("/Home");
        }
        else
        {
           ModelState.AddModelError("", 
            "Invalid username or password.");
        }

        return View();
      }
    }
}


元ネタ
http://aspnetguru.com/adding-authentication-to-asp-net-mvc-5/



2015年10月30日金曜日

ASP.NET migrationの仕方

PM> Add-Migration 作業名

Migrationフォルダに日付+時刻+作業名のファイルが作成される

上記ファイルに変更を記述

Projectを Rebuild後

PM> Update-Databse

これだと、変更点が、否応なしに出来るので
テスト環境から本番環境の移行作業も楽になりそうだ。

ASP.NET MVC コードの内容でデータベースを更新する

パッケージマネージャで
PM> Enable-Migrations -ContextTypeName Jobs.Models.HinomaruContext
                                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  ココはContext名

2015年10月29日木曜日

ASP.NET MVC identityで使うテーブル名の変更

Models/IdentityModels.cs の中に以下の記述を追加

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) {
            base.OnModelCreating(modelBuilder);

            //こんな感じで好きな名前を定義します
            modelBuilder.Entity<IdentityUser>().ToTable("mUsers").Property(p => p.Id).HasColumnName("UserId");
            modelBuilder.Entity<ApplicationUser>().ToTable("mUsers").Property(p => p.Id).HasColumnName("UserId");
            modelBuilder.Entity<IdentityUserRole>().ToTable("dUserRoles");
            modelBuilder.Entity<IdentityUserLogin>().ToTable("dUserLogins");
            modelBuilder.Entity<IdentityUserClaim>().ToTable("dUserClaims");
            modelBuilder.Entity<IdentityRole>().ToTable("mRoles");
}

ASP.NET MVC ビューエンジンのbundle

Razorエンジンで
    @Styles.Render("~/Content/mobileCss")
    @Scripts.Render("~/bundles/modernizr")
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/jquerymobile")












上記のbundleって何だろう~って思っていたら
Global.asxの      BundleConfig.RegisterBundles(BundleTable.Bundles); 

からApp_Startにある BundleConfig.cs に繋がっている。

 BundleConfig.csのversionを直せば、各viewのurlを直さないで済む



Entity Frameworkでレコード取得

今まで、SQL to LINQを使ってきたが
ASP.NETのMVCを使う場合、Entity Frameworkが標準みたいになっているので
SQL to LINQから乗り換えを図る

SQL to LINQでは、テーブルの項目を変更する時は
1.テーブルの項目を変更
2.一旦デザインからテーブル削除してから、再度Drag&Dropで貼り付けしていた

Entity Frameworkからは、code firstなので、classの内容が
データベースと一致させるのが楽

※telerikのdata accessを今まで使ってきたのに、telerikのデザイナが最新versionでは
 無くなっていた、SQL Server以外 主にOracleですが、使えて便利だったのに
 codeだけでは、じじぃには、管理しづらいっす。

使い方は、 SQL to LINQとあまり変わらない

using System.LINQ;  と

using (var db = new 使いたいEntity) {
  var querys = db.テーブル,FirstOfDefault(a => a.Id = 1);
}



2015年10月16日金曜日

log4net

C#でサービスを作成することになり
実行履歴が欲しいので、log4netでログを出力する

詳しいことは、@ITなどで記述されている

パラメータは以下の通り

  <log4net>
    <!-- ログ出力先の定義 -->
    <appender name="DailyFileAppender" type="log4net.Appender.RollingFileAppender">

      <!-- ログ・ファイル名の先頭部分 -->
      <param name="File" value="d:\temp\AskaPrint" />

      <!-- ファイル名の日付部分 -->
      <param name="DatePattern" value='yyyyMMdd".log"' />

      <!-- ログファイルの切替 { サイズ: Size, 日付: Date } -->
      <param name="RollingStyle" value="Date" />

      <!-- 追加 -->
      <param name="AppendToFile" value="true" />

      <!-- ログ・ファイル名が固定ではないので“false”を指定 -->
      <param name="StaticLogFileName" value="false" />

      <!-- ログの書式 -->
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>
    <root>
      <!-- ログのレベルを指定 -->
      <!-- すべてのログレベルを出力 -->
      <level value="ALL" />
      <!-- どのログ出力先を使用するか -->
      <appender-ref ref="DailyFileAppender" />
    </root>
  </log4net>

2015年10月6日火曜日

MAGIC XPA 3.0betaを使ってみて

MAGIC XPA 3.0betaを使ってみた

VisualStudio2010のform editorを使っているので
ほとんど、visual studioの開発

オイラはvisual studioで開発していたので違和感が無い
今までMAGICで開発していた人からすると、違和感ありすぎ

.NETになったら実効ライセンスがダタになるとか
実行速度は速くなるとか、特典が無いかな~


ASP.NET MVCをやる羽目に

モバイルの仕事を請けるため
ASP.NET MVCをやる羽目になった。
その案件のテスト端末がzenfon2!!

今持っているandroid端末が fujitsu F-03E で買い換えたいな~と思っていたら
案件を引き受ける=zenfon2が貰える

goodタイミングで案件が入ってきた
※ただし、他の仕事をしながらなので、既にアップアップ状態.....

2015年9月17日木曜日

WPF: xamlで文字列を改行させる。

<!-- "&#10;"を挿入する。xamDataGridの要素でもOK。-->
<igDP:Field Column="7" Name="Cmt" Label="コメ&#10;ント">
<!-- "&#xa;"でもいけるっぽい。-->
<igDP:Field Column="7" Name="Cmt" Label="コメ&#xa;ント">
<!-- タグ内で書く場合はLineBreakタグを入れる。-->
<TextBox>
My name is<LineBreak/>
aikazu yendo.
</TextBox>

2015年8月28日金曜日

MAGICからの印刷でPDFファイルに変換する

MAGICからの印刷でPDFファイルに変換する

前にXPSからPDFに変換していたが
Windows10からPDF writerが標準で付いてきた
それと、PDF Viewerも標準なので、PDFに関してはOS入れたら
PDF環境はOKになっている。

MAGICからでは、印刷のIOテーブルから式でファイル名を指定すればOK



【C#】文字列の先頭や末尾

var value = "ABC123";

if (value.StartsWith("A"))
{
  Console.WriteLine("先頭がA");
}

if (value.EndsWith("3"))
{
  Console.WriteLine("末尾が3");
}

2015年7月28日火曜日

IIS 7以上でクラシックASPの詳細なエラーを表示する

IIS7.5以上でクラシックASP(レガシーASP/ Active Server Pages)を実行、エラーが発生した際、規定の設定では詳細なエラーが表示されません。
これはセキュリティ上の理由からだそうです。

これを表示させてやるには、二か所ほど設定を変えてやる必要があります。
※今回、2008 R2上のIIS 7.5で行いましたが、7.0や8.0でも多分同じです。

1) 「ブラウザーへのエラー送信」を有効にする

『インターネットインフォメーションサービス (IIS) マネージャ』から、該当の仮想ディレクトリの設定で、[ASP]->[コンパイル]-[デバッグ プロパティ]-[ブラウザーへのエラー送信]を"True"に変更してやる。



2) エラーページで「詳細なエラー」を選択

[エラーページ]->[機能設定の編集]-[詳細なエラー]を選択する。





以上で、詳細なエラーが表示されるようになります

元ネタ
http://kiyokura.hateblo.jp/entry/20131001/p1

2015年7月27日月曜日

MAGICからの印刷でPDFファイルに変換する

MAGICからの印刷でXPS Writerを使っていたのだが
各端末にXPS Writerを設定するのが面倒になってきた。

MAGICのリッチからはXPSで作成後、GhostXPSで
XPSからPDFに変換するのが楽だと思う。

MAGICからPDFに直接印刷出来ないので、XPSを使っていたのが
Windows10からPDF Writerが標準になるから、XPSも、どうなるか
※SilverLightみたいに、捨て殺しになりそうです。

変換例
C:\gxps-871.exe -sDEVICE=pdfwrite -sOutputFile=myfile.pdf -dNOPAUSE myfile.xps

2015年7月1日水曜日

srvany.exeのレジストリ設定

scコマンドでサービスを作成後
Parametersのキーを追加

AppDirectoryと Applicationを追加する


sc commandで srvany.exeからサービス作成

sc create servicename binPath= "C:\Program Files (x86)\Windows Resource Kits\Tools\srvany.exe"

2015年6月19日金曜日

A-AUTO50 無料のJOB管理

A-AUTOは、昔からJOB管理を扱っているソフトだが
A-AUTO50、50個までのJOBなら無料版が出回っていた


WindowsでワークフローマネージャのAzkabanを動かす

元ネタ
http://qiita.com/qtwi/items/e6d3b04c4645e52a0157

https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB0QFjAA&url=http%3A%2F%2Fsstd-bigdata.blogspot.com%2F2014%2F09%2Fazkaban.html&ei=7mqDVZHCDKPEmAWiiJzQDw&usg=AFQjCNEcUgKQHUfuSbeBtHt-gsg1K5yqCg&sig2=r6Ykaa6I4rVtrrKquFcHjg&bvm=bv.96042044,d.dGY


OSSでJOB管理は、Hinemos, Zabbix, JobSchedulerなどが有名
Webで手軽にJOB管理出来ないか探していたら
javaで作った Azkabanがあった。


2015年6月10日水曜日

Excel Viewerのコマンドライン

Excel Viewerのコマンドライン

/e ファイル名

起動時にファイルを読み込む

印刷オプションがあったら、サーバにインストールして印刷サービスを作成するんだけどなぁ~

LibreOfficeでExcelをPDF変換

LibreOfficeのコマンドラインからExcelファイルをPDFファイルに変換する

libreoffice --headless --nologo --nofirststartwizard --convert-to pdf ファイル名 --outdir ./


変更する箇所は、ファイル名と --outdirの出力先フォルダのみ


2015年6月2日火曜日

kendo ui culture

kendo ui cultureの設定

 <script src="./js/cultures/kendo.culture.ja-JP.min.js"></script>

上記のJavascriptを読ませることで、datePcikerのカレンダーが日本語になる

2015年5月14日木曜日

kendo ui treeview html5で表示

html側
        <script>
            $(document).ready(function () {

                function onSelect(e) {
                    //alert("Selecting: " + this.text(e.node));
                }

                //
                function processTable(data, idField, foreignKey, rootLevel) {
                    var hash = {};

                    for (var i = 0; i < data.length; i++) {
                        var item = data[i];
                        var id = item[idField];
                        var parentId = item[foreignKey];

                        hash[id] = hash[id] || [];
                        hash[parentId] = hash[parentId] || [];

                        item.items = hash[id];
                        hash[parentId].push(item);
                    }

                    return hash[rootLevel];
                }

                //
                var dataSource = new kendo.data.DataSource({
                    transport: {
                        read: { url: "./data/get_data.php", type:"GET", datatype: "json" }
                    },
                    batch: false,
                    schema: {
                        data: 'data'
                    }
                });

                dataSource.fetch(function () {
                    var data = this.data();
                    // tree for visualizing data                    $("#treeview").kendoTreeView({
                        dataSource: processTable(data, "id", "parent_id", 0),
                        loadOnDemand: false,
                        select: onSelect
                    });
                });

            });


        </script>

php側
if ($verb == 'GET') {

    $result = new DataSourceResult(DB_STRING, DB_USER, DB_PASSWORD);

    $columns = array('id', 'parent_id', 'text');

    $result = $result->read('テーブル名', $columns, null);

    header('Content-Type: application/json');
    echo json_encode($result, JSON_NUMERIC_CHECK);
}

remote data表示がうまく動作しなかったので
datasourceから、javascriptで、tree構成を作ってから、データを流し込んだ

2015年5月8日金曜日

ASP.NET 複数ファイルをdownloadする方法

ASP.NETのWeb Formで複数のファイルをdownloadする場合

通常は、1ファイルで Response.Writeと、Response.EndでOKですが
複数ファイルをdownloadする場合は、

            foreach (var rec in records) {


        // ストリームへエクスポート
                Stream stream = File.OpenWrite(Server.MapPath("~/excel/mdrReport_" + vFileCnt.ToString() + vFileName));
                BinaryWriter bw = new BinaryWriter(stream);
                bw.Write(pck.GetAsByteArray());
                bw.Close();

                vFileCnt++;
            }

            //javascriptでdownload
            //作成したxlsxファイルを表示する
            Response.Write("<script language=\"javascript\">");

            for (int i = 1; i < vFileCnt; i++) {
                Response.Write("window.open(\"http://localhost/test_mdr/excel/MdrReport_" + i.ToString() + vFileName + "\");");
            }
            Response.Write("</script>");

2015年4月24日金曜日

c# 月の最後 month lastday

new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(1).AddDays(-1);

月初から月を+1して、1日引くと、月末になる


2015/4/1 を次月にすると、 2015/5/1
そこから、1日引くと、 2015/4/30になる

MAGIC MS-SQL 分離レベルを1

MAGIC MS-SQL 分離レベルを1にする

2015年4月14日火曜日

Oracle検索で大文字小文字を区別なく検索する

 Oracle検索で大文字小文字を区別なく検索する

WHERE NLSSORT(得意先名,'NLS_SORT=JAPANESE_M_CI') like '%'||NLSSORT('ガ','NLS_SORT=JAPANESE_M_CI')||'%'


上記だと、うまく行かなかった

select namefrom 製品マスタ
whereUTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE(name)),'kana_fwkatakana')like '%' || UTL_I18N.TRANSLITERATE(UPPER(TO_MULTI_BYTE( 検索文字 )),'kana_fwkatakana') || '%'
※'kana_fwkatakana'はすべてのタイプの仮名文字を全角カタカナに変換します。

2015年4月10日金曜日

2015年4月7日火曜日

powershellからInternetExploerを起動後、終了させる

$ie = new-object -com InternetExplorer.Application
$ie.visible=$true
$ie.navigate("http://www.yahoo.co.jp/")

# 読み終わるまで待ち続ける
While($ie.Busy)
{
    Start-Sleep -milliseconds 100
}

$ie.quit();
exit

2015年4月3日金曜日

kendo ui grid delete sample logic

html側
        <script>
            kendo.culture("ja-JP");

            $(document).ready(function () {
                var dataSource = new kendo.data.DataSource({
                    transport: {
                        read: { url: "./data/Customer.php", type: "GET", datatype: "json" },
                        destroy: {
                            url: "./data/Customer.php", type: "POST", datatype: "json"
                        },
                        parameterMap: function (data, type) {
                            return kendo.stringify(data);
                        }
                    },
                    error: function (e) {
                        alert("Status: " + e.status + "; Error message: " + e.errorThrown);
                    },
                    batch: true,
                    schema: {
                        model: {
                            id: "KosID",
                            fields: {
                                KosID: { editable: false, nullable: true, type: "number" },
                                KosName: {}
                            }
                        },
                        data: 'data',
                        total: 'total'
                    },
                    pageSize: 10
                });

                $("#grid").kendoGrid({
                    dataSource: dataSource,
                    pageSize: 10,
                    height: 550,
                    filterable: true,
                    sortable: true,
                    selectable: false,
                    pageable: {
                        refresh: false,
                        pageSizes: true,
                        buttonCount: 5
                    },
                    columns: [
                        { field: "KosID", title: "顧客No", filterable: false },
                        { field: "KosName", title: "顧客名称", filterable: false },
                        { command: "destroy", title: "&nbsp;", width: 100 }
                    ],
                    editable: "inline"
                });
            });

        </script>


php側
<?php
require_once '../lib/DataSourceResult.php';
require_once '../lib/kendo/Autoload.php';
require_once "db_Config.php";

$verb = $_SERVER['REQUEST_METHOD'];

if ($verb == 'GET') {

    $result = new DataSourceResult(DB_STRING, DB_USER, DB_PASSWORD);

    $columns = array('KosID', 'KosName');

    $result = $result->read('kos', $columns, null);

    header('Content-Type: application/json');
    echo json_encode($result, JSON_NUMERIC_CHECK);
}

if ($verb == 'POST') {

    $request = json_decode(file_get_contents('php://input'));
    $result = new DataSourceResult(DB_STRING, DB_USER, DB_PASSWORD);
    $result = $result->destroy('kos', $request->models, 'KosID');
    
}

?>


削除のサンプルがなかなか無かったので、苦労しました

kendo ui grid 数字columnでゼロならブランクにしたい

kendo ui grid 数字columnでゼロならブランクにしたい

指定columnに templateを配置
templateに処理ロジックを埋め込む

 columns: [
  { hidden: true, field: "RepairNo" },
  { field: "ReceiveNo",    title: "受付No",     filterable: false, width: 80 },
  { field: "UnitName",     title: "ユニット名", filterable: false },
  { field: "SerialNo",     title: "シリアル",   filterable: false, width:160 },
  { field: "ReceiveDate",  title: "受付日",     filterable: false, format: "{0:yyyy/MM/dd}", width :105 },
  { field: "ShipDate",     title: "発送日",     filterable: false, format: "{0:yyyy/MM/dd}", width: 105 },
  { field: "Transpoter",   title: "配送業者",   filterable: false, width: 100 },
  { field: "TranspotNo",   title: "送り状No",   filterable: false },
  { field: "RepairAmount", title: "修理金額", filterable: false, width: 100,
      template: "#if (RepairAmount != 0) {# #= RepairAmount # #}else{# &nbsp; #}#" }
],

2015年4月2日木曜日

ftp batchからファイルをUPする

FTPコマンドからファイルをUPする方法

cmdコマンドから ftp -s:filename
で単体実行する場合は問題無かった。

MAGICからcmd /c ftpのバッチファイル を指定して実行すると、putコマンドの
PORT でftpはhang upする。

WINSCPだと、バッチのスクリプトを作成したら、問題無かったので、記述しておく

batch file
C:\MAGIC\FTP\winscp\WinSCP.exe /script=c:\magic\ftp\ftpCustomer2.txt

script file
option batch abort
option confirm off
open ftp://user:password@url/
put C:\MAGIC\FTP\customerRenewal.csv /ssl/home/member/data/
exit


2015年4月1日水曜日

kendo ui datasource template logic

templateに処理ロジックの記述が可能

例:項目EstimateRequestDateがnullなら、ブランクにしたい

                    #if (EstimateRequestDate != null) {#
                       #= EstimateRequestDate #
                    #}else{#
                       &nbsp;
                    #}#

# .. #の間がjavascript
項目の値を表示するには、#=

2015年3月31日火曜日

Hyper-vでPHP開発環境を作成

Hyper-vでPHP開発環境を作成

WindowsでXAMP環境でPHP開発環境を作成していたが
本番のHostOSがUnix系なので、ファイル名の大文字小文字で動作しない現象が多発しました。

やっぱり、Hyper-vでUnix系OSにPHPファイルを置いて、開発しないといけないので
FreeBSD+ZFS+Sambaで構築しようと思う

GUI要らないし

2015年3月27日金曜日

kendo ui datasource sort

                                    var dataSource = new kendo.data.DataSource({
                                        transport: {
                                            read: { url: "./data/repairdata.php", type: "GET", datatype: "json" }
                                        },
                                        batch: false,
                                        schema: {
                                            data: 'data',
                                            total: 'total'
                                        },
                                        pageSize: 10,
                                        sort: {
                                            field: "ReceiveDate", dir:"desc"
                                        },
                                    });

2015年3月26日木曜日

kendo ui use template + datasource + PHP datasourceresult

kendo ui と kendo のtemplate機能 データをphpのdatasourceresultから取得する

sample sourceから実行するが、ことごとくNG
理由: PHPのdatasourceresultのjsonにtotalがあるから

従って、datasourceのschemaにdataを設定する必要がある

    <div id="details"></div>

    <script type="text/x-kendo-template" id="template">
        <h3 style='text'>修理詳細</h3>

        <table>
            <tr>
                <td>
                </td>
            <tr>
        </table>

            #= RepairNo #

    </script>
  
    <script>
            var template = kendo.template($("#template").html());

            var dataSource = new kendo.data.DataSource({
                transport: {
                    read: { url: "./data/RepairdataDetail.php?id=" + vId, type:"GET", datatype: "json" }
                },
                batch: false,
                schema: {
                    data: 'data'
                }
            });

            dataSource.bind("change", function () {
                $("#details").html(kendo.render(template, dataSource.data()));
            });

            dataSource.read();
        });
    </script>

オレンジ色した部分がミソ
1.datasourceのschemaにdataを指定すること
2.datasourdceのデータをbindするには、viewではなく、dataだった

2015年3月23日月曜日

Teleirk kendo grid select item

$("#grid").kendoGrid({
    dataSource: {
        type: "odata",
        transport: {
            read: "http://demos.kendoui.com/service/Northwind.svc/Orders"
        },       
        pageSize: 10,
        serverPaging: true        
    },
    height: 250,    
    pageable: true,
    selectable: "row multiple",
    columns: [
        "OrderID",
        "Freight",        
        "ShipName",                            
        "ShipCity"        
    ],
    change: function() {   
        var text = "";
        var grid = this;                
        
        grid.select().each(function() {
            var dataItem = grid.dataItem($(this));
            text += "OrderID: " + dataItem.OrderID + "\n";
        });
        
        alert(text);
    }        
});

kendo ui grid column 非表示

kendo ui grid column 非表示

<div id="grid"></div>
<script>
$("#grid").kendoGrid({
  columns: [
    { hidden: true, field: "id" },
    { field: "name" }
  ],
  dataSource: [ { id: 1, name: "Jane Doe" }, { id: 2, name: "John Doe" } ]
});
</script>

telerik kendo ui set a theme

telerik kendo ui のテーマを設定する方法

初期値
<html>
<head>
    <link rel="stylesheet" href="[file path]/kendo.common.min.css" />
    <link rel="stylesheet" href="[file path]/kendo.default.min.css" />
</head>
 
これをシルバーのテーマに変更する場合は 
    <link rel="stylesheet" href="./styles/kendo.common.min.css" />
    <link rel="stylesheet" href="./styles/kendo.silver.min.css" />

defaultの箇所をsilverに変更する

2015年3月20日金曜日

kendo wapper PHP DataSourceResultの接続文字列設定

kendo wapper PHP DataSourceResultの接続文字列設定

DataSourceResultのソースを見るとデータベースに接続する方法が
PDOになっている。

従って、PDOと同じ文字列を設定すればOK

     $result = new DataSourceResult(
'mysql:host=yourhost;dbname=yourdb;charset=utf8'
,
'user', 'password');


Kendo UI Wapper PHP DatasourceResult read and filter

PHP source



    $result = new DataSourceResult(DB_STRING, DB_USER, DB_PASSWORD);

    $columns = array('RepairNo','ReceiveNo','Status','UnitName','SubUnitName','SerialNo',
                     'EstimateRequestDate','EstimateAnswerDate','ReceiveDate','ShipDate',
                     'Transporter','TransportNo','RepairAmount','AcceptDate','CustomerCd','AccountCd');

    //セッションの顧客CDを条件とする
    $result->field = 'CustomerCd';
    $result->operator = 'eq';
    $result->value = $_SESSION['customercd'];
    //    $result->value = '010010';

    $result->filter = $result;

    $result = $result->read('repairdata', $columns, $result);

    header('Content-Type: application/json');
    echo json_encode($result, JSON_NUMERIC_CHECK);


DataSourceResultのクラスにfilterメソッドが有り
そのfilterメソッドに値を設定することで、SQL のwhere句が生成されるようです。

2015年3月12日木曜日

WPFのWindow表示でTelerikのComboBOXが表示されない

現象
WPFのWindow表示でTelerikのComboBOXが表示されない

原因
XAMLのmerginが原因らしい

対応
stackpanelを追加して、comboboxのmerginはすべて0にした

2015年3月9日月曜日

C# オブジェクトのメンバ情報とメンバの値を動的に取得する

WPFのTelerik GridViewがclassからデータ表示になっている
データがMVVM方式でclassからデータを流し込むので
Cellの位置は取得出来ないらしい  GetIndexとかの関数が無かった

仕方ないので、Telerik.Windows.Controls.GridViewCellInfo s = GridView1.SelectedCells[0];
上記より、選択した行のデータを取得後
var c = s.Column;  でカラム情報を取得
 var item = (ATR_ScheduleView)s.Item;

g作業者ID = GetItem(item, typeof(ATR_ScheduleView), c.Header);

   private string GetItem(object targetobj, Type t, string iName) {

            string vValue = "";

            //using System.Reflection;が必要
            //メンバを取得する
            MemberInfo[] members = t.GetMembers(
                BindingFlags.Public |
                BindingFlags.Instance |
                BindingFlags.DeclaredOnly);

            foreach (MemberInfo m in members) {
                //メンバの型と、名前を表示する
                //メンバの型がプロパティなら
                if (m.MemberType.ToString().Equals("Property") && m.Name == iName) {

                    PropertyInfo pr = t.GetProperty(m.Name);
                    object resobj = pr.GetValue(targetobj, null);

                    vValue = resobj.ToString();
                }
            }
            return vValue;
        }

取得した行データ(item)のヘッダ位置から選択したcellの値を取得

2015年2月25日水曜日

【xampp】LAN内の他のPCからページが見れない場合の対処法

【xampp】LAN内の他のPCからページが見れない場合の対処法

新しいPCにxamppをインストールしたら、他のPCからページが見れなかった。
xamppをインストールしたlocalhostからなら問題なく閲覧できるが、LAN内の他のPCからIPアドレスを打っても、「見つかりません」的なタイムアウトで終わる。

エラーメッセージどおり、httpd – xampp.confを修正。
このとき、修正箇所はファイルの一番下の部分だった。
修正前
——————————————–
#
# New XAMPP security concept
#

Require local
ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var

——————————————–
↓↓↓
修正後
——————————————–
#
# New XAMPP security concept
#

# Require local

2015年2月20日金曜日

VisualStudioでHTMLデザイナを表示する

ソリューションエクスプローラーで表示されているHTMLファイルの場合
  1. そのHTMLファイルを右クリックして「ファイルを開くアプリケーションの選択」
  2. 表示された「ファイルを開くアプリケーションの選択ダイアログ」の一覧から「HTML(Webフォーム)エディタ」を選んで開く。
ソリューションエクスプローラーに無いHTMLファイルの場合
  1. メニューの、ファイル(F)->開く(O)->ファイル(F)を選択
  2. 表示されたファイル選択ファイアログでHTMLファイルを選択して、[開く]ボタンの横のドロップダウンから「ファイルを開くアプリケーションの選択」。
  3. 表示された「ファイルを開くアプリケーションの選択ダイアログ」の一覧から「HTML(Webフォーム)エディタ」を選んで開く。
規定値と設定しておけば、以降は自動で開かれます。

2015年2月16日月曜日

PHP勉強中

PHP勉強中
GMOクラウドを使っているお客さんから
会員登録を管理したいと要望された

LAMPで構築するしかないので、泣きながらPHPを勉強中

MySQLはRedmineで使っていたので、大丈夫なのだが
PHPって、ASP.NETのWebFormに比べると、何処でそのサブルーチンを記述している?

スパゲッティー状態になりやすいようです。
今回は、オイラの師匠にひな形を記述してもらったが、内容を
納得するまで1週間くらいかかりそうです。

2015年2月5日木曜日

WindowsのタスクスケジューラーでPowerShellのスクリプトを実行する際には「パス」に注意

WindowsのタスクスケジューラーでPowerShellのスクリプトを実行する際には
「パス」に注意

元ネタ
http://www.atmarkit.co.jp/ait/articles/1412/03/news125.html

powershell タスクスケジューラ 起動しない

powershellをタスクスケジューラから起動しない

原因
Powershellのセキュリティーポリシーがあり、それで実行不可になっている。

対応
【スクリプトの実行ポリシーを変更する】
PowerShellのスクリプトの実行ポリシーには以下の4種類がある。
========================================
Restricted :すべてのスクリプトを実行不可
AllSigned:すべてのスクリプトに証明書を要求
RemoteSigned:インターネット経由でダウンロードしたスクリプトのみ証明書を要求
Unrestricted:すべてのスクリプト実行を許可
========================================
ネットからダウンロードした出所のわからないスクリプトを誤って実行しないように,デフォルトがRestrictedになっている。つまり,初期状態では,スクリプトファイルは実行できない。
実行ポリシーをWindows PowerShellから変更する必要がある。

ポリシーの選択
Set-ExecutionPolicyコマンド(コマンドレット)でRemoteSignedに変更する。
設定されているポリシーはGet-ExecutionPolicyで取得できる。
これで,自分が作成したスクリプトはそのまま実行できるようになる。

元ネタ
http://www.roomv.com/~kanehiro/index.php?itemid=459

2015年1月19日月曜日

redmineの運用を変更

redmineの運用を変更

今までは bitnamiを利用してきたが、upgradeする毎に、データベースの
再構築をしていた。

データベースの再構築が面倒になってきたので、Ruby on railからMS-SQLで接続出来るかを
試してみたら、あっさりうまくいった。

これからは、以下の環境で運用する

OS:Windows Server
Databse:MS-SQL 2014
Ruby : JRuby 1.7.18
Java : 1.8.25
MS-SQL JDBC adapter 4.0
redmine 2.6.1
http : webrick

データ移行は、yaml_dbを利用

MySQLを撤廃出来たので、サーバのメモリは少し余裕が出来た

2015年1月15日木曜日

MAGIC XPAのリッチサーバで、MAGIC broker monitorからアプリケーションが停止出来ない

現象
MAGIC XPAのリッチサーバで、MAGIC broker monitorからアプリケーションが停止出来ない

停止すると、access denied  と表示される

原因
mgreq.iniのpasswordがブランクのまま

インストール後は、上記passwordを設定する必要がある
初期値はpassword