投稿

2014の投稿を表示しています

cocos2dx 3.1.1のiosにAdMobを入れた時に表示されない。(Must set the rootViewController property of GADBannerView before calling loadRequest エラー)

http://stackoverflow.com/questions/21846346/admob-with-cocos-2d-v3/21859218#21859218?newreg=3f939ceefd2e4dde88d6c3cf3c1c7f39 上記のサイトの回答のリンク先からダウンロードできるサンプルプロジェクトを見て解決しました。 AdMobをcocos2dxに追加するのは、 公式ドキュメント といつもお世話になっているLady Wendyさんの Cocos2d-x:AdMobを表示させる(iOS) を見て大体わかったのですが、 Must set the rootViewController property of GADBannerView before calling loadRequest というエラーが出て、広告が表示されませんでした。 公式ドキュメントの通りに bannerView_.rootViewController = self; [self.view addSubview:bannerView_]; とすると、selfのところでエラーが出てしまいます。 結論としては、これを bannerView_.rootViewController = self.viewController; [self.viewController.view addSubview:bannerView_]; としたら解決しました。 コードも載せておきます、関係有るところだけ。 bannerView_ = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner]; bannerView_.adUnitID = @"ca-app-pub-xxxxxxxxxxxx"; [viewController.view addSubview: bannerView_]; bannerView_.rootViewController = self.viewController; [self.viewController.view addSubview:bannerView_];

ScoreBoard導入時のthrown while initializing AsyncTaskエラー

マニュアル通りに実装したのですが、thrown while initializing AsyncTask、というエラーが出てしまいました。 http://stackoverflow.com/questions/13267711/android-why-i-get-these-asynctask-error 上記のサイトを見て解決しました。 そのまま実装すると、こんなかんじになります。 private static Activity mya =null; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); mya = this; } public static void sendScore(double score){ String[] gameIds = {"ゲームモードID"}; String[] scores = {""+score}; GFRankingController appController = GFRankingController.getIncetance(mya); appController.sendScore(gameIds, scores); } これを、上記のサイトとeclipseの警告を頼りに、 private static Activity mya =null; //これを追加 private static Handler handler = new Handler(Looper.getMainLooper()); protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); mya = this; } public static void sendScore(final double score){//finalにする handler.post(new Runnable() { @Override public void run(

GameCenterがDoneボタンで終了できない

cocos2d-x 3.0でのiOSアプリに対するGameCenterの実装 ここ見て、GameCenterの実装は出来たのですが、openRankingでGameCenterを開いた時に、右上のDoneボタンを押しても反応がなく、元の画面に戻れなくなってしまいました。 http://programming-ios.com/cocos2dx-gamecenter-crash/ ここを見たら解決できたのですが、「データベース接続確立エラー」と表示されてしまい見れなかったので、 Googleのキャッシュ を使って見ました。 消えてしまうかもしれないので、ほとんど同じ内容ですが、ここに書いておきます。 RootViewController.hに #import <UIKit/UIKit.h> #import <GameKit/GameKit.h>//これを追記 @interface RootViewController : UIViewController <GKLeaderboardViewControllerDelegate>{ //上記のように変更 } - (BOOL) prefersStatusBarHidden; @end また、RootViewController.mmに以下を追記します。 // GKLeaderboardViewControllerのDelegate -(void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController { [self dismissViewControllerAnimated:YES completion:nil]; } // GKAchievementViewControllerのDelegate -(void)achievementViewControllerDidFinish:(GKAchievementViewController *)viewController { [self dismissViewControllerAnimated:YES completion:nil]; } また「AppControlle

ラベルボタンを作った時にAnchorPointを設定できない::cocos2d-x v3.1.1

以下のようにラベルボタンを作った時にアンカーポイントを変更してsetPositionしたいときに、 auto label = Label::createWithSystemFont("labelButton", "Arial", 20); auto menu = MenuItemLabel::create(labelabel, CC_CALLBACK_1(HelloWorld::labelBtnCallback, this)); auto button = Menu::create(menu, NULL); button->setPosition(Vec2(float x,float y)); this->addChild(button); Menuに対して button->setAnchorPoint(Vec2(0,0)); としても効かなかった。 代わりにMenuItemLabelに対して以下のように設定したところ、 auto label = Label::createWithSystemFont("labelButton", "Arial", 20); auto menu = MenuItemLabel::create(label, CC_CALLBACK_1(HelloWorld::labelBtnCallback, this)); menu->setAnchorPoint(Vec2(1,1)); auto button = Menu::create(menu, NULL); button->setPosition(Vec2(float x,float y)); this->addChild(button); なぜかうまくいった。

マルチタッチ::cocos2d-x v3.1.1

Cocos2d-x 3.0 beta2 シングルタッチ&マルチタッチイベント取得まとめ 大体はここを見ればできるのですが、v3.1.1ではいくつか記法が異なっている部分がありました。 まずはヘッダファイルに public: void onTouchesBegan(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event); void onTouchesMoved(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event); void onTouchesEnded(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event); そして、cppファイルの,HelloWorld::init()に auto listener = EventListenerTouchAllAtOnce::create(); listener->onTouchesBegan = CC_CALLBACK_2(HelloWorld::onTouchesBegan, this); listener->onTouchesMoved = CC_CALLBACK_2(HelloWorld::onTouchesMoved, this); listener->onTouchesEnded = CC_CALLBACK_2(HelloWorld::onTouchesEnded, this); this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this); と書いて、リスナーを設定します。そして、関数を追加。 void HelloWorld::onTouchesBegan(const std::vector<cocos2d::Touch *> &touches, cocos2d::Event *event){ std::vect

androidでビルドする時につまづいた事::cocos2d-x v3.1.1

./build_native.pyでのundefined referenceエラー jni/../../Classes/HelloWorldScene.cpp:64: error: undefined reference to 'newClass::createScene()' というような感じのエラーが出ていた。 proj.android/jni/Android.mkを編集して、直接クラス情報を書いたら通った。 LOCAL_SRC_FILES := hellocpp/main.cpp \ ../../Classes/AppDelegate.cpp \ ../../Classes/HelloWorldScene.cpp こんな感じになっっている所に、同じように追記した。 区切りのバックスラッシュ(\)を忘れないように。 Eclipseにプロジェクトを追加するとAppActivity.javaでエラーが出る cocos2d-x-3.1.1/cocos/platform/android/javaを Android project from existing codeからインポートして、srcの中のorg.cocos2dx.libを追加したプロジェクトのsrcにコピペするとエラーが消える。 これでやっと心安らかにxcodeで開発できる。

子スプライトの数(存在しているか)を調べる::cocos2d-x v3.1.1

getChildrenCount()を使います。 同時にスプライトを複数(一定数以上)出したくない時などに。 タップした所にスプライトが表示され、中心まで移動した後消えます。 ただし、前のスプライトが消えないうちは、新しいスプライトが生成されないようにしています。 bool HelloWorld::init() { if ( !Layer::init() ) { return false; } //touchListner auto listner = EventListenerTouchOneByOne::create(); listner->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan,this); this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listner, this); return true; }; bool HelloWorld::onTouchBegan(Touch *touch, Event *event) { //タッチ位置取得 auto location = touch->getLocation(); //画面サイズ取得 auto visibleSize = Director::getInstance()->getVisibleSize(); //中心に移動 auto centerPoint = Point(visibleSize.width/2,visibleSize.height/2); auto moveToCenter = MoveTo::create(0.5f, centerPoint); //this以下のスプライトの数を調べる auto count = this->getChildrenCount(); //0個だったら実行 if(count == 0){ auto homuhomu = Sprite::create("

ボタンを作る::cocos2d-x v3.1.1

画像を使ったボタン(MenuItemImage) プロジェクトを作成した時に最初からある終了ボタンがそれ auto imgBtn = MenuItemImage::create( "通常時のボタンの画像", "押された時のボタンの画像", CC_CALLBACK_1(HelloWorld::imgBtnCallback, this));//imgBtnCallbackが関数名 imgBtn->setPosition(Vec2(x座標, y座標)); auto btn_1 = Menu::create(imgBtn, NULL); btn_1->setPosition(Vec2::ZERO);//ゼロ点を画面右下にしているっぽい。消すと中央が(0,0)になる this->addChild(btn_1, 1); そして、コールバック作成 void HelloWorld::imgBtnCallback(Ref* pSender){ //ここにボタンが押された時の操作を書く return; } ヘッダファイルで宣言しておくのも忘れないように void imgBtnCallback(cocos2d::Ref* pSender); ラベルを使ったボタン(MenuItemLabel) //ラベルを用意 auto labelBtnLabel = LabelTTF::create("ラベルボタン", "Arial", 24); auto labelBtn = MenuItemLabel::create(labelBtnLabel, CC_CALLBACK_1(HelloWorld::menuBtnCallback, this)); labelBtn->setPosition(Vec2(x座標, y座標)); auto btn_2 = Menu::create(labelBtn, NULL); btn_2->setPosition(Vec2::ZERO); this->addChild(btn_2, 1

シーンの切り替え(画面遷移)::cocos2d-x v3.1.1

HelloWorldSceneからnewClassSceneに移動する場合。 まず、HelloWorldScene.cppに #include "newClassScene.h" 移動先のヘッダファイルをインクルードする。 そしてボタン等で呼ばれる関数に Director::getInstance()->replaceScene(newClass::createScene()); を書く。 次に、移動先のnewClassScene.hが #ifndef __HelloWorld__newClassScene__ #define __HelloWorld__newClassScene__ #include "cocos2d.h" class newClass : public cocos2d::Layer{ static cocos2d::Scene* createScene(); virtual bool init(); CREATE_FUNC(newClass); }; #endif /* defined(__HelloWorld__newClassScene__) */ このようになっているのを #ifndef __HelloWorld__newClassScene__ #define __HelloWorld__newClassScene__ #include "cocos2d.h" class newClass : public cocos2d::Layer{ public: static cocos2d::Scene* createScene(); virtual bool init(); CREATE_FUNC(newClass); }; #endif /* defined(__HelloWorld__newClassScene__) */ publicにする。しないと怒られました。

新しいクラスの作り方::cocos2d-x v3.1.1

NewFile>iOS>C and C++>C++ Classを選択してNext ファイル名を入力してCreate ヘッダファイル(ファイル名.h)を修正 #ifndef __HelloWorld__newClassScene__ #define __HelloWorld__newClassScene__ #include <iostream> #endif /* defined(__HelloWorld__newClassScene__) */ こうなっているのを(プロジェクト名HelloWorld,クラス名newClassの場合) #ifndef __HelloWorld__newClassScene__ #define __HelloWorld__newClassScene__ #include "cocos2d.h" class newClass: public cocos2d::Layer { static cocos2d::Scene* createScene(); virtual bool init(); //初期化 }; #endif /* defined(__HelloWorld__newClassScene__) */ というようにする。 次に、cppファイルの編集 初期状態では、 #include "mainScene.h" しか書いていないので、 #include "newClassScene.h" USING_NS_CC; Scene* newClass::createScene() { auto scene = Scene::create(); auto layer = newClass::create(); scene->addChild(layer); return scene; } bool newClass::init() { if ( !Layer::init() ) { return false; } return true; }; というようにする

図形描画::cocos2d-x v3.1.1

右下が(0,0)なので注意 直線 DrawNode *node = CCDrawNode::create(); node->drawSegment(Vec2(始点x, 始点y), Vec2(終点x, 終点y), 1, Color4F(r, g, b, a)); addChild(node); 円(ドット) DrawNode *dot = CCDrawNode::create(); dot->drawDot(Vec2(座標x, 座標y), 直径, Color4F(r, g, b, a)); addChild(dot); 重なり(ZOrder) addChild(node, zOrder); intで指定。 数字が大きいほうが手前に来る。(右手系)

iframeの利点と欠点

以前からiframeって理想的なタグなのでは無いかと思っていたが、非推奨だとかSEO的に良くないとかいう話を聞いてなんとなく使っていなかった。(HTML5では非推奨ではない) cssが大好きなので擬似フレームを使っていたというのもあるが。 そこでメリットとデメリットについて考えてみた。 まずメリットから 通信量が少なくなる。 -メニューをメイン、中身をフレームにすれば中身だけが変わるときは通信量が少なくなる。 コード量が少なくなる。 -コードを使いまわせるので書くコードが少なくなる。 デメリット 初回でのロード時間が長くなる -リクエスト数が増えるので多分ロード時間も増える。 iframeへのリンクを新しいタブで開いた時に、iframeの先しか表示されない。 リンクを張れない -frameのリンク先をurlに含むことが出来ないのでリンクを張ることが出来ない。 seo -よく知らないが良くは無いらしい。 結局、メニューからiframeの中身を変えるようなデザインだと、その特定の中身のページヘのリンクが張れないというデメリットが大きすぎるのではないかという結論に至った。 このデメリットはcssでcheckboxを使ってメニューとかを作る時にも発生する問題で、今解決方法を模索している。 また、通信速度がどんどん早くなっている今、そこまで通信量を気にする必要は無いではないかと。 コードの使い回しはフレームワークを使えばいい。

cocos2d-x v3.1.1にアップデート>>プロジェクトの作り方

まず、公式からダウンロード 解凍してeclipseがある場所に入れる(わかりやすいように。) readme.mdに書いてあるとおりだが、 cocos2d-xのディレクトリに移動して、 $ ./setup.py すると まだ設定していなかった場合、いろんな_ROOTを聞かれる Please execute command: "source [.bashのパス]" to make added system variables take effect 設定し終わったら、 と最後の方に書いてあるので、そのままコピペして設定を反映させる。 $cocos new プロジェクト名 -p com.example.プロジェクト名等 -l cpp -d プロジェクトのディレクトリ で、指定した場所に生成されるはず。

ios7でのUIToolobarの色指定の方法

UIToolbar Class Reference 公式にも書かれているが(当然だが)Toolbarの色を指定する方法が tintColorから barTintColorに変わった 何かが変更されること事態はよくあるのだが、tintColorが非推奨になるわけではなく別の意味を持ってしまったために警告が出なかった。 他のBarもbarTintColorに変更されているようだ。

Symfony2.3でOAuthを使ったTwitterの投稿

ふとツイッターのbotを作ってみたくなったので、やってみました。 ローカルでやっているので一定間隔で投稿するといったことはやっていませんが、ボタンを押すと何かをつぶやくことができるようになりました。 namespaceやrequireなどほとんどphpがわからない状態でやったので、もうだめかもしれないというくらいにハマったのですが、なんとか出来ました。 公式のドキュメントを読むのが大事だと思いました。 アプリを登録してAPI_key (consumer_key), API_secret , access_token , access_token_secretを入手したりする方法は メモ:twitterのbotを作るために必要なAPI key・token取得法 とかを見たください。検索すればいくらでも出てきます。 また、下記サイトからtwitteroauthというAPIをダウンロードしてください。右下の方にDownloadZipというボタンがあります。 https://github.com/abraham/twitteroauth Symfony2.1でTwitterOauthを使う 途中までは、このサイトを見ながらやりました。 ファイル展開のところにあるように、vendor/twitteroauth/lib/TwitterOauthにOauth.php とtwitteroauth.phpをコピーしてください。 また、ファイル名をtwitteroauth.phpからTwitterOauth.phpへ変更します。 次に、autoload.phpに require_once __DIR__.'/../vendor/twitteroauth/lib/TwitterOauth/TwitterOauth.php'; と追記します。 autoload.phpはvender/にあります。 Config.ymlは変更しませんでした。 このサイトを見るのはここまでです。 さて、コントローラにactionを追加するのですが、結論から言うと、最短2行でかけます。 $TwitterOAuth =  new \TwitterOAuth("API_key","API_secret",&q

SublimeTextでタブ移動のショートカットの設定

terminalだとcommand+left,rigntでタブを移動できるのでそれに合わせて設定しました。 設定方法は、 メニュー>Preferences>Key Bindings - User を開いて、 { "keys": ["command+left"], "command": "prev_view" }, { "keys": ["command+right"], "command": "next_view" } を追加して保存します。 再起動しなくてもすぐに反映されました。 これでずいぶん快適になりました。 ちなみに関係無いですが、Opera(Blink)だとシングルキーショートカットを有効にしていると、1,2でタブ移動できますよ。

app/console doctrine:schema:createでのalready existsエラー

データベースを作成しようとするともうすでにそのテーブルがあると言われる。 mysqlの中をくまなく探してもそんなものは無い。 ちなみにエラー文 [Doctrine\DBAL\Schema\SchemaException]                         The table with name 'blogsymfony2.foodorder' already exists.  基本的に下のリンクの通りだったのだが、検索してみたら結構えげつないところに隠れていた。 おそらく最初の方に間違えて作ってしまったものだろう。引っかかったファイルを削除すると無事テーブルを作成できた。 Unable to create table in MySQL using Doctrine and Symfony2 これを期にfindコマンドも覚えた $find /探すディレクトリ -name ファイル名(もちろんワイルドカード使用可)

PHPフレームワークSymfony2 開発チュートリアルをSymfony2.3.9でやった時に引っかかるところ

バージョンによる違いや、ミスと思われるところがいくつかあったので書いておきます。 PHPフレームワークSymfony2 開発チュートリアル 1.5セッションの導入 bindRequestとなっているところをbindに変える いくつかあります。 1.5.1オブジェクトの登録 productActionと、productPostActionについてのみコードが書かれていて、 adressActionとadressPostActionについては、「同様の変更」とだけ書かれていて、具体的なコードが乗っていません。 しかし、product_idとquantityをただname,adress,phoneに変えただけでは一つ目のページのsessionが2つ目のsessionに上書きされてしまいます。 そこで、 $this->container->get('session')->set('drinkOrder',new drinkOrder()); をsetではなく、 $this->container->get('session')->get('drinkOrder'); にする必要があります。 Resources/views/DrinkOrder/confirmation.html.twig の最後の行に <form action="{{ path('OscDrinkOrderBundle_product') }}" method="post" {{ form_enctype(form) }}> とありますが、正しくは <form action="{{ path('OscDrinkOrderBundle_confirmation') }}" method="post" {{ form_enctype(form) }}> でしょう。 use Symfony\Component\Form\FormBuilder; となっているところは、 use Symfony\Component\Form\For

恐怖の見えない文字

Androidに使うjsonファイルに関係するエラーが出ていたのですが、しばらく原因がわかりませんでした。 原因の場所を見てみても何もおかしいところはなかったのです。 しかし、カーソルを方向キーで動かしてみると、なにもないはずのところで、一度カーソルが止まってしまうことに気が付きました。 どうやらそこに表示されない文字があるようなのです。 なぜそのような文字が紛れ込んだのか、またその文字は一体何なのか全くわからないのですが、恐ろしい物を見たような気持ちになりました。 ‎"1.000‎00" 上の文字列を何かのエディタにコピペしてみてください。 真ん中辺りに引っかかるところがあります。

SymfonyブログチュートリアルをSymfony2.3でやった時に引っかかるところ

他にも同じようなことを書いている場所もありましたが、全てを網羅しているところがなかったので、僕も書いておきます。 blogチュートリアル(8) データのバリデーション [Semantical Error] The annotation "@Symfony\Component\Validator\Constraints\MaxLength" in property My\BlogBundle\Entity\Post::$title does not exist, or could not be auto-loaded. @Assert\MaxLength(50) @Assert\MinLength(10)となっているところは書き方が変わっていて、 @Assert\Length(max = "50") @Assert\Length(min = "10") とする。 カスタマイズ編(3) フラッシュメッセージの表示 FatalErrorException : Error: Call to undefined method Symfony\Component\HttpFoundation\Session\Session::setFlash() $this->get('session')->setFlash('my_blog', '記事を追加しました'); を $this->get('session')->getFlashBag()->set('my_blog', '記事を追加しました'); に変更 また、 Method "hasFlash" for object "Symfony\Component\HttpFoundation\Session\Session" does not exist in MyBlogBundle:Default:index.html.twig at line 3 には、 {% if app.session.hasFlash('my_blog')

Androidのapkをアップデートする時の注意

一度ストアに登録したアプリの新バージョンをアップロードするときに以下の部分を修正しないとエラーが出ます。 AndroidManifestに android:versionCode android:versionName という項目があって、 versionCodeには整数でかつ以前の数字よりも大きい物を versionNameは単にバージョン名なので自由につけていいそうです。 versionNameは数字じゃなくても良いので、個人の開発ではいろいろ面白い名前を付けられそうです。

Mac portのApacheに関連するメモ

・起動 sudo /opt/local/apache2/bin/apachectl start ・終了 sudo /opt/local/apache2/bin/apachectl stop ・再起動 sudo /opt/local/apache2/bin/apachectl restart ・httpd.confの場所 /opt/local/apache2/conf/httpd.conf

今までと違うUSBケーブルを使うとAndroidが認識しない問題

新しいマイクロUSBケーブルを買ってきたのだが、Macとつないでも、いつも出る「メディアデバイスとして認識」が表示されなくて、アプリをインストールできなかった さんざん悩んだが、解決方法は簡単で、USBデバッグを一度オフにしてからまたオンにしたらつながるようになった。

完全初心者のためのターミナル入門 6(ディレクトリを表示させる)

おそらく、デフォルトの設定では、$の前に現在いるディレクトリの名前しか表示されないだろう。 そのため、自分がいまどこにいるかわからなくなる事がよく有る。 そのときは、 pwd というコマンドを実行する どこでもいいので、pwdしてみよう。 すると現在の場所のディレクトリが表示されるはずだ。 ただ、いちいちpwdするのは面倒なので、$の前に常にパスが表示されるようにした方がいいと思う。 これまで学んだ事のいい復習にもなると思うので、これからやってみよう。 ターミナルの設定は ~/.profile というファイルに書かれている。 /の前の"~"(チルダ)はhome、つまりcdしたときに移動する場所という意味だ。 したがって、.profileはcdしたときに移動したところの直下に有る。 確認してみよう。 まず、cdして、そのあと、ls -laすればいいはずだ。 リストの中に.profileを見つけられただろうか 見つけたら、それを編集しよう。 vi .profile でviを立ち上げる このコマンドを入力するとき、全部手打ちするのは賢くない。 .prくらいまで書いてtabを叩けば、.profileと表示されるだろう。 viを起動したら、iでインサートモードに入って、一番下の行に #フルpathを表示する export PS1='[\u@\h \w]\$' と書き足しておこう。タイプミスしそうなのでコピペすればいいと思う。 #の先の文字はコメントとして無視される。 次に見たときに何が書かれているのかがわかるようにコメントを残しておこう。 記入が終わったら、escでコマンドモードに戻って、 :wq で保存して終了。 source ~/.profile というコマンドを実行して、設定内容を反映させる。(これはそういうコマンドだ) cdで適当なディレクトリに移動すると、$の前にパスが表示されるのを確認できるだろう。 完全初心者のためのターミナル入門 1(ls -laでファイルの一覧表示) 完全初心者のためのターミナル入門 2(cdでディレクトリ移動) 完全初心者のためのターミナル入門 3(viでテ

完全初心者のためのターミナル入門 5(↑キーでコマンドの再利用)

ターミナルでは、tab以外にも文字を直接打たくていいようにする機能がある。 ターミナルを起動してから打ち込んだコマンドはすべて履歴として残っていて、上キーでそれらを再利用する事が出来る。 同じコマンドを打つときは積極的に使おう。 行き過ぎた場合は下キーで戻れる 完全初心者のためのターミナル入門 1(ls -laでファイルの一覧表示) 完全初心者のためのターミナル入門 2(cdでディレクトリ移動) 完全初心者のためのターミナル入門 3(viでテキスト編集) 完全初心者のためのターミナル入門 4(sudoで管理者権限で実行)

完全初心者のためのターミナル入門 4(sudoで管理者権限で実行)

そろそろ、sudoについて学ぶ必要が有る。 Finderなどの表から見えるファイルは一般ユーザが自由に編集できるものが多いが、Terminalから扱う表からは見えない設定ファイルなどの多くは一般ユーザーには編集できないようになっている。 これは、root(管理者)として実行すれば解決するのだが、rootユーザはあらゆる命令を実行できるので、常にrootでいるのは非常に危険である。 そこで、必要な時だけ、管理者として実行する、sudoコマンド(super user do)を使う。 sudoをつけたコマンドはあらゆる権限による制限を無視して実行されるので安易に使ってはならない。(ただ、実際にはsudoが必要な事は非常に多いので、しょっちゅうsudoしてる) 例文: sudo vi /opt/local/apache2/conf/httpd.conf もしこれを実行すると、パスワードを聞かれる。 おそらく、Macのログインパスワードだろう。 それを入力する事で初めて管理者として実行する事が出来る。 完全初心者のためのターミナル入門 1(ls -laでファイルの一覧表示) 完全初心者のためのターミナル入門 2(cdでディレクトリ移動) 完全初心者のためのターミナル入門 3(viでテキスト編集) 完全初心者のためのターミナル入門 5(↑キーでコマンドの再利用)

完全初心者のためのターミナル入門 3(viでテキスト編集)

前回の記事で、コンピュータ内を自由に行き来できるようになった。 しかし、ただ行き来しているだけではしょうがない。 今回はファイルの編集方法を学ぶ。 ターミナルにはviというテキストエディタが標準で搭載されているのでこれを使ってファイルを編集しよう。 今回は、間違えてファイルを書き換えてしまわないように、練習用のファイルを作る。 cd でホームに戻ってから、 vi hellovi と打ってみよう。helloviという名前のファイルが存在しなければ、helloviという名前のファイルが生成され、同時にviが立ち上がる できたてなので、何も無い空のファイルだ。 viには、コマンドモードとインサートモードという二つのモードがある。 コマンドモードはコマンドを使えるモードで、インサートモードは、実際にファイルを書き換えるモードだ。 立ち上がった時のviはコマンドモードなので、 iキー を押して、インサートモードに入る。 すると、画面の一番下に -- INSERT -- と表示されるだろう。 この状態では、普通のテキストエディタのように、文章を編集できる。 試しに何かを書いてみよう。 書き終わったら、escでインサートモードから抜けて、コマンドモードに戻る事が出来る。 下のinsertの文字が消えたのを確認出来ただろうか。 さて、編集をしたら、今度は保存しよう。 コマンドモードである事を確認して、 :w と打ってreturnする(コマンドは一番下の行に表示される) すると、 "hellovi" [New] 4L, 10C written と一番下に出てきて、書き込まれた事がわかる。 基本的にコマンドは":"(コロン)から始まる。 変更を保存したので、viを終了しよう。 終了のコマンドは、 :q だ。 もとの画面に戻って来れただろうか。 保存と終了のコマンドは、 :wq として、同時に実行する事も出来る。非常によく使うので覚えておこう。 もう一度、vi hellovi と打って保存されているか確かめてみよう。 また、保存せずに終了するときは、 :q! とすると、変更を保存せずに、viを終了する事が出来る。

完全初心者のためのターミナル入門 2(cdでディレクトリ移動)

さて、前回の記事で、今いる場所に何があるかわかったので、今度は別の場所に移動しよう。 移動に使うコマンドは cd だ。(change directoryの略) cd / と打ってreturnすると、最上階に移動する。 /は一番上の階層と言う意味だ。 とりあえず cd / を実行してみよう。 何も起こらなかったら、元々最上階にいたと言う事だ。 また、ただ cd だけを実行すると、homeディレクトリに戻る これはおそらく/USER/user/という場所だと思う。(userはユーザ名) ではここから移動してみよう。 まず、 cd / と打って、tabを二連打してみよう。 すると、/のあとに続く候補が出てくる そして入りたいディレクトリの頭文字を打って、また、tabを打つと、他にその頭文字から始まるディレクトリが無いと、補完してくれる。 また、いくつか候補があっても、共通のところまでは補完してくれる。 途中まで補完された状態で、何が候補に残っているか知りたかったら、またTabを二連打しよう。 このように、常にtabキーを叩きながら進める事になるだろう。 ディレクトリの名前を完全に打ち込んだら、Returnする。 すると、そのディレクトリに移動しているはずだ。 現在の位置からの場所を指定したければ、/をつけないで始めればいい。 また、cdは複数の階層を一気に下る事も出来る。 各階層ごとに/で区切ればいい。 また、 cd .. とドットを二つ続けると上の階層にいける したがって、 cd ../opt/ というふうにすれば、一度階層をあがってから、別のディレクトリに入る事が出来る。 これらを駆使して、コンピュータ内のディレクトリを自由自在に行き来する。 完全初心者のためのターミナル入門 1(ls -laでファイルの一覧表示) 完全初心者のためのターミナル入門 3(viでテキスト編集) 完全初心者のためのターミナル入門 4(sudoで管理者権限で実行) 完全初心者のためのターミナル入門 5(↑キーでコマンドの再利用)

完全初心者のためのターミナル入門 1(ls -laでファイルの一覧表示)

いろんなターミナルの解説サイトがあるが、大抵は幅が広すぎる感じがする。 そこで、本当に初めての人が、ターミナルを少し使えるようになるための最低限の説明をする。 ターミナルを立ち上げると、 [user@USER-no-MacBook-Air ~]$ などとなっているだろう。 前半部分は設定したユーザー名によって違う それではまず、 ls と打ってReturnキーを押してみよう。 すると、ずらずらと何かが出てくるはずだ。 それは、今いる場所に有る、ファイルとフォルダの一覧だ。 次は、 ls -la と打ってみよう 今度は先ほど出てきたファイルが縦に並んで見やすくなった。 これはlsというコマンドに"l"と"a"というオプションをつけたからだ。 これで、今いる場所に何があるかがわかるようになった。 完全初心者のためのターミナル入門 2(cdでディレクトリ移動) 完全初心者のためのターミナル入門 3(viでテキスト編集) 完全初心者のためのターミナル入門 4(sudoで管理者権限で実行) 完全初心者のためのターミナル入門 5(↑キーでコマンドの再利用)

Cocos2d-xの勉強の参考にしたサイト(随時追加していきます)

Cocos2d-x|Lady Wendy 検索に必ず引っかかってくるサイト。コンテンツが非常に豊富だが、少し内容が古くなっている。 Cocos2d-x v3|Lady Wendy 上のサイトのver3版。まだそこまでページは多くない。 Cocos2d-x 3.0でスプライトの生成、移動、削除、イベント タッチイベントの使い方がわかりやすい OpenCV 備忘録: std::stringをchar*に変換する UserDefaultを使ってデータを保存するときに、Keyを動的に生成するのに使った。 C++11の文法と機能(C++11: Syntax and Feature) C++についての解説。簡潔で非常にわかりやすい。 cocos2d-xでiOSとAndroidの処理を分ける ツイートやレビューページへの誘導に使いました。 cocos2d-x 3.0でのiOSアプリに対するGameCenterの実装 タイトルの通りです。上のサイトと組み合わせて、簡単に出来ました。

Cocos2d-x 3.0 beta2をMacにインストール&iOS,AndroidでHelloWorldまで

Cocos2d-x v3.0beta2をインストール OSは10.9.1 http://d.hatena.ne.jp/b-koba5525/20121207/1354856144 基本的にここをみながらやる。日本語化はしなかった。 64bitか32bitかわからなかったので、ここを見た http://support.apple.com/kb/HT3696?viewlocale=ja_JP Eclipseが全画面表示できなかったので、ここを見てできるようにする。 http://d.hatena.ne.jp/ks0608/20110729/1311924247 途中でviを使うが、わからない人は、この辺を見る http://net-newbie.com/linux/commands/vi.html ターミナルも使うが、わからない人はググるか友達に聞く。 3:ターミナルを起動しcocos2d-xのフォルダへ移動後、以下のコマンドを実行の所だが、3.0ではテンプレートをxcodeから読み込めないらしいので、 cd /Applications/eclipse/cocos2d-x-3.0beta2/tools/project-creator で ./create_project.py -n <PROJECT_NAME> -k <PACKAGE_NAME> -l <cpp|lua|javascript> -p <PROJECT_PATH> ./create_project.py -n HelloWorld -k com.example.HelloWorld -l cpp -p パス を実行 すると指定したパスにプロジェクトができている。 できたファイルの中のproj.ios.macの中にxcodeのプロジェクトが入っているのでそれを開いて、 RunするとHelloworldができる。 けっこうコンパイルに時間がかかる。 そりゃC++から変換してるんだから当然かもしれないけど。 で、次はeclipseの方 ターミナルで、 proj.androidの場所に移動して、 ./build_native.pyすると NDK_ROOT not de

GestureListnerをDrawViewで動かすための最低限のコード

package com.example.left_and_right; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.os.Bundle; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.MotionEvent; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout. activity_main ); DrawView view = new DrawView(getApplication()); setContentView(view); } } class DrawView extends View implements OnGestureListener{ GestureDetector gestureDetector ; public DrawView(Context context) { super (context); gestureDetector = new GestureDetector(getContext(), this ); } public void onDraw(Canvas canvas){ } @Override public boolean onTouchEvent(MotionEvent event){ gesture

GestureDetectorのonLongPressがタッチしただけで反応する

LongPressが少しタッチしただけでonLongPressに引っかかってしまいます。 StacOverFlowにはGestureDetectorを使わない別の解決策が出ているのですが、 http://stackoverflow.com/questions/11701826/long-press-android http://d.hatena.ne.jp/nosix/20120309/1331303770 onDown を実装して true を返すとの事でした。 http://mrbool.com/how-to-work-with-swipe-gestures-in-android/28088 ここによると2000ms押し続けるとLongPressが呼ばれるようです。 結局わからず。 今回は使わないのでいいのですが… ついでに見つけた情報 gestureDetector .setIsLongpressEnabled( false ); とするとLongPressを無効にできる。 http://developer.android.com/reference/android/view/GestureDetector.html#setIsLongpressEnabled(boolean)

GestureDetectorでDeprecatedと警告が出る件

http://stackoverflow.com/questions/12873708/gesturedetector-deprecated-issue StacOverFlowにありました。 gestureDetector = new GestureDetector( this ); だと警告が出るのを、第一引数にContextを指定するといいとの事です。 そこで、 gestureDetector = new GestureDetector(getContext(), this ); とすると警告が出なくなりました。

Sublime Text2でインデントにタブを使う

右下に「タブサイズ:4」などと表示されている所をクリックして、 メニューの一番上のIndent Using Spacesのチェックを外すとタブでインデントできる。 他にもConvert Indentation to Tabsでインデントをすべてタブに変えたり、タブの長さを変えたりできる。 Convert Indentation to Spacesだと、逆にインデントをすべてスペースに変えられる。

<caption>は<table>の中でしか使えない

他の人が書いたhtmlのデザインにsymfonyに当てはめている時にはまった。 字面から、単に見出しにつけるタグだと思ってtableの外に出したら、スタイルが効かなくなってしばらくはまっていた。 なんと下らないところではまってしまった事だろう。 まあはまるところなんて大抵くだらないものだが。