<ruby> grep ぽいことするやつ作った

新しいMac買ってしまった
お金やばいのも多少あるけどそれ以上にサクサク動いて快適

grepぽいことするやつ作った

grepってコマンドあるじゃないですか。
ファイルの中身とか検索するあれ
あれってwindowsで使えないじゃないですか
互換はあるけど使い方で見れば別物なのでなんともっていう

そこで同じように使うとなったらプログラム書くしかなくねとなり書きました。

目次

  1. 今回の目的
  2. 作ったもの
    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. 使ったもの
  2. 作ったもの
  3. 感想

1.使ったもの

今回は以下のものを使います

部品名 点数
arduino 1
TMP36センサ 1
LCDモニタ 1
USBケーブル 1
ブレッドボード 1
適量
モバイルバッテリー 1

モバイルバッテリーは電源用です。まぁ電源ケーブルなりなんでも好きなもの電源にしてください。

2.作ったもの

arduinoのアナログピンにセンサを繋いで出力用のLCDもつなぐと動きます。

ちなみに今回使ったLCDは昔紹介したキットについてきたやつを使いました。I2C通信で表示を制御しています。

poolbooyer.hatenablog.jp

2.作ったもの

回路は今回はブレッドボードにグサグサしました。

f:id:poolbooyer:20190527225648j:plain
グサグサした様子

わかりにくいので一覧を出しとく

ピン(パーツ) 接続先(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);
}

そうすると

f:id:poolbooyer:20190527225445p:plain
シリアル画面で見た様子

そして、

f:id:poolbooyer:20190527225733j:plain
LCDで表示してみた様子

って感じで表示できます。

3. 感想

今回はなんとなくArduino Unoを使いましたが、多分Nanoにして小型の電源にしておけばIoT的な使い方ができそうって感じですね。
今後使いたいと思ったら改造してみます。

っていうのを書いてる最中に

poolbooyer.hatenablog.jp

このエントリを思い出した。
今回はちゃんとデータシート見て温度計算方法確認して作りました。えらい!!!
この画像の撮影時刻23時ごろなのですが我が家で一番暑い部屋なので25度を超えてます。
やっぱり日本暑いよ、、、沖縄行きたい(日本)、、、、、以上です。。。。。


これは本編じゃないよ

poolbooyer.hatenablog.jp

これは進展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円のみ決済

カードについて

  • JCBプリペイド
    • チャージ額以上の使用はできない
  • 利用状況
    • iTunes
      • 楽曲購入時に近い金額をチャージ
    • Amazon
      • 購入時に近い金額をチャージ

わかっていること

問い合わせ関連

  • 問い合わせ時には決済店舗の情報が必要
    • 問い合わせ作業はそれまで待機

状況からの推測

  1. ランダムなカード番号に対して100円の請求をしまくる
  2. 決済が成功したらクレジットカードが生きていることがわかる
  3. 生きているカードに対して高額製品を購入しまくり

という手口なのかのと推測しています。
今回はプリペイドという特性上

  1. ランダムなカード番号に対して100円の請求をしまくる(成功)
  2. 決済が成功したらクレジットカードが生きていることがわかる(成功)
  3. 生きているカードに対して高額製品を購入しまくり(失敗)

で残高で支払いが可能だった100円だけ取られて終わった感じでした。

f:id:poolbooyer:20190427154646p:plain
100円引かれたときの情報(画像は加工しています)

ちなみに失敗した決済の情報がこちら

f:id:poolbooyer:20190427154759j:plain
決済に失敗した通知

感想

感想もへったくれもねーよ!!って感じある

  • 寝る前に気づいたのが良かったのか悪かったのか、対応しててあんまりねれなかったのブチギレ
  • 普通のクレカの方にやられなかったのある意味奇跡
  • 不要になったカードは即解約するようにしようと学んだ

正直被害額100円なので放置してもいいんですけどせっかくの(?)機会なのでこういうときの対処法を学ぶことも兼ねてLINE pay事務局に問い合わせします。多分10連休何もできないからしばらく先の話ですね。 だるっ、、、