カテゴリー: WordPress

  • 「Trending」「Birthday」差し替え ⤴️

    WordPressの固定ページに埋め込んでいたJSをVueのアプリにコピペして差し替えた。「Trending」はほぼ修正していない。「Birthday」のページは、バックエンド側にデータを用意してボタン押下のタイミングで動的にデータ取得する今風の作りに改修した。Wordpressの管理ページではなくなりフィッシングサイト的な別ページに遷移する手法のテスト。

    備忘・メモ書き:

    フロント

    • Vue 3
    • Vue Router 4
    • Pinia

    バックエンド

    • Nginx
    • PostgREST
    • PostgreSQL

    データ

    • Wikipedia
      https://ja.wikipedia.org/wiki/mm月dd日 の「誕生日」リストをスクレイピング

    Webサーバ

    Nginxのroot:https://kozawa.tokyo/
    アプリの設置:https://kozawa.tokyo/apps/27/
    Trendingページ:https://kozawa.tokyo/apps/27/trending
    Birthdayページ:https://kozawa.tokyo/apps/27/birthday

    アプリの設置先がサブディレクトリとなっており、URLとルーターのマッピングができずファイルが見つからないエラーが発生した。URLの指定のディレクトリ配下にindex.htmlが存在しない場合、1つづつ遡って上位ディレクトリのindex.htmlを探しに行くと思っていたが、そんなことはないw

    nginx.conf

        location /apps/27/ {
                try_files $uri $uri/ /apps/27/index.html /index.html;
        }

    この3行の追加・修正に一番時間がかかった。分かってしまえば何ということもないのだけれど、アプリの範囲で調べていても気づけない。アプリのサブディレクトリの設定についてはググれば対処できるけれど、以下の修正だけしてもNginxの環境ではindex.htmlファイルが見つからなくてエラーになる。

    router/index.js

    const router = createRouter({
      base: '/apps/27/', ※この行を追加
      history: createWebHistory(import.meta.env.BASE_URL),
      routes: [
        {
          path: '/',
          name: 'App',
          component: App,
          children: [
            {
              path: '/trending',
              name: 'Trending',
              component: () => import('../views/Trending.vue')
            },
            {
              path: '/birthday',
              name: 'Birthday',
              component: () => import('../views/Birthday.vue')
            }
          ]
        }
      ]
    })

    vite.config.js

    export default defineConfig({
      plugins: [
        vue(),
      ],
      resolve: {
        alias: {
          '@': fileURLToPath(new URL('./src', import.meta.url))
        }
      },
      base: '/apps/27', ※この行を追加
    })

    Vue.jsの情報を検索しても、複数の書き方があってそのまま使えない情報が混在していて分かりづらい進めづらい状況になっている。(Vue 2、Vue 3.2未満、Vue 3.2以降、Options API、Composition API、 Vue Router 3系、4系、Vite、Pinia などなど)

    あとは、PostgRESTのURLパラメタでdata型のカラムをフィルタできなかった。date型の yyyy-mm-dd を 文字列型の mm-dd でフィルタできずに挫折。data型をvarchar型に変更したViewを作成して文字列としてフィルタしている。

    また、日付の期間を指定した検索については、ストアドプロシージャを作成してGETリクエストからストアドプロシージャを実行している。PostgRESTすげえ。

    Vueの状態管理/Piniaは使う必要はなかったが動作検証のため使ってみた。ボタン押下でストアを更新してリストがリアクティブに更新される動作となっている。

    Webアプリ開発の入門レベルで難しいことは何もやっていないけれど、実際にやってみるとハマる… ひと通り骨組みができるまでが大変でやり方が確立できてしまえば1からNにスケールするのは簡単なはずだけど… 🙄

  • 「Emoji kitchen」

    曇りの日は手抜きアイコンが多い。

    ・・・省略・・・

    機械的に自動生成してますねこれは。お仕事ください。🙇‍♂️

    追記:
    雨の日も同じようなアイコンばかりなので天気に依存しないように修正した。

  • 「Emoji kitchen」→

    できた。しばらくこれでー

    備忘:
    絵文字の組み合わせとして存在しないパターンがあって読み込んでエラーになったらリトライみたいなところから試行錯誤して最終的には以下を利用させていただくことで落ち着いた。
    https://github.com/xsalazar/emoji-kitchen
    スクレイピング用のソースとともに事前にスクレイピングした結果が「emojiOutput.json」に吐かれていて最近の絵文字まで対応している。約6.3MB、約8万5000パターン。お天気アイコンとの組み合わせだけ切り出すと数百キロにできるけど、お天気以外のアイコンも他で使いたいのでフロントのソースにベタ書きせずにバックエンド側にREST APIを作成した。クリックイベントも実装済み。

    絵文字を機械的に生成できるとは思えないので1つ1つ手作業で作っているのではなかろうか。約8万5000個、おつおつです。

  • 今日の天気 →

    温度センサーを移動して日本地図を追加した。妥協の産物だけどしばらくこれでー

    備忘:

    Simple Custom CSS and JS
    https://ja.wordpress.org/plugins/custom-css-js/

    そろそろブラウザ上でコードを書くのがしんどくなってきたので今どきのフレームワークを使ってビルド&デプロイする方法を検討中… WordPress本体に手を入れずにサイドバーを修正しているからメンドクサイことなる。素直にWordPressのウィジェットとして作成するか、別のページにWebアプリ作るかになると思われる。

    残課題:
    SVGファイルをobjectタグで読み込むとクリックイベントが拾えない。

    <style>
    	object {
    		pointer-events: none;
    	}
    </style>
    https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events
    
    ググってセレクタを変更したり、pointer-eventsの値を変更してみたけれど object > #document > svg > path のイベントが拾えない。イベントリスナーを追加する時点で外部ファイルの読み込みが完了しておらずイベントの発火に失敗していると思われる。

    ソースにSVGファイルをベタ書きした。別途継続調査案件。

  • 今日の天気(テスト)

    予報区等GISデータの一覧
    https://www.data.jma.go.jp/developer/gis.html

    QGISプロジェクトへようこそ!
    https://qgis.org/ja/site/

    日本の白地図
    https://www.kabipan.com/geography/whitemap/

    備忘:

    予報区等のデータが、シェープファイルで公開されています。
    -全国・地方予報区 [ zip形式:481 MB ]
    -府県予報区等 [ zip形式:97 MB ]
    ・・・
    府県予報区等のzipを展開すると.dbf、.shp、.shxの3ファイルが現れます。
    報区等.dbf:4KB
    報区等.shp:155.8MB
    報区等.shx:612B
    これらの拡張子のファイルは何かという情報を検索して調べました。これらのファイルは、地図データであるシェープファイルということで、シェープファイルを扱えるQGISをインストールしました。QGISは以前、国土地理院の地図を調べたときに使用していましたが、地図ブーム終わった後にアンインストールしてしまいました。
    QGISを使用して日本地図を確認しました。この地図を利用しようとして試行錯誤しましたが、うまくいきませんでした。

    これはQGISで.shpファイルを表示したときの画面のスクリーンショットです。少し歪んでいるように思います。また、岩手県、瀬戸内海、長崎県の地形が複雑であることが分かると思います。.shpファイルを.svgファイルにエクスポートすると、記憶では27MBほどのサイズでした。しかし、ウェブサイトに公開する際には致命的なサイズであるため、QGISのジオメトリツールを使用して試行錯誤しました。
    ・「ベクタ」メニュー – 「ジオメトリの簡素化」
    ・「レイアウト」の「SVGファイルオプション」で「ジオメトリを簡素化してファイルを縮小」
    しかし、ウェブコンテンツとして利用できるほどの効果はありませんでした。そのため、QGISで表示している日本地図を画面キャプチャ(上記のPNGファイル)をSVGファイルに変換して、ファイルサイズを圧縮する方法を試しました。
    ・GIMPの「選択」 – 「選択範囲をパスに」
    ・Inkspaceの「パス」 – 「ビットマップのトレース」
    パラメタを変更してみました。それでも約7MBのファイルサイズとなり、見た目も悪く、県境に空白が生じる結果となりました。
    結論としては、岩手県、瀬戸内海、長崎県の海岸周辺は手動で最適化しなければ、全体的なバランスが取れず、ソフトウェアの機能だけでは意図した結果が得られないことが分かりました。
    また、QGISで.shpファイルから.svgファイルをエクスポートする場合、属性データ(エリアコード)が.svgファイルに反映されず、.svgファイルを手作業で修正する必要があることも分かりました。これはQt SVGライブラリのバグなのか、QGISの仕様なのかは不明です。

    結局、妥協せざるを得ませんでした。

    グーグル検索で日本地図のSVGファイルを見つけ、クリエイティブ・コモンズ・ライセンスに基づいて使用することにしました。このSVGファイルは日本の県境が分割されていますが、気象庁の気象データや予報区等とは若干異なるものです。全体的には同様ですが、北海道の分割が明示されている点などが異なります。日本地図、エリアコード、気象データの対応を再確認して修正する必要がありました。

    本来、クリックイベントを使用してSVG画像から地域を選択し、気象データを取得して画面に反映するだけのはずが、なぜこんなに複雑になってしまったのか、理解できません。

    ChatGPT添削おつおつ

  • 今日の天気(テスト)

    デカすぎてサイドバーに入らん… 縦長ダメやん。

  • 今日の天気(東京) 

    時に関する用語
    https://www.jma.go.jp/jma/kishou/know/yougo_hp/toki.html

    「朝の最低気温」と用いるときは0時から9時。

    JSON
    https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json

    「朝の最低」バグってる。

    9時前に「朝の最低」に「日中の最高」の値が入ってくる。__φ(. . )メモメモ

    気象庁の公式API公開して欲しいなー 河野さんはよー

  • 今日の天気 →

    とりあえず4種類で
  • 今日は何の日 6月22日 / 夏至 – 乃東枯 / 🌒

    🌒 月なんて飾りです。キリッ

    グレゴリオ暦からの月齢計算
    https://ja.wikipedia.org/wiki/月齢#グレゴリオ暦からの月齢計算

    age = (((y−11)%19)×11+b(m)+d)%30

    謎の数式から月齢を計算して月を表示しています。

    同じ月を見ていても環境によって見え方が異なるんですよね。

    macOSの絵文字はキレイですねー

    月がキレイですねー