かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Ruby Bool値かどうか型チェックしたい。ついでにis_bool?メソッドを作ってみた。

Rubyで変数がBoolean型かどうかチェックしたい。
かなりレアケースな気がするけれど、この前参加した勉強会で要望があったのでトライしてみた。

RubyのTrueとFalse

  • false ... false, nil の時
  • true ... false, nil 以外全てtrue

Rubyには is_bool? という関数はない

true.is_bool?
# => undefined method `is_bool?' for true:TrueClass (NoMethodError)

エラーになります。

is_a?(クラス名)というメソッドを使うとオブジェクトが引数のクラスのインスタンスかどうか判定できるので、これを利用する。
trueTrueClassfalseFalseClassインスタンス
BooleanBoolClassってクラスは無いっぽい。

val = true
p val.is_a?(FalseClass) || val.is_a?(TrueClass) # => true

val = false
p val.is_a?(FalseClass) || val.is_a?(TrueClass) # => true

val = nil
p val.is_a?(FalseClass) || val.is_a?(TrueClass) # => false

チェックできるけど記述が長いので何回もチェックが必要だとめんどくさそう...

is_a? を使わない方法を考えてみる

値を!!でtrue/falseに変換して比較したらいけそうな気がしました。

def is_bool(v)
  !!v === v
end

p is_bool true  # => true
p is_bool false # => true
p is_bool nil   # => false
p is_bool 1     # => false
p is_bool 0     # => false
p is_bool ""    # => false
p is_bool true.to_s  # => false
p is_bool false.to_s # => false

なんとなく上手くいっている気もしますが、Ruby===演算子は型チェックをしているのではなく、左辺のオブジェクトによって判定の挙動が異なるらしいので本当にこれでOKなのか少し自信がありません。
ついでに関数化してみたのですが、is_boolって関数名で引数取る感じが何となくイケてない気がします...

他の言語を使っていると、ついつい「===演算子は==演算子よりも更に厳密な同値判定演算子でしょ?」なんて思ってしまいますが、ところがどっこい、Rubyの場合はむしろ===演算子のほうが柔軟な場合もあり得るのです。
Object#===の説明を見てみるとわかりますが、基本的にこの===演算子は、サブクラスで再定義されていない限り、単にObject#==を呼び出すだけなんですね。

出展: Rubyのcase式と===演算子について - しばそんノート

TrueClass, FalseClassでは#===が定義されていないようだったので、Object#===と同じなのではないかと思います。
ってコトは !!v==vでも同じことっぽい!?

Object
obj === other → true or false
Case Equality – For class Object, effectively the same as calling #==, but typically overridden by descendants to provide meaningful semantics in case statements.

出展: https://ruby-doc.org/core-2.2.2/Object.html#method-i-3D-3D-3D

Rubyは定義済みのクラスにメソッドとかを追加できるっぽい

手持ちの初めてのRubyという本を見ていると、オブジェクトとクラスの章にRubyは「定義済みのクラスに対して、いつでも定義を追加することができます。」とありました。
Objectクラスにis_bool?というメソッドを追加することも可能っぽかったので試してみました。

class Object
  def is_bool?
    !!self === self
  end
end

p true.is_bool?  # => true
p false.is_bool? # => true
p nil.is_bool?   # => false
p 1.is_bool?     # => false
p 0.is_bool?     # => false
p "".is_bool?    # => false
p true.to_s.is_bool?  # => false
p false.to_s.is_bool? # => false

一応 Object.is_bool? でBool値かどうか判定できるっぽものが出来ました。
メソッド内の判定をself.is_a?(FalseClass) || self.is_a?(TrueClass)にした方が判定としては確実かもしれません。

ただ、個人的に大元になるObjectクラスにメソッドを追加するのは正直どーなの?という感覚があるので良し悪しが判断できません。
こうするとCoolだよとかRubyっぽいよ。ってのがあれば教えてください。


[参考]

初めてのRuby

初めてのRuby

Gmail 定型文に便利なChrome拡張

GmailをWEBブラウザで使っています。
問合せの返信などで定型文を使いたい時、設定 > Labs > 返信定型文 で定型文を作成できるのですが、定型文の挿入と保存が同じポップアップ内に出てきて分かりづらかったり、件名が自動挿入されるなど、件名含めてガッチリフォーマットが決まっている場合以外ちょっと使いにくい感じだなぁ〜と思い使っていませんでした。
今回どうしても毎回コピペするのもメンドーで探していると良いChrome拡張を発見しました!

Gorgias Templates

使い方は公式の動画を

拡張をインストールするとメール作成画面の右上に「g」アイコンが出てきます。
アイコンをクリックすると、登録してある定型文のリストが表示され、選択するとマウスカーソルがある場所に定型文が挿入されます。
f:id:kikiki-kiki:20161018175807p:plain

定型文作成時にコマンド登録をすればコマンドで定型文を挿入することもできるようです。(これはあまり使わなそう...)
デフォルトで入っているテンプレートはテンプレート作成画面を開けば削除できます。

よくメールを送る相手の会社名が長くて記入がメンドーとか、好きな所に定型文を入れたいような場合には便利な拡張じゃないかなと思いました。


Googleサービス Perfect GuideBook [改訂第3版]

Googleサービス Perfect GuideBook [改訂第3版]

🇵🇱ポーランド🇵🇱ワルシャワでSIMをゲットして快適インターネッツライフ

🇵🇱 ポーランド(ワルシャワ)にも行っていました。
ポーランドでもプリペイドSIMをゲットして快適インターネッツライフを行えたので知見をシェアしたいと思います。

事前に調べていたポーランドで手に入れやすいSIMで代表的なものは下記の3種。
Orange
Plus
Play

ワルシャワショパン空港(Lotnisko Chopina w Warszawie)から直通の中央駅の隣りにある商業施設内の電気屋で上記全てのプリペイドSIMが色んなプランのパッケージで売っていました。
私は以前ワルシャワに行った友人が「ワルシャワ市内では4Gで爆速やぞ!」と薦めていたPlayを選択することに。パッケージは基本的にポーランド語で書かれてて詳しい事はよく判らなかったのですが、まぁ安いので3GBと書かれた9zł (約240円)のパッケージを購入しました。

対応しているSIMがどれかがパッケージの上の黄色い部分に書かれています。
 
パッケージの中はこんな感じ、多くのSIMと同じようにカード型で必要なSIMサイズに切り取って使うタイプです。

カードの表面に電話番号があり裏面にPINとPUKコードが書かれています。
中の説明書はある程度 英語での説明があります。アイコンがあるので何となく理解できる感じです。
 

SIMのアクティベートでハマった!

ネットに出ている情報などではSIMを挿せばそのまま使えた。という情報が多かったのですが、私の場合SIMを挿すとgoogleMapで現在地を見ることはできたのですが、googleMapでの検索やSafariTwitterなどを使うことができませんでした。

Playの英語のWEBサイトにはパッケージの情報やアクティベーションの方法が載っています。

参考: http://promocje.play.pl/en/
私の場合サイトの情報を元にActivation codeをSMSで送ってみたりしたのですが、エラーが帰ってきてSIMをアクティベートする事ができませんでした。

調べていると次のような記事をみつけました。

Up to 2016 you could buy a prepaid SIM card in Poland without registration at every street corner like chewing gum. This has changed since July 2016 because of the new anti-terrorism act.

Registration is now taking place mostly in the stores and sales outlets of the providers. There, you are required to register by showing your national ID card or a foreign passport and adding the SIM card number. The operators are giving out high bonuses for registration. SIM cards for minors below 13 years of age now need the consent of a parent.

It's not possible anymore to buy a prepaid starter set without showing your ID. Take care, that many places still sell them, but you can't register there, especially if you have a foreign ID. But without registration, you SIM card won't be activated. That's why it's recommended to go directly to an operator's store instead located in towns and shopping centers. Furthermore, all 2000 kiosks of the Ruch chain (locator) and many post offices sell and register SIM cards of all 4 providers and most MVNOs.

More than 50 million prepaid SIMs in Poland need to be registered within the next months and the first blocking could take place as early as February 2017. As there is no legal limit of how many SIM cards can be activated on someone's name, a black market has now emerged. Some vendors sell cards registered on their name for a high surcharge of 20 PLN or more on the internet which is illegal according to Polish law.

Poland | Prepaid Data SIM Card Wiki | Fandom

どうやら2017年7月からテロ対策の関係で法律が変わりプリペドSIMも利用者IDの登録が必要になっているっぽです。
Playのサイトでも次のようはSIMへのIDの登録を促すページがありました。プリペイドSIMのページから解りやすい遷移が無かったので見つけるのに苦労しました... http://promocje.play.pl/rejestracja/eng/
http://promocje.play.pl/rejestracja/eng/
下の方にFAQがあり、外国人の場合はPlayのお店にパスポートを持っていきID登録をする必要があるようです。
キオスクなどでもID登録ができるようですが、特に言葉などに不安がある場合は専門店に行くのが良いと思います。

Playのお店は次のアドレスで検索可能です。
👉 Play取扱店の検索 ※地図から検索できます。

個人的には、ワルシャワの中央駅を出てすぐの所にあるお店でSIMを購入して一緒にID登録を行うのがベストではないかなと思います。

お店の外観はこんな感じ。

SIMとパスポートとiPhoneを持っていくと、このお店で買ったわけでもない250円くらいのSIMの為にID登録をしてくれました。
対応してくれたお姉さん、ジェンクィェ!
ID登録しようキャンペーンなのか不明ですが、登録してもらうと30日間100GBまで、SIMの有効期間は1年と書かれた紙を渡されました。(あれ?もっと安いSIM買っとけばよかったのでは...!?

PlayのSIMを使ってみて

今回、ワルシャワ市内だけでしたが、市内ではどこでもほぼ4G回線でとても快適にインターネッツを使うことができました。
ホテルのwi-fiが遅かったのでテザリングして使ってたくらい爆速でした。
クレジットが足りなくなっても日本円換算すると安い金額でチャージできるので激安で爆速回線なのでポーランドではSIMフリー端末を持っていくのが良い選択なんじゃないかなって思いました。
また、先にも書きましたがプリペイドSIMの購入の件で法律が変わってID登録が必要になっているようなので、
パスポートを持って回線業者のお店でSIMの購入とID登録を一緒に済ませる がベストだと思います。
 


👇 SIMの管理に便利でした。

👇 安いSIMフリーの端末もあるようなので海外で使うように持っておくのもよいかもしれません。(日本にもお高いけどプリペイドSIMもありますし。

[参考]