Github for Macからコマンドラインに乗り換え

やっぱりコマンドラインで使いたい

こんにちは ビンゴ中西です。
Githubに技術共有ランチで共有した知識を公開してみました - スマートフォンアプリ開発会社のエンジニアブログ
では、Github for MacというGUIツールでgithubとやりとりしていると書きましたが、
gitに慣れてきたので、やっぱりコマンドラインでやりたいですね。

今回は、Xcodeスニペットを1つ作ってみたのですが、これをgithubコマンドラインから置くことにしました。
GitHub - shingo-nakanishi/myXcodeSnippets: myXcodeSnippets

1. Githubリポジトリ作成

Github(ブラウザ)でREDMEつきのリポジトリを作成しました。

2. Githubからclone

作ったリポジトリをcloneします。

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で管理できるようにしコピーでもっていってます。(少し面倒 改良したい)

追記(注意)

別の日にやって気づいたのだが、これキーチェーンの関係からGithub for Macが動いてないとうまくいかない....

さらに追記

わけわからんので、結局鍵を作り直した 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するものがなさそう...... 困った....

AndroidiPhoneもどっちでもこい! なんでもこなす弊社エンジニアに聞いてみよう!

「プロパティを配列で欲しいんですけどどうしたらよいでしょう?」
「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>

というふうに変えておきます。

こんにちはgit こんにちはzsh

おはようございます ビンゴ中西です

gitでの開発運用

弊社ガラパゴスではgitでの開発運用が本格的に稼働しています。
今動いているプロジェクトのほとんどがもはやgit

gitのコマンドって長いですよね。オプションとか。
もう無理。 限界。 打てない。 つらい。

bashしばりプレイを続けてきた私もこれはもう無理。
噂のzshに乗り換えてみよう。
そうやzshさんや!

アプリ制作実習〜カメラアクティビティ起動〜

こんばんは。

本日もアプリ制作やってました。
どのようなアプリかと言いますとアルバム(ギャラリー)アプリのようなもので、
写真をポラロイド風に加工して保存し、下に手書き風のタイトルを付けて
管理・鑑賞してもらおうというアプリなんですが、

やはりユーザーにどんどん新しい画像を撮って保存してほしい!ので、
カメラアプリを起動して画像を表示するという機能を勉強しました。
新規写真を撮るボタンを押すとカメラやギャラリーが起動するというようにしたいと思います。

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されることを確かめることができたが、
使うか使わないかは各人の判断になることだろう。