エクセルマクロのメモ

結構面倒くさい(;´Д`)

Option Explicit

Sub OnClick_Search()
    Dim w As Worksheet
    Dim c As Range
    Dim s() As String
    Dim firstAddress As String
    Dim i As Integer
    
    Set w = ActiveSheet
    If w Is Nothing Then MsgBox "ワークシートエラー"
    'w.Cells(1, 1).Activate
    ActiveCell.SpecialCells(xlLastCell).Select
    Set c = w.Cells.Find("01", after:=ActiveCell, LookAt:=xlWhole)
    If Not c Is Nothing Then
        firstAddress = c.Address
        i = 0
        Do
            i = i + 1
            ReDim Preserve s(i)
            s(i) = w.Cells(c.Row, 2)
            Set c = w.Cells.FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
    MsgBox "終了です。"
End Sub

Rubyの勉強 02

9月も上旬が終わる。
Rubyの入門書を買って勉強中だが、色々変なことや違うことに手を出していて、
遅々として進まない。

Ruby自体の仕様に目をむくのもある。
思ったよりガッツリ、オブジェクト指向言語になっていて、
この辺のことが頭から飛んでいた私には刺激が凄い。
細かいところでも、イテレータを定義できるとか(やったことがなかった)、
演算子オーバーライド(オーバーロードではなかった)ができるところとか、
気になってしょうがなかった。
ほんとにスクリプト言語なのかこれ…。
# 大昔にC++演算子オーバーロードが出来る事を知った時は画期的だなぁと
# 思ったものだし、Javaでそれが採用されてないのも、まぁしょうがないよね
# と思ってたもんだった。それが最近の言語じゃ普通にできる。
## C11とか、マルチスレッドに対応するとか言うし。もう…あ、これは関係ないか。


今日は先月のHTTPSへのリベンジの機会がやってきたので、書いておこうと思った。
たのしいRuby 第4版のP.168、List 8.13である。
第8章 クラスとモジュールに出てくるオブジェクトの使用例で、HTTPクラスのインスタンスを使って、
Rubyの日本語公式サイトからドキュメントを取得する。

章のタイトルの通りここではクラスとモジュールの説明がメインなので、
HTTPのプロトコルやネットワークプログラミングについての説明は必要最小限に
とどめてある。賢明な書き方だと思う。

しかし、このプログラム、"http_get.rb"だが、残念ながらそのままでは
期待通りには動かない。
先日のサンプルプログラムと同じ問題だ。
"http://www.ruby-lang.org/ja/"からは301 Moved Permanentlyが返される。

D:\pg\ruby-test\hajimete>ruby http_get_.rb
#<Net::HTTPMovedPermanently:0x289261c>

ロケーションヘッダに移動先のURLが示されているとのことだが、
ここでは単純に"https://www.ruby-lang.org/ja/"にアクセス先を変えよう。
すると今度は

D:\pg\ruby-test\hajimete>ruby http_get_.rb
D:/pg/ruby/lib/ruby/2.1.0/net/protocol.rb:153:in `read_nonblock': end of file re
ached (EOFError)
        from D:/pg/ruby/lib/ruby/2.1.0/net/protocol.rb:153:in `rbuf_fill'
        from D:/pg/ruby/lib/ruby/2.1.0/net/protocol.rb:134:in `readuntil'
        from D:/pg/ruby/lib/ruby/2.1.0/net/protocol.rb:144:in `readline'
        from D:/pg/ruby/lib/ruby/2.1.0/net/http/response.rb:39:in `read_status_l
ine'
        from D:/pg/ruby/lib/ruby/2.1.0/net/http/response.rb:28:in `read_new'
        from D:/pg/ruby/lib/ruby/2.1.0/net/http.rb:1408:in `block in transport_r
equest'
        from D:/pg/ruby/lib/ruby/2.1.0/net/http.rb:1405:in `catch'
        from D:/pg/ruby/lib/ruby/2.1.0/net/http.rb:1405:in `transport_request'
        from D:/pg/ruby/lib/ruby/2.1.0/net/http.rb:1378:in `request'
        from D:/pg/ruby/lib/ruby/2.1.0/net/http.rb:1128:in `get'
        from http_get_.rb:5:in `<main>'

と盛大に怒られる。net/httpはHTTPSに対応していないのである。
そういう訳であちこち参考にして書き換えた。http_get.rbがこちら。

require "net/https"
require "uri"
url = URI.parse("https://www.ruby-lang.org/ja/")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
https.ca_file = "D:\\pg\\ruby-test\\hajimete\\cacert.pem"
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
https.start
doc = https.get(url.path)
puts doc.body

Windowsのコンソールのフォントの問題か、若干文字化けしている箇所もあるが、HTMLが正常に読み込めた。これで一応HTTPSへのアクセスとドキュメントの取得はできるようになった。
ただ、問題や疑問点もいくつかある。
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
の行で、個々の値をOpenSSL::SSL::VERIFY_NONEにすると、https.ca_file、つまり証明書のファイルが必要なくなるのだが、それはそれでおっかない。
cacert.pamがなく、最初、どうしたものかと思ったが、同じようなことで悩んでいた人は多いらしく、あちらこちらでファイルの入手法が書いてあった。
曰く、http://curl.haxx.se/ca/cacert.pemからもって来い。
なんじゃそりゃ。そもそもこのサイトはなんなんだ。
しょうがないので調べてみると、
cURL - Wikipediaと言う至極真っ当な
団体であることがわかった。
証明書も安全そうである。
# 不正に書き換えられたとかいうことがなければだが
そういう訳で、その場しのぎでこれを使ったのだが、合点も行かない。
Windowsの保有する最新の証明書が使いたい。
http://q3.snak.org/doc/RootCertificate.html
こちらで紹介されている方法を使えば、証明書のファイルは手に入れられそうだ。
しかし、Rubyでクライアントを作ったとして、毎回ユーザーにこれを作ってもらうのかと思うとかなりしんどい話である。
普通はどうやっているんだろうか?(・ω・ )

Rubyの勉強 01

クローラー作りたいぜとか言って、初歩の初歩のWebページの読み込みで既に失敗しているというのもまずいのだが…。
まず、私がサンプルプログラムを読めてない

require 'open-uri'
open("http://www.ruby-lang.org/") {|f|
  f.each_line {|line| p line}
}

高々3行のサンプルであるし、意味も簡単と推測できる。
しかし、今迄の知識でこんな書き方にお目に掛かったことがない。
浦島太郎も良いところだ。

1行目は分かる。
"open-uri"と言うライブラリを読み込んでいる。
# しかし、リファレンスを見てrequireがモジュール関数であることには仰天した。
# 構文やディレクティブじゃないんだ。

open-uriのお陰でopenメソッドはWebページをURLで指定することで
ファイルストリームと同じように読み込める。
再定義してるのかラップしてるのか仕組みは分からんが後回しでいいだろう。
問題はその後。{}で囲まれている(ーー;)
関数の後にブロックを作ってる?それに|f|ってなんだ。
そしてf.each_lineで普通に読み込んだストリームを利用している。
each*は経験上何となく分かる。
その後にまたブロックが出てきて戸惑うが、|line|と書いて、
p lineと利用している。
つまり、lineと言う変数(?)を作りfの最初から終わりまで
1行ずつ取り出して突っ込んでるということか。
pは何なんだ?と思ったがこれはすぐに分かる。
表示してるのね、lineを。printの略かなんかなんだろう。
ということは|f|と言う書き方も分かる。
読み込んだストリームをfに突っ込んでるんだ。

と予想を立てたところでopen-uriのリファレンスを見てみる。

Kernel.#openを再定義します。

と要約に書いてあった。こんな分かりやすいところに書いてあるものを忘れるのか。
このページ、使用例しか書いてないな。
Kernel.#openを見て定義を考えるしかないのかな。
Kernel.#openを見る。普通のファイルの開き方が書いてあるが、最後の方まで見てみると
open-uriでの定義がちゃんと書いてあった。

open(name, mode = 'r', perm = nil, options = {}) -> StringIO | File[permalink][rdoc] [redefined by open-uri]
open(name, mode = 'r', perm = nil, options = {}) {|ouri| ...} -> nil [redefined by open-uri]

nameにはURIを渡す。URIと書いてあるが今はURLと読み替えて差し支えないだろう。
第2、第3、第4引数はサンプルでは書かなかった。
デフォルト値が入っている引数は省略できるということか。

ブロックを与えた場合は上の場合と同様、name が http:// や ftp:// で 始まっている文字列なら URI のリソースを取得した上で StringIO オブジェクトを 引数としてブロックを評価します。後は同様です。 StringIO オブジェクトは OpenURI::Meta モジュールで extend されています。

と書いてある。
「StringIO オブジェクトを 引数としてブロックを評価します。」って何だよと思ったのだが、
単純にブロックに引数を渡せるということか…。
つまり定義の|ouri|はStringIOオブジェクトのブロック引数と。
ブロック引数ってなんだよ。自分で言ってて気持ち悪いよorz
何か名前があるのかな。

ここまで来れば後はStringIOを見てみればその後の意味も分かりそうだ。
each_lineメソッドを見ると、他のメソッド群とまとめられて、

自身から 1 行ずつ読み込み、それを引数として与えられたブロックを実行します。

と説明されている。つまり、サンプルでは1行ずつ読み込んで、p lineを実行したわけだ。
最後にp。これは予想通りだったが、ちゃんと引用すると、

引数を人間に読みやすい形に整形して改行と順番に標準出力 $stdout に出力します。主にデバッグに使用します。

とのこと。標準出力に出力するよ、と。あと主にデバッグ用途だよと。


長かった(ーー;)
これはちゃんと勉強しないと苦戦するどころか、プログラムが書けないな。
ということで本を買いました(・ω・ )

1日…じゃ厳しい気がしてきた。3日位で読めないかな。

Rubyでクローラーを作りたい(んだけど分からん) 01

ネット中の単語をランダムはいつ作ってくれるんだろうなー。

このお言葉からじゃあ、どうやればいいのと考えて、取り敢えずURLを収集するクローラーとか言うのがいるんじゃないのと思った。

ちなみにRubyはまだ文法も覚えてない。

とにかく作りながら勉強すりゃいいじゃんと言うことで、検索をかけると良いスライドが見つかった。

Rubyで作るクローラー Ruby crawler

本文の解析とかは後回しだ。とにかくaタグのURLを収集できれば良い。
# robots.txtには従いたいが
まず、Webページを読み込むためのOpen-URIとやらの使い方だな。

Rubyは幸いインストールしてある。
ActiveScriptRuby and Other packages
ここの"Ruby-2.1.2-p95 Microsoft Installer Package(2014-5-08 revision 45877改)"だ。

Open-URIで検索をかけるとリファレンスマニュアルが最初に出た。
library open-uri
幸先が良い。特にモジュールやらのインストールはいらないようである。
早速、最初の例文をそのまま書いて実行してみる。

require 'open-uri'
open("http://www.ruby-lang.org/") {|f|
  f.each_line {|line| p line}
}

すんなり行くかなと思ったら、エラーが出た。

D:\pg\ruby-test>ruby open-uri-test.rb
D:/pg/ruby/lib/ruby/2.1.0/open-uri.rb:223:in `open_loop': redirection forbidden:
 http://www.ruby-lang.org/ -> https://www.ruby-lang.org/ (RuntimeError)
        from D:/pg/ruby/lib/ruby/2.1.0/open-uri.rb:149:in `open_uri'
        from D:/pg/ruby/lib/ruby/2.1.0/open-uri.rb:704:in `open'
        from D:/pg/ruby/lib/ruby/2.1.0/open-uri.rb:34:in `open'
        from open-uri-test.rb:3:in `<main>'

D:\pg\ruby-test>

redirection forbidden?(・ω・ )
ブラウザで開いてみたら
http://www.ruby-lang.org/https://www.ruby-lang.org/へリダイレクトされた。
Open-URIはリダイレクトに対応していないか、何かオプションでもあるのだろう。
しょうがないので、httpsに書き換えて再挑戦すると、今度はSSLのコネクトで失敗してるぞというエラーが出た。
雲行きが怪しくなってきた。

httpsでの接続は避けて通れないと思うのだが、ここは後回しにして、とにかく一度接続し表示している所が見たい。と言うことで、Yahoo!に行ってみることにした。
URLを書き換えて見事成功である。

しょっぱなからこれか、苦労しそうな気がしてきた。

Unityのチュートリアルをやってみた 03

f:id:zanasta:20140816005541p:plain
チュートリアルの続き。はじめてのUnity 第3回をやってみた。

特に苦労とかは無し。
あっさり効果音を追加でき、あっさりBGMが追加された。
ものぐさでブロクが3段しかないけど、取り敢えず色もつけた。
トントン拍子。何も考えることがない。
Unity凄い(・ω・ )

「はじめてのUnity」は残念ながらここでストップ。

第4回はまだ公開されていないのだ。
公開予定の内容は…

次回はいよいよ Android に書き出します。

と書いてあったので、Androidアプリをビルドするようだ。
もう!?マジか。というかそんな簡単に出来んの?(・_・;)

Unityのチュートリアルをやってみた 02 の宿題

Unityのチュートリアルをやってみた 02 - ザナスタの日記
で作ったのを宿題の通りに改造してみた。

こうなると「ボールが一定時間でスピードアップ」や「2回・3回叩かないと壊れないブロック」等を作りたくなりますね。
それは宿題としましょう。

とあるので、まずはスピードアップからやってみるかということで、手をつける。

…?(・ω・ )
どうやればいいのこれ。今まで弄った感じ、イベントドリブンのようなんだけど、
タイマーとかつけるの?

.NetのTimerクラスみたいのはないみたい。
Timeって言うインターフェースはあるみたいなんだけど。

ボールのUpdateイベントに突っ込んじゃえばいいか。

BallController.js

#pragma strict

var Speed = 20.0;
var AddSpeedRate = 20.0;
private var NextSpeed = 20.0;


function Start () {
	rigidbody.AddForce((transform.forward + transform.right) * Speed,
						ForceMode.VelocityChange);
}

function Update () {
	if (Time.time > NextSpeed) {
		NextSpeed = Time.time + AddSpeedRate;
		rigidbody.AddForce((rigidbody.velocity.normalized) * Speed, ForceMode.VelocityChange);
	}
}

出来たのがこれ。NextSpeedから速度追加が始まって、AddSpeedRate毎に追加。
なんかいけ好かないけどこれで良しとする。

次。2,3回叩かないと壊れないようにする。ブロックの処理を改造しちゃえばいいのかな?

BlockContoller.js

#pragma strict

private var BlockHP = 1;
function Start () {

}

function Update () {

}

function OnCollisionEnter(collision: Collision) {
	if (BlockHP > 0) {
		BlockHP--;
	} else if (BlockHP <= 0) {
		Destroy(gameObject);
	}
}

BlockHPって名前でプロパティをつけて、ボールがぶつかるたび(他のものがぶつかった場合でもか?)に1減って、これが0になった時点で再度ボールがぶつかると消滅。

いまいち、綺麗じゃないけど取り敢えず出来た(・ω・ )

Unityのチュートリアルをやってみた 02

f:id:zanasta:20140811233826p:plain
チュートリアルの続き。はじめてのUnity 第2回をやってみた。
細かいことをやりだすと色々問題が出てくるのだろうけど…。
気持ち悪いほど簡単だ(・_・;)
ブロックの増殖は面倒なので3列で適当にやって、
宿題を残して最後までやった。

ふと画面を見て気がつく。
私の作ったオブジェクトはのっぺりしているのに対して、チュートリアルの画面のオブジェクトはなんか金属のような光沢がある。
よくよく見たら、しれっと点光源らしきものが追加されている。
(・ε・ )と思いながら点光源を追加してみた。
f:id:zanasta:20140811233835p:plain
いまいち上手くいかない。
宿題もやってみよう。ドキュメントを読めばできるかな(・ω・ )