IPアドレスの読み方

IPアドレスとは

  • Internet Protocol Address
  • パケットを送受信する危機器を判別するための番号
    • つまり、インターネット上の住所みたいなもの
  • IPv6
    • 2128(=約340澗個)存在する
      • 340兆の1兆倍の1兆倍

ネットワーク番号とホスト番号

IPアドレスは、「何丁目、何番地」というふうな二つの部分から構成されている
その二つの部分がネットワーク番号とホスト番号である

  • ネットワーク番号
    • 丁目を表す
    • ネットワーク全体を構成する最小単位のネットワークを表す
    • TCP/IPに於いてこの、最小単位のネットワークをたくさん集めて全体の大きなネットワークが出来ていると考える
  • ホスト番号
    • 番地を表す
    • ネットワーク番号で指定されたネットワーク内の住所を表す

ネットマスク

何ビットがネットワーク番号で、何ビットがホスト番号なのかを表すのが、ネットマスクである

  • ネットマスクを含めた表記
    • 10.11.12.13/24
    • /24というのがネットマスク
    • 24ビット分がネットワーク番号ということを表す
    • 他の表記
      • 10.11.12.13/255.255.255.0
        • こちらのネットマスクを二進数で表すと11111111.11111111.11111111.00000000となる
        • 1と表記されている箇所がネットワーク番号を表す
  • 特別な意味をあわらすIPアドレス
    1. ホスト番号部分が全て0のIPアドレス
      • この場合、ネットワーク全体を表す
      • 例えば、IPアドレス帯域が10.11.12.0/24ですと表記されている場合
    2. ホスト番号部分が全て1のIPアドレス
      • この場合、ネットワーク全員にパケットを送るブロードキャストを表す


最後までお読みいただきありがとうございました。


ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

Excel VBAマクロのオブジェクトとメソッド

今回は、プロパティに引き続いてメソッドに関してまとめたいと思います。


前回のまとめ
Excel VBAマクロのオブジェクトとプロパティ - mic_footprints

メソッドとは何か

  • メソッドとは、オブジェクトに対して行う処理のこと
  • つまり、ふるまい
  • プロパティ同様メソッドもオブジェクトとの間を.(ドット)で繋ぐ
  • メソッドには引数(ひきすう)がある
    • プロパティにも引数はあります(あるらしい)

例えば

    • Rangeオブジェクトの中身をクリアしたい時に使用するメソッドは「Clear」
Range("A1:A10").Clear
    • Rangeオブジェクトを選択したい時に使用するメソッドは「Select」
Range("A1:A10").Select

メソッドの引数とは何か

  • メソッドのふるまいを詳細に定義付けるもの

例えば

    • Rangeオブジェクトのメソッドの「End」
      • ふるまい的には、次にセルの値が""になる手前のセルを返す
Range("A1").End(xlDown).Row

この場合

    • Range("A1")がオブジェクト
    • Endがメソッド
    • xlDownが引数
    • Rowがプロパティ

オブジェクト・プロパティ・メソッド

先程の、Endメソッドを再び例にとってオブジェクト、プロパティ、メソッドを説明します。

Range("A1").End(xlDown).Row
  • Range("A1")はRangeオブジェクト
  • EndはRangeオブジェクトのメソッド
    • 次にセルの値が空("")になるセルを返す
    • つまり、私たちが認識するべき重要なEndメソッドのふるまいは、「セルを返す」
  • xlDownはEndメソッドの引数
    • Endメソッドは、引数でどの方向のセルを返すかを決定している
    • この場合は、下方向
  • RowはRnageオブジェクトのプロパティ
    • この時のRowがかかっているRangeオブジェクトは、Range("A1").End(xlDown)で表させるセル
    • つまり、Endメソッドのふるまいによって返されたRangeオブジェクトのプロパティであるRowを参照している


このように、オブジェクトとプロパティとメソッドは深く密接に関係し合っています

重要なことのまとめ

  • 自分が指定したものが、何オブジェクトなのかを意識する
    • これにより、使用できるメソッド、プロパティがわかる
  • プロパティはウォッチ式を使用することで、全容を把握できる
    • 自分が取得したい値が何という名前のプロパティなのかを見ることができる
    • 取得したいプロパティが何オブジェクトなのかも、把握することが大切
  • メソッドのふるまいを意識することが重要
    • ふるまいを意識することで、自分が今何オブジェクトを操作しているのかがわかる
    • ふるまいをよく理解しなければ、思い通りの挙動を実現することは難しい


最後までお読みいただきありがとうございました。

やさしくわかるExcel関数・マクロ 改訂版 (Excel徹底活用シリーズ)

やさしくわかるExcel関数・マクロ 改訂版 (Excel徹底活用シリーズ)

MySQLの入門まとめ

SQLについて学んだのでまとめてみた

参考文献

ぐんぐん実力がつく! 逆算式SQL教科書

ぐんぐん実力がつく! 逆算式SQL教科書

SQLとは

  • Structured Query Languageの略称
  • 日本語で言うと、構造化問い合わせ言語
  • つまり、データベースへ問い合わせるための言語である
  • ※公式にはSQLは何の略称でもないらしい(参照:http://ja.wikipedia.org/wiki/SQL#cite_note-0)

SQLを書くに当たって

3つの掟
  • ゴールを明確にする
    • 他のプログラミングも同様であるが、書いているうちに結局自分はなにがしたかったのか分からなくなってしまうことがある
    • SQLを書き始める前に、まずゴールを紙に書いてみる(個人的にはEvernoteを利用)
  • どのように実現するか、そのために何が必要かを考える
    • SQLは結局は集合演算なので、全体のパイからどうやって目的のレコードを取得するかをイメージでもいいので書いてみる
    • そのイメージを日本語化してみる
    • その際に、必要な情報も加えて記載しておく
  • やってみる
    • 個人的見解ですが、ひたすらに書いているとなんとなく分かってくる
SQLは英作文みたいなもの
  • SQLも単なる言語に過ぎない
  • つまり、日本語で表現出来れば、あとは、英作文の要領でSQLの文法に従って書くだけ

プロセスとしては

  1. まずは日本語で考える
  2. それを記号(演算子など)で置き換え、SQLに翻訳する
  3. そして段階的にSQL文を組み立ててみる
  4. 実行しながら最終的な結果に到達する
所感
  • 日本語で書けないことは、SQLでも書けない
  • ということは、まず、日本語で文章化してみることが、早くアウトプットに繋がる道である

SQLの基本的な構文

SQLのもっとも基本的な構文

SELECT A FROM B WHERE C
  • 上の意味はBテーブルからCという条件でAを取得する
  • サンプルテーブル
mysql> use test
Database changed

mysql> SHOW tables;
+----------------------------+
| Tables_in_saiyo_dev_branch |
+----------------------------+
| users                      |
| diaries                    |
+----------------------------+
2 rows in set (0.00 sec)

mysql> DESCRIBE users;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     |      | PRI | NULL    | auto_increment |
| name  | varchar(40) | YES  |     |         |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> DESCRIBE diaries;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     |      | PRI | NULL    | auto_increment |
| user_id | int(11)     |      |     |         |                |
| title   | varchar(40) | YES  |     |         |                |
| body    | text        | YES  |     |         |                |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)


例えば、

mysql> SELECT users.* FROM users WHERE users.id < 3;
+----+------+
| id | name |
+----+------+
| 1  | 太郎 |
| 2  | 花子 |
+----+------+
2 row in set (0.00 sec)
  • usersテーブルから、usersテーブルのidカラムが3未満であるという条件でusersテーブルの全カラムを取得する
SELECT句(select clause)
  • 取得したいカラムを指定する句
    • エイリアス(別名)を付けることが出来る
      • 例えば、SELECT users.name AS user_name
    • *(ワイルドカード)で全カラムを取得することが出来る
      • この際、テーブル名を指定しなければ、全てのテーブルの全カラムを取得することになる
    • カラム名が一意であるときは、テーブル名を省略できる
FROM句(from clause)
  • 検索をかける対象の指定する句(厳密には違うが)
    • エイリアスを付けるとこが出来る
      • 例えば、FROM users members
    • サブクエリ(副問い合わせ)でテンポラリテーブルを作成することが出来る
      • テンポラリテーブル内はインデックスが使用できない
WHERE句(where clause)
  • 検索条件を指定する句
    • 「=,<,>,<>,IN」などの演算子を使用する

結合

  • テーブルとテーブルをある条件でくっつける
  • FROM句とWHERE句で指定する
  • 複数のテーブルにまたがって検索をかけたい時などに結合を利用する
  • 結合することをJOINという
  • 構文
mysql> SELECT A FROM B JOIN D ON E WHERE C;

テーブルDをEという条件で結合する

INNER JOIN
  • もっとも基本的なJOIN
mysql> SELECT * FROM diaries JOIN users ON diaries.user_id = users.id;
+----+------+----+---------+-----------+--------+
| id | name | id | user_id | title     | body   |
+----+------+----+---------+-----------+--------+
| 1  | 太郎 | 1  | 1       | テスト    | MysSQL |
| 1  | 太郎 | 2  | 1       | テスト2   | SQLite |
+----+------+----+---------+-----------+--------+
2 row in set (0.00 sec)
  • 結合方法
    • ON以下の条件で結合を行う
    • 上記の例でdiariesを持っていないuserがいたときには、JOINの対象から外れ
      • つまり花子が消えている
  • 「JOIN」と省略できる
LEFT OUTER JOIN
  • 構文
mysql> SELECT * FROM diaries JOIN users ON diaries.user_id = users.id;
+----+------+------+---------+-----------+--------+
| id | name | id   | user_id | title     | body   |
+----+------+------+---------+-----------+--------+
| 1  | 太郎 | 1    | 1       | テスト    | MysSQL |
| 1  | 太郎 | 2    | 1       | テスト2   | SQLite |
| 2  | 花子 | NULL | NULL    | NULL      | NULL   |
+----+------+------+---------+-----------+--------+
3 row in set (0.00 sec)
  • 結合方法
    • ON以下の条件で結合を行う
    • 上記の例でdiariesを持っていないuserがいたときには、diariesのカラムがNULLになる
      • 花子のレコードそうである
  • 「LEFT JOIN」と省略できる
その他
  • 以下のJOINもあるけど、使ったことがないので割愛
    • RIGHT OUTER JOIN
      • 結合の仕方がLEFT OUTER JOINと逆
    • CROSS JOIN
      • 全組み合わせでJOINする(MySQLではINNER JOINと同じ)非連結結合
      • ほぼ確実に使わない


最後までお読みいただきありがとうございました。

joins オプションとinclude オプションの決定的な違い

railsのfindメソッドのincludeオプションとjoinsオプションの違いに付いてまとめてみた

  • DB構成
mysql> DESCRIBE users;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     |      | PRI | NULL    | auto_increment |
| name  | varchar(40) | YES  |     |         |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> DESCRIBE diaries;
+---------+---------+------+-----+---------+----------------+
| Field   | Type    | Null | Key | Default | Extra          |
+---------+---------+------+-----+---------+----------------+
| id      | int(11) |      | PRI | NULL    | auto_increment |
| user_id | int(11) |      | MUL | 0       |                |
| body    | text    | YES  |     |         |                |
+---------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> DESCRIBE comments;
+----------+---------+------+-----+---------+----------------+
| Field    | Type    | Null | Key | Default | Extra          |
+----------+---------+------+-----+---------+----------------+
| id       | int(11) |      | PRI | NULL    | auto_increment |
| user_id  | int(11) |      | MUL | 0       |                |
| diary_id | int(11) |      | MUL | 0       |                |
| body     | text    | YES  |     |         |                |
+----------+---------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
  • リレーション
class User < ActiveRecord::Base
  has_many :diaries
  has_many :comments
end

class Diary < ActiveRecord::Base;
  belongs_to :user
  has_many :comments
end

class Comment < ActiveRecord::Base;
  belongs_to :user
  belongs_to :diary
end

joins

User.find(:all, :joins => "LEFT OUTER JOIN diaries ON diaries.user_id = users.id", :conditions => ["users.id = ?", "1"])
  • 発行される SQL
SELECT * FROM users LEFT OUTER JOIN diaries ON diaries.student_id = users.id WHERE users.id = 1
    • SELECT句には*が発行される
    • FROMの後にjoinsで指定した文字列が発行される
  • レスポンス
[#<User:0xb6f61e0c @attributes={"id"=>"2", "name"=>"太郎", "user_id"=>"1", "body"=>"joins オプションとinclude オプションの決定的な違い"}>]
    • Userモデルのオブジェクトの属性"@attributes"として全カラムが格納されて返ってくる
    • idカラムの値が上書きされている

include

User.find(:all, :include => [:diaries], :conditions => ["users.id = ?", "1"])
  • 発行される SQL
SELECT
  users.`id` AS t0_r0, users.`name` AS t0_r1, diaries.`id` AS t1_r0, diaries.`user_id` AS t1_r1, diaries.`body` AS t1_r2
FROM
  users
LEFT OUTER JOIN diaries ON diaries.user_id = users.id
WHERE users.id = 1
    • SELECT句での対象とincludeで指定されたテーブルの全カラムに対してエイリアスが貼られている
      • エイリアスの貼られ方
        • t*でテーブルの一意性を示している
        • r*でテーブル内のカラムの一意性を示している
    • エイリアスが貼られたカラムのみSELECT句へ格納されている
  • レスポンス
[#<User:0xb6f61e0c @attributes={"id"=>"1", "name"=>"太郎"}, @diarys=[#<Diary:0xb6f61768 @attributes={"id"=>"2", "user_id"=>"1", "body"=>"joins オプションとinclude オプションの決定的な違い"}>]>]
    • Userクラスのオブジェクトの属性"@attributes"には、usersテーブルのカラムが格納され、"@diarys"には、Diaryクラスのオブジェクトが格納され、その中には、diariesテーブルのカラムが格納されている

二つのオプションの決定的な違い

  • include
    • 参照をキャッシュして保存している
    • SQL問い合わせ後、関連先のオブジェクトとして準備してくれる
  • joins
    • 問い合わせて帰ってきたカラムが全てUserクラスのオブジェクトに入っている
    • つまり、単にFROM句とWHERE句の間に発行されるSQLを追加するだけ
    • しかも、idは後から取得した2に上書きされていることからもわかるとおり、問い合わせの結果同じカラム名が返ってくる場合は、エイリアスをselectオプションでしてしなければならない
  • 併用
    • includeとjoinsは併用が可能
    • 注意するべき点
    1. joinsはSELECT句を生成しない
    2. includeでエイリアスが貼られてSELECT句に格納されるのは、findの対象とincludeで指定されたテーブルのみ
    3. つまり、joinsとincludeを併用した場合、joinsで指定して、JOINしたテーブルのカラムはSELECTされない
  • 使い分け
    • 実務上、includeがとても便利である
    • joinsは、そのテーブルのカラムの情報自体は不要であるが、検索条件に追加したい場合などに指定すると良い
      • 例えば、
User.find(
  :all,
  :joins => "LEFT OUTER JOIN comments ON comments.user_id = users.id",
  :include => [:diaries],
  :conditions => ["users.id = ? AND comments.body LIKE ?", "1", "%Rails%"]
)
      • 発行される SQL
SELECT
  users.`id` AS t0_r0, users.`name` AS t0_r1, diaries.`id` AS t1_r0, diaries.`user_id` AS t1_r1, diaries.`body` AS t1_r2
FROM
  users
LEFT OUTER JOIN diaries ON diaries.user_id = users.id
LEFT OUTER JOIN comments ON comments.user_id = users.id
WHERE
  users.id = 1 AND
  comments.body LIKE '%Rails%'


最後までお読みいただきありがとうございました。

Excel VBAマクロのオブジェクトとプロパティ

今回は、Excel VBAをより深く理解するためにオブジェクトとプロパティについてまとめます。

VBAでのオブジェクト

VBAVBの派生系ですから、手続き型言語です。
ですので、厳密には、オブジェクト指向言語とは異なりますが、
短時間で有効なコーディングをする上でこの違いは特に認識する必要は内容に思います。

オブジェクトとは何か

  • VBAでは、操作対象となる全てのものがオブジェクト

例えば

    • セルはRangeオブジェクト
    • ワークシートはWorkSheetオブジェクト
    • ブックは、Workbookオブジェクト
    • Excel自体もオブジェクトで、Applicationオブジェクト

プロパティとは何か

  • プロパティは、日本語で言うと「属性」
  • [Object].[Property]でオブジェクトのプロパティにアクセス出来る

例えば、

たかし君は「人間オブジェクト」
たかし君の身長を知りたいとする
「人間オブジェクト」は「身長プロパティ」を持っている
つまり、"たかし君.身長"でたかし君の身長を取得することができる

このようなイメージ
実際のExcelでの、例を見てみる

Range("A1").Column ' => 1

Rangeオブジェクトには、列の情報を格納する属性があり、Columnという

プロパティは出力のみではない

例えば

  • RangeオブジェクトにValueプロパティがある
  • Valueプロパティは値を司る
    • 出力
a = Range("A1").Value
' aという変数にA1セルの値を出力している
    • 入力
Range("A1").Value = "テスト"
' A1セルの値に"テスト"という文字列を入力している

(大概のプログラミング言語がそうであるが)VBAでは、左辺に右辺から値を代入するという記法を採用している


ちなみに、詳細なプロパティはVBEを立ち上げてウォッチ式で見ることが出来る☆


やさしくわかるExcel関数・マクロ 改訂版 (Excel徹底活用シリーズ)

やさしくわかるExcel関数・マクロ 改訂版 (Excel徹底活用シリーズ)

働くとは何ぞや---社会人最初の半年を振り返ってみて---

今日で、社会人になって半年が経ちました。
経った時に会社にいたことはさておき(笑)、社会人最初の半年を振り返ってみようと思います。
で、働くとは何ぞやっていうのを、今の自分なりにまとめてみたいと思います。


半年前、わたしは、ただの小生意気な学生でした。
働くとは何ぞやってことなんか、わかっているなんて勘違いしていました。
というより、わかっている自分でいたかった。
でも、本当は、何にもわかっちゃいませんでした。


ただただ、未熟でした。
子供でした。


半年が経ち、いろいろな失敗をしました。
沢山の人に、迷惑をかけました。
そんな中で、周りの人にたくさん支えられて、たくさんのことを学ぶことができました。
本当に感謝しています。


で、今、私が働くことをどのように捉えているかといいますと、
それは、相手へ望みを叶え、貢献をすること


つまり、自分本位では仕事はできないということです。
そんなことは、働く前から分かっていたつもりでしたが、全然行動が伴っていなかった。
つまり、心底理解できていなかったのでしょう。


でも、今は理解出来ている気がします。
相手へ貢献することが、とても心地良く非常に楽しいということも。


そして、相手の本当の望みが相手が気付いてもいない望みであればあるほど、感動を与えられることが出来るのでしょう。
そんな感動を与えられるようなビジネスマンになりたい。
半年経って心の底から思いました。


つまり、今の段階での私の働くとは何ぞやは、「相手の望みを叶え貢献をし、そのことで自分も喜びを得るという行動」であると考えています。


私も、相手を尊重し、お互いを高めあいながら、相手へ貢献することが出来たのなら、
少しは成長したといってもらえるかもしれませんね(笑)


まだまだ、始まったばかり!
これからもっともっと自分を磨いていきたいと思った社会人7ヶ月目でした。


最後までお読みいただきありがとうございました。

sortとsort_by

今回は、Rubyに関して書きます

sortメソッド

  • Arrayクラスのメソッド
    • 配列内の要素を並び替えすためのメソッド
      • 数の大きさ
      • 行の長さ
      • アルファベット順
      • アルファベット逆順
      • などなど

たとえば、

array = ["a", "c", "b", "f", "d", "e"]

sorted = array.sort do |a, b|
  a <=> b
end

p sorted #=> ["a", "b", "c", "d", "e", "f"]

sortメソッドは、配列の要素を余分に呼び出します。

どういう事かというと、

array = ["a", "c", "b", "f", "d", "e"]
i = 0

sorted = array.sort do |a, b|
  i += 2
  a <=> b
end

p sorted #=> ["a", "b", "c", "d", "e", "f"]
p i #=> 20

つまり、サイズが6の配列に対して、要素の呼び出し回数が20回であり、
これが、サイズの大きい配列とかになると非常に時間がかかってしまいます。

sort_byメソッド

sortメソッドでは非常に処理に時間がかかってしまう場合に使用されるのが、sort_byメソッド

array = ["a", "c", "b", "f", "d", "e"]
i = 0

sorted = array.sort_by do |item|
  i += 1
  item
end

p sorted #=> ["a", "c", "b", "f", "d", "e"]
p i #=> 6

sort_byメソッドは、すべての要素に対して、同じ条件でソートを行ないたい時に使用します。


実際の使用例

mysql> select * from users;
+----------+--------+
| name     |    age |
+----------+--------+
| タナカ   |     22 |
| スズキ   |     22 |
| サトウ   |     21 |
| ヨシダ   |     22 |
+--------- +--------+
4 rows in set (0.01 sec)

sort_byメソッドは、並び替え条件に配列を指定することができる。

users = User.find(:all)

sorted = users.sort_by do |u|
  [u.age, u.name]
end

p sorted.map(&:name) #=> [サトウ, スズキ, タナカ, ヨシダ]

この場合、第一条件がageで第二条件がnameです。

安定なソートと不安定なソート(stable_sort と unstable_sort)
  • 安定なソート
    • ソート条件が同じであった場合、もとの順序を保持したまま並び替えを行うソートのこと
    • 参照:安定ソート - Wikipedia
  • 不安定なソート
    • ソート条件以外の条件の並び順が元の並び順とは依存しないソートのこと

で、sort_byは安定なソートではありません。
参考:プログラミング言語 Ruby リファレンスマニュアル


そこで、sort_byで安定ソートを実現する方法を紹介します。

users = User.find(:all)
i = 0

sorted = users.sort_by do |u|
  [u.age, i += 1]
end

p sorted.map(&:name) #=> [サトウ, タナカ, スズキ, ヨシダ]

参考:http://blog.goo.ne.jp/minimal_room/e/91ad1e860020316a219e751502ef085e


つまり、どういう事かというと、第一条件が同じ時は第二条件であるiで並び替えます。
ということは、第一条件が同じ要素は、i(元々の配列に格納されている順に大きくなる)で並び替えるので、並び順を崩すことなく、並び替えを行うことができます。


最後までお読みいただきありがとうございました。
何か不備等ございましたら、ツッコミ等などよろしくお願い致します。

たのしいRuby 第3版

たのしいRuby 第3版


----- 追記 -----
安定なソートと不安定なソートに関して追記しました(2011/05/02)