amazon

28.12.12

ターミナルコマンドの呼び出し先の切り替え

一つのコマンド名対するプログラムが複数インストールされている環境では、ターミナルで、
$ コマンド名
と打つとインストールされているもののうち一つしか起動しない。

この起動する一つというのは、次のようにtypeやwhichで表示される一覧の一番上のものである。

以下の話は、「python」というコマンドを例に取って話を進める
$ type -a python
python is /Library/Frameworks/Python.framework/Versions/2.6/bin/python
python is /Library/Frameworks/Python.framework/Versions/2.7/bin/python
python is /usr/local/bin/python
python is /usr/bin/python
python is /opt/local/bin/python
となっているとき、
$ python
と打つと、/Library/Frameworks/Python.framework/Versions/2.6/bin/pythonのpythonが起動する。

起動するプログラムを変更するにはtypeで表示される順序を変更すればよい。
typeの順序は環境変数PATHの中から順に探してきているので、PATHの順番を変えてやる。

まず、PATHの確認。
$ echo $PATH
/Library/Frameworks/Python.framework/Versions/2.6/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/bin:/usr/bin:/opt/local/bin:/opt/local/sbin
typeと同じく/Library/Frameworks/Python.framework/Versions/2.6/binが一番先頭になっている。

例としてMacPortsでインストールしたpythonを使うためにはMacPortsのインストール先である/opt/local/binを先頭にに持っきてみる。
$ PATH=/opt/local/bin:$PATH
$ export PATH
または一行で書くなら、
$ export PATH=/opt/local/bin:$PATH
こうすると、
$ echo $PATH
/opt/local/bin:/Library/Frameworks/Python.framework/Versions/2.6/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/bin:/usr/bin:/opt/local/sbin
となって、
$ type -a python
python is /opt/local/bin/python
python is /Library/Frameworks/Python.framework/Versions/2.6/bin/python
python is /Library/Frameworks/Python.framework/Versions/2.7/bin/python
python is /usr/local/bin/python
python is /usr/bin/python
となる。

そうすると、
$ python
で起動するpythonはMacPortsのpythonになる。

MacPorts内のpythonの切り替えはこちら

25.12.12

Mac Python パッケージのパス

前回の記事で扱ったようにMacでは異なるPythonをインストールできる。
そのためライブラリのインストール先もそれぞれのPythonで異なるので注意。
以下はnumpyをインストールしたときの例。

MacPortsでインストールするとデフォルトでは、
/opt/local/var/macports/software

*.dmgファイルからインストールすると、
/Library/Frameworks/Python.framework/Versions/*.*/lib/python*.*/site-packages
(*.*はバージョン)
に保存される。


ライブラリのインストールが成功したのに、import時に、
>>> import ***
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named ***
こんなエラーが出てしまうときは、インストールしたライブラリがどこにインストールされたのか、また呼び出しているpythonがどのpythonなのか、確認してみるとよい。

pythonのパスを確認する方法はpythonで、
>>> sys
>>> sys.path

インストールされているpythonの一覧はターミナルで、
$ type -a python

前回の記事も参考にしてください。

17.11.12

MacPortsでインストールした複数バージョンアプリの切替 (pythonの場合)

MacPortsでインストールしたアプリが複数バージョン共存している環境で、
特定のバージョンを指定したい場合以下の方法で行う

まず、インストールされているバージョンの確認(僕の環境の例)
$ python -V
Python 2.7.3
また、ターミナルで「python」というコマンドにひも付け(リンク)されているファイルがどこにあるかは、
$ which python
または、
$ type python
であるが、オプション-aをつければひも付け(リンク)の一覧を表示できる
$ which -a python
/Library/Frameworks/Python.framework/Versions/2.6/bin/python
/Library/Frameworks/Python.framework/Versions/2.7/bin/python
/usr/local/bin/python
/usr/bin/python
/opt/local/bin/python

$ type -a python
python is /Library/Frameworks/Python.framework/Versions/2.6/bin/python
python is /Library/Frameworks/Python.framework/Versions/2.7/bin/python
python is /usr/local/bin/python
python is /usr/bin/python
python is /opt/local/bin/python

で、本題のバージョンの切替は以下のコマンド
ここではpython2.6に切り替えた
$ sudo port select --set python python26
$
$ python -V
Python 2.6.6
ちなみに、selectできる一覧は以下のようにして表示出来る
$ port select --list python
Available versions for python:
none
python25-apple
python26 (active)
python26-apple
python27
python32

今回は、64bitのMacではpython2.7用のNumpyが動かないのでダウングレードした次第
ひも付け(リンク)の変更だけならaliasでもできる

追記1
この記事はMacPortsのひも付けの話。
僕の環境では、alias python="/opt/local/bin/python"としてあります。 つまり、pythonを呼び出すと/opt/local/bin/pythonが呼び出され、MacPortsで指定したバージョンが呼び出されるということです。

追記2
ターミナルでpythonと打った時に呼び出されるpythonについてはこちら

15.10.12

Arduino外部ライブラリイントール時のerror

こちらのサイトを参考にArduinoをSleep.hを使ってスリープしようと試みたときのエラーについて。
環境はMacだ。

ライブラリのインストール先は、
/Applications/Arduino.appで右クリックし「パッケージの内容を表示」した先。
/Applications/Arduino.app/Contents/Resources/Java/libraries/に
SleepとWatchdogというフォルダを作成し、Sleep.h, Sleep.cppとWatchdog.h, Watchdog.cppを移動。

で、参考ページの通りにコードを書いてコンパイルすると次のエラーが出た。
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp: In member function 'void WatchdogClass::enable(uint8_t)':
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp:38: error: 'cli' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp:43: error: 'sei' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp: At global scope:
/Applications/Arduino.app/Contents/Resources/Java/libraries/Watchdog/Watchdog.cpp:50: error:
expected constructor, destructor, or type conversion before '(' token
WatchdogClassのenableメソッドで、cli();やsei();が宣言されていないということだ。
cliやseiは割り込みに関するマクロだそうだ。(参考)

そこで、avr/interrupt.hをインクルードする。
Watchdog.hまたはWatchdog.cppに
#include <avr/interrupt.h>
これで先のエラーは消えるが、今度は、
/Applications/Arduino.app/Contents/Resources/Java/libraries/Sleep/Sleep.cpp: In static member function 'static void SleepClass::powerDownAndWakeupExternalEvent(uint8_t)':
/Applications/Arduino.app/Contents/Resources/Java/libraries/Sleep/Sleep.cpp:56: error: 'LOW' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/Sleep/Sleep.cpp:56: error: 'attachInterrupt' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/Sleep/Sleep.cpp:58: error: 'detachInterrupt' was not declared in this scope
となる。

SleepがArduinoで宣言されている定数を認識できていないということだ。

Arduinoの定数の宣言は/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Arduino.hでされているので、
Sleep.hまたはSleep.cppに次のようにヘッダーをインクルードすればよい。
#include <Arduino.h>

15.9.12

iTunesでコメントを検索対象にするには

iTunesのコメントがタグのように使えるということで、
試したがうまくいかなかった。
曲にコメントを入れても右上の検索窓から検索できないのだ。

コメントを検索対象にするには、
[表示]-[リスト]または[表示]-[Cover Flow]
で、
[名前]や[アーティスト]という見出しの上で右クリック(または[表示]-[表示オプション...])して、
コメントをチェックして表示しなければならないようだ。

注意しなければならないのは、
[表示]-[リスト]または[表示]-[Cover Flow]
でコメントを表示させること。
[表示]-[アルバムリスト]
でコメントを表示してもコメントを検索できない。

コメントはカンマで区切ればタグのように使えるので便利。


iTunes can search music with "comment", which can be used like a tag.
If you would like to use multipel tags, separate with comma.
However by default, the "comment" is not searchable.
To do this, add the comment column by right-clicking on a [VIEW]-[LIST] or [VIEW]-[COVER FLOW] header not [VIEW]-[ALBUM LIST] header.

9.5.12

WordPress マルチサイト化できない時の.htaccess関連の設定

Macのローカル環境に構築したWordPressをマルチサイト化した。

マルチサイト化は以下参照
http://wordpress.takanono.com/38/
完了するとワードプレスの管理画面の左上に[サイトネットワーク管理者]のメニューが追加される。

[サイトネットワーク管理者] - [ダッシュボード]で、新規サイトを作成したが、作成したサイトにアクセス出来なかった。
問題はマルチサイト化時に作成した.htaccessが正しく動作していなかったからだ。

やったことは2つ。

1..htaccessを有効にする (これでnot found が forbiddenになる)
apacheの設定で.htaccessを有効にしてapacheの再起動をする。

apacheの設定ファイルであるconfファイルは、使うapacheにより異なる。

システム環境設定 - 共有 - Web共有 なら /etc/apache2
Macports なら /opt/local/apache2/conf
fink なら /sw/etc/apache2

これらの場所にあるhttpd.confか/users/ユーザー名.confの
AllowOverride None

AllowOverride All
にする。

2.  RewriteEngine Onを有効にする
先のapacheの設定ファイルもしくは.htaccessのRewriteEngine Onの前に、
Options +FollowSymLinks
を追加する。

参考: http://php.birdlab.com/memo/16


7.5.12

MySQLの接続時エラー

Macに標準でついているPHPからMySQLにつなぐときに
特定のユーザーでmysql_connectを使って接続できなくなったのでメモ。


(僕の場合のMacのローカルで動く)MySQLのユーザー権限は、
DELETE FROM user WHERE user = 'user1';
のようにユーザーを削除しても、削除されないし、
GRANT ALL PRIVILEGES ON database1.* TO 'user1'@'local' IDENTIFIED BY 'password1';
ようにしても、上書きもできない。


これを対処するには、以下の一度権限の削除をする必要があった。
REVOKE ALL ON database1.* FROM 'user1'@'local';


因みに、権限の確認は、
SHOW GRANTS FOR 'user1'@'localhost';
で行う。

3.5.12

MacBook Proがスリープから復帰しないときの対処

MacBook Proにしてから、スリープから復帰しない現象が多々発生した。

[症状]
パソコンを開いて、キーボードを叩いても反応しない。
ディスプレイのバックライトすらつかない。

[考えられる原因]
パソコンを閉じて自動的にスリープにする際のバグ。

[問題を発生させないようにするには]
手動のスリープでは問題が起きないので、
画面を閉じる前に、アップルマーク - スリープを選択するか、alt + command + デバイス取り出しキーで、スリープさせてからパソコンを閉じる。

[問題が発生してしまったら]
今までは仕方なく電源ボタン長押しで再起動していたが、
以下のようにしたら復帰した。

画面を開いて、何かのキーを押しても何も表示されない場合
1. escキーを押す
2. alt + command + デバイス取り出しキー を押す
しばらくしてから、再度何かのキーを押してみる。

こうすることで復帰させることができた。

なぜこうしたかというと、
スリープ状態からパソコンを開き、ディスプレイにバックライトがついて表示されるまでの間にキーボードをたくさん押すと、ログインダイアログのパスワード欄が・・・・・・で埋まっている。

これは、パソコンはディスプレイが表示される前から起動していて、後からディスプレイの表示が行われているということ。
そこでスリープから復帰しない問題が、パソコンは起動しているがディスプレイの表示でエラーが発生している状態と仮説を立てた。

今までの経験から手動でスリープさせると問題が発生しないので、
手動スリープのショートカット(alt + command + デバイス取り出しキー)を押すという対処したところ、うまくいった。

ただし、一度しか試してないのでこの方法で必ず復帰するかどうかは分からない。
後日検証する機会があったら追記する。
因みに、escキーの押下は必要ないかもしれない。

5.4.12

Visual Studio error C2676, C2679

Visual Studioでコンパイルしたらこんなエラーが出た。
error C2676: 二項演算子 '==' : 'std::string' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。(新しい動作; ヘルプを参照)
error C2679: 二項演算子 '!=' : 型 'std::string' の右オペランドを扱う演算子が見つかりません (または変換できません)。
std::stringで==や!=の比較演算子がオーバーロードされてないということらしい。


Macのg++だと問題なくコンパイル出来たファイルなのだが・・・、と思っていたが、
#include <string>
を追加していなかったのが原因。

ところで、Macのg++でコンパイルできてしまうのは自動的にstringがインクルードされているからなのだろうか?

18.2.12

std::vectorでIndexOf

c++のstd::vectorはindexofのような関数がない。
std::vectorで、指定した要素が含まれているか調べ、
含まれていたらそのインデックス番号(何番目の要素か)を返す関数を作ってみた。

以下の例では、std::vector<std::string>の中にtargetが含まれるか調べ、
含まれているインデックスのベクトル(std::vector<int>)を返している。

#include <vector>
#include <algorithm>
#include <iostream>

std::vector<int> indexOf( std::vector< std::string > strvec, std::string target ){
    std::vector< int > rt;
    std::vector< std::string >::iterator it = strvec.begin();
    while( strvec.end() != ( it = std::find( it, strvec.end(), target ) ) ){
        rt.push_back( std::distance( strvec.begin(), it ) );
        it++;
    }
    if( rt.empty() ) std::cout << target << " was not found." << std::endl;
    return rt;
}

16.1.12

Visual Studioのフォームアプリケーションで、コンソールに標準出力(printf, std::cout等)を表示する方法


Visual Studioでのフォームアプリケーションは標準では、コンソールにが表示されない。
それゆえデバッグにprintfやstd::coutが使えないのが難点。

そこで、コンソール(コマンドプロンプト)を開きそこへ標準出力(printfやstd::cout)できるようにした。
以下がフォームアプリケーションのメイン プロジェクト ファイルに書き加えた例。
赤字部分がその簡易マクロと追加した行。

// MyProgram.cpp : メイン プロジェクト ファイルです。

#include "stdafx.h"
#include "Form1.h"
#include <stdio.h>
#include <windows.h>
#include <iostream>

#define OPENCONSOLE(fp) { if (!::AttachConsole(ATTACH_PARENT_PROCESS)) ::AllocConsole(); freopen_s(&fp, "CON", "w", stdout);}
#define CLOSECONSOLE(fp) {fclose(fp); ::FreeConsole();}

using namespace MyProgram

[STAThreadAttribute]
int main(array$lt;System::String ^> ^args){
FILE *fp;
OPENCONSOLE(fp);

// コントロールが作成される前に、Windows XP ビジュアル効果を有効にします
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);

// メイン ウィンドウを作成して、実行します
Application::Run(gcnew Form1());

std::cout<<"これでコンソールに表示される"<<std::endl;
CLOSECONSOLE(fp);
return 0;
}