【Objective-C】labelでHello World!と表示する

labelでHello World!と表示するテスト

ソース
-------------------------------------------------
//UILabelオブジェクトの生成
UILabel *label = [[UILabel alloc] init];
//UILabelはラベルを管理するクラス。画面に文字を表示させる時に使用。
//[[クラス名 alloc] init] → init メソッド(イニシャライザ)でオブジェクトを初期化。
//alloc → インスタンスの生成に必要なメモリ容量を確保する。allocation(アロケーション)は「割り当て」の意。

//textプロパティで文字を設定
label.text = @"Hello World!";

//UILabelで高さを動的に変える。テキストを設定した後に行う。
[label sizeToFit];

label.center = self.view.center;
[self.view addSubview:label];
-------------------------------------------------

【Objective-C】FMDBでテーブル内の情報を出力する

FMDBでテーブル内の情報を出力するソースコード

前提として

  1. FMDBが導入されている(導入方法はこちら)。
  2. test.dbというファイルが iOS Simulator の Documents ディレクトリにある(iOS Simulatorののパスについてはこちら)。このディレクトリに直接データファイルを置くと、シミュレーターのバージョンごとにデータファイルを置く必要があるので面倒。解決策として、Supporting Files 内にデータファイルを置いておいて、アプリ起動時に Supporting Files 内にデータがない場合に Documents ディレクトリにコピーする方法がある。詳しくは、こちら
  3. title というカラムにデータが既に入っている

ソースコード
----------------------------------------------------------------
//インポート(ヘッダーファイル)
#import "FMDatabase.h"
----------------------------------------------------------------

----------------------------------------------------------------
- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

// パスとDBファイル名を指定

NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);

NSString *dir = [paths objectAtIndex:0];

//test.db はファイル名
NSString *db_path = [dir stringByAppendingPathComponent:@"test.db"];

FMDatabase *db = [FMDatabase databaseWithPath:db_path];

//データを抽出

[db open];

//testdb はテーブル名
FMResultSet *rs = [db executeQuery:@"select id,title from testdb"];

while ([rs next]){

// 出力

NSString *text1 = [rs stringForColumn:@"title"];

//UIlabelクラスのインスタンスを生成。
//alloc でインスタンスの生成(allocationはメモリの割り当ての意)。init で初期化。
UILabel *label = [[UILabel alloc] init];

//labelオブジェクトにテキストを設定
label.text = text1;

//コンテンツの大きさの合わせてUIViewの大きさを変える。UIViewはUIlabelの親クラス。
[label sizeToFit];

//行数の指定。0は、表示可能な最大行数。(インスペクターでの設定も可だがソースが優先される)
label.numberOfLines = 0;

label.center = self.view.center;

[self.view addSubview:label];

// 出力 ここまで

}

[rs close];

}
----------------------------------------------------------------

結果をラベルに表示せずに、配列に入れる場合はスクリプト後半を以下のように変更する

----------------------------------------------------------------
//データを抽出

[db open];

FMResultSet *rs = [db executeQuery:@"select id,title from testdb"];

while ([rs next]){

// 出力

NSString *text1 = [rs stringForColumn:@"title"];

//配列を追加。配列の型は必ず NSMutableArray であること。NSMutableArray は不可。
[testArray addObject:text1];

//UIlabelクラスのインスタンスを生成。
//alloc でインスタンスの生成(allocationはメモリの割り当ての意)。init で初期化。
// UILabel *label = [[UILabel alloc] init];

//labelオブジェクトにテキストを設定
//label.text = text1;

//コンテンツの大きさの合わせてUIViewの大きさを変える。UIViewはUIlabelの親クラス。
//[label sizeToFit];

//label.center = self.view.center;

//[self.view addSubview:label];

// 出力 ここまで

}

[rs close];
----------------------------------------------------------------

【xcode】FMDBでThe FMDatabase is not openエラーが出る

Objective-C で記述したソースを run するとコンソールにエラーが出た

エラー内容
--------------------------------------------------------
2015-xx-xx 19:xx:xx.xxx FMDBTest[xxxx:xxxxxx] The FMDatabase <FMDatabase: xxxxxxxxxxxxxx> is not open.
--------------------------------------------------------

原因と解決策

原因:下記の記述が反対だった
--------------------------------------------------------
FMResultSet *rs = [db executeQuery:@"select id,title from testdb"];
[db open];
--------------------------------------------------------

解決策:記述の順番を入れ替えた
--------------------------------------------------------
[db open];
FMResultSet *rs = [db executeQuery:@"select id,title from testdb"];
--------------------------------------------------------

【Xcode6】iOS SimulatorのDocumentsまでのパス

iOS SimulatorのDocumentsまでのパスはこれ
------------------------------------
~/Library/Developer/CoreSimulator/Devices/{simulated device UUID}/data/Containers/Data/Application/{application UUID}/Documents/
「~」はホームディレクトリのこと。「Macintosh HD」 の下の「ユーザ」の下の「ユーザ名」のディレクトリ。
------------------------------------

simulated device UUID は、Xcode の「Window」-「Devices」から起動した Simulator を選択すれば分かる。「identifier」の項目。

でも分かりにくいので、「SimPholders2」というアプリを使うといい。

ダウンロードはこちら

参考ページ:

http://qiita.com/singo405/items/b84f81ee2daaef27d0a2

【xcode】FMDB導入方法

FMDB は SQLite を iOS の Objective-C で扱いやすくするための Wrapper ライブラリ。GitHub で公開されている。

1.あらかじめ「libsqlite3.0.dylib」を追加しておく

SQLiteを使用するために「Targets」->「Build Phases」->「Link Binary With Libraries」から「libsqlite3.0.dylib」を追加しておく。

詳細はこちら

2.FMDBをアプリに組み込む

プログラムをこちらからダウンロード。

ダウンロードしたディレクトリ内のfmdb-master/src/ 配下にある fmdb というディレクトリを、ディレクトリXcodeのプロジェクトフォルダ内(プロジェクト名のフォルダ直下、MasterViewController.h などがあるところ)に xcode の project navigator エリアに直接ドラッグして置く。ただし、「fmdb.m」という名前のファイルだけ外しておく(main 関数が実装されていて、ビルド時にコンパイルエラーが出る)。

fmdb ディレクトリをプロジェクト内に置くときはナビゲーターエリアに直接ドラッグする

詳細はこちら

「Choose options for adding these files」のダイアログが出るので「Destination Copy items ~」にチェックを入れることでアプリに組み込める。

3.インポート

ソースコード
----------------------------------------------------------------
#import "FMDatabase.h"
----------------------------------------------------------------
ヘッダーファイル(.h)でも実装ファイル(.m)でもどちらでもいい。

ビルドしてエラーが出なければOK。

【UWSC】八桁の乱数を50個メモ帳に出力する

乱数が必要なったので覚書

-------------------------------
// ファイルを開く
fid = FOPEN("ransuu.txt", F_WRITE)
// 1行出力

for i = 1 TO 50

r = RANDOM(89999999) + 10000000
FPUT(fid, r)
// 1行出力
next
// ファイルを閉じる
FCLOSE(fid)
-------------------------------

//作ったファイルを開く
exec("notepad ransuu.txt")

秀丸エディタである文字列が入っていない行を削除する

秀丸エディタである文字列が入っていない行を削除するには、grep(グレップ)機能を使う。すると、ある文字が含まれる行だけを抽出できる。それにより、特定の文字列の入っていない行を削除したのと同じ結果になる。

grep は、「ファイル全体から (global) 正規表現 (regular expression) に一致する行を表示(print)する」機能。

使い方は、「検索」 → 「grepの実行」

「grepの実行」は、対象にするフォルダを指定できるので、指定フォルダの中に複数のファイルを入れれば、いくつものファイルから一度にデータを抽出できる。

画像ファイルを持っていかれないようにする方法

インターネットで公開している以上、絶対に画像を持っていかれない方法はない。

ここで紹介するのは、画像を持っていきにくくして、知識の乏しい人なら画像の持ち出しを諦めるだろう方法。そして簡単な実装できる方法を選んだ。

1.baseタグで基準となるURLを設定する

baseタグは、相対パスで書かれたURLの基準を指定するもの。

もしページのソースを見られたら画像の場所がわかってしまう。

絶対パス
----------------------------
<img src="http://example.com/image2001/image01.jpg">
----------------------------

相対パス
----------------------------
<img src="image2001/image01.jpg">
----------------------------

上の二つどちらも、画像ファイルは「http://example.com/image2001/」の中にあると読める。

そこでbeseタグを使うと画像ファイルの場所を少し分かりにくくできる。

headタグの間にbaseタグを記述する
----------------------------
<base href="http://example.com/image2001/">
----------------------------

すると「image2001フォルダ」までが基準になるのでimgタグへの記述は下記のようになる。

相対パスで
----------------------------
<img src="image01.jpg">
----------------------------

「image2001」の記述を省略できるのでimgタグ内だけを見ても画像の場所が分からなくなる。

2.baseタグはjavascriptで隠す。

imgタグだけを見ても画像ファイルの場所は分からないが、headタグ間に記述したbaseタグを見ると分かってしまう。
そこでbaseタグはheadタグ間に書かずに、外部ファイルとしてjavascriptで書くとよりいい。

外部ファイルとして読み込む
----------------------------
document.write('<base href="http://example.com/image2001/">');
----------------------------

参考

http://www.broadband-xp.com/hidesource/base.html

3.右クリックを無効にする

これまでの実装でソースを見ても画像ファイルの場所をわかりにくくすることは出来るが、画像自体を右クリックすれば画像のURLも分かるし、保存も出来てしまう。

そこで右クリックを禁止する。

bodyタグ内に記述
----------------------------
<body onContextmenu="return false">
----------------------------

これだと右クリックは防げるがデスクトップへドラッグすれば保存できてしまう。
そこでjquery.dwImageProtector.jsというjqueryのプラグインを使う。

使い方はこちらこちらが分かりやすい。

http://www.css-lecture.com/log/javascript/dwimageprotector.html

jquery.dwImageProtector.jsのソースはこんな感じ
---------------------------------------------------------
jQuery.fn.protectImage = function(settings) {
settings = jQuery.extend({
image: 'blank.gif',
zIndex: 10
}, settings);
return this.each(function() {
var position = $(this).position();
var height = $(this).height();
var width = $(this).width();
$('<img />').attr({
width: width,
height: height,
src: settings.image
}).css({
border: '1px solid #f00',
top: position.top,
left: position.left,
position: 'absolute',
zIndex: settings.zIndex
}).appendTo('#content')
});
};
---------------------------------------------------------

head内のソースはこう
---------------------------------------------------------
<script src="http://example.com/js/jquery-1.9.1.min.js" type="text/javascript"></script>
<script src="http://example.com/js/jquery.dwImageProtector.js" type="text/javascript"></script>
<script type="text/javascript">
$(window).bind('load', function() {
$('img.protect').protectImage();
});
</script>
---------------------------------------------------------

保護するイメージには class を設定する
---------------------------------------------------------
<img src="image01.jpg" alt="" width="500" height="500" class="protect" />
---------------------------------------------------------

画像を囲む枠がずれる場合は「.appendTo('body')」の部分をbodyでなく任意の場所に変更すればうまくいく。

IEオブジェクトからUWSC用のIDを取得する

IEオブジェクトからUWSC用のIDを求めるためのスクリプト
-----------------------------------------------------
IE = CreateOLEObj("InternetExplorer.Application")
IE_ID = HNDtoID(IE.hwnd)
-----------------------------------------------------

1.IE.hwnd で ウインドウハンドルが取得できる。
2.HNDtoID でウインドウハンドルをUWSC用のIDに変換している。

【UWSC】IEでCLKITEMの箇所でエラーが出る

UWSC で IE を操作していると CLKITEM の箇所でエラーが出た。

ie_error1
↓↓↓↓↓
ie_error2

リンクが出来ている文字列にマウスカーソルを移動するスクリプト(クリックはせずに)のところ。

エラー箇所
------------------------------------------------------------
CLKITEM(IE_ID, "詳しくはこちら", CLK_MUSMOVE, FALSE)
------------------------------------------------------------

次のように書き直したらエラーは出なくなった
------------------------------------------------------------
CLKITEM(IE_ID, "詳しくはこちら", CLK_ACC or CLK_MUSMOVE, FALSE, FALSE)
------------------------------------------------------------

ヘルプを改めて見ると「CLK_MUSMOVE」は追加オプションになっている。これを単品で書いてたのが問題だったのかなぁ・・・