Eclipse で mercurial をつかう(4)

Centralリポジトリをでっち上げてPushしてみる。

下準備

本来なら先にCentralがあるんだろうけど、此処では、先にコードをかいちゃったので、つくったコードをCloneして、Centralとすることにした。

下準備2

元のコードを修正して、コミットしておく

Push!

メニューの右クリックでPushを選ぶとダイアログが開く、Centralとするところにした場所を指定して、Finish

更新された

変更前と変更後のログ。

小さいコードとはいえ軽やかで良い(^^)

Eclipse で mercurial をつかう(3)

管理対象外ファイルを設定する。

メニューはsubclipseと相変わらず同じ

とりあえずregexp

登録すると.hgignoreができる

.hgignoreの中身は?

公式な記述が見つけられないなぁ。

とりあえず

http://www.google.co.jp/search?hl=ja&lr=lang_ja&q=mercurial+hgignore

で探したら山ほど出てくるのでいいけどさ。

Eclipse で Mercurial をつかう

Mercurial Eclipse の設定

インストールしてあるhg.exeの場所を教えてあげる

ラベル装飾は無いとつらい


使う

プロジェクトを右クリック->Team から共有すると、あっさり使えまする。
Pullとかもサポートされてるぽい

日本語メッセージも通るよ

Objective-Cをはじめてみる。

まずはコンパイラ関連

Ubuntuです。coLinuxにのせてます。

新しい方がよかろうということで、4.2を入れました。

NSObjectはlibfoundationに入ってるらしいので、その辺も一緒くたに入れておきます。

ii  gcc                  4:4.1.2-9ubuntu2 The GNU C compiler
ii  gcc-4.1              4.1.2-16ubuntu2  The GNU C compiler
ii  gcc-4.1-base         4.1.2-16ubuntu2  The GNU Compiler Collection (base package)
ii  gcc-4.2              4.2.1-5ubuntu4   The GNU C compiler
ii  gcc-4.2-base         4.2.1-5ubuntu4   The GNU Compiler Collection (base package)
ii  gcc-4.2-multilib     4.2.1-5ubuntu4   The GNU C compiler (multilib files)
ii  gobjc                4:4.1.2-9ubuntu2 The GNU Objective-C compiler
ii  gobjc++-4.2          4.2.1-5ubuntu4   The GNU Objective-C++ compiler
ii  gobjc++-4.2-multilib 4.2.1-5ubuntu4   The GNU Objective-C++ compiler (multilib fil
ii  gobjc-4.1            4.1.2-16ubuntu2  The GNU Objective-C compiler
ii  gobjc-4.2            4.2.1-5ubuntu4   The GNU Objective-C compiler
ii  gobjc-4.2-multilib   4.2.1-5ubuntu4   The GNU Objective-C compiler (multilib files

ii  libfoundation-data   1.0.84-1ubuntu1 Static data files used by libFoundation
ii  libfoundation-tools  1.0.84-1ubuntu1 Configuration tools for libFoundation
ii  libfoundation1.0     1.0.84-1ubuntu1 Implementation of the OpenStep specification
ii  libfoundation1.0-dev 1.0.84-1ubuntu1 Development files for libfoundation

お約束

GNUStep形式でのお約束です。

#import <stdio.h>
#import <objc/Object.h>

@interface TestClass : Object
- (void) getMessage;
@end
#import "hello.h"

@implementation TestClass
- (void) getMessage {
  printf("helllo Objective-C\n");
}
@end

int main (int argc, char* argv[]) {
  id obj = [ TestClass alloc ];
  [ obj getMessage ];

  return 0;
}

お約束2

Macの解説書にあるようにNSObject.hでもテストしてみました。面倒なので、ソースは1つで書いています。

#import <Foundation/NSObject.h>

@interface TestClass : NSObject
- (void) getMessage;
@end

@implementation TestClass
- (void) getMessage {
  printf("Hello NSObject\n");
}
@end

int main (int args, char* argv[]){
  id obj = [ TestClass alloc ];
  [obj getMessage ];

  return 0;
}

コンパイルしてみたらエラーで怒られました。

sisyphus@ubuntu:~/src$ gcc -o nshello nshello.m -lobjc
/tmp/ccr5N2Tr.o:(.data+0x2b8): undefined reference to `__objc_class_name_NSObject'
collect2: ld returned 1 exit status

リンクしようにも、NSObjectが無いよと言ってます。リンカが怒ってるところから 「-lobjc」でリンクしているモノが違うといってるのだろうということぐらいは私にも察しはつきます。

そもそも「-lobjc」をおまじないとしていたツケがまわってきました。

「objc」の正体は[libobjc.so]で、それをリンクしていることが分かりました。

そこで、NSObjectはlibFoundation.soにあるのでこれを指定すれば良いということになるはずだと
判断しました。
そして、libobjc.soがobjcになるのであれば、libFoundation.soはFoundationになるだろう
ということで、試してみると

sisyphus@ubuntu:~/src$ gcc nshello.m -o nshello -lFoundation

うまくいきました。

リンカのマニュアルを見ておく

うまくいくとちゃんと調べずに放置してしまう悪い癖があるので、マニュアルを読んでおくことにしました。

Manpage of ld

必要なところは下記のところ。

  • lar

アーカイブファイル ar をリンクするファイルのリストに加える。このオプションは何回でも指定できる。 ld は ar が指定されるごとに、 libar.a が見つかるまで検索パスを探す。

  • Lsearchdir

このコマンドは searchdir を ld の書庫ライブラリの検索パスに追加する。このオプションは必要なだけ指定できる。

デフォルトの検索パス (-L が指定されなかったときの検索パス) は ld が用いているエミュレーションのモードに依存する。また設定に依存する場合もある。リンクスクリプトでは SEARCH_DIR コマンドを用いてこのパスを設定することもできる。

まさに今回の部分でlibFoundation.soをリンクしたかったら-lFoundationとしなさいということですね。

補足

よく使うライブラリがあれば、ld.so.confに書いておけというのを突然思い出しだしました。

今回はパッケージでいれたので、ld.so.conf(debianの場合はld.so.conf.dにファイルをおくみたいです)
の必要は無かったわけです。

HelloWorldのまとめ

これまでもLinuxをつかっていてソースからコンパイルすることはありましたが、完全にユーザーとしてだけ接していたのと、うまくいかなくてもネットで探すとそれなりの答えがあったりして放置していたのが
今回の失敗です。

リンカがライブラリを見つける仕組みを理解するといういきなり高いハードルが立ちはだかりましたが、
現状レベルでは、libをはずしたライブラリ名を指定するということで、
とりあえずコンパイルすることができたので、HelloWorldとしては十分なものを得たということにします(^^;)

「.a」なのか「.so」なのかなど気になる部分はありますし、本当にlibさえはずせば良いのかなど、
疑問はありますが、それは自分で共有ライブラリを作るときの課題に使用と思います。

Ubuntu dot emacs

まだまだだけど、そこそこ使えるようになったので、保存。

;;========================================================================
;; base
;; https://wiki.ubuntulinux.jp/UbuntuTips/Application/EmacsJapaneseSetup
;;========================================================================
(cond (window-system
       (set-default-font
        "-*-fixed-medium-r-normal--12-*-*-*-*-*-*-*")
       (progn
         (set-face-font 'default
                        "-shinonome-gothic-medium-r-normal--12-*-*-*-*-*-*-*")
         (set-face-font 'bold
                        "-shinonome-gothic-bold-r-normal--12-*-*-*-*-*-*-*")
         (set-face-font 'italic
                        "-shinonome-gothic-medium-i-normal--12-*-*-*-*-*-*-*")
         (set-face-font 'bold-italic
                        "-shinonome-gothic-bold-i-normal--12-*-*-*-*-*-*-*")
       )))

;;=======================================================================
;; tdiary 
;;=======================================================================
(setq load-path
      (append
       (list
       (expand-file-name "~/elisp/")
       )
       load-path))

(setq psgml-html-build-new-buffer nil)
(setq tdiary-diary-list '(("SISY" "http://sisyphus.s3.xrea.com/tnikki/")))
(require 'tdiary-mode)
(setq tdiary-index-rb "index.cgi")
(setq tdiary-update-rb "update.cgi")

;;=======================================================================
;;日本語変換
;;=======================================================================
(set-language-environment "Japanese")
(load-library "anthy")
(setq default-input-method "japanese-anthy")

;;=======================================================================
;; Misc
;;=======================================================================
;;(mouse-wheel-mode)                                              ;;ホイールマウス
(setq-default transient-mark-mode t)                            ;;選択行を反転させる
(global-font-lock-mode t)                                       ;;文字の色つけ
(setq line-number-mode t)                                       ;;カーソルのある行番号を表示
(auto-compression-mode t)                                       ;;日本語infoの文字化け防止
(set-scroll-bar-mode 'right)                                    ;;スクロールバーを右に表示
(global-set-key "\C-z" 'undo)                                   ;;UNDO
(setq frame-title-format                                        ;;フレームのタイトル指定
        (concat "%b - emacs@" system-name))

(display-time)                                                 ;;時計を表示
(global-set-key "\C-h" 'backward-delete-char)                  ;;Ctrl-Hでバックスペース
;(setq make-backup-files nil)                                   ;;バックアップファイルを作成しない
;(setq visible-bell t)                                          ;;警告音を消す
;(setq kill-whole-line t)                                       ;;カーソルが行頭にある場合も行全体を削除


;;=======================================================================
;; Frame
;;=======================================================================
;;-----------------------------------------------------------------------
;; 初期フレームの設定
;;-----------------------------------------------------------------------
(setq default-frame-alist
      (append (list '(foreground-color . "LemonChiffon")
		    '(background-color . "black")
		    '(background-color . "gray")
		    '(border-color . "black")
		    '(mouse-color . "white")
		    '(cursor-color . "black")
		    )
	      default-frame-alist))
;; ---------------------------------------------------------------------
;; 終了時のフレームサイズを記憶する
;; http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=save%20framesize
;; ---------------------------------------------------------------------
(defun my-window-size-save ()
  (let* ((rlist (frame-parameters (selected-frame)))
         (ilist initial-frame-alist)
         (nCHeight (frame-height))
         (nCWidth (frame-width))
         (tMargin (if (integerp (cdr (assoc 'top rlist)))
                      (cdr (assoc 'top rlist)) 0))
         (lMargin (if (integerp (cdr (assoc 'left rlist)))
                      (cdr (assoc 'left rlist)) 0))
         buf
         (file "~/.framesize.el"))
    (if (get-file-buffer (expand-file-name file))
        (setq buf (get-file-buffer (expand-file-name file)))
      (setq buf (find-file-noselect file)))
    (set-buffer buf)
    (erase-buffer)
    (insert (concat
             ;; 初期値をいじるよりも modify-frame-parameters
             ;; で変えるだけの方がいい?
             "(delete 'width initial-frame-alist)\n"
             "(delete 'height initial-frame-alist)\n"
             "(delete 'top initial-frame-alist)\n"
             "(delete 'left initial-frame-alist)\n"
             "(setq initial-frame-alist (append (list\n"
             "'(width . " (int-to-string nCWidth) ")\n"
             "'(height . " (int-to-string nCHeight) ")\n"
             "'(top . " (int-to-string tMargin) ")\n"
             "'(left . " (int-to-string lMargin) "))\n"
             "initial-frame-alist))\n"
             ;;"(setq default-frame-alist initial-frame-alist)"
             ))
    (save-buffer)
    ))

(defun my-window-size-load ()
  (let* ((file "~/.framesize.el"))
    (if (file-exists-p file)
        (load file))))

(my-window-size-load)

;; Call the function above at C-x C-c.
(defadvice save-buffers-kill-emacs
  (before save-frame-size activate)
  (my-window-size-save))
;;=======================================================================
;; End
;;=======================================================================