プロメモグラム

誰が見てもわかるような文章を目指す

【Pandasでエラー】TypeError: pivot_table() got an unexpected keyword argument 'rows'

Pythonによるデータ分析入門というオライリーから出版されている本を読んでいたらエラーを吐いた.調べてみると,Pandasのバージョンアップにより関数の使用方法が変わったことが原因であるようだ.pandas 0.17.1を使用した.

TypeError: pivot_table() got an unexpected keyword argument 'rows'

rowsという引数はないよってこと.ググってみると,

  • rows ー> index
  • cols -> columns

に置き換えてやるとエラーが消えるようだ.

参考サイト

pandas.DataFrame.pivot_table — pandas 0.17.1 documentation

CentOS6にnode + mysql

インストール

  • Nodeのインストール
$ sudo yum install epel-release
$ sudo yum install node npm
  • MySQLのインストール
 $ sudo yum install mysql-server mysql
 $ sudo service mysqld start # サービス起動
 $ sudo ckconfig mysqld on # 自動起動
 $ npm install mysql

MySQL設定

データベース、テーブルを作成し1列挿入しておく

set password = password('パスワード');

create database node
use node

create user 'node'@'localhost' identified by 'secret';
grant select , insert , update on node.* to node;

create table Position (
 student_id int auto_increment primary key,
 latitude Decimal(10,7)  ,
 longitude Decimal(10,7) ,
 altitude Decimal(10,7) ,
 message char(100)
 )
 
insert into Position (latitude , longitude , message ) values (41.1 , 135.5 , "メッセージ");

コードを作成

/* app.js */
var mysql = require('mysql');

var connection = mysql.createConnection({
 host     : process.env.DB_HOST || 'localhost' ,
 user     : process.env.USER    || 'root' ,
 password : process.env.DB_PASS || 'vagrant' ,
 database : process.env.DB_NAME || 'node'
});

connection.query('select * from node.Student' , function(err , rows) {
 if(err != null) {
        console.log("Error");
 }
 console.log(rows);
});

nodeを実行し、接続できることを確認.とりあえずrootでやってしまった。

# node app.js

実行結果

[ { student_id: 1,
    latitude: 41.1,
    longitude: 135.5,
    message: 'a?!a??a?≫a??a?,' } ]

結果がJSONで入ってくるようだが文字化けしていたので、文字コードの設定をする必要がある。

【Mac】qtbindingsをインストール中のエラー Undefined symbols for architecture x86_64:

クロスプラットフォームであり、複数の言語でGUIアプリケーションを開発したいと思い検索をしてみたところ、Qtというフレームワークを使用するとそれが実現できそうであるとわかった

そんなQtをrubyを使ってコーディングを行うためにgemを使って気軽にインストールする

まずはQt自体のインストール(Homebrew使ってます)
これでqt4とcmakeがインストールされる

brew  install automoc4

次にRubyで使用するためにqtbindingsを導入

gem install qtbindings

しかしエラー

[ 83%] Building CXX object ruby/qtruby/src/CMakeFiles/qtruby4shared.dir/marshall_types.o
Linking CXX shared library libqtruby4shared.dylib
Undefined symbols for architecture x86_64:
  "_rb_float_new", referenced from:
      unsigned long primitive_to_ruby<float>(float) in handlers.o
      unsigned long primitive_to_ruby<double>(double) in handlers.o
      marshall_QListqreal(Marshall*) in handlers.o
      marshall_QVectorqreal(Marshall*) in handlers.o
      marshall_QPairqrealQColor(Marshall*) in handlers.o
      marshall_doubleR(Marshall*) in handlers.o
  "_rb_funcallv", referenced from:
      method_missing(int, unsigned long*, unsigned long) in Qt.o
      class_method_missing(int, unsigned long*, unsigned long) in Qt.o
      QtRuby::VirtualMethodCall::callMethod() in marshall_types.o
      funcall2_protect(unsigned long) in marshall_types.o
      QtRuby::InvokeSlot::invokeSlot() in marshall_types.o
  "_rb_gc_writebarrier_unprotect", referenced from:
      rb_obj_wb_unprotect(unsigned long, char const*, int) in marshall_types.o
  "_rb_str_cat_cstr", referenced from:
      _rb_str_catf in Qt.o
      marshall_QString(Marshall*) in handlers.o
      marshall_QByteArray(Marshall*) in handlers.o
  "_rb_str_new_static", referenced from:
      method_missing(int, unsigned long*, unsigned long) in Qt.o
      class_method_missing(int, unsigned long*, unsigned long) in Qt.o
      _prettyPrintMethod in Qt.o
  "_rb_sym2id", referenced from:
      method_missing(int, unsigned long*, unsigned long) in Qt.o
      class_method_missing(int, unsigned long*, unsigned long) in Qt.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

調べてみるとRubyをインストールする際に –enable-shared オプションが必要であるそうだ
rubyのライブラリをダイナミックリンクとして出力してくれるらしく、Qtではそのライブラリを使用しているのだろうか
自分はrbenvを使用しているのでrbenvでRubyをインストールし直すとこうなる(バージョンは2.2.0)

CONFIGURE_OPTS="--enable-shared" rbenv install 2.2.0

もう一度gemコマンドを実行すると無事にqtrubyをインストールできた

Macでgithubから拾ってきたrailsプロジェクトをbundleしたらnokogiriのインストールエラー

nokogiriってなんだろう

学校で進めていたrailsプロジェクトフォルダを家でも使いたいためgithubに上げておいた 家に帰ってgit cloneコマンドでコピーするところまでうまく行ったのだが、bundleするとnokogiriがインストールできず止まる その後ググった内容を見て色々いじってしまいわけがわからなくなった。

そもそもGemfileにnokogiriなんて入れてないがなんらかの別のアプリが利用しているのだろう nokogiriがインストール出来ないのはlibxml2がインストールされていないからだと判明したので最新版のlibxml2を入れた すると↓のエラーが出てくる

[bash] /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb –use-system-libraries –with-xml2-include=/Users/dwt/Library/Homebrew/opt/libxml2/include/libxml2 –with-xml2-lib=/Users/dwt/Library/Homebrew/opt/libxml2/lib –with-xslt-dir=/Users/dwt/Library/Homebrew/opt/libxslt –with-iconv-include=/Users/dwt/Library/Homebrew/opt/libiconv/include/ Building nokogiri using system libraries. libxml2 version 2.9.0 and later is not yet supported, but proceeding anyway. checking for xmlParseDoc() in libxml/parser.h… no checking for xmlParseDoc() in -lxml2… no

checking for xmlParseDoc() in -llibxml2… no

libxml2 is missing. please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.

[/bash]

何が何だかと思ったがよく見るとlibxml2のバージョンが新しすぎて対応していないらしい 解決策はないかとググっていると見つけたのがこれ

[bash] brew unlink libxml2 libiconv libxslt sudo xcode-select –install bundle config build.nokogiri –use-system-libraries bundle install [/bash]

インストールしたlibxml2その他2つの参照をはずし 古いlibxml2等をxcode-select –installでインストールできるらしい その後nokogiriのインストールにそのライブラリを使うことを宣言しインストー

無駄に時間を費やした

AndroidでVolleyを使ったシンプルな通信

もうね書くのが面倒だからソースをそのまま書いていく アクセスが無いとこうなるのかな

[java] String url ="http://www.google.co.jp/"; if(mQueue == null) mQueue = Volley.newRequestQueue(getApplicationContext());

    StringRequest stringRequest = new StringRequest(Request.Method.GET , url ,
            new Response.Listener&lt;String&gt;() {
                @Override
                public void onResponse(String response) {
                    text1.setText(response.toString());
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    text1.setText(&quot;That didn't work... &quot; + error.getMessage());
                }
            }
    );

    mQueue.add(stringRequest);
    mQueue.start();

[/java]

ネットワーク接続を許可するためAndroidManiphest.xmlをいじる必要が有ることと、結果のテキストはresponse.toString()に格納されることを意識すれば特に問題はない。 さて付加情報を単純にテキストをいじって作ればいいか。別にクラスを用意するか悩むところだ。

IDEに言われるがままにimportしたパッケージたち [java] import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; [/java]

mQueueはメンバ変数として先にRequestQueue型で宣言。 またソース中のテキストビューも同様に宣言し、別のところでfindViewByIdしてますよ。

通信が楽になったしエラーもerror.getMessage()で詳しく教えてくれるから便利だなあ。

PIC18F25K22でサーボモータを動かす

標準のPWMだとできない?

PIC18F25K22というか、PICにはCCPというモジュールが搭載されていて、PWMが標準で使える。 しかしながらこのモジュールはあまり長い周期の設定ができない(高周波数だとより厳しい)。 →だいたいのサーボモータ20msの周期中のパルス幅で角度を指定しているから使えない? このように判断した。

だからTMR0で0.1msごとに割り込みを入れて、0.1msの精度でパルスをON、OFFするようにプログラムを書いたらできた。 PICの事良く知らないけど、こんなに割り込んじゃって他のコードに影響出ないか不安。 このコードでつかうサーボは周期が20.0ms。真ん中が1.5ms、1.0~2.0msで角度を決められる。

時間出来たらもう少し詳しく書こう。

ソースコード

/*

 * PWMが低周波数で実現できなそうなのでタイマー0でやる

 */

#include&lt;xc.h&gt;


//コンフィギュレーションビット(内部オシレータを使用)
#pragma config IESO = OFF, FOSC = INTIO67, FCMEN = OFF


//クロック周波数の指定(8MHz)
#define _XTAL_FREQ 8000000

//大域変数
int count = 0;
int countvar; //0.1ms単位で立ち上がるタイミング指定

int main()
{
    int i;
    
    //内部クロックに設定(8MHz)
    OSCCON = 0b01100010;

    //全ポートデジタル入出力
    ANSELA = 0;
    ANSELB = 0;
    ANSELC = 0;

    //全ポート出力
    TRISA = 0;
    TRISB = 0;
    TRISC = 0;

    //全ポートOFF
    PORTA = 0x00;
    PORTB = 0x00;
    PORTC = 0xFF;

    //タイマ設定
    T0CON = 0b01001001;

    //割り込み設定
    TMR0L = 0x37;
    TMR0IF = 0;
    TMR0IE = 1;
    PEIE = 1;
    GIE = 1;

    //TIMER0 Start
    T0CONbits.TMR0ON = 1;



    while(1)
    {
        for(i=10 ; i&lt;=20 ; i+=5)
        {
            countvar = i;
            __delay_ms(90);
            __delay_ms(90);
        }
    }

    return 0;
}

void interrupt isr(void)
{
    TMR0L = 0x37;
    TMR0IF = 0;
    count ++;
    if(count == countvar)
    {
        PORTA = 0;
    }
    else if(count == 200)
    {
        PORTA = 0xFF;
        count = 0;
    }
}

PIC18F25K22におけるPWMの使用方法についてまとめてみた。

PIC18F25K22におけるPWMの使用方法についてまとめてみた。

概要

PWMの概要については書かない。 PICではCCPモジュール(Capture Compare PWM)の一つとして位置づけられている。 PIC18なんかではCCPが2つ搭載されていたり、CCPを拡張したEnhanced CCPが含まれていたりする。 PIC18F25K22には5つ搭載されており、CCP1~CCP3がEnhanced CCP、CCP4とCCP5が通常のCCPである。 今回はCCP4とCCP5のみ扱うことにする。

PWMにおいて必要なことは3つ。

  • デューティ比(デューティサイクル)
  • 周期
  • 分解能(resolutionだから解像度とも言う?)

この3つをレジスタで指定してやると動くはずである。 しかし、レジスタに直接値を入れることはできない。幾つかのビットとそれを引数とする計算式によって 値が定まるでしょう。

レジスタ

PWMに関するレジスタは4つ有る。 ここからレジスタ名に出てくる小文字のxは数字がはいるものとする(データシートでもそんな風に書いてるから従うよ)

CCPxCON

このレジスタはEnhanced CPPとCPPで中身が違うので面倒であるがひとまず通常のCPPであるCCP4CONから。

未使用 未使用 bit5 bit4 bit3 bit2 bit1 bit0
- - DC2B1 DC2B0 CCP2M3 CCP2M2 CCP2M1 CCP2M0
  • DC4Bx
  • デューティ比を10bitで表す場合の最小位ビットとなる。残りの8bitはCCPR2Lで指定。 ちなみにPWM以外のモードでは不使用。
  • CCP4Mx…4ビットの羅列によって別々の意味を成す。
  • このビット列によってPWMかその他2つとして使うかを決定できる。今回はPWMを使うので1100と入れる。 詳細の表はデータシート参照。時間あればここに載せたいが、和訳できないのです。

PR2

PWMでHIGHとなる時間を0から255で指定。

T2CON

CCPはTIMER2の機能を使用している。 このコンフィギュレーションレジスタはタイマ2に関する設定を記述する。

未使用 bit6 bit5 bit4 bit3 bit2 bit1 bit0
- T2OUTPS3 T2OUTPS2 T2OUTP1 T2OUTPS0 TMR2ON T2CKPS1 T2CKPS0
  • T2OUTPSx
  • ポストスケールの設定。今回は使わない
  • TMR2ON
  • Timer2を使用するかどうか 1:使用 0:不使用
  • T2CKPSx
  • プレスケールの設定。計算式に含まれる。xは0でも1でOK。 00 :プレスケール1 01 :プレスケール4 1x :プレスケール16

CCPRxL

デューティ比に使用する。0~255で指定。

計算式

[latex] 周期 = {(PR2 + 1)}cdot 4 cdot Tosc cdot (TMR2の分周(プレスケール)値) [/latex]
[latex] パルス幅 = (CCPRxL:DCxB) cdot Tosc cdot (TMR2の分周値) [/latex]
[latex] デューティ比 = frac{パルス幅}{周期} = frac{(CCPRxL:DCxB)}{4(PR2 + 1)} [/latex]
[latex] 分解能 = frac{log{[4(PR2 + 1)]}}{log{2}} [/latex]

式中のToscはクロック周期(Tosc = 1/Fosc) CCPRxL:DCxBは上位ビットと下位ビットを繋げて10bitとしたもの

まとめ

ここまで書いたが、使用する場合のことだけかいて、中でどのように動いているかを 全く書かなかったので理解が深まらない気がしてくる。よく言えば簡潔?