やんだー制作、新WEBサービス!2014/11/15 OPEN!!

あにめに(β) OPEN!!

あにめに(β)とは、マンガにアフレコをして、アニメのようなに楽しむサービスです。

声優を目指すユーザ、
漫画家を目指すユーザ、
そして、アニメが好きなユーザ...必見です!

あにめに(β)、公開しました!!

こんばんわ、やんだーです。

本日、やっとの思いで1年間くらいコツコツ作り続けた、
あにめに(β)を公開することができましたー(´・ω・`)!


あにめに(β)

あにめにロゴ
http://www.animeni.net/


ぱちぱちぱち・・・!

ということで、
暇があれば、チラっと除いてやってください。


どんなサイトかと言うと、前回も説明しましたが、

マンガにアフレコをして、 アニメのような "モノ" 楽しむサービス

です。

あにめにバナー
このエントリーをはてなブックマークに追加  
やんだー | - | 20:39 | comments(0) | - | - |

あにめに(β)のデモサイトを公開しました!

みなさま、ご無沙汰しております、"やんだー"です。
約1年弱という月日、ブログを更新しませんでした。
サボってたわけではなく、新サービスを開発しておりました。
正直、開発の合間にブログ書けましたね、、、サボってましたすみません。


開発しておりました、
新サービスあにめに(β)のデモサイトを本日2014/10/01に公開しました。

ぜひ、一度御覧ください。
あにめに(β)のデモサイトはこちら

あにめに(β)とは。一言でいうと、

マンガにアフレコをして、 アニメのような "モノ" を作るサービスです。


百聞は一件に如かず、ということでデモサイトをご覧いただくと何となくわかっていただけると思います。

ユーザが自由にマンガを投稿でき、
ユーザが自由にアフレコをして、
ユーザが自由にあにめにを見る事ができます。

1つのアニメには、
1キャラに対し、1人の声優しかいません。

「このキャラを他の声優が演じると、どうなるのだろう...?」

そう思った事はありませんか?
他の声優が演じることで、また違った世界観・面白さがあるのです。

「あにめに」は、そんな別の世界をちょっとだけ覗けるサービスを目指しています。


今日は、あにめに(β)のデモサイトを公開だけ報告させていただきます。

あにめに(β)自体のサイトは、現在もなお開発中です。
本サービスの公開は、2014年11月上旬になる予定です。
詳しくは、デモサイトのNEWSより随時お知らせします。

あにめにの制作が落ち着きましたら、
あにめにの開発した言語、環境(サーバ・DB・プレームワーク)をまとめた、記事を書きたいと思います。

今日はこれくらいで失礼します。
どうか、あにめに(β)を応援して頂ければ、幸いです。


by.やんだー(・ω・`;)

このエントリーをはてなブックマークに追加  
やんだー | やんだ―の開発・運営サービス | 00:03 | comments(0) | - | - |

[Javascript]Google Maps API V2でエラー発生!(V2サポート終了)

みなさん、こんにちわ!やんだーです。

最近、Goolge Mapが急に表示されなくなったサイトがあったので、
ちらっと調べてみました。

エラー内容はこれです。

Uncaught ReferenceError: GBrowserIsCompatible is not defined

特にサイト変更してないのに急に表示されなくなった。とのことです。

Google Maps APIの仕様でも変更になったのか・・・と思ってたら、
https://developers.google.com/maps/documentation/javascript/v2/?hl=ja

上記サイトを発見!


※以下引用
注: Google Maps JavaScript API バージョン 2(V2)は、2010 年 5 月 19 日に正式にサポートが終了しました。V2 の廃止スケジュールは 2013 年 5 月 19 日の予定でしたが、2013 年 11 月 19 日(太平洋時間、日本時間では 2013 年 11 月 18 日)まで延期することになりました。この日以降は V2 を使っている地図は、下位互換機能を持たせた V3 の地図に自動的に切り替わる予定です。この下位互換機能により、大部分のシンプルな地図は機能すると考えますが、この日以前に V3 へ移行を完了することを強く推奨いたします。

・・・え?2013年11月18日から「Google Maps JavaScript V2」が使えなくなるだと・・・!?
そんなこと知らなかったのが恥ずかしいです。

確かにソースを見ると

http://maps.google.co.jp/maps?file=api&v=2&key=~~~~~

「 &v=2 」

v2使ってました。

結構前に作られたサイトなので、Gmap2のまま運営してたみたいです。
なので、V3にソースを書き換えました。

そうすると元通り地図を表示してくれるようになったので、一安心。


▼Google Maps V3の書き方

※公式ドキュメント Google Maps JavaScript API v3
https://developers.google.com/maps/documentation/javascript/tutorial?hl=ja

※APIキー不要バージョンのサンプル
(参考: http://rnk.mitelog.jp/oyaji/2011/05/googlemap-api-v-453b.html
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false" charset="utf-8"></script>
<script type="text/javascript">>
function initialize() { 
    // Google Mapで利用する初期設定用の変数 
    var latlng = new google.maps.LatLng(36.062092, 136.223323); 
    
    var mapOptions = { 
        zoom: 14, 
        mapTypeId: google.maps.MapTypeId.ROADMAP, 
        center: latlng 
    }; 

    // GoogleMapの生成 
    var gmap = new google.maps.Map(document.getElementById("map"), mapOptions); 

    // マーカーを生成 
    var gmarker = new google.maps.Marker({ 
        map: gmap, 
        position: latlng, 
        title: "タイトル" 
    }); 

    // 情報ウィンドウの生成 
    var infoWindow = new google.maps.InfoWindow({ 
        content: "InfoWindow - test", 
        maxWidth: 200 
    });
 
    // マーカーのクリックイベントの関数登録 
    google.maps.event.addListener(gmarker, 'click', function(event) { 
        // 情報ウィンドウの表示 
        infoWindow.open(gmap, gmarker); 
    }); 
}
</script>

<body onload="initialize()">
    <div id="map" style="width: 300px; height: 300px;"></div>
</body>



▼備考
よく引用文を見ると
V2 を使っている地図は、下位互換機能を持たせた V3 の地図に自動的に切り替わる予定です。
て書かれてるのでV2でも行けるのかと思い、
エラーが出てたメソッドを
if (GBrowserIsCompatible()) {
~~~
}
// if (GBrowserIsCompatible()) {
~~~
// }
のif文をコメントして実行しました。
すると、
GUnload()
でエラーが起こりました。

GUnload()もコメントすると、
var map = new GMap2(document.getElementById("map_canvas"));
のGMap2で怒られました。。。

結局、主のソースではV3に自動で切り替わりませんでした。。。
なので、素直にV3の記述にしました。
ちなみに、これが動かなくなったソースです。

<script src="http://maps.google.co.jp/maps?file=api&v=2&key=XXXXXXXXXX" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
function initialize () {
    if (GBrowserIsCompatible()) {
        var init_pos = new GLatLng(35.696212,139.78649);
        var povopts1 = { yaw:0, pitch:-20 };
        var init_zoom = 17;
        var map_canvas = new GMap2(document.getElementById("map_canvas"));
        map_canvas.addControl(new GSmallMapControl());
        map_canvas.addControl(new GScaleControl());
        map_canvas.setCenter(init_pos, init_zoom);
        ~~~
    }
}
</script>
~~~~~
<body onload="initialize()" onunload="GUnload()">
~~~~~
このエントリーをはてなブックマークに追加  
やんだー | Javascript | 12:49 | comments(0) | - | - |

[GIt]CentOS6.4にGitlab5.1を構築して、無料でローカルGithubサービスをはじめよう!

こんにちわ、やんだー(´・ω・`)です。

今日は、みんな大好きGithub!
コピーであるGitlabの構築、インストールについて、一から説明していきます。


Github便利ですよね。
でもプライベートのリポジトリは上限があって、それ以上はお金がかかりますよね。。。

主みたいな貧乏人には、ちょっとつらいですねw

公開目的のみで使用するのであれば、
断然Githubをオススメします。

今日は、Githubで管理したいけどプライベートだとお金かかるし、
ローカルだけで・・・社内だけで使いたい・・・
取り入れたいけどやっぱり無料じゃないと上司に説得しづらい〜

とかそんなあなたのために説明します。
使わなくなったPC1台をGitサーバにすればできます。


■環境
PC:CentOS 6.4 32bit
Gitlab 5.1
Gitlab-shell 1.5.0

(※その他は割愛)

上記で構築します。

※注意
 ・32bitOSで構築したので、64bitをお使いの人は64bit用のものを入れるようにしてください。
 ・下記の手順のコマンドについて
   # 始まりは基本 root で実行
   $ 始まりは基本 git もしくは mysqlのアカウント で実行


■手順

①CentOS6.4のインストール

1.1 centOS6.4をCD/DVDにisoイメージとして焼く

 参考: http://centossrv.com/centos6.shtml
 参考: http://www.kkaneko.com/rinkou/linux/centosinstall.html
 ファイル一覧: http://ftp.riken.jp/Linux/centos/6/isos/i386/

え、そこからって?そうです古いPCにcentOSを入れるところからですw
既に入ってる人はスルーで。

1.2 ディスクからCentOS6.4インストール

 参考は1.1と同じURL


②各種コマンドインストール + α

2.1 wgetインストール

 参考: http://fnya.cocolog-nifty.com/blog/2012/03/centos-62-8fa8.html
# yum -y install wget

2.2 EPEL リポジトリの追加

 参考: http://rexpit.blog29.fc2.com/blog-entry-68.html
 参考: http://www.tatsuya-k.net/wp/?p=131
# wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm

2.3 makeインストール

 参考: http://blog.japanista.info/2013/04/makecentos6.html
# yum -y install make

2.4 bundlerインストール

 参考: http://blog.kjirou.net/p/1587
# gem install bundler
# gem install charlock_holmes --version '0.6.9'

//シンボリックリンク作成
# ln -s /usr/local/bin/bundle /usr/bin/bundle

2.5 SELINUXの無効化

 参考: http://rfs.jp/server/security/selinux01.html
# vi /etc/selinux/config
//下記を変更・保存
SELINUX=disabled

# reboot
//再起動で反映


③Webサーバ構築(Apache)

3.1 httpd(apache2)インストール

 参考: http://centos.server-manual.com/centos5_apache2.html
# yum -y install httpd
# chkconfig httpd on
# service httpd start


④MySQLインストール

4.1  MySQL5.6インストール

 参考: http://www.kakiro-web.com/linux/mysql-install.html
 参考: http://lightly.wjg.jp/wiki/858
# wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.14-1.linux_glibc2.5.i386.rpm-bundle.tar/from/http://cdn.mysql.com/
# tar xf MySQL-5.6.14-1.linux_glibc2.5.i386.rpm-bundle.tar
# yum -y install MySQL-shared-compat-5.6.14-1.linux_glibc2.5.i386.rpm
# yum -y install MySQL-server-5.6.14-1.linux_glibc2.5.i386.rpm
# yum -y install MySQL-devel-5.6.14-1.linux_glibc2.5.i386.rpm
# yum -y install MySQL-shared-5.6.14-1.linux_glibc2.5.i386.rpm
# yum -y install MySQL-client-5.6.14-1.linux_glibc2.5.i386.rpm

//バージョン確認
# mysql --version

//mysql起動
# service mysql start

//mysqlのrootユーザのパスワード確認
# cat /root/.mysql_secret
例)1行目の「# The random password set for the root user at 〜〜〜 (local time): XXXXXXXX」の最後の部分

# mysql -u root -p
//パスワードを効かれるので、上記で確認したパスワードを入力
//rootパスワード再設定 (初期のパスワードを変更しないとエラーが出るため要変更) 
# SET PASSWORD = PASSWORD('xxxxxxxx');

//■mysqlの初期設定及びセキュリティの設定 
# mysql_secure_installation
# Enter current password for root (enter for none): (mysqlのrootのパスワード入力)
# Change the root password? [Y/n] (変更する場合/Y 変更しない場合/n)
# New password: 新規パスワード入力
# Re-enter new password: 新規パスワード確認のためもう一度入力
//anonymous ユーザーを削除しますか?
# Remove anonymous users? [Y/n] y (通常、anonymous ユーザーは不要だと思われますので、削除することをおすすめします。)
//他サーバからの root ログインを禁止しますか?
# Disallow root login remotely? [Y/n] y (通常、他サーバから root でログインすることは不要だと思われますので、禁止することをおすすめます。)
//testデータベースを削除しますか?
# Remove test database and access to it? [Y/n] y (testデータベースを使わないのであれば、削除しましょう。)
//設定を再読込しますか?
# Reload privilege tables now? [Y/n] y


⑤gitインストール

5.1  git1.8.4インストール

 参考: http://www.irusu.net/blog/2012/03/27/linux/centos-6/centos6にgitをインストール/
//依存環境ライブラリインストール
# yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel
# yum install -y perl-ExtUtils-MakeMaker
# cd /usr/local/src
# wget https://git-core.googlecode.com/files/git-1.8.4.tar.gz
# tar -zxf git-1.8.4.tar.gz
# cd git-1.8.4
# make clean
# ./configure
# make
# make install

//シンボリックリンク作成 
# ln -s /usr/local/bin/git /usr/bin/git

//バージョン確認
# git --version


⑥rubyインストール

6.1  ruby2.0.0インストール

 参考: http://centos.bungu-do.jp/archives/000294.html
 Rubyダウンロード先: https://www.ruby-lang.org/ja/downloads/
# yum -y install gcc zlib-devel openssl-devel sqlite sqlite-devel

# cd /usr/local/src
# wget ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz
# tar zxvf ruby-2.0.0-p247.tar.gz
# cd ruby-2.0.0-p247
# ./configure
# make
# make install

//シンボリックリンク作成 
# ln -s /usr/local/bin/ruby /usr/bin/ruby

//バージョン確認
# ruby -v


⑦Redisインストール

7.1  Redisインストール

# yum -y install redis

//redis起動
# service redis start

//redis自動起動ON
# chkconfig redis on


⑧gitlabインストール

 参考: http://14code.com/blog/20130626_510
 参考: http://blog.eb-de.com/2013/04/08/gitlab5-debian-apache-rvm-install/
 参考: http://blog.shinji.asia/gitlab5-0%E3%82%92centos6-4%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/

8.1  ユーザ作成&Gitlabに必要なものインストール

# yum groupinstall "development tools"
# yum -y install gdbm-devel readline-devel ncurses-devel libffi-devel libxml2-devel libxslt-devel libcurl-devel libicu-devel libyaml-devel

//gitユーザ追加
# useradd -c 'GitLab' -s /bin/bash git
# passwd git
//パスワード入力

# usermod -G wheel git
//gitユーザに切り替え

# su - git
$ cd /home/git
$ mkdir .ssh
$ touch .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
$ chmod 700 .ssh
$ git config --global user.name "GitLab"
$ git config --global user.email "gitlab@localhost"

8.2  gitlab-shellインストール

$ git clone https://github.com/gitlabhq/gitlab-shell.git
$ cd gitlab-shell/
$ git checkout v1.5.0
$ git checkout -b v1.5.0
$ cp config.yml.example config.yml
$ vi config.yml
//下記を変更・保存  (主の場合、プライベートアドレスで構築しているのでhttp://192.168.24.xxxとなりました)
gitlab_url: "http://gitlab.hogehoge.com/"

$ ./bin/install

8.3  gitlab用のDB作成

$ mysql -u root -p
//パスワードを聞かれるので、4.1で確認したパスワードを入力
$ CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
$ GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost' identified by 'gitpass';
$ exit;

8.4  Gitlab5.1インストール

//gitユーザで実行
$ cd /home/git
$ git clone https://github.com/gitlabhq/gitlabhq.git gitlab
$ cd /home/git/gitlab
$ git checkout 5-1-stable
$ cp config/gitlab.yml.example config/gitlab.yml

$ vi config/gitlab.yml
host: 変更
email_from: 変更
suport_email: コメント化
ssh_port: 22 コメント解除

$ chown -R git log/
$ chown -R git tmp/
$ chmod -R u+rwX log/
$ chmod -R u+rwX tmp/

$ mkdir /home/git/gitlab-satellites

$ mkdir tmp/pids/
$ chmod -R u+rwX tmp/pids/
$ cp config/puma.rb.example config/puma.rb
$ vi config/puma.rb
//下記をコメント化
#bind “unix://#{application_path}/tmp/sockets/gitlab.socket”

$ cp config/database.yml.mysql config/database.yml
$ vi config/database.yml
username: gitlab DBユーザ
password: "gitlab1234" そのパスワード

$ bundle install --deployment --without development test postgres
$ bundle exec rake gitlab:setup RAILS_ENV=production
//もし、なんか聞いてきたら yes と入力
login.........admin@local.host
password......5iveL!fe

//環境情報確認
$ bundle exec rake gitlab:env:info RAILS_ENV=production

//チェック
$ bundle exec rake gitlab:check RAILS_ENV=production

//上記チェックでChecking Sidekiq /// Running? noとなっていたら下記実行
$ bundle exec rake sidekiq:start RAILS_ENV=production

//起動スクリプト設定
$ sudo curl --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlab-recipes/5-1-stable/init.d/gitlab



⑨apache設定

//rootで実行
# usermod -G git apache
# chmod g+rX /home/git
# chmod +x /etc/init.d/gitlab
# vi /etc/httpd/conf.d/vhost.conf
//下記を記入で新規保存
<VirtualHost *:80>
ServerName (gitサーバのホスト名orIPアドレス)
ProxyPass / http://127.0.0.1:9292/
ProxyPassReverse / http://127.0.0.1:9292/
ProxyPreserveHost On
</VirtualHost>

# service httpd restart
# service gitlab start


⑨Gitlabにアクセス

サーバ設定は以上です。

ブラウザでGitlabのURLにアクセスして、
ログイン画面が表示されたらOKです。

おめでとうございます\(^o^)/



備考

主の場合は、サーバのホスト名を全てプライベートアドレスで設定しました。
例)192.168.24.XXX
ifconfigで確認できるIPアドレスです。

なので、GitlabのURLは、
http://192.168.24.XXX:9292/
となりました。

サーバの設定がこれで出来たので、
次回は、ローカル側の設定を説明できたらいいなと思います。

WindowsXPだと、TootoiseGitでGitlabの設定
WindowsVista, 7, 8、MacOSXだとSourceTreeでGitlabの設定

なんかを頑張れたら書きますw



Gitlabを構築される方のお役に少しでも立てば嬉しいです。
以上です。
このエントリーをはてなブックマークに追加  
やんだー | Git | 13:34 | comments(0) | - | - |

[裏ワザ]iOS7のマルチタスクを早く消す方法(iPhone)

こんにちわ、やんだーです。

iOS7のマルチタスクを消すのってかなりめんどくさくないですか?

今日は、そんなiOS7のマルチタスクを早く消す方法をご紹介します。

1. マルチタスクを起動します。(ホームボタンを素早く2回押してね)

2. 3本指で起動しているアプリの画面を上へスライド!(1本指で通常してるのを3本でやる感じです)

        

以上です。笑

そうすることで、1度にまとめて3つのアプリを消すことができるので、
通常の3倍の速さでマルチタスクを一気に消すことができます。

昨日、後輩から教えてもらって初めて気づきました…。

もし、一気に全消しできる方法やったら教えてくださいw
(それは、iOS7の脱獄待ちになるのかな・・・?)

みなさんもぜひ使ってみて下さい。

このエントリーをはてなブックマークに追加  
やんだー | 裏ワザ | 11:48 | comments(0) | - | - |

iPhoneアプリ「にこつべキャッチ!」Ver1.1公開しました!

みなさん、こんばんわ。

ニコニコ動画、YoutubeユーザのためのiPhoneアプリ、
にこつべキャッチ!Ver1.1」がリリースされました。
にこつべキャッチ!スプラッシュ画像  にこつべキャッチ!アイコン画像

Ver1.1の更新内容
デザイン全体をリニューアル
iPad対応
・バグ修正

の上記3点になります。

新機能などの追加は、
随時、次期バージョンで対応していくつもりです。

こうして欲しい!
この機能があったら便利! などの
要望があれば、レビューかコメント等を頂けると ぜひ、参考にさせて頂きます。
それに、嬉しいです。


アプリの詳細内容については、 こちら よりご確認下さい。

どうぞよろしくお願いします。
このエントリーをはてなブックマークに追加  
やんだー | やんだーの開発アプリ | 01:11 | comments(0) | - | - |

[iPhoneアプリ]申請中のiPhoneアプリを取り消す方法・手順

こんにちわ、やんだーです。

今日は、一度申請に出した後、
バグを見つけた時などに、申請中のアプリを取り消す方法・取り下げる手順をご紹介します。
(Waiting For Review中とか)

まずは、iTunes connectにログインします。
そこから、
Manage Your Apps > 対象のアプリ > View Details
の順でクリックして下さい。
右上にあるLinksの中の「 Binary Details 」をクリックします。
Reject This Binary


そして、また右上にある「 Reject This Binary 」 をクリックして
アラートがでるので、Yesを選択する申請が取り消されます。
Binary Details


アプリのステータスが、
Developer Rejectedになっていれば成功です。

ちなみに、再度アプリを申請するときは、
Ready to Upload Binary 」から、再申請ができます。
このエントリーをはてなブックマークに追加  
やんだー | iPhoneアプリ | 12:10 | comments(0) | - | - |

[iPhoneアプリ]iOS7で新しく追加されたアイコン画像のサイズ一覧

こんにちわ、やんだー(・ω・`;)です。

iOS7が登場して、iPhoneアプリのアイコンの画像も
新しいサイズが追加されたようです。

主がiOS7が登場した後に、アプリのバージョンアップ申請を出したところ、
こんなメールが送られてきました。

We have discovered one or more issues with your recent delivery for "アプリ名". 
Your delivery was successful, but you may wish to correct the following issues in your next delivery:

Missing recommended icon file - The bundle does not contain an app
 icon for iPhone / iPod Touch of exactly '120x120' pixels, in .png format.

Missing recommended icon file - The bundle does not contain an app
 icon for iPad of exactly '76x76' pixels, in .png format.

Missing recommended icon file - The bundle does not contain an app
 icon for iPad of exactly '152x152' pixels, in .png format.

If you would like to update your binary for this app, you can reject this binary from the Binary
 Details page in iTunes Connect. Note that rejecting your binary will remove your app from
 the review queue and the review process will start over from the beginning when you resubmit your binary.

要するに
120px * 120px
76px * 76px
152px * 152px
のアイコンサイズの画像が無いよ。

と言うメールです。

iOS7で追加するアイコンファイル名とサイズ
画像サイズ ファイル名 備考
120px * 120px Icon-60@2x.png iPhone/iPod touch用
76px * 76px Icon-76.png iPad用
152px * 152px Icon-76@2x.png iPad用

.plistファイルの「 Icon file > Primary Icon > Icon files 」の中に、
 この3ファイルを追加しないとApple側は判断してくれませんので、追加することを忘れずに!


画像生成に便利なサイト
http://makeappicon.com
1024px*1024pxのアイコン画像をアップロードすると、
メールで様々なアイコンサイズのファイルをzipで送ってくれるサービス

このまま審査になってもリジェクトされてしまい、
時間が勿体無いので、一度申請を取り下げて、
画像を入れたアプリを再申請しましょう。



申請中のアプリを取り消す方法は、 こちら から確認して下さい。


参考: http://blog.dazzlesystem.co.jp/2013/09/ios7.html
このエントリーをはてなブックマークに追加  
やんだー | iPhoneアプリ | 11:23 | comments(0) | - | - |

[PHP]以前のDB接続のラッパークラスを拡張しました。(mysql, mysqli, PDOで切り替えて接続できるように対応)

やんだーです。

今日は以前、作ったmysqliのDB接続ラッパークラス( こちら )を記述しましたが、
今回はそれを拡張して、
・mysql
・mysqli
・PDO
いずれかの接続方法を選択して使用できるスーパーラッパークラス(笑)を作りました。

環境によって、使えない接続方法があると思うんですが、
このクラスを使えば、同じ記述で、3つを切り替えてどれを使うかできるように
便利にしちゃいました。

では早速こちらです。
(下記のクラスの使用例は こちら
<?php
//**************************************************************
// クラス定義
//
// *データベースクラス
//		・DB接続
//		・SQL作成+バインド
//		・クエリ実行
//		・フェッチ
// 
//**************************************************************

//DB接続情報
define("DEF_dbsv", "localhost");
define("DEF_dbname", "hogehoge_db");
define("DEF_dbuser", "hogehoge_user");
define("DEF_dbpasswd", "hogehoge_pass");


//**************************************************************
// データベースクラス
//**************************************************************
class Database {
	
	//プロパティ定義
	private $_con;
	private $_mysqli_flag;
	private $_pdo_flag;
	private $_stmt;
	private $_result;
	private $_row;
	private $_debug;
	private $_pdo;
	
	private $_sql_str;
	private $_bind_arr;
	private $_bind_type_str;	
	private $_rows;
	
	//***************************
	// コンストラクタ
	// ※クラス生成時に呼ばれる
	//***************************
	public function __construct(){
		
		//初期化
		$this->initDebug();
		$this->initMysqli_flag();
		$this->initPdo_flag();
		$this->initBindParam();

		//※ここで、mysql, mysqli, pdoのいずれかを使うか記述。デフォルトは、mysqliです。
		//環境によって下記を使い分ける

		//mysqliの場合、デフォルトで選択されているのでここでは何もしない。

		//PDOを利用する場合、下記2行を記述
		$this->_mysqli_flag = FALSE;
		$this->_pdo_flag = TRUE;

		//mysqlを利用する場合、下記2行を記述
		$this->_mysqli_flag = FALSE;
		$this->_pdo_flag = FALSE;
	}
	
	//***************************
	// デストラクタ
	// ※クラスを参照しなくなった時
	//***************************
	public function __destruct() {
		
		$this->closeDB();
	}
	
	
	//***************************
	// 初期化メソッド
	//***************************
	//デバッグモード初期化
	public function initDebug() {
		$this->_debug = FALSE;
	}
	
	//mysqliフラグ初期化
	public function initMysqli_flag() {
		$this->_mysqli_flag = TRUE;
	}
	
	//pdoフラグ初期化
	public function initPdo_flag() {
		$this->_pdo_flag = FALSE;
	}
	
	//バインドパラメータの初期化
	public function initBind_arr() {
		$this->_bind_arr = array();
	}
	
	//バインドパラメータのタイプの初期化
	public function initBind_type_str() {
		$this->_bind_type_str = "";
	}
	
	//バインドパラメータの初期化
	function initBindParam($param=NULL) {
		if ($param) {
			$param = array ("type" => "", "bind" => array() );
			return $param;
		}else{
			$this->initBind_arr();
			$this->initBind_type_str();
		}
	}
	
	
	//***************************
	// ゲッター
	//***************************
	//SQL文を取得
	public function getSql_str() {
		return $this->_sql_str;
	}
	
	//SQLの結果の入ったresultを取得
	public function getResult() {
		return $this->_result;
	}
	
	//行数を取得
	public function getRows($result_arr=NULL) {
		if ($result_arr) {
			$stmt = $result_arr['stmt'];
			
			//mysqli
			if ( $this->_mysqli_flag ) {
				return $stmt->num_rows;
			
			//pdo
			}elseif ( $this->_pdo_flag ) {
				return $stmt->rowCount();
			
			//mysql
			}else{
				return mysql_num_rows($result_arr["result"]);
			}
		}else{
			return $this->_rows;
		}
	}
	
	//***************************
	// セッター
	//***************************
	//デバッグモードをセット
	public function setDebug($bool) {
		$this->_debug = $bool;
	}
	
	//SQL文をセット
	public function setSql_str($sql_str) {
		$this->_sql_str = $sql_str;
	}
	
	//バインドパラメータをセット
	public function setBind_arr($bind_arr) {
		$this->_bind_arr = $bind_arr;
	}
	
	//行数をセット
	public function setRows($rows) {
		$this->_rows = $rows;
	}
	
	
	//***************************
	// 処理メソッド
	//***************************
	//DB接続
	public function connectDB() {
		
        //DB情報
        $sv = DEF_dbsv;
        $dbname = DEF_dbname;
        $user = DEF_dbuser;
        $passwd = DEF_dbpasswd;
		
		//mysqli
    	if ( $this->_mysqli_flag ) {
			$con = new mysqli($sv, $user, $passwd, $dbname); 
			
			//DB接続チェック
			if (mysqli_connect_errno()) { 
				//エラー表示
				$this->dispError(mysqli_connect_error());
				exit(); 
			} 
			
			//文字コードをUTF-8に設定
			//$result = $con->query("SET NAMES utf8");  //必要に応じて使用
		
		//pdo
		}elseif ( $this->_pdo_flag ) {
			try {
				// MySQLサーバへ接続
				$con = new PDO("mysql:host=".$sv."; dbname=".$dbname,
							   $user, $passwd);
			} catch(PDOException $e){
				var_dump($e->getMessage());
			}
			
			//文字コードをUTF-8に設定
			//$result = $con->query("SET NAMES utf8");  //必要に応じて使用
			
		//mysql
		}else{
			
			if( !$con = mysql_connect( $sv, $user, $passwd) ){
				print mysql_errno().": ".mysql_error()."MYSQL への接続に失敗しました。";
				exit;
			}
			mysql_select_db($dbname) or die($this->dispError("[ERROR ".basename(__FILE__)." ".__LINE__."]■ERROR-DETAIL=[".mysql_error($con)."(".mysql_errno($con).")]"));

			//mysql_query("SET NAMES utf8",$con);   //必要に応じて使用
			
		}
		
		//コネクト格納
		$this->_con = $con;
	}
	
	//DB切断
	private function closeDB(){
		//mysqli
		if ( $this->_mysqli_flag ) {
			if($this->_stmt) $this->closeStmt();
			$this->_con->close();
		
		//pdo
		}elseif ( $this->_pdo_flag ) {
			$this->_con = NULL;
			
		//mysql
		}else{
			mysql_close($this->_con);
		}
	}
	
	//stmt解放
	public function closeStmt($result_arr=NULL){
		if ($result_arr) {
			$stmt = $result_arr['stmt'];
		}else{
			$stmt = $this->_stmt;
		}
		
		//mysqli
		if ( $this->_mysqli_flag ) {
			@$stmt->free_result(); 
			@$stmt->close();
			
		//pdo
		}elseif ( $this->_pdo_flag ) {
			@$stmt->closeCursor();
			
		//mysql
		}else{
			
		}
	}
	
	//バインドパラメータ追加
	public function addBind($param=NULL, $type, $val) {
		//HTMLエンティティをデコード
		$val = htmlspecialchars_decode($val);
		
		$this->_bind_type_str .= $type;
		array_push($this->_bind_arr, $val);
		
		if (!$param) {
			$param = array ("type" => "", "bind" => array() );
		}
		$param['type'] .= $type;
		array_push($param['bind'], $val);
		
		return $param;
	}
	
	//クエリ実行
    public function exeQuery($param=NULL) {
		
		//connectセット
		$con = $this->_con;
		
		//SQL文取得
		$sql = $this->getSql_str();
		
		//バインドパラメータ取得
		if ($param) {
			$bind_arr = $param['bind'];
			array_unshift($bind_arr, $param['type']);
		}else{
			$bind_arr = $this->_bind_arr;
			array_unshift($bind_arr, $this->_bind_type_str);
		}
		//print_r($bind_arr);
		
		//mysqli, pdo
		if ( $this->_mysqli_flag || $this->_pdo_flag ) {
			//返り値の格納オブジェクト
			$result = new stdClass();
			
			//ステートメント準備
			if ($stmt = $con->prepare($sql)) {
				
				//バインド処理
				@call_user_func_array( array($stmt, 'bind_param'), $this->refValues($bind_arr));
				
				//SQL実行
				//mysqli
				if ( $this->_mysqli_flag ) {
					$stmt->execute();
					
				//pdo
				}elseif ( $this->_pdo_flag ) {
					//先頭のタイプ文字列を削除
					array_splice($bind_arr, 0, 1);
					//print_r ($bind_arr);
					
					$stmt->execute($bind_arr);
					
					//行数をセット
					$this->setRows($stmt->rowCount());
					
					$this->_stmt = $stmt;
					$row = array();
					
					$return_arr = array("stmt" => $this->_stmt, "row" => $this->_row);
					return $return_arr;
				}
				
				//エラー表示
				$this->dispError($stmt->error, $param);
				
				//結果を保存
				if ( $this->_mysqli_flag ) $stmt->store_result();
				
				//行数をセット
				$this->setRows($stmt->num_rows);
				
				//関連付け
				if ( $this->_mysqli_flag ) $row = array();
				if ( $this->_mysqli_flag ) $this->stmtBindAssoc($stmt, $row);
				
				//セット
				$this->_stmt = $stmt;
				$this->_row = $row;
				
				$return_arr = array("stmt" => $this->_stmt, "row" => $this->_row);
				return $return_arr;
				
			}else{
				//エラー表示
				$this->dispError($con->error, $param);
				return NULL;
			}
		
		//mysql
		}else{
			
			$sql = $this->getSql_str();
			$bind = $param['bind'];
			$type = str_split($param['type']);

			if ($bind) {
				foreach ($bind as $n => $val) {
					//s string型
					if ($type[$n] == "s")  {
						$sql = preg_replace("/¥?/", "'".mysql_real_escape_string($val)."'", $sql, 1);
						
					//i int型(数値)
					}else{
						$sql = preg_replace("/¥?/", mysql_real_escape_string($val), $sql, 1);
					}
				}
			}
			
			$result = mysql_query(cnv_sqlstr($sql), $con) or die($this->dispError(mysql_error($con)."(".mysql_errno($con).")", $param));
			
			$return_arr = array("result" => $result);
			$this->_result = $result;
			return $return_arr;
		}
    }
	
	//実行結果を関連づける
	private function stmtBindAssoc(&$stmt, &$out) {
		//$data = mysqli_stmt_result_metadata($stmt);
		if ( FALSE !== ($data = $stmt->result_metadata()) ) {
			$fields = array();
			$out = array();
		
			$fields[0] = $stmt;
			$count = 1;
				
			//while($field = mysqli_fetch_field($data)) {
			while( $field = $data->fetch_field() ) {
				$fields[$count] = &$out[$field->name];
				$count++;
			}
			@call_user_func_array(mysqli_stmt_bind_result, $fields);
		}
	}

	
	//フェッチ処理
    public function exeFetch($result_arr=NULL){
		if ($result_arr) {
			$stmt = $result_arr['stmt'];
			$row = $result_arr['row'];
		}else{
			$stmt = $this->_stmt;
			$row= $this->_row;
		}
		
		//mysqli
		if ( $this->_mysqli_flag ) {
			if ($stmt->fetch()) {
				//HTMLエンティティを変換
				return array_map("htmlspecialchars", $row);
			}else{
				return NULL;
			}
			
		//pdo
		}elseif ( $this->_pdo_flag ) {
			if ($row = $stmt->fetchObject()) {
				$row_arr = array();
				foreach ($row as $n => $v) {
					$row_arr[$n] = $v;
				}
				
				//HTMLエンティティを変換
				return array_map("htmlspecialchars", $row_arr);
			}else{
				return NULL;
			}
			
		//mysql
		}else{
			$result = ($result_arr) ? $result_arr['result'] : $this->_result;
			$row_arr = mysql_fetch_array($result, MYSQL_ASSOC);
			
			$row = array();
			if ($row_arr) {
				foreach ($row_arr as $n => $val) {
					$row[$n] = htmlspecialchars($val);
				}
			}
			
			return $row;
			//return array_map("htmlspecialchars", $row_arr);
		}
	}
	
	//エラー表示
	public function dispError($error, $param=NULL) {
		if (!$error) return;
		
		//デバッグモードON時
		if ($this->_debug) {
			//SQLがある時
			if ($this->getSql_str()) {
				echo "SQL = [ ".$this->getSql_str()." ]";
				echo "'?' in SQL = [ ".substr_count($this->getSql_str(), "?")." ]";
			}
			
			//バインドパラメータがある時
			if ($param) {
				echo "Bind Param count = [ ".count($param['bind'])." ]";
				echo "Bind Param type = [ ".$param['type']." ]";
				echo "Bind Param detail = [ ";
				print_r($param['bind']);
				echo " ]";
			}
			
			echo "Error: ".$error;
			exit();
		}
	}
	
	//SQL文表示
	public function dispSql($result=NULL, $param=NULL) {
		
		//SQLがある時
		if ($this->getSql_str()) {
			$sql = $this->getSql_str();
			$bind = $param['bind'];
			if ($bind) {
				foreach ($bind as $n => $val) {
					$sql = preg_replace("/¥?/", "'".$val."'", $sql, 1);
				}
			}
			echo "SQL = [".$sql."]";
		}

		//検索結果数表示
		if ($result) {
			echo "rows = [".$this->getRows($result)."]";
		}
		
	}
        
        //php5.3以上の場合、bindする際にかます
        public function refValues($arr){ 
            if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+ 
            { 
                $refs = array(); 
                foreach($arr as $key => $value) 
                    $refs[$key] = &$arr[$key]; 
                return $refs; 
            } 
            return $arr; 
        } 
	
}
?>

このクラスを使った方法は前回の こちら より、確認して下さい。

これを使えば、同じDB接続の記述で接続方法(mysqli, mysql, pdo)を切り替えることができます。

よかったら自己責任で使ってやって下さい。笑

このエントリーをはてなブックマークに追加  
やんだー | PHP | 20:12 | comments(0) | - | - |

[androidアプリ]タイトルバーをカスタマイズしたら余白(padding)が消えない・残ってしまう対策

こんばんわ、最近Android開発ばっかのやんだーです。

今日は、Androidアプリのタイトルバーをレイアウトファイル(xml)を元に
カスタマイズした際に、困ったことになった対策です。

タイトルバーをxmlファイルでカスタマイズしたものの、
余白(padding)が残ったままで、隙間ができて消せなくて大変困りました。

タイトルバーの背景を黒くしたり、画像で背景付けても、
デフォルトのグレーが外側だけ微妙〜に残ってるんですよ。

こんな感じです。

周りに若干、グレーの隙間があります。これを無くします。
下記が対策内容です。

ざっくりで言うと、

1.themesに新規テーマを作って、
2.Manifestファイルで使用するアクティビティの箇所でそのテーマを指定する。

です。

まずは、1のthemesに新規テーマを作ります。

/res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="MyCustomTheme" parent="@android:style/Theme.Light">
        <item name="android:windowTitleSize">50dp</item>
        <item name="android:padding">0dp</item>
        <item name="android:windowTitleBackgroundStyle">@null</item>
        <item name="android:windowBackground">@drawable/main_view_bg</item>
    </style>

</resources>

赤字でpaddingを0にします。
もし、全体のpaddingが0にしたらまずい場合、その下の
<item name="android:windowTitleBackgroundStyle">@null</item>
だけで、タイトルバーの余白を削除することができます。
どちらか片方でOKです。

ちなみに上記は全体の背景に画像を指定していますが、色だけ指定したい場合は、
<item name="android:windowBackground">@android:color/black</item>
などで指定して下さい。

そして続いて、上記で作ったテーマをマニフェストファイルの
該当するアクティビティで指定します。

AndroidManifest.xml
~~ 省略 ~~
<activity
            android:name="com.xxx.Exsample"
            android:label="@string/app_name"
            android:theme="@style/MyCustomTheme">
~~ 省略 ~~

これで、タイトルバーの余白(padding)は無くなります。

下記が実行結果です。

これで綺麗さっぱり余白を消すことができました。
以上です。
このエントリーをはてなブックマークに追加  
やんだー | Androidアプリ | 19:14 | comments(0) | - | - |
1/4PAGES | >> |

08
--
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
31
--
>>
<<
--
おすすめリンク
やんだーの家
http://www.randy-boy.com/
ブログ筆者やんだーの
所属プロジェクト「RandY boy」
のページです。
ぜひ、見ていってやって下さい。

Twitter: やんだー
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH