2013年8月31日土曜日

iPhone で Box2D を使う

iPhone で、物理演算を行うためのライブラリ(?) Box2D を動かす所までを調査してみた。
前回は、ソースの取得で苦労した訳だけど、要る物さえ取れてしまえば後は楽か・・・と思ったが甘かった。

今回は、以下のサイトを参考にさせて頂いた。

UIKit で物理演算エンジンを使用する
http://qiita.com/shu223/items/8a1d064411a2a122983d

ここでは、自分が行った点を補足として残す。

まず、1.のファイルの取得については、前回の記事で書いたとおり SVN にプロキシ設定を行って取得した。

次に、4.の必要ファイルの拡張子を cpp から mm に変更する所。
これは、ターミナルを使い対象(Box2D/Box2Dの中)の各フォルダごとに変換を行った。
for nm in *.cpp; do[Enter]
> mv $nm ${nm%.cpp}.mm;[Enter]
> done[Enter]
上記が、フォルダの中の cpp ファイルを取得して mm に置き換えるスクリプトである。
フォルダ数も知れていたので、手作業で行ったが、結構神経使ったので、もう少し改良した物を使った方が良いかもしれない(シェルに明るければ簡単にできるんだろうな)。

作業が前後するかも知れないが、拡張子を変換してから XCode に放り込んだ方が良さそうだ。
放り込んだ時点で XCode では、警告が沢山出た。

warning: Missing file:/job/hoge/trunk/hoge/Classes/Generic/UI/UICustom/NSCViewVisitor.h is missing from working copy

(警告メッセージが違うかもしれん。。。)
このメッセージは何かというと、SVN 管理のファイルが変更になっているぞ!と言う物らしい。

内容的に、無視しても良いけど、気になるので(目障り)、監視ファイルを削除することにした。

コピーしたフォルダ内に「.svn」という隠しファイルがあるので、削除すればこの警告は消える。

これで、中間地点となる5.のヘッダーファイルをインポートしてビルドをする部分までは行ける。
と、思ったがエラーが出る。

「Lexical or Preprocessor ‘cassert’ file not found」

い、意味不明だ・・・
調べたところ、関係する拡張子が「mm」でないとダメらしい。

上記で変換してるんだけど・・・と思ったが、これの影響範囲は関連するプロジェクト全てのファイルが対象の事だった。
つまり、「ViewController.m」 も 「ViewController.mm」 にしなくては行けなかった。
これで、ビルドまで通るようになる。

ここまで来ると、あとはそのまま実装していけば完了するはず。
本当にコピペとなるためにコードは省くが、ビルドして実行すると、箱がポロポロ落ちてくるサンプルが作れる。

今の段階では、これで終了したが、ゲームなりなんなりに使うためには、もう少し使い方を勉強する必要がある。
先が長そうだったので、余裕が出たときに再度取りかかろうと思う。

Mac SVN でのプロキシ設定

iPhone で、物理演算を行うライブラリ Box2D が使えるとの事で、早速調査して見た。
その際に、Box2D は、SVN で管理されているようで、ターミナルで以下のコマンドを発行すれば取得出来るとの事。
svn checkout http://box2d.googlecode.com/svn/trunk/ box2d-read-only
意味としては、「指定したURLからデータを取得し、指定場所へ格納せよ」となる。
これを実行したところ
svn: OPTIONS of 'http://box2d.googlecode.com/svn/trunk': could not connect to server (http://box2d.googlecode.com)
と、エラーが出る。

「う~ん。URL の先がないのか?」
と思ってブラウザでアクセスすると、普通に表示される。

頭が固いのか?
ブラウザで一個ずつファイルを落とすのか?とかバカな事を考えたり、
時間を置いて見たらどうだ?とか意味不明な事をしばらく繰り返していた。
若干あきらめかけた時、エラーメッセージで調べると答えが有った(はじめからすれば。。。)

どうやら「プロキシ」の設定がいるらしい。
確かに、今の環境は Web に繋ぐのもプロキシがいる事を忘れていた

正直なところ SVN はローカルで少し使ったぐらいで、プロキシの設定と言われても困ったが、それ程難しくなかった。
以下のようにすればよい。
vi ~/.subversion/servers
これで、設定ファイルを開く事ができる。
その設定ファイルの 「global」 の項目にプロキシ設定がある。

...
[global]
# http-proxy-exceptions = *.exception.com, www.internal-site.org
# http-proxy-host = defaultproxy.whatever.com ← コピーする(または削除)
http-proxy-host = xxx.xxx.xxx.xxx             ← ここに自分の環境を設定
# http-proxy-port = 7000                      ← コピーする(または削除)
http-proxy-port = xxxx                        ← ここに自分の環境を設定
# http-proxy-username = defaultusername
# http-proxy-password = defaultpassword
...
これで、先ほどの取得コマンドを発行すると、上手くいった。
さて、ここからが大事だがそれは次の記事とする。

2013年8月29日木曜日

Firefox OS(シミュレータ) で Hello World

Web OS ってやつですか。

流行ってるんですかね?いかんせん端末も普及していないので、なんとも言えませんが、今後の主流になるとか何とか。

今のところ情報が少ないのですが、Hello World は一瞬ということなので、試してみました。

Firefox OS が載っている端末は所持していないので、ブラウザ上のシミュレータでやってみたいと思います。

準備する物は、
  • Firefox
  • エディタ
のみ。

俗に言う IDE と言う物が今の所無いようです。
なくても Firefox にアドオンでデバッグ環境は整うので大した問題じゃないと言う事みたいです。

実際に環境を作るに当たっては、アドオンをインストールする必要があります。
Firefox OS Simulator と言うアドオンをインストールします。
あと、Firebug や、その他 Web 開発に便利な物が有ればいいのかな?

インストールすると、Simulator Dashbord というタブが開き、左のペインの Simulator のスイッチをクリックし Running とすることにより、シミュレータが起動します。

これで、環境が整ったので、実際に動かす Hello World の作成へ入ります。

まずは、デスクトップに適当なフォルダを用意します(今回は、FirefoxOS と言う名前で作成)
その中に、動かすプログラムのフォルダを作ります(今回は、HelloWorldと言う名前で作成)
このフォルダ内に実際のプログラムを入れていきます。

プログラムと言っても、iPhone や Android などの堅苦しい言語を使用する訳ではなく、HTML5 と JavaScript を使用して作っていきます。

フォルダ内に index.html を作成します。
<!DOCTYPE html>
<html lang="ja">
 <head>
  <meta charset="UTF-8" />
  <title>Hello World!</title>
</head>
 <body>
  <h1>Hello World!</h1>
 </body>
</html>
以上です。

え?と思うでしょ。
自分もそうでした。単なる HTML のファイルじゃないかと。
だけど、これで良いらしいです。

あとは、OS で動かすに当たって、設定を行う manifest.webapp を記述します。
{
    "version": "0.1",
    "name": "Hello World!",
    "description": "first firefox app.",
    "launch_path": "/index.html",
    "icons": {
    },
    "developer": {
        "name": "Hello",
        "url": "http://yourawesomeapp.com"
    },
    "default_locale": "ja"
}
ここには、プログラム起動に際してのエントリポイントとなるファイルの指定等を行います。

以上で、準備か完了となります。
再度、 Simulator Dashbordに戻り、Add Directory のボタンを押してください。
ファイルの読み込み指定のダイアログが開くので、上記で作成した manifest.webapp を選択する事により、プログラムが起動します。
(icon のところで指定がないので、警告が出ます。)
以上で、Hello World の実行は完了です。
お疲れ様でした。。。って

拍子抜け名感じしますが、今の段階ではこれで良いとします。
実際には、HTML5 や jQuery などを駆使して高度な事や、マニュアル読めばもっと細かな事が可能だとは思うんですが、今のところは深追いしないと言う事で。


2013年8月28日水曜日

Mac の Markdown エディタ

iPhone のパーソナル Wiki の TrunkNotes が便利と思っている。

現在の編集方法は、ローカルで、エディタを使って Markdown を書き、iPhone で閲覧すると言う方法を取っている。
これは、TrunkNotes のデータをクラウド上に置く事によって実現している。

編集は、iPhone では厳しく、ローカルだと快適だからこの方法をとっているが、これで完璧か?と言うとちょっと違う。
現状の欠点としては、書いた後の見た目を iPhone 側で見ないと行けないため、記法が有ってるかの確認に手間がかかっている。

この部分については、以前から合った物の「しょうがない」と決め込んでいた。
しかし、今回ツールアプリの調査をしているときに、Markdown Editor を見つけてしまった。
これは、Mac 上でしかもリアルタイムプレビューが可能という物だ。

Windows には、「ひとりWiki」やその他ローカル上で Wiki を作成できる物を知っていたが、Mac でもあることに驚いた。

今回見つけて、使いやすそうだと思った物は、

Kobito
Mou

の 2 つ。
どちらもフリーとなっている(ただし、Mac 専用)。

Kobito については、Qiita との連携が取れるようになっているため(Qiita が作ってるから)、ユーザ登録を行わないと使用が出来ないが、登録は無料のため気兼ねなく使える(データ登録が面倒と思わなければ)。
また、国産だ。

Mou についても、外部との連携が取れるようになっているが、こちらはユーザ登録なしで、使用ができる。

どちらも専用のエディタというか編集領域があり、編集するとリアルタイムで結果が見える。

ただエディタは、これまで Vim を使っていたので、エディタはそのままで、結果のみ確認する使い方にした。
この使い方だと、Mou の読み込みが上手くいかなかった。

何はともあれ TrunkNotes に反映する前に確認出来るのは嬉しい。

また Markdown が好きになってしまった。

CoreData で "An instance of NSFetchedResultsController requires a fetch request with sort descriptors"

CoreData を使用するアプリを作成しているが、表題通り
An instance of NSFetchedResultsController requires a fetch request with sort descriptors
エラーが出てアプリが落ちる。

原因は、メッセージにある通りではあるが、sort descriptors が絡んでいる。
今回、動作を早く見たいが為に、ソートの設定まだイランだろと思ってソート部の実装を省いたのがまずかった。

以下のように、ちゃんと実装すれば良かった。
// ソートを設定
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
しかし、ビルドは通って、実行で落ちるこの手のエラーは、出たときに途方に暮れそうになるな。。。
(落ち着いてかつ、ポイント押さえてない自分が悪いとも言う。)

ホームアイコンバッチの文字列表示は出来なくなった

アイコン右上に表示されるバッチ(アプリケーションバッチ)について、数値ではなく、文字を表示したかった。

最近簡単なサンプルを作っている時に、文字が表示できたと思っていたが、どうやら現行の XCode(4.6) では、機能削除された様だ。

以前は、
[[UIApplication sharedApplication] setapplicationBadge:@"ON"]
と書けば良かったらしい。

現状は、文字列ではなく数値のみが表示可能で、
// バッチに 5 を表示
[UIApplication sharedApplication].applicationIconBadgeNumber = 5;
// バッチのクリア [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
とすれば良い。
しかし、この間文字列が表示できたと思ったんだけどな。。。

ついでに、バッチはタブバーにも表示でき、こちらは文字列も表示できる。
ひょっとすると、こっちの印象が残っていて、ホームでも出来たとか思っていたのだろうか?

調べて分かったけど、あんまりバッチは好まれていないような気がする。
確かに、自分も使っていて便利な時と表示が汚いと思うときがある。
適切な使い方を考えた方が良いかもしれないな。

2013年8月26日月曜日

ループする(している様に見せる) PickerView の作り方

今頃のアプリの項目選択では、余り使われなくなった PickerView。
時代に反しながら、それでも利便性がある所があるため使い方を学習した。

通常に実装しただけでは、ループが施される処理にはならず、ドラムの先頭には空白が表示される。









↑こんなかんじ

これをループ形式にする。








↑こんなかんじに

ちなみに画像が違うのは、Blog を書いている PC は開発機ではないため、実際の画像が取得できないので、イメージを取ってきているから(実装内容はポイント押さえてるからご勘弁を)。

要するに、数値で行けば、0 ~ 9 をループさせると言うようにする。

この実装をどのようにするかというと、プロパティ等ではなくカラクリがある。
実際にはこれループをしているわけではない。
ループさせたい番号を一定数繰り返している長~いビューを見せているだけなのである。

最初は、「そんなバカなプロパティあるんだろ?」と思っていたが、当然無くまたどのソースをみてもこの方法を採用している(当たり前か)。

当然ただただ長いビューを表示させているので、先頭と終端があり、何も考えずに表示すると最初に載せている通り先頭が空白の状態が表示される。
これでは、ループに見えないので、最初に表示する際には、中間地点の先頭(この場合は 0)を表示するようにする。

なので、ループに見えるようなPickerViewの場合、頑張って先頭もしくは終点までクルクル回すと先頭(終点)が表示される。

また、終点近くまでクルクル回してそれで終わりとすると、次回のクルクルの時に直ぐに終わりが来てしまうとまずいので、選択が確定したら、中心部近くへ移動させる処理も入れないと行けない。

これらを実装した内容は以下の通りになる。
今回のソースは、時・分をループさせるような物を作成している。
(上にも書いたけど画像と実装内容が微妙にずれていて申し訳ない)

ポイントは上に書いたから良いか。。。
    #import <UIKit/UIKit.h>

    @interface ViewController : UIViewController<UIPickerViewDelegate, UIPickerViewDataSource> {
        NSTimer *timer_1sec;
    }

    @property (strong, nonatomic) NSMutableArray *hours;
    @property (strong, nonatomic) NSMutableArray *minutes;

    @property (weak, nonatomic) IBOutlet UILabel *timer_count;
    @property (weak, nonatomic) IBOutlet UIPickerView *pvTime;

    @end
    #import "ViewController.h"

    #define MAX_HOURS 24
    #define MAX_MINUTES 60

    #define LOOP_COUNT 6

    @interface ViewController ()

    @end

    @implementation ViewController

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.

        _pvTime.delegate = self;
        
        // データ準備
        // 時
        _hours = [NSMutableArray arrayWithCapacity:MAX_HOURS * LOOP_COUNT];
        for(int i=0; i<LOOP_COUNT; i++) {
            for(int j=0; j<MAX_HOURS; j++) {
                [_hours addObject:[NSString stringWithFormat:@"%02d",j]];
            }
        }
        
        // 分
        _minutes = [NSMutableArray arrayWithCapacity:MAX_MINUTES * LOOP_COUNT];
        for(int i=0; i<LOOP_COUNT; i++) {
            for(int j=0; j<MAX_MINUTES; j++) {
                [_minutes addObject:[NSString stringWithFormat:@"%02d",j]];
            }
        }
        
        // 中央に移動(先頭番号)をセット
        [_pvTime selectRow:MAX_HOURS * (LOOP_COUNT * 0.5f)
               inComponent:0
                  animated:NO];
        [_pvTime selectRow:MAX_MINUTES * (LOOP_COUNT * 0.5f)
               inComponent:1
                  animated:NO];

    }

    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    // ドラムの数(本数)を指定
    - (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView {

        return 2;

    }

    // 各ドラムのセル数をセット
    - (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
        
        NSInteger count = 0;
        
        switch (component) {
            case 0 :
                count = [_hours count];
                break;
            case 1 :
                count = [_minutes count];
                break;
            default:
                break;
        }

        return count;
        
    }

    // ドラムのセルに表示するタイトルをセット
    - (NSString *)pickerView:(UIPickerView *)pickerView
                 titleForRow:(NSInteger)row forComponent:(NSInteger)component {
        
        NSString *title;
        switch (component) {
            case 0 :
                title = [_hours objectAtIndex:row];
                break;
            case 1 :
                title = [_minutes objectAtIndex:row];
                break;
            default:
                break;
        }
        
        return title;
        
    }

    // 選択後に呼ばれる
    - (void)pickerView:(UIPickerView *)pickerView 
          didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
        
        // 時
        NSInteger index = [_pvTime selectedRowInComponent:0];
        // 中央付近に戻す
        [_pvTime selectRow:(index % MAX_HOURS) + (MAX_HOURS * (LOOP_COUNT * 0.5f))
               inComponent:0 animated:NO];
        // 値の確認
        NSLog(@"%d, %@", index, _hours[index]);

        // 分
        index = [_pvTime selectedRowInComponent:1];
        // 中央付近に戻す
        [_pvTime selectRow:(index % MAX_MINUTES) + (MAX_MINUTES * (LOOP_COUNT * 0.5f))
               inComponent:1 animated:NO];
        // 値の確認
        NSLog(@"%d、%@", index, _minutes[index]);
        
    }

    @end

2013年8月21日水曜日

UIScrollView でのタッチイベントの取得

UIScrollView を使用した場合、通常ではタッチイベントが取れないとの事。
取れるようにするためには、UIScrollView のサブクラスを作成することにより実現できる。。。
と、書かれているが、どうもよく分からない。

とりあえず、手を動かせと言う事か

今回確認した内容を書いていく。

UIScrollView を継承するクラスを作成する(今回は MyScrollView と言う名前で作成)。
これは、普通の空クラスを作成すると同じ方法で作成。
この時に、継承元の指定を UIScrollView にする。
また、作成したクラス内に、タッチイベントを実装(オーバーライド)する。
#import <UIKit/UIKit.h>

@interface MyScrollView : UIScrollView

@end
#import "MyScrollView.h"

@implementation MyScrollView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

// タッチ終了(タッチから外れた)イベント
// touchesBegan をオーバーライドしておかないと、これは動かない
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 if (!self.dragging) {
  [self.nextResponder touchesEnded: touches withEvent:event];
 }
 [super touchesEnded: touches withEvent: event];
}

// タッチ開始イベント
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 if (!self.dragging) {
  [self.nextResponder touchesBegan:touches withEvent:event];
 }
 [super touchesBegan:touches withEvent:event];
}


@end
後は、メインとなるクラスで、今回作成したクラスを使用するだけ。
#import <UIKit/UIKit.h>

@class MyScrollView;

@interface ViewController : UIViewController<UIScrollViewDelegate>


@property (strong, nonatomic) MyScrollView *scrollView;

@end

#import "ViewController.h"

#import "MyScrollView.h"

@interface ViewController ()

@end

@implementation ViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
 // Do any additional setup after loading the view.
    
    self.scrollView = [[MyScrollView alloc]initWithFrame:self.view.bounds];
    [self.view addSubview:self.scrollView];
    
    
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

# pragma mark - ScrollView Touch Events

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 NSLog(@"touchesEnded!!");
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 NSLog(@"touchesBegan!!");
}

@end
確認の際に詰まった点としては、サブクラスでタッチイベントをオーバーライドしているが、touchesBegan を実装していないと、touchesEnded のイベントが発生しない(つまり touchesEnded だけをオーバーライドしても動かない)。
このことが分かるまでに、悩んでしまった。

ひとまず、これでタッチイベントが取得できるようになるので、後はこれまで通りのタッチイベントを処理する方法と同じように処理ができる。

2013年8月20日火曜日

NSUserDefaults の中身を確認する方法

iOS のプログラミングで、データの永続化(保存)する方法として NSUserDefault を使用する方法がある。
使い方は、ある程度確認した物の中身はどうなっているか気になったので、中身を確認する方法を探した所、以下の様にすればよい。

とにかく、NSUserDefault の中身を全てみたい場合
NSDictionary *dic = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
NSLog(@"defualts:%@", dic);
中身を確認するところ、自分が設定した以外の値も沢山入っていた。
これは見づらい。

次は、アプリ内でセットした値を見る方法。
実行中のアプリでセットした値が確認できる。
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *dic = [defaults persistentDomainForName:appDomain];
NSLog(@"defualts:%@", dic);
これだけだけど、確認にどうぞ。

2013年8月19日月曜日

Mac 「このアプリケーションで開く」の修復

MacVim を使用していて、今日アプリを立ち上げた際に、最新版の確認があり、新しいバージョンのアップデートを行った。

アップデート完了後、ファイルを右クリックの「このアプリケーションで開く」の項目に古いバージョンと新しいバージョンの Vim アプリが表示されるようになった。
実際の所、古いバージョンを指定しても、既に古いバージョンの物が無いためにエラーが表示される(新しいバージョンでの動作は問題ない)。

不要な物が、表示されているのは些か美的感覚に良くないので、整理する方法を探した。
Windows なら SendTo の様な感じなので、ショートカットでも削除すれば良いかと甘い考えでいたが、それはまるで違った。
どうやらこの項目を管理している DB が有るらしく、それを再構築しないとダメらしい。

とはいえ、作業的には簡単で、以下のコマンドを「ターミナル」で実行すれば良い。
(ただし、正規の方法?ではないらしいので、自己責任で。。。)
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -f -all local,system,user
これで、古いバージョンの表記が無くなった。

Mac 右クリックで新規ファイルの作成

以前に上げた記事、「Mac Finder での新規ファイルの作成」では、右クリックからの新規ファイル作成について諦めていたが、やはり使いにくい。

そこで、改めてファイルを作成する方法を探ってみた。
アプリを購入する方法もあるが、今回は、 Automator(アプリ)を使って実現する方法を取ってみた。

今回参考にさせて頂いたサイトは、こちら
「j_wortのMac OSX TIPS 2012-12-23 [続] Mac OSXで右クリックで新規ファイルを作成


詳細は、リンク先を見ていただいた方が絵付きで大変わかりやすいと思うが、一応手順を書いておく。

1. Finder のアプリケーションから Automator を起動する。
2. サービスを選択する。
3. 画面上部の「サービスは、次の選択項目…」で「ファイルまたはフォルダ」を選択する。

4. ライブラリ → ユーティリティ と辿り、「AppleScript を実行」を右の広いところへ D&D する。
5. スクリプト入力領域があるので、以下をコピペする。
property defaultFileName : "newFile"

on run {input, parameters}
 
 try
  tell application "Finder" to set the sourceFolder to (folder of the front window) as alias
 on error
  -- no open folder windows
  set the sourceFolder to path to desktop folder as alias
 end try
 
 set flagFileExists to true
 set indexFile to ""
 
 repeat while flagFileExists
  set indexFile to (indexFile + 1)
  tell application "Finder"
   set flagFileExists to (exists file (defaultFileName & indexFile & ".txt") in sourceFolder)
  end tell
 end repeat
 
 try
  tell me
   activate
   set newFileName to text returned of (display dialog "Enter new file name" default answer "" & defaultFileName & indexFile)
  end tell
  if newFileName is not equal to "" & defaultFileName & indexFile then
   set defaultFileName to newFileName
  end if
  -- set newFile to "" & sourceFolder & newFileName & ".txt" 拡張子を付ける
  set newFile to "" & sourceFolder & newFileName
  
  if not flagFileExists then
   set touchScript to "touch " & quoted form of (POSIX path of newFile)
   set openScript to "open " & quoted form of (POSIX path of newFile)
   do shell script touchScript
   --do shell script openScript このコメントを外すとアプリを起動
  else
   display dialog "File already exists"
  end if
 end try
 return input
end run

今回リンク元と少し変更したところは、デフォルトの拡張子を付けない部分と、ファイル作成時に対応のアプリで開く処理を省いた点。

6. 貼り付けができたら、ハンマーのマークを押してコンパイルを行う。
7. ファイル → 保存 と辿り、このスクリプトに名前を付ける「ファイルの作成」とか。

これで、準備完了なので、Finder で右クリック(Ctrl + クリック)で、上記で作成したスクリプトファイルが表示されれているので選択する(フォルダ上で行うとサービスの項目内に表示される)。

以上で、Windows よろしく右クリックからのファイルの作成が行えるようになった。
気になっていた方はどうぞ。

2013年8月16日金曜日

heroku で 「We're sorry, but something went wrong.」 が出る

ちょっとした確認を取りたい時用に Heroku を使えるように練習したところ、Heroku に上げてアクセスすると、「We're sorry, but something went wrong.」 が表示される。


原因は、単純で Heroku へ Push した後に、DB のマイグレーションをかける必要が有ったのだが、その手順を見逃していただけ。

Windows なら、git で push 後に、heroku コマンド(toolbelt) を使用してログイン後、マイグレーションを行う
heroku login
heroku run db:migrate
heroku open
ただ、ここに辿り着くまでが長かった。
自分が悪いのだが、焦って掻い摘んで情報を見るため、今回の部分をスルーしてエラーメッセージで追いかけ、結果的にどんどん訳の分からない方向へ飛んでいく(そらそうだ、他の方たちは正攻法でダメな状態からの情報なのだから)。

毎度の事ながら、落ち着いてしっかりと情報を見て、把握して作業を行う事が重要と思った。

2013年8月14日水曜日

Livedoor Weather Hacks を使って JavaScript でお天気情報を取得してみる

お天気情報を何かに使えないかと思っているけど、どうやったら良いか分からなかったので調査。
調べてみたところ、商用で使えるのは、有償の物ばかりだった。
結局金か。。。と思ったけど、個人利用は無償の物もあるので、勉強がてら作ってみる。
ほとんど、見たサイトのまんまとなる。

まずは、情報提供先について、さっきも書いたけど、商用利用可能は有償ばかり。
先に調べてまとめて居られる方がいたので、リンクをお借りする。

Webサイト制作やアプリ開発で使える天気予報APIのまとめ
http://hello-apis.blogspot.jp/2013/03/webapi.html

このなかで、今回は Livedoor の Weather Hacks を利用してみようと思う。

LivedoorWeather Hacks
http://weather.livedoor.com/weather_hacks/

いわゆる Web API と言う物の様だ。

以下の URL にパラメータを付けてアクセスすれば、お天気情報が JSON で返ってくる。
(他の形式もサポートしていたらしいが、現在は JSON 形式のみの様だ)
http://weather.livedoor.com/forecast/webservice/json/v1?city=[cityID]

ここで渡す cityID については、
「 全国の地点定義表(RSS) 内の「1次細分区(cityタグ)」のidをご参照下さい。」
と、書かれている通りのIDを渡せば良いのだが、RSS形式で提供されている様だが、どうやってみたら良いか分からなかった。

そこで、 「1次細分区」をキーワードに検索をかけて見たところ、ID の情報は出てくるが、例に書かれてある数値とはかけ離れていた(例えば、佐賀県 伊万里=410020 と書かれてあるが、見つけたIDでは、佐賀県 伊万里は、123)。

何か変換がいるのか?それとも。。。と悩んだが結果的には、ID のコード体系が変わっている事が分かった。
それは、新旧のコード比較をしている方のページより発覚した。

『Weather Hacks』のRSSデータ配信が停止 1次細分区(cityタグ)の新旧対応表を作ってみた
http://gurizuri0505.halfmoon.jp/20130511/56720

たぶん、上に書いてある RSS には、変更後のコードが書かれているのであろう。

これで、取得条件は整った。
あとは、これを使って処理を行い表示するだけとなった。
手元で簡単にと言う事で、JavaScript で処理できる方法を調べた。

Livedoor の天気予報API(JSON版)を使ってブログパーツを作ってみる
http://hello-apis.blogspot.jp/2013/03/livedoor-apijson.html

そのまま、ドンピシャでやりたい事を行っている人がいたので、早速コードを拝借して確認してみた。
コードを確認しているときに、これまた同じ方の「JSONをJSONPに変換するYahoo PipesのAPI」の記事をみて、改めてこのような仕組みを有ることを学んだ。

そして、ローカルでファイルを作成し表示してみた。





おお!完璧。
取得したデータには、明日や明後日のデータやその他有るので、何かの機会に使ってみようと思う。
<!DOCTYPE html>
<html>
    <head>
        
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
        <script type="text/javascript">
            $(function() {
                escapeTag = function(string) {
                    if (string == null) return string;
                    return string.replace(/[&<>"']/g,
                    
                        function(match) {
                            return {
                                '&' : '&amp;',
                                '<' : '&lt;',
                                '>' : '&gt;',
                                '"' : '&quot;',
                                "'" : '#&39;'
                           }[match];
                        });
                };
     
                var city = '130010'; // Tokyo
                city = '380010';    // Matsuyama ← 松山で上書き
                var wetherURL = 'http://weather.livedoor.com/forecast/webservice/json/v1?city='+city;
                $.getJSON('http://pipes.yahoo.com/pipes/pipe.run?u='+encodeURI(wetherURL)+'&_id=332d9216d8910ba39e6c2577fd321a6a&_render=json&_callback=?',
                     {},
                     function(json) {
                     var item = json.value.items[0];
                     $('<div><b>'
                        + escapeTag(item.location.city)
                        + escapeTag(item.forecasts[0].dateLabel)
                        + '</b> '
                        + ' <small>'
                        + escapeTag(item.forecasts[0].telop)
                        + '</small> <small>copyright livedoor 天気情報</small>'
                        + '</div>'
                    ).appendTo('#report');
                });
            });
        </script>
    </head>
    <body>
        <div>
            <div id="report">
            </div>
        </div>
    </body>
</html>
2013/09/10
見返してみると、タグがそのまま展開されているので、修正した。

Rails 4 のアンインストール

Rails の勉強とサイトや本を見ながら動かしているが、全くをもって初歩の段階でエラーが出てしまった。
D:\Program\data\books>rails s
=> Booting WEBrick
=> Rails 4.0.0 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Exiting
C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-4.0.0/lib/action_dispatch/routing
/mapper.rb:191:in `normalize_conditions!': You should not use the `match` method
 in your router without specifying an HTTP method. (RuntimeError)
If you want to expose your action to both GET and POST, add `via: [:get, :post]`
 option.
If you want to expose your action to GET, use `get` in the router:
  Instead of: match "controller#action"
  Do: get "controller#action"
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-4.0.0/lib/action_dis
...
どうやら、Rails 4 系から match メソッドがこれまで通りでは動かないように変更されたらしい。
対応するには、 get でのマッチングを指定か、via を使っての指定を行わないとダメなようだ。
3 系
match 'hello' => 'booklist#hello'
match 'bye' => 'booklist#bye'

↓

4 系
get 'hello', to: 'booklist#hello'
match 'bye' => 'booklist#bye', via: :get
習得するに当たり、今のところは、Rails 3 系の情報が多く、手持ちの書籍も 3 系のため、慣れてくるまでは、4 系 との違いを補完しながら学習するのは効率が悪い気がするので、3 系をインストールしようと思った(普通に gem からのインストールでは 4 系が入る)。

まずは、現在入っている 4 系をアンインストールしてから 3 系の最新版をインストールする。
アンインストールの際に、「gem uninstall rails」としても、アンインストールは出来ないようだ。
調べたところ railties を指定すると良いらしい。
rails -v
Rails 4.0.0
gem uninstall railties -v '4.0.0'
(gem uninstall rails ではダメ)
アンインストールが完了した後に、バージョンを指定して 3 系をインストールする。
バージョンは、公式を確認すれば良い。
Rails 本家
http://rubyonrails.org/
gem install rails -v '3.2.14'
...
rails -v ← インストール出来ているか確認
Rails 3.2.14

2013年8月13日火曜日

gem install rails でエラー

rails のインストール(gem install rails)を行うと以下のエラーが出た。

gem install rails
...
ERROR:  Error installing rails:
        The 'atomic' native gem requires installed build tools.

Please update your PATH to include build tools or download the DevKit
from 'http://rubyinstaller.org/downloads' and follow the instructions
at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'
...

Devkit が古いようだ。
メッセージに書かれている通り、 http://rubyinstaller.org/downloads へ行き、http://github.com/oneclick/rubyinstaller/wiki/Development-Kit(対象となる物。)が該当する物をダウンロードしてアップデートを掛ける(今回はDevKit-tdm-32-4.5.2-20111229-1559-sfx.exeをダウンロード)。

ダウンロードしたファイルを展開し(不用意にデスクトップを展開先とすると、ファイルが散らかるので、フォルダ指定して展開する事を推奨する)、アップデート処理を行う。

まず、展開したフォルダは、アクセスしやすい場所へ移動させる。
次に、初期化のためのコマンドを発行する
ruby dk.rb init
さらに、インストール(更新?)コマンドを発行する。
と、ここでエラーが発生した。
C:\Ruby193\Devkit>ruby dk.rb install
[INFO] Updating convenience notice gem override for 'C:/Program Files/Heroku/rub
y-1.9.2'
dk.rb:86:in `rename': Permission denied - (C:/Program Files/Heroku/ruby-1.9.2/li
b/ruby/site_ruby/1.9.1/rubygems/defaults/operating_system.rb, C:/Program Files/H
eroku/ruby-1.9.2/lib/ruby/site_ruby/1.9.1/rubygems/defaults/operating_system.rb.
20130813193359) (Errno::EACCES)
        from dk.rb:86:in `update_gem_override'
        from dk.rb:260:in `block (2 levels) in install'
        from dk.rb:246:in `each'
        from dk.rb:246:in `block in install'
        from dk.rb:219:in `each'
        from dk.rb:219:in `install'
        from dk.rb:313:in `run'
        from dk.rb:332:in `
'
どうやらパーミッションがどうこう言っているようなので、コマンドプロンプトを管理者モードで起動し直して、再度コマンドを発行したら、上手くいった。

あとは、当初の目標の rails のインストールを行ったところ、上手くいった。
(ドキュメントのインストール部分でものすごく時間がかかったので、止まったかと思った。。。)
...
Parsing documentation for rails-4.0.0
Installing ri documentation for rails-4.0.0 ← ここで30分ぐらいかかった。。。
...

iPhone で簡単にプロトタイプが作れるアプリ「POP」

暑いですね。
昨日は、高知で 41 度を記録した事がニュースになっていました。
昨年末にはラジオで冷夏とか言ってたのに。。。

それはそうと、今日は iPhone で手軽にプロトタイプを作成できるソフトを紹介します。
プロトタイプと言ってもプログラミングをするたぐいの物ではなく、ペーパープロトタイプという基本紙ベースの物で行うタイプの物です。
利点は、イメージを見ながら(見せながら)確認ができるので、新たなアイデアや改善点が比較的容易に見つかると言ったところでしょうか。

そんな事を実現できるアプリがあり、「POP」と言います。








https://itunes.apple.com/jp/app/pop-prototyping-on-paper/id555647796?mt=8

使い方は簡単で、まずはプロジェクト(アプリ)名を決めます。
左下の「+」ボタンを押してプロジェクトの作成を行います。


次に、紙もしくは、グラフィックエディタ等で作ってみたいイメージを起こします。
(ネタは適当です。。。)


次にそれらを POP に取り込みます(カメラで直接撮影したり、カメラロールから取り込んだり)。
左下の「カメラ」のマークと「絵」のマークで取り込めます。

最後にそれらを繋ぐ方法を指定します。
タップして反応させたいエリアを選択して、遷移するページを選択します。

これで完了。

あとは再生ボタンを押すと、プロトタイプが動き始めますので、実際に自分で動きを見ながら詳細を検討したり、人に動かして貰いながら説明や、議論をしたりすると良いと思います。
今回は、左上のメニュー表示をタップするとメニューが表示されて、MAP下のリストをタップするとカレーの写真が表示されるような動きにしています。
-リストをタップ!!→

以前、勉強会で POP とは違う物を紹介して貰ったのですが、そちらは画面の登録が 3 枚以上になると費用がかかるようになっていたり、データをサーバーで生成するためか、専用ソフトから作成したプロトタイプデータをダウンロードをして確認しないと行けなかったりと、不便な点が有りました。

その点、POP は画面は 53 枚まで登録可能となっているため、複雑な構造の動きも登録ができ、基本無料という点があります。
自分は、プライベートで使用しているのですが、シェアも出来るようなので、興味のある方は使ってみてください。
(興味なかったからどういう内容の物か調べていない)

ペーパープロトタイプの画面遷移が楽になる程度で、派手な動きは再現できませんが(ペーパープロトタイプでも一緒ですね)、それでも簡易的に動き表現できる物があると、人とも話しやすくなり楽しいので、興味のある方は是非使ってみてください。

2013年8月9日金曜日

がんばろうアラフォー!!ストレス解消に打ち勝とうではないか

ここ数日で、高校の同級生とか、古いつきあいの友人に会ってきた。

自分の近況を知らせる為もあったが、なにぶん内向的な気分ではあるので、友人から活力を貰えないかという期待も有りつ会いに行ったのだった。

結果から言うと

「アカン!!みんな疲れすぎや」

年齢的な物も有るので、しんどいのは分かっていたが、半端無い疲労感を頂く事になった。

なぜここまでの疲労感があるのか話を聞く限りでは、
  • 自分の直接関わっていない仕事に対して責任がかかってくる
  • 会社の縛りが多い
この2点が大きかった。

自分の直接関わっていない仕事に対して責任がかかってくる

なぜ、こういう状況になるか分からないが、何にせよ責任を押しつけられるようだ。
年齢を考慮した上での社会的ポジションであれば、良く聞く内容だ。
上からは、怒られ下からは期待されるという形であろう。

会社の縛りが多い

この点に関しては今の時代背景があるのだろう。
社員のことよりも、会社で問題が起こらないようにするために社員の行動を規制しているとの事だ。何をするにも監視をされているから精神的にしんどいと。

これは、たぶん色んな社員さんがいるので、最低ラインを引いた上での合わせ込みを行った結果だと思われる。
単純に考えればひどい話であるが、会社の信頼等を守るためには必要な事なのだろう。

結果的に

自分が会った友人だけがこのような責任や規制を掛けられているわけではなく、社員さんが全て同じ条件で仕事しているので、人によっては「何を言ってるんだ当然だろ」と言われる内容であると思う。

年が近いことや、古くの付き合いがあるためか、包み隠すことなく本音(愚痴ですね)を言っているので、現状のアラフォーは疲れているのは間違いないと思われる。
これが、少し年齢が上であれば、間違いなくこのような話は無いであろう(ストレスが無いと言う事ではなく、プライドがあるため弱みは見せないと言う事)。

どうするの?

どうすれば、このストレスから解放されるのか?とも聞いてみた。
  • 一人の時間が欲しい(趣味の時間が欲しい)
  • 温泉がよかったから行きたい
  • 男性ならではの所にお世話になりたい(助平な方です。。。)
  • 友達と飲みに行きたい
これらが、やりたい事らしい。
また、ガッツリではなく、ちょっとしたゲームが息抜きになると言ってた。
パズドラが流行るのは、こういう面も有るからかもしれない。

最後に

最終的には、どの仕事でも何処にいっても厳しい事には代わりはないという事だった。
また、アラフォー男性は一人になりたがっているのかも知れないとも思ってしまった。

地味ながらストレス発散できるようなミニツアーでもあれば、結構流行るかも知れない。
「アラフォー野郎ぶらり旅」みたいな感じで、疲れたおっさんのツアーとかどうですかね?

最初の主旨とだいぶん離れたが(元気貰わず倍返し。。。)、こちらからストレス発散の提供が出来るようにしないと思ったりと考え深い数日だった。

2013年8月8日木曜日

UITableView の cellForRowAtIndexPath で落ちる

凡ミスばっかり。。。

UITableView の cellForRowAtIndexPath でアプリが落ちる。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{     // ↓ここで落ちる
    UITableViewCell *cell          = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];     [self configureCell:cell atIndexPath:indexPath];     return cell;
}
原因は、「Storyboard の TableView に Table View Cell を追加してなかった。」
つまり、Cell にアクセスしようにもアクセスが出来ない為に起こった。

この場合は、Table View Cell を追加後にプロパティの Identifier に 「Cell」 と指定することにより解決した。

CoreData でリレーションのモデルを追加しようとすると落ちる

iOS のはなし。

CoreData を使用して、データの永続化を図ろうとしているが、今回リレーションを結んだモデルについて代入を行う際に、上手く動かなかった。

なんならと、リレーションを組んでいる親のモデルに対してのみデータを入れてみた所、登録処理は出来るが、取得後参照の時に例外が発生してしまう状態になった。

ここまでの流として、まずサンプルを見ながら作成して、その後に自分での新規実装を行ってみた流となっている。そのために、見落とし事項があるかとは思ったが、ざっと見たところ問題が無かったので、しばらく悩んでしまった。

今回の場合、結果的には、

「xxxx.scdatamodeled に記述しているクラス変数名と、モデルに記述しているクラス変数名が一致していなかった」

と、言う事だった。

具体的には、「xxxx.scdatamodeled」 に記述しているクラス変数名は「全て小文字」で書いたが、モデルに記述しているクラス変数名は、「大文字小文字が入り交じっている(キャメルケース)」で書いていた。
このため関係が一致せずに、リレーションのクラスを参照使用とすると、割り付けられていないアドレスに対してのアクセスを行って結果的に例外発生の流れになっていた。

対応としては、「記述を小文字に統一(大文字やキャメルケースでも良いので統一)」することにより、問題なく登録や取得等々の操作ができる事を確認した。


こういった作業の際はどうしても、解決に時間がかかると日和ってしまい、

「俺は悪くない!!環境が、いやデータが。。。ごにょごにょ」

と、若干逃げてしまい、

「色々いじりながら、やっていたので DB がおかしくなったんだな」
と決め込んで、データを消してみたり、、一旦シミュレータのデータを消して再度動かしてみたり、クリーンビルドをして確認してみたりしするのだが、8 ~ 9 割は

「コンピュータを疑うな!まずは自分を疑え!!」

と言う事になる。
今回もこのパターンだった。。。

2013年8月7日水曜日

iOS シミュレータで位置情報取得が失敗する

位置情報を使ったプログラムを iOS シミュレータで確認する際に、任意の位置情報を設定等出来る。

これを使って、任意の場所を表示させたりするのだが、その際にソースを修正 → ビルド・実行と連続して行っていると、何かのタイミングで位置情報が「なし」の設定になる事がある。

「なし」の状態で位置情報を取得しようとすると、取得失敗のロジックが動き、少しパニックになった。

これまた、どの段階で「なし」の設定になるか理解できていない。。。

XCode のビルドエラー

特に何をするわけでもなくビルドをすると、以下のエラーが出た。

Code Sign error: The identity 'iPhone Developer' doesn't match any valid, non-expired certificate/private key pair in your keychains

Web で探すと、大体が証明書関係が切れている内容で、どれも一致しない。

こういう場合は、よっぽどのレアケースか、常識的な知識で単なる設定系か。。。
全体的に問題が有るのか確かめるため、他のプロジェクトをビルドしても問題ない。

再度、調査をしてみると、同じような状況の方がおられた。

原因は、
「対象ビルドが、iOS Device」
になっていた。

というもの。
iPhone 6.1 Simulator にすると、ビルドが通った。
設定系のミスだった。

しかし、いつここが変わったのかわからない。。。


ちなみに、証明書系の解決方法の場合に、みんな簡単にキーチェインアクセスを使って。。。
と、書いているが、キーチェインアクセスの正直場所がわからなかった。
こんな私でも分かるように、詳細に書いてくれている人がいたので、備忘録を兼ね、以下にキーチェインアクセスまでの場所を書いておく

アプリケーション → ユーティリティ → キーチェインアクセス.app

2013年8月6日火曜日

Google+ の AKB 記事を非表示にする方法

知り合いが少ないせいもあってか、Google+ に表示される写真に AKB の注目の記事が多い。
グループとして知らない人はいないだろうし、注目されているかも知れないが、正直興味持って見ていない。

興味の無いものを大量に見せられても正直困るんです!!

そこで、申し訳無いが非表示に出来ない物か調べてみた。

やはり、同じような事を思っている人がいるようだ(タイトルに悪意を感じるが・・・)。

「Google+のストリームにAKB48を表示したままですか?非表示にしてみる。」
http://www.g-memo.com/archives/3307460.html

「Google+ がAKBのうざい投稿を削除しやすくなってた」
http://akimicyu.blogspot.jp/2013/06/google-akb.html

これらは、AKB の投稿に良く付く「注目の投稿」マークを利用した非表示の方法
これでも良いかと思ったけど、綺麗な風景がとかも「注目の投稿」に上がるため、この条件での非表示は余りしたくなかった。


「Google+ からウザい AKB48 を一掃する方法」
http://yunishio.hateblo.jp/entry/2012/02/14/170130

こちらは、一旦サークルにメンバーを集めてメンバーをブロックする方法を取ってある。
が、読んでみると追加するメンバー?が次々と増えていっているようだ。
これはこれで、面倒。

どれも一長一短がある。
手間な作業が増えたり、綺麗な写真が見えなくなるはそれはそれで困るんで、結果そのままにすることにした(結局妥協。。。)。

Google さんもう少しどうにかなりませんかね?

SourceTree Git で Push の時にエラーになる

現在 Bitbucekt を使っています。
その Atlassian がお勧めする Mercurial / Git クライアントの SourceTree も使っています。
見た目が良いのでお勧めです。

今回 SSH での Push を行う際に以下のエラーが出ました。

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream Bitbucket master:master 
Pushing to git@bitbucket.org:xxxxxx/xxxxx.git
ssh: connect to host bitbucket.org port 22: Connection refused
fatal: The remote end hung up unexpectedly
Completed with errors, see above
毎度の事ながらエラーが出ると、気分が萎えます。
内容は、22 番ポートが使えないよと言うこと。
今の環境では、80番と443番以外は閉まっている様なので当然の結果でした。

SourceTree のやりとりを HTTPS に変更することにより、問題なく Push 出来ました。

2013年8月4日日曜日

こうすればいいのか!ページビューUPの方法

ブログを始めて3週間経ちました。
ページビュー数を見ると今ひとつな数字。
ページビューUPを図るには、やはり先人の知恵をお借りしようと思い調査してみました。

そこに書かれてあった内容は、以下の通り

目次

  • タイトルで勝負!!
  • 先頭に目次を付ける
  • タイトルと内容を合わせる(メタ情報を入れる)
  • ソーシャルを利用する
  • 続ける
  • 最後に
ここからは、細かな説明を始めます。(私自身の解釈が多いので間違っている所も有るかも知れない。。。)

タイトルで勝負!!

このポイントは、ほとんどの方が書かれているポイントでした。
とにかく、クリックしてページを開いてもらわないと、どうしようもないと言う事で、そこにはキャッチーなタイトルが必要との事です。

どうすればキャッチーなのかというと、ブログ書いている本人の感情を入れる事により、注目を集めると言う事と、その後に続く文面の内容で読んで貰いたい人へのメッセージを送る事により、共感をえて、ページに引き込ませ(クリックして貰う)、ページビューUP!!というテクニックだそうです。

なので、今回のブログのタイトル、今までのタイトルと少し違って比較すると違和感を感じるかと思います。
しかし、これはポイントを踏まえて作った内容なのです!!

先頭に目次を付ける

次に、ページを開いて貰ってからの動作についてです。
興味を持って開いて貰ったのに、中身がただただ文字が並ぶ様な内容では、ゲッソリしますし、一体何処にその内容が書かれているかを探すのが面倒になり、結局別のページに移動されてしまいかねません。
別に開いて貰ったから良いだろと思うかも知れませんが、今後このページはつまらないと思われ、続けて見て貰う事もなく、単発で終わってしまうという結果になるかと思います。

内容は、どうであれページ先頭に目次を付ける事によりユーザの目的とする内容までスムーズに行けるようにするために、目次を付けると良いという事です。
これを踏まえ、今回は目次を付けてみました。

タイトルと内容を合わせる(メタ情報を入れる)

これは、タイトルの部分にもかかる内容となりますが、タイトルに沿った内容が本体文面でも書いてあると言うことになります。
当然と言えば当然ですが、タイトルとかけ離れた内容では、まず持って直ぐにページを移動されてしまいます。
また、タイトルの内容はあるけど、一部だけで後は違う内容とか、普通に考えたら二度と見ようと思いませんね。

括弧書きの部分については、メタ情報を確実に入れる事により、ロボットにインデックスを貼りやすくして貰い、検索を掛けたときになるべく上位に上がるようにすると言った物です。

ここで言うメタ情報とは、文面に出るキーワードの事になり、今回のタイトル
「こうすればいいのか!ページビューUPの方法」
であれば、「ページビューUP」 あたりがメタ情報になるのかと思います。

ロボットについては、ホームページなどをお持ちの方などは、知っている内容かも知れませんが、検索エンジン(Googleとか)で使用する、キーワードをWeb 上に上がっている内容を確認して収集するプログラムの事になります。

ソーシャルを利用する

ページビューを上げるには、タイトルによるユニークユーザーの引きつけもさることながら、お得意様を作って、見て貰う事が一定数のページビューを稼ぐ方法になるかと思います。

少し前までは、インターネットがあってもそれ程人と人のつながりが無かったかと思いますが、今の時代は、SNS が盛んになっており、一人から、さらにもう一段階次の人へのアプローチが出来たりする様になってきています。

なので、ページには各SNSへの宣伝ボタンを設置してページビューUPを図りなさいという事です。
具体的には、いいねボタンを設置したり、ブックマークに簡単に登録できるボタンを設置したりして、お客さんの煩わしさを取り除くと言う事になります。

続ける

最後にはなりましたが、このポイントが結局ブログ書いている人には一番重要な内容ではないかと思います。
情報は、生ものなので一旦作ったらOKではありません。最新の話題も必要ですし、なにより動いて(更新がない)いないページには面白みがありません。
しんどいけど、一年続けたら「ページビューUP」が起こったと言う方のブログも見ました。


最後に

今回のポイントを見て感じた事は、見て貰うページを作るという事は、商売をする感覚と同様という事でした。
自分の商品(日々の記事)を見て貰うためにお客さんを引きつける様にしないといけないことや、いざお店に来たお客さんには満足して貰うように頑張るなど。
普段はプログラムばっかり書いて営業が今ひとつな自分には今回の調査は非常に為になりました。
また、文の構成の仕方などはデザイナーの知識も必要なのだという事も分かりました(行間の使い方とか)。

今回の内容は、全然序の口で、実際深く学べばまだまだ改善点があります(書ききれていませんが)。
これで実際どれくらい UP するか分かりませんが、上手くいっていたら再度報告をしたいと思います。

2013年8月3日土曜日

ポモドーロテクニックが使いこなせない

技術的な内容を書いていないな。。。

さて、今回は「ポモドーロテクニック」について書きます。
(ポモロードといってしまう事が多い)

まず、なぜポモドーロ(トマト)と言う名前なのかというと、この仕組みを考えた人がトマトのタイマーを使っていたのでこの名前になったそうです(で?とか言わない)。

一体なんなの?

何かと言うと一人アジャイル的に使う仕組みだそうです。
一日という単位で、タイムボックス(25-5分のワンセットを数回)を設け、終了後は振り返り(イテレーション)をすると言った感じ。

だらだら(ずるずる)と仕事をしてしまう自分には合ってるかなと思ったんで、採用してみようと思いました。
本家サイトもあり、また Web で探せば色々な方が取り上げていますが、いつでも読めるようにと本の購入をしました。

「アジャイルな時間管理術 ポモドーロテクニック入門」
Staffan Noeteberg (著)
渋川 よしき/渋川 あき (翻訳)
\ 1,890

本家サイト(英語)。
http://www.pomodorotechnique.com/

どうやるの?

内容としては、上にも書いたとおり 25 分間集中して作業を行い 5 分間休むを繰り返すといった内容になります。

手順
  1. やる事を決める
    この時にポモドーロ(25-5分のセット)数を見積もる
  2. 25 分間一心不乱で決めた事をやる
  3. 5 分間休む
  4. 1. で決めた内容が無くなるまで 2.3.を繰り返す
  5. やった事の振り返りを行う
大まかなルールとしては上記の通りですが、細かなルールとしては、割り込みが入ったら印を付けるや、見積もりが間違っていたら追加で見積もりをするなどありますが、まずは上記の内容を実践すれば良いかと思います(詳しく知りたい方は本を買ってみて)。

で、どうなの?

実際やってみた所、これが割と難しい。
25 分間一つの事についてやっていても気が散る物です。
(自分だけかもしれませんが。。。)

本によると、5 分程度から開始して、出来るようになったら分数を増やして行けとなっています。
また、この 25 分と言う時間も根拠があり、この分数を越えると結果作業のパフォーマンスが落ちるため、お勧めしないという事になっています。

自分としては、決めた内容についてやり始めた物の、調べ物をしていると別の疑問が沸いてそれを調べて。。。を繰り返している内に目標からずれているという事に気がつき、結果上手く使えていないようになってしまっています。

また、タイマーも他人の目を考えると、爆音の物理的な物(スマートフォンのバイブすら)が使えないため、ストップウォッチを採用するが止め忘れや、時間が気になってしょうがないなどと、何か手段が目的になって何をやってるのか分からない状態になってしまいました。

スマートフォン用の対応アプリを使えば良いかと思いましたが、結局良いやつが有りませんでした。
ビジュアル的なベル機能が有れば良いんですけどね(作ろうか。。。)

言い訳のように聞こえますが、すみません。人の目が気になるんです。

こんなのだから、一日の終了にレコーディング(イテレーション)をした方が良いのですが、翌日忘れていた事に気がつく有様。


最後に

残念な内容の記事になってしまいましたが、習慣として先日紹介した「Lift」と組み合わせれば、良いかと思います。

このブログもポモドーロで書けば良かったけど。。。忘れてた、、、

Mac からのメールで文字化け

普段仕事では Mac を使うようになった。
Mac で作業をしているけど、これといって Windows との差については、感じていなかった。

そんな中、先日より Mac で作成したファイルについて、メールに添付して送信していた。
特に気にせず、数回やりとりをしている内に、先方から電話があった。

「添付ファイル毎回文字化けしてんだけど・・・」

えっ?と思ったが、Mac 側から見ている分には文字化けしていない。
先方は基本的に Windows なので、この点を踏まえて確認してみた。

どうやら Mac 側でファイルを作成すると、UTF-8 でファイル名が作られるようだ。
相手の Windows については、Shift-JIS のようだ。
この文字コードの齟齬により、文字化けが発生している。

これを解決する方法が無いものか調査したところ、以下の方法があった。
  • MacWinZipper (WinArchiver)を使用する。
  • バーチャルを使用して Windows を立ち上げ、その Windows からファイルを添付する。
 MacWinZipper (WinArchiver)については、インストールしてファイルを圧縮すれば良いらしい。
しかしながら、使い方が悪かったのか確認したところ文字化けは直らなかった。

次のバーチャルを使用して Windows を動かし、その Windows からファイルを送信すると言った形は、当然 Windows の環境からなので、文字化けすることなく送信する事が出来た。

結果バーチャルを使用する形にした。

しかし、面倒だ。。。

2013年8月1日木曜日

Blogger との相性

Blogger との相性が悪いのか、ここ数日での Blogger で起きたエラーを書いておく。

概要ページエラー

ダッシュボードから概要のページを開く際にエラーが発生し、ページビュー数等の確認が取れない。この時はエラーメッセージが表示され、さらに問い合わせの時に使用するコードが表示されるのだが、結局このコードをどうしたらいいのか分からない。
問い合わせボタンぐらい付けて欲しい。。。

下書き記事のレイアウト崩れ

画像を挿入した記事を保存し下書き状態として、再度記事を編集しようとするとレイアウトが崩れてしまう。再度レイアウトをするのは、面倒だ。

公開ボタンの無視

公開ボタンを押したにもかかわらず、下書き状態になっていて、公開されていなかったりする。
Google+ と連携しているので、公開してもらわないと困るんだが。。。

以上が、今のところ確認している内容。
使い方が悪いのかも知れないが、結構編集画面の使い勝手が悪い。

Visio 2013 から古いバージョンの Visio ファイルを開く

タイトルのままだが、Visio 2013から古いバージョン(2012以前)のファイルを開こうとすると、以下のウインドウが表示されファイルが素直に開けない。











最初は Excel 等々で表示されるマクロの警告かと思っていたので、ファイルが開かなかったときは、唖然としてしまった。
(この状態が起こったのは、Visio2013で作成したファイル(数時間かけて作成)を、古い形式で保存して確認しようとした時に発生したため)

この場合の対処法は、ウインドウに書かれているままだが、このウインドウを消してからの作業となるため、記憶力の良い人はいいが、自分のような人間は困る。
方法としては、スクリーンショットを取るとか、紙に書くとかWebで検索するの方法を取れば良いが、文面を読んだ所で結局どうするかわからなかった。

Webで調べてみたのだが、ファイルを安全な場所へ持って行けとか、フォルダの権限を変更しろだとか変な記事ばかりが引っかかり、さらにパニック状態になった。

一時の絶望感を覚えながら、弄り倒した結果、答えは実にシンプルだった。
以下の手順を踏めば良いだろう。

まず、先ほどの説明ウインドウを「OK」 ボタンを押して、ウインドウを閉じ、左上の「ファイル」をクリックする。






メニューが表示されるので、「オプション」をクリックする






オプション画面ウインドウが表示されるので、「セキュリティセンター」をクリックして、「セキュリティセンターの設定」ボタンをクリックする。
















セキュリティセンターが開くので、「ファイル制限機能の設定」をクリック。
ファイルの種類が表示されているので、今回対象となるVisoのバージョンの「開く」のチェックボックスを外す。
















「OK」ボタンを押して、Visio を閉じ、再度対象ファイルを開くと無事表示される。

たったこれだけの事なのだが、文章理解力が乏しいのか、勘が悪いのか知らないが絶望と歓喜の両方を味わったのであった。

習慣付けアプリ「Lift」

ブログを書き始めているが、この作業もネタが有る場合は書くのにもそんなにも苦痛ではないが(とはいえ小一時間はかかる)、ネタがない場合や時間的余裕が無い場合は結構苦痛となる。
それは、どのブロガーにも言える事だろう。

いままで、やっていなかった事を始め、習慣づけてしまえば、このような事も考えないだろうと思った。
しかし、怠け癖やモチベーション不足により早々続かない。

そこで、今回は習慣づけをスマートフォンで補助できるツールを紹介かつ使って見た。

「習慣づけ iPhone アプリ」

のキーワードで検索をかけると、

  • 21日習慣づけ
  • Lift
という2つのアプリが良いと言われている。

今回「21日習慣づけ」については、有料アプリのためパスした(iTunesカード買うのが面倒)。
なので、今回は「Lift」を使ってみる事にした。

「Lift」については、今のところ無料アプリとなっている。

このアプリは、SNS を使ったサービスとなっている。
この時点でSNSに抵抗ある人は、このアプリは使いたく無いかも知れない。
(たぶんスタンドアロンでも使用できるとは思うが)

習慣づけたい事を宣言(グループ?Habitsに登録)し、作業が完了したときに、完了を同じ習慣づけをしたい人達へ知らせると言う物。

つまりは、同じ目的意識を持つ人間に知らせる事により、やる気を維持しましょうと言った感じであろうか?

機能としては、うっかり防止ようにリマインダーへの登録や、Habits の編集がある。


現段階でのレビュー
使い始めて数日しか経っていないため、参考にはならないかも知れないが、今の段階でのこのアプリの印象については、

  • 「シンプルすぎる」
  • 「同じような Habits が乱立している」
  • 「日本人が少ない?ため完了を報告しても意味あるか分からない」

と言った点だろうか。

シンプルすぎるは、そのままで、最初は使い方がよく分からなかった。
Habits の登録を行って(無い場合は作成する)使用するのだが、同じような Habits が乱立しているため、例えば、「本を30分読む」の場合「Book 30」「Read a book 30+」「READ BOOK 30 MIN」etc... と選択に困る(participant(参加者数)がある程度の指標にはなると思うが)。

また、完了後にボタンを押すと、完了回数のカウントアップと、SNS への一言メッセージを書く程度。
SNS なので、他のユーザの状況も上がってくるが、それに対して「いいね(アプリ独自のやつなのでfacebookとはちがう)」とコメントを送れるようになっているが、人の習慣に対してこの機能を使う気が起きないのは言うまでもない。
また、ここでの完了報告は、facebook や twitter に上がっていない様だ(ログインにこれらが使えると言った事なのだろう)

メッセージについても、英語でのやりとりのため(他の言語での投稿を見た事無い)、若干抵抗がある。

以上が、今の所の感想。
わざわざ習慣づける事を世界に発信して反応をもらう必要があるかと言うと、全てが終わってしまうのだが、一応管理するアプリとしては使えると思う。