baserCMS2系から3系への道(アップデートメモ)

 オレはようやくのぼりはじめたばかりだからな
       このはてしなく遠いbaserCMS坂をよ… 未完

という気持ちになるくらいイロイロとありましたが(2日かかってしまいました)、無事2.1.1から3.0.2へ移行できました。注意点のメモを残します。

まずは、移行作業の参考にさせていただいたサイト。

本家本元、
 baserCMS開発ブログ『baserCMS 2.1系 から baserCMS3に移行する』

うっかりナスビさんでもお馴染み我流さんの、
 我流天性 がらくた屋『baserCM2.1.2から 3.0.0へ移行を試してみたよ』

作業手順については上記、2つサイトを参考にすれば問題ないと思います。
移行作業で使用するプラグインは、現在、baserマーケットからダウンロード出来ます。
DBマイグレーター(作業時バージョン1.0.3)
アドオンマイグレーター(作業時バージョン1.0.1)

では、はじめに大事なことを。
普通に運用しているサイトであれば重要なのは1点。

 「まず、3.0.0に移行するのだ! 後のアップデートは3.0.0で動いてからだ!」

baserCMSユーザーズフォーラムの「2→3 の移行途中で /maintenance/index に強制リダイレクト」というトピックに書きましたが、DBマイグレーターの移行対象は(現状)、3.0.0のみだと思われます。

よって、一旦3.0.0で対応作業を行ってから以降のバージョンへのアップデートを行う、という手順で比較的容易に移行できると思います(移行用プラグイン優秀!)。

私が作業していた時には http://basercms.net/download/past から3系の旧バージョンがダウンロード出来なくなっていたのですが、素早く対応していただき、現在はダウンロード出来るようになっています。

私の最初の一日は3.0.2へのデータ復元後のメンテナンス画面への強制リダイレクトやデータベースアクセスエラーの原因を調べるのに費やされました。この情報で、みなさんの一日が守られればと思います。

以降はサイトの状況によってまったく異なってくると思いますので参考程度に。
弊社の場合はいろいろとカスタマイズしていたので様々な問題がでました。デバッグモードで動かし、表示されるNoticeを一つ一つ潰していきました。

・プラグインが無効化されずにサイト全体が死亡
 DBマイグレーターで変換したデータを3.0.0に復元した後、なぜかプラグインが無効化されておらず、プラグイン周りでエラーが発生してサイトが死亡しました。データベース直編集でプラグインを無効化してエラーを回避しました。

・テーマヘルパーでエラー
 テーマヘルパーはアドオンマイグレーターの変換では動作しませんでした。まずはテーマヘルパーを使用しているところをコメントアウトしてサイトが動作する状況にした後、デフォルトのヘルパーを参考に手作業で対応作業を行いました。

・カスタマイズしていたサイトマップでエラー
 前の記事をご参照下さい。

・パンくず周りの変更に対応
 古いテーマだとパンくず周りで「Not Found: …/elements/navi.php」といったNoticeが出てパンくずが正常に動作しません。3系に添付されているテーマの elements/crumbs.php をコピー、カスタマイズして対応するのが良いと思います。

・$bcBaser->paramsの値を直接参照していたところでエラー
 反則に近いかもしれないのですが$bcBaser->params(2系の場合)中の値を直接参照して判定を行っていた箇所が結構ありまして、エラーとなりました。$this->BcBaser->params(3系の場合)の内容を調べて、同様の動作をするように書き換えました。3系のほうが情報が増えていて便利でした。

・3.0.0セットアップ時テーマのメールフォームと移行元メールフォームのフィールドが混在
 これはプラグインが無効化されなかったときに直接データベースをいじって対応したのが原因かもしれないのですが(データ復元時にエラーが出ていたのかもしれない)、既存テーマのcontactメールフォームと移行元のcontactメールフォームのフィールド情報などが混在状態になってしまい難儀しました。既存テーマの情報をデータベースから直接削除するなどして対応しました。

以上、アップデートメモでした。

Facebooktwitterlinkedintumblrmail

baserCMS3系でのサイトマップカスタマイズ

bserCMS3系へのメジャーバージョンアップからはや半年以上、やっと弊社サイトを2.1.1から3.0.2へバージョンアップしました。

バリバリにカスタマイズしているので腰が引けていたのです。

旬を外していたり、イレギュラーなカスタマイズをやっていたりでバージョンアップにはかなり苦労したのですが、その話は次にとっておきまして、まずは以前書いた『baserCMSのサイトマップをカスタマイズ』のフォローを。

上記記事のコードですが、アドオンマイグレーター(http://barket.jp/products/detail.php?product_id=11)でテーマを変換しただけでは(やはり)動きませんでした。

少し修正が必要でしたので修正後の弊社のサイトマップのコードを置いておきます。参考にどうぞ。

BcBaser->sitemap() で呼び出す
 */
//ここから設定
//表示しないurl
$disables = array(
'/index_test',
);

//$inserts = array(before_url=>array(title, url),,,)
//before_urlの次に挿入url,titleで作成したアイテムを挿入
//ブログ、メールフォームなどpage以外を途中に挿入することが出来る。
$inserts = array(
'/sitemap' => array('新着情報', '/news'),
'/news' => array('お問い合わせ', '/contact'),
'/it-model/faq' => array('ダウンサイジングについてのお問い合わせ', '/contact_itmodel'),
'/roundcube/faq' => array('Roundcubeについてのお問い合わせ', '/contact_roundcube'),
'/kolab/faq' => array('Kolabについてのお問い合わせ', '/contact_kolab'),
);
//設定ここまで

//関数
$bcBaser = $this->BcBaser;
$outputPageItem = function ($recursive, $title, $url) use (&$bcBaser) {
?>
  • link($title, $url) ?>
  • link($title, $url); else: echo $category_title; endif; echo PHP_EOL; }; $outputCategoryItemTail = function () { ?>
    • BcBaser->element('sitemap', array( 'pageList' => $pageCategories['children'], 'category_title' => $category_title, 'category_url' => $category_url, 'recursive' => $recursive+1 )); endif; if($outputed_category_li): $outputCategoryItemTail(); endif; endforeach; endif; ?>

    ポイントは「$bcBaser = $this->BcBaser;」して$bcBaserを無形関数に渡して使用するところです。

    Facebooktwitterlinkedintumblrmail

    『ぺちぱな。∞(えいと)』で Vagrant、HHVM、Hackして来た

    muraveです。ご無沙汰しております。

    もんきー(さる) 2014年5月17日(土)、

    ぺちぱな。∞(えいと)〜Hackするのに悪いヤツはいない。HackとCrackを間違えるのに碌なヤツはいない〜

    に参加いたしました。

    Vagrant環境から構築して、HHVM(HipHopVM)用にPackegeしたBoxファイルを配布、PHPとFacebookがOSSとしてリリースした新言語Hackの比較までやってしまおうという意欲的な勉強会でした。

    環境構築でのひっかかり(原因は使用ポートの衝突、CPUの仮想化支援がONになっていなかった等)はありましたが全員完走でした!

    この勉強会の資料がすばらしくて(もちろん資料だけではないですけど)、懇親会でも@hideAki76氏を褒めちぎっていたのですが、この資料が公開されましたよ!ということをみなさまにも強くお伝えしたい。

    自習するにはHHVM用Boxの問題がありますが、HHVM用環境構築のプロビジョニングについても書いてあるのでどうになるんじゃないでしょうか。すばらしい。

    HHVM、はやくdebian系じゃなくても気軽に動かせるようになるといいな。

    Facebooktwitterlinkedintumblrmail

    長崎国体・大会アプリがリリースされました!

    長崎がんばらんば国体・長崎がんばらんば大会実行委員会様提供、弊社設計・開発による長崎国体アプリがリリースされました!
    競技の日程や組合せ、会場付近の施設など、観戦をトータルにサポートするアプリになっております。
    5月24・25日はリハーサル大会も開催されますので、是非ダウンロードしてください!

    Facebooktwitterlinkedintumblrmail

    Selenium IDEを使った手入力の半自動化

    随分と前回から空いてしまっているので、日頃考えていた妄想でも一つ。

    目的: ブラウザから手入力で写していたデータをなるべくシステムを触らずに半自動化するサービスサーバを提供する。
    利用者はSelenium IDEで記録して、定型に従って修正すれば低コストで複数の自動化が可能。

    例えばサイトAで入力された内容を、人力でサイトBに後で入力し直す必要が有る場合等。

    • サイトBはOSSのアプリケーションで、改修するコストが見合わない
    • markdown形式に変えて記入する必要が有る
    • etc…

    1. Selenium IDEでサイトBの入力用のテストケースのテンプレートをRecording等で作成しておき、
    サービスサーバはサイトAのデータから、テストケースに穴埋めして自動的にファイルを作成できるようにします。
    ※複数有る場合は、適度にテストスイートにまとめる。

    2. 利用者はFirefoxのSelenium IDEからテストを開いて、実行するだけになります。
    Selenium Serverなり別のテストツールなり使ってここも自動化出来るかも知れませんが、ログインとか考えると面倒が増えそうです。
    ※ログイン部分の切り貼りを出来るようなプログラムを別途提供する事で対応可能かも。

    まぁデータのやり取りが有るので、サービスサーバにするには向いていないかと思いました。
    (Selenium IDE依存になるのも)

    Facebooktwitterlinkedintumblrmail

    HaxeUIをWindowsターゲットで日本語表示

    HaxeUIはWindowsターゲットでビルドすると、日本語を表示してくれませんでした。
    そこで、IPAフォントを埋め込みフォントとして使って表示させました。
    http://ipafont.ipa.go.jp/

    IPAフォントをどれか一つダウンロードしたら、適当な箇所に設置します。
    ※今回はIPA Gothicをダウンロードして(assets/fonts/ipag.ttf)に設置。

    HaxeUIは、

    Macros.addStyleSheet("styles/gradient/gradient.css");
    Toolkit.init();

    のように呼び出しているので、Macroを追記します。

    Macros.addStyleSheet("styles/gradient/gradient.css");
    Macros.addStyle("Text", "fontName:'assets/fonts/ipag.ttf';fontSize:14");
    Toolkit.init();

    これで、Textを使っているListViewやTableViewにも日本語表示出来ます。

    2013/12/10 追記:
    フォントを指定無しにしても表示出来るようです。
    Macros.addStyle("Text", "fontName:'';fontSize:14");
    日本語フォントの入ってるWindowsなら、これで良いかも知れません。

    Facebooktwitterlinkedintumblrmail

    「CEATEC JAPAN 2013」 2日目

    CEATEC JAPAN 2日目です!!

    本日は他のブースを色々と見て回ることができました。
    面白そうなものが沢山展示されています。

    中でも私の興味を引いたのがこちら、LEDスイッチ!!

    LEDスイッチ

    あらゆるボタンが ズラッと並んでるのがとても綺麗で、無駄にカチカチ押してきました(笑)
    画像が動くボタンがあったので、テンション上がって動画を撮影したのですが
    うまく撮れていませんでした…明日リベンジです。

    本日のランチ、みそ焼き鯖ずし。

    みそ焼き鯖ずし

    衝撃の美味しさでした(´∀`)
    もうこれはお取り寄せ決定です!

    Facebooktwitterlinkedintumblrmail

    Android Bootstrapを試してみた。

    Android Bootstrapを試してみたので、忘れないように手順をメモとして残しておきたいと思います。

    (1)
      環境変数は以下のようにしました。
        export JAVA_HOME=/Library/Java/Home
        export ANDROID_SDK=$ANDROID_HOME
        export ANDROID_TOOLS=$ANDROID_SDK/tools

        export PATH=${PATH}:${ANDROID_TOOLS}
        export PATH=${PATH}:${ANDROID_HOME}/platform-tools

    (2)
      下記のサイトからandroid-bootstrapをダウンロードします。
      http://www.androidbootstrap.com/

      アプリ名とパッケージ名を以下のように入れて「Generate Your App」ボタンを押します。

    (3)
      (2)でダウンロードした、android-bootstrapのディレクトリで
      「mvn clean package」コマンドを実行します。
      mvnコマンドがない場合は、「brew install maven」

    (4)
      Android Studioを起動します。
      もっていない場合は、以下のサイトからダウンロードしてください。
      http://developer.android.com/sdk/installing/studio.html

    (5)
      Open Projectを選択します。

    (6)
      android-bootstrapのpom.xmlを選択します。

    (7)
      SDK Managerを起動します。

    (8)
      APIレベル14、16をダウンロード・インストールします。

    (9)
      maven projectで「Reimport All Maven Projects」ボタンを押します。

    (10)
      FileメニューのProject Structureを選択します。

    (11)
      Projectを選択肢、Project SDKでAndroidを選択します。

    (12)
      Modulesを選択し、「~apklib-com.viewpagerindicator_library_2.4.1」を選択します。
      下部の「+」ボタンを押して、Jars or directoriesを選択します。

    (13)
      「com.viewpagerindicator_library_2.4.1」の中にあるandroid-support-v4.jarを選択します。

    (14)
      CMD+F9でrebuildingします。

    (15)
      RunのEdit Congifrationsを選択します。

    (16)
      「+」ボタンを押してAndroid Applicationを選択します。

    (17)
      Nameに「BootstrapTest USB」と入力します。
      Moduleでcom-lancard-testを選択します。
      Target DeviceでUSB deviceを選択します。

    (18)
      com.lancard.test.ui.view.CapitalizedTextViewの下記の行が、通らなかったのでひとまずコメントアウトしました。

      //setTypeface( Typeface.createFromAsset(context.getAssets(), “fonts/Roboto-Regular.ttf”) );

    (19)
      携帯とPCをつなぎ、メニューのRunからRun ‘BootstrapTest USB’を選択します。

    (20)
      下記の内容を入力してテストできます。
      Email Address:demo@androidbootstrap.com
      Password:android

      こういう感じのものがAndroid2.3などでも動くというのは嬉しいですね。

    Facebooktwitterlinkedintumblrmail

    「CEATEC JAPAN 2013 」1日目

    やって参りました!CEATEC JAPAN 2013 in 幕張メッセ!!
    今年も長崎県のブースで共同出展させて頂いております。

    nagasaki_ken

    通路を挟んで向かいのブースにdocomo様がデーンと構えておりますので、会場にお越しの際はそれを目印に、ぜひぜひお立ち寄り下さい(^_^)

    LANCARD.COM

    出展製品はこちらからご覧下さい!

    昨年に引き続き、有安オートさんの電気自転車の無双っぷりが半端なかったです(^_^;)老若男女、国籍を超えて大人気!!
    以前出展していたものより更にかっこ良くなっていました。

    有安オート

    CEATEC JAPAN 2013は10月5日(土)まで開催しております。
    出店でグルメも楽しめますので、ランチついでにぜひ遊びに来て下さい!!

    本日のランチ、タコライス。

    タコライス

    美味でした!

    Facebooktwitterlinkedintumblrmail

    IronPythonとジェネリックと初期値わたし

    C#勉強会に行って自己紹介で「MVVMパターン用のフレームワーク使ってViewとViewModelはC#、ModelはIronPythonで書います」と言ったら微妙な空気になりました、夏。

    muraveです。

    というわけでC#とIronPythonを組み合わせて書いてます。基本的に配列や辞書は便利なのでPythonのモノ使ってましたがパフォーマンス・チューニングやっててジェネリック使ったほうがいいところもあるかな、と。

    IronPython側でのジェネリックの書き方は知っててたまに使ってたんですが(C#での<>が[]になります)、試したら普通に初期値も与えられるのにちょっと感激。

    C#で書くとList<string>の場合

    >>> import site
    >>> import clr
    >>> from System.Collections import Generic as DotNetCollectionsG
    
    >>> dot_l = DotNetCollectionsG.List[str]()
    >>> print dot_l
    List[str]()
    
    >>> dot_l = DotNetCollectionsG.List[str](['a', 'b'])
    >>> print dot_l
    List[str](['a', 'b'])

    C#で書くとDictionary<string, int>の場合

    >>> import site
    >>> import clr
    >>> from System.Collections import Generic as DotNetCollectionsG
    
    >>> dot_dict = DotNetCollectionsG.Dictionary[str,int]()
    >>> print dot_dict
    Dictionary[str, int]()
    
    >>> dot_dict = DotNetCollectionsG.Dictionary[str,int]({'a':1 ,'b':1})
    >>> print dot_dict
    Dictionary[str, int]({'b' : 1, 'a' : 1})

    ね♪

    helpみたら普通に書いてありました。

    >>> help(dot_dict)
    Help on Dictionary[str, int] object:
    
    class Dictionary[str, int](object)
     |  Dictionary[str, int]()
     |  Dictionary[str, int](capacity: int)
     |  Dictionary[str, int](comparer: IEqualityComparer[str])
     |  Dictionary[str, int](capacity: int, comparer: IEqualityComparer[str])
     |  Dictionary[str, int](dictionary: IDictionary[str, int])
     |  Dictionary[str, int](dictionary: IDictionary[str, int], comparer: IEqualityComparer[str])
     |
    以下略
    

    えらいなぁ。

    Facebooktwitterlinkedintumblrmail