IT業界のすみっこ暮らし

ふと気がついたときの記録

個人的ブクマ20170331

togetter.com

qiita.com

iot.mb.cloud.nifty.com

developer.amazon.com

codezine.jp

html5experts.jp

developer.amazon.com

qiita.com

www.slideshare.net

www.publickey1.jp

qiita.com

blog.livedoor.jp

Tornado Web Server — Tornado 4.4.3 documentation

TechPeople | シリコンバレーのエンジニアが贈る、注目の海外Tech記事

www.buildinsider.net

ASP.NET MVC:ModelStateのエラーメッセージ一覧を取得してJsonで渡す

普段Modelのバリデーションチェックをして、エラーを格納するとき、以下のようにエラーメッセージを入れて

ModelState.AddModelError("", "○○が見つかりません。再度お試しください。");

ViewでValidationSummaryやValidationMessageを使ってエラーメッセージを表示します。

@Html.ValidationSummary()
@Html.ValidationMessage("hoge")

が、Ajaxjsonの戻り値として処理を終えたModelStateのエラーメッセージだけを取得し、画面に表示したいときもあります。

ModelStateのエラーメッセージ一覧を取得する

Jsonで結果を渡すためのモデル

public class JsonResultModel
{
    public List<string> ErrorList { get; set; }

    public bool IsSuccess { get; set; }

    public CustomerBulkCreateViewModel()
    {
        ErrorList = new List<string>();
    }
}

アクション

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CallAction(string id)
{
    var model = new JsonResultModel();
    
    // やりたい処理

    // modelStateにあるエラーメッセージを画面上に表示させるためにmodel.ErrorListに格納
    model.ErrorList = ModelState.Values.SelectMany(e => e.Errors.Select(er => er.ErrorMessage)).ToList();

    return Json(model, "text/json", Encoding.UTF8, JsonRequestBehavior.AllowGet);
}

手っ取り早くただのstringリストにエラーメッセージをぶち込みのも出きるけど、バリデーション処理をModelStateに集約しておくとロジック部分の汎用性も高まるし、MVC本来の機能も使えるので出来ればエラーを拾うのはModelStateを活用した方が良いと思います。

EntityFramework:Interceptor

参考サイト

www.entityframeworktutorial.net

EntityFrameworkのInterceptor作成例

EFCommandInterceptor.cs

class EFCommandInterceptor: IDbCommandInterceptor // ★
{
    public void NonQueryExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
    {
        LogInfo("NonQueryExecuted", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText));
    }

    public void NonQueryExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
    {
        LogInfo("NonQueryExecuting", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync,  command.CommandText));
    }

    public void ReaderExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContextt<System.Data.Common.DbDataReader> interceptionContext)
    {
        LogInfo("ReaderExecuted", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText));
    }

    public void ReaderExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)
    {
        LogInfo("ReaderExecuting", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText));
    }

    public void ScalarExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
    {
        LogInfo("ScalarExecuted", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText));
    }

    public void ScalarExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
    {
        LogInfo("ScalarExecuting", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText));
    }

    private void LogInfo(string command, string commandText)
    {
        Console.WriteLine("Intercepted on: {0} :- {1} ", command, commandText);
    }
}

Global.asax.cs

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            // filter, routeなどの設定諸々

            DbInterception.Add(new EFCommandInterceptor()); // ★
        }
    }

以上

Voice Dream ReaderのNeoSpeechライセンス期限切れ問題

Voice Dream Readerとは?

公式ページの説明では

耳で読む!Voice Dream Readerは記事、ドキュメント、本の読み上げで幅広い評価を得ているデスクトップクラスのアプリです。

と書いてあります。

Voice Dream Reader

Voice Dream Reader

  • Voice Dream LLC
  • 教育
  • ¥1,800

NeoSpeechとは?

下のブログに詳しく書いてありますが、要は読み上げアプリで使う「ボイスエンジン」です。 Voice Dream Readerには複数のボイスが存在しており、その中でお気に入りの声を使って文章を読み上げることができます。

reliphone.jp

※因みに日本語はHOYAのMISAKIが超お勧めです。 voicetext.jp

何が問題なの?

2017/03/13(月)にNeoSpeechのライセンス期限切れでNeoSpeechのボイスエンジンが使えない…わけではないけど、文章を読み上げる前に必ず

  • こんにちはボイスウェアの日本語合成エンジンボイステキストです。
  • ボイスウェアです。
  • 未登録のバージョンです。
  • ライセンスが必要です。
  • ボイスウェアよりライセンスの発給を受けてください。
  • 登録をお願いします。

上記の文章をランダムに読み上げてから、目的の文章を読み上げるようになってしまいました。

これではそれなりの金額を払ってアプリとボイスを購入したのに(NeoSpeechのボイスはアプリ内課金で有料)使い物にならない。


で、さっそく問い合わせしてみました。そして、下の返信を頂きました。

Thanks so much for reaching out.

We’re aware of this issue and a fix will be released very shortly. NeoSpeech gave us a bad license file a year ago.

We’re so sorry for the inconvenience. Rest assured that it’ll be fixed as soon as we possibly can, and it won’t happen again!

In the mean time, you could set the date of your device before 3/12/2017. But we don’t advise that, since it can cause other issues.

Thanks!

Voice Dream Team.

私たちも問題を認識してるんで、なるはやでリリースする予定だよ。NeoSpeechが1年前に悪いライセンスをくれたんだ。

とてもすまんが、こんなことは二度と起きないはずだから安心して!

対応までは端末の日付を2017/03/12にいじれば使えるけど、これは別の問題が起きる可能性が高いから推奨はできない。

じゃあな!

まとめ

新しいバージョンがリリースするまではしばらく待とう。

追記(2017/03/14(火))

Voice Dream Reader

Voice Dream Reader

  • Voice Dream LLC
  • 教育
  • ¥1,800
バージョン 4.1.1で上記の問題が解決されたことを確認。

対応は早かったけど、知ってるなら気付かれる前に対応して欲しいなと思う一件でした。

自作プラグインをPlugin Directoryに登録する

1、 アカウント登録&プラグイン登録申請

こちらからwordpress.orgのアカウントを作成します。
そしてこちらこちらからプラグインの登録申請を行います。

下の画像は既に申請後の画像で、「Pending requests」項目から該当プラグインが審査待ちであることが分かります。 f:id:papamau:20170301150730p:plain

プラグインの登録申請のとき、プラグイン圧縮してをWeb上にアップロードしておく必要があります。
今回はソースコードを管理しているgithubにzipファイルをアップしてそのurlを使いました。 f:id:papamau:20170301150744p:plain

2、登録結果が届く

申請から2日ほど経過して審査通過のメールが届きました。審査待ちのプラグインが多いほど時間が掛かるらしい f:id:papamau:20170303131957p:plain

メールの内容は簡単にまとめると
1、あなたのプラグインが審査を通過したよ!おめでと!
2、あなた専用のsvnサーバー用意したから更新してね!

です。

3、SVNプラグインのソース更新

今回は既存から使っているTortoiseSVNを使って更新しました。 SVNリポジトリブラウザーで見るとこんな感じです。 f:id:papamau:20170303133905p:plain

前後に他のプラグインリポジトリーもずらーっと並んでいて中身を覗くことが出来ました。

4、プラグイン登録完了

readme.txtの記述方法に少し手間取りましたが、なんとか無事に登録を完了しました。 f:id:papamau:20170303134258p:plain 画像がないのでなんだか寂しいので近いうちに画像も作成して更新してみたいと思います。

最後に

上記の流れで登録したプラグインが以下になります。

IP LIMIT

wordpress.org

内部のアクセスIP一覧を登録しておくことで、投稿記事単位で内部にだけ見せるか、外部にも見せるかを設定し、表示制限を行うプラグインです。

以上

WP TEST PJ

pie001.hatenablog.com

上記で例としてあげてたWP TEST PJのソースコード

github.com

WordPressのデータをASP.NET MVCで作成したサイトでデータ閲覧とか会員追加とかできないかな?と思って試しに作ったものになります。

広告を非表示にする

EntityFrameworkとMySQL

下記の記事の実例と問題点の対策

pie001.hatenablog.com


下記前提条件が満たされている場合の新規プロジェクト作成~モデル追加まで

You completely Install mysql-installer-community-5.7.3.0-m13.msi or Install both ofmysql-visualstudio-plugin-1.1.1.msi and mysql-connector-net-6.8.3.msi.

1、Install-Package EntityFramework

f:id:papamau:20170224183252p:plain

2、Install-Package MySql.Data

f:id:papamau:20170224183322p:plain

3、Install-Package MySql.Data.Entity

f:id:papamau:20170224183344p:plain

4、Install-Package MySql.Web

f:id:papamau:20170224183402p:plain

5、Edit Web.config

f:id:papamau:20170224183443p:plain

  <entityFramework>
    <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
    </providers>
  </entityFramework>

6、Clean & Build

7、Make ADO.NET Entity Data Model

f:id:papamau:20170224183539p:plain

f:id:papamau:20170224183545p:plain

f:id:papamau:20170224183553p:plain

f:id:papamau:20170224183558p:plain

f:id:papamau:20170224183609p:plain

f:id:papamau:20170224183707p:plain

f:id:papamau:20170224183733p:plain

その他

日付変換でエラーが発生する問題

MySQLからSystem.DateTimeの値を取得するときに下記のエラーが発生する場合がある。

Unable to convert MySQL date/time value to System.DateTime

解決方法

下記内容をconnectionStringsに追加する

  <connectionStrings>
    <add name="WPlocalEntities" connectionString="metadata=res://*/WPlocalModel.csdl|res://*/WPlocalModel.ssdl|res://*/WPlocalModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=localhost;user id=root;password=root;Charset=utf8;Convert Zero Datetime=True;persistsecurityinfo=True;database=wp-01&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

選択するデータソースの一覧にMySQL Databaseがない問題

Visual Studio 2015のMySQL Database追加手順

f:id:papamau:20170224184250p:plain

References に以下の3点を追加(既存にある場合はアンインストール後、再インストール

https://www.nuget.org/packages/MySql.Data/ https://www.nuget.org/packages/MySql.Data.Entity/ https://www.nuget.org/packages/MySql.Web/

App.configのの内容を修正する。既存の内容はコメントにして、下記urlにある内容を適用する。

下記URLを参考にApp.configの内容を修正する。 http://stackoverflow.com/questions/22031269/enable-entity-framework-6-for-mysql-c-in-winforms-of-microsoft-visual-studio

f:id:papamau:20170224184111p:plain

f:id:papamau:20170224184132p:plain

選択可能なData SourceにMYSQL Databaseが表示される。

f:id:papamau:20170224184204p:plain

[Choose Your Data Connection]から[Choose Your Database Objects and Settings]に移行しようとしたら画面が急に閉ざされる現象が起きる場合の対策

MySQL InstallerのConnector/ODBCが邪魔してる可能性があるので、ODBCをアンインストールして再インストールすると直る場合がある。

日本語の文字化け

Character-setをutf-8に変更

接続文字列に「Charset=utf8;」がない場合、日本語の値が文字化けするため追加。

<add name="WPlocalEntities" connectionString="metadata=res://*/WPlocalModel.csdl|res://*/WPlocalModel.ssdl|res://*/WPlocalModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=localhost;user id=root;password=root;Charset=utf8;persistsecurityinfo=True;database=wp-01&quot;" providerName="System.Data.EntityClient" />

以上

広告を非表示にする

ASP.NET MVC サイトのサムネイル画像を作成しサイト内で表示する

GitHub

ソリューション丸ごとアップ済み github.com

表示例

f:id:papamau:20170222190117p:plain

ASP.NET MVCのルートURLにドットを含む文字列を使う

stackoverflow.com

Web.config

system.webServerの中のhandlersに以下のように記載する。

  <system.webServer>
    <handlers>
      <add name="ApiURIs-ISAPI-Integrated-4.0"
         path="/MyURL/*"
         verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
         type="System.Web.Handlers.TransferRequestHandler"
         preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

    <handlers>
      <add name="ApiURIs-ISAPI-Integrated-4.0"
         path="/Home/GenerateImage/*"
         verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
         type="System.Web.Handlers.TransferRequestHandler"
         preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>

f:id:papamau:20170222183410p:plain

SQL学習サイト SQL ZOO

SQL ZOO

SQLZOO

DBで直接実行しながら学習できるサイト f:id:papamau:20170222131502p:plain

DBは「MySQL」と「SQL Server」の2種類が選択可能

f:id:papamau:20170222131635p:plain

学習画面

f:id:papamau:20170222131718p:plain

クイズ画面

f:id:papamau:20170222132007p:plain

該当メニューの進み具合がメニューの横の黒いバーに表示される

(会員登録なし、ブラウザの情報を保存)

f:id:papamau:20170222132256p:plain

まとめ

wikiに登録されているテーブルの値と実際SQL実行時の結果と若干異なる場合もあるけど、実際にDBを構築せずに学習できるのは便利だと思った。

広告を非表示にする