Digital Papyrus

学習メモ。記録。アーカイブ。雑記。

さよなら読書メーター。僕は読書の記録・管理をnotionに移行することにしました。

Digital Papyrus~考えたことなどに関するメモ~

春が一瞬で過ぎ去り、少しずつ夏の雰囲気を感じ始めてきたこの頃です。

今日はタイトルの通り「読書メーターからnotionへ読書管理を移行するぞ!」についての記録です、はい。

これまでずっと読書メーターで読了記録を付けてきましたが、ここ最近は、

「もっとこうだったら便利なのになー…」
「どうしてこの機能無いのかなー…」

といった小さな不満や要望が積み重なっていました。

  • 読んだ本の1ページ表示最大数が変更できない
  • データエクスポートができない(自力で拡張機能などを使って対応している方はいらっしゃるようですが…)
  • 書籍検索をした際に電子書籍・紙の書籍を峻別できない
  • アプリはあるけれども、結局最終的にはURLにとんでブラウザ操作がしなければいけない

逆に、使っていて良いところもあります。

  • 緩いSNS的な使い方ができる(共読とかつぶやきとかが機能としてある)
  • 月毎に読んだページ数や本をまとめておける

ただ、自分にとってはSNS的な使い方はほとんどしていないですし、notionに移行すれば各月データの見える化も実装できるんじゃないか?と考えたので、重い腰を上げることにしました。

なぜNotionに読書記録を移行するのか?

いつでもどこでもアクセスできることと、自分の好きに表示やデザインを変えられるという柔軟性の高さがあるからです。

  • プロパティ
    書籍名や著者といった基本情報はもちろん、読了日、ページ数、評価(★5段階など)、ステータス(未読/読書中/読了)など、自分が記録したい情報を好きなだけ、好きな形式で追加できる。
  • ビューの多様さ
    シンプルな一覧表(テーブルビュー)、本がカードのように並ぶギャラリービュー(ジャケットとの相性が高い)、読書ステータスなど、目的に合わせて表示方法を自由に変えられる。
  • 他の情報との連携
    読書記録だけでなく、日々のメモやら学んだことの記録やらを他のデータと繋げやすい! *ただ、Obsidianとの棲み分けは考えていく必要はあると思っています。
  • APIによる拡張性
    ここはデータの自動取得に関わる部分なので、追って記録を残していこうと思います。

ということで、まずは読書メーターからデータお引越しの準備をします。

読書メーターの記録データを、Google Spreadsheetにまとめる

1. 読書メーターにログイン→読書管理から「読んだ本」をクリックし、テキストのみ表示にする。

2. データ対象部分(ヘッダー属性部分は不要)を全選択してコピー

3. スプレッドシートにテキストペースト(ctrl+shift+V)する

1つの書籍データに対して5行分データが入っていることを確認する  

1行目:読了日(*読了日不明もOK)  
2行目:書籍名  
3行目:著者名  
4行目:ページ数  
5行目:編集する(テキストデータ)

読書メーターの「読んだ本」一覧は、同時表示最大数が20件までなので、上記2、3を繰り返して、全部の読んだ本データをスプレッドシートに転記します。

注) 読んだ本データに著者名が入っていない(空欄)場合は、以下の画像のようにデータが4つしか含まれていません。 この場合は書籍名の1つ下に行を追加して適当な著者名を手打ちしてください。

*スプレッドシートで「下に1行追加」すればOKです (画像は著者名が空欄の場合)

★上記を全部目視確認するのは大変すぎるので、スプレッドシートの行番号が5の倍数のセルに「編集する」文字が入っているかどうかを確認するのが一番楽だと思います。

  1. 上記手順2→3の後にスプレッドシートの貼り付けデータの末尾(最終データ)を確認する。
    最終データは「編集する」がセルに入っているはず。
  2. 編集する が5の倍数の行番号に該当していれば(おそらく)、全てのデータが充足した状態でスプレッドシートに転記されていると判断。
    また手順2に戻る。
  3. 編集する が5の倍数の行番号に該当しない場合はどこかのデータで著者名が抜けているので該当の箇所を探して「行を追加→著者名を手打ち」する。
    ※雑誌とかの特定の著者がいない場合は出版社名とか入れてもいいかもです。

②notionで移行用のデータベースを作成する

1. notionでデータベース(テーブルビュー)を作成し、以下のプロパティを用意する

  • 読了日(日付形式)
  • 著者名(テキスト形式)
  • タイトル(テキスト形式)
  • ページ数(数値形式)

※画像内、他のプロパティは自分で管理するにあたっての任意プロパティなので、必須ではありません。

③テキストデータ→CSVデータに変換

1. スプレッドシートのデータを全選択してコピー (1行目から末尾行まで全部選択)

2. 次のコードを実行環境で動かすと、テキストデータ→CSVデータに変換できます。 (「編集する」のテキストデータが変換後のCSVデータには含まれない形で出力してくれます。)

※よう分からんって人はGeminiとかに貼り付けてみれば動かせると思います。

----------------------------------

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>読書メーターデータ CSV変換ツール</title>
    <script src="<https://cdn.tailwindcss.com>"></script>
    <link href="<https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap>" rel="stylesheet">
    <style>
        body {
            font-family: 'Inter', sans-serif;
        }
        /* Custom styles for message box consistency */
        .message-box {
            margin-top: 0.5rem;
            font-size: 0.875rem; /* text-sm */
            font-weight: 500; /* font-medium */
            padding: 0.5rem; /* p-2 */
            border-radius: 0.375rem; /* rounded-md */
            min-height: 2.5rem; /* Ensure it doesn't collapse when empty */
        }
        .message-success {
            color: #155724; /* green-700 */
            background-color: #d4edda; /* green-100 */
            border: 1px solid #c3e6cb;
        }
        .message-error {
            color: #721c24; /* red-700 */
            background-color: #f8d7da; /* red-100 */
            border: 1px solid #f5c6cb;
        }
        .message-warning {
            color: #856404; /* yellow-700 */
            background-color: #fff3cd; /* yellow-100 */
            border: 1px solid #ffeeba;
        }
        .message-info {
            color: #0c5460; /* blue-700 */
            background-color: #d1ecf1; /* blue-100 */
            border: 1px solid #bee5eb;
        }
    </style>
</head>
<body class="bg-gray-100 text-gray-800 p-4 md:p-8 flex items-center justify-center min-h-screen">
    <div class="container mx-auto max-w-3xl w-full bg-white p-6 md:p-8 rounded-xl shadow-2xl">
        <header class="mb-6 text-center">
            <h1 class="text-2xl md:text-3xl font-bold text-indigo-600">読書メーターデータ CSV変換ツール</h1>
            <p class="text-gray-600 mt-2">読書メーターの書籍データを貼り付けて、CSV形式に変換します。(各書籍5行形式対応)</p>
        </header>

        <main>
            <section class="mb-6">
                <label for="inputText" class="block text-lg font-semibold mb-2 text-gray-700">入力データ:</label>
                <textarea id="inputText" rows="10"
                    class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 transition duration-150 ease-in-out shadow-sm"
                    placeholder="例:
2025/05/10
翻訳者の全技術 (星海社新書 326)
山形 浩生
208
編集する

2025/05/06
人類を変えた7つの発明史...
Rootport
504
編集する
(各書籍データは必ず5行で構成してください。区切り線「---」や書籍間の空行は無視されます)"></textarea>
            </section>

            <div class="text-center mb-6">
                <button onclick="convertToCsv()"
                    class="bg-indigo-600 hover:bg-indigo-700 text-white font-bold py-3 px-6 rounded-lg shadow-md hover:shadow-lg transition duration-150 ease-in-out transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-opacity-50">
                    CSVに変換
                </button>
            </div>

            <section class="mb-6">
                <label for="outputText" class="block text-lg font-semibold mb-2 text-gray-700">CSV出力:</label>
                <textarea id="outputText" rows="10" readonly
                    class="w-full p-3 border border-gray-300 rounded-lg bg-gray-50 focus:ring-2 focus:ring-green-500 focus:border-green-500 transition duration-150 ease-in-out shadow-sm"
                    placeholder="変換されたCSVデータがここに表示されます..."></textarea>
                <div id="messageBox" class="message-box message-info">ここに処理結果メッセージが表示されます。</div>
            </section>

            <div class="mt-6 flex flex-col sm:flex-row justify-center items-center space-y-3 sm:space-y-0 sm:space-x-4">
                <button onclick="copyCsv()"
                    class="w-full sm:w-auto bg-green-600 hover:bg-green-700 text-white font-bold py-3 px-6 rounded-lg shadow-md hover:shadow-lg transition duration-150 ease-in-out transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-opacity-50">
                    CSVをコピー
                </button>
                <button onclick="downloadCsv()"
                    class="w-full sm:w-auto bg-purple-600 hover:bg-purple-700 text-white font-bold py-3 px-6 rounded-lg shadow-md hover:shadow-lg transition duration-150 ease-in-out transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-opacity-50">
                    CSVをダウンロード
                </button>
            </div>
        </main>

        <footer class="mt-8 pt-6 border-t border-gray-200 text-center text-sm text-gray-500">
            <p>&copy; 2025 CSV変換ツール</p>
        </footer>
    </div>

    <script>
        // Function to display messages to the user
        function showMessage(message, type = 'info') {
            const messageBox = document.getElementById('messageBox');
            messageBox.textContent = message || 'メッセージはありません。';
            messageBox.className = 'message-box'; // Reset classes
            switch (type) {
                case 'success':
                    messageBox.classList.add('message-success');
                    break;
                case 'error':
                    messageBox.classList.add('message-error');
                    break;
                case 'warning':
                    messageBox.classList.add('message-warning');
                    break;
                case 'info':
                default:
                    messageBox.classList.add('message-info');
                    break;
            }
        }

        // Function to format a field for CSV (escape quotes and wrap in quotes)
        function formatCsvField(field) {
            if (field === null || typeof field === 'undefined') {
                return '""';
            }
            const stringField = String(field);
            return `"${stringField.replace(/"/g, '""')}"`;
        }

        // Main function to convert input text to CSV
        function convertToCsv() {
            const inputText = document.getElementById('inputText').value;
            const outputTextarea = document.getElementById('outputText');
            
            outputTextarea.value = ''; // Clear previous output

            if (!inputText.trim()) {
                showMessage('入力データが空です。データを貼り付けてください。', 'error');
                return;
            }

            // Split by lines, then filter out any completely empty lines or separator lines
            // MODIFIED: Changed '\\\\n' to '\\n' for correct newline splitting
            const allLines = inputText.trim().split('\\n'); 
            const relevantLines = allLines.filter(line => {
                const trimmed = line.trim();
                // Keep lines that are not empty and not "----------------------------------"
                return trimmed !== "" && trimmed !== "----------------------------------";
            });

            const records = []; // Stores arrays of [date, title, author, pages]
            const headerFields = ['読了日', 'タイトル', '著者名', 'ページ数'];
            const csvHeader = headerFields.map(formatCsvField).join(',');

            // Iterate through the relevant lines, processing 5 lines at a time for each book
            // Each book entry is expected to be exactly 5 lines.
            for (let i = 0; (i + 4) < relevantLines.length; i += 5) {
                // We need 5 lines for a complete record (indices i, i+1, i+2, i+3, i+4)
                // The CSV uses the first 4 lines. The 5th line (e.g., "編集する") is ignored for CSV output.
                const date = relevantLines[i].trim();
                const title = relevantLines[i + 1].trim();
                const author = relevantLines[i + 2].trim();
                const pages = relevantLines[i + 3].trim();
                // relevantLines[i + 4] is the 5th line (e.g., "編集する"), which is not included in the CSV.
                records.push([date, title, author, pages]);
            }
            
            let message = "";
            let messageType = "info";
            const processedLinesCount = records.length * 5; // Total lines successfully processed into records
            const leftoverLinesCount = relevantLines.length - processedLinesCount; // Lines remaining after forming full records

            if (records.length > 0) {
                const csvRows = records.map(book => book.map(formatCsvField).join(','));
                outputTextarea.value = csvHeader + '\\n' + csvRows.join('\\n');
                message = `${records.length}件の書籍データがCSVに変換されました。`;
                messageType = 'success';

                if (leftoverLinesCount > 0) {
                    message += ` 入力の最後に${leftoverLinesCount}行の不完全なデータがあり、無視されました。各書籍は5行で構成されている必要があります。`;
                    messageType = 'warning'; // Downgrade to warning if there was partial success but also leftover lines
                }
            } else { // No complete records were successfully parsed
                if (relevantLines.length > 0) { // Some lines were present, but not enough for any full record
                    message = `有効な書籍データが見つかりませんでした。入力データは${relevantLines.length}行のみでした。各書籍は5行(読了日, タイトル, 著者名, ページ数, '編集する'等の5行目のデータ)で構成されている必要があります。`;
                } else { // Input was empty after filtering, or originally empty
                    message = '有効な書籍データが見つかりませんでした。入力形式を確認してください。';
                }
                messageType = 'error';
            }
            
            showMessage(message, messageType);
        }

        // Function to copy CSV output to clipboard
        function copyCsv() {
            const outputTextarea = document.getElementById('outputText');
            if (!outputTextarea.value) {
                showMessage('コピーするCSVデータがありません。先にデータを変換してください。', 'error');
                return;
            }
            outputTextarea.focus();
            outputTextarea.select();
            try {
                const successful = document.execCommand('copy');
                if (successful) {
                    showMessage('CSVデータがクリップボードにコピーされました!', 'success');
                } else {
                    showMessage('CSVデータのコピーに失敗しました。手動でコピーしてください。', 'error');
                }
            } catch (err) {
                console.error('Copy to clipboard failed:', err);
                showMessage('CSVデータのコピー中にエラーが発生しました。詳細はコンソールを確認してください。', 'error');
            }
            if (window.getSelection) {
                window.getSelection().removeAllRanges();
            } else if (document.selection) {
                document.selection.empty();
            }
            outputTextarea.blur();
        }

        // Function to download CSV output as a file
        function downloadCsv() {
            const csvText = document.getElementById('outputText').value;
            if (!csvText) {
                showMessage('ダウンロードするCSVデータがありません。先にデータを変換してください。', 'error');
                return;
            }

            const blob = new Blob([csvText], { type: 'text/csv;charset=utf-8;' });
            const link = document.createElement("a");

            if (navigator.msSaveBlob) { 
                navigator.msSaveBlob(blob, "book_data.csv");
                showMessage('CSVファイルのダウンロードが開始されました。', 'success');
            } else if (link.download !== undefined) {
                const url = URL.createObjectURL(blob);
                link.setAttribute("href", url);
                link.setAttribute("download", "book_data.csv");
                link.style.visibility = 'hidden';
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
                URL.revokeObjectURL(url);
                showMessage('CSVファイルのダウンロードが開始されました。', 'success');
            } else {
                showMessage('お使いのブラウザは自動ダウンロードをサポートしていません。手動でコピー&ペーストしてください。', 'error');
            }
        }

        // Initial message
        showMessage('読書メーターのデータを左のテキストエリアに貼り付けて、「CSVに変換」ボタンを押してください。各書籍データは5行で構成されている必要があります。', 'info');
    </script>
</body>
</html>

----------------------------------

正しく実行できるとこのような感じになります。(画像はGemini内)

 

ここの上段内にそのままテキストデータを貼り付けて「CSVに変換」を押すと、下段にデータが出力されます。

データが出力されたら「CSVをダウンロード」してデータを保存してください。

④notionにCSVデータをインポートして完成

先ほどnotionに作ったデータベースのページ右上から「CSV取り込み」を選択。

さっきダウンロードしたCSVデータを選択して読み込ませれば、該当のプロパティに全部データが移行されます。

※もしここでうまくいかない場合は、プロパティ名が合っていないか、テキストデータ→CSVデータに変換する時にうまくいっていないか…をまずは疑ってみてください。



と、ここまでで基本的な移行は完了です🙇‍♂️

いちばん苦しいのは読書メータースプレッドシートへのコピーペースト手動作業でした…ただ、notionに移すことのメリットの方が大きいと思ったので、ここさえ乗り越えてしまえば…!と気合いを入れて終わらせました。

⑤notionで管理するにあたって

以下はまだ実現できていないのですが、やりたいことをメモっておきます。

  • ISBNコードの自動取得
  • 書籍の書影(ジャケット)データの自動取得
  • 月別、年別などの任意データのサマリ表示
  • ジャンルや著者別でのビュー作成

上2つに関してはAPIもそうですが、表記揺れなどの問題も絡んできそうなので、そもそも全データを完璧に自動取得できるとは思っていません。

が、ある程度自動取得できるような環境が構築できるのであれば手動で埋めていく手間を減らせるのでトライしたいところです。 (もし既にnotionで実装されている方がいたら是非教えていただきたいです。)

下2つについてはnotion上での操作で作れるので、合間時間で少しずつ実装していこうと思います。

そもそもサービスやツールが非常に使いやすいものであれば、わざわざ他のツールに移行しやすいような設計を最初からしておく必要も無いのですが…

現状の読書メーターだと他のサービスからも移行しづらいツールに感じられたので、うーんなんだかなぁ…という感じです。

しかし、ようやく重い腰を上げて移行作業ができたので良かったです。

 

Roundaboutな備忘録〜2025年、辰の月下旬〜

皆さんこんばんは🙇‍♂️

6連休も嬉しいけれど、2日休み→1日お仕事の1セットが3連続で来るのもなかなか趣深く好きです。

ここ最近、久しぶりにnoteを開いて過去の自分の記事や、フォローしている方の記事をぽちぽち眺めることなどをしてみました。

noteのサイトのデザイン性というか雰囲気はなかなかに気に入っています、なんかスッキリしている。

で、いつかはまだ決めていないし、どういうことを書いていこうかもまだぼんやりしていますが、noteを再開させてみようかなと思っています。

いくつかきっかけはあったのですが、それはnoteを再開するその時にnoteで書こうかなと。

あとは【四季報写経】を試しにやってみようと思います。

四季報写経ウーマンさんがnoteで販売している写経テンプレートを買っていないので、中身がどのようになっているか分からないのですが)

上記の記事から読める部分を解釈し、四季報写経用のnotionを自作して進めてみることにしました。

続けてみて、おそらく四季報写経はデータベースとして管理・運用していった方が先々便利な気がしているので、もしもうまいこと継続することができた時のことを考えてnotionで動かしてみます。(まぁ、どこかで継続不可能になるかもしれませんが…)

 

notionの話。

先週末くらいからObsidianをちょこちょこ触り始めました。

notion内でzettelkastenを構築していたのですが、階層が深くなると情報を拾いづらくなるのと、notionの動作がちょっぴり重いのが気になったので、Obsidianを1回試してみようと思い立った次第です。

notion:タスク・TODO管理

Obsidian:zettelkasten構築・運用

おおまかにですがこんな感じで併用テスト中です。

以下のお二方の記事を読んでObsidianを日々少しずつ使っていってるところです。

 

早起きの話。

どこかで書いた気がしますが、あれから割と順調に早起き継続することができています。(たまに低気圧による頭痛にやられてますが…)

こういう新しい習慣は、慣れるまでどうやって続けるかが重要だと思うのですが、たまたまTwitterで流れてきた以下のツイートに救われました。

僕も起きる時間を早くするぞ!と決めてから、朝に目が覚めてすぐ心の中で「くそっ!何を布団の中でもたついているんだ…!早く外の世界へ出るんだ…!」と自分に喝を入れていました。

ただ、それだけだと当然上手くいくわけもなかったので、動機づけというか対策を用意しました。

「起きてすぐに美味しいコーヒーを飲めるようにしておく」です。

今はまだ肌寒い季節なのでドリップマシーンのタイマー機能を使って、できたてのホットコーヒーを飲めるようにしています。

夏が近づいてきたらアイスコーヒーを用意しておくことで早起き継続できるようにしたいところです。

そろそろ1年の1/4が過ぎようとしています(早っ…

Obsidian・notionの併用、四季報写経は追って状況を記録します🙇‍♂️

Roundaboutな備忘録〜2025年、辰の月中旬〜

【Digital Papyrus】~雑記~

皆さんこんばんは。

#6が抜け番になっていると気づいたので、無理やり今回分を#6にさせてもらいました。

年始は体調が芳しくなかったのですが、2月くらいからBLOODY STREAMしながらGoodbye Nostalgiaを聴いているうちにJOJOに回復してきました。

学習を進めていると、ついつい書く頻度が落ちてきてしまうのですが、2.3か月に1回は振り返り・見直しの時間を意図的に作ろう…うん、そうしよう…。

以下、現況のメモ。

今のところ

  • 基本情報技術者試験:不合格👎(B科目でNG)
    >>春頃に再挑戦
  • CBAS(PM級):合格✌️
  • 情報セキュリティマネジメント:合格✌️
    (気になったので、少し勉強して受けてみた)
  • 統計検定2級
  • データサイエンティスト検定(リテラシーレベル)
  • 簿記2級(今年の後半の目標)
  • 統計検定データサイエンス発展
  • SQLレベルアップ
  • SIGNATEで何かしらのコンペ参加
    >>夏頃 *SIGNATEをよく分かっていないのでまずはやってみることに。

気になってるもの

その他

  • 青の統計学 udemy講座進める
  • 日々の業務でもっと自動化できるところを見つけて仕組み作り
  • 広告領域への理解を深める
  • 幻想水滸伝Ⅰ・Ⅱ発売するのです!
  • iPhone16買います(夏か秋か)

書籍関連(積読含む)

簡単に振り返り。

1月:身体の違和感に意識を割かれて思ったように学習が進められず…が、なんとかCBAS(PM級)に合格。

2月:基本情報技術者試験に挑戦し、B科目でNG。

3月:情報セキュリティマネジメント試験、合格(正式な通知は後日)。身体の違和感も無くなり不安解消。

健康の大切さを改めて思い知った期間でした。

あと、前回か前々回くらいにブログに書いたTO DO管理Notion(スワンさん作)ですが、めちゃくちゃ機能しています。完全に習慣化された気がします。

NotionとGoogleカレンダーのコンビネーションでほぼほぼタスク消化やスケジューリングが不具合無くできている状態です。

今後も使い続けつつ、必要であれば自分でカスタマイズしていけばいいかなと。

時間とともに新しいタスク管理ツールや、既に存在しているツールのアップデートが行われる世の中ですし、タスク管理ツール探しが目的になってしまうのも悲しいので、当面はNotionへの理解を深めていこうと思います。 (と言いつつ、Obsidianはちょっと気になってます)

勉強系の他にも考えているアイディアがあるので、少しずつかたちにしていこうと思います。

【CBAS シチズン・プロジェクトマネージャー級】振り返りとメモ

【忘却と学習の旅:データサイエンス編】~日々の記録と現在地、これからのこと~

1月の中旬から、今までより朝1時間以上早く起きてオフィスに行き、読書と勉強をするようにしています。

もっと早くから習慣化して実践すれば良かったなと後悔しています…。

ただ1つ残念なことは、早い時間帯の電車に乗っても混雑具合がほぼほぼ変わらないことです(´ゝ`)カンベンシテクダサイ…

ところで、先日仕事終わりにデータ分析実務スキル検定:プロジェクトマネージャー級の試験を受けて、無事に合格しました💮

試験結果:65/100(合格ラインは64点でした。ギリギリ…)

今回は内訳(セクション分析)も掲載します。

【セクション内訳】

  1. 業務目的に応じた適切なKPIツリーの作成:100%
  2. データの取り扱いに関する利用規約、法令等の理解:50%
  3. データ分析に必要な前処理の理解:100%
  4. SQLの基礎の理解:80%
  5. データ可視化手法の基礎の理解:80%
  6. 基礎集計を通じたデータの全体像や質の確認:73%
  7. 業務目的に応じた適切なコーディング(R/Python)の確認:38%
  8. 基礎的な統計手法の理解:25%
  9. 主要な機械学習の概要と使い分けの理解:80%
  10. 予測モデルの評価と改善手法の理解:100%
  11. 施策の評価と効果検証の理解:25%

反省点は統計手法、施策評価・効果検証セクションの正解率が低かったことですね…。

今後、統計検定取得も狙っているので、重点的に理解を深めていきたいところです。

あとはR(と、Python)部分はテキストのみの学習に留めて、他の領域に注力して臨みましたが、本来であればSQLPython・Rの基礎を理解して自分で言語を使いこなせるようになった上で受けた方が良いと思います。

ただ、CBAS(PM)試験の学習を通じて、理解が正確ではない領域を把握することができたので非常に良かったです。

これからも前向きに学んでいきます💪

勉強に使った教材やらテキストやらを以下にメモっておきます。

★基本の2つ

udemy講座:データ分析実務スキル検定PM級合格への道

データ分析実務スキル検定PM級公式テキスト

ビジネス領域、プログラミング言語領域、統計などの出題される問題・各分野の全体的な学習は上の2つで学習しました。

この2つで足りない部分・自分が苦手だと感じた部分については、単元別・分野別で対策をして理解を深めました。

★単元別・分野別学習で使ったもの

データサイエンス100本ノック(SQLPython):SQLPython領域

時間的にSQLの基本を学習するのでほぼ精一杯でしたが、前半のNo.を解けるようになればCBAS試験では問題無く解けるようになれるかなと感じました。

G検定公式テキスト:機械学習領域

これは昨年G検定を受ける時に使っていたテキストです。

先行してG検定合格に向けて勉強していたことも功を奏したので良かったです。

データサイエンティスト検定公式リファレンスブック:機械学習領域・統計領域など

データサイエンティスト検定合格テキスト:機械学習領域・統計領域など

CBAS(PM級)の試験単元と重なる部分が多いので、データサイエンティスト検定公式テキストはかなり使えると思います。

今年はこちらも再チャレンジせねば…!!

他にも細々したところについては、Gemini使いつつネットに上がっている記事を探しつつ…という感じです。

特に参考になったものは以下です。

CBAS(PM級)模擬試験解説記事

CBAS(PM級)の公式テキストについてる模擬試験問題の解説をしてくれている記事です。

正直めちゃくちゃ助かりました…。

基礎から学ぶ統計学

統計学の基本を分かりやすく学習できる良本です。

公式テキストを読み進める中で分からない部分があったら参照するレベルで使用しました。

今回受けたデータ分析実務スキル検定ですが、昨年夏の終わり頃に一度受けて不合格だったこともあり、2025年最初の試験でリベンジを果たせて一安心です。

前回はおしくも1割足りずくらいで落ちてしまったので、今回は8割9割くらい得点するつもりで臨みましたが…まぁ、そんなに甘くなかったですね笑

前回はデータ前処理、利用規約・法令、コーディング、KPIツリーあたりでの得点率が非常に低かったことが原因で落ちてしまったのですが、今回は(割と)バランス良く取れた方かなと…完全には納得できていませんが、受かってなによりです。

ですが、R・Pythonは日常業務でも使う場面が無かったので、練習問題だけで最低限理解するところにとどまってしまいました。

ただ今のところRについては現状でとどめておき、まずはSQL理解のレベルを上げていきたいと考えています。

このあとはざっくりですが、基本情報技術者、データサイエンティスト検定、統計検定2級、統計検定(データサイエンス発展)に臨みます。

資格を取って何になる…ということを考えることも大切かもしれませんが、一番は学習意欲の継続に寄与しているのが大きいです。

もしくは、ただ単に知識を深めたいという意欲が大きいかもしれません。

あとは、データベーススペシャリスト等が含まれる高度情報処理技術者試験8種が気になっているので、今年の後半に狙おうか検討することとします。

まぁ…何よりもまずは、目の前のものを突破してからです🙇‍♂️

【Google Colaboratory】データサイエンス100本ノックメモ①

【忘却と学習の旅:データサイエンス編】~日々の記録と現在地、これからのこと~先日、データサイエンス100本ノック(SQL編)を始めてから、割と順調に進めることができています(?)

問題を進めつつ分からないところに関しては…

1:すぐに解答を確認する
2:Geminiに解説してもらう
3:実際にコードをGoogle Colaboratoryで動かしてみる
4:色々変更を加えてみて、どういう動きをするか検証してみる
5:また後日、同じ問題を解く
6:それでも分からなかったらまたGeminiに聞きつつ、ググって関連記事探して理解する
7:またまた動かしてみる

という流れで進めて、理解に苦しむ部分や新しい関数などは別途Notionにメモとして残しておき、後で振り返れるようにしております...。

★要復習問題のメモ

S-019: レシート明細データ(receipt)に対し、1件あたりの売上金額(amount)が高い順にランクを付与し、先頭から10件表示せよ。項目は顧客ID(customer_id)、売上金額(amount)、付与したランクを表示させること。なお、売上金額(amount)が等しい場合は同一順位を付与するものとする。

SELECT
    customer_id,
    amount,
    RANK() OVER(ORDER BY amount DESC) AS ranking
FROM receipt
LIMIT 10
;

S-029: レシート明細データ(receipt)に対し、店舗コード(store_cd)ごとに商品コード(product_cd)の最頻値を求め、10件表示させよ。

SELECT
  store_cd,
  MODE() WITHIN GROUP(ORDER BY store_cd)
FROM receipt
GROUP BY store_cd
LIMIT 10
;

S-034: レシート明細データ(receipt)に対し、顧客ID(customer_id)ごとに売上金額(amount)を合計して全顧客の平均を求めよ。ただし、顧客IDが"Z"から始まるものは非会員を表すため、除外して計算すること。

WITH customer_amount AS (
    SELECT
        customer_id,
        SUM(amount) AS sum_amount
    FROM receipt
    WHERE
        customer_id NOT LIKE 'Z%'
    GROUP BY customer_id
)
SELECT
    AVG(sum_amount)
FROM customer_amount
;

S-035: レシート明細データ(receipt)に対し、顧客ID(customer_id)ごとに売上金額(amount)を合計して全顧客の平均を求め、平均以上に買い物をしている顧客を抽出し、10件表示せよ。ただし、顧客IDが"Z"から始まるものは非会員を表すため、除外して計算すること。

WITH customer_amount AS (
    SELECT
        customer_id,
        SUM(amount) AS sum_amount
    FROM receipt
    WHERE
        customer_id NOT LIKE 'Z%'
    GROUP BY customer_id
)
SELECT
    customer_id,
    sum_amount
FROM customer_amount
WHERE
    sum_amount >= (
        SELECT
            AVG(sum_amount)
        FROM customer_amount
    )
LIMIT 10
;

※また別のメモとして書こうと思いますが、タスクを含む全般の管理を、NotionでのTO DO管理 × Zettelkastenを組み合わせたものに改良(?)してみました。 結構使い心地は良いので、さらに自分に合ったかたちに改善していければと思っています。

データベース全体に対する理解を深めることを目標にし、コツコツSQLの勉強を進めることにします。

【Google Colaboratory】データサイエンス100本ノックをやってみることにした

【忘却と学習の旅:データサイエンス編】~日々の記録と現在地、これからのこと~雑記#6が抜け番になっていたことに今更気づきました…(´ゝ`)クソゥ...

というわけで別記事を、後追加の#6とします。

昨年はPython、R、SQLをちょろちょろっとかじっただけで終わってしまったので、今年はもう少し本格的に理解を深めたいと思い、以前から気になっていた「データサイエンス100本ノック」をやってみることにしました。

この辺りの記事で「100本ノック」の存在を知ったのですが、うーんDocker環境かぁ…とやや躊躇っていたところがありました。

ただ、100本ノックに関して書かれている記事を探してみると、どうやらGoogle Colaboratory環境でも100本ノックを行えることが分かったので、こちらで実践していこうと思います。

2つ目の「文系サラリーマンの独学によるデータ分析・AI」の方は、設問を小分けにして解説を載せてくださっているので、ここを頼りにしつつ進めていこうと思います…。

で、早速Google Colaboratoryで設定を行って演習開始しようと試みたのですが、何故かエラーが出てしまって、正しくデータが返ってこない状態に。

エラー内容を確認しつつ、解決策が書かれている他の記事が無いかを探しましたが...無さそう。

結局、試行錯誤しつつエラー結果をGeminiに投げて解決手段を教えてもらいました。

以下のコードを冒頭に挿入すれば、各問題で正しく出力される環境になりました。

from prettytable import PrettyTable, PLAIN_COLUMNS
table = PrettyTable()
table.set_style(PLAIN_COLUMNS)
%config SqlMagic.style = 'PLAIN_COLUMNS'

こんな感じです。

あとは、環境構築用のセルを実行→今挿入したコード部分を実行すればOKです🙆‍♂️
※実行はブロック(コードのかたまり)の左についている再生ボタン(こんなやつ→[▶︎])を押せばOKです。

さ、困ったらGeminiをお供に100本ノックなる早で終わらせることにします。

2024年後半の振り返りとこれからのお話

2024年後半の振り返りとこれからのお話

皆さんこんばんは。

年始から微妙に完調とは言えない状態のしょーすけです。

昨年の後半戦は思いがけない予定やらが重なってしまい、全くと言っていいほど満足に動くことができませんでした...大反省です...。

後半戦に設定していた試験やら検定やらもほぼ壊滅状態となってしまったので、今年は気持ちを新たにして、再挑戦します🙇‍♂️

で、今年の学習目標を改めて。
(過去の記事でも何回も書いていますが)

【2025年の学習目標】

  • 基本情報技術者取得
  • 統計検定2級取得
  • データサイエンティスト検定(リテラシーレベル)合格
  • 簿記2級(今年の後半の目標)取得
  • 統計検定データサイエンス発展合格
  • SQLを使いこなせるようにする
  • SIGNATEで何かしらのコンペ参加

いったんのところ、上記を今年前半戦の目標としますが、理想は1ヶ月に1つくらい目標を設定したいと考えているので、もう1つ目標(?)を据えるとすると「2025年後半の目標を決めること」です。

無理に決めるというよりかは、1つ1つ学びを進めていく中で気になったものや関連するものを設定しようと思います。

で、SQLの学習に関しては、今のところは検索して出てきたものをポチポチ覗いていって、無料でできるものを手当たり次第進めてみることにしました。

あとはどこかしらで期間を決めて有料のサブスク講座でも使うかもしれません...また考えます。

 

前回の記事で触れたTaskchute for Notionのお話の続き。

あれから日々使ってみたものの、現在の自分にはいまいち合わないという結論に至りました。

もう少し正確に言うと、日々のタスク管理(つまり1日単位の)に関してはGoogleのTO DOで充分機能しているので、「週単位での達成 / 未達成」を可視化・管理できるツールの方が今の自分には合っているなぁという感じです。

(Taskchute for Notionのテンプレをベースにして週単位管理ツールへとカスタマイズできたらそれはそれでありだと思います。)

GoogleのTO DOを週単位で見ていけばいいじゃないか...とも思うのですが...もう少し別の管理方法を少し探してみることに。

で、そんなことを思いつつTO DOやらタスク管理やらで調べまくっていたところ、スワンさんという方が書いた記事を発見しました。

Youtubeでの解説動画も見てみましたが、とても良さそうな気がしています...( ˶˙º˙˶ )୨

Youtubeの解説動画はこちら。

テンプレートも公開してくださっているようなので、早速使ってみることに。

これがなかなかに良さそう。
※以下にキャプチャを貼っておきます(アイコンはもふぴよ)

Task Listは別の箇所に作成しているデータベースなので、リンクドデータベースとしてページ内に挿入しています。

その下には短期〜中期くらいで達成したいことを4カテゴリにまとめて一覧にしています。

★Wish Listには2025年の終わりをいったんの期限とした目標や叶えたいことを記載しています。

この辺りは上記にURLを貼ったスワンさんの動画を観てもらえれば全部理解していただけると思います。

当面はこのTO DOページを主体に使いながら、今後はZettelkasten × Notionを少しずつ組み合わせた仕様にカスタムしていく予定です。

最終的に使い心地が良いものになったらどこかでテンプレートを公開してもいいかもしれませんね...まぁのんびりやることとします🙇‍♂️

 

これを書いている時、上記のTO DOを使って約1週間程度になるのですが、実際のところはGoogleカレンダーと併用して使っています。

上記のTO DO管理Notionで1週間(と、もうちょっと先のTO DOも)で完了・達成したいことを洗い出して、Googleカレンダー上で時間枠を押さえてタイムカレンダーを作っていく。

以下、TO DOページのカスタムしたい点をメモして、新年最初の記事を終わることとします。

【改良したい点】

  1. 1週間で残存したタスクを翌週へ簡単にスライドできるようにしたい
  2. Zettelkastenとの連携を高めた仕様にして、より使い勝手を高めたい
  3. レイアウトをもう少しスッキリさせたい

【Notion】TaskChute for Notionを使ってみた

【Digital Papyrus】~雑記~

皆さんこんばんは、しょーすけです。

ここのところ、TaskChute for Notionを試験的に使い始めております。

で、そもそもTaskChute for Notionとは何ぞやという話ですが...(´-`)

まずはこちらを読んでください。

TaskChute for Notionを作られた方のnote

そもそもの話、TaskChute Cloudがリリースされたくらいの時期まで時間は遡ります。

TaskChute Cloudがリリースされ、その存在に気づいた時は、ちょっとした感動を覚え、使いたい気持ちに駆られました。

しかしながら、どうやって使いこなしたら良いのかという点を自分の中で消化することができなかったことに加えて、確か有料プランのみの展開だった(?)ということがあり、そのコストを上回る程の使い方が自分にはできないと判断し、導入を見送りました。

たらればワールドにはなりますが、あの時にTaskChute Cloudを使っていたら、考えや環境も大きく変わっていたのかもしれません...。

そして時は流れ、TaskChute Cloud2がつい最近リリースされたのです。
TaskChute Cloud2は無料プランの展開もあるということで、試しに数日テスト利用してみました。

雑感としては、機能的には有料を入れたいくらいだけど、Google calendarとの連携ができないみたいなので「待ち」判断といったところでした。

TaskChuteに対する第一印象や良い点

  • あらかじめタスクを予定的に割り当てて、組み込んでおけること
  • そのタスクそれぞれに開始と終了パラメータが振られていて、ボタンポチ→ポチでスタート&ストップできる
  • 残タスクを翌日、任意の日にちに繰り越せる
  • タスクベースでスケジューリングできる
  • 24時間を自分の任意の時間帯によって区切ることができる
  • 使い勝手は良さそうで、画面がシンプル
  • 今後のアップデートや他ツールとの連携(API含む)にも期待できそう

TaskChuteに関して業務的な領域で言及すると、わざわざTaskChute Cloudを使わなくともカレンダーやTO DOリストで管理→着手→進捗→完了or未完の状況把握で問題無いといえば全くその通りだと思います。

ただ、完了の状態になったのか、明日に持ち越しのタスクは何なのか...というところまで考えた時に、TaskChute方式はとても素晴らしいなと。

タスクに要する時間・1日のセクション区切り・残タスクの繰越し...といったことを他のタスク管理ツールやカレンダーツールで実行しようとすると、管理の手間が増えるか、もしくはできないというのがほとんどだと思います(僕が知らないだけかもしれませんが...)

TaskChuteの最たる良いところは、タスクでスケジュールを組む→各タスクに要した時間が可視化される→残タスクは繰り越しリスケできる→次回以降の同タスクにかかる時間予測がしやすくなる→スケジュール管理が効率化されて嬉しい!( ˶˙º˙˶ )୨

というところではないでしょうか?

 

ですが、上述の通りTaskChute Cloud2も今すぐ有料プランにするにはなぁ...と考えていたところに「TaskChute for Notion」という素晴らしい存在が出てきたのです!

TaskChute for Notionとは、その名の通りTaskChute Cloudの機能や使い心地をNotion上で実現したものです。

※少しでも気になった方は以下。

TaskChute for Notionのテンプレート

自分で試しに作って活用してみたTaskChute for Notionのキャプチャも載せておきます。
(*部分的にマスキング)

TaskChute for Notionの画面例

キャプチャのようにタスクベースでのスケジュール管理と振り返りが簡単にできるのがめちゃくちゃ良いです。
(休憩時間まで管理するかどうかは別として)

TaskChute for Notionの良いところ(というか、Notionの良いところ)
(上記のTaskChuteの良いところは重複するので書かない)

  • デザイン、レイアウト、アイコンを自由にカスタマイズできる
  • 使わないプロパティは削除、非表示にできる
  • スマホでも使えそう(僕はあまり好ましくない)
  • リレーション等、自分で必要な機能を他と連携できる

TaskChute for Notionのいまいちなところ

  • 開始ボタン→終了ボタンを押すのがちょっと手間
    (作りとしてまだPCの方がUI的に良いので、スマホでは使いづらい)
  • Notionをインストールしていないと使えない(当たり前である)
  • どこまで細かくタスク管理するかを最初に決めておかないと、際限無く細分化して管理することになってしまって苦しい
  • ツール自体に感じるストレスはTaskChute for Notion > TaskChute Cloudだと思う

ちなみに個人的にはNotionにある程度慣れていたので、使い心地に対してはそこまで問題に感じることがありませんでした。

また、PCで使えれば今のところ充分なので、考えるべきはタスク管理をどこまで細分化するかというところだけです。
本当にタスク管理を徹底したい人は、全行動をTaskChuteに落とし込んでいくのだと思いますが、自分はそれをするととても苦しくなると思うので、主要なものを確実に入れ込んでいければいいかなと思っています。

今後TaskChute for Notionでカスタマイズしたいこと

  1. Google Calendarへの同期・連携
    TaskChute for Notionで組んだタスクスケジュール枠をGoogle Calendarに連携して、過去〜現在〜未来の予定を把握できるようにしたい。
  2. 繰り越し機能を、「任意の日付」に対してできるようにしたい
    現状、翌日繰り越ししかできないため、金曜日の残タスク→翌週月曜日へ繰り越しができない。
    金曜日に残ったタスクをコピー→月曜日に貼り付けで対応しているが少し手間なので、繰り越す日付を選択できる機能を画策したいです。
    バレットジャーナル的な使い方もできるようになるかなと思うので、どうにかしたい。
  3. ルーティン登録したタスクからタスク生成までをもう少し簡易的に
    ここは現状不便です。なんとかしたい。

TaskChute for Notionでもっとカスタマイズしてみて、どこまでできるか確認したいと思います。

それと同時にTaskChute Cloud2へ移行するかどうかについても検討する必要が出てくると思うので、それについてはTC2のアップデート内容次第という部分もあります。

今のところはTaskChute for Notionで最大限頑張りたい気持ちが勝っているので、自分で使いこなす用に色々アレンジしてみます。

僕は仕事と個人的な勉強で使うことが主ですが、他の用途にも何らかの形で活かせそうな感じがしております。

世のビジネスパーソンだけではなくて、高校生や大学生をはじめとした学業に生きる人や修士、博士、研究者の方にもTaskChuteはフィットするのではないかと思います。

受験生や資格の勉強をしている人であれば...

  1. 前日夜に翌日の学習タスクを組む
  2. 翌日実行する
  3. 1日の終わりに、どの科目にどれだけ時間を使ったのか、未完了のタスクは何なのかを振り返る
  4. 3で未完了のタスクを翌日に繰り越す(もしくは任意の日にちに)
  5. 4と併せて翌日のタスクを決めて、スケジュールに落とし込む
  6. 2〜6をループさせる

といった感じで自分のタスクと学習を可視化しつつ、スケジュールの最適化ができると思います。

また、任意の期間を対象にして統計データも反映させられるので、1日平均の学習時間や科目ごとの構成比率、日単位における所要時間など...数字見るのが嫌いではない人なら、何かしら役に立つ部分が多いでしょう。

と、長々書いてしまいましたが、Notion LOVERの方々、TaskChute好きな方、ちょっと気になるぞ...!!という方、是非1回触ってみてください。

僕も長続きするかは分かりませんが、Notionユーザーではあるのでまだまだ使いやすいツールにアレンジできると信じて使おうと思ってます💪

Notionについては他にもログっておきたい内容があるので、まとまり次第ここに残しておくことにします。

幕間の振り返り

【忘却と学習の旅:データサイエンス編】~日々の記録と現在地、これからのこと~

X(旧:Twitter)の文字数制限を利用すると、存外、思ったことや考えたことを澱みなく言語化できることに気づきました。

こんばんは、しょーすけです。

前回の更新が8月末頃だったので、もう1ヶ月半空いてしまったのですか...嗚呼。

さすがにここまで諸々予定を詰め込みすぎた感じはありますが、なかなか思い通りには前進しないもので...。
今年の初め、夏頃に細かい目標を修正し、小項目を増やしたり減らしたりしながら進んできましたが、またまた微修正が入るんかなといった感じです。

で、今年も残り4分の1を過ぎたところで、簡単に振り返っておきます。
(近い時期のものだけにしておきます)

【直近4戦】

  1. データ分析実務スキル検定(シチズン・データサイエンティスト級):🙆‍♂️ 
  2. データ分析実務スキル検定(プロジェクト・マネジメント級):🙅‍♂️
  3. 統計検定2級:🙅‍♂️
  4. G検定:🙆‍♂️

直近4戦の振り返り

  1. データ分析実務スキル検定(シチズン・データサイエンティスト級)
    先日のblogに書いた気がするので割愛します。
    ただ、統計スペシャリスト、データサイエンス基礎あたりの内容が正しく理解できていたことによる恩恵が大きかったです。

  2. データ分析実務スキル検定(プロジェクト・マネジメント級)
    失点要因が明らかだったので、苦手領域の復習に時間を割いて再挑戦します。
    特に大きな要因は「プログラミング言語領域」でした。
    得手不得手領域で得点のバラつきが大きかったので、次回は全体で安定した点数を取得した上で合格を狙います。
    ただ、過去問に取り組む機会が少ないのが受験者側としてはネックなので、復習したらすぐに2回目の試験チャレンジをするのもありかなと思ってます(受験費用少し高いけれども...)

  3. 統計検定2級
    こちらは「確率・記述統計」の学習量が明らかに不足していたことが響いて不合格でした...とほほ😭惜しいところまではいけたのに...
    ですが、本番環境で問題に取り組めたことは大きな経験になったので次こそは。
    ただ、日程的に今年に詰め込むのも微妙なので、来年にまわすかもしれません...本当は今年に取り切ってしまいたいのですが。

    統計学の時間

    ★青の統計学

    この2つをもっと読み込んで、統計2級までの基本的な知識をさらに身につけておくことにします...。

  4. G検定
    公式テキストと問題集を短期間でやり込んだおかげか、一発合格することができました(´ω`)
    複雑な内容のところは理解が微妙でしたが、基本的な機械学習や深層学習のこと、今までの研究の歴史に関してはさらうことができたので、大変有り難かったです。
    いかんせん、この辺りの試験はどこかしらで知識領域が重複していることが殆どなので、何かの勉強をすると他の試験にもおおよそ転用できる場面が少なくありません。
    データサイエンティスト検定とかは、統計検定・G検定・基本情報技術者...etc、という感じで複数領域にまたがっているので、バランスよく習得してきたいです💪

で、今後の年内の予定はこんな感じです。

【年内予定】

  • ★確定:データサイエンティスト検定(リテラシーレベル)
  • ★確定:(再)データ分析実務スキル検定(プロジェクト・マネジメント級)
  • ★確定:統計検定(データサイエンス発展)
  • 基本情報技術者試験
  • (再)統計検定2級 *検討中

我ながら結構な感じで試験日程詰め込んでしまったなぁと思ってます(笑)

全部取りに行くつもりで当然臨みますが、最低でも勝ち越しで今年を終えたいと思っているので、最悪は来年にまわすものも中には出てくるかもしれません。戦略的保留というやつです...

11月に上2つがあるので、まずはそこで勢いをつけてからリベンジマッチ+基本情報技術者試験に臨めるように準備します。

年内に1つnotionに関するメモもあげたいと思っているのですが、もう少しnotionを使いこなしてからにしますね...さすがにまだ覚束ない部分が多いので。

やりたいことが少しずつ増えていくのですが、全部は実現できないのでやむなく増えた分何かを減らしていくしかないのですよね...(´ゝ`)クソッ

【読了】人類を変えた7つの発明史 火からAIまで技術革新と歩んだホモ・サピエンスの20万年 / Rootport

Digital Papyrus〜雑記〜

皆さんこんばんは、しょーすけです。

気がついたら2024年3分の2が過ぎようとしています。

今日は本の紹介(?)です。

人類を変えた7つの発明史 火からAIまで技術革新と歩んだホモ・サピエンスの20万年

つい最近読み終えた本です。
ある観点から歴史を追いかけて理解していく系統の書籍では、初めてと言っても過言ではないくらいに分かりやすかったです。
何回でも読み返したいし、人にお勧めしたいと感じたためblogに残すことに。

所謂、学校で習う通俗的な歴史が苦手な人でも、この本であれば最後まで読み進めた上で理解しやすいのかなと思います。
というか、本の装丁やらフォントやら余白の取り方やら、ジャケットデザインやら...全部良いんですよね...もう一冊欲しくなるような気持ちになっています。グフフ...

最上部の書籍リンクは楽天のものを貼っています。

余談ですが、僕は余程のことが無い限りはAmazonで書籍は買いません。
理由はただ一つで、「本を大事にしない梱包をする」からです。
静かなる、大海の如し憤りを覚えています。Amazonの⭐️1部分です。

過去に何回かAmazonで書籍を買う機会があったのだけれども、大なり小なり毎度欠かさず本体にダメージがあるのです。
Amazonの書籍の梱包は何でしょう...同様の問い合わせやら来てないんでしょうかね?(僕だけ?)

とにかく漫画、小説、学術書、教科書、全部必ずヨレ、折れ、帯破れ、擦り傷、傷み...といったAmazon梱包の烙印が入っていました。

天気のいい日の学校帰りの元気な小学生くらい、何かしら傷やら汚れを背負って送られてくること複数回...返品や交換、返金には対応していただけたので良いのですが、別に返品交換するために注文しているわけではありません。

で、ついぞ「Amazonで書籍は基本的に買わない」制約を誓約したのです。HUNTER×HUNTERかよってくらいに。

というわけで、オンラインで買う時は、楽天を使わせてもらっています。
トップカルチャーブックストアをよく利用するのですが、梱包が抜群に良いです(´ω`)あとポイントもお得...。
書籍を大防御してやるぞぉ!と感じられる梱包で良きです。ビッグシールドガードナーです。

ただ、Amazon限定!で発売される書籍については、猛烈に悩ましいですが他の商品と同梱されるように上手く抱き合わせで注文してます。正直苦渋の決断です。

本当はhontoオンラインストアをずっと使っていきたかったのですが、いつぞや紙のサービスを終了してしまったのです...悲しい。

電子書籍で漫画は買うけど、それ以外のものについては紙媒体で読むことがほとんどなので、結果的に楽天に落ち着いております。

 

閑話休題

 

歴史が苦手な自分でもすいすい〜と読み進められたのと、関連する論文や書籍についても参考文献として巻末についている親切仕様なので、これをきっかけに、日本史世界史の基礎知識を学び直すのも楽しいのかもしれないなぁと考えています。

一言で歴史と言っても色々な分野や領域があると思うので、興味を持ったところから少しずつ知識を拾っていけたら、また何処かで活かせる機会があるかもしれない。そう思うと些か楽しみになってきます。

今週末の台風、大丈夫かしら...。