yakataの情報奮闘記

プログラミングの話をします

【理論値166%還元】BookWalkerの新規登録100%還元キャンペーンをBIT全探索を用いて上手に使った方法

今BookWalkerでは新規登録者に限り、100%還元とかいう狂ったことをやっております。

bookwalker.jp

自分は夏の90%還元のときに登録してしまったので、まだ入っていない人が羨ましい限りです。

さらに現在は50%還元キャンペーンもしているので、登録済みの人でも新規登録の人の2回目以降の注文でも50%還元が適応されます。 BookWalkerはポイントで支払ってもポイントがつく神(謎)仕様のため、等比級数の総和のように還元されます。

今回であれば初回支払った費用をxとすると、合計で得られるポイントは本体分にしかポイントがつかないことに注意して

 {\frac{x}{1.1}+\frac{x}{1.1*2.2}+\frac{x}{1.1 * 2.2 ^ 2}}+...=\frac{5}{3}x

となり、166.666....%還元です。恐ろしいですね。さすがに限度額等はありそうですが。

さて、友人にこの話をしたところ、「Thisコミュニケーション」という漫画を一括で買いたい、今後使う予定はないからポイントは使い切って構わないという旨の話がありました。

Thisコミュニケーション(ジャンプコミックスDIGITAL)(マンガ(漫画))の電子書籍無料試し読みならBOOK☆WALKER

理論値は上記の通りですが、実際は本は数百円しますし、離散的なものなので、どのような手順でそれが達成できるのかわかりません。この話を聞いたとき、競技プログラミングっぽいなとおもいました。具体的には1500円以上という縛りを無視すると以下のような問題に落とし込めます。


TくんはBookWalkerが新規登録者が1回目の買い物をするときに限り、本体価格の100%ポイント還元をやっていて、2回目以降の買い物でも本体価格の50%分ポイントが還元されることを知りました。

今買いたい本の価格のリスト  A[A_1,A_2,...,A_N ]が与えられているとき、必要な金額の最小値とそのとき初回で買う本のINDEXを答えなさい。 ただし、ポイントは1ポイント1円で使用でき、ポイントで支払ってもポイント還元を得ることはできるものとします。

制約:

 1 \leqq N \leqq 20

 配列Aは降順でソートされていることが保証されている


今、1回目に購入するか、2回目に購入するかにだけ分けて考えれば良さそうです。最後に買うのが最安のものであれば過剰に支払うこともなさそう。あとはNが小さいので、1回目に買う組み合わせを全部調べればよい→BIT全探索

ということで日常の問題を競技プログラミングの問題に落とし込めることができました。

実装すると

price_in_tax = list(map(int, input().split()))
# print(price_in_tax)

ans_price = 100000
ans_array = []

for i in range(1<<12):
    tmp_price = 0
    tmp_point = 0
    tmp_ary = []
    # 初回
    for j in range(12):
        if ((i>>j & 1)==1):
            tmp_ary.append(j)
            tmp_price += price_in_tax[j]
            tmp_point += price_in_tax[j]/1.1
    
    for j in range(12):
        if ((i>>j & 1)==0):
            if tmp_point >= price_in_tax[j]:
                tmp_point -= price_in_tax[j]   
            else:
                tmp_price+= price_in_tax[j]-tmp_point
                tmp_point = 0
            tmp_point += price_in_tax[j]/2.2

    if (ans_price > tmp_price):
        ans_price = tmp_price
        ans_array = tmp_ary


print(ans_price)
print(ans_array)

結果

2591.818181818182
[5, 6, 7, 10, 11]

ポイントが税込価格の合計から計算した税抜き価格で計算されるため、複数冊あると数円切り上がることがあるため、floor関数使わずに小数のまま処理しています。

結果は(価格を昇順にしたことに注意すると)1,2,5,6,7巻目を初回で買うといいことがわかりました。1回の会計1500円以上の縛りを思い出すと2回目、3回目に適当な3冊を買い(すべて500円以上のため1500円を超える)、最後に一番安い3巻目を最後に買うことで、2593円で買うことができる予定です。(ポイントの切り上げについてはわかっていないことがあり、その通りに買えるかどうかは返信待ちです)

本来6,458円していたものがこの価格であることを考えると恐ろしいですね。1巻300円を切っています。還元率は149%ということで概ね理論値をだすことができたんじゃないでしょうか。

そんなBookWalker還元セールは月曜日朝まで!期日短いですが、この機会に買ってみたい漫画や本がありましたら使ってみてはいかがでしょうか。

※BookWalkerからお金はいただいておりません

MacでGoogle日本語入力が起動しなくなったので解決策メモ

PCの起動時にGoogle日本語入力が起動できないエラーが出たので、やったことと解決策など

解決策

左上の→システム設定→「ログイン」と打ってログイン項目

Googleと名のつくものを有効に

Google日本語入力の設定画面でログイン時の起動にチェック→適応 「適応できませんでした。」みたいなログが出てくるけど、無視して再起動

これで解決しています。色々同時にやったので、どれが原因だったかわかりませんが……

Google Cloud Skills BoostのGenerative AI Pathが終わったので

www.cloudskillsboost.google

AIってなんですか?機械学習や深層学習と何が違うんですか。みたいなところから始めて、

  • 教師あり学習教師なし学習、半教師あり学習の分類
  • 分類と生成の違い
  • (今の)生成AIで解いているタスク
  • LLMsについてコストとできることの概観
  • 責任あるAI
  • 具体的な生成AIのアーキテクチャ
    • コードを書いて理解しよう
  • 実際にGoogle Cloudで触ってみよう
    • VertexAI
    • Generative AI Studio
  • 言語生成AIのあれこれ
    • プロンプトデザイン
    • モデルのtuning

みたいなところを広く浅く取り扱ったlearning path.

畳み込みネットワークやGANくらいのところで知識が止まっていた(し、画像のSegmentationくらいしか詳しくなかった)ので、AttentionやTransformersの文脈と言語モデルの文脈でEncoder-Decoderがどういう雰囲気なのかが分かった気になれて面白かった。

PNG拡張子のファイルが複数枚の画像を保持していたので、PNGの拡張APNGについて調べた

何があったか

Macでpdfをpngに変換したところ、PNGファイルに複数枚保存されていた。仕様を調べてもpngファイルの圧縮の仕方やヘッダーについてなどが書いてあるのみで、複数枚を入れる方法は不明であった。

結論 APNG形式だった

APNG形式(拡張子.png, .apng)というアニメーションができるpngの拡張が存在している。

データベーススペシャリスト本番後の日記

データベーススペシャリスト本番後の日記

データベーススペシャリスト受けてきたので、覚えているうちに当日の所感を書きます。まだ採点はしてません。

※追記: 2022/10/10 午前は8割くらいありました。

難易度

(易しい→)午前2<午後2<午後1<午前1<<<0次試験起床or参加する心(←難しい)

試験と非本質なやらかし

昼食の確保→持って行き忘れました。ファストフード店近くにあって助かりました。

持ってくるべき水分・糖分→500ml1本じゃ足りませんでした。自販機あって助かりました。お菓子忘れました。どうにもなりませんでした。

休みの長さ→30分あるんですが、20分前には着席と言われているので実質10分で昼まで自販機捜索できない。

0時試験起床 or 参加する心

半分ネタで言っているんですが、自分の教室1/3くらい不参加でした(免除除く)。多分今日一番落とした試験。

受からないにしても、本番同様の環境で受ける模試だと思って受けてみればいいのになぁなどと思います。

意外と本質じゃないところで躓いたりします。(前述: 試験と非本質なやらかし)

午前1

30問の択一マークシート問題。応用情報とか高度情報とか持っていると免除になる期間がある。

応用情報の午前問題80問から30問出題。つまりは問題範囲がめちゃくちゃ広い。普通に難しいので、午前1免除がある人はあるうちに高度情報受けた方がいいです。(自戒) 朝起きる時間も1時間遅くていいですし。

昔応用取ったし大丈夫でしょ〜(怠慢)で勉強時間あんまりかけないで突っ込んだら、結構危うい感じになりました。 落ちるにしても次回午前免除欲しいし、勉強時間配分間違えたかなぁって感じ。 リスクアセスメントが甘い。

午前2

過去問が結構出て、今日の中では一番簡単。あんまりいうことがない。

午後1

3問中2問選択して解答する問題。記述式。

午後2問2選択のため、午後1問1は選択するとしてもう一問どっちを選ぶかが難しい。

2問選ばなきゃいけない範囲の広さと時間のなさが鬼門。

ちゃんと選びたかったら、30分/問くらいでやらないといけないんだけど、その領域にはいけないかな。

午後1問1が午後2問2より難しかったのひどくない?

午後2

2問中1問選択して解答する問題。記述式。

例年問2は形式が決まっているので、問2選ぶと勉強の道筋を立てやすい。

テーブルの量に圧倒されたけど、見かけだけで例年に比べて多分軟化してる。昔はエンティティを付け足す問題はいくつエンティティ足せばいいのかわからなかったけど、近年は穴埋め形式だし(個数わかるの助かる)、今年はリレーションを2つ追加しなさいと数の指定まであった。

設問みる→前から読んでテーブルと文章をリンク(テーブル名の横に1(3)②みたいにメモる)させながら、頑張ると見通しが良かった。

そもそもの問題の意味

午後の問題は問題を難化させるために言葉が少ない文章が多い気がします。特に、主語がない文章から文脈を当てるスキルは多分DBスペシャリストとは無縁なものなのに試験では必要なものの代表な気がする。

感想

最初は手も足も出なかった午後2を解くための手順考える作業が面白かった。

応用情報の時みたいに全然知らない単語が出てきてその世界を知るきっかけになるということはなかったが、20−30個のテーブルのリレーションを考えるみたいなことが実務では必要になる(多分実際はもっといる)ことや、その対応がさわりだけでも理解できたのが学びだったなぁと。

次回何かするとしたら統計検定か、ネトスペかあるいは海外の資格系(AWSなどを含む)かなぁ

更新履歴

2022/10/10 改行ができていない不具合を修正しました。 一部追記をしました。

Firefoxでタブバーをちゃんと消す。

お久しぶりです

Firefoxでタブバーをけす

縦型のツリータブ Tree Style Tabを使っていると、上部のタブが不要に感じられるようになりました。 そこで、FirefoxCSSでそれを消してみようという話です。 ここまでは先人が多いのでリンクだけ。

nibikitune.com

これを適応するとこうなりました。

Firefox上部のスクリーンショット

確かにタブは消えたのですが、タブが存在していた領域は占領されたままです。これはタブを入れていた要素は残ってしまっているからです。 cssのスコープを#tabbrowser-tabsから#titlebarに変えてあげると解決します。

#titlebar {
    visibility: collapse !important;
}

Google Calendarにファイルをインポートしようとしたら少し詰まった話

Intro

大学から送られてくるスケジュール(pdf)を今までポチポチとGoogle Calenderで打ち込んでいたのですが、GUIであるため、時間がかかってしまっていました。

今回は複数の予定(イベント)を一つのファイルにまとめて一括でインポートすることで時短を図ろうとしたものです。なおAPIでPushするのは待て次回です。(正直PushはGUIでもいいと思ってるので、次回あるかは不明)

csvでインポートする方法とicsでインポートする方法の2種類紹介します。

Main

インポート方法

PC環境を前提とします。Google Calendarにインポートするには

  1. 右上の歯車をクリック
  2. 「設定」をクリック
  3. 左にある「インポート/エクスポート」をクリック
  4. インポートの項目でファイル、カレンダーを選び「エクスポート」をクリック

で作成できます。

インポートするファイルについて

f:id:ponyo4869yakata398:20210529050645p:plain

iCal または CSV(MS Outlook)形式の予定情報をインポートできます。

とあるように、インポートするときのファイル形式はiCalendar フォーマット(.icsなど)かcsvファイルにするように指定されています。 それぞれ検討していきましょう。

icsファイルの場合

まずはicsファイルの仕様を見に行きましょう。今回はこちらを参考にさせていただきました。

www.asahi-net.or.jp

(本来は一次文献を見に行くべきなんでしょうけれど、楽させていただきました)

こちらに書いてあることをさらにまとめると

  • ファイルはテキスト形式(最悪メモ帳でもかける→特別な環境が必要ない)
  • それほど複雑ではない(Tokenizeしなくてもファイルを作れそう) ということでハードルは高くなさそうです。

特にローカル時間でも世界標準時でも簡単にかけるというところがメリットかなと思います。

ここから何かに変換するというのは次に紹介するcsvと比べるとやりたくないので、変換しなければいけないのをcsv→icsのみになるようにデータを管理したほうがいいと思います。

icsの最小構成

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//your_name//Manually//EN
METHOD:PUBLISH
BEGIN:VEVENT
DTSTART:20210530T223000
DTEND:20210530T233000
DESCRIPTION:ここが説明欄です。
SUMMARY:ここがタイトルです。
END:VEVENT
END:VCALENDAR

いくつか注意点や解説

  • PRODIDのyour_nameは変更してください
  • DTSTARTは「年月日T時間分秒」の形式で書きます。最後にZをつけると世界標準時になります。つけないとローカル時間になります。
  • Google Calendarではローカル時間を全般にあるタイムゾーンで判断しています。そのため、VTIMEZONEの記述が省略できます。 f:id:ponyo4869yakata398:20210529050625p:plain

csvファイルの場合

こちらも同様に仕様を見てみましょう。 カレンダー用のcsvはどこが一次文献なのかも分かりませんでした。少なくともこれよりも詳しい情報を見つけた方コメントくださると助かります。

it.stonybrook.edu

こちらは一行1イベントと言う形ですね。ics形式では解説しませんでしたが、終日イベントを簡易的に書ける(All Day EventをTRUEにするだけ)のもいいですね。

また、csvは様々なソフトウェアで開くことができることもメリットです。これらから個人的にはcsvに軍配が上がりました。

ただし、詳細な仕様がわかっていない点と世界標準時での書き方が現状わかっていないのがデメリットではあります。

csvの最小構成

" Subject"," Start Date"," All Day Event"," Start Time"," End Time"," Location"," Description "
"ここがタイトル"," 05/29/2021"," FALSE"," 9:00 AM"," 12:00 PM"," 場所"," 説明欄"

いくつか注意点や解説

  • Date(MM/DD/YYYY表記)とTimeの指定方法(AMPMを後置)が日本人にとってはやや特殊です。
  • 一行目は必要です。
  • ローカル時間で予定が作られます。

Outro

以上でファイルの作り方とインポートの仕方の解説は終了です。一度csvにしてしまえば他の形式に変換することなども比較的簡単に行えますので、保存する形式に採択する価値はあると思います。