2012年6月29日金曜日

UITableViewのtitleが表示されない!!(iphoneアプリの作り方 objective-c)

メインビューから、UITableviewを表示させようとした時、

self.titleを指定しているのに、タイトルが表示されなくて、
少し悩んでしまったので、ブログに書こうと思います。

実際には、タイトルが一瞬表示されるのですが、
どこかに消えてしまうんです。。











↑ここの「タイトル」の所です。

このテーブルビューを作成しているメソッドファイル(.m)には、

- (void)viewDidLoad の部分に、

----


self.title = @"タイトル";
self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;

----

と指定しているのに、
なぜかこの画面を呼び出すとタイトルのところが消えてしまいます。
[self.view insertSubview:self.navigationController.navigationBar atIndex:10];


とかやっても消えてしまうので、
本当にいろいろ悩んでどこに消えてしまったのか探しました。。

でも原因は、この画面を呼び出している呼び出し方に問題がありました。

この画面を呼び出す際に、UIButtonに以下のようなアクションを設定したのですが、

------

-(void)torainingpush:(id)sender {
/*テーブルビュー(category.xib)を表示させる*/
category *viewController = [[category alloc] initWithNibName:@"category" 
bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc
initWithRootViewController:viewController];
navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
[navigationController setNavigationBarHidden:YES animated:YES];
/*モーダルビューとして、次のビューを表示する*/
[self presentModalViewController:navigationController animated:YES];
}

--------

ここで、ナビゲーションバーの表示を非表示にしていました。。(><!)
[navigationController setNavigationBarHidden:YES animated:YES];

↑ここのとこです。

[navigationController setNavigationBarHidden:NO animated:YES];
本当はNOに指定しないと表示されないのに。。

NOで設定したら無事に表示される様になりました!
こんなに悩んだのに。。

まだまだ未熟ものですね、
頑張ります。。











2012年6月25日月曜日

IEでもCSSでグラデーションを実現する方法

IEでもCSSだけでグラデーションを実現する方法です。

.grade {


background-color:#ffffff;
/* For WebKit (Safari, Google Chrome etc) */
background: -webkit-gradient(linear, left top, left bottom, from(#f3efe2), to(#ffffff));
/* For Mozilla/Gecko (Firefox etc) */
background: -moz-linear-gradient(top, #f3efe2, #ffffff);
/* For Internet Explorer 5.5 - 7 */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#f3efe2, endColorstr=#ffffff);
/* For Internet Explorer 8 */
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#f3efe2, endColorstr=#ffffff)";

}

fromからtoまでの色を指定することで、
きれいなグラデーションにすることが出来ます。

クロムやfirefoxだと#fffで白を表現することができるのですが、
IEでは#fffffffとしっかり書かないと白にならずに、変なグラデーションになってしまいました。







2012年6月22日金曜日

UIMapViewで今いる場所を表示(addObserverで現在地を中心に表示させる)

















IBOutletでマップを追加したら、

デリゲートをselfで設定し、
addObserverを追加し、ロケーションを表示させるキーを設定します。

- (void)viewDidLoad {
    [super viewDidLoad];

self.mapView.delegate = self;
[self.mapView.userLocation addObserver:self forKeyPath:@"location" options:0 context:NULL];
}

//現在地を表示させるボタンにアクションを設定
- (IBAction) showHere : (id)sender {
// show current location
mapView.userLocation.title = @"現在地";
mapView.showsUserLocation = YES;
mapView.centerCoordinate = mapView.userLocation.location.coordinate
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {  
    mapView.centerCoordinate = mapView.userLocation.location.coordinate;  
// 一度しか現在地に移動しないなら removeObserver する  

    [mapView.userLocation removeObserver:self forKeyPath:@"location"];  


これで現在地を何度でも表示させる事が出来ます。





2012年6月18日月曜日

applicarion loaderでアプリをアップロードする際のエラー

application loaderでアプリをアップしようとしたら、
以下のエラーが。

------


iPhone / iPod Touch : application executable contains unsupported architecture(s):i386
Application failed codesign verification. The signature was invalid, or it was not signed with an Apple submission certificate.
Unable to extract codesigning entitlements from your application. Please make sure FlowChartBuilder.app is a valid Mach executable that's properly codesigned.

------


Across the Star Cluster
iPhone App開発とかストーリーとかCGとか色々 普通に日記もあります。

http://ameblo.jp/nukuchi/archive1-201011.html


こちらのブログを参考にいろいろ試してみたのですが、
全然だめ、、

再度構成からdistributeを作り直し、
設定をしたらうまく出来たので、その手順を忘れない様にメモ。
















プロジェクト > プロジェクト"名前"の情報 > 構成

Debugを複製して、名前をDistributeに。
下のビルドが使用するコマンドラインもDistributeに。




同じ画面のビルドを選択肢、
コード署名IDを、Distribute用の署名に変更。

(多分ココがDevelopper用になっていたからうまく行かなかったのかも、、)






















ビルドする際に、ターゲットをDevice、アクティブな構成をDistributeを選択。
ビルドを行なう。


最後にDistribute-iphoneosフォルダに出来た
XXX.app.dSYMじゃない方のファイルを圧縮して、
application loaderでアップ。

これでエラーが消えてうまくアップすることができました!
あとはリジェクトされない様に審査を待つだけ!


UIWevViewのリンクをsafariで開く方法(target="_blank"で開かないリンクを開く!)

iphoneのUIWebViewで表示させているWEBページは、
WEB内でtarget="_blank"が設定されていても、
UIWebView内で表示されてしまいます。

UIWebView内でリンクをクリックした際に、
safariを立ち上げて別ページとしてページを開くには、


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

こちらを使います。
これは、UIWebViewでページを開く際に、
アプリ内で開くか、サファリを立ち上げて表示させるかを選択できます。

return NO;のとき⇒サファリを開く
return YES;のとき⇒アプリ内で開く

クリックしたかどうかの判断は以下の条件で分岐できます。

if(navigationType == UIWebViewNavigationTypeLinkClicked

ただ、以下のものではリンクをクリックしても
リンク先が表示されなくなってしまうので、


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
return NO;
} else {
return YES;
}
}






[[UIApplication sharedApplication] openURL: [request URL]];
を書いてクリックされたリンクを開く様にしましょう。

こんな感じです。

------

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if(navigationType == UIWebViewNavigationTypeLinkClicked) { 
[[UIApplication sharedApplication] openURL: [request URL]];
return NO;
} else {
return YES;
}
}

------


ぜひお試しください。




2012年6月13日水曜日

NSUserDefaultsを使って、簡単なデータを保存する!iphoneアプリの作りかた

iphoneアプリを作っていて、またハマってしまったのでメモ。
今日は、NSUserDefaultsを使って、簡単なデータを保存する方法です。



【やりたいことを画像で説明します!】
文章で説明するのはちょっと大変なので、
画像を貼ってご説明したいと思います。



←こういうテーブルビューがあって、
 データを追加したり、削除したりすることが出来ます。

←追加ボタンを押したところ。
 ピッカーで選択した情報が、
 テーブルビューに反映されます。

←削除ボタンを押したところ。
 削除ボタンが「完了」に変わって、
 情報の左側にマイナスマークが出ます。

←マイナスマークを選択すると、
 Deleteボタンが出てきて、
 Deleteボタンを押すと、情報が削除されます。












こんな感じでテーブル内の情報を編集し、
その情報を次にアプリを開いた時も保存しておけるように、
今回はNSUserDefaultsを使用しました!


【それでは早速中身の解説です!】


これが全部のソースですが、
ちょっと長いので、すこしづつ解説していきたいと思います。

-----

@implementation okiniiri
@synthesize customButton1;
@synthesize categoryTableView;
@synthesize picker;
@synthesize donebtn;
@synthesize doneview;
@synthesize sakujyobtn;
@synthesize contents;


- (void)viewDidLoad {
    [super viewDidLoad];
self.view.backgroundColor = [UIColor blueColor];
//-- カスタムボタンの設定 その1 --//
self.customButton1 = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
self.customButton1.frame = CGRectMake(8.0, 5.0, 30.0, 30.0);
[self.customButton1 setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
[self.customButton1 addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
[self.view insertSubview:self.customButton1 atIndex:2];

//arrayforkeyで保存されているファイルを呼び出す
NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *array;
array = [_userDefaults arrayForKey:@"datacontent"];
if (array) {
//ファイルがあった場合は、contentsにかき出す
contents =  [array mutableCopy];
} else {
//ファイルがなかったら、arrayforkeyでファイルを作成、保存する
contents = [[NSMutableArray alloc] initWithObjects:@"aa",@"a", @"b", @"c", nil];
NSArray *array = contents;
[_userDefaults setObject:array forKey:@"datacontent"];
[_userDefaults synchronize];
}

 
activities = [[NSMutableArray alloc] initWithObjects:
@"11111",  
@"222222",  
@"33333"
@"4444",  
nil];
sakujyobtn.title = @"削除";
}

//テーブルのセルの行を決定
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [contents count];
}
//テーブルに表示する内容を決定する
- (UITableViewCell *)tableView:(UITableView *)tableView 
cellForRowAtIndexPath:(NSIndexPath *)indexPath {

//同じ形式のセルを使うため、そのセルを再利用する
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"identifier"];
    if (cell == nil) {

//基本となるセルがまだ出来てなかったらセルを作成する
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
  reuseIdentifier:@"identifier"];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[cell autorelease];
    }
    
//indexpathに表示するテキストを決定する
    if (indexPath.row < [contents count]) {
        cell.textLabel.text = [contents objectAtIndex:indexPath.row];
    }
    return cell;
}

//セル選択時のアクションを設定
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

// NSString* message = [contents objectAtIndex:indexPath.row];
NSString *message = [contents objectAtIndex:indexPath.row];
if (message == @"aaaaaa") {
NSURL *url = [NSURL URLWithString:@"https://www.facebook.com/sharer/sharer.php?u=http://douwashindan3310.appspot.com/kekka12.html"];
[[UIApplication sharedApplication] openURL:url];
} else {
NSURL *url = [NSURL URLWithString:@"http://www.atmarkit.co.jp/fcoding/articles/objc/05/objc05b.html"];
[[UIApplication sharedApplication] openURL:url];
}


}

//セルを本当に削除する
-(void)tableView:(UITableView *)tableView 
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
forRowAtIndexPath:(NSIndexPath *)indexPath 
{
if (UITableViewCellEditingStyleDelete == editingStyle) {
//データソースからデータを削除
[contents removeObjectAtIndex:indexPath.row];
//テーブルから該当セルを削除
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
withRowAnimation:UITableViewRowAnimationFade];

//データを読み込んで削除=========================
NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arr;
arr = [_userDefaults arrayForKey:@"datacontent"]; //読み込み
arr = contents;
[_userDefaults setObject:arr forKey:@"datacontent"];
[_userDefaults synchronize];
//データを読み込んで削除=========================

} else if (UITableViewCellEditingStyleInsert == editingStyle) {
//データソースに1件追加
[contents insertObject:@"new item" atIndex:(contents.count - 1)];
//テーブルにセルを追加
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
withRowAnimation:UITableViewRowAnimationTop];
}
}
-(IBAction)setEditing:(BOOL)editing animated:(BOOL)animated {

// 編集モードにする
if(self.categoryTableView.editing == NO) {
[self.categoryTableView setEditing:YES animated:YES];
sakujyobtn.title = @"完了";
} else if(self.categoryTableView.editing == YES)  {
[self.categoryTableView setEditing:NO animated:YES];
sakujyobtn.title = @"削除";
}
[super setEditing:editing animated:YES];
}

-(UITableViewCellEditingStyle)tableView:(UITableView*)tableView
  editingStyleForRowAtIndexPath:(NSIndexPath*)indexPath
{
return UITableViewCellEditingStyleDelete;
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
 }

- (void)viewDidUnload {
    [super viewDidUnload];
}

//-- アクションの設定 --------------------------------//
// 戻るボタンが押された時のアクションを設定します。
//-------------------------------------------------//
- (void)action:(id)sender
{
//表示していたビューを消す
[self dismissModalViewControllerAnimated:YES];
}

//-- アクションの設定 --------------------------------//
// 追加ボタンが押された時のアクションを設定します。
//-------------------------------------------------//
-(IBAction)setEditingadd:(BOOL)editing animated:(BOOL)animated {
picker = [[[UIPickerView alloc] initWithFrame:CGRectMake(0,265,320,200)] autorelease];
picker.delegate = self;
picker.dataSource = self;
[self.view addSubview:picker];
doneview = [[[UIView alloc]initWithFrame:CGRectMake(0,225,320,40)] autorelease];
doneview.backgroundColor = [UIColor blackColor];
doneview.alpha = 0.5;
[self.view addSubview:doneview];
donebtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
donebtn.frame = CGRectMake(230, 232, 80, 30);
[donebtn setTitle:@"完了" forState:UIControlStateNormal];
[donebtn addTarget:self
action:@selector(done:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:donebtn];
}


//列数の設定(設定する列の数をreturnで返す)
- (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}

//!!行も列も番号は0から始まるので注意
//列(componentの値で渡される)に対する、行数の設定(設定する行の数をreturnで返す)
- (NSInteger) pickerView: (UIPickerView*)pView
 numberOfRowsInComponent:(NSInteger) component {
  return [activities count];
}


//列(componentの値)、行(rowの値)に対する表示するものを設定
- (NSString*)pickerView: (UIPickerView*)pView
titleForRow:(NSInteger) row forComponent:(NSInteger)component {
return [activities objectAtIndex:row];
}
// 呼ばれるdoneメソッド
-(void)done:(UIButton*)button{
NSIndexPath* indexPath = [NSIndexPath indexPathForRow:contents.count inSection:0];
/*NSInteger component = [picker selectedRowInComponent:0];
NSString* datatitle = [NSString stringWithFormat:@"%d",component];*/
//NSString *activity = [contents objectAtIndex: [picker selectedRowInComponent:0]];
NSString *activity = [activities objectAtIndex: [picker selectedRowInComponent:0]];
NSString *message = [[NSString alloc] initWithFormat: @"%@", activity];
[contents addObject:message];

//読み込んで追加=========================
NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arr;
NSMutableArray *mArr;
arr = [_userDefaults arrayForKey:@"datacontent"]; //読み込み
mArr = [NSMutableArray arrayWithArray:arr];
[mArr addObject:message];
arr = mArr;
[_userDefaults setObject:arr forKey:@"datacontent"];
[_userDefaults synchronize];
//読み込んで追加=========================

//[contents addObject:datatitle];
[self.categoryTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
  withRowAnimation:UITableViewRowAnimationTop];
// ここに何かの処理を記述する
// (引数の button には呼び出し元のUIButtonオブジェクトが引き渡されてきます)
self.picker.hidden = YES;
self.donebtn.hidden = YES;
self.doneview.hidden = YES;
}

- (void)dealloc {
    [super dealloc];
[contents release];
}

@end
-------


ほんとに長いですね。
今回は、『NSUserDefaultsを使って、簡単なデータを保存する』がテーマなので、
ココをじっくり説明したいと思います。



1、まずはビューを開いたときに、以前登録してあるデータがあるか参照します。
- (void)viewDidLoadのところですね。
2、登録したデータがなかったら、データを用意して保存します。


//NSUserDefaultsを使うために初期設定をします。
NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults];
//arrayForKeyで指定したキーで以前のデータを呼び出します。
NSArray *array;
array = [_userDefaults arrayForKey:@"datacontent"];


if (array) {
//ファイルがあった場合は、呼び出したデータを
//テーブルに表示させるためのNSMutableArrayに読み込みます。
//NSMutableArrayにNSArrayの情報をいれるには、mutableCopyを使います。
contents =  [array mutableCopy];

else {

//ファイルがなかったら、arrayforkeyでファイルを作成、保存します。
//最初からテーブルに表示させるデータをcontentsに用意します。
contents = [[NSMutableArray allocinitWithObjects:@"aa",@"a"@"b"@"c"nil];

//contentsの中身を保存させるために、arrayに代入します。
//NSUserDefaultsは、NSMutableArrayのデータを保持することが出来ないので。。
NSArray *array = contents;

//どのキーで保存するかを指定します。
[_userDefaults setObject:array forKey:@"datacontent"];
//データを上書き保存します。
[_userDefaults synchronize];
}




3、追加した情報を同じキーで上書き保存します。
左下の追加ボタンで情報を追加した際にデータが上書きされる様に設定します。



//まずはデータを読み込みます。
NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arr;
NSMutableArray *mArr;
arr = [_userDefaults arrayForKey:@"datacontent"]; 
mArr = [NSMutableArray arrayWithArray:arr];

//追加する情報をaddObjectで追加します。
[mArr addObject:message];
arr = mArr;

//同じキーを指定して上書き保存します。
[_userDefaults setObject:arr forKey:@"datacontent"];
[_userDefaults synchronize];


4、削除した情報を同じキーで上書き保存します。



//まずはデータを読み込みます。
NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arr;
arr = [_userDefaults arrayForKey:@"datacontent"]; //読み込み

//現在の情報を上書きするために配列に代入します。
arr = contents;

//キーを指定して上書き保存します。
[_userDefaults setObject:arr forKey:@"datacontent"];
[_userDefaults synchronize];


これで保存することが出来ました!
ぜひおためし下さい。

2012年6月12日火曜日

IEでもCSSだけでグラデーションにする方法

IEでもCSSだけでグラデーションを実現する方法をご紹介します。


----



background-color:#ffffff;
/* For WebKit (Safari, Google Chrome etc) */
background: -webkit-gradient(linear, left top, left bottom, from(#f3efe2), to(#ffffff));
/* For Mozilla/Gecko (Firefox etc) */
background: -moz-linear-gradient(top, #f3efe2, #ffffff);
/* For Internet Explorer 5.5 - 7 */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#f3efe2, endColorstr=#ffffff);
/* For Internet Explorer 8 */
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#f3efe2, endColorstr=#ffffff)";




----

上記のスタイルで、
fromやstartColorstrで指定している色から、
toやendColorstrで指定している色までの
グラデーションを実現できます。


2012年6月8日金曜日

【facebookのjavascriptSDK】FB.api('/me/feed') で投稿するmessage部分に改行を入れる方法

投稿時に改行を入れる際は、「\n」を入れることで改行させることが出来ます。

------


FB.api('/me/feed', 'post',
    {
        picture : "表示させたい画像のURLを指定", 
    message : "テキスト\n テキストテキスト\n テキスト\n  ",
    link :  "https://apps.facebook.com/xxxxxxxxxxxx/", 
        name : " リンク先のページの名前 ",
    caption : "キャプション",
     description : "テキスト"
    }

------

【javascript SDK 】facebookから日本語の名前を取得する方法

facebookアプリを作成していて、
ユーザーの名前を取得する際、特に何も指定しない場合は、
ローマ字の名前が取得されてしまいます。

もし、日本語の名前を取得したい場合は、
以下のようにロケールを指定することで、
日本語の名前を取得できます。

(もし、ローマ字と日本語両方取得したい場合は、2回呼び出しを行う必要があります。
一回では両方の名前を取得することが出来ません。)


------


FB.api('/me&locale=ja_JP', function (resp) {
      var user_name = resp.name;
});


------

meの後に、日本語で取得するために、
ロケールを追加します。

これで日本語の名前を取得することが出来ます!

2012年6月7日木曜日

PHPでのベーシック認証(HTTP認証)の作り方(初心者向け!)

今日はPHPで作るベーシック認証の作り方です。
サイトを開いたときに、特定の人にしか見せたく無いフォルダに
パスワードをかけて、一般の人には非公開にする方法です。















パスワードをかけたページを開こうとすると、
こんな認証画面を開き、ユーザー名とパスワードを入れないと
ページが表示されません。

そんな設定をするには、
.htpasswdと.htaccessの二つのファイルを作り、
パスワードをかけたいフォルダにアップします。


1、.htaccessの作り方


まずは、スタート⇒すべてのプログラム⇒アクセサリ⇒メモ帳
を開きます。

メモ帳を開いたら、以下のコードを記入します。

-----


AuthType Basic
AuthName "任意のコメントを記入してください"
AuthUserFile /フォルダのフルパス/.htpasswd
require valid-user


-----

上記の4行を書いたら .htaccessという名前で保存をします。
※「 . 」から始まるファイルはテキストデータでは保存が出来ないので、
全てのファイルを選択してください。










私は、ここのフォルダのフルパスでかなりつまづきました、、
通常は、ファイルをアップしている以下の画像の部分(/form/.htpasswd)の
パスで大丈夫なのですが、私が使っているロリポップのサーバーは、
かなり特殊で、ロリポップにログインしないとフルパスを確認することが
出来ませんでした。


























ロリポップにログインしたら、フルパスって書いてありました。
~web/form/.htpasswdって指定したら、うまくいきました!



2、 .htpasswdの作り方


.htpasswdを作るのは、色んなサービスがあるので、
そこのサービスを利用して作るのが一番簡単で便利だと思います。

私は下記のサイトで作りました、笑
htpasswd用パス作成ツール


IDとパスワードを入れると、
test:a7ju3AHRtxQ8E


こんな感じのテキストが出てくるので、
この行をコピペして、 .htaccessと同じように、
.htpasswdファイルを作成します。
(今回はID:test  パスワード:testと入力しました)

このとき、余分な改行などが入らないようにしてください。



3、アップロード!


ファイルが二つできたら、
それをパスワードのかけたいフォルダにアップしましょう!

今回は
/formにファイルをアップしたので、
/formのフォルダに入っているHTMLファイルはパスワードを
入力しないと見れません。


ぜひぜひお試し下さい!






PHPでテキストファイルを変数に入れて表示させる方法

$file = '../include/data.txt';  //←読み込むファイルを指定します
$text = file_get_contents($file);  //←ファイルの中身をtext変数に代入します。
$text = htmlspecialchars($text);  //←読み込んだファイルを表示します。


※htmlspecialcharsは特殊文字をHTMLエンティティに変換します。
例)

●&  は  「 &amp; 」  に変換します。
●ENT_NOQUOTES が設定されていない場合、 '"' (ダブルクォート) は '"'に変換します。
●ENT_QUOTES が設定されている場合のみ、 ''' (シングルクオート) は '''に変換します。
●> は 「 &lt; 」 に変換
●< は 「 &gt; 」 に変換



--------


<!DOCTYPE html>

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>テスト</title>
  </head>
  <body>
    <?php
    $file = '../include/data.txt';
    $text = file_get_contents($file);
    $text = htmlspecialchars($text);
    ?>
    <textarea name="text" id="text" cols="50" rows="10"><?php echo($text); ?></textarea>
  </body>
</html>


--------

2012年6月6日水曜日

PHPフォームでのクロスサイトスクリプティング対策!コードの < や > を禁止する!

PHPでフォームを作っていると、
コードなどを仕込まれてサイトに悪影響が出てしまうことがあります。

なので、フォームを作る際は、
コードに必要な < や > はきちんと処理をしてから投稿されるように、
クロスサイトスクリプティングの対策をしましょう。


-------


$XXXX = htmlspecialchars($_SESSION[" XXXX "],ENT_QUOTES);

-------



こんな風に、htmlspecialcharsを付け加えるだけで、
< や > を &lt; や &gt; に変換して投稿してくれます。

PHPのフォームで 「 " 」マークに必ず 「 \  」円マークが入ってしまうときの対処法

PHPのフォームを作成しているときに、
 「 " 」マークに必ず 「 \  」円マークが入ってしまうときの対処法をご紹介します。


まずは、自身のPHPがどんな設定になっているかを確認します。


--------

<? phpinfo(); ?>

--------


を使って、現在のPHPがどんな設定になっているかを確認してみましょう。
magic_quotes_gpcがOnの設定になっている場合は、.htaccessに

--------

php_flag magic_quotes_gpc Off

--------


を設定してあげれば解消します。
ただ、サーバーによっては、.htaccessをいじれないものも、、


そんなときは以下のコードで対処しましょう。


--------


// magic_quotes_gpc = On の場合の対策
if (get_magic_quotes_gpc()) {
 function strip_magic_quotes_slashes($arr)
 {
   return is_array($arr) ?
     array_map('strip_magic_quotes_slashes', $arr) :
     stripslashes($arr);
 }


 $_GET     = strip_magic_quotes_slashes($_GET);
 $_POST    = strip_magic_quotes_slashes($_POST);
 $_REQUEST = strip_magic_quotes_slashes($_REQUEST);
 $_COOKIE  = strip_magic_quotes_slashes($_COOKIE);
}


--------




こちらでPHPのフォームで 「 " 」マークに
「 \  」円マークが入らなくすることが出来ます◎

スマートフォンサイトのソースコードを見る方法!iphoneでサイトのソースコードを見る方法

スマートフォンサイトってパソコンみたいにソースコードを見る場所が
ないのですが、今回紹介する方法では、
簡単にスマホでソースコードを見れちゃいます!


1、まずは、ソースを見たいサイトをスマホで開きます。

2、以下のjsコードをアドレスの所にコピペで貼り付けます。
※ソースコードの貼り付けは、ソースを見たいサイトのURLの後にくっつけるのではなく、
 全部書き換えて下さい!

--------

javascript:d=document;c=d.charset%7C%7C0;i=0;o=d.documentElement;d.write("<pre>"+(o.outerHTML%7C%7Co.innerHTML).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")+"</pre>");c?d.charset=c:0;void(document.close());

--------




googleサイトでの例


























1、https://www.google.co.jp/ を開く
2、アドレスの部分を、 javascriptのコードに変える




【○こっちが正解】
https://www.google.co.jp/ 

javascript:d=document;c=d.charset%7C%7C0;i=0;o=d.documentElement;d.write("<pre>"+(o.outerHTML%7C%7Co.innerHTML).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")+"</pre>");c?d.charset=c:0;void(document.close());



【×こっちは間違い】
https://www.google.co.jp/ 

https://www.google.co.jp/javascript:d=document;c=d.charset%7C%7C0;i=0;o=d.documentElement;d.write("<pre>"+(o.outerHTML%7C%7Co.innerHTML).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")+"</pre>");c?d.charset=c:0;void(document.close());

2012年6月3日日曜日

UITableViewのcellの中身を取得する方法!iphoneアプリの作り方


UITableViewのcell内のテキスト部分を取得する方法は以下の方法。

NSString *message = [contents objectAtIndex:indexPath.row];

1、NSStringで文字列を取得するための箱を用意
2、objectAtIndex:indexPath.rowで選択している項目のテキスト部分を取得する

objectAtIndexはUITableViewには使えないので、
UITableViewに表示させている項目の配列(ここではcontents)を指定して、
タイトルを取得します。

UITableViewが編集中かどうかを判断する方法!iphoneアプリ開発


UITableViewが編集中かどうかで、ボタンの表示を変えたり、
表示内容を変更するには、editingを使用します。


---------

// 編集モードがオフの場合は、ボタンのタイトルを完了に。
//編集モードをYESにする
if(self.categoryTableView.editing == NO) {
[self.categoryTableView setEditing:YES animated:YES];
sakujyobtn.title = @"完了";

//編集モードがオンの場合は、ボタンのタイトルを削除に。
//編集モードをNOにする
} else if(self.categoryTableView.editing == YES)  {
[self.categoryTableView setEditing:NO animated:YES];
sakujyobtn.title = @"削除";
}

---------


UIPickerViewで選択したtitleを表示させる方法!iphoneアプリの作りかた(objective-c)

















UIPickerViewで、選択した行のテキストを
表示させる方法をご紹介します。

上の画像でいうと、
11111
222222
などを選択したら、その数字を表示させる方法をご紹介します。

まずは、UIPickerViewを表示させるため、
.hファイルにUIPickerViewDelegate,UIPickerViewDataSourceの
デリゲートを追加し、UIPickerViewを用意します。

そして、UIPickerViewにテキストを表示させるため、
NSMutableArrayを用意します。

【.hファイルの中身】
-----

#import <UIKit/UIKit.h>

@interface XXXX : UIViewController<UIPickerViewDelegate,UIPickerViewDataSource> {
NSMutableArray *activities;
UIPickerView *picker;
}

@end
------


次は.mのファイルの方です。
【.mのファイルの中身】
1、表示させるテキストを指定します。
------
- (void)viewDidLoad {
    [super viewDidLoad];

    activities = [[NSMutableArray alloc] initWithObjects:
    @"11111"
    @"222222"
    @"33333"
    @"4444"
    nil];
}

------

2、今回は、列の数が1つなので、return 1を指定します。
------
//設定する列の数をreturnで返します。
- (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}
-------

3、次は列の中の行数を指定します。(0から始まるので、注意しましょう。)
今回は、activitiesで指定したテキストの数を数えて、その分だけ表示させています。
-------
- (NSInteger) pickerView: (UIPickerView*)pView
  numberOfRowsInComponent:(NSInteger) component {
  return [activities count];
}
-------

4、列(componentの値)、行(rowの値)に対する表示するものを設定します
ここもactivitiesで指定したテキストを数えて、その分だけのテキストを表示します。
------
- (NSString*)pickerView: (UIPickerView*)pView
   titleForRow:(NSInteger) row forComponent:(NSInteger)component {
   return [activities objectAtIndex:row];
}
-------

5、選択したテキストを表示させるアクションを指定します。
(今回はUIViewPickerの右上にある完了ボタンに以下のアクションを指定しました。)
-------
// 完了ボタンに、以下のメソッドを結びつけます。
-(void)done:(UIButton*)button{
   NSIndexPath* indexPath = [NSIndexPath indexPathForRow:contents.count   inSection:0];

//選択した行のテキストをmessageに代入します。
NSString *activity = [activities objectAtIndex: [picker selectedRowInComponent:0]];
NSString *message = [[NSString alloc] initWithFormat: @"%@", activity];

//選択した行のテキストをアラートで表示させています。
//messageに代入されているので、messageを表示させれば大丈夫です。
UIAlertView* alert = [[[UIAlertView alloc] init] autorelease];
alert.message = message;
[alert addButtonWithTitle:@"OK"];
[alert show];


}

-------

ぜひお試しくださいー◎