コード日進月歩

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

要配慮個人情報とは何かざっくりまとめる

ユーザ情報を管理する上で切っても切り離せない、個人情報と要配慮個人情報の話に関してざっくり理解をする。

出典

個人情報の保護に関する法律 | e-Gov法令検索

個人情報と要配慮個人情報

個人情報とは

法令内で個人情報の定義があり、それは以下。

第二条 この法律において「個人情報」とは、生存する個人に関する情報であって、次の各号のいずれかに該当するものをいう。
一 当該情報に含まれる氏名、生年月日その他の記述等(文書、図画若しくは電磁的記録(電磁的方式(電子的方式、磁気的方式その他人の知覚によっては認識することができない方式をいう。次項第二号において同じ。)で作られる記録をいう。第十八条第二項において同じ。)に記載され、若しくは記録され、又は音声、動作その他の方法を用いて表された一切の事項(個人識別符号を除く。)をいう。以下同じ。)により特定の個人を識別することができるもの(他の情報と容易に照合することができ、それにより特定の個人を識別することができることとなるものを含む。)
二 個人識別符号が含まれるもの - 個人情報の保護に関する法律 | e-Gov法令検索

補足のための括弧書きが多いが

  1. 当該情報に含まれる氏名、生年月日その他の記述等により特定の個人を識別することができるもの
  2. 個人識別符号が含まれるもの

この2つが個人情報にあたり、2の「個人識別符号」に関してはこの文章のあとに定義があり

この法律において「個人識別符号」とは、次の各号のいずれかに該当する文字、番号、記号その他の符号のうち、政令で定めるものをいう。
一 特定の個人の身体の一部の特徴を電子計算機の用に供するために変換した文字、番号、記号その他の符号であって、当該特定の個人を識別することができるもの
二 個人に提供される役務の利用若しくは個人に販売される商品の購入に関し割り当てられ、又は個人に発行されるカードその他の書類に記載され、若しくは電磁的方式により記録された文字、番号、記号その他の符号であって、その利用者若しくは購入者又は発行を受ける者ごとに異なるものとなるように割り当てられ、又は記載され、若しくは記録されることにより、特定の利用者若しくは購入者又は発行を受ける者を識別することができるもの

一はDNAや指紋の情報などを電子データに置き換えたものを想定しており、二に関しては世の中のサービスに利用する番号や文字列(ex.免許証の番号、マイナンバーカードの番号)を指している。

要配慮個人情報とは

要配慮個人情報は上記の個人情報よりも更に気を払う必要にある個人情報のこと。どのようなものが対象かというのを法令から引用すると以下。

この法律において「要配慮個人情報」とは、本人の人種、信条、社会的身分、病歴、犯罪の経歴、犯罪により害を被った事実その他本人に対する不当な差別、偏見その他の不利益が生じないようにその取扱いに特に配慮を要するものとして政令で定める記述等が含まれる個人情報をいう。

上記に記載のあるとおり主眼としているところはこの内容が知られてしまうことで不当な扱いを受ける恐れのある情報のことを指す。

金融分野における機微情報との違い

要配慮個人情報と似た概念として金融関連で「機微(センシティブ)情報」としてガイドラインを設けている

金融分野における個人情報保護に関するガイドライン

この機微情報=要配慮個人情報という観点が成立するわけではなく、部分的に違う部分があるので気をつけること。なお、違いに関しては以下のサイトでまとまっているので参考のこと。

改正個人情報保護法:機微(センシティブ)情報と要配慮個人情報(規定例も紹介)(3月26日修正版) | 弁護士法人 三宅法律事務所

参考サイト

BigQueryでTIMESTAMPをJSTの文字列に変換する

書き方をいつも忘れてしまうのでメモ的投稿。

前提条件

  • STANDARD SQLです(記載タイミングでレガシーのほうを使っているほうが稀かなと思いますが念の為)

フォーマット

JSTは+9時間なので、 Asia/Tokyoタイムゾーンを使う

FORMAT_TIMESTAMP( フォーマット文字列, 対象カラム, "Asia/Tokyo")

現在時間をJST(Asia/Tokyo)の時間で出す方法

SELECT FORMAT_TIMESTAMP( "%F %T", CURRENT_TIMESTAMP(), "Asia/Tokyo") as now_timestamp_jst

参考リンク

Railsでインスタンス変数に代入することをメモ化と呼ぶのは趣の違う話なのでざっくりまとめる

表題通り違和感をまとめる。

前提としてメモ化とは

Wikipedia曰く以下の通り

メモ化(英: Memoization)とは、プログラムの高速化のための最適化技法の一種であり、サブルーチン呼び出しの結果を後で再利用するために保持し、そのサブルーチン(関数)の呼び出し毎の再計算を防ぐ手法である。 (中略) メモ化された関数は、以前の呼び出しの際の結果をそのときの引数と共に記憶しておき、後で同じ引数で呼び出されたとき、計算せずにその格納されている結果を返す。メモ化可能な関数は参照透過性を備えたものに限られる。すなわち、メモ化されたことで副作用が生じない場合に限られる。 - メモ化 - Wikipedia

ということでメソッドや関数において、同一の引数の場合は再計算せず保存した値を出すことで速度を稼ぐ手法。

Rubyの簡単な例

フィボナッチ数列の例が多いのでそれを題材とする、まずはメモ化しない例

class CalcFibonacci
  # フィボナッチ数列は1個前と2個前の合計値
  def fibonacci(n)
    # 0と1は前がないので
    if n <= 1
      n
    else
      fibonacci(n-1) + fibonacci(n-2)
    end
  end
end

これを計算結果をmemorizeすると以下

class CalcFibonacci
  def initialize
    @cache = {}
  end

  def fibonacci_with_memorize(n)
    # すでに計算済みであれば返却
    return @cache[n] if @cache.has_key?(n)
    if n <= 1
      result = n
    else
      result = fibonacci_with_memorize(n-1) + fibonacci_with_memorize(n-2)
    end

    @cache[n] ||= result
    result

  end
end

メモ化することで再計算がされなくて済む

メモ化のようでメモ化ではない例

Railsにおいて以下の動作がメモ化の例として取り上げられることがある。

def user
  @user ||= User.find(params[:id])
end

一見メモ化のように見えるが、メモ化は以下の通りなので趣が違う。

メモ化された関数は、以前の呼び出しの際の結果をそのときの引数と共に記憶しておき、後で同じ引数で呼び出されたとき、計算せずにその格納されている結果を返す。

これはparamsの値を使っている時点でクラスの状態に左右されるため、引数の値を使うという部分でことなる。そのため上記のようなRailsの例はメモ化というよりはDB読み込みのキャッシュとなる。

参考リンク

TC39とはなにかをざっくりまとめる

mozaic.fmを聞いていると登場するが、どのような組織か知らないのでざっくり調べる

出典

TC39 - Ecma International

上記の内容曰く「ECMAScriptを標準化するための専門委員会」。なおECMAは様々な技術委員会を持ち、TC39はそのうちのひとつ。

TC39がやっていること

出典サイトには以下のようなことを取り組むチームと書いてある

  • ECMAScriptの標準化維持とアップデート.
  • ECMAScriptの機能拡張ライブラリのメンテナンス.
  • 標準化された仕様を維持するためのテストスイートの提供.
  • 標準化した仕様のISO/IEC JTC 1への提供.
  • 追加の技術検討.

参考リンク

プログラミングにおけるバニラという意味をざっくり調べる

雰囲気で使っていたのでTips的な話。

出典

バニラ (ソフトウェア) - Wikipedia)

プログラミングとしてのバニラ

英和辞書で引くと形容詞としては「質素で余分なものや装飾品のない」という内容があり、プログラミングでも似た概念で利用され、「普通」の状態のままのものを表すものとして使われる。

古いとされる利用例

初出に関しては情報がないが、インターネット上に存在する例だと2002年につくられたとされるHTMLの変換ソフトウェアのマニュアル内でなにもない設定ファイルのことを BookMaster's "vanilla" DVCF macros と記載されており、2002年ごろから使われていたことがわかる。またこの使用例ではvanillaの対義語としてmoca(モカ)という表現が使われている

関連リンク

JSで時刻操作をする場合、moment.jsは公式にプロジェクトの終了がアナウンスされたので別のものを検討する

表題通り。

元ネタ

Moment.js | Docs より

We now generally consider Moment to be a legacy project in maintenance mode. It is not dead, but it is indeed done. - 現在では、Momentはメンテナンスモードに入ったレガシープロジェクトであると考えています。死んだわけではありませんが、確かに終わったのです。

上記のページに加えてに説明があり

  • moment.jsを使わなければ行けないケースの紹介
  • 代替ライブラリ、実装の紹介

などがあり、案内としてはかなり丁寧な説明となっている。

紹介されている代替案

  • Luxon - moment.jsの進化として紹介されている
  • Day.js - IE対応などを鑑みた場合に勧められているライブラリ
  • date-fns - 作りのシンプルさを売りにしているライブラリ。Day.jsと比較して語られることが多い。
  • js-joda - Javaの時間操作ライブラリJoda-Time を模倣したライブラリ(とのこと)
  • ライブラリを使わない - 簡単な操作ならピュア実装でもいける

参考/関連リンク

BigQueryで単一のクエリ内で値を定義して定数のように使い回す

いろんなテーブルをまたいで利用するときに似たようなクエリをつくるのでその時のための機能

前提条件

  • STANDARD SQLです(記載タイミングでレガシーのほうを使っているほうが稀かなと思いますが念の為)

やり方

定数定義のような機構はこの記事を書いている時点では存在しないので値だけを返す一時的なユーザー定義関数を作る。

ユーザー定義関数は CREATE FUNCTION を利用する、今回利用する範囲での最低限の文法としては以下

# 関数定義
CREATE TEMPORARY FUNCTION {{一時定義の関数名}}() AS ( {{返却したい処理}} )  

もっとオプションがあるが、そちらに関しては参考リンクのドキュメントをご覧いただければと思います。

実行時のYYYYMMDDの値をとってクエリに活用する。

以下の例は dateが実行日と一致するものかつ、last_update_date内に実行日のYYYYMMDDが含まれているものを探すクエリ

CREATE TEMPORARY FUNCTION QUERY_EXECUTE_NOW_DATE()
AS(
  FORMAT_TIMESTAMP("%Y%m%d" ,CURRENT_TIMESTAMP)
);

SELECT * FROM `example-project.example-dataset.example_table_20100801`
WHERE data = QUERY_EXECUTE_NOW_DATE()
AND last_update_date = QUERY_EXECUTE_NOW_DATE()

参考リンク