日々鍛錬

日本で一番?わかり易い??システムの落書き帳???を目指し????,日々鍛錬中な元SEさん主婦によるデベロッパとユーザと自分のための雑記帳

Mac にHomebrew をインストールする

Macports ではSVNなどの設定やら,Proxyの問題がありありです.
ちゃんと設定やらをしたらよいのですが,自宅でやら研究室でやら..の研究を行うのであれば,port updateの度に設定を変えるのは正直めんどくさい.

なら,proxyに依存したくない! そんな私に朗報
#たまたま,環境でhomebrew のproxy が大丈夫だったというオチはありますが...
#proxy認証環境は管理者にお問い合わせが必要です.

「HomeBrew」を使えば良い

Home brew

  • Mac OS 上でのソフトウェア管理を行うソフトウェアのこと
  • Macの中に入っているソフトウェアを尊重して利用するVersion 管理なので,利用しやすい

ということで,インストールする.

インストール方法は以下のとおり
参考サイトはこちら
MacOSX - パッケージ管理システム Homebrew - Qiita

ただし,事前にxcodeをインストールしておくこと.
私は,ver.5.1.1 (2014年4月28日における最新Ver.)で以下を行いました.


1 . Javaのインストール確認とインストール

Javaの確認は以下から

$ java -version

(インストールされているなら,以下のようなメッセージが出力)
java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode)

インストールされていなければ,インストールするよう,メッセージが出力されるので,
指示に従います.

2. xcode コマンドラインをインストール
実は,こちらが今回,homebrew インストールでは手間取りました.
#あまり手間ではなかったけど....
というのも,xcodeからのcommand Line tool のセットアップでお馴染みの,

『「Xcode」→「Preferences」→「Downloads」→「Components」』

では,できませんでした.

色々調べたら,以下がヒット
MavericksでCommand Line Tools for Xcodeをインストールする - Qiita

こちらの手順に従って,以下に従ってCommand Line Tool をインストール

Xcode->Open Developer Tool->More Developer Tools

こちらから,Command Line Tool を選択し,installを行うには,Apple IDのサイトに移動します.
ここで,Apple IDを入力すると,Command Line Toolがインストール出来る準備ができますので,
サイトからダウンロードし,インストールする.

3. HomeBrew 本体をインストールする

以下のコマンドをTerminal上で行う

 ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"

本体インストールができたら,success というコメントが出ます.
そのコメントが出力されたなら,早速,homebrew の最新チェックと更新 を以下で行います.

4. システムの整合性確認

$ brew doctor

5. システム更新

$ brew update

これで,色々システムの更新やインストールができます.
MacOpenCVインストールはhomebrewを使うととっても簡単にできます.
次の機会にでも案内します.

Emacs の初期設定

init.elのとりまとめ.
今はダッシュのメモ書きなので,このスペースはinit.elのための落書き帳としてます.

参考にしたサイトは以下のとおり.

両者共にわかりやすいですが,uwabamiさんのサイトは特にわかりやすい.
今度時間があるときにでも,もっとよく読んで理解をしていきます.

ひとまず,私は以下のとおりに設定している.

; -*- Mode: Emacs-Lisp ; Coding: utf-8 -*-
;; ------------------------------------------------------------------------
;; @ load-path

;; load-pathの追加関数
(defun add-to-load-path (&rest paths)
  (let (path)
    (dolist (path paths paths)
      (let ((default-directory (expand-file-name (concat user-emacs-directory path))))
        (add-to-list 'load-path default-directory)
        (if (fboundp 'normal-top-level-add-subdirs-to-load-path)
            (normal-top-level-add-subdirs-to-load-path))))))

;; load-pathに追加するフォルダ
;; 2つ以上フォルダを指定する場合の引数 => (add-to-load-path "elisp" "xxx" "xxx")
;;(add-to-load-path "elisp" "C:\MySystem\MySystem\emacs\lisp")
(add-to-load-path "C:/MySystem/MySystem/emacs/elisp")
(add-to-load-path "elisp")
(add-to-load-path "elpa")
(add-to-load-path "lisp")
(add-to-load-path "site-lisp")
(add-to-load-path ".emacs")
;; ------------------------------------------------------------------------
;; @ general

;; common lisp
(require 'cl)

;; 文字コード
(set-language-environment "Japanese")
(let ((ws window-system))
  (cond ((eq ws 'w32)
         (prefer-coding-system 'utf-8-unix)
         (set-default-coding-systems 'utf-8-unix)
         (setq file-name-coding-system 'sjis)
         (setq locale-coding-system 'utf-8))
        ((eq ws 'ns)
         (require 'ucs-normalize)
         (prefer-coding-system 'utf-8-hfs)
         (setq file-name-coding-system 'utf-8-hfs)
         (setq locale-coding-system 'utf-8-hfs))))


;; Windowsで英数と日本語にMeiryoを指定
;; Macで英数と日本語にRictyを指定
(let ((ws window-system))
  (cond ((eq ws 'w32)
         (set-face-attribute 'default nil
                             :family "Meiryo"  ;; 英数
                             :height 100)
         (set-fontset-font nil 'japanese-jisx0208 (font-spec :family "Meiryo")))  ;; 日本語
        ((eq ws 'ns)
         (set-face-attribute 'default nil
                             :family "Ricty"  ;; 英数
                             :height 140)
         (set-fontset-font nil 'japanese-jisx0208 (font-spec :family "Ricty")))))  ;; 日本語

;=======================================================================
;フレームサイズ・位置・色など
;=======================================================================
(setq default-frame-alist
      (append (list '(foreground-color . "black")
   '(background-color . "LemonChiffon")
   '(background-color . "gray")
   '(border-color . "black")
   '(alpha . (85 40))
   '(mouse-color . "white")
   '(cursor-color . "black")
   '(font . "fontset-メイリオ")
   '(width . 100)   ;文字数
   '(height . 100)   ;文字数
   '(top . 100)     ;pixel値 表示位置
   '(left . 100))
     default-frame-alist))

;; スタートアップ非表示
(setq inhibit-startup-screen t)
;; scratchの初期メッセージ消去
(setq initial-scratch-message "")

;; ツールバー非表示
(tool-bar-mode -1)
;; メニューバーを非表示
;;(menu-bar-mode -1)
;; スクロールバー非表示
(set-scroll-bar-mode nil)

;; タイトルバーにファイルのフルパス表示
(setq frame-title-format
      (format "%%f - Emacs@%s" (system-name)))
;; 行番号表示
(global-linum-mode t)
(set-face-attribute 'linum nil
                    :foreground "#800"
                    :height 0.9)
;; 行番号フォーマット
(setq linum-format "%4d")

;;; 対応する括弧を光らせる。
(show-paren-mode 1)
;;; ウィンドウ内に収まらないときだけ括弧内も光らせる。
(setq show-paren-style 'mixed)
;;; 現在行を目立たせる
(global-hl-line-mode)
;;; カーソルの位置が何文字目かを表示する
(column-number-mode t)
;;; カーソルの位置が何行目かを表示する
(line-number-mode t)

;; 行末の空白を強調表示
(setq-default show-trailing-whitespace t)
(set-face-background 'trailing-whitespace "#b14770")

;; タブをスペースで扱う
(setq-default indent-tabs-mode nil)
;; タブ幅
(custom-set-variables '(tab-width 4))

;; yes or noをy or n
(fset 'yes-or-no-p 'y-or-n-p)
;; ミニバッファの履歴を保存する
(savehist-mode 1)
;; ミニバッファの履歴の保存数を増やす
(setq history-length 3000)

;; 行間
;(setq-default line-spacing 0

;; 1行ずつスクロール
(setq scroll-conservatively 35
      scroll-margin 0
      scroll-step 1)
(setq comint-scroll-show-maximum-output t) ;; shell-mode

;; フレームの透明度
(set-frame-parameter (selected-frame) 'alpha '(0.85))

;; http://www.gentei.org/~yuuji/software/euc/instamp.el
;; 現在時刻挿入
(setq display-time-string-forms
  '(year "/" month "/" day " " dayname " " 24-hours ":" minutes " "
    (if mail " Mail" "")))
(display-time)

;; M-wやC-kでコピーしたものを、他のアプルケーションで貼り付け可能にする
(cond (window-system
       (setq x-select-enable-clipboard t)
))

;;自動スペルチェック
(add-to-list 'exec-path "C:/MySystem/MySystem/emacs/Aspell/bin")
(setq-default ispell-program-name "aspell")
;;プログラムが起動したら,自動でスペルチェックを起動
(eval-after-load "ispell"
 '(add-to-list 'ispell-skip-region-alist '("[^\000-\377]+")))
; flyspell-mode
  (mapc
   (lambda (hook)
     (add-hook hook 'flyspell-prog-mode)) ;;ここではコメントの領域におけるスペルチェック
   '(
     c-mode-common-hook
     emacs-lisp-mode-hook
     ))
  (defun my-flyspell-mode-enable ()
    (flyspell-mode 1))
  (mapc
   (lambda (hook)
     (add-hook hook 'my-flyspell-mode-enable)) ;;ここではファイル全体そのものにスペルチェック   
   '(
     changelog-mode-hook
     debian-control-mode-hook
     tex-mode-hoo
     yatex-mode-hook
     text-mode-hook
     ))

;;auto-complete
;(add-to-list 'load-path "~/.emacs.d/site-lisp")
;(require 'auto-complete-config)
;(add-to-list 'ac-dictionary-directories "~/.emacs.d/site-lisp/ac-dict")
;(ac-config-default)
;;
;;



;; ------------------------------------------------------------------------
;; @ modeline

;; モードラインの割合表示を総行数表示
(defvar my-lines-page-mode t)
(defvar my-mode-line-format)

(when my-lines-page-mode
  (setq my-mode-line-format "%d")
  (if size-indication-mode
      (setq my-mode-line-format (concat my-mode-line-format " of %%I")))
  (cond ((and (eq line-number-mode t) (eq column-number-mode t))
         (setq my-mode-line-format (concat my-mode-line-format " (%%l,%%c)")))
        ((eq line-number-mode t)
         (setq my-mode-line-format (concat my-mode-line-format " L%%l")))
        ((eq column-number-mode t)
         (setq my-mode-line-format (concat my-mode-line-format " C%%c"))))

  (setq mode-line-position
        '(:eval (format my-mode-line-format
                        (count-lines (point-max) (point-min))))))
;; モードラインに行番号表示
;(line-number-mode t)
;; モードラインに列番号表示
;(column-number-mode t)


;;;;;;;;;;;;;;;;;Lispの設定;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;auto-install
(add-to-list 'load-path (expand-file-name "~/.emacs.d/auto-install/"))
(require 'auto-install)
(auto-install-update-emacswiki-package-name t)
(auto-install-compatibility-setup)

;; ------------------------------------------------------------------------
;; @ menu-tree.el
;; メニューバー日本語化
;; http://www11.atwiki.jp/s-irie/pages/13.html
(if (and (= emacs-major-version 22)
         (eq window-system 'x))
    (setq menu-tree-coding-system 'utf-8))
(require 'menu-tree nil t)


;;;;;;;;;;;;;;;;;;;;;;;;

;;======================================================================
;; TeX
;;======================================================================
; YaTeX-mode
(setq auto-mode-alist  (cons (cons "\\.tex$" 'yatex-mode) auto-mode-alist))
(autoload 'yatex-mode "yatex" "Yet Another LaTeX mode" t)
(setq load-path (cons "~/.emacs.d/yatex" load-path))         ;;ココにyatexのパス書く
(setq tex-command "platex")
(setq dvi2-command "C:/MySystem/MySystem/w32tex/dviout/dviout.exe" )                   ;;ココdvioutのパス書く
(setq dviprint-command-format "dvipdfmx %s ")
; BibTex
(add-hook 'yatex-mode-hook 'turn-on-reftex)

VTKのCMakeLists.txtを読み解く

今回は時間の関係上,VTKに特化したCMakeLists.txtについて記載する.

以下に一般的なVTKのCmakeLists.txtを示す.

cmake_minimum_required(VERSION 2.8)
 
PROJECT(VTKPolydataSingleObj)
 
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
 
add_executable(VTKPolydataSingleObj MACOSX_BUNDLE VTKPolydataSingleObj)
 
if(VTK_LIBRARIES)
  target_link_libraries(VTKPolydataSingleObj ${VTK_LIBRARIES})
else()
  target_link_libraries(VTKPolydataSingleObj vtkHybrid)
endif()

1行ずつ読んでいく

cmake_minimum_required(VERSION 2.8)

これは,CMakeを実行する際に,最低限守らないといけない,CmakeのVersionを示してます.
よって,このシステムは,CMakeのVersionは最低,2.8以上でなければなりません.

PROJECT(VTKPolydataSingleObj)

このシステムのプロジェクト名を指定します.
Makeファイルでいうところ,各実行系の名前を指定する所,ということでしょう.
ここでは,プロジェクト名をVTKPolydataSingleObjとしているようです.


さて,いよいよ,こちらからが本格的なVTK情報読み込みデス.

find_package(VTK REQUIRED)

VTKを動作させるために,必要なLink先やコードの位置を探している所デス.
位置などを読み込んだ後に,見つけたライブラリのパスなどを通します.
ここで,複数のライブラリを組み合わせます.

include(${VTK_USE_FILE})

VTK を動作させるためのファイル一式をプロジェクトに取り込む命令文

add_executable(VTKPolydataSingleObj MACOSX_BUNDLE VTKPolydataSingleObj)
<<
VTKを実行させる,実行系ファイルの名前の指定です.
第1引数がMain関数のコード名,第2は関係なし,第3引数が実行系ファイルの名前となる.

if(VTK_LIBRARIES)
target_link_libraries(VTKPolydataSingleObj ${VTK_LIBRARIES})
else()
target_link_libraries(VTKPolydataSingleObj vtkHybrid)
endif()

MATLAB で64bitのMexを行う設定

MexはMATLABの環境(コマンドライン)上で独自のC/C++を呼び出すためのバイナリファイル
バイナリファイルということは,バイナリ化が必要です.

64bitのシステムでMATLABのMexを行う設定

セットアップ環境は以下の通り

Mexを64bitで動作させるためのパッチなるもの(VS2010MEXSupport.zip)を用意する
こちらからダウンロードした.

Small ideas for a big world: Configure Matlab to use Visual 2010 C/C++ compiler


そして,こちらのサイトをよく確認する.
というより,このサイト通りでちゃんと動作します



1) 自分の環境を確認する.
まずは自分の環境をよく確認することが大事です.
もちろんですが,確実にバックアップを取ることは重要です.

C:\Program Files\MATLAB\R2007b\bin\win64\mexopts

適宜,バックアップとして,上記フォルダをコピーしておいておく



2) MATLAB環境上で以下のコマンドを行う

>> matlabroot

私は以下のように出力された
C:\Program Files\MATLAB\R2007b


3)ダウンロードしたファイルを展開
先のLink先からダウンロードした,VS2010MEXSupport.zipを適当な位置に展開する.
展開した以下のファイルをすべて,1)の環境内にコピペする.

4)mexのコンパイラを確認する

mex -setupコマンドで,Visual studio2010が存在し,選択できることを確認する.

あとは,さくさくと行きます!

Kinect周りの環境設定

こういう時期なので、いろいろまとめておく。
OpenNIとKinect for Windows SDK共存できないと聞く
そんなことはなかった。
いろいろ、バリエーションが広がる!


Kinect周りの環境設定

インストールしたい環境は以下の通り


1)Kinect のドライバの設定
Kinect for Windows をそのままUSBポートに差し込むと自動でダウンロードされるので、じっと待つ
ただし、ここで絶対抜き差ししないこと

2) Kinect for Windows SDK 1.8のインストール
Kinect for Windowsの公式サイトはこちら
Kinect for Window Dev Center

いろいろResourcesなども揃っている。
非常に勉強になります。

上記のサイトからStartのコンテンツを選択し、ページ移動
「Downloads / Docs」内に「Kinect for Windows SDK」のLatest Ver.があるので選択し、ダウンロードして実行

これで、KinectSDKコンテンツは揃った。

3) DeveloperTool
Kinectの面白いソースが色々と展開されているので、こちらも併せてダウンロード&インストールしておく
試しに、どのような内容があるかを色々と試してみると面白いし、ソースも公開されてるのでコードもいろいろと遊んでみる。



これで、Kinect側の設定は以上


  • NITE2.2の設定

1) NITE2.2のダウンロード
以下のサイトにアクセスする
NiTE 2.2.0.11 | OpenNI

こちらにアクセスすると、いろいろユーザ情報を入力するよう促される。
ユーザ情報を入力すると、ダウンロードが出来る準備が整う

2014年3月20日現在、Latest Ver,はNITE2.2

2)NITE2.2 インストール
ダウンロードされたexeファイルをそのまま展開すればよいです。

  • OpenNI2.0をインストール

以下のサイトから自分の環境に応じたデータをダウンロード
OpenNI SDK (open-source)-Download | OpenNI

あとはexe実行するのみ


動作については。「スタートメニュー」→「OpenNI 64-bit 2」-> 「NView」を起動する。
起動できたらOK!


OpenNI, NITEの説明、また、DLL, LIBの説明は後の機会にする

MSVCP110.dll, MSVCP100.dllにハマる

Visual studio 2010 Ultimateを用いたサンプルの実行でエラーが出た。
そのエラーがMSVCP110.dllがないと言われた。

探して見ると、どーやらMicrosoft Visual C++ 2010 再頒布可能パッケージが
入っていないというエラー
以下のサイトを参照にさせてもらいました。

『MSVCR100.DLL が見つからなかったため、アプリケーションを開始できませんでした。』解決メモ - やすはるラボ+嫁(*・ω・)

1)Microsoft Visual C++ 2010 再頒布可能パッケージ(X86)を入れる
マイクロソフト公式ダウンロード センターから Microsoft Visual C++ 2010 再頒布可能パッケージ (x86) をダウンロード

なんと。。。64bitでもx86も入れるらしい。。。
こちらを先にexe実行する


2)Microsoft Visual C++ 2010 再頒布可能パッケージ(x64)を入れる
マイクロソフト公式ダウンロード センターから Microsoft Visual C++ 2010 再頒布可能パッケージ (x64) をダウンロード

先と同様に、exe実行する

これで、MSVCP110.dllの設定は完了

しかし、次にMSVCP100.dllがないと言われた。
ということで、検索すると日本語で以下がヒット
Microsoft Visual C++2010 再頒布可能パッケージ(MSVCP100.dll)のインストール


1)Microsoft Visual C++ 2012 再頒布可能パッケージ(x64)へ移動
マイクロソフト公式ダウンロード センターから Visual Studio 2012 更新プログラム 4 の Visual C++ 再頒布可能パッケージ をダウンロード

,,,一瞬びっくりしましたが、2012の再頒布可能パッケージを入れる!
あわわ・・・

2)ダウンロードするプログラムで以下を選択

  • VSU4\vcredist_x64.exe
  • VSU4\vcredist_x86.exe

私はチキンですので、x86->x64の順でインストールしました。

以上で、エラーが解決されます。


しかし、、、、、この再頒布可能パッケージのやり方など。。。
あまりVisual studio の仕様がよくわからないなぁ。。。。
調べまくったけど、こういう仕様はどうもブラックにハマってしまいそうになります。


友人曰く、「WindowsはひたすらDefaltUpdateしておけば問題なし」らしい


。。。そんな怖いものですか。。。。

やっぱり、ちゃんとした仕様はほしいかな?

OpenCV のインストール

参考にしたサイトはこちらから
Physics-Station: OpenCV を Visual Studio で使う方法


このサイトの通りにしたら、きれいにいけました。


環境は以下の通り

OpenCV 2.4.8をインストールする

1) 以下のサイトから最新版をダウンロードする
http://sourceforge.net/projects/opencvlibrary/files/

「Looking for the latest version? 」の後にLatest Versionがあるので、こちらをダウンロードする
2014年3月19日の最新版は以下の通り.

opencv-2.4.8.exe (362.0 MB)

2) ダウンロードしたファイルをダブルクリックし、展開するOpenCVのディレクトリを指定
ex) C:\OpenCV\

3) あとは動作にしたがうだけ

4)終了後に、「システムのプロパティ」→「システムの詳細設定」→「詳細設定」→「環境変数
と選択する

5) ユーザ変数とこで、「新規」をクリックし「変数名」に「OpenCV」を、「変数値」に2)のパスを通す

6)ユーザ変数に「PATH」があるなら、「;%OpenCV%」と一番後ろにおく



インストールしたOpenCVのライブラリを種々のコードでも利用するため、
ライブラリ読み込みのためのヘッダファイルを作成する。
ライブラリにある番号はOpenCVのバージョンなので、インストールしたバージョンに合わせるといいらしい。
便利ですね。
このファイルは上で設定した%OpenCV%\build\include\opencv2\内の「opencv_lib.hpp」とする。

#if _DEBUG
#pragma comment(lib, "opencv_calib3d248d.lib")
#pragma comment(lib, "opencv_contrib248d.lib")
#pragma comment(lib, "opencv_core248d.lib")
#pragma comment(lib, "opencv_features2d248d.lib")
#pragma comment(lib, "opencv_flann248d.lib")
#pragma comment(lib, "opencv_gpu248d.lib")
#pragma comment(lib, "opencv_highgui248d.lib")
#pragma comment(lib, "opencv_imgproc248d.lib")
#pragma comment(lib, "opencv_legacy248d.lib")
#pragma comment(lib, "opencv_ml248d.lib")
#pragma comment(lib, "opencv_nonfree248d.lib")
#pragma comment(lib, "opencv_objdetect248d.lib")
#pragma comment(lib, "opencv_ocl248d.lib")
#pragma comment(lib, "opencv_photo248d.lib")
#pragma comment(lib, "opencv_stitching248d.lib")
#pragma comment(lib, "opencv_superres248d.lib")
#pragma comment(lib, "opencv_ts248d.lib")
#pragma comment(lib, "opencv_video248d.lib")
#pragma comment(lib, "opencv_videostab248d.lib")
#else
#pragma comment(lib, "opencv_calib3d248.lib")
#pragma comment(lib, "opencv_contrib248.lib")
#pragma comment(lib, "opencv_core248.lib")
#pragma comment(lib, "opencv_features2d248.lib")
#pragma comment(lib, "opencv_flann248.lib")
#pragma comment(lib, "opencv_gpu248.lib")
#pragma comment(lib, "opencv_highgui248.lib")
#pragma comment(lib, "opencv_imgproc248.lib")
#pragma comment(lib, "opencv_legacy248.lib")
#pragma comment(lib, "opencv_ml248.lib")
#pragma comment(lib, "opencv_nonfree248.lib")
#pragma comment(lib, "opencv_objdetect248.lib")
#pragma comment(lib, "opencv_ocl248.lib")
#pragma comment(lib, "opencv_photo248.lib")
#pragma comment(lib, "opencv_stitching248.lib")
#pragma comment(lib, "opencv_superres248.lib")
#pragma comment(lib, "opencv_ts248.lib")
#pragma comment(lib, "opencv_video248.lib")
#pragma comment(lib, "opencv_videostab248.lib")
#endif


Visual studio 2010での設定
Visual studio 2010を起動し、「ファイル」→「新規作成」→「プロジェクト」を選択
「空のプロジェクトを選択する」

プロジェクト名を今回 OpenCV\Tutorial\Smoothとする。
(理由はサンプルコードがあるから!)

1) 読み込むためのライブラリの設定
OpenCVのディレクトリについて、「構成プロパティ」→「VC++ディレクトリ」から以下を設定する

  • インクルードディレクトリ

C:\OpenCV\build\include

  • ライブラリディレクトリ

C:\OpenCV\build\x64\vc10\lib

サンプルコードに、次の一行を入れる。

#include <opencv2/opencv_lib.hpp>

私は、そのまま参考サイトのコードを使ってみました。
(わかりやすいし勉強になりました!ありがとうございます!)

//インクルードファイル指定
#include <opencv2/opencv.hpp>
//静的リンクライブラリの指定
#include <opencv2/opencv_lib.hpp>
//名前空間の指定
using namespace cv;
int main()
{
 //width120, height100の画像を作成
 Mat src = Mat::zeros(100,120,CV_8UC3);
 //画像にHello World!を描く
 putText(src, "Hello World!", Point(5,50), FONT_HERSHEY_SIMPLEX, 0.6, cv::Scalar(0,0,200), 2, CV_AA);
 //画像を表示
 imshow("",src);
 //ウインドウの表示時間(0はキーが押されるまで閉じない)
 waitKey(0);
 return 0;
}