コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

ディレクトリに含まれるファイルを拡張子別にカウントするRubyのコードを書いてみた

ググったらWindowsでの知見しか出てこないので、Rubyでサクッと作ってみた。Macならこれを書き換えればカウントできます。

環境

$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16]

コード

require 'find'

# @param [String] target_path ファイルを計測したい親のパス
# @return [Hash] Keyに拡張子、valueにカウント数が入ったHash
def extname_count_hash(target_path)
  hash = {}
  Find.find(target_path) do |path|
    # ディレクトリの場合はスキップする
    next if FileTest.directory?(path)
    extname = File.extname(path)
    hash[extname] = 0 unless hash.has_key?(extname)
    hash[extname] += 1
  end
  hash
end

※ちなみに .gitignore みたいな . 始まりのファイルや、拡張子がないものは "" としてカウントされます。

使い方

こんなメソッドを用意して

def write_csv(target_path,output_file_path)
  File.open(output_file_path,"w") do |out_f|
    extname_count_hash(target_path).each do |key, value|
      out_f.write "#{key},#{value}\n"
    end
  end
end
write_csv("./","test.csv")

こんな感じで書き出せばいい感じでCSVが出力できます。

参考サイト

技術書典5で偶然出会ったセイチョウジャーニーを読んで、仕切り直しをしようと思った話

雑記というか日記と感想といまの思いがごちゃまぜになったものです。

本との出会い

技術書典5に行ってきました。

techbookfest.org

コミティアでもそんな買い方をするんですが)直感的に「いいな!」と思った本やパラパラ立ち読みして「いまの生活にもちょっと使えそうかも」みたいな本を中心に買ってきます。

このブログの「行ってきたメモ」シリーズをご覧いただくとわかるのですが、人の話を聞くのが好きで、自分の試行することの練度をあげることのできる体験談などは違う意味で好きだったりします。(誰かがどこかで「体験談は疑似経験値になりうる」という話をしていた)

そんなもんで、サークルチェックをしていたら「セイチョウジャーニー」という本を見かけたので、これは面白そうだと入場するやいなや速攻で買いました。

他にもいろいろなブースを物色して、欲しい本を買い、会場をあとにしました。

割と過去の技術書典も参加しているのですが、毎度のこと本を買って満足してそのまま積本化してしまうので、一冊は読もうと「セイチョウジャーニー」を帰ってから読み始めました。

「セイチョウジャーニー」と「それぞれの成長」

techbookfest.org

この本は

「もっとできることを増やしたい」 「でもどうやったらいいかわからない」 「続かない」 というような悩みを持っている人の役に立つことを目的とした本です。

というプロローグにあるとおり「成長」というテーマのもと、各々の考えと体験談がメインの本です。すべての話がエッセイのように体験談ベースなので、読みやすくサラサラと読み切ってしましました。

この5つのエピソードの中で一番自分がハッとさせられたのが「マヨイ・ジャーニー」の章でした。

「マヨイ・ジャーニー」と「原点回帰」

マヨイ・ジャーニー

マヨイ・ジャーニーの章はストーリー仕立てになっており、「技術書典をきっかけに日常が少し変わっていく」というテイストのお話でした。これを読んでいて自分がつらつらとブログを書き始めた理由の根本をを思い出しました。

自分が転がり始めたワケ

自分は数年前にとあるプロジェクトでチームでいないものは全て自身が賄うという形の「なんちゃってフルスタックエンジニア」みたいな状態が続き、そこでいいものを作ろうと奔走しましたが「ひとりでものごとを行うには限界がある、多人数で作り上げるようにならなければダメだ」と自身の中で思うようになりました。

そこから転じて「多人数でよいものを持続的につくるやり方」というのに興味がシフトして「もっと良いものが生み出せるエンジニア組織をやれるように経験や知識を仕入れたい」「そのための知識をつけたい」「そのためにはいろんな人達の体験やノウハウを得たいし、その中で得たものは還元したい」という考えに転化してきました。

そこから「自分が学んだことをちゃんと咀嚼するにはちゃんとアウトプットをせねば」という思いと「技術的に話せるトピックのストックを可視化して、どこかで喋れるようにしよう」という思いからブログをはじめました。(ここらへんはSOFT SKILLSの影響もある)

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

ただ、業務に忙殺され、その意識も薄まっていたため「まずをブログを継続的に行う」というところにクローズアップして、以下の記事から再スタートし、今に至ったのだった

shinkufencer.hateblo.jp

原点回帰してみたあとの追撃

マヨイ・ジャーニーの話を含めた体験談のパートのあとに、「みんなのセイチョウ・ジャーニー」という付録で複数名に

  • 成長とは?
  • あなたが成長にとって重要だと考えるものは?
  • 充実とは?
  • あなたが充実にとって重要だと考えるものは?

という4点の質問に複数の人が答えるパートがあった。

ここも三者三様、いろいろなことが書かれていて「なるほどこういう考えもあるのか」「これはちょっと取り入れてみようか」みたいな考えまでさまざまだったし、何よりも「充実」ということが自分からは抜けていたなと改めて考えさせられた。

再整理をして、仕切り直して、また始めよう

そのときのポイントポイントで整理はしてきたけど、ロードマップがぼんやりしていてきていた時期ではあった。そこにたまたま手にとったセイチョウジャーニー。マヨイ君のストーリー、過去の自分の掘り起こし、そして「成長」と『充実」。

「もっと知識をつけるためになんかしなきゃな」とか「もっとコミュニティの枠を広げたい、けど自分にはコミュニティに参加するような知識量もないのでなんだか後ろめたい」「年齢も年齢なのにやってることが浅くないだろうか」とかいろいろ考えてきたことが変に曲がりくねり始めていた自分がいました。そんなタイミングで「セイチョウジャーニー」という本が、『自分のやりたいこと・なりたい自分の像の再整理、それをどうやって実現するか、実現するために何をするか』というようなことを考え直すきっかけを与えてくれた気がします。

マヨイ君のように、技術書典がいいターニングポイントになることを願い。

AWSコマンドにおいてAWSのアカウント設定情報を複数持ち、切り替える方法

やり方を忘れるのでメモがてら

環境

$ aws --version
aws-cli/1.11.129 Python/2.7.10 Darwin/17.7.0 botocore/1.5.92

設定情報を複数用意する

作り方

$ aws configure --profile {{作りたいプロファイル名}}

sandbox という profile を作りたい場合

$ aws configure --profile sandbox

上記のコマンドを打つと以下のように作成される

$ cat ~/.aws/credentials
[default]
aws_access_key_id = ABCDEFGHIJKLMNOPQRSTUVWXYZ
aws_secret_access_key = ABCDEFGHIJKLMNOPQRSTUVWXYZ
[sandbox]
aws_access_key_id = ABCDEFGHIJKLMNOPQRSTUVWXYZ
aws_secret_access_key = ABCDEFGHIJKLMNOPQRSTUVWXYZ

設定情報を切り替える

やり方

AWS_DEFAULT_PROFILE環境変数に使いたい profile を設定する

$ export AWS_DEFAULT_PROFILE=sandbox

現在のものを調べる

やり方

$ aws configure list

$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************AAAA shared-credentials-file
secret_key     ****************AAAA shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

何かprofileが設定されていれば profile の value に 対象の物が出る

参考リンク

Time.zone.nowを大量のくりかえしで使うときは一時保存しましょう

ゲームとかやってると割と当たり前なんだけど、そういうコードを見かけたので一応メモがてら。

環境

rails (5.2.0)

たとえばこんなコード

# 10日前のものを選出したい(whereしろというツッコミは忘れる)
User.all.each do |user|
  next if user.created_at < Time.zone.now - 10.days
  # なにか処理
  p user.id
end

このようなコードの場合、eachで回している間にTime.zone.nowが過ぎ去っていく可能性がある。

検証

ワンライナーでこんなコードを実行する

true_count=0;false_count = 0;t = Time.zone.now; 10000.times.each do |x| Time.zone.now.sec == t.sec ? true_count+=1 : false_count += 1 end

結果はこんな感じ

p "true_count:#{true_count} false_count:#{false_count}"
# "true_count:29741 false_count:70259"

Time.zone.nowが固定されていない事がわかる

対応

ループの外で固定化しましょう

target_time = Time.zone.now - 10.days
User.all.each do |user|
  next if user.created_at < target_time
  # なにか処理
  p user.id
end

Rails5のActiveRecrodにてOR条件で検索したければorを使えばいい

あまり浸透していないのと忘れるのでメモ

環境

rails (5.2.0)

使い方

文法

条件1もしくは条件2に合致する場合

Model.where({{条件1}}).or(Model.where({{条件2}})

Userのidが1かcreated_atが今現在のレコードを調べる

User.where(id:1).or(User.where(created_at:Time.zone.now))
#  User Load (12.2ms)  SELECT `users`.* FROM `users` WHERE (`users`.`id` = 1 OR `users`.`created_at` = '2018-10-05 10:50:30')

参考リンク

常設ディスプレイに計測系ダッシュボードを表示するときに便利なChromeプラグイン『Revolver - Tabs』

よくGoogleAnalytics等のダッシュボード表示系コンテンツをディスプレイとかで表示することがあると思うんですが、そういうときに役立つプラグインをご紹介

DL先

Revolver - Tabs

使い方

このツール自体は「GoogleChromeで複数タブを開いているときに一定秒数でタブを切り替えていく」 というものなのですがそこに「タブが変わる度にリロードをする」という機能がついているので「1タブだけ開いていれば指定ページを定期的にリロードする」ということを実現できる

クリックすると有効化して、一定期間でリロードが走るようになる。

緑色の状態がリロード有効状態

f:id:shinkufencer:20181004234944p:plain

赤色だとされない

f:id:shinkufencer:20181004235024p:plain

時間の間隔などはオプションから設定できる

f:id:shinkufencer:20181004235051p:plain

ここをチェック入れてセーブすれば、タブ読み込みごとにリロードする

f:id:shinkufencer:20181005150733p:plain

参考リンク

ActiveRecordにはそれまでのorderを無視して上書きするreorderというメソッドがある

一体どういう意図でつくったのかわからないが見つけたのでメモがてら。打ち消しの記述なんて危険しか孕んでないから、おそらくコレは見かけたら駆除したほうがいい系のメソッドだとは思っている。

環境

rails (5.2.0)

例えば普通にorderすると以下のようにクエリが吐き出される

User.order(:id)
#  User Load (0.6ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC

複数指定すると以下のように重ねてORDER BYをかける

User.order(:id).order(:updated_at)
#  User Load (5.2ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC, `users`.`updated_at` ASC

ここをreorderに返ると以下のようになり打ち消される

User.order(:id).reorder(:updated_at)
#  User Load (2.7ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`updated_at` ASC

reorderは重ねて使っても最後しか採用されない

User.order(:id).reorder(:updated_at).reorder(:created_at)
#  User Load (0.7ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`created_at` ASC

参考リンク