Mac環境でVagrant+VirtualBoxでハマった事[OSX 10.9.3]
実はiPhoneアプリの処女作の開発が終わり、Appleのレビューを
待っている段階まで進みました。
すんなり通ると良いなーと祈りつつ・・・(実はもう1度リジェクトされた泣)
今日からサーバーサイドの学習を進めたいと思っているので
Vagrant+VirtualBoxをMac環境下で整えていきたいと思います。
1.VirtualBox,OSのBoxをダウンロード
https://www.virtualbox.org/wiki/Downloads
2.Vagrantをダウンロード
3.VirtualBox, Vagrantをインストール
4. ターミナルを開き、vagrant box add [box名] [boxのインストール先フォルダ]コマンドを入力
5.vagrant init [box名]コマンドを打つ
6.vagrant up
で完了。
のはずが。立ち上がらない。
立ち上げ時に出るエラーが下記のもの(スクリーンショット取り忘れたのでべた貼り)
これを見ても「マシーンが立ち上がらずに電源オフだよー」と言われてるだけで
原因がさっぱり。そこでログを見てみる事に。
ちなみにログは /ユーザ名/VirtualBox VMs/VirtualBox名/Logs にあります。
ログをつらつら見ていると、下記のエラーログを発見。
00:00:00.030205 VMSetError: /Users/vbox/tinderbox/4.3-mac-rel/src/VBox/VMM/VMMR3/VM.cpp(594) int vmR3CreateU(UVM*, uint32_t, int (*)(UVM*, VM*, void*), void*); rc=VERR_SUPLIB_OWNER_NOT_ROOT
多分オーナー権限設定が間違っている?ようなログを吐いていたので、
再度ターミナルで、下記コマンドを実行してみました。
sudo chown root /Applications
それで vagrant upを再度実行。。。。動いた!!
解決するのに1週間もかかってしまいました・・・。
最初はVerの違いによるものかなーと思い、全てのファイルを最新のものに変えたりしてみたけれどもやっぱり駄目でして。
VirtualBoxがこっそりログ吐いてくれていることをもっと早く知っていれば
すぐ解決できたかもしれません。とりあえず動いてくれてよかった。
早くサーバーサイドの知識もつけたいなーと思いつつ、学習を進めたいと思います。
センス0のプログラマでもデザイン出来る!
もともとプログラムに興味を持ったのは、
陶芸家とか、手に職を持つ人に憧れつつも、自分は不器用だから向いてないなーと。
そんな事を考えながら出会ったのがプログラミング。
不器用でももの作りが出来る。そりゃ楽しいわけです。
とはいえアプリを作ってて一番困るのがアイコン作成。
個人的にはプログラミングより厄介。センスある人はサクサク作って
しまうのでしょうけど。一方で私は、フリーソフトのGimpを使ってアイコンを作ろうとすれどもちんぷんかんぷん。何すりゃ良いのこれ状態。
そんな中出会った神サイトがこちら。
AppleのiCloudアイコンの作り方。リアルな立体感や金属の光沢を表現する
http://gimp2-how-to-use.blogspot.com/2012/02/appleicloud.html
何がすごいって言われるがままにGimpを操作してたらこんなのが出来てしまった。
「え?俺作ったの?」って感じ。自分でびっくり。
そーなったらもう私は単純で、「楽しいー!もっと使い方勉強しよ!!」
ってなってしまった。
今日初めてGimp(イラレフォトショももちろん未経験)を使いましたが、
一日勉強してこんなもんを作れるように。
FFの魔法剣ファイガをイメージしながらアイコン作成。剣じゃなくて斧なのはご愛嬌。
イラレフォトショ、Gimpはずーーっと敬遠してたけど、一度「楽しい!!」って思ってしまえば楽しく勉強できますねー。
思えばプログラミングもHelloworldなんかを作った時には何も感動しなかった。
私の場合、無限ループによって、PCがフリーズするプログラムを組んでしまった時に「あれ、これある意味ウィルスじゃね??俺ウィルスつくってしまった?」と感動したのがきっかけで、プログラミングにどっぷりはまった。
何ごとも楽しい!って思うまでが勝負ですねー。
xibを利用したカスタムセルの使い方
お久しぶりです。
今回から私の開発環境のxcodeのバージョンをタイトルに載せる事にしました。
というのも私自身、他の方々のソースコードを参考にする際、xcodeのバージョン違いで
悩まされる事があり、xcodeのバージョンが載せてあるブログに出会うと、「ありがたい!」と思う事が多々あったからです。
今日のお題はカスタムセルの使い方について。
中でも、xibを使ったカスタムセルの使い方に慣れておくと、
セル自体に様々な値を保持させる事が可能になる等、プログラミングの幅が
増えますので、覚えておいて損は無いです。
という事で作り方。
1.プロジェクトの作成
ここでは「CustomCell」と命名。さらに下の「Also create XIB file」にチェックを
入れ、プロジェクトを作成。
2.xibファイルの編集
CustomCell.xibファイルを開くとUserStoryboardに似た画面が表示されるので、
Switchをセル上に貼付ける。
※1.で説明した「Also create XIB file」にチェックを入れてなかった場合、xibファイルが作成されないので注意。
3.Assistant editorで関連付け
Assistant editor(画面右上の蝶ネクタイみたいなマーク)をクリックし、
右画面にはCustomCell.hを表示させる。
その後、下記作業を行う。
1.下記コードをCustomCell.hに記入。
@property (nonatomic, assign) NSInteger row;
2.スイッチを右クリックしながら右画面に引っぱり、
Outletを選択、NameにはmySwitchと記入し、Connect
3.スイッチを右クリックしながら右画面に引っぱり、
Actionを選択、NameにはmySwitchTapと記入
4.CustomCell.mを開き mySwitchTapメソッドの中を下記の通りに変更。
- (IBAction)mySwitchTap:(id)sender {
if(self.mySwitch.on){
NSLog(@"Switch%d is ON",self.row);
}else{
NSLog(@"Switch%d is OFF",self.row);
}
}
4.テーブルビューにカスタムセルを張り付け
1.MainStoryboardを開き。TableViewを追加。
ViewController.h
2. ViewControllerを開き、"CustomCell.h"をimportする。
次に、DataCource、Delegateを追加。
この2点は忘れがちですが、TableView使う上での決まりきったお作法です。
#import <UIKit/UIKit.h>
#import "CustomCell.h"
@interface ViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>
※ここは手書きで追加
追加したら、TableViewをAssistant editorでViewController.hに関連付け(右クリックで引っ張って名前付け)。
ViewController.hが下記ソースになっていれば正解。
#import <UIKit/UIKit.h>
#import "CustomCell.h"
@interface ViewController : UIViewController< UITableViewDataSource, UITableViewDelegate>
@property (weak, nonatomic) IBOutletUITableView *tableView;
@end
3.ViewController.mの編集
ViewControllerは下記ソースをコピーする。
#import "ViewController.h"
@interfaceViewController (){
NSArray* cellRows;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.tableView.dataSource = self;
self.tableView.delegate = self;
cellRows = @[@"cell1", @"cell2", @"cell3"];
// カスタムセルを使用
UINib *nib = [UINibnibWithNibName:@"CustomCell"bundle:nil];
[self.tableViewregisterNib:nib forCellReuseIdentifier:@"Cell"];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
returncellRows.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"
forIndexPath:indexPath];
cell.row = indexPath.row;
return cell;
}
- (void)didReceiveMemoryWarning
{
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
4.出来上がったプログラムを実行。
NSLog上にどのスイッチが"ON"or"OFF"されたのかを表示します。
セルごとに配置されているオブジェクトのデータの状態を取得するのは
少し面倒なのですが、xibファイルを使うとこんなに簡単なソースで
色んな情報を保持させる事が可能です。うーん便利。
TableViewは奥が深い。Storyboardだけで今回のような実装も出来る事は出来るのですが、ちょっと面倒でした。機会があればそちらも紹介したいと思います。
それではまた。
TableViewのセルサイズを可変にする。
今回のお題はTableViewのセルサイズを可変にする方法について。
TableViewのセルサイズを可変にするには下記コードを加えるのみ
-(CGFloat) tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {
UITableViewCell *cell = (UITableViewCell*)[self tableView:self.myTableView cellForRowAtIndexPath:indexPath];
return cell.frame.size.height;
}
これを行うと、各々のセルサイズを可変にできるので、画面上部に背景画像を表示し、テーブルビューのスワイプに
合わせて背景画像も移動させるなんて事も可能になります。
NSArray型のarrayには順に表示したいセルの文を入れてください。
ただし0番目には背景画像として用いているので、0番目のarrayには何も入れないようにしましょう。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil){
cell = [[UITableViewCellalloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
if(indexPath.row != 0){
cell.textLabel.text = [NSString stringWithFormat:@"%@",array[indexPath.row]];
cell.backgroundView = nil;
}
if(indexPath.row == 0){
cell.textLabel.text = nil;
UIImageView *imageView;
UIImage *image;
image = [UIImage imageNamed:@"上部に表示したい画像.JPG"];
imageView = [[UIImageView alloc] initWithImage:image];
cell.backgroundView = imageView;
cell.frame = CGRectMake(cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, 200);
}else{
cell.frame = CGRectMake(cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, 20);
cell.textLabel.text = [NSString stringWithFormat:@"%@",array[indexPath.row]];
cell.backgroundView = nil;
}
return cell;
}
ちょっとずつですが、Objective-cで作りたいものが作れるようになってきました。
昨日の続き:アスキーコード化→元のNSString文へ
昨日の記事はこちら。
「NSString型文字列をアスキーコード変換されたNSString文字として表示」
http://okogeki.hatenablog.com/entry/2014/04/27/211705
昨日の記事ではアスキーコード変換されたNSString文字として表示することまで
出来ました。
後はまたこれを元の文字列に戻すソース部分です。
ソースは下記の通り。
NSString *ascii = @"546573742e4f6b6f67656b69";
NSString *removedtext;
NSString *c;
NSScanner *scan;
NSString *result = @"";
unsignedint i_c;
for(int i=0; (![ascii isEqual:@""]);i++){
c = [ascii substringToIndex:2];
scan = [NSScanner scannerWithString:c];
removedtext = [ascii substringFromIndex:2];
ascii = removedtext;
[scan scanHexInt:&i_c];
result = [NSString stringWithFormat:@"%@%c",result,i_c];
}
NSLog(@"%@",result);
処理の流れは簡単で、2文字ずつ元の文から区切り、16進数としてint型として読み込み、それを%cと表示してNSStringに突っ込んで終わり。
処理は簡単ですけど、意外と行数が多くなってしまったと反省。
もう少し短く書けそうな気もするのですが、今のところ思いついてません。
NSString型文字列をアスキーコード変換されたNSString型文字として表示
更新が少し遅れました。実は、ついにセブ生活で体調を崩してしまい、1日だけ入院してしまいました。その前からずっと具合が悪かったのですがガタが来ました。。。
ようやく体調も万全になりましたので、これからはエンジニアらしくコーディングで
悩んだところを書きながら皆さんに知識共有でも出来たらなと思います。
あいかわらずiBeaconに興味を持ちながら、作るべくアプリの
アイディアを考えています。
iBeaconでキモになりそうなのが、UUID,major,minorという3つの識別子。
識別子はどれも16進数により表記されています。
「16進数で表記されているということは、簡単な文字情報をビーコンから送る事もできるじゃないかっ」と思ったので、色々アプリを作る時にいじくりまわせるように、
必要な知識を学習しました。
まずはアスキーコード表記での文字のみ(日本語(2バイト文字)等は含まない)ことを前提とした変換コードの紹介。
今回書いたコードは下記の通り。Cならサクッっとコードが書けそうなのですが、
Objective-Cはやはりまだ慣れず、少し思いつくのに時間がまだまだかかります。
それでも少ないライン数で書けたので、個人的には満足。
ラベルには「Test.Okozeki」をそのまま表示テキストビューには「Test.Okozeki」のアスキーコードをそのまま画面に載せています。
NSString* str = @"Test.Okogeki";
NSString* tempstr = @"";
NSString* str2 = @"";
for(int i=0;i < str.length;i++){
tempstr = [NSString stringWithFormat:@"%x",[str characterAtIndex:i]];
str2 = [NSStringstringWithFormat:@"%@%@",str2,tempstr];
}
self.myLabel.text = str;
self.myTextView.text = [NSString stringWithFormat:@"%@",str2];
無事動きました。これで文字を16進数値としてUUID,major,minorに組み込めそうです。後はこれをまた逆変換して文字化すれば、何か有効に使えそうですね。
おまけ
2バイト文字を16進数値化する方法もご紹介します。
が、iBeaconの仕様上、UUID,major,minorをすべて含めても160bitしか長さが無いので、2バイト文字を含めて活用するのは現実的では無いな・・・と考えています。
ちなみに2バイト文字の場合はこんな感じ(UTF8の場合)
NSString *str = @"こんにちわ";
unichar *uchr = (unichar*)[str cStringUsingEncoding:NSUTF8StringEncoding];
この書き方が分かるまでに1時間かかりました・・・。
最初はNSData型に変換して、Byte型に変換してそれからそれから。。。等と
考えてましたが、これでいけるじゃん!というわけで思いつけば簡単。
次回はアスキーコードを文字として復元する部分について記事を書きたいと思います。
セブでの連休
セブでは4/17〜20と4連休(ホーリーウィーク)でした。
4/17と18はダイビングライセンスの取得をしていました。
土日はジプニー(セブの共用バス的な乗り物)だけを使って
各地を色々放浪しながら歩き回っていました。
セブの日本人は大体タクシーを使う(初乗り40ペソと格安)らしく、
ジプニーに乗り込む事は割と珍しいみたいですね。
私はもっぱらジプニーばかり使ってます(だってルート内ならどこまで行っても
8ペソなんですもの)。
マクタンを散策してみたかったので、ITパークを
出発し、ジプニーを3回ほど乗り換え、マクタンへ到着。
そこからはずーーーーっと徒歩で散策してみました。
徒歩でしか分からない事ってたくさんあるんですよね。
私自身、セブに行く前は、セブといえば「The リゾート地!」みたいなイメージを持っていました。
実際には奇麗に整備された場所は極わずかで、貧困差の激しい場所であることに
すぐ理解できます。
例えばこの写真を見てください。
何か気づく点はあるでしょうか。
この倍率だと分かりにくいですが、左はマクドナルド、奇麗に整備された噴水、
リゾートホテル等に行く道で、右の縦に伸びている道は、いわゆるローカル道です。
左側の道路は奇麗に整備されてますね。では右側はどうでしょうか。
右側の道路で撮った写真をお見せします。
歩道が無い。水も溜まってガタガタ。すげー歩きにくい。歩行者が居ても車は減速せずビュンビュン走ってます。写真はまだ砂利道がありますが、何も無いとこでは
高速に走る車のすぐ横を写真くらいの女の子が普通に歩いてます。実際自分も歩いてみるとめっちゃ怖い。
でも道路だけはきちんと整備されていて、とても奇麗。「この差はなんなんだろう・・・」と思いながらずーっと散策してました。
途中でお腹が空いたので、近くのローカルちっくなレストランで
ご飯を食べているとて声かけられました。
セブの方「アニョンハセヨー!」
俺 「I'm Japanese」
セブの方「あらやだごめんなさい」
的なやり取りをした後少しだけ雑談。俺が「歩道とかめっちゃガタガタで歩きにくいっすねー。道路はこの辺結構奇麗ですけど」と言ったら
「この辺は車持ちが多いからね。車持ち=富裕層って事なの。富裕層のおかげで経済が成り立ってるから多分色々優先されてるのよ」
的な事を教えてくれました(俺のつたない英語理解力が合ってればですけど)。
「整備格差はそういう事だったのね。なるほど。」と思いながら
帰路へ。また、この事に関して特に可哀想だとか、なんとかしなきゃ!って気持ちは全く起きず。「そりゃあ、資本主義だもん。富裕層は大事よね」と思ったのが正直な気持ち。「血も涙もねーな!」って思われるかもしれないけど、世の中そんなもんじゃないかなーと。代わりに「貧困層を上手く中間層まで引き上げられた時には大きなビジネスチャンスがいっぱい転がってそう」とは思いました。特に娯楽系のビジネスは介入の余地がたくさんあると思います(それくらいセブにはアクティビティが少ない)。
やっぱ見知らぬ土地を徒歩で散策するのは面白い。車で通り過ぎるより色々発見がある。今日で連休は終わり。明日からまたエンジニア修行に励みます。それではまた。