開発メモ

気負わずに、ちょくちょく勉強進めていきたい。。。

プログラマに、葉隠はいらない

ちょっとしたツールを、PHPJavascriptで作った。

ページ遷移するとウザイだろうと思って
ajax使ってみたけど、後から考えるとそんな使う必要もなかった。。。

今回の失敗

先入観で作ってしまったこと

経験が足りないから。
作りまくれ。

めんどくささに負けた

途中でなんとなく設計ミスった事に気付いたが、今更なので
方針変えず突き進んだ。

気付いた時点で、めんどくさがらず直すべきだった。
無駄に複雑化したソースは、開発効率を著しく低下させる。
  
プログラマは「今を生きる」、葉隠「武士道と云ふは死ぬ事と見付けたり」に
なってはいけない。。。
(にわかなので、間違ってたらごめんなさい)

プリミティブデータ型についてと、関数のスコープ

javascriptについて、自分が作りたいものを作ってるだけだと
なかなか基礎的な部分が身につかない。

休日など、時間があるときに本読んで
深くまで理解できるようになりたい。

プリミティブデータ型

値を割り当ててないと、undefinedになる
 var a; typeof a;
数値に変換できないときにNaNになる
 var s = '1s';
 s++;

 

文字列から、ブーリアン型への変換 falseになる

 ( 文字列ははじめ、trueに変換されます)

 !!"dd"

関数のスコープ

・関数内で書かれた変数については外に影響しない
・グローバルで書かれた変数については中で取得可

var b = 4;
(function(){
  alert(b);
})();

即時関数も、外から内への影響はあるが
中のものは外へ影響しない。

グローバル変数とローカル変数

ふつうなら、はじめのalertで291、次にalertで3が
きそうですが実際は、はじめにundefined、次に3がきます。

関数の定義を実行前に、行う為
関数内にローカル変数が作られそちらが優先されます。

var a = 291;

function f(){
	alert(a);
	
	//関数の定義の際に、ローカル変数aが入ってれば
	//ローカル変数aが優先される
	
	var a=3;
	alert(a);
}
f();

パーフェクトPHP Part3実践アプリケーション(3)

とりあえず、ちょくちょく進めて
フレームワークは写経完了。

最後のあたり、駆け足で通り過ぎたので
次のミニブログを作るときに、理解を補うようにしたい。

interfaceとabstract

http://havelog.ayumusato.com/develop/php/e166-php-interface-abstract.html
読んで、interfaceとabstractの違いを自分用メモにまとめた。

interface

特徴

・実装を伴うメソッドやプロパティの宣言はできない
・クラスはインターフェイスで宣言されたメソッドをすべて実装しなくてはいけない
・返り値の型強制はできない
インスタンス化できない

abstract

特徴

・実装を伴う目祖度やプロパティの宣言はできる
・クラスはアブストラクトで宣言されたメソッドをすべて実装しなくてはいけない
インスタンス化できない(継承されたサブクラスをインスタンス化は可能)

abstract
複数の派生先クラスで、一部の実装が異なる場合。

interface
不特定のクラスを共通の方法で、取り扱えるようにしたい場合。

http://havelog.ayumusato.com/develop/php/e166-php-interface-abstract.html

権限

・protected そのクラス自身と継承したクラス、親クラスからのみ
・public どこからでも
・private そのメンバーを定義したクラスからのみ

ユーザスクリプトでjQueryを利用する【ソースを読む】

ユーザスクリプトで、jQueryを使う場合の
ソースについて何をしているのか、読んでみる。

前のブログ記事で紹介したソースです。
http://iwa4.hatenablog.com/entry/2013/07/02/181645


動作の流れに沿って書く。

0.引数に、jQueryにて実行したい処理を書く

})(function ($) {
  //ここに、実行したい処理を書く
  alert('jQuery is ' + typeof $);
});

1.スクリプトタグ生成

jQueryを入れるスクリプトタグを生成

var script = document.createElement("script");
script.setAttribute("src", "//code.jquery.com/jquery-2.0.0.min.js");

ローカルで試しに実行するときに、file://になってると読み込めないので
注意。その場合は、http:を足してください。

2.生成したスクリプトタグをbodyタグの子要素として追加

document.body.appendChild(script);
script.textContent = "(" + callback.toString() + ")(jQuery.noConflict(true));";

3.イベント処理(scriptタグロード時)

引数(function型)を、スクリプトタグ生成して実行できるようにする。
var script = document.createElement("script");
script.textContent = "(" + callback.toString() + ")(jQuery.noConflict(true));";
textContentについては、下記記事が参考になった。

textContent も innerText もある要素の text 部分にアクセスするためのプロパティです.

http://d.hatena.ne.jp/cou929_la/20110517/1305644081
noConflict

jQuery.noConflict([extreme])
この関数を実行すると、$関数の動作が先に定義されている動作に戻します。
noConflictを使った場合、jQueryオブジェクトの呼び出しには明確に'jQuery'と書く必要があります。
第1引数 extreme (ブール値) を true とすると、$関数のみならず、jQueryオブジェクトも含めて完全にグローバルの名前空間から除去します。
これを設定すると、$関数だけでなくjQueryオブジェクトも、先に定義された動作に戻してしまいます。

http://www.hp-kyoto.info/jQuery/jquery3000.html

この文章の後の、参考例がわかりやすかった。

そして、スクリプトタグを、bodyタグの子要素として追加
document.body.appendChild(script);
どうなるか

bodyタグ内に、下記2つのscriptタグが生成される。

<script src="//code.jquery.com/jquery-2.0.0.min.js"></script>
<script>
(function ($) {
    alert('jQuery is ' + typeof $);
})(jQuery.noConflict(true));
</script>

即時関数について

このソースでも利用されているが
即時関数のメリットは

グローバル変数に関数の割り当てがされない
 変数の名前が衝突しないので、外を気にしなくてよくなる
・内部で宣言した変数や関数はローカルに限定される

function hoge(){
    alert(1);
}

hoge();

↑は↓と同じ

(function hoge(){
    alert(1);
})();

ユーザスクリプト初めの一歩【chromeの場合】

ユーザスクリプトとは

ユーザが登録したスクリプトを任意のwebブラウザ上で
呼び出す事が出来る。

GreaseMonkeyとは

ユーザスクリプトでググってると
GreaseMonkeyという単語をよく目にする。

これはFireFoxのアドオンで、「Firefox」上で「ユーザスクリプト」を
動かせるようにするものである。

ブラウザによって、ユーザスクリプトの挙動が違うので
気をつける。

ユーザスクリプトの書き方について

下記3点、注意が必要です。(主に自分へ向けて)

1.メタ情報を指定
// ==UserScript==
// @name           sample
// @namespace      aczz.hateblo.jp
// @description    sample
// @match http://aczz.hateblo.jp/*
// ==/UserScript==


@name スクリプト名(任意)
@namespace 名前空間の指定(スクリプト作成者の持つドメインなどが定番)
@description スクリプトの説明(任意)

@match
chromeの場合は、スクリプトを実行したいURLの設定は
@matchで行ったほうがよい。

ユーザースクリプトChromeで実行したいページを指定する主な方法は、@matchです。その使用例は以下の通りです。
// ==UserScript==
// @match http://*/
// @match http://*.google.com/*/
// @match http://www.google.com/*/
// ==/UserScript==
@match構文の詳細な情報についてはこれらのコメントを参照して下さい。
現在、ChromeGreasemonkeyの@include構文をサポートしていますが、推奨はしていませんし使えなくなる可能性もあります。”また@includeよりも@matchの方がユーザーにはどのページで実行するのかわかりやすいので@matchを勧めます。”

http://d.hatena.ne.jp/zuzu_sion/20090325/1238042619
2.必要ならjQueryを読み込み

chromeでは、@requireが使えないので自前で読み込んでくる

参考サイト
http://iwa4.hatenablog.com/entry/2013/07/02/181645

3.ファイルを保存する

ユーザスクリプト書けたら、保存する。
必ず、ファイル名末尾に「.user.js」を入れる。

追記

ちょいと、chrome拡張で何か試したりテストしたい場合は
chrome拡張の「jsshell」が便利です。

jQueryも、特に前準備も必要なく使えるので、イイ。

http://www.chrome-life.com/chrome/3792/

今考えてること

スクリプトを実行するHTMLのレイアウト変わると、DOMいじってた場合死ぬ。

レイアウト変わっても、なるべく死なないようにする設計に
出来ないだろうか。

言語関わらず、HTMLをスクレイピングして整形する処理
全てに言えることだろうけれども。。。

荒い「初めの一歩」まとめになってしまいましたが
以上。