月別アーカイブ: 2014年7月

ruby

ruby 関数定義 メソッド引数「*」が空の時

下記の関数「foo3」について
foo3に、引数を一つ渡した場合、arrの形が知りたかったので、関数定義についてまとめました。
結果は、配列として帰ってきていました。

関数の作り方:基本

# 基本
def foo(name)
  puts name
end

# 初期値
def foo2(name = "momo")
  puts name
end

# 引数の数を不定
def foo3(a, *arr)
  print [a, arr]
end

# 引数の数を不定 ver2
def foo4(a, *arr, b)
  p a, arr, b
end


foo("hogehoge") # => hogehoge

foo2() # => momo
foo2("hogehoge") # => hogehoge

foo3(1) # => [1, []]
foo3(1, 2, 3, 4, 5) # => [1, [2, 3, 4, 5]]

# foo4(1) # エラー
foo4(1, 2, 3, 4, 5) # => [1, [2, 3, 4], 5]

関数の作り方:ハッシュ引数

# 引数にキーワード
def foo5(x: 0, y: 0, z: 0)
  print "x:", x,"  y:", y,"  z:", z
end

# 引数にキーワード(配列)
def foo6(x: 0, y: 0, z: 0)
  p x[1]
end

# 引数にキーワード(配列)
def foo7(x: 0, y: 0, z: 0, **arr)
  p [x, y, z, arr]
end


foo5(y: 2, x: 1, z: 3) # => x:1  y:2  z:3
foo5(y: 4) # => x:0  y:4  z:0

foo6(x: [5, 6]) # => 6

foo7(x: 2, v: 3, z: 4, w: 5) # => [2, 0, 4, {:v=>3, :w=>5}]

書籍 たのしいRuby 第4版

mysql_logo

mysqlについて、機能とかInnoDBとか文字コード等々

個人的にDBの中ではMySQLを使うことが多いです。しかしDB自体初めから組む機会は少ないので、良く調べてしまう事をメモします。

InnoDBとMyISAMはどっちを使う?

「とりあえずInnoDB」位の認識ですが、MySQL5.5からInnoDBがデフォルトになったみたいです。特別な理由がなければ、InnoDBで問題がないと思います

InnoDBを選び忘れて、MyISAMのままだったと言うことが無くなって、うれしいです。

InnoDBって?

・トランザクション処理ができる
・行ロック方式なのおすすめ(MyISAMはテーブルロック方式)
・チューニングは、innodb_buffer_pool_size, key_buffer_size
・バックアップしやすい

MySQL 5.6新機能

・マルチスレッド・スレーブ対応
・InnoDBで全文検索ができる
・InnoDBでNoSQLアクセスで、高速なキー・バリュー操作や、ビッグ・データ環境でのデータの高速取得が可能

その他詳細は MySQL Database 5.6の特長

文字コードは?

文字コードは「utf8mb4」
MySQLには、「utf8」と「utf8mb4」があります。MySQL 5.5.3以降ならば、utf8mb4を選択すればいいでしょう。

特徴
・utf8 → 4バイト文字列が入った場合文字化けする。
・utf8mb4 → UTF8で4バイト文字を扱える

接続照合順序

「general_ci」か、「unicode_ci」を選べばOKなようです。この2つは、文字列検索時に挙動が違います。それぞれの特徴です。

特徴
「general_ci」
・大文字小文字もマッチする。「A」で検索すると、「A,a」ともにマッチする。
・unicode_ciに比べて、文字検索が速い。

「unicode_ci」
・大文字小文字もマッチする。「A」で検索すると、「A,a」ともにマッチする。(general_ciと同じ)
・半角全角もマッチする。「A」で検索すると、「A,a,A,a」にマッチする。
・平仮名、カタカナ、濁音などもマッチする。「さ」で検索すると、「さ, ざ, サ, サ」などにもマッチする。
・general_ciに比べて、文字検索が遅い。

検索結果(select)で、無駄なマッチがない「general_ci」を選ぶ方が多いそうですが、「ドラえもん」を検索したとき、「どらえもん」 ,「ドラエモン」 ,「ドラエモン」 , 「どらエモン」にもヒットさせたいときは、「unicode_ci」を選ぶとOKです。
個人的には、「unicode_ci」をよく使います。

数値型属性のUNSIGNEDとZEROFILL

・UNSIGNED
 負の数は使えなくなるが、正の数は2倍の範囲まで使える。
 浮動小数点型(float, double)型は負の値が無くなるのみ

・ZEROFILL
 ZEROFILLを付けた場合、自動的にUNSIGNE属性になる。
 指定した桁数になるまで、0が埋まる
 例)int(4) UNSIGNED ZEROFILL で、数値12を入れると、0012になる。

データ型

データ型は様々あります。個人的に、おおむね選ぶときの基準です

数値 :int型
文字列:100文字以内なら、char(100)型、超えるなら、txet型
小数点:decimal(M,D) M:桁数,D:小数点
日時 :datetime (timestampは、2038-01-19 03:14:07秒まで)
データ型については、別記しています。

クエリの基本

SELECT * FROM table_name WHERE 条件;

DELETE FROM table_name WHERE 条件;

INSERT INTO table_name ( key1, key2, …) VALUES ( value1, value2, …);

UPDATE table_name SET key1 = value1 [, key2 = value2, …] WHERE 条件;

mysqlのcollateを使って大文字-小文字や全角-半角を無視した検索 – end0tknrのkipple – web写経開発

MySQL5.5、utf8mb4 の使用について – PHPプロ!Q&A掲示板

運用視点なMyISAMとInnoDBと。 | LexTech

MySQL :: MySQL Database 5.6

google_chrome-410x230

chromeで、Content-Type の調べ方

『Content-Type』を調べたい事がありましたので、調べ方をメモしておきます。

chromeで、Content-Type の調べ方

Content-Type について

その前に、『Content-Type』について復習です。

たとえば、インターネットでファイルのダウンロードを行う時等、ファイルに拡張子がなかったり、拡張子からファイルの種類が分からない場合がある。
その場合、「これから返すファイルの種類」をContent-Typeによって示すことで、ファイルの種類を受け取る側が知ることができる。またその種類に応じて、Webブラウザがそのまま表示したり、ファイルとして保存したり、他のアプリケーションを起動してそれを用いて出力したり、と処理を変更する。

Content-Typeとは : JavaA2Z

簡単に言うと、windowsでの拡張子に当たる部分です。
例えば、ブラウザでweb上の『.cgi』ファイルにアクセスした場合、拡張子からCGIだとわかっても、帰ってくるデータが、テキストなのか、画像なのか、scriptなのか、ダウンロードファイルなのか、ブラウザは分からは判断できません。したがって、『Content-Type』にファイル形式を明示するのです。

今までコードのお約束事として記述していた下記のような『Content-Type』は、「htmlファイルです」と、ブラウザに伝えていたのです。(HTML5からは記述しなくても、”text/html”として扱われるようです。)

# HTML
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
# php
header("Content-type: text/html; charset=utf-8");

Content-Type を調べてみる。

本題です。実際にheader情報の『Content-Type』をchromeを使って確認してみます。
chormeのアドレスバーに

chrome://net-internals/#events

を、入力します。(chrome://about/ と入力すると、開発者向けの機能が提供されています。その中の1つです。)

chrome_net-internals01

表示されたリストから、確認したい通信をクリックします。
当サイトだと、
Source Type : URL_REQUEST
Description : http://blog.cototoco.net/
です。ウィンドウ右側に詳細が表示されます。

詳細の中、さらに、HTTP_TRANSACTION_READ_RESPONSE_HEADERS、に『Content-Type』が記載されています。

chrome_net-internals02

当サイトの『Content-Type』が
Content-Type: text/html; charset=UTF-8
だとわかります。

実験

html5に『Content-Type』(metaタグ)有り無しで実験してみます。ちなみに、HTML5では省略しても”text/html”と扱われるので、省略しています。

# meta 有り無し
<meta http-equiv="content-type" content="text/html" charset="UTF-8">

html5に『Content-Type』有りの場合

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html" charset="UTF-8">
<title>Content-Typeサンプル</title>
</head>
<body>
<p>HTML5 Content-Type はどうなっているか?</p>
</body>
</html>

html5に『Content-Type』有りの場合の『Content-Type』は
Content-Type: text/html となっていることが確認できました。

# meta 有りのheader情報
HTTP_TRANSACTION_READ_RESPONSE_HEADERS
--> HTTP/1.1 200 OK
  Date: Fri, 11 Jul 2014 05:27:51 GMT
  Server: Apache
  Last-Modified: Fri, 11 Jul 2014 05:27:41 GMT
  ETag: "5e1f2e-e8-53bf75cd"
  Accept-Ranges: bytes
  Content-Length: 232
  Connection: close
  Content-Type: text/html

html5に『Content-Type』無しの場合

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Content-Typeサンプル</title>
</head>
<body>
<p>HTML5 Content-Type はどうなっているか?</p>
</body>
</html>

html5に『Content-Type』有りの場合の『Content-Type』は
明記されていないようです。(注:キャッシュが残っている場合はキャッシュが表示されているようです。)

# meta 無しのheader情報
HTTP_TRANSACTION_READ_RESPONSE_HEADERS
--> HTTP/1.1 304 Not Modified
   Date: Fri, 11 Jul 2014 05:38:35 GMT
   Server: Apache
   Connection: close
   ETag: "5e1f2e-a2-53bf782f"

以上、chromeで、Content-Type の調べ方です。
また、この方法で、header情報も同時に確認できることになります。

Content-Typeとは : JavaA2Z

gihyo.jp

docomoテザリングでは、PPTP(VPN)接続できず。

2014年7月9日時点の話です。技術的な問題みたいなので、今後もdocomoのテザリングでPPTP(VPN)接続はできないと思われます。IPSecが使える環境を構築するのがいいみたいです。

本題です。

手持ちの機材で、自宅外から自宅PCを起動する(WOL)

今回の目的は、『手持ちの機材で、自宅外から自宅PCを起動する(WOL)』です。

機材
 ・WZR-HP-G301NH(バッファロールータ)
 ・xperia z docomo SO-02E Android 4.2.2

結果的にdocomoのテザリング(SPモード)の仕様と自宅ルーター機能の兼ね合いで、接続できなかったのですが、せっかくなので将来環境を変えた時や再チャレンジのために、メモを残しておきたいと思います。

まず、WZR-HP-G301NHはWOLに対応してるとスペックには書かれていますが、直接外部からのマジックパケットを転送するのではなく、ルータ自身から発生させる方法でWOLを可能としています。

そのために、外部から一度ルータ(ルータ管理画面)にアクセスする必要があります。そこでWZR-HP-G301NHには、PPTPサーバをたてて外部からのアクセスを許可する機能があり、それを使い外部からアクセスを行います。

Android4(バージョン2の途中から)には、OSの機能としてVPNクライアントがあります。アンドロイドに、自宅PPTPサーバPPTPのパスを設定しアクセスすることで、目的のWOLが可能になるはずでした。

が、設定が正しくてもつながりません。理由はdocomoのSPモードが使っているは方式では、PPTPのアドレス変換がうまくいかないようです。この理由や、SPモードのこと、PPTPのプロトコルのことなど詳しいことは私も知りませんが、価格.comのスレッドに詳しい方がおられたので、こちら『スマホ【GALAXY:ギャラクシ】によるPPTP接続について』が参考になると思います。

WZR-HP-G301NHのPPTPサーバ設定方法とAndroidのクライアント設定はこちらの方々を参考にさせていただきました。

Androidから自宅ネットワークにVPNアクセスする 後編

Wake-on-LAN – Wikipedia

スマホ【GALAXY:ギャラクシ】によるPPTP接続について

ドコモの公式テザリングでVPNを使うのに必要な知識

SSL-VPNの導入メリット(後編):“SSL-VPN or IPSecVPN”どちらが最適ですか? – @IT