読者です 読者をやめる 読者になる 読者になる

rubyでループ中に配列の要素を消すと全部見てくれない問題

f:id:panchiga:20150531002115p:plain

はじめに

ruby使ってて配列の要素がいらない値だったら消去したいなって思った。

each使ってやったら最終的に配列の中は思ってた値とは違った値が取れてなんだこれってなったので書いた。

コードと動作

gist56ee98442dc747b26f67

このコードで望んだ出力結果は

1 4

だけど実際は

1 3 4

あれ?3消えて無くない??

ちなみに.eachのところを.timesに書き換えても同じ。

原因

[1,2,3,4]から2を削除したら[1,3,4]となる。

だけどカウンタの値は2のまま。次に進んだら新しい配列の3つ目、つまり4を見てしまうためだと思われる。

解決策

.eachが先頭から順に見ていくので、後ろから見ていく.reverse_eachを使えば幸せ。

やったね。

gist78fc964f3e034b8b0d81

出力結果は

1 4 

感想

神の作ったと思っていたruby様も人が作ったものなんだなって感じた。いや、神はこんな書き方をしないから凡人が合わせるしかないのかもしれない。

何はともあれ解決できてよかった。

前の記事の続きのモーターを動かす奴はしばらく触ってない。

DCモーターを制御する

f:id:panchiga:20150415001316p:plain

はじめに

DCモーターの回転速度を制御することは出来るのかなと思い、ググってみた。すると出来るっぽいという事がわかったので早速やってみようと思った。どうやってやったっけなってなった時に思い出せる様に書いておく。

 

使ったもの

TA7267BPについて

f:id:panchiga:20110428133509j:plain

モータードライバ。

左のピンから

  1. in1 (Arduinoのanalog出力その1)
  2. in2 (Arduinoのanalog出力その2)
  3. out1 (DCモータの+か-)
  4. GND
  5. out2 (DCモータの-か+)
  6. Vs
  7. Vcc

 

動作電源電圧範囲 : VCC (opr) = 6~18V、VS (opr) = 0~18V

データシート(http://akizukidenshi.com/download/ta7267bp.pdf)

 

回路

f:id:panchiga:20150414235609p:plain

 

参考サイト(PIC AVR 工作室別館 ”arduinoの館 - 接続くん DCモーターの接続”)

で書かれていた回路を再現しようとしてこんな感じになりました。

回路分かる人が見たら呆れそう…

 

コード

gist14db2c4a99707a511026

 

動作

参考サイトのコードをコピって分岐書き換えただけ。

スイッチ押してる間は動く。離すと止まる。

速度を書き換えると速さが変わる。そんな感じ。

 

感想

一応動かす事ができたが理解が浅い。こんな回路作り続けてたら絶対にパーツを壊すと思う。だが何を調べたらいいのか分からないみたいな状態でもある。師匠がほしい…

 

作りたいものがあるのだがその1歩としてやった。次はブラウザからシリアル通信で回転速度の変更を試す予定。

参考

nekosan0.bake-neko.net

 

 

HHKB Pro2を修理したらキーボードになって幸せな話

はじめに

約1年前に友人にHHKB professional2(以下HHKB Pro2)を頂いた。

HHKB Pro2とは、キーボードにちょっとでも興味があったら知らない人はいないであろう、超有名な超打ちやすいと噂の静電容量無接点式キーボード。

f:id:panchiga:20150226022625j:plain

PFU Happy Hacking Keyboard Professional2 墨 英語配列 静電容量無接点 USBキーボード Nキーロールオーバー UNIX配列 WINDOWS/MAC両対応 ブラック PD-KB400B

 

頂いた経緯として、USBコネクタが壊れて使えない状態になってしまい、修理頼むくらいだったら新しいの買うって事になって、捨てるならもらえないか?って感じで頼んだら頂けた。うれしい!

あっさり治せるかと思ったけど意外とそうでもなくて1年放置してたけどふと思い立って昨日直してみたら直ったので手順でも書いておこうと思う。

 

準備

 

修理前の状況

HHKBのミニUSB端子が取れてそれを直そうとしたせいで基板の"4"のパターンが剥がれている状況だった。

f:id:panchiga:20131022141334j:plain

掃除もしていなかったのでまあ汚い。キーキャップが乗ってる方取り外して水でジャバジャバしたら引いた…

こんな感じでジャンクって言葉が似合う感じの状態だった。

 

修理した手順

手順といっても単純で、

  1. HHKBをドライバーでバラす
  2. USBコネクタの刺さってる(刺さっていた)基板を取り外す
  3. 新たなUSBコネクタをくっつける
  4. 直った!やったぜ!

という感じ。

ついでにキーボードの掃除もしたが、"キーボード 掃除"とかでググって出てきた物を参考にした。

 

実践

今回取れていたのはUSBコネクタなわけだが、USB端子には5本の線がある。今回完全にどうしようもないところまで壊れていた部分はいわゆる"4"の部分で、"ID"という役割を果たしてる部分だった。

 

PinFunction
1V_BUS
2D-
3D+
4ID
5GND

f:id:panchiga:20150226145418j:plain

 

この端子はどうやらぱそこんを介さないでUSB機器同士でやりとりする場合に使われるものらしくて*1、あれ?今回関係なくないか?て思って完全に無視してそこには半田付けを行わないで他の部分を半田で固定した所、なんか動いた

 

f:id:panchiga:20150225160753j:plain

端子一つ一つがすごい小さいのでハンダ付け不慣れな手にはなかなかきつかった。

 

 なんて幸せな音なんだ…

 

まとめ

  • ハンダ付けちょっとうまくなった…?
  • 写真をちょいちょい撮っておかないとブログで見せられなくて寂しい
  • キーボード掃除すると新品みたいになって最高って感じ
  • USBのピン4はあまり意味が無い

 

感想

ゴミとして捨てられていたHHKB Lite2を拾ったのが1年半前で、その何ヶ月か後にジャンクなHHKB Pro2もらって、今使ってるTruly Ergonomic買って、この1年半はキーボードの期間だったなと思う。

余談だが、キーボードの上段のQWERTなんちゃらって行、並び替えると"POWER" と "QUIT" が作れて筋肉配列っぽいのが作れる。"Y"は余る。

QWERTなんちゃら配列が見るのも嫌な人はキーキャップ並び替えて遊ぼう!!!!

 

おまけ

Truly Ergonomicに慣れすぎて板チョコな配列がめっちゃつらい! エンターとBSとTABが遠くてとてもつらい!!

使えるようになったのはいいけどどうしたもんか…

2015年プログラム書き初め

 

はじめに

一昨年は書き初めにCで素数を出力するプログラムを作った。60行くらいでできて、役にも立たないあんまり面白くないものだった。

去年は書き初め何にしようか考えてたら2月になってたから書いてない。

それで今年は役に立つものを作ろうと思った。

 

f:id:panchiga:20150102044246p:plain

作業中に動画を流すということをよくやるのだが、某動画サイトを見てる時に一つの動画が終わった後次の動画に変えるために一度作業を中断して、また作業に戻って集中し直す。

これが微妙にめんどくさかった。

なのでこれを、また自動化した。

 

プログラムの流れ

1. 某動画サイトのURLを入れる

  • input site url:
  • ここで正しいURLを入れられればちゃんと動く

2. 見たいタイトルを正しく入力する

  • input PERFECT title:
  • 大文字とか小文字とかの処理をしてないのでこれもまた正しく入力しないと動かない

3. どこからどこまで見るかを決める

  • input 1 or 2の部分
  • -> 1を入力すると"1から25"
  • -> 2を入力すると自分で範囲を決められる

4. 1つの動画が終わったら次の動画に遷移する

5. 最期の動画が終わるとプログラムが終了する

 

コード

gist62d1eb2b2eb378a2b016

 

まとめ

  • Seleniumはすごい便利
  • 自動化最高
  • やっぱりrubyはいいなあ…

 

感想

*1の役に立つものを作れる様になったので成長を感じる…

本当は日記帳でも作ろうかなあって思ってたんだけど思ったよりjavascript難しくて1日じゃ絶対終わらないぞっていうことで急遽今回のものになった。

 

ところで動画見ながら作業ってたぶん絶対はかどらないですよね。

 

最期に今年の抱負です。

f:id:panchiga:20150102044203p:plain

 

参考

RubyでSeleniumを使ってスクレイピング - Qiita

Selenium WebDriver

ruby - Selenium-Webdriver: Get attributes after finding an element - Stack Overflow

Web書道.com

 

*1:自分

DDRの難易度を移動距離で評価し直してみた

 

クリスマスでも音ゲーやってる皆さんこんにちは。

この記事は音ゲーマー達の発信所(4枠目)の24日目の記事です。 

#音ゲーマー達の発信所 (4枠目) Advent Calendar 2014 - Adventar

 

前の人: op31_lyricism

次の人: R7iF

  

今回はDanceDanceRevolutionについての記事を書きました。

f:id:panchiga:20141224020255p:plain

 

はじめに

「Spanish snowy dance激が15なわけがない! 詐欺だ!」とか「FLOWER鬼は17レベルもない! 逆詐欺だ!!!」的な、表記されているレベルに見合っていないのではないか?って曲があると思う。

 

もしも「俺は15レベルならもしかしたらクリア出来るかも知れないけど、16は無理…」って人が16レベル相当の15レベル曲をプレイしてしまったら結果はたぶん悲しい事になると思う。

 

そこで、「曖昧なレベルって言う基準じゃなくてもっと明確な基準を作ればいいんだ」って事で今回は移動量を基準にしてむずいランキングを作りました~。

 

計算方法

単純に移動距離だけだとノーツ数多いやつが勝つに決まってるので、BPMなども加味して考えたのが以下の式。

 

疲れる度 += (今のBPM * 2ノーツの距離 * 四分の何倍か) / 2ノーツの隙間

疲れる度を求めたあと、偏差値を求める。

 

用語について

2ノーツの距離: 前に(右|左)足で踏んだノーツと今(右|左)足で踏んだノーツとの距離

  • 上→下など、反対の位置は56cm
  • 上→右など、隣の位置は40cm
  • 上→上など、縦連は足をあげる高さとして30cm
  • ジャンプはパターン分け直すのめんどかったので全部80cm

2ノーツの隙間: 上と同様にその隙間

gistadefa2394c90c3eda7c6

だったら"2"みたいな

四分の何倍か

八分なら四分の2倍速いから"2"みたいな

 

DDRの譜面は基本的に交互に踏むようにできてるのだが、たまに交互に踏もうとすると回転しないといけない時がある。

しかし、そういう場合とかを考えるとちょっとめんどいので、今回は腰のねじりに制限のない人を想定して作った。

 

#腰のねじりに制限無さそうな人 

f:id:panchiga:20141224194528j:plain

流れ

1. ddr_travel.rb移動距離を求める。

2. 1で求めた値をtravel.csvに追加していく

3. すべての曲が終わったらcalc_std.rb偏差値を求める

4. 3で求めた値をresult.csvに書き込む

5. result.csvを偏差値順に並び替える

 

コード

rubyで書いた。ちょっと長いのでリンクを。

わあいスパゲッティ~~~

 

対象曲

たまたま持ってた1stからX3までと嘆きの樹。

激譜面鬼譜面のみ。

合計745譜面!

 

むずいランキング

全文はここのall_result.csvで公開。

all_result.csv (https://github.com/panchiga/DDR_travel/blob/master/all_result.csv)

今は20レベル表記だが、旧曲だと10レベル表記なのでたまに10とか9が不思議なところにいるのがすごい嫌。Xからだけだと寂しいし仕方ないね…

あと、今は入ってない曲とかコースとかかな?が入っちゃってるけど分かる人が楽しむ感じで。

 

全部出すと本文より長くなりそうだったので上位30曲を順に並べた。

 

gist63e058505a2b4946748c

 

結果を見てみて

足19曲、両曲とも堂々の偏差値100超え!!!!!!

すごい!!

足18曲がやっぱりすごいけどそこに混じってくる16とか17はなんなんだろう

NEPHILIM DELTAがトップ30に入ってるのがちょっと面白い。運動量だけで言えば確かに疲れるから納得はできる。

Δ MAXどっちも17のくせして顕著な差がでたね…

FLOWER鬼(元17)、これ見る限りでは888激(14)より弱いね

 

課題点

ソフランとストップをどうしたら難しさとして数値に正しく出せるかを考えたい

・フリーズ踏みながらもう片足で捌くみたいなのの場合を今回考慮してないのでそのへんも課題点

・DPの対応も出来ないことはなさそうだし次の課題だ 

まとめ

  • 足19はやっぱりおかしかった
  • 偏差値的な値は分かりやすい
  • 10段階と20段階を混ぜると危ない
  • オブジェクト指向できてない!
  • rubyのコピーちょっとなんなんだ

感想

わりと正しい感じの値が出てよかったなあと。ただ、レベル毎にソートしてグラフを出したかったんだけどそれが出せなかったのが残念。

趣味で書くプログラムは本当に楽しいなあ…楽しかったなあ…

コードレビューお願いします!お願いします!コードレビューじゃなくても、もっといい計算式とかあるよって人、コメント待ってます。

 

最期に

Aizuアドベントカレンダーに参加させて頂いて記事を書いたら燃え上がって、人気ブロガー気分味わえて楽しかったです。見てない人は見てね!!

FF10の雷除けを自動化した話 - panchiga's blog

 

 

FF10の雷除けを自動化した話

これはAizu Advent Calender 2014の9日目の記事です!

Aizu Advent Calender 2014

 

前の人: @MiZuKi_Sonoko

mizukindevelop: Hackathonに参加しよう {Aizu Advent Calendar 2014 [8]日目}

次の人: @a_r_g_v

 

はじめに

FF10はみんな知ってるよね?

FF10には七曜の武器っていう伝説の武器みたいなものがあって、入手方法がゲーム中のミニゲームをなんかすごいやるみたいな感じ。

例)

その中で巨乳おっぱいさんルールーの「雷平原のサブイベント・雷除けを200回連続で成功する」というものがある。

おっぱいさん

f:id:panchiga:20131228210446j:plain

 

雷除けとは

画面が光ったら◯ボタンを押す。それを200回繰り返す。そんな作業。


雷平原 雷避けチャレンジ20140517 - YouTube

 

 

こんな作業を人間がやる必要無くないか…じゃあ自動化してみよう!!!ってなったので

自動化をしてみた。

 

準備

今回使った物

 

 手順

  1. Webカメラから画面をキャプチャする
  2. キャプチャした画面情報から光ったかどうかの判定
  3. 光っていたら◯ボタンを押させる
  4. 光ってなかったら↑ボタンを押させる

 

コード

gist086a1a0c2a2bc05a70c2

 

gistf19a396b0924a1ba547d

 

配線

f:id:panchiga:20141209083845p:plain

 

 

f:id:panchiga:20141202043020j:plain

きったね

 

グランドか電源かわからないけど黄色の線が繋がってるのがリレーの入れ替わらない部分。

青色で繋がってるのが◯ボタン

灰色でつながってるのが上ボタン

 

灰色のとこから伸びてる黄色は上以外のボタンを押したい時に使う用

灰色のとこから伸びてる赤色は意味が無さそうので気にしないで…

 

それにしてもひどいな… 

 

動かす


[ff10]雷除けの自動化 - YouTube

 

動いてるね

 

 200回達成!!やったぜ!!!!

 

辛かったこと

Webカメラが勝手にホワイトバランスとか調整しちゃうのでミスが出る。それに気づくまで何が悪いのか全然分からなくて閾値とかスリープの時間とか変えたりしてわからんわからんってしてた。Logicoolwebカメラ使ってたので公式で配ってる調整ソフト(?)使って解決できてばんざい! 

トランジスタがなかったけどたまたまリレーがあって良かった。

 

まとめ 

  • PSコントローラーの基板直接使えばPC側から操作できるの最高
  • pythonシリアル通信超簡単
  • OpenCV強い
  • Arduino便利
  • リレー便利

 

感想

手でやりたくないことを機械にやらせよう的な事が計算みたいにコンピュータの中だけで済ませていたものから、PS2のゲームをやらせる的な現実の世界にまで飛び出して、行動の幅と言うかまさに世界が広がったなって感じがしてる。

電子工作って面白いなあって思いました。

 

次の人 → @a_r_g_v

 

 

Arduinoをはじめようキット

Arduinoをはじめようキット

 

 

【永久保証付き】Arduino Uno

【永久保証付き】Arduino Uno

 

 

 

openCV使いたい…openCV使いたくない?

f:id:panchiga:20140717031812p:plain

はじめに

以前opencv使いたいなーって思ってOpenCV2プログラミングブックという書籍を参考にやってて途中で飽きて放置していました。
 
その本ではmacportsを使っているのですが、当時と違い私はhomebrewを使うようになってしまいました。
その為競合が発生するとのことで、もうmacportsが使えない体になってしまいました。
 
するとOpenCV2プログラミングブック通りには進められないので一工夫必要でした。なのでその苦労を書きます。
 
HomebrewでopenCVというのを紹介してるブログはいっぱい有るのでそのへんは適当にぐぐりましょう。
 
$brew install opencv
 
ここでは躓かなかったとします。
 

早速使う

早速サンプルプログラムを動かしてみようとしたところ、無理やでwって言われた。
brew installしたらパスは勝手に通ってるのではと思っていたので、
 
$g++ test.cpp
 
とかやってたので 
#include <opencv2/opencv.hpp>
         ^
1 error generated.
とかいうエラーくらってなんでだろうなあとか思ってました。
 
つまりincludeするファイルはどこにあるのかを教えてあげないといけないのです。
 
g++のオプション

今回使うオプション

-L :ライブラリファイルのディレクトリを指定する。
-I :インクルードファイルのディレクトリを指定する。
 

解決した 

g++ test.cpp -I /usr/local/Cellar/opencv/2.4.9/include/opencv2 -I/usr/local/include -L/usr/local/lib -lopencv_highgui -lopencv_core

 
死ぬほど長いですね。
でもお陰で無事にコンパイルできて実行ファイルが出力されました!やったね!
 

まとめ 

g++力があまりにも足りませんでした。あとググり力も足りませんでしたね。
さて次は-L /usr/local/libに何がいるのかを知る必要がありますね。
 

感想

なんというか、知らないことが多すぎるなあって感じでした。
何かを使う時、何が書かれてるか考えないでコピペするのはとても駄目ですね。せめて意味を理解してから使おうって思いました。
openCV使えると面白いことがいっぱいできそうなのでいっぱい使っていこうと思います。