Objective-CでCSVをプロパティリストに変換する方法
珍しく2日連続で投稿w
昨日、Cocoa勉強会関西ビギナーズに参加してきました。
おまえビギナーだったんかいって突っ込まれそうですが、いつも心は初心者です。( ー`дー´)キリッ
それは冗談で、難しいことは教えられないですが、
初心者の方に教える力はありますので、参加させていただいております。(⌒〜⌒)ニンマリ
それで、その時に、CSVやXMLからplist(プロパティリスト)に変換する方法はないかと聞かれました。
そもそも、plistは、XML形式になっていています。
詳しくは、
Property List Programming Guide: Introduction to Property Lists
を参照してください。英語だけどね。。。
plistには、形式がいろいろありまして、
配列型、辞書型、文字列型、データ型、日付型、整数型、浮動小数点数型、ブーリアン型(YES/NO)があります。
今回は、配列と辞書型を変換するようにしてみます。
また、CSVは、カンマ区切りでやってみます。(ダブルコート「"」を使用したものとそうでないものとを扱います。)
ちなみに、Objective-C(NSObject)には、plistへシリアライズ化するものがあるので、簡単に変換できるようになっています。(参照)
それを使ってプログラムを書いてみます。
小さいプログラムを作るので、ちょっと冗長なところはあるかもしれませんが、
勘弁してくらはい。<m(__)m>
ソースは、自由に使ってかまいませんが、
出来れば、Webサイトの紹介をしていただければありがたいです。<(_ _)>
まずは、単なるカンマ区切りのCSVを変化するプログラム
単に、1行ずつ読み込んで
行を「,」で分割して順番に辞書にほりこんでいきます。
そしてそれを配列に突っ込んで、後はシリアライズ化!!
どう?かんたんでしょ?
でもこれだと、カンマが入った文章中にのCSVだと、少々難しくなるので、
正規表現でカンマの位置を取得して、
順番にカンマ位置までのワードを取り出していき、「"」がついていたらトリムするようにしてます。
こんな感じですね。
後者のテストデータと実行後の出力データをのしておきます。
test.csv
-----------------------------------
test1,test2,test3,test4,test5
あ,い,う,え,お
か,き,く,け,こ
"さ","し","す","せ,","そ"
た,ち,つ,て,と
-----------------------------------
test.plist
ちょいと、後者は難しかったかもしれないなぁ。。。。
Sublime TextでObjective-Cのプチコンパイル
ひっさしぶりに投稿!! (。・_・。)ノ
Objective-Cでの開発をしているときに、数学的なロジックを作成するのに、
簡単なコンパイルが欲しいときがあります。
エディタをちょっと変更したいなぁ〜って思うときありませんか?
え?「ない」って?(; ̄ー ̄A アセアセ・・・
いやあるでしょ?(; ̄ー ̄A アセアセ・・・
「だから、ない」って?(; ̄ー ̄A アセアセ・・・
そういう人は無視して紹介します。ヽ( ゜ 3゜)ノ
途中からメニュー画面が日本語化され色が変わりますが、
ご愛敬で・・・・・(; ̄ー ̄A アセアセ・・・
こんな時は、今までCodeRunnerと言うソフトを使ってました。
まぁ、これでできますよぉ〜っなんですが、
いつも使ってるエディタでコンパイルがしたかったので、
Sublime Textでコンパイルできるようにしました♪ d(⌒o⌒)b♪
ちなみに、コマンドラインでは、
clang -g -x objective-c -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings [ターゲットファイル] -framework Foundation -o [アプリ名]
っと書きます。
これをsublimeのBuildSystemに書き込むだけ。
Sublime Textを開いて。
メニューバーから「Tools」をプルダウンします。
BuildSystemから・・・
New Build System...を選ぶ。
そうするとファイルが表示されます。
それを下のコマンドを入力する。
=========================
{ "cmd": ["clang" , "-g" ,"-x" ,"objective-c" ,"-fmessage-length=0" ,"-std=gnu99" ,"-fobjc-arc" ,"-Wno-trigraphs", "-fpascal-strings" , "${file}" , "-framework Foundation" , "-o", "${file_base_name}"], "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", "working_dir": "${file_path}", "selector": "source.c", "variants": [ { "name": "Run", "cmd": ["bash", "-c", "clang -g -x objective-c -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings '${file}' -framework Foundation -o '${file_base_name}' && '${file_path}/${file_base_name}'"] } ] }
=========================
こんな風に。。。
んで、保存。[コマンド+S]で保存する場所が出てくるので
名前を変えて、パスはそのままで保存!!
すると新しくメニューに追加されます。
これでしたごらえOK!!
じゃぁ、テスト!!
とりあえず、1から10まで足し算するコード。
書いたら、ビルドを選択して(自動でもいいかも)
ビルドして実行を実行する!!
こんな風に出来ます。
簡単でしょ?(˶‾᷄ꈊ‾᷅˵)
MacでRVMを違うバージョンをスクリプトで動かす方法
ようやく、まともな投稿( =̴̶̷̤̄ .̫ =̴̶̷̤̄ )
Rubyのテストのために、1.8.7を使用して、
それ以外は、2.0.0を使おうと思ったら、すっごくめんどくさい。
そこで、RVMを使用して切り替えて使うことにした!!
でも、使うときにいちいち、
> rvm 1.8.7
のように、変更しなきゃならない。
じゃぁ、これごとスクリプト化してやればいいじゃん!!(*Θ_Θ*)/
つうことで、やり方。。。。
普通にシェルにrvmを設定しても動作しないので、
gemsetを使用する。
# rvm use 1.8.7
# rvm gemset create ruby187
これでgemsetができあがったので、
# rvm env --path -- 1.8.7@ruby187
で、パスをとってみると、以下のようなパスがとれる(環境によって違うので注意)
/Users/ruby187/.rvm/environments/ruby-1.8.7-p374
これを、viエディタか何かで以下のスクリプトを作成する。
例えば、「rubyT.sh」のように。。。。
======ここから=====
#!/bin/bash
# load rvm ruby
source /Users/ruby187/.rvm/environments/ruby-1.8.7-p374
ruby $@
======ここまで=====
これの引数に、スクリプトを読み込ましてあげればOK!!
例えばこんな風にでます°₊·ˈ∗( ˃̶᷇ ‧̫ ˂̶᷆ )∗ˈ‧₊°
これで、CodeRunnerとかで簡単に使えるようになったヾ(^v^)k
参考:
http://rvm.io/integration/cron
githubのクローン( =̴̶̷̤̄ .̫ =̴̶̷̤̄ )
って思ってたら、ありました!!( =̴̶̷̤̄ .̫ =̴̶̷̤̄ )
それは、「GitBucket」です。
完全にgitHubのクローンです。
出来ることは以下の通り、
・Public / Private Gitリポジトリ (http のみ)
・Repository viewer (オンライン編集は搭載していない)
・Repository search (Code と Issuesのみ)
・Wiki
・Issues
・Fork / Pull request
・Mail notification
・Activity timeline
・User management (Administrator用)
・Group (like Organization in Github)
・LDAP integration
・Gravatarもサポート
まだまだ発展途上なところはありますが、
社内で作るには、すごっく楽じゃないかと思います。
JAVAが動いていればどこでも作れます!!すげー(゚д゚)!
あっ、エンジンとしてTomcat 7.x, Jetty 8.x, GlassFishのいずれか必要ですよぉ。
インストール方法
今回は、Tomcat7でインストールします。
システムにJAVAをインストールしておきます。
#JDK のインストール
# yum -y install java-1.7.0-openjdk
tomcatをダウンロードし、解凍。
$ wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-7/v7.0.47/bin/apache-tomcat-7.0.47.tar.gz
$ tar xzf apache-tomcat-7.0.47.tar.gz
次に今回の主人公「gitbucket.war」をダウンロード
$ wget https://github.com/takezoe/gitbucket/releases/download/1.7/gitbucket.war
ちなみに、これでダウンロードするとファイル名がおかしくなります。
例:
$ ls
95d6668e-3d95-11e3-9de6-e4a25fcf1676.war?response-content-disposition=attachment; filename=gitbucket.war&AWSAccessKeyId=AKIAISTNZFOVBIJMK3TQ&Expires=1384676769&Signature=Xwp9Ak4FllbN8kZhPTmosHwxluM=
これをmvで「gitbucket.war」にリネームし、「webapps」に移動する。
$ mv gitbucket.war apache-tomcat-7.0.47/webapps/
あとは、tomcatを起動するだけ!!
$ apache-tomcat-7.0.47/bin/startup.sh
そうすると、以下のサイトから起動することができます。
http://localhost8080/gitbucket/
こんなかんじ!!gitHubににてるでしょ!!
これからも期待できますよね。♪ d(⌒o⌒)b♪
あっ、止める場合は以下を実施します。
$ apache-tomcat-7.0.47/bin/shutdown.sh
*1:(・・ )( ・・)
VagrantでVMWareFusionを使う方法
これから、Systemの手順書を文章ではなくてスクリプトで各時代が来ましたねぇ。
VagrantでVMWareFusionが使用出来るので、
とりあえずメモとしてインスコ方法を書いときます。y( ̄ー ̄)yピースピース
いつもの通りええかげん手順書を見て下さいw
1)Vagrantのインストール
Vagrantから本体をダウンロードしてインストール。
これ出来ない人は、Macを使わないでw(冗談です)
一応確認、バージョンの確認
$ vagrant -v
Vagrant version 1.2.2
2) VmwareFusion用のプラグインをインストール
$ vagrant plugin install vagrant-vmware-fusion
このプラグインは有料です。ここから購入して下さい。
購入したら、ライセンスファイルが送られてくるので、
それを読み込ませます。
vagrant-vmware-fusion ライセンスの設定
$ vagrant plugin license vagrant-vmware-fusion license.lic
以下のコマンドをたたきます。
(Boxのバージョンが上がっているかもしれないのでここで確認)
$ vagrant box add centos https://dl.dropbox.com/u/5721940/vagrant-boxes/vagrant-centos-6.4-x86_64-vmware_fusion.box --provider vmware_fusion
4)Vagrantfileを作る
$ vagrant ini
上のコマンドで自動的に作られるのですが、内容を以下のように作っちゃいました。
$ vim Vagrantfile
--------------------------------------------
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "centos"
config.vm.box_url = "https://dl.dropbox.com/u/5721940/vagrant-boxes/vagrant-centos-6.4-x86_64-vmware_fusion.box"
# config.vm.network :forwarded_port, guest: 80, host: 8080
#config.vm.network :private_network, ip: "192.168.33.10"
# config.vm.network :public_network
# config.ssh.forward_agent = true
# config.vm.synced_folder "../data", "/vagrant_data"
config.vm.provider :vmware_fusion do |vb|
# Don't boot with headless mode
vb.customize ["modifyvm", :id, "--provider", "vmware_fusion", "--memory", "1024"]
end
end
--------------------------------------------
たぶん以上で、出来ちゃいます。
vmwareを使用可能にしておかなければ動作しないようで、
以下のコマンドをたたきパスワードを入れる。
$ vagrant up --provider=vmware_fusion
>> パスワードが聞かれるのでシステムのパスワードを入れる。
これで、次回からは「vagrant up」で起動出来ます。
通常
$ vagrant up
お試しあれぇ〜!! ( ^ω^ )ニコニコ
※ 結局、まだ、プラグインが少ないし、資料があまりないのでVirtualBoxを使用することにしますね。
UIAlertViewで同期する方法
ひさびさの投稿。でも、あくまでもメモっす。°₊·ˈ∗( ˃̶᷇ ‧̫ ˂̶᷆ )∗ˈ‧₊°
UIAlertViewって、デリゲートを使用するので
同期とれないですよね。
そこで、クラスをつくり、中でBlocksを使用して、そのまま返すって方法です。
文字では伝わらないんでソースでみてくんろぉ〜ヽ( ゜ 3゜)ノ
CustomAlertView.h
#import <Foundation/Foundation.h>
typedef void (^didDismissBlocksType)(NSInteger buttonIndex);
@interface CustomAlertView : UIAlertView <UIAlertViewDelegate>
- (id)initWithTitle:(NSString *)title
message:(NSString *)message
didDismissBlocks:(didDismissBlocksType)didDismissBlocks
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION;
@end
CustomAlertView.m
#import "CustomAlertView.h"
@interface CustomAlertView()
{
didDismissBlocksType didDismissBlocks;
}
@end
@implementation CustomAlertView
- (id)initWithTitle:(NSString *)title
message:(NSString *)message
didDismissBlocks:(didDismissBlocksType)didDismiss
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION
{
self = [super init];
if (self) {
self.delegate = self;
}
self.title = title;
self.message=message;
didDismissBlocks = didDismiss;
va_list arguments;
va_start(arguments, otherButtonTitles);
NSString* value = otherButtonTitles;
// 可変長引数が nil になるまで繰り返す
while (value)
{
[self addButtonWithTitle:value];
// 次の引数を取得
value = va_arg(arguments, typeof(NSString*));
}
// 最後に可変長引数の扱いが終わったことを va_end 関数を使って伝えます。
va_end(arguments);
[self addButtonWithTitle:cancelButtonTitle];
return self;
}
//アラートが消えてから呼ばれる
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
if(didDismissBlocks != nil)
{
didDismissBlocks(buttonIndex);
}
}
@end
使い方。
CustomAlertView *alertView
= [[CustomAlertView alloc] initWithTitle:@"aaaa"
message:@"Message"
didDismissBlocks:^(NSInteger buttonIndex){
switch (buttonIndex) {
case 0:
//1番目のボタンが押されたときの処理を記述する
NSLog(@"test2Action:ほえほえ1");
break;
case 1:
//2番目のボタンが押されたときの処理を記述する
NSLog(@"test2Action:ほえほえ2");
break;
}
}
cancelButtonTitle:@"キャンセル"
otherButtonTitles:@"ボタン1" ,@"ボタン2",@"ボタン3" ,nil
];
[alertView show];
動作は、自分らで確かめて下さいw
適当にコピペだから文字の大きさ色がぐちゃぐちゃ。あーあ(・_・、)グスン
まぁ、私のブログはこんなもんです。。。。。。
NSDataを16進数の文字列に出力する関数
久しぶりに投稿。
NSDataを16進数の文字列に出力する関数。(ARC用)
- (NSString*) serializeDeviceToken:(NSData*) deviceToken
{
NSMutableString *str = [NSMutableStringstringWithCapacity:64];
int length = [deviceToken length];
char *bytes = malloc(sizeof(char) * length);
[deviceToken getBytes:bytes length:length];
for (int i = 0; i < length; i++)
{
[str appendFormat:@"%02.2hhX", bytes[i]];
}
free(bytes);
return str;
}
または、NSDataのカテゴリーに追加
<NSData+Hex.h>
@interface NSData (Hex)
- (NSString*)hexString ;
@end
<NSData+Hex.m>
#import "NSData+Hex.h"
@implementation NSData (Hex)
- (NSString*)hexString {
unichar* hexChars = (unichar*)malloc(sizeof(unichar) * (self.length*2));
unsignedchar* bytes = (unsignedchar*)self.bytes;
for (NSUInteger i = 0; i < self.length; i++) {
unichar c = bytes[i] / 16;
if (c < 10) c += '0';
else c += 'a' - 10;
hexChars[i*2] = c;
c = bytes[i] % 16;
if (c < 10) c += '0';
else c += 'a' - 10;
hexChars[i*2+1] = c;
}
NSString* retVal = [[NSString alloc] initWithCharactersNoCopy:hexChars
length:self.length*2
freeWhenDone:YES];
return retVal ;
}
@end
必要だったからメモした。((φ┫ ̄Д ̄ ┣ ホォホォ