Home

sukechan.net

Leopard を再インストールしました

たまには Mac ネタでも。最近 MacBook の調子が悪かったので Leopard を再インストールしました。

主な現象

  • Finder, Safari などが全体的にもっさり。よくレインボーカーソルになる。
  • スリープから復帰しないことがあり、強制シャットダウンを余儀なくされる。(これはハード的な問題かもしれないけど)

手順

  • HDD をフォーマットして OS を新規インストールする
  • TimeMachine から復元する(ホーム、ネットワークとその他の設定、アプリケーションのみ)
  • iTunes Music フォルダはホームとは別の場所に置いてあるので、手動でバックアップする
  • その他、開発環境などは構築し直す

その時の Twitter のログ。大まかな流れはこんな感じです。

12/27 20:27 HDDフォーマット→OS再インストール→ホームフォルダだけ丸ごとリストア→それ以外は個別に環境構築でいくかな。
12/27 20:42 バックアップ開始
12/27 22:10 バックアップやっと終了。
12/27 22:21 インストール DVD から起動。HDD フォーマット。
12/27 22:25 Leopard 新規インストール中。
12/27 22:56 インストール完了。
12/27 22:58 Time Machine から復元開始。
12/27 23:06 約1時間か。
12/28 00:20 復元終わってた。
12/28 00:22 最後にソフトウェア・アップデート。
12/28 01:40 iTunes の曲ファイルを元の HDD にコピーするだけのお仕事。
12/28 01:41 Safari がサクサクな件。
12/28 02:00 とりあえず一通り環境構築おしまい。

再インストールを終えて

かなり Mac の動作が軽くなりました。
レインボーカーソルはほとんど出てません。スリープの件はこれから確認します。
改めて Time Machine からの復元が簡単で素晴らしいと思いました。
調子が悪いなと思ったら OS 再インストールがおすすめですよ。

WordPress 2.7 にアップデート

このブログで使用している WordPress を 2.7 日本語版にアップデートしました。

一目見て分かるところは、やはりダッシュボードのレイアウト・デザインですね。かなりカッコよくなりました。
WordPress 自体の自動アップデート機能も付いたようです。アップデートをサボることが多い自分には便利ですね。
その他の新機能については下記リンクからどうぞ。

特定のユーザ間のやり取りを表示する Twitter Stream Viewer を作りました

これはなに?

Twitter の特定のユーザ間のやり取りを分かりやすく表示します。
以下のリンクからどうぞ。

Twitter Stream Viewer

使い方

ユーザ名を半角スペース区切りで入力(例:「id_a id_b」)して「送信」ボタンをクリックすると、そのユーザのタイムラインを取得します。
入力したユーザ間での @ 発言(@id_a, @id_b)は、背景色が赤くなりますので、やり取りの流れを把握するのに便利です。
また、発言内の @ リンクをクリックすると、そのユーザを追加して表示します。

きっかけ

iPhone 用の Twitter クライアントである NatsuLion for iPhone に「Pair Timeline」という機能があります。これはある 2 人のタイムラインを表示するもので、やり取りを把握するのにとても便利でした。
そこで Web 上で実現してみようと思ったのがきっかけです。

今後やりたいこと

  • Twitter の個別発言ページから、そのユーザと @ 先を表示するリンクを追加するグリモン(近いうちに作ります)→作りました Twitter Stream Viewer Link for Greasemonkey (追記@20081213)
  • Show More Tweets 機能(もっと過去に遡って発言を取得)→期間を絞った検索をできるようにしました (追記@20090315)
  • fav れるように→できるようにしました (追記@20090108)
  • 発言まとめに使えるように何らかのフォーマットで書き出し→プレーンテキストで書き出しできるようにしました (追記@20090517)

などをやりたいなぁと思ってます。

その他

一応 Win: IE 6, Firefox 2.x, Mac: Safari 3.2.1, Firefox 3.0.1 で動作確認しています。

ご意見、不具合などあれば @yusuke0927 までお気軽にどうぞ。

JavaScript 第 5 版 8 章まとめ

ようやく 8 章まで来ました。
だいぶ内容が難しくなってきたので、読んでもよく分からないものはちゃんと手を動かして理解するように心がけました。
ですが、最後のクロージャのところは正直理解できませんでした・・・。また後で読んでみます。

8 章 関数

8.1.1 入れ子型の関数

  • 関数を他の関数の中に入れ子で定義できる。
  • ただし入れ子にする関数のトップレベルで定義しなければいけない。if 文の中などでは定義できない。

8.1.2 関数リテラル

var f = function() { return x * x };  // 変数に格納したり
f[0] = function(x) { return x * x };  // 配列要素に格納したり
a.sort(function(a, b) { return a - b; });  // 別の関数に渡したり
var s = (function(x) { return x * x; })(10);  // 定義してすぐに呼び出したり

8.2.1 省略可能な引数

  • 関数を定義した時よりも少ない数の引数でその関数を呼び出した場合、省略された引数には undefined が設定される。
  • この特徴を利用して、省略可能な引数を持つ関数を定義できる。
  • ただしその際には、関数内で引数が省略された場合にデフォルト値が設定されるように処理する必要がある。
  • また、省略可能な引数は引数リストの最後に記述する必要がある。

function f(o, a) {  // a は省略可能とする
  a = a || [];  // a が省略されている場合は空の配列を生成
  for(var p in o) a.push(p);
  return a;
}

8.2.2 可変長の引数リスト(Arguments オブジェクト)

  • Arguments オブジェクトは配列のようなオブジェクトである。
  • 関数に渡された引数値は、関数定義値の引数に関わらず arguments[] 配列の要素に格納される。
  • function f(x, y, z) {
    	return arguments.length;
    }
    f(1, 2, 3);  // 3
    f(1);  // 1
    f(1, 2, 3, 4, 5);  // 5。関数定義時の引数の個数に関わらず、任意の数の引数値を渡せる。
    
    function max() {  // 引数を定義しない
      var m = Number.NEGATIVE_INFINITY;
      for(var i = 0; i < arguments.length; i++) {
      	if(arguments[i] > m) m = arguments[i];
      }
      return m;
    }
    max(1, 10, 2, 3000, 400);

  • 関数の引数を格納するローカル変数と Arguments オブジェクトの配列の要素は同じ値を保持する。
  • function f(x) {
      alert(x);  // 渡された引数値を表示
      arguments[0] = null;
      alert(x);  // null
    }

8.2.2.1 callee プロパティ

  • Arguments オブジェクトの callee プロパティは、現在実行中の関数を参照する。
  • 再帰処理を行う関数などで使用される。

function f(x) {
  if(x < = 1) return 1;
  return x * arguments.callee(x - 1);
}
f(5);

8.2.4 引数の型

  • JavaScript は弱い型付き言語で、関数定義時に引数の型を宣言することはできないので、型を限定する場合は関数内で型のチェックを行う必要がある。

8.4 メソッドとしての関数

  • 関数がメソッドとして呼び出された場合、this キーワードは呼び出されたオブジェクトを参照する。
  • 関数がメソッドではなく関数として呼び出された場合、this キーワードはグローバルオブジェクトを参照する。

var f = function() { return this; };
f();  // 関数として呼び出し。Window オブジェクトが返る。

var o = { f: function() { return this; }};
o.f();  // メソッドとして呼び出し。o オブジェクトが返る。

var a = [];
var o = {
  f: function() {
    function g() { a.push(this); }
    g();
    a.push(this);
  }
}
o.f();
alert(a[0]);  // メソッドとして呼び出された関数内の入れ子関数として呼び出し。Window オブジェクトが表示される。
alert(a[1]);  // メソッドとして呼び出し。o オブジェクトが表示される。

8.6 関数のプロパティとメソッド

  • 関数は、実際には特殊なオブジェクトであるため、プロパティやメソッドを持つ。

8.6.1 length プロパティ

  • Function オブジェクトの length プロパティには引数リストで宣言された引数の個数が設定される。
  • arguments.length プロパティと異なり、関数の外でも使用できる。

// 宣言時の引数の個数と呼び出し時の引数の個数が一致していれば true を返す
// arguments.callee.length は check.length でも可
function check(a) {
  return (arguments.length == arguments.callee.length);
}
check(1);  // true
check(1, 2);  // false
check();  // false

8.6.3 自分専用の関数プロパティの定義

  • Function オブジェクトのプロパティであれば関数の実行を終了した後も値を保持し、次に関数が呼び出された時に使うことができる。

uniqueInteger.counter = 0;
function uniqueInteger() {
  return uniqueInteger++;
}
uniqueInteger();  // 0
uniqueInteger();  // 1

8.6.4 apply() メソッドと call() メソッド

  • あるオブジェクトのメソッドであるかのように関数を呼び出すことができる。
  • 最初の引数に呼び出す関数の対象となるオブジェクトを指定する。
  • call() メソッドの 2 番目以降の引数は、これから呼び出される関数に引数として渡される。
  • apply() メソッドの場合は、第 2 引数に関数に渡す引数を配列形式で指定する。

var f = function(a, b) { alert(a * b); return this; };
f(1, 2);  // Window オブジェクトが返る
var o = {};
f.call(o, 1, 2);  // o オブジェクトが返る。メソッドとして実行されている。
f.apply(o, [1, 2]);  //       〃

8.8.1 静的なスコープ

  • JavaScript 関数のスコープは、実行時のスコープではなく定義時のスコープという意味で、静的である。
  • 関数が定義されると、定義された関数の内部状態に、現在のスコープチェーンが保存される。
  • 関数を入れ子で定義する場合は、スコープチェーンには入れ子関数の外側の関数が含まれる。

8.8.2 Call オブジェクト

  • JavaScript インタプリタは関数が呼び出されると、関数のスコープにまず関数定義時のスコープチェーンを設定し、次に Call オブジェクトをスコープチェーンの先頭に追加する。
  • arguments やローカル変数、仮引数は Call オブジェクトのプロパティになる。

8.8.3 名前空間としての Call オブジェクト

  • Call オブジェクトを一時的な名前空間として使えば、グローバルな名前空間での変数名やプロパティ名の衝突を避けることができる。

8.9 Function() コンストラクタ

  • Function() コンストラクタを使うと、JavaScript のコードを実行時に動的に生成してコンパイルできる。
  • Function() コンストラクタを使うたびに、関数の本体が解釈され新しい関数オブジェクトが生成される。
  • そのため、頻繁に呼び出される関数やループで使用すると、効率が悪くなる。

function f(x, y) { return x * y; }
var f = new Function("x", "y", "return x * y;");  // 上記関数文を Function() コンストラクタを使用した形で記述

JavaScript 第 5 版 7 章まとめ

今回はボリューム多め。
この章で、今まであまり馴染みがなかった Object クラスのメソッドと、しっかり把握できていなかった配列のメソッドを抑えられたと思います。

7 章 オブジェクトと配列

7.1 オブジェクトの生成

  • {}(オブジェクトリテラル)と new 演算子を使ってコンストラクタ関数を呼び出して生成する方法がある。
  • {} と new Object() は同じ意味となる。
  • {} の中に、プロパティ名と値のペアをカンマ区切りで記述する。
  • プロパティ名には識別子または文字列が使用できる。

var obj1 = {};
var obj2 = new Array();  // Array オブジェクトを生成する
var obj3 = {
  "name": "hoge",
  'value': 1,
  obj: {x: 0, y: 0}
};

7.2 オブジェクトのプロパティ

  • var の宣言は不要で、オブジェクトのプロパティに値を代入することでプロパティを生成できる。

7.2.1 オブジェクトプロパティの調査

  • for/in ループでユーザ定義のプロパティを調べられる。

var obj = {
  name: "hoge",
  value: 1
};
var s = "";
for(var o in obj) {
  s += o + " : " + obj[o] + "¥n";
}
alert(s);

7.2.2 プロパティの存在確認

  • in 演算子を使ってプロパティが存在するかどうかを調べられる。
  • var o = {x: 0};
    if("x" in o) o.x = 1;
    alert(o.x);  // 1

  • in 演算子を使わなくても実現できる。ただし o.x = undefined (プロパティ自体は存在していて値が未定義値)の場合は正しい結果にならないので注意する。
  • var o = {x: 0};
    if(o.x !== undefined) o.x = 1;
    alert(o.x);

  • undefined でも null でもない場合は以下の記述で実現できる。
  • var o = {x: 0};
    if(o.x) alert("hoge");

7.2.3 プロパティの削除

  • delete 演算子で削除できる。
  • undefined が設定されるのではなくプロパティが削除されるので、for/in ループでも調べられなくなる。

var o = {x: 0, y: 0};
delete o.x;
var s = "";
for(var i in o) {
  s += i + "¥n";
}
alert(s);  // y¥n

7.3 連想配列としてのオブジェクト

  • オブジェクトのプロパティにアクセスするには、ドット演算子の他に “[]“(配列演算子)を使ってアクセスできる(連想配列とも呼ばれる)。
  • 配列演算子を使用した場合、実行中に生成することができる。

var addr = "";
for(var i = 0; i < 4; i++) {
  addr += customer["address" + i] + "¥n";  // customer オブジェクトの address0 〜 3 プロパティの値を読み出せる
}

7.4 Object のプロパティとメソッド

  • 全てのオブジェクト(Array() や Date() も含めて)は Object クラスのプロパティやメソッドを継承する。

7.4.1 constructor プロパティ

  • オブジェクトの初期化で使用されたコンストラクタ関数を参照する。
  • instanceof 演算子で constructor プロパティの値を調べられる。
  • ※Safari(というか Webkit)ではバグがあるらしく、false になりました。

var d = new Date();
alert(d.constructor == Date);  // true
alert(d instanceof Date);  // true

7.4.2 toString() メソッド

  • 呼び出したオブジェクトの値を表す文字列を返す。

7.4.3 toLocaleString() メソッド

  • オブジェクトを表すローカライズされた文字列を返す。

7.4.4 valueOf() メソッド

  • オブジェクトを文字列以外の基本型(数値型が多い)に変換する。

7.4.5 hasOwnProperty() メソッド

  • 継承したものではないプロパティを持つ場合に true を返す。

7.4.6 propertyIsEnumerable() メソッド

  • 継承したものではないプロパティを持ち、かつそのプロパティが for/in ループで調べられる場合に true を返す。
  • hasOwnProperty() メソッドと同じ値を返す。

Continue reading

 Page 4 of 12  « First  ... « 2  3  4  5  6 » ...  Last » 

Home

Search
Feeds
Meta
あわせて読みたい
あわせて読みたいブログパーツ
Others...
フィードメーター - sukechan.net
track feed

Return to page top