JavaScriptのおもしろシンタックス

SNSみてるとセカオワのドラゲナイはもう懐メロなんだろうなって感じました。
マエダです。
(´-`).。oO (え?懐メロって死語ですか?

javascript

さて、みんな大好きJavaScript。
おもしろいシンタックスをご紹介します。

文字列型へのキャスト

var a = 1;
console.log(typeof(a)); // number
var b = "" + a;
console.log(typeof(b)); // string

数値型へのキャスト

var a = "1";
console.log(typeof(a)); // string
var b = ~~a;
console.log(typeof(b)); // number

配列の重複削除

const array1 = ["a","b","b","c","a"];
const array2 = [...new Set(array1)];
console.log(array2); // ["a","b","c"]

オブジェクトの値渡し

var object1 = ["a","b"];
var object2 = object1;
object2[0] = "c";
console.log(object1); // ["c","b"]
console.log(object2); // ["c","b"]

JavaScriptではオブジェクト型は参照渡しとなります。
以下のようにすればプリミティブ型のように値渡しとすることができます。

var object1 = ["a","b"];
var object2 = JSON.parse(JSON.stringify(object1));
object2[0] = "c";
console.log(object1); // ["a","b"]
console.log(object2); // ["c","b"]

僕の場合、どんなプログラミング言語もなのですが、ときどき触るとはじめましてになりがちです;

ドラゲナイ


デュアルSIMで通信費を削減してみた話

コロナ禍で在宅勤務が続き、家でWi-Fiを利用する時間が長くなり外出も減ったことでスマホの通信容量が毎月かなり余るようになったので、スマホの通信プランの見直しをしました。

【今までの通信プラン】
LINEモバイル
コミュニケーションフリープラン(5GB)
月額2,220円(税込2,442円)

多くても月に3GBぐらいしか使わなくなったので、ちょっともったいないですよね。

楽天モバイルが気になっていた

そこで前から気になっていた「楽天モバイル」の契約を検討しました。
最近、1GBまでなら永遠に無料で利用できるプランを発表されましたね。利用通信量によって段階的に料金が設定されているので、私の場合月に3GB利用したら980円(税込1,078円)で利用できる想定になります。

そしてなにより、今だけのキャンペーンで1年間無料キャンペーンをしており、実質2022年の2月まではどれだけ使っても無料ということになるので大変オトクな状況になっています。あ、あと楽天LINKというアプリを経由して通話すれば通話料も無料になります。

そうだ!デュアルSIMを使おう

ただ、楽天回線自体がまだ大手3キャリアとは少し違った位置づけになり、何が起こるかわからないため保険でLINEモバイルの回線は残したまま、楽天モバイルはeSIMを利用することでデュアルSIM運用をしてみようと考えました。

eSIMとは、スマホに直接差し込む物理的なSIMカードではなく、スマホに内蔵された本体一体型のSIMになります。eSIMを使えば、物理SIMカードとeSIMの2つのSIMを設定することができ、1つのスマホ内で2つの回線を持つことができるようになります。

また楽天モバイルを申し込むのと同時に、LINEモバイルのプランもこのタイミングで一番安いプランの、500MBで月額1,100円(税込 1,210円)にプラン変更しました。

通信費を50%削減できました

これで今までの料金から50%削減の月額1,210円で、通信容量を気にせず1年間利用できるようになりました。LINEモバイルのプランはコスパがちょっと悪いので、もっと安いプランのある会社に今後MNPしようと考えています。

【今までのプラン】
LINEモバイル
コミュニケーションフリープラン(5GB)
月額2,220円(税込2,442円)

     ↓

【見直し後のプラン】

LINEモバイル

ベーシックプラン(500MB)

月額1,100円(税込1,210円)
  +
楽天モバイル

Rakuten UN-LIMIT VI

月額 0円〜2,980円(税込3,278円)

※1年間無料、1年後でも私の利用環境では3GB 1,078円(税込)想定

かんたん!eSIMの申込方法

eSIMを申し込むのは簡単で、楽天モバイル申込時にSIMの形式で「eSIM」を選択するだけです。
あとは届いたスタートガイドに沿って、iPhoneの設定画面から主回線を「LINEモバイル」、副回線を「楽天モバイル」で設定するだけです。
設定自体は5分もあれば終わります。

デュアルSIMの設定が完了すると、アンテナが2本表示されます。なんかかっこいいと思うのは私だけでしょうか。

デュアルSIMってなんだか難しそうな印象があったのですが、やってみるとなんてことなくて拍子抜けしてしましました。やはり何事も挑戦することは大切ですね。。!
楽天モバイルの通信環境も今のところ問題なく、このまましばらく様子を見てみようと思います。固定費である通信費の削減にも繋がり、変えて本当によかったです!

さいごに

スマホの料金プランは、国からの指導も入ったこともあり日々状況が変わりドコモのahamoやauのpovoなど色々なプランが出てきています。格安SIM業者も様々なプランを工夫をこらして出してきています。
なるべくお得にいい条件で利用できるように、私自身もアンテナを張って情報収集していきたいと思います。


最近ハマっている食べ物

こんにちわ。
リエです。

暖かくなり過ごしやすくなってきましたね。
4月からは新年度!なんかワクワクするのは私だけでしょうか。

最近ハマっている食べ物があります。
それは[焼き芋]です🍠
うちのワンコちゃんがお芋大好きでよく母親が蒸してあげていたので、そのおこぼれをもらっていたのをきっかけにハマりました。

今はコンビニやスーパーで焼きたてを買えますが、手間がかかってもお家のオーブンで焼いて作る焼き芋が好きです。
どうせならスーパーで買える品種で食べ比べしてみようと思い、[安納芋][なると金時][シルクスイート]で試してみました。

〈用意するもの〉
・洗ったさつまいも
・アルミホイル
・新聞紙またはキッチンペーパー

〈作り方〉
1.よく洗ったさつまいもを濡れたまま新聞紙またはキッチンペーパーで包み、さらにアルミホイルで隙間なく包む。
💡ポイント💡
濡れたままのさつまいもを新聞紙またはキッチンペーパーで包むことでパサつきのないしっとりとした焼き芋になります。

2.160度(予熱なし)のオーブンで60分〜90分*焼く。
*小さなサイズだと60分、大きいサイズだと90分で焼くといい感じです。
💡ポイント💡
さつまいもは低温でじっくり焼くことで甘くなるので160度で焼きます。

3.焼き上がったらすぐにオーブンから出さずに、予熱でさらに火を通す。
予熱が冷めたら取り出し食す🍠
💡ポイント💡
バターとの相性は大優勝。

ちなみに食べ比べした3品種ですが、
・安納芋・・・ねっとり系で甘さしっかり
・なると金時・・・しっとり系でいい意味ではるかな甘さ
・シルクスイート・・・ねっとりとした甘さでなめらか
個人的には[シルクスイート]が1番好きでした。

低温でじっくりオーブンで焼いた焼き芋は本当に美味しく、お砂糖使ってないのにこんなに甘くなるなんて!と毎回食べるたび感動しています。

他オススメの品種があったらぜひ教えてください🍠🍠


健康診断で初めての鼻から胃カメラ

とうとう健康診断で胃の検査が必要な歳になりました。

今年から胃カメラを選択できるようになったので、バリウムは体験せず胃カメラを選択しました。バリウムは何か見つかると結局胃カメラを飲まないといけないのと10数年前に一度口から胃カメラを検査した際ピロリ菌があるかもとのことで当時はがん関係は不明とのことでしたが、今だと原因になりうるようなので胃カメラ一択です。

健康診断

3,5年に一度胃カメラの検査をした方がいいと言われましたが、正直口からの胃カメラはしんどすぎるのでやっておりません。10数年前のことになりますが、記憶に残ってる限りでは口からの胃カメラは麻酔を喉部分で止めて数分、その後胃カメラを口からいれていき胃の部分まで挿入。このとき口からの場合ずっと嘔吐感がありつつ自然と涙が溢れ出てくる感じです。いつ終わるかわからないままずっとおえおえ言いつつ涙を垂れ流す・・・正直もう体験したくありません。

胃カメラ

今回は鼻からの胃カメラです。当時の記憶が蘇りつつも口からよりマシのはずと思い挑んだ結果ですが、10数年の違いもありますし口と鼻との違いに単純に腕の差なのかもしれませんが、正直口からに比べて天国と地獄レベルの違いでした。

まず鼻に麻酔のジェルっぽいのを注入されくだっぽいものを鼻の奥まで挿入、喉の奥あたりに割と苦い感覚がありつつ麻酔が効いた後にくだっぽいものを抜いて鼻から胃カメラを投入。カメラはどんどん鼻の中に入っていき10数年前の記憶にある圧迫感はありつつも嘔吐感はなく胃まで到着。しんどいことはしんどいですが口からに比べたら全然問題ないレベルでした。(個人差があります)

鼻から胃カメラ

強いて言えば終わりまでの時間がわからないので進捗メーターを表示して欲しいぐらいです。そして健康診断はこれからずっと鼻からの胃カメラでいいと思った次第です。

追伸:診断結果でやっぱりピロリ菌の疑い濃厚だったので自費で検査を追加してもらいました。


【Solr】JapaneseReadingFormFilterについて

はじめに

Solrでは、扱う対象の言語に応じた Tokenizer や TokenizerFilter が用意されています。リファレンスに日本語用のものもまとめられています。リファレンスには何故か載っていないもののよく知られているフィルタとして JapaneseReadingFormFilter があります。これは、形態素解析後の単語の読みをインデックスするためのものです。

この JapaneseReadingFormFIlter を使って、漢字の読みで検索できるように設定してみました。

JapaneseReadingFormFilterの基本的な使い方

JapaneseTokenizer を使うフィールドダイプの定義に以下を追加します。

<filter class="solr.JapaneseReadingFormFilterFactory" useRomaji="false"/>

_default コンフィグセットの定義に倣うと、以下のようになります。

    <dynamicField name="*_txt_ja_reading" type="text_ja_reading"  indexed="true"  stored="true"/>
    <fieldType name="text_ja_reading" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
      <analyzer>
	<tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>
        <filter class="solr.JapaneseBaseFormFilterFactory"/>
	<filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt" />
        <filter class="solr.CJKWidthFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt" />
        <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
	<filter class="solr.LowerCaseFilterFactory"/>
        <!-- 以下を追加 -->
        <filter class="solr.JapaneseReadingFormFilterFactory" useRomaji="false"/>
      </analyzer>
    </fieldType>

読みで検索できるようにする

JapaneseTokenizer で使われている Kuromoji はカタカナで読みを提供するので、JapaneseReadingFormFilter を通した結果はカタカナでインデックスされます。

[
    {
        "id" : "1",
        "body_txt_ja_reading" : "Solr 8.4 からパッケージ管理機能が追加されました。リファレンスによると、ここでいうパッケージは1つまたは複数のプラグインを1つにまとめたものという意味のようです。Solr におけるパッケージ管理について調べました。"
    },
    {
        "id" : "2",
        "body_txt_ja_reading" : "昨日の午後"
    }
]

この2つの文章をインデックスしたときのタームは以下のようになります。

上の基本的な設定の内容だと、インデックス作成時と検索時とで同じ Tokeinizer の設定になっているで、読みで検索するには不都合です。漢字表記とカタカナ表記とで単語の分割のされ方が異なる場合があるからです。

そこで、入力されたカタカナはそのまま利用するというルールにして、検索時には WhitespaceTokenizer を使うことにします。

   <dynamicField name="*_txt_ja_reading" type="text_ja_reading"  indexed="true"  stored="true"/>
    <fieldType name="text_ja_reading" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
      <analyzer type="index">
        <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>
        <filter class="solr.JapaneseBaseFormFilterFactory"/>
        <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt" />
        <filter class="solr.CJKWidthFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt" />
        <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.JapaneseReadingFormFilterFactory" useRomaji="false"/>
      </analyzer>

      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory" rule="java"/>
      </analyzer>
    </fieldType>

この設定により、「キノウ」で検索すると文書1と2の両方が、「キノウ ゴゴ」で検索すると文書2だけがヒットするようにできました。

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":2,
    "params":{
      "q":"キノウ",
      "defType":"edismax",
      "qf":"body_txt_ja_reading",
      "fl":"id,body_txt_ja_reading",
      "stopwords":"true",
      "_":"1606578263384"}},
  "response":{"numFound":2,"start":0,"numFoundExact":true,"docs":[
      {
        "id":"2",
        "body_txt_ja_reading":"昨日の午後"},
      {
        "id":"1",
        "body_txt_ja_reading":"Solr 8.4 からパッケージ管理機能が追加されました。リファレンスによると、ここでいうパッケージは1つまたは複数のプラグインを1つにまとめたものという意味のようです。Solr におけるパッケージ管理について調べました。"}]
  }}
{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":1,
    "params":{
      "q":"キノウ ゴゴ",
      "defType":"edismax",
      "qf":"body_txt_ja_reading",
      "fl":"id,body_txt_ja_reading",
      "q.op":"and",
      "stopwords":"true",
      "_":"1606578263384"}},
  "response":{"numFound":1,"start":0,"numFoundExact":true,"docs":[
      {
        "id":"2",
        "body_txt_ja_reading":"昨日の午後"}]
  }}