• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
 
 

CATimingFunction は 0 ~ 1 の範囲の x を3次ベジエで表現する必要があるので、

落下のアニメーションをするためには、放物線 y = x^2 (以下 PB )を3次ベジエで近似する必要がある。

y = x で表される直線に平行な直線上に2つのコントロールポイント(以下 CP )を持つ3次ベジエで近似することにした場合、その座標の求め方は以下のとおり。

3次ベジエの以下の特性を利用する

t = 0 における接線は始点と1つめの CP がなす直線。
t = 1 における接線は終点と2つめの CP がなす直線。

このことから

PB の x = 0 における接線の方程式は y = 0 である。すなわち1つめの CP は X 軸上にある。
PB の x = 1 における接線の方程式は y = 2 x - 1 である。2つめの CP はこの式の上にある。

y = x に平行で PB に接する直線 y = x + n の n は x + n = x^2 の解が1つの時なので

y = x - 1/4

2つの CP がなす直線( L1 )が始点と終点がなす直線( L0 )と平行なとき、t = 1/2 のときに頂点が L1 - L0 の 3/4 の距離にあるという3次ベジエの性質から2つの CP がなす直線は

y = x - 1/3

これと y = 0 から1つめの CP は

( 1/3, 0 )

これと y = 2x - 1 から2つめの CP は

( 2/3, 1/3 )

なので、以下のように生成する。

[ CAMediaTimingFunction functionWithControlPoints:1./3. :0 :2./3. :1./3. ];

posted by Face Saturn on Thu 19 Sep 2013 at 11:18

   1  -	(void)
   2  viewWillAppear:(BOOL)p
   3  {	[	NSNotificationCenter.defaultCenter
   4  		addObserverForName:UIKeyboardWillShowNotification
   5  		object:self.view.window
   6  		queue:nil
   7  		usingBlock:^( NSNotification* p )
   8  		{	[	UIView
   9  				animateWithDuration:[ [ p.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey ] doubleValue ]
  10  				animations:
  11  				^{	self.view.frame = CGRectMake
  12  					(	self.view.frame.origin.x
  13  					,	self.view.frame.origin.y
  14  					,	self.view.frame.size.width
  15  					,	self.view.frame.size.height - [ [ p.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey ] CGRectValue ].size.height
  16  					);
  17  
  18  				}
  19  			];
  20  		}
  21  	];
  22  	[	NSNotificationCenter.defaultCenter
  23  		addObserverForName:UIKeyboardWillHideNotification
  24  		object:self.view.window
  25  		queue:nil
  26  		usingBlock:^( NSNotification* p )
  27  		{	[	UIView
  28  				animateWithDuration:[ [ p.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey ] doubleValue ]
  29  				animations:
  30  				^{	self.view.frame = CGRectMake
  31  					(	self.view.frame.origin.x
  32  					,	self.view.frame.origin.y
  33  					,	self.view.frame.size.width
  34  					,	self.view.frame.size.height + [ [ p.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey ] CGRectValue ].size.height
  35  					);
  36  
  37  				}
  38  			];
  39  		}
  40  	];
  41   }
  42  
  43  -	(void)
  44  viewDidDisappear:(BOOL)p
  45  {	[ NSNotificationCenter.defaultCenter removeObserver:self ];
  46  }
  47  
  48  

posted by Face Saturn on Tue 20 Aug 2013 at 13:58

リファレンス(下参照)には matrix × vector が返るって書いてあるんだけど、実際は vector × matrix が返ってくる。なんてこった。

   1  GLKVector4 GLKMatrix4MultiplyVector4 (
   2     GLKMatrix4 matrixLeft,
   3     GLKVector4 vectorRight
   4  );
   5  Parameters
   6  matrixLeft
   7  The matrix multiplicand.
   8  vectorRight
   9  The vector multiplier.
  10  Return Value
  11  A new vector created by multiplying the matrix by the vector.
  12  

posted by Face Saturn on Thu 4 Jul 2013 at 13:38

Edit ~/Library/Preferences/com.apple.DVDPlayer.plist and change the value of the key "DisplayHelpTags" to "NO"

posted by Face Saturn on Wed 5 Jun 2013 at 19:31

iPod の音源は ExtAudioFileService では読めない。

ExtAudioFileOpenURL ExtAudioFileSetProperty

が noErr で返ってくるにも関わらず、

ExtAudioFileRead

が -4 で返ってくる。 -4 はMacErrors.h では unimpErr、unimplemented core routine

読むためには、AVAssetReader を使う。以下を参考。

http://www.subfurther.com/blog/2010/12/13/from-ipod-library-to-pcm-samples-in-far-fewer-steps-than-were-previously-necessary/

posted by Face Saturn on Thu 30 May 2013 at 22:22

MAMP をインストールしている OSX 環境上で llvm(3.3) を svn で co してコンパイルしようとすると、 libxml のヘッダーが見つからないと言ってくる。 どうも configure が環境変数 PATH の最初のパスがあるところ ../include に libxml のヘッダーがあると思っているらしく、MAMP のアプリケーションディレクトリ/include に -I オプションを設定してしまうようだ。

なんで、これではまったら環境変数 PATH から MAMP のパスをはずす。 というより、/usr/bin が PATH の最初にくるようにすれば、/usr/include/libxml2 を見にいくようになるようだ(makefile を解析してないので確かな事がいえないが)

以下のようにすれば大丈夫

export PATH=/usr/bin:....

configure

make

posted by Face Saturn on Thu 14 Mar 2013 at 03:42

Google Maps と C++ ソースを両方含んだプロジェクトは

標準 C++ ライブラリを GNU のもの (libstdc++) を使ってやる必要がある。

 

 Build Setting

  Apple LLVM compiler 4.2 - Language

   C++ Standard Library

の値をデフォルトの libc++ を変更し、libstdc++ にする。

posted by Face Saturn on Fri 22 Feb 2013 at 03:16

最終的に -configuration の値をマニュアルで Debug から Release に切り替える。

   1  BUILD_DIR=${SRCROOT}/build/
   2  
   3  rm -rf ${BUILD_DIR}
   4  
   5  xcodebuild -project ${PROJECT_NAME}.xcodeproj -target ${PROJECT_NAME} -configuration Debug clean build
   6  
   7  xcodebuild -project ${PROJECT_NAME}.xcodeproj -sdk iphonesimulator5.1 -target ${PROJECT_NAME} -configuration Debug clean build
   8  
   9  THE_DIR=${BUILD_DIR}/${PROJECT_NAME}.framework
  10  
  11  mkdir -p ${THE_DIR}
  12  mkdir -p ${THE_DIR}/Headers
  13  mkdir -p ${THE_DIR}/Resources
  14  
  15  lipo ${BUILD_DIR}/Debug-iphoneos/lib${PROJECT_NAME}.a ${BUILD_DIR}/Debug-iphonesimulator/lib${PROJECT_NAME}.a -create -output ${THE_DIR}/${PROJECT_NAME}
  16  
  17  cp XXX.h ${THE_DIR}/Headers/
  18  cp XXX/XXController.xib ${THE_DIR}/Resources/
  19  cp Info.plist ${THE_DIR}/Resources/

posted by Face Saturn on Thu 13 Sep 2012 at 17:50
3rd Mon

SecItemImport

OpenSSL の PEM_write_RSAPublicKey を使用して作った public key の pem ファイルを SecItemImport で読み込むと -25257 "Unknown format in import."

逆に次のものは問題なく読める
◎KeyChain で作った鍵を pem で書き出したもの。
◎PEM_write_RSAPrivateKey で書き出した private key の pem から
  openssl rsa -pubout
 で public key を作り直したもの。
◎SecKeyGeneratePair で作成したキーを SecItemExport で書き出したもの。

原因は時間のある時に調査予定。

posted by Face Saturn on Mon 3 Sep 2012 at 12:09

Base32 URL はでっちあげたもの。

   1  
   2  static	char* sBase16Table1 = "0123456789ABCDEF";
   3  static	char* sBase16Table2 = "0123456789abcdef";
   4  
   5  static	NSString*
   6  StringEncodedByHEX( NSData* p )
   7  {	char* w = (char*)p.bytes;
   8  	int wNumOutputBytes = p.length * 2;
   9  	char v[ wNumOutputBytes ];
  10  	for ( int i = 0; i < p.length; i++ )
  11  	{	v[ i * 2 ] = ( w[ i ] >> 4 ) & 0x0f;
  12  		v[ i * 2 + 1 ] = w[ i ] & 0x0f;
  13  	}
  14  	for ( int i = 0; i < wNumOutputBytes; i++ ) v[ i ] = sBase16Table1[ v[ i ] ];
  15  	return [ [ NSString alloc ] initWithBytes:v length:wNumOutputBytes encoding:NSUTF8StringEncoding ];
  16  }
  17  
  18  
  19  static	NSData*
  20  DataDecodedByHEX( NSString* p )
  21  //	If the number of valid characters is odd number, the last one will be ignored.
  22  {	char wBuffer[ p.length ];
  23  	int	wValidCharCounter = 0;
  24  	for ( int i = 0; i < p.length; i++ )
  25  	{	char* wPtr = strchr( sBase16Table1, [ p characterAtIndex:i ] );
  26  		if ( wPtr ) wBuffer[ wValidCharCounter++ ] = wPtr - sBase16Table1;
  27  		else
  28  		{	wPtr = strchr( sBase16Table2, [ p characterAtIndex:i ] );
  29  			if ( wPtr ) wBuffer[ wValidCharCounter++ ] = wPtr - sBase16Table2;
  30  		}
  31  	}
  32  	int wSize = wValidCharCounter * 4 / 8;
  33  	char v[ wSize ];
  34  	for ( int i = 0; i < wSize; i++ ) v[ i ] = ( wBuffer[ i * 2 ] << 4 ) | wBuffer[ i * 2 + 1 ];
  35  	return [ NSData dataWithBytes:v length:wSize ];
  36  }
  37  
  38  static	char* sBase32URLTable1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
  39  static	char* sBase32URLTable2 = "abcdefghijklmnopqrstuvwxyz";
  40  
  41  static	NSString*
  42  StringEncodedByBase32URL( NSData* p )
  43  //	Although there is no standard named Base32URL but we need it.
  44  //	The difference with Base32 is that it doesn't use padding charater i.e. '='.
  45  {	int	wNumInputBits = p.length * 8;
  46  	int wNumOutputBytes = ( wNumInputBits + 4 ) / 5;
  47  	char* w = (char*)p.bytes;
  48  	char v[ wNumOutputBytes ];
  49  	for ( int i = 0; i < wNumOutputBytes; i++ ) v[ i ] = 0;
  50  	for ( int i = 0; i < wNumInputBits; i++ ) v[ i / 5 ] |= ( ( w[ i / 8 ] >> ( 7 - i % 8 ) ) & 1 ) << ( 4 - i % 5 );
  51  	for ( int i = 0; i < wNumOutputBytes; i++ ) v[ i ] = sBase32URLTable1[ v[ i ] ];
  52  	return [ [ NSString alloc ] initWithBytes:v length:wNumOutputBytes encoding:NSUTF8StringEncoding ];
  53  }
  54  
  55  static	NSData*
  56  DataDecodedByBase32URL( NSString* p )
  57  {	char wBuffer[ p.length ];
  58  	int	wValidCharCounter = 0;
  59  	for ( int i = 0; i < p.length; i++ )
  60  	{	char* wPtr = strchr( sBase32URLTable1, [ p characterAtIndex:i ] );
  61  		if ( wPtr ) wBuffer[ wValidCharCounter++ ] = wPtr - sBase32URLTable1;
  62  		else
  63  		{	wPtr = strchr( sBase32URLTable2, [ p characterAtIndex:i ] );
  64  			if ( wPtr ) wBuffer[ wValidCharCounter++ ] = wPtr - sBase32URLTable2;
  65  		}
  66  	}
  67  	int wSize = wValidCharCounter * 5 / 8;
  68  	char v[ wSize ];
  69  	for ( int i = 0; i < wSize; i++ ) v[ i ] = 0;
  70  	for ( int i = 0; i < wSize * 8; i++ ) v[ i / 8 ] |= ( wBuffer[ i / 5 ] >> ( 4 - i % 5 ) ) << ( 7 - i  % 8 );
  71  	return [ NSData dataWithBytes:v length:wSize ];
  72  }
  73  
  74  static	char* sBase64URLTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
  75  
  76  static	NSString*
  77  StringEncodedByBase64URL( NSData* p )
  78  {	int	wNumInputBits = p.length * 8;
  79  	int wNumOutputBytes = ( wNumInputBits + 5 ) / 6;
  80  	char* w = (char*)p.bytes;
  81  	char v[ wNumOutputBytes ];
  82  	for ( int i = 0; i < wNumOutputBytes; i++ ) v[ i ] = 0;
  83  	for ( int i = 0; i < wNumInputBits; i++ ) v[ i / 6 ] |= ( ( w[ i / 8 ] >> ( 7 - i % 8 ) ) & 1 ) << ( 5 - i % 6 );
  84  	for ( int i = 0; i < wNumOutputBytes; i++ ) v[ i ] = sBase64URLTable[ v[ i ] ];
  85  	return [ [ NSString alloc ] initWithBytes:v length:wNumOutputBytes encoding:NSUTF8StringEncoding ];
  86  }
  87  
  88  static	NSData*
  89  DataDecodedByBase64URL( NSString* p )
  90  {	char wBuffer[ p.length ];
  91  	int	wValidCharCounter = 0;
  92  	for ( int i = 0; i < p.length; i++ )
  93  	{	char* wPtr = strchr( sBase64URLTable, [ p characterAtIndex:i ] );
  94  		if ( wPtr ) wBuffer[ wValidCharCounter++ ] = wPtr - sBase64URLTable;
  95  	}
  96  	int wSize = wValidCharCounter * 6 / 8;
  97  	char v[ wSize ];
  98  	for ( int i = 0; i < wSize; i++ ) v[ i ] = 0;
  99  	for ( int i = 0; i < wSize * 8; i++ ) v[ i / 8 ] |= ( wBuffer[ i / 6 ] >> ( 5 - i % 6 ) ) << ( 7 - i  % 8 );
 100  	return [ NSData dataWithBytes:v length:wSize ];
 101  }
 102  

posted by Face Saturn on Mon 7 May 2012 at 13:22
Contents
放物線のタイミングファンクション
iOS キーボードに表示に連動した UI の移動。
そりゃないぜ GLKMatrix4MultiplyVector4
How to disable annoying tooltip of DVD Player (5500.38.2)
iPod の音源を読む
OSX, llvm 落とし穴 with MAMP
GoogleMaps-iOS で、C++ ソースと共存させる方法
.framework を作る Run Script のサンプル
SecItemImport
各種エンコード実装
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ