ほぼ中立ブログ

少しだけ趣味に偏った雑記ブログ

Windows10を高速化する3つの方法

どうにもパソコンの動作がモッサリとしていたので軽くする方法を調べてみました。 こうした試みは徒労に終わる傾向が強いような印象があったのですが、珍しく満足するレベルで高速化できましたので備忘録を兼ねてまとめます。

割と釣りタイトルな気がしますので、詳しい情報を知りたい方は、記事中で参考・引用させて頂いたサイトをご覧ください。

簡単に検索した結果、パソコンを早くするには概ね次の2つに気をつければ良いようです(他にも有りますけど)。

  • ハードディスクへのアクセスを減らす。
  • CPUを最大限使う。

この2つを念頭において、色々試してみました。なお、ハードディスクの容量に関しては今回はノータッチです。今日日、システムが不安定になるほどハードディスクを使い切ることも珍しいと思いますので。

アプリのバックグラウンド実行を許可しない

バックグラウンドで色々なアプリが動いていると、それらがハードディスクにアクセスしたりCPUを使ったりで、動作が遅くなる、という理屈のようです。 というわけで、これを止めていきます。詳しい方法はこちらの参考記事をご覧ください。

takulog.info

設定方法を一応説明しますと、Windowsの設定を開き、「設定の検索」欄に「バックグラウンドでの実行を 許可するアプリを選んでください」と入力、エンターを押して飛んだ先の画面に、アプリのバックグラウンド実行を許可するというボタンがありますので、適宜オフにしていきます。 必要なアプリが何かを考えるのが面倒だったので、とりあえず全部オフにしてしまいました。今の所問題は起きていません。

体感ではちょっと軽くなったかなという位、それとノートパソコンのバッテリーの減りが若干遅くなりました。むしろこちらの方が嬉しい。

プロセッサ(CPU)の最小の状態を100%にする。

デフォルトの設定では省エネのために、使わないときにはCPUへの電力供給が抑えられているようです。これはこれで役に立ちますが、場合によっては処理が遅くなるため高速化のお題目の前には無用です。というわけで、CPUには常にフルパワーで待機しておいてもらうことにします。

詳しい方法はやはり上と同じこちらの方の参考記事をご覧ください。

takulog.info

分かりにくいことを承知の上で説明しますと設定項目は、「Windowsの設定」->「システム」ー>「電源とスリーブ」ー>「電源の追加設定」ー>「電源プランの選択またはカスタマイズ」ー>「プラン設定の変更」ー>「詳細な電源設定の変更」ー>「プロセッサの電源管理」ー>「最小のプロセッサの状態」にあります。 デフォルトでは5%になっていると思いますので、これよりも大きな値に変更します。私は100%にしました。

試した方法の中では一番効果がありました。どうやら、CPUが寝ぼけていたことがモッサリ感の主な原因だったようです。ファンの音が若干うるさくなりがちですが、サクサクになったので良しとします。

書き込みキャッシュバッファーのフラッシュをオフにする

この設定をしますと、停電等でパソコンへの電力供給が突然停止した際に、データの消失が起こりやすくなるようなので、ノートパソコンなどバッテリーで駆動できる装備がない場合、やらない方が無難なようです。

理屈はよく分かりませんでしたが、ハードディスクの書き込みが速くなるようなので一応設定します。

詳しい方法は例によって参考記事をご覧ください。

pc-karuma.net

コルタナでデバイスマネージャーを検索・起動。ディスクドライバの項目にある、自分が使っているハードディスク名の所をダブルクリックします。その後出てきた設定画面のポリシーの欄にある「デバイスでWindowsによる書き込みキャッシュバッファーのフラッシュをオフ」にするにチェックを入れます。

少しだけ早くなったような気がします。正直微妙です。ただ、ハードディスクは何かとモタモタしやすいだろうということで設定したままにしています。


パソコンを軽くする方法は色々挙げられていますが、実際に効果があるものはそんなに無いような気がしています。人間の体感できないレベルの数字ではどれも有用なのかもしれませんけどね。レジストリのクリーニングとか、レジストリの掃除とか、レジストリの何やかんやとか

シンプルに3つだけにまとめましたので、同じような悩みを抱えた方の参考になれば幸いです。

最後までお読みいただきありがとうございました。

CUIファイルマネージャrangerの設定ファイルについて

rangerはターミナルから起動できるvimライクなキーバインドで操作できるCUIのファイラーです。

ターミナル内で使えるファイラーは他にも試したのですが操作が良く分からず、デフォルトの状態でも十分使いやすいrangerに落ち着きました。全てとは言いませんが、マウスを使わなければならないGUIのファイラーに比べ素早くできることも多く、最近ではもっぱらこちらを使用しています。

その使い方については、すでに大変詳しい記事を公開されている方がいるため、検索すれば困ることは無いと思いますが、設定ファイルの書き方で少しつまずく所があったので、備忘録を兼ねてまとめます。

環境はUbuntu 18.04 LTSです。

インストール

Ubuntuならリポジトリに登録されているためaptでインストールできますが、バージョンが古いようなので、pipを使ってインストールしたほうが良いかもしれません。パッケージ名が若干トリッキーなのでご注意ください。

# pip3 install ranger-fm

設定ファイルについて

rangerの設定ファイル幾つか種類がありますが次のコマンドでデフォルトの設定ファイルが~/.config/ranger以下に生成されます。

ranger --copy-config=all

カスタマイズをする際は主に「rc.conf」と「rifle.conf」を変更していきます。rc.confでrangerのキーバインド等に関する設定を、rifile.confでrangerからファイルを開いた際に起動するプログラムを変更できます。

拡張子別に起動するプログラムを簡単に変更できる所が、大変便利です。

キーバインドのカスタマイズ

rangerはvimライクなファイラーということもあり、rc.confの書き方はvimに似ています。以下自分で追加した部分を載せます。

# Fでディレクトリ以下を再帰的に検索、Mlで表示を元に戻す。
# ファイル数が多いとフリーズします。ご注意ください。
map F console chain flat -1; filter%space
map Ml chain flat 0; filter

# Muで3つ上のディレクトリに移動。
map Mu cd ../../../

# bと.で上下に5個移動できるようにする。
map <MUP>       move up=5
map <MDOWN>     move down=5
copymap <MUP> b
copymap <MDOWN> .

ファイルを開くプログラムの設定

rifle.confについては書き方がよく分からなかったのですが、拡張子別に開くプログラムを変更する際の書式は以下のようになるようです。

ext [拡張子名]|[第2の拡張子名], flag [f or r or t] = [プログラム名] "$@ or [$1~$9]"

拡張子名は単純に拡張子部分を入力するだけなので、例えばtxtファイルならtxtとなります。|で挟んで追記することで、複数の拡張子を指定できます。

flagは幾つか種類がありますが、よく使うのはバックグラウンドでプログラムを起動するfな気がします。GUIのプログラムをfフラグ無しで起動すると閉じるまでrangerの操作ができなくなるため、実質必須だと思います。

$@で選択されたファイルが全てプログラムの引数として与えられます。$1~$9で選択されたファイルの内、何番目のファイルを渡すか指定できますが、使うのは$1くらいな気がします。

上の内容をまとめて、拡張子がfooまたはbarのファイルをgeditで開く設定は次のようになります。

ext foo|bar, flag f = gedit "$@"

拡張子よりも広い指定が可能なmime別のプログラムの変更もできますが、挙動を理解できていないので使っていません。


最後までお読みいただきありがとうございました。

参考リンク

CLI で Linux ファイルマネージャ ranger を使うことのメモ | Jenemal Notes

ブログが月間3000PVを突破したので一応分析してみる

あまりブログの運営に関する記事は作らずに淡々と続けていこうかなと思っていたんですが、やっぱり嬉しかったですしまあ良いかなーってことでダラダラと書き綴ってみます。

ブログ4ヶ月目にしてついに、1ヶ月のPVが3000を超えましたー。いやー、こんなにたくさんみていただけたなんて実感がわかないですねー。ありがとうございます!

嬉しくてウッキウキで「ブログ 3000PV」とか検索したら、1日3000PV突破しましたーみたいな記事がヒットしまして、心折れたのは内緒です。分かってはいたんですけど、まだまだというか、関係ない方からすれば、そんなんで喜んでんの?って数字ですよね。ハイ、頑張ります。

さて、本人以外には何の意味もない感想文を垂れ流すのも心苦しくなってきたので、この辺りで一応3000PV突破の分析のようなことをしてみます。

このブログは百合漫画のレビューやまとめ記事と、プログラミング系の記事が主なコンテンツというカオスな構成になっているんですが、PV数を集めているのは圧倒的に漫画のまとめですね。これはまぁ、情報量の差から当然かなぁ、と思います。実際自分でもこの手の記事は検索したことがありますし。

ただ、作るのが大変なのと、良いテーマが見つからないのがネックで、あまり数を用意できていないんですよね。これが一番将来性がありそうなので、定期的に作れるようにしたいなー、と思います。

次点で同じく役に立つという面から、プログラム系の幾つかは結構検索流入があるみたいですね。特に、タイル型ウィンドウマネージャのインストールに関する記事は案外読まれているようなんですが、ブログの練習として気軽な気持ちでまとめたもので、誰も読まないだろうなーと思っていたので驚いています。

まぁその逆もあるので、分からないものですね。せめて、自分には有益な記事を作るように心がけていこうと思います。備忘録、何て予防線を張っているものもありますが、本当は自分以外の方にも読んでいただきたいんですよ(泣)。

他に、挙げておいた方が良さそうなのは、検索流入とSNSからの流入の比率でしょうか。実はこのブログは一部の記事に関してTwitterでこっそりと、更新告知をしています。記事内容の脈絡の無さから、ブログからTwitterアカウントへの直接のリンクは張っていないんですが。これも、そろそろ何とかしたいですねー。

話が逸れました。検索流入とSNSからの流入の比率は大体8:2くらいです。検索流入の方が多めですね。ですが、SNSからは検索流入の少ないレビュー記事を読んでいただけているようなので、とてもありがたいです。

ぱっと、思いつくのはこれくらいでしょうか。何はともあれここで止まらないよう頑張ります。1日3000PVとかいう雲の上の数字に手が届いたら、また同じような記事を作るかも知れません。それまでは、さようなら。多分永遠の別れになってしまいますが(笑)。

うーん、何かクソ記事作ってしまう心理がよく分かりました。スゴく楽しい。ですがまぁ、続けるとただでさえ少ない読者の方を失うこと必至なので、もうやりません。ゴメンナサイ。淡々と続けて参りますので、どうか見限らないでいただけると幸いです。

最後までお読みいただきありがとうございました。

BiopythonによるオンラインのBLAST実行

Biopythonを使って、与えられたFASTAファイルの配列データをクエリーとしてオンラインのBLASTを実行するスクリプトを作成したので、備忘録を兼ねてまとめます。

公式のチュートリアルを参考に作りましたので詳しくはそちらをご覧ください。

コード

#!/usr/bin/env python3

import sys
from Bio.Blast import NCBIWWW

def blast(query, out):
    with open(query, "r", encoding="UTF-8") as f:
        string = f.read()
    result_handle = NCBIWWW.qblast("blastp", "nr", string, format_type="Text")
    with open(out, "w", encoding="UTF-8") as out:
        out.write(result_handle.read())

if __name__ == '__main__':
    query = sys.argv[1]
    out = sys.argv[2]
    blast(query, out)

補足

qblastがBLASTを実行する関数です。パラメータは第一引数から順に、"使用するBLASTの種類"、"相同性検索に使用するデータベースの種類"、"クエリー配列の文字データ"となっています。その他にもhitsizeなどの細かな設定が変更可能です。

実行結果ですがデフォルトではXML形式で帰ってくるため、目視で確認したい場合はformat_typeを"Text"にしておく必要があります。

その他

プログラムからBLASTを実行する場合は連絡用にメールアドレスを指定したほうが良さげなんですが、設定方法がよく分からなかったため放置してあります。使用される場合はその辺りを調べたほうが良いかもしれません。

それと、あくまで体感ですがブラウザから実行したほうが結果が出るのが早いような気がします。大量に実行すると接続が切れることもありましたし。

まあ、100個、1000個単位になると手作業なんて悠長なこともいってられないのですが。

最後までお読みいただきありがとうございました。

BiopythonでFASTA形式をPhylip形式に変換する

解析に使うプログラムの中には、FASTA形式の配列ファイルではなくPhylip形式のものを要求するものがあります。今回はそのような事情でFASTA形式のデータをPhylip形式に変換する、ちょっとしたスクリプトを書いたので備忘録を兼ねてまとめます。

Phylip形式についてのメモ

参考サイト

Phylip形式については上の参考サイト様にまとめられていたのですが、変換の際に重要そうなのは

  • 配列名は本来の定義では10文字しか使えないが、配列名と配列との間にスペースを入れることで配列名長の制限を廃止または緩めた形式も使われている。
  • interleaved形式とsequential形式がある。

この2点です。

変換方法

BiopythonのモジュールのAlignIOを使用します。公式のチュートリアルの抜粋・翻訳ですが下にまとめていきます。 AlignIOはSeqIOと概ね似たモジュールで対応しているフォーマットも同じです。 Phylip形式のファイルに対しては次の3通りに対応しているようです。

  • phylip
  • phylip-sequential
  • phylip-relaxed

phylipがinterleavedのPhylip形式ファイル、phylip-sequentialがsequentialなPhylip形式ファイルに対応しています。この2つに関しては配列名の長さが10文字以内という制約があります。3つめのPhylip-relaxedは配列名の長さに制限が無い、interleavedなPhylip形式です。

変換の具体的な方法ですが、BiopythonでFASTA形式として読み込んだ配列データをPhylip形式で書き出すだけです。公式のチュートリアルに"File Format Conversion"としてコードの例が紹介されていました。ただ、配列長が揃っていないとエラーが出ますのでアライメントは事前に行っておく必要があります。チュートリアルのコードを少し変えただけですが今回作成したスクリプトは以下の通りです。

とりあえず配列名の長さに制限の無いphylip-relaxedで出力されますので、適宜コードを変更する必要があります。

#!/usr/bin/python3

import sys
import os
from Bio import AlignIO

def convert(fasta):
    fasta = sys.argv[1]
    name = os.path.basename(fasta)
    name = os.path.splitext(name)[0]
    outfile = "{0}.phy".format(name)
    with open(fasta, "r", encoding="UTF-8") as f, open(outfile, "w", encoding="UTF-8") as out:
        alignments = AlignIO.parse(f, "fasta")
        AlignIO.write(alignments, out, "phylip-relaxed")


if __name__ == '__main__':
    infile = sys.argv[1]
    convert(infile)

適当なFASTAファイルを与えると

>Taxon1
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF
>Taxon2
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF
>Taxon3
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF
>Taxon4
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF

Phylip形式になります。

 4 60
Taxon1  AAAAAAAAAA BBBBBBBBBB CCCCCCCCCC DDDDDDDDDD EEEEEEEEEE
Taxon2  AAAAAAAAAA BBBBBBBBBB CCCCCCCCCC DDDDDDDDDD EEEEEEEEEE
Taxon3  AAAAAAAAAA BBBBBBBBBB CCCCCCCCCC DDDDDDDDDD EEEEEEEEEE
Taxon4  AAAAAAAAAA BBBBBBBBBB CCCCCCCCCC DDDDDDDDDD EEEEEEEEEE

        FFFFFFFFFF 
        FFFFFFFFFF 
        FFFFFFFFFF 
        FFFFFFFFFF 

ループカウンタに小数を使ったらハマった(Python)

入門書で読んだきり忘れていた問題に、この度出くわしたので備忘録を兼ねてまとめておこうと思います。

以下のようなPythonのコードを書いていました。

start, end, delta = 0.1, 0.3, 0.1
i = start
while i <= end:
    i += delta
    print(i)

自分としては3回値が表示されるつもりだったんですが実際に実行してみると次のように出力されます。

0.2
0.30000000000000004

2回しか表示されない上に、0.3が表示されるはずの2回めのループの値がおかしいですね。限りなく0.3に近いけれど、少しだけ0.3より大きい値になってしまっています。これにより3回目のループが実行されないようですね。

調べたところ、このような場合は正確な計算が行えるよう、decimalモジュールを利用すれば良いようです。

decimalモジュールを使って上のコードを書き直したものが次の通りです。

from decimal import Decimal

start, end, delta = Decimal('0.1'), Decimal('0.3'), Decimal('0.1')
i =  start
while i <= end:
    i += delta
    print(i)

これを実行すると以下のように出力されます。

0.2
0.3
0.4

今度は意図したとおりループ部分が3回実行されました。表示される値もピッタリ0.2, 0.3, 0.4で端数もありません。

最後までお読みいただきありがとうございました。

Biopythonで入力ファイルがFASTA形式か調べる

与えられた配列ファイルをプログラムで処理する際に、ファイルのフォーマットを調べておきたいという場合がたまにあります。拡張子で識別するのが簡単で手っ取り早いですが、FASTAファイルのようによく使われる拡張子が複数種類あるものだと、識別が若干面倒です。

そこで、拡張子によらずファイルがFASTA形式かどうかを判定する方法を調べることにしました。Stack OverflowのこちらのQ&Aに同じような内容がありましたので、こちらに記載されていたコードをほぼそのまま利用させていただきました。次の通りです。

from Bio import SeqIO

def is_fasta(seq_file):
    record = SeqIO.parse(seq_file, "fasta")
    return any(record)

BiopythonのSeqIO.parseを利用すると簡単に複数種類のファイルを読み込むことができますが、その際に指定したファイルの種類と実際のファイルの種類が異なっていると、戻り値のジェネレータの中身が空になります。これを利用することにより、与えられたファイルがFASTA形式なのかを判定することができる、ということのようです。

せっかくなので、与えられたディレクトリの中のファイルがFASTA形式なのか、GenBank形式なのか調べるプログラムを作ってみました。なお、複数種類のファイルが混在している場合は例外を発生させることにしました。

#!/usr/bin/env python3

from glob import glob
import os
import sys
from Bio import SeqIO

def identify_filetype(seq):
    formats = ["fasta", "genbank"]
    for file_format in formats:
        record = SeqIO.parse(seq, file_format)
        if any(record):
            return file_format

def identify_dirtype(seq_dir):
    path = os.path.join(seq_dir, "*.*")
    files = glob(path)
    memory = set()
    for seq in files:
        file_format = identify_filetype(seq)
        memory.add(file_format)
    if len(memory) != 1:
        raise Exception
    file_format = memory.pop()
    print(file_format)

if __name__ == '__main__':
    indir = sys.argv[1]
    identify_dirtype(indir)

最後までお読みいただきありがとうございました。