ヌーラボ backlogエンタープライズで最近アクセスしていないユーザーの一覧を取得する。

backlogエンタープライズはユーザー数による課金になっているので、アクセスしていないユーザーについては削除を行いたい場合があります。 ただ、backlogのAPIは貧弱で、画面からは最終ログイン日時が取れるのにAPIからは最終ログイン日時が取れない、APIを使用して取得できるユーザーのアクティビティ情報は自分が参加しているプロジェクトに参加しているユーザーしか取れない等問題があって、使い物にならないので直接DBにSQLを発行します。

データベースへの接続方法はエンタープライズのインストール時に作成した設定ファイルを参照すればわかるので、DBには接続してSQLを発行できる前提で話をします。

なお、完全にダーティーハックの世界だし、ヌーラボのbacklogはテーブル設計については公開していないので、正しいかどうかの保証はありません。 また、gitの読み取り専用ユーザーとして運用している場合、APIの読み取りのみ使用しているユーザーについては調べがつかなかったので、CIで自動的に何かやってる場合は注意が必要です。 gitにコミットをしている場合は課題IDを入れてれば大丈夫(なはず)。

以下の2つのSQLを発行します。

//最近作られたわけではない1回もログインしていないユーザーの一覧
select id, user_id, last_login_time from users 
where last_login_time is null and created < date_sub(now(), interval 10 day) and disabled = '0' order by user_id asc;

//最近1年にログインしてない、もしくはアクティビティがないユーザー
select id, user_id, last_login_time from users 
where last_login_time <= date_sub(now(), interval 1 year) and disabled = '0' and id not in (select user_id from  project_activity_notify where created > date_sub(now(), interval 1 year)) order by user_id asc;

後はAPI使って削除するだけ。 usersテーブルのIDとしてのuser_idとusersテーブルのuser_idが紛らわしいので注意してくださいね。

Oracle DBの表領域ごとの使用率を出力する

ぐぐって出てくる既存のSQLだと正しい結果が出てこなかったのでメモ。 19cで確認。 Oracle SQL DeveloperのDBAコンソールで使われてるものほぼそのままです。

select a.tablespace_name as "Tablespace Name",
       round(a.bytes_alloc / 1024 / 1024) "Allocated (MB)",
       round(nvl(b.bytes_free, 0) / 1024 / 1024) "Free (MB)",
       round((a.bytes_alloc - nvl(b.bytes_free, 0)) / 1024 / 1024) "Used (MB)",
       round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100) "% Free",
       100 - round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100) "% Used",
       round(maxbytes/1024 / 1024) "Max. Bytes (MB)"
from  ( select  f.tablespace_name,
               sum(f.bytes) bytes_alloc,
               sum(decode(f.autoextensible, 'YES',f.maxbytes,'NO', f.bytes)) maxbytes
        from dba_data_files f
        group by tablespace_name) a,
      ( select  f.tablespace_name,
               sum(f.bytes)  bytes_free
        from dba_free_space f
        group by tablespace_name) b
where a.tablespace_name = b.tablespace_name (+)
union all
select 
       h.tablespace_name as tablespace_name,
       round(sum(h.bytes_free + h.bytes_used) / 1048576) megs_alloc,
       round(sum((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) / 1048576) megs_free,
       round(sum(nvl(p.bytes_used, 0))/ 1048576) megs_used,
       round((sum((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) / sum(h.bytes_used + h.bytes_free)) * 100) Pct_Free,
       100 - round((sum((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) / sum(h.bytes_used + h.bytes_free)) * 100) pct_used,
       round(sum(f.maxbytes) / 1048576) max
from   (select distinct * from sys.gv_$TEMP_SPACE_HEADER) h, (select distinct * from sys.gv_$Temp_extent_pool) p, dba_temp_files f
where  p.file_id(+) = h.file_id
and    p.tablespace_name(+) = h.tablespace_name
and    f.file_id = h.file_id
and    f.tablespace_name = h.tablespace_name
group by h.tablespace_name
ORDER BY 2

sqlplusでデフォルトの接続先を変更する。

Windowsの場合は環境変数 「LOCAL」にtnsnames.oraの値を書き込む、そうでないOSの場合は「TWO_TASK」に指定するらしい。 Linux版(と思われる)記事はたくさんあったけど、Windowsで確認しました。

stackoverflow.com

Oracle DBでtnsnames.oraを使ってフェイルオーバー(もしくは負荷分散)を行う。

基本的にマニュアルの通りですが、Oracle DBの場合接続文字列を変えるだけでフェイルオーバー(もしくは負荷分散)を行えます。

docs.oracle.com

複数をどう切り替えるかというと、(FAILOVER=on)もしくは(LOAD_BALANCE=on)をつけるだけ。 どのサーバー間で切り替えるかを設定するのは、ServiceNameが同じ場合はADDRESS_LISTを使用してサーバーのアドレスを切り替えて、ServiceNameが違う場合はDESCRIPTION_LISTで切り替えます。

net_service_name= 
 (DESCRIPTION_LIST=
    (LOAD_BALANCE=on)
    (FAILOVER=off)
    (DESCRIPTION=(ADDRESS=~~~
    )
    (DESCRIPTION=(ADDRESS=~~~
net_service_name= 
(DESCRIPTION=
  (ADDRESS_LIST=
    (LOAD_BALANCE=on)
    (FAILOVER=off)
    (ADDRESS=~~~
    (ADDRESS=~~~
  )
  (SERVICE_NAME=service_name))
)

JDBCでtnsnames.oraを読み込む

接続文字列をJDBC接続文字列に直接書き込むかtnsnames.oraの場所を変数として渡してあげる必要があります。

-Doracle.net.tns_admin=TNS_NAMES_ORA_DIRECTORY

docs.oracle.com

使うべきなのか?

正直、使わない方が良いと思います。 正系のOracle DBが生きてるか死んでるかよくわからない場合に正しく動かないだろうというのと、結局監視側で一括して生死判定した方が良いよねぇということで、DNSサーバー立ててそこで切り替えた方がよさそう。

マニュアルには(FAILOVER=on)と(LOAD_BALANCE=on)の両方を有効にした場合の挙動として以下のような記述があります。 接続ごとに毎回この挙動が発生することが許せるなら使えばいいんじゃないかな。。。

クライアントは、ADDRESS_LISTを無作為に選択し、選択したADDRESS_LISTに障害がある場合、他方にフェイルオーバーするように指示されます。この指示は、LOAD_BALANCEパラメータとFAILOVERパラメータがonに設定されていることで示されます。

なんでもかんでもDBが機能持ってたほうが良かったという時代の名残なのかなぁ。

リングフィットを1週目クリアしたけれども痩せなかった。

リングフィットをやったら痩せましたという人ばかりなので、痩せませんでしたという記録も。

リングフィットをやったけれども、痩せませんでした。 6月14日に初回起動をして、10月18日*1 にクリア。 そのままサブクエストも同じ日に終了。

f:id:megascus:20201018165507p:plain
体重推移

どうせ運動してなかったんでしょう?

と、思われる人もいるかもしれませんが、負荷15から始めて後半はずっと負荷30でした。 身長が189センチぐらいあって、体脂肪率が25%前後だから、BMI的な健康値よりは筋肉が15kgぐらい多く、脂肪が5kgぐらい多い感じです。 クリアしたときの累計でも総活動時間は47時間、総消費カロリーも15000kcalオーバーということで、ほかの人よりはずっと多いはず。 最後のほうは1日当たり200kcal~で週5ぐらいを目安に運動していました。 f:id:megascus:20201018170022p:plain f:id:megascus:20201018170050p:plain

15000kcalは多いように見えるけど、体脂肪にすると2kgちょっと分でしかなくて、食事制限をしないといかに意味がないかということがわかりますね。

リングフィットで世界一

リングフィットには同年齢の人たちで運動量(回数)を比較してくれる機能があります。 私がリングフィットを買ったのは発売日から8か月経っていましたが、いくつか1位を取ることができました。

世界一・・・・・いい響きだ。

リングフィットではストーリー中で運動を行いやすい種目と、あまり行わない種目の二つがあって、私がやったのはろくろ回し。 どの年代でも2時間ぐらいやれば世界一になれるんじゃないでしょうか。*2

f:id:megascus:20201018170937p:plain
世界一

他に一つものすごく世界一になりやすい種目がありますが、そちらを公開すると10分ぐらいで世界一になってしまう人も出てくるので、どうしても世界一になりたい人は探してみてください。 ヒントとしてはサイレントモードのスロートレーニングです。

カロカン

カロリーカンスト、略してカロカン。 リングフィットを普通にやってると100kcal前後で一日の運動を終了することになるのですが、一日当たり999.99kcalまでしか測れないことを利用してカロリーカンストまで頑張るという遊びがあったので私もやってみました。 マラソンで稼ぐ人が多いようですが、サイレントモードだとマラソンのカロリー消費量が少ないのでろくろ回しで。 1分当たり10kcalぐらい消費できるので結構すぐに終わりました。

f:id:megascus:20201018171456p:plain
カロカン

リングフィットの感想

個人的には大ヒットでした。ジムで運動してると最終的にはつらい、しにたい、なんでこんなことやってるんだ・・・・・みたいな考えしか出てこなくなるけど、最初から最後まで楽しく運動できた感じ。 ただ、いくつかほかの人に勧めるとか、継続的に行うことを考えると二つほどよくないところがありました。

一つ目としては最初の負荷決定がヒアリングに寄ってるんだけど、それで出てくる負荷がちょっと高すぎでは?という気がしました。

普通の人というのは営業で外回りをして半日歩いてるとか、ちゃんと毎日家事をしてますとかいう人たちのことで、座り作業しかやってない人というのは普通よりずっと少ない運動量なんだと。 自己申告よりも5ぐらい下げるぐらいでちょうどよかったんじゃないでしょうか。 続けられそうなら上げればいいわけですし。 最初の種目がわりと負荷が高めなものもあって、続けられない人が多いというのは非常に残念です。 1週目クリアまで行けてる人も統計情報を見る限り2割前後しかいなさそうですし。 負荷30で3日で終わってしまうよりは負荷1でも最後まで行けたほうが素晴らしいことなので、負荷を軽くしてでも最後までやってほしいなぁという気持ちです。

二つ目としてはリングコンが小さすぎる!

なんとなく、150 cm~160cmぐらいの人間にちょうど良い大きさで作られているような気がします。 私にはリングコンが小さすぎて一部出来ない種目がありました。 具体的にはカタニプッシュ。 筋肉が盛り上がってくるとリングコンを潰すことができなくなって、bestが取れない・・・・・

リングアローも出来ないことはないですが、鍛えられる場所が違う感じがしますね。前の腕ばかり疲れる。

次回作では大きめなリングコンも売り出してほしいですねぇ。1.5倍ぐらいあるやつ。

という感じで、非常に面白いし、たぶんこれからもリングコンが壊れるまでやっていくことでしょう。 つらすぎて続かないという人は負荷が高すぎるので、負荷を下げてちょっとでも続けてみてください。

*1:リングフィットアドベンチャー発売から1周年記念の日

*2:私に勝ちたければ5時間ぐらいやる必要があります。

AWS ALBで特定のパスもしくはパスが存在しない場合のみリクエストを許可したい場合

https://example.com/app もしくは https://example.com ではアクセスを許可したいが、それ以外についてはアクセスを許可したくない(404を返したい)場合は以下のように設定する。

  1. パスが/app または /app/* または / の場合は許可する。
  2. パスが /* の場合は固定レスポンス(404)を返す。
  3. それ以外の場合(デフォルト)は許可する。