Eclipse RCPの作り方

Eclipse RCPの作り方を紹介します。

(といっても、久しぶりに作ろうと思ったら忘れていたので
今度は忘れないように自分のためのログですが・・。)

①Eclipse RCP
  Eclipse Rich Client Platformの略で、EclipseとJavaの資産が
  使えることが利点になります。

  さらに、一度ソースを書くとWindows Mac Linuxなど
  様々なOS用にコンパイルすることが出来ます。

②プラグインプロジェクトの作成
  Eclipseには内蔵ブラウザがあるので、ブラウザを使ったものを作ってみます。

  1.プラグインプロジェクトを選択します。


  2.リッチクライアントアプリケーションを作成の部分は「はい」を選択して下さい。
   「いいえ」を選択するとEclipseプラグインになります。

  3.特に機能はいらないので「Hello RCP」を選択します。

③とりあえず、起動する。

  右下にあるテストの項目の、「Eclipseアプリケーションの起動」をクリックします。

  何も無い画面だけが表示されます。

④ブラウザ表示用にViewを追加します。
  1.plugin.xmlを開きます。
  2.拡張タブを選択します。
  3.追加ボタンをクリックします。
  4.「org.eclipse.ui.views」を追加します。


  5.追加された「org.eclipse.ui.views」を右クリックして
   以下のようにviewを選択します。

  6.追加されたviewを選択して以下のように入力します。

  7.以下のように「com.lancard.mybrowser.view.MyBrowserView」クラスを作成します。

package com.lancard.mybrowser.view;

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;

public class MyBrowserView extends ViewPart {

public static final String ID = "com.lancard.mybrowser.view.MyBrowserView";

private Browser browser = null;

public void createPartControl(Composite parent) {
Composite top = new Composite(parent, SWT.NONE);
RowLayout layout = new RowLayout(SWT.VERTICAL);
layout.wrap = true;
top.setLayout(layout);

browser(top);

}

private void browser(Composite top){
Composite obj = new Composite(top, SWT.NONE);
RowLayout layout = new RowLayout(SWT.HORIZONTAL);
layout.wrap = true;
obj.setLayout(layout);

browser = new Browser(obj,SWT.BORDER);
browser.setUrl("https://www.google.co.jp");
browser.setLayoutData(new RowData(800,500));
}

public void setFocus() {
}


}

⑤ブラウザを表示するコマンドを追加します。
  1.plugin.xmlを開きます。
  2.拡張タブを選択します。
  3.追加ボタンをクリックします。
  4.「org.eclipse.ui.commands」を追加します。


  5.追加された「org.eclipse.ui.commands」を右クリックして
   以下のようにcommandを選択します。

  6.追加されたcommandを選択して以下のように入力します。

  7.以下のように「com.lancard.mybrowser.action.MyBrowserAction」クラスを作成します。

package com.lancard.mybrowser.action;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;

import com.lancard.mybrowser.ICommandIds;

public class MyBrowserAction extends Action {

private final IWorkbenchWindow window;
private int instanceNum = 0;
private final String viewId;

public MyBrowserAction(IWorkbenchWindow window, String label, String viewId) {
this.window = window;
this.viewId = viewId;
        setText(label);
setId(ICommandIds.CMD_MY_BROWSER);
}

public void run() {
if(window != null) {
try {
window.getActivePage().showView(viewId, Integer.toString(instanceNum++), IWorkbenchPage.VIEW_ACTIVATE);
} catch (PartInitException e) {
MessageDialog.openError(window.getShell(), "Error", "Error opening view:" + e.getMessage());
}
}
}
}

「com.lancard.mybrowser.ICommandIds」は以下のように記述します。

package com.lancard.mybrowser;

public interface ICommandIds {

    public static final String CMD_MY_BROWSER = "com.lancard.mybrowser.mybrowser";
    
}

⑥メニューを追加してみます。
  メニューを追加するには、自動的に作成されている
  「com.lancard.mybrowser.ApplicationActionBarAdvisor」クラスに以下のように記述します。

package com.lancard.mybrowser;

import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;

import com.lancard.mybrowser.action.MyBrowserAction;
import com.lancard.mybrowser.view.MyBrowserView;

public class ApplicationActionBarAdvisor extends ActionBarAdvisor {

    private MyBrowserAction myBrowserAction;
    public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
        super(configurer);
    }

    protected void makeActions(IWorkbenchWindow window) {
    myBrowserAction = new MyBrowserAction(window, "ブラウザ", MyBrowserView.ID);
        register(myBrowserAction);
    }

    protected void fillMenuBar(IMenuManager menuBar) {
        MenuManager fileMenu = new MenuManager("&メニュー", IWorkbenchActionConstants.M_FILE);
        
        menuBar.add(fileMenu);
        
        fileMenu.add(myBrowserAction);
    }
    
}

⑦構成
この時点でプロジェクトの構成はこのようになっています。

⑧起動してみる。

  今度は右上にメニューが出来ていて中にはブラウザメニューがあります。

  ブラウザメニューを選択すると、作成したブラウザビューが表示されます。

⑨製品化する。
  このままだと、Eclipseを起動しないと使えないので製品化する作業をします。

  1.MyBrowserプロジェクトを選択して、右クリックします。
  2.新規メニューから製品構成を選択します。

  3.以下のように入力して、完了ボタンをクリックします。

    「MyBrowser.product」というファイルが追加されます。
  4.「MyBrowser.product」を開きます。
  5.概要タブを選択し、以下のように記述します。

    「新規」ボタンをクリックします。

    次のように入力して完了をクリックします。

    次のようになります。

  6.依存関係タブを選択し、追加ボタンをクリック。
    「MyBrowser」があると思うので選択して「OK」をクリック。

    「必須プラグインの追加」ボタンをクリックします。

  7.起動タブを選択し、以下のように入力します。

  8.概要タブのエクスポートの項目にある
   「Eclipse製品エクスポート・ウィザード」をクリックします。

    ディレクトリーは適当な場所にして、完了をクリックします。

  9.2つのフォルダが出来ます。

  10.mybrowserの中にある「MyBrowser」を起動します。

  11.ちゃんと動きました。
    しかし、ソース上に書いた文字は文字化けします。

⑩国際化対応
  文字がソース上にそのまま書いてあるため、文字化けしている状態になります。
  国際化対応するための機構があるので国際化対応します。

  1.「com.lancard.mybrowser.resource」パッケージを作成します。
  2.「custom_ja.properties」というファイルを作成します。

    ファイルの中は次のように記述します。
MENU=&メニュー
BROWSER=ブラウザ

  3.「com.lancard.mybrowser.CustomString」クラスを作成します。

package com.lancard.mybrowser;

import java.util.Locale;
import java.util.ResourceBundle;

public class CustomString {
private static final String BUNDLE_NAME = "com.lancard.mybrowser.resource.custom";
private static ResourceBundle rb = null;

public static void setBundle(Locale locale) {
try {
rb = ResourceBundle.getBundle(BUNDLE_NAME, locale);
} catch (Exception e) {
rb = ResourceBundle.getBundle(BUNDLE_NAME, Locale.JAPANESE);
}
}

public static String getString(String key) {
try {
String keyValue = new String(rb.getString(key).getBytes("ISO-8859-1"), "UTF-8");
return keyValue;
} catch (Exception e) {
e.printStackTrace();
return key;
}
}

}

  4.既に存在する「com.lancard.mybrowser.Application」クラスの
    startメソッドに次の一行を追加します。
    「CustomString.setBundle(Locale.getDefault());」

public Object start(IApplicationContext context) throws Exception {
CustomString.setBundle(Locale.getDefault());
Display display = PlatformUI.createDisplay();
try {
int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
if (returnCode == PlatformUI.RETURN_RESTART)
return IApplication.EXIT_RESTART;
else
return IApplication.EXIT_OK;
} finally {
display.dispose();
}

}

  5.「com.lancard.mybrowser.ApplicationActionBarAdvisor」の
    文字部分を次のように書き換えます。

package com.lancard.mybrowser;

import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;

import com.lancard.mybrowser.action.MyBrowserAction;
import com.lancard.mybrowser.view.MyBrowserView;

public class ApplicationActionBarAdvisor extends ActionBarAdvisor {

    private MyBrowserAction myBrowserAction;
    public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
        super(configurer);
    }

    protected void makeActions(IWorkbenchWindow window) {
    myBrowserAction = new MyBrowserAction(window, CustomString.getString("BROWSER"), MyBrowserView.ID);
        register(myBrowserAction);
    }

    protected void fillMenuBar(IMenuManager menuBar) {
        MenuManager fileMenu = new MenuManager(CustomString.getString("MENU"), IWorkbenchActionConstants.M_FILE);
        
        menuBar.add(fileMenu);
        
        fileMenu.add(myBrowserAction);
    }
    
}

  6.もう一度エクスポートします。
    今度は文字化けしていた部分もきちんと日本語が表示されました。

Facebooktwitterlinkedintumblrmail

PhpStorm(IntelliJ)のクリップボードマネージャ

PhpStormにはクリップボードマネージャ機能があり、クリップボードの履歴からペーストしたりすることができます。しかし私は別のクリップボードマネージャアプリを使用しており、そのアプリから貼り付けたいのですが、機能がバッティングしてしまいうまく動作しません。

調べたところシステムのクリップボード領域とPhpStormのクリップボード領域を同期する設定をすることで正しく動作するようになりました。

idea.use.alt.clipboard.sync=trueを/Applications/PhpStorm.app/bin/idea.vmoptionsに追記するだけでOKです。

参考

Switching clipboard content with system clipboard manager does not work in rubymine (Ubuntu)

Facebooktwitterlinkedintumblrmail

RoudcubeプラグインでAjaxする

RoudcubeプラグインでAjaxする方法を紹介します。

サーバ側:

rc = rcmail::get_instance();

$this->add_texts('localization/');
$this->register_task('ajax_sample');

if($this->rc->task == 'ajax_sample'){
$this->register_action('index', array($this, 'action'));
$this->register_action('get_data', array($this, 'action'));
}else{
$this->add_button(array(
'command' => 'ajax_sample',
'label' => 'ajax_sample.title'
), 'taskbar');
}
}

public function action(){
//画面表示
if($this->rc->action === 'index'){

$this->include_script('ajax_sample.js');
$this->rc->output->send('ajax_sample.ajax_sample');

//ajax
}else if($this->rc->action === 'get_data'){

error_log(get_input_value('data', RCUBE_INPUT_POST));
$this->rc->output->command('plugin.get_data', array('data' => 'test'));

}
}

}

クライアント側:

var get_data_call_back = function(response){
console.log(response.data);
}

if (window.rcmail) {
rcmail.addEventListener('init', function() {
rcmail.addEventListener('plugin.get_data', get_data_call_back);
rcmail.enable_command('get_data', true);
});
}

rcube_webmail.prototype.get_data = function()
{
rcmail.http_post('get_data',{"data":'test'});
}

①コールバックの登録
  クライアント側のrcmail.addEventListener(‘plugin.get_data’, get_data_call_back);の
  第一引数と
  サーバ側の$this->rc->output->command(‘plugin.get_data’, array(‘data’ => ‘test’));の
  第一引数を
  一致させる必要があります。

  この際に’plugin.’という文字を前につける必要があります。
  なぜなら/roundcuberoot/program/include/rcube_json_output.phpの
  141行目が次のようになっています。

    public function command()
    {
        $cmd = func_get_args();

        if (strpos($cmd[0], 'plugin.') === 0)
          $this->callbacks[] = $cmd;
        else
          $this->commands[] = $cmd;
    }

  ここでcallbacksに登録されないため

  /roundcuberoot/program/js/app.src.jsの6041行目

    // execute callback functions of plugins
    if (response.callbacks && response.callbacks.length) {
      for (var i=0; i < response.callbacks.length; i++)
        this.triggerEvent(response.callbacks[i][0], response.callbacks[i][1]);
    }

  この部分のコールバックとして実行されません。

②ポストするデータ
  rcmail.http_post('get_data',{"data":'test'});の第二引数で指定します。

③サーバから返すデータ
  $this->rc->output->command('plugin.get_data', array('data' => 'test'));の第二引数で指定します。

Facebooktwitterlinkedintumblrmail

Roundcubeのボタンの使い方

Roundcubeのボタンの使い方を紹介します。

①テンプレートへの設置方法は以下のようになります。


このように書いておくと、次のように出力されます。


②イベントをどう処理するか?

このように書きます。

if (window.rcmail) {
rcmail.addEventListener('init', function() {
rcmail.enable_command('get_data', true);
});
}

rcube_webmail.prototype.get_data = function()
{
console.log('get_data');
}

③rcmail.enable_command(‘get_data’, true);の
 最後の引数でそのボタンを有効にするか無効にするか指定します。
  試しに2つのボタンを設置してみます。



デフォルトではどちらも無効になります。

次のようにjavascriptを記述します。

if (window.rcmail) {
rcmail.addEventListener('init', function() {
rcmail.enable_command('btn1', true);
rcmail.enable_command('btn2', false);
});
}
rcube_webmail.prototype.btn1 = function()
{
console.log('btn1');
}
rcube_webmail.prototype.btn2 = function()
{
console.log('btn2');
}

ボタンは2つとも見かけ上有効になります。
しかし、ボタン1をクリックするとコンソールに’btn1’が表示されますが、ボタン2をクリックしても何も起こりません。

④引数を渡すにはどうするか。

prop属性を指定します。
このように書くと


次のように出力してくれます。


  rcmail.command(‘btn1′,’test’,this)この部分の第二引数にpropで指定した値が入ってきます。

  javascript側では第一引数で取得します。

rcube_webmail.prototype.btn1 = function(value)
{
console.log(value);
}

上記のように記述するとコンソールに’test’と表示されます。

⑤複数の引数を指定出来るか。

ボタンのclick処理を出力するのは
/roundcuberoot/program/include/rcube_template.phpの978行目の以下のコードになります。

$attrib['onclick'] = sprintf(
"return %s.command('%s','%s',this)",
JS_OBJECT_NAME,
$command,
$attrib['prop']
);

上記のコードの通り、複数の引数を指定することは無理そうですね・・。

Facebooktwitterlinkedintumblrmail

Roundcubeプラグインの作り方

①プラグインは roundcuberoot/plugins配下に作成します。
 (既にたくさん入っているようです。)

②作成したディレクトリ名と同じ名前のphpファイルを作成します。

③②で作成したphpファイルと同じ名前のクラス名にします。
④作成したクラスはrcube_pluginクラスを継承しなければなりません。


⑤プラグインクラス(/roundcuberoot/program/include/rcube_plugin.php)の
 抽象メソッドであるinitメソッドをオーバーライドします。

abstract function init();

 initメソッドは必須になります。

 プラグインAPIクラス(/roundcuberoot/program/include/rcube_plugin_api.php)は、
 プラグインオブジェクトをインスタンス化し、initメソッドを呼び出します。


これで何にもしないプラグインは出来上がりです。

⑥でも、これだと出来たかどうかわからないのでタスクバーにボタンを追加します。

add_texts('localization/');
        
        $this->add_button(array(
                'command'    => 'sample',
                'label'      => 'sample.sample',
        ), 'taskbar');
    }
}

⑦ja_JP.incファイル


以下のように配置します。

⑧最後に/roundcuberoot/config/main.inc.phpに
 プラグインを登録します。

$rcmail_config['plugins'] = array('sample');

これでサンプルメニューのプラグインの出来上がりです。

Facebooktwitterlinkedintumblrmail

SourceTree for Windowsで秘密鍵と公開鍵を生成!

前回は SourceTree for Windows をインストールしましたが、それだけではGitは使えません~。
ほとんどのGitサーバーでは、SSHの公開鍵認証を使用しています。

SourceTreeでは「秘密鍵」と「公開鍵」を簡単に生成することが出来ます。
以下手順です。

1、”Tools” > “Create or Import SSH Keys”を選択します。

2、PuTTY Key Generatorが開くので、”Generate”ボタンをクリックし、鍵を生成します。


“Generate”ボタンをクリックすると、鍵が生成されるはずなのですが…


なんだこれ…すっごい遅い…ウ ゴ カ ナ イ !
と思ってたら、乱数を作るためにマウスでこの辺りを


ぐるぐるぐる~ぐちゃぐちゃ~っっとやると、あっという間に終わります(笑)
最初はこれを知らずに、無駄に待ち続けました…。

3、”Save Private Key”をクリックし、秘密鍵を保存します。


私は”id_rsa.ppk”という名前で保存しました。
特に決まりはないそうですが、自分がわかりやすいものでいいと思います。

秘密鍵は、その名の通り自分以外には知られてはいけません。秘 密 で す (*_*)
人に見せたり、紛失したりしないよう管理しましょう。

4、”Save Public Key”をクリックし、公開鍵を保存します。


こちらも特に決まりはないので、”id_rsa.pub”という名前で保存しました。

コメントの記入やパスワードの設定を行いたい場合は
“Key comment”、”Key passhrase”に、それぞれ入力してください。


5、鍵を登録します。
“Tools” > “Launch SSH Agent(pageant)”を選択します。
先ほど保存した秘密鍵(“id_rsa.ppk”)を選択すると、鍵が登録されます。
(パスワードを設定した場合はパスワードの入力を求められます)

サクサクサクっと鍵の設定完了ですー(´∀`)

Facebooktwitterlinkedintumblrmail

VirtualBoxのスナップショットを使おう

開発をしていると、インストール後に有る程度の設定をした状態で色々と試して、駄目だったらその時の状態に戻したい事が有ります。
VirtualBoxで、割と簡単に出来るので使い方を。

保存しておきたい状態にした仮想マシンを一度シャットダウンします。

対象となる仮想マシンを選んで、VirtualBoxメニューにあるスナップショットをクリック。

スナップショットの状態が表示されます。

左上にあるカメラアイコンをクリックしてスナップショットを作成。

名前と説明へ、状態や内容を書いてOKボタンを押します。

今回は名前を変えなかったので、スナップショット 1と表示されています。

色々と試した後、マシンを終了してスナップショットから戻したい場所を右クリックして、スナップショットに復元を選びます。

これで起動すれば、スナップショットを撮った状態まで戻っています。

Facebooktwitterlinkedintumblrmail

SourceTree for Windowsをインストールしました!

SourceTree for Windowsがリリースされたのでインストールしてみましたー。

beta版の試用を申し込んだまま、作業に区切りがつくまでは…とか言ってズルズル放置してましたが
やっとインストールしました~(´∀`;)

GitGuiもGitHubもソースの一部が消失するなどのトラブルが続いたのでもうさよならバイバイ。
Git初心者な私にとっては、トラブルは避けたいところなのです(;´Д`)

ちなみにWindows7以上でないとインストールできないようです。
折角なのでインストールの一連の流れを、私のような初心者のために…。

SourceTree for Windowsをインストールするにあたり、とりあえずGitと名の付くものは
片っ端からアンインストール+削除しました。

さっぱりしたところで、SourceTree for Windowsのインストーラーをダウンロードします。

以下のページからダウンロードできます。
http://www.sourcetreeapp.com/

インストーラーを起動すると「Git本体はどうしますかー?」と聞かれます。

私は既に全部削除しちゃったので、一番上の
“Download an embedded version of Git for SourceTree alone to use”を選択しました。
既にインストールしている場合はスルーされるようです。

Git本体のインストールを行うとセットアップ画面が表示されます。

名前とアドレスを入力し、規約に同意できれば”I agree to the SourceTree license agreement”
にチェックを入れ、”Next”をクリックします。

AtlassianのBitbucket, Stashを使用している場合は、そのままアカウントのサインアップができます。

使用してなければ”Finish”をクリックし、インストール完了です!!

次回は「鍵」を作成します(´∀`)ふっふっふ。

Facebooktwitterlinkedintumblrmail

CentOS 6.3 に Kolab Groupware をインストール。

さてさて、ども初めまして。弊社のKolab翻訳担当です。
2013.03.11 よりスイスはチューリヒの Kolab Systems AG 社とパートナー提携いたしました。

そこで、今の所、英語ソースしかない、Kolab Groupware のインストールについて、
少しばかりインストールのコツなどをば…。

まず、Kolab Groupware の現行バージョンですが、3.0です。CentOS等のレッドハット系では、
el6、kernel 2.6.32 以降に対応しています。(自宅のCentOS 5.4 に入れようとしましたが、パッケージの依存関係等で入りませんでした。)

無料で利用できるのは、コミュニティ版である、Kolab-3.0-release-community です。

準備としましては…

KVNにて、作成してあるx86_64のREHL6 型の仮想マシンにCentOS 6.3をインストールしてあるものを利用しました。パーティションなどはデフォルトです。(こんな感じ…)

[root@kolab ~]# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/vg_kolab-lv_root
                      5.5G  2.1G  3.2G  40% /
tmpfs                 499M   20K  499M   1% /dev/shm
/dev/sda1             485M   32M  429M   7% /boot

CentOSは、最小構成(minimal)でインストールして、後から、”Base” “Development Tools” をyumでグループインストールしてます。

[root@kolab ~]# yum -y groupinstall "Base" "Development Tools"

次の準備は…

selinux: 無効化

iptables: tcp 25番、80番、110番、143番、389番、443番、465番、587番、636番、993番、995番 を開けます。

/etc/hosts に FQDN、ホスト名を追加。あと、ローカルIPでの名前解決の行を追加。
(DNS持っていて、ローカルIPでFQDNが参照できる場合はいらないです。)

[root@kolab ~]# diff -urw /etc/hosts.orig /etc/hosts
--- /etc/hosts.orig     2010-01-12 22:28:22.000000000 +0900
+++ /etc/hosts  2013-04-01 16:03:29.663819681 +0900
@@ -1,2 +1,3 @@
-127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
+127.0.0.1   kolab.lancard.com kolab localhost localhost.localdomain localhost4 localhost4.localdomain4
+xxx.xxx.xxx.xxx kolab.lancard.com kolab localhost localhost.localdomain localhost4 localhost4.localdomain4
 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

あと必要なものが、yum-plugin-priorities です。yumにてさくっとインストールしてください。

[root@kolab ~]# yum -y install yum-plugin-priorities

次に、yumリポジトリを追加します。

EPEL リポジトリ

[root@kolab ~]# wget "http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm"

Kolab-3.0-community-release リポジトリ

[root@kolab ~]# wget "http://mirror.kolabsys.com/pub/redhat/kolab-3.0/el6/development/i386/kolab-3.0-community-release-6-2.el6.kolab_3.0.noarch.rpm"
[root@kolab ~]# yum localinstall --nogpgcheck epel-release-6.8.noarch.rpm kolab-3.0-community-release-6-2.el6.kolab.3.0.noarck.rpm

リポジトリが追加されたら、リポジトリの設定を行います。リポジトリ設定の要点は、

CentOS-Base の[extras] を無効化、その他有効リポジトリの優先度を99に設定。
epel の有効リポジトリの優先度を99に設定。
その他Kolab関連(release、develop)のリポジトリの優先度を50に設定。(develop は後で追加し設定します。)

以上、3点です。

CentOS-Base.repo

[root@kolab yum.repos.d]# diff -urw CentOS-Base.repo.orig CentOS-Base.repo
--- CentOS-Base.repo.orig       2013-02-25 17:57:43.000000000 +0900
+++ CentOS-Base.repo    2013-03-29 11:22:09.810968496 +0900
@@ -16,6 +16,7 @@
 #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
+priority=99

 #released updates
 [updates]
@@ -24,6 +25,7 @@
 #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
+priority=99

 #additional packages that may be useful
 [extras]
@@ -31,6 +33,7 @@
 mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
 #baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
 gpgcheck=1
+enabled=0
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

 #additional packages that extend functionality of existing packages

epel.repo

[root@kolab yum.repos.d]# diff -urw epel.repo.orig epel.repo
--- epel.repo.orig      2012-11-05 12:52:17.000000000 +0900
+++ epel.repo   2013-03-29 11:23:46.412942219 +0900
@@ -6,6 +6,7 @@
 enabled=1
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
+priority=99

 [epel-debuginfo]
 name=Extra Packages for Enterprise Linux 6 - $basearch - Debug

kolab-3.0-release.repo

[root@kolab yum.repos.d]# diff -urw kolab-3.0-release.repo.orig kolab-3.0-release.repo
--- kolab-3.0-release.repo.orig 2012-08-04 21:58:22.000000000 +0900
+++ kolab-3.0-release.repo      2013-03-29 11:26:20.946866077 +0900
@@ -4,6 +4,7 @@
 enabled = 1
 gpgcheck = 0
 gpgkey = https://ssl.kolabsys.com/santiago.asc
+priority=50

 [kolab-3.0-debuginfo]

kolab-3.0-develop リポジトリの追加

[root@kolab ~]# yum -y install kolab-3.0-community-release-development

前述通り、上記リポジトリと同様に、優先度の設定。release と同じ50にします。

[root@kolab yum.repos.d]# diff -urw kolab-3.0-development.repo.orig kolab-3.0-development.repo
--- kolab-3.0-development.repo.orig     2012-08-04 21:58:22.000000000 +0900
+++ kolab-3.0-development.repo  2013-03-29 11:33:17.334674626 +0900
@@ -4,7 +4,7 @@
 enabled = 1
 gpgcheck = 0
 gpgkey = https://ssl.kolabsys.com/santiago.asc
-
+priority=50

 [kolab-3.0-development-debuginfo]
 name = Enterprise Linux 6 Kolab 3.0 Packages - Debugging Symbols

リポジトリの追加が終わりましたら。Kolab Groupware のインストールを行います。
全コンポーネントを簡単にインストールするには、さくっと一行打つだけです。お手軽です。

[root@kolab ~]# yum -y install kolab

インストールが無事完了したら、Kolabの設定を行います。こちらも簡単。

[root@kolab ~]# setup-kolab

と、セットアップ用のコマンドを打ち、あとは表示されるメッセージに従って、パスワード等を設定していけばOKです。

※※※ setup-kolab に失敗した!! ※※※

さてさて…ここまではすんなり進んでも…このsetup-kolab で引っ掛かる人がおそらくいるのではないでしょうか。
ええ…私も実は、引っかかったクチです (・w・;

私の場合は…「間違ったパスワードを設定してしまい思い出せなくなった。」「ホスト名、ドメイン名が変更になった。」
という事で、再度 setup-kolab を実行したら、エラーが発生して再設定が出来なくなった事です。

そういう時の対処方法です。

・まず、389 Directory Server のサービスを停止します。

[root@kolab ~]# service dirsrv stop

・次に、389 Directory Server の設定ファイル(slapd-ホスト名)を退避or削除します。

[root@kolab ~]# mv /etc/dirsrv/slapd-kolab/ /etc/dirsrv/bk_slapd-kolab

・MySQLのデータベースの削除
(もし…MySQLのrootパスワードがわからなくなってた場合は…MySQLの解説サイトで調べてください(-w-; )

[root@kolab ~]# mysql -u root -p
Enter password:

データベースの一覧を見て、kolab、roundcube というデータベースがある事を確認してください。
この2つのデータベースを削除します。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kolab              |
| mysql              |
| roundcube          |
| test               |
+--------------------+
5 rows in set (0.00 sec)
mysql> use kolab;
mysql> drop database kolab;
mysql> use roundcube;
mysql> drop database roundcube;

これで、再度 setup-kolab が走るようになります。
ホスト名やドメイン名を変更して、setup-kolab を実行してみましょう。

※ちなみに…Kolab Groupware に登録していたユーザやグループ、各ユーザのメールやその他データなどは、
もちろん、吹っ飛んでしまいますので、あくまで、初期導入時にのみ使用できる方法です。

ではでは。

Facebooktwitterlinkedintumblrmail

IronPythonでもRequestsが使いたい

Requests: 人間のためのHTTP
http://ja.python-requests.org/en/latest/

Pythonの便利なHTTPライブラリ Requests を IronPython でも使いたいわけです。
こんなことを書いているということは素直には使えないわけです。

一応動作してるかな〜、というところまで行けたのでメモしときます。IronPython は 2.7.3 で、Requests は 1.1.0 です。

ポイントは2つ。

まず一つ目。

sys._getframe が必要なので ipy.exe (or ipy64.exe) に -X:Frames オプションを付けて起動する。

オプションはこんな感じで確認できます。

C:\Users\murave>ipy -help
Usage: ipy.exe Usage: ipy [options] [file.py|- [arguments]]
 <前略>
 -X:Frames                Enable basic sys._getframe support
 <後略>

2つ目。IronPython には idna エンコーディングがないので回避する。

requests の models.py で使用されているので取り敢えずコメントアウト。

idnaで検索すると290行目あたりで使用されてます。

#        try:
#            netloc = netloc.encode('idna').decode('utf-8')
#        except UnicodeError:
#            raise InvalidURL('URL has an invalid label.')

netloc = netloc.encode(‘utf-8’).decode(‘utf-8’) に書き換えてみたりもしたのですが馬鹿らしい気がするのでコメントアウトしました。
おそらくこの影響で「ドメインとURLの国際化」は未対応になってしまってますが、動かないよりはいいかと。

C:\Users\murave>ipy -X:Frames
IronPython 2.7.3 (2.7.0.40) on .NET 4.0.30319.18010 (32-bit)
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> import json
>>> r = requests.get('http://172.16.191.1:8001/api/v1_0/poll/')
>>> r.text
u'{"meta": {"limit": 20, "next": null, "offset": 0, "previous": null, "total_cou
nt": 3}, "objects": [{"id": 1, "pub_date": "2013-03-05T13:51:15", "question": "W
hat\'s up?", "resource_uri": "/api/v1_0/poll/1/"}, {"id": 2, "pub_date": "2013-0
3-06T10:01:35", "question": "\u65e5\u672c\u8a9e\u30c6\u30b9\u30c8", "resource_ur
i": "/api/v1_0/poll/2/"}, {"id": 3, "pub_date": "2013-03-06T13:51:15", "question
": "\u3044\u3044\u3044", "resource_uri": "/api/v1_0/poll/3/"}]}'
>>> res = r.json()
>>> print res['objects'][1]['question']
日本語テスト
>>> payload = {"pub_date": "2013-03-08T20:19:15", "question": "どうかね?"}
>>> r = requests.post('http://172.16.191.1:8001/api/v1_0/poll/', data=json.dumps(payload), headers={"Content-Type": "application/json"})
>>> r 

>>> payload = {"pub_date": "2013-03-08T20:19:15", "question": "putは?"}
>>> r = requests.put('http://172.16.191.1:8001/api/v1_0/poll/1/', data=json.dumps(payload), headers={"Content-Type": "application/json"})
>>> r

>>> r = requests.delete('http://172.16.191.1:8001/api/v1_0/poll/1/')
>>> r

と、requests.get、requests.post、requests.put、requests.delete 動いているようです。

Facebooktwitterlinkedintumblrmail