Command (中略)/usr/bin/llvm-gcc-4.2 failed with exit code 1

でビルドできない時は、赤字の不明ファイルがプロジェクトにあるので削除すればよい。

親ディレクトリが存在しない時でもまとめてディレクトリを作成する

iOSでディレクトリ作成をする際、親ディレクトリがないと作成されないとか面倒なので

存在しない時には、まとめて作ってもらうようにする。

[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];

Xcode4.2にしてから3Gのデバッグが出来ない&動作がおかしい

Xcode4.2+SDKをiOS5にしてから、シミュレータじゃ普通に動くけど

3Gの実機で動かすと、どう見ても導入前とアプリの動き違うだろって箇所があって驚いた。

「Build Options」から「Compiler for C/C++/Objective-C」を「LLVM GCC 4.2」にすると解決した

…気がするだけなのかも。コンパイラ周りの勉強不足で根拠不明。

あとDebugビルドにも関わらず、ブレイクしても変数が出ないようになって困り中。

※ただし、iOS5SDKからのテンプレコードでいくつかエラーが出るので諸々動く旧タイプの書き方に修正する必要あり

iOS reason image not found

Xcode4.2 + iOS5 にしてから色々トラブル発生中。

前の記事で実機で動くようになったと思ったら今度はシミュレータで動かなくなる。

具体的には「iOS reason image not found」と出てしまって起動しないので、

プロジェクトの設定から「Build Settings」を開く(PROJECTとTARGETSそれぞれあるので両方入れる事)

「Linking」のグループ内に「Other Linker Flags」という項目があるので

それを選択して「+」を押し「-Wl,-no_implicit_dylibs」を加える(カンマでわけず1つに全部入力してよい)

クリーン&ビルドで解決。

---[ 追記 ]---

今度は「have the same architectures (armv7) and can't be in the same fat output file
Command /usr/bin/lipo failed with exit code 1」みたいなエラーが出た。。。

PROJECTとTARGETSそれぞれの「Build Settings」にある

「Architechtures」に「armv7」と「armv6」を加えデフォルトの値は消す。

(なぜかデフォルトの値が優先され続ける謎の現象が発生してハマった。消したら普通にいけた)

iPhone3Gにアプリをインストール時に「An unknown error message 'IncorrectArchitecture'」

Xcode4.2を入れたらアーキテクチャの設定が勝手に変えられてる?のかエラーが出始めた。

プロジェクトの「Build Settings」にある「Architectures」から「Other...」を選択。

項目に「armv6」を自分で入力して追加してからクリーン&再ビルド。

iOS5にしてから「Framework not found AudioUnit」が出たら…

フレームワークからAudioUnitの参照を外して、新たに「CoreAudio.framework」を追加

AudioUnit系のヘッダをインポートなり、インクルードなりしてる場所の手前に

#include/*or #import*/

を追加する。

Android エミュレータの保存データの場所

openFileOutputで保存したローカルデータの場所。

Windows7なら C:\Users\ユーザー名\.android\avd\2.2.avd(←自分の設定しているavd)

XPならC:\Documents and Settings\ユーザー名\.android\avd\avd\2.2.avd(←自分の設定しているavd)

の中にある「userdata-qemu.img」というバイナリが保存データ。

これをバイナリエディタで見ると可読性が薄いので、

コマンドプロンプトからddmsを叩いてからエミュレータを起動する。

(エミュレータを起動している状態でddmsを起動しようとするとエラーになるので順序に注意)

ddmsの「Device」から「File Explorer」を選択。

「data\data\自分のパッケージ名」を選択し、左上のアイコン「Pull File from Device」を押して保存する。

謎のerror: break statement not within loop or switch

Xcode4が突如、想定しない場所で「error: break statement not within loop or switch」を吐き始める。

カッコ忘れとか初歩的ミスをしていない事を確認し、次に発生箇所を削ってみる。

するとエラー位置がどんどん上に上がっていく。

しまいにゃbreakを全部取っ払っても出る。意味不明。

cleanしても出るしなんなんだと、Xcodeを再起動してから再度clean&buildしてみる。

同じコードなのにおとなしくなった。うーむ。

なんだかおかしいと思ったら、これからは再起してclean。

Android apk をインストールする時にerror: device offline

Androidの開発でエミュレータへapkをインストールする時は

プロンプトで「adb install apkのフルパス」を叩く

その際、「error: device offline」と表示される場合がある。

これはエミュレータから任意の端末設定を起動(自分が試したのは2.2設定)

そして画面ロックを解除してから再度コマンドを叩くと直った

CoreGraphicsでメモリがどんどん使われる

CGContextShowGlyphsAtPointを使ったアプリでleaksを使ってメモリの消費を見ていた時のこと

内部のadd_chunkという関数でmallocが使われてメモリがみるみる浪費されていく…。

どうやらGlyphs用のキャッシュ機能っぽい。

せめてある程度制御できる手段が提供されているといいんだけど、そんなメソッドもなさげ。

同じ文字を使う限り増加せず、今まで使用した事がない文字(マルチバイト文字だけかも?未調査)を渡すと

160byteと32byteあたりが増えるので、これをどうにかしたい訳だが現状ではどうにもできなさげ。

OpenAL 1つのソースで複数バッファを切り替える

1つのソースに複数バッファを割り当てて切り替えたい時は、

alSourceStop( ソースのID );
alSourcei( ソースのID, AL_BUFFER, 0 );

と停止してからバッファに0をセットして一度処理中のキューを空にする。
キューが空になってないとリークする事があるっぽい。

その後、

alBufferDataで新たに切り替えたいサウンドをセットすればよい。

セットしたサウンドはalBufferData内で別途確保されてコピー済みなのでfreeしてよい。

OSStatus -43

どうやらFileNotFoundっぽい

EclipseでGAE/Pのmemcacheがエラー扱いになる

「設定>インタープリタ-Python>強制ビルトイン」に

google.appengine.api.memcache

を追加したら直った

エンティティのインデクスを作らない時

test = db.IntegerProperty( indexed=False )

のように「indexed=False」を付与する

クラスのソート

クラスhogeがvという数値の変数を持っていて、それを元にいくつかのhogeクラスをソートしたい時

a = hoge(2)
b = hoge(1)
c = hoge(3)

list = [a,b,c]

list.sort(lambda x, y: cmp(x.v, y.v))

# list == [b,a,c]

とする

UnicodeEncodeErrorが出る

そんな時は、一度以下を試してみる。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, codecs
sys.stdout = codecs.lookup('utf_8')[-1](sys.stdout)

諸々の意味はググればすぐ出るので、それで思い出す事。

エンティティを継承するには

「db.Model」ではなく「polymodel.PolyModel」で親モデルを定義する

key_nameに全角文字

キー名は数値じゃないときは文字列型って事なので、

全角で指定とかできるのかしらと試したら、

hoge = YourEntity( key_name=u'hoge_ほげほげ' )

みたいにしても動くみたい。

まだデプロイしてないからなんとも言えないけど、開発サーバだけって可能性は否めない。

使い道あるのかな…。

まとめてput

entity1.put()
entity2.put()
entity3.put()

という処理は、

list = [entity1,entity2,entity3]
db.put(list)

とすれば、トランザクションでputしてくれるみたい。

MacのEclipse更新後に起動しなくなったとき

ターミナルでEclipseをcleanすると直った。

>eclipseのパス/eclipse -clean

1ファイルにあまり定義しない方がよい?

ダラダラとhelloworld.pyの1ファイルに、

リクエストハンドラのクラスや諸コードをやたらと長く書いてたのを、

ちゃんとファイル名も変えて整理して、細かくファイル分けしたら

レスポンスまでの体感速度が若干上がったようなのでメモ。

GAEのPython2.7用YAMLメモ

application: yourappname
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url:  /

  script: main.app


# django
#----------------------------------------------------------------
libraries:
- name: django
  version: 1.2


########################
# YAMLは以上、以下補足 #
########################


上記ハンドラは○○.appspot.com/ にアクセスが来た時main.pyで処理する設定例

main.py には以下を定義

app = webapp.WSGIApplication([('/', TopPage)], debug=True)
def main():
run_wsgi_app(app)

if __name__ == "__main__":
main()



"app"という変数にハンドラ情報入れてるので

script: 部分のファイル名は「処理したいPythonファイル名」.「ハンドラ入れた変数名」と書く

yamlのscript: にパッケージに入れてある階層内のpyを書く時

script: foo/bar/hoge.app

のようにスラッシュ区切りはダメ。

script: foo.bar.hoge.app

パッケージ指定の時と同じくここもピリオド区切り。

開発サーバかの区別

def is_local():
return os.environ.get('SERVER_SOFTWARE', '').startswith('Development')

という関数作ってどっかに入れとく。

いつまで使えるかは怪しい…。

スマホ用JavaScriptフレームワークの雑感

使って試してすごい雑な雑感。使って移行していった順。

iScroll4 … シンプルでよければこれで十分。サンプル少ない?ナビゲーションが面倒かも。

jQTouch … ナビーションアニメーションやバーも簡単に組み込める、ちょっと重い?

AppML…jQTouchとiScrollのいいとこどりだが重いのが惜しい。
動的コンテンツに対応した作りになっていないので、動的にページ内のサイズが変わるときは自前で修正が必要

Web2.0Touch…重くなくて動的ページが基本の作りなAppMLって感じ。現状これでよさそう。
標準ではタブバーのスクロールができないが自分でiScrollを足せば解決

日付プロパティを数値プロパティで代替する場合を考える

時系列系のプロパティ(DateTimeProperty、DateProperty、TimeProperty)を使わずに

他の方法で日付プロパティを表現するにはと考えた結果、

def getCurrentDate():
t = datetime.datetime.today()
if is_local() is False:
t += datetime.timedelta(hours=9)
return long(t.strftime("%Y%m%d"))

def getCurrentTime():
t = datetime.datetime.today()
if is_local()is False:
t += datetime.timedelta(hours=9)
return long(t.strftime("%Y%m%d%H%M"))

def getCurrentTimeSec():
t = datetime.datetime.today()
if is_local() is False:
t += datetime.timedelta(hours=9)
return long(t.strftime("%Y%m%d%H%M%S"))

みたいな数値をIntegerPropertyで持つくらいしか思い浮かばず。

(時間を足している所は、開発サーバじゃない時に日本時間に直す…つもりで書いたもの)

素直にdate系使ってても特に問題はないので、意味のない妄想であった。