iOS7でLINEで画像共有する方法

LINEで画像共有するのは、なぜかiOS7では非対応になっている。
ドキュメントはこちら。技術仕様>書式2
http://media.line.me/howto/ja/

んで、どうにかiOS7で画像共有させたいと思ってたら、送れる方法を見つけた。
iOS7でも画像をLINEで送れるようにする方法
http://www.appstars.jp/archive/75

が、この方法でもうまくいかず。。。

四苦八苦していたら、@koogawa さんが、教えてくれた。
なんとJPEGはダメで、PNGならいけるということだった。

コードをここに残しておく。

- (void)shareImageViaLine:(UIImage *)image
{
    UIPasteboard *pasteboard =  [UIPasteboard generalPasteboard];
    //[pasteboard setData:UIImageJPEGRepresentation(image, 1.0) forPasteboardType:@"public.jpeg"];
    //→JPEGではできない模様 PNGならOK。
    [pasteboard setData:UIImagePNGRepresentation(image) forPasteboardType:@"public.png"];
    //PNGで!!!
    
    NSString *urlString = [NSString stringWithFormat:@"line://msg/image/%@",pasteboard.name];
    NSURL *url = [NSURL URLWithString:urlString];    
    [[UIApplication sharedApplication] openURL:url];
}

gist
https://gist.github.com/osmszk/9718995

※注意事項:この方法は非公式なので、いつ送れないようになるかわかりません。

Mac環境で指定の位置から画像の切り取りをしたかったので、ImageMagickをダウンロードした

Mac環境で指定の位置から画像の切り取りをしたかったので、ImageMagickをダウンロードした。
そのログを残しておく。

###

ImageMagickは、画像編集ツール。コマンドラインで指定の位置から画像の切り取り(トリミング)ができるらしい。
ということなので、ダウンロードしてみる。

環境は、Mac OS10.8.5
X11.app(XQuartz)はすでにインストール済み。(後ほどインストールされていなかったことが判明w)

Cactuslab · ImageMagick installer for Mac OS X
の「ImageMagick 6.8.7-2 for Mac OS X 10.5 – 10.9Requires XQuartz. (7.7 MB)」
をダウンロードし、インストール。

んで、ターミナルをひらき、
$ which convert
/opt/ImageMagick/bin/convert

いたいた。
/opt/にインストールされた。

さっそくためしに。切り取りをためしてみた。
$ convert -crop 140x469+95+14 test.png new.png
が、、、

dyld: Library not loaded: /opt/X11/lib/libfreetype.6.dylib
Referenced from: /opt/ImageMagick/bin/convert
Reason: image not found
Trace/BPT trap: 5

と怒られ、実行できず。
/opt以下に/X11 がいる前提なのか。。。ということで、シンボリックリンクを貼る。

$ sudo ln -s /usr/X11 /opt/X11

んで、再度、チャレンジ。
$ convert -crop 140x469+95+14 test.png new.png

が、、、

dyld: Library not loaded: /opt/X11/lib/libfontconfig.1.dylib
Referenced from: /opt/ImageMagick/bin/convert
Reason: Incompatible library version: convert requires version 8.0.0 or later, but libfontconfig.1.dylib provides version 6.0.0
Trace/BPT trap: 5

また怒られた。
libfontconfig.1.dylibがあるのだけど、バージョンが古いだとぅぅ!?

がーん。SpotlightでX11.app をひらいてアップデートしようとしたら、
X11 はもうOS Xに付属してません。 インストールしますか?」と。XQuartzインストールされてなかったんだな。。。
MacOS10.7 時代は結構つかってたんで、てっきりインストールされていると思っていた。
というわけで、
XQuartz
からインストール。XQuartzのバージョンは2.7.5 だった。

んで、
$ cd /opt/
$ ls -la
total 0
drwxr-xr-x@ 5 root admin 170 12 2 03:09 .
drwxr-xr-x 34 root wheel 1224 12 1 15:45 ..
drwxr-xr-x 7 root wheel 238 10 24 08:14 ImageMagick
drwxr-xr-x 8 root wheel 272 11 4 01:53 X11
drwxr-xr-x 11 root admin 374 10 22 2011 local

いましたよ、X11 が、/opt下に。

てことで、再々チャレンジ

$cd ~/Desktop
$ convert -crop 140x469+95+14 test.png new.png

で、できた。
test.png 画像を、(x,y) = (95,14)の位置から、幅140px 高さ469px 切り出し、new.png とする。

ほっ。

参考:
ImageMagick を OSX Mountain Lion にインストールする - Qiita
ImageMagickの「crop」 一言多いプログラマーの独り言

CSVからPLISTに変換する方法

以前、PLISTからCSVに変換する方法という記事を書いた。
その記事内で、

CSVからPLISTに変換するには、つつみさんの記事(http://d.hatena.ne.jp/shu223/20110511/1305129443)の方法や、CSV2PlistというMacアプリ(http://sheepapp.com/app/CSV2Plist/)で解決できる。

と書いたが、なんだかんだ、CSVからPLISTに変換する方法も自分でObj-cで書きたくなった。

ということで、さっそくコードを。
前提条件としては、
(1)変換前のCSVの形式は、下記のようなもの。
no,name,hp,mp
0,suzuki,32,23
1,osamu,27,34
2,desu,21,45
文字コードは、自分の環境でデフォルトでShift_Jisだった。Mac Excelcsv保存すると、デフォルトShift_Jisになるはず)

(2)アプリのDocuments/ディレクトリ以下に変換したいCSVをいれといて、同じディレクトリにPLISTを吐き出す。

NSError *error;
    NSString *filePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]stringByAppendingPathComponent:@"prologue.csv"];
    NSString *text = [NSString stringWithContentsOfFile:filePath encoding:NSShiftJISStringEncoding error:&error];//NSUTF8StringEncoding
    if (error) {
        NSLog(@"error:%@",error);
    }
    
    NSMutableArray *outputArray = [NSMutableArray array];
    
    NSArray *lines = [text componentsSeparatedByString:@"\r"];// @"\n"
    
    NSString *keysStr = [lines objectAtIndex:0];
    NSArray *keys = [keysStr componentsSeparatedByString:@","];
    
    for (NSInteger i = 1;i<[lines count];i++ ) {
        NSString *itemsStr = [lines objectAtIndex:i];
        NSArray *items = [itemsStr componentsSeparatedByString:@","];
        NSMutableDictionary *content = [NSMutableDictionary dictionary];
        for (NSInteger k=0; k<[items count]; k++) {
            NSString *item = [items objectAtIndex:k];
            NSString *key = [keys objectAtIndex:k];
            [content setObject:item forKey:key];
        }
        [outputArray addObject:content];
    }
    
    NSString *fileName = @"hogehoge.plist";
    BOOL result = [outputArray writeToFile:[[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:fileName] atomically:YES];
    NSString *msg;
    if (!result) {
        msg = @"ファイルの書き込みエラー";
    }else{
        msg = @"ファイルの書き込み成功";
    }
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"" message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];

検索かけたら、
CSVをPlistに変換する - Qiita
という記事をみつけたけど、思った通りの動きをしなかったので、ちょいとアレンジした感じ。

「Appをインストールできませんでした」や「SpringBoardはAppを起動できませんでした。エラー:0」という理由でシミュレータでアプリ起動できない件

またまたiOS7(or Xcode5)の話題。

Xcode5にしてからすこぶる開発スピードが落ちた気がする。というのも、シミュレータでアプリを起動できないときが多々ある。「Appをインストールできませんでした」や「SpringBoardはAppを起動できませんでした。エラー:0」という理由で起動できないのだ。

解決方法としては、
・アプリのバイナリを削除(パスは、/Users/xxx/Library/Application Support/iPhone Simulator/6.1/Applications/hogehoge)
・クリーン
・シミュレータ再起動
で起動できるようになる。

なんだかなー。


参考:
iPhone Simulator: SpringBoard failed to launch application with error: 7 - Stack Overflow
Xcode 5 - "iOS Simulator failed to install application" every time I switch simulators - Stack Overflow

Legacy Language Designator - The directories located at ...の警告解消方法

iOS7 やXcode5にバージョンアップした。

ところで、拙作のKAKUREiconをアップデートをするにあたり、「Legacy Language Designator - The directories located at ..」の警告が申請時(Validateしたとき)に表示された。警告なので、そのままValidateできたのだが、気になったのでどうにか解消しようと思った。

何が問題かというと、ローカライズファイルのディレクトリ名が古いってことだ。拙作はいちよう日本語と英語に対応しているだが、それらのInfoPlist.strings、Localizable.stringsを、フォルダJapanese.IpojとEnglish.Ipojに保存していた。そのフォルダ名が古いのが問題だった。それぞれ、ja.Ipojとen.Ipojにリネームしたら解消した。

と、簡潔に書いたが、リネームするのに四苦八苦した。Finder上でリネームして、そのあとXcodeから各々のファイルをひもづければいけるだろーと安易な考えだったが、失敗した。Xcode上でひもづけられなかった。

なので、方法としては、最初から、ローカライズのファイルすべて削除かつローカライズ設定も解消する。そのあと英語verのファイル”のみ”をまず、Finder上で、コピペし、Xcode上紐付けし、ローカライズの設定をし...という、所謂「ゼロからやる」のがベスト。

このあたりXcode弱いよなぁぁ。。。

オリジナルの壁紙つくれます。しかも、楽しい壁紙。ぜひ。
KAKUREicon - オリジナルの壁紙作成(アイコンの裏からお気に入りの画像をチラ見せ)
https://itunes.apple.com/jp/app/id404832410?mt=8#

PLISTからCSVに変換する方法

CSVからPLISTに変換するには、つつみさんの記事の方法や、CSV2PlistというMacアプリで解決できる。

ただ、PLISTからCSVに変換する方法が探しても見つからなかったので、GitHub - davedelong/CHCSVParser: A proper CSV parser for Objective-C
を使ってObj-cで書いてみた。

リソースに変換したいPLISTぶっこんで、サンドボックスのDocumentsにCSVを生成する。

前提としては、CSV2Plistで生成した、PLISTをCSVに戻すような感じで。
(※もちろん階層が複雑なPLISTはCSVに変換できるわけがない)

#import "CHCSVParser.h"

- (void)convertToCsvFromPlist:(NSString *)fileName{

    NSString *plistPath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"];

    NSArray *plistArray = nil;
    if ([[NSFileManager defaultManager]fileExistsAtPath:plistPath]) {
        plistArray = [NSArray arrayWithContentsOfFile:plistPath];
    }
    
    if (plistArray == nil) {
        return;
    }
    
    NSString *outputFileName = [NSString stringWithFormat:@"%@.csv",fileName];
    NSString *outputFilePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents" ] stringByAppendingPathComponent:outputFileName];
    
    NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath:outputFilePath append:NO];
    CHCSVWriter *csvWriter = [[CHCSVWriter alloc] initWithOutputStream:stream encoding:NSShiftJISStringEncoding delimiter:','];
    
    for (NSInteger i = 0; i < [plistArray count]; i++) {
        NSDictionary *dic = (NSDictionary*)[plistArray objectAtIndex:i];
        if (i==0) {
            for (id key in [dic keyEnumerator]) {
                [csvWriter writeField:key];
            }
            [csvWriter finishLine];
        }
        
        for (id key in [dic keyEnumerator]) {
            [csvWriter writeField:[dic valueForKey:key]];
        }
        [csvWriter finishLine];
    }
}

encodingをNSUTF8StringEncodingにすると、生成されたCSVをひらいたときに文字化けしたので、NSShiftJISStringEncodingにしている。

カラムの順序がPLISTのときとかわってしまうので、順序をかえたくない場合は、下記のようにする必要がありそうな。ちょっと強引だけれども。他にいい方法ありそう。
(ただし、カラム名がわかっている場合のみ)

- (void)convertToCsvFromPlist:(NSString *)fileName{

    //----略----
    for (NSInteger i = 0; i < [plistArray count]; i++) {
        NSDictionary *dic = (NSDictionary*)[plistArray objectAtIndex:i];
        NSArray *array = [self sortDic:dic];
        
        if (i==0) {
            for (NSString *str in array) {
                NSString *key = [[str componentsSeparatedByString:@"<>"] objectAtIndex:1];
                [csvWriter writeField:key];
            }
            [csvWriter finishLine];
        }
        
        for (NSString *str in array) {
            NSString *value = [[str componentsSeparatedByString:@"<>"] objectAtIndex:0];
            [csvWriter writeField:value];
        }
        
        [csvWriter finishLine];
    }
}


- (NSArray *)sortDic:(NSDictionary *)dic
{   
    NSMutableArray *array = [[NSMutableArray alloc]init];
    [array addObject:[NSString stringWithFormat:@"%@<>%@",[dic objectForKey:@"columnA"],@"columnA"]];
    [array addObject:[NSString stringWithFormat:@"%@<>%@",[dic objectForKey:@"columnB"],@"columnB"]];
    [array addObject:[NSString stringWithFormat:@"%@<>%@",[dic objectForKey:@"columnC"],@"columnC"]];
    [array addObject:[NSString stringWithFormat:@"%@<>%@",[dic objectForKey:@"columnD"],@"columnD"]];
    return array;
}

3DプリンタでiPhoneケースをつくってみた

例のReplicator2で、iPhoneケースを印刷してみた。

1回目
3DプリンタでiPhoneケースをつくってみた - NAVER まとめ

2,3回目
3DプリンタでiPhoneケースをつくってみた(2,3回目) - NAVER まとめ


回数をこなすたびにクオリティも向上しているのが嬉しい。

ただ、3回印刷した結果思ったのが、2,3ミリの積層はReplicator2では厳しいのではないか、ということ。形状によるだろうけれども。3回とも、iPhoneケースの引っ掛かりの部分が、積層に失敗し、崩れてしまっている。「形状による」と書いたのは、iPhoneケースの縁は、支えとなる側面から数ミリ単位の表面積でしか支えられていないのに加え、横に飛び出している形だということだ。これが、もし印刷する向きを変えたら、(つまり、オブジェクトを読みこませる際に、ケース背面をZ軸に対して垂直にするのではなく、X軸またはY軸に対して垂直にするということ。)おそらくかわるのかと思う。ただし、その場合は、縁以外の部分が、横に飛び出す形になるので、悩ましい。

iPhoneケースは、あのカチッとしたはまる感じが必須であるので、その機能を乗り除くのは考えられない。カバーという機能をもつので、外れたら意味がない。

その機能をたもちつつ、上記のような問題を解決していきたいと思う。次は、積層を2,3ミリではなく、さらに分厚くして、印刷してみたい。