turtlechanのブログ

無知の私がLinuxをいじりながら書いていくブログ

【Linux】Debian の lightdm が .bash_profile(.profile) を読み込まない

特に理由もなくディスプレイマネージャーを「lightdm」に変更したら、「.bash_profile」を読み込んでくれなくなった。

解決方法を探すのに苦労したので、タートルちゃんブログに記事として残しておこうと思います。

まえおき

私が普段使っている Debian のディスプレイマネージャーを「lightdm」に変更しました。
インストールする際にデフォルトで起動するディスプレイマネージャーの選択画面が表示され、問題なくインストールが完了し、起動も問題ないと思っていました。
しばらく使って気づいたんですが、「.bash_profile」に書いている環境変数(PATH)が反映されていなかったのです。私は普段 pyenv を愛用しているのですが見つからないという。。。

ちなみに変更前は「sddm」を使っていました。
その時は「.bash_profile」も正常に読み込まれていました。つまり「lightdm」のせいで読み込まれなくなったわけです。

「.bash_profile」を「.profile」に変更しても読み込まれませんでした。
どうやら Debianlightdm はログイン時にプロファイルファイルを読み込まなくなるようだ。

余談

Debianbash は「.bash_profile」が現役ですが、Ubuntu の場合は「.bash_profile」ではなく「.profile」に変更になっていたかと思います。
Ubuntu の方は「.bash_profile」で書くと読み込まれないので「.profile」にしましょう。それで解決するはず。

解決方法

細かいことはどうでもよい。

.bash_profile の場合、以下のコマンドを実行。

$ echo '. $HOME/.bash_profile' >> ~/.xsessionrc

.profile の場合は、以下のコマンドを実行する。

$ echo '. $HOME/.profile' >> ~/.xsessionrc

上記のコマンド実行後、ログアウト&ログイン もしくは 再起動すればプロファイルが読み込まれる。
環境変数(PATH)も反映されているはずです。

何をしているか

ホームディレクトリ直下の「.xsessionrc」に

. $HOME/.bash_profile

の一行を追記(.xsessionrcファイル が存在していない場合は作成)しています。
行頭の .(ドット) はコマンドでいう source です。間違えじゃないので消さないようにね。

 

「.xsessionrc」って何か
GUI起動をすると必ず実行される(だろう)設定ファイル という認識しかありません。
私は詳しいことは何も知りません。私の知っていることをここに書くよりも、ググった方が詳しいだろうし分かりやすいはずです。

おわりに

.bash_profile を通らないなら、.xsessionrc(必ず通る道)で指示しよう的な、当たり前そうな解決策です。

そもそも .bash_profile が読み込まれるのが当たり前だと思っていたので、記述や設定の間違いを疑っていました。そして多くの時間を無駄にした。
思い込みって怖いですね。

 

他にもっと良い解決方法あるよってのがあれば、教えてください。

 

何かの参考になれば幸いです。

Pythonで無尽蔵から株価データをダウンロード(修正)

いつも私がお世話になっている 汲めども尽きない 無尽蔵 さん。
どうやら今年から株価データのダウンロードURLが変更になったようです。

以前私が書いた記事のスクリプトでは駄目になってしまったので、サクッと書き直してみようかなと。
最低限しか書きませんが、参考になれば幸いです。

ちなみに、新しくなったダウンロードURLは 無尽蔵さんのおしらせ帳のページ で確認できます。

※python2で書いてます。

変更されたところ

お知らせには

■新年よりデーター取得アドレスが変更になりました。
当日データー(2020年1月6日の例)
http://mujinzou.com/d_data/2020d/20_01d/T200106.zip

過去株価データー(2020年1月6日の例)
http://mujinzou.com/k_data/2020/20_01/T200106.zip

日経先物(分足)(2020年1月6日の例)
http://mujinzou.com/k_data/2020/NS2001/NSL_200106.zip

ミニ先物(分足)(2020年1月6日の例)
http://mujinzou.com/k_data/2020/NS2001/NSM_200106.zip


■掲載の継続は保証出来ませんので、ご承知おき下さい。
 データー保管の意味合いから、掲載時刻は当日でない
 場合もあり、当日更新の約束はできません。

と書かれていました。

過去株価データで言うと、以前は「http://souba-data.com/k_data/2015/15_01/T150105.zip」でした。

ドメイン名が「souba-data」から「mujinzou」に変更になっただけで、ファイル名など大きな変更はなさそうです。

 

で、■新年よりデータ取得アドレスが変更になりました。の一文。
「今年からのデータの取得アドレス」なのか、
「今年から過去データすべての取得アドレス」なのか、
いまいち分からなかったので少し調べてみました。

  • 2020年 と 2019年 のファイルは、新しいドメイン名(mujinzou.com)
  • 2018年以前のファイルは、旧ドメイン名(souba-data.com)

でした。データの移行の問題かもしれませんので、今後変更になるかも?
それと、2014年以前は圧縮形式が lzh ですが無視します(面倒くさいので)。

日足データのダウンロード

以上を踏まえてpythonで書いてみました。

mujinzou.py
#! /usr/bin/env python
# coding: utf-8

import os
import codecs
import zipfile
import requests


class Mujinzou(object):
    ''' 無尽蔵のクラス '''

    def __init__(self):
        ''' 初期化メソッド '''
        pass

    @classmethod
    def dl(cls, savePath='./', date_str='2015-01-05'):
        ''' 日足データの保存 '''
        if not os.path.isdir(savePath):
            os.makedirs(savePath)
        year, month, day = date_str.split('-')
        fileName = 'T{0}{1}{2}.zip'.format(year[-2:], month, day)
        filePath = os.path.join(savePath, fileName)
        # ここから修正部分
        if int(year) < 2019:
            url = 'http://souba-data.com/k_data/{0}/{1}_{2}/{3}'.format(year, year[-2:], month, fileName)
        else:
            url = 'http://mujinzou.com/k_data/{0}/{1}_{2}/{3}'.format(year, year[-2:], month, fileName)
        # ここまで修正部分
        response = requests.get(url)
        if response.status_code != 200:
            raise
        with codecs.open(filePath, 'w', encoding=None) as f:
            f.write(response.content)
        return filePath

    @classmethod
    def load(cls,  path='./', date_str='2015-01-05'):
        ''' 戻り値 {code: [open, high, low, close, volume]} '''
        dic = {}
        year, month, day = date_str.split('-')
        fileName = 'T{0}{1}{2}.zip'.format(year[-2:], month, day)
        with zipfile.ZipFile(os.path.join(path, fileName), 'r') as zf:
            for row in zf.open(zf.namelist()[0]):
                row = row.split(',')
                dic[row[1]] = row[4:9]
        return dic


def main():
    import time
    Mujinzou().dl()
    time.sleep(5)
    Mujinzou().dl(date_str='2018-01-04')
    time.sleep(5)
    Mujinzou().dl(date_str='2019-01-04')
    time.sleep(5)
    Mujinzou().dl(date_str='2020-01-06')


if __name__ == '__main__':
    main()

直接スクリプトを実行すれば 2015-01-05 と 2018-01-04, 2019-01-04, 2020-01-06 の株価データがダウンロードできるので問題なさそうです。

以前の記事のスクリプトを修正しただけなので、動作は過去記事を読んで下さい。

turtlechan.hatenablog.com

また何かあっても私は保証できませんので、サーバーの負荷など十分考慮してください。

おわりに

何かの参考になれば幸いです。

また、汲めども尽きない 無尽蔵 さまには日々感謝しております。
益々のご活躍をお祈り申し上げます。 これからもよろしくお願いいたします。

【Linux】Calibre でkindle本の DRM を解除する方法メモ

LinuxDRM を解除しようとしたら設定に少し手間が掛かった。
再設定するころには忘れていると思うので、備忘録として記事に残すことにした。

はじめに

Windows では問題なく DRM 解除ができていた。
Linux では Amazon Kindle をwine上で動かしているので Calibreプラグイン DeDRM_plugin が「kindlekey1.k4i」を上手く取得できないのが問題の模様。

 

結論を言うと Amazon Kindle をインストールしているwineに Python2 をインストールして DeDRM_tools_x.x.x.zipに含まれている「kindlekey.pyw」をwine上で実行すればいい。
そして生成された kindlekey1.k4i を DeDRM_plugin に読み込ませる。

DRM を解除する

LinuxCalibre, DeDRM_plugin、 wine上に Amazon Kindle がすでにインストールされていることを想定して書いています。まだの場合は下のおまけの部分を読んでください。

wine上に Python2 をインストール

インストーラーのダウンロード

python2 のインストーラーをダウンロードします。

※私は python 2.7.15 をインストールしていますが、2.7 なら他のでも大丈夫だと思います。

Download Python | Python.org
URL: https://www.python.org/downloads/

上記のサイトに飛んで、Python 2.7.15 の Download をクリック。

Download Python の画面01

Files の「Windows x86 MSI installer」をクリック。

Download Python の画面02

ダウンロードされますので、ホームディレクトリ(~)にでも保存して下さい。

インストール

wineで python2 のインストーラーを起動して、wine上にインストールします。

以下のコマンドを実行。

~$ wine msiexec /i python-2.7.15.msi

インストーラーが立ち上がるので、特に何も変更せずインストールします。問題なくインストールが完了するはず。

kindlekey1.k4i の生成

DRM 解除のための鍵となるファイル kindlekey1.k4i を生成します。

DeDRM_tools のダウンロード

DeDRM_tools に含まれる python スクリプトを使用するので、以下のサイトからダウンロードします。

Releases · apprenticeharper/DeDRM_tools · GitHub
URL: https://github.com/apprenticeharper/DeDRM_tools/releases

バージョンは最新版で問題ないと思います。ホームディレクトリ(~)にでも保存してください。

DeDRM_tools · GitHub 画面01

kindlekey1.k4i を生成

以下のコマンドで、ダウンロードしたファイルを解凍、
今回必要なファイルは「kindlekey.pyw」です。それだけを解凍してます。

~$ unzip -j ~/DeDRM_tools_6.6.3.zip "Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw"

※ダウンロードしたzipファイルはホームディレクトリ(~)に保存したと仮定しています。

wine上の Python2 で「kindlekey.pyw」を実行します。
次のコマンド。

~$ wine python ~/kindlekey.pyw

成功すると以下のウィンドウが出ます。

kindlekey.pyw の成功画面

ホームディレクトリ内に「kindlekey1.k4i」が出来ているはずです、確認してみてください。

CalibreDRM 解除

Calibre に上記で生成した「kindlekey1.k4i」を読み込ませ、DRM を解除できるようにします。

Calibre に kindlekey1.k4i を読み込ませる

Calibre を起動して「設定」をクリック。

calibre の画面01

設定画面が出てくるので、高度な設定の「プラグイン」をクリック。

calibre の画面02

プラグイン画面が出てくる。
DeDRM を選択して「プラグインをカスタマイズ」をクリック。

calibre の画面03

DeDRMの設定画面、「Kindle for Mac/PC ebooks」をクリック。

calibre の画面04

「Import Existing Keyfiles」をクリック。
ファイラーが起動するので、上記で生成した「kindlekey1.k4i」を選択します。

calibre の画面05

先程まで空白だったところに「kindlekey1」が追加されているはず。

calibre の画面06

あとは閉じてください。以上で「kindlekey1.k4i」の読み込みは完了です。次回から CalibreKindle本 を開くと自動で DRM が解除されるようになります。
また、DeDRM に kindlekey1.k4i を読み込ませたら、kindlekey1.k4iファイル はもう必要ないので削除して問題ありません。

ちなみに、「WINEPREFIX:」のところに正しいwineのパスを書いて追加ボタン(+)をクリックしても kindlekey1.k4i は生成できませんでした。あとwineのディレクトリ構造が変になったりするので追加ボタン(+)はクリックしない方がいいと思います。

DRM を解除してみる

wine上の Kindle for PC でダウンロードしたファイルを Calibre で開けば自動で DRM を解除してくれます。
フォーマットが「AZW3」になっていれば解除が成功しています。

calibre の画面07

calibre の画面08

おまけ

wineのインストール

wineにもバージョンは色々あるが私は気にしない。

Debian

~$ sudo apt-get install wine

RHEL系は少々面倒だった気がするので割愛。

Amazon Kindle のインストール

wine上で動かすには 1.17.x が安定していたと思う。この記事を書いている時点では問題なく同期可能。
どこからかインストーラーをダウンロードして来てください。一応現時点でダウンロードできる URL を書いておきますが、問題が起きても自己責任でお願いします。

Kindle for PC 1.17.44183
URL: http://www.mediafire.com/file/ku208jm2ccqvn1w/KindleForPC-installer-1.17.44183.exe/file

wineでインストーラーを起動してインストール。

~$ wine KindleForPC-installer-1.17.44183.exe

※ winecfgでwindowsバージョンをWindows 7 に設定しておいて下さい。

Calibre のインストール

Debian

~$ sudo apt-get install calibre

RHEL系は割愛。

DeDRM_plugin のインストール

以下から DeDRM_tools_x.x.x.zip をダウンロードします。バージョンは最新版でいいんでね?

Releases · apprenticeharper/DeDRM_tools · GitHub
URL: https://github.com/apprenticeharper/DeDRM_tools/releases

ダウンロードしたファイルを解凍しておきます。

 

Calibre を起動して
設定→プラグイン→ファイルからプラグインを読み込む
DeDRM_calibre_plugin フォルダ内の「DeDRM_plugin.zip」を選択
Calibre を再起動で完了です。

おわりに

wine上に pycrypto もインストールしているのを見るが、私の場合はインストールせずにできた。この辺はよく分かってないです。

wine上で安定して動く Kindle for PC 1.17 がいつまでサポートされるか分からない所が不安ですね。

何かの参考になれば幸いです。

追記

Kindle for PC が接続できなくなった

Debian 9 で最近dist-upgradeしたら Kindle for PC がネットに接続できない現象が発生しました。
「接続できません。ネットワークの設定とプロキシの構成を確認してください」というダイアログが表示されます。Debian 10 でも同様の症状が出てます。
私の技量では原因を見つけることはできませんでした。リリースノートを見て削除されたパッケージをインストールすれば直るかもしれないですが、面倒なので私は試していません。
とりあえず私の環境では Debian 9.8 に戻して正常に接続できることを確認できました(Wine 1.8.7-2)。また、Manjaro Linux では問題なく接続できています。
Debian 固有の問題?もしかしたらUbuntu系でも同様の症状が出てるかもしれないですね。

Calibre 5.x で DRM が解除できない

現在 Calibre のメジャーバージョンが「5」になっています。DeDRM_plugin も最新のもの(beta)で Calibre 5 に対応したみたいなのですが、私の環境では DRM が解除されませんでした。Crypto がねーよって言われます。バージョンが上がったことで Python2 から Python3 に移行されているみたいだったので Python3 に Crypto を入れたけど駄目でした。
解決策としては Calibre 4 にするのが早そうです。
calibre - Download for Linux に書かれているコマンドを実行すればスクリプトが勝手にやってくれます。

~$ wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin version=4.23.0

※ コマンドそのままコピペだとそんなコマンドないって怒られたので必要な部分のみ抜粋。
※ 上記のコマンドでも、すでにインストールされているCalibreどうする?って聞いてくれるいい子。