カテゴリー [プログラミング] : 6~9件目/9件中

当サイトはログ編集機能に CKEditor を使用しております
先日、某氏からの報告によりGoogle Chromeだと当サイトのログ編集機能が動作していないことが判明しました。ご迷惑をおかけします

原因は?

通常、CKEditorを適用させるdivタグには contentEditable="true" という属性を設定しますが、Chromeの一部のVerの場合だとなぜか適用後に contentEditable="false" となっていました

解決法について

自分が調べた中では こちら の公式フォーラム記事が最もフィットしている感じでした

方法1(失敗)

$(this).attr('contenteditable', true);
CKEDITOR.inline(this);

this はCKEditorを適応先のHTML要素です
こちらは単純明快ですね。CKEditorの適応直前に true を設定しています
…ですが、当サイトではこの方法ではうまく動作しませんでした。true 設定を後に行っても状況は好転せず

方法2(成功!)

var ck = CKEDITOR.inline(element);
ck.on('instanceReady', function(ev) {
    var editor = ev.editor;
    editor.setReadOnly(false);
});

こちらの方法がベストですね。CKEDITORに instanceReady というイベントがあるらしく、CKEditorのインスタンスが作成されたときに発生するイベントのようです

で、そのときに setReadOnly というメソッドで読み取り専用状態を解除しているようです
このあたりはドキュメントを詳しく読んでないとなかなか分からないですねぇ…

今のところこの方法で問題なく動作しております。ありがとう公式フォーラム

CKEDITOR.inline(element).on('instanceReady', function(ev) {
    ev.editor.setReadOnly(false);
});

短縮して上記のように書いても問題ないようですね

追記

CKEditorが使用できない環境(例:スマートフォン)だと CKEDITOR.inline(element) の返り値が null になってしまうっぽいです
当然コンパイルエラーになり、以降のコードが動作しなくなります

なので、下記のように書くのが正解…だと思います

var editor = CKEDITOR.inline(element);
editor && editor.on('instanceReady', function(ev) {
    ev.editor.setReadOnly(false);
});

2件のコメント

まさしくコレに引っかかっておりましたw
なので、火狐でアクセスしていたり…

http://blogos.com/article/112432/
この番組みたかったなぁ…

まだ、職場です。そろそろ帰ろうかな…

>http://blogos.com/article/112432/

なかなか考えさせられる内容ですね
スペシャリストです。とはなかなか言えないですよね。自分より凄い人なんて腐るほどいますし

>退職してから再就職先を探してる

これも耳が痛い。いつか就職できるなんて保証はありません
可能なら就業しつつ次の職を探すべきです。面接などの日程調整は大変ですが…

コメント投稿

NHibernate

当鯖ではDBにMySQLを使っており、ORマッパーとして Fluent NHibernate を使ってます
だけど、残念なことにFluent NHibernateについて日本語の情報がほとんどありません

需要がないんだろうなぁ( °_°) と思いつつ自分が思うことをいろいろ書いてみます

Fluent NHibernateとは

大本に Hibernate というJavaのORマッパーがあって、これを.NETに移植したものが NHibernate になります
Hibernateはかなり枯れたプロダクト。ですが、歴史がある分動作は安定しています(たぶん)

NHibernateの設定は、ORマッピング定義を含めすべてXMLファイルで作成する必要があります。これがなんとも面倒でその難解さも相まって導入の障害になっていました

これをソースコード上でできるようにしたものがFluent NHibernateです

設定の例

// DB接続のファクトリクラス
private static readonly ISessionFactory _factory;

static DB() {
    // メソッドチェーンで設定
    var config = MySQLConfiguration.Standard
        .ConnectionString(x => x.FromConnectionStringWithKey("DB"))
        .IsolationLevel(IsolationLevel.ReadCommitted);
    _factory = Fluently.Configure().Database(config)
        .Mappings(x => x.FluentMappings.AddFromAssemblyOf<MvcApplication>())
        .BuildSessionFactory();
}


Entity Frameworkを使わない理由

.NETで作成するアプリケーションのORマッパーは公式に Entity Framework が推奨されています
これはWindows鯖(IIS)+SQL Server環境での親和性が非常に高く、機能をフルに使うことが可能です

ですが、当鯖の環境はLinux+Monoです
当初はEntity Frameworkを検討していましたが、どうしてもMono上で実行時にエラーが発生してまともに動きませんでした
ですが、Monoによると 動作します と書かれているので、今思うとやり方がまずかったのかもしれません…?

もう1つの問題としてEntity Frameworkでのトランザクションは TransactionScopeクラス 前提になっていて、TransactionScopeはMono(というかLinux)上では動作しません。正確には MS DTCサービス が稼働している必要があります

無理矢理コネクションを引っ張り出してトランザクションを制御することも可能ですが、スマートではないですね

追記

Entity Framework 6ではすでに TransactionScope は非推奨になってるようです…

実際に使ってみて

正直、安定動作まで持って行くのにかなり大変でした(汗
やはり、日本語のドキュメントがほとんど無いことが致命的です。英語のドキュメントを読む労力が必要です

CakePHPとかFuelPHPのお手軽MVCに慣れているとヒントが少なくてキツいかもしれません
そう考えると選択肢の多いPHPがなんとも魅力的に見えます。ですが、当鯖はLinux+Monoです(意地)

大変なのは設定だけなのでそれさえできればOKですかね。なお、パフォーマンスは あまり良くない 模様…

やる気があれば、Fluent NHibernateの中核であるマッピング機能について書きたいと思います

コメント投稿

久々にハマった

.NETでメール送信するときは MailMessage というクラスを部分的に使うのですが、こいつは日本語環境で文字化けしやすいという問題を抱えていました
この問題については "MailMessage 文字化け" などでググると山ほど出てきます

今回はこの問題ではなく .NET Framework 4.5からMailMessageクラスの挙動が変更された ということに起因します

.NET Frameworkの4.0と4.5は共存できない

.NET Frameworkの4.5をインストールすると4.0は勝手にアンインストールされてしまいます
4.5がインストールされているマシンだと、コンパイル時の対象フレームワークに4.0を指定しても実際使用されるのは4.5のアセンブリです

また、Environment.Version を使ってインストールされているVerを判定することはできません(4.5でも “4.0.30319” が返る)。これは、4.5のアセンブリVerが4.0と同じであるためです

インストールされているVerを判定するには

StackOverflow のエラい人によると、下記のようにすればインストールされているVerが4.0以下なのか、4.5以上なのか判定することができるようです

public static bool IsNet45OrNewer() {
    return Type.GetType("System.Reflection.ReflectionContext", false) != null;
}

ReflectionContext クラスは4.5以上にしか存在しないので、4.5以上だと true が返るという塩梅です。スマートですね~

毎回判定してるとパフォーマンスがよろしくないので静的変数に切り出してしまうのが良いでしょう(2つ目のfalseは省略可能です)

public static readonly bool IsNet45OrNewer = 
    Type.GetType("System.Reflection.ReflectionContext") != null;


コード例

// Bエンコード処理
private String BEncode(String text, Encoding encoding) {
    var bytes = encoding.GetBytes(text);
    text = Convert.ToBase64String(bytes);
    return String.Format("=?{0}?B?{1}?=", encoding.HeaderName, text);
}

// メール送信処理
private void SendMail() {
    var encoding = Encoding.GetEncoding("ISO-2022-JP");
    var subject = "件名です";

    if (IsNet45OrNewer) {
        // .NET Framework4.5以上だと二重でBエンコードする
        subject = BEncode(subject, encoding);
    }

    using (var mail = new MailMessage()) {
        mail.Subject = BEncode(subject, encoding);
        // 以降、メール送信処理(ry
    }
}


.NET Frameworkの4.0と4.5は完全互換ではない

今回のケースはまさに↓の記事にあるとおりの内容でした

.NET 4.5で予定されている互換性のない変更

おそらくこのような互換性の問題はかなりレアではあるものの、MailMessageクラスの変更は結構影響が大きそうな気がします

ちなみに MS公式の4.0→4.5の互換性 のページにもMailMessageクラスの変更は載っていません
思ってたよりザルですね…

そもそもMailMessageクラスは日本語環境だと問題が発生しやすいので、Tokiさんが公開されている TKMP というライブラリを使わさせていただくのも手です

コメント投稿

アップロード画像

技術書を多数執筆している山田祥寛さんという方がいます
Webの連載などもされている方で、IT系で仕事している人であれば一度はおそらくその名を目にしたことがあるでしょう

自分もこの方の著書は何度か買ったことがありますが、内容としては大体が初心者向けで分かりやすく書かれており広く浅くという印象です

高すぎる評価

ただ、Amazonではこの方(WINGSプロジェクトも)の著書は高すぎじゃないかというくらい高評価です(著書の内容が良くないとは言いませんが)
更にこの方の著書のレビュアーをよく見ると少しヘンです
さらっと見ただけで以下の共通のレビュアーが見つかります。大体が★5を付けています

おそらくは献本を受けた方のレビューじゃないかと思うのですが、ここまで露骨だとサクラとかステマといわれても仕方がありません

こういう(たぶん)レビュー操作は恒常的に行われていて、海外では裁判にまで発展したケースもあるようです↓

「大手レビューサイトがレビュー評価を金銭と引き換えに変更することは合法」との裁判結果→批判が続出
らばQ [2014年09月12日 10:12]

こちらは金銭の授受が発生していますが、それでも違法性なしという判決です

自分はよくモノを買う前に大体Amazonのレビューをチェックするくらいよく見るんですが、
レビューの真贋自体は自分で判断するしかなさそうですね

1件のコメント

Amazonで買うとき以外にも参考にするので、今度から注意する必要がありますな。
コメント投稿