起動しなくなったWindows10からUbuntuでファイルを救出する
はじめに
急にWIndows 10が起動しなくなりました。以前(かなり前ですが)Linuxをつかって救出したことがあったのですが、今回はエラーが出てうまくいかず…。
エラーは簡単に言うと、Windowsのあるディスクにアクセスできない、というもの(error mounting /dev/sdb1 at ...などのように出てきます)。
これはどうやらWindowsの高速起動なるもののためにディスクが「休止状態」になり、そのため「使用中」と判断されてLinuxからアクセスできない、ということのようです。
対策
(1) LinuxのDVDをつくる
今回はUbuntuを使います。詳細については「Ubuntu データ救出」などで調べたらたくさん出てきます。
まずはISOファイルをウェブからダウンロード、それをDVDに焼きます。そしてこのDVDからコンピューターを起動する、ということになります。
(2)コンピューターの起動優先順位を変える
BIOSを起動し(電源入れてすぐにF2、F10、F12あたり(コンピューターによって異なります)を連打)、BootメニューからPriorityを変更します。Windowsのあるディスクが一番になっていると思いますが、これをCD/DVDのデバイスよりも下にします。
(3)DVDからUbuntuを起動する
BIOSを終了すると、DVDから起動します。ファイルを読み込むために起動には時間がかかりますので辛抱強く。
「Ubuntuを試す」を選択(重要!インストールにしたらファイルが全部消えます)して起動を待ちましょう。
(4)コマンドラインから入力する
左のバーのあたりにディスク一覧が表示されます。それをクリックすれば基本的にはアクセスできるはずなのですが、前述の通りマウントエラーができました。エラーコードからWindowsのある場所の名前を取得しましょう。dev/sda1などとなっているはずです(ディスクの配線によって数字やアルファベットがわかります。sdb1, sda2など)。
そこで、コマンドラインから強制的に読み取り専用のアクセス権を取得します(書き込みは不可)。まず、Ctrl+Alt+Tでターミナルを起動、次のコマンドを入力。
sudo mkdir /media/ubuntu/PC
#マウントする先を作ります
sudo mount -t ntfs-3g -o ro /dev/sda1 /media/ubuntu/PC
#さきほど作った場所にdev/sda1を読み取り専用でマウントします
【参考】UbuntuでWindowsの休止状態のNTFSボリュームをマウントする - Qiita
(5)ファイルを選んでUSBメモリなどにコピーする
これでディスクにアクセスできるようになるので、必要なファイルをUSBメモリなどにコピーしましょう(Usersのなかのアカウント名ごとフォルダをコピーするのが早いかもしれません)。
Python (Jupyter)でファイルが読み込めない問題
エラーの内容
WindowsでPython (Jupyter)を使っている場合、ファイルを読み込む際に次のようなエラーが出ることがあります。
UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence
これは例えばutf-8のファイルを開くときに起きることがありますが、Windowsのデフォルトの文字コードではデコードできないというエラーです。
対処法
その対処法としてはcodecsを使って、encodingを指定して開くのが有効のようです。
# coding: utf-8
import codecs
f = codecs.open('jikken.txt', mode='a', encoding='utf-8') # 追加書き込みモードで開く
f.write("This is a pen.") #文字列をファイルに書き込む
f.close() #ファイルを閉じる
IPアドレスからアクセス元のホストを取得する(nslookup)
はじめに
ウェブサイトなどでログをつけていると:
111.11.111.11
111.11.111.22
111.11.111.33
などのIPアドレスのリストを得ることがあります。このIPアドレスのリストからホストを取得し、アクセス元のおおよその国などを特定する方法を紹介します。
方法
Windowsのコマンドプロンプトのnslookupを使います。このコマンドのあとにIPアドレスを打つと:
nslookup 182.22.59.229
>サーバー: UnKnown
>Address: 111.111.1.1
>名前: f1.top.vip.ssk.yahoo.co.jp
>Address: 182.22.59.229
などのように「名前」というところにホスト名が記されます。ここにはプロバイダーの情報が表示されますが、これでおおよその国(.jpは日本, deはドイツなど)などの情報がわかります。
これをアドレスの一覧に対して行うにはバッチファイルを作成すればOKです。
エクセルでIPアドレスの一覧をコピペで入力し(「データ」から「重複の削除」をしておくとよいでしょう)、隣のセルに:"nslookup " & A1として下までコピーします(nslookupの後に半角スペースが必要です)。
これをテキストエディタに貼り付け、ip.batなどの名前で保存します。
その後、コマンドプロンプトからip.bat > result.txtのように実行すればテキストファイルとして一覧を取得できます。
Rにread.tableで2次元の表(分割表)を読み込む
データ
このようなデータをRにクリップボード経由で読み込むには、次のようなコマンドを打ちます。
data=read.table("clipboard",header=T)
この読み込みでは、Student, Eng, Kokugo, Mathという4つの変数からなる形で認識されています。これでは行に名前がない状態ですので、例えばこのデータを使って対応分析を行うことはできません。
対応策1:row.namesを指定する
row.names="Student"のオプションを加えることで、Studentの列を行名として認識させることができます。
対応策2:Studentの部分を空白にする
単純な方法としては1行目の第1列を空行しておくと、Rがその列を列名として認識してくれます。