Jekyllでコレクションの中から、別のコレクションのcontentを参照したときに内容がうまく評価されない話
タイトルだけだと分かりにくいですね。めちゃめちゃニッチなので誰が嬉しいのかわかりませんが、 どこに書いていいのか分からなかったのでひとまずブログに書いておきます。
環境
Jekyll 4.1.1
事象
- 現在、Home | Think TwiceというサイトをJekyllで構築しているんですが、こちらで記事を書いていた時に発生した事象です
- Jekyllには記事などをまとめて扱うための仕組みでコレクションというものがあります
- Home | Think Twiceでは、基本的にこのコレクションを使って記事を書いています
- 記事の中には見出しで小分けにしているものがあります(これとか)
- 記事の取りまとめをしている記事の中で、
{{ item.content }}
のようにアクセスしているところで、読み込んだ内容が評価されないという事象が起きている - 常にというわけではなく、読み込む記事の内容がサブフォルダにある場合だけ発生する事象である
- 同じフォルダにある場合は発生しない
うまく行く例
うまく行かない例
まとめ
理由はよくわかりませんが、原因が分かったら追って報告します。
参照
Jekyll • Simple, blog-aware, static sites | Transform your plain text into static websites and blogs
よかったらどうぞ
Peing(ペイング) -質問箱-で自分が回答したデータをテキスト形式で取得してくるスクリプト
質問回答サービスのPeing(ペイング)を利用しているんですが、 2020-10-01の利用規約改定で質問回答データの保持期間が「無期限」から「質問作成より1年」に変更になりました。 ネタ回答しているものもありますが、わりと真面目に回答したものもあり、 消えてしまうともったいないなと思い、データをダウンロードしておこうと思いました。 しかし現在のところ一括データダウンロードのようなサービスの提供もないようなので、 せっかくなので、Pythonを使ってスクレイピングしてくるスクリプトを書いてみました。
※ちなみに私に質問のある方はこちらからどうぞ。
スクリプト
import requests from bs4 import BeautifulSoup from urllib.parse import urljoin import json # メールアドレスとパスワードの指定 USER = "fumokmm" PASS = "xxxxxxxx" # セッションを開始 session = requests.session() # ログインページを表示してトークンを取得 login_url1 = "https://peing.net/ja/acc/login?" r1 = session.get(login_url1) soup = BeautifulSoup(r1.text, "html.parser") elem_authenticity_token = soup.find_all("input", attrs={"type": "hidden", "name": "authenticity_token"}) # ログイン情報 login_info = { "account": USER, "password": PASS, "authenticity_token": elem_authenticity_token[0].get("value") } # action login_url = "https://peing.net/ja/acc/login_confirm" res = session.post(login_url, data=login_info) res.raise_for_status() # エラーならここで例外を発生させる for i in range(102): page = i + 1 # 回答済みに移動 res = session.get("https://peing.net/ja/box/reply?page={}".format(page)) res.raise_for_status() # エラーならここで例外を発生させる soup = BeautifulSoup(res.text, "html.parser") print("------------------------------- Page {}".format(page)) def my_filter(t): return t.name == "div" and t.has_attr("data-questions") data_questions = soup.find_all(my_filter)[0] data_questions_json = json.loads(data_questions.attrs["data-questions"]) for data_questions in data_questions_json: print("At {}".format(data_questions.get("created_at"))) print("Q: {}".format(data_questions.get("body"))) print("A: {}".format(data_questions.get("answer_body"))) print("-------------------------------")
結果 (抜粋)
------------------------------- Page 1 At 2020-10-20T10:35:13.000+09:00. Q: 何回目のデートで告白するのが正解ですかね? A: 正解も間違いもないです。 何回目でも、いまだって思った時にどうぞ。 ------------------------------- At 2020-10-20T10:33:27.000+09:00. Q: 親友の好きなとこは? A: 飾らないところ。 ------------------------------- At 2020-10-20T10:16:24.000+09:00. Q: 周りの人に恋人が連続で出来てくると焦りません? A: それは焦りませんが、 一人で複数人同時に恋人にしてたりしたらビックリします。 ------------------------------- At 2020-10-15T18:32:15.000+09:00. Q: この人がいないと駄目だなって思う人は誰ですか? A: それはやっぱり奥さんですかね。 ------------------------------- At 2020-10-15T17:56:46.000+09:00. Q: 定期的に買うものってあります? A: 技術書とビジネス書ですね。 ------------------------------- ------------------------------- Page 2 At 2020-10-15T13:38:55.000+09:00. Q: あなたが人生の先輩として慕ってる人って誰? A: いません ------------------------------- At 2020-10-15T09:30:12.000+09:00. Q: マイブームは何ですか? A: 子どものために歌を覚えること。 ------------------------------- At 2020-10-14T18:43:29.000+09:00. Q: 最近、なんの本買いましたか?? A: 草薙 龍瞬 著『これも修行のうち。 実践!あらゆる悩みに「反応しない」生活』(KADOKAWA 2016) ------------------------------- At 2020-10-14T17:36:14.000+09:00. Q: 根に持つことって悪いことですか? A: いい悪いは人によって基準が違うのでなんとも言えないですが、 根に持っていても、「人生の役に立つ」ことは何もないと思います。 ------------------------------- At 2020-10-14T17:09:09.000+09:00. Q: 今一番気になっているのはどんなことですか A: 宇宙の外側がどうなっているか ------------------------------- ・ ・ ・ (つづく)
説明
- Python3で実行しています
- Pythonよくわかっていない中、色々なサイトにお世話になりながら書いています
- ここでは
BeautifulSoup
などのライブラリを利用しています- インストールには
pip
を使いましたが、pip
の使い方などは、参照のサイトをご覧ください(丸投げ)
- インストールには
- Peing自体はログインして利用する必要があるため、
requests.session()
を利用しています - 最初の方で、「ログインページを表示してトークンを取得」ってところがありますが
- これはログインフォームで
authenticity_token
という値もhidden
で渡す必要があるらしく、ログインページ(ユーザID、パスワードを入れるページ)を表示した際にランダムで振られるようです - なので、一度ログインページを表示して、
authenticity_token
を取ってくる処理を入れてあります
- これはログインフォームで
for i in range(102):
の102
がマジックナンバーですが、これは記事を書いている時点の私の投稿の最後のページが102ページだったためです- 本当は最終ページを調べて自動的に指定することもできましたが、そんなに利用頻度も高くないスクリプトなので最終ページを調べてからここでは決め打ちで書いています
- 途中、JSONをパースしているところがありますが
- Peingが内部でVue.jsを使っているのか、動的にページが書き換えられてしまうようなので
- 無理矢理、
data-questions
という属性からJSON文字列を取得してくる処理で対応しています
感想
BeautifulSoup
が結構強力なことが分かりました- スクレイピングはWebページのHTMLを解析することになるため、よく「たった〇〇だけで簡単!」と謳われているようなスクリプトでも、結構作るのが大変だということが分かりました
参照
- Peing(ペイング) -質問箱- 匿名で質問を受け取ろう
- python3でwebスクレイピング(Beautiful Soup) - Qiita
- 【Python3】ブラウザを経由したスクレイピング(動的なページなど)【Selenium】 - Qiita
- 【Python3】ログイン機能付サイトでスクレイピング【requests】【BeautifulSoup】 - Qiita
- PythonでWebスクレイピングする時の知見をまとめておく - Stimulator
- Pythonのスクレイピングで、いらすとやの画像を一気にダウンロード | ハシカケ-実現したいことから学べるプログラミングサイト
- 図解!PythonでWEB スクレイピングを極めろ!(サンプルコード付きチュートリアル) - AI-interのPython3入門
- Python3メモ - BeautifulSoup4のあれこれ - Szarny.io
- How to Install PIP on Windows | Liquid Web
- PhantomJSを使って色々試してみる - Qiita
WSLのUbuntuでRubyGems3.1.2から3.1.4へのUpdate時、operating_system.rbでエラーになる
はじめに
先日ふと思い立って、Windows
でGithub Pages
でウェブページを作ろうと思い、色々と調べているところだった。エラーが発生したのは、こちらの記事を参考に、WSL
のUbuntu
でJekyll
の環境を整えるため、Ruby
の環境をインストールしていた時だった。以下コマンドにてエラーが出てしまい、先に進まなくなった。
$ sudo gem install jekyll bundler
エラーが出た時点でのバージョンは以下のような状態だった。
$ ruby -v ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu] $ gem -v 3.1.2
原因調査
色々調べていった結果、RubyGems
のoperating_system.rb
に不具合があるらしく(?)、バージョン3.1.4
で修正されてるから、アップデートしてねというイシューを見かけた。しかし、アップデートしてみたところ、それでもエラーになる状態だった。
$ sudo gem update --system Updating rubygems-update Successfully installed rubygems-update-3.1.4 Parsing documentation for rubygems-update-3.1.4 Done installing documentation for rubygems-update after 0 seconds Parsing documentation for rubygems-update-3.1.4 Done installing documentation for rubygems-update after 0 seconds Installing RubyGems 3.1.4 Traceback (most recent call last): 5: from setup.rb:28:in `<main>' 4: from setup.rb:28:in `require' 3: from /var/lib/gems/2.7.0/gems/rubygems-update-3.1.4/lib/rubygems.rb:1424:in `<top (required)>' 2: from /var/lib/gems/2.7.0/gems/rubygems-update-3.1.4/lib/rubygems.rb:1424:in `require' 1: from /usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb:49:in `<top (required)>' /usr/lib/ruby/vendor_ruby/rubygems/defaults/operating_system.rb:50:in `<class:Specification>': undefined method `rubyforge_project=' for class `Gem::Specification' (NameError)
解決方法
さらに検索して、別のイシューにたどり着く。
こちらによると、RubyGems 3.1.4
はダメだけど、3.1.3
ならいい感じとのことだったので、試してみたら確かにいい感じだった。その後、インストール作業もスムーズに進められた。
$ sudo gem update --system 3.1.3 Updating rubygems-update Fetching rubygems-update-3.1.3.gem Successfully installed rubygems-update-3.1.3 Parsing documentation for rubygems-update-3.1.3 Installing ri documentation for rubygems-update-3.1.3 Installing darkfish documentation for rubygems-update-3.1.3 Done installing documentation for rubygems-update after 57 seconds Parsing documentation for rubygems-update-3.1.3 Done installing documentation for rubygems-update after 0 seconds Installing RubyGems 3.1.3 Successfully built RubyGem Name: bundler Version: 2.1.4 File: bundler-2.1.4.gem Bundler 2.1.4 installed RubyGems 3.1.3 installed Regenerating binstubs Parsing documentation for rubygems-3.1.3 Installing ri documentation for rubygems-3.1.3 === 3.1.3 / 2020-05-05 * Fix platform comparison check in #contains_requirable_file?. Pull request #3495 by Benoit Daloze. * Improve gzip errors logging. Pull request #3485 by David Rodríguez. * Fix incorrect `gem uninstall --all` message. Pull request #3483 by David Rodríguez. * Fix incorrect bundler version being required. Pull request #3458 by David Rodríguez. * Resolver: require NameTuple before use. Pull request #3171 by Olle Jonsson. * Use absolute paths with autoload. Pull request #3100 by David Rodríguez. * Avoid changing $SOURCE_DATE_EPOCH. Pull request #3088 by Ellen Marie Dash. * Use Bundler 2.1.4. Pull request #3072 by Hiroshi SHIBATA. * Fix gem install from a gemdeps file with complex dependencies. Pull request #3054 by Luis Sagastume. * Add tests to check if Gem.ruby_version works with ruby git master. Pull request #3049 by Yusuke Endoh. ------------------------------------------------------------------------------ RubyGems installed the following executables: /usr/bin/gem2.7 /usr/bin/bundle2.7 Ruby Interactive (ri) documentation was installed. ri is kind of like man pages for Ruby libraries. You may access it like this: ri Classname ri Classname.class_method ri Classname#instance_method If you do not wish to install this documentation in the future, use the --no-document flag, or set it as the default in your ~/.gemrc file. See 'gem help env' for details. RubyGems system software updated
おわりに
それにしても、こういうインストール作業ってだいたいうまく行かないことが多い。インストールの紹介記事が書かれた時点から、各種パッケージのバージョンなどが目まぐるしくアップデートされて行くから、同じ状態を再現するのが難しいのだろうなとは思う。技術者にはエラーが発生したとき、根気強くそのエラーと付き合っていく能力が必須だとあらためて感じた。
参考
cannot update gem --system · Issue #3701 · rubygems/rubygems · GitHub
`gem update --system` results in dozens of `Gem::Specification#rubyforge_project=` deprecation warnings · Issue #3269 · rubygems/rubygems · GitHub
Bundler: How to troubleshoot RubyGems and Bundler TLS/SSL Issues
Web版Excelでマクロ(自動化)にTypeScriptが使えるらしいってことで試してみたが
Microsoft365で使えるWeb版ExcelではマクロじゃなくてOffice Scriptsっていうのが使えるらしく、言語はなんとTypeScriptだという話。 さっそく試してみたのですが…
まだプレビュー版らしくて
まだプレビュー版らしくて、Microsoft 365 管理センター とやらから設定でOffice Scriptsを有効にしないといけないらしい。 以下画像参照
なんか問題が発生するんだが…
あら、問題が発生してレコーディングできない😂
サンプルスクリプトみたいなのポチポチしてたらやっとTypeScriptに出会えた。※保存できないけど😇
まとめ
ということで、結局まだ使えなかったです。日をあらためてトライしてみます。
SQL ServerでテーブルをバックアップするSQL
この記事は SQL ServerのTips | Think Twice へ移転しました。