No Programming, No Life

プログラミング関連の話題や雑記

Jekyllでコレクションの中から、別のコレクションのcontentを参照したときに内容がうまく評価されない話

タイトルだけだと分かりにくいですね。めちゃめちゃニッチなので誰が嬉しいのかわかりませんが、 どこに書いていいのか分からなかったのでひとまずブログに書いておきます。

環境

Jekyll 4.1.1

事象

  • 現在、Home | Think TwiceというサイトをJekyllで構築しているんですが、こちらで記事を書いていた時に発生した事象です
  • Jekyllには記事などをまとめて扱うための仕組みでコレクションというものがあります
  • Home | Think Twiceでは、基本的にこのコレクションを使って記事を書いています
  • 記事の中には見出しで小分けにしているものがあります(これとか)
  • 記事の取りまとめをしている記事の中で、{{ item.content }} のようにアクセスしているところで、読み込んだ内容が評価されないという事象が起きている
  • 常にというわけではなく、読み込む記事の内容がサブフォルダにある場合だけ発生する事象である
  • 同じフォルダにある場合は発生しない

うまく行く例

f:id:fumokmm:20201215132050p:plain
f:id:fumokmm:20201215132054p:plain

うまく行かない例

f:id:fumokmm:20201215132118p:plain
f:id:fumokmm:20201215132133p:plain

まとめ

理由はよくわかりませんが、原因が分かったら追って報告します。

参照

Jekyll • Simple, blog-aware, static sites | Transform your plain text into static websites and blogs

よかったらどうぞ

Home | Think Twice

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を解析することになるため、よく「たった〇〇だけで簡単!」と謳われているようなスクリプトでも、結構作るのが大変だということが分かりました

参照

WSLのUbuntuでRubyGems3.1.2から3.1.4へのUpdate時、operating_system.rbでエラーになる

f:id:fumokmm:20200830002656p:plain

はじめに

先日ふと思い立って、WindowsGithub Pagesでウェブページを作ろうと思い、色々と調べているところだった。エラーが発生したのは、こちらの記事を参考に、WSLUbuntuJekyllの環境を整えるため、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

原因調査

色々調べていった結果、RubyGemsoperating_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

JavaでIntStreamからStringのListを作る

f:id:fumokmm:20200828190008p:plain

IntStreamからStringのList(List)を作りたかったんですが、 .map だとintにしか変換できんなぁと思っていたら .mapToObj を使えばいいようです。

List<String> numList = IntStream.range(1, 10)
    .mapToObj(new DecimalFormat("000")::format)
    .collect(Collectors.toList());

こんな感じで。 numListには ["000", "001", ... "009"] が入ります。

Web版Excelでマクロ(自動化)にTypeScriptが使えるらしいってことで試してみたが

f:id:fumokmm:20200804161251p:plain

Microsoft365で使えるWeb版ExcelではマクロじゃなくてOffice Scriptsっていうのが使えるらしく、言語はなんとTypeScriptだという話。 さっそく試してみたのですが…

まだプレビュー版らしくて

まだプレビュー版らしくて、Microsoft 365 管理センター とやらから設定でOffice Scriptsを有効にしないといけないらしい。 以下画像参照

f:id:fumokmm:20200804161352p:plainf:id:fumokmm:20200804161357p:plain

なんか問題が発生するんだが…

あら、問題が発生してレコーディングできない😂

f:id:fumokmm:20200804161437p:plain

サンプルスクリプトみたいなのポチポチしてたらやっとTypeScriptに出会えた。※保存できないけど😇

f:id:fumokmm:20200804161446p:plain

まとめ

ということで、結局まだ使えなかったです。日をあらためてトライしてみます。

Windows10のIMEで切り替え時の「あ」や「A」を非表示にする方法

IMEのアイコンを右クリックして、プロパティを選択

f:id:fumokmm:20200715103458p:plain

IME入力モード切替の通知の画面中央に表示するチェックボックスをオフにする

f:id:fumokmm:20200715103510p:plain

以上

参考

Windows 10でIME切り替え時の「あ」や「A」の表示をオフにする:Tech TIPS - @IT