PHP分かる人の為のC言語入門 前半

先月iphoneアプリを制作するべく、macbook proを購入し早速カンタンなiphoneアプリを試しに一つ作ってみました。

一応完成はしたのですが、Object-Cが分からないためプログラムのコード自体はほぼ本から丸写ししました。オリジナルのアプリを作るためにはもちろんObject-Cをしっかり理解しなくてはいけないわけでして、かつObject-Cを理解するためにはその根底にあるC言語を理解しなくてはいけないわけです。

というわけで、例の如くAmazonで評判のよかった本を購入し、一気に読み終わりました。
ザーっとみた感じ、基本的な文はPHPとそんなに変わらないのですが、データ型の宣言やヘッダファイル、ポインタの存在など全く違うところもいろいろありました。

今回はそういった「PHPはなんとなく分かるけど、Cとどう違うのよ」という人に役立つような記事を書いてみようと思います。
まーがんばってみましょ。

1、C言語の基本のキ

・通常C言語のファイルの拡張子は「.c」
・C言語はプログラム書いてハイ終わりではなく、書いたC言語のファイルをコンパイラ(機械語に翻訳)して出来たオブジェクトファイルをリンクして1つのプログラムファイルを完成させる。なんのこっちゃ。

とりあえず、フツーに書いたプログラムファイルを「コンパイラ」っちゅーソフトで変換して、それをいろんなファイル同士で結合して完成ファイルをつくるらしい。めんどくさいね。とりあえずコンパイラとしてVisual C++ 2010 Expressをインストールしてみた。これでいいのかな。このソフトだとファイルの結合を自動でやってくれるらしい。ふーん。

2、C言語のコードの基本

・C言語ではmain関数が一番最初に読み込まれ実行される
・C言語の機能を使うためには、その機能のヘッダファイルを読み込む必要がある
(PHPでは何もせずにprintなどの機能を使えるが、C言語ではそれぞれの機能毎のライブラリみたいなのを読み込み必要がある)

//ヘッダファイルを読み込み
#include <stdio.h> //セミコロンはいらないよん

int main(void)
{
printf("Hello! World!");
}

・文中に「%●」を入力すると、その部分に「,」の後の内容が埋め込まれる
文字 → %c、「’」でくくる。
文字列 → %s、「”」でくくる
整数 → %d、くくらない
小数 → %f、くくらない

int main(void)
{
printf("%cは文字です¥n" , 'A');
//Aは文字列です
}

3、変数

・C言語では変数を使用するまえに宣言が必要。またその際にデータ型を指定する

#include <stdio.h> //セミコロンはいらないよん

int main(void)
{
//int型の変数numを宣言する
int num;
num = 100;

//出力
printf("変数numの値は%dです" , num); //変数は「""」などで囲まない
//変数numの値は100です
}

・変数はブロック(関数)内で一番最初に宣言する

・ユーザーが入力した値を変数に格納させる場合、数字はscanf、1文字getcharはを使う。

#include <stdio.h> //セミコロンはいらないよん

int main(void)
{
//int型の変数numを宣言する
int num;

//整数の場合は%d、小数の場合は%lfを使う
scanf("%d" , &num) //scanfを使う変数のアタマには「&」をつける

//出力
printf("変数numの値は%dです" , num); /
//変数numの値は100です
}

4、演算子

・型を変換するにはこんな感じ。

inum = (int)dnum;

5、配列と定数と文字列

・定数(C言語ではマクロっていうらしい)を設定するのはこんな感じ

//define マクロ名 置換する文字列
#define NUM 100;

とりあえずここまでざっと書いてみて思うのは、やっぱりPHPと比べると「めんどくさ!」って感じですね。
いちいちライブラリみたいのincludeしなくちゃいけないとか、なんでそんなことせなあかんのやら。

まぁ本を読むだけでは何も習得できないので、これからVisual C++ 2010 Expressを実際に使ってみようと思います。

と、いうわけで後半に続く。

Google AnalyticsでPDFなどのダウンロード数を解析する方法(非同期トラッキング)

Google Analyticsで、PDFのダウンロード回数や外部ページへのリンクをクリックした数をカウントする方法をご紹介します。

【ここ1年くらいでGoogle Analyticsのタグを入れた人や、これから入れる人はこちら】

最近Google Analyticsのタグを入れた人は、最新の「非同期トラッキング」という方法が使えます。
旧来の方法と比べて機能的にどうよくなったのかはよく分かりませんが、「ちょっと解析までの時間が早くなる」みたいなこと書いてあるサイトもありました。

さて、最近Google Analyticsを入れた人は、埋め込みタグが下記のような感じになってると思います。

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

PDFのダウンロード率などをカウントするためには、上記タグを「<body>タグの直後」に入れてください。
※<body>タグの直後です。閉じタグ(</body>)の直後ではありません。

もしも何らかの理由で「全ページの直後に入れたくない」という場合は、PDFのダウンロード回数や外部ページへのリンククリック数をカウントしたページだけにタグを入れて、そのほかのページは従来とおりの直前に入れておく、ということもできます。

さて、次は実際にカウントを取りたいリンクの設定です。PDFなどのファイルや、通常のリンクのクリック数をカウントするには、カウントしたリンクに下記のように設定してください。

<a href="test.pdf" onClick="_gaq.push(['_trackEvent', 'カテゴリ名', 'アクション名','ラベル名', 値]);" >test.pdf</a>

上記のカテゴリ名、アクション名、ラベル名、値にお好きな名前を入れてください。ラベル名と値はそもそもなくてもOKですが、カテゴリ名とアクション名は必須です。

つまり、カテゴリ名とアクション名だけで事足りる場合は下記のような感じ。

<a href="test.pdf" onClick="_gaq.push(['_trackEvent', 'カテゴリ名', 'アクション名']);" >test.pdf</a>

Web担に書いてあったのだけど、「値」の部分は数値しか設定できないので、文字列はダメらしい。そして、数値なので”は取らないといけないとのこと。

私はWordPressや自作のCMSに上記タグを入れ込んで、ラベルの部分を動的に書き出すようにしてます(記事id_記事のタイトル、みたいな)。
上記の例では<a>タグにonClickで指定していますが、要はonClickが認識できればいいのでFlashの再生ボタンとかでもいけるらしいです。試していませんが。

無事に設定し終わったら何回かクリックしてみてください。しばらくするとGoogle Analytics管理画面の コンテンツ > イベントのトラッキング の中でクリックされた数などを解析できます。上記で設定したカテゴリ別、アクション別・・・などで分けて見れるので便利ですね。

ちなみに反映されるまでの時間ですが、初めて設定した時は1日以上かかったのに、次にタグを増やした時は2時間ほどで反映されました。なのでよくわかりません。

【1年以上前にGoogle Analyticsのタグを入れた人はこちら】

さて、もしあなたが下記のような古いタイプのGoogle Analyticsタグを設置している場合、上記とちょっとやり方が違います。

<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>

<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-XXXXXX-X*);
pageTracker._initData();
pageTracker._trackPageview();
</script>

このタグの場合は非同期トラッキングという新しい手法が使えないので、カウントしたいリンクに下記のように設定します。

<a href="test.pdf" onClick="javascript:pageTracker._trackPageview('カテゴリ名', 'アクション名','ラベル名', '値');" >test.pdf<a>

まーこちらは古い方法なので、もしも新しいタグに移行できるならした方がいいと思います。

以上です。

ここで紹介した方法では、Google Analyticsの画面で「イベントトラッキング」で確認できる、と前述しましたが、もしも「通常のコンテンツと同じように「上記のコンテンツ」とかで管理したい」、ということであれば「バーチャルベージビュー」というちょこっとだけタグの違う機能を使います。

まぁ、リンクに貼るタグがちょこっと変わるだけです。こんな感じに.

<a href="test.pdf" onClick="javascript:_gaq.push(['_trackPageview', '/download.html']);" >test.pdf<a>

では。

PHPでMysqlからデータ抽出した値の文字化けを直す方法(さくらインターネットなど)

MysqlからPHPでデータ抽出した値が文字化けする場合の対処法です。

最近はWordPressの普及もありUTF-8が一般的になっていますが、さくらインターネットなどの一部サーバーではまだEUC-JPが使われていたりして、文字化けに頭を悩ますことになります。

Mysqlから抽出したデータが文字化けした場合は、Mysqlと接続するときに下記のように設定してあげれば文字化けしなくなるはずです。

$conn = mysql_connect(データベースのホスト名,アカウント名,パスワード);

mysql_query("SET NAMES utf8",$conn); //ここで文字コードを設定!

mysql_select_db(データベースのホスト名,$conn) or die("データベースがありません");

2行目の「utf8」をあなたの環境の文字コードに変えてください。いま思ったけど、「utf-8」じゃなくていいのかな?ハイフンいらないのかな?
まぁ問題なく化けなくなったからいいけれど。

もしも文字化けで悩んでいたら試してください。

さくらインターネットでCakePHPを使っている場合の文字化けを直す方法

また更新を1ヵ月も止めてしまいました。

飽きっぽいのが悪い癖です。これからはちょっとしたことでもいいから、ちゃんと更新できるようにがんばります。
目指せ1日1記事!

「目指せ」とか言ってる時点で望み薄ですねw

今回はCakePHPです。最近仕事でCakePHPやWordPressを使って情報サイトを作ったので、その辺の更新が増えるかも、です。

ここから本題です。

さくらインターネットのサーバーはMysqlの文字コードがEUC-JPのため、普通にCakePHPを使うと文字化けしてしまいます。
そんな時は、app/config/database.phpの中で下記のように指定してあげれば文字化けが直ります。

’encoding’ => ‘utf8′;

上記の「utf-8」のところはあなたの環境に合わせて変えてください。Shift-jisを使っている場合は「Shift-jis」に変えてね。

もう文字コードはUTF-8が基本になっているような気がしますが、さくらインターネットはEUC-JPが基本なので最初はいろいろと手間取りますね。
次回はさくらインターネットのサーバーを契約しているけれど、CakePHPでなく普通にPHPベタ書きでデータベースからデータを抽出したときに文字化けしたときの対処法を説明します。


ではまた。

windows版safari4以降でプルダウンメニューがFlashの背景に隠れるバグの対処法

ある案件で、プルダウンメニューの下にFlashを配置するウェブサイトを制作しました。

こういった状況で必ず問題になるのが、JavaScript(HTML)がFlashの背景に隠れてしまう、というものです。Flashはz-indexを認識しないため、CSSで重なりの設定しても効果がありません。

そんな場合の通常の解決策が、flashを設置しているタグにwmodeのtransparentを指定してあげるというものです。

●objectで指定する場合は下記を追加

<param name="wmode" value="transparent" />

●embedで指定する場合は下記を追加
<embed wmode="transparent"... />

●swobject.jsを使っている場合は下記を追加
so.addParam("wmode", "transparent");

この解決策にもデメリットがあり、Flashの中に入力要素があったりすると入力できなくなったりするそうです。
まぁ私の案件ではFlashは単純にonclick等で動かすだけのものだったので、特に問題なしと思っていました。

が、先日問題を発見。

windows版safariのバージョン4.0以降で見てみると、上記指定が効いておらず、プルダウンがFlashの背景にいってしまいます。
調べたところバージョン3.0では問題なかったようです。

海外のサイトを含め、かな~り調べて試しましたが、7月9日現在根本的な解決策は見つかっていません。
ただ、ここまでの調査で分かっているのは下記のとおりです。

・windows版safariのバージョン4以降で発生。mac版では問題ない。バージョン3以下でも問題なかった可能性大(他のサイトの情報から)
・IE6、IE7、IE8、Firefox2、Firefox3、Google Chromeでは問題なし
・インストールされているFlash playerが新しければ問題なし。10.1であれば問題が発生しないのを確認。

とりあえずはFlashのバージョンが新しければ問題ないので、win版safariのシェアも低いことですし今回はそれでなんとか収まればよいのですが。。。
根本的な問題解決策は、今後も探してみようと思います。

もし解決策をご存じの方がいらっしゃいましたら教えてください。m(_ _)m

【追記】

解決策、なし。まぁFlash更新されりゃ問題ないからいいでしょう。