XOOPS CubeのProfileモジュールをServiceManagerに登録する

XOOPS Cubeのコアに同梱されているProfileモジュールは、ユーザー情報の項目を自由に追加できるモジュールです。
XOOPS CubeのServiceManagerは、モジュール間の連携を実現するXCube_Serviceを管理するコンポーネントです。
コア同梱のモジュールは基本的にServiceManagerにサービスを登録していますが、なぜかProfileモジュールだけは登録されていません。
そこで、登録するためのモジュールプリロードとパッチ(後述)を作りました。

コード

とりあえずコードはGistにあげておきました。

ちょっと解説

Definitions.class.php.patchはご覧の通りパッチファイルです。
メソッドを追加しただけですが、これがないとFATALになります。
呼び出し元を改変することも考えましたが、サービスの機能を減らす修正となってしまうのでこうなりました。
特に怪しい挙動もないので問題なく動作するとは思いますが、自己責任でお願いします。

RegisterService.class.phpはモジュールプリロードです。
このプリロードがServiceManagerへの登録を行います。
こちらのファイルはXOOPS_ROOT_PATH/modules/profile/preloadに配置してください。

まとめ

Profileモジュールのサービスは戻り型にXCube_Objectを継承したクラスを定義していますが、実際に帰ってくるのが配列だったりするので注意が必要っぽいです。
XOOPS Cubeのモジュール開発やカスタマイズに関するドキュメントが少ない印象があるので、こういうネタはもっと拡充したいですね。

参考

PHP – XOOPS Cube ServiceManager – Qiita


Photo By: Robert SchroederCC BY-NC-SA 2.0

[XOOPS Cube] Protectorモジュールに初Pull Requestした話

XOOPS Cubeの定番モジュールである「Protector」に、これまた定番のALTSYSがインストールされていないときにメニューの「一般設定」リンクがXOOPS2のSystemモジュールを指してしまうバグを見つけたので、修正してPull Request、すぐにマージされました。
管理メニューのリンクは正しく生成されているので、管理メニューから移動している限り見つけにくいバグです。

コードについてはhttps://github.com/xoopscube/protector/pull/3をご覧ください。

発生条件

ALTSYSがインストールされていないという1点だけです。
ALTSYSがインストールされている場合、Protector自身のadmin/index.phpを指すようにリンクが生成されます。
しかしALTSYSがインストールされていない場合、Systemモジュールのadmin.phpを指すリンクとなります。
Protector自身はALTSYSのインストールが必須ではないので、これではXOOPS CubeでALTSYSを使わずにProtectorを使いにくくなってしまいます。

修正

ALTSYSの有無を判定している部分で、ALTSYSがインストールされていない場合にlegacyモジュールの有無を判定し、インストールされていればlegacy/admin/index.phpを指すリンクを生成するようにしました。

蛇足

今回Pull Requestを出したのはXOOPS Cubeのリポジトリでしたが、よく見たらXoopsXのProtectorにも同様のバグがありました。
XoopsXは確かALTSYSが必須になっていたような気がするので、ほとんど気づけないですね。
最近のXOOPS Cubeコミュニティは、XoopsXとXOOPS Cubeで別のリポジトリを持ってしまっているせいで外から構造がよくわからなくなっている気がします。


Image By: Barbara DieuCC BY-NC-SA 2.0

[CentOS 7] MariaDB Serverのインストールとsystemdによる操作

RHEL7からMySQLの代わりにMariaDBが提供されるようになりましたね。
MySQLと互換性があるようなので、これからはMariaDBの時代が来るのでしょうか。
また、SysV Initに代わってsystemdが新しいinitプロセスとして採用されました。
操作方法が微妙に異なるので、ここで簡単にまとめておきます。

インストール

mysql, mysql-serverパッケージの代わりにmariadb, mariadb-serverパッケージが提供されています。

# yum install mariadb  # クライアント
# yum install mariadb-server  # サーバー

コマンドやUNIXソケットはMySQLと同じですが、バージョン情報を見るとちゃんとMariaDBになっています。

$ mysql --version
mysql  Ver 15.1 Distrib 5.5.37-MariaDB, for Linux (x86_64) using readline 5.1
$ mysqladmin -u root -p version
Enter password:
mysqladmin  Ver 9.0 Distrib 5.5.37-MariaDB, for Linux on x86_64
Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.
 
Server version          5.5.37-MariaDB
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/lib/mysql/mysql.sock
Uptime:                 2 min 49 sec

systemdの操作

RHEL7ではSysV initがsystemdで置き換えられました。基本的な操作はコマンドと引数の順番が違うだけなので覚えやすいと思います。
systemdではサービスやデバイスをUnitと言う単位で管理します。systemctlコマンドではこのUnitの名前を操作対象として指定します。
MariaDBのUnit名はmariadb.serviceです。

# systemctl アクション Unit名で基本的な操作ができます。
# ここで示したほかにもアクションがあるので、詳しくはsystemctl(1)のManページを見ましょう。
systemctl [enable|disable|start|stop|restart] mariadb.service

MariaDB Serverをインストールした後は、MySQLと同じように初期設定を行います。

# systemctl start mariadb.service
# mysql_secure_installation
()

システム起動時にMariaDB Serverが立ち上がるように設定します。

# systemctl enable mariadb.service

Image By: Giuseppe MoscatoCC BY-NC-SA 2.0

GitLab環境のUbuntuを13.10->14.04にアップデートしたときにはまった話

GitLabを手動でインストールしていたUbuntuを13.10から14.04にアップデートした後、GitLabが立ち上がっていないことに気づいたので解決方法を記載します。

たぶんこの問題で一番厄介なのは、service gitlab startコマンド自体は正常に終了するってところです。
ブートログを見ても特に問題が見つからず、いつの間にかGitLabだけが落ちているように見えてしまいます。

環境

  • GitLab 6.6.5
  • Ubuntu 13.10 -> 14.04

原因

実はかなり単純な問題で、charlock_holmesというgemに必要なlibicuパッケージが更新されたことが原因です。
unicornのエラーログを見てみると、/home/git/gitlab/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/dependencies.rb:229:in `require': libicui18n.so.48: cannot open shared object file: No such file or directory - /home/git/gitlab/vendor/bundle/ruby/2.0.0/gems/charlock_holmes-0.6.9.4/lib/charlock_holmes/charlock_holmes.so (LoadError)とあります。
ここに出てくるlibicui18n.so.48は、Ubuntu 13.10のlibicu48パッケージでインストールされたファイルですが14.04ではlibicu52となっており、そもそもこのファイルは存在しません。

解決法

charlock_holmes gemを再インストールする必要があります。
このgemはNative extensionが要るのでビルド時にlibicui18n.soのバージョンが固定されてしまいます。
若干面倒ではありますが、GitLabのインストールパス/vendor/bundle以下のcharlock_holmes関連ファイルを削除し、bundle installを再実行することで新しいバージョンのlibicui18n.soを参照するようになります。

まとめ

GitLabのUbuntu 14.04向けパッケージが提供されると幸せになれそうですね。
PPAでも良いけど。

#qpstudy 2014.04 〜俺の屍を超えて行け、でも踏まないで〜 に参加した話

4月19日(土)に開催された、qpstudy 2014.04に参加してきました。
過去にも何度か参加したりUstで眺めてたりしていましたが、新入社員であることに間違いは無いので新人枠での参加です。

qpstudyについてはこちら→https://sites.google.com/site/qpstudy/
qpstudy 2014.04についてはこちら→http://www.zusaar.com/event/4897007
Twitterのハッシュタグ「#qpstudy」を、@wasaistさんがまとめています。いつもありがとうございます→http://togetter.com/li/657194


就職先はインフラ屋さんじゃないので業務に直結する話ではないのですが、以前から個人的興味があったのとアプリより下のレイヤーの話も知っておいて損はないと思っています。
qpstudyは「初心者に優しい」勉強会なので、アプリ屋さんも積極的に参加してみてはいかがでしょうか。

今回の発表内容についてはTogetterのまとめと登壇された方のスライドに任せるとして、参加した感想を幾つか。

  • 相変わらずの人気。新人枠はそれほどでもなかった(とはいえ補欠20人くらい居たけど)が、告知翌日には一般枠はほぼ埋まって多様な気がする。
  • 今回はUstではなくニコ生で中継していたため、リモート参加者のツイートがあまり流れていなかった感じがする。
  • もっと前に座ればよかった。(座席表→http://seats.nekoruri.jp/36新人さん同士の絡みが出来なかったのが最大の後悔ポイント。
  • コミュ障改善してもっとつながりを増やしたい。

他にも今後の課題が幾つか出てきたので、頭の片隅にしまっておきます。とりあえず今は新人研修がんばろう!

登壇者の皆さんのスライドを貼って、この記事を締めさせていただきます。
会場を提供してくださったドワンゴ様、スタッフの皆様、参加者の皆さん、お疲れ様でした。そして、これからお世話になる(かも?)と思うので、よろしくお願いします!

第1セッション インフラエンジニアとは、なんだ by しょっさん(@sho7650)

第2セッション インフラアーキテクチャ設計の勘所 by せちろー(@sechiro)さん

第3セッション ハードウェア設計の勘所 by はせがわ(@hasegaw)さん

第4セッション OSとネットワーク設計の勘所 by おおむら(@yktko)さん

第5セッション ミドルウェア設計の勘所 by nekoruriさん

第6セッション 今後のインフラエンジニアとは by ばば(@netmarkjp)さん ※スライド非公開

Eclipseにプラグインをインストールする3つの方法

私事ですが、4月1日より社会人として某SIerで働き始めました。(そのあたりの話はSideDにあります。)
メインで使うIDEがEclipseなので、改めてプラグインをインストールする方法を確認しておきます。

※注意:Windowsまたはzipから展開して使っている場合の方法です。
Linuxディストリビューションで提供されているパッケージをインストールした場合は少し変わってくる箇所があるかと思います。

想定しているEclipseは、Eclipse 4.3.2 Kepler  Pleiades All in Oneです。日本語化されたメニュー項目で説明するので、Pleiadesを用いていない場合は適宜読み替えてください。

1. プラグインファイルをダウンロードしてディレクトリに配置する

最も単純なインストール方法です。プラグイン作者のWebページからダウンロードして、Eclipseをインストールしたディレクトリ以下のpluginsやfeaturesディレクトリに配置します。
操作方法を迷う必要はありませんが、プラグインの説明を読まないと正しく配置できない場合があるのが欠点です。また、プラグイン間の依存関係がある場合に解決するのが難しくなります。

2. 「ヘルプ」->「新規ソフトウェアのインストール」からインストールする

1では出来なかった依存関係の解決を含めて自動でプラグインをインストールすることが出来ます。
プラグインのダウンロードからインストールまで、すべてを任せることが可能です。但し、プラグイン作者毎にプラグインの一覧とダウンロード元を取得するために”ソフトウェア・サイト”*1を設定する必要があります。
言い換えれば、ソフトウェア・サイトを設定すればあとは自動でインストールできると言うことです。

3.Eclipse Marketplaceからインストールする

Eclipse Marketplace Clientプラグインをインストールすることで、Eclipse Marketplaceからプラグインをインストールすることが出来ます。
Marketplaceからプラグインをインストールする場合、2で触れたソフトウェア・サイトを設定する必要もありません。すべてMarketplace Clientにお任せです。
ただし、環境によってはMarketplace Clientがインストールされていません。ですがご安心ください。Eclipseにデフォルトで設定されているソフトウェア・サイトからインストールすることが出来ます。
2のやり方で、ソフトウェア・サイトを選択する「作業対象」を”すべての~”として、検索ボックスに”market”と入力すれば、マーケットプレース・クライアントが出てきます。これをインストールすれば素敵なMarketplaceライフの始まりです。

以上3つの方法があります。プラグインによっては、1でしかインストールできない場合や3ではインストールできない場合などありますので、個別に確認しましょう。
特にEclipseのプラグインを配布しているWebサイトは英語で書かれていることがほとんどですが、英語を読めるに越したことはないので、がんばって読みましょう。


Photo By: Arun SkariahCC BY-NC-SA 2.0

*1 以前はアップデートサイトと呼んでいたような気がします

MySQLサーバーが立ち上がらない現象

Ubuntu ServerでパッケージからインストールしたMySQLサーバーが、再起動時に自動的に起動してない現象に遭遇した。

環境:
Ubuntu Server 13.10
MySQL Server 5.5.35-0ubuntu0.13.10.2

/var/log/mysql/error.logを見てみると、

(略)
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have another mysqld process
InnoDB: using the same InnoDB data or log files.
140409 20:27:55  InnoDB: Unable to open the first data file
InnoDB: Error in opening ./ibdata1
(略)

こんな具合にエラーが出て起動に失敗しているようだ。

エラーメッセージには「もう別のmysqld起動してんじゃねぇの?」とあるが、再起動直後にそんなの居るわけない。

起動していないとさすがに困るので、/etc/rc.localで無理矢理起動してみることにする。

とりあえずしばらくは様子見ですかね。。。


Image By: smilemarkCC BY-NC-SA 2.0

Javaの勉強会を探しています

By: Michael SauersCC BY-NC-SA 2.0

Side Dにも書きましたが、おかげさまで就職できました。

会社で主に使う開発言語がJavaなのでどこかの勉強会に参加して知識を深めたいと思っています。
おすすめの勉強会があればぜひ教えてください。

自作mikutterプラグインまとめ(2014年3月版)

なんかTwitterの鳥っぽい感じがした By: Macomb PaynesCC BY-NC-SA 2.0

私はRubyで書かれたクロスプラットフォームのTwitterクライアント「mikutter」の愛用者です。
mikutterの特徴の1つとして、簡単なRubyスクリプトでいくらでも機能を拡張できるプラグイン機構があります。
私も幾つか自作プラグインを公開しているので、まとめておきます。
mikutterプラグイン、mikutterコマンドなど興味がある方は、http://mikutter.hachune.nethttp://yuzuki.hachune.net/wikiをご覧ください。

mikutter-focus-to-hometimeline

ホームタイムラインタブにフォーカスを移動するmikutterコマンドを提供するプラグインです。
mikutterコアで投稿ボックスにフォーカスを移動するコマンドは提供されていますが、マウスを極力使いたくない人種(含自分)としてはホームTLにキーボードだけで移動したいのです。
http://github.com/bis5/mikutter-focus-to-hometimeline

mikutter_growl_gntp

クロスプラットフォームの通知アプリケーションである「Growl」に対して新着通知を行うプラグインです。
Linuxではlibnotifyやnotify-osdというプログラムで通知できる環境がほとんどですが、RubyからWindowsAPIを通じてバルーン通知やトースト通知を行うのは非常に面倒です。Growlを使えば、少ないコード量で簡単に通知機能を実装できます。
Growlはリモートホストからの通知にも対応しており、このプラグインはリモートホスト上のGrowlに対しても通知を飛ばせるようになっています。mikutterプラグインでバッチ処理を行い、管理用ホストに完了通知を行うような、本来のプラグインホストとして乗りようにおいて有用な気がします(でっちあげ)。
http://github.com/bis5/mikutter_growl_gntp

mikutter-googl

goo.glで短縮されたURLを展開して表示するプラグインです。
展開するのにわざわざAPIキーを使っているので、今後利用者が増えてきたらAPI Limitに引っかかるかもしれません。そうなったらそうなったでそのときに考えたいとは思います。
http://github.com/bis5/mikutter-googl

my_wishlist

Amazon.co.jpの欲しいものリストのURLを投稿ボックスに挿入します。
設定画面で挿入する欲しいものリストのIDを設定する必要があります。
欲しいものリストを公開してテロの被害者になりたい方におすすめのプラグインです。ちなみに私はまだ被害を受けたことはありません。http://github.com/bis5/my_wishlist

mikutter_kokoro_no_koe

。○(こんな感じに心の声っぽくテキストを整形するプラグインです。)
。○(それ以上でもそれ以下でもありません。)
。○(形が気に入らない方はフォークして自分の心の声を表すプラグインを作ってください)
http://github.com/bis5/mikutter_kokoro_no_koe

 

ブログが分裂しました(技術系はこっち)

はい。分裂しました。こちらは技術系の投稿を扱う「Side T:echnology」(略称:Side T)です。もう一方の日記風記事を扱う「Side D:iary」(略称:Side D)はこちらです。

今回の分裂の裏にはVPSの引っ越しがありました。ちょうど更新期限が迫ってきていたので、GMOクラウドVPSからConoHaに引っ越しました。

ConoHaの特徴の1つであるIPv6アドレスの割り当てがあるので、少し待ってもらえればSide T、Side DともにIPv6接続で利用できるようになるはずです。(まだAAAAレコード設定してない・・・)

旧ブログ(http://blog.bis5.net)はすべてdiary.bis5.netにリダイレクトしているはずです。今までに書いた技術系の投稿はすべてSide Dにありますが、リダイレクトがうまくいっていないようでしたら御連絡下さい。

それでは。