ラベル Xcode の投稿を表示しています。 すべての投稿を表示
ラベル Xcode の投稿を表示しています。 すべての投稿を表示

2016年8月12日金曜日

SQLite3のプログラムの勉強

ちょっとSQLite3を使ったプログラムをWindowsで作るとどうなるのか調べてみたくなりました。ただ私は普段LinuxかMacでプログラムを作ることが圧倒的に多いので、まずは慣れたMac、Xcodeで作ってみます。

1. sqlite3のインストール
brewを使ってインストールしています。コマンドラインでも使えますし、ヘッダ、ライブラリも一緒にインストールしてくれます。

2. プログラムの作成
とりあえず、以下の様なプログラムを作ってみました。

とてもシンプルです。実行結果は以下の様になります。

$HOME = /Users/hogehoge
$HOME = /Users/hogehoge/ProgWork/SQLite
OPEN SUCCESS!
id: 123, name: hoge
CLOSE SUCCESS!

createがありませんが、そこはマニュアルで作っています。(プログラムに書いてもいいんですが、毎回実行するためにいちいちdbファイルを削除するのも面倒なので。)

> create table tbl_test(id integer primary key, name text);

最終的にはinsertのところをupdateに変えて、プロセス間の通信代わりに使おうと目論んでいます。

3. 注意点

  • Xcodeの設定でライブラリの追加オプション"-lsqlite"を忘れない様に。
  • 単純にやろうと思うなら、sqlite_open(), sqlite_close(), sqlite_exec()だけで済ますこともできます。ただselect文をsqlite_exec()でやろうとすると、どうしても出力をcallbackで受けないといけなくなります。callback関数を書くのが面倒だったので、非同期クエリで実装しています。(こちらも面倒だがやむを得ません)
  • sqliteはsql文の実行ではデフォルトでオートトランザクションになっています。将来的にプロセス間の通信に使うつもりなら本当は、"bgein","commit"と明確にトランザクションの指定をしてやるべきです。ただそんな複雑な通信は当面する気がなく、一方向だけ(片方がwriteして、他方はreadするだけ)のつもりなので、当面はこれでも問題はありません。
さて、これをwindowsのVisualStudioのc++で実装です。2015ではUWPアプリ(Universal Windows Platform)として、SDKにsqlite3が標準で入っているらしいです。実装もこのままでコンパイルが通りましたが、リンクでどうしてもsqlite関係の関数が「未解決の外部シンボル」と言われてしまいます。(ちゃんとwinsqlite3.libを追加のライブラリに指定しているんですが・・・)ちょいとこの問題の解決には時間がかかっています。


2015年2月23日月曜日

Xcodeでgithubを利用

ネットでよく見る話題ですが、サクッといくこともあれば、苦労している記事もあります。自分の場合は苦労しました ^^;) どうもsshキーの登録を手動でしないといけないようなんですが、その辺が詳しく書いてあるものがありません。基本的にはコマンドラインで一回手動でやれば自動的にキーは記録してくれますが、ちょっとメモしておきます。(まあ、こんなのは昔のeclipseでもよくありました。少し前から全部GUIでできるようになったと思います。)

1.Xcodeでプロジェクトの作成
とりあえず何かプロジェクトを作成しましょう。あと重要なことですが、最初にローカルでGit管理するかという問い合わせがひっそりとあります。(デフォルトがオフです)これのチェックを入れておくことを忘れずに。(後からGit管理する方法もあるようですが、Xcodeのバージョンがあがるとどうなるか分からないので、面倒くさければ新規に作り直した方が早いと思います)

2.remoteリポジトリの登録
まずgithubに管理用のリポジトリを作成しておきます。(これ重要。いろんなツールを見てきましたが、新規に作成するリポジトリまで作成してくれる統合ツールは見た事ありません。おそらくgithubが新規リポジトリ作成のAPI(URL経由のね)は作ってないんでしょう。そうしないと、いたずらされかねませんしね。)
XcodeのSourceControlからConfigureで、remoteとしてgithubの先ほど作成したリポジトリを登録しておきます。

3.最初のcommitをローカルにする
とりあえず、ローカルのリポジトリにcommitしておきます。

4,remoteにpushする
ここが一番の難関です。Xcodeから行おうとすると、いかにもIDとパスワードを聞いてきて、うまくいきそうに見えますが失敗します。最初はプロジェクト以下の.gitにsshパスワードが入っていませんから。
ツールを使ってもいいんですが、最初だけは手動でgitコマンドでpushします。

$ git push -u origin master

このときgithubのユーザID、パスワードを聞かれますがここでsshキーが.git以下に登録されますから、あとはXcodeでも自由に操作できるようになります。

毎回思うことですが、gitって便利だけどどうしてもコマンドラインからの入力が避けれないな〜。(コマンドラインでbranchの操作とか、差分見ようと思うと地獄なんですが、どうして公式にはGUI作ってくれないのか。そのあたりはLinusさんの主義なんですかね。GUIあたりは周りに任して、自分は本質の部分だけに集中するとか。自分はコマンドライン、そんなに気にならないほうだからいいけど、若いもんは使ってくれないよ。emacsで編集、make、debugまでするのは会社ではもう自分だけじゃなかろうか。今時のは、統合開発ツールあるのが当たり前と思ってるし。自分としてはツールの裏で何動いているのかわからない方が怖いんだが。)

2014年5月16日金曜日

MacでBoostはどんな感じ!?

昔、Boostを使えるようにLinuxやらMacでビルドしたことがあります。(おそろしく時間がかかりました)
そういえば今の新しいMac(Mavericks)になってからgcc→clangに変わったので、どうやってBoost使えるようにしたものかと思って調べてみました。(c++第4版ではBoostが標準ライブラリになるもんだと思ってましたが、正式には発表されてないみたいだし、そもそも第4版って発効されたんだろうか?でもBoost使いやすくていいと思ってます。)

そうしたらどうも、今のMavericksのXcode5だと素直にはBoostはビルドできないらしい。問題なのはXcode5でインストールされるcコンパイラがclangで、libstdc++-4.2.1(実際、gccのバージョンを調べてみるとこういってきます)のため、4.3以降に実装されたstd::moveがなく、boostは当該関数があるのが前提で作られているらしく、ダメだとのこと。(がんばるなら、libc++をリンクするようにしたり、gccの最新版を別途インストールしないといけない。)

なんでこんなことになったのかというと、gnuがGPL v3を出したのが大元の原因らしい。(確かに数年前、OSSの方ではもめてましたね)gccがGPL v3にしたもんですから、これで仕事している人間たちはもっと縛りの緩いBSDライセンスなLLVM、clangを採用し始めたとのこと。(おかげでclangの開発が急に進みましたが)Linux kernelもv3は批判していて、未だにv2だったはずです。
でもLinux kernelはgccコンパイラでないとビルドできないようなgcc固有の機能を使っています。なんでgccコンパイラがGPL v3なのに、それを使っている(正確にはlibstd++に依存している)Linux Kernelがv2のままで居られるのかと思っていたら、gccのライセンスに抜け道が用意されていたらしく、gccでビルドしたものはv2でもいいよ(意訳)と書いてあるそうです。

さてここで本来のMacのBoostの問題に戻りますが、Macとしては新しいlibstdc++を採用したいが、GPL v3は採用したくない。そのためコンパイラをclangにしましたが、そうなるとlibstdc++-4.3からはGPL v3になるため、これを採用できない。という、風が吹けば桶屋、みたいな状況に陥っているようです。

まあclangの方が頑張ってくれれば問題はなくなるんですが、そもそもc++第4版の決定ってどうなったのよ?以前、c++第4版の決定稿の話を聞いた時は、これでしばらくコンパイラの実装が不安定になるなと悩んでいましたが、事態はそれとは別の方向に悩ましいことになってました。
(Boost関係とか実験するときは、しばらくLinuxでやるしかないようです。)

2014年2月25日火曜日

Xcode5 外部ライブラリの設定、およびデバッグオプションつけかた

前回、GMPを使ったpi計算プログラムをMacで動かしました。最初はコマンドラインだけでやってましたが、せっかくなのでXcodeのプロジェクトにし、デバッグしてみました。(1億桁の変数ってどれくらいメモリをとるのか確認してみたかった)
非常に基本的なXcodeの使い方なんですが、調べてみたら結構初心者向けに書いてあるところがなく、またVisual Studioとはかなり使い方が違っていたので、メモを残します。

1.プロジェクトの作成
プロジェクトの作成方法は、大して他の統合環境と変わりません。
new projectで、右上のCommand Line Toolを選択します。(今回は元々、コマンドラインで作成していたプログラムをXcodeでデバッグできるようにしますから、これを選択します。)

2.ソースファイルの作成
事前に作ってあったソースコードを元にプロジェクト内に必要なファイルを作成します。

3.外部ライブラリ(GMP)の指定
上記で作成したソースコードはヘッダやライブラリとして/usr/local以下にあるGMPのヘッダやライブラリが必要です。それをコンパイル・リンク時にプロジェクトが参照できるようにしないといけません。
Xcodeの画面左側ビュー内のプロジェクトを選択すると、画面中央がBuild settingsになります。
設定項目が多数ありますが、このうちSearch Pathsの項目で外部ライブラリのヘッダ、ライブラリがある場所を以下の項目に設定します。
・Header Search Paths
・Library Search Paths
それぞれ、Debug用、Release用を設定してやる必要があります。またHeader Search Pathsにはデフォルトでシステム用のパスが既に入っており、それに追加する形になります。ここが少し悩んだのですが、WindowsやLinuxだとパス名の追加は":"(コロン)でパス名を区切って続けることが多いんですが、Xcodeではそれでは区切り文字として認識してくれませんでした。色々調べてもわからず試してみたら空白で外部ライブラリのパス名を区切れば通りました。

4.外部ライブラリの指定
3項では外部ライブラリの場所を指定しただけで、リンク時のライブラリ名を追加してやらないといけません。これは先ほどのSearch Pathsより上にあるLinkingのところで、Other Linker Flagsに"-lgmp"とDebug/Release双方に設定してやればOKです。(gccのリンクオプション、そのままです。まあVisual StudioでもGUIで色々オプション指定できますが、最後の確認としてコマンドラインのオプション一覧を表示できますから、やってることは一緒か)

5.Debug/Releaseの切り替え
さて次はDebug/Releaseどちらでビルド・実行するかの指定です。これはメニューで、Product→Scheme→Edit Schemeで表示されるダイアログで切り替えます。

ここのBuild ConfigurationでDebug/Releaseを切り替えます。(このダイアログに前回書いたデバッガのLLDBの選択が表示されています。これLLDB以外のデバッガってあるんだろうか?なんか追加できそうなUIになっていますが)
またこのダイアログの別タブで、実行時の引数とか指定できます。

あとVisualStudio等と違って、実行コマンドはメニューからRunしかありません。先ほどのBuild ConfigurationがDebugになっていたらRunすれば自動的にデバッグモードでの実行になります。Visual Studioだとメイン画面のUIで直接切り替えれたし、メニューにもRun, Debug両方あったため、そちらに慣れてしまい、当初はどうやってデバッグしたらいいのかかなり悩みました。ただ考えてみれば一度Release版でビルドしたら、そうそうDebug/Releaseを行き来するシチュエーションも通常はないでしょうから、これはこれで合理的かも。

2014年2月16日日曜日

Mac Mavericks:gdbがない!?

最近、家で簡単なプログラムを作るときはLinuxからMacが増えてます。(LinuxマシンはデスクトップPCで昔のゲーミング用なので、ファンの音がうるさい!それに比べて、自分が現在持っているMacはすべてノートPCで、基本は静か)
まあそれでも、OpenSourceだといきなりMacでやるのは冒険すぎるんで、まだまだLinuxマシンも使います。(時にはバージョンの違うLinuxで動きを見る必要がでてきて、WindowsのVMPlayer上のも動かすときがありますが)

Mavericksになって普通にgccが使えたから気にしてなかったんですが、デバッガを動かしたくなりgdbとコマンドを打つと"command not found"といってきます。XcodeやCommand Line Toolsはインストールしてあるのに、何で?
調べてみたら、Mavericksになってからgcc、ccはLLVM(Low Level VIrtual Machineらしいが、現在は固有名詞としているらしい)になり、結局clang一つが動いているようになったそうです。
その際、gdbは削除され代わりに"lldb"というコマンドになったそうです。実際、ターミナルで"-g"オプションをつけたバイナリをデバッグしてみると、普通にgdbのコマンドが使えました。結局、仮想化技術を使ってデバッガを統一しているんですかね? (調べてたらgdbを無理矢理Mavericksにインストールする方法をかいてたサイトもありましたが、lldbでデバッガが使えるなら、これでいいや)
ただこれだと普段、emacs上でソースコードを見ながらgdbでデバッグするスタイルができなくなり、ちょっと困っています。

追記:
Xcodeの"Edit schme"で、プロジェクトのRelease/Debugを切り替えるところをよく見たら、利用するデバッガとしてちゃんと"LLDB"と書いてありました。

2014年2月8日土曜日

Mac OSX Xcodeの実行形式保存場所について

非常に謎なんですが、Xcodeってビルドしたあとのバイナリファイルがどこに入っているのか全然わかりません。これだと、ファイルの入出力するプログラムかくのも困るし、そもそも手動で動かしたいときどうしたらいいのかわからない。

Mavericksで変わったのかなとも思いましたが、そうではなくやっと位置がわかりました。

$HOME/Library/Developer/Xcode/DerivedData/(プロジェクト名)-何か文字列

以下に、Build/Prodeuct/debug等のフォルダが作成されて、そこに格納されていました。いやらしいのが何か勝手に文字列を追加されたフォルダに格納されるところです。本人は同じプロジェクトを修正しているつもりなんですが、バイナリ自体は日ごとによりどこに保存されるのか直接はわからなくなっています。なんでこんな仕様になっているのか。。。せっかくgitも標準装備(但しXcodeをインストールしろとは言ってきますが)で入っているんだし、ビルドしたバイナリをなんでプロジェクトフォルダ直下におくようにしなかったか意味がわかりません。

あともう一つ重要なことを書き忘れました。上記フォルダ、$HOME/Librryですが初期設定では不可視フォルダになっていて見えません。以下のコマンドを端末からうちこんでください。]

$ defaults write com.apple.finder AppleShowAllFiles true
$ killall Finder

なんでこんな意味のわからないコマンドを打ち込まないといけないのかわかりませんが、これで不可視属性のファイルが表示されるようになります。ただ、desktopにも.DSStoreとか変なのが表示されてきますので、気持ち悪かったら、trueのところををfalseに変えてくれれば元にもどります。(自分は基本、すべてのファイルが見たいので、いつもこの設定にしています)