Github for Macからコマンドラインに乗り換え
やっぱりコマンドラインで使いたい
こんにちは ビンゴ中西です。
Githubに技術共有ランチで共有した知識を公開してみました - スマートフォンアプリ開発会社のエンジニアブログ
では、Github for MacというGUIツールでgithubとやりとりしていると書きましたが、
gitに慣れてきたので、やっぱりコマンドラインでやりたいですね。
今回は、Xcodeのスニペットを1つ作ってみたのですが、これをgithubにコマンドラインから置くことにしました。
GitHub - shingo-nakanishi/myXcodeSnippets: myXcodeSnippets
3. 社内用GitとGithubとあるので、sshのconfigを作成
2つgitを使っているので、sshのconfigファイルを書きます。
え!! SSH接続で、設定した覚えのないパスワードを聞かれるんですけど!? - スマートフォンアプリ開発会社のエンジニアブログ
このとき Github for Macが作った鍵をconfigで教えてあげましょう。
~/.ssh/
のどれかの公開鍵がそれです。それらしい名前のものを指定してあげましょう。
4. わ!エラーがでた
macos - Can't push branch to github "Use git@github.com:Paratron/spacebattles.git" - Stack Overflow
git pushで
You can't push to git: ほげほげー
みたいなエラーがでました。上記リンク参照。
stack over flowにあります通り、
git remote set-url origin git@github.com:ユーザ名/リポジトリ名.git git push
でいけました。
5. Xcodeのスニペットについて
Xcodeのスニペット(Snippets)をエクスポート、インポートする | EUI - iPhoneやandroidスマートフォンアプリの開発を教えるスクール
Xcodeのスニペットについては、上記リンクにあります通り、
引用:
/Users/ログイン名/Library/Developer/Xcode/UserData/CodeSnippets
にありますので、ここのファイルをgitで管理できるようにしコピーでもっていってます。(少し面倒 改良したい)
さらに追記
わけわからんので、結局鍵を作り直した orz
アプリ制作実習〜intentで画面遷移(文字列を添えて)〜
こんばんは。
今日は画面遷移するときに文字データも添えて渡せる方法を学んだので紹介します。
やり方は
IntentのインスタンスにString型のデータを足すことが出来る
putExtra(String name, String value)というメソッドを追加してあげることで、
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_save: EditText edt = (EditText)findViewById(R.id.editText1); String str = edt.getText().toString(); if(str.length()!= 0){ edt.setTag(""); } Intent intent = new Intent(this, PhotoActivity.class); intentSV.putExtra("title", str); startActivity(intent); return true; (ソースコードより抜粋)
ちなみに受け手側は
public String title; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.photo); TextView txt= (TextView)findViewById(R.id.textView1); title = getIntent().getExtras().getString("title"); txt.setText(title); (ソースコードより抜粋)
って書いています。
さらっと書きましたが、putExtraの一つ目の引数で””を抜いて書いており、
なかなか気づかずものすごく時間がかかってしまいました。
Map型のデータと同じで、キーを受け渡していると考えるのが正しいんですね。
Objective-Cでメタプログラミング プロパティが欲しいの巻
こんにちは ビンゴ中西です。
Objective-Cでクラスのインスタンス変数名を取得したくなりました。
@property(nonatomic, strong) NSString *hoge;
で宣言したところの今回はhogeにあたる部分ですね。
こいつをNSStringの配列で欲しくなったわけであります。
メタプログラミングの代表格はKVC
Objective-Cでのメタプログラミングといったら key value codingだろということで、
KVCについて調べていたのですが、どうもメタプロ的に値はsetできても、
プロパティをgetするものがなさそう...... 困った....
AndroidもiPhoneもどっちでもこい! なんでもこなす弊社エンジニアに聞いてみよう!
「プロパティを配列で欲しいんですけどどうしたらよいでしょう?」
「Classクラスみたいなのがあるんじゃなかったっけ?」
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html
「class_copyPropertyListじゃない?」
「おお! これだ!」
class_copyPropertyListや! class_copyPropertyListを使うんや!
ということで書いたソースがこちら
配列でGET
#import <Foundation/NSObjCRuntime.h> #import <objc/runtime.h> +(NSMutableArray *)getProperties:(id)c { NSString *propertyName; unsigned int outCount, i; NSMutableArray *propertieNames = [[NSMutableArray alloc] initWithObjects: nil]; objc_property_t *properties = class_copyPropertyList(c, &outCount); for (i = 0; i < outCount; i++) { objc_property_t property = properties[i]; propertyName = [NSString stringWithUTF8String:property_getName(property)]; [propertieNames addObject:propertyName]; } return propertieNames; }
使い方
NSMutableArray *a = [self getProperties:[Hoge class]]; for (id i in a) { NSLog(@"P : %@", i); }
ディクショナリでGET
こっちはKVCも使ってます:)
+(NSMutableDictionary *)getPropertiesDictionary:(id)o { NSString *propertyName; unsigned int outCount, i; NSMutableDictionary *propertieDictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys: nil]; objc_property_t *properties = class_copyPropertyList([o class], &outCount); for (i = 0; i < outCount; i++) { objc_property_t property = properties[i]; propertyName = [NSString stringWithUTF8String:property_getName(property)]; [propertieDictionary setObject:[o valueForKey:propertyName] forKey:propertyName]; } return propertieDictionary; }
使い方
NSMutableDictionary *d = [self getPropertiesDictionary:foo]; // インスタンスをあげる NSLog(@"D : %@", d);
アプリ制作日記〜背景を変える〜
こんばんは。
今日はアプリの印象をがらっと変えられる背景について書こうと思います。
アプリの背景の変え方ですが、
まず画像を用意します。このアプリ、ご家庭にある写真を飾るコルクボードをイメージしているので
コルクボードの画像を用意しました。
それを/res/drawable-hdpiの中に入れておき、
今度は/res/valuesの中に新規で
theme.xml
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="app_theme" parent="@android:style/Theme"> <item name="android:windowBackground">@drawable/corkboard</item> </style> </resources>
と書いて入れておきます。
最後に、Manifest.xmlファイルの中の
android:theme="@style/app_theme"
という感じになりました。ただ、これだとせっかく作ったアクションバーが見えなくなっているので
3行目のThemeの後に、アクションバー足しておいてねという処理を加えています。
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="app_theme" parent="@android:style/Theme.Holo.Light.DarkActionBar</spanr"> <item name="android:windowBackground">@drawable/corkboard</item> </style> </resources>
というふうに変えておきます。
アプリ制作実習〜カメラアクティビティ起動〜
こんばんは。
本日もアプリ制作やってました。
どのようなアプリかと言いますとアルバム(ギャラリー)アプリのようなもので、
写真をポラロイド風に加工して保存し、下に手書き風のタイトルを付けて
管理・鑑賞してもらおうというアプリなんですが、
やはりユーザーにどんどん新しい画像を撮って保存してほしい!ので、
カメラアプリを起動して画像を表示するという機能を勉強しました。
新規写真を撮るボタンを押すとカメラやギャラリーが起動するというようにしたいと思います。
public class PhotoNewActivity extends Activity { private static final int REQUEST_IMAGE_CAPTURE = 0; private static final int REQUEST_IMAGE_GALLERY = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.photo_new); Button impt = (Button) findViewById(R.id.button1); impt.setOnClickListener(new View.OnClickListener() { // ギャラリー・写真へ移動できるようにする @Override public void onClick(View v) { String[] str_items = { "カメラから選択", "ギャラリーから選択", "キャンセル" }; new AlertDialog.Builder(PhotoNewActivity.this) .setTitle("選択") .setItems(str_items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: startCamera(); break; case 1: startGallery(); break; default: break; } } }).show(); } }); } public void startCamera() { // カメラアプリを起動する Intent intent = new Intent();// インテントのインスタンス intent.setAction("android.media.action.IMAGE_CAPTURE");// インテントにアクションをセットする startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);// カメラアプリ起動する } public void startGallery() { // ギャラリーへ遷移 Intent i = new Intent(); i.setType("image/*"); i.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(i, REQUEST_IMAGE_GALLERY); } @Override public void onActivityResult(int rqCode, int rsltCode, Intent data) { switch (rqCode) { case 0: if (rsltCode == RESULT_OK) { try { // 画像データの取得 Bitmap img = (Bitmap) data.getExtras().get("data"); ImageView rslt = (ImageView) findViewById(R.id.imageView1); rslt.setImageBitmap(img); } catch (nullPointerException e) {// nullの例外だと思われ } } break; case 1: if (rsltCode == RESULT_OK) { try { // 画像データの取得 Bitmap img = (Bitmap) data.getExtras().get("data"); ImageView rslt = (ImageView) findViewById(R.id.imageView1); rslt.setImageBitmap(img); } catch (nullPointerException e) {// nullの例外だと思われ } } break; } }
これ実行してみたのですがなんか画像が荒い…
調べてみると、この方法( onActivityResultメソッド)は画像サイズが小さくなってしまうようです。
データベースに保存する機能もついていないし
せっかく高性能カメラを使っているのでデータサイズはそのままで保存する方法を探します。
あと、ギャラリーから選んだ画像は同じようにやっても、表示してくれないですね。
こちらも改良しなくてはならないです。
はぁ…
UIWebViewでvideoタグを使うとき いきなりfull screenにしない方法
videoタグタップしたらいきなりfull screenになってしもうた
ビンゴ中西です。
HTML5のvideoタグをUIWebViewの中から使ってみました。
するとどうでしょう! タップした瞬間にいきなり全画面表示!
いやいやいや いきなりすぎる! What's Happening!!
ということで、いきなりは全画面にならない方法。
インラインで表示したい
full screenの反対それがインライン表示だ!
厳密に反対の意味になるのかは知らないが、
とりあえずインラインにすればやりたいことが実現される。
ではどうすればよいのか?
リファレンスさんや! リファレンスさんに書いとったでえええ!
http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebView_Class/Reference/Reference.html
YESや! YESにするんや!!
@property(nonatomic) BOOL allowsInlineMediaPlayback
このプロパティをYESにしてやりましょう。
まだ足りひんのや
これだけでいけるかと思ったんですけど、なにやら
webkit-playsinlineを足せと英語で書いてあるように読める。
どこやどこに足したらええのんや!
調べるとHTML5のvideoタグに足せるみたい。
<video id="Video1" controls height="240" width="100%" title="video element" src="hoge.m3u8" poster="poster.png" webkit-playsinline>HTML5 Video is required for this example</video>
こんな感じ。
full screenが終了したのフックできる?
videoタグのコントローラには全画面にするボタンがあるので、
これをタップされるとまだ全画面にすることはできる。
そこで気になったのだが、
full screen中に、左上に「Done」ボタンが表示されているが、
これがタップされfull screenが終了したことを知ることはできないのだろうか?
ということ
できるようだ、ただしドキュメントに書いていないことをしているので、リジェクトされるかもしれないと記載されている。
ios - How to receive NSNotifications from UIWebView embedded YouTube video playback - Stack Overflow
引用ソース
- (void)playerWillExitFullscreen:(NSNotification *)notification { //do something... }
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerWillExitFullscreen:) name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil];
たしかにNotificationされることを確かめることができたが、
使うか使わないかは各人の判断になることだろう。