行動すれば次の現実

ほどよくモダンなシステム開発を目指しています。メインテーマは生産性、Ruby、Javascriptです。

JQueryでcheckbox操作 (チェックしたら○○する、チェック外したら○○する)

checkboxをチェックしたら何かをしたいときの条件式です。

$('#check').on('change', function (e) {
  if (e.target.checked) {
    //  check:on時の処理
  } else {
    //  check:off時の処理
  }
});

clickイベントで拾いたい場合はこう書きます

$('#check').on('click', function () {
  if ($(this).prop('checked')) {
    //  check:on時の処理
  } else {
    //  check:off時の処理
  }
});

時間がないから成果が上がらないのではなく、時間があるから成果が上がらない

レバレッジ・シンキングを読んでみたので簡単なまとめと書評。

自由な時間が多い人こそ必要なマインドだと思った。

読んだきっかけ

やりたいことが見つかる時間編集術を読んでプロダクティブタイムの効率化にアンテナを張っていたところAmazonのリコメンドで気になったので購入。

4つの資産を構築してレバレッジをかける

  • 圧倒的な成果をあげるにはパーソナルキャピタルを構築してレバレッジをかけることが必要
    • パーソナルキャピタルとは、労力資産、時間資産、知識資産、人脈資産のこと
  • パーソナルキャピタルを高めて、余った時間をさらにパーソナルキャピタルに投資していくことで複利的に資産を増やせる
  • パッシブではなくアクティブに行動せよ
    • 例:普通にテレビを見るのはパッシブ(受け身)、録画して気になるところだけ見るのはアクティブ

労力のレバレッジ

  • 労力のレバレッジをかけて「やる気に左右されたくない」「なるべく労力をかけずに近道したい」を取り除く
  • 仕組み化と習慣化がポイント
    • 仕組み化:チェックリスト、マニュアルで余計な労力を使わない
    • 習慣化:継続することで知識や経験が溜まっていくものを無意識化できると最強。小さく始めるのがポイント
  • KFSを見極める
    • KFSとは成功への鍵を握る要素=キー・サクセス・ファクター
    • 人の真似をするのが良い
      • 受験勉強の例:参考書を最初から最後まで読むのではなく、まずは「合格体験記」を読んで合格するための勉強方法を学ぶ

時間のレバレッジ

  • 時間がないから成果が上がらないのではなく、時間があるから成果が上がらない
    • 期限があるから人はそれを行う。期限がないと手を付けない(例:夏休みの宿題)
    • 時間にレバレッジをかけることで短い時間で成果を上げることができる
  • 俯瞰逆算(トップダウン)でスケジュールを組む
    • いきあたりばったりのスケジュールよりもゴールを達成するためのタスクを洗い出してスケジューリングするのが効果的
  • 時間割を活用する
    • アウトプット(タスク)、プライベート、インプットなどの単位で分割して一日のスケジュールを時間割することで時間制限を設けることができる
    • 「仕事が早く終わったら本を読もう」の発想だと、実際には仕事に本を読む時間が奪われてしまう
    • 時間があるから仕事はできない、ではなく、時間がないから仕事はできる
    • 区切りをつけることが重要。

知識のレバレッジ

  • 知っているかどうかで成果に大きな差がでる。知っていることでレバレッジをかけることができる。
  • 人の真似をする
    • 時間に限りがあるから近道を考える。人の真似をするのが一番効率的
    • 自分に似たタイプの人を真似する
      • 受験の例:受験まで1年間しか無いなら1年間で大学受験に合格した人の勉強法を参考にする
  • レバレッジ・リーディング
    • なぜその本を読むのか?目的意識をはっきりさせる
    • その本のカバー、著者のプロフィール、まえがき、目次、あとがきを眺める
    • その後本を読むことである程度予測できた状態で読書できる。普通に読むより効率が上がる。

人脈のレバレッジ

  • 自分一人では限界がある。人の力を使ってレバレッジをかけることで圧倒的な成果を生み出せる
  • 短期投資ではなく長期投資を意識
  • 基本はギブ(コントリビューション)
    • 相手に有益なバリューを提供しなければ相手にされない
    • ただし去るものは追わない
  • パーソナルブランディングも重要な要素
  • マインドの高い集団に属することで自分のマインドを高める
    • 高いマインドの人は成功しやすい
    • ランチは人と食べることで人脈と食事の二毛作ができる

感想

「時間がないから成果が上がらないのではなく、時間があるから成果が上がらない」という言葉に出会えただけでもこの本を読んだ価値があった。 カフェや新幹線で作業すると、やたらと生産性が高いと感じる理由はこれなのかもしれないと腑に落ちた。 スケジューリングする際も時間割を決めて制限時間を意識して作業することで、生産性を意識せざるを得ない状況を生み出すことができる。 それを習慣化させて効率化を図っていきたいと思う。

プロダクティブタイムとアンプロダクティブタイム

やりたいことが見つかる時間編集」を読んでの書評。

今年読んだ本の中でベストな内容だと思う。

やりたいことがありませんは普通

  • 著書は「やりたいことがある方が異常」と言っている。
  • 世の中的に「やりたいことをやろう」「好きなことで稼ごう」というスローガンが流布されているが、それは成功者の言葉であり全体の1%
  • やりたいことを見つけるには人生の4つの資産を増やすこと
  • 時間→能力→人脈→お金
  • 時間の使い方が全ての基礎である

時間はお金で買おう

  • お金は増やせないが買うことができる
  • ものを買う際は一番安いものではなく、一番早いものを選ぶ
  • たとえば移動手段の場合はバスよりも新幹線
  • 格安飛行機で乗り継ぎするよりも直行便
  • 新しいサービス、モノは未来を体験できる、クリエイティビティが上がる
  • 迷ったら未知のモノを選んでクリエイティビティを上げる

プロダクティブタイムの意識

  • いわゆる時間術的な話
  • プロダクティブタイムは「時間のコスパ」を徹底的に高めることを目指す
  • 1.5倍速を意識する(3時間の仕事を2時間で終わらせると1時間自由な時間ができる)
  • 何をするにも、そのリターンが未来につながっているかを考える
  • ただし生産性を求め続けると疲弊して視野が狭くなる

アンプロダクティブタイムが最も重要

  • 何もしない時間、余白が重要
  • 余白は偶然をたくさんもたらす
  • たくさんの情報が入り、そこに行ってみたり、調べたりすると結果的に視野が広がる。ユニークな存在になれる
  • やりたいことがない人の多くは知識が足りない、世界が狭い
  • 興味をもったことを何も考えずにやると世界が広がる

おまけ

  • 感情的になったら一呼吸おいて、感情に反応するかどうか自分で選ぶ
  • 仕事における人間関係構築のコツはコミュニケーションコストを低くすること
    • スケジュールをどんどんこなしていくようになるだけで結果が全く変わる
    • 周りの人は安心して信頼してくれる

感想

プロダクティブタイム、アンプロダクティブタイムの存在が知れたことは自分の人生の中で大きな影響を与えると思う。 生産性重視でいつも疲弊気味だった自分が、アンプロダクティブタイムという最も重要な余白を意識することでこの先どう変わっていくのか楽しみである。

そのためにはプロダクティブタイムで圧倒的な生産性を実現する必要があるので、今までマインドは活かせれつつ、アンプロダクティブという束の間の休息を取れるのは非常にありがたい考え方である。

ActiveModel valid?でバリデーション例外を発生させる | Rails

ActiveModelのvalid?はモデルのバリデーションを実行して真偽値を返却するメソッドですが、バリデーションエラー時に例外を発生させたいことがあったので調べてみました。

通常ならsave!やcreate!で対応できますが、Activerecord-importのBulkインサートの永続化前にバリデーションチェックをするなどのケースです。

実装

unless product.valid?
  raise ActiveRecord::RecordInvalid, product
end

valid?が真の場合は、対象オブジェクトをActiveRecord::RecordInvalidの例外クラスに詰めてあげれば永続化することなく例外を発生することが可能です。

CSV.generateでUTF-8からShift−JISに変換したときの文字コード変換エラーを回避する

CSV.generateメソッドでUTF-8の文字列をShift-JISに変換して書き込もうとしたら U+2613 from UTF-8 to Windows-31J というエラーが発生した。

docs.ruby-lang.org

上記リファレンスに記載の通り、そのまま使うと文字コード変換で失敗する可能性があるので、適宜変換などして使う必要がある。

主に機種依存文字などが当てはまるが、一つ一つ変換処理を定義するのもイタチごっこなので、潔く変換失敗文字列は全無視する方針にした。

実装

def sjis_safe(str)
  str.encode(Encoding::SJIS, invalid: :replace, undef: :replace)
end
pry(main)> '☓ほげほげ'.encode(Encoding::SJIS, invalid: :replace, undef: :replace).encode(Encoding::UTF_8)
=> "?ほげほげ"

使用例

CSV.generateでAppendしていく直前にsjis_safeで変換するイメージ。

csv_string = CSV.generate(encoding: Encoding::SJIS, force_quotes: true) do |csv|
  csv << [
    sjis_safe(name).encode(Encoding::UTF_8)
  ]
end

Shift-JISを扱うときはこういう考慮が必然なので早く一掃されてほしい。

クエリ文字列から特定のパラメータを削除したい | Ruby On Rails

クエリ文字列から特定のパラメータのみを削除したいことがあったのでメモ。

実装

uri = URI.parse('https://www.example.com?hoge=1&fuga=2&piyo=3')
query = Rack::Utils.parse_nested_query(uri.query)
query.delete('fuga')
uri.query = query.to_param
uri.to_s

説明

(1) URL文字列をURIオブジェクトに変換します。

uri = URI.parse('https://www.example.com?hoge=1&fuga=2&piyo=3')
=> #<URI::HTTPS https://www.example.com?hoge=1&fuga=2&piyo=3>

(2) Rack::Utilsを使用してクエリ文字列をHashにします。

query = Rack::Utils.parse_nested_query(uri.query)
=> {"hoge"=>"1", "fuga"=>"2", "piyo"=>"3"}

(3) deleteメソッドで特定のパラメータを削除します。

query.delete('fuga')
=> "2"

(4) URIオブジェクトに新しいクエリパラメータをセットします。

uri.query = query.to_param
=> "hoge=1&piyo=3"

(5) to_sでURLを取得します。

uri.to_s
=> "https://www.example.com?hoge=1&piyo=3"

Railsのカスタムバリデーションで複数項目の相関をチェックしたい

開始日と終了日を入力するシステムで、期間の大小チェックと期間の日数チェックを行いたい場合があります。

カスタムメソッドで実装するケースはよく見受けられますが、カスタムバリデーションとして使い回したい思ったので実装してみました。

※あくまでも簡易実装なので国際化などは非対応です。

日付期間チェックのカスマムバリデータ

class DatePeriodValidator < ActiveModel::Validator
  def validate(record)
    start_date, end_date, max_days_period_val = options.values_at(:start_date, :end_date, :max_days_period)
    start_date_val = record.send(start_date)
    end_date_val = record.send(end_date)
    return if start_date_val.blank? || end_date_val.blank?

    if max_days_period_val.present? && (start_date_val - end_date_val).to_i.abs > max_days_period_val
      return record.errors[options[:start_date]] << "#{record.class.human_attribute_name(end_date)}の期間は#{max_days_period_val}日以内を入力してください"
    end

    return if start_date_val <= end_date_val

    record.errors[options[:start_date]] << "#{record.class.human_attribute_name(end_date)}よりも前に設定してください"
  end
end

使い方

対象のモデルに以下のような宣言を追加します。

validates_with DatePeriodValidator, start_date: :sales_start_date, end_date: :sales_end_date, max_days_period: 31
  • start_date:(必須) 開始日にあたる対象のカラム名を指定してください
  • end_date:(必須) 終了日にあたる対象のカラム名を指定してください
  • max_days_period:(任意) 有効な期間の日数を指定してください。未指定の場合は期間日数チェックは行いません。