2010/08/05

Xcodeのエディタでは標準でvimは使えないけど、何か方法はないかなと? Xcodeのコード補完は素晴らしいけど、やっぱり非効率な面も多々。

という事で、調べてみる。

MacVimとcocoa.vimで世界が変わった

うーん、XcodeでVimを使うんじゃなくて

VimでXcodeをビルドするってことなのね・・・残念

  2010/08/05

最近、githubでソースを公開してる人も増えてるのでOSXでも構築することに。

marportsでインストールです。

sudo port selfupdate sudo port install git-core tig

tigはgithubを見やすくするツールみたいだ。

  2010/08/04

3D!とまではいかないが、Quartzでグラフィックの基本処理を。

Quartzで描画する大まかなポイント

(1) 描画用のUIViewクラスを作る (2) 表示するxibのviewを(1)で作成したUIViewに変更する (3) drawRect:(CGRect)rect を実装する (4) UIGraphicsGetCurrentContext()でcontextを取得し、CGContextのメソッドで描画する

4の手順や数学的な事はサイトにはよくのってるけど、1〜3の方法(これだけじゃないと思うけど)が抜けてるので実際に描画にいたれなかったり。。。。 特に、drawRect:(CGRect)rectメソッドが何の前触れもなく記述されているから混乱します(自分も迷ったw)

drawRect:(CGRect)rectはUIviewに定義されているメソッドで、画面更新処理の時に実行されます。 同じインターフェイス内のsetNeedDisplayでも呼ぶ事ができるようです。

(1) 描画用のUIViewクラスは、Objective-c classの作成で、UIViewにチェックして作る。 ※今回はScoreViewと命名した iphone

(2) グラフィックを表示するxibを開いて、viewのクラスをScoreViewに変更する iphone

(3) drawRect:(CGRect)rect を実装する

#import "ScoreView.h"

@implementation ScoreView

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {

    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    NSLog(@"drawRect");

    context = UIGraphicsGetCurrentContext();
    //CGContextTranslateCTM(context, 0, rect.size.height);
    //CGContextScaleCTM(context, 1.0f, -1.0f); 
    
    CGContextSetRGBStrokeColor(context, 0.0f, 0.0f, 0.0f, 1.0);
    CGContextSetLineWidth(context, 1);

    scoreValues = [[NSArray alloc] initWithObjects:
    
    [self drawBar:1];
    
    CGContextFlush(context);
}

-(void) drawBar:(NSInteger) barNumber {
    float barWidth = 80.0f;
    float marginX = 10.0f + ((barNumber - 1) * barWidth);
    float marginY = 20.0f;
    float barPosX = 0.0f;
    float barPosY = 0.0f;
    float barInterval = 5.0f;
    
    float startPosX = 0.0f;
    float startPosY = 0.0f;
    float endPosX = 0.0f;
    float endPosY = 0.0f;

    for (int i = 0; i <= 4; i++) {
        startPosX = marginX + barPosX;
        startPosY = marginY + barPosY + i * barInterval;
        endPosX = startPosX + barWidth;
        endPosY = startPosY;
        
        CGContextBeginPath(context);
        CGContextMoveToPoint(context, startPosX, startPosY);
        CGContextAddLineToPoint(context, endPosX, endPosY);
        CGContextDrawPath(context, kCGPathStroke);
    }
}
@end

以下のコードを追加すると、座標系が左下を原点(0, 0)とした処理になります。

    CGContextTranslateCTM(context, 0, rect.size.height);
    CGContextScaleCTM(context, 1.0f, -1.0f); 

またタッチして手書き描画する場合は、以下のイベントメソッドを利用する

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

  2010/08/03

ネットワークプログラムを作る場合は、事前のネットワークの確認は必須ですね。 と言うのも先日、社内でデモしようと思ったらアプリが動かない・・・

バグか?と思ったら、

単にWebテストサーバ(自分のWindows)がスリープしてたw

という訳で、Apple DeveloperサイトにReachabilityっていうサンプルコードがあるみたい。

Reachabilityのダウンロード

Apple Developer > Reachability

Reachabilityの参考ページ

iPhone Reachability ネットワーク接続を確認する

で、やってみたけど動作が怪しかったので、NSURLConnectionを直接使って実装してみることにした。

NSURLConnectionの参考ページ

NSURLConnection (非同期)NSURLConnectionを使ってサーバーからデータを受信する

非同期通信のサンプルコード

NSURLConnectionに非同期通信用のdelegateメソッドが用意されているので実装する。

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog(@"----didReceiveData----");

}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"----connectionDidFinishLoading----");
}

-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error{  
    NSLog(@"----Connection failed! Error - %@ %d %@----",  
          [error domain],  
          [error code],  
          [error localizedDescription]);  
    UIAlertView *alert = [[UIAlertView alloc] 
                          initWithTitle:@"ネットワークエラー"
                          message:@"サーバに接続できません"
                          delegate:self
                          cancelButtonTitle:@"閉じる"
                          otherButtonTitles:nil
                          ];
    [alert show];
    [alert release];
    
    if([error code] ==  NSURLErrorNotConnectedToInternet){
        return;  
    }  
} 

NSURLErrorNotConnectedToInternetでiPhone自体がネットワーク自体に接続しているかもチェックできる。

ネットワークチェックのメイン処理を実装する。

-(BOOL)checkNetwork:(NSString *)host {
    NSLog(@"---checkNetwork---");
    NSURLRequest *reqest = [NSURLRequest requestWithURL:[NSURL URLWithString:host]
                                            cachePolicy:NSURLRequestUseProtocolCachePolicy
                                        timeoutInterval:60.0];
    
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:reqest delegate:self];
    if (connection) {
        NSLog(@"Success");
        return YES;
    } else {
        NSLog(@"Error");
        return NO;
    }
}

とりあえず同期処理で作成してみたが、非同期通信をする場合はdidReceiveDataに処理を書く感じになるのかな?

Reachabilityは時間空いた時に調査かな??

  2010/08/03

JavaScript(ActionScriptもか)使ってるとレイヤーの重なりって結構面倒だったりする。 実行順を把握していないと、各要素の重なりがわけわかめになったり・・・

と言うわけで、HTML(CSS)内のz-indexの最大値を取得して変更するスクリプトが必要 ここのソースをほぼそのまま使ってみる。 [Javascript] z-indexの最も大きい値を取ってくる

サンプルコード


function topZIndex(id) {
    $(id).css('z-index', getMaxZIndex() + 1);
}

var getMaxZIndex = function(){
    var largestZIndex = 0; 
    var defaultView = document.defaultView;
    var func = function(tagname){
        var elements = document.getElementsByTagName(tagname);
        for (var i=0; i< elements.length; i++){
            var element = elements[i];
            var zIndex = element.style.zIndex;
            if (!zIndex) {
                var css = element.currentStyle || defaultView.getComputedStyle(element, null);
                zIndex = css ? css.zIndex : 0;
            }
            zIndex -= 0;
            if(largestZIndex < zIndex) largestZIndex=zIndex;
        }
    };
    if(arguments.length == 0) {
        func('*');
    } else {
        for(var i=0; i

ただこれだと、z-indexがアクションごとに無限に増加してしまうので改良の余地あり。

  2010/08/03

てか、こんなのありかよw

IEでaddEventListenerが使えない!

CSSもまともに動かないし、どんだけダメブラウザなんだIE・・・ IEではattachEventでイベント登録するらしい。

サンプルコード


    if (uploadFileField.addEventListener) {
        uploadFileField.addEventListener('change', onChange, false);
    } else if (uploadFileField.attachEvent) {
        //IE対策 
        uploadFileField.attachEvent('change', onChange, false);
    }

もう独自路線止めて、WebKitでいいよ。。。

  2010/07/30

hostsファイルを編集

sudo vi /private/etc/hosts

127.0.0.1 localhost 192.168.1.52 colinux 255.255.255.255 broadcasthost ::1 localhost fe80::1%lo0 localhost

プロセスを切る

sudo kill -HUP `cat /var/run/lookupd.pid`

  2010/07/27

最近のFireFoxは重過ぎてもう限界! てことで会社PCの標準ブラウザをGoogle Chromeにした。 Operaも悪くないんだけど。

てか、むちゃくちゃ快適

とりあえず、インストールしたプラグインは

Google Chrome 機能拡張 ・Bookmarks Menu ・Docs PDF/PowerPoint Viewer(by Google) ・Downloads ・Evernote ウェブクリッパー ・Firebug Lite for Google Chrome ・Google bookmarks ・Google Mail Checker ・Google Translate ・IE Tab ・Metrist - Twitter Client ・webページショット

  2010/07/23

第二階層から第一階層に戻る場合、第一階層のtitleをつけないとNavigationBarのボタンが表示されません。

凄く悩んだ・・・ iphone

ただ階層毎にNavigationBarのItemを多用する場合は、その階層にNavigationBarを持ったほうが現実的な気もする。 コーディングでitemを追加することもできるだろうが、ビジュアル的にわかりにくそう。

関係ないけど、ホリエモンつぶやきすぎw

  2010/07/22

これもWordpressでSyntaxHighlighterをインストールすると以下のように簡略化して入力できる。

[cpp]
ソース

これを

&lt;pre class="brush:xxx"&gt;ソース&lt;/pre&gt;

に変換するスクリプト。
調べたら「wordpress/wp-content/plugins/syntax_highlighter.php」で処理しているようだ。

てな訳で、同じ仕様で自作してみることに。

サンプルコード

function syntax_highlight_header() {
    $syntaxHighlighter = SyntaxHighlighter::getInstance();
    $syntaxHighlighter-&gt;showHeader();
}

function syntax_highlight_decode($body) {
    if ($body) {
        $syntaxHighlighter = SyntaxHighlighter::getInstance();
        $syntaxHighlighter-&gt;convertContent($body);
    }
}

class SyntaxHighlighter {

    var $types = array(
        'as3'  =&gt; array('brush' =&gt;'AS3'),
        'bash' =&gt; array('brush' =&gt; 'Bash'),
        'cpp' =&gt; array('brush' =&gt; 'Cpp'),
        'csharp' =&gt; array('brush' =&gt; 'CSharp'),
        'css' =&gt; array('brush' =&gt; 'Css'),
        'delphi' =&gt; array('brush' =&gt; 'Delphi'),
        'coldfusion' =&gt; array('brush' =&gt; 'ColdFusion'),
        'java' =&gt; array('brush' =&gt; 'Java'),
        'javafx' =&gt; array('brush' =&gt; 'JavaFX'),
        'jscript' =&gt; array('brush' =&gt; 'JScript'),
        'diff' =&gt; array('brush' =&gt; 'Diff'),
        'erlang' =&gt; array('brush' =&gt; 'Erlang'),
        'groovy' =&gt; array('brush' =&gt; 'Groovy'),
        'perl' =&gt; array('brush' =&gt; 'Perl'),
        'php' =&gt; array('brush' =&gt; 'Php'),
        'plain' =&gt; array('brush' =&gt; 'Plain'),
        'powershell' =&gt; array('brush' =&gt; 'PowerShell'),
        'python' =&gt; array('brush' =&gt; 'Python'),
        'ruby' =&gt; array('brush' =&gt; 'Ruby'),
        'shell' =&gt; array('brush' =&gt; 'Sass'),
        'scala' =&gt; array('brush' =&gt; 'Scala'),
        'sql' =&gt; array('brush' =&gt; 'Sql'),
        'vb' =&gt; array('brush' =&gt; 'vb'),
        'xhtml' =&gt; array('brush' =&gt; 'Xml'),
    );

    private static $instance = null;

    public static function getInstance() {
        if (SyntaxHighlighter::$instance == null) {
            SyntaxHighlighter::$instance = new SyntaxHighlighter();
        }
        return SyntaxHighlighter::$instance;
    }

    public function showHeader() {
        $tags[] = $this-&gt;javascript_tag('dp.SyntaxHighlighter/src/shCore');

        if (is_array($this-&gt;types)) {
            foreach ($this-&gt;types as $key =&gt; $value) {
                $tags[] = $this-&gt;javascript_tag("dp.SyntaxHighlighter/scripts/shBrush{$value['brush']}");
            }
        }
        $tag = implode("\n", $tags);
        echo($tag);
    }

    public function convertContent($body) {
        $bodys = explode("\n", $body);
        if (is_array($bodys)) {
            $isCode = false;
            foreach($bodys as $key =&gt; $line) {
                $start_code = $this-&gt;syntaxHighliterCode($line);
                if ($start_code) {
                    $code = $start_code;
                    $tag.= "&amp;ltpre class=\"brush:{$code}\"&gt;\n";
                } else {
                    if ($code) {
                        if ($this-&gt;isSyntaxHighliterEndTag($line, $code)) {
                            $tag.= "&lt;/pre&gt;\n";
                            $code = null;
                        } else {
                            $tag.= "{$line}\n";
                        }
                    } else {
                        $line = html_entity_decode(strip_tags($line), ENT_QUOTES, mb_internal_encoding());
                        $line = "{$line}\n";
                        $line = nl2br($line);
                        $tag.= $line;
                    }
                }
            }
        }
        echo($tag);
    }

    private function syntaxHighliterCode($value) {
        $pattern = '/^\[[a-zA-Z0-9]+\]/';
        if (preg_match($pattern, $value, $matchs)) {
            $code = substr($matchs[0], 1, strlen($matchs[0]) - 2);
            $code = strtolower($code);
            if ($this-&gt;types[$code]) {
                return $code;
            }
        }
    }

    private function isSyntaxHighliterEndTag($value, $target) {
        $pattern = '/^\[\/[a-zA-Z0-9]+\]/';
        if (preg_match($pattern, $value, $matchs)) {
            $code = substr($matchs[0], 2, strlen($matchs[0]) - 3);
            $code = strtolower($code);
            return ($target == $code);
        }
    }

    private function javascript_tag($name) {
        if (is_string($name) &amp;&amp; !empty($name)) {
            return "&amp;ltscript type=\"text/javascript\" src=\"{$GLOBALS['controller']-&gt;relative_base}javascripts/{$name}.js\"&gt;\n";
        }
    }

}

解説

htmlヘッダーでsyntax_highlight_header()を呼んで、ブログの本文syntax_highlight_decode($text)で変換してやります。

あとDBに保存するときは、htmlentitiesでエスケープしました。

&nbsp;htmlentities(本文, ENT_QUOTES, mb_internal_encoding());

即席でバグバグだと思うけど、とりあえずコンバートできました。 正規表現でパースする部分が美しくないし、singlton使う意味がないかも・・・

pngファイルの軽量化
Google DriveのIconを再起的に削除
php-markdownでバニラPHPなコードブロック処理
laravel-ffmpeg を使う
2021年版 Ubuntu + certbot + Let's Encrypt でサーバ証明書設定
GihHub のデフォルトでない master ブランチを checkout する
マルチログインで未認証のリダイレクト
Homebrew で Redis をインストール
CSS だけでスムーズスクロール
EC-CUBE4 で Gmail の smtp を利用する
Amazon Linux 2 の amazon-linux-extras とは
UNIQUE カラムのバリデーションで自分自身を除外して更新
フォーム有効期限切れで Page Expired をリダイレクト
ログを日付でローテーションやクリアや削除
Homebrew で PHP8.0 から PHP7.4 にダウングレード
Big sur で zsh 移行と Homebrew アップグレード
Mac に minikube をインストール
途中から .gitignore に追加する
Larevel 6.x から Laravel 8.x にバージョンアップ
Composer で Allowed memory size (メモリ不足)エラー
Blade でカスタムクラスを利用する
git push git pull にブランチ指定せずに実行する
git pull や git push できなくなったとき
Docker のコンテナからホストOS に接続
Mac で ローカル IP アドレス(ipv4)のみを表示する
ホストOS から Docker の MySQLコンテナに接続
caching_sha2_password のエラー
node-config で環境設定ファイルを利用する
rootパスワードを初期化(再設定)する
Git から clone したときのエラー対処
Mac に MySQL をインストール
Mac に PostgreSQL をインストール
Laravel 環境構築 - Mac ネイティブ編
Firebase 入門 - Firebase とは
Firebase 入門 - CLI インストールとデータベースの設定
AWS 無料枠(t2.micro)で容量とメモリエラー
Cloud9 を起動する -初心者編-
gcloud で GCEインスタンスを起動してみる
AWS CLI と jq でインスタンス一覧を整形して表示
React と Laravel7 のプロジェクトを作成する
Homebrewインストール-2020年版
3直線で囲まれた範囲塗りつぶし
PuLP で線形最適化問題を解く
カスタムのペジネーションを作る
node-sass を使って sass をコンパイルする
Log ファサードでSQLログを分離して書き出す
いちから始める Docker - 複数のコンテナを使う - (2020年)
いちから始める Docker - docker-compose を使う - (2020年)
AWS ECR を使ってみる
Laravel7 でマルチ認証