あしあと

自分自身のログ(足跡)となります。ソフトウェアエンジニアです。ブログはテック系の内容が少し多めです。

はてなブックマークから自分の好きそうなURLを抽出するスクリプトを書いた(Python)

こんなスクリプトを書きました。(結構前にですが。。)

  • 自分のはてなブックマークを抽出
  • そのブックマークしているユーザーの一覧を取得
  • そのユーザーがブックマークしているURLを取得
  • URLを取得できた回数が多い5件を抽出し、ファイル出力

その心は?

元は、

overlap.hatenablog.jp

を読んだ時、もう少し汎用的に使えるものを作りたいと思い、作成しました。
自分と近い志向の人のブックマークから、自分向けのレコメンドができるのは面白そうだなと思ったので。

使い方

詳細は、githubのREADME.md 読めばわかるようにしています。

github.com

技術的には、Pythonが使える環境があれば、大丈夫です。
データは内部にsqliteのファイルを作り、保持するような仕組みにしています。

スクリプトを実行するとレコメンドデータをrecommend.txtというファイルで出力するようにしています。

僕の使い方

僕はRaspberry Piにcronを仕込んで動かして、出力したファイルをiftttのトリガーに送り、メールを送信するようにしています。
(この辺の仕組みは、気が向いたら書きます)
ちなみにこんな感じにメール通知が1日に1回届くようにしています。

注意点&その他

ブックマークが多い人は、最初にデータを取得するの時間がかかります。
理由は、はてなAPIをのんびり叩いているので、ゆっくりペースになります。
ソースコードgithubに載せているので好きに触ってもらえれば自分風のレコメンドに変えることもできます。

Pythonのos.path.joinの仕様にちょっとハマった

Pythonでパスを結合しようと思って、こんな感じでコードを書いていたのですが、どうにも思った通りに動かない…

Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from os.path import join
>>> a = 'a'
>>> b = '/b'
>>> print(join(a, b))
/b

なんでaは結合されないのだろー、と悩みました。

で、実際にPythonのos.py(厳密にはos.pathはposixpath.py)を見ると、以下のようなコードでした。 (必要な箇所のみ抜粋)

import os

def get_sep(path):
    if isinstance(path, bytes):
        return b'/'
    else:
        return '/'

def join(a, *p):
    """Join two or more pathname components, inserting '/' as needed.
    If any component is an absolute path, all previous path components
    will be discarded.  An empty last part will result in a path that
    ends with a separator."""
    a = os.fspath(a)
    sep = get_sep(a)
    path = a
    try:
        if not p:
            path[:0] + sep  #23780: Ensure compatible data type even if p is null.
        for b in map(os.fspath, p):
            if b.startswith(sep):
                path = b
            elif not path or path.endswith(sep):
                path += b
            else:
                path += sep + b
    except (TypeError, AttributeError, BytesWarning):
        genericpath._check_arg_types('join', a, *p)
        raise
    return path

細かく読むと if b.startswith(sep)で、セパレータ(posixでは/)で始まっていると先頭は無視する模様…. 確かにdocstringにも書いているが、この仕様はなんなのだろうか...

ちなみにPythonのドキュメントにもちゃんと書いていましたね。

11.2. os.path — 共通のパス名操作 — Python 3.6.5 ドキュメント

そして、Pythonをもう数年書いているのに知らない自分もちょっと情けないですが...

アビステラコーヒーさんのコーヒーアソートはオススメ

1ヶ月ほど前にアビステラコーヒーさん(@abystellaxoffee)のシングルオリジン豆アソートセットを購入しました。アビステラコーヒーさんのサイトは以下です。

www.abystella.com

「飲むたびに産地を想う珈琲」というコンセプトにも惹かれました!

初めてでしたので、今回買った豆はアビステラコーヒー スペシャルティコーヒーアソートです。
ですので、簡単にレビューをします。

パッケージ

こんな感じで届きました。20gの豆が10種類ありました。

f:id:pyo_hei:20180512133810j:plain

感想

普段から豆を買って淹れているので、いろんな豆や焙煎具合を試しているのですが、それでも出会ったことのない味がたくさんあり、飲むたびに楽しかったです。

種類も多種多様で、スペシャリティーコーヒーを試したい人には絶対オススメです。

香りが良いコーヒが多く、淹れるのも楽しかったです(・∀・)

個人的なお気に入りは、

でした。

ただ、20gは個人的には少し多いので、15gぐらいでドリップして、5gは残しておいて、残りの豆と勝手にブレンドをして飲んでいます。
ちなみに、私は平日はコーヒーを飲むことが少ないので、到着してすぐに冷凍庫に淹れて、必要な時に開封して淹れました。

どんな人にオススメか?

  • (もちろん)自分でドリップして淹れる人
  • 本格的なスペシャリティーを飲みたい人
  • 新しい味を開拓してみたい人

今回はアソートを購入したのですが、次は通常の豆を購入したいなと思います。
アビステラコーヒーさん、ありがとうございました。

ちなみに、ミルはポーレックスを使っています。

ポーレックス コーヒーミル セラミック ミニ

ポーレックス コーヒーミル セラミック ミニ

 

PyPIの登録にMarkdownが使えるようになった!

PyPIPythonサードパーティー用ライブラリ)に登録する際、マークダウンが対応したみたいです。
今までは、reStructuredTextしか対応していなかったので、マークダウンで書いてコンバートしたり、ドキュメントを見ながらreStructuredTextで書いていたりしていたのですが、今回からマークダウンでよいので、かなり嬉しい。

ちなみに、たまたま、このstackoverflowを見ていたら気づきました。

stackoverflow.com

そのうち、いろんな人が手順を書きそうですが、簡単にメモ。(2018-04-30時点)
以下がPEPでの規定なので、そちらを読む方が手堅いです。

www.python.org

必要な環境

  • setuptoolsのバージョンが 38.6.0 以上
    大抵の人が古いので、バージョンアップが必要です
  • twine のバージョンが1.11.0 以上
    自分は入ってなかったので、pip install twine でインストールしました。

上記の環境が揃ってないと、マークダウンで書いても反映されないので、ご注意ください。

マークダウンで記載する方法

要点は3つで、

  1. マークダウン(*.md)で書く(当たり前)
  2. setup.py の long_description_content_type に 'text/markdown' と指定する
  3. アップロードするときは、 twine upload dist/* コマンドでアップロードする
    (厳密には python setup.py sdist でアーカイブを作成する必要もあります)

実際にアップしたサンプル(ライブラリ)は以下です。
これはファイル名を暗号化する自分用の簡易なライブラリです。

github(setup.py)

github.com

pypi

pypi.org

最後に

ほぼ自分用のメモに近い形で書いたので、何か補足とか質問があればどうぞ。
気が向いたら、もう少しちゃんと清書します。

デザリングで、I-O DATA(WN-AX2033GR)のファームウェアアップデート方法

pyohei.hatenablog.com

のブログでDMM光に変更した際、v6プラスを使うため以下のルータを購入しました。 

こちら、ファームウェアバージョンが、2以上でないとv6プラスの機能を使えないです。

私はこ購入時点で、バージョンは1台でした。さらに、私は引っ越しをしてv6プラスを、いきなり契約したので、ネットに接続できず(厳密にはIPv6に対応してないサイト=ほとんどのサイト)、困りました。

私は以下のように対応したので、他に困っている方が入れば参考にしてください。

手順

前提として、PC(私はMac Book Pro)が必要です。

  1. デザリングで、WN-AX2033GR | サポートライブラリ | IODATA アイ・オー・データ機器 | IODATA アイ・オー・データ機器に接続
  2. 自分のOSにあったファームウェアをダウンロード
  3. ファイルを解凍する
  4. Macの場合はbin拡張子のファイル(Windowsだと、おそらくexe)を確認する
  5. デザリングを解除する
  6. http://192.168.0.1/ にアクセス(環境によっては少しIPが違うかもしれません)
  7. システム設定 → ファームウェア → ファイルの選択 を押す
  8. [4]で確認したファイルをアップロード
  9. しばらくしたら再起動される(はず)なので、完了

IPv6に繋げる設定は以下のブログに書いてくださっているので、参考にしていただけると良いと思います。

www.odorikoblog.net

手順も簡単ではないので、分からない場合は、一度通常のネット(IPv4)の回線に変更してもらってからファームウェアアップデートをして、IPv6に変更するのが手堅いです。

DMM光は個人的にオススメ(2018年4月)

最近、引っ越しをし、ネット環境をDMM光に変えました。↓です。

hikari.dmm.com

契約条件としては、

  • 新規契約
  • DMM光マンションタイプ(集合住宅向け)
  • オプションはv6プラス以外はなし

です。関西在住です。

1ヶ月近く利用した感じですと、非常に満足で、個人的にはおすすめです。
まとめると以下のような感じです。

良かった点

  • 価格がシンプル
    他のプロパイダーはDMM光よりも安いかもしれないが、ほんとーーーーに、料金体制がわかりにくすぎて、考える時間を使いすぎる。一方、DMM光は料金体制がシンプルです。これが最大の理由です。料金も決して高くないです(詳しくはサイトをみていただければ)
  • 高速
    今回v6プラスにしたのが大きいのですが、かなり早いです。以前はJCOMだったのですが10倍以上早くなりました(引っ越ししているので、地域差や時間帯など条件は違うので完全な比較結果ではないですが...)。変化は下に画像貼っておきます。
  • 解約がシンプル
    他のプロバイダーだと解約金が高かったり、条件が複雑なので、わかりやすくて良かったです。
  • 申し込みがシンプル
    比較はしにくいですが、登録はサイトであっさりできましたし、登録後に工事の日を電話で決め、あとは工事日に工事したら完了と、シンプルに終わりました。

その他色々(モバイル割/DMMのサービスが使えるなど)ありますが、シンプルさが一番の決め手でした。

Before

f:id:pyo_hei:20180415105208j:plain

After

f:id:pyo_hei:20180415105201j:plain

悪かった点

  • サポートに電話が全く繋がらない
    v6プラスまわりで確認したいことがあり、電話したのですが、なかなか繋がらなかったです。土曜日に20回くらいかけても繋がらなかったり、平日も何回もチャレンジしても繋がらないので、おそらくサポートの人が結構少ないと思います。
  • あんまり情報がない
    参考にしたブログをリンクしていますが、ググってもあまり情報がないので、ちょっと不安になりました。

参考にしたブログ

以下を参考にさせてもらいました。

こんな人におすすめ

  • 高速なインターネットを使いたい
  • 料金体制や契約がシンプルに進めたい人
  • サポートが多くない印象なので、ある程度ネットリテラシーがある人

利用しているルータ

v6プラスを利用するためには、対応しているルータが必要です。私は↓をつかっています。  

 Amazonのレビューでは、不安定などのレビューもありますが、私は特に問題なく利用できています。何度か移動させるために電源を切ったりもしていますが、電源を繋げると、すぐに繋がります。

ただし、ファームウェアアップデートをしないと繋がらない可能性がありますので、ご注意ください。アップデート方法は機会があれば作成します。書きました。

pyohei.hatenablog.com

最後に

DMM光については、あんまりブログ記事はないので、今DMM光を考えている人がいれば、コメントくだされば分かる範囲でお答えしますよ〜。

MacでSDカードにRaspberry Pi用のイメージを書き込む方法

(2019.06.08追記) Mojaveで動作することを確認済みです。

Raspberry Pi を利用しているのですが、MacでコマンドからSDカードに書き込む手順を書いている日本語のサイトが見つからなかったので書いてみました。
かなり需要は低そうですが...

やりかた

SDカードを差してから以下のような手順です。
RASPとなっているところは好きな値(SDカードにつけたい名前)にしてもってOKです。

SDカードのデバイス名を確認

以下の方法で確認可能です。今回は /dev/disk3 に存在することを仮定します。

diskutil list

SDカードのフォーマット

以下のコマンドでフォーマットします。
RASPの部分は自分の好きな名前(ホスト名など)で大丈夫です。

sudo diskutil eraseDisk FAT32 RASP MBRFormat /dev/disk3

注意

/dev/disk3s1などパーティションを指定しないこと!! 以下が参考です。

フォーマットしたSDカードをアンマウント

以下のコマンドです。/Volumes/RASP/RASPは先ほど指定したフォーマット時の名前になります。

sudo diskutil umount /Volumes/RASP/

イメージの書き込み

インストールしたいイメージをダウンロードして、以下のコマンドで書き込めます。
私の場合はUbuntu Mate(16.04)を書き込みました。

sudo dd bs=16m if=ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img of=/dev/disk3 conv=sync

# xz形式のまま書きこむ場合は以下です。
# こちらは速度が遅くなるので、あまりオススメではないです。
xzcat ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz |  sudo dd bs=16m of=/dev/disk3 conv=sync

(2019.06.08追記)Ubuntu Mate(18.04)でも動作することを確認済みです。

sudo dd bs=16m if=ubuntu-mate-18.04.2-beta1-desktop-armhf+raspi-ext4.img of=/dev/disk2 conv=sync

SDカードの取り出し

以下で取り出します。
僕はejectせずに取り出して起動しないことが多々あるのでご注意ください。

sudo diskutil eject /dev/disk3

あとは、好きなラズパイに突っ込んでもらえれば起動するはずです。

その他

ちなみに、私の環境は以下です。

f:id:pyo_hei:20180204140130p:plain

f:id:pyo_hei:20190608072038p:plain

参考

使用したツール

ちなみに利用したツールは以下です。