コード日進月歩

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

認証と認可がわからなくなったとき、誰かに教えるときに起点にしたい記事「よくわかる認証と認可」

複数サービスをまたぐログイン機構をやる瞬間が多いので、基本を振り返るためのものとして。スライドではないけど回顧録として。

対象の記事

dev.classmethod.jp

みどころ

  • 混同されがちな「認証」と「認可」を短い文章でたとえを交えながら説明された文章
  • TwitterFacebookOAuth認証を使ってログインをする機構を作ることが多いが、本質的なことをわからなくても実装できてしまうため、なんとなく作ってしまった人が読むといい記事。
  • また、改めてログイン機構などをつくるさいに学び直しの起点として読み直すと頭が整理される。

関連リンク

Plain Old *** Object の語源を調べる

POJOとかPOROとか言うけど、何がこの言い回しの由来なのか調べる。

そもそもPlain Oldとは

英語の直訳的な意味としては「単純な」や「普通の」という意味にあたる。なおPlaneではなくPlain。

初出はPlain Old Java Object

初めて Plain Old の言い回しが使われはじめたのは2000年ごろとされている。具体的に使い始められたのは以下のリンク先の文章に記述がある。

この言葉は、2000年9月にRebecca Parsons、Josh MacKenzie、私の3人があるカンファレンスでの講演を準備していたときに生まれたものです。- POJO

使われ始めた背景

先ほどの文章に使い始めた理由が述べられており

私たちは、なぜ人々が自分のシステムで通常のオブジェクトを使うことに反対するのか不思議に思い、単純なオブジェクトには洒落た名前がないからだと結論づけました。そこで、私たちはこの名前をつけました。そして、この名前はとてもうまく受け入れられました。

このように普通のオブジェクトにあたるものの名前がなかったので、名前を与えたという話になる。

派生の言葉

派生の言葉としては色々あり以下のような言葉がある

  • Plain Old Ruby Object
  • Plain Old PHP Object
  • Plain Old CLR Object
  • Plain Old Telephone Service
  • Plain Old Documentation

関連リンク

Rubyにてyield_self/thenを使って普通の戻り値をメソッドチェインのように使う

このエントリはRubyのAdventCalendar2021の13日目の記事です。

書き方として割と見かける事が多いので、こういう使い方もできるよという知識の一つとしてご紹介します。

環境

$ ruby -v
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin19]

今回取り上げるメソッド

Object#then (Ruby 3.0.0 リファレンスマニュアル)

リファレンスとしては then で紹介されているが yield_selfエイリアスとなっている。

どういうときに使えるか

例えば 「対象の変数」の数値に2を加算した数をした数を用意し、その数をその数の分だけ掛け算し、結果の内容を文字列にしたい場合

# 対象の変数はtarget
target = 2

target_plus_two = target + 2
result = (target_plus_two ** target_plus_two).to_s

このようにかけるが変数代入が大変なので、これがyield_selfを使うと以下のように記述できる

target = 2

target.yield_self{|x| x + 2}.yield_self{|x| x ** x}.to_s

使える場面

例えば https://httpbin.org/json にリクエストをすると以下のようなJSONが返ってくる。

{
  "slideshow": {
    "author": "Yours Truly",
    "date": "date of publication",
    "slides": [
      {
        "title": "Wake up to WonderWidgets!",
        "type": "all"
      },
      {
        "items": [
          "Why <em>WonderWidgets</em> are great",
          "Who <em>buys</em> WonderWidgets"
        ],
        "title": "Overview",
        "type": "all"
      }
    ],
    "title": "Sample Slide Show"
  }
}

その際に取得したJSONslideshow.authorという階層の中身を取り、"slide author is #{slideshow.author}" とやりたい場合に愚直に書くと以下のようになる。

require 'open-uri'
require 'json'

url = "https://httpbin.org/json"

response = URI(url).read
parse_hash = JSON.parse(response)
p "slide author is #{parse_hash.dig('slideshow','author')}"

ただ、ここを yield_self/then を使うと以下のようにメソッドチェイン風に書くことができる

require 'open-uri'
require 'json'

url = "https://httpbin.org/json"

URI(url)
  .read
  .then{|response| JSON.parse(response)}
  .dig('slideshow','author')
  .then{|pick_author| p "slide author is #{pick_author}" }

参考サイト

現在ログインしているサーバーの環境変数を全部出すコマンドはprintenv

いつもフッと出てこないので備忘録

環境

$ zsh --version
zsh 5.7.1 (x86_64-apple-darwin19.0)

コマンド

printenv

類似コマンド

set

こちらは環境変数だけではなくシェル変数(現在のログインシェル)の変数も表示する

env,export

従来はいずれも変数を定義するコマンドだが副次的に出力もできる。

関連リンク

UnicodeのCombining Character Sequenceの考え方とその正規化についてざっくりまとめる

Unicodeでポなどがホと半濁点の記号に分離されても一つの文字として見えてしまう現象に関してざっくりまとめる

TL;DR

  • Unicodeでは2つの文字符号位置を合わせて1つの文字を表す Combining Character Sequence という概念が存在する。
  • 日本語の濁音と半濁音にも「かな」と「濁音」をバラバラに扱い足し合わせることができる。そのためmacOSなどでは分解されてしまうケースがある。( に別れてしまう)
  • Unicodeでは正規化する方法が定義されており、合成後の文字が定義されている場合はその文字に変換される(は合成後の が1文字として定義されているので、そちらに変換できる
    • ただしこの正規化は漢字の扱いにおいて留意する点があるため、統一化したい場合に問題ないかを認識しておく必要がある

Combining Characterとは

Combining Characterとは何かしら他の意味のある文字と組み合わせて使うための文字のことを指す。日本語だと濁音(UnicodeコードポイントはU+0399)、英字だとウムラウト̈、コードポイントはU+0308 )などが当てはまる。

Combining Characterの使われ方とCombining Character Sequence

などのBase Characterとよばれるベースの文字とワンセットでつかうことで を表現することができる。このようにBase CharacterとCombining Charactorを合わせたものを Combining Character Sequence と呼ぶ。

また、のようにすでに「か」と「濁音」が一つとなってコードポイントが定義されているような文字のことをPrecomposed Characterと呼ぶ。

Combining Character Sequenceの問題点

上記のように組み合わせ次第で色々表現が可能となっているUnicodeの仕様だが、プログラムで解析するときに『』と『 +』は別ものになってしまうので、「ばか」という文字列だったら除外するのような処理をする場合に処理の書き方によってはCombining Character Sequenceで表現された文字はすり抜けてしまう危険がある。

1つの解決策としての正規化

Unicodeでは正規化という機構を用意しており、「分解」と「合成」という概念で処理をする。

「分解」はCombining Character Sequenceとして分解可能な文字を分解する処理、「合成」はCombining Character Sequenceが同一視できるPrecomposed Characterが存在すれば合成して一つの文字にすることを言う。

この「分解」と「合成」に関して分解後と分解前、合成後と合成前に同じものであるかのルールに関しても考え方が2つある。 ひとつは「Canonical Equivalent(正準等価)」という視覚的および機能的に等価な文字を等価と考える方法でもうひとつは「Compatibility Equivalent(互換等価)」というサンチーム を等価と考える広い解釈の2つがある。

正規化に関してはルールがいくつか存在するのですが、よく使われるのが Normalization Form Canonical Composition (略称:NFC) があり、これは「正準等価によって分解され、再度正準等価で合成される。」というもの、なのでひらがなやカタカナと濁音を一つの文字コードに寄せる場合にはこのNFCを利用すれば一律Precomposed Characterに変換することができる。

NFCを使うときの困りポイントであるCJK互換漢字

ここまでの説明だと「NFCで一律正規化をかければすべてPrecomposed Characterになるので解決」となりそうなのですが、NFCでは今回のCombining Character Sequenceとは別の観点の問題としてCJK互換漢字の問題があります。

CJK(ChinaJapanKorea)互換漢字は日本・中国・韓国の漢字の類似する文字を統合するCJK統合漢字という概念があり、その互換性がある漢字のことを指す。

よく語られるのは神の字で「ネ申」と書くのが普通だが「示申」と書くケースがあり、この2つはCJK互換漢字の関係にあり、すべてCJK統合漢字である「ネ申」と書く神に集約される関係にある。

NFCを使うとCJK互換漢字はすべてCJK統合漢字に変換されるので、厳密に漢字を扱いたい場合は何も考えずにNFCを行うと漢字が置き換わってしまうので気をつける必要がある。

補足:Combining Character Sequenceの日本語訳について

この Combining Character Sequence に関しては訳し方が年代によって変わっており、最近は「結合文字列」という表記をされることが多いが、物によっては直感的な認識を優先して「合成文字」と訳されるケースがある。

今回はその点に関して齟齬が起きづらいように英文ママの表現でざっくりまとめました。

詳しくは以下のリンクを参照すると日本語情報を調べるときに役立つと思います。

Unicode正規化 用語の混乱について 第4.2版 – ものかの

参考リンク

なお、未見なのですが文字コード悩まされる事が多いので下記の本を読んでみたくなりました…(財布の関係でまだ未入手)

エンジニアの採用に携わることになったらまず目を通したい『エンジニアを採用する技術』

エンジニアに限らず、採用に関して考えなければいけなくなったときにまず頭に入れたい資料

資料スライド

speakerdeck.com

みどころ

  • 採用に関してのアプローチに関してマーケティングの手法を応用して説明されており、一定の経験値から語られている。
  • 内部の環境がよくすることが大事(まず隗より始めよ)とあり、広報戦略としてもリファラル戦略としても効いてくる側面の話が記載されている。
  • エンジニアの採用にまず何もアイデアがないときに思考整理の出発点として見ておくと良い話になっている。

関連リンク

JavaScriptのアロー関数に関してざっくりまとめる

アロー関数の勘所に関して再確認も含めてメモ

基本の文法

即時returnのアロー関数

before

x = function(z){
  return z + 100;
}
console.log(x(20))

after

x = (z) => z + 100
console.log(x(20))

複数処理をする場合のアロー関数

returnをしっかり明示する必要がある

before

test = function(z){
  let x = z + 100
  return `${x}が結果です`
}
console.log(test(29))

after

arrowTest = (z) => {
  let x = z + 100
  return `${x}が結果です`
}
console.log(arrowTest(29))

オブジェクトを返すアロー関数

{}で返すと従来記法と区別がつかないので ()で囲む

before

test = function(z){
  return {"input": z, "result": z + 100}
}
console.log(test(29))

after

arrowTest = (z) => ({"input": z, "result": z + 100})
console.log(arrowTest(29))

スコープに関して

アロー関数はthisのスコープが異なる

従来の関数式の形式で書くとスコープがしっかり定義されるが、アロー関数はスコープが異なる。以下例

通常の関数式の場合

this.target = 20
const testObject = {
  "target": 100,
  "calc": function(z) { return `${z + this.target}が結果です`}
  
}
console.log(testObject.calc(10))

この場合this.targetはtestObject.targetになるので以下のような結果になる

"110が結果です"

アロー関数の場合

this.target = 20
const testArrowObject = {
  "target": 100,
  "calc": (z) => `${z + this.target}が結果です`
  
}
console.log(testArrowObject.calc(10))

この場合、グローバルのthisを参照するため結果は以下のようになる

"30が結果です"

参考リンク