ためすう

Python で CSV ファイルを読み込むときに発生したエラー「UnicodeDecodeError」を解決する

2018-08-12

目的

Python から CSV ファイルを読み込むとしたら下記のエラーが発生しました。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/anaconda3/lib/python3.6/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 0: invalid start byte

このエラーの解決していきたいと思います。

ファイルを utf-8 で読み込むようにする

import csv

with open('data.csv', 'r', encoding="utf_8") as file:
    reader = csv.reader(file)

    for row in reader:
        print(row)

※ data.csv は自分が読み込みたいファイルに変更してください。

しかし、エラーが発生しました。

Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
  File "/anaconda3/lib/python3.6/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 0: invalid start byte

ファイルを utf-8 に変換する

ここで nkf 「Network Kanji Filter」を使い文字コードを変換します。

まず nkf コマンドをインストールします。

(すでにインストールしている人はスキップしてください)

$ brew install nkf

文字コードを変換していきます。

# 現在の文字コードの確認
$ nkf -g hogehoge.csv
Shift_JIS

# 文字コードを UTF-8 に変換します
$ nkf -w --overwrite hogehoge.csv

# 変更後の文字コードの確認
$ nkf -g hogehoge.csv
UTF-8

文字コードが変わったあと、下記のコードを実行すると読み込むことができました。

import csv

f = open('hogehoge.csv', 'r')
dataReader = csv.reader(f)
for row in dataReader:
	print(row)
f.close()

参考

Anaconda 環境に pip コマンドでインストールする

2018-08-12

目的

Anaconda を利用している時、 conda コマンドでインストールできないライブラリがありました。

pip コマンドでインストールした時のメモになります。

方法

Anaconda 環境の確認

$ conda info -e
# conda environments:
#
base                  *  /anaconda3
hogehoge               /anaconda3/envs/styletrans

任意の Anaconda 環境を activate する

今回は base 環境にインストールしたいので、

$ source activate base

とします。

pip コマンドでインストールする

(base) $ pip install hogehoge

※ hogehoge はインストールしたいライブラリに変更してください

これで無事にインストールすることができました。

参考

静的サイトのホスティング先を Github Pages から Netlify へ移行する

2018-08-05

目的

静的サイトを Github Pages で運用していたのですが、 Netlify へ移行することにしました。

理由としては、 jekyll でサイトを構築しており、利用したいプラグインが使えなかったためです。

Github 側でビルドするときに --safe オプションが true になるため、利用できないプラグインがあります。 (自作のプラグインも不可)

ローカルでビルドしてから、Github に push するという手もありましたが、

Netlify という良さそうなホスティングサービスを見つけたので

思い切って移行することにしました。

大まかな手順を記します。

手順

Github Pages で利用しているリポジトリをコピーする

Github のリポジトリで1度、Github Pages の設定をしてしまうと、

Github Pages ではないようにするには

  • ブランチ削除
  • リポジトリ削除

しかないようでした。

Github Pages で初期に発行されるデフォルトのドメインが残るのが嫌だったので、

Github のリポジトリをコピーします。

Netlify でアカウントを作成して、リポジトリを指定

次に Netlify に先ほど作った、リポジトリを指定してあげます。

Netlify についてはこちら

Netlify: All-in-one platform for automating modern web projects.

設定するのは数分で出来ました。

すると、ビルド、デプロイと実行されていきます。

Netlify が付与してくれた新しいドメインでサイトが閲覧できるようになるまでも、数分でした。

Netlify に独自ドメインを設定する

自分が持っているドメインに Netlify のネームサーバーを指定します。

ネームサーバーの設定変更が浸透するまで待ちます。

※ 自分は手順を間違えてサイトが閲覧できなくなる状態が数時間続いてしまいました。

Github Pages のドメイン設定を外して、リポジトリの削除

Netlify のネームサーバーが浸透したら、以前使っていた Github Pages のリポジトリに設定してある

自分が所有しているドメインを削除します。

問題ないことが確認できたら、リポジトリを削除します。

(注意) Goolge Analytics について

Google Analytics で計測されなくなるという問題がありました。

Github Pages では下記の設定をすれば、Goolge Analytics で計測できるようになります。

_config.yml

google_analytics: UA-XXXXXXX

今回、Netlify に移行したので計測できなくなっていました。

トラッキングコードを Netlify の

Settings > Build & deploy > Snippet injection

に埋め込みます。

どのサーバーでも計測できるように、トラッキングコードをソースコードに記載するのも良いかもしれません。

参考

Anaconda をインストールする

2018-08-05

目的

Anaconda をインストールします。

Anaconda は、データサイエンスに特化したプラットフォームを提供します。

導入

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

下記からインストーラーをダウンロードして、インストールしていきます。

インストール後、少し使ってみる

現在使用している環境は下記で見ることができます。

$ conda info -e
# conda environments:
#
base                  *  /anaconda3

xgboost、plotly をインストールする

Kaggle というサイトで、チュートリアルコンペティションに参加してみました。

ここで、チュートリアルを進めて行くと、xgboost plotly をインストールする必要が出てきました。

xgboost をインストールします。

$ conda install -c conda-forge xgboost

plotly をインストールします。

$ conda install -c plotly plotly

参考

vagrant で共有フォルダのマウントに失敗するので、解決を試みる

2018-08-05

目的

Vagrant で仮想マシンは起動できるのですが、共有フォルダのマウントに失敗しています。

発生しているエラー

    default: /vagrant => [動かしている環境]
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=500,gid=500 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

対応手順

$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.15.1)'!
$ vagrant vbguest --status
[default] GuestAdditions versions on your host (5.2.6) and guest (4.3.8) do not match.

guest が古いので、vbguest プラグインで更新します。

$ vagrant vbguest
[default] GuestAdditions versions on your host (5.2.6) and guest (4.3.8) do not match.
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * extras: ftp.jaist.ac.jp
 * remi-safe: mirrors.thzhost.com
 * updates: ftp.jaist.ac.jp
No package kernel-devel-2.6.32-573.7.1.el6.x86_64 available.
Package gcc-4.4.7-18.el6.x86_64 already installed and latest version
Package binutils-2.20.51.0.2-5.47.el6_9.1.x86_64 already installed and latest version
Package 1:make-3.81-23.el6.x86_64 already installed and latest version
Package 4:perl-5.10.1-144.el6.x86_64 already installed and latest version
Package bzip2-1.0.5-7.el6_0.x86_64 already installed and latest version
Nothing to do
Copy iso file /Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso into the box /tmp/VBoxGuestAdditions.iso
Mounting Virtualbox Guest Additions ISO to: /mnt
Installing Virtualbox Guest Additions 5.2.6 - guest version is 4.3.8
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.2.6 Guest Additions for Linux........
VirtualBox Guest Additions installer
Removing installed version 5.2.6 of VirtualBox Guest Additions...
You may need to restart your guest system to finish removing the guest drivers.
Copying additional installer modules ...
Installing additional modules ...
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel modules.
This system is currently not set up to build kernel modules.
Please install the Linux kernel "header" files matching the current kernel
for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    kernel-devel kernel-devel-2.6.32-573.7.1.el6.x86_64
VirtualBox Guest Additions: Starting.
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel modules.
This system is currently not set up to build kernel modules.
Please install the Linux kernel "header" files matching the current kernel
for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    kernel-devel kernel-devel-2.6.32-573.7.1.el6.x86_64
An error occurred during installation of VirtualBox Guest Additions 5.2.6. Some functionality may not work as intended.
In most cases it is OK that the "Window System drivers" installation failed.
VirtualBox Guest Additions: Starting.
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel modules.
This system is currently not set up to build kernel modules.
Please install the Linux kernel "header" files matching the current kernel
for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    kernel-devel kernel-devel-2.6.32-573.7.1.el6.x86_64
groupadd: group 'vboxadd' already exists
modprobe vboxguest failed
The log file /var/log/vboxadd-setup.log may contain further information.

ゲスト側の /var/log/vboxadd-setup.log は下記が残っていました。

Building the main Guest Additions module.
/tmp/vbox.0/Makefile.include.header:141: *** Error: unable to find the headers of the Linux kernel to build against. Specify KERN_VER=<version> (currently 2.6.32-573.7.1.el6.x86_64) and run Make again.  Stop.
Creating user for the Guest Additions.
Creating udev rule for the Guest Additions kernel module.
modprobe vboxguest failed

ここでエラーを追うのはストップしようと思い Vagrant を再起動すると、共有フォルダがマウントされるようになりました。

$ vagrant halt
$ vagrant up

※注意: 根本解決はしていません

参考URL

less で zip、gzip を開く

2018-08-04

目的

例えば、ログがローテートされて gzip 形式で保存されているファイルの確認をしたい時

ファイルを展開せずに確認する方法です。

実験

gzip のファイルを見る

$ vim test.txt

下記を入力します

test
test1
test222

test.txt.gz に圧縮します

$ gzip test.txt
方法1. less で見る
$ less test.txt.gz
方法2. gzcatで見る
$ gzcat test.txt.gz

zip のファイルを見る

$ vim ziptest.txt

下記を入力します

ziptest
ziptest1
ziptest222

zip ファイルを作ります

$ zip ziptest.txt.zip ziptest.txt
  adding: ziptest.txt (deflated 32%)
方法1. less で見る

zip ファイルの中身を確認することができました。

$ less ziptest.txt.zip

Archive:  ziptest.txt.zip
Zip file size: 191 bytes, number of entries: 1
-rw-rw-r--  3.0 unx       28 tx defN 18-Mar-03 15:35 ziptest.txt
1 file, 28 bytes uncompressed, 19 bytes compressed:  32.1%

php でファイルパスを検索する

2018-08-04

目的

アップロードされたファイルが見えないファイルかどうかを判別する時に

php の標準の関数を利用して、ファイルのパスで行うようにしました。

その時に使用する basename と dirname の挙動について調べてみます。

ちなみに

Windows では、スラッシュ(/) とバックスラッシュ () の両方がディレクトリ区切り文字として使われます。 その他の環境ではスラッシュ(/)になります。

やってみる

$ vim test.php
<?php

$files = [
    'p_dir1/p_dir2',
    'p_dir1/p_dir2/test.jpg',
    'test2.jpg',
];

foreach ($files as $v) {
    echo $v . "\n";
    echo "dirname: " . dirname($v) . "\n";
    echo "basename: " . basename($v) . "\n";
    echo "\n";
}

実行結果

$ php test.php
p_dir1/p_dir2
dirname: p_dir1
basename: p_dir2

p_dir1/p_dir2/test.jpg
dirname: p_dir1/p_dir2
basename: test.jpg

test2.jpg
dirname: .
basename: test2.jpg

参考URL

php でファイル操作する方法

2018-07-29

目的

大量のデータをバッチで処理する時に

最後まで処理した id をファイルに記録しておく必要がありました。

その時にファイル操作が必要だったので、挙動を確認します。

やってみる

position.txt に最後に処理した id を記憶します。

まずは、手動で作っておきます。

position.txt

100

php_file.php

<?php

// 最後に処理した id を取得します
$file_path = './position.txt';
$a = file($file_path);
var_dump($a);

$b = file_get_contents($file_path);
var_dump($b);

// id: 101 を処理
// id: 102 を処理
// ...
// id: 999 を処理

// 最後に処理した id を記録します
$c = file_put_contents($file_path, 999);
$c2 = file($file_path);
var_dump($c2);

実行結果

$ php php_file.php
array(1) {
  [0]=>
  string(4) "100
"
}
string(4) "100
"
array(1) {
  [0]=>
  string(3) "999"
}

参考URL

rbenv を使ってみる

2018-07-29

目的

ruby のバージョンを任意のタイミングで切り替えることができるようにします。

今回、rbenv を利用します。

方法

利用する ruby を指定します

$ brew upgrade ruby-build

インストールできる ruby を確認します

$ rbenv install --list

今回 ruby の 2.2.7 をインストールしたいので下記のように指定します

$ rbenv install 2.2.7

バージョンを確認します

$ rbenv versions

参考

公開鍵認証で ssh 接続する

2018-07-28

目的

レンタルサーバーを借りているのですが、

ssh 接続する時にパスワードを都度入力しています。

今回、 公開鍵認証でパスワードを入力せずに ssh 接続するできるようにします。

方法

鍵の生成

ローカル PC で秘密鍵、公開鍵を作成します。

$ cd ~/.ssh
$ ssh-keygen -t rsa -f hogehoge

ここで生成された hogehoge.pub が公開鍵です。

公開鍵をレンタルサーバーに転送

scp コマンドなどを駆使して先ほど作成した hogehoge.pub (公開鍵) を

レンタルサーバーに転送します。

公開鍵をレンタルサーバーに登録

$ touch ~/.ssh/authorized_keys
$ cat hogehoge.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

パーミッションは 600 にするのが良いようなので、今回指定します。

(なぜ 600 なのかは別の機会に…)

これで ssh 接続する時にパスワードが不要になります。

終わりに

ssh-keygen で鍵を作成する時に色々と強度があるようです。

参考