PGメモ

非エンジニアの記録

URLエンコード [Xcode / swift]

http://www.flickr.com/photos/60254547@N03/16717921271
photo by KellarW


APIで日本語クエリ投げたい時など、エンコードしたい時ありますよね

var text:String = "なんとかかんとか"
var encodeText:String! = text.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

MPMovieControllerでYoutubeの動画再生[Xcode / swift]

http://www.flickr.com/photos/23963573@N08/3606295240
photo by redsoul300

探しまくってようやく出来たのでメモ。
簡単にまとめると以下
・MPMovieControllerではそのままyoutubeの再生はできない
・そのためHCYoutubeParserというライブラリを使用(非公式)
・Bridging-Headerの設定を行う(上記ライブラリがObjective-Cのため)
・動画を表示させるコントローラーにソースを記述

import UIKit
import MediaPlayer

class ViewMovieController: UIViewController{
    
    var moviePlayer : MPMoviePlayerController?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let srcUrl = NSURL(string:"{youtubeのURL}?feature=player_detailpage&playsinline=1")
        let dict = HCYoutubeParser.h264videosWithYoutubeURL(srcUrl)
        let url = NSURL(string: dict["medium"] as! String)

        self.moviePlayer = MPMoviePlayerController(contentURL: url)
        if let player = self.moviePlayer {
            player.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)
            player.view.sizeToFit()
            player.scalingMode = MPMovieScalingMode.Fill
            player.fullscreen = true
            player.controlStyle = MPMovieControlStyle.Fullscreen
            player.movieSourceType = MPMovieSourceType.File
            player.repeatMode = MPMovieRepeatMode.One
            player.play()
            self.view.addSubview(player.view)
        }
}

UILabelの文字を上寄せにする[Xcode 6/ swift]

http://www.flickr.com/photos/8489692@N03/5169694908
photo by katerha

UILabelにはなぜか上寄せがないので、コードを書く必要があります。

@IBOutlet weak var label: UILabel!

override func viewDidLoad() {
        super.viewDidLoad()

        label.text = 'なんか長い文字列・・・'
        label.numberOfLines = 0
        label.sizeToFit()
}

numberOfLinesを0にした後に、sizeToFit()で大きさを計算して合わしています。
以外と簡単なのでよかったです。

ちなみにこの処理はlabelの内容を変更するたびに行わなければいけません。

GooglePlayでAPKが新バージョンが公開できない

GooglePlayで新バージョンが公開されないよ。
APKは上げたのに!

この設定は次の理由から公開できません:
バージョン 1 は端末設定に配信されません: バージョン 1 がダウンロード候補となるすべての端末でバージョン 102, 2 のうちいずれかのバージョンがダウンロードされます。
一部の端末が複数の APK の実行対象となっています。このような場合、端末では最も高いバージョン コードの APK が受信されます。

英語だと

Version xx is not served to any device configuration: all devices that might receive version xx would receive one of versions

世の中にはいろんな意見がありますが
僕の場合は古いAPKを「無効」にすると新しいAPKが公開できるようになりました。

「無効」にするとAPKの公開がされなくなって現行バージョンがダウンロードできなくなるんじゃないかって思いますが。そんな事ないのでご安心を。

戻るを実装する[X code6/swift]

http://www.flickr.com/photos/34838158@N00/4151021631
photo by alexkess

戻るを実装したいが、なかなかいいのが見つからなかったのでメモしておく。
①元の画面
②遷移先
とする
今回やりたいのは②の遷移先から①の元の画面に戻りたいのだ。

で、結論から言うと3ステップ
1. ①に戻るためのメソッドを記述
2. ②に戻るためのボタンを設置
3. ②のボタンとExitを1で作成したメソッドで繋げる

戻るためのメソッドを追加

以下を①のクラスの中に追加

    @IBAction func unwindAction(segue: UIStoryboardSegue){
        
    }

ボタンを設置

②の画面のどこでもいいのでボタンを設置してください

ボタンとメソッドをつなげる

設置したボタンをcontrol押しながら一番右のExitにドラッグします。
すると1のメソッドが出てくるので選択します。

これで戻るが実装されているはずです。

アプリで録音してサーバにアップロードする[Swift / XCode 6]

アプリで録音してサーバにアップロードする処理がどこを探してもないのでメモしておく。

録音するまでは調べれは出るので、録音した後の処理。

   func myAudioUploadRequest(recorder : AVAudioRecorder)
    {
        
        var myUrl:NSURL = NSURL(string: "http://localhost/voice/upload.php")!
        var fileurldata:NSData = NSData(contentsOfURL:recorder.url, options:nil, error:nil)!
        var request = NSMutableURLRequest(URL: myUrl)
        request.HTTPMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        var base64String = fileurldata.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
        var err: NSError? = nil
        var params = ["sound":[ "content_type": "audio/aac", "filename":"test.m4a", "file_data": base64String]]
        request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions(0), error: &err)!
        
        var session = NSURLSession.sharedSession()
        var task = session.dataTaskWithRequest(request, completionHandler: { data, response, error -> Void in
            var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
            var err: NSError?
            
            // process the response
        })
        
        task.resume() // this is needed to start the task
    }

録音が終わった時点でファイルが生成されているので、そのパスからデータをNSDataにして、base64encodeを行う。
あとはjson形式のパラメータにつっこんでポストする。
サーバ側の処理はjsonに対応して以下のように

$json_string = file_get_contents('php://input');
$obj = json_decode($json_string,true);
$sound = $obj['sound']['file_data'];
$fp = fopen("[file_path]/test.m4a",w);
fwrite($fp,base64_decode($sound));
fclose($fp);

もろもろ処理は残るが、だいたいこんな感じ。

Macで仮想環境を構築する

http://www.flickr.com/photos/34247648@N02/4298911131
photo by racheocity

Macに仮想環境を構築してみる。
標準でapacheが入っているが、中身を汚したくないので別で作ろうと思った。

今回は下記を使用
・Virtual Box
Vagrant
・CentOS7.1

まずはVirtual Boxのインストール
Oracle VM VirtualBox - Downloads | Oracle Technology Network | Oracle

インストールしたら次はVagrant
Download Vagrant - Vagrant

Vagrantは仮想環境構築を便利にしてくれるツールで。コマンドを打つだけで全て済むのでかなり衝撃的。

Vagrantのインストールが終わったら、OSのインストール
vagrantでは

vagrant box add {好きな名前} {URL}

と打てば仮想環境を構築することができる。

今回CentOS7.1を使うので下記からURLを持ってくる
http://www.vagrantbox.es/:site

あとは先のコマンドの通りに打てばOK

vagrant box add centOS71_64  centOS71_64 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box

Successfully added box 'centOS71_64'
と出れば追加完了。

vagrant box list

で追加が確認できます。

あとは適当な所にディレクトリを作って仮想環境を立ち上げます

mkdir centOS71_64
mv centOS71_64
vagrant init
vagrant up
vagrant ssh