時雨に舞う

プログラミングや技術情報などの備忘録

PowerCMSでMTAppFieldSort

PowerCMSでMTAppJqueryのMTAppFieldSortを使う方法です。

MTAppFieldSortはMovableTypeの編集画面にあるフィールドをソートできるので便利ですよね。

しかし、PowerCMSでは一部のケースで期待通り動かない。。。

PowrCMSにはカスタムフィールドとしてエディタ付きテキスト(WYSIWYG)がありますが、MTAppFieldSortでこのフィールドをソートするとWYSIWYGが壊れてしまいます。

ドラッグアンドドロップした時は正常に並び替えできるのに、 MTAppFieldSortで並び替えるとなぜ壊れてしまうのでしょうか。

調べてみるとどうやら、

フィールド並び替えのためにDOMの入れ替えを行うとWYSIWYGが機能しなくなるので、 PowerCMSに付属しているJavascriptがソート発生のイベントをトリガーとして、エディタ付きテキストが壊れないよう工夫しているようです。

そこで、MTAppFieldSortにその処理を組み込んだメソッドを作りました。

/* MTAppFieldSortのPowerCMS対応版を追加 */
$.MTAppFieldSort4PCMS = function(options){
    var op = $.extend({}, $.MTAppFieldSort4PCMS.defaults, options);

    var field = op.sort.split(',').reverse();
    var l = field.length;
    if (l == 0) return;
    var containerId = 'sortable';
    if (op.insertID !== 'sortable') {
        containerId = op.insertID;
    } else if (op.insert_id !== 'sortable') {
        containerId = op.insert_id;
    }
    var container = document.getElementById(containerId);
    if (!container) return;
    if (op.otherFieldHide) {
        $(container).find('div.field').addClass('hidden');
        $('#quickpost').addClass('hidden');
    }
    for (var i = 0; i < l; i++) {
        var id = $.trim(field[i]).replace(/^c:/,'customfield_') + '-field';
        if (document.getElementById(id)) {
            var elm = document.getElementById(id);

            // 追加 エディタ情報を一時退避
            try {
              $("#" + id).find(':input').each(function() {
                var manager = $(this).data('mt-editor');
                if (manager) {
                  manager.currentEditor.powercmsStash();
                }
              });
            } catch (e) {
            }
            // 追加おわり

            container.insertBefore(elm, container.firstChild);

            // 追加 エディタ情報を復帰
            try {
              $("#" + id).find(':input').each(function() {
                var manager = $(this).data('mt-editor');
                if (manager) {
                  manager.currentEditor.powercmsRestore();
                }
              });
            } catch (e) {
            }
            // 追加おわり
            
            $(elm).removeClass('hidden').show();
        } else if (op.debug && window.console) {
            console.log('#' + id + ' が見つかりません');
        }
    }
};
$.MTAppFieldSort4PCMS.defaults = {
    sort: 'title,text,tags,excerpt,keywords',
    insertID: 'sortable',
    insert_id: 'sortable',// Deprecated
    otherFieldHide: true,
    debug: false
};

こんな感じで使えます。使い方はMTAppFieldSortと同じです。

  if($('body#edit-entry').length){
    /* ソート情報は、カンマ区切り、カスタムフィールドは先頭にc:をつける */ 
    $.MTAppFieldSort4PCMS({
          sort: "title,permalink,c:customfieldA,c:customfieldB"
    });
  }

以上です。参考なれば幸いです。

著者:y.t  

 

 

gitのリモートで削除されたブランチをローカルに反映させる

gitのお話しです。

しばらく放置していたリモートブランチ。大量に溜まってきたので整理したところ、別のマシンのローカルリポジトリに反映されず困っていました。てっきりフェッチするだけで更新されると思いきやそうではないんですね。意図的に実行しないとダメなようです。

コマンドの場合

$ git fetch --prune

source tree の場合

フェッチ時のオプション「リモートで消えた追跡ブランチを消去(Prune)」にチェックを付けて実行する

 

著者:t.n

 

concrete5でgoogle mapのブロックが上手く動かない

concrete5google mapのブロックを追加した際に上手く動かなかったのですが、解決に時間を要したので備忘録としてまとめます。

 

まず、ご存知かもしれませんが2016/6/22以降に始めてgoogle maps apiを実行したサイトからapiキーが必須となりました。concrete5で構築したサイトでも勿論この条件に当てはまればapiキーが必要です。

Get a Google Maps API key - concrete5

  

今回問題となったサイトでは上記に該当した為、apiキーさえ付ければ良いと思い込んだのが失敗でした。apiキーはGoogle Developers Consoleで登録するのですが、そこでは「プロジェクト」という単位でapiキーを紐付けており、さらに「プロジェクト」にはどの(googleが提供する)APIを有効にするか設定する必要があります(一部のAPIはデフォルトで有効)。

 

結論としては下記のAPIは有効にしておかないと正常に動作しないようでした。

もしかしたら「Google Static Maps API」も必要かもしれません。(細かく調査していないので曖昧ですいません)

これらを有効にするのを忘れないようにしましょう。

 

著者:t.n

UnityのWebGL出力について

自社サービスのフロント部分をUnityで開発していた、ある日のこと。
(今年の3月あたりの話になります)
「ブラウザで動したらいいのでは?」という話が出てきました。
その時に調べた内容をメモとして残しておきたいと思います。

 

Unityで開発したものを、ブラウザで動作させる場合2つ方法があります。

・UnityWebPlayer

 こちらは、プラグインをブラウザにインストールして動かすタイプです。
 所謂Flashみたいなものですね。

WebGL

 言語はJavascriptで、ブラウザからGPUを操作し、Canvasに描画します。

 

今回はWebGLについてです。

 

実は、Unity5.3.3からWebGL出力ができるようになりました。
ただし、WebGL出力の機能はプレビュー版となっていて正式リリースではありません。
また、Unityの公式ページではモバイル端末は未サポートとなっています。
以下、Unity公式ページから抜粋になります。
http://docs.unity3d.com/ja/current/Manual/webgl-browsercompatibility.html

Unity WebGL コンテンツは現在モバイル端末ではサポートされていないことに注意してください。一部端末、特にハイエンドなものでは動くかもしれませんが、大抵の端末は性能不足で Unity WebGL を十分に動かすだけのメモリがありません。

 

早速、自社サービスで作成していたパズルゲームWebGL出力して、PC版Chromeで確認したところ、ほぼ完璧な動きをしていました。

問題は、Arialフォントの文字列が描画されないことくらいでした。

(Arial=動作環境のデフォルトフォント)
この問題は、Fontデータも一緒にビルドして組み込んだFontを使用することで解決します。
また、サーバー上に配置したアセットバンドルを読み込むことができます。

 

実は、自社サービスはスマートフォンがターゲットとなっています。
なので、PCで動いただけでは喜んでいられません。。。

 

さっそく、本命のAndroid版のChrome(Nexus5)で動作確認してみました。

 

・・・結果は、残念なことになりました。
動くこともあれば、動いたとしてもエラーも吐かずに固まってしまったり、
何も表示されないまま固まってしまうなど不安定な動きとなっていました。

Nexus5くらいの性能ならば動くと信じたかったのですが、残念です。


まとめとして、UnityのWebGLはPCブラウザで動作させるには問題がないことが解りました。PCのブラウザ向けにリッチなコンテンツを開発するのにむいているのではないでしょうか?

 

また、ざっくりとした説明になりますが、UnityのWebGL出力はemscriptenを使用しています。
emscriptenとは、c,c++からLLVM生成して、それをJavaScriptに変換するコンパイラになります。つまり、コンテンツをc,c++で開発をしておけば、PCアプリ、スマートフォンアプリ、Webアプリでも同じコードで済みます。
今後、emscriptenがWebアプリの開発にどう影響を与えていくか気になります。

 

最後に、UnrealEngine4でもWebGL出力が可能になっていましたので調べてみましが、結果はUnityと同様結果でスマートフォン環境では厳しいという結果になりました。

 

著者:ai

Data too long for column

mysqlにおいて、今まで問題無かった個所で突然「Data too long for column 'xxx'」エラーが発生するようになったら確認しておくこと。

sql_modeに「STRICT_TRANS_TABLES」を付けていると桁数があふれた時にエラーを返すようになる。今まで付けていなかったのに何らかの理由で付けた場合、今まで問題無かった個所でエラーが発生する事になる。

  • sql_modeの確認
mysql> SELECT @@GLOBAL.sql_mode;
+--------------------------------------------+
| @@GLOBAL.sql_mode                          |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
  • オンライン状態での変更
mysql> SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
  • my.cnfでの設定
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION

著者:t.n

PHPでsoapライブラリを使ったときのハマりポイント・・・

先日、PHPsoapライブラリを利用して、ローカルに配置したwsdlを読み込んでの通信をテストしていたときのこと・・・ いくらwsdlファイルを更新しても接続先が変わりません・・・

何か変になっているのか、grepの検索範囲を広げながら確認していたところ、wsdlファイルのキャッシュが悪さしていたようです。

http://php.net/manual/ja/soap.configuration.php

デフォルトでは、ファイル形式で、24時間キャッシュされます。。。 ここにたどり着くまで長かった。。。というわけでメモしておきます!

さとう

bashrcを晒してみます。

余りにも更新していないので、私の .bashrcでも晒しておきますね。 特におもしろいことはしていませんが・・・

# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

alias db='ssh dbxxxx'

# colors
eval "`dircolors -b`"
alias ls='ls --color=auto'
alias sl='ls --color=auto'
alias dir='dir --color=auto'
alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'

ついでに、 .vimrc です。

syntax on

set fileformats=unix,dos,mac
set backspace=indent,eol,start

set history=100
set ruler

highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=darkgray
match ZenkakuSpace / /

set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
set fileencodings=ucs-bom,euc-jp,cp932,iso-2022-jp
set fileencodings+=,ucs-2le,ucs-2,utf-8

set tabstop=4
set autoindent
set expandtab
set shiftwidth=4

さとう