sontixyou blog

技術まわり、ガジェット関連について

Neovim HEADをビルドする方法

Neovim Headをビルドすることがはじめてパターン

brew install ninja cmake gettext curl
git clone https://github.com/neovim/neovim
cd neovim
make CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=$HOME/neovim"
make install
export PATH="$HOME/neovim/bin:$PATH"

これをやると、$HOME/neovim/bin にneovimを起動するためのファイルが配置される

どこのディレクトリからもnvimコマンドでneovimを起動したい場合、.zshrcにaliasを登録すればOK

alias v='~/neovim/bin/nvim'
source ~/.zshrc

Neovim Headをビルドしたことがあるパターン

rm -r $HOME/neovim
make CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=$HOME/neovim"
make install
export PATH="$HOME/neovim/bin:$PATH"

これを毎回コマンドをコピペして実行することは面倒であるため、スクリプトファイルにまとめます。

# ref : https://github.com/neovim/neovim/wiki/Building-Neovim
if [ -d "$HOME/neovim" ]; then
  rm -rf "$HOME/neovim"
fi

cd $HOME/projects/neovim
make CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=$HOME/neovim"
make install
export PATH="$HOME/neovim/bin:$PATH"

血便が出たけど回復した話

人生で初めて血便が出て、感染性大腸炎になった。この記事投稿時には、だいぶ回復した。

この経験から2つの学びがあったので書き留める。

学び編

  1. 生焼けの肉や内蔵、生肉は食べるな

今回の感染性大腸炎になった要因は、これの可能性がある。自分の場合は、お店で食べた焼き鳥が半生?だったのが怪しそう。一本ずつ火が通ってるかを確かめていたわけではないため、あくまで推測

鶏肉にはカンピロバクターという菌がいる。 https://www.saiseikai.or.jp/medical/disease/infectious_gastroenteritis_caused_by_campylobacter/

  1. 血便出たら、病院行け

普段の便の色を覚えておくことは必要。便が赤茶色や真っ赤の場合、やばめなので病院行け

救急車を呼ぶレベルか迷ったら、「#7119」にかけて、判断を仰げる

※地域によって、対応可能エリアでない場合がある https://www.fdma.go.jp/mission/enrichment/appropriate/appropriate007.html

痛み始めから回復までの時系列

以下は症状悪化から回復までの時系列。グロめなことを書いてるため、グロ苦手の人は、読まないでいい。

2023/10/21

午後辺りからおへその左側辺りが、波のように腹痛が出始めた。このときは、食い過ぎによる一時的な腹痛で終わるかもしれんと思ってた。

2023/10/22

同じ箇所で腹痛が続くため、治れ〜と思いながら1日休養のために家でゴロゴロしてた。この頃に、下痢気味になった

2023/10/23

腹痛ありで仕事に行った。午後辺り、下痢で四回くらいトイレに行った。

その際に、便の中に赤い点々を発見。見た目はいちごジャムのような感じ。

夜20時、池袋にある消化器科に行った。そこで、内視鏡検査するために、紹介状を書いてもらった。

お世話になった医師さんから、真っ赤な血便が出た場合「#7119」にかけて、対応方針を相談してくださいと言われた。

夜22時に真っ赤な血便が出た。見た目はケチャップだ。#7119に電話して、今日の午後からの症状を伝えた。すると、すぐ救急車呼んで病院行ってくださいと言われた。

救急車呼んで、病院へ行った。 そこでは、2.3日以内に食べたものを聞かれた。次に、肛門に指を入れてもらって、血がついていることを確認。直腸に出血?がないかも確認していただいた。さらに、大腸等から出血がないかの確認のために、CT検査と血液検査をした。

CT検査と造影剤すごい。機械がまじ未来感あった。 CTスキャンの画像からは出血を発見することができず、原因特定にはならなかった。

翌日の午前に、通院するように言われたため、一旦帰宅

2023/10/24

まだ便は下痢で赤茶色。真っ赤ではなくなった。終日今までと同じ箇所で腹痛あり 午前中に昨日訪れた病院へ行き、問診兼肛門の確認をしていただいた。 原因を特定できないことから、内視鏡検査をすることになった。内視鏡検査の予約をした。

消化に良いもの限定で食べて良いとのことなので、素うどんを食べた。 ここから素うどん生活が始まった。

夜21時に下剤を飲んだ。この下剤は翌朝に便が出るようにするためのもの。

2023/10/25

便は赤茶色で固形と下痢の中間くらい 昨日あった腹痛はだいぶやわらいだ。ほとんど痛みがなくなった。

午前8時半に病院に行き、検査待合室でモビプレップ(下剤)を飲むスタンバイ。

モビプレップは腸管洗浄剤で、腸の中を空っぽにするためのもの。味はポカリスエットにリンゴ風味を加えた感じ。モビプレップ1.5Lと水1.0L飲んで、午後から内視鏡検査を開始。

検査中、炎症起きている部分を画像撮影しつつ、炎症箇所や晴れている箇所の組織を採取していた。腸の壁から組織を取るのは全然痛くない。痛みを感じなかった。組織検査の結果は、2週間後に分かる。

内視鏡検査が大腸へ入るために空気を大腸へ流し込みながら行うため、終始お腹がパンパンで苦しかった。

自分の臓器を見れるのは、なかなかない機会なのでそれはそれで良かった。

10/27

腹痛はほとんどなし。便は茶色へ戻った。 午後に血液検査のために、通院。 白血球の項目が、10/23の検査結果より低くなったため、ほぼ回復

終わり

RailsのActiveRecord AVG編

average_ageをSQLだけでどう取得できるのかを考えてみる

普段、極力SQLを使わずに書くなら、こうなるかと思う。

def self.average_age
  ages  = all.pluck(:age)
  ages.sum / ages.count
end

SQLを思いっきり使用する場合、こう書く。

result = ActiveRecord::Base.connection.select_all('select avg(users.age) as user_age_avg from users ')
   (5.0ms)  select avg(users.age) as user_age_avg from users 
=> 
#<ActiveRecord::Result:0x000000010e334028
...
irb(main):061> result
=> 
#<ActiveRecord::Result:0x000000010e334028
 @column_types={},
 @columns=["user_age_avg"],
 @hash_rows=nil,
 @rows=[[0.5259e2]]>

ActiveRecord::Base.connection.select_value('select avg(users.age) as user_age_avg from users ')
   (37.5ms)  select avg(users.age) as user_age_avg from users 
=> 0.494038e2

ActiveRecord::Base.connection.select_value('select avg(users.age) as user_age_avg from users ').to_i
   (38.0ms)  select avg(users.age) as user_age_avg from users 
=> 49

SQLで平均値を計算するとなると、対数平均で算出する。 小数点を丸めたい場合、ROUND関数を使用することでそれが可能となる。

> result = ActiveRecord::Base.connection.select_all('select round(avg(users.age)) as user
_age_avg from users ')
   (4.8ms)  select round(avg(users.age)) as user_age_avg from users 
=> 
#<ActiveRecord::Result:0x000000010ecbac00
...
irb(main):063> result
=> 
#<ActiveRecord::Result:0x000000010ecbac00
 @column_types={},
 @columns=["user_age_avg"],
 @hash_rows=nil,
 @rows=[[53]]>
irb(main):064> result = ActiveRecord::Base.connection.select_all('select round(avg(users.age),1) as us
er_age_avg from users ')
   (5.0ms)  select round(avg(users.age),1) as user_age_avg from users 
=> 
#<ActiveRecord::Result:0x000000010e5343f0
...
irb(main):065> result
=> 
#<ActiveRecord::Result:0x000000010e5343f0
 @column_types={},
 @columns=["user_age_avg"],
 @hash_rows=nil,
 @rows=[[0.526e2]]>

Rails内で直接SQLを書く方法

背景

私の中でRailsのActive RecordとSQLの相対表があまりなく、Active Recordを実行したときにどんなSQLが実行されるのかについてもっと詳しくなりたいため、勉強します。

直接SQLを実行するためには

3種類の方法はあります。

  1. execute これはクエリを実行できますが、取得結果を見ることができません。返り値のクラスは、Mysql2::Result
ActiveRecord::Base.connection.execute('select * from users')
   (4.9ms)  select * from users
=>
#<Mysql2::Result:0x000000010e6d86c0
 @query_options=
  {:as=>:array,
   :async=>false,
   :cast_booleans=>false,
   :symbolize_keys=>false,
   :database_timezone=>:utc,
   :application_timezone=>nil,
   :cache_rows=>true,
   :connect_flags=>2148540933,
   :cast=>true,
   :default_file=>nil,
   :default_group=>nil,
   :adapter=>"mysql2",
   :encoding=>"utf8mb4",
   :pool=>5,
   :database=>"sql_master_development",
   :username=>"root",
   :password=>"password",
   :host=>"127.0.0.1",
   :port=>3306,
   :flags=>2},
 @server_flags={:no_good_index_used=>false, :no_index_used=>true, :query_was_slow=>false}>
  1. select_all / select_value

こっちは、クエリを実行結果を取得することができます。

ActiveRecord::Base.connection.select_all('select * from users').rows
   (3.9ms)  select * from users
=> 
#<ActiveRecord::Result:0x000000010ec9a1f8
 @column_types={},
 @columns=["id", "name", "created_at", "updated_at", "age"],
 @hash_rows=nil,
 @rows=
  [[102, "Clementina Pagac", 2023-09-02 14:23:32.342455 UTC, 2023-09-10 08:04:33.679732 UTC, 80],
   [103, "The Hon. Vincent Kovacek", 2023-09-02 14:23:32.345886 UTC, 2023-09-10 08:04:33.688934 UTC, 5],
   [104, "Emil Anderson", 2023-09-02 14:23:32.348682 UTC, 2023-09-10 08:04:33.724766 UTC, 57],
   [105, "Cythia Rempel", 2023-09-02 14:23:32.350912 UTC, 2023-09-10 08:04:33.730596 UTC, 73],
   [106, "Clifford Wunsch", 2023-09-02 14:23:32.353071 UTC, 2023-09-10 08:04:33.733961 UTC, 39]]

# where旬で絞り込むことができる
User.connection.select_all('select * from users where age > 50')

Rails table_name_prefixメソッドについて

背景

Railsにmatch_resultsというテーブルを追加したいとする。 Railsのモデル ディレクトリの構造をmodels/match/result.rbにしたい。

実際どうやるのか

そういうときは、以下のコマンドを実行すればよい。

bundle exec rails generate Match::Result score:integer

これを実行すると、以下のようなモデルファイルが作成されます。models直下に作成されるmatch.rbファイルのおかげで、result.rbは、このディレクトリ構造を利用することができます。

models/match/result.rb

module Match
  class Result < ApplicationRecord
  end
end

models/match.rb

module Match
  def self.table_name_prefix
    "match_"
  end
end

以下のコードを実行すると、match_resultsテーブルからレコードを取得することができます。

::Match::Result.all