2016年11月9日水曜日

【計算折り紙(?)】「紙一枚、切らずに作る風車」

今回作った風車は↓のような構造をしています。


一般的な↓のタイプと違い、紙を切ることなく作ります。


今回は、はさみを使わずに紙1枚で風車を折ってみたので紹介したいと思います。





1、分かりやすく直線を書きましたが、山折り、破線を谷折りにします。
既に折り目を付けていますが、こんな感じ。この紙は10cm*10cmの正方形です。
折る間隔は半分のところと1/4の所です。

2、山と谷を折り込みます。
少しずつ、立体にする感じ。折り込むときに、上(下)が回転して折り込まれます。

↑横からみた図

3、折り込み完了










これで、いい感じのプロペラ状の物体が出来上がります!(笑

4、シャーペンの先につけて・・・

完成です!

あとは、先端方向から息を吹きかけてみてください。ちゃんと出来ていれば、かなりよく回ると思います。
エアコンの風で試してみました。微風ですが、かなり良く回っています。


20170104追記
このような、切らずに面白い立体を作る折り紙に「計算折り紙」というものがあるそうです。興味のある方はそういったキーワードを調べてみるのも良いでしょう。

2016年9月10日土曜日

RubyからExcelのマクロを実行する方法

rubyからwin32oleを使ってExcelを操作できることは良く知られていますが、それだけではrubyから操作するだけで、マクロを使用しなくては実行できない高度な処理を行う事はできません。

この記事は、rubyからexcelのマクロを呼び出して実行する処理をまとめたものです。
これにより、今までのマクロを使いまわしたり、いちいちマクロをrubyで書き直さなくても、excelでマクロを登録してあとはrubyから保存したマクロの名前から実行するだけで処理ができます。


今回の処理内容と実行するためのファイルを紹介します。
【処理内容】
1.txtファイルからデータを読み込む
2.excelにデータを転写
3.excelに予め保存しておいたFFTを行うマクロを実行  ←今回のキモ
4.excelを別名で保存

【ファイル】
data.txt ・・・ 読み込むデータファイル
excel.rb ・・・ 実行するルビーのファイル
excelMacro.vbs ・・・ エクセルでマクロを実行するためのファイル。これをrubyを通して動かす
FFTtemp.xlsm ・・・ FFTのマクロを記録してあるexcelファイル。


早速、プログラムを見ていきましょう。
(プログラムは以前、株価情報を周波数解析しようとした際のもの)

__ data.txt __
20150706 494 498 470 478 14,098,300 478
20150703 495 503 490 502 12,114,000 502
20150702 480 517 479 492 25,980,700 492

という内容が永遠と続きます
__ data.txt ここまで __



__ excel.rb __
#
# excelとrubyでFFT
#
require 'date' # Dateクラス読み込み
require 'win32ole' # Win32OLE(COM)の読み込み

# 文字コード指定
Encoding.default_external = 'UTF-8'

# 現在時刻を取得
d = DateTime.now

# データ格納用変数初期化
data = Array.new(4001).map{Array.new(25,0)} # 2次元配列を初期化
i = 0 # 配列管理用の変数を定義
j = 0 # 配列管理用の変数を定義

# データを変数に格納
File.open('data.txt') do |file|
file.each_line do |labmen|
labmen.split("\t").each do |dat|
data[i][j] = dat.chomp
j = j + 1
end
i = i + 1
j = 0
end
end
i = 0
j = 0

# Win32 ネイティブ版、Cygwin版の違いに関わらず絶対パスを取得する
def getAbsolutePath filename
  fso = WIN32OLE.new('Scripting.FileSystemObject')
  return fso.GetAbsolutePathName(filename)
end

excel = WIN32OLE.new('Excel.Application') # Excel.ApplicationのCOMオブジェクトを作成
excel.visible = true # windowの表示の有無

# ファイルを開く
workbook = excel.Workbooks.Open(getAbsolutePath("FFTtemp.xlsm"))

# Excelファイルに転写
for i in 0..127 do
if data[i][0].to_s == "0" then
break
end

workbook.sheets[1].rows[11 + i].columns[2] = data[i][0].to_s
workbook.sheets[1].rows[11 + i].columns[3] = data[i][1].to_s
workbook.sheets[1].rows[11 + i].columns[4] = data[i][2].to_s
workbook.sheets[1].rows[11 + i].columns[5] = data[i][3].to_s
workbook.sheets[1].rows[11 + i].columns[6] = data[i][4].to_s
workbook.sheets[1].rows[11 + i].columns[7] = data[i][5].to_s
workbook.sheets[1].rows[11 + i].columns[8] = data[i][6].to_s
end

# ファイル名を決定
filename = "FFT_" + d.strftime("%Y%m%d").to_s + "_" + d.strftime("%H%M%S").to_s + ".xlsm"

# 保存
workbook.saveAs(getAbsolutePath(filename))

# 終了処理
workbook.Close # ファイルを閉じる
excel.Quit # Excel.Applicationの終了

# コマンドラインからVBSを利用してアドインの読み込みとマクロの実行
puts `start ./excelMacro.vbs #{filename} FFTupdate128` # start ./FFTupdate128.vbs ファイル名 マクロ名
__ excel.rb ここまで __

重要なのは一番最後の行のexcelMacro.vbsを実行する部分のみです。



__ excelMacro.vbs __
'
' コマンドラインからの実行でExcelのマクロを実行・保存
'
' ※他のexcelファイルを開いているとエラーが発生する模様

' コマンドライン引数(パラメータ)の取得
Set oParam = WScript.Arguments
cnsBook = oParam(0)
cnsMacro = oParam(1)


' 本スクリプトファイルのフォルダ名の取得
strPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "")
' Excelのオブジェクトの参照を取得
Set objExcelApp = CreateObject("Excel.Application")
' 自動起動マクロの抑止(イベント停止)
objExcelApp.EnableEvents = False
' Excelウィンドウを表示
objExcelApp.Visible = True
' 指定のワークブックを開く(同一フォルダ)
objExcelApp.Workbooks.Open(strPath & cnsBook)


' Shell関数を使ってATPVBAEN.XLAMを起動
' ※["""]~["""]で囲む
strPath2 = """C:\Program Files (x86)\Microsoft Office\Office14\Library\Analysis\ATPVBAEN.XLAM"""
Set objWShell = CreateObject("WScript.Shell")
objWShell.Run strPath2, 0, False

' 指定のマクロを実行
objExcelApp.Run "'" & strPath & cnsBook & "'!" & cnsMacro


' 各種の確認ダイアログを非表示
objExcelApp.DisplayAlerts = False
'ワークブックの保存
objExcelApp.Workbooks(1).Save


' イベント停止解除
objExcelApp.EnableEvents = True
' Excel終了
objExcelApp.Quit
Set objExcelApp = Nothing
__ excelMacro.vbs ここまで __

ここで重要なのは、真ん中あたりの

 ' Shell関数を使ってATPVBAEN.XLAMを起動
 ' ※["""]~["""]で囲む
 strPath2 = """C:\Program Files (x86)\Microsoft Office\Office14\Library\Analysis\ATPVBAEN.XLAM"""
 Set objWShell = CreateObject("WScript.Shell")
 objWShell.Run strPath2, 0, False

の部分です。

実はrubyからwin32oleを通してマクロを実行しようとしても上手く動かないのですが、その理由はマクロを実行するために必要なアドインである「ATPVBAEN.XLAM」がwin32oleを通してexcelを実行した際には起動されないからです。(バグ・・・なのかな?)
そこで、これを起動しておいてあげる事によってrubyからマクロを実行することが可能になるということです。



__ FFTtemp.xlsm __

__ FFTtemp.xlsm ここまで __



ここまできて、なぜ.vbsファイルが必要なのか、という疑問が出てくるかもしれませんが、たしか、rubyからでは何か不都合があったような気がしますが、実はこれを書いたのが1年前なのでわすれました。。。
とりあえず、このvbsファイルとその使い方である↓

# コマンドラインからVBSを利用してアドインの読み込みとマクロの実行
puts `start ./excelMacro.vbs #{filename} FFTupdate128` # start ./FFTupdate128.vbs ファイル名 マクロ名


だけ分かれば使えるはずです。

おすすめアニメ ランキング

アニメを見る時に某サイトで評価をチェックすることがありますが、なぜだかそのサイトにはランキング機能がありませんでした。
そこで今回は、スクレイピング(Ruby)とExcelを使用してアニメランキングを作成しました。

スクレイピングに関しては↓を参照。
http://vsanna.sakura.ne.jp/wp/2015/01/scraping_start_up/

説明は面倒なので、結果だけどうぞ↓


順位 タイトル 合計点
100 THE IDOLM@STER - アイドルマスター - 5170
98 プラネテス 5190
98 School Days - スクールデイズ - 5190
97 にゃんこい! 5210
95 夏目友人帳 5220
95 BTOOOM! -ブトゥーム- 5220
94 這いよれ! ニャル子さん 5250
93 みなみけ 5260
92 黄昏乙女×アムネジア 5300
91 さんかれあ 5310
90 true tears - トゥルー ティアーズ - 5320
89 GOSICK -ゴシック- 5360
87 オオカミさんと七人の仲間たち 5440
87 まよチキ! 5440
86 君に届け 5510
85 新世紀エヴァンゲリオン 5570
84 坂道のアポロン 5610
82 ベン・トー 5660
82 人類は衰退しました 5660
81 AIR 5670
80 あの夏で待ってる 5740
79 SHIROBAKO 5760
78 TIGER&BUNNY - タイガー&バニー - 5770
77 翠星のガルガンティア 5810
75 いちばんうしろの大魔王 5860
75 新世界より 5860
74 となりの怪物くん 5880
72 じょしらく 5920
72 四月は君の嘘 5920
71 アマガミSS 5950
70 ef - a tale of memories 5960
69 交響詩篇エウレカセブン 6000
68 日常 6080
66 らき☆すた 6150
66 緋弾のアリア 6150
65 灼眼のシャナ 6160
63 僕は友達が少ないNEXT 6210
63 凪のあすから 6210
62 とある科学の超電磁砲S 6220
61 これはゾンビですか? 6240
60 WORKING’!! 6320
59 銀魂 ~  銀魂'延長戦 6350
58 神のみぞ知るセカイ 6470
57 TARI TARI 6530
56 咲-Saki- 6650
55 東のエデン 6700
54 ヨルムンガンド 6710
53 はたらく魔王さま! 6760
52 ゆるゆり 6940
51 狼と香辛料 7010
50 学園黙示録 HIGHSCHOOL OF THE DEAD 7150
49 やはり俺の青春ラブコメはまちがっている。 7350
48 電波女と青春男 7380
47 ひぐらしのなく頃に 7400
46 アクセル・ワールド 7430
45 パパのいうことを聞きなさい! 7510
44 ちはやふる 7560
43 とある魔術の禁書目録II 7680
42 生徒会役員共 7700
41 デュラララ!! 7840
40 エルフェンリート 7870
39 ハイスクールDxD 8240
38 未来日記 8270
37 進撃の巨人 8320
36 喰霊-零- 8380
35 荒川アンダーザブリッジ 8400
34 妖狐×僕SS 8430
33 バカとテストと召喚獣 8640
32 さくら荘のペットな彼女 8700
31 PSYCHO-PASS -サイコパス- 8880
30 うさぎドロップ 8890
29 IS <インフィニット・ストラトス> 8930
27 中二病でも恋がしたい! 9190
27 ココロコネクト 9190
25 コードギアス 反逆のルルーシュ 9440
25 僕は友達が少ない 9440
24 男子高校生の日常 9590
23 コードギアス 反逆のルルーシュR2 9750
22 花咲くいろは 9770
21 氷菓 9920
20 涼宮ハルヒの憂鬱 10320
19 WORKING!! 10810
18 偽物語 11570
17 けいおん! 11650
16 けいおん!! 12060
15 俺の妹がこんなに可愛いわけがない 12140
14 Fate/Zero -フェイト ゼロ- 12280
13 魔法少女まどかマギカ 13170
12 ギルティクラウン 13400
11 Another 13560
10 とある魔術の禁書目録 13860
9 CLANNAD 13870
8 とある科学の超電磁砲 14440
7 CLANNAD AFTER STORY 15020
6 ソードアート・オンライン 15760
5 Steins;Gate -シュタインズ・ゲート- 15810
4 化物語 18030
3 とらドラ! 19320
2 あの日見た花の名前を僕達はまだ知らない。 20530
1 Angel Beats! 22740


いかがでしたか? 合計点をざっくりと計算しただけなので、色々無理のあるところはあると思いますが、注目度や話題性も込みの評価だと考えるとこんなものかなと思います。



※某サイトの仕様変更のため、データは201507のものを使用。

2016年9月9日金曜日

Excel オートフィル(連続データ)のショートカット

続けざまに新しい記事を。

Excelを使う際に、式を入力した後にセルの右下をダブルクリックしてオートフィル(連続データ)によって下のセルへ内容をコピーすることがあると思います。
以前よりショートカットが無いか気になっていたのですが、この度、見つかりましたので忘れないように。


コピー元のセルを含めてコピーしたい範囲を選択した状態で「Ctrl+D」


のショートカットで実現できます。Ctrl+Dは元々、上にあるセルをコピーするショートカットですが、範囲指定をすることで一気にコピーできる様です。

Excel ダブルクリックせずにセルを編集

些細な事ですが、excelのショートカットを理解し切れていなかったようなので更新。

excelで中身のあるセルを編集する際に、いつもダブルクリックをしていましたが、調べたところ、簡単なショートカットがありました。

「F2」

です。フォルダ名の変更の際によく使うショートカットですが、実はセルの中身を編集する際にも使えるようです。
お試しあれ。

2016年1月5日火曜日

capybaraの導入ubuntu14.04

インストールするだけなのですが、案外時間がかかったのでメモしておきます。

1、rubyのインストール
の辺りのサイトを参考にしました。(後から思い出してるだけなので違ったかも

linux系のOSでも物によって apt-get だったり yum だったり違う様なので注意。


2、capybaraのインストール
2.1、capybaraに必要なnokogiriのインストール

gem install nokogiri

ubuntu14.04の場合失敗するので、gemのインストールに必要な

sudo apt-get install build-essential patch
sudo apt-get install ruby-dev zlib1g-dev

を入れます。

を参考にしながら勧めます。基本的にはubuntuの所にあるコマンドを入力するだけでなんとかなりました。

gemのアップデート(?)もやっておくと良いかもしれません。

2.2、capybaraに必要なqtのインストール
capybaraはqtに依存しているためqtとデスクトップをまず先にインストールする。
以下のコマンドを実行すればok

sudo apt-get install libqt4-dev
sudo apt-get install xvfb
gem install capybara-webkit

上からqt、デスクトップ、capybara本体、の順に入れていきます。


3、capybaraを実行
以下の様なコードを走らせます

require 'capybara-webkit'

browser = Capybara::Webkit::Driver.new('web_capture').browser
browser.visit 'http://test.com/'
browser.render('test.png', 1280, 650)






無事、キャプチャに成功しました。左上にマウスカーソルが出てくる以外は完璧です。

2016年1月2日土曜日

lxdeのデスクトップを2つから1つにする方法

ubuntuのデスクトップとしてlxdeを導入したのは良いが、暇なときにマウスのホイールをコロコロする癖がある自分にとってはコロコロするとすぐにデスクトップが切り替わってしまって邪魔で仕方ない機能の一つだった。
これを解消するには以下の設定を直せばよい。

lxdeのデスクトップを一つにするやり方
「スタートメニュー->設定->Openbox Configuration Manager」を開く。
「デスクトップ」タブを選択し、「デスクトップの数」を2→1にしてやれば完了だ。
あとはタスクバーを占領している邪魔なデスクトップページャを右クリックから非表示にしてやれば完璧だ。

リモートデスクトップのCPU使用率が増加して100%になる現象と解決方法(ubuntu14.04、xrdp)

今回、リモートデスクトップで管理しているubuntuのCPU使用率がだんだんと上がっていき100%になっていることに気がついたため、原因と対処法をまとめる。

1、なぜCPU使用率が上がるのか?
これは経験則だが、リモート接続を放置してスクリーンセーバーが起動した後に復帰すると、妙にCPU使用率が上がっていることに気が付いた。
また、システムモニター(windowsで言うタスクマネージャー)でみるとリモートデスクトップ接続に使われるXvncがいくつも起動しているときがあることに気が付いた。
これは調子が悪い時く「problem connecting や login failed」などでリモートデスクトップが一度でつながらなかったときにタスクが終了されないまま取り残されたと考えられる。

つまり、

ログインに失敗して入り直す
   ↓
失敗した分のXvncプロセスが生き残る
   ↓
時間がたってログインに失敗した側のXvncがスクリーンセーバーを起動
   ↓
スクリーンセーバーの描画でCPU使用率が上がる。

という流れが考えられる。


2、対策方法
ここまで話せば簡単だが、

・スクリーンセーバーをオフにする
・ログインに失敗したときは余分なXvncを終了させる

この2つを行うことでCPU使用率の無駄な上昇を抑えられる。

2016年1月1日金曜日

linux環境でのc++プログラミング

この度、無事にwindowsから遠隔操作できるlinuxの開発環境を整えることが出来たので、早速開発に入って行きたいと思う。

1、linux(ubuntu14.04)にgccを入れよう
linuxにはデフォルトではcのコンパイラは入っていないので、まずはそれをインストールする。
コンソールから以下のコマンドを実行

sudo apt-get install g++

パスワードを要求されるので入力してenter
これで、liux上にコンパイラをインストール出来る。


2、ソースファイルの用意、コンパイルしよう
適当なソースファイルを用意してコンパイルしてみる。
今回は

名前:
main.cpp

内容:
 #include <stdio.h>

int main(void) {
     printf("hello world!\n");

     return(0);
}

というファイルを用意した。
余談だが、ファイルを作るには

touch main.cpp

というコマンドをで新しいファイルを作ることができる。
ファイルが作成されたかは ls コマンドで確かめられる。

ここで、

g++ -o main main.cpp

上のコマンドを実行するとコンパイルが実行される。
すると、main という名前の実行ファイルが作成される。linuxはwindowsのような.exeという拡張子は無い様だ。
-o はコンパイル後の実行ファイルの名前を指定するコマンドで指定しなかった場合は a.out という名前のファイルが生成されるのがデフォルトの設定になっている。
※コンパイル前に cd コマンドでファイルのあるディレクトリへの移動を忘れずに。


3、プログラムを実行しよう
mainという実行可能ファイルが作成されたので、コマンドラインから

./main

を入力すると、先ほどの hello world! が表示されるはずだ。


4、makefileを用意しよう
このままでも十分開発は行えるが、コンパイルのたびにコマンドを打つのは面倒なので、makefileというものを作成する。

新しいテキストファイルを用意して今回の場合は
名前:
makefile

内容:
main : main.cpp
\tg++ -o main main.cpp -O2

を入力しておく。
こうしておくことで、main.cppファイルのソースを更新した後に

make

コマンドを実行するだけでコンパイルが実行されるようになる。
make は makefile に書かれたコマンドを実行する命令なのだ。
最後に -O2 というコマンドが付いているが、これはコンパイルの速さ指定で -O3 にすると一番早いらしいが、上手くコンパイルできないことがあるというのでここでは -O2 を指定してある。



余談だが、開発用のフォルダを「ホームフォルダ」の下に作っておけば

cd ~/[開発フォルダ]

ですぐにディレクトリの移動が行えて便利だ。

ubuntu14.04とwindows7のファイルを共有する方法

ubuntu14.04での開発環境を整えるためにファイル共有は不可欠。
やってみると少しだけポイントがあったので忘れないように抑えておく。

1、ubuntu側の設定
ubuntuにはデフォルトでファイル共有を意識したツールが入っているが、14.04では途中上手く動かなかった。
まず、共有したいフォルダを作り、「右クリック->ローカルフォルダの共有」という様な項目があるのでクリック。このとき、デスクトップがlxdeだとその項目が存在しなかったため、デフォルトのデフォルト環境でログインし直した。
続いて「フォルダの共有」という設定画面が開くので「このフォルダを共有する」など、全ての項目にチェックを入れる。
「共有を作成」をクリックするとインストールしていない場合、ソフトのインストールが始める。
ただし、この時14.04だと途中でインストールが止まるバグが有るらしい。
そのため、再起動して

sudo apt-get install libpam-smbpass

を実行、最後にインストールしきれなかった項目をコンソールからインストールする。
reference:http://j-jay.biz/blog/?p=3556

2、windowsからの共有フォルダの開き方
「コンピュータ->ネットワーク」を開けば表示されると思ったのだが、自分で探しに行かないとアクセス出来ないらしい。
アドレスバーに

\\ipアドレス\フォルダ名

を入力してenter。これで共有フォルダにアクセスできるようになる。
ipアクセスはubuntuのコンソールから hostname -I を実行すれば調べられる。
reference:http://mower.hateblo.jp/entry/2015/06/03/112350

ubuntu14.04のリモートデスクトップで日本語入力を行う方法

「せっかくリモートデスクトップを出来たのに入力してみるとアルファベットしか入力されない...だと...」

という状況だったので色々と調べてみました。

1、病状の詳細
ただ単に日本語入力が出来ないのかと思っていましたが、よく状況を見てみたところ
・日本語キーボード配列になっていない
・全角文字入力が出来ない
という2つの病状が現れていることが分かりました。これを順番に解決していきます。

2、日本語キーボード配置に直す方法
Shift+3ボタンで「#」が表示されれば問題ありません。日本語配列です。このとき「@」が表示された人は英語キーボード配列になっています。
コンソールを開いて

$ sudo su -
<ユーザのパスワードを入力する>
# cd /etc/xrdp
# wget http://www.mail-archive.com/xrdp-devel@lists.sourceforge.net/msg00263/km-e0010411.ini
# mv km-e0010411.ini km-0411.ini 
# chmod 644 km-0411.ini 
# ln -s km-0411.ini km-e0010411.ini 
# ln -s km-0411.ini km-e0200411.ini 
# ln -s km-0411.ini km-e0210411.ini
# /etc/init.d/xrdp restart
# exit
$

を実行していきます。これでwebで公開されている日本語キーボード配列のデータを所定の場所へ保存することが出来ます。これによって日本語配列のキーボードに対応します。
reference:https://forums.ubuntulinux.jp/viewtopic.php?id=13399

3、日本語入力(全角文字入力)出来るようにする方法
自分はlxdeというデスクトップなのでそれに添って説明していきます。
「スタート->設定->入力メソッド」より「インプットメソッド設定」を開きます。
順に「ok」「はい」をクリック。
日本語入力に対応していると思われる「iBus」を選択、「ok」、「ok」をクリック。
iBusはデフォルトでは起動しない様ですが、これをすると起動時に立ち上がってくれるみたいです。

次に、「スタート->設定->キーボード・インプットメソッド」でIBusの設定を開きます。
「入力メソッド」タブから「アクティブな入力メソッドのカスタマイズ」にチェックを入れます。
「入力メソッドの選択」が変更出来るようになるので、「日本語->Mozc」を選択します。他の「Anthy、Japanese」でも良いかもしれませんが、やってないためそこまでは分かりません。

これらの設定が終わった後PCをシャットダウン、再起動します。


上手く行けば、以上の手順で日本語配列、日本語入力が可能になるはずです。