読者です 読者をやめる 読者になる 読者になる

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のエラーメッセージ一覧を取得する

普段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一覧を登録しておくことで、投稿記事単位で内部にだけ見せるか、外部にも見せるかを設定し、表示制限を行うプラグインです。

以上