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

2021年3月13日土曜日

【IIS】Web Deploy のおさらい

公式の解説は以下などを参考


0. 手順

1. IISのインストール

2. Microsoft Web Deploy のインストール

3.IIS マネージャーユーザーの追加

4. 管理サービスの委任

5. 管理サービスの起動

6. ユーザーの設定を変更

7. ファイアウォールの設定

8. その他セキュリティの設定

9. 出力ディレクトリのパーミッションの設定

10. Web配置による発行の有効化

11. Visual Studio から発行



1. IISのインストール

「役割と機能の追加」からIISをインストール




2. Microsoft Web Deploy のインストール

以下ページからMicrosoft Web Deploy 3.6 をダウンロード

https://www.microsoft.com/ja-jp/download/details.aspx?id=43717




「完全」を選択してインストール



3.IIS マネージャーユーザーの追加

IIS マネージャーを開きIISマネージャーユーザーを追加





4. 管理サービスの委任

WebDeployをインストールした時点で適切な設定になっていると思いますが確認

「WDeployConfigWriter」と「WDeployAdmin」というユーザーが自動で作成されている



5. 管理サービスの起動


ポート変更などを行う場合はここで行う



6. ユーザーの設定を変更

先ほど自動生成されたユーザー「WDeployConfigWriter」と「WDeployAdmin」の設定を変更する

「コンピューターの管理」ツールを起動しユーザーの一覧を表示する


両ユーザーについて、右クリック→プロパティでプロパティ画面を開き「パスワードを無期限にする」にチェックを入れる

(この設定は絶対に必要という訳ではありませんが、パスワードの期限切れである日突然デプロイが出来なくなりハマる事があります)


また、ここで両ユーザーのパスワードを変更した場合は、IISマネージャーの「管理サービスの委任」から、両ユーザーが割り当てられている規則の「編集」画面を開き、「資格情報の指定」からパスワードを設定します。



7. ファイアウォールの設定

Windows Defender ファイアウォールの設定画面を開き、「受信の規則」→「新しい規則」からデプロイのポート(デフォルトだと8172)を追加する








8. その他セキュリティの設定

ホスト先のサーバーの設定によりますが接続ポートの許可設定などを行います

例えばAWS EC2 であればセキュリティグループの「インバウンドルール」にポートの許可設定を追加します



9. 出力ディレクトリのパーミッションの設定

IISマネージャー、あるいはエクスプローラーから当該ディレクトリの「アクセス許可の編集」を行います


「LOCAL SERVICE」 にフルコントロール権限を与えます



10. Web配置による発行の有効化

IISマネージャーで設定したいサイト上で右クリック→展開→Web配置による発行の有効化を選択します

対象が配下のWebアプリケーションや仮想ディレクトリであっても親サイト上で行います



「発行アクセス許可を付与するユーザーを選択します」のところで先ほど作成したIISユーザーである「webdeploy」を設定します


「設定」を行うと指定した場所に設定ファイル(拡張子 .PublishSettings)が作成されます


11. Visual Studio から発行

Visual Studio のソリューションエクスプローラーで発行したいWebプロジェクトを右クリック→発行を選択します



先ほど出力した設定ファイルを読み込ませます


「編集」をクリックしてパスワードを設定します

サイト配下のアプリケーションや仮想ディレクトリに発行する場合は「サイト名」の箇所にスラッシュ区切りで当該ディレクトリを指定します

接続の検証を押下し、成功するとグリーンのチェックマークが表示されます





WebDeploy を解説してくれているサイトは結構あるのですが、ユーザーパスワードの期限やディレクトリのパーミッション権限などに言及されているのが少なく、自分がちょくちょくハマってしまうのでまとめてみました。

以上です。



2018年7月23日月曜日

PDFSharp MigraDoc を使ってC#でPDF生成

(正確を期するよう努力いたしておりますが、保証するものではありません。予めご了承願います。)

帳票のような物をPDF出力する必要があり、iTextSharpを久しぶりに利用しようとしたところライセンスがさらに厳しくなっており、代わりとしてPDFSharp(MITライセンス)を利用することにしました。


こちらのページから概要や特徴、ソースのダウンロードページやwiki、forumへアクセスすることができます。

概要

1.PDFSharp と MigraDoc

PDFSharp
- PDFファイルを操作するための.NETライブラリ。テキストはもちろん線や画像の描画もできる。テーブル組や自動改ページなどはない。
MigraDoc
- PDFSharpを使用してよりドキュメント作成に便利な高機能を提供するライブラリ。テーブル組や自動改ページに対応。
Mix
- MigraDocはPDFSharpで構築されているので、両者を混合して利用する事もできる。
MigraDoc Sample: Mix MigraDoc and PDFsharp - PDFsharp and MigraDoc Wiki

2.Github


ソースコードはこちらから入手できます。
samples が便利なので詰まった時は参考にされると解決するかもしれません。

準備

PDFSharp,MigraDocどちらもVisual Studio の Nuget Package でインストールできます。
上図の通り、いくつか種類があってどれをインストールすれば良いか悩みます。
それぞれの使い分けは以下の通りです。
PDF Core Build 未完成。完成すればプラットフォームに依存せずMacやLinuxでも動作する予定。
GDI+ Build .NET 2.0、C# 2 で作成。WinForms、 Web アプリケーションで動作。( WPF でも動作する)
WPF Build .NET 3.5、C# 2 で作成。その名の通り WPF アプリケーションで動作。
Hybrid Build GDI+ WPF をひとつのプロジェクトで共存。ただし、動作が重くなるなど問題があり実際のアプリケーションで利用するのは非推奨。
Supported Platforms and Technologies, Available Builds - PDFsharp and MigraDoc Wiki

サンプル

ASP.NET MVC で日本語フォントを含むPDFを出力するサンプルを作成します。
MigraDoc GDI+ を Nuget でインストールします。

日本語フォントを利用するためにはIFontResolverを継承したクラスを作成し、それをプログラムに登録する必要があります。
以下のサイトを参考にさせていただきました。

生成結果のPDFは以下の通りです。サンプルデータを作成するのにWikipediaの内容を一部利用しております。(https://ja.wikipedia.org/wiki/FIFAワールドカップ)
色付きの部分は追記した補足説明(英文字はコード内で自分が命名した変数など)で、プログラムで生成したものではありません。
(ヘッダやパラグラフにわかりやすくなるように枠線をつけています。)

Documentクラスに表紙や目次、第何章などのSection(章)を追加し、その章の中にParagraph(段落)やTable(表組み)などを追加していって文書を作成していきます。
このサンプルを作成するのに記述したコードは以下の通りです。

using MigraDoc.DocumentObjectModel;
using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.Rendering;
using System.IO;
using System.Web.Mvc;

namespace MigraDocSample.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            // フォントリゾルバーのグローバル登録
            PdfSharp.Fonts.GlobalFontSettings.FontResolver = new JapaneseFontResolver();

            //ドキュメント作成
            Document document = new Document();
            document.Info.Title = "Hello, MigraDoc";
            document.Info.Subject = "This is MigraDoc Sample.";
            document.Info.Author = "Author";
            document.DefaultPageSetup.LeftMargin = Unit.FromCentimeter(2);
            document.DefaultPageSetup.RightMargin = Unit.FromCentimeter(2);
            document.DefaultPageSetup.TopMargin = Unit.FromCentimeter(10);
            document.DefaultPageSetup.BottomMargin = Unit.FromCentimeter(5.5);
            
            //表紙セクション作成
            Section sectionCover = document.AddSection(); //Sectionを追加

            Font fontCoverTitle = new Font("yumin",30); //登録したフォント
            fontCoverTitle.Underline = Underline.Single;
            Paragraph paragraphCover = sectionCover.AddParagraph(); //Paragraphを追加
            paragraphCover.AddFormattedText("表紙タイトル",fontCoverTitle);
            paragraphCover.Format.SpaceBefore = "3cm";
            paragraphCover.Format.SpaceAfter = "3cm";
            paragraphCover.Format.Alignment = ParagraphAlignment.Center;

            Font fontDate = new Font("yumin", 8);
            Paragraph paragraphDate = sectionCover.AddParagraph();
            paragraphDate = sectionCover.AddParagraph();
            paragraphDate.AddFormattedText("Rendering date: ", fontDate);
            paragraphDate.AddDateField();
            paragraphDate.Format.Alignment = ParagraphAlignment.Right;

            //メインセクション作成
            Section sectionMain = document.AddSection();
            sectionMain.PageSetup.HeaderDistance = Unit.FromCentimeter(2);
            sectionMain.PageSetup.FooterDistance = Unit.FromCentimeter(1.5);
            sectionMain.PageSetup.StartingNumber = 1;

            //ヘッダテーブル作成
            Table tableHeader = new Table();
            tableHeader.Borders.Visible = true;
            tableHeader.TopPadding = 0;
            tableHeader.BottomPadding = 5;

            //3列作成
            var columnHeader = tableHeader.AddColumn(Unit.FromCentimeter(6));
            columnHeader.Format.Alignment = ParagraphAlignment.Left;
            columnHeader = tableHeader.AddColumn(Unit.FromCentimeter(3));
            columnHeader.Format.Alignment = ParagraphAlignment.Right;
            columnHeader = tableHeader.AddColumn(Unit.FromCentimeter(8));
            columnHeader.Format.Alignment = ParagraphAlignment.Left;

            var fontHeaderTitle = new Font("yumin", 18);
            fontHeaderTitle.Underline = Underline.Single;
            var fontHeader = new Font("yumin", 10);
            var para = new Paragraph();

            //1行目
            para.AddFormattedText("FIFAワールドカップ", fontHeaderTitle);
            var row = tableHeader.AddRow();
            row.Height = 30;
            row.Cells[0].Add(para);
            row.Cells[0].MergeRight = 2;
            row.Cells[0].Format.Alignment = ParagraphAlignment.Center;
            //2行目
            row = tableHeader.AddRow();
            para = row.Cells[1].AddParagraph();
            para.AddFormattedText("開始年", fontHeader);
            para = row.Cells[2].AddParagraph();
            para.AddFormattedText("1930年", fontHeader);
            //3行目
            row = tableHeader.AddRow();
            para = row.Cells[1].AddParagraph();
            para.AddFormattedText("主催", fontHeader);
            para = row.Cells[2].AddParagraph();
            para.AddFormattedText("FIFA", fontHeader);
            //4行目
            row = tableHeader.AddRow();
            para = row.Cells[1].AddParagraph();
            para.AddFormattedText("地域", fontHeader);
            para = row.Cells[2].AddParagraph();
            para.AddFormattedText("世界", fontHeader);
            //5行目
            row = tableHeader.AddRow();
            para = row.Cells[1].AddParagraph();
            para.AddFormattedText("参加チーム数", fontHeader);
            para = row.Cells[2].AddParagraph();
            para.AddFormattedText("32(本大会)", fontHeader);
            //6行目
            row = tableHeader.AddRow();
            para = row.Cells[1].AddParagraph();
            para.AddFormattedText("出典", fontHeader);
            para = row.Cells[2].AddParagraph();
            para.AddFormattedText("https://ja.wikipedia.org/wiki/FIFAワールドカップ", fontHeader);

            sectionMain.Headers.Primary.Add(tableHeader); //sectionにヘッダーを追加

            //本文作成
            var fontMainTitle = new Font("yumin", 14);
            fontMainTitle.Underline = Underline.Dash;
            var fontMain = new Font("yumin", 10);
            //1段落目(英文は英文のルールに従って改行される)
            var paraMain = document.LastSection.AddParagraph();
            paraMain.Format.Borders.Visible = true;
            paraMain.Format.RightIndent = Unit.FromCentimeter(5);
            paraMain.AddFormattedText("English\n",fontMainTitle);
            paraMain.AddLineBreak();
            paraMain.Format.Font = fontMain;
            paraMain.AddText(Sample.English);
            paraMain.AddLineBreak();
            //2段落目(日本語文は改行されずに)
            paraMain = document.LastSection.AddParagraph();
            paraMain.Format.Borders.Visible = true;
            paraMain.Format.RightIndent = Unit.FromCentimeter(5);
            paraMain.AddFormattedText("日本語コンテンツ\n", fontMainTitle);
            paraMain.AddLineBreak();
            paraMain.Format.Font = fontMain.Clone();
            paraMain.AddText(Sample.Japanese);
            paraMain.AddLineBreak();
            //3段落目
            paraMain = document.LastSection.AddParagraph();
            paraMain.Format.Borders.Visible = true;
            paraMain.Format.RightIndent = Unit.FromCentimeter(5);
            paraMain.AddFormattedText("日本語コンテンツ(1文字ずつ)\n", fontMainTitle);
            paraMain.AddLineBreak();
            paraMain.Format.Font = fontMain.Clone();
            foreach (char c in Sample.Japanese)
            {
                paraMain.AddFormattedText(c.ToString(), fontMain);
            }
            paraMain.AddLineBreak();

            document.LastSection.AddPageBreak(); //改ページ

            //テーブル表記
            paraMain = document.LastSection.AddParagraph();
            paraMain.AddFormattedText("歴代大会結果", fontMainTitle);
            Table tableResult = new Table();
            tableResult.Borders.Visible = true;
            tableResult.Rows.Height = 25;
            //7列作成
            var columnResult = tableResult.AddColumn(Unit.FromCentimeter(0.8));
            columnResult = tableResult.AddColumn(Unit.FromCentimeter(1.8));
            columnResult = tableResult.AddColumn(Unit.FromCentimeter(3.1));
            columnResult = tableResult.AddColumn(Unit.FromCentimeter(0.5));
            columnResult = tableResult.AddColumn(Unit.FromCentimeter(3.1));
            columnResult = tableResult.AddColumn(Unit.FromCentimeter(3.8));
            columnResult = tableResult.AddColumn(Unit.FromCentimeter(3.1));
            //ヘッダ1行目
            row = tableResult.AddRow();
            para = row.Cells[0].AddParagraph(); para.AddFormattedText("回", fontMain);
            para = row.Cells[1].AddParagraph(); para.AddFormattedText("開催年", fontMain);
            para = row.Cells[2].AddParagraph(); para.AddFormattedText("開催国", fontMain);
            para = row.Cells[3].AddParagraph();
            para = row.Cells[4].AddParagraph(); para.AddFormattedText("決勝戦", fontMain);
            row.Cells[4].MergeRight = 2;
            row.Cells[0].MergeDown = 1;
            row.Cells[1].MergeDown = 1;
            row.Cells[2].MergeDown = 1;
            row.Cells[3].MergeDown = 1;
            //ヘッダ2行目
            row = tableResult.AddRow();
            para = row.Cells[4].AddParagraph(); para.AddFormattedText("優勝", fontMain);
            para = row.Cells[5].AddParagraph(); para.AddFormattedText("結果", fontMain);
            para = row.Cells[6].AddParagraph(); para.AddFormattedText("準優勝", fontMain);
            foreach (var result in Sample.Results)
            {
                row = tableResult.AddRow();
                if (result.Organized)
                {
                    para = row.Cells[0].AddParagraph(); para.AddFormattedText(result.Number.ToString(), fontMain);
                    para = row.Cells[1].AddParagraph(); para.AddFormattedText(result.Year.ToString() + "年", fontMain);
                    para = row.Cells[2].AddParagraph(); para.AddFormattedText(result.Host, fontMain);
                    para = row.Cells[3].AddParagraph();
                    para = row.Cells[4].AddParagraph(); para.AddFormattedText(result.Champion, fontMain);
                    para = row.Cells[5].AddParagraph(); para.AddFormattedText(result.FinalScore, fontMain);
                    para = row.Cells[6].AddParagraph(); para.AddFormattedText(result.RunnersUp, fontMain);
                }
                else
                {
                    para = row.Cells[1].AddParagraph(); para.AddFormattedText(result.Year.ToString() + "年", fontMain);
                    para = row.Cells[4].AddParagraph(); para.AddFormattedText(result.NotOrganizedReason, fontMain);
                    row.Cells[4].MergeRight = 2;
                    row.Cells[4].Format.Alignment = ParagraphAlignment.Center;
                }
            }
            document.LastSection.Add(tableResult);

            //フッター作成
            var paraFooter = new Paragraph();
            paraFooter.AddPageField();
            paraFooter.AddText(" of ");
            paraFooter.AddNumPagesField();
            paraFooter.AddText(" Page");
            paraFooter.Format.Alignment = ParagraphAlignment.Center;
            sectionMain.Footers.Primary.Add(paraFooter);

            //レンダリングしてPDFを出力
            PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(true);
            pdfRenderer.Document = document;
            pdfRenderer.RenderDocument();
            using (MemoryStream ms = new MemoryStream())
            {
                pdfRenderer.PdfDocument.Save(ms);
                return File(ms.ToArray(), "application/pdf", "sample.pdf");
            }
        }
    }
}
using PdfSharp.Fonts;
using System;
using System.IO;
using System.Reflection;

namespace MigraDocSample
{
    // 日本語フォントのためのフォントリゾルバー
    public class JapaneseFontResolver : IFontResolver
    {
        private static readonly string YUMIN_TTF =
            "MigraDocSample.fonts.YUMIN.TTF";

        public byte[] GetFont(string faceName)
        {
            switch (faceName)
            {
                case "YUMIN":
                    return LoadFontData(YUMIN_TTF);
            }
            return null;
        }

        public FontResolverInfo ResolveTypeface(
                    string familyName, bool isBold, bool isItalic)
        {
            var fontName = familyName.ToLower();

            switch (fontName)
            {
                case "yumin":
                    return new FontResolverInfo("YUMIN");
            }

            // デフォルトのフォント
            return PlatformFontResolver.ResolveTypeface("Arial", isBold, isItalic);
        }

        // 埋め込みリソースからフォントファイルを読み込む
        private byte[] LoadFontData(string resourceName)
        {
            var assembly = Assembly.GetExecutingAssembly();
            string[] names = assembly.GetManifestResourceNames();
            using (Stream stream = assembly.GetManifestResourceStream(resourceName))
            {
                if (stream == null)
                    throw new ArgumentException("No resource with name " + resourceName);

                int count = (int)stream.Length;
                byte[] data = new byte[count];
                stream.Read(data, 0, count);
                return data;
            }
        }
    }
}
Sample.XXXはサンプル用のデータです。
フォントリゾルバーに登録するファイル名は大文字小文字を区別しますので間違えると機能しません。
また、フォントリソースを忘れずに「埋め込みリソース」にする事も注意が必要です。

英文はパラグラフ内で自動的に改行されるのですが、日本語が改行されないのは上手く解決できませんでした。

この他にもPDFSharpを利用してHTMLからPDFを出力するHTML Rendererというものもあります。


以上メモまで。


2018年6月15日金曜日

GIPHYの使い方がわからない

コツコツ作りためた猫GIFの避難先を探していてGIPHYというサービスを試してみました。

こんな感じでページに埋め込んだりできて良いのですが、

via GIPHY

自分のチャンネルのトップにある砂嵐は何なのだろうかと…?


他の人のチャンネルを見る限りランダム表示してくれるっぽいので、使えたら良いなぁと思っていたのですが、ちょっとわからず仕舞いです。

何か設定が足りないのでしょうか…?


2017年7月27日木曜日

IIS, Classic ASP でサイトが重い

メール送信時にサイトが重いなぁと思っていたら、どうやらデバッグの設定に問題があったようです。

ASP のサーバー側のデバッグを有効にすると、ASP はシングルスレッド モードで実行されます。パフォーマンス上の理由から、製品環境での ASP のサーバー側またはクライアント側のデバッグはお勧めできません。

Microsoft TechNet オンライン:IIS 6.0 F1: [アプリケーションの構成] - [デバッグ] タブ
https://technet.microsoft.com/ja-jp/library/cc732003

また、初歩的なところでつまづいてしまった。
以上メモまで。

2017年2月24日金曜日

ASP.NET MVC の AntiForgeryToken がIE,Edgeでエラー

ASP.NETにはCSRF対策にTokenを発行して検証してくれる機能がありますが、IEとEdgeでだけエラーになり、FirefoxとChromeでは大丈夫、しかもデバッグ時にはIEやEdgeでもエラーにならないという不可思議な現象に悩まされました。

必要な偽造防止 Cookie "__RequestVerificationToken" が存在しません。

結構ハマってしまったのですが、原因はこれでした。

Cookie を使用するドメインでは、ドメイン名およびサーバー名に英数字 ("-" または ".") だけを使用しなければなりません。サーバー名にアンダースコア ("_") など、その他の文字が含まれている場合、Internet Explorer は Cookie をブロックします。

デプロイ先のテスト環境のドメインに「test_xxxx」とアンダースコアが含まれていたのが原因でした。
結構古くからの常識のようで、まだまだ勉強不足を痛感します。

以上メモまで。


2014年4月1日火曜日

Skypeの自動応答を使って自宅のペットを監視する

外出先から自宅のペットの様子が知りたいというニーズは結構あるかと思います。
色々と方法はあるかと思いますが、Skypeで手軽に行う方法をご紹介いたします。

①自宅PCにWebカメラを接続しSkypeを立ち上げておきます。

②「ツール」→「設定」で設定ウィンドウを開きます。

③「通話」→「通話設定」へ移動し、「自動応答」「通話中、ビデオを自動的に開始」にチェックを入れます。




④このままでは誰でも家の中を覗けてしまうので(それでも良ければ構いませんが)、
「連絡先リスト上のユーザのみ」にもチェックを入れておきましょう。

⑤上記設定後このアカウントにSkypeでコールをすれば自動でビデオ応答してくれます。


現時点では、ある特定のユーザのみを許可するような設定は出来ないようです。
通知リスト上のユーザは全員カメラの様子が見れてしまうことになるので、
別途監視専用のアカウントを取得して、許可するユーザのみをリストに加えると
良いでしょう。

2014年3月14日金曜日

パソリで確定申告(e-tax)

「RC-S320」「S310」は、e-Taxに対応していますか?
いいえ。対応していません。e-Taxサービスについては、「RC-S370」「RC-S330」をご利用ください。
http://www.sony.co.jp/Products/felica/consumer/support/faq/detail/142.html

ええええええ~!一気にテンションが下がったわー。
時間無いのにどうしようか(TдT)

皆さんは事前によく調べましょう・・・。

2014年3月2日日曜日

Youtubeのマイチャンネルのトップページを変更する方法

画像中断右の「チャンネルナビゲーションを編集」で変更することができます。



いやー、分かるまでにだいぶんかかりました。

2013年9月7日土曜日

【Visual Studio】 Git Source Control Provider で Webサイトプロジェクトにリポジトリ作成

Visual Studio で新規にWebアプリケーションを作成する時に
「新しいプロジェクト」と「新しいWebサイト」の2種類があります。

その詳細な説明は他に譲るとして
【msdn】
Visual Studio での Web アプリケーション プロジェクトと Web サイト プロジェクト
http://msdn.microsoft.com/ja-jp/library/dd547590.aspx 

【どっとねっとふぁん】様
WebアプリケーションプロジェクトとWebサイトプロジェクト
http://blogonos.wordpress.com/2008/01/21/


ファイル・ディレクトリ構成は以下のとおりです(デフォルト)。

「新しいプロジェクト」の場合は
 ソリューションファイル
 C:\Users\<ユーザ名>\Documents\Visual Studio 2012\Projects\hoge\hoge.sln
 コーディングしたファイル
 C:\Users\<ユーザ名>\Documents\Visual Studio 2012\Projects\hoge\hoge

「新しいWebサイト」の場合は
 ソリューションファイルは
 C:\Users\<ユーザ名>\Documents\Visual Studio 2012\Projects\hoge\hoge.sln
 コーディングしたファイルは
 C:\Users\<ユーザ名>\Documents\Visual Studio 2012\WebSites\hoge


Webサイトプロジェクトの場合、ソリューションファイルと本体のファイルとで
ディレクトリ構成が異なってしまうのですが、Git Source Control Provider を使って
VSからリポジトリを作成しようとすると、ソリューションファイルのあるディレクトリに
「.git」ディレクトリが作成され、本体のファイルをgitで管理できません。

Git Bash や Tortoise Git など Visual Studio 以外から先にリポジトリを作成しておけば
Visual Studio 上で Git Source Control Provider で管理できるようになります。

以上メモまで。
(Gitを使い始めたばかりなので認識に誤りがあればご指摘頂けますと幸いです)

2013年2月25日月曜日

検索したくないサイト

Googleなどで検索をしていると、海外のサイトを自動翻訳しただけのサイトやただのリンク集のサイトが検索されてイライラすることがあります。

以下のサイトで検索結果からブロックする方法が紹介されています。

【lifehacker.jp】
二度と見たくないサイトをGoogleの検索結果に表示させない方法

方法は「http://www.google.com/reviews/t」からサイトのURLを登録するだけ。

もっと早く知りたかったです(T_T)

(追記2013/2/27)
今のところあまり効果が見られないかも…?

2012年4月12日木曜日

flash 11.2 動画再生で不具合(youtubeが見れない)

flashのバージョンを11.2にアップデートしてからyoutubeを見た時に動画が異常再生されるようになってしまいました。


画質を360pから480pに変更すると一応正常に再生されるようになりました。

おそらくflashの不具合だろうと思うので対応してくれることを待ちたいところです。

2012年2月10日金曜日

ASP.NET MVC3 EF Modelからデータベースが作成できない

以下のサイトを参考にASP.NET MVC3 EF Code First を学習しています。

@IT ASP.NET MVC入門【バージョン3対応】

ところがModelからデータベースを作成するところで、以下のようなエラーが出てしまいつまづいてしまいました。

Model compatibility cannot be checked because the database does not contain model metadata. Ensure that IncludeMetadataConvention has been added to the DbModelBuilder conventions.
記事の中で
なお、本稿ではSQL Server Compact 4.0を前提としているので、プロバイダ名は「System.Data.SqlServerCe.4.0」としているが、従来のSQL Serverに接続するならば、「System.Data.SqlClient」とすればよい。
とあったので、

  <connectionStrings>
    <add name="MyMvcContext"
         connectionString="Data Source={servername};
                           Initial Catalog={dbname};
                           Integrated Security=True"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

web.configの記述を上記のようにしたのですが、
この時にデータベース名(上記{dbname}の部分)に
既存のデータベースを指定したのが問題だったようです。
未作成のデータベースを指定することで、解決致しました。

ただし、完全にCodeFirstでデータベースを作成できる場合は良いのですが、
別口からデータベースを操作したり、既存のデータベースとの連携だったり
下記[参考]にあるようにMembership Providerとの連携だったりを考えた場合に
ちゃんと動くのか心配です。
自分はまだ学習段階なのでおいおい解決することを期待・・・。

[参考]
EF 4.1 Code First and Existing Database and .NET Membership
mvc3 code-first error on sqlexpress

2012年1月20日金曜日

phpのMail関数で送信エラーになる

phpで作成された単純なメール送信フォームからメールを送信しようとしたところ
ある特定の条件で送信エラーになるという現象に悩まされました。

その条件というのは以下の通りです。
・送信フォームの設置されているドメインと同一のドメイン宛のメールのみ送信されない

どういうことかと言うと、例えばメール送信フォームの設置されている
Webサイトのドメインが「sample.com」だったとして、
メールの宛先が「xxx@sample.jp」の場合はちゃんと届くけれど、
「xxx@sample.com」の場合には届かないというものです。

もう少し環境・状況を詳しく説明しますと、
1. WebサーバーはWindows 2003 server IIS 6.0 (恐らくあまり関係ない)
2. PHP 5.12
3. Classic ASP (basp利用) だと同一ドメインでも送信可能
4. WebサーバーのローカルにSMTPサーバーを展開
5. MailサーバーはWebサーバーとは別のサーバー上に設置
調べてみたところ、5(4も?)が原因だったと思われます。

IISのSMTPログを見てみたところPHPから同一ドメイン宛にメールを送信した際には全くログに記録がなく、
どうも
php「xxx@sample.com宛のメール?それなら今ボクの設置されてるサーバの所でしょ。
勝手に送信しておくね。あれ?」
てな具合でDNS参照もせず、ローカルのSMTPも使わずに送信しようとしてエラーになってしまうようです。




似たような現象にあっている人がいたので参考になりました。 
さくらインターネットのPHPでMail関数を使うとInternal Server Errorになってしまう


phpの問題のような気がしますがどうでしょうか。
私はあまり深くは検証していませんが・・・

今回はサブドメインにしても良いとのことだったので宛先を「xxx@zzz.sample.com」に
変更することで回避できました。

2012年1月10日火曜日

ASP.NET Enterキーを無効にする方法

Enterキーを無効にする方法として
以下のようなjavascriptを差し込む方法がよく紹介されていますが、

<SCRIPT LANGUAGE=javascript>
    <!--
    //Enterキー無効処理
    document.onkeypress = enter;
    function enter(){
        if( window.event.keyCode == 13 ){
            if( window.event.srcElement.type == 'text'){
                return false;
            }
        }
    }
    //-->
</SCRIPT>

ASP.NET 3.5、IIS7、マスターページ、AjaxControlToolkit 3.0 という環境でヘッダのContetPlaceHolderに上記javascriptを記述しても動作しませんでした。
(※そもそも alert('test'); は動作するけど alert("test"); は動作しないというおかしな状況で、 なぜ動作しないのか不明です。分かる方がいたら教えていただけますと幸いです。)


今回はダミーボタンを作成することでEnterキーを無効にする方法を紹介いたします。
EnterキーでのPOST動作はform内に記述された最初のsubmitボタンに割り当てられます。
(※詳細な条件は後日手の開いている時にでも調べます)
なので、ボタンが押されても実行されないボタンを用意することで、Enterキーによるポストを無効にできます。

まず、aspxページにボタンコントロールを配置し(その他のボタンより上部に)、
ButtonDummyのような適当な名前を割り当てて、EnableプロパティをFalseにします。
また、このボタンが見えてしまうと見栄えが悪くなるのでスタイルシートで
display:none;
としておきます。
これだけだとなぜかIEでEnterが無効にならなかったのですが、
コードビハインド側で(C#)以下の記述を加えてダミーボタンをデフォルトボタンにすることで動作するようになりました。

this.Form.DefaultButton = this.ButtonDummy.UniqueID;


理解が深くないままの解決ですが、取り急ぎメモまで。

2011年10月4日火曜日

Google 日本語のページ「以外」を検索

Googleで検索を行うと検索結果のページの左側のメニューに
「日本語のページを検索」という項目があります。
これはこれで重宝するのですが、日本語のページ『以外』を検索したくなる時があります。

「日本語のページを検索」を利用すると検索結果のURLに
 lr=lang_ja
という引数が渡されます。この引数の指定を
 lr=-lang_ja
とすることで日本語のページ『以外』を検索できます。
 lr=lang_en
とすれば英語のページを検索することができます。

2011年6月14日火曜日

Blogger に Syntax Highlighter を導入

ブログ上のソースコードのハイライトテンプレートをSyntax Highlighterに変更しました。

導入方法は、Bloggerの設定画面に入り「デザイン」→「HTMLの編集」から
以下のコードを<head></head>タグ内に追加します。

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js' type='text/javascript'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script type='text/javascript'>
  window.onload = function() {
  SyntaxHighlighter.autoloader(
    'applescript            http://alexgorbatchev.com/pub/sh/current/scripts/shBrushAppleScript.js',
    'actionscript3 as3      http://alexgorbatchev.com/pub/sh/current/scripts/shBrushAS3.js',
    'bash shell             http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js',
    'coldfusion cf          http://alexgorbatchev.com/pub/sh/current/scripts/shBrushColdFusion.js',
    'cpp c                  http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js',
    'c# c-sharp csharp      http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js',
    'css                    http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js',
    'delphi pascal          http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDelphi.js',
    'diff patch pas         http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDiff.js',
    'erl erlang             http://alexgorbatchev.com/pub/sh/current/scripts/shBrushErlang.js',
    'groovy                 http://alexgorbatchev.com/pub/sh/current/scripts/shBrushGroovy.js',
    'java                   http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js',
    'jfx javafx             http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJavaFX.js',
    'js jscript javascript  http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js',
    'perl pl                http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js',
    'php                    http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js',
    'text plain             http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js',
    'py python              http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js',
    'ruby rails ror rb      http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js',
    'sass scss              http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSass.js',
    'scala                  http://alexgorbatchev.com/pub/sh/current/scripts/shBrushScala.js',
    'sql                    http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js',
    'vb vbnet               http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js',
    'xml xhtml xslt html    http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js'
  );
  SyntaxHighlighter.all();
};
</script>

上記コードを追加したら、ブログ上でハイライトを適用したいコードを
以下の<pre>タグ内にHTMLエンコードした状態で記述します
<pre class="brush: ####">

</pre>
「####」の部分には適用したい言語の種類を記述します。
適用できる言語の種類は以下をご参考ください。
http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/

また上記のハイライトはデフォルトですが、<head>タグに記述した4行目の
「shThemeDefault.css」 を変更すれば何種類かのスタイルから選択することができます。
スタイルの種類は以下をご参考ください。
http://alexgorbatchev.com/SyntaxHighlighter/manual/themes/

2011年2月28日月曜日

AccessmdbのSQLインジェクション対策

1つ前の書き込み「VBScript IsNullとかIsEmptyとかIsNumericとか」で、
「実際にはポストされていないデータをRequestで取得してしまった場合、その値はEmptyとなる」
また、「IsNumeric(Empty)はTrueになる」ということを確認しました。

Access MDB では、数値型を「'(シングルクォート)」で囲むことができないため、
クエリに数値型のパラメータを埋めこまなくてはならない場合、埋め込む値が
数値型であるかどうかを厳密にチェックする必要があります。
VBScriptのIsNumericだけでは意図したチェックにならない可能性があるので、
注意しなくてはなりません。

Webのようなインジェクションの恐れがある環境で、
データベースにmdbを用いないのが本来だとは思うのですが・・・。

VBScript IsNullとかIsEmptyとかIsNumericとか

定義 構文 結果
num = "" Response.Write num
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) False
IsObject(num) False
(num=0) スクリプトエラー
(num="0") False
num = Empty Response.Write num
TypeName(num) Empty
IsNull(num) False
IsEmpty(num) True
IsNumeric(num) True
IsObject(num) False
(num=0) True
(num="0") False
num = null Response.Write num
TypeName(num) Null
IsNull(num) True
IsEmpty(num) False
IsNumeric(num) False
IsObject(num) False
IsNull(num=0) True
IsNull(num="0") True
num = 0 Response.Write num 0
TypeName(num) Integer
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) True
IsObject(num) False
(num=0) True
(num="0") True
num = "0" Response.Write num 0
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) True
IsObject(num) False
(num=0) True
(num="0") True
num = "0"(全角) Response.Write num 0
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) True
IsObject(num) False
(num=0) True
(num="0") False
num = "〇"(漢数字) Response.Write num 〇
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) False
IsObject(num) False
(num=0) スクリプトエラー
(num="0") False
num = "3D2" Response.Write num 3D2
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) True
IsObject(num) False
(num=300) True
(num="300") False


上記は各データをチェックした一覧です。
想像していたのと、違う結果になっていないでしょうか。

特に↓のような時
Dim num
num = Request("numnum") '←実際はnumnumというnameのデータはポストされていない
numはEmptyとなるので、IsNumericで数値チェックをするとTrueとなってしまいます。

2011年2月3日木曜日

HIDEBBS

HIDEBBS終了?

2010年12月20日月曜日

ASP .NET State Service が停止してしまった

ご存知のとおり、ASP .NET のセッションの管理方法は

InProc
State Server
SQL Server

の3通りがあり、 InProcは「ワーカープロセスリサイクル」で
Sessionデータがぶっ飛んでしまうので、State Server を利用していました。

そして、先日Windows Updateが結構たまってしまっていたので
「ダウンロードだけでもしておいてアップデートに備えておこう」と
データをダウンロードしたところ、State Serviceが停止してしまいました。


State Serviceの設定がデフォルトで上記の通りなのですが、1回目、2回目の停止後は
サービスを再開してくれるのですが、その後のエラーではサービスを再開してくれません。

今回はWindows Updateをダウンロードしただけだったので、サービスが停止するなどとは思わずに
まる1日ほど気づかずに放置してしまいました。