2014年1月8日水曜日

Chromeの拡張機能を試してみた.3

そろそろそれっぽいものを作り始められるかな…
とか思ってたら年開けちゃったよ…(・ω・`)

Chromeの拡張機能を試してみた.3

現在の機能: アイコン押したら背景赤くなるよ!
そんだけ。
やりたいのは、「開いてるページ中の要素について調べたい」なので、これじゃ一方的に操作しに行っているだけで意味がない。
そこで、 ContentScriptなるものをページに派遣して、そいつにページの調査をさせ、その結果を拡張が受け取る、とすればいいらしい。

1. ページにスクリプトを派遣する

ContentScriptなるまんまなScriptを派遣する。但しこいつはページ自身に入り込めるわけではなく、Chrome拡張の用意する「隔離空間(Isolated World)」にて実行される。これによりDOMにアクセスはできるが、そのページの他のスクリプトに干渉したりはできない。当たり前か。逆にページのスクリプトがこちらの動きを阻害することも無いらしい。
宣言はmanifest.json
"content_scripts": [  // 表示ページ中に埋め込むなんちゃらの宣言
     {
  "matches": [   // 埋め込むページのマッチ 必須
   "http://*/*",
   "https://*/*"
   ],
  //"css": ["css/mycontentstyles.css"], // 埋め込むcss 任意
  "js": [        //埋め込むjs 任意
   "js/jquery-1.8.2.min.js",
   "js/mycontentscript.js"
   ]
     }
   ],
この項目を追加してやる。階層はpermissionsなんかの兄弟になる位置。jsのほかcssも埋め込めるらしい。どうなっちゃうのやら...
今回はおまけでjqueryも持っていく。無いといろいろめんどいし...

mycontentscript.js(終わったら名前変えよう('A`))には、とりあえず
console.log("I'm here!")
ログ出すだけ。

全部終わったらいつも通りリロードしてから新しくタブでも開いてみる。するとコンソールに先ほどのアホなログが書き込まれているはず。

2. ContentScriptと対話する

埋め込んでログ吐くだけじゃ意味ないわけで。派遣したスクリプトから報告を受けないと派遣した意味がない。対話方法としてまずメッセージングをやってみる。

メッセージングは、簡単に言えば
拡張「ちょいこれやって結果持ってきて(;´Д`) 」
埋め込み「おkわかった。これやな⊂(・ω・`)」
拡張「おk受け取った。あとはこっちでやるわ(;´ω`)」
的な通信。何かを起点にメッセージのやり取りを行うシンプルなもの。

まずはブラウザアクションのデフォルトポップアップにpopup.htmlを用意、適当にmyscript.jsなんてスクリプトを埋め込む。
"browser_action": {  // ツールバー右上に表示するのに必要な設定. Chrome4からのAPIで、それ以前のものでは使えない。
     "default_title": "titil test", // 説明. 右上にアイコンを出す場合はホバーするとみられる
     "default_popup": "htmls/popup.html" // 右上に表示されたアイコンを押した際に出るhtmlの指定. 
},

…もうやったのがだいぶ前すぎて忘れてたヨヽ('A`)ノ
適当にpopup.htmlにボタンなりなんなり置いたら、myscript.jsにてclickイベントを乗っける。ちなみにボタンに属性として onclick="" なんて乗っけるとエラー吐かれることがある。ワケワカラン( ゚д゚ )
$("#myBtn").click(function(){
 chrome.tabs.getSelected(
  null,
  function(tab) {
     chrome.tabs.sendRequest(
      tab.id,
       {
        greeting: "hello"
       },
       function(response) {
        console.log("send from myscript " + response.farewell);
      }
     );
  }
 );
});

参考まんま、だがそれがいい。
sendRequestに必要な情報を載せて送り出す。コールバックにレスポンスが返ってきたときの処理を載せる。
3行目のnullはどのタブを操作するかを考えずに、「今開いてるタブに操作する」ためのnull。idを入れれば指定したタブにのみ操作できるが…やるのかな?('A`)
これ一つで、

拡張「ちょいこれやって結果持ってきて(;´Д`) 」
埋め込み「おkわかった。これやな⊂(・ω・`)」
拡張「おk受け取った。あとはこっちでやるわ(;´ω`)」

の赤字の部分が出来上がる。シンプルにリクエストを送り、返ってきたレスポンスで何かをやる、というもの。ちなみにresponseが無いのに response.farewellとか参照しようとするとエラーを吐くっぽい。nullチェックとか必要か?

今度は受け取り側。

chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {
    console.log(sender.tab ?
                "from a content script:" + sender.tab.url :
                "from the extension");
    if (request.greeting == "hello")
      sendResponse({farewell: "goodbye"});
    else
      sendResponse({}); // snub them.
  }
);

こちらも参考ま(ry
リクエストをもらったら処理を行い、sendResponseでお返事する。

sendResponseは無くてもいけてしまうが、無いと送信側がいつまでも返信を待って
(;´Д`)マダー?
待ちぼうけを食らうことになる。これはメモリ的によろしくないので、空のsendResponseだけでも返してやるのがよろしいらしい。

先ほど出た response.farewell は、この7行目で送り返されたもの。こんな感じでやり取りができる。

なので、これらを仕込んでから実際にボタンを押すと、コンソールには


send from myscript goodbye
…うわ すっごいfrom間違ってるorz


  参考

3. 何が送れるの?

そうすると気になるのはいったい何がメッセージとして送れるのか。
試しに2. で作った送信側に testなるキーを設定("greeting"のままなのは内緒。)
chrome.tabs.getSelected(
 null,
 function(tab) {
    chrome.tabs.sendRequest(
     tab.id,
      {
       greeting: "test"
      },
      function(response) {
       console.log("num is " + response.num);
       console.log("string is " + response.string);
       console.log("array is " + response.array);
       console.log("map is " + response.map);
     }
    );
 }
);
中身を置き換えた感じ。戻ってくるレスポンスにはとりあえず、int、string、配列、マップで実験。

返信側もいじくる
} else if (request.greeting == "test"){

   var n = 1;
   var s = "test";
   var a = [12,13,14];
   var m = {x: 100, y: "map y"};

  console.log("num is " + n);
  console.log("string is " + s);
  console.log("array is " + a);
  console.log("map is " + m);

   sendResponse(
    {num: n},
    {string: s},
    {array: a},
    {map: m}
   );

とりあえずいろいろ載せてみた。この状態だとどうなるか。
まずは返信側のページのコンソール
num is 1
string is test
array is 12,13,14
map is [object Object]
さすがにmapはそのまま出ないがきちんと出荷されてそう。では送信側に返ってきたログは…
num is 1
string is undefined
array is undefined
map is undefined
…あれ?
2. とかでstringは貰ってるし、実は書いてないけどmapとかも実験できてたはz…
まさかと思い返信側を以下に訂正
} else if (request.greeting == "test"){

   var n = 1;
   var s = "test";
   var a = [12,13,14];
   var m = {x: 100, y: "map y"};

  console.log("num is " + n);
  console.log("string is " + s);
  console.log("array is " + a);
  console.log("map is " + m);

   sendResponse(
    {string: s},
    {num: n},    
    {array: a},
    {map: m}
   );
stringを先頭に返すように変更してみる。すると…

num is undefined
string is test
array is undefined
map is undefined
マジですか Σ(・д・)

というわけで先頭の一個しか読んでくれないらしい。エラー吐いてくれよ…('A`)





ただ、mapはいけるので複数のデータ返したいときはmapで返すか、複数回リクエストするのがいいのかね('A`)


2013年12月23日月曜日

Chromeの拡張機能試してみた. 2

ただGoogleトップに飛ぶだけでは面白くないので…


Chromeの拡張機能試してみた. 2


今回はできることいろいろ見てみる回

0. 前回のmanifest.json

{
 "manifest_version": 2, // マニフェストのバージョン. 2にしないと怒られる
 "name": "my extention", // name. 表示される名前でもある
 "version": "1.0",  // アプリversion. 更新があったらあげていく.
 "description": "my first extention", // 説明.
 "icons": {    // iconの設定. サイズごとに設定できる
  "16": "icons/icon.png",
  "48": "icons/icon.png"
 }, 

 "browser_action": {  // ツールバー右上に表示するのに必要な設定. Chrome4からのAPIで、それ以前のものでは使えない。
 "default_icon": "icons/icon.png", //表示するアイコン
     "default_title": "titil test", // 説明. 右上にアイコンを出す場合はホバーするとみられる
     "default_popup": "htmls/popup.html" // 右上に表示されたアイコンを押した際に出るhtmlの指定. 

}
こんな感じ

1. バッジテキスト


右上アイコンにこんなことできます


1-1. 準備

まずはmanifestの準備
"background": {   // 裏で動く機能について書く場所
 "scripts": ["js/background.js"]
}

これをmanifestに追加。","に注意。 backgroundは表に見えない処理を書く場所。そこにscriptを宣言しておく。
ついでに該当ファイルを用意。

1-2. script実装


そして登場するのが
chrome.browserAction
クラス?

参考

要するに browser_actionに対していろいろできるメソッドを持つ。

今回はこんなのをチョイス
// バッジの文字を指定.日本語は不可. 4文字まで
chrome.browserAction.setBadgeText({text:"TEST"});

// バッジの色を指定. RGBA
chrome.browserAction.setBadgeBackgroundColor({color:[125,230,200,255]});

// clickイベント. browser_action.default_popupがあると負けるので注意
chrome.browserAction.onClicked.addListener(
 function(tab){
  alert("test alert");
 }
);

この3つ。概要はコメントで記載の通り。 特にclickイベントはbrowser_action.default_popupがあると宣言順などに関わらず負けるっぽい。使う場合は要注意。

これをbackground.jsに記載して リロード 。

すると


クリックも合わせてこんな感じ。


2. 今開いているページへの操作

そろそろ面白くなってまいりました
前準備として、1.の実行のために browser_actionのdefault_popupを外していた場合、元に戻しておくこと。

2-1. permissionの設定

いくら拡張とはいえ、あんまりポンポンいじれてしまうのは問題。なので必要な権限だけ付与してやる必要がある。

manifest.jsonで以下を宣言する。
 "permissions": [ // 権限付与の設定
  "tabs", "http://*/*"
 ]

権限に関わるものを宣言する場所。","区切りで並べていく。
内容としては、
tabs : タブに関する操作(移動、作成等)
http://*/* : 自分以外のリソースを使う宣言. この場合は、「httpスキーマである全てのドメイン、パスのものを使う」になるかと。httpsの何かを使うなら、新たに同様な宣言が必要。「現在開いているページ」の情報にアクセスしたいなら必要。基本この2つはセットになるのかねヽ('A`)ノ

2-2. scriptの準備

popup.html(アイコンを押したら出てくる領域)lがインターフェースになるため、まずは操作用のボタンを仕込む
今回はお手本通り、「いま開いているページの背景色を操作」する
<div id="red">to Red</div>
<script src="../js/colorscript.js"></script>
なんの変哲もないdiv。これにclickイベントを載せるscriptを続けて宣言してやる。もちろん中に書いてもいいけど…分けたいね(・д・`)

colorscript.jsを作成する。プロジェクトフォルダ内なら場所に制限は特にない。
function changeColor(color){
 chrome.tabs.executeScript(null,{
  "code" : "document.body.style.backgroundColor='" + color + "'"
 });
}

document.getElementById('red').onclick = function(){
 changeColor('red');
}

ポイントは1. 同様に用意されている、chrome.tabsクラス? タブ操作にまつわるメソッドがいっぱいなのは名前から明らか。
今回は指定したscriptをタブ内で実行する、executeScriptを使用。 実行する内容自体は至極単純で、背景色に引数の色を指定してね、というだけの内容。
これを、#redクリック時に発動するようイベントを乗っけてやるだけ。

全部終わったらまた拡張機能タブからリロード。


3. 実際にやってみる

3-1. 実行

適当なページを開いたら、右上のアイコンをクリック。まずはポップアップ出てますか?
ポップアップが出たら今度は to Redをクリック。するとbodyに background-colorが設定されているはず。
ちなみにポップアップのところで右クリック→要素を検証 すると、ポップアップ部分のデベロッパーツールが開いてくれる。scriptのエラーなんかのチェックに使えるのでぜひ多用するべし。

3-2. 一工夫

実際に色が変わったらここで一工夫。わざわざ開く→押す なんてめんどくさい手間をかけずにアイコンクリックで何とかしたい場合。
1.でいじった background の部分を利用する。

まずmanifest.jsonのbrowser_actionから、default_popupの項を削除。これでポップアップは開かないはず。
さらに backgeoundを1.の状態に再現、動作を確認する。
大丈夫そうなら、background.jsのchrome.browserAction.onClicked.addListener()を用いる。1-2.で既に入れている場合、現在alertが入っている部分に、changeColorメソッドの中身をまるっとブチ込む。
chrome.browserAction.onClicked.addListener(
function(){
 chrome.tabs.executeScript(null,{
  "code" : "document.body.style.backgroundColor='red'"
 });
);

とかなるかと。
これでリロードし、アイコンをクリックすると、同じように赤い背景になるはず。目に優しくない(⊃д⊂ )


ここまでのフォルダ構成

ChromeExt━ ┳━manifest.json
                   ┃
                   ┣━js┳━background.js
                   ┃     ┗━colorscipt.js
                   ┃
                   ┣━htmls━popup.html
                   ┃
                   ┗━icons━icon.png







こんな感じ?ヽ('A`)ノ


参考: ドットインストール

2013年12月9日月曜日

Chromeの拡張機能試してみた

ずっとやろうやろう思ってできていなかったので


Chrome拡張の自作

まぁ別に「こんな機能が作りたい!」なんてのはないので、ベースになる部分ができたらまずは満足。

0. 必要なもの

GoogleChrome
Javascritpの知識
htmlの知識?
なんか適当にエディタ

1. フォルダ準備

まずはプロジェクトフォルダの作成。場所は自由。めんどいのでデスクトップに作るズボラっぷり。
フォルダ名も特に制約っぽい制約もない?別にどこかに表示されるでもなし。
たぶんパッケージ名になるのだろうと予想。

2. ファイル作成

1で作ったフォルダの中でいろいろファイルを作る。まずはmanifest.json。これが無いと始まらない。
その名の通りjson形式での記入。うだうだコードを書かなくていいのは素晴らしいとおもう(小並感)

必要なファイルごとに追ってみる。

2-1. manifest.json

必須ファイル。先述の通りjsonで書く設定ファイル。アイコンの指定や使うファイル等はこいつが持ってる。

簡単にコード-A

{
 "manifest_version": 2, // マニフェストのバージョン. 2にしないと怒られる
 "name": "my extention", // name. 表示される名前でもある
 "version": "1.0", // アプリversion. 更新があったらあげていく.
 "description": "my first extention", // 説明文.
 "icons": {    // iconの設定. サイズごとに設定できる
  "16": "icons/icon.png",
  "48": "icons/icon.png"
 }, 
 // コード-Bに続く
}

まずは基本の宣言。 manifest_versionは拡張機能作成全体に言えることみたいなので、とりあえず2に。
ほかは表示の問題。コード的にはエラーを起こしたりはしないが、nameに関しては必須事項らしい。

簡単にコード-B

{
  // コード-Aから
 "browser_action": {
  // ツールバー右上に表示するのに必要な設定. Chrome4からのAPIで、それ以前のものでは使えない。
  "default_icon": "icons/icon.png", //表示するアイコン
  "default_title": "titil test",  // 説明. 右上にアイコンを出す場合はホバーすると見られる
  "default_popup": "htmls/popup.html" // 右上に表示されたアイコンを押した際に出るhtmlの指定. 
 }
}

この辺りから実用的な設定。拡張を有効にすると出てくる右上アイコンの設定についてのお話。
iconとtitleはともかく、問題はpopup。アイコンクリック時に出るアレはここの中で作る。

manifest.jsonについてはひとまずはこの辺。

2-2. html

簡単にコード-B 中に出てきたhtmlを作成。
<!DOCTYPE html>
<html lang="ja">
 <head>
  <meta charset="utf-8">
 </head>
 <body>
  <div class="main_contents">
   <span>Hello, World! <a href="http://www.google.co.jp" target="_blank">Google検索</a></span>
  </div>
 </body>
</html>

ただHello, World!と Google検索 というリンクが並んでいるだけのページ。 拡張で使うのにGoogleへのリンクなのはキニシナイ
とりあえずはシンプルにこれだけ。これをmanifest.jsonのパスに合うように、1で作ったフォルダ内に配置する。

ChromeExt(1のフォルダ)━ ┳━manifest.json
                                      ┃
                                      ┣━htmls━popup.html
                                      ┃
                                      ┗━icons━icon.png

現在こんな感じなはず。

3. 登録

準備ができたらいよいよ配置してみる。機能はとりあえず二の次。

まずは設定を開く。メニューから開くのが楽かと。
設定タブが新たに出てきたら、今度は左側の「拡張機能」を選択。
デベロッパーモードのチェックボックスにチェックを入れたら、
「パッケージ化されていない拡張機能を読み込む」を選択、ディレクトリが選択できるので、 1で作成したディレクトリを選択すると、拡張機能の一覧に追加されて



こうなるはず。icon設定していないのがバレバレである。なんか見えちゃいけないものがちらほらあるので塗りつぶし。ヽ('A`)ノ 
エラーなんかはここに出てくる。修正したら下の リロード を押せばOK。簡単。
ここに登録できたら、右上に注目。ちゃんと「有効」になっていれば設定したアイコンがいるかと。


押せばこうなるはず。 もちろんGoogle検索 を押せばGoogleトップへ。


今回はこんなところで。∩( ・ω・)∩




参考: ドットインストール

2013年11月26日火曜日

スマートフォン上での inputタグとキーボードの関係

よくある疑問
スマホで入力フォームタップしたときに立ち上がるキーボードって制御できないの?

結論としては制御はできません。但し、type属性に対応した初期キーボードの設定はOS側?でされているので、そちらでひっかけることはできるっぽい。

スマートフォン上での inputタグとキーボードの関係

正確には文字列を打ち込むタイプのinput
具体的には

input type="text"
input type="search"
input type="number"
input type="tel"
input type="email"
input type="password"
input type="url"


だいたいこんな感じ。他にもdatetimeなどもあるけど、端末やOSによってはテキストでない入力方法もあったりするので却下。

さてこの状態で、実際にスマートフォンからタップしてもらえるとわかるが、
各inputタップ後最初に起動するのは、

text        → デフォルト
search     → デフォルト
number    → 数字入力
tel          → 電話番号入力
email       → 英字
password → 英字
url          → デフォルト

となるかと。 要するに、だいたいデフォルトなわけで。(「デフォルト」 はデフォルトに設定されているキーボードタイプ)
きちんと入力させたいものに合わせてtypeを設定してやると、ユーザー的にはキーボード切り替えの手間は省ける。

ただし落とし穴があり、上記で 「デフォルト」 としたものは、タップしたとき必ずデフォルト設定キーボードが登場するわけではない。
たとえば上記であれば、

① type="text" のinputをタップし、数字キーボードに切り替えた後、
② type="search"をタップしてみる。

するとデフォルトが数字キーボードでもない限りデフォルトキーボードが出てくるはずなのだが…

答えは 「数字キーボードが居座り続ける」

そもそもキーボードの入れ替え自体が発生しない。

ただし、今度は
① type="text" のinputをタップし、数字キーボードに切り替えた後、
② type="email"をタップ、さらに数字キーボードに切り替えておく
③ またtype="text" のinputのうち、どれかをタップすると…

答えは 「デフォルトキーボードが立ち上がる」

自由すぎる…orz

また、 「数字だけを入力させたいんだ!」 ってところには type="tel"をわざと仕込んでやる、なんて手法もあるが、そのあたりでバグが一つ。

iOS5において、type="number"の 仕様 として、

① 「0930」など、"0"から始まる数字は、 valueにおいても0をないものと扱い、 例ならば「930」と認識する
② 3ケタごとに、「123,456,789」のように、","を入れて表示する。但しこちらは表示だけで、valueに影響は与えない。

という仕様がある。そのため、「電話番号入力」や「パスコード入力」のように、先頭の0を認めるものに対して type="number"を使うと正しく値が取れなくなる。




なお、iOS6からは治っている模様。 不評だったんだね…(・ω・`)

2013年10月31日木曜日

cssの強さ

ふと気になったのでまとめてみる

css強さ選手権

1. そもそも強さって?

基本的にhtmlやjavascript等は, 後に書いたものが優先されて反映される. cssも同様なのだが, たとえば

<div class="test_1" id="mytest_1">
    テスト1
</div>
<style>
    #mytest_1{color: red;}
    .test_1{color: blue;}
</style>

このように書いたとき, どちらも同じdivを指すため, 基本にのっとれば文字は, あとに指定した通り青くなるはず
しかし,

テスト1

赤くなる( ゚д゚ )

これが, 強さによってcssが上書きされる現象である.

2. 強さの順位

では順位はどうなっているのか

順位名前例
1位直書き<div style="width: 100%"></div>
2位id#id
3位class.class
3位属性セレクタimg[alt]
3位疑似クラスli:first-child
6位要素名body
7位全選択*

だいたいこんな感じ
但し単体での強さでの話
組み合わせることで
<div class="test_2" id="mytest_2">
    テスト2
</div>
<style>
    div.test_2{color: red;}
    .test_2{color: blue;}
</style>

テスト2

あとに書いたはずの青ではなく, 先に書いた赤になる. これは, それぞれの指定が
赤 → 要素名(6位) + クラス名(3位)
青 → クラス名(3位)
となっており、より多く条件を付けた方が強く反映されるのである.

ちなみに強さを重ねて同列だった場合は…?

<div class="test_3 test_4" id="mytest_3">
    テスト3
</div>
<br />
<style>
    .test_3.test_4{color: red;}
    .test_3[id]{color: blue;}
</style>
テスト3

赤 → クラス名(3位) + クラス名(3位)
青 → クラス名(3位) + 属性セレクタ(3位)
とした実験。結果は下に書いた青の勝利


最後の実験。classを重ねたらidに勝てるのか?

<div class="test_4 test_5 test_6 test_7 test_8 test_9 test_10" id="mytest_4">
    テスト4
</div>
<style>
    #mytest_4{color: red;}
    .test_4{color: blue;}
    .test_4.test_5{color: blue;}
    .test_4.test_5.test_6{color: blue;}
    .test_4.test_5.test_6.test_7{color: blue;}
    .test_4.test_5.test_6.test_7.test_8{color: blue;}
    .test_4.test_5.test_6.test_7.test_8.test_9{color: blue;}
    .test_4.test_5.test_6.test_7.test_8.test_9.test_10{color: blue;}
    .test_4.test_5.test_6.test_7.test_8.test_9.test_10[id]{color: blue;}
</style>
結果は…



テスト4


…うん(・ω・`)
まず一番強いやつがさらっていくんだね…


3. おまけ

それでも上の奴に勝ちたい、そんなcssに最終兵器。

<div class="test_11" id="mytest_5">
    テスト5
</div>
<style>
    #mytest_5{color: red;}
    .test_11{color: green!important}
</style>
idとclassの一騎打ち。但しclassには
!important
が設定されている。これが切り札。
テスト5
と、クラスによる指定にも関わらず緑になっている。後に設定したimportantのおかげだけど、あくまで最終手段。これは、

<div class="test_12" id="mytest_6">
    テスト6
</div>
<style>
    #mytest_6{color: red;!important}
    .test_12{color: green!important}
</style>
テスト6
からわかる通り、強さの順位どうこうをなくし、単純に書かれた順に上書きになっていく模様。

ちなみに
<div class="test_13" id="mytest_7">
    テスト7外
<div class="test_14" id="mytest_8">
    テスト7
</div>
</div>
<style>
    #mytest_7{color: red;!important}
    .test_14{color: green}
</style>

テスト7外
テスト7
さすがに親の影響より、直接指定されたものが優先されるみたい。


css等はこの場で実験もできるから面白い+(・ω・0)*

2013年9月26日木曜日

302を飛ばさない「リダイレクト」

なんか引っかかったのでメモメモφ(・ω・ )

302を飛ばさないでリダイレクトみたいな動きをするタグ


とあるページの通信を調べていたところ, 明らかにリダイレクトじみた動きをしているのに ステータスコード302が見当たらないと調べていたところ, 何やら変なタグを発見

<head>
<meta http-equiv="Refresh" content="0; URL=urlstring">
</head>
ヘッダにこんなのがいる真っ白なページを挟んでました
http-equiv="Refresh" は httpヘッダに refresh属性を仕込む宣言. もう一つの属性 contentと合わせて用いる. 内容はページのリフレッシュを行うことの宣言. なのでこれを仕込んでおくと自動でページを再読み込みしてくれる.
参考

content="0; URL=urlstring" が, リフレッシュまでの時間と, リフレッシュ後のURLの設定. 時間の単位は秒. この urlstringにリダイレクト先のURLを設定することで, 設定秒後に設定したURLにジャンプしてくれる.

移転したサイトの元サイトなんかに、メッセージとkのタグを仕込んでおくと, ユーザーを自動で移転先のページに運ぶ, なんてのが一般的な使い方らしい.





ちょっと予想外だったのでびっくりした(・ω・`)

2013年8月19日月曜日

Sublime Text2使ってみた -前篇-

さすがにメモ帳レベルのテキストエディタでHTMLを書くのは限界なので…('A`)

Sublime Text2使ってみた

1. インストール

まずはここからバージョン, bitに合わせてダウンロードからインストール. 特にインストール項目を設定することもないかも.
Sublime Text2は, 初期状態のままではほぼ空っぽな状態. なので自分でカスタムしてやる必要がある.
ちなみに 3もベータ版だけど出ている模様.

2. 準備

A. Packageのインストール準備
様々カスタムしていく準備を行う. Packageとは要するにプラグイン. 
まずは View→Show Console でコンソールを開く. 出てきたウィンドウのうち, 上が表示エリア, 下が入力エリア. 間違って表示エリアに入力しようとして, 「入力できない(・д・`)」とかググらないように. 自分だけか…('A`)

コンソールには以下をコピペ.
import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp) if not os.path.exists(ipp) else None;open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())
実行すると Packageをインストールするためのプラグイン「Package Control」をインポートする. 終わったら再起動. たまにこいつが突然消えることがある. よくわからないヽ('A`)ノ

B. 日本語化
有志の方が用意してくれたファイルを使って, 一部ではあるが日本語化ができる.
詳しくはこちら

C. ユーザ設定
Preference → Setting - Userを選択し, 出てくる設定ファイルにJSON形式で入力していく. フォントサイズや行間距離, 空白の表示方法等色々設定できる.
設定内容は以下のようなものが…
キー値バリュータイプデフォルト値内容
font_sizenumber11そのままの通り, 表示するフォントサイズの意. デフォルトは(おそらく)11
line_numbersbooleantrue左側の行番号の表示/非表示の切り替え.
gutterbooleantrue左側の行番号を表示している部分(ガーターと呼ぶらしい)自体の表示/非表示. ↑をfalseにするならこっちごとfalseにしてしまった方がいいかも?
marginnumber?ガーターとテキスト部の間の距離の指定. 負の値も設定可能.
fold_buttonsbooleantrue関数などの塊を"折りたたむ"機能のON/OFF. OFFにするとその分ガーターも狭まる.
fade_fold_buttonsbooleantrue↑の折りたたみ機能を 常時表示/カーソルを当てたときに表示 を切り替える. わかりにくい!って人はfalseにすると常に出ている.
rulersnumber[]縦にガーターの横に出ているようなラインを引く機能. 20と設定すれば, 半角で20文字入力した位置に, 縦にラインが引かれる. インデント揃える時などに? ","区切りで複数指定することも可能.
tab_sizenumber4Tabキーを1回押したときに表示されるスペースの量の設定. 10に設定すれば, Tabキー1回で半角スペース10個分進む. インデント幅にも影響する.
translate_tabs_to_spacesbooleanfalseTabキーを押した際に, Tab文字ではなくスペースを入力する. 削除しようとするとなぜか出力した分全てが削除される.
use_tab_stopsbooleantrue↑の"なぜか"の答え. こちらもfalseにしてやると, 削除する際スペース1個ずつ削除するようになる.
auto_match_enabledbooleantruetrueにしておくと, "("などを入力したとき, 自動で閉じる方も入力してくれる. 逆にこれが鬱陶しいなら falseで.
match_bracketsbooleantruetrueにしておくと, "("や")"にカーソルを合わせると, 対応するものに下線を引いてくれる.
…多いってばよorz
ちらっと上げようとしたのにキリが無いのでこのへんで.


ちょっと長くなってきたので続きは次で

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...