UbuntuでのLenovo X240のバッテリーを長持ちさせる

Lenovoのバッテリーを長持ちさせるには
http://support.lenovo.com/jp/ja/documents/ht053031
が参考になります

Lenovo X240にUbuntuを入れて使っていれば
http://www.xmisao.com/2014/01/21/thinkpad-battery-setting-by-tlp-on-linux.html
が、どんぴしゃで参考になります(ありがとうございます)
古い型番だと効かなかったりするようなので注意

$ git clone https://github.com/teleshoes/tpacpi-bat
$ cd tpacpi-bat
$ sudo sh ./install.pl
$ sudo tpacpi-bat -s ST 1 60
$ sudo tpacpi-bat -s SP 1 80

2つ目のバッテリー(リアバッテリー)がある人は
$ sudo tpacpi-bat -s ST 2 80
$ sudo tpacpi-bat -s SP 2 90

リアバッテリーがあるか確認するには
$ sudo apt-get install acpi
$ acpi -b
Battery 0: Discharging, 60%, 01:39:36 remaining

だと、バッテリーはひとつだけです
(バッテリー残量がみれるコマンドです)

Virtualboxのvmをvagrantに移行する

VirtualboxのGUI操作やSyncedFolderがめんどうだったので、
Virtualboxのvmをvagrantへ移行してみました

vmのOSはCentos 6.5です

基本的にマニュアル見ればできます
https://docs.vagrantup.com/v2/virtualbox/boxes.html
(みないでやって、めっちゃはまりました..)

まず、vagrantへ移行できるVirtualboxのvmには条件があり

  • 最初のネットワークはNAT
  • VIRTUALBOX GUEST ADDITIONSをいれておく

でなければできません(ほんとにまったくネットワークつながりませんでした..)

NATにしておいて、VIRTUALBOX GUEST ADDITIONSをいれておきます

参考)
Virtualboxの環境をコピーしたときのネットワーク設定
VirtualboxのCentosにGuest Additionsをコマンドでいれる

vagrant用のユーザーを追加して、sshでつながるようにします

$ visudo
TTYなしで実行できるように

#Defaults    requiretty

をのようにコメントアウト

sudoコマンドをパスワードなしで実行できるように

vagrant ALL=(ALL)       NOPASSWD: ALL

vagrantユーザー追加
$ useradd vagrant
$ passwd vagrant
パスワードは vagrant と入力
$ usermod -G wheel vagrant

vagrant ssh用のキーをセット
$ mkdir /home/vagrant/.ssh
$ chmod 700 /home/vagrant/.ssh
$ cd /home/vagrant/.ssh
$ curl -k -L -o authorized_keys https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
$ chmod 600 /home/vagrant/.ssh/authorized_keys
$ chown -R vagrant.vagrant /home/vagrant/.ssh

vagrant用のディレクトリを用意
$ mkdir -p /vagrant/
$ chown vagrant.vagrant /vagrant

ファイアーウォールを止めておいて
$ service iptables stop
$ chkconfig iptables off

ここまでで下準備終了
こっから移行します

vagrant packageを作ります
$ vagrant package –base (ここにはVirtualboxでつけてたVMの名前を)
$ vagrant package –base sample –output sample.box
とすると、sample.boxができます

これをvagrantで取り込みます
$ vagrant add sample sample.box
$ vagrant box list
で出てくるのを確認して、用意したいディレクトリへ移動
$ vagrant init sample
$ vagrant up
で起動できたらOKです

CakephpのCakeResponseで日本語名ファイルをダウンロードできない

cakephp 2.5.3での出来事です

public function download($path)
{
    // レイアウトの無効
    $this->autoRender = false;
    if( file_exists($fileName) === TRUE )
    {
        $this->response->file($path);
        $this->response->download(basename($path));
        return $this->response;
    }
}

なんてすれば、ファイルダウンロードできるはずが
404エラーになる..

ソースコードを追うと

//lib/Cake/Network/CakeResponse.php L1347
    $file = new File($path);
if (!$file->exists() || !$file->readable()) {
    if (Configure::read('debug')) {
        throw new NotFoundException(__d('cake_dev', 'The requested file %s was not found or not readable', $path));
    }
    throw new NotFoundException(__d('cake', 'The requested file was not found'));
}

if (!$file->exists() || !$file->readable()) {
でエラーに

Fileモデルを追っていると

//lib/Cake/Utility/File.php L86
public function __construct($path, $create = false, $mode = 0755) {
    $this->Folder = new Folder(dirname($path), $create, $mode);
    if (!is_dir($path)) {
        $this->name = basename($path);
    }
    $this->pwd();
    $create && !$this->exists() && $this->safe($path) && $this->create();
}

で、$this->name = basename($path);

.txtになってました
ロケールの問題でした..

以前公開したこちらで解決です
phpのbasenameはロケール次第で日本語が扱えない

phpのbasenameはロケール次第で日本語が扱えない

はまったのでメモ

ファイル名をとれる関数 basename を使って

$path = "/var/www/upload/日本語ファイル.txt";
echo basename($path);
// .txt

日本語ファイル.txtが出てきて欲しいのに、日本語部分が消えてしまいました

公式マニュアルの出番です
http://php.net/manual/ja/function.basename.php

ロケールに依存するらしい..

いまのロケールを見てみます

echo setlocale(LC_ALL, 0);
// C

Apacheのロケール、Cを引き継いでるっぽいです

setlocale(LC_ALL, 'ja_JP.UTF-8');
$path = '/var/www/upload/日本語ファイル.txt';
echo basename($path);
//日本語ファイル.txt'

で取れました
Apacheの設定変えてもいいかもしれません