<ruby> grep ぽいことするやつ作った
新しいMac買ってしまった
お金やばいのも多少あるけどそれ以上にサクサク動いて快適
grepぽいことするやつ作った
grepってコマンドあるじゃないですか。
ファイルの中身とか検索するあれ
あれってwindowsで使えないじゃないですか
互換はあるけど使い方で見れば別物なのでなんともっていう
そこで同じように使うとなったらプログラム書くしかなくねとなり書きました。
目次
- 今回の目的
- 作ったもの
2.1 ファイルの取得
2.2 取得したファイルの検索
2.3 検索結果の出力
3.できたもの
1.今回の目的
目的はほぼ最初のところに書いてしまっている。
なのでさらに詳細まで書きます。
今回の最終的な目的としてはドラッグ&ドロップで対象ファイル選んでキーワード、条件に一致するやつを検索するようなものを完成させるのが目的になっています。
最初っから一気に完成形を目指せる自信は皆無なのでまずはコマンドで使えるようになればいいかなということで作成します。
今回のゴールとしては
grep-test poolbooyer$ grep -n index data/* data/sample1.txt:3:index data/sample1.txt:4:index data/sample1.txt:5:index data/sample1.txt:6:/index.htm data/sample1.txt:7:index data/sample1.txt:9:/index.html data/sample1.txt:10:/index.htm data/sample2.txt:3:/assets/js/index.js ...
的なものを作ります。
ただ、このままだと微妙に見づらさがあるので、出力形式を以下のようにします。
file名 行数:ヒットした文字列 行数:ヒットした文字列 file名 行数:ヒットした文字列 ...
なんかいい感じに同じファイル単位でまとめて表示するようにします。
2.作ったもの
ということで実装していきました。
今回の流れとしては
ファイル一覧取得->ファイル内容取得->ファイル内部検索->結果出力
でいきます。
この時検索する語句と対象はコマンドライン引数で引っ張ってきます。
ruby serch-eg.rb フォルダ名 検索語句
最初二つはDirで取得して、fileopenなので今回は
ちゃんと書きます
2.1 ファイルの取得
まずはファイルの情報を取得します。
検索対象のフォルダの中身を確認します。
その後、検索対象の中身を取得します。
今回はファイル名とファイルの中身を1つの配列で返すようにしました。
まずはフォルダの中身の確認と取得するところを呼び出すところまで
# 引数のフォルダの中身を確認する fi=Dir::entries(ARGV[0]) # 結果を取扱う配列 data=[] # フォルダ中身全てに対して for i in 0..(fi.length-1) do if fi[i].length>2 then # ファイルの中身を呼び出して配列に追加 data.push(read_file(ARGV[0]+fi[i])) end end
read_fileに渡しているARGV[0]+fi[i]はファイルへのパスです
その上で読み出すプログラム
def read_file(path) r_data=[] r_data[0]=path File.open(path,"r") do |f| r_data[1]=f.read end # 読み込んだデータとファイルのパスを返す return r_data end
的な感じです
2.2 ファイルの検索
読み込んだ情報をもとにしてその中身を検索します。
targetには読み込んだデータ、queryには検索する文字列が入っています。
def search_infile(target,query) # 検索結果 res=[] for i in 0..(target.length-1) do # 文字列を含むか検索 if target[i].include?(query) then res[i]=true else res[i]=false end end # 検索結果を返す return res end
2.3 結果の出力
検索と出力が1つのプログラムにまとめてます。
ここは分割する予定です。
検索するプログラムにコマンドライン引数で受け取った検索文字列と読み込んだファイルのデータを渡すところから
query=ARGV[1] search_each(data,query)
そして、2.2のプログラムを呼び出します
def search_each(data,query) data.each do |line| # line[1]にあるファイルの中身を改行単位で配列に分割 target=line[1].split("\n") # 検索結果を取得 res=search_infile(target,query) # 検索結果をカウント count=0 # ファイル名称を出力 puts line[0] # 検索結果を参照 for i in 0..(res.length-1) do # 一致していたら出力 if res[i]==true then puts "L#{i+1}: #{target[i]}" else count+=1 end end # 1つも一致しなかったら"Not found"と出力 if count==(res.length) then puts "Not found" end # ファイルの結果の間に一行あける puts "" end end
3.できたもの
ということでこれを実行するとこんな感じになります
grep-test poolbooyer$ ruby ./searcher/search-eg.rb data/ inde data/sample4.txt L1: index L2: /index.htm L3: index L7: index L8: /assets/js/index.js L9: index L10: /index.html data/sample5.txt L1: inde ... grep-test poolbooyer$ ruby ./searcher/search-eg.rb data/ fuga data/sample4.txt Not found data/sample5.txt Not found data/sample1.txt ...
これで期待する結果の出方になりましたー!
ちなみに今回のコードは以下にあります
github.com
(search/に入ってます、検索対象にするデータはscript/generator.rbを使って生成してます)
まだ直しが入る予定なので今回はここまで
<arduino>温度計作ったよ
暑くないですか?
僕は暑いと思います。 (?)
部屋に温度計がなかったので逸般の誤家庭に1つはあるであろうarduinoとTMP36センサを使って温度計を作ります。 特にIoTしたってほどでもないのでメモがてらちょっとだけ書きます
目次
- 使ったもの
- 作ったもの
- 感想
1.使ったもの
今回は以下のものを使います
部品名 | 点数 |
---|---|
arduino | 1 |
TMP36センサ | 1 |
LCDモニタ | 1 |
USBケーブル | 1 |
ブレッドボード | 1 |
線 | 適量 |
モバイルバッテリー | 1 |
モバイルバッテリーは電源用です。まぁ電源ケーブルなりなんでも好きなもの電源にしてください。
2.作ったもの
arduinoのアナログピンにセンサを繋いで出力用のLCDもつなぐと動きます。
ちなみに今回使ったLCDは昔紹介したキットについてきたやつを使いました。I2C通信で表示を制御しています。
2.作ったもの
回路は今回はブレッドボードにグサグサしました。
わかりにくいので一覧を出しとく
ピン(パーツ) | 接続先(arduino) |
---|---|
センサ Vcc | 5V |
センサ Vout | A3 |
センサ GND | GND |
LCD Vcc | 5V |
LCD SDA | A5 |
LCD SCL | A4 |
LCD GND | GND |
そしてスケッチ
#include <Wire.h> //I2Cライブラリ #include <LiquidCrystal_I2C.h> // センサの繋がるanalogポート番号 int io = 3; LiquidCrystal_I2C lcd(0x27,16,2); void setup() { // デバッグ用にシリアル通信を開始 Serial.begin(9600); lcd.init(); } void loop() { // 温度状況を格納する変数 double value; double temperature; //センサからの値を格納 value = analogRead(io); //センサからの電圧値を変換 temperature = (value/1024.0)*5.0; temperature=(temperature-0.5)*100.0; //温度情報をシリアル送信 Serial.print("temp="); Serial.print(temperature); Serial.println("C"); //遅延関数 delay(1000); // LCDのカーソルを設定 lcd.setCursor(0, 0); // LCDのバックライト点灯 lcd.backlight(); //文章を表示 lcd.print("Now Temp is"); //二行目に移動 lcd.setCursor(0,1); //温度を表示 lcd.print(temperature); }
そうすると
そして、
って感じで表示できます。
3. 感想
今回はなんとなくArduino Unoを使いましたが、多分Nanoにして小型の電源にしておけばIoT的な使い方ができそうって感じですね。
今後使いたいと思ったら改造してみます。
っていうのを書いてる最中に
このエントリを思い出した。
今回はちゃんとデータシート見て温度計算方法確認して作りました。えらい!!!
この画像の撮影時刻23時ごろなのですが我が家で一番暑い部屋なので25度を超えてます。
やっぱり日本暑いよ、、、沖縄行きたい(日本)、、、、、以上です。。。。。
これは本編じゃないよ
これは進展0だよ、100円ドブに捨てたと思うしかないね
<事件>クレジットカードを不正利用されかけた(part 1)
なんと、クレジットカードを不正利用されかけました!
その時の状況をまとめました!!!!!!
みんなも気をつけてね!!!!!!!!!!
マジブチ切れ!!!!!!!
今回はほぼメモみたいな感じです!!!!
状況変わったらpart2書きます!!!!!まじブチギレ!!!!!
状況
2019/04/26
Time | event |
---|---|
0:27 | LINEウォレットから100円決済の通知 |
0:28 | 身に覚えがなかったので使ってそうなものを調査 |
0:45 | 関連しそうな利用履歴見つからず |
0:46 | LINE ウォレットを確認 |
0:47 | 高額決済に失敗(残高不足)した通知を発見 |
0:50 | プラスチック、バーチャルカードどちらも利用停止手続き |
0:51 | 手続き完了 |
3:30 | 決済に失敗(機能停止)の通知 |
利用され(そうになっ)た金額
時間 | 金額 | 決済 |
---|---|---|
0:27 | 100 | 済 |
0:39 | 91,756 | 失敗(不足) |
0:40 | 91,756 | 失敗(不足) |
0:45 | 48,578 | 失敗(不足) |
3:30 | 0 | 失敗(停止) |
total | 232190 | 100円のみ決済 |
カードについて
わかっていること
問い合わせ関連
- 問い合わせ時には決済店舗の情報が必要
- 問い合わせ作業はそれまで待機
状況からの推測
- ランダムなカード番号に対して100円の請求をしまくる
- 決済が成功したらクレジットカードが生きていることがわかる
- 生きているカードに対して高額製品を購入しまくり
という手口なのかのと推測しています。
今回はプリペイドという特性上
- ランダムなカード番号に対して100円の請求をしまくる(成功)
- 決済が成功したらクレジットカードが生きていることがわかる(成功)
- 生きているカードに対して高額製品を購入しまくり(失敗)
で残高で支払いが可能だった100円だけ取られて終わった感じでした。
ちなみに失敗した決済の情報がこちら
感想
感想もへったくれもねーよ!!って感じある
- 寝る前に気づいたのが良かったのか悪かったのか、対応しててあんまりねれなかったのブチギレ
- 普通のクレカの方にやられなかったのある意味奇跡
- 不要になったカードは即解約するようにしようと学んだ
正直被害額100円なので放置してもいいんですけどせっかくの(?)機会なのでこういうときの対処法を学ぶことも兼ねてLINE pay事務局に問い合わせします。多分10連休何もできないからしばらく先の話ですね。 だるっ、、、